Compare commits
2 Commits
v2.5.0
...
v2.5.0-rc2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
54cb9227d4 | ||
|
|
1e99db6411 |
29
ChangeLog
29
ChangeLog
@@ -1,32 +1,3 @@
|
||||
2011-08-05 Shaun Ruffell <sruffell@digium.com>
|
||||
|
||||
* dahdi-linux 2.5.0 released.
|
||||
|
||||
2011-07-26 20:19 +0000 [r10082] Shaun Ruffell <sruffell@digium.com>
|
||||
|
||||
* drivers/dahdi/wctc4xxp/base.c: wctc4xxp: Cleanup in-flight
|
||||
commands when halting due to hardware error. On one system I was
|
||||
seeing the board reset in the middle of a transaction. Any
|
||||
commands that were on the response list when this would happen
|
||||
would never be completed and the process would then be stuck in
|
||||
an uninterruptible sleep. This change also prevents the driver
|
||||
from sleeping in timer context, which would result in a kernel
|
||||
panic. This change at least lets an error message propogate back
|
||||
to the user. DAHDI-880 Signed-off-by: Shaun Ruffell
|
||||
<sruffell@digium.com>
|
||||
|
||||
2011-07-22 17:56 +0000 [r10079] Russ Meyerriecks <rmeyerreicks@digium.com>
|
||||
|
||||
* drivers/dahdi/wcb4xxp/base.c: wcb4xxp: Prevent null pointer
|
||||
dereference on spanconfig In the rare case where spanconfig is
|
||||
called while there is pending data on the hdlc channel, the
|
||||
hdlc_getbuf interrupt could try to read from the hdlc buffer
|
||||
before the channel was fully setup. This could potentially result
|
||||
in a null pointer dereference. This condition has existed since
|
||||
the creation of the wcb4xxp driver. Signed-off-by: Russ
|
||||
Meyerriecks <rmeyerriecks@digium.com> Signed-off-by: Shaun
|
||||
Ruffell <sruffell@digium.com>
|
||||
|
||||
2011-07-21 Shaun Ruffell <sruffell@digium.com>
|
||||
|
||||
* dahdi-linux version 2.5.0-rc2 released.
|
||||
|
||||
@@ -2375,9 +2375,6 @@ b4xxp_chanconfig(struct file *file, struct dahdi_chan *chan, int sigtype)
|
||||
|
||||
if (alreadyrunning && bspan->sigchan) {
|
||||
hdlc_stop(b4, fifo);
|
||||
atomic_set(&bspan->hdlc_pending, 0);
|
||||
bspan->sigactive = 0;
|
||||
smp_mb();
|
||||
bspan->sigchan = NULL;
|
||||
}
|
||||
|
||||
|
||||
@@ -1614,20 +1614,6 @@ wctc4xxp_transmit_cmd(struct wcdte *wc, struct tcb *cmd)
|
||||
{
|
||||
int res;
|
||||
|
||||
/* If we're shutdown all commands will timeout. Just complete the
|
||||
* command here with the timeout flag */
|
||||
if (unlikely(test_bit(DTE_SHUTDOWN, &wc->flags))) {
|
||||
if (cmd->flags & DO_NOT_AUTO_FREE) {
|
||||
cmd->flags |= DTE_CMD_TIMEOUT;
|
||||
list_del_init(&cmd->node);
|
||||
complete(&cmd->complete);
|
||||
} else {
|
||||
list_del(&cmd->node);
|
||||
free_cmd(cmd);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (cmd->data_len < MIN_PACKET_LEN) {
|
||||
memset((u8 *)(cmd->data) + cmd->data_len, 0,
|
||||
MIN_PACKET_LEN-cmd->data_len);
|
||||
@@ -2754,10 +2740,11 @@ wctc4xxp_start_dma(struct wcdte *wc)
|
||||
}
|
||||
|
||||
static void
|
||||
_wctc4xxp_stop_dma(struct wcdte *wc)
|
||||
wctc4xxp_stop_dma(struct wcdte *wc)
|
||||
{
|
||||
/* Disable interrupts and reset */
|
||||
unsigned int reg;
|
||||
unsigned long newjiffies;
|
||||
/* Disable interrupts */
|
||||
wctc4xxp_setintmask(wc, 0x00000000);
|
||||
wctc4xxp_setctl(wc, 0x0084, 0x00000000);
|
||||
@@ -2766,14 +2753,7 @@ _wctc4xxp_stop_dma(struct wcdte *wc)
|
||||
reg = wctc4xxp_getctl(wc, 0x0000);
|
||||
reg |= 0x00000001;
|
||||
wctc4xxp_setctl(wc, 0x0000, reg);
|
||||
}
|
||||
|
||||
static void
|
||||
wctc4xxp_stop_dma(struct wcdte *wc)
|
||||
{
|
||||
unsigned long newjiffies;
|
||||
|
||||
_wctc4xxp_stop_dma(wc);
|
||||
newjiffies = jiffies + HZ; /* One second timeout */
|
||||
/* We'll wait here for the part to come out of reset */
|
||||
while (((wctc4xxp_getctl(wc, 0x0000)) & 0x00000001) &&
|
||||
@@ -2781,6 +2761,7 @@ wctc4xxp_stop_dma(struct wcdte *wc)
|
||||
msleep(1);
|
||||
}
|
||||
|
||||
|
||||
#define MDIO_SHIFT_CLK 0x10000
|
||||
#define MDIO_DATA_WRITE1 0x20000
|
||||
#define MDIO_ENB 0x00000
|
||||
@@ -3324,19 +3305,13 @@ wctc4xxp_watchdog(unsigned long data)
|
||||
if (time_after(jiffies, cmd->timeout)) {
|
||||
if (++cmd->retries > MAX_RETRIES) {
|
||||
if (!(cmd->flags & TX_COMPLETE)) {
|
||||
|
||||
cmd->flags |= DTE_CMD_TIMEOUT;
|
||||
list_del_init(&cmd->node);
|
||||
complete(&cmd->complete);
|
||||
|
||||
set_bit(DTE_SHUTDOWN, &wc->flags);
|
||||
spin_unlock(&wc->cmd_list_lock);
|
||||
_wctc4xxp_stop_dma(wc);
|
||||
wctc4xxp_stop_dma(wc);
|
||||
dev_err(&wc->pdev->dev,
|
||||
"Board malfunctioning. " \
|
||||
"Halting operation.\n");
|
||||
reschedule_timer = 0;
|
||||
break;
|
||||
return;
|
||||
}
|
||||
/* ERROR: We've retried the command and
|
||||
* haven't received the ACK or the response.
|
||||
|
||||
Reference in New Issue
Block a user