|
@@ -1785,7 +1785,8 @@ static bool ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
|
|
|
unsigned int total_rx_bytes = 0, total_rx_packets = 0;
|
|
|
#ifdef IXGBE_FCOE
|
|
|
struct ixgbe_adapter *adapter = q_vector->adapter;
|
|
|
- int ddp_bytes = 0;
|
|
|
+ int ddp_bytes;
|
|
|
+ unsigned int mss = 0;
|
|
|
#endif /* IXGBE_FCOE */
|
|
|
u16 cleaned_count = ixgbe_desc_unused(rx_ring);
|
|
|
|
|
@@ -1839,6 +1840,20 @@ static bool ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
|
|
|
/* if ddp, not passing to ULD unless for FCP_RSP or error */
|
|
|
if (ixgbe_rx_is_fcoe(rx_ring, rx_desc)) {
|
|
|
ddp_bytes = ixgbe_fcoe_ddp(adapter, rx_desc, skb);
|
|
|
+ /* include DDPed FCoE data */
|
|
|
+ if (ddp_bytes > 0) {
|
|
|
+ if (!mss) {
|
|
|
+ mss = rx_ring->netdev->mtu -
|
|
|
+ sizeof(struct fcoe_hdr) -
|
|
|
+ sizeof(struct fc_frame_header) -
|
|
|
+ sizeof(struct fcoe_crc_eof);
|
|
|
+ if (mss > 512)
|
|
|
+ mss &= ~511;
|
|
|
+ }
|
|
|
+ total_rx_bytes += ddp_bytes;
|
|
|
+ total_rx_packets += DIV_ROUND_UP(ddp_bytes,
|
|
|
+ mss);
|
|
|
+ }
|
|
|
if (!ddp_bytes) {
|
|
|
dev_kfree_skb_any(skb);
|
|
|
continue;
|
|
@@ -1852,21 +1867,6 @@ static bool ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
|
|
|
budget--;
|
|
|
} while (likely(budget));
|
|
|
|
|
|
-#ifdef IXGBE_FCOE
|
|
|
- /* include DDPed FCoE data */
|
|
|
- if (ddp_bytes > 0) {
|
|
|
- unsigned int mss;
|
|
|
-
|
|
|
- mss = rx_ring->netdev->mtu - sizeof(struct fcoe_hdr) -
|
|
|
- sizeof(struct fc_frame_header) -
|
|
|
- sizeof(struct fcoe_crc_eof);
|
|
|
- if (mss > 512)
|
|
|
- mss &= ~511;
|
|
|
- total_rx_bytes += ddp_bytes;
|
|
|
- total_rx_packets += DIV_ROUND_UP(ddp_bytes, mss);
|
|
|
- }
|
|
|
-
|
|
|
-#endif /* IXGBE_FCOE */
|
|
|
u64_stats_update_begin(&rx_ring->syncp);
|
|
|
rx_ring->stats.packets += total_rx_packets;
|
|
|
rx_ring->stats.bytes += total_rx_bytes;
|