diff options
author | Michael Chan <mchan@broadcom.com> | 2006-09-29 20:06:23 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2006-09-29 20:06:23 -0400 |
commit | f9317a40c4e09e20ef01601fc9f5de9e6acb5b96 (patch) | |
tree | 0f138aa972a892c311a11a5252723c413259a03e /drivers/net | |
parent | 95d4e6be25a68cd9fbe8c0d356b585504d8db1c7 (diff) |
[BNX2]: Disable MSI on 5706 if AMD 8132 bridge is present.
MSI is defined to be 32-bit write. The 5706 does 64-bit MSI writes
with byte enables disabled on the unused 32-bit word. This is legal
but causes problems on the AMD 8132 which will eventually stop
responding after a while.
Without this patch, the MSI test done by the driver during open will
pass, but MSI will eventually stop working after a few MSIs are
written by the device.
AMD believes this incompatibility is unique to the 5706, and
prefers to locally disable MSI rather than globally disabling it
using pci_msi_quirk.
Update version to 1.4.45.
Signed-off-by: Michael Chan <mchan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/bnx2.c | 32 |
1 files changed, 30 insertions, 2 deletions
diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c index 7fcf015021ec..6b4edb63c4c4 100644 --- a/drivers/net/bnx2.c +++ b/drivers/net/bnx2.c | |||
@@ -56,8 +56,8 @@ | |||
56 | 56 | ||
57 | #define DRV_MODULE_NAME "bnx2" | 57 | #define DRV_MODULE_NAME "bnx2" |
58 | #define PFX DRV_MODULE_NAME ": " | 58 | #define PFX DRV_MODULE_NAME ": " |
59 | #define DRV_MODULE_VERSION "1.4.44" | 59 | #define DRV_MODULE_VERSION "1.4.45" |
60 | #define DRV_MODULE_RELDATE "August 10, 2006" | 60 | #define DRV_MODULE_RELDATE "September 29, 2006" |
61 | 61 | ||
62 | #define RUN_AT(x) (jiffies + (x)) | 62 | #define RUN_AT(x) (jiffies + (x)) |
63 | 63 | ||
@@ -5805,6 +5805,34 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev) | |||
5805 | bp->cmd_ticks_int = bp->cmd_ticks; | 5805 | bp->cmd_ticks_int = bp->cmd_ticks; |
5806 | } | 5806 | } |
5807 | 5807 | ||
5808 | /* Disable MSI on 5706 if AMD 8132 bridge is found. | ||
5809 | * | ||
5810 | * MSI is defined to be 32-bit write. The 5706 does 64-bit MSI writes | ||
5811 | * with byte enables disabled on the unused 32-bit word. This is legal | ||
5812 | * but causes problems on the AMD 8132 which will eventually stop | ||
5813 | * responding after a while. | ||
5814 | * | ||
5815 | * AMD believes this incompatibility is unique to the 5706, and | ||
5816 | * prefers to locally disable MSI rather than globally disabling it | ||
5817 | * using pci_msi_quirk. | ||
5818 | */ | ||
5819 | if (CHIP_NUM(bp) == CHIP_NUM_5706 && disable_msi == 0) { | ||
5820 | struct pci_dev *amd_8132 = NULL; | ||
5821 | |||
5822 | while ((amd_8132 = pci_get_device(PCI_VENDOR_ID_AMD, | ||
5823 | PCI_DEVICE_ID_AMD_8132_BRIDGE, | ||
5824 | amd_8132))) { | ||
5825 | u8 rev; | ||
5826 | |||
5827 | pci_read_config_byte(amd_8132, PCI_REVISION_ID, &rev); | ||
5828 | if (rev >= 0x10 && rev <= 0x13) { | ||
5829 | disable_msi = 1; | ||
5830 | pci_dev_put(amd_8132); | ||
5831 | break; | ||
5832 | } | ||
5833 | } | ||
5834 | } | ||
5835 | |||
5808 | bp->autoneg = AUTONEG_SPEED | AUTONEG_FLOW_CTRL; | 5836 | bp->autoneg = AUTONEG_SPEED | AUTONEG_FLOW_CTRL; |
5809 | bp->req_line_speed = 0; | 5837 | bp->req_line_speed = 0; |
5810 | if (bp->phy_flags & PHY_SERDES_FLAG) { | 5838 | if (bp->phy_flags & PHY_SERDES_FLAG) { |