sky2/skge bug fix patches for 2.6.22
Subsystems (2)
cover sky2/skge bug fix patches for 2.6.22
These are all bug fixes for 2.6.22. I'll spin a set for the 2.6.21 stable kernel after that.
--
Stephen Hemminger <[email protected]>
PATCH 1/4 sky2: fix oops on shutdown
If the device is fails during module startup for some reason like unsupported chip version then the driver would crash dereferencing a null pointer, on shutdown or suspend/resume.
--- drivers/net/sky2.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
drivers/net/sky2.c +10 -0
@@ -3732,6 +3732,7 @@ err_out_free_regions: err_out_disable:pci_disable_device (pdev); err_out: +pci_set_drvdata (pdev,NULL );return err; }
@@ -3784,6 +3785,9 @@ static int sky2_suspend(struct pci_dev *struct sky2_hw *hw =pci_get_drvdata (pdev);int i, wol =0 ; +if (!hw) +return 0 ; +del_timer_sync (&hw->idle_timer);netif_poll_disable (hw->dev[0 ]);
@@ -3815,6 +3819,9 @@ static int sky2_resume(struct pci_dev *pstruct sky2_hw *hw =pci_get_drvdata (pdev);int i, err; +if (!hw) +return 0 ; + err =pci_set_power_state (pdev,PCI_D0 );if (err) goto out;
@@ -3861,6 +3868,9 @@ static void sky2_shutdown(struct pci_devstruct sky2_hw *hw =pci_get_drvdata (pdev);int i, wol =0 ; +if (!hw) +return ; +del_timer_sync (&hw->idle_timer);netif_poll_disable (hw->dev[0 ]);
--
Stephen Hemminger <[email protected]>
Re: [PATCH 1/4] sky2: fix oops on shutdown
Quoted 9 lines · Stephen Hemminger
If the device is fails during module startup for some reason like unsupported chip version then the driver would crash dereferencing a null pointer, on shutdown or suspend/resume.
Signed-off-by Stephen Hemminger <[email protected]>--- drivers/net/sky2.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
applied 1-4
PATCH 2/4 skge: crash on shutdown/suspend
In reply to Stephen HemmingerIf device is not fails during module startup (like unsupported chip version) then driver would crash dereferencing a null pointer, on shutdown or suspend/resume.
--- drivers/net/skge.c | 9 +++++++++ 1 file changed, 9 insertions(+)
drivers/net/skge.c +9 -0
@@ -3802,6 +3802,9 @@ static int skge_suspend(struct pci_dev *struct skge_hw *hw =pci_get_drvdata (pdev);int i, err, wol =0 ; +if (!hw) +return 0 ; + err =pci_save_state (pdev);if (err)return err;
@@ -3830,6 +3833,9 @@ static int skge_resume(struct pci_dev *pstruct skge_hw *hw =pci_get_drvdata (pdev);int i, err; +if (!hw) +return 0 ; + err =pci_set_power_state (pdev,PCI_D0 );if (err) goto out;
@@ -3868,6 +3874,9 @@ static void skge_shutdown(struct pci_devstruct skge_hw *hw =pci_get_drvdata (pdev);int i, wol =0 ; +if (!hw) +return ; +for (i =0 ; i < hw->ports; i++) {struct net_device *dev = hw->dev[i];struct skge_port *skge =netdev_priv (dev);
--
Stephen Hemminger <[email protected]>
PATCH 3/4 sky2: 88e8071 support not ready
In reply to Stephen HemmingerThe driver is not ready to support 88e8071 chip. If this chip is present, system will hang on boot.
So remove it from PCI device id's for now.
--- drivers/net/sky2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/sky2.c +1 -1
@@ -130,7 +130,7 @@ static const struct pci_device_id sky2_i { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4368) }, /* 88EC034 */ { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4369) }, /* 88EC042 */ { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x436A) }, /* 88E8058 */ - { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x436B) }, /* 88E8071 */ +// { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x436B) }, /* 88E8071 */ { 0 } };
--
Stephen Hemminger <[email protected]>
PATCH 4/4 sky2: only disable 88e8056 on some boards
In reply to Stephen HemmingerUse DMI to add a blacklist of broken boards (so far only one). Hopefully, the problems will be solved later, and the the whole blacklist can disappear.
--- drivers/net/sky2.c | 41 ++++++++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 11 deletions(-)
drivers/net/sky2.c +30 -11
@@ -40,6 +40,7 @@#include <linux/if_vlan.h> #include <linux/prefetch.h> #include <linux/mii.h> +#include <linux/dmi.h> #include <asm/irq.h>
@@ -150,6 +151,8 @@ static const char *yukon2_name[] = { "FE", /* 0xb7 */ }; +static int dmi_blacklisted; +/* Access to external PHY */ 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 skreturn -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->ports =1 ; t8 =sky2_read8 (hw,B2_Y2_HW_RES );
@@ -3578,17 +3592,6 @@ static int __devinit sky2_probe(struct p 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 );if (err) {dev_err (&pdev->dev,"cannot obtain PCI resources\n" );
@@ -3907,8 +3910,24 @@ static struct pci_driver sky2_driver = { .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 ) { +/* Look for sick motherboards */ +if (dmi_check_system (broken_dmi_table)) + dmi_blacklisted =1 ; +return pci_register_driver (&sky2_driver); }
--
Stephen Hemminger <[email protected]>