Commit 57efd44c authored by Alexander Duyck's avatar Alexander Duyck Committed by David S. Miller
Browse files

ixgbe: Do not pad FCoE frames as this can cause issues with FCoE DDP



FCoE target mode was experiencing issues due to the fact that we were
sending up data frames that were padded to 60 bytes after the DDP logic had
already stripped the frame down to 52 or 56 depending on the use of VLANs.
This was resulting in the FCoE DDP logic having issues since it thought the
frame still had data in it due to the padding.

To resolve this, adding code so that we do not pad FCoE frames prior to
handling them to the stack.

CC: <stable@vger.kernel.org>
Signed-off-by: default avatarAlexander Duyck <alexander.h.duyck@intel.com>
Tested-by: default avatarPhil Schmitt <phillip.j.schmitt@intel.com>
Tested-by: default avatarRoss Brattain <ross.b.brattain@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a2842a1e
...@@ -196,7 +196,7 @@ enum ixgbe_ring_state_t { ...@@ -196,7 +196,7 @@ enum ixgbe_ring_state_t {
__IXGBE_HANG_CHECK_ARMED, __IXGBE_HANG_CHECK_ARMED,
__IXGBE_RX_RSC_ENABLED, __IXGBE_RX_RSC_ENABLED,
__IXGBE_RX_CSUM_UDP_ZERO_ERR, __IXGBE_RX_CSUM_UDP_ZERO_ERR,
__IXGBE_RX_FCOE_BUFSZ, __IXGBE_RX_FCOE,
}; };
#define check_for_tx_hang(ring) \ #define check_for_tx_hang(ring) \
...@@ -290,7 +290,7 @@ struct ixgbe_ring_feature { ...@@ -290,7 +290,7 @@ struct ixgbe_ring_feature {
#if defined(IXGBE_FCOE) && (PAGE_SIZE < 8192) #if defined(IXGBE_FCOE) && (PAGE_SIZE < 8192)
static inline unsigned int ixgbe_rx_pg_order(struct ixgbe_ring *ring) static inline unsigned int ixgbe_rx_pg_order(struct ixgbe_ring *ring)
{ {
return test_bit(__IXGBE_RX_FCOE_BUFSZ, &ring->state) ? 1 : 0; return test_bit(__IXGBE_RX_FCOE, &ring->state) ? 1 : 0;
} }
#else #else
#define ixgbe_rx_pg_order(_ring) 0 #define ixgbe_rx_pg_order(_ring) 0
......
...@@ -634,7 +634,7 @@ static int ixgbe_alloc_q_vector(struct ixgbe_adapter *adapter, ...@@ -634,7 +634,7 @@ static int ixgbe_alloc_q_vector(struct ixgbe_adapter *adapter,
f = &adapter->ring_feature[RING_F_FCOE]; f = &adapter->ring_feature[RING_F_FCOE];
if ((rxr_idx >= f->mask) && if ((rxr_idx >= f->mask) &&
(rxr_idx < f->mask + f->indices)) (rxr_idx < f->mask + f->indices))
set_bit(__IXGBE_RX_FCOE_BUFSZ, &ring->state); set_bit(__IXGBE_RX_FCOE, &ring->state);
} }
#endif /* IXGBE_FCOE */ #endif /* IXGBE_FCOE */
......
...@@ -1058,17 +1058,17 @@ static inline void ixgbe_rx_hash(struct ixgbe_ring *ring, ...@@ -1058,17 +1058,17 @@ static inline void ixgbe_rx_hash(struct ixgbe_ring *ring,
#ifdef IXGBE_FCOE #ifdef IXGBE_FCOE
/** /**
* ixgbe_rx_is_fcoe - check the rx desc for incoming pkt type * ixgbe_rx_is_fcoe - check the rx desc for incoming pkt type
* @adapter: address of board private structure * @ring: structure containing ring specific data
* @rx_desc: advanced rx descriptor * @rx_desc: advanced rx descriptor
* *
* Returns : true if it is FCoE pkt * Returns : true if it is FCoE pkt
*/ */
static inline bool ixgbe_rx_is_fcoe(struct ixgbe_adapter *adapter, static inline bool ixgbe_rx_is_fcoe(struct ixgbe_ring *ring,
union ixgbe_adv_rx_desc *rx_desc) union ixgbe_adv_rx_desc *rx_desc)
{ {
__le16 pkt_info = rx_desc->wb.lower.lo_dword.hs_rss.pkt_info; __le16 pkt_info = rx_desc->wb.lower.lo_dword.hs_rss.pkt_info;
return (adapter->flags & IXGBE_FLAG_FCOE_ENABLED) && return test_bit(__IXGBE_RX_FCOE, &ring->state) &&
((pkt_info & cpu_to_le16(IXGBE_RXDADV_PKTTYPE_ETQF_MASK)) == ((pkt_info & cpu_to_le16(IXGBE_RXDADV_PKTTYPE_ETQF_MASK)) ==
(cpu_to_le16(IXGBE_ETQF_FILTER_FCOE << (cpu_to_le16(IXGBE_ETQF_FILTER_FCOE <<
IXGBE_RXDADV_PKTTYPE_ETQF_SHIFT))); IXGBE_RXDADV_PKTTYPE_ETQF_SHIFT)));
...@@ -1549,6 +1549,12 @@ static bool ixgbe_cleanup_headers(struct ixgbe_ring *rx_ring, ...@@ -1549,6 +1549,12 @@ static bool ixgbe_cleanup_headers(struct ixgbe_ring *rx_ring,
skb->truesize -= ixgbe_rx_bufsz(rx_ring); skb->truesize -= ixgbe_rx_bufsz(rx_ring);
} }
#ifdef IXGBE_FCOE
/* do not attempt to pad FCoE Frames as this will disrupt DDP */
if (ixgbe_rx_is_fcoe(rx_ring, rx_desc))
return false;
#endif
/* if skb_pad returns an error the skb was freed */ /* if skb_pad returns an error the skb was freed */
if (unlikely(skb->len < 60)) { if (unlikely(skb->len < 60)) {
int pad_len = 60 - skb->len; int pad_len = 60 - skb->len;
...@@ -1775,7 +1781,7 @@ static bool ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector, ...@@ -1775,7 +1781,7 @@ static bool ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
#ifdef IXGBE_FCOE #ifdef IXGBE_FCOE
/* if ddp, not passing to ULD unless for FCP_RSP or error */ /* if ddp, not passing to ULD unless for FCP_RSP or error */
if (ixgbe_rx_is_fcoe(adapter, rx_desc)) { if (ixgbe_rx_is_fcoe(rx_ring, rx_desc)) {
ddp_bytes = ixgbe_fcoe_ddp(adapter, rx_desc, skb); ddp_bytes = ixgbe_fcoe_ddp(adapter, rx_desc, skb);
if (!ddp_bytes) { if (!ddp_bytes) {
dev_kfree_skb_any(skb); dev_kfree_skb_any(skb);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment