sky2: Flow control frames recorded as dropped packets
Subsystems (2)
PATCH 1/1 sky2: Flow control frames recorded as dropped packets
When a flow control packet is received, sky2_receive resubmits the i/o. Upon exit, sky2_status_intr counts these as dropped packets.
This fix just skips the rx_dropped accounting in this one case. It didn't seem worthwhile to change sky2_receive to deal differently.
This is my first patch submission - comments more than welcome.
drivers/net/sky2.c +2 -1
@@ -2525,7 +2517,8 @@ static int sky2_status_intr(struct sky2_hw *hw, int to_do, u16 idx) total_bytes[port] += length; skb =sky2_receive (dev, length, status);if (unlikely (!skb)) { - dev->stats.rx_dropped++; +if (!(status &GMR_FS_GOOD_FC ) ) + dev->stats.rx_dropped++;break ; }
Quoted 14 lines · On Wed, 03 Feb 2010 11:56:09 -0500 Michael Breuer <[email protected]> wrote:
When a flow control packet is received,
sky2_receiveresubmits the i/o. Upon exit,sky2_status_intrcounts these as dropped packets.This fix just skips the
rx_droppedaccounting in this one case. It didn't seem worthwhile to changesky2_receiveto deal differently.This is my first patch submission - comments more than welcome.
drivers/net/sky2.c +0
-0
drivers/net/sky2.c static int sky2_status_intr(struct sky2_hw *hw, · line 2524
Quoted 9 lines
drivers/net/sky2.c +2
-1@@ -2525,7 +2517,8 @@ static int sky2_status_intr(struct sky2_hw *hw, int to_do, u16 idx) total_bytes[port] += length; skb =sky2_receive (dev, length, status);if (unlikely (!skb)) { - dev->stats.rx_dropped++; +if (!(status &GMR_FS_GOOD_FC ) ) + dev->stats.rx_dropped++;break ; }
Since FC should be absorbed by MAC, it would be better to never receive send them up stream. I'll make a patch for that
Thanks for your patch. A more general solution would be to move the rx_dropped up into sky2_receive.
drivers/net/sky2.c +5 -3
@@ -2404,6 +2404,9 @@ okay: skb =receive_copy (sky2, re, length); else skb =receive_new (sky2, re, length); + + dev->stats.rx_dropped += (skb ==NULL ); + resubmit:sky2_rx_submit (sky2, re);
@@ -2515,11 +2518,10 @@ static int sky2_status_intr(struct sky2_case OP_RXSTAT : total_packets[port]++; total_bytes[port] += length; + skb =sky2_receive (dev, length, status); -if (unlikely (!skb)) { - dev->stats.rx_dropped++; +if (!skb)break ; - }/* This chip reports checksum status differently */ if (hw->flags &SKY2_HW_NEW_LE ) {