]> git.baikalelectronics.ru Git - kernel.git/commit
bnx2: Fix panic in bnx2_poll_work().
authorMichael Chan <mchan@broadcom.com>
Wed, 6 May 2009 23:46:47 +0000 (16:46 -0700)
committerDavid S. Miller <davem@davemloft.net>
Wed, 6 May 2009 23:46:47 +0000 (16:46 -0700)
commitabd6b70d478a2072d389677bf6472057cbdb79ee
treed2b548325aa7acc4cea2a779d4e72a21c3a1a94f
parent7303bef4a9edf2562422d5ad5c99ed95956cfe82
bnx2: Fix panic in bnx2_poll_work().

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: Michael Chan <mchan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/bnx2.c