|
@@ -40,6 +40,7 @@
|
|
#include <linux/if_vlan.h>
|
|
#include <linux/if_vlan.h>
|
|
#include <linux/prefetch.h>
|
|
#include <linux/prefetch.h>
|
|
#include <linux/mii.h>
|
|
#include <linux/mii.h>
|
|
|
|
+#include <linux/dmi.h>
|
|
|
|
|
|
#include <asm/irq.h>
|
|
#include <asm/irq.h>
|
|
|
|
|
|
@@ -150,6 +151,8 @@ static const char *yukon2_name[] = {
|
|
"FE", /* 0xb7 */
|
|
"FE", /* 0xb7 */
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+static int dmi_blacklisted;
|
|
|
|
+
|
|
/* Access to external PHY */
|
|
/* Access to external PHY */
|
|
static int gm_phy_write(struct sky2_hw *hw, unsigned port, u16 reg, u16 val)
|
|
static int gm_phy_write(struct sky2_hw *hw, unsigned port, u16 reg, u16 val)
|
|
{
|
|
{
|
|
@@ -2531,6 +2534,17 @@ static int __devinit sky2_init(struct sky2_hw *hw)
|
|
return -EOPNOTSUPP;
|
|
return -EOPNOTSUPP;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+
|
|
|
|
+ /* Some Gigabyte motherboards have 88e8056 but cause problems
|
|
|
|
+ * There is some unresolved hardware related problem that causes
|
|
|
|
+ * descriptor errors and receive data corruption.
|
|
|
|
+ */
|
|
|
|
+ if (hw->chip_id == CHIP_ID_YUKON_EC_U && dmi_blacklisted) {
|
|
|
|
+ dev_err(&hw->pdev->dev,
|
|
|
|
+ "88E8056 on this motherboard not supported\n");
|
|
|
|
+ return -EOPNOTSUPP;
|
|
|
|
+ }
|
|
|
|
+
|
|
hw->pmd_type = sky2_read8(hw, B2_PMD_TYP);
|
|
hw->pmd_type = sky2_read8(hw, B2_PMD_TYP);
|
|
hw->ports = 1;
|
|
hw->ports = 1;
|
|
t8 = sky2_read8(hw, B2_Y2_HW_RES);
|
|
t8 = sky2_read8(hw, B2_Y2_HW_RES);
|
|
@@ -3578,17 +3592,6 @@ static int __devinit sky2_probe(struct pci_dev *pdev,
|
|
goto err_out;
|
|
goto err_out;
|
|
}
|
|
}
|
|
|
|
|
|
- /* Some Gigabyte motherboards have 88e8056 but cause problems
|
|
|
|
- * There is some unresolved hardware related problem that causes
|
|
|
|
- * descriptor errors and receive data corruption.
|
|
|
|
- */
|
|
|
|
- if (pdev->vendor == PCI_VENDOR_ID_MARVELL &&
|
|
|
|
- pdev->device == 0x4364 && pdev->subsystem_vendor == 0x1458) {
|
|
|
|
- dev_err(&pdev->dev,
|
|
|
|
- "88E8056 on Gigabyte motherboards not supported\n");
|
|
|
|
- goto err_out_disable;
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
err = pci_request_regions(pdev, DRV_NAME);
|
|
err = pci_request_regions(pdev, DRV_NAME);
|
|
if (err) {
|
|
if (err) {
|
|
dev_err(&pdev->dev, "cannot obtain PCI resources\n");
|
|
dev_err(&pdev->dev, "cannot obtain PCI resources\n");
|
|
@@ -3907,8 +3910,24 @@ static struct pci_driver sky2_driver = {
|
|
.shutdown = sky2_shutdown,
|
|
.shutdown = sky2_shutdown,
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+static struct dmi_system_id __initdata broken_dmi_table[] = {
|
|
|
|
+ {
|
|
|
|
+ .ident = "Gigabyte 965P-S3",
|
|
|
|
+ .matches = {
|
|
|
|
+ DMI_MATCH(DMI_SYS_VENDOR, "Gigabyte Technology Co., Ltd."),
|
|
|
|
+ DMI_MATCH(DMI_PRODUCT_NAME, "965P-S3"),
|
|
|
|
+
|
|
|
|
+ },
|
|
|
|
+ },
|
|
|
|
+ { }
|
|
|
|
+};
|
|
|
|
+
|
|
static int __init sky2_init_module(void)
|
|
static int __init sky2_init_module(void)
|
|
{
|
|
{
|
|
|
|
+ /* Look for sick motherboards */
|
|
|
|
+ if (dmi_check_system(broken_dmi_table))
|
|
|
|
+ dmi_blacklisted = 1;
|
|
|
|
+
|
|
return pci_register_driver(&sky2_driver);
|
|
return pci_register_driver(&sky2_driver);
|
|
}
|
|
}
|
|
|
|
|