Commit 3052246c authored by dhananjay@netxen.com's avatar dhananjay@netxen.com Committed by Jeff Garzik

netxen: fix crashes during module unload

This patch fixes two problems during driver unload. The pci_disable_device()
call is before firmware reload, causing reads and writes across PCI bus after
disabling device. Second problem is the register window was wrong during
firmware reload

Signed-off by: Dhananjay Phadke <dhananjay@netxen.com>
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent b3e2d887
...@@ -649,9 +649,11 @@ enum { ...@@ -649,9 +649,11 @@ enum {
#define PCIX_INT_VECTOR (0x10100) #define PCIX_INT_VECTOR (0x10100)
#define PCIX_INT_MASK (0x10104) #define PCIX_INT_MASK (0x10104)
#define PCIX_MN_WINDOW (0x10200) #define PCIX_MN_WINDOW_F0 (0x10200)
#define PCIX_MN_WINDOW(_f) (PCIX_MN_WINDOW_F0 + (0x20 * (_f)))
#define PCIX_MS_WINDOW (0x10204) #define PCIX_MS_WINDOW (0x10204)
#define PCIX_SN_WINDOW (0x10208) #define PCIX_SN_WINDOW_F0 (0x10208)
#define PCIX_SN_WINDOW(_f) (PCIX_SN_WINDOW_F0 + (0x20 * (_f)))
#define PCIX_CRB_WINDOW (0x10210) #define PCIX_CRB_WINDOW (0x10210)
#define PCIX_CRB_WINDOW_F0 (0x10210) #define PCIX_CRB_WINDOW_F0 (0x10210)
#define PCIX_CRB_WINDOW_F1 (0x10230) #define PCIX_CRB_WINDOW_F1 (0x10230)
......
...@@ -904,11 +904,11 @@ netxen_nic_pci_set_window(struct netxen_adapter *adapter, ...@@ -904,11 +904,11 @@ netxen_nic_pci_set_window(struct netxen_adapter *adapter,
ddr_mn_window = window; ddr_mn_window = window;
writel(window, PCI_OFFSET_SECOND_RANGE(adapter, writel(window, PCI_OFFSET_SECOND_RANGE(adapter,
NETXEN_PCIX_PH_REG NETXEN_PCIX_PH_REG
(PCIX_MN_WINDOW))); (PCIX_MN_WINDOW(adapter->ahw.pci_func))));
/* MUST make sure window is set before we forge on... */ /* MUST make sure window is set before we forge on... */
readl(PCI_OFFSET_SECOND_RANGE(adapter, readl(PCI_OFFSET_SECOND_RANGE(adapter,
NETXEN_PCIX_PH_REG NETXEN_PCIX_PH_REG
(PCIX_MN_WINDOW))); (PCIX_MN_WINDOW(adapter->ahw.pci_func))));
} }
addr -= (window * NETXEN_WINDOW_ONE); addr -= (window * NETXEN_WINDOW_ONE);
addr += NETXEN_PCI_DDR_NET; addr += NETXEN_PCI_DDR_NET;
...@@ -929,11 +929,11 @@ netxen_nic_pci_set_window(struct netxen_adapter *adapter, ...@@ -929,11 +929,11 @@ netxen_nic_pci_set_window(struct netxen_adapter *adapter,
writel((window << 22), writel((window << 22),
PCI_OFFSET_SECOND_RANGE(adapter, PCI_OFFSET_SECOND_RANGE(adapter,
NETXEN_PCIX_PH_REG NETXEN_PCIX_PH_REG
(PCIX_SN_WINDOW))); (PCIX_SN_WINDOW(adapter->ahw.pci_func))));
/* MUST make sure window is set before we forge on... */ /* MUST make sure window is set before we forge on... */
readl(PCI_OFFSET_SECOND_RANGE(adapter, readl(PCI_OFFSET_SECOND_RANGE(adapter,
NETXEN_PCIX_PH_REG NETXEN_PCIX_PH_REG
(PCIX_SN_WINDOW))); (PCIX_SN_WINDOW(adapter->ahw.pci_func))));
} }
addr -= (window * 0x400000); addr -= (window * 0x400000);
addr += NETXEN_PCI_QDR_NET; addr += NETXEN_PCI_QDR_NET;
......
...@@ -746,9 +746,6 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev) ...@@ -746,9 +746,6 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev)
netxen_nic_disable_int(adapter); netxen_nic_disable_int(adapter);
if (adapter->irq)
free_irq(adapter->irq, adapter);
if (adapter->is_up == NETXEN_ADAPTER_UP_MAGIC) { if (adapter->is_up == NETXEN_ADAPTER_UP_MAGIC) {
init_firmware_done++; init_firmware_done++;
netxen_free_hw_resources(adapter); netxen_free_hw_resources(adapter);
...@@ -772,13 +769,8 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev) ...@@ -772,13 +769,8 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev)
} }
} }
if (adapter->flags & NETXEN_NIC_MSI_ENABLED)
pci_disable_msi(pdev);
vfree(adapter->cmd_buf_arr); vfree(adapter->cmd_buf_arr);
pci_disable_device(pdev);
if (adapter->portnum == 0) { if (adapter->portnum == 0) {
if (init_firmware_done) { if (init_firmware_done) {
i = 100; i = 100;
...@@ -829,12 +821,19 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev) ...@@ -829,12 +821,19 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev)
} }
} }
if (adapter->irq)
free_irq(adapter->irq, adapter);
if (adapter->flags & NETXEN_NIC_MSI_ENABLED)
pci_disable_msi(pdev);
iounmap(adapter->ahw.db_base); iounmap(adapter->ahw.db_base);
iounmap(adapter->ahw.pci_base0); iounmap(adapter->ahw.pci_base0);
iounmap(adapter->ahw.pci_base1); iounmap(adapter->ahw.pci_base1);
iounmap(adapter->ahw.pci_base2); iounmap(adapter->ahw.pci_base2);
pci_release_regions(pdev); pci_release_regions(pdev);
pci_disable_device(pdev);
pci_set_drvdata(pdev, NULL); pci_set_drvdata(pdev, NULL);
free_netdev(netdev); free_netdev(netdev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment