Compare commits

...

4 Commits

Author SHA1 Message Date
Shaun Ruffell
a118a30248 Importing files for 2.5.0 release.
git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/tags/2.5.0@10090 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2011-08-05 18:00:51 +00:00
Shaun Ruffell
aeed6a0268 Creating tag for the release of dahdi-linux-2.5.0
git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/tags/2.5.0@10089 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2011-08-05 17:59:47 +00:00
Shaun Ruffell
9fd43e0139 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>

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/trunk@10082 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2011-07-26 20:19:30 +00:00
Russ Meyerriecks
1813c9ad09 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>

git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/trunk@10079 a0bf4364-ded3-4de4-8d8a-66a801d63aff
2011-07-22 17:56:07 +00:00
4 changed files with 4828 additions and 5 deletions

1
.version Normal file
View File

@@ -0,0 +1 @@
2.5.0

4794
ChangeLog Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -2375,6 +2375,9 @@ 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;
}

View File

@@ -1614,6 +1614,20 @@ 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);
@@ -2740,11 +2754,10 @@ 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);
@@ -2753,7 +2766,14 @@ 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) &&
@@ -2761,7 +2781,6 @@ wctc4xxp_stop_dma(struct wcdte *wc)
msleep(1);
}
#define MDIO_SHIFT_CLK 0x10000
#define MDIO_DATA_WRITE1 0x20000
#define MDIO_ENB 0x00000
@@ -3305,13 +3324,19 @@ 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");
return;
reschedule_timer = 0;
break;
}
/* ERROR: We've retried the command and
* haven't received the ACK or the response.