aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ixgbe
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/ixgbe')
-rw-r--r--drivers/net/ixgbe/ixgbe_dcb_nl.c52
1 files changed, 29 insertions, 23 deletions
diff --git a/drivers/net/ixgbe/ixgbe_dcb_nl.c b/drivers/net/ixgbe/ixgbe_dcb_nl.c
index 615c2803202a..7d158a5c545b 100644
--- a/drivers/net/ixgbe/ixgbe_dcb_nl.c
+++ b/drivers/net/ixgbe/ixgbe_dcb_nl.c
@@ -124,39 +124,45 @@ static u16 ixgbe_dcb_select_queue(struct net_device *dev, struct sk_buff *skb)
124 return 0; 124 return 0;
125} 125}
126 126
127static void ixgbe_dcbnl_set_state(struct net_device *netdev, u8 state) 127static u8 ixgbe_dcbnl_set_state(struct net_device *netdev, u8 state)
128{ 128{
129 u8 err = 0;
129 struct ixgbe_adapter *adapter = netdev_priv(netdev); 130 struct ixgbe_adapter *adapter = netdev_priv(netdev);
130 131
131 DPRINTK(DRV, INFO, "Set DCB Admin Mode.\n"); 132 DPRINTK(DRV, INFO, "Set DCB Admin Mode.\n");
132 133
133 if (state > 0) { 134 if (state > 0) {
134 /* Turn on DCB */ 135 /* Turn on DCB */
135 if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) { 136 if (adapter->flags & IXGBE_FLAG_DCB_ENABLED)
136 return; 137 goto out;
137 } else {
138 if (netif_running(netdev))
139 netdev->stop(netdev);
140 ixgbe_reset_interrupt_capability(adapter);
141 ixgbe_napi_del_all(adapter);
142 kfree(adapter->tx_ring);
143 kfree(adapter->rx_ring);
144 adapter->tx_ring = NULL;
145 adapter->rx_ring = NULL;
146 netdev->select_queue = &ixgbe_dcb_select_queue;
147 138
148 adapter->flags &= ~IXGBE_FLAG_RSS_ENABLED; 139 if (!(adapter->flags & IXGBE_FLAG_MSIX_ENABLED)) {
149 adapter->flags |= IXGBE_FLAG_DCB_ENABLED; 140 DPRINTK(DRV, ERR, "Enable failed, needs MSI-X\n");
150 ixgbe_init_interrupt_scheme(adapter); 141 err = 1;
151 ixgbe_napi_add_all(adapter); 142 goto out;
152 if (netif_running(netdev))
153 netdev->open(netdev);
154 } 143 }
144
145 if (netif_running(netdev))
146 netdev->netdev_ops->ndo_stop(netdev);
147 ixgbe_reset_interrupt_capability(adapter);
148 ixgbe_napi_del_all(adapter);
149 kfree(adapter->tx_ring);
150 kfree(adapter->rx_ring);
151 adapter->tx_ring = NULL;
152 adapter->rx_ring = NULL;
153 netdev->select_queue = &ixgbe_dcb_select_queue;
154
155 adapter->flags &= ~IXGBE_FLAG_RSS_ENABLED;
156 adapter->flags |= IXGBE_FLAG_DCB_ENABLED;
157 ixgbe_init_interrupt_scheme(adapter);
158 ixgbe_napi_add_all(adapter);
159 if (netif_running(netdev))
160 netdev->netdev_ops->ndo_open(netdev);
155 } else { 161 } else {
156 /* Turn off DCB */ 162 /* Turn off DCB */
157 if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) { 163 if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) {
158 if (netif_running(netdev)) 164 if (netif_running(netdev))
159 netdev->stop(netdev); 165 netdev->netdev_ops->ndo_stop(netdev);
160 ixgbe_reset_interrupt_capability(adapter); 166 ixgbe_reset_interrupt_capability(adapter);
161 ixgbe_napi_del_all(adapter); 167 ixgbe_napi_del_all(adapter);
162 kfree(adapter->tx_ring); 168 kfree(adapter->tx_ring);
@@ -170,11 +176,11 @@ static void ixgbe_dcbnl_set_state(struct net_device *netdev, u8 state)
170 ixgbe_init_interrupt_scheme(adapter); 176 ixgbe_init_interrupt_scheme(adapter);
171 ixgbe_napi_add_all(adapter); 177 ixgbe_napi_add_all(adapter);
172 if (netif_running(netdev)) 178 if (netif_running(netdev))
173 netdev->open(netdev); 179 netdev->netdev_ops->ndo_open(netdev);
174 } else {
175 return;
176 } 180 }
177 } 181 }
182out:
183 return err;
178} 184}
179 185
180static void ixgbe_dcbnl_get_perm_hw_addr(struct net_device *netdev, 186static void ixgbe_dcbnl_get_perm_hw_addr(struct net_device *netdev,