diff options
author | Malli Chilakala <mallikarjuna.chilakala@intel.com> | 2005-04-29 06:16:58 +0400 |
---|---|---|
committer | Jeff Garzik <jgarzik@pobox.com> | 2005-05-13 04:59:27 +0400 |
commit | 2acdb1e05c1a92e05ee710ed8f226a8f3183d5a0 (patch) | |
tree | e977185205ec68361d83c1e05b51b46174213628 /drivers | |
parent | 88d7bd8cb9eb8d64bf7997600b0d64f7834047c5 (diff) | |
download | linux-2acdb1e05c1a92e05ee710ed8f226a8f3183d5a0.tar.xz |
[PATCH] e100: Execute tx_timeout task outside interrupt context
Execute tx_timeout task outside the interrupt context
Signed-off-by: Mallikarjuna R Chilakala <mallikarjuna.chilakala@intel.com>
Signed-off-by: Ganesh Venkatesan <ganesh.venkatesan@intel.com>
Signed-off-by: John Ronciak <john.ronciak@intel.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/e100.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/drivers/net/e100.c b/drivers/net/e100.c index 1b68dd5a49b6..0f2837ebaab8 100644 --- a/drivers/net/e100.c +++ b/drivers/net/e100.c @@ -539,6 +539,7 @@ struct nic { struct timer_list watchdog; struct timer_list blink_timer; struct mii_if_info mii; + struct work_struct tx_timeout_task; enum loopback loopback; struct mem *mem; @@ -1716,6 +1717,15 @@ static void e100_tx_timeout(struct net_device *netdev) { struct nic *nic = netdev_priv(netdev); + /* Reset outside of interrupt context, to avoid request_irq + * in interrupt context */ + schedule_work(&nic->tx_timeout_task); +} + +static void e100_tx_timeout_task(struct net_device *netdev) +{ + struct nic *nic = netdev_priv(netdev); + DPRINTK(TX_ERR, DEBUG, "scb.status=0x%02X\n", readb(&nic->csr->scb.status)); e100_down(netdev_priv(netdev)); @@ -2240,6 +2250,9 @@ static int __devinit e100_probe(struct pci_dev *pdev, nic->blink_timer.function = e100_blink_led; nic->blink_timer.data = (unsigned long)nic; + INIT_WORK(&nic->tx_timeout_task, + (void (*)(void *))e100_tx_timeout_task, netdev); + if((err = e100_alloc(nic))) { DPRINTK(PROBE, ERR, "Cannot alloc driver memory, aborting.\n"); goto err_out_iounmap; |