Commit caea902f72b053fd0c76d0d3b6b2e057beb3fc64
Exists in
master
and in
39 other branches
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
Conflicts: drivers/net/wireless/rt2x00/Kconfig drivers/net/wireless/rt2x00/rt2x00usb.c net/sctp/protocol.c
Showing 23 changed files Side-by-side Diff
- drivers/atm/he.c
- drivers/atm/he.h
- drivers/atm/iphase.c
- drivers/net/wireless/b43/b43.h
- drivers/net/wireless/b43/dma.c
- drivers/net/wireless/b43/main.c
- drivers/net/wireless/rt2x00/Kconfig
- drivers/net/wireless/rt2x00/rt2x00pci.c
- drivers/net/wireless/rt2x00/rt2x00usb.c
- drivers/net/wireless/rt2x00/rt73usb.c
- drivers/ssb/main.c
- include/linux/if_tunnel.h
- net/atm/br2684.c
- net/core/dev.c
- net/ipv4/inet_connection_sock.c
- net/ipv4/raw.c
- net/ipv4/tcp_ipv4.c
- net/ipv6/sit.c
- net/mac80211/wext.c
- net/mac80211/wme.c
- net/sched/sch_htb.c
- net/sctp/associola.c
- net/sctp/protocol.c
drivers/atm/he.c
... | ... | @@ -1542,7 +1542,8 @@ |
1542 | 1542 | /* initialize framer */ |
1543 | 1543 | |
1544 | 1544 | #ifdef CONFIG_ATM_HE_USE_SUNI |
1545 | - suni_init(he_dev->atm_dev); | |
1545 | + if (he_isMM(he_dev)) | |
1546 | + suni_init(he_dev->atm_dev); | |
1546 | 1547 | if (he_dev->atm_dev->phy && he_dev->atm_dev->phy->start) |
1547 | 1548 | he_dev->atm_dev->phy->start(he_dev->atm_dev); |
1548 | 1549 | #endif /* CONFIG_ATM_HE_USE_SUNI */ |
... | ... | @@ -1554,6 +1555,7 @@ |
1554 | 1555 | val = he_phy_get(he_dev->atm_dev, SUNI_TPOP_APM); |
1555 | 1556 | val = (val & ~SUNI_TPOP_APM_S) | (SUNI_TPOP_S_SDH << SUNI_TPOP_APM_S_SHIFT); |
1556 | 1557 | he_phy_put(he_dev->atm_dev, val, SUNI_TPOP_APM); |
1558 | + he_phy_put(he_dev->atm_dev, SUNI_TACP_IUCHP_CLP, SUNI_TACP_IUCHP); | |
1557 | 1559 | } |
1558 | 1560 | |
1559 | 1561 | /* 5.1.12 enable transmit and receive */ |
1560 | 1562 | |
... | ... | @@ -2844,10 +2846,15 @@ |
2844 | 2846 | if (copy_from_user(®, arg, |
2845 | 2847 | sizeof(struct he_ioctl_reg))) |
2846 | 2848 | return -EFAULT; |
2847 | - | |
2849 | + | |
2848 | 2850 | spin_lock_irqsave(&he_dev->global_lock, flags); |
2849 | 2851 | switch (reg.type) { |
2850 | 2852 | case HE_REGTYPE_PCI: |
2853 | + if (reg.addr < 0 || reg.addr >= HE_REGMAP_SIZE) { | |
2854 | + err = -EINVAL; | |
2855 | + break; | |
2856 | + } | |
2857 | + | |
2851 | 2858 | reg.val = he_readl(he_dev, reg.addr); |
2852 | 2859 | break; |
2853 | 2860 | case HE_REGTYPE_RCM: |
drivers/atm/he.h
... | ... | @@ -267,14 +267,8 @@ |
267 | 267 | |
268 | 268 | char prod_id[30]; |
269 | 269 | char mac_addr[6]; |
270 | - int media; /* | |
271 | - * 0x26 = HE155 MM | |
272 | - * 0x27 = HE622 MM | |
273 | - * 0x46 = HE155 SM | |
274 | - * 0x47 = HE622 SM | |
275 | - */ | |
270 | + int media; | |
276 | 271 | |
277 | - | |
278 | 272 | unsigned int vcibits, vpibits; |
279 | 273 | unsigned int cells_per_row; |
280 | 274 | unsigned int bytes_per_row; |
... | ... | @@ -392,6 +386,7 @@ |
392 | 386 | #define HE_DEV(dev) ((struct he_dev *) (dev)->dev_data) |
393 | 387 | |
394 | 388 | #define he_is622(dev) ((dev)->media & 0x1) |
389 | +#define he_isMM(dev) ((dev)->media & 0x20) | |
395 | 390 | |
396 | 391 | #define HE_REGMAP_SIZE 0x100000 |
397 | 392 | |
... | ... | @@ -876,8 +871,8 @@ |
876 | 871 | #define M_SN 0x3a /* integer */ |
877 | 872 | #define MEDIA 0x3e /* integer */ |
878 | 873 | #define HE155MM 0x26 |
879 | -#define HE155SM 0x27 | |
880 | -#define HE622MM 0x46 | |
874 | +#define HE622MM 0x27 | |
875 | +#define HE155SM 0x46 | |
881 | 876 | #define HE622SM 0x47 |
882 | 877 | #define MAC_ADDR 0x42 /* char[] */ |
883 | 878 |
drivers/atm/iphase.c
... | ... | @@ -2562,17 +2562,11 @@ |
2562 | 2562 | error = suni_init(dev); |
2563 | 2563 | if (error) |
2564 | 2564 | goto err_free_rx; |
2565 | - /* | |
2566 | - * Enable interrupt on loss of signal | |
2567 | - * SUNI_RSOP_CIE - 0x10 | |
2568 | - * SUNI_RSOP_CIE_LOSE - 0x04 | |
2569 | - */ | |
2570 | - ia_phy_put(dev, ia_phy_get(dev, 0x10) | 0x04, 0x10); | |
2571 | -#ifndef MODULE | |
2572 | - error = dev->phy->start(dev); | |
2573 | - if (error) | |
2574 | - goto err_free_rx; | |
2575 | -#endif | |
2565 | + if (dev->phy->start) { | |
2566 | + error = dev->phy->start(dev); | |
2567 | + if (error) | |
2568 | + goto err_free_rx; | |
2569 | + } | |
2576 | 2570 | /* Get iadev->carrier_detect status */ |
2577 | 2571 | IaFrontEndIntr(iadev); |
2578 | 2572 | } |
... | ... | @@ -3198,6 +3192,8 @@ |
3198 | 3192 | IF_INIT(printk("dev_id = 0x%x iadev->LineRate = %d \n", (u32)dev, |
3199 | 3193 | iadev->LineRate);) |
3200 | 3194 | |
3195 | + pci_set_drvdata(pdev, dev); | |
3196 | + | |
3201 | 3197 | ia_dev[iadev_count] = iadev; |
3202 | 3198 | _ia_dev[iadev_count] = dev; |
3203 | 3199 | iadev_count++; |
... | ... | @@ -3219,8 +3215,6 @@ |
3219 | 3215 | iadev->next_board = ia_boards; |
3220 | 3216 | ia_boards = dev; |
3221 | 3217 | |
3222 | - pci_set_drvdata(pdev, dev); | |
3223 | - | |
3224 | 3218 | return 0; |
3225 | 3219 | |
3226 | 3220 | err_out_deregister_dev: |
3227 | 3221 | |
... | ... | @@ -3238,8 +3232,13 @@ |
3238 | 3232 | struct atm_dev *dev = pci_get_drvdata(pdev); |
3239 | 3233 | IADEV *iadev = INPH_IA_DEV(dev); |
3240 | 3234 | |
3241 | - ia_phy_put(dev, ia_phy_get(dev,0x10) & ~(0x4), 0x10); | |
3235 | + /* Disable phy interrupts */ | |
3236 | + ia_phy_put(dev, ia_phy_get(dev, SUNI_RSOP_CIE) & ~(SUNI_RSOP_CIE_LOSE), | |
3237 | + SUNI_RSOP_CIE); | |
3242 | 3238 | udelay(1); |
3239 | + | |
3240 | + if (dev->phy && dev->phy->stop) | |
3241 | + dev->phy->stop(dev); | |
3243 | 3242 | |
3244 | 3243 | /* De-register device */ |
3245 | 3244 | free_irq(iadev->irq, dev); |
drivers/net/wireless/b43/b43.h
drivers/net/wireless/b43/dma.c
... | ... | @@ -795,24 +795,49 @@ |
795 | 795 | { |
796 | 796 | struct b43_dmaring *ring; |
797 | 797 | int err; |
798 | - int nr_slots; | |
799 | 798 | dma_addr_t dma_test; |
800 | 799 | |
801 | 800 | ring = kzalloc(sizeof(*ring), GFP_KERNEL); |
802 | 801 | if (!ring) |
803 | 802 | goto out; |
804 | - ring->type = type; | |
805 | 803 | |
806 | - nr_slots = B43_RXRING_SLOTS; | |
804 | + ring->nr_slots = B43_RXRING_SLOTS; | |
807 | 805 | if (for_tx) |
808 | - nr_slots = B43_TXRING_SLOTS; | |
806 | + ring->nr_slots = B43_TXRING_SLOTS; | |
809 | 807 | |
810 | - ring->meta = kcalloc(nr_slots, sizeof(struct b43_dmadesc_meta), | |
808 | + ring->meta = kcalloc(ring->nr_slots, sizeof(struct b43_dmadesc_meta), | |
811 | 809 | GFP_KERNEL); |
812 | 810 | if (!ring->meta) |
813 | 811 | goto err_kfree_ring; |
812 | + | |
813 | + ring->type = type; | |
814 | + ring->dev = dev; | |
815 | + ring->mmio_base = b43_dmacontroller_base(type, controller_index); | |
816 | + ring->index = controller_index; | |
817 | + if (type == B43_DMA_64BIT) | |
818 | + ring->ops = &dma64_ops; | |
819 | + else | |
820 | + ring->ops = &dma32_ops; | |
814 | 821 | if (for_tx) { |
815 | - ring->txhdr_cache = kcalloc(nr_slots, | |
822 | + ring->tx = 1; | |
823 | + ring->current_slot = -1; | |
824 | + } else { | |
825 | + if (ring->index == 0) { | |
826 | + ring->rx_buffersize = B43_DMA0_RX_BUFFERSIZE; | |
827 | + ring->frameoffset = B43_DMA0_RX_FRAMEOFFSET; | |
828 | + } else if (ring->index == 3) { | |
829 | + ring->rx_buffersize = B43_DMA3_RX_BUFFERSIZE; | |
830 | + ring->frameoffset = B43_DMA3_RX_FRAMEOFFSET; | |
831 | + } else | |
832 | + B43_WARN_ON(1); | |
833 | + } | |
834 | + spin_lock_init(&ring->lock); | |
835 | +#ifdef CONFIG_B43_DEBUG | |
836 | + ring->last_injected_overflow = jiffies; | |
837 | +#endif | |
838 | + | |
839 | + if (for_tx) { | |
840 | + ring->txhdr_cache = kcalloc(ring->nr_slots, | |
816 | 841 | b43_txhdr_size(dev), |
817 | 842 | GFP_KERNEL); |
818 | 843 | if (!ring->txhdr_cache) |
... | ... | @@ -828,7 +853,7 @@ |
828 | 853 | b43_txhdr_size(dev), 1)) { |
829 | 854 | /* ugh realloc */ |
830 | 855 | kfree(ring->txhdr_cache); |
831 | - ring->txhdr_cache = kcalloc(nr_slots, | |
856 | + ring->txhdr_cache = kcalloc(ring->nr_slots, | |
832 | 857 | b43_txhdr_size(dev), |
833 | 858 | GFP_KERNEL | GFP_DMA); |
834 | 859 | if (!ring->txhdr_cache) |
... | ... | @@ -852,32 +877,6 @@ |
852 | 877 | dma_test, b43_txhdr_size(dev), |
853 | 878 | DMA_TO_DEVICE); |
854 | 879 | } |
855 | - | |
856 | - ring->dev = dev; | |
857 | - ring->nr_slots = nr_slots; | |
858 | - ring->mmio_base = b43_dmacontroller_base(type, controller_index); | |
859 | - ring->index = controller_index; | |
860 | - if (type == B43_DMA_64BIT) | |
861 | - ring->ops = &dma64_ops; | |
862 | - else | |
863 | - ring->ops = &dma32_ops; | |
864 | - if (for_tx) { | |
865 | - ring->tx = 1; | |
866 | - ring->current_slot = -1; | |
867 | - } else { | |
868 | - if (ring->index == 0) { | |
869 | - ring->rx_buffersize = B43_DMA0_RX_BUFFERSIZE; | |
870 | - ring->frameoffset = B43_DMA0_RX_FRAMEOFFSET; | |
871 | - } else if (ring->index == 3) { | |
872 | - ring->rx_buffersize = B43_DMA3_RX_BUFFERSIZE; | |
873 | - ring->frameoffset = B43_DMA3_RX_FRAMEOFFSET; | |
874 | - } else | |
875 | - B43_WARN_ON(1); | |
876 | - } | |
877 | - spin_lock_init(&ring->lock); | |
878 | -#ifdef CONFIG_B43_DEBUG | |
879 | - ring->last_injected_overflow = jiffies; | |
880 | -#endif | |
881 | 880 | |
882 | 881 | err = alloc_ringmemory(ring); |
883 | 882 | if (err) |
drivers/net/wireless/b43/main.c
... | ... | @@ -1145,7 +1145,6 @@ |
1145 | 1145 | b43_jssi_write(dev, 0x7F7F7F7F); |
1146 | 1146 | b43_write32(dev, B43_MMIO_MACCMD, |
1147 | 1147 | b43_read32(dev, B43_MMIO_MACCMD) | B43_MACCMD_BGNOISE); |
1148 | - B43_WARN_ON(dev->noisecalc.channel_at_start != dev->phy.channel); | |
1149 | 1148 | } |
1150 | 1149 | |
1151 | 1150 | static void b43_calculate_link_quality(struct b43_wldev *dev) |
... | ... | @@ -1154,7 +1153,6 @@ |
1154 | 1153 | |
1155 | 1154 | if (dev->noisecalc.calculation_running) |
1156 | 1155 | return; |
1157 | - dev->noisecalc.channel_at_start = dev->phy.channel; | |
1158 | 1156 | dev->noisecalc.calculation_running = 1; |
1159 | 1157 | dev->noisecalc.nr_samples = 0; |
1160 | 1158 | |
1161 | 1159 | |
... | ... | @@ -1171,9 +1169,16 @@ |
1171 | 1169 | |
1172 | 1170 | /* Bottom half of Link Quality calculation. */ |
1173 | 1171 | |
1172 | + /* Possible race condition: It might be possible that the user | |
1173 | + * changed to a different channel in the meantime since we | |
1174 | + * started the calculation. We ignore that fact, since it's | |
1175 | + * not really that much of a problem. The background noise is | |
1176 | + * an estimation only anyway. Slightly wrong results will get damped | |
1177 | + * by the averaging of the 8 sample rounds. Additionally the | |
1178 | + * value is shortlived. So it will be replaced by the next noise | |
1179 | + * calculation round soon. */ | |
1180 | + | |
1174 | 1181 | B43_WARN_ON(!dev->noisecalc.calculation_running); |
1175 | - if (dev->noisecalc.channel_at_start != phy->channel) | |
1176 | - goto drop_calculation; | |
1177 | 1182 | *((__le32 *)noise) = cpu_to_le32(b43_jssi_read(dev)); |
1178 | 1183 | if (noise[0] == 0x7F || noise[1] == 0x7F || |
1179 | 1184 | noise[2] == 0x7F || noise[3] == 0x7F) |
1180 | 1185 | |
... | ... | @@ -1214,11 +1219,10 @@ |
1214 | 1219 | average -= 48; |
1215 | 1220 | |
1216 | 1221 | dev->stats.link_noise = average; |
1217 | - drop_calculation: | |
1218 | 1222 | dev->noisecalc.calculation_running = 0; |
1219 | 1223 | return; |
1220 | 1224 | } |
1221 | - generate_new: | |
1225 | +generate_new: | |
1222 | 1226 | b43_generate_noise_sample(dev); |
1223 | 1227 | } |
1224 | 1228 |
drivers/net/wireless/rt2x00/Kconfig
... | ... | @@ -36,12 +36,13 @@ |
36 | 36 | config RT2X00_LIB_RFKILL |
37 | 37 | boolean |
38 | 38 | depends on RT2X00_LIB |
39 | + depends on INPUT | |
39 | 40 | select RFKILL |
40 | 41 | select INPUT_POLLDEV |
41 | 42 | |
42 | 43 | config RT2X00_LIB_LEDS |
43 | 44 | boolean |
44 | - depends on RT2X00_LIB | |
45 | + depends on RT2X00_LIB && NEW_LEDS | |
45 | 46 | |
46 | 47 | config RT2400PCI |
47 | 48 | tristate "Ralink rt2400 (PCI/PCMCIA) support" |
... | ... | @@ -56,7 +57,7 @@ |
56 | 57 | |
57 | 58 | config RT2400PCI_RFKILL |
58 | 59 | bool "Ralink rt2400 rfkill support" |
59 | - depends on RT2400PCI | |
60 | + depends on RT2400PCI && INPUT | |
60 | 61 | select RT2X00_LIB_RFKILL |
61 | 62 | ---help--- |
62 | 63 | This adds support for integrated rt2400 hardware that features a |
... | ... | @@ -65,7 +66,7 @@ |
65 | 66 | |
66 | 67 | config RT2400PCI_LEDS |
67 | 68 | bool "Ralink rt2400 leds support" |
68 | - depends on RT2400PCI | |
69 | + depends on RT2400PCI && NEW_LEDS | |
69 | 70 | select LEDS_CLASS |
70 | 71 | select RT2X00_LIB_LEDS |
71 | 72 | ---help--- |
... | ... | @@ -84,7 +85,7 @@ |
84 | 85 | |
85 | 86 | config RT2500PCI_RFKILL |
86 | 87 | bool "Ralink rt2500 rfkill support" |
87 | - depends on RT2500PCI | |
88 | + depends on RT2500PCI && INPUT | |
88 | 89 | select RT2X00_LIB_RFKILL |
89 | 90 | ---help--- |
90 | 91 | This adds support for integrated rt2500 hardware that features a |
... | ... | @@ -93,7 +94,7 @@ |
93 | 94 | |
94 | 95 | config RT2500PCI_LEDS |
95 | 96 | bool "Ralink rt2500 leds support" |
96 | - depends on RT2500PCI | |
97 | + depends on RT2500PCI && NEW_LEDS | |
97 | 98 | select LEDS_CLASS |
98 | 99 | select RT2X00_LIB_LEDS |
99 | 100 | ---help--- |
... | ... | @@ -114,7 +115,7 @@ |
114 | 115 | |
115 | 116 | config RT61PCI_RFKILL |
116 | 117 | bool "Ralink rt2501/rt61 rfkill support" |
117 | - depends on RT61PCI | |
118 | + depends on RT61PCI && INPUT | |
118 | 119 | select RT2X00_LIB_RFKILL |
119 | 120 | ---help--- |
120 | 121 | This adds support for integrated rt61 hardware that features a |
... | ... | @@ -123,7 +124,7 @@ |
123 | 124 | |
124 | 125 | config RT61PCI_LEDS |
125 | 126 | bool "Ralink rt2501/rt61 leds support" |
126 | - depends on RT61PCI | |
127 | + depends on RT61PCI && NEW_LEDS | |
127 | 128 | select LEDS_CLASS |
128 | 129 | select RT2X00_LIB_LEDS |
129 | 130 | ---help--- |
... | ... | @@ -141,7 +142,7 @@ |
141 | 142 | |
142 | 143 | config RT2500USB_LEDS |
143 | 144 | bool "Ralink rt2500 leds support" |
144 | - depends on RT2500USB | |
145 | + depends on RT2500USB && NEW_LEDS | |
145 | 146 | select LEDS_CLASS |
146 | 147 | select RT2X00_LIB_LEDS |
147 | 148 | ---help--- |
... | ... | @@ -161,7 +162,7 @@ |
161 | 162 | |
162 | 163 | config RT73USB_LEDS |
163 | 164 | bool "Ralink rt2501/rt73 leds support" |
164 | - depends on RT73USB | |
165 | + depends on RT73USB && NEW_LEDS | |
165 | 166 | select LEDS_CLASS |
166 | 167 | select RT2X00_LIB_LEDS |
167 | 168 | ---help--- |
drivers/net/wireless/rt2x00/rt2x00pci.c
... | ... | @@ -357,8 +357,7 @@ |
357 | 357 | if (pci_set_mwi(pci_dev)) |
358 | 358 | ERROR_PROBE("MWI not available.\n"); |
359 | 359 | |
360 | - if (pci_set_dma_mask(pci_dev, DMA_64BIT_MASK) && | |
361 | - pci_set_dma_mask(pci_dev, DMA_32BIT_MASK)) { | |
360 | + if (pci_set_dma_mask(pci_dev, DMA_32BIT_MASK)) { | |
362 | 361 | ERROR_PROBE("PCI DMA not supported.\n"); |
363 | 362 | retval = -EIO; |
364 | 363 | goto exit_disable_device; |
drivers/net/wireless/rt2x00/rt2x00usb.c
... | ... | @@ -345,8 +345,11 @@ |
345 | 345 | } |
346 | 346 | |
347 | 347 | /* |
348 | - * Kill guardian urb. | |
348 | + * Kill guardian urb (if required by driver). | |
349 | 349 | */ |
350 | + if (!test_bit(DRIVER_REQUIRE_BEACON_GUARD, &rt2x00dev->flags)) | |
351 | + return; | |
352 | + | |
350 | 353 | for (i = 0; i < rt2x00dev->bcn->limit; i++) { |
351 | 354 | bcn_priv = rt2x00dev->bcn->entries[i].priv_data; |
352 | 355 | if (bcn_priv->guardian_urb) |
drivers/net/wireless/rt2x00/rt73usb.c
... | ... | @@ -2114,6 +2114,7 @@ |
2114 | 2114 | /* D-Link */ |
2115 | 2115 | { USB_DEVICE(0x07d1, 0x3c03), USB_DEVICE_DATA(&rt73usb_ops) }, |
2116 | 2116 | { USB_DEVICE(0x07d1, 0x3c04), USB_DEVICE_DATA(&rt73usb_ops) }, |
2117 | + { USB_DEVICE(0x07d1, 0x3c06), USB_DEVICE_DATA(&rt73usb_ops) }, | |
2117 | 2118 | { USB_DEVICE(0x07d1, 0x3c07), USB_DEVICE_DATA(&rt73usb_ops) }, |
2118 | 2119 | /* Gemtek */ |
2119 | 2120 | { USB_DEVICE(0x15a9, 0x0004), USB_DEVICE_DATA(&rt73usb_ops) }, |
drivers/ssb/main.c
... | ... | @@ -1168,15 +1168,21 @@ |
1168 | 1168 | int ssb_dma_set_mask(struct ssb_device *ssb_dev, u64 mask) |
1169 | 1169 | { |
1170 | 1170 | struct device *dma_dev = ssb_dev->dma_dev; |
1171 | + int err = 0; | |
1171 | 1172 | |
1172 | 1173 | #ifdef CONFIG_SSB_PCIHOST |
1173 | - if (ssb_dev->bus->bustype == SSB_BUSTYPE_PCI) | |
1174 | - return dma_set_mask(dma_dev, mask); | |
1174 | + if (ssb_dev->bus->bustype == SSB_BUSTYPE_PCI) { | |
1175 | + err = pci_set_dma_mask(ssb_dev->bus->host_pci, mask); | |
1176 | + if (err) | |
1177 | + return err; | |
1178 | + err = pci_set_consistent_dma_mask(ssb_dev->bus->host_pci, mask); | |
1179 | + return err; | |
1180 | + } | |
1175 | 1181 | #endif |
1176 | 1182 | dma_dev->coherent_dma_mask = mask; |
1177 | 1183 | dma_dev->dma_mask = &dma_dev->coherent_dma_mask; |
1178 | 1184 | |
1179 | - return 0; | |
1185 | + return err; | |
1180 | 1186 | } |
1181 | 1187 | EXPORT_SYMBOL(ssb_dma_set_mask); |
1182 | 1188 |
include/linux/if_tunnel.h
net/atm/br2684.c
... | ... | @@ -188,10 +188,13 @@ |
188 | 188 | return 0; |
189 | 189 | } |
190 | 190 | } |
191 | - } else { | |
192 | - skb_push(skb, 2); | |
193 | - if (brdev->payload == p_bridged) | |
191 | + } else { /* e_vc */ | |
192 | + if (brdev->payload == p_bridged) { | |
193 | + skb_push(skb, 2); | |
194 | 194 | memset(skb->data, 0, 2); |
195 | + } else { /* p_routed */ | |
196 | + skb_pull(skb, ETH_HLEN); | |
197 | + } | |
195 | 198 | } |
196 | 199 | skb_debug(skb); |
197 | 200 | |
... | ... | @@ -377,11 +380,8 @@ |
377 | 380 | (skb->data + 6, ethertype_ipv4, |
378 | 381 | sizeof(ethertype_ipv4)) == 0) |
379 | 382 | skb->protocol = __constant_htons(ETH_P_IP); |
380 | - else { | |
381 | - brdev->stats.rx_errors++; | |
382 | - dev_kfree_skb(skb); | |
383 | - return; | |
384 | - } | |
383 | + else | |
384 | + goto error; | |
385 | 385 | skb_pull(skb, sizeof(llc_oui_ipv4)); |
386 | 386 | skb_reset_network_header(skb); |
387 | 387 | skb->pkt_type = PACKET_HOST; |
388 | 388 | |
389 | 389 | |
390 | 390 | |
391 | 391 | |
392 | 392 | |
... | ... | @@ -394,44 +394,56 @@ |
394 | 394 | (memcmp(skb->data, llc_oui_pid_pad, 7) == 0)) { |
395 | 395 | skb_pull(skb, sizeof(llc_oui_pid_pad)); |
396 | 396 | skb->protocol = eth_type_trans(skb, net_dev); |
397 | - } else { | |
398 | - brdev->stats.rx_errors++; | |
399 | - dev_kfree_skb(skb); | |
400 | - return; | |
401 | - } | |
397 | + } else | |
398 | + goto error; | |
402 | 399 | |
403 | - } else { | |
404 | - /* first 2 chars should be 0 */ | |
405 | - if (*((u16 *) (skb->data)) != 0) { | |
406 | - brdev->stats.rx_errors++; | |
407 | - dev_kfree_skb(skb); | |
408 | - return; | |
400 | + } else { /* e_vc */ | |
401 | + if (brdev->payload == p_routed) { | |
402 | + struct iphdr *iph; | |
403 | + | |
404 | + skb_reset_network_header(skb); | |
405 | + iph = ip_hdr(skb); | |
406 | + if (iph->version == 4) | |
407 | + skb->protocol = __constant_htons(ETH_P_IP); | |
408 | + else if (iph->version == 6) | |
409 | + skb->protocol = __constant_htons(ETH_P_IPV6); | |
410 | + else | |
411 | + goto error; | |
412 | + skb->pkt_type = PACKET_HOST; | |
413 | + } else { /* p_bridged */ | |
414 | + /* first 2 chars should be 0 */ | |
415 | + if (*((u16 *) (skb->data)) != 0) | |
416 | + goto error; | |
417 | + skb_pull(skb, BR2684_PAD_LEN); | |
418 | + skb->protocol = eth_type_trans(skb, net_dev); | |
409 | 419 | } |
410 | - skb_pull(skb, BR2684_PAD_LEN + ETH_HLEN); /* pad, dstmac, srcmac, ethtype */ | |
411 | - skb->protocol = eth_type_trans(skb, net_dev); | |
412 | 420 | } |
413 | 421 | |
414 | 422 | #ifdef CONFIG_ATM_BR2684_IPFILTER |
415 | - if (unlikely(packet_fails_filter(skb->protocol, brvcc, skb))) { | |
416 | - brdev->stats.rx_dropped++; | |
417 | - dev_kfree_skb(skb); | |
418 | - return; | |
419 | - } | |
423 | + if (unlikely(packet_fails_filter(skb->protocol, brvcc, skb))) | |
424 | + goto dropped; | |
420 | 425 | #endif /* CONFIG_ATM_BR2684_IPFILTER */ |
421 | 426 | skb->dev = net_dev; |
422 | 427 | ATM_SKB(skb)->vcc = atmvcc; /* needed ? */ |
423 | 428 | pr_debug("received packet's protocol: %x\n", ntohs(skb->protocol)); |
424 | 429 | skb_debug(skb); |
425 | - if (unlikely(!(net_dev->flags & IFF_UP))) { | |
426 | - /* sigh, interface is down */ | |
427 | - brdev->stats.rx_dropped++; | |
428 | - dev_kfree_skb(skb); | |
429 | - return; | |
430 | - } | |
430 | + /* sigh, interface is down? */ | |
431 | + if (unlikely(!(net_dev->flags & IFF_UP))) | |
432 | + goto dropped; | |
431 | 433 | brdev->stats.rx_packets++; |
432 | 434 | brdev->stats.rx_bytes += skb->len; |
433 | 435 | memset(ATM_SKB(skb), 0, sizeof(struct atm_skb_data)); |
434 | 436 | netif_rx(skb); |
437 | + return; | |
438 | + | |
439 | +dropped: | |
440 | + brdev->stats.rx_dropped++; | |
441 | + goto free_skb; | |
442 | +error: | |
443 | + brdev->stats.rx_errors++; | |
444 | +free_skb: | |
445 | + dev_kfree_skb(skb); | |
446 | + return; | |
435 | 447 | } |
436 | 448 | |
437 | 449 | /* |
438 | 450 | |
... | ... | @@ -518,9 +530,9 @@ |
518 | 530 | struct sk_buff *next = skb->next; |
519 | 531 | |
520 | 532 | skb->next = skb->prev = NULL; |
533 | + br2684_push(atmvcc, skb); | |
521 | 534 | BRPRIV(skb->dev)->stats.rx_bytes -= skb->len; |
522 | 535 | BRPRIV(skb->dev)->stats.rx_packets--; |
523 | - br2684_push(atmvcc, skb); | |
524 | 536 | |
525 | 537 | skb = next; |
526 | 538 | } |
net/core/dev.c
... | ... | @@ -119,6 +119,7 @@ |
119 | 119 | #include <linux/err.h> |
120 | 120 | #include <linux/ctype.h> |
121 | 121 | #include <linux/if_arp.h> |
122 | +#include <linux/if_vlan.h> | |
122 | 123 | |
123 | 124 | #include "net-sysfs.h" |
124 | 125 | |
125 | 126 | |
... | ... | @@ -1362,7 +1363,30 @@ |
1362 | 1363 | } |
1363 | 1364 | EXPORT_SYMBOL(netif_device_attach); |
1364 | 1365 | |
1366 | +static bool can_checksum_protocol(unsigned long features, __be16 protocol) | |
1367 | +{ | |
1368 | + return ((features & NETIF_F_GEN_CSUM) || | |
1369 | + ((features & NETIF_F_IP_CSUM) && | |
1370 | + protocol == htons(ETH_P_IP)) || | |
1371 | + ((features & NETIF_F_IPV6_CSUM) && | |
1372 | + protocol == htons(ETH_P_IPV6))); | |
1373 | +} | |
1365 | 1374 | |
1375 | +static bool dev_can_checksum(struct net_device *dev, struct sk_buff *skb) | |
1376 | +{ | |
1377 | + if (can_checksum_protocol(dev->features, skb->protocol)) | |
1378 | + return true; | |
1379 | + | |
1380 | + if (skb->protocol == htons(ETH_P_8021Q)) { | |
1381 | + struct vlan_ethhdr *veh = (struct vlan_ethhdr *)skb->data; | |
1382 | + if (can_checksum_protocol(dev->features & dev->vlan_features, | |
1383 | + veh->h_vlan_encapsulated_proto)) | |
1384 | + return true; | |
1385 | + } | |
1386 | + | |
1387 | + return false; | |
1388 | +} | |
1389 | + | |
1366 | 1390 | /* |
1367 | 1391 | * Invalidate hardware checksum when packet is to be mangled, and |
1368 | 1392 | * complete checksum manually on outgoing path. |
... | ... | @@ -1640,14 +1664,8 @@ |
1640 | 1664 | if (skb->ip_summed == CHECKSUM_PARTIAL) { |
1641 | 1665 | skb_set_transport_header(skb, skb->csum_start - |
1642 | 1666 | skb_headroom(skb)); |
1643 | - | |
1644 | - if (!(dev->features & NETIF_F_GEN_CSUM) && | |
1645 | - !((dev->features & NETIF_F_IP_CSUM) && | |
1646 | - skb->protocol == htons(ETH_P_IP)) && | |
1647 | - !((dev->features & NETIF_F_IPV6_CSUM) && | |
1648 | - skb->protocol == htons(ETH_P_IPV6))) | |
1649 | - if (skb_checksum_help(skb)) | |
1650 | - goto out_kfree_skb; | |
1667 | + if (!dev_can_checksum(dev, skb) && skb_checksum_help(skb)) | |
1668 | + goto out_kfree_skb; | |
1651 | 1669 | } |
1652 | 1670 | |
1653 | 1671 | gso: |
net/ipv4/inet_connection_sock.c
... | ... | @@ -468,9 +468,9 @@ |
468 | 468 | reqp=&lopt->syn_table[i]; |
469 | 469 | while ((req = *reqp) != NULL) { |
470 | 470 | if (time_after_eq(now, req->expires)) { |
471 | - if ((req->retrans < (inet_rsk(req)->acked ? max_retries : thresh)) && | |
472 | - (inet_rsk(req)->acked || | |
473 | - !req->rsk_ops->rtx_syn_ack(parent, req))) { | |
471 | + if ((req->retrans < thresh || | |
472 | + (inet_rsk(req)->acked && req->retrans < max_retries)) | |
473 | + && !req->rsk_ops->rtx_syn_ack(parent, req)) { | |
474 | 474 | unsigned long timeo; |
475 | 475 | |
476 | 476 | if (req->retrans++ == 0) |
net/ipv4/raw.c
... | ... | @@ -931,7 +931,7 @@ |
931 | 931 | srcp = inet->num; |
932 | 932 | |
933 | 933 | seq_printf(seq, "%4d: %08X:%04X %08X:%04X" |
934 | - " %02X %08X:%08X %02X:%08lX %08X %5d %8d %lu %d %p %d", | |
934 | + " %02X %08X:%08X %02X:%08lX %08X %5d %8d %lu %d %p %d\n", | |
935 | 935 | i, src, srcp, dest, destp, sp->sk_state, |
936 | 936 | atomic_read(&sp->sk_wmem_alloc), |
937 | 937 | atomic_read(&sp->sk_rmem_alloc), |
net/ipv4/tcp_ipv4.c
... | ... | @@ -83,10 +83,6 @@ |
83 | 83 | int sysctl_tcp_tw_reuse __read_mostly; |
84 | 84 | int sysctl_tcp_low_latency __read_mostly; |
85 | 85 | |
86 | -/* Check TCP sequence numbers in ICMP packets. */ | |
87 | -#define ICMP_MIN_LENGTH 8 | |
88 | - | |
89 | -void tcp_v4_send_check(struct sock *sk, int len, struct sk_buff *skb); | |
90 | 86 | |
91 | 87 | #ifdef CONFIG_TCP_MD5SIG |
92 | 88 | static struct tcp_md5sig_key *tcp_v4_md5_do_lookup(struct sock *sk, |
net/ipv6/sit.c
... | ... | @@ -220,15 +220,18 @@ |
220 | 220 | |
221 | 221 | } |
222 | 222 | |
223 | -static int ipip6_tunnel_get_prl(struct ip_tunnel *t, struct ip_tunnel_prl *a) | |
223 | +static int ipip6_tunnel_get_prl(struct ip_tunnel *t, | |
224 | + struct ip_tunnel_prl __user *a) | |
224 | 225 | { |
225 | - struct ip_tunnel_prl *kp; | |
226 | + struct ip_tunnel_prl kprl, *kp; | |
226 | 227 | struct ip_tunnel_prl_entry *prl; |
227 | 228 | unsigned int cmax, c = 0, ca, len; |
228 | 229 | int ret = 0; |
229 | 230 | |
230 | - cmax = a->datalen / sizeof(*a); | |
231 | - if (cmax > 1 && a->addr != htonl(INADDR_ANY)) | |
231 | + if (copy_from_user(&kprl, a, sizeof(kprl))) | |
232 | + return -EFAULT; | |
233 | + cmax = kprl.datalen / sizeof(kprl); | |
234 | + if (cmax > 1 && kprl.addr != htonl(INADDR_ANY)) | |
232 | 235 | cmax = 1; |
233 | 236 | |
234 | 237 | /* For simple GET or for root users, |
235 | 238 | |
236 | 239 | |
237 | 240 | |
238 | 241 | |
... | ... | @@ -259,26 +262,25 @@ |
259 | 262 | for (prl = t->prl; prl; prl = prl->next) { |
260 | 263 | if (c > cmax) |
261 | 264 | break; |
262 | - if (a->addr != htonl(INADDR_ANY) && prl->addr != a->addr) | |
265 | + if (kprl.addr != htonl(INADDR_ANY) && prl->addr != kprl.addr) | |
263 | 266 | continue; |
264 | 267 | kp[c].addr = prl->addr; |
265 | 268 | kp[c].flags = prl->flags; |
266 | 269 | c++; |
267 | - if (a->addr != htonl(INADDR_ANY)) | |
270 | + if (kprl.addr != htonl(INADDR_ANY)) | |
268 | 271 | break; |
269 | 272 | } |
270 | 273 | out: |
271 | 274 | read_unlock(&ipip6_lock); |
272 | 275 | |
273 | 276 | len = sizeof(*kp) * c; |
274 | - ret = len ? copy_to_user(a->data, kp, len) : 0; | |
277 | + ret = 0; | |
278 | + if ((len && copy_to_user(a + 1, kp, len)) || put_user(len, &a->datalen)) | |
279 | + ret = -EFAULT; | |
275 | 280 | |
276 | 281 | kfree(kp); |
277 | - if (ret) | |
278 | - return -EFAULT; | |
279 | 282 | |
280 | - a->datalen = len; | |
281 | - return 0; | |
283 | + return ret; | |
282 | 284 | } |
283 | 285 | |
284 | 286 | static int |
285 | 287 | |
... | ... | @@ -871,11 +873,20 @@ |
871 | 873 | break; |
872 | 874 | |
873 | 875 | case SIOCGETPRL: |
876 | + err = -EINVAL; | |
877 | + if (dev == sitn->fb_tunnel_dev) | |
878 | + goto done; | |
879 | + err = -ENOENT; | |
880 | + if (!(t = netdev_priv(dev))) | |
881 | + goto done; | |
882 | + err = ipip6_tunnel_get_prl(t, ifr->ifr_ifru.ifru_data); | |
883 | + break; | |
884 | + | |
874 | 885 | case SIOCADDPRL: |
875 | 886 | case SIOCDELPRL: |
876 | 887 | case SIOCCHGPRL: |
877 | 888 | err = -EPERM; |
878 | - if (cmd != SIOCGETPRL && !capable(CAP_NET_ADMIN)) | |
889 | + if (!capable(CAP_NET_ADMIN)) | |
879 | 890 | goto done; |
880 | 891 | err = -EINVAL; |
881 | 892 | if (dev == sitn->fb_tunnel_dev) |
... | ... | @@ -888,12 +899,6 @@ |
888 | 899 | goto done; |
889 | 900 | |
890 | 901 | switch (cmd) { |
891 | - case SIOCGETPRL: | |
892 | - err = ipip6_tunnel_get_prl(t, &prl); | |
893 | - if (!err && copy_to_user(ifr->ifr_ifru.ifru_data, | |
894 | - &prl, sizeof(prl))) | |
895 | - err = -EFAULT; | |
896 | - break; | |
897 | 902 | case SIOCDELPRL: |
898 | 903 | err = ipip6_tunnel_del_prl(t, &prl); |
899 | 904 | break; |
... | ... | @@ -902,8 +907,7 @@ |
902 | 907 | err = ipip6_tunnel_add_prl(t, &prl, cmd == SIOCCHGPRL); |
903 | 908 | break; |
904 | 909 | } |
905 | - if (cmd != SIOCGETPRL) | |
906 | - netdev_state_change(dev); | |
910 | + netdev_state_change(dev); | |
907 | 911 | break; |
908 | 912 | |
909 | 913 | default: |
net/mac80211/wext.c
... | ... | @@ -508,7 +508,8 @@ |
508 | 508 | sdata = IEEE80211_DEV_TO_SUB_IF(dev); |
509 | 509 | if (sdata->vif.type == IEEE80211_IF_TYPE_STA || |
510 | 510 | sdata->vif.type == IEEE80211_IF_TYPE_IBSS) { |
511 | - if (sdata->u.sta.state == IEEE80211_ASSOCIATED) { | |
511 | + if (sdata->u.sta.state == IEEE80211_ASSOCIATED || | |
512 | + sdata->u.sta.state == IEEE80211_IBSS_JOINED) { | |
512 | 513 | ap_addr->sa_family = ARPHRD_ETHER; |
513 | 514 | memcpy(&ap_addr->sa_data, sdata->u.sta.bssid, ETH_ALEN); |
514 | 515 | return 0; |
net/mac80211/wme.c
... | ... | @@ -637,7 +637,7 @@ |
637 | 637 | #ifdef CONFIG_MAC80211_HT_DEBUG |
638 | 638 | if (net_ratelimit()) |
639 | 639 | printk(KERN_DEBUG "allocated aggregation queue" |
640 | - " %d tid %d addr %s pool=0x%lX", | |
640 | + " %d tid %d addr %s pool=0x%lX\n", | |
641 | 641 | i, tid, print_mac(mac, sta->addr), |
642 | 642 | q->qdisc_pool[0]); |
643 | 643 | #endif /* CONFIG_MAC80211_HT_DEBUG */ |
net/sched/sch_htb.c
... | ... | @@ -26,6 +26,7 @@ |
26 | 26 | * and many others. thanks. |
27 | 27 | */ |
28 | 28 | #include <linux/module.h> |
29 | +#include <linux/moduleparam.h> | |
29 | 30 | #include <linux/types.h> |
30 | 31 | #include <linux/kernel.h> |
31 | 32 | #include <linux/string.h> |
32 | 33 | |
... | ... | @@ -51,13 +52,17 @@ |
51 | 52 | */ |
52 | 53 | |
53 | 54 | #define HTB_HSIZE 16 /* classid hash size */ |
54 | -#define HTB_HYSTERESIS 1 /* whether to use mode hysteresis for speedup */ | |
55 | +static int htb_hysteresis __read_mostly = 0; /* whether to use mode hysteresis for speedup */ | |
55 | 56 | #define HTB_VER 0x30011 /* major must be matched with number suplied by TC as version */ |
56 | 57 | |
57 | 58 | #if HTB_VER >> 16 != TC_HTB_PROTOVER |
58 | 59 | #error "Mismatched sch_htb.c and pkt_sch.h" |
59 | 60 | #endif |
60 | 61 | |
62 | +/* Module parameter and sysfs export */ | |
63 | +module_param (htb_hysteresis, int, 0640); | |
64 | +MODULE_PARM_DESC(htb_hysteresis, "Hysteresis mode, less CPU load, less accurate"); | |
65 | + | |
61 | 66 | /* used internaly to keep status of single class */ |
62 | 67 | enum htb_cmode { |
63 | 68 | HTB_CANT_SEND, /* class can't send and can't borrow */ |
64 | 69 | |
65 | 70 | |
66 | 71 | |
... | ... | @@ -460,19 +465,21 @@ |
460 | 465 | htb_remove_class_from_row(q, cl, mask); |
461 | 466 | } |
462 | 467 | |
463 | -#if HTB_HYSTERESIS | |
464 | 468 | static inline long htb_lowater(const struct htb_class *cl) |
465 | 469 | { |
466 | - return cl->cmode != HTB_CANT_SEND ? -cl->cbuffer : 0; | |
470 | + if (htb_hysteresis) | |
471 | + return cl->cmode != HTB_CANT_SEND ? -cl->cbuffer : 0; | |
472 | + else | |
473 | + return 0; | |
467 | 474 | } |
468 | 475 | static inline long htb_hiwater(const struct htb_class *cl) |
469 | 476 | { |
470 | - return cl->cmode == HTB_CAN_SEND ? -cl->buffer : 0; | |
477 | + if (htb_hysteresis) | |
478 | + return cl->cmode == HTB_CAN_SEND ? -cl->buffer : 0; | |
479 | + else | |
480 | + return 0; | |
471 | 481 | } |
472 | -#else | |
473 | -#define htb_lowater(cl) (0) | |
474 | -#define htb_hiwater(cl) (0) | |
475 | -#endif | |
482 | + | |
476 | 483 | |
477 | 484 | /** |
478 | 485 | * htb_class_mode - computes and returns current class mode |
net/sctp/associola.c
... | ... | @@ -476,6 +476,15 @@ |
476 | 476 | void sctp_assoc_set_primary(struct sctp_association *asoc, |
477 | 477 | struct sctp_transport *transport) |
478 | 478 | { |
479 | + int changeover = 0; | |
480 | + | |
481 | + /* it's a changeover only if we already have a primary path | |
482 | + * that we are changing | |
483 | + */ | |
484 | + if (asoc->peer.primary_path != NULL && | |
485 | + asoc->peer.primary_path != transport) | |
486 | + changeover = 1 ; | |
487 | + | |
479 | 488 | asoc->peer.primary_path = transport; |
480 | 489 | |
481 | 490 | /* Set a default msg_name for events. */ |
482 | 491 | |
... | ... | @@ -501,12 +510,12 @@ |
501 | 510 | * double switch to the same destination address. |
502 | 511 | */ |
503 | 512 | if (transport->cacc.changeover_active) |
504 | - transport->cacc.cycling_changeover = 1; | |
513 | + transport->cacc.cycling_changeover = changeover; | |
505 | 514 | |
506 | 515 | /* 2) The sender MUST set CHANGEOVER_ACTIVE to indicate that |
507 | 516 | * a changeover has occurred. |
508 | 517 | */ |
509 | - transport->cacc.changeover_active = 1; | |
518 | + transport->cacc.changeover_active = changeover; | |
510 | 519 | |
511 | 520 | /* 3) The sender MUST store the next TSN to be sent in |
512 | 521 | * next_tsn_at_change. |
net/sctp/protocol.c
... | ... | @@ -108,16 +108,27 @@ |
108 | 108 | } |
109 | 109 | |
110 | 110 | if (sctp_snmp_proc_init()) |
111 | - goto out_nomem; | |
111 | + goto out_snmp_proc_init; | |
112 | 112 | if (sctp_eps_proc_init()) |
113 | - goto out_nomem; | |
113 | + goto out_eps_proc_init; | |
114 | 114 | if (sctp_assocs_proc_init()) |
115 | - goto out_nomem; | |
115 | + goto out_assocs_proc_init; | |
116 | 116 | if (sctp_remaddr_proc_init()) |
117 | - goto out_nomem; | |
117 | + goto out_remaddr_proc_init; | |
118 | 118 | |
119 | 119 | return 0; |
120 | 120 | |
121 | +out_remaddr_proc_init: | |
122 | + sctp_remaddr_proc_exit(); | |
123 | +out_assocs_proc_init: | |
124 | + sctp_eps_proc_exit(); | |
125 | +out_eps_proc_init: | |
126 | + sctp_snmp_proc_exit(); | |
127 | +out_snmp_proc_init: | |
128 | + if (proc_net_sctp) { | |
129 | + proc_net_sctp = NULL; | |
130 | + remove_proc_entry("sctp", init_net.proc_net); | |
131 | + } | |
121 | 132 | out_nomem: |
122 | 133 | return -ENOMEM; |
123 | 134 | } |