aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@infradead.org>2006-01-31 15:49:28 -0500
committerMauro Carvalho Chehab <mchehab@infradead.org>2006-01-31 15:49:28 -0500
commit638e174688f58200d0deb7435093435e7d737b09 (patch)
treea2cd32dbb41daf0a5d4e69eff1805fd5574c292a /drivers/net
parent8d58d773b745950ac912e028b3c81f4902fbf91d (diff)
parentd195ea4b1456192abe780fd773778cbe9f6d77ea (diff)
Merge branch 'origin'
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/Kconfig28
-rw-r--r--drivers/net/acenic.c4
-rw-r--r--drivers/net/b44.c5
-rw-r--r--drivers/net/bonding/bond_main.c2
-rw-r--r--drivers/net/mv643xx_eth.c108
-rw-r--r--drivers/net/s2io.c2
-rw-r--r--drivers/net/sungem.c55
-rw-r--r--drivers/net/wireless/hostap/Kconfig2
-rw-r--r--drivers/net/wireless/ipw2100.c49
-rw-r--r--drivers/net/wireless/ipw2200.c7
-rw-r--r--drivers/net/wireless/orinoco_cs.c4
11 files changed, 145 insertions, 121 deletions
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
index 626508afe1b1..6a6a08441804 100644
--- a/drivers/net/Kconfig
+++ b/drivers/net/Kconfig
@@ -2034,13 +2034,28 @@ config SKGE
2034 It does not support the link failover and network management 2034 It does not support the link failover and network management
2035 features that "portable" vendor supplied sk98lin driver does. 2035 features that "portable" vendor supplied sk98lin driver does.
2036 2036
2037 This driver supports adapters based on the original Yukon chipset:
2038 Marvell 88E8001, Belkin F5D5005, CNet GigaCard, DLink DGE-530T,
2039 Linksys EG1032/EG1064, 3Com 3C940/3C940B, SysKonnect SK-9871/9872.
2040
2041 It does not support the newer Yukon2 chipset: a separate driver,
2042 sky2, is provided for Yukon2-based adapters.
2043
2044 To compile this driver as a module, choose M here: the module
2045 will be called skge. This is recommended.
2037 2046
2038config SKY2 2047config SKY2
2039 tristate "SysKonnect Yukon2 support (EXPERIMENTAL)" 2048 tristate "SysKonnect Yukon2 support (EXPERIMENTAL)"
2040 depends on PCI && EXPERIMENTAL 2049 depends on PCI && EXPERIMENTAL
2041 select CRC32 2050 select CRC32
2042 ---help--- 2051 ---help---
2043 This driver support the Marvell Yukon 2 Gigabit Ethernet adapter. 2052 This driver supports Gigabit Ethernet adapters based on the the
2053 Marvell Yukon 2 chipset:
2054 Marvell 88E8021/88E8022/88E8035/88E8036/88E8038/88E8050/88E8052/
2055 88E8053/88E8055/88E8061/88E8062, SysKonnect SK-9E21D/SK-9S21
2056
2057 This driver does not support the original Yukon chipset: a seperate
2058 driver, skge, is provided for Yukon-based adapters.
2044 2059
2045 To compile this driver as a module, choose M here: the module 2060 To compile this driver as a module, choose M here: the module
2046 will be called sky2. This is recommended. 2061 will be called sky2. This is recommended.
@@ -2050,8 +2065,15 @@ config SK98LIN
2050 depends on PCI 2065 depends on PCI
2051 ---help--- 2066 ---help---
2052 Say Y here if you have a Marvell Yukon or SysKonnect SK-98xx/SK-95xx 2067 Say Y here if you have a Marvell Yukon or SysKonnect SK-98xx/SK-95xx
2053 compliant Gigabit Ethernet Adapter. The following adapters are supported 2068 compliant Gigabit Ethernet Adapter.
2054 by this driver: 2069
2070 This driver supports the original Yukon chipset. A cleaner driver is
2071 also available (skge) which seems to work better than this one.
2072
2073 This driver does not support the newer Yukon2 chipset. A seperate
2074 driver, sky2, is provided to support Yukon2-based adapters.
2075
2076 The following adapters are supported by this driver:
2055 - 3Com 3C940 Gigabit LOM Ethernet Adapter 2077 - 3Com 3C940 Gigabit LOM Ethernet Adapter
2056 - 3Com 3C941 Gigabit LOM Ethernet Adapter 2078 - 3Com 3C941 Gigabit LOM Ethernet Adapter
2057 - Allied Telesyn AT-2970LX Gigabit Ethernet Adapter 2079 - Allied Telesyn AT-2970LX Gigabit Ethernet Adapter
diff --git a/drivers/net/acenic.c b/drivers/net/acenic.c
index b8953de5664a..b508812e97ac 100644
--- a/drivers/net/acenic.c
+++ b/drivers/net/acenic.c
@@ -1002,6 +1002,8 @@ static int __devinit ace_init(struct net_device *dev)
1002 1002
1003 mac1 = 0; 1003 mac1 = 0;
1004 for(i = 0; i < 4; i++) { 1004 for(i = 0; i < 4; i++) {
1005 int tmp;
1006
1005 mac1 = mac1 << 8; 1007 mac1 = mac1 << 8;
1006 tmp = read_eeprom_byte(dev, 0x8c+i); 1008 tmp = read_eeprom_byte(dev, 0x8c+i);
1007 if (tmp < 0) { 1009 if (tmp < 0) {
@@ -1012,6 +1014,8 @@ static int __devinit ace_init(struct net_device *dev)
1012 } 1014 }
1013 mac2 = 0; 1015 mac2 = 0;
1014 for(i = 4; i < 8; i++) { 1016 for(i = 4; i < 8; i++) {
1017 int tmp;
1018
1015 mac2 = mac2 << 8; 1019 mac2 = mac2 << 8;
1016 tmp = read_eeprom_byte(dev, 0x8c+i); 1020 tmp = read_eeprom_byte(dev, 0x8c+i);
1017 if (tmp < 0) { 1021 if (tmp < 0) {
diff --git a/drivers/net/b44.c b/drivers/net/b44.c
index df9d6e80c4f2..c3267e4e1bb0 100644
--- a/drivers/net/b44.c
+++ b/drivers/net/b44.c
@@ -1399,7 +1399,6 @@ static int b44_open(struct net_device *dev)
1399 b44_init_rings(bp); 1399 b44_init_rings(bp);
1400 b44_init_hw(bp); 1400 b44_init_hw(bp);
1401 1401
1402 netif_carrier_off(dev);
1403 b44_check_phy(bp); 1402 b44_check_phy(bp);
1404 1403
1405 err = request_irq(dev->irq, b44_interrupt, SA_SHIRQ, dev->name, dev); 1404 err = request_irq(dev->irq, b44_interrupt, SA_SHIRQ, dev->name, dev);
@@ -1464,7 +1463,7 @@ static int b44_close(struct net_device *dev)
1464#endif 1463#endif
1465 b44_halt(bp); 1464 b44_halt(bp);
1466 b44_free_rings(bp); 1465 b44_free_rings(bp);
1467 netif_carrier_off(bp->dev); 1466 netif_carrier_off(dev);
1468 1467
1469 spin_unlock_irq(&bp->lock); 1468 spin_unlock_irq(&bp->lock);
1470 1469
@@ -2000,6 +1999,8 @@ static int __devinit b44_init_one(struct pci_dev *pdev,
2000 dev->irq = pdev->irq; 1999 dev->irq = pdev->irq;
2001 SET_ETHTOOL_OPS(dev, &b44_ethtool_ops); 2000 SET_ETHTOOL_OPS(dev, &b44_ethtool_ops);
2002 2001
2002 netif_carrier_off(dev);
2003
2003 err = b44_get_invariants(bp); 2004 err = b44_get_invariants(bp);
2004 if (err) { 2005 if (err) {
2005 printk(KERN_ERR PFX "Problem fetching invariants of chip, " 2006 printk(KERN_ERR PFX "Problem fetching invariants of chip, "
diff --git a/drivers/net/bonding/bond_main.c b/drivers/net/bonding/bond_main.c
index 2582d98ef5c3..4ff006c37626 100644
--- a/drivers/net/bonding/bond_main.c
+++ b/drivers/net/bonding/bond_main.c
@@ -576,7 +576,7 @@ static int bond_update_speed_duplex(struct slave *slave)
576 slave->duplex = DUPLEX_FULL; 576 slave->duplex = DUPLEX_FULL;
577 577
578 if (slave_dev->ethtool_ops) { 578 if (slave_dev->ethtool_ops) {
579 u32 res; 579 int res;
580 580
581 if (!slave_dev->ethtool_ops->get_settings) { 581 if (!slave_dev->ethtool_ops->get_settings) {
582 return -1; 582 return -1;
diff --git a/drivers/net/mv643xx_eth.c b/drivers/net/mv643xx_eth.c
index 40ae36b20c9d..7ef4b0434a3f 100644
--- a/drivers/net/mv643xx_eth.c
+++ b/drivers/net/mv643xx_eth.c
@@ -444,6 +444,7 @@ static int mv643xx_eth_receive_queue(struct net_device *dev)
444 netif_rx(skb); 444 netif_rx(skb);
445#endif 445#endif
446 } 446 }
447 dev->last_rx = jiffies;
447 } 448 }
448 449
449 return received_packets; 450 return received_packets;
@@ -461,7 +462,7 @@ static int mv643xx_eth_receive_queue(struct net_device *dev)
461 */ 462 */
462 463
463static irqreturn_t mv643xx_eth_int_handler(int irq, void *dev_id, 464static irqreturn_t mv643xx_eth_int_handler(int irq, void *dev_id,
464 struct pt_regs *regs) 465 struct pt_regs *regs)
465{ 466{
466 struct net_device *dev = (struct net_device *)dev_id; 467 struct net_device *dev = (struct net_device *)dev_id;
467 struct mv643xx_private *mp = netdev_priv(dev); 468 struct mv643xx_private *mp = netdev_priv(dev);
@@ -1047,16 +1048,15 @@ static int mv643xx_poll(struct net_device *dev, int *budget)
1047 1048
1048static inline unsigned int has_tiny_unaligned_frags(struct sk_buff *skb) 1049static inline unsigned int has_tiny_unaligned_frags(struct sk_buff *skb)
1049{ 1050{
1050 unsigned int frag; 1051 unsigned int frag;
1051 skb_frag_t *fragp; 1052 skb_frag_t *fragp;
1052 1053
1053 for (frag = 0; frag < skb_shinfo(skb)->nr_frags; frag++) { 1054 for (frag = 0; frag < skb_shinfo(skb)->nr_frags; frag++) {
1054 fragp = &skb_shinfo(skb)->frags[frag]; 1055 fragp = &skb_shinfo(skb)->frags[frag];
1055 if (fragp->size <= 8 && fragp->page_offset & 0x7) 1056 if (fragp->size <= 8 && fragp->page_offset & 0x7)
1056 return 1; 1057 return 1;
1057 1058 }
1058 } 1059 return 0;
1059 return 0;
1060} 1060}
1061 1061
1062 1062
@@ -2137,26 +2137,26 @@ static void eth_port_set_multicast_list(struct net_device *dev)
2137 */ 2137 */
2138 if ((dev->flags & IFF_PROMISC) || (dev->flags & IFF_ALLMULTI)) { 2138 if ((dev->flags & IFF_PROMISC) || (dev->flags & IFF_ALLMULTI)) {
2139 for (table_index = 0; table_index <= 0xFC; table_index += 4) { 2139 for (table_index = 0; table_index <= 0xFC; table_index += 4) {
2140 /* Set all entries in DA filter special multicast 2140 /* Set all entries in DA filter special multicast
2141 * table (Ex_dFSMT) 2141 * table (Ex_dFSMT)
2142 * Set for ETH_Q0 for now 2142 * Set for ETH_Q0 for now
2143 * Bits 2143 * Bits
2144 * 0 Accept=1, Drop=0 2144 * 0 Accept=1, Drop=0
2145 * 3-1 Queue ETH_Q0=0 2145 * 3-1 Queue ETH_Q0=0
2146 * 7-4 Reserved = 0; 2146 * 7-4 Reserved = 0;
2147 */ 2147 */
2148 mv_write(MV643XX_ETH_DA_FILTER_SPECIAL_MULTICAST_TABLE_BASE(eth_port_num) + table_index, 0x01010101); 2148 mv_write(MV643XX_ETH_DA_FILTER_SPECIAL_MULTICAST_TABLE_BASE(eth_port_num) + table_index, 0x01010101);
2149 2149
2150 /* Set all entries in DA filter other multicast 2150 /* Set all entries in DA filter other multicast
2151 * table (Ex_dFOMT) 2151 * table (Ex_dFOMT)
2152 * Set for ETH_Q0 for now 2152 * Set for ETH_Q0 for now
2153 * Bits 2153 * Bits
2154 * 0 Accept=1, Drop=0 2154 * 0 Accept=1, Drop=0
2155 * 3-1 Queue ETH_Q0=0 2155 * 3-1 Queue ETH_Q0=0
2156 * 7-4 Reserved = 0; 2156 * 7-4 Reserved = 0;
2157 */ 2157 */
2158 mv_write(MV643XX_ETH_DA_FILTER_OTHER_MULTICAST_TABLE_BASE(eth_port_num) + table_index, 0x01010101); 2158 mv_write(MV643XX_ETH_DA_FILTER_OTHER_MULTICAST_TABLE_BASE(eth_port_num) + table_index, 0x01010101);
2159 } 2159 }
2160 return; 2160 return;
2161 } 2161 }
2162 2162
@@ -2617,7 +2617,6 @@ static ETH_FUNC_RET_STATUS eth_port_send(struct mv643xx_private *mp,
2617 struct eth_tx_desc *current_descriptor; 2617 struct eth_tx_desc *current_descriptor;
2618 struct eth_tx_desc *first_descriptor; 2618 struct eth_tx_desc *first_descriptor;
2619 u32 command; 2619 u32 command;
2620 unsigned long flags;
2621 2620
2622 /* Do not process Tx ring in case of Tx ring resource error */ 2621 /* Do not process Tx ring in case of Tx ring resource error */
2623 if (mp->tx_resource_err) 2622 if (mp->tx_resource_err)
@@ -2634,8 +2633,6 @@ static ETH_FUNC_RET_STATUS eth_port_send(struct mv643xx_private *mp,
2634 return ETH_ERROR; 2633 return ETH_ERROR;
2635 } 2634 }
2636 2635
2637 spin_lock_irqsave(&mp->lock, flags);
2638
2639 mp->tx_ring_skbs++; 2636 mp->tx_ring_skbs++;
2640 BUG_ON(mp->tx_ring_skbs > mp->tx_ring_size); 2637 BUG_ON(mp->tx_ring_skbs > mp->tx_ring_size);
2641 2638
@@ -2685,15 +2682,11 @@ static ETH_FUNC_RET_STATUS eth_port_send(struct mv643xx_private *mp,
2685 mp->tx_resource_err = 1; 2682 mp->tx_resource_err = 1;
2686 mp->tx_curr_desc_q = tx_first_desc; 2683 mp->tx_curr_desc_q = tx_first_desc;
2687 2684
2688 spin_unlock_irqrestore(&mp->lock, flags);
2689
2690 return ETH_QUEUE_LAST_RESOURCE; 2685 return ETH_QUEUE_LAST_RESOURCE;
2691 } 2686 }
2692 2687
2693 mp->tx_curr_desc_q = tx_next_desc; 2688 mp->tx_curr_desc_q = tx_next_desc;
2694 2689
2695 spin_unlock_irqrestore(&mp->lock, flags);
2696
2697 return ETH_OK; 2690 return ETH_OK;
2698} 2691}
2699#else 2692#else
@@ -2704,14 +2697,11 @@ static ETH_FUNC_RET_STATUS eth_port_send(struct mv643xx_private *mp,
2704 int tx_desc_used; 2697 int tx_desc_used;
2705 struct eth_tx_desc *current_descriptor; 2698 struct eth_tx_desc *current_descriptor;
2706 unsigned int command_status; 2699 unsigned int command_status;
2707 unsigned long flags;
2708 2700
2709 /* Do not process Tx ring in case of Tx ring resource error */ 2701 /* Do not process Tx ring in case of Tx ring resource error */
2710 if (mp->tx_resource_err) 2702 if (mp->tx_resource_err)
2711 return ETH_QUEUE_FULL; 2703 return ETH_QUEUE_FULL;
2712 2704
2713 spin_lock_irqsave(&mp->lock, flags);
2714
2715 mp->tx_ring_skbs++; 2705 mp->tx_ring_skbs++;
2716 BUG_ON(mp->tx_ring_skbs > mp->tx_ring_size); 2706 BUG_ON(mp->tx_ring_skbs > mp->tx_ring_size);
2717 2707
@@ -2742,12 +2732,9 @@ static ETH_FUNC_RET_STATUS eth_port_send(struct mv643xx_private *mp,
2742 /* Check for ring index overlap in the Tx desc ring */ 2732 /* Check for ring index overlap in the Tx desc ring */
2743 if (tx_desc_curr == tx_desc_used) { 2733 if (tx_desc_curr == tx_desc_used) {
2744 mp->tx_resource_err = 1; 2734 mp->tx_resource_err = 1;
2745
2746 spin_unlock_irqrestore(&mp->lock, flags);
2747 return ETH_QUEUE_LAST_RESOURCE; 2735 return ETH_QUEUE_LAST_RESOURCE;
2748 } 2736 }
2749 2737
2750 spin_unlock_irqrestore(&mp->lock, flags);
2751 return ETH_OK; 2738 return ETH_OK;
2752} 2739}
2753#endif 2740#endif
@@ -2898,8 +2885,10 @@ static ETH_FUNC_RET_STATUS eth_port_receive(struct mv643xx_private *mp,
2898 p_pkt_info->return_info = mp->rx_skb[rx_curr_desc]; 2885 p_pkt_info->return_info = mp->rx_skb[rx_curr_desc];
2899 p_pkt_info->l4i_chk = p_rx_desc->buf_size; 2886 p_pkt_info->l4i_chk = p_rx_desc->buf_size;
2900 2887
2901 /* Clean the return info field to indicate that the packet has been */ 2888 /*
2902 /* moved to the upper layers */ 2889 * Clean the return info field to indicate that the
2890 * packet has been moved to the upper layers
2891 */
2903 mp->rx_skb[rx_curr_desc] = NULL; 2892 mp->rx_skb[rx_curr_desc] = NULL;
2904 2893
2905 /* Update current index in data structure */ 2894 /* Update current index in data structure */
@@ -2980,7 +2969,7 @@ struct mv643xx_stats {
2980}; 2969};
2981 2970
2982#define MV643XX_STAT(m) sizeof(((struct mv643xx_private *)0)->m), \ 2971#define MV643XX_STAT(m) sizeof(((struct mv643xx_private *)0)->m), \
2983 offsetof(struct mv643xx_private, m) 2972 offsetof(struct mv643xx_private, m)
2984 2973
2985static const struct mv643xx_stats mv643xx_gstrings_stats[] = { 2974static const struct mv643xx_stats mv643xx_gstrings_stats[] = {
2986 { "rx_packets", MV643XX_STAT(stats.rx_packets) }, 2975 { "rx_packets", MV643XX_STAT(stats.rx_packets) },
@@ -3131,9 +3120,8 @@ mv643xx_get_settings(struct net_device *netdev, struct ethtool_cmd *ecmd)
3131 return 0; 3120 return 0;
3132} 3121}
3133 3122
3134static void 3123static void mv643xx_get_drvinfo(struct net_device *netdev,
3135mv643xx_get_drvinfo(struct net_device *netdev, 3124 struct ethtool_drvinfo *drvinfo)
3136 struct ethtool_drvinfo *drvinfo)
3137{ 3125{
3138 strncpy(drvinfo->driver, mv643xx_driver_name, 32); 3126 strncpy(drvinfo->driver, mv643xx_driver_name, 32);
3139 strncpy(drvinfo->version, mv643xx_driver_version, 32); 3127 strncpy(drvinfo->version, mv643xx_driver_version, 32);
@@ -3142,39 +3130,37 @@ mv643xx_get_drvinfo(struct net_device *netdev,
3142 drvinfo->n_stats = MV643XX_STATS_LEN; 3130 drvinfo->n_stats = MV643XX_STATS_LEN;
3143} 3131}
3144 3132
3145static int 3133static int mv643xx_get_stats_count(struct net_device *netdev)
3146mv643xx_get_stats_count(struct net_device *netdev)
3147{ 3134{
3148 return MV643XX_STATS_LEN; 3135 return MV643XX_STATS_LEN;
3149} 3136}
3150 3137
3151static void 3138static void mv643xx_get_ethtool_stats(struct net_device *netdev,
3152mv643xx_get_ethtool_stats(struct net_device *netdev, 3139 struct ethtool_stats *stats, uint64_t *data)
3153 struct ethtool_stats *stats, uint64_t *data)
3154{ 3140{
3155 struct mv643xx_private *mp = netdev->priv; 3141 struct mv643xx_private *mp = netdev->priv;
3156 int i; 3142 int i;
3157 3143
3158 eth_update_mib_counters(mp); 3144 eth_update_mib_counters(mp);
3159 3145
3160 for(i = 0; i < MV643XX_STATS_LEN; i++) { 3146 for (i = 0; i < MV643XX_STATS_LEN; i++) {
3161 char *p = (char *)mp+mv643xx_gstrings_stats[i].stat_offset; 3147 char *p = (char *)mp+mv643xx_gstrings_stats[i].stat_offset;
3162 data[i] = (mv643xx_gstrings_stats[i].sizeof_stat == 3148 data[i] = (mv643xx_gstrings_stats[i].sizeof_stat ==
3163 sizeof(uint64_t)) ? *(uint64_t *)p : *(uint32_t *)p; 3149 sizeof(uint64_t)) ? *(uint64_t *)p : *(uint32_t *)p;
3164 } 3150 }
3165} 3151}
3166 3152
3167static void 3153static void mv643xx_get_strings(struct net_device *netdev, uint32_t stringset,
3168mv643xx_get_strings(struct net_device *netdev, uint32_t stringset, uint8_t *data) 3154 uint8_t *data)
3169{ 3155{
3170 int i; 3156 int i;
3171 3157
3172 switch(stringset) { 3158 switch(stringset) {
3173 case ETH_SS_STATS: 3159 case ETH_SS_STATS:
3174 for (i=0; i < MV643XX_STATS_LEN; i++) { 3160 for (i=0; i < MV643XX_STATS_LEN; i++) {
3175 memcpy(data + i * ETH_GSTRING_LEN, 3161 memcpy(data + i * ETH_GSTRING_LEN,
3176 mv643xx_gstrings_stats[i].stat_string, 3162 mv643xx_gstrings_stats[i].stat_string,
3177 ETH_GSTRING_LEN); 3163 ETH_GSTRING_LEN);
3178 } 3164 }
3179 break; 3165 break;
3180 } 3166 }
diff --git a/drivers/net/s2io.c b/drivers/net/s2io.c
index 89c46787676c..49b597cbc19a 100644
--- a/drivers/net/s2io.c
+++ b/drivers/net/s2io.c
@@ -3586,7 +3586,7 @@ static int s2io_xmit(struct sk_buff *skb, struct net_device *dev)
3586 txdp->Buffer_Pointer = (u64) pci_map_page 3586 txdp->Buffer_Pointer = (u64) pci_map_page
3587 (sp->pdev, frag->page, frag->page_offset, 3587 (sp->pdev, frag->page, frag->page_offset,
3588 frag->size, PCI_DMA_TODEVICE); 3588 frag->size, PCI_DMA_TODEVICE);
3589 txdp->Control_1 |= TXD_BUFFER0_SIZE(frag->size); 3589 txdp->Control_1 = TXD_BUFFER0_SIZE(frag->size);
3590 if (skb_shinfo(skb)->ufo_size) 3590 if (skb_shinfo(skb)->ufo_size)
3591 txdp->Control_1 |= TXD_UFO_EN; 3591 txdp->Control_1 |= TXD_UFO_EN;
3592 } 3592 }
diff --git a/drivers/net/sungem.c b/drivers/net/sungem.c
index 28ce47a02408..55f3b856236e 100644
--- a/drivers/net/sungem.c
+++ b/drivers/net/sungem.c
@@ -1653,36 +1653,40 @@ static void gem_init_rings(struct gem *gp)
1653/* Init PHY interface and start link poll state machine */ 1653/* Init PHY interface and start link poll state machine */
1654static void gem_init_phy(struct gem *gp) 1654static void gem_init_phy(struct gem *gp)
1655{ 1655{
1656 u32 mifcfg; 1656 u32 mif_cfg;
1657 1657
1658 /* Revert MIF CFG setting done on stop_phy */ 1658 /* Revert MIF CFG setting done on stop_phy */
1659 mifcfg = readl(gp->regs + MIF_CFG); 1659 mif_cfg = readl(gp->regs + MIF_CFG);
1660 mifcfg &= ~MIF_CFG_BBMODE; 1660 mif_cfg &= ~(MIF_CFG_PSELECT|MIF_CFG_POLL|MIF_CFG_BBMODE|MIF_CFG_MDI1);
1661 writel(mifcfg, gp->regs + MIF_CFG); 1661 mif_cfg |= MIF_CFG_MDI0;
1662 writel(mif_cfg, gp->regs + MIF_CFG);
1663 writel(PCS_DMODE_MGM, gp->regs + PCS_DMODE);
1664 writel(MAC_XIFCFG_OE, gp->regs + MAC_XIFCFG);
1662 1665
1663 if (gp->pdev->vendor == PCI_VENDOR_ID_APPLE) { 1666 if (gp->pdev->vendor == PCI_VENDOR_ID_APPLE) {
1664 int i; 1667 int i;
1668 u16 ctrl;
1665 1669
1666 /* Those delay sucks, the HW seem to love them though, I'll
1667 * serisouly consider breaking some locks here to be able
1668 * to schedule instead
1669 */
1670 for (i = 0; i < 3; i++) {
1671#ifdef CONFIG_PPC_PMAC 1670#ifdef CONFIG_PPC_PMAC
1672 pmac_call_feature(PMAC_FTR_GMAC_PHY_RESET, gp->of_node, 0, 0); 1671 pmac_call_feature(PMAC_FTR_GMAC_PHY_RESET, gp->of_node, 0, 0);
1673 msleep(20);
1674#endif 1672#endif
1675 /* Some PHYs used by apple have problem getting back to us, 1673
1676 * we do an additional reset here 1674 /* Some PHYs used by apple have problem getting back
1677 */ 1675 * to us, we do an additional reset here
1678 phy_write(gp, MII_BMCR, BMCR_RESET); 1676 */
1679 msleep(20); 1677 phy_write(gp, MII_BMCR, BMCR_RESET);
1680 if (phy_read(gp, MII_BMCR) != 0xffff) 1678 for (i = 0; i < 50; i++) {
1679 if ((phy_read(gp, MII_BMCR) & BMCR_RESET) == 0)
1681 break; 1680 break;
1682 if (i == 2) 1681 msleep(10);
1683 printk(KERN_WARNING "%s: GMAC PHY not responding !\n",
1684 gp->dev->name);
1685 } 1682 }
1683 if (i == 50)
1684 printk(KERN_WARNING "%s: GMAC PHY not responding !\n",
1685 gp->dev->name);
1686 /* Make sure isolate is off */
1687 ctrl = phy_read(gp, MII_BMCR);
1688 if (ctrl & BMCR_ISOLATE)
1689 phy_write(gp, MII_BMCR, ctrl & ~BMCR_ISOLATE);
1686 } 1690 }
1687 1691
1688 if (gp->pdev->vendor == PCI_VENDOR_ID_SUN && 1692 if (gp->pdev->vendor == PCI_VENDOR_ID_SUN &&
@@ -2119,7 +2123,7 @@ static void gem_reinit_chip(struct gem *gp)
2119/* Must be invoked with no lock held. */ 2123/* Must be invoked with no lock held. */
2120static void gem_stop_phy(struct gem *gp, int wol) 2124static void gem_stop_phy(struct gem *gp, int wol)
2121{ 2125{
2122 u32 mifcfg; 2126 u32 mif_cfg;
2123 unsigned long flags; 2127 unsigned long flags;
2124 2128
2125 /* Let the chip settle down a bit, it seems that helps 2129 /* Let the chip settle down a bit, it seems that helps
@@ -2130,9 +2134,9 @@ static void gem_stop_phy(struct gem *gp, int wol)
2130 /* Make sure we aren't polling PHY status change. We 2134 /* Make sure we aren't polling PHY status change. We
2131 * don't currently use that feature though 2135 * don't currently use that feature though
2132 */ 2136 */
2133 mifcfg = readl(gp->regs + MIF_CFG); 2137 mif_cfg = readl(gp->regs + MIF_CFG);
2134 mifcfg &= ~MIF_CFG_POLL; 2138 mif_cfg &= ~MIF_CFG_POLL;
2135 writel(mifcfg, gp->regs + MIF_CFG); 2139 writel(mif_cfg, gp->regs + MIF_CFG);
2136 2140
2137 if (wol && gp->has_wol) { 2141 if (wol && gp->has_wol) {
2138 unsigned char *e = &gp->dev->dev_addr[0]; 2142 unsigned char *e = &gp->dev->dev_addr[0];
@@ -2182,7 +2186,8 @@ static void gem_stop_phy(struct gem *gp, int wol)
2182 /* According to Apple, we must set the MDIO pins to this begnign 2186 /* According to Apple, we must set the MDIO pins to this begnign
2183 * state or we may 1) eat more current, 2) damage some PHYs 2187 * state or we may 1) eat more current, 2) damage some PHYs
2184 */ 2188 */
2185 writel(mifcfg | MIF_CFG_BBMODE, gp->regs + MIF_CFG); 2189 mif_cfg = 0;
2190 writel(mif_cfg | MIF_CFG_BBMODE, gp->regs + MIF_CFG);
2186 writel(0, gp->regs + MIF_BBCLK); 2191 writel(0, gp->regs + MIF_BBCLK);
2187 writel(0, gp->regs + MIF_BBDATA); 2192 writel(0, gp->regs + MIF_BBDATA);
2188 writel(0, gp->regs + MIF_BBOENAB); 2193 writel(0, gp->regs + MIF_BBOENAB);
diff --git a/drivers/net/wireless/hostap/Kconfig b/drivers/net/wireless/hostap/Kconfig
index c8f6286dd35f..308f773ad566 100644
--- a/drivers/net/wireless/hostap/Kconfig
+++ b/drivers/net/wireless/hostap/Kconfig
@@ -75,7 +75,7 @@ config HOSTAP_PCI
75 75
76config HOSTAP_CS 76config HOSTAP_CS
77 tristate "Host AP driver for Prism2/2.5/3 PC Cards" 77 tristate "Host AP driver for Prism2/2.5/3 PC Cards"
78 depends on PCMCIA!=n && HOSTAP 78 depends on PCMCIA && HOSTAP
79 ---help--- 79 ---help---
80 Host AP driver's version for Prism2/2.5/3 PC Cards. 80 Host AP driver's version for Prism2/2.5/3 PC Cards.
81 81
diff --git a/drivers/net/wireless/ipw2100.c b/drivers/net/wireless/ipw2100.c
index 8bf02763b5c7..6290c9f7e939 100644
--- a/drivers/net/wireless/ipw2100.c
+++ b/drivers/net/wireless/ipw2100.c
@@ -2201,6 +2201,17 @@ static int ipw2100_alloc_skb(struct ipw2100_priv *priv,
2201#define SEARCH_SNAPSHOT 1 2201#define SEARCH_SNAPSHOT 1
2202 2202
2203#define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff)) 2203#define SNAPSHOT_ADDR(ofs) (priv->snapshot[((ofs) >> 12) & 0xff] + ((ofs) & 0xfff))
2204static void ipw2100_snapshot_free(struct ipw2100_priv *priv)
2205{
2206 int i;
2207 if (!priv->snapshot[0])
2208 return;
2209 for (i = 0; i < 0x30; i++)
2210 kfree(priv->snapshot[i]);
2211 priv->snapshot[0] = NULL;
2212}
2213
2214#ifdef CONFIG_IPW2100_DEBUG_C3
2204static int ipw2100_snapshot_alloc(struct ipw2100_priv *priv) 2215static int ipw2100_snapshot_alloc(struct ipw2100_priv *priv)
2205{ 2216{
2206 int i; 2217 int i;
@@ -2221,16 +2232,6 @@ static int ipw2100_snapshot_alloc(struct ipw2100_priv *priv)
2221 return 1; 2232 return 1;
2222} 2233}
2223 2234
2224static void ipw2100_snapshot_free(struct ipw2100_priv *priv)
2225{
2226 int i;
2227 if (!priv->snapshot[0])
2228 return;
2229 for (i = 0; i < 0x30; i++)
2230 kfree(priv->snapshot[i]);
2231 priv->snapshot[0] = NULL;
2232}
2233
2234static u32 ipw2100_match_buf(struct ipw2100_priv *priv, u8 * in_buf, 2235static u32 ipw2100_match_buf(struct ipw2100_priv *priv, u8 * in_buf,
2235 size_t len, int mode) 2236 size_t len, int mode)
2236{ 2237{
@@ -2269,6 +2270,7 @@ static u32 ipw2100_match_buf(struct ipw2100_priv *priv, u8 * in_buf,
2269 2270
2270 return ret; 2271 return ret;
2271} 2272}
2273#endif
2272 2274
2273/* 2275/*
2274 * 2276 *
@@ -7112,11 +7114,17 @@ static int ipw2100_wx_set_txpow(struct net_device *dev,
7112{ 7114{
7113 struct ipw2100_priv *priv = ieee80211_priv(dev); 7115 struct ipw2100_priv *priv = ieee80211_priv(dev);
7114 int err = 0, value; 7116 int err = 0, value;
7117
7118 if (ipw_radio_kill_sw(priv, wrqu->txpower.disabled))
7119 return -EINPROGRESS;
7115 7120
7116 if (priv->ieee->iw_mode != IW_MODE_ADHOC) 7121 if (priv->ieee->iw_mode != IW_MODE_ADHOC)
7122 return 0;
7123
7124 if ((wrqu->txpower.flags & IW_TXPOW_TYPE) != IW_TXPOW_DBM)
7117 return -EINVAL; 7125 return -EINVAL;
7118 7126
7119 if (wrqu->txpower.disabled == 1 || wrqu->txpower.fixed == 0) 7127 if (wrqu->txpower.fixed == 0)
7120 value = IPW_TX_POWER_DEFAULT; 7128 value = IPW_TX_POWER_DEFAULT;
7121 else { 7129 else {
7122 if (wrqu->txpower.value < IPW_TX_POWER_MIN_DBM || 7130 if (wrqu->txpower.value < IPW_TX_POWER_MIN_DBM ||
@@ -7151,24 +7159,19 @@ static int ipw2100_wx_get_txpow(struct net_device *dev,
7151 7159
7152 struct ipw2100_priv *priv = ieee80211_priv(dev); 7160 struct ipw2100_priv *priv = ieee80211_priv(dev);
7153 7161
7154 if (priv->ieee->iw_mode != IW_MODE_ADHOC) { 7162 wrqu->txpower.disabled = (priv->status & STATUS_RF_KILL_MASK) ? 1 : 0;
7155 wrqu->power.disabled = 1;
7156 return 0;
7157 }
7158 7163
7159 if (priv->tx_power == IPW_TX_POWER_DEFAULT) { 7164 if (priv->tx_power == IPW_TX_POWER_DEFAULT) {
7160 wrqu->power.fixed = 0; 7165 wrqu->txpower.fixed = 0;
7161 wrqu->power.value = IPW_TX_POWER_MAX_DBM; 7166 wrqu->txpower.value = IPW_TX_POWER_MAX_DBM;
7162 wrqu->power.disabled = 1;
7163 } else { 7167 } else {
7164 wrqu->power.disabled = 0; 7168 wrqu->txpower.fixed = 1;
7165 wrqu->power.fixed = 1; 7169 wrqu->txpower.value = priv->tx_power;
7166 wrqu->power.value = priv->tx_power;
7167 } 7170 }
7168 7171
7169 wrqu->power.flags = IW_TXPOW_DBM; 7172 wrqu->txpower.flags = IW_TXPOW_DBM;
7170 7173
7171 IPW_DEBUG_WX("GET TX Power -> %d \n", wrqu->power.value); 7174 IPW_DEBUG_WX("GET TX Power -> %d \n", wrqu->txpower.value);
7172 7175
7173 return 0; 7176 return 0;
7174} 7177}
diff --git a/drivers/net/wireless/ipw2200.c b/drivers/net/wireless/ipw2200.c
index 4c28e332ecc3..916b24c544e2 100644
--- a/drivers/net/wireless/ipw2200.c
+++ b/drivers/net/wireless/ipw2200.c
@@ -8012,6 +8012,10 @@ static int ipw_sw_reset(struct ipw_priv *priv, int init)
8012 else 8012 else
8013 IPW_DEBUG_INFO("Auto adhoc creation disabled.\n"); 8013 IPW_DEBUG_INFO("Auto adhoc creation disabled.\n");
8014 8014
8015 priv->config &= ~CFG_STATIC_ESSID;
8016 priv->essid_len = 0;
8017 memset(priv->essid, 0, IW_ESSID_MAX_SIZE);
8018
8015 if (disable) { 8019 if (disable) {
8016 priv->status |= STATUS_RF_KILL_SW; 8020 priv->status |= STATUS_RF_KILL_SW;
8017 IPW_DEBUG_INFO("Radio disabled.\n"); 8021 IPW_DEBUG_INFO("Radio disabled.\n");
@@ -11035,7 +11039,6 @@ static int ipw_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
11035 net_dev->set_multicast_list = ipw_net_set_multicast_list; 11039 net_dev->set_multicast_list = ipw_net_set_multicast_list;
11036 net_dev->set_mac_address = ipw_net_set_mac_address; 11040 net_dev->set_mac_address = ipw_net_set_mac_address;
11037 priv->wireless_data.spy_data = &priv->ieee->spy_data; 11041 priv->wireless_data.spy_data = &priv->ieee->spy_data;
11038 priv->wireless_data.ieee80211 = priv->ieee;
11039 net_dev->wireless_data = &priv->wireless_data; 11042 net_dev->wireless_data = &priv->wireless_data;
11040 net_dev->wireless_handlers = &ipw_wx_handler_def; 11043 net_dev->wireless_handlers = &ipw_wx_handler_def;
11041 net_dev->ethtool_ops = &ipw_ethtool_ops; 11044 net_dev->ethtool_ops = &ipw_ethtool_ops;
@@ -11121,8 +11124,8 @@ static void ipw_pci_remove(struct pci_dev *pdev)
11121 /* Free MAC hash list for ADHOC */ 11124 /* Free MAC hash list for ADHOC */
11122 for (i = 0; i < IPW_IBSS_MAC_HASH_SIZE; i++) { 11125 for (i = 0; i < IPW_IBSS_MAC_HASH_SIZE; i++) {
11123 list_for_each_safe(p, q, &priv->ibss_mac_hash[i]) { 11126 list_for_each_safe(p, q, &priv->ibss_mac_hash[i]) {
11124 kfree(list_entry(p, struct ipw_ibss_seq, list));
11125 list_del(p); 11127 list_del(p);
11128 kfree(list_entry(p, struct ipw_ibss_seq, list));
11126 } 11129 }
11127 } 11130 }
11128 11131
diff --git a/drivers/net/wireless/orinoco_cs.c b/drivers/net/wireless/orinoco_cs.c
index b664708481cc..3c128b692bce 100644
--- a/drivers/net/wireless/orinoco_cs.c
+++ b/drivers/net/wireless/orinoco_cs.c
@@ -261,13 +261,13 @@ orinoco_cs_config(dev_link_t *link)
261 /* Note that the CIS values need to be rescaled */ 261 /* Note that the CIS values need to be rescaled */
262 if (cfg->vcc.present & (1 << CISTPL_POWER_VNOM)) { 262 if (cfg->vcc.present & (1 << CISTPL_POWER_VNOM)) {
263 if (conf.Vcc != cfg->vcc.param[CISTPL_POWER_VNOM] / 10000) { 263 if (conf.Vcc != cfg->vcc.param[CISTPL_POWER_VNOM] / 10000) {
264 DEBUG(2, "orinoco_cs_config: Vcc mismatch (conf.Vcc = %d, CIS = %d)\n", conf.Vcc, cfg->vcc.param[CISTPL_POWER_VNOM] / 10000); 264 DEBUG(2, "orinoco_cs_config: Vcc mismatch (conf.Vcc = %d, cfg CIS = %d)\n", conf.Vcc, cfg->vcc.param[CISTPL_POWER_VNOM] / 10000);
265 if (!ignore_cis_vcc) 265 if (!ignore_cis_vcc)
266 goto next_entry; 266 goto next_entry;
267 } 267 }
268 } else if (dflt.vcc.present & (1 << CISTPL_POWER_VNOM)) { 268 } else if (dflt.vcc.present & (1 << CISTPL_POWER_VNOM)) {
269 if (conf.Vcc != dflt.vcc.param[CISTPL_POWER_VNOM] / 10000) { 269 if (conf.Vcc != dflt.vcc.param[CISTPL_POWER_VNOM] / 10000) {
270 DEBUG(2, "orinoco_cs_config: Vcc mismatch (conf.Vcc = %d, CIS = %d)\n", conf.Vcc, dflt.vcc.param[CISTPL_POWER_VNOM] / 10000); 270 DEBUG(2, "orinoco_cs_config: Vcc mismatch (conf.Vcc = %d, dflt CIS = %d)\n", conf.Vcc, dflt.vcc.param[CISTPL_POWER_VNOM] / 10000);
271 if(!ignore_cis_vcc) 271 if(!ignore_cis_vcc)
272 goto next_entry; 272 goto next_entry;
273 } 273 }