ixgbe: Fix coexistence of FCoE and Flow Director in 82599
Fix coexistence of Fiber Channel over Ethernet (FCoE) and Flow Director (FDIR) in 82599 and remove the disabling of FDIR when FCoE is enabled. Currently, FDIR is turned off when FCoE is enabled under the assumption that FCoE is always enabled with DCB being turned on. However, FDIR does not have to be turned off all the time when FCoE is enabled since FCoE can be enabled without DCB being turned on, e.g., use link pause only. This patch makes sure that when DCB is turned on or off, FDIR is turned on or off correspondingly; and when FCoE is enabled, it does not disable FDIR, rather, it will have FDIR set up properly so FCoE and FDIR can coexist regardless of DCB being on or off. Signed-off-by: Yi Zou <yi.zou@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
ad46276952
commit
8faa2a786a
|
@ -138,6 +138,10 @@ static u8 ixgbe_dcbnl_set_state(struct net_device *netdev, u8 state)
|
|||
adapter->hw.fc.requested_mode = ixgbe_fc_none;
|
||||
}
|
||||
adapter->flags &= ~IXGBE_FLAG_RSS_ENABLED;
|
||||
if (adapter->hw.mac.type == ixgbe_mac_82599EB) {
|
||||
adapter->flags &= ~IXGBE_FLAG_FDIR_HASH_CAPABLE;
|
||||
adapter->flags &= ~IXGBE_FLAG_FDIR_PERFECT_CAPABLE;
|
||||
}
|
||||
adapter->flags |= IXGBE_FLAG_DCB_ENABLED;
|
||||
ixgbe_init_interrupt_scheme(adapter);
|
||||
if (netif_running(netdev))
|
||||
|
@ -154,6 +158,8 @@ static u8 ixgbe_dcbnl_set_state(struct net_device *netdev, u8 state)
|
|||
adapter->dcb_cfg.pfc_mode_enable = false;
|
||||
adapter->flags &= ~IXGBE_FLAG_DCB_ENABLED;
|
||||
adapter->flags |= IXGBE_FLAG_RSS_ENABLED;
|
||||
if (adapter->hw.mac.type == ixgbe_mac_82599EB)
|
||||
adapter->flags |= IXGBE_FLAG_FDIR_HASH_CAPABLE;
|
||||
ixgbe_init_interrupt_scheme(adapter);
|
||||
if (netif_running(netdev))
|
||||
netdev->netdev_ops->ndo_open(netdev);
|
||||
|
|
|
@ -3130,7 +3130,11 @@ static inline bool ixgbe_set_fcoe_queues(struct ixgbe_adapter *adapter)
|
|||
#endif
|
||||
if (adapter->flags & IXGBE_FLAG_RSS_ENABLED) {
|
||||
DPRINTK(PROBE, INFO, "FCOE enabled with RSS \n");
|
||||
ixgbe_set_rss_queues(adapter);
|
||||
if ((adapter->flags & IXGBE_FLAG_FDIR_HASH_CAPABLE) ||
|
||||
(adapter->flags & IXGBE_FLAG_FDIR_PERFECT_CAPABLE))
|
||||
ixgbe_set_fdir_queues(adapter);
|
||||
else
|
||||
ixgbe_set_rss_queues(adapter);
|
||||
}
|
||||
/* adding FCoE rx rings to the end */
|
||||
f->mask = adapter->num_rx_queues;
|
||||
|
@ -3388,7 +3392,12 @@ static inline bool ixgbe_cache_ring_fcoe(struct ixgbe_adapter *adapter)
|
|||
}
|
||||
#endif /* CONFIG_IXGBE_DCB */
|
||||
if (adapter->flags & IXGBE_FLAG_RSS_ENABLED) {
|
||||
ixgbe_cache_ring_rss(adapter);
|
||||
if ((adapter->flags & IXGBE_FLAG_FDIR_HASH_CAPABLE) ||
|
||||
(adapter->flags & IXGBE_FLAG_FDIR_PERFECT_CAPABLE))
|
||||
ixgbe_cache_ring_fdir(adapter);
|
||||
else
|
||||
ixgbe_cache_ring_rss(adapter);
|
||||
|
||||
fcoe_i = f->mask;
|
||||
}
|
||||
for (i = 0; i < f->indices; i++, fcoe_i++)
|
||||
|
@ -5578,12 +5587,6 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev,
|
|||
netdev->features |= NETIF_F_FCOE_CRC;
|
||||
netdev->features |= NETIF_F_FSO;
|
||||
netdev->fcoe_ddp_xid = IXGBE_FCOE_DDP_MAX - 1;
|
||||
DPRINTK(DRV, INFO, "FCoE enabled, "
|
||||
"disabling Flow Director\n");
|
||||
adapter->flags &= ~IXGBE_FLAG_FDIR_HASH_CAPABLE;
|
||||
adapter->flags &=
|
||||
~IXGBE_FLAG_FDIR_PERFECT_CAPABLE;
|
||||
adapter->atr_sample_rate = 0;
|
||||
} else {
|
||||
adapter->flags &= ~IXGBE_FLAG_FCOE_ENABLED;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue