• Jeroen De Wachter's avatar
    encx24j600: bugfix - always move ERXTAIL to next packet in encx24j600_rx_packets · ebe5236d
    Jeroen De Wachter authored
    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: default avatarJeroen De Wachter <jeroen.de_wachter.ext@nokia.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    ebe5236d
encx24j600.c 29.4 KB