aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/ixgbe/ixgbe_dcb_nl.c52
-rw-r--r--include/net/dcbnl.h2
-rw-r--r--net/dcb/dcbnl.c5
3 files changed, 32 insertions, 27 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,
diff --git a/include/net/dcbnl.h b/include/net/dcbnl.h
index 91e0a3d7faf2..775cfc8055be 100644
--- a/include/net/dcbnl.h
+++ b/include/net/dcbnl.h
@@ -26,7 +26,7 @@
26 */ 26 */
27struct dcbnl_rtnl_ops { 27struct dcbnl_rtnl_ops {
28 u8 (*getstate)(struct net_device *); 28 u8 (*getstate)(struct net_device *);
29 void (*setstate)(struct net_device *, u8); 29 u8 (*setstate)(struct net_device *, u8);
30 void (*getpermhwaddr)(struct net_device *, u8 *); 30 void (*getpermhwaddr)(struct net_device *, u8 *);
31 void (*setpgtccfgtx)(struct net_device *, int, u8, u8, u8, u8); 31 void (*setpgtccfgtx)(struct net_device *, int, u8, u8, u8, u8);
32 void (*setpgbwgcfgtx)(struct net_device *, int, u8); 32 void (*setpgbwgcfgtx)(struct net_device *, int, u8);
diff --git a/net/dcb/dcbnl.c b/net/dcb/dcbnl.c
index a1254061629f..fc88fc4d4f63 100644
--- a/net/dcb/dcbnl.c
+++ b/net/dcb/dcbnl.c
@@ -714,9 +714,8 @@ static int dcbnl_setstate(struct net_device *netdev, struct nlattr **tb,
714 714
715 value = nla_get_u8(tb[DCB_ATTR_STATE]); 715 value = nla_get_u8(tb[DCB_ATTR_STATE]);
716 716
717 netdev->dcbnl_ops->setstate(netdev, value); 717 ret = dcbnl_reply(netdev->dcbnl_ops->setstate(netdev, value),
718 718 RTM_SETDCB, DCB_CMD_SSTATE, DCB_ATTR_STATE,
719 ret = dcbnl_reply(0, RTM_SETDCB, DCB_CMD_SSTATE, DCB_ATTR_STATE,
720 pid, seq, flags); 719 pid, seq, flags);
721 720
722 return ret; 721 return ret;