|
@@ -353,6 +353,7 @@ static void ixgbe_dcbnl_get_pfc_cfg(struct net_device *netdev, int priority,
|
|
static u8 ixgbe_dcbnl_set_all(struct net_device *netdev)
|
|
static u8 ixgbe_dcbnl_set_all(struct net_device *netdev)
|
|
{
|
|
{
|
|
struct ixgbe_adapter *adapter = netdev_priv(netdev);
|
|
struct ixgbe_adapter *adapter = netdev_priv(netdev);
|
|
|
|
+ bool do_reset;
|
|
int ret;
|
|
int ret;
|
|
|
|
|
|
if (!adapter->dcb_set_bitmap)
|
|
if (!adapter->dcb_set_bitmap)
|
|
@@ -368,7 +369,9 @@ static u8 ixgbe_dcbnl_set_all(struct net_device *netdev)
|
|
* Only take down the adapter if the configuration change
|
|
* Only take down the adapter if the configuration change
|
|
* requires a reset.
|
|
* requires a reset.
|
|
*/
|
|
*/
|
|
- if (adapter->dcb_set_bitmap & BIT_RESETLINK) {
|
|
|
|
|
|
+ do_reset = adapter->dcb_set_bitmap & (BIT_RESETLINK | BIT_APP_UPCHG);
|
|
|
|
+
|
|
|
|
+ if (do_reset) {
|
|
while (test_and_set_bit(__IXGBE_RESETTING, &adapter->state))
|
|
while (test_and_set_bit(__IXGBE_RESETTING, &adapter->state))
|
|
msleep(1);
|
|
msleep(1);
|
|
|
|
|
|
@@ -408,7 +411,7 @@ static u8 ixgbe_dcbnl_set_all(struct net_device *netdev)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- if (adapter->dcb_set_bitmap & BIT_RESETLINK) {
|
|
|
|
|
|
+ if (do_reset) {
|
|
if (adapter->dcb_set_bitmap & BIT_APP_UPCHG) {
|
|
if (adapter->dcb_set_bitmap & BIT_APP_UPCHG) {
|
|
ixgbe_init_interrupt_scheme(adapter);
|
|
ixgbe_init_interrupt_scheme(adapter);
|
|
if (netif_running(netdev))
|
|
if (netif_running(netdev))
|
|
@@ -430,7 +433,7 @@ static u8 ixgbe_dcbnl_set_all(struct net_device *netdev)
|
|
if (adapter->dcb_cfg.pfc_mode_enable)
|
|
if (adapter->dcb_cfg.pfc_mode_enable)
|
|
adapter->hw.fc.current_mode = ixgbe_fc_pfc;
|
|
adapter->hw.fc.current_mode = ixgbe_fc_pfc;
|
|
|
|
|
|
- if (adapter->dcb_set_bitmap & BIT_RESETLINK)
|
|
|
|
|
|
+ if (do_reset)
|
|
clear_bit(__IXGBE_RESETTING, &adapter->state);
|
|
clear_bit(__IXGBE_RESETTING, &adapter->state);
|
|
adapter->dcb_set_bitmap = 0x00;
|
|
adapter->dcb_set_bitmap = 0x00;
|
|
return ret;
|
|
return ret;
|
|
@@ -568,18 +571,29 @@ static u8 ixgbe_dcbnl_setapp(struct net_device *netdev,
|
|
case DCB_APP_IDTYPE_ETHTYPE:
|
|
case DCB_APP_IDTYPE_ETHTYPE:
|
|
#ifdef IXGBE_FCOE
|
|
#ifdef IXGBE_FCOE
|
|
if (id == ETH_P_FCOE) {
|
|
if (id == ETH_P_FCOE) {
|
|
- u8 tc;
|
|
|
|
- struct ixgbe_adapter *adapter;
|
|
|
|
|
|
+ u8 old_tc;
|
|
|
|
+ struct ixgbe_adapter *adapter = netdev_priv(netdev);
|
|
|
|
|
|
- adapter = netdev_priv(netdev);
|
|
|
|
- tc = adapter->fcoe.tc;
|
|
|
|
|
|
+ /* Get current programmed tc */
|
|
|
|
+ old_tc = adapter->fcoe.tc;
|
|
rval = ixgbe_fcoe_setapp(adapter, up);
|
|
rval = ixgbe_fcoe_setapp(adapter, up);
|
|
- if ((!rval) && (tc != adapter->fcoe.tc) &&
|
|
|
|
- (adapter->flags & IXGBE_FLAG_DCB_ENABLED) &&
|
|
|
|
- (adapter->flags & IXGBE_FLAG_FCOE_ENABLED)) {
|
|
|
|
|
|
+
|
|
|
|
+ if (rval ||
|
|
|
|
+ !(adapter->flags & IXGBE_FLAG_DCB_ENABLED) ||
|
|
|
|
+ !(adapter->flags & IXGBE_FLAG_FCOE_ENABLED))
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ /* The FCoE application priority may be changed multiple
|
|
|
|
+ * times in quick sucession with switches that build up
|
|
|
|
+ * TLVs. To avoid creating uneeded device resets this
|
|
|
|
+ * checks the actual HW configuration and clears
|
|
|
|
+ * BIT_APP_UPCHG if a HW configuration change is not
|
|
|
|
+ * need
|
|
|
|
+ */
|
|
|
|
+ if (old_tc == adapter->fcoe.tc)
|
|
|
|
+ adapter->dcb_set_bitmap &= ~BIT_APP_UPCHG;
|
|
|
|
+ else
|
|
adapter->dcb_set_bitmap |= BIT_APP_UPCHG;
|
|
adapter->dcb_set_bitmap |= BIT_APP_UPCHG;
|
|
- adapter->dcb_set_bitmap |= BIT_RESETLINK;
|
|
|
|
- }
|
|
|
|
}
|
|
}
|
|
#endif
|
|
#endif
|
|
break;
|
|
break;
|