Merge branch 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6

+342 -253
-2
Documentation/networking/bonding.txt
··· 945 945 collisions:0 txqueuelen:0 946 946 947 947 eth0 Link encap:Ethernet HWaddr 00:C0:F0:1F:37:B4 948 - inet addr:XXX.XXX.XXX.YYY Bcast:XXX.XXX.XXX.255 Mask:255.255.252.0 949 948 UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1 950 949 RX packets:3573025 errors:0 dropped:0 overruns:0 frame:0 951 950 TX packets:1643167 errors:1 dropped:0 overruns:1 carrier:0 ··· 952 953 Interrupt:10 Base address:0x1080 953 954 954 955 eth1 Link encap:Ethernet HWaddr 00:C0:F0:1F:37:B4 955 - inet addr:XXX.XXX.XXX.YYY Bcast:XXX.XXX.XXX.255 Mask:255.255.252.0 956 956 UP BROADCAST RUNNING SLAVE MULTICAST MTU:1500 Metric:1 957 957 RX packets:3651769 errors:0 dropped:0 overruns:0 frame:0 958 958 TX packets:1643480 errors:0 dropped:0 overruns:0 carrier:0
-1
MAINTAINERS
··· 1697 1697 1698 1698 MARVELL MV64340 ETHERNET DRIVER 1699 1699 P: Manish Lachwani 1700 - M: Manish_Lachwani@pmc-sierra.com 1701 1700 L: linux-mips@linux-mips.org 1702 1701 L: netdev@vger.kernel.org 1703 1702 S: Supported
+8 -8
drivers/net/3c503.c
··· 148 148 return -ENODEV; 149 149 } 150 150 151 - static void cleanup_card(struct net_device *dev) 152 - { 153 - /* NB: el2_close() handles free_irq */ 154 - release_region(dev->base_addr, EL2_IO_EXTENT); 155 - if (ei_status.mem) 156 - iounmap(ei_status.mem); 157 - } 158 - 159 151 #ifndef MODULE 160 152 struct net_device * __init el2_probe(int unit) 161 153 { ··· 716 724 if (found) 717 725 return 0; 718 726 return -ENXIO; 727 + } 728 + 729 + static void cleanup_card(struct net_device *dev) 730 + { 731 + /* NB: el2_close() handles free_irq */ 732 + release_region(dev->base_addr, EL2_IO_EXTENT); 733 + if (ei_status.mem) 734 + iounmap(ei_status.mem); 719 735 } 720 736 721 737 void
+2 -2
drivers/net/Kconfig
··· 129 129 130 130 If you don't have this card, of course say N. 131 131 132 - source "drivers/net/arcnet/Kconfig" 132 + source "drivers/net/arcnet/Kconfig" 133 133 134 134 source "drivers/net/phy/Kconfig" 135 135 ··· 844 844 845 845 config DM9000 846 846 tristate "DM9000 support" 847 - depends on ARM && NET_ETHERNET 847 + depends on (ARM || MIPS) && NET_ETHERNET 848 848 select CRC32 849 849 select MII 850 850 ---help---
+8 -8
drivers/net/ac3200.c
··· 123 123 return -ENODEV; 124 124 } 125 125 126 - static void cleanup_card(struct net_device *dev) 127 - { 128 - /* Someday free_irq may be in ac_close_card() */ 129 - free_irq(dev->irq, dev); 130 - release_region(dev->base_addr, AC_IO_EXTENT); 131 - iounmap(ei_status.mem); 132 - } 133 - 134 126 #ifndef MODULE 135 127 struct net_device * __init ac3200_probe(int unit) 136 128 { ··· 396 404 if (found) 397 405 return 0; 398 406 return -ENXIO; 407 + } 408 + 409 + static void cleanup_card(struct net_device *dev) 410 + { 411 + /* Someday free_irq may be in ac_close_card() */ 412 + free_irq(dev->irq, dev); 413 + release_region(dev->base_addr, AC_IO_EXTENT); 414 + iounmap(ei_status.mem); 399 415 } 400 416 401 417 void
+4 -4
drivers/net/bonding/bonding.h
··· 205 205 * 206 206 * Caller must hold bond lock for read 207 207 */ 208 - extern inline struct slave *bond_get_slave_by_dev(struct bonding *bond, struct net_device *slave_dev) 208 + static inline struct slave *bond_get_slave_by_dev(struct bonding *bond, struct net_device *slave_dev) 209 209 { 210 210 struct slave *slave = NULL; 211 211 int i; ··· 219 219 return slave; 220 220 } 221 221 222 - extern inline struct bonding *bond_get_bond_by_slave(struct slave *slave) 222 + static inline struct bonding *bond_get_bond_by_slave(struct slave *slave) 223 223 { 224 224 if (!slave || !slave->dev->master) { 225 225 return NULL; ··· 228 228 return (struct bonding *)slave->dev->master->priv; 229 229 } 230 230 231 - extern inline void bond_set_slave_inactive_flags(struct slave *slave) 231 + static inline void bond_set_slave_inactive_flags(struct slave *slave) 232 232 { 233 233 slave->state = BOND_STATE_BACKUP; 234 234 slave->dev->flags |= IFF_NOARP; 235 235 } 236 236 237 - extern inline void bond_set_slave_active_flags(struct slave *slave) 237 + static inline void bond_set_slave_active_flags(struct slave *slave) 238 238 { 239 239 slave->state = BOND_STATE_ACTIVE; 240 240 slave->dev->flags &= ~IFF_NOARP;
+7 -3
drivers/net/e1000/e1000_param.c
··· 545 545 static void __devinit 546 546 e1000_check_copper_options(struct e1000_adapter *adapter) 547 547 { 548 - int speed, dplx; 548 + int speed, dplx, an; 549 549 int bd = adapter->bd_number; 550 550 551 551 { /* Speed */ ··· 641 641 .p = an_list }} 642 642 }; 643 643 644 - int an = AutoNeg[bd]; 645 - e1000_validate_option(&an, &opt, adapter); 644 + if (num_AutoNeg > bd) { 645 + an = AutoNeg[bd]; 646 + e1000_validate_option(&an, &opt, adapter); 647 + } else { 648 + an = opt.def; 649 + } 646 650 adapter->hw.autoneg_advertised = an; 647 651 } 648 652
+7 -7
drivers/net/e2100.c
··· 140 140 return -ENODEV; 141 141 } 142 142 143 - static void cleanup_card(struct net_device *dev) 144 - { 145 - /* NB: e21_close() handles free_irq */ 146 - iounmap(ei_status.mem); 147 - release_region(dev->base_addr, E21_IO_EXTENT); 148 - } 149 - 150 143 #ifndef MODULE 151 144 struct net_device * __init e2100_probe(int unit) 152 145 { ··· 454 461 if (found) 455 462 return 0; 456 463 return -ENXIO; 464 + } 465 + 466 + static void cleanup_card(struct net_device *dev) 467 + { 468 + /* NB: e21_close() handles free_irq */ 469 + iounmap(ei_status.mem); 470 + release_region(dev->base_addr, E21_IO_EXTENT); 457 471 } 458 472 459 473 void
+7 -7
drivers/net/es3210.c
··· 155 155 return -ENODEV; 156 156 } 157 157 158 - static void cleanup_card(struct net_device *dev) 159 - { 160 - free_irq(dev->irq, dev); 161 - release_region(dev->base_addr, ES_IO_EXTENT); 162 - iounmap(ei_status.mem); 163 - } 164 - 165 158 #ifndef MODULE 166 159 struct net_device * __init es_probe(int unit) 167 160 { ··· 447 454 if (found) 448 455 return 0; 449 456 return -ENXIO; 457 + } 458 + 459 + static void cleanup_card(struct net_device *dev) 460 + { 461 + free_irq(dev->irq, dev); 462 + release_region(dev->base_addr, ES_IO_EXTENT); 463 + iounmap(ei_status.mem); 450 464 } 451 465 452 466 void
+101 -65
drivers/net/forcedeth.c
··· 101 101 * 0.46: 20 Oct 2005: Add irq optimization modes. 102 102 * 0.47: 26 Oct 2005: Add phyaddr 0 in phy scan. 103 103 * 0.48: 24 Dec 2005: Disable TSO, bugfix for pci_map_single 104 + * 0.49: 10 Dec 2005: Fix tso for large buffers. 104 105 * 105 106 * Known bugs: 106 107 * We suspect that on some hardware no TX done interrupts are generated. ··· 113 112 * DEV_NEED_TIMERIRQ will not harm you on sane hardware, only generating a few 114 113 * superfluous timer interrupts from the nic. 115 114 */ 116 - #define FORCEDETH_VERSION "0.48" 115 + #define FORCEDETH_VERSION "0.49" 117 116 #define DRV_NAME "forcedeth" 118 117 119 118 #include <linux/module.h> ··· 350 349 #define NV_TX2_VALID (1<<31) 351 350 #define NV_TX2_TSO (1<<28) 352 351 #define NV_TX2_TSO_SHIFT 14 352 + #define NV_TX2_TSO_MAX_SHIFT 14 353 + #define NV_TX2_TSO_MAX_SIZE (1<<NV_TX2_TSO_MAX_SHIFT) 353 354 #define NV_TX2_CHECKSUM_L3 (1<<27) 354 355 #define NV_TX2_CHECKSUM_L4 (1<<26) 355 356 ··· 411 408 #define NV_WATCHDOG_TIMEO (5*HZ) 412 409 413 410 #define RX_RING 128 414 - #define TX_RING 64 411 + #define TX_RING 256 415 412 /* 416 413 * If your nic mysteriously hangs then try to reduce the limits 417 414 * to 1/0: It might be required to set NV_TX_LASTPACKET in the 418 415 * last valid ring entry. But this would be impossible to 419 416 * implement - probably a disassembly error. 420 417 */ 421 - #define TX_LIMIT_STOP 63 422 - #define TX_LIMIT_START 62 418 + #define TX_LIMIT_STOP 255 419 + #define TX_LIMIT_START 254 423 420 424 421 /* rx/tx mac addr + type + vlan + align + slack*/ 425 422 #define NV_RX_HEADERS (64) ··· 538 535 unsigned int next_tx, nic_tx; 539 536 struct sk_buff *tx_skbuff[TX_RING]; 540 537 dma_addr_t tx_dma[TX_RING]; 538 + unsigned int tx_dma_len[TX_RING]; 541 539 u32 tx_flags; 542 540 }; 543 541 ··· 939 935 else 940 936 np->tx_ring.ex[i].FlagLen = 0; 941 937 np->tx_skbuff[i] = NULL; 938 + np->tx_dma[i] = 0; 942 939 } 943 940 } 944 941 ··· 950 945 return nv_alloc_rx(dev); 951 946 } 952 947 953 - static void nv_release_txskb(struct net_device *dev, unsigned int skbnr) 948 + static int nv_release_txskb(struct net_device *dev, unsigned int skbnr) 954 949 { 955 950 struct fe_priv *np = netdev_priv(dev); 956 - struct sk_buff *skb = np->tx_skbuff[skbnr]; 957 - unsigned int j, entry, fragments; 958 - 959 - dprintk(KERN_INFO "%s: nv_release_txskb for skbnr %d, skb %p\n", 960 - dev->name, skbnr, np->tx_skbuff[skbnr]); 961 - 962 - entry = skbnr; 963 - if ((fragments = skb_shinfo(skb)->nr_frags) != 0) { 964 - for (j = fragments; j >= 1; j--) { 965 - skb_frag_t *frag = &skb_shinfo(skb)->frags[j-1]; 966 - pci_unmap_page(np->pci_dev, np->tx_dma[entry], 967 - frag->size, 968 - PCI_DMA_TODEVICE); 969 - entry = (entry - 1) % TX_RING; 970 - } 951 + 952 + dprintk(KERN_INFO "%s: nv_release_txskb for skbnr %d\n", 953 + dev->name, skbnr); 954 + 955 + if (np->tx_dma[skbnr]) { 956 + pci_unmap_page(np->pci_dev, np->tx_dma[skbnr], 957 + np->tx_dma_len[skbnr], 958 + PCI_DMA_TODEVICE); 959 + np->tx_dma[skbnr] = 0; 971 960 } 972 - pci_unmap_single(np->pci_dev, np->tx_dma[entry], 973 - skb->len - skb->data_len, 974 - PCI_DMA_TODEVICE); 975 - dev_kfree_skb_irq(skb); 976 - np->tx_skbuff[skbnr] = NULL; 961 + 962 + if (np->tx_skbuff[skbnr]) { 963 + dev_kfree_skb_irq(np->tx_skbuff[skbnr]); 964 + np->tx_skbuff[skbnr] = NULL; 965 + return 1; 966 + } else { 967 + return 0; 968 + } 977 969 } 978 970 979 971 static void nv_drain_tx(struct net_device *dev) ··· 983 981 np->tx_ring.orig[i].FlagLen = 0; 984 982 else 985 983 np->tx_ring.ex[i].FlagLen = 0; 986 - if (np->tx_skbuff[i]) { 987 - nv_release_txskb(dev, i); 984 + if (nv_release_txskb(dev, i)) 988 985 np->stats.tx_dropped++; 989 - } 990 986 } 991 987 } 992 988 ··· 1021 1021 static int nv_start_xmit(struct sk_buff *skb, struct net_device *dev) 1022 1022 { 1023 1023 struct fe_priv *np = netdev_priv(dev); 1024 + u32 tx_flags = 0; 1024 1025 u32 tx_flags_extra = (np->desc_ver == DESC_VER_1 ? NV_TX_LASTPACKET : NV_TX2_LASTPACKET); 1025 1026 unsigned int fragments = skb_shinfo(skb)->nr_frags; 1026 - unsigned int nr = (np->next_tx + fragments) % TX_RING; 1027 + unsigned int nr = (np->next_tx - 1) % TX_RING; 1028 + unsigned int start_nr = np->next_tx % TX_RING; 1027 1029 unsigned int i; 1030 + u32 offset = 0; 1031 + u32 bcnt; 1032 + u32 size = skb->len-skb->data_len; 1033 + u32 entries = (size >> NV_TX2_TSO_MAX_SHIFT) + ((size & (NV_TX2_TSO_MAX_SIZE-1)) ? 1 : 0); 1034 + 1035 + /* add fragments to entries count */ 1036 + for (i = 0; i < fragments; i++) { 1037 + entries += (skb_shinfo(skb)->frags[i].size >> NV_TX2_TSO_MAX_SHIFT) + 1038 + ((skb_shinfo(skb)->frags[i].size & (NV_TX2_TSO_MAX_SIZE-1)) ? 1 : 0); 1039 + } 1028 1040 1029 1041 spin_lock_irq(&np->lock); 1030 1042 1031 - if ((np->next_tx - np->nic_tx + fragments) > TX_LIMIT_STOP) { 1043 + if ((np->next_tx - np->nic_tx + entries - 1) > TX_LIMIT_STOP) { 1032 1044 spin_unlock_irq(&np->lock); 1033 1045 netif_stop_queue(dev); 1034 1046 return NETDEV_TX_BUSY; 1035 1047 } 1036 1048 1037 - np->tx_skbuff[nr] = skb; 1038 - 1039 - if (fragments) { 1040 - dprintk(KERN_DEBUG "%s: nv_start_xmit: buffer contains %d fragments\n", dev->name, fragments); 1041 - /* setup descriptors in reverse order */ 1042 - for (i = fragments; i >= 1; i--) { 1043 - skb_frag_t *frag = &skb_shinfo(skb)->frags[i-1]; 1044 - np->tx_dma[nr] = pci_map_page(np->pci_dev, frag->page, frag->page_offset, frag->size, 1045 - PCI_DMA_TODEVICE); 1049 + /* setup the header buffer */ 1050 + do { 1051 + bcnt = (size > NV_TX2_TSO_MAX_SIZE) ? NV_TX2_TSO_MAX_SIZE : size; 1052 + nr = (nr + 1) % TX_RING; 1053 + 1054 + np->tx_dma[nr] = pci_map_single(np->pci_dev, skb->data + offset, bcnt, 1055 + PCI_DMA_TODEVICE); 1056 + np->tx_dma_len[nr] = bcnt; 1057 + 1058 + if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) { 1059 + np->tx_ring.orig[nr].PacketBuffer = cpu_to_le32(np->tx_dma[nr]); 1060 + np->tx_ring.orig[nr].FlagLen = cpu_to_le32((bcnt-1) | tx_flags); 1061 + } else { 1062 + np->tx_ring.ex[nr].PacketBufferHigh = cpu_to_le64(np->tx_dma[nr]) >> 32; 1063 + np->tx_ring.ex[nr].PacketBufferLow = cpu_to_le64(np->tx_dma[nr]) & 0x0FFFFFFFF; 1064 + np->tx_ring.ex[nr].FlagLen = cpu_to_le32((bcnt-1) | tx_flags); 1065 + } 1066 + tx_flags = np->tx_flags; 1067 + offset += bcnt; 1068 + size -= bcnt; 1069 + } while(size); 1070 + 1071 + /* setup the fragments */ 1072 + for (i = 0; i < fragments; i++) { 1073 + skb_frag_t *frag = &skb_shinfo(skb)->frags[i]; 1074 + u32 size = frag->size; 1075 + offset = 0; 1076 + 1077 + do { 1078 + bcnt = (size > NV_TX2_TSO_MAX_SIZE) ? NV_TX2_TSO_MAX_SIZE : size; 1079 + nr = (nr + 1) % TX_RING; 1080 + 1081 + np->tx_dma[nr] = pci_map_page(np->pci_dev, frag->page, frag->page_offset+offset, bcnt, 1082 + PCI_DMA_TODEVICE); 1083 + np->tx_dma_len[nr] = bcnt; 1046 1084 1047 1085 if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) { 1048 1086 np->tx_ring.orig[nr].PacketBuffer = cpu_to_le32(np->tx_dma[nr]); 1049 - np->tx_ring.orig[nr].FlagLen = cpu_to_le32( (frag->size-1) | np->tx_flags | tx_flags_extra); 1087 + np->tx_ring.orig[nr].FlagLen = cpu_to_le32((bcnt-1) | tx_flags); 1050 1088 } else { 1051 1089 np->tx_ring.ex[nr].PacketBufferHigh = cpu_to_le64(np->tx_dma[nr]) >> 32; 1052 1090 np->tx_ring.ex[nr].PacketBufferLow = cpu_to_le64(np->tx_dma[nr]) & 0x0FFFFFFFF; 1053 - np->tx_ring.ex[nr].FlagLen = cpu_to_le32( (frag->size-1) | np->tx_flags | tx_flags_extra); 1091 + np->tx_ring.ex[nr].FlagLen = cpu_to_le32((bcnt-1) | tx_flags); 1054 1092 } 1055 - 1056 - nr = (nr - 1) % TX_RING; 1057 - 1058 - if (np->desc_ver == DESC_VER_1) 1059 - tx_flags_extra &= ~NV_TX_LASTPACKET; 1060 - else 1061 - tx_flags_extra &= ~NV_TX2_LASTPACKET; 1062 - } 1093 + offset += bcnt; 1094 + size -= bcnt; 1095 + } while (size); 1063 1096 } 1097 + 1098 + /* set last fragment flag */ 1099 + if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) { 1100 + np->tx_ring.orig[nr].FlagLen |= cpu_to_le32(tx_flags_extra); 1101 + } else { 1102 + np->tx_ring.ex[nr].FlagLen |= cpu_to_le32(tx_flags_extra); 1103 + } 1104 + 1105 + np->tx_skbuff[nr] = skb; 1064 1106 1065 1107 #ifdef NETIF_F_TSO 1066 1108 if (skb_shinfo(skb)->tso_size) 1067 - tx_flags_extra |= NV_TX2_TSO | (skb_shinfo(skb)->tso_size << NV_TX2_TSO_SHIFT); 1109 + tx_flags_extra = NV_TX2_TSO | (skb_shinfo(skb)->tso_size << NV_TX2_TSO_SHIFT); 1068 1110 else 1069 1111 #endif 1070 - tx_flags_extra |= (skb->ip_summed == CHECKSUM_HW ? (NV_TX2_CHECKSUM_L3|NV_TX2_CHECKSUM_L4) : 0); 1112 + tx_flags_extra = (skb->ip_summed == CHECKSUM_HW ? (NV_TX2_CHECKSUM_L3|NV_TX2_CHECKSUM_L4) : 0); 1071 1113 1072 - np->tx_dma[nr] = pci_map_single(np->pci_dev, skb->data, skb->len-skb->data_len, 1073 - PCI_DMA_TODEVICE); 1074 - 1114 + /* set tx flags */ 1075 1115 if (np->desc_ver == DESC_VER_1 || np->desc_ver == DESC_VER_2) { 1076 - np->tx_ring.orig[nr].PacketBuffer = cpu_to_le32(np->tx_dma[nr]); 1077 - np->tx_ring.orig[nr].FlagLen = cpu_to_le32( (skb->len-skb->data_len-1) | np->tx_flags | tx_flags_extra); 1116 + np->tx_ring.orig[start_nr].FlagLen |= cpu_to_le32(tx_flags | tx_flags_extra); 1078 1117 } else { 1079 - np->tx_ring.ex[nr].PacketBufferHigh = cpu_to_le64(np->tx_dma[nr]) >> 32; 1080 - np->tx_ring.ex[nr].PacketBufferLow = cpu_to_le64(np->tx_dma[nr]) & 0x0FFFFFFFF; 1081 - np->tx_ring.ex[nr].FlagLen = cpu_to_le32( (skb->len-skb->data_len-1) | np->tx_flags | tx_flags_extra); 1118 + np->tx_ring.ex[start_nr].FlagLen |= cpu_to_le32(tx_flags | tx_flags_extra); 1082 1119 } 1083 1120 1084 - dprintk(KERN_DEBUG "%s: nv_start_xmit: packet packet %d queued for transmission. tx_flags_extra: %x\n", 1085 - dev->name, np->next_tx, tx_flags_extra); 1121 + dprintk(KERN_DEBUG "%s: nv_start_xmit: packet %d (entries %d) queued for transmission. tx_flags_extra: %x\n", 1122 + dev->name, np->next_tx, entries, tx_flags_extra); 1086 1123 { 1087 1124 int j; 1088 1125 for (j=0; j<64; j++) { ··· 1130 1093 dprintk("\n"); 1131 1094 } 1132 1095 1133 - np->next_tx += 1 + fragments; 1096 + np->next_tx += entries; 1134 1097 1135 1098 dev->trans_start = jiffies; 1136 1099 spin_unlock_irq(&np->lock); ··· 1177 1140 np->stats.tx_packets++; 1178 1141 np->stats.tx_bytes += skb->len; 1179 1142 } 1180 - nv_release_txskb(dev, i); 1181 1143 } 1182 1144 } else { 1183 1145 if (Flags & NV_TX2_LASTPACKET) { ··· 1192 1156 np->stats.tx_packets++; 1193 1157 np->stats.tx_bytes += skb->len; 1194 1158 } 1195 - nv_release_txskb(dev, i); 1196 1159 } 1197 1160 } 1161 + nv_release_txskb(dev, i); 1198 1162 np->nic_tx++; 1199 1163 } 1200 1164 if (np->next_tx - np->nic_tx < TX_LIMIT_START) ··· 2492 2456 np->txrxctl_bits |= NVREG_TXRXCTL_RXCHECK; 2493 2457 dev->features |= NETIF_F_HW_CSUM | NETIF_F_SG; 2494 2458 #ifdef NETIF_F_TSO 2495 - /* disabled dev->features |= NETIF_F_TSO; */ 2459 + dev->features |= NETIF_F_TSO; 2496 2460 #endif 2497 2461 } 2498 2462
+2 -2
drivers/net/gianfar.h
··· 718 718 uint32_t msg_enable; 719 719 }; 720 720 721 - extern inline u32 gfar_read(volatile unsigned *addr) 721 + static inline u32 gfar_read(volatile unsigned *addr) 722 722 { 723 723 u32 val; 724 724 val = in_be32(addr); 725 725 return val; 726 726 } 727 727 728 - extern inline void gfar_write(volatile unsigned *addr, u32 val) 728 + static inline void gfar_write(volatile unsigned *addr, u32 val) 729 729 { 730 730 out_be32(addr, val); 731 731 }
+6 -6
drivers/net/hp-plus.c
··· 138 138 return -ENODEV; 139 139 } 140 140 141 - static void cleanup_card(struct net_device *dev) 142 - { 143 - /* NB: hpp_close() handles free_irq */ 144 - release_region(dev->base_addr - NIC_OFFSET, HP_IO_EXTENT); 145 - } 146 - 147 141 #ifndef MODULE 148 142 struct net_device * __init hp_plus_probe(int unit) 149 143 { ··· 465 471 if (found) 466 472 return 0; 467 473 return -ENXIO; 474 + } 475 + 476 + static void cleanup_card(struct net_device *dev) 477 + { 478 + /* NB: hpp_close() handles free_irq */ 479 + release_region(dev->base_addr - NIC_OFFSET, HP_IO_EXTENT); 468 480 } 469 481 470 482 void
+6 -6
drivers/net/hp.c
··· 102 102 return -ENODEV; 103 103 } 104 104 105 - static void cleanup_card(struct net_device *dev) 106 - { 107 - free_irq(dev->irq, dev); 108 - release_region(dev->base_addr - NIC_OFFSET, HP_IO_EXTENT); 109 - } 110 - 111 105 #ifndef MODULE 112 106 struct net_device * __init hp_probe(int unit) 113 107 { ··· 436 442 if (found) 437 443 return 0; 438 444 return -ENXIO; 445 + } 446 + 447 + static void cleanup_card(struct net_device *dev) 448 + { 449 + free_irq(dev->irq, dev); 450 + release_region(dev->base_addr - NIC_OFFSET, HP_IO_EXTENT); 439 451 } 440 452 441 453 void
+2 -1
drivers/net/ibm_emac/ibm_emac.h
··· 110 110 #define EMAC_MR1_TFS_2K 0x00080000 111 111 #define EMAC_MR1_TR0_MULT 0x00008000 112 112 #define EMAC_MR1_JPSM 0x00000000 113 + #define EMAC_MR1_MWSW_001 0x00000000 113 114 #define EMAC_MR1_BASE(opb) (EMAC_MR1_TFS_2K | EMAC_MR1_TR0_MULT) 114 115 #else 115 116 #define EMAC_MR1_RFS_4K 0x00180000 ··· 131 130 (freq) <= 83 ? EMAC_MR1_OBCI_83 : \ 132 131 (freq) <= 100 ? EMAC_MR1_OBCI_100 : EMAC_MR1_OBCI_100P) 133 132 #define EMAC_MR1_BASE(opb) (EMAC_MR1_TFS_2K | EMAC_MR1_TR | \ 134 - EMAC_MR1_MWSW_001 | EMAC_MR1_OBCI(opb)) 133 + EMAC_MR1_OBCI(opb)) 135 134 #endif 136 135 137 136 /* EMACx_TMR0 */
+1 -1
drivers/net/ibm_emac/ibm_emac_core.c
··· 408 408 /* Mode register */ 409 409 r = EMAC_MR1_BASE(emac_opb_mhz()) | EMAC_MR1_VLE | EMAC_MR1_IST; 410 410 if (dev->phy.duplex == DUPLEX_FULL) 411 - r |= EMAC_MR1_FDE; 411 + r |= EMAC_MR1_FDE | EMAC_MR1_MWSW_001; 412 412 dev->stop_timeout = STOP_TIMEOUT_10; 413 413 switch (dev->phy.speed) { 414 414 case SPEED_1000:
+11 -11
drivers/net/lance.c
··· 309 309 310 310 311 311 312 - static void cleanup_card(struct net_device *dev) 313 - { 314 - struct lance_private *lp = dev->priv; 315 - if (dev->dma != 4) 316 - free_dma(dev->dma); 317 - release_region(dev->base_addr, LANCE_TOTAL_SIZE); 318 - kfree(lp->tx_bounce_buffs); 319 - kfree((void*)lp->rx_buffs); 320 - kfree(lp); 321 - } 322 - 323 312 #ifdef MODULE 324 313 #define MAX_CARDS 8 /* Max number of interfaces (cards) per module */ 325 314 ··· 354 365 if (found != 0) 355 366 return 0; 356 367 return -ENXIO; 368 + } 369 + 370 + static void cleanup_card(struct net_device *dev) 371 + { 372 + struct lance_private *lp = dev->priv; 373 + if (dev->dma != 4) 374 + free_dma(dev->dma); 375 + release_region(dev->base_addr, LANCE_TOTAL_SIZE); 376 + kfree(lp->tx_bounce_buffs); 377 + kfree((void*)lp->rx_buffs); 378 + kfree(lp); 357 379 } 358 380 359 381 void cleanup_module(void)
+7 -7
drivers/net/lne390.c
··· 145 145 return -ENODEV; 146 146 } 147 147 148 - static void cleanup_card(struct net_device *dev) 149 - { 150 - free_irq(dev->irq, dev); 151 - release_region(dev->base_addr, LNE390_IO_EXTENT); 152 - iounmap(ei_status.mem); 153 - } 154 - 155 148 #ifndef MODULE 156 149 struct net_device * __init lne390_probe(int unit) 157 150 { ··· 431 438 if (found) 432 439 return 0; 433 440 return -ENXIO; 441 + } 442 + 443 + static void cleanup_card(struct net_device *dev) 444 + { 445 + free_irq(dev->irq, dev); 446 + release_region(dev->base_addr, LNE390_IO_EXTENT); 447 + iounmap(ei_status.mem); 434 448 } 435 449 436 450 void cleanup_module(void)
+1 -1
drivers/net/mv643xx_eth.c
··· 6 6 * Copyright (C) 2002 rabeeh@galileo.co.il 7 7 * 8 8 * Copyright (C) 2003 PMC-Sierra, Inc., 9 - * written by Manish Lachwani (lachwani@pmc-sierra.com) 9 + * written by Manish Lachwani 10 10 * 11 11 * Copyright (C) 2003 Ralf Baechle <ralf@linux-mips.org> 12 12 *
+9 -9
drivers/net/ne.c
··· 212 212 return -ENODEV; 213 213 } 214 214 215 - static void cleanup_card(struct net_device *dev) 216 - { 217 - struct pnp_dev *idev = (struct pnp_dev *)ei_status.priv; 218 - if (idev) 219 - pnp_device_detach(idev); 220 - free_irq(dev->irq, dev); 221 - release_region(dev->base_addr, NE_IO_EXTENT); 222 - } 223 - 224 215 #ifndef MODULE 225 216 struct net_device * __init ne_probe(int unit) 226 217 { ··· 848 857 if (found) 849 858 return 0; 850 859 return -ENODEV; 860 + } 861 + 862 + static void cleanup_card(struct net_device *dev) 863 + { 864 + struct pnp_dev *idev = (struct pnp_dev *)ei_status.priv; 865 + if (idev) 866 + pnp_device_detach(idev); 867 + free_irq(dev->irq, dev); 868 + release_region(dev->base_addr, NE_IO_EXTENT); 851 869 } 852 870 853 871 void cleanup_module(void)
+8 -8
drivers/net/ne2.c
··· 278 278 return -ENODEV; 279 279 } 280 280 281 - static void cleanup_card(struct net_device *dev) 282 - { 283 - mca_mark_as_unused(ei_status.priv); 284 - mca_set_adapter_procfn( ei_status.priv, NULL, NULL); 285 - free_irq(dev->irq, dev); 286 - release_region(dev->base_addr, NE_IO_EXTENT); 287 - } 288 - 289 281 #ifndef MODULE 290 282 struct net_device * __init ne2_probe(int unit) 291 283 { ··· 802 810 return 0; 803 811 printk(KERN_WARNING "ne2.c: No NE/2 card found\n"); 804 812 return -ENXIO; 813 + } 814 + 815 + static void cleanup_card(struct net_device *dev) 816 + { 817 + mca_mark_as_unused(ei_status.priv); 818 + mca_set_adapter_procfn( ei_status.priv, NULL, NULL); 819 + free_irq(dev->irq, dev); 820 + release_region(dev->base_addr, NE_IO_EXTENT); 805 821 } 806 822 807 823 void cleanup_module(void)
+76 -53
drivers/net/sk98lin/skge.c
··· 282 282 * Description: 283 283 * This function initialize the PCI resources and IO 284 284 * 285 - * Returns: N/A 286 - * 285 + * Returns: 286 + * 0 - indicate everything worked ok. 287 + * != 0 - error indication 287 288 */ 288 - int SkGeInitPCI(SK_AC *pAC) 289 + static __devinit int SkGeInitPCI(SK_AC *pAC) 289 290 { 290 291 struct SK_NET_DEVICE *dev = pAC->dev[0]; 291 292 struct pci_dev *pdev = pAC->PciDev; 292 293 int retval; 293 294 294 - if (pci_enable_device(pdev) != 0) { 295 - return 1; 296 - } 297 - 298 295 dev->mem_start = pci_resource_start (pdev, 0); 299 296 pci_set_master(pdev); 300 297 301 - if (pci_request_regions(pdev, "sk98lin") != 0) { 302 - retval = 2; 303 - goto out_disable; 304 - } 298 + retval = pci_request_regions(pdev, "sk98lin"); 299 + if (retval) 300 + goto out; 305 301 306 302 #ifdef SK_BIG_ENDIAN 307 303 /* ··· 316 320 * Remap the regs into kernel space. 317 321 */ 318 322 pAC->IoBase = ioremap_nocache(dev->mem_start, 0x4000); 319 - 320 - if (!pAC->IoBase){ 321 - retval = 3; 323 + if (!pAC->IoBase) { 324 + retval = -EIO; 322 325 goto out_release; 323 326 } 324 327 ··· 325 330 326 331 out_release: 327 332 pci_release_regions(pdev); 328 - out_disable: 329 - pci_disable_device(pdev); 333 + out: 330 334 return retval; 331 335 } 332 336 ··· 486 492 * 0, if everything is ok 487 493 * !=0, on error 488 494 */ 489 - static int __init SkGeBoardInit(struct SK_NET_DEVICE *dev, SK_AC *pAC) 495 + static int __devinit SkGeBoardInit(struct SK_NET_DEVICE *dev, SK_AC *pAC) 490 496 { 491 497 short i; 492 498 unsigned long Flags; ··· 523 529 if (SkGeInit(pAC, pAC->IoBase, SK_INIT_DATA) != 0) { 524 530 printk("HWInit (0) failed.\n"); 525 531 spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); 526 - return(-EAGAIN); 532 + return -EIO; 527 533 } 528 534 SkI2cInit( pAC, pAC->IoBase, SK_INIT_DATA); 529 535 SkEventInit(pAC, pAC->IoBase, SK_INIT_DATA); ··· 545 551 if (SkGeInit(pAC, pAC->IoBase, SK_INIT_IO) != 0) { 546 552 printk("sk98lin: HWInit (1) failed.\n"); 547 553 spin_unlock_irqrestore(&pAC->SlowPathLock, Flags); 548 - return(-EAGAIN); 554 + return -EIO; 549 555 } 550 556 SkI2cInit( pAC, pAC->IoBase, SK_INIT_IO); 551 557 SkEventInit(pAC, pAC->IoBase, SK_INIT_IO); ··· 577 583 } else { 578 584 printk(KERN_WARNING "sk98lin: Illegal number of ports: %d\n", 579 585 pAC->GIni.GIMacsFound); 580 - return -EAGAIN; 586 + return -EIO; 581 587 } 582 588 583 589 if (Ret) { 584 590 printk(KERN_WARNING "sk98lin: Requested IRQ %d is busy.\n", 585 591 dev->irq); 586 - return -EAGAIN; 592 + return Ret; 587 593 } 588 594 pAC->AllocFlag |= SK_ALLOC_IRQ; 589 595 590 596 /* Alloc memory for this board (Mem for RxD/TxD) : */ 591 597 if(!BoardAllocMem(pAC)) { 592 598 printk("No memory for descriptor rings.\n"); 593 - return(-EAGAIN); 599 + return -ENOMEM; 594 600 } 595 601 596 602 BoardInitMem(pAC); ··· 606 612 DualNet)) { 607 613 BoardFreeMem(pAC); 608 614 printk("sk98lin: SkGeInitAssignRamToQueues failed.\n"); 609 - return(-EAGAIN); 615 + return -EIO; 610 616 } 611 617 612 618 return (0); ··· 627 633 * SK_TRUE, if all memory could be allocated 628 634 * SK_FALSE, if not 629 635 */ 630 - static SK_BOOL BoardAllocMem( 631 - SK_AC *pAC) 636 + static __devinit SK_BOOL BoardAllocMem(SK_AC *pAC) 632 637 { 633 638 caddr_t pDescrMem; /* pointer to descriptor memory area */ 634 639 size_t AllocLength; /* length of complete descriptor area */ ··· 720 727 * 721 728 * Returns: N/A 722 729 */ 723 - static void BoardInitMem( 724 - SK_AC *pAC) /* pointer to adapter context */ 730 + static __devinit void BoardInitMem(SK_AC *pAC) 725 731 { 726 732 int i; /* loop counter */ 727 733 int RxDescrSize; /* the size of a rx descriptor rounded up to alignment*/ ··· 4768 4776 struct net_device *dev = NULL; 4769 4777 static int boards_found = 0; 4770 4778 int error = -ENODEV; 4779 + int using_dac = 0; 4771 4780 char DeviceStr[80]; 4772 4781 4773 4782 if (pci_enable_device(pdev)) 4774 4783 goto out; 4775 4784 4776 4785 /* Configure DMA attributes. */ 4777 - if (pci_set_dma_mask(pdev, DMA_64BIT_MASK) && 4778 - pci_set_dma_mask(pdev, DMA_32BIT_MASK)) 4779 - goto out_disable_device; 4786 + if (sizeof(dma_addr_t) > sizeof(u32) && 4787 + !(error = pci_set_dma_mask(pdev, DMA_64BIT_MASK))) { 4788 + using_dac = 1; 4789 + error = pci_set_consistent_dma_mask(pdev, DMA_64BIT_MASK); 4790 + if (error < 0) { 4791 + printk(KERN_ERR "sk98lin %s unable to obtain 64 bit DMA " 4792 + "for consistent allocations\n", pci_name(pdev)); 4793 + goto out_disable_device; 4794 + } 4795 + } else { 4796 + error = pci_set_dma_mask(pdev, DMA_32BIT_MASK); 4797 + if (error) { 4798 + printk(KERN_ERR "sk98lin %s no usable DMA configuration\n", 4799 + pci_name(pdev)); 4800 + goto out_disable_device; 4801 + } 4802 + } 4780 4803 4781 - 4782 - if ((dev = alloc_etherdev(sizeof(DEV_NET))) == NULL) { 4783 - printk(KERN_ERR "Unable to allocate etherdev " 4804 + error = -ENOMEM; 4805 + dev = alloc_etherdev(sizeof(DEV_NET)); 4806 + if (!dev) { 4807 + printk(KERN_ERR "sk98lin: unable to allocate etherdev " 4784 4808 "structure!\n"); 4785 4809 goto out_disable_device; 4786 4810 } 4787 4811 4788 4812 pNet = netdev_priv(dev); 4789 - pNet->pAC = kmalloc(sizeof(SK_AC), GFP_KERNEL); 4813 + pNet->pAC = kzalloc(sizeof(SK_AC), GFP_KERNEL); 4790 4814 if (!pNet->pAC) { 4791 - printk(KERN_ERR "Unable to allocate adapter " 4815 + printk(KERN_ERR "sk98lin: unable to allocate adapter " 4792 4816 "structure!\n"); 4793 4817 goto out_free_netdev; 4794 4818 } 4795 4819 4796 - memset(pNet->pAC, 0, sizeof(SK_AC)); 4797 4820 pAC = pNet->pAC; 4798 4821 pAC->PciDev = pdev; 4799 4822 ··· 4817 4810 pAC->CheckQueue = SK_FALSE; 4818 4811 4819 4812 dev->irq = pdev->irq; 4813 + 4820 4814 error = SkGeInitPCI(pAC); 4821 4815 if (error) { 4822 4816 printk(KERN_ERR "sk98lin: PCI setup failed: %i\n", error); ··· 4852 4844 #endif 4853 4845 } 4854 4846 4847 + if (using_dac) 4848 + dev->features |= NETIF_F_HIGHDMA; 4849 + 4855 4850 pAC->Index = boards_found++; 4856 4851 4857 - if (SkGeBoardInit(dev, pAC)) 4852 + error = SkGeBoardInit(dev, pAC); 4853 + if (error) 4858 4854 goto out_free_netdev; 4859 4855 4860 4856 /* Read Adapter name from VPD */ 4861 4857 if (ProductStr(pAC, DeviceStr, sizeof(DeviceStr)) != 0) { 4858 + error = -EIO; 4862 4859 printk(KERN_ERR "sk98lin: Could not read VPD data.\n"); 4863 4860 goto out_free_resources; 4864 4861 } 4865 4862 4866 4863 /* Register net device */ 4867 - if (register_netdev(dev)) { 4864 + error = register_netdev(dev); 4865 + if (error) { 4868 4866 printk(KERN_ERR "sk98lin: Could not register device.\n"); 4869 4867 goto out_free_resources; 4870 4868 } ··· 4897 4883 4898 4884 boards_found++; 4899 4885 4886 + pci_set_drvdata(pdev, dev); 4887 + 4900 4888 /* More then one port found */ 4901 4889 if ((pAC->GIni.GIMacsFound == 2 ) && (pAC->RlmtNets == 2)) { 4902 - if ((dev = alloc_etherdev(sizeof(DEV_NET))) == 0) { 4903 - printk(KERN_ERR "Unable to allocate etherdev " 4890 + dev = alloc_etherdev(sizeof(DEV_NET)); 4891 + if (!dev) { 4892 + printk(KERN_ERR "sk98lin: unable to allocate etherdev " 4904 4893 "structure!\n"); 4905 - goto out; 4894 + goto single_port; 4906 4895 } 4907 4896 4908 - pAC->dev[1] = dev; 4909 4897 pNet = netdev_priv(dev); 4910 4898 pNet->PortNr = 1; 4911 4899 pNet->NetNr = 1; ··· 4936 4920 #endif 4937 4921 } 4938 4922 4939 - if (register_netdev(dev)) { 4940 - printk(KERN_ERR "sk98lin: Could not register device for seconf port.\n"); 4923 + if (using_dac) 4924 + dev->features |= NETIF_F_HIGHDMA; 4925 + 4926 + error = register_netdev(dev); 4927 + if (error) { 4928 + printk(KERN_ERR "sk98lin: Could not register device" 4929 + " for second port. (%d)\n", error); 4941 4930 free_netdev(dev); 4942 - pAC->dev[1] = pAC->dev[0]; 4943 - } else { 4944 - memcpy(&dev->dev_addr, 4945 - &pAC->Addr.Net[1].CurrentMacAddress, 6); 4946 - memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len); 4947 - 4948 - printk("%s: %s\n", dev->name, DeviceStr); 4949 - printk(" PrefPort:B RlmtMode:Dual Check Link State\n"); 4931 + goto single_port; 4950 4932 } 4933 + 4934 + pAC->dev[1] = dev; 4935 + memcpy(&dev->dev_addr, 4936 + &pAC->Addr.Net[1].CurrentMacAddress, 6); 4937 + memcpy(dev->perm_addr, dev->dev_addr, dev->addr_len); 4938 + 4939 + printk("%s: %s\n", dev->name, DeviceStr); 4940 + printk(" PrefPort:B RlmtMode:Dual Check Link State\n"); 4951 4941 } 4942 + 4943 + single_port: 4952 4944 4953 4945 /* Save the hardware revision */ 4954 4946 pAC->HWRevision = (((pAC->GIni.GIPciHwRev >> 4) & 0x0F)*10) + ··· 4969 4945 memset(&pAC->PnmiBackup, 0, sizeof(SK_PNMI_STRUCT_DATA)); 4970 4946 memcpy(&pAC->PnmiBackup, &pAC->PnmiStruct, sizeof(SK_PNMI_STRUCT_DATA)); 4971 4947 4972 - pci_set_drvdata(pdev, dev); 4973 4948 return 0; 4974 4949 4975 4950 out_free_resources:
+12 -12
drivers/net/smc-ultra.c
··· 168 168 return -ENODEV; 169 169 } 170 170 171 - static void cleanup_card(struct net_device *dev) 172 - { 173 - /* NB: ultra_close_card() does free_irq */ 174 - #ifdef __ISAPNP__ 175 - struct pnp_dev *idev = (struct pnp_dev *)ei_status.priv; 176 - if (idev) 177 - pnp_device_detach(idev); 178 - #endif 179 - release_region(dev->base_addr - ULTRA_NIC_OFFSET, ULTRA_IO_EXTENT); 180 - iounmap(ei_status.mem); 181 - } 182 - 183 171 #ifndef MODULE 184 172 struct net_device * __init ultra_probe(int unit) 185 173 { ··· 580 592 if (found) 581 593 return 0; 582 594 return -ENXIO; 595 + } 596 + 597 + static void cleanup_card(struct net_device *dev) 598 + { 599 + /* NB: ultra_close_card() does free_irq */ 600 + #ifdef __ISAPNP__ 601 + struct pnp_dev *idev = (struct pnp_dev *)ei_status.priv; 602 + if (idev) 603 + pnp_device_detach(idev); 604 + #endif 605 + release_region(dev->base_addr - ULTRA_NIC_OFFSET, ULTRA_IO_EXTENT); 606 + iounmap(ei_status.mem); 583 607 } 584 608 585 609 void
+1 -1
drivers/net/tulip/tulip_core.c
··· 1564 1564 dev->dev_addr, 6); 1565 1565 } 1566 1566 #endif 1567 - #if defined(__i386__) /* Patch up x86 BIOS bug. */ 1567 + #if defined(__i386__) || defined(__x86_64__) /* Patch up x86 BIOS bug. */ 1568 1568 if (last_irq) 1569 1569 irq = last_irq; 1570 1570 #endif
+7 -7
drivers/net/wd.c
··· 127 127 return -ENODEV; 128 128 } 129 129 130 - static void cleanup_card(struct net_device *dev) 131 - { 132 - free_irq(dev->irq, dev); 133 - release_region(dev->base_addr - WD_NIC_OFFSET, WD_IO_EXTENT); 134 - iounmap(ei_status.mem); 135 - } 136 - 137 130 #ifndef MODULE 138 131 struct net_device * __init wd_probe(int unit) 139 132 { ··· 529 536 if (found) 530 537 return 0; 531 538 return -ENXIO; 539 + } 540 + 541 + static void cleanup_card(struct net_device *dev) 542 + { 543 + free_irq(dev->irq, dev); 544 + release_region(dev->base_addr - WD_NIC_OFFSET, WD_IO_EXTENT); 545 + iounmap(ei_status.mem); 532 546 } 533 547 534 548 void
+4 -1
drivers/net/wireless/ipw2100.c
··· 7153 7153 7154 7154 /* Set the Wireless Extension versions */ 7155 7155 range->we_version_compiled = WIRELESS_EXT; 7156 - range->we_version_source = 16; 7156 + range->we_version_source = 18; 7157 7157 7158 7158 // range->retry_capa; /* What retry options are supported */ 7159 7159 // range->retry_flags; /* How to decode max/min retry limit */ ··· 7183 7183 range->event_capa[0] = (IW_EVENT_CAPA_K_0 | 7184 7184 IW_EVENT_CAPA_MASK(SIOCGIWAP)); 7185 7185 range->event_capa[1] = IW_EVENT_CAPA_K_1; 7186 + 7187 + range->enc_capa = IW_ENC_CAPA_WPA | IW_ENC_CAPA_WPA2 | 7188 + IW_ENC_CAPA_CIPHER_TKIP | IW_ENC_CAPA_CIPHER_CCMP; 7186 7189 7187 7190 IPW_DEBUG_WX("GET Range\n"); 7188 7191
+43 -18
net/ieee80211/ieee80211_crypt_wep.c
··· 75 75 kfree(priv); 76 76 } 77 77 78 - /* Perform WEP encryption on given skb that has at least 4 bytes of headroom 79 - * for IV and 4 bytes of tailroom for ICV. Both IV and ICV will be transmitted, 80 - * so the payload length increases with 8 bytes. 81 - * 82 - * WEP frame payload: IV + TX key idx, RC4(data), ICV = RC4(CRC32(data)) 83 - */ 84 - static int prism2_wep_encrypt(struct sk_buff *skb, int hdr_len, void *priv) 78 + /* Add WEP IV/key info to a frame that has at least 4 bytes of headroom */ 79 + static int prism2_wep_build_iv(struct sk_buff *skb, int hdr_len, void *priv) 85 80 { 86 81 struct prism2_wep_data *wep = priv; 87 - u32 crc, klen, len; 88 - u8 key[WEP_KEY_LEN + 3]; 89 - u8 *pos, *icv; 90 - struct scatterlist sg; 91 - 92 - if (skb_headroom(skb) < 4 || skb_tailroom(skb) < 4 || 93 - skb->len < hdr_len) 82 + u32 klen, len; 83 + u8 *pos; 84 + 85 + if (skb_headroom(skb) < 4 || skb->len < hdr_len) 94 86 return -1; 95 87 96 88 len = skb->len - hdr_len; ··· 104 112 } 105 113 106 114 /* Prepend 24-bit IV to RC4 key and TX frame */ 107 - *pos++ = key[0] = (wep->iv >> 16) & 0xff; 108 - *pos++ = key[1] = (wep->iv >> 8) & 0xff; 109 - *pos++ = key[2] = wep->iv & 0xff; 115 + *pos++ = (wep->iv >> 16) & 0xff; 116 + *pos++ = (wep->iv >> 8) & 0xff; 117 + *pos++ = wep->iv & 0xff; 110 118 *pos++ = wep->key_idx << 6; 119 + 120 + return 0; 121 + } 122 + 123 + /* Perform WEP encryption on given skb that has at least 4 bytes of headroom 124 + * for IV and 4 bytes of tailroom for ICV. Both IV and ICV will be transmitted, 125 + * so the payload length increases with 8 bytes. 126 + * 127 + * WEP frame payload: IV + TX key idx, RC4(data), ICV = RC4(CRC32(data)) 128 + */ 129 + static int prism2_wep_encrypt(struct sk_buff *skb, int hdr_len, void *priv) 130 + { 131 + struct prism2_wep_data *wep = priv; 132 + u32 crc, klen, len; 133 + u8 *pos, *icv; 134 + struct scatterlist sg; 135 + u8 key[WEP_KEY_LEN + 3]; 136 + 137 + /* other checks are in prism2_wep_build_iv */ 138 + if (skb_tailroom(skb) < 4) 139 + return -1; 140 + 141 + /* add the IV to the frame */ 142 + if (prism2_wep_build_iv(skb, hdr_len, priv)) 143 + return -1; 144 + 145 + /* Copy the IV into the first 3 bytes of the key */ 146 + memcpy(key, skb->data + hdr_len, 3); 111 147 112 148 /* Copy rest of the WEP key (the secret part) */ 113 149 memcpy(key + 3, wep->key, wep->key_len); 150 + 151 + len = skb->len - hdr_len - 4; 152 + pos = skb->data + hdr_len + 4; 153 + klen = 3 + wep->key_len; 114 154 115 - /* Append little-endian CRC32 and encrypt it to produce ICV */ 155 + /* Append little-endian CRC32 over only the data and encrypt it to produce ICV */ 116 156 crc = ~crc32_le(~0, pos, len); 117 157 icv = skb_put(skb, 4); 118 158 icv[0] = crc; ··· 255 231 .name = "WEP", 256 232 .init = prism2_wep_init, 257 233 .deinit = prism2_wep_deinit, 234 + .build_iv = prism2_wep_build_iv, 258 235 .encrypt_mpdu = prism2_wep_encrypt, 259 236 .decrypt_mpdu = prism2_wep_decrypt, 260 237 .encrypt_msdu = NULL,
+1 -1
net/ieee80211/ieee80211_tx.c
··· 288 288 /* Determine total amount of storage required for TXB packets */ 289 289 bytes = skb->len + SNAP_SIZE + sizeof(u16); 290 290 291 - if (host_encrypt) 291 + if (host_encrypt || host_build_iv) 292 292 fc = IEEE80211_FTYPE_DATA | IEEE80211_STYPE_DATA | 293 293 IEEE80211_FCTL_PROTECTED; 294 294 else
+1 -1
net/ieee80211/ieee80211_wx.c
··· 284 284 }; 285 285 int i, key, key_provided, len; 286 286 struct ieee80211_crypt_data **crypt; 287 - int host_crypto = ieee->host_encrypt || ieee->host_decrypt; 287 + int host_crypto = ieee->host_encrypt || ieee->host_decrypt || ieee->host_build_iv; 288 288 289 289 IEEE80211_DEBUG_WX("SET_ENCODE\n"); 290 290