diff options
| -rw-r--r-- | drivers/net/ixgbe/ixgbe_main.c | 38 |
1 files changed, 28 insertions, 10 deletions
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c index b4c9c77c09dd..c814d9bfbca7 100644 --- a/drivers/net/ixgbe/ixgbe_main.c +++ b/drivers/net/ixgbe/ixgbe_main.c | |||
| @@ -87,6 +87,25 @@ MODULE_VERSION(DRV_VERSION); | |||
| 87 | 87 | ||
| 88 | #define DEFAULT_DEBUG_LEVEL_SHIFT 3 | 88 | #define DEFAULT_DEBUG_LEVEL_SHIFT 3 |
| 89 | 89 | ||
| 90 | static void ixgbe_release_hw_control(struct ixgbe_adapter *adapter) | ||
| 91 | { | ||
| 92 | u32 ctrl_ext; | ||
| 93 | |||
| 94 | /* Let firmware take over control of h/w */ | ||
| 95 | ctrl_ext = IXGBE_READ_REG(&adapter->hw, IXGBE_CTRL_EXT); | ||
| 96 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_CTRL_EXT, | ||
| 97 | ctrl_ext & ~IXGBE_CTRL_EXT_DRV_LOAD); | ||
| 98 | } | ||
| 99 | |||
| 100 | static void ixgbe_get_hw_control(struct ixgbe_adapter *adapter) | ||
| 101 | { | ||
| 102 | u32 ctrl_ext; | ||
| 103 | |||
| 104 | /* Let firmware know the driver has taken over */ | ||
| 105 | ctrl_ext = IXGBE_READ_REG(&adapter->hw, IXGBE_CTRL_EXT); | ||
| 106 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_CTRL_EXT, | ||
| 107 | ctrl_ext | IXGBE_CTRL_EXT_DRV_LOAD); | ||
| 108 | } | ||
| 90 | 109 | ||
| 91 | #ifdef DEBUG | 110 | #ifdef DEBUG |
| 92 | /** | 111 | /** |
| @@ -1204,6 +1223,8 @@ static int ixgbe_up_complete(struct ixgbe_adapter *adapter) | |||
| 1204 | u32 txdctl, rxdctl, mhadd; | 1223 | u32 txdctl, rxdctl, mhadd; |
| 1205 | int max_frame = netdev->mtu + ETH_HLEN + ETH_FCS_LEN; | 1224 | int max_frame = netdev->mtu + ETH_HLEN + ETH_FCS_LEN; |
| 1206 | 1225 | ||
| 1226 | ixgbe_get_hw_control(adapter); | ||
| 1227 | |||
| 1207 | if (adapter->flags & (IXGBE_FLAG_MSIX_ENABLED | | 1228 | if (adapter->flags & (IXGBE_FLAG_MSIX_ENABLED | |
| 1208 | IXGBE_FLAG_MSI_ENABLED)) { | 1229 | IXGBE_FLAG_MSI_ENABLED)) { |
| 1209 | if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED) { | 1230 | if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED) { |
| @@ -1490,6 +1511,8 @@ static int ixgbe_suspend(struct pci_dev *pdev, pm_message_t state) | |||
| 1490 | pci_enable_wake(pdev, PCI_D3hot, 0); | 1511 | pci_enable_wake(pdev, PCI_D3hot, 0); |
| 1491 | pci_enable_wake(pdev, PCI_D3cold, 0); | 1512 | pci_enable_wake(pdev, PCI_D3cold, 0); |
| 1492 | 1513 | ||
| 1514 | ixgbe_release_hw_control(adapter); | ||
| 1515 | |||
| 1493 | pci_disable_device(pdev); | 1516 | pci_disable_device(pdev); |
| 1494 | 1517 | ||
| 1495 | pci_set_power_state(pdev, pci_choose_state(pdev, state)); | 1518 | pci_set_power_state(pdev, pci_choose_state(pdev, state)); |
| @@ -1891,14 +1914,8 @@ static int ixgbe_open(struct net_device *netdev) | |||
| 1891 | { | 1914 | { |
| 1892 | struct ixgbe_adapter *adapter = netdev_priv(netdev); | 1915 | struct ixgbe_adapter *adapter = netdev_priv(netdev); |
| 1893 | int err; | 1916 | int err; |
| 1894 | u32 ctrl_ext; | ||
| 1895 | u32 num_rx_queues = adapter->num_rx_queues; | 1917 | u32 num_rx_queues = adapter->num_rx_queues; |
| 1896 | 1918 | ||
| 1897 | /* Let firmware know the driver has taken over */ | ||
| 1898 | ctrl_ext = IXGBE_READ_REG(&adapter->hw, IXGBE_CTRL_EXT); | ||
| 1899 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_CTRL_EXT, | ||
| 1900 | ctrl_ext | IXGBE_CTRL_EXT_DRV_LOAD); | ||
| 1901 | |||
| 1902 | try_intr_reinit: | 1919 | try_intr_reinit: |
| 1903 | /* allocate transmit descriptors */ | 1920 | /* allocate transmit descriptors */ |
| 1904 | err = ixgbe_setup_all_tx_resources(adapter); | 1921 | err = ixgbe_setup_all_tx_resources(adapter); |
| @@ -1949,6 +1966,7 @@ try_intr_reinit: | |||
| 1949 | return 0; | 1966 | return 0; |
| 1950 | 1967 | ||
| 1951 | err_up: | 1968 | err_up: |
| 1969 | ixgbe_release_hw_control(adapter); | ||
| 1952 | ixgbe_free_irq(adapter); | 1970 | ixgbe_free_irq(adapter); |
| 1953 | err_req_irq: | 1971 | err_req_irq: |
| 1954 | ixgbe_free_all_rx_resources(adapter); | 1972 | ixgbe_free_all_rx_resources(adapter); |
| @@ -1974,7 +1992,6 @@ err_setup_tx: | |||
| 1974 | static int ixgbe_close(struct net_device *netdev) | 1992 | static int ixgbe_close(struct net_device *netdev) |
| 1975 | { | 1993 | { |
| 1976 | struct ixgbe_adapter *adapter = netdev_priv(netdev); | 1994 | struct ixgbe_adapter *adapter = netdev_priv(netdev); |
| 1977 | u32 ctrl_ext; | ||
| 1978 | 1995 | ||
| 1979 | ixgbe_down(adapter); | 1996 | ixgbe_down(adapter); |
| 1980 | ixgbe_free_irq(adapter); | 1997 | ixgbe_free_irq(adapter); |
| @@ -1982,9 +1999,7 @@ static int ixgbe_close(struct net_device *netdev) | |||
| 1982 | ixgbe_free_all_tx_resources(adapter); | 1999 | ixgbe_free_all_tx_resources(adapter); |
| 1983 | ixgbe_free_all_rx_resources(adapter); | 2000 | ixgbe_free_all_rx_resources(adapter); |
| 1984 | 2001 | ||
| 1985 | ctrl_ext = IXGBE_READ_REG(&adapter->hw, IXGBE_CTRL_EXT); | 2002 | ixgbe_release_hw_control(adapter); |
| 1986 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_CTRL_EXT, | ||
| 1987 | ctrl_ext & ~IXGBE_CTRL_EXT_DRV_LOAD); | ||
| 1988 | 2003 | ||
| 1989 | return 0; | 2004 | return 0; |
| 1990 | } | 2005 | } |
| @@ -2749,6 +2764,7 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev, | |||
| 2749 | return 0; | 2764 | return 0; |
| 2750 | 2765 | ||
| 2751 | err_register: | 2766 | err_register: |
| 2767 | ixgbe_release_hw_control(adapter); | ||
| 2752 | err_hw_init: | 2768 | err_hw_init: |
| 2753 | err_sw_init: | 2769 | err_sw_init: |
| 2754 | err_eeprom: | 2770 | err_eeprom: |
| @@ -2784,6 +2800,8 @@ static void __devexit ixgbe_remove(struct pci_dev *pdev) | |||
| 2784 | 2800 | ||
| 2785 | unregister_netdev(netdev); | 2801 | unregister_netdev(netdev); |
| 2786 | 2802 | ||
| 2803 | ixgbe_release_hw_control(adapter); | ||
| 2804 | |||
| 2787 | kfree(adapter->tx_ring); | 2805 | kfree(adapter->tx_ring); |
| 2788 | kfree(adapter->rx_ring); | 2806 | kfree(adapter->rx_ring); |
| 2789 | 2807 | ||
