Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 0d551589 authored by Yi Zou's avatar Yi Zou Committed by David S. Miller
Browse files

ixgbe: Enable FCoE offload when DCB is enabled for 82599



Currently, FCoE offload feature is turned on when the kernel config has
CONFIG_FCOE or CONFIG_FCOE_MODULE set. However, we really want to turn
FCoE offload on when there is FCoE traffic passing and turn it off when
it's just LAN traffic. Since FCoE depends on a lossless network provided
by DCB, this allows us to have FCoE turned on/off when user turns on DCB
using dcbtool.

Signed-off-by: default avatarYi Zou <yi.zou@intel.com>
Acked-by: default avatarPeter P Waskiewicz Jr <peter.p.waskiewicz.jr@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent dacac4da
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -327,6 +327,7 @@ struct ixgbe_adapter {
#define IXGBE_FLAG_IN_SFP_MOD_TASK              (u32)(1 << 25)
#define IXGBE_FLAG_FDIR_HASH_CAPABLE            (u32)(1 << 26)
#define IXGBE_FLAG_FDIR_PERFECT_CAPABLE         (u32)(1 << 27)
#define IXGBE_FLAG_FCOE_CAPABLE                 (u32)(1 << 28)
#define IXGBE_FLAG_FCOE_ENABLED                 (u32)(1 << 29)

	u32 flags2;
+24 −0
Original line number Diff line number Diff line
@@ -139,6 +139,18 @@ static u8 ixgbe_dcbnl_set_state(struct net_device *netdev, u8 state)
			adapter->flags &= ~IXGBE_FLAG_FDIR_PERFECT_CAPABLE;
		}
		adapter->flags |= IXGBE_FLAG_DCB_ENABLED;
#ifdef IXGBE_FCOE
		/* Turn on FCoE offload */
		if ((adapter->flags & IXGBE_FLAG_FCOE_CAPABLE) &&
		    (!(adapter->flags & IXGBE_FLAG_FCOE_ENABLED))) {
			adapter->flags |= IXGBE_FLAG_FCOE_ENABLED;
			adapter->ring_feature[RING_F_FCOE].indices =
				IXGBE_FCRETA_SIZE;
			netdev->features |= NETIF_F_FCOE_CRC;
			netdev->features |= NETIF_F_FSO;
			netdev->fcoe_ddp_xid = IXGBE_FCOE_DDP_MAX - 1;
		}
#endif /* IXGBE_FCOE */
		ixgbe_init_interrupt_scheme(adapter);
		if (netif_running(netdev))
			netdev->netdev_ops->ndo_open(netdev);
@@ -156,6 +168,18 @@ static u8 ixgbe_dcbnl_set_state(struct net_device *netdev, u8 state)
			adapter->flags |= IXGBE_FLAG_RSS_ENABLED;
			if (adapter->hw.mac.type == ixgbe_mac_82599EB)
				adapter->flags |= IXGBE_FLAG_FDIR_HASH_CAPABLE;

#ifdef IXGBE_FCOE
			/* Turn off FCoE offload */
			if (adapter->flags & (IXGBE_FLAG_FCOE_CAPABLE |
			     IXGBE_FLAG_FCOE_ENABLED)) {
				adapter->flags &= ~IXGBE_FLAG_FCOE_ENABLED;
				adapter->ring_feature[RING_F_FCOE].indices = 0;
				netdev->features &= ~NETIF_F_FCOE_CRC;
				netdev->features &= ~NETIF_F_FSO;
				netdev->fcoe_ddp_xid = 0;
			}
#endif /* IXGBE_FCOE */
			ixgbe_init_interrupt_scheme(adapter);
			if (netif_running(netdev))
				netdev->netdev_ops->ndo_open(netdev);
+6 −10
Original line number Diff line number Diff line
@@ -3806,8 +3806,9 @@ static int __devinit ixgbe_sw_init(struct ixgbe_adapter *adapter)
		adapter->atr_sample_rate = 20;
		adapter->fdir_pballoc = 0;
#ifdef IXGBE_FCOE
		adapter->flags |= IXGBE_FLAG_FCOE_ENABLED;
		adapter->ring_feature[RING_F_FCOE].indices = IXGBE_FCRETA_SIZE;
		adapter->flags |= IXGBE_FLAG_FCOE_CAPABLE;
		adapter->flags &= ~IXGBE_FLAG_FCOE_ENABLED;
		adapter->ring_feature[RING_F_FCOE].indices = 0;
#endif /* IXGBE_FCOE */
	}

@@ -5580,16 +5581,11 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev,
#endif

#ifdef IXGBE_FCOE
	if (adapter->flags & IXGBE_FLAG_FCOE_ENABLED) {
	if (adapter->flags & IXGBE_FLAG_FCOE_CAPABLE) {
		if (hw->mac.ops.get_device_caps) {
			hw->mac.ops.get_device_caps(hw, &device_caps);
			if (!(device_caps & IXGBE_DEVICE_CAPS_FCOE_OFFLOADS)) {
				netdev->features |= NETIF_F_FCOE_CRC;
				netdev->features |= NETIF_F_FSO;
				netdev->fcoe_ddp_xid = IXGBE_FCOE_DDP_MAX - 1;
			} else {
				adapter->flags &= ~IXGBE_FLAG_FCOE_ENABLED;
			}
			if (device_caps & IXGBE_DEVICE_CAPS_FCOE_OFFLOADS)
				adapter->flags &= ~IXGBE_FLAG_FCOE_CAPABLE;
		}
	}
#endif /* IXGBE_FCOE */