Skip to content

Commit

Permalink
[PATCH] via-rhine: add option avoid_D3 (work around broken BIOSes)
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Roger Luethi authored and Jeff Garzik committed Aug 19, 2006
1 parent 76cb4fe commit b933b4d
Showing 1 changed file with 11 additions and 1 deletion.
12 changes: 11 additions & 1 deletion drivers/net/via-rhine.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,10 @@ static int max_interrupt_work = 20;
Setting to > 1518 effectively disables this feature. */
static int rx_copybreak;

/* Work-around for broken BIOSes: they are unable to get the chip back out of
power state D3 so PXE booting fails. bootparam(7): via-rhine.avoid_D3=1 */
static int avoid_D3;

/*
* In case you are looking for 'options[]' or 'full_duplex[]', they
* are gone. Use ethtool(8) instead.
Expand Down Expand Up @@ -120,9 +124,11 @@ MODULE_LICENSE("GPL");
module_param(max_interrupt_work, int, 0);
module_param(debug, int, 0);
module_param(rx_copybreak, int, 0);
module_param(avoid_D3, bool, 0);
MODULE_PARM_DESC(max_interrupt_work, "VIA Rhine maximum events handled per interrupt");
MODULE_PARM_DESC(debug, "VIA Rhine debug level (0-7)");
MODULE_PARM_DESC(rx_copybreak, "VIA Rhine copy breakpoint for copy-only-tiny-frames");
MODULE_PARM_DESC(avoid_D3, "Avoid power state D3 (work-around for broken BIOSes)");

/*
Theory of Operation
Expand Down Expand Up @@ -823,6 +829,9 @@ static int __devinit rhine_init_one(struct pci_dev *pdev,
}
}
rp->mii_if.phy_id = phy_id;
if (debug > 1 && avoid_D3)
printk(KERN_INFO "%s: No D3 power state at shutdown.\n",
dev->name);

return 0;

Expand Down Expand Up @@ -1911,7 +1920,8 @@ static void rhine_shutdown (struct pci_dev *pdev)
}

/* Hit power state D3 (sleep) */
iowrite8(ioread8(ioaddr + StickyHW) | 0x03, ioaddr + StickyHW);
if (!avoid_D3)
iowrite8(ioread8(ioaddr + StickyHW) | 0x03, ioaddr + StickyHW);

/* TODO: Check use of pci_enable_wake() */

Expand Down

0 comments on commit b933b4d

Please sign in to comment.