diff options
| -rw-r--r-- | drivers/net/8139too.c | 3 | ||||
| -rw-r--r-- | drivers/net/e100/e100_config.c | 8 | ||||
| -rw-r--r-- | drivers/net/e100/e100_main.c | 32 | ||||
| -rw-r--r-- | drivers/net/e100/e100_phy.c | 14 | ||||
| -rw-r--r-- | drivers/net/sis900.c | 75 |
5 files changed, 98 insertions, 34 deletions
diff --git a/drivers/net/8139too.c b/drivers/net/8139too.c index fc1646e93636..9fd93760735d 100644 --- a/drivers/net/8139too.c +++ b/drivers/net/8139too.c @@ -2475,10 +2475,11 @@ static int rtl8139_suspend (struct pci_dev *pdev, u32 state) tp->stats.rx_missed_errors += RTL_R32 (RxMissed); RTL_W32 (RxMissed, 0); + spin_unlock_irqrestore (&tp->lock, flags); + pci_set_power_state (pdev, 3); pci_save_state (pdev, tp->pci_state); - spin_unlock_irqrestore (&tp->lock, flags); return 0; } diff --git a/drivers/net/e100/e100_config.c b/drivers/net/e100/e100_config.c index 1ffaecd952a7..ac590983653f 100644 --- a/drivers/net/e100/e100_config.c +++ b/drivers/net/e100/e100_config.c @@ -60,7 +60,7 @@ static const u8 def_config[] = { * All other init functions will only set values that are * different from the 82557 default. */ -void __devinit +void e100_config_init_82557(struct e100_private *bdp) { /* initialize config block */ @@ -104,7 +104,7 @@ e100_config_init_82557(struct e100_private *bdp) e100_config_mulcast_enbl(bdp, false); } -static void __devinit +static void e100_config_init_82558(struct e100_private *bdp) { /* MWI enable. This should be turned on only if the adapter is a 82558/9 @@ -136,7 +136,7 @@ e100_config_init_82558(struct e100_private *bdp) e100_config_long_rx(bdp, true); } -static void __devinit +static void e100_config_init_82550(struct e100_private *bdp) { /* The D102 chip allows for 32 config bytes. This value is @@ -160,7 +160,7 @@ e100_config_init_82550(struct e100_private *bdp) } /* Initialize the adapter's configure block */ -void __devinit +void e100_config_init(struct e100_private *bdp) { e100_config_init_82557(bdp); diff --git a/drivers/net/e100/e100_main.c b/drivers/net/e100/e100_main.c index 1fe65402dab2..371f6ff7292b 100644 --- a/drivers/net/e100/e100_main.c +++ b/drivers/net/e100/e100_main.c @@ -124,7 +124,7 @@ static void e100_free_nontx_list(struct e100_private *); static void e100_non_tx_background(unsigned long); static inline void e100_tx_skb_free(struct e100_private *bdp, tcb_t *tcb); /* Global Data structures and variables */ -char e100_copyright[] __devinitdata = "Copyright (c) 2003 Intel Corporation"; +char e100_copyright[] = "Copyright (c) 2003 Intel Corporation"; char e100_driver_version[]="2.3.30-k1"; const char *e100_full_driver_name = "Intel(R) PRO/100 Network Driver"; char e100_short_driver_name[] = "e100"; @@ -539,7 +539,7 @@ e100_trigger_SWI(struct e100_private *bdp) readw(&(bdp->scb->scb_status)); /* flushes last write, read-safe */ } -static int __devinit +static int e100_found1(struct pci_dev *pcid, const struct pci_device_id *ent) { static int first_time = true; @@ -823,7 +823,7 @@ module_exit(e100_cleanup_module); * * This routine does range checking on command-line options */ -void __devinit +void e100_check_options(int board, struct e100_private *bdp) { if (board >= E100_MAX_NIC) { @@ -894,7 +894,7 @@ e100_check_options(int board, struct e100_private *bdp) * If the option's value is '-1' use the specified default. * Otherwise, if the value is invalid, change it to the default. */ -void __devinit +void e100_set_int_option(int *option, int val, int min, int max, int default_val, char *name) { @@ -928,7 +928,7 @@ e100_set_int_option(int *option, int val, int min, int max, int default_val, * Otherwise, if the value is invalid (not 0 or 1), * change it to the default. */ -void __devinit +void e100_set_bool_option(struct e100_private *bdp, int val, u32 mask, int default_val, char *name) { @@ -1241,7 +1241,7 @@ e100_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) * true: if successful * false: otherwise */ -static unsigned char __devinit +static unsigned char e100_init(struct e100_private *bdp) { u32 st_timeout = 0; @@ -1290,7 +1290,7 @@ e100_init(struct e100_private *bdp) * true: if S/W was successfully initialized * false: otherwise */ -static unsigned char __devinit +static unsigned char e100_sw_init(struct e100_private *bdp) { bdp->next_cu_cmd = START_WAIT; // init the next cu state @@ -1318,7 +1318,7 @@ e100_sw_init(struct e100_private *bdp) return 1; } -static void __devinit +static void e100_tco_workaround(struct e100_private *bdp) { int i; @@ -1519,7 +1519,7 @@ e100_setup_tcb_pool(tcb_t *head, unsigned int qlen, struct e100_private *bdp) * 0: if the operation was successful * %-ENOMEM: if memory allocation failed */ -unsigned char __devinit +unsigned char e100_alloc_space(struct e100_private *bdp) { unsigned long off; @@ -2508,7 +2508,7 @@ e100_cmd_complete_location(struct e100_private *bdp) * true: if successfully cleared stat counters * false: otherwise */ -static unsigned char __devinit +static unsigned char e100_clr_cntrs(struct e100_private *bdp) { volatile u32 *pcmd_complete; @@ -2873,7 +2873,7 @@ e100_load_microcode(struct e100_private *bdp) /***************************************************************************/ /* Read PWA (printed wired assembly) number */ -void __devinit +void e100_rd_pwa_no(struct e100_private *bdp) { bdp->pwa_no = e100_eeprom_read(bdp, EEPROM_PWA_NO); @@ -2882,7 +2882,7 @@ e100_rd_pwa_no(struct e100_private *bdp) } /* Read the permanent ethernet address from the eprom. */ -void __devinit +void e100_rd_eaddr(struct e100_private *bdp) { int i; @@ -2947,7 +2947,7 @@ e100_D101M_checksum(struct e100_private *bdp, struct sk_buff *skb) /***************************************************************************/ /* Print the board's configuration */ -void __devinit +void e100_print_brd_conf(struct e100_private *bdp) { /* Print the string if checksum Offloading was enabled */ @@ -2975,7 +2975,7 @@ e100_print_brd_conf(struct e100_private *bdp) * true: if successfull * false: otherwise */ -static unsigned char __devinit +static unsigned char e100_pci_setup(struct pci_dev *pcid, struct e100_private *bdp) { struct net_device *dev = bdp->device; @@ -3754,7 +3754,7 @@ e100_ethtool_led_blink(struct net_device *dev, struct ifreq *ifr) return 0; } -static inline int __devinit +static inline int e100_10BaseT_adapter(struct e100_private *bdp) { return ((bdp->pdev->device == 0x1229) && @@ -3762,7 +3762,7 @@ e100_10BaseT_adapter(struct e100_private *bdp) (bdp->pdev->subsystem_device == 0x0003)); } -static void __devinit +static void e100_get_speed_duplex_caps(struct e100_private *bdp) { u16 status; diff --git a/drivers/net/e100/e100_phy.c b/drivers/net/e100/e100_phy.c index ad8e6a6243e4..955a361f3db8 100644 --- a/drivers/net/e100/e100_phy.c +++ b/drivers/net/e100/e100_phy.c @@ -132,7 +132,7 @@ e100_mdi_read(struct e100_private *bdp, u32 reg_addr, u32 phy_addr, u16 *data) } } -static unsigned char __devinit +static unsigned char e100_phy_valid(struct e100_private *bdp, unsigned int phy_address) { u16 ctrl_reg, stat_reg; @@ -150,7 +150,7 @@ e100_phy_valid(struct e100_private *bdp, unsigned int phy_address) return true; } -static void __devinit +static void e100_phy_address_detect(struct e100_private *bdp) { unsigned int addr; @@ -180,7 +180,7 @@ e100_phy_address_detect(struct e100_private *bdp) } } -static void __devinit +static void e100_phy_id_detect(struct e100_private *bdp) { u16 low_id_reg, high_id_reg; @@ -204,7 +204,7 @@ e100_phy_id_detect(struct e100_private *bdp) ((unsigned int) high_id_reg << 16)); } -static void __devinit +static void e100_phy_isolate(struct e100_private *bdp) { unsigned int phy_address; @@ -227,7 +227,7 @@ e100_phy_isolate(struct e100_private *bdp) } } -static unsigned char __devinit +static unsigned char e100_phy_specific_setup(struct e100_private *bdp) { u16 misc_reg; @@ -380,7 +380,7 @@ e100_phy_fix_squelch(struct e100_private *bdp) * Returns: * NOTHING */ -static void __devinit +static void e100_fix_polarity(struct e100_private *bdp) { u16 status; @@ -916,7 +916,7 @@ e100_phy_reset(struct e100_private *bdp) schedule_timeout(HZ / 2); } -unsigned char __devinit +unsigned char e100_phy_init(struct e100_private *bdp) { e100_phy_reset(bdp); diff --git a/drivers/net/sis900.c b/drivers/net/sis900.c index 7d97ba7adf55..4b9ce66491fb 100644 --- a/drivers/net/sis900.c +++ b/drivers/net/sis900.c @@ -18,10 +18,11 @@ preliminary Rev. 1.0 Jan. 18, 1998 http://www.sis.com.tw/support/databook.htm + Rev 1.08.07 Nov. 2 2003 Daniele Venzano <webvenza@libero.it> add suspend/resume support Rev 1.08.06 Sep. 24 2002 Mufasa Yang bug fix for Tx timeout & add SiS963 support - Rev 1.08.05 Jun. 6 2002 Mufasa Yang bug fix for read_eeprom & Tx descriptor over-boundary + Rev 1.08.05 Jun. 6 2002 Mufasa Yang bug fix for read_eeprom & Tx descriptor over-boundary Rev 1.08.04 Apr. 25 2002 Mufasa Yang <mufasa@sis.com.tw> added SiS962 support - Rev 1.08.03 Feb. 1 2002 Matt Domsch <Matt_Domsch@dell.com> update to use library crc32 function + Rev 1.08.03 Feb. 1 2002 Matt Domsch <Matt_Domsch@dell.com> update to use library crc32 function Rev 1.08.02 Nov. 30 2001 Hui-Fen Hsu workaround for EDB & bug fix for dhcp problem Rev 1.08.01 Aug. 25 2001 Hui-Fen Hsu update for 630ET & workaround for ICS1893 PHY Rev 1.08.00 Jun. 11 2001 Hui-Fen Hsu workaround for RTL8201 PHY and some bug fix @@ -72,7 +73,7 @@ #include "sis900.h" #define SIS900_MODULE_NAME "sis900" -#define SIS900_DRV_VERSION "v1.08.06 9/24/2002" +#define SIS900_DRV_VERSION "v1.08.07 11/02/2003" static char version[] __devinitdata = KERN_INFO "sis900.c: " SIS900_DRV_VERSION "\n"; @@ -169,6 +170,7 @@ struct sis900_private { unsigned int tx_full; /* The Tx queue is full. */ u8 host_bridge_rev; + u32 pci_state[16]; }; MODULE_AUTHOR("Jim Huang <cmhuang@sis.com.tw>, Ollie Lho <ollie@sis.com.tw>"); @@ -305,7 +307,7 @@ static int __devinit sis635_get_mac_addr(struct pci_dev * pci_dev, struct net_de *( ((u16 *)net_dev->dev_addr) + i) = inw(ioaddr + rfdr); } - /* enable packet filitering */ + /* enable packet filtering */ outl(rfcrSave | RFEN, rfcr + ioaddr); return 1; @@ -994,7 +996,7 @@ sis900_init_rxfilter (struct net_device * net_dev) } } - /* enable packet filitering */ + /* enable packet filtering */ outl(rfcrSave | RFEN, rfcr + ioaddr); } @@ -1466,7 +1468,7 @@ static void sis900_tx_timeout(struct net_device *net_dev) * @net_dev: the net device to transmit with * * Set the transmit buffer descriptor, - * and write TxENA to enable transimt state machine. + * and write TxENA to enable transmit state machine. * tell upper layer if the buffer is full */ @@ -2184,11 +2186,72 @@ static void __devexit sis900_remove(struct pci_dev *pci_dev) pci_set_drvdata(pci_dev, NULL); } +#ifdef CONFIG_PM + +static int sis900_suspend(struct pci_dev *pci_dev, u32 state) +{ + struct net_device *net_dev = pci_get_drvdata(pci_dev); + struct sis900_private *sis_priv = net_dev->priv; + long ioaddr = net_dev->base_addr; + + if(!netif_running(net_dev)) + return 0; + + netif_stop_queue(net_dev); + + /* Stop the chip's Tx and Rx Status Machine */ + outl(RxDIS | TxDIS | inl(ioaddr + cr), ioaddr + cr); + + pci_set_power_state(pci_dev, 3); + pci_save_state(pci_dev, sis_priv->pci_state); + + return 0; +} + +static int sis900_resume(struct pci_dev *pci_dev) +{ + struct net_device *net_dev = pci_get_drvdata(pci_dev); + struct sis900_private *sis_priv = net_dev->priv; + long ioaddr = net_dev->base_addr; + + if(!netif_running(net_dev)) + return 0; + pci_restore_state(pci_dev, sis_priv->pci_state); + pci_set_power_state(pci_dev, 0); + + sis900_init_rxfilter(net_dev); + + sis900_init_tx_ring(net_dev); + sis900_init_rx_ring(net_dev); + + set_rx_mode(net_dev); + + netif_device_attach(net_dev); + netif_start_queue(net_dev); + + /* Workaround for EDB */ + sis900_set_mode(ioaddr, HW_SPEED_10_MBPS, FDX_CAPABLE_HALF_SELECTED); + + /* Enable all known interrupts by setting the interrupt mask. */ + outl((RxSOVR|RxORN|RxERR|RxOK|TxURN|TxERR|TxIDLE), ioaddr + imr); + outl(RxENA | inl(ioaddr + cr), ioaddr + cr); + outl(IE, ioaddr + ier); + + sis900_check_mode(net_dev, sis_priv->mii); + + return 0; +} +#endif /* CONFIG_PM */ + static struct pci_driver sis900_pci_driver = { .name = SIS900_MODULE_NAME, .id_table = sis900_pci_tbl, .probe = sis900_probe, .remove = __devexit_p(sis900_remove), +#ifdef CONFIG_PM + .suspend = sis900_suspend, + .resume = sis900_resume, +#endif /* CONFIG_PM */ }; static int __init sis900_init_module(void) |
