• Ivan Vecera's avatar
    bna: fix Rx data corruption with VLAN stripping enabled and MTU > 4096 · 6c3f5aef
    Ivan Vecera authored
    The multi-buffer Rx mode implemented in the past introduced
    a regression that causes a data corruption for received VLAN
    traffic when VLAN tag stripping is enabled. This mode is supported
    only be newer chipsets (1860) and is enabled when MTU > 4096.
    
    When this mode is enabled Rx queue contains buffers with fixed size
    2048 bytes. Any incoming packet larger than 2048 is divided into
    multiple buffers that are attached as skb frags in polling routine.
    
    The driver assumes that all buffers associated with a packet except
    the last one is fully used (e.g. packet with size 5000 are divided
    into 3 buffers 2048 + 2048 + 904 bytes) and ignores true size reported
    in completions. This assumption is usually true but not when VLAN
    packet is received and VLAN tag stripping is enabled. In this case
    the first buffer is 2044 bytes long but as the driver always assumes
    2048 bytes then 4 extra random bytes are included between the first
    and the second frag. Additionally the driver sets checksum as correct
    so the packet is properly processed by the core.
    
    The driver needs to check the size of used space in each Rx buffer
    reported by FW and not blindly use the fixed value.
    
    Cc: Rasesh Mody <rasesh.mody@qlogic.com>
    Signed-off-by: default avatarIvan Vecera <ivecera@redhat.com>
    Reviewed-by: default avatarRasesh Mody <rasesh.mody@qlogic.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    6c3f5aef
bnad.c 93.7 KB