diff options
author | Jeff Garzik <jeff@garzik.org> | 2006-08-24 00:42:07 -0400 |
---|---|---|
committer | Jeff Garzik <jeff@garzik.org> | 2006-08-24 00:42:07 -0400 |
commit | 8d8b03297c96811501e3821edd4602b315458030 (patch) | |
tree | 241e690a9b7957d48b6069940871f37aa9c7df5a /drivers | |
parent | c67eebd67400c4c2ae1389317f1de0cbb3b7a1ca (diff) | |
parent | 357eb4cf75fdb9dbe46b64d50f3670de6a45dc91 (diff) |
Merge branch 'upstream-fixes' into upstream
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/3c515.c | 3 | ||||
-rw-r--r-- | drivers/net/pcmcia/xirc2ps_cs.c | 18 | ||||
-rw-r--r-- | drivers/net/pcnet32.c | 25 | ||||
-rw-r--r-- | drivers/net/wireless/hostap/hostap_hw.c | 3 | ||||
-rw-r--r-- | drivers/net/wireless/spectrum_cs.c | 2 |
5 files changed, 37 insertions, 14 deletions
diff --git a/drivers/net/3c515.c b/drivers/net/3c515.c index 4532b17e40ea..aedfddf20cb3 100644 --- a/drivers/net/3c515.c +++ b/drivers/net/3c515.c | |||
@@ -1003,7 +1003,8 @@ static int corkscrew_start_xmit(struct sk_buff *skb, | |||
1003 | /* Calculate the next Tx descriptor entry. */ | 1003 | /* Calculate the next Tx descriptor entry. */ |
1004 | int entry = vp->cur_tx % TX_RING_SIZE; | 1004 | int entry = vp->cur_tx % TX_RING_SIZE; |
1005 | struct boom_tx_desc *prev_entry; | 1005 | struct boom_tx_desc *prev_entry; |
1006 | unsigned long flags, i; | 1006 | unsigned long flags; |
1007 | int i; | ||
1007 | 1008 | ||
1008 | if (vp->tx_full) /* No room to transmit with */ | 1009 | if (vp->tx_full) /* No room to transmit with */ |
1009 | return 1; | 1010 | return 1; |
diff --git a/drivers/net/pcmcia/xirc2ps_cs.c b/drivers/net/pcmcia/xirc2ps_cs.c index 9bae77ce1314..4122bb46f5ff 100644 --- a/drivers/net/pcmcia/xirc2ps_cs.c +++ b/drivers/net/pcmcia/xirc2ps_cs.c | |||
@@ -345,6 +345,7 @@ typedef struct local_info_t { | |||
345 | void __iomem *dingo_ccr; /* only used for CEM56 cards */ | 345 | void __iomem *dingo_ccr; /* only used for CEM56 cards */ |
346 | unsigned last_ptr_value; /* last packets transmitted value */ | 346 | unsigned last_ptr_value; /* last packets transmitted value */ |
347 | const char *manf_str; | 347 | const char *manf_str; |
348 | struct work_struct tx_timeout_task; | ||
348 | } local_info_t; | 349 | } local_info_t; |
349 | 350 | ||
350 | /**************** | 351 | /**************** |
@@ -352,6 +353,7 @@ typedef struct local_info_t { | |||
352 | */ | 353 | */ |
353 | static int do_start_xmit(struct sk_buff *skb, struct net_device *dev); | 354 | static int do_start_xmit(struct sk_buff *skb, struct net_device *dev); |
354 | static void do_tx_timeout(struct net_device *dev); | 355 | static void do_tx_timeout(struct net_device *dev); |
356 | static void xirc2ps_tx_timeout_task(void *data); | ||
355 | static struct net_device_stats *do_get_stats(struct net_device *dev); | 357 | static struct net_device_stats *do_get_stats(struct net_device *dev); |
356 | static void set_addresses(struct net_device *dev); | 358 | static void set_addresses(struct net_device *dev); |
357 | static void set_multicast_list(struct net_device *dev); | 359 | static void set_multicast_list(struct net_device *dev); |
@@ -589,6 +591,7 @@ xirc2ps_probe(struct pcmcia_device *link) | |||
589 | #ifdef HAVE_TX_TIMEOUT | 591 | #ifdef HAVE_TX_TIMEOUT |
590 | dev->tx_timeout = do_tx_timeout; | 592 | dev->tx_timeout = do_tx_timeout; |
591 | dev->watchdog_timeo = TX_TIMEOUT; | 593 | dev->watchdog_timeo = TX_TIMEOUT; |
594 | INIT_WORK(&local->tx_timeout_task, xirc2ps_tx_timeout_task, dev); | ||
592 | #endif | 595 | #endif |
593 | 596 | ||
594 | return xirc2ps_config(link); | 597 | return xirc2ps_config(link); |
@@ -1341,17 +1344,24 @@ xirc2ps_interrupt(int irq, void *dev_id, struct pt_regs *regs) | |||
1341 | /*====================================================================*/ | 1344 | /*====================================================================*/ |
1342 | 1345 | ||
1343 | static void | 1346 | static void |
1344 | do_tx_timeout(struct net_device *dev) | 1347 | xirc2ps_tx_timeout_task(void *data) |
1345 | { | 1348 | { |
1346 | local_info_t *lp = netdev_priv(dev); | 1349 | struct net_device *dev = data; |
1347 | printk(KERN_NOTICE "%s: transmit timed out\n", dev->name); | ||
1348 | lp->stats.tx_errors++; | ||
1349 | /* reset the card */ | 1350 | /* reset the card */ |
1350 | do_reset(dev,1); | 1351 | do_reset(dev,1); |
1351 | dev->trans_start = jiffies; | 1352 | dev->trans_start = jiffies; |
1352 | netif_wake_queue(dev); | 1353 | netif_wake_queue(dev); |
1353 | } | 1354 | } |
1354 | 1355 | ||
1356 | static void | ||
1357 | do_tx_timeout(struct net_device *dev) | ||
1358 | { | ||
1359 | local_info_t *lp = netdev_priv(dev); | ||
1360 | lp->stats.tx_errors++; | ||
1361 | printk(KERN_NOTICE "%s: transmit timed out\n", dev->name); | ||
1362 | schedule_work(&lp->tx_timeout_task); | ||
1363 | } | ||
1364 | |||
1355 | static int | 1365 | static int |
1356 | do_start_xmit(struct sk_buff *skb, struct net_device *dev) | 1366 | do_start_xmit(struct sk_buff *skb, struct net_device *dev) |
1357 | { | 1367 | { |
diff --git a/drivers/net/pcnet32.c b/drivers/net/pcnet32.c index ba6065768eb2..5e26fe806e21 100644 --- a/drivers/net/pcnet32.c +++ b/drivers/net/pcnet32.c | |||
@@ -202,6 +202,8 @@ static int homepna[MAX_UNITS]; | |||
202 | #define CSR15 15 | 202 | #define CSR15 15 |
203 | #define PCNET32_MC_FILTER 8 | 203 | #define PCNET32_MC_FILTER 8 |
204 | 204 | ||
205 | #define PCNET32_79C970A 0x2621 | ||
206 | |||
205 | /* The PCNET32 Rx and Tx ring descriptors. */ | 207 | /* The PCNET32 Rx and Tx ring descriptors. */ |
206 | struct pcnet32_rx_head { | 208 | struct pcnet32_rx_head { |
207 | u32 base; | 209 | u32 base; |
@@ -289,6 +291,7 @@ struct pcnet32_private { | |||
289 | 291 | ||
290 | /* each bit indicates an available PHY */ | 292 | /* each bit indicates an available PHY */ |
291 | u32 phymask; | 293 | u32 phymask; |
294 | unsigned short chip_version; /* which variant this is */ | ||
292 | }; | 295 | }; |
293 | 296 | ||
294 | static int pcnet32_probe_pci(struct pci_dev *, const struct pci_device_id *); | 297 | static int pcnet32_probe_pci(struct pci_dev *, const struct pci_device_id *); |
@@ -724,9 +727,11 @@ static u32 pcnet32_get_link(struct net_device *dev) | |||
724 | spin_lock_irqsave(&lp->lock, flags); | 727 | spin_lock_irqsave(&lp->lock, flags); |
725 | if (lp->mii) { | 728 | if (lp->mii) { |
726 | r = mii_link_ok(&lp->mii_if); | 729 | r = mii_link_ok(&lp->mii_if); |
727 | } else { | 730 | } else if (lp->chip_version >= PCNET32_79C970A) { |
728 | ulong ioaddr = dev->base_addr; /* card base I/O address */ | 731 | ulong ioaddr = dev->base_addr; /* card base I/O address */ |
729 | r = (lp->a.read_bcr(ioaddr, 4) != 0xc0); | 732 | r = (lp->a.read_bcr(ioaddr, 4) != 0xc0); |
733 | } else { /* can not detect link on really old chips */ | ||
734 | r = 1; | ||
730 | } | 735 | } |
731 | spin_unlock_irqrestore(&lp->lock, flags); | 736 | spin_unlock_irqrestore(&lp->lock, flags); |
732 | 737 | ||
@@ -1091,6 +1096,10 @@ static int pcnet32_suspend(struct net_device *dev, unsigned long *flags, | |||
1091 | ulong ioaddr = dev->base_addr; | 1096 | ulong ioaddr = dev->base_addr; |
1092 | int ticks; | 1097 | int ticks; |
1093 | 1098 | ||
1099 | /* really old chips have to be stopped. */ | ||
1100 | if (lp->chip_version < PCNET32_79C970A) | ||
1101 | return 0; | ||
1102 | |||
1094 | /* set SUSPEND (SPND) - CSR5 bit 0 */ | 1103 | /* set SUSPEND (SPND) - CSR5 bit 0 */ |
1095 | csr5 = a->read_csr(ioaddr, CSR5); | 1104 | csr5 = a->read_csr(ioaddr, CSR5); |
1096 | a->write_csr(ioaddr, CSR5, csr5 | CSR5_SUSPEND); | 1105 | a->write_csr(ioaddr, CSR5, csr5 | CSR5_SUSPEND); |
@@ -1529,6 +1538,7 @@ pcnet32_probe1(unsigned long ioaddr, int shared, struct pci_dev *pdev) | |||
1529 | lp->mii_if.reg_num_mask = 0x1f; | 1538 | lp->mii_if.reg_num_mask = 0x1f; |
1530 | lp->dxsuflo = dxsuflo; | 1539 | lp->dxsuflo = dxsuflo; |
1531 | lp->mii = mii; | 1540 | lp->mii = mii; |
1541 | lp->chip_version = chip_version; | ||
1532 | lp->msg_enable = pcnet32_debug; | 1542 | lp->msg_enable = pcnet32_debug; |
1533 | if ((cards_found >= MAX_UNITS) | 1543 | if ((cards_found >= MAX_UNITS) |
1534 | || (options[cards_found] > sizeof(options_mapping))) | 1544 | || (options[cards_found] > sizeof(options_mapping))) |
@@ -1839,10 +1849,7 @@ static int pcnet32_open(struct net_device *dev) | |||
1839 | val |= 2; | 1849 | val |= 2; |
1840 | } else if (lp->options & PCNET32_PORT_ASEL) { | 1850 | } else if (lp->options & PCNET32_PORT_ASEL) { |
1841 | /* workaround of xSeries250, turn on for 79C975 only */ | 1851 | /* workaround of xSeries250, turn on for 79C975 only */ |
1842 | i = ((lp->a.read_csr(ioaddr, 88) | | 1852 | if (lp->chip_version == 0x2627) |
1843 | (lp->a. | ||
1844 | read_csr(ioaddr, 89) << 16)) >> 12) & 0xffff; | ||
1845 | if (i == 0x2627) | ||
1846 | val |= 3; | 1853 | val |= 3; |
1847 | } | 1854 | } |
1848 | lp->a.write_bcr(ioaddr, 9, val); | 1855 | lp->a.write_bcr(ioaddr, 9, val); |
@@ -1986,9 +1993,11 @@ static int pcnet32_open(struct net_device *dev) | |||
1986 | 1993 | ||
1987 | netif_start_queue(dev); | 1994 | netif_start_queue(dev); |
1988 | 1995 | ||
1989 | /* Print the link status and start the watchdog */ | 1996 | if (lp->chip_version >= PCNET32_79C970A) { |
1990 | pcnet32_check_media(dev, 1); | 1997 | /* Print the link status and start the watchdog */ |
1991 | mod_timer(&(lp->watchdog_timer), PCNET32_WATCHDOG_TIMEOUT); | 1998 | pcnet32_check_media(dev, 1); |
1999 | mod_timer(&(lp->watchdog_timer), PCNET32_WATCHDOG_TIMEOUT); | ||
2000 | } | ||
1992 | 2001 | ||
1993 | i = 0; | 2002 | i = 0; |
1994 | while (i++ < 100) | 2003 | while (i++ < 100) |
diff --git a/drivers/net/wireless/hostap/hostap_hw.c b/drivers/net/wireless/hostap/hostap_hw.c index dafaa5ff5aa6..d500012fdc7a 100644 --- a/drivers/net/wireless/hostap/hostap_hw.c +++ b/drivers/net/wireless/hostap/hostap_hw.c | |||
@@ -1042,6 +1042,9 @@ static int prism2_reset_port(struct net_device *dev) | |||
1042 | dev->name, local->fragm_threshold); | 1042 | dev->name, local->fragm_threshold); |
1043 | } | 1043 | } |
1044 | 1044 | ||
1045 | /* Some firmwares lose antenna selection settings on reset */ | ||
1046 | (void) hostap_set_antsel(local); | ||
1047 | |||
1045 | return res; | 1048 | return res; |
1046 | } | 1049 | } |
1047 | 1050 | ||
diff --git a/drivers/net/wireless/spectrum_cs.c b/drivers/net/wireless/spectrum_cs.c index 7f78b7801fb3..bcc7038130f6 100644 --- a/drivers/net/wireless/spectrum_cs.c +++ b/drivers/net/wireless/spectrum_cs.c | |||
@@ -242,7 +242,7 @@ spectrum_reset(struct pcmcia_device *link, int idle) | |||
242 | u_int save_cor; | 242 | u_int save_cor; |
243 | 243 | ||
244 | /* Doing it if hardware is gone is guaranteed crash */ | 244 | /* Doing it if hardware is gone is guaranteed crash */ |
245 | if (pcmcia_dev_present(link)) | 245 | if (!pcmcia_dev_present(link)) |
246 | return -ENODEV; | 246 | return -ENODEV; |
247 | 247 | ||
248 | /* Save original COR value */ | 248 | /* Save original COR value */ |