diff options
author | Roger Luethi <rl@hellgate.ch> | 2006-08-15 02:00:21 -0400 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2006-08-19 17:44:30 -0400 |
commit | b933b4d93888b584eda826bffa68a3a1283f8411 (patch) | |
tree | 3d1ac29f142f1248ec5e5aa9994545818ab0f301 /drivers/net | |
parent | 76cb4fe7c0926c2c59f4a36ab169aa2d547c93d1 (diff) |
[PATCH] via-rhine: add option avoid_D3 (work around broken BIOSes)
It looks like broken BIOSes controlling Rhine chips will remain in use in
significant numbers; such systems fail to come up via PXE after they have
been put into D3 (power-saving) mode.
This patch adds a module option for disabling the call that puts the chip
to sleep.
Signed-off-by: Roger Luethi <rl@hellgate.ch>
Cc: Jeff Garzik <jgarzik@pobox.com>
Cc: Joerg Bashir <brak@archive.org>
Cc: Tim Phipps <tim@phipps-hutton.freeserve.co.uk>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/via-rhine.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/drivers/net/via-rhine.c b/drivers/net/via-rhine.c index fda367b92a28..ae971080e2e4 100644 --- a/drivers/net/via-rhine.c +++ b/drivers/net/via-rhine.c | |||
@@ -44,6 +44,10 @@ static int max_interrupt_work = 20; | |||
44 | Setting to > 1518 effectively disables this feature. */ | 44 | Setting to > 1518 effectively disables this feature. */ |
45 | static int rx_copybreak; | 45 | static int rx_copybreak; |
46 | 46 | ||
47 | /* Work-around for broken BIOSes: they are unable to get the chip back out of | ||
48 | power state D3 so PXE booting fails. bootparam(7): via-rhine.avoid_D3=1 */ | ||
49 | static int avoid_D3; | ||
50 | |||
47 | /* | 51 | /* |
48 | * In case you are looking for 'options[]' or 'full_duplex[]', they | 52 | * In case you are looking for 'options[]' or 'full_duplex[]', they |
49 | * are gone. Use ethtool(8) instead. | 53 | * are gone. Use ethtool(8) instead. |
@@ -120,9 +124,11 @@ MODULE_LICENSE("GPL"); | |||
120 | module_param(max_interrupt_work, int, 0); | 124 | module_param(max_interrupt_work, int, 0); |
121 | module_param(debug, int, 0); | 125 | module_param(debug, int, 0); |
122 | module_param(rx_copybreak, int, 0); | 126 | module_param(rx_copybreak, int, 0); |
127 | module_param(avoid_D3, bool, 0); | ||
123 | MODULE_PARM_DESC(max_interrupt_work, "VIA Rhine maximum events handled per interrupt"); | 128 | MODULE_PARM_DESC(max_interrupt_work, "VIA Rhine maximum events handled per interrupt"); |
124 | MODULE_PARM_DESC(debug, "VIA Rhine debug level (0-7)"); | 129 | MODULE_PARM_DESC(debug, "VIA Rhine debug level (0-7)"); |
125 | MODULE_PARM_DESC(rx_copybreak, "VIA Rhine copy breakpoint for copy-only-tiny-frames"); | 130 | MODULE_PARM_DESC(rx_copybreak, "VIA Rhine copy breakpoint for copy-only-tiny-frames"); |
131 | MODULE_PARM_DESC(avoid_D3, "Avoid power state D3 (work-around for broken BIOSes)"); | ||
126 | 132 | ||
127 | /* | 133 | /* |
128 | Theory of Operation | 134 | Theory of Operation |
@@ -823,6 +829,9 @@ static int __devinit rhine_init_one(struct pci_dev *pdev, | |||
823 | } | 829 | } |
824 | } | 830 | } |
825 | rp->mii_if.phy_id = phy_id; | 831 | rp->mii_if.phy_id = phy_id; |
832 | if (debug > 1 && avoid_D3) | ||
833 | printk(KERN_INFO "%s: No D3 power state at shutdown.\n", | ||
834 | dev->name); | ||
826 | 835 | ||
827 | return 0; | 836 | return 0; |
828 | 837 | ||
@@ -1911,7 +1920,8 @@ static void rhine_shutdown (struct pci_dev *pdev) | |||
1911 | } | 1920 | } |
1912 | 1921 | ||
1913 | /* Hit power state D3 (sleep) */ | 1922 | /* Hit power state D3 (sleep) */ |
1914 | iowrite8(ioread8(ioaddr + StickyHW) | 0x03, ioaddr + StickyHW); | 1923 | if (!avoid_D3) |
1924 | iowrite8(ioread8(ioaddr + StickyHW) | 0x03, ioaddr + StickyHW); | ||
1915 | 1925 | ||
1916 | /* TODO: Check use of pci_enable_wake() */ | 1926 | /* TODO: Check use of pci_enable_wake() */ |
1917 | 1927 | ||