Skip to content

Commit ebe5236

Browse files
Jeroen De Wachterdavem330
authored andcommitted
encx24j600: bugfix - always move ERXTAIL to next packet in encx24j600_rx_packets
Before, encx24j600_rx_packets did not update encx24j600_priv's next_packet member when an error occurred during packet handling (either because the packet's RSV header indicates an error or because the encx24j600_receive_packet method can't allocate an sk_buff). If the next_packet member is not updated, the ERXTAIL register will be set to the same value it had before, which means the bad packet remains in the component's memory and its RSV header will be read again when a new packet arrives. If the RSV header indicates a bad packet or if sk_buff allocation continues to fail, new packets will be stored in the component's memory until that memory is full, after which packets will be dropped. The SETPKTDEC command is always executed though, so the encx24j600 hardware has an incorrect count of the packets in its memory. To prevent this, the next_packet member should always be updated, allowing the packet to be skipped (either because it's bad, as indicated in its RSV header, or because allocating an sk_buff failed). In the allocation failure case, this does mean dropping a valid packet, but dropping the oldest packet to keep as much memory as possible available for new packets seems preferable to keeping old (but valid) packets around while dropping new ones. Signed-off-by: Jeroen De Wachter <jeroen.de_wachter.ext@nokia.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent ea7a2b9 commit ebe5236

File tree

1 file changed

+2
-1
lines changed

1 file changed

+2
-1
lines changed

drivers/net/ethernet/microchip/encx24j600.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -346,7 +346,6 @@ static int encx24j600_receive_packet(struct encx24j600_priv *priv,
346346
/* Maintain stats */
347347
dev->stats.rx_packets++;
348348
dev->stats.rx_bytes += rsv->len;
349-
priv->next_packet = rsv->next_packet;
350349

351350
netif_rx(skb);
352351

@@ -383,6 +382,8 @@ static void encx24j600_rx_packets(struct encx24j600_priv *priv, u8 packet_count)
383382
encx24j600_receive_packet(priv, &rsv);
384383
}
385384

385+
priv->next_packet = rsv.next_packet;
386+
386387
newrxtail = priv->next_packet - 2;
387388
if (newrxtail == ENC_RX_BUF_START)
388389
newrxtail = SRAM_SIZE - 2;

0 commit comments

Comments
 (0)