• Michael Chan's avatar
    bnx2: Fix panic in bnx2_poll_work(). · 581daf7e
    Michael Chan authored
    Add barrier() to bnx2_get_hw_{tx|rx}_cons() to fix this issue:
    
    http://bugzilla.kernel.org/show_bug.cgi?id=12698
    
    This issue was reported by multiple i386 users.  Without barrier(),
    the compiled code looks like the following where %eax contains the
    address of the tx_cons or rx_cons in the DMA status block.  The
    status block contents can change between the cmpb and the movzwl
    instruction.  The driver would crash if the value was not 0xff during
    the cmpb instruction, but changed to 0xff during the movzwl
    instruction.
    
    6828:	80 38 ff             	cmpb   $0xff,(%eax)
    682b:	0f b7 10             	movzwl (%eax),%edx
    
    With the added barrier(), the compiled code now looks correct:
    
    683d:	0f b7 10             	movzwl (%eax),%edx
    6840:	0f b6 c2             	movzbl %dl,%eax
    6843:	3d ff 00 00 00       	cmp    $0xff,%eax
    
    Thanks to Pascal de Bruijn <pmjdebruijn@pcode.nl> for reporting the
    problem and Holger Noefer <hnoefer@pironet-ndh.com> for patiently
    testing test patches for us.
    
    Also updated version to 2.0.1.
    Signed-off-by: default avatarMichael Chan <mchan@broadcom.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    581daf7e
bnx2.c 196 KB