--- linux-2.4.7-ac3/drivers/net/eepro100.c-ac3-orig Tue Jul 31 11:20:56 2001 +++ linux-2.4.7-ac3/drivers/net/eepro100.c Wed Aug 1 10:54:12 2001 @@ -55,6 +55,9 @@ /* Maximum number of multicast addresses to filter (vs. rx-all-multicast) */ static int multicast_filter_limit = 64; +/* Defines apm power saving mode. Set to 0 for some flaky adapters. MKN */ +static int apm_sleep = 2; + /* 'options' is used to pass a transceiver override or full-duplex flag e.g. "options=16" for FD, "options=32" for 100mbps-only. */ static int full_duplex[] = {-1, -1, -1, -1, -1, -1, -1, -1}; @@ -125,6 +128,7 @@ MODULE_PARM(rx_copybreak, "i"); MODULE_PARM(max_interrupt_work, "i"); MODULE_PARM(multicast_filter_limit, "i"); +MODULE_PARM(apm_sleep, "i"); MODULE_PARM_DESC(debug, "eepro100 debug level (0-6)"); MODULE_PARM_DESC(options, "eepro100: Bits 0-3: tranceiver type, bit 4: full duplex, bit 5: 100Mbps"); MODULE_PARM_DESC(full_duplex, "eepro100 full duplex setting(s) (1)"); @@ -136,6 +140,7 @@ MODULE_PARM_DESC(rx_copybreak, "eepro100 copy breakpoint for copy-only-tiny-frames"); MODULE_PARM_DESC(max_interrupt_work, "eepro100 maximum events handled per interrupt"); MODULE_PARM_DESC(multicast_filter_limit, "eepro100 maximum number of filtered multicast addresses"); +MODULE_PARM_DESC(apm_sleep, "eepro100 power save mode (0-3,[2])"); #define RUN_AT(x) (jiffies + (x)) @@ -778,7 +783,14 @@ udelay(10); /* Put chip into power state D2 until we open() it. */ - pci_set_power_state(pdev, 2); + /* For some flaky adaptors use value of apm_sleep instead of D2. MKN */ + if ((apm_sleep < 0) || (apm_sleep > 3)) { + apm_sleep = 2; + printk(KERN_INFO " apm_sleep option outside range. Defaulted to 2.\n"); + } + else if (apm_sleep != 2) + printk(KERN_INFO " Nondefault apm_sleep = %d.\n",apm_sleep); + pci_set_power_state(pdev, apm_sleep); pci_set_drvdata (pdev, dev); @@ -1833,7 +1845,7 @@ if (speedo_debug > 0) printk(KERN_DEBUG "%s: %d multicast blocks dropped.\n", dev->name, i); - pci_set_power_state(sp->pdev, 2); + pci_set_power_state(sp->pdev, apm_sleep); MOD_DEC_USE_COUNT;