From: Andrew Morton Date: Mon, 29 Nov 2004 05:38:30 +0000 (-0800) Subject: [PATCH] e100 deadlock fix X-Git-Tag: v2.6.10-rc3~56^2~2^2~7 X-Git-Url: http://git.neil.brown.name/?a=commitdiff_plain;h=8b92757dc223d2eddf8beb914bd5266bc8d8fc96;p=history.git [PATCH] e100 deadlock fix Revert my version of this fix and apply Scott's version, which was acked by the e100 maintainers. Also, initialise the spinlocks before calling e100_hw_reset(), so things don't instantly deadlock on SMP. Signed-off-by: Scott Feldman Cc: Jeff Garzik Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- diff --git a/drivers/net/e100.c b/drivers/net/e100.c index af78c85f11d9..c075355aabbb 100644 --- a/drivers/net/e100.c +++ b/drivers/net/e100.c @@ -2204,33 +2204,38 @@ static int __devinit e100_probe(struct pci_dev *pdev, goto err_out_disable_pdev; } - nic->csr = ioremap(pci_resource_start(pdev, 0), sizeof(struct csr)); - if(!nic->csr) { - DPRINTK(PROBE, ERR, "Cannot map device registers, aborting.\n"); - err = -ENOMEM; - goto err_out_free_res; - } - - e100_hw_reset(nic); - - pci_set_master(pdev); - if((err = pci_set_dma_mask(pdev, 0xFFFFFFFFULL))) { DPRINTK(PROBE, ERR, "No usable DMA configuration, aborting.\n"); - goto err_out_iounmap; + goto err_out_free_res; } SET_MODULE_OWNER(netdev); SET_NETDEV_DEV(netdev, &pdev->dev); + nic->csr = ioremap(pci_resource_start(pdev, 0), sizeof(struct csr)); + if(!nic->csr) { + DPRINTK(PROBE, ERR, "Cannot map device registers, aborting.\n"); + err = -ENOMEM; + goto err_out_free_res; + } + if(ent->driver_data) nic->flags |= ich; else nic->flags &= ~ich; + e100_get_defaults(nic); + spin_lock_init(&nic->cb_lock); spin_lock_init(&nic->cmd_lock); + /* Reset the device before pci_set_master() in case device is in some + * funky state and has an interrupt pending - hint: we don't have the + * interrupt handler registered yet. */ + e100_hw_reset(nic); + + pci_set_master(pdev); + init_timer(&nic->watchdog); nic->watchdog.function = e100_watchdog; nic->watchdog.data = (unsigned long)nic; @@ -2243,8 +2248,6 @@ static int __devinit e100_probe(struct pci_dev *pdev, goto err_out_iounmap; } - e100_get_defaults(nic); - e100_hw_reset(nic); e100_phy_init(nic); if((err = e100_eeprom_load(nic)))