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

Commit ca77cd59 authored by Robert Love's avatar Robert Love Committed by David S. Miller
Browse files

ixgbe: Priority tag FIP frames



Currently FIP (FCoE Initialization Protocol) frames
are going untagged. This causes various problems
with FCFs (switches) that have negotiated a priority
over dcbx. This patch tags FIP frames with the same
priority as the FCoE frames.

Signed-off-by: default avatarRobert Love <robert.w.love@intel.com>
Signed-off-by: default avatarChris Leech <christopher.leech@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a7551b75
Loading
Loading
Loading
Loading
+17 −9
Original line number Diff line number Diff line
@@ -5648,7 +5648,8 @@ static u16 ixgbe_select_queue(struct net_device *dev, struct sk_buff *skb)

#ifdef IXGBE_FCOE
	if ((adapter->flags & IXGBE_FLAG_FCOE_ENABLED) &&
	    (skb->protocol == htons(ETH_P_FCOE))) {
	    ((skb->protocol == htons(ETH_P_FCOE)) ||
	     (skb->protocol == htons(ETH_P_FIP)))) {
		txq &= (adapter->ring_feature[RING_F_FCOE].indices - 1);
		txq += adapter->ring_feature[RING_F_FCOE].mask;
		return txq;
@@ -5695,18 +5696,25 @@ static netdev_tx_t ixgbe_xmit_frame(struct sk_buff *skb,

	tx_ring = adapter->tx_ring[skb->queue_mapping];

	if ((adapter->flags & IXGBE_FLAG_FCOE_ENABLED) &&
	    (skb->protocol == htons(ETH_P_FCOE))) {
		tx_flags |= IXGBE_TX_FLAGS_FCOE;
#ifdef IXGBE_FCOE
	if (adapter->flags & IXGBE_FLAG_FCOE_ENABLED) {
#ifdef CONFIG_IXGBE_DCB
		/* for FCoE with DCB, we force the priority to what
		 * was specified by the switch */
		if ((skb->protocol == htons(ETH_P_FCOE)) ||
		    (skb->protocol == htons(ETH_P_FIP))) {
			tx_flags &= ~(IXGBE_TX_FLAGS_VLAN_PRIO_MASK
				      << IXGBE_TX_FLAGS_VLAN_SHIFT);
			tx_flags |= ((adapter->fcoe.up << 13)
				     << IXGBE_TX_FLAGS_VLAN_SHIFT);
		}
#endif
#endif
		/* flag for FCoE offloads */
		if (skb->protocol == htons(ETH_P_FCOE))
			tx_flags |= IXGBE_TX_FLAGS_FCOE;
	}
#endif

	/* four things can cause us to need a context descriptor */
	if (skb_is_gso(skb) ||
	    (skb->ip_summed == CHECKSUM_PARTIAL) ||