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 | |
| 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>
| -rw-r--r-- | drivers/net/bnx2.c | 32 | ||||
| -rw-r--r-- | include/linux/pci_ids.h | 1 |
2 files changed, 31 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) { |
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h index b7e85ff045ea..c9ffbc3843d5 100644 --- a/include/linux/pci_ids.h +++ b/include/linux/pci_ids.h | |||
| @@ -507,6 +507,7 @@ | |||
| 507 | #define PCI_DEVICE_ID_AMD_8151_0 0x7454 | 507 | #define PCI_DEVICE_ID_AMD_8151_0 0x7454 |
| 508 | #define PCI_DEVICE_ID_AMD_8131_BRIDGE 0x7450 | 508 | #define PCI_DEVICE_ID_AMD_8131_BRIDGE 0x7450 |
| 509 | #define PCI_DEVICE_ID_AMD_8131_APIC 0x7451 | 509 | #define PCI_DEVICE_ID_AMD_8131_APIC 0x7451 |
| 510 | #define PCI_DEVICE_ID_AMD_8132_BRIDGE 0x7458 | ||
| 510 | #define PCI_DEVICE_ID_AMD_CS5536_ISA 0x2090 | 511 | #define PCI_DEVICE_ID_AMD_CS5536_ISA 0x2090 |
| 511 | #define PCI_DEVICE_ID_AMD_CS5536_FLASH 0x2091 | 512 | #define PCI_DEVICE_ID_AMD_CS5536_FLASH 0x2091 |
| 512 | #define PCI_DEVICE_ID_AMD_CS5536_AUDIO 0x2093 | 513 | #define PCI_DEVICE_ID_AMD_CS5536_AUDIO 0x2093 |
