ixgbe: fix DCB setstate to return success/failure
Subsystems (2)
PATCH 1/1 ixgbe: fix DCB setstate to return success/failure
From: Don Skidmore <[email protected]>
Fix the DCB setstate operation function to check and not attempt to enable DCB if MSI-X is not enabled. Return a sucess/failure status to DCB netlink layer.
Signed-off-by Don Skidmore <[email protected]>
Signed-off-by Eric W Multanen <[email protected]>
Signed-off-by Peter P Waskiewicz Jr <[email protected]>
Signed-off-by Jeff Kirsher <[email protected]>
---
drivers/net/ixgbe/ixgbe_dcb_nl.c | 47 ++++++++++++++++++++++---------------- 1 files changed, 27 insertions(+), 20 deletions(-)
drivers/net/ixgbe/ixgbe_dcb_nl.c +27 -20
@@ -124,8 +124,9 @@ static u16 ixgbe_dcb_select_queue(struct net_device *dev, struct sk_buff *skb)return 0 ; } -static void ixgbe_dcbnl_set_state (struct net_device *netdev,u8 state) +static u8 ixgbe_dcbnl_set_state (struct net_device *netdev,u8 state) { +u8 err =0 ;struct ixgbe_adapter *adapter =netdev_priv (netdev);DPRINTK (DRV ,INFO ,"Set DCB Admin Mode.\n" );
@@ -133,25 +134,31 @@ static void ixgbe_dcbnl_set_state(struct net_device *netdev, u8 state)if (state >0 ) {/* Turn on DCB */ if (adapter->flags &IXGBE_FLAG_DCB_ENABLED ) { -return ; - }else { -if (netif_running (netdev)) - netdev->stop (netdev); -ixgbe_reset_interrupt_capability (adapter); -ixgbe_napi_del_all (adapter); -kfree (adapter->tx_ring); -kfree (adapter->rx_ring); - adapter->tx_ring =NULL ; - adapter->rx_ring =NULL ; - netdev->select_queue = &ixgbe_dcb_select_queue; + goto out; + } - adapter->flags &= ~IXGBE_FLAG_RSS_ENABLED ; - adapter->flags |=IXGBE_FLAG_DCB_ENABLED ; -ixgbe_init_interrupt_scheme (adapter); -ixgbe_napi_add_all (adapter); -if (netif_running (netdev)) - netdev->open (netdev); +if (!(adapter->flags &IXGBE_FLAG_MSIX_ENABLED )) { +DPRINTK (DRV ,ERR ,"Enable Failed, needs MSI-X\n" ); + err =1 ; + goto out; } + +if (netif_running (netdev)) + netdev->stop (netdev); +ixgbe_reset_interrupt_capability (adapter); +ixgbe_napi_del_all (adapter); +kfree (adapter->tx_ring); +kfree (adapter->rx_ring); + adapter->tx_ring =NULL ; + adapter->rx_ring =NULL ; + netdev->select_queue = &ixgbe_dcb_select_queue; + + adapter->flags &= ~IXGBE_FLAG_RSS_ENABLED ; + adapter->flags |=IXGBE_FLAG_DCB_ENABLED ; +ixgbe_init_interrupt_scheme (adapter); +ixgbe_napi_add_all (adapter); +if (netif_running (netdev)) + netdev->open (netdev); }else {/* Turn off DCB */ if (adapter->flags &IXGBE_FLAG_DCB_ENABLED ) {
@@ -171,10 +178,10 @@ static void ixgbe_dcbnl_set_state(struct net_device *netdev, u8 state)ixgbe_napi_add_all (adapter);if (netif_running (netdev)) netdev->open (netdev); - }else { -return ; } } +out: +return err; } static void ixgbe_dcbnl_get_perm_hw_addr(struct net_device *netdev,