diff options
37 files changed, 160 insertions, 194 deletions
diff --git a/MAINTAINERS b/MAINTAINERS index a1270978eb41..f08bac96c431 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
@@ -1521,8 +1521,8 @@ M: Gustavo Padovan <gustavo@padovan.org> | |||
1521 | M: Johan Hedberg <johan.hedberg@gmail.com> | 1521 | M: Johan Hedberg <johan.hedberg@gmail.com> |
1522 | L: linux-bluetooth@vger.kernel.org | 1522 | L: linux-bluetooth@vger.kernel.org |
1523 | W: http://www.bluez.org/ | 1523 | W: http://www.bluez.org/ |
1524 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/padovan/bluetooth.git | 1524 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth.git |
1525 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jh/bluetooth.git | 1525 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth-next.git |
1526 | S: Maintained | 1526 | S: Maintained |
1527 | F: drivers/bluetooth/ | 1527 | F: drivers/bluetooth/ |
1528 | 1528 | ||
@@ -1532,8 +1532,8 @@ M: Gustavo Padovan <gustavo@padovan.org> | |||
1532 | M: Johan Hedberg <johan.hedberg@gmail.com> | 1532 | M: Johan Hedberg <johan.hedberg@gmail.com> |
1533 | L: linux-bluetooth@vger.kernel.org | 1533 | L: linux-bluetooth@vger.kernel.org |
1534 | W: http://www.bluez.org/ | 1534 | W: http://www.bluez.org/ |
1535 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/padovan/bluetooth.git | 1535 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth.git |
1536 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/jh/bluetooth.git | 1536 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth-next.git |
1537 | S: Maintained | 1537 | S: Maintained |
1538 | F: net/bluetooth/ | 1538 | F: net/bluetooth/ |
1539 | F: include/net/bluetooth/ | 1539 | F: include/net/bluetooth/ |
@@ -4533,8 +4533,7 @@ S: Supported | |||
4533 | F: drivers/net/ethernet/myricom/myri10ge/ | 4533 | F: drivers/net/ethernet/myricom/myri10ge/ |
4534 | 4534 | ||
4535 | NATSEMI ETHERNET DRIVER (DP8381x) | 4535 | NATSEMI ETHERNET DRIVER (DP8381x) |
4536 | M: Tim Hockin <thockin@hockin.org> | 4536 | S: Orphan |
4537 | S: Maintained | ||
4538 | F: drivers/net/ethernet/natsemi/natsemi.c | 4537 | F: drivers/net/ethernet/natsemi/natsemi.c |
4539 | 4538 | ||
4540 | NATIVE INSTRUMENTS USB SOUND INTERFACE DRIVER | 4539 | NATIVE INSTRUMENTS USB SOUND INTERFACE DRIVER |
diff --git a/drivers/bcma/Kconfig b/drivers/bcma/Kconfig index c1172dafdffa..fb7c80fb721e 100644 --- a/drivers/bcma/Kconfig +++ b/drivers/bcma/Kconfig | |||
@@ -29,7 +29,7 @@ config BCMA_HOST_PCI | |||
29 | 29 | ||
30 | config BCMA_DRIVER_PCI_HOSTMODE | 30 | config BCMA_DRIVER_PCI_HOSTMODE |
31 | bool "Driver for PCI core working in hostmode" | 31 | bool "Driver for PCI core working in hostmode" |
32 | depends on BCMA && MIPS | 32 | depends on BCMA && MIPS && BCMA_HOST_PCI |
33 | help | 33 | help |
34 | PCI core hostmode operation (external PCI bus). | 34 | PCI core hostmode operation (external PCI bus). |
35 | 35 | ||
diff --git a/drivers/bcma/driver_pci_host.c b/drivers/bcma/driver_pci_host.c index 4e20bcfa7ec5..d2097a11c3c7 100644 --- a/drivers/bcma/driver_pci_host.c +++ b/drivers/bcma/driver_pci_host.c | |||
@@ -10,6 +10,7 @@ | |||
10 | */ | 10 | */ |
11 | 11 | ||
12 | #include "bcma_private.h" | 12 | #include "bcma_private.h" |
13 | #include <linux/pci.h> | ||
13 | #include <linux/export.h> | 14 | #include <linux/export.h> |
14 | #include <linux/bcma/bcma.h> | 15 | #include <linux/bcma/bcma.h> |
15 | #include <asm/paccess.h> | 16 | #include <asm/paccess.h> |
diff --git a/drivers/bluetooth/ath3k.c b/drivers/bluetooth/ath3k.c index 48442476ec00..ae9edca7b56d 100644 --- a/drivers/bluetooth/ath3k.c +++ b/drivers/bluetooth/ath3k.c | |||
@@ -72,7 +72,9 @@ static struct usb_device_id ath3k_table[] = { | |||
72 | 72 | ||
73 | /* Atheros AR3012 with sflash firmware*/ | 73 | /* Atheros AR3012 with sflash firmware*/ |
74 | { USB_DEVICE(0x0CF3, 0x3004) }, | 74 | { USB_DEVICE(0x0CF3, 0x3004) }, |
75 | { USB_DEVICE(0x0CF3, 0x311D) }, | ||
75 | { USB_DEVICE(0x13d3, 0x3375) }, | 76 | { USB_DEVICE(0x13d3, 0x3375) }, |
77 | { USB_DEVICE(0x04CA, 0x3005) }, | ||
76 | 78 | ||
77 | /* Atheros AR5BBU12 with sflash firmware */ | 79 | /* Atheros AR5BBU12 with sflash firmware */ |
78 | { USB_DEVICE(0x0489, 0xE02C) }, | 80 | { USB_DEVICE(0x0489, 0xE02C) }, |
@@ -89,7 +91,9 @@ static struct usb_device_id ath3k_blist_tbl[] = { | |||
89 | 91 | ||
90 | /* Atheros AR3012 with sflash firmware*/ | 92 | /* Atheros AR3012 with sflash firmware*/ |
91 | { USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 }, | 93 | { USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 }, |
94 | { USB_DEVICE(0x0cf3, 0x311D), .driver_info = BTUSB_ATH3012 }, | ||
92 | { USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 }, | 95 | { USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 }, |
96 | { USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 }, | ||
93 | 97 | ||
94 | { } /* Terminating entry */ | 98 | { } /* Terminating entry */ |
95 | }; | 99 | }; |
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c index 480cad920048..3311b812a0c6 100644 --- a/drivers/bluetooth/btusb.c +++ b/drivers/bluetooth/btusb.c | |||
@@ -61,7 +61,7 @@ static struct usb_device_id btusb_table[] = { | |||
61 | { USB_DEVICE_INFO(0xe0, 0x01, 0x01) }, | 61 | { USB_DEVICE_INFO(0xe0, 0x01, 0x01) }, |
62 | 62 | ||
63 | /* Broadcom SoftSailing reporting vendor specific */ | 63 | /* Broadcom SoftSailing reporting vendor specific */ |
64 | { USB_DEVICE(0x05ac, 0x21e1) }, | 64 | { USB_DEVICE(0x0a5c, 0x21e1) }, |
65 | 65 | ||
66 | /* Apple MacBookPro 7,1 */ | 66 | /* Apple MacBookPro 7,1 */ |
67 | { USB_DEVICE(0x05ac, 0x8213) }, | 67 | { USB_DEVICE(0x05ac, 0x8213) }, |
@@ -103,6 +103,7 @@ static struct usb_device_id btusb_table[] = { | |||
103 | /* Broadcom BCM20702A0 */ | 103 | /* Broadcom BCM20702A0 */ |
104 | { USB_DEVICE(0x0a5c, 0x21e3) }, | 104 | { USB_DEVICE(0x0a5c, 0x21e3) }, |
105 | { USB_DEVICE(0x0a5c, 0x21e6) }, | 105 | { USB_DEVICE(0x0a5c, 0x21e6) }, |
106 | { USB_DEVICE(0x0a5c, 0x21e8) }, | ||
106 | { USB_DEVICE(0x0a5c, 0x21f3) }, | 107 | { USB_DEVICE(0x0a5c, 0x21f3) }, |
107 | { USB_DEVICE(0x413c, 0x8197) }, | 108 | { USB_DEVICE(0x413c, 0x8197) }, |
108 | 109 | ||
@@ -129,7 +130,9 @@ static struct usb_device_id blacklist_table[] = { | |||
129 | 130 | ||
130 | /* Atheros 3012 with sflash firmware */ | 131 | /* Atheros 3012 with sflash firmware */ |
131 | { USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 }, | 132 | { USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 }, |
133 | { USB_DEVICE(0x0cf3, 0x311d), .driver_info = BTUSB_ATH3012 }, | ||
132 | { USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 }, | 134 | { USB_DEVICE(0x13d3, 0x3375), .driver_info = BTUSB_ATH3012 }, |
135 | { USB_DEVICE(0x04ca, 0x3005), .driver_info = BTUSB_ATH3012 }, | ||
133 | 136 | ||
134 | /* Atheros AR5BBU12 with sflash firmware */ | 137 | /* Atheros AR5BBU12 with sflash firmware */ |
135 | { USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE }, | 138 | { USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE }, |
diff --git a/drivers/bluetooth/hci_ldisc.c b/drivers/bluetooth/hci_ldisc.c index fd5adb408f44..98a8c05d4f23 100644 --- a/drivers/bluetooth/hci_ldisc.c +++ b/drivers/bluetooth/hci_ldisc.c | |||
@@ -299,11 +299,11 @@ static void hci_uart_tty_close(struct tty_struct *tty) | |||
299 | hci_uart_close(hdev); | 299 | hci_uart_close(hdev); |
300 | 300 | ||
301 | if (test_and_clear_bit(HCI_UART_PROTO_SET, &hu->flags)) { | 301 | if (test_and_clear_bit(HCI_UART_PROTO_SET, &hu->flags)) { |
302 | hu->proto->close(hu); | ||
303 | if (hdev) { | 302 | if (hdev) { |
304 | hci_unregister_dev(hdev); | 303 | hci_unregister_dev(hdev); |
305 | hci_free_dev(hdev); | 304 | hci_free_dev(hdev); |
306 | } | 305 | } |
306 | hu->proto->close(hu); | ||
307 | } | 307 | } |
308 | 308 | ||
309 | kfree(hu); | 309 | kfree(hu); |
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c index 215eb2536b1e..2504ab005589 100644 --- a/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c | |||
@@ -118,15 +118,13 @@ void ath9k_ps_restore(struct ath_softc *sc) | |||
118 | if (--sc->ps_usecount != 0) | 118 | if (--sc->ps_usecount != 0) |
119 | goto unlock; | 119 | goto unlock; |
120 | 120 | ||
121 | if (sc->ps_flags & PS_WAIT_FOR_TX_ACK) | 121 | if (sc->ps_idle && (sc->ps_flags & PS_WAIT_FOR_TX_ACK)) |
122 | goto unlock; | ||
123 | |||
124 | if (sc->ps_idle) | ||
125 | mode = ATH9K_PM_FULL_SLEEP; | 122 | mode = ATH9K_PM_FULL_SLEEP; |
126 | else if (sc->ps_enabled && | 123 | else if (sc->ps_enabled && |
127 | !(sc->ps_flags & (PS_WAIT_FOR_BEACON | | 124 | !(sc->ps_flags & (PS_WAIT_FOR_BEACON | |
128 | PS_WAIT_FOR_CAB | | 125 | PS_WAIT_FOR_CAB | |
129 | PS_WAIT_FOR_PSPOLL_DATA))) | 126 | PS_WAIT_FOR_PSPOLL_DATA | |
127 | PS_WAIT_FOR_TX_ACK))) | ||
130 | mode = ATH9K_PM_NETWORK_SLEEP; | 128 | mode = ATH9K_PM_NETWORK_SLEEP; |
131 | else | 129 | else |
132 | goto unlock; | 130 | goto unlock; |
diff --git a/drivers/net/wireless/rt2x00/rt2x00dev.c b/drivers/net/wireless/rt2x00/rt2x00dev.c index fc9901e027c1..90cc5e772650 100644 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c | |||
@@ -1062,11 +1062,6 @@ static int rt2x00lib_initialize(struct rt2x00_dev *rt2x00dev) | |||
1062 | 1062 | ||
1063 | set_bit(DEVICE_STATE_INITIALIZED, &rt2x00dev->flags); | 1063 | set_bit(DEVICE_STATE_INITIALIZED, &rt2x00dev->flags); |
1064 | 1064 | ||
1065 | /* | ||
1066 | * Register the extra components. | ||
1067 | */ | ||
1068 | rt2x00rfkill_register(rt2x00dev); | ||
1069 | |||
1070 | return 0; | 1065 | return 0; |
1071 | } | 1066 | } |
1072 | 1067 | ||
@@ -1210,6 +1205,7 @@ int rt2x00lib_probe_dev(struct rt2x00_dev *rt2x00dev) | |||
1210 | rt2x00link_register(rt2x00dev); | 1205 | rt2x00link_register(rt2x00dev); |
1211 | rt2x00leds_register(rt2x00dev); | 1206 | rt2x00leds_register(rt2x00dev); |
1212 | rt2x00debug_register(rt2x00dev); | 1207 | rt2x00debug_register(rt2x00dev); |
1208 | rt2x00rfkill_register(rt2x00dev); | ||
1213 | 1209 | ||
1214 | return 0; | 1210 | return 0; |
1215 | 1211 | ||
diff --git a/drivers/net/wireless/rtlwifi/base.c b/drivers/net/wireless/rtlwifi/base.c index 510023554e5f..e54488db0e10 100644 --- a/drivers/net/wireless/rtlwifi/base.c +++ b/drivers/net/wireless/rtlwifi/base.c | |||
@@ -838,7 +838,10 @@ void rtl_get_tcb_desc(struct ieee80211_hw *hw, | |||
838 | __le16 fc = hdr->frame_control; | 838 | __le16 fc = hdr->frame_control; |
839 | 839 | ||
840 | txrate = ieee80211_get_tx_rate(hw, info); | 840 | txrate = ieee80211_get_tx_rate(hw, info); |
841 | tcb_desc->hw_rate = txrate->hw_value; | 841 | if (txrate) |
842 | tcb_desc->hw_rate = txrate->hw_value; | ||
843 | else | ||
844 | tcb_desc->hw_rate = 0; | ||
842 | 845 | ||
843 | if (ieee80211_is_data(fc)) { | 846 | if (ieee80211_is_data(fc)) { |
844 | /* | 847 | /* |
diff --git a/drivers/net/wireless/rtlwifi/pci.c b/drivers/net/wireless/rtlwifi/pci.c index 07dd38efe62a..288b035a3579 100644 --- a/drivers/net/wireless/rtlwifi/pci.c +++ b/drivers/net/wireless/rtlwifi/pci.c | |||
@@ -912,8 +912,13 @@ static void _rtl_pci_prepare_bcn_tasklet(struct ieee80211_hw *hw) | |||
912 | memset(&tcb_desc, 0, sizeof(struct rtl_tcb_desc)); | 912 | memset(&tcb_desc, 0, sizeof(struct rtl_tcb_desc)); |
913 | ring = &rtlpci->tx_ring[BEACON_QUEUE]; | 913 | ring = &rtlpci->tx_ring[BEACON_QUEUE]; |
914 | pskb = __skb_dequeue(&ring->queue); | 914 | pskb = __skb_dequeue(&ring->queue); |
915 | if (pskb) | 915 | if (pskb) { |
916 | struct rtl_tx_desc *entry = &ring->desc[ring->idx]; | ||
917 | pci_unmap_single(rtlpci->pdev, rtlpriv->cfg->ops->get_desc( | ||
918 | (u8 *) entry, true, HW_DESC_TXBUFF_ADDR), | ||
919 | pskb->len, PCI_DMA_TODEVICE); | ||
916 | kfree_skb(pskb); | 920 | kfree_skb(pskb); |
921 | } | ||
917 | 922 | ||
918 | /*NB: the beacon data buffer must be 32-bit aligned. */ | 923 | /*NB: the beacon data buffer must be 32-bit aligned. */ |
919 | pskb = ieee80211_beacon_get(hw, mac->vif); | 924 | pskb = ieee80211_beacon_get(hw, mac->vif); |
diff --git a/drivers/net/wireless/rtlwifi/rtl8192de/sw.c b/drivers/net/wireless/rtlwifi/rtl8192de/sw.c index 4898c502974d..480862c07f92 100644 --- a/drivers/net/wireless/rtlwifi/rtl8192de/sw.c +++ b/drivers/net/wireless/rtlwifi/rtl8192de/sw.c | |||
@@ -91,7 +91,6 @@ static int rtl92d_init_sw_vars(struct ieee80211_hw *hw) | |||
91 | u8 tid; | 91 | u8 tid; |
92 | struct rtl_priv *rtlpriv = rtl_priv(hw); | 92 | struct rtl_priv *rtlpriv = rtl_priv(hw); |
93 | struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); | 93 | struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); |
94 | static int header_print; | ||
95 | 94 | ||
96 | rtlpriv->dm.dm_initialgain_enable = true; | 95 | rtlpriv->dm.dm_initialgain_enable = true; |
97 | rtlpriv->dm.dm_flag = 0; | 96 | rtlpriv->dm.dm_flag = 0; |
@@ -171,10 +170,6 @@ static int rtl92d_init_sw_vars(struct ieee80211_hw *hw) | |||
171 | for (tid = 0; tid < 8; tid++) | 170 | for (tid = 0; tid < 8; tid++) |
172 | skb_queue_head_init(&rtlpriv->mac80211.skb_waitq[tid]); | 171 | skb_queue_head_init(&rtlpriv->mac80211.skb_waitq[tid]); |
173 | 172 | ||
174 | /* Only load firmware for first MAC */ | ||
175 | if (header_print) | ||
176 | return 0; | ||
177 | |||
178 | /* for firmware buf */ | 173 | /* for firmware buf */ |
179 | rtlpriv->rtlhal.pfirmware = vzalloc(0x8000); | 174 | rtlpriv->rtlhal.pfirmware = vzalloc(0x8000); |
180 | if (!rtlpriv->rtlhal.pfirmware) { | 175 | if (!rtlpriv->rtlhal.pfirmware) { |
@@ -186,7 +181,6 @@ static int rtl92d_init_sw_vars(struct ieee80211_hw *hw) | |||
186 | rtlpriv->max_fw_size = 0x8000; | 181 | rtlpriv->max_fw_size = 0x8000; |
187 | pr_info("Driver for Realtek RTL8192DE WLAN interface\n"); | 182 | pr_info("Driver for Realtek RTL8192DE WLAN interface\n"); |
188 | pr_info("Loading firmware file %s\n", rtlpriv->cfg->fw_name); | 183 | pr_info("Loading firmware file %s\n", rtlpriv->cfg->fw_name); |
189 | header_print++; | ||
190 | 184 | ||
191 | /* request fw */ | 185 | /* request fw */ |
192 | err = request_firmware_nowait(THIS_MODULE, 1, rtlpriv->cfg->fw_name, | 186 | err = request_firmware_nowait(THIS_MODULE, 1, rtlpriv->cfg->fw_name, |
diff --git a/drivers/net/wireless/rtlwifi/usb.c b/drivers/net/wireless/rtlwifi/usb.c index 2e1e352864bb..d04dbda13f5a 100644 --- a/drivers/net/wireless/rtlwifi/usb.c +++ b/drivers/net/wireless/rtlwifi/usb.c | |||
@@ -124,46 +124,38 @@ static int _usbctrl_vendorreq_sync_read(struct usb_device *udev, u8 request, | |||
124 | return status; | 124 | return status; |
125 | } | 125 | } |
126 | 126 | ||
127 | static u32 _usb_read_sync(struct usb_device *udev, u32 addr, u16 len) | 127 | static u32 _usb_read_sync(struct rtl_priv *rtlpriv, u32 addr, u16 len) |
128 | { | 128 | { |
129 | struct device *dev = rtlpriv->io.dev; | ||
130 | struct usb_device *udev = to_usb_device(dev); | ||
129 | u8 request; | 131 | u8 request; |
130 | u16 wvalue; | 132 | u16 wvalue; |
131 | u16 index; | 133 | u16 index; |
132 | u32 *data; | 134 | __le32 *data = &rtlpriv->usb_data[rtlpriv->usb_data_index]; |
133 | u32 ret; | ||
134 | 135 | ||
135 | data = kmalloc(sizeof(u32), GFP_KERNEL); | ||
136 | if (!data) | ||
137 | return -ENOMEM; | ||
138 | request = REALTEK_USB_VENQT_CMD_REQ; | 136 | request = REALTEK_USB_VENQT_CMD_REQ; |
139 | index = REALTEK_USB_VENQT_CMD_IDX; /* n/a */ | 137 | index = REALTEK_USB_VENQT_CMD_IDX; /* n/a */ |
140 | 138 | ||
141 | wvalue = (u16)addr; | 139 | wvalue = (u16)addr; |
142 | _usbctrl_vendorreq_sync_read(udev, request, wvalue, index, data, len); | 140 | _usbctrl_vendorreq_sync_read(udev, request, wvalue, index, data, len); |
143 | ret = le32_to_cpu(*data); | 141 | if (++rtlpriv->usb_data_index >= RTL_USB_MAX_RX_COUNT) |
144 | kfree(data); | 142 | rtlpriv->usb_data_index = 0; |
145 | return ret; | 143 | return le32_to_cpu(*data); |
146 | } | 144 | } |
147 | 145 | ||
148 | static u8 _usb_read8_sync(struct rtl_priv *rtlpriv, u32 addr) | 146 | static u8 _usb_read8_sync(struct rtl_priv *rtlpriv, u32 addr) |
149 | { | 147 | { |
150 | struct device *dev = rtlpriv->io.dev; | 148 | return (u8)_usb_read_sync(rtlpriv, addr, 1); |
151 | |||
152 | return (u8)_usb_read_sync(to_usb_device(dev), addr, 1); | ||
153 | } | 149 | } |
154 | 150 | ||
155 | static u16 _usb_read16_sync(struct rtl_priv *rtlpriv, u32 addr) | 151 | static u16 _usb_read16_sync(struct rtl_priv *rtlpriv, u32 addr) |
156 | { | 152 | { |
157 | struct device *dev = rtlpriv->io.dev; | 153 | return (u16)_usb_read_sync(rtlpriv, addr, 2); |
158 | |||
159 | return (u16)_usb_read_sync(to_usb_device(dev), addr, 2); | ||
160 | } | 154 | } |
161 | 155 | ||
162 | static u32 _usb_read32_sync(struct rtl_priv *rtlpriv, u32 addr) | 156 | static u32 _usb_read32_sync(struct rtl_priv *rtlpriv, u32 addr) |
163 | { | 157 | { |
164 | struct device *dev = rtlpriv->io.dev; | 158 | return _usb_read_sync(rtlpriv, addr, 4); |
165 | |||
166 | return _usb_read_sync(to_usb_device(dev), addr, 4); | ||
167 | } | 159 | } |
168 | 160 | ||
169 | static void _usb_write_async(struct usb_device *udev, u32 addr, u32 val, | 161 | static void _usb_write_async(struct usb_device *udev, u32 addr, u32 val, |
@@ -955,6 +947,11 @@ int __devinit rtl_usb_probe(struct usb_interface *intf, | |||
955 | return -ENOMEM; | 947 | return -ENOMEM; |
956 | } | 948 | } |
957 | rtlpriv = hw->priv; | 949 | rtlpriv = hw->priv; |
950 | rtlpriv->usb_data = kzalloc(RTL_USB_MAX_RX_COUNT * sizeof(u32), | ||
951 | GFP_KERNEL); | ||
952 | if (!rtlpriv->usb_data) | ||
953 | return -ENOMEM; | ||
954 | rtlpriv->usb_data_index = 0; | ||
958 | init_completion(&rtlpriv->firmware_loading_complete); | 955 | init_completion(&rtlpriv->firmware_loading_complete); |
959 | SET_IEEE80211_DEV(hw, &intf->dev); | 956 | SET_IEEE80211_DEV(hw, &intf->dev); |
960 | udev = interface_to_usbdev(intf); | 957 | udev = interface_to_usbdev(intf); |
@@ -1025,6 +1022,7 @@ void rtl_usb_disconnect(struct usb_interface *intf) | |||
1025 | /* rtl_deinit_rfkill(hw); */ | 1022 | /* rtl_deinit_rfkill(hw); */ |
1026 | rtl_usb_deinit(hw); | 1023 | rtl_usb_deinit(hw); |
1027 | rtl_deinit_core(hw); | 1024 | rtl_deinit_core(hw); |
1025 | kfree(rtlpriv->usb_data); | ||
1028 | rtlpriv->cfg->ops->deinit_sw_leds(hw); | 1026 | rtlpriv->cfg->ops->deinit_sw_leds(hw); |
1029 | rtlpriv->cfg->ops->deinit_sw_vars(hw); | 1027 | rtlpriv->cfg->ops->deinit_sw_vars(hw); |
1030 | _rtl_usb_io_handler_release(hw); | 1028 | _rtl_usb_io_handler_release(hw); |
diff --git a/drivers/net/wireless/rtlwifi/wifi.h b/drivers/net/wireless/rtlwifi/wifi.h index b591614c3b9b..28ebc69218a3 100644 --- a/drivers/net/wireless/rtlwifi/wifi.h +++ b/drivers/net/wireless/rtlwifi/wifi.h | |||
@@ -67,7 +67,7 @@ | |||
67 | #define QOS_QUEUE_NUM 4 | 67 | #define QOS_QUEUE_NUM 4 |
68 | #define RTL_MAC80211_NUM_QUEUE 5 | 68 | #define RTL_MAC80211_NUM_QUEUE 5 |
69 | #define REALTEK_USB_VENQT_MAX_BUF_SIZE 254 | 69 | #define REALTEK_USB_VENQT_MAX_BUF_SIZE 254 |
70 | 70 | #define RTL_USB_MAX_RX_COUNT 100 | |
71 | #define QBSS_LOAD_SIZE 5 | 71 | #define QBSS_LOAD_SIZE 5 |
72 | #define MAX_WMMELE_LENGTH 64 | 72 | #define MAX_WMMELE_LENGTH 64 |
73 | 73 | ||
@@ -1629,6 +1629,10 @@ struct rtl_priv { | |||
1629 | interface or hardware */ | 1629 | interface or hardware */ |
1630 | unsigned long status; | 1630 | unsigned long status; |
1631 | 1631 | ||
1632 | /* data buffer pointer for USB reads */ | ||
1633 | __le32 *usb_data; | ||
1634 | int usb_data_index; | ||
1635 | |||
1632 | /*This must be the last item so | 1636 | /*This must be the last item so |
1633 | that it points to the data allocated | 1637 | that it points to the data allocated |
1634 | beyond this structure like: | 1638 | beyond this structure like: |
diff --git a/include/linux/netfilter_ipv6/ip6_tables.h b/include/linux/netfilter_ipv6/ip6_tables.h index f549adccc94c..1bc898b14a80 100644 --- a/include/linux/netfilter_ipv6/ip6_tables.h +++ b/include/linux/netfilter_ipv6/ip6_tables.h | |||
@@ -287,7 +287,17 @@ extern unsigned int ip6t_do_table(struct sk_buff *skb, | |||
287 | struct xt_table *table); | 287 | struct xt_table *table); |
288 | 288 | ||
289 | /* Check for an extension */ | 289 | /* Check for an extension */ |
290 | extern int ip6t_ext_hdr(u8 nexthdr); | 290 | static inline int |
291 | ip6t_ext_hdr(u8 nexthdr) | ||
292 | { return (nexthdr == IPPROTO_HOPOPTS) || | ||
293 | (nexthdr == IPPROTO_ROUTING) || | ||
294 | (nexthdr == IPPROTO_FRAGMENT) || | ||
295 | (nexthdr == IPPROTO_ESP) || | ||
296 | (nexthdr == IPPROTO_AH) || | ||
297 | (nexthdr == IPPROTO_NONE) || | ||
298 | (nexthdr == IPPROTO_DSTOPTS); | ||
299 | } | ||
300 | |||
291 | /* find specified header and get offset to it */ | 301 | /* find specified header and get offset to it */ |
292 | extern int ipv6_find_hdr(const struct sk_buff *skb, unsigned int *offset, | 302 | extern int ipv6_find_hdr(const struct sk_buff *skb, unsigned int *offset, |
293 | int target, unsigned short *fragoff); | 303 | int target, unsigned short *fragoff); |
diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h index 33370271b8b2..70a3f8d49118 100644 --- a/include/linux/skbuff.h +++ b/include/linux/skbuff.h | |||
@@ -481,6 +481,7 @@ struct sk_buff { | |||
481 | union { | 481 | union { |
482 | __u32 mark; | 482 | __u32 mark; |
483 | __u32 dropcount; | 483 | __u32 dropcount; |
484 | __u32 avail_size; | ||
484 | }; | 485 | }; |
485 | 486 | ||
486 | sk_buff_data_t transport_header; | 487 | sk_buff_data_t transport_header; |
@@ -1366,6 +1367,18 @@ static inline int skb_tailroom(const struct sk_buff *skb) | |||
1366 | } | 1367 | } |
1367 | 1368 | ||
1368 | /** | 1369 | /** |
1370 | * skb_availroom - bytes at buffer end | ||
1371 | * @skb: buffer to check | ||
1372 | * | ||
1373 | * Return the number of bytes of free space at the tail of an sk_buff | ||
1374 | * allocated by sk_stream_alloc() | ||
1375 | */ | ||
1376 | static inline int skb_availroom(const struct sk_buff *skb) | ||
1377 | { | ||
1378 | return skb_is_nonlinear(skb) ? 0 : skb->avail_size - skb->len; | ||
1379 | } | ||
1380 | |||
1381 | /** | ||
1369 | * skb_reserve - adjust headroom | 1382 | * skb_reserve - adjust headroom |
1370 | * @skb: buffer to alter | 1383 | * @skb: buffer to alter |
1371 | * @len: bytes to move | 1384 | * @len: bytes to move |
diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h index 344b0f972828..d47e523c9d83 100644 --- a/include/net/bluetooth/hci.h +++ b/include/net/bluetooth/hci.h | |||
@@ -92,6 +92,7 @@ enum { | |||
92 | HCI_SERVICE_CACHE, | 92 | HCI_SERVICE_CACHE, |
93 | HCI_LINK_KEYS, | 93 | HCI_LINK_KEYS, |
94 | HCI_DEBUG_KEYS, | 94 | HCI_DEBUG_KEYS, |
95 | HCI_UNREGISTER, | ||
95 | 96 | ||
96 | HCI_LE_SCAN, | 97 | HCI_LE_SCAN, |
97 | HCI_SSP_ENABLED, | 98 | HCI_SSP_ENABLED, |
@@ -1327,8 +1328,8 @@ struct sockaddr_hci { | |||
1327 | #define HCI_DEV_NONE 0xffff | 1328 | #define HCI_DEV_NONE 0xffff |
1328 | 1329 | ||
1329 | #define HCI_CHANNEL_RAW 0 | 1330 | #define HCI_CHANNEL_RAW 0 |
1330 | #define HCI_CHANNEL_CONTROL 1 | ||
1331 | #define HCI_CHANNEL_MONITOR 2 | 1331 | #define HCI_CHANNEL_MONITOR 2 |
1332 | #define HCI_CHANNEL_CONTROL 3 | ||
1332 | 1333 | ||
1333 | struct hci_filter { | 1334 | struct hci_filter { |
1334 | unsigned long type_mask; | 1335 | unsigned long type_mask; |
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h index daefaac51131..6822d2595aff 100644 --- a/include/net/bluetooth/hci_core.h +++ b/include/net/bluetooth/hci_core.h | |||
@@ -427,7 +427,7 @@ enum { | |||
427 | static inline bool hci_conn_ssp_enabled(struct hci_conn *conn) | 427 | static inline bool hci_conn_ssp_enabled(struct hci_conn *conn) |
428 | { | 428 | { |
429 | struct hci_dev *hdev = conn->hdev; | 429 | struct hci_dev *hdev = conn->hdev; |
430 | return (test_bit(HCI_SSP_ENABLED, &hdev->flags) && | 430 | return (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags) && |
431 | test_bit(HCI_CONN_SSP_ENABLED, &conn->flags)); | 431 | test_bit(HCI_CONN_SSP_ENABLED, &conn->flags)); |
432 | } | 432 | } |
433 | 433 | ||
@@ -907,11 +907,13 @@ static inline void hci_role_switch_cfm(struct hci_conn *conn, __u8 status, | |||
907 | 907 | ||
908 | static inline bool eir_has_data_type(u8 *data, size_t data_len, u8 type) | 908 | static inline bool eir_has_data_type(u8 *data, size_t data_len, u8 type) |
909 | { | 909 | { |
910 | u8 field_len; | 910 | size_t parsed = 0; |
911 | size_t parsed; | ||
912 | 911 | ||
913 | for (parsed = 0; parsed < data_len - 1; parsed += field_len) { | 912 | if (data_len < 2) |
914 | field_len = data[0]; | 913 | return false; |
914 | |||
915 | while (parsed < data_len - 1) { | ||
916 | u8 field_len = data[0]; | ||
915 | 917 | ||
916 | if (field_len == 0) | 918 | if (field_len == 0) |
917 | break; | 919 | break; |
diff --git a/include/net/bluetooth/mgmt.h b/include/net/bluetooth/mgmt.h index ffc1377e092e..ebfd91fc20f8 100644 --- a/include/net/bluetooth/mgmt.h +++ b/include/net/bluetooth/mgmt.h | |||
@@ -117,7 +117,7 @@ struct mgmt_mode { | |||
117 | #define MGMT_OP_SET_DISCOVERABLE 0x0006 | 117 | #define MGMT_OP_SET_DISCOVERABLE 0x0006 |
118 | struct mgmt_cp_set_discoverable { | 118 | struct mgmt_cp_set_discoverable { |
119 | __u8 val; | 119 | __u8 val; |
120 | __u16 timeout; | 120 | __le16 timeout; |
121 | } __packed; | 121 | } __packed; |
122 | #define MGMT_SET_DISCOVERABLE_SIZE 3 | 122 | #define MGMT_SET_DISCOVERABLE_SIZE 3 |
123 | 123 | ||
diff --git a/include/net/mac80211.h b/include/net/mac80211.h index 87d203ff7a8a..9210bdc7bd8d 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h | |||
@@ -1327,7 +1327,7 @@ static inline struct ieee80211_rate * | |||
1327 | ieee80211_get_tx_rate(const struct ieee80211_hw *hw, | 1327 | ieee80211_get_tx_rate(const struct ieee80211_hw *hw, |
1328 | const struct ieee80211_tx_info *c) | 1328 | const struct ieee80211_tx_info *c) |
1329 | { | 1329 | { |
1330 | if (WARN_ON(c->control.rates[0].idx < 0)) | 1330 | if (WARN_ON_ONCE(c->control.rates[0].idx < 0)) |
1331 | return NULL; | 1331 | return NULL; |
1332 | return &hw->wiphy->bands[c->band]->bitrates[c->control.rates[0].idx]; | 1332 | return &hw->wiphy->bands[c->band]->bitrates[c->control.rates[0].idx]; |
1333 | } | 1333 | } |
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c index e33af63a884a..92a857e3786d 100644 --- a/net/bluetooth/hci_core.c +++ b/net/bluetooth/hci_core.c | |||
@@ -665,6 +665,11 @@ int hci_dev_open(__u16 dev) | |||
665 | 665 | ||
666 | hci_req_lock(hdev); | 666 | hci_req_lock(hdev); |
667 | 667 | ||
668 | if (test_bit(HCI_UNREGISTER, &hdev->dev_flags)) { | ||
669 | ret = -ENODEV; | ||
670 | goto done; | ||
671 | } | ||
672 | |||
668 | if (hdev->rfkill && rfkill_blocked(hdev->rfkill)) { | 673 | if (hdev->rfkill && rfkill_blocked(hdev->rfkill)) { |
669 | ret = -ERFKILL; | 674 | ret = -ERFKILL; |
670 | goto done; | 675 | goto done; |
@@ -1849,6 +1854,8 @@ void hci_unregister_dev(struct hci_dev *hdev) | |||
1849 | 1854 | ||
1850 | BT_DBG("%p name %s bus %d", hdev, hdev->name, hdev->bus); | 1855 | BT_DBG("%p name %s bus %d", hdev, hdev->name, hdev->bus); |
1851 | 1856 | ||
1857 | set_bit(HCI_UNREGISTER, &hdev->dev_flags); | ||
1858 | |||
1852 | write_lock(&hci_dev_list_lock); | 1859 | write_lock(&hci_dev_list_lock); |
1853 | list_del(&hdev->list); | 1860 | list_del(&hdev->list); |
1854 | write_unlock(&hci_dev_list_lock); | 1861 | write_unlock(&hci_dev_list_lock); |
diff --git a/net/bluetooth/l2cap_core.c b/net/bluetooth/l2cap_core.c index b8e17e4dac8b..94552b33d528 100644 --- a/net/bluetooth/l2cap_core.c +++ b/net/bluetooth/l2cap_core.c | |||
@@ -1308,6 +1308,7 @@ static void l2cap_monitor_timeout(struct work_struct *work) | |||
1308 | if (chan->retry_count >= chan->remote_max_tx) { | 1308 | if (chan->retry_count >= chan->remote_max_tx) { |
1309 | l2cap_send_disconn_req(chan->conn, chan, ECONNABORTED); | 1309 | l2cap_send_disconn_req(chan->conn, chan, ECONNABORTED); |
1310 | l2cap_chan_unlock(chan); | 1310 | l2cap_chan_unlock(chan); |
1311 | l2cap_chan_put(chan); | ||
1311 | return; | 1312 | return; |
1312 | } | 1313 | } |
1313 | 1314 | ||
@@ -1316,6 +1317,7 @@ static void l2cap_monitor_timeout(struct work_struct *work) | |||
1316 | 1317 | ||
1317 | l2cap_send_rr_or_rnr(chan, L2CAP_CTRL_POLL); | 1318 | l2cap_send_rr_or_rnr(chan, L2CAP_CTRL_POLL); |
1318 | l2cap_chan_unlock(chan); | 1319 | l2cap_chan_unlock(chan); |
1320 | l2cap_chan_put(chan); | ||
1319 | } | 1321 | } |
1320 | 1322 | ||
1321 | static void l2cap_retrans_timeout(struct work_struct *work) | 1323 | static void l2cap_retrans_timeout(struct work_struct *work) |
@@ -1335,6 +1337,7 @@ static void l2cap_retrans_timeout(struct work_struct *work) | |||
1335 | l2cap_send_rr_or_rnr(chan, L2CAP_CTRL_POLL); | 1337 | l2cap_send_rr_or_rnr(chan, L2CAP_CTRL_POLL); |
1336 | 1338 | ||
1337 | l2cap_chan_unlock(chan); | 1339 | l2cap_chan_unlock(chan); |
1340 | l2cap_chan_put(chan); | ||
1338 | } | 1341 | } |
1339 | 1342 | ||
1340 | static void l2cap_drop_acked_frames(struct l2cap_chan *chan) | 1343 | static void l2cap_drop_acked_frames(struct l2cap_chan *chan) |
diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c index c4fe583b0af6..29122ed28ea9 100644 --- a/net/bluetooth/l2cap_sock.c +++ b/net/bluetooth/l2cap_sock.c | |||
@@ -82,7 +82,7 @@ static int l2cap_sock_bind(struct socket *sock, struct sockaddr *addr, int alen) | |||
82 | } | 82 | } |
83 | 83 | ||
84 | if (la.l2_cid) | 84 | if (la.l2_cid) |
85 | err = l2cap_add_scid(chan, la.l2_cid); | 85 | err = l2cap_add_scid(chan, __le16_to_cpu(la.l2_cid)); |
86 | else | 86 | else |
87 | err = l2cap_add_psm(chan, &la.l2_bdaddr, la.l2_psm); | 87 | err = l2cap_add_psm(chan, &la.l2_bdaddr, la.l2_psm); |
88 | 88 | ||
@@ -123,7 +123,8 @@ static int l2cap_sock_connect(struct socket *sock, struct sockaddr *addr, int al | |||
123 | if (la.l2_cid && la.l2_psm) | 123 | if (la.l2_cid && la.l2_psm) |
124 | return -EINVAL; | 124 | return -EINVAL; |
125 | 125 | ||
126 | err = l2cap_chan_connect(chan, la.l2_psm, la.l2_cid, &la.l2_bdaddr); | 126 | err = l2cap_chan_connect(chan, la.l2_psm, __le16_to_cpu(la.l2_cid), |
127 | &la.l2_bdaddr); | ||
127 | if (err) | 128 | if (err) |
128 | return err; | 129 | return err; |
129 | 130 | ||
diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c index 7fcff8887131..4ef275c69675 100644 --- a/net/bluetooth/mgmt.c +++ b/net/bluetooth/mgmt.c | |||
@@ -2523,13 +2523,18 @@ static int set_fast_connectable(struct sock *sk, struct hci_dev *hdev, | |||
2523 | 2523 | ||
2524 | if (cp->val) { | 2524 | if (cp->val) { |
2525 | type = PAGE_SCAN_TYPE_INTERLACED; | 2525 | type = PAGE_SCAN_TYPE_INTERLACED; |
2526 | acp.interval = 0x0024; /* 22.5 msec page scan interval */ | 2526 | |
2527 | /* 22.5 msec page scan interval */ | ||
2528 | acp.interval = __constant_cpu_to_le16(0x0024); | ||
2527 | } else { | 2529 | } else { |
2528 | type = PAGE_SCAN_TYPE_STANDARD; /* default */ | 2530 | type = PAGE_SCAN_TYPE_STANDARD; /* default */ |
2529 | acp.interval = 0x0800; /* default 1.28 sec page scan */ | 2531 | |
2532 | /* default 1.28 sec page scan */ | ||
2533 | acp.interval = __constant_cpu_to_le16(0x0800); | ||
2530 | } | 2534 | } |
2531 | 2535 | ||
2532 | acp.window = 0x0012; /* default 11.25 msec page scan window */ | 2536 | /* default 11.25 msec page scan window */ |
2537 | acp.window = __constant_cpu_to_le16(0x0012); | ||
2533 | 2538 | ||
2534 | err = hci_send_cmd(hdev, HCI_OP_WRITE_PAGE_SCAN_ACTIVITY, sizeof(acp), | 2539 | err = hci_send_cmd(hdev, HCI_OP_WRITE_PAGE_SCAN_ACTIVITY, sizeof(acp), |
2535 | &acp); | 2540 | &acp); |
@@ -2936,7 +2941,7 @@ int mgmt_device_connected(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type, | |||
2936 | name, name_len); | 2941 | name, name_len); |
2937 | 2942 | ||
2938 | if (dev_class && memcmp(dev_class, "\0\0\0", 3) != 0) | 2943 | if (dev_class && memcmp(dev_class, "\0\0\0", 3) != 0) |
2939 | eir_len = eir_append_data(&ev->eir[eir_len], eir_len, | 2944 | eir_len = eir_append_data(ev->eir, eir_len, |
2940 | EIR_CLASS_OF_DEV, dev_class, 3); | 2945 | EIR_CLASS_OF_DEV, dev_class, 3); |
2941 | 2946 | ||
2942 | put_unaligned_le16(eir_len, &ev->eir_len); | 2947 | put_unaligned_le16(eir_len, &ev->eir_len); |
diff --git a/net/bridge/br_multicast.c b/net/bridge/br_multicast.c index 702a1ae9220b..27ca25ed7021 100644 --- a/net/bridge/br_multicast.c +++ b/net/bridge/br_multicast.c | |||
@@ -241,7 +241,6 @@ static void br_multicast_group_expired(unsigned long data) | |||
241 | hlist_del_rcu(&mp->hlist[mdb->ver]); | 241 | hlist_del_rcu(&mp->hlist[mdb->ver]); |
242 | mdb->size--; | 242 | mdb->size--; |
243 | 243 | ||
244 | del_timer(&mp->query_timer); | ||
245 | call_rcu_bh(&mp->rcu, br_multicast_free_group); | 244 | call_rcu_bh(&mp->rcu, br_multicast_free_group); |
246 | 245 | ||
247 | out: | 246 | out: |
@@ -271,7 +270,6 @@ static void br_multicast_del_pg(struct net_bridge *br, | |||
271 | rcu_assign_pointer(*pp, p->next); | 270 | rcu_assign_pointer(*pp, p->next); |
272 | hlist_del_init(&p->mglist); | 271 | hlist_del_init(&p->mglist); |
273 | del_timer(&p->timer); | 272 | del_timer(&p->timer); |
274 | del_timer(&p->query_timer); | ||
275 | call_rcu_bh(&p->rcu, br_multicast_free_pg); | 273 | call_rcu_bh(&p->rcu, br_multicast_free_pg); |
276 | 274 | ||
277 | if (!mp->ports && !mp->mglist && | 275 | if (!mp->ports && !mp->mglist && |
@@ -507,74 +505,6 @@ static struct sk_buff *br_multicast_alloc_query(struct net_bridge *br, | |||
507 | return NULL; | 505 | return NULL; |
508 | } | 506 | } |
509 | 507 | ||
510 | static void br_multicast_send_group_query(struct net_bridge_mdb_entry *mp) | ||
511 | { | ||
512 | struct net_bridge *br = mp->br; | ||
513 | struct sk_buff *skb; | ||
514 | |||
515 | skb = br_multicast_alloc_query(br, &mp->addr); | ||
516 | if (!skb) | ||
517 | goto timer; | ||
518 | |||
519 | netif_rx(skb); | ||
520 | |||
521 | timer: | ||
522 | if (++mp->queries_sent < br->multicast_last_member_count) | ||
523 | mod_timer(&mp->query_timer, | ||
524 | jiffies + br->multicast_last_member_interval); | ||
525 | } | ||
526 | |||
527 | static void br_multicast_group_query_expired(unsigned long data) | ||
528 | { | ||
529 | struct net_bridge_mdb_entry *mp = (void *)data; | ||
530 | struct net_bridge *br = mp->br; | ||
531 | |||
532 | spin_lock(&br->multicast_lock); | ||
533 | if (!netif_running(br->dev) || !mp->mglist || | ||
534 | mp->queries_sent >= br->multicast_last_member_count) | ||
535 | goto out; | ||
536 | |||
537 | br_multicast_send_group_query(mp); | ||
538 | |||
539 | out: | ||
540 | spin_unlock(&br->multicast_lock); | ||
541 | } | ||
542 | |||
543 | static void br_multicast_send_port_group_query(struct net_bridge_port_group *pg) | ||
544 | { | ||
545 | struct net_bridge_port *port = pg->port; | ||
546 | struct net_bridge *br = port->br; | ||
547 | struct sk_buff *skb; | ||
548 | |||
549 | skb = br_multicast_alloc_query(br, &pg->addr); | ||
550 | if (!skb) | ||
551 | goto timer; | ||
552 | |||
553 | br_deliver(port, skb); | ||
554 | |||
555 | timer: | ||
556 | if (++pg->queries_sent < br->multicast_last_member_count) | ||
557 | mod_timer(&pg->query_timer, | ||
558 | jiffies + br->multicast_last_member_interval); | ||
559 | } | ||
560 | |||
561 | static void br_multicast_port_group_query_expired(unsigned long data) | ||
562 | { | ||
563 | struct net_bridge_port_group *pg = (void *)data; | ||
564 | struct net_bridge_port *port = pg->port; | ||
565 | struct net_bridge *br = port->br; | ||
566 | |||
567 | spin_lock(&br->multicast_lock); | ||
568 | if (!netif_running(br->dev) || hlist_unhashed(&pg->mglist) || | ||
569 | pg->queries_sent >= br->multicast_last_member_count) | ||
570 | goto out; | ||
571 | |||
572 | br_multicast_send_port_group_query(pg); | ||
573 | |||
574 | out: | ||
575 | spin_unlock(&br->multicast_lock); | ||
576 | } | ||
577 | |||
578 | static struct net_bridge_mdb_entry *br_multicast_get_group( | 508 | static struct net_bridge_mdb_entry *br_multicast_get_group( |
579 | struct net_bridge *br, struct net_bridge_port *port, | 509 | struct net_bridge *br, struct net_bridge_port *port, |
580 | struct br_ip *group, int hash) | 510 | struct br_ip *group, int hash) |
@@ -690,8 +620,6 @@ rehash: | |||
690 | mp->addr = *group; | 620 | mp->addr = *group; |
691 | setup_timer(&mp->timer, br_multicast_group_expired, | 621 | setup_timer(&mp->timer, br_multicast_group_expired, |
692 | (unsigned long)mp); | 622 | (unsigned long)mp); |
693 | setup_timer(&mp->query_timer, br_multicast_group_query_expired, | ||
694 | (unsigned long)mp); | ||
695 | 623 | ||
696 | hlist_add_head_rcu(&mp->hlist[mdb->ver], &mdb->mhash[hash]); | 624 | hlist_add_head_rcu(&mp->hlist[mdb->ver], &mdb->mhash[hash]); |
697 | mdb->size++; | 625 | mdb->size++; |
@@ -746,8 +674,6 @@ static int br_multicast_add_group(struct net_bridge *br, | |||
746 | hlist_add_head(&p->mglist, &port->mglist); | 674 | hlist_add_head(&p->mglist, &port->mglist); |
747 | setup_timer(&p->timer, br_multicast_port_group_expired, | 675 | setup_timer(&p->timer, br_multicast_port_group_expired, |
748 | (unsigned long)p); | 676 | (unsigned long)p); |
749 | setup_timer(&p->query_timer, br_multicast_port_group_query_expired, | ||
750 | (unsigned long)p); | ||
751 | 677 | ||
752 | rcu_assign_pointer(*pp, p); | 678 | rcu_assign_pointer(*pp, p); |
753 | 679 | ||
@@ -1291,9 +1217,6 @@ static void br_multicast_leave_group(struct net_bridge *br, | |||
1291 | time_after(mp->timer.expires, time) : | 1217 | time_after(mp->timer.expires, time) : |
1292 | try_to_del_timer_sync(&mp->timer) >= 0)) { | 1218 | try_to_del_timer_sync(&mp->timer) >= 0)) { |
1293 | mod_timer(&mp->timer, time); | 1219 | mod_timer(&mp->timer, time); |
1294 | |||
1295 | mp->queries_sent = 0; | ||
1296 | mod_timer(&mp->query_timer, now); | ||
1297 | } | 1220 | } |
1298 | 1221 | ||
1299 | goto out; | 1222 | goto out; |
@@ -1310,9 +1233,6 @@ static void br_multicast_leave_group(struct net_bridge *br, | |||
1310 | time_after(p->timer.expires, time) : | 1233 | time_after(p->timer.expires, time) : |
1311 | try_to_del_timer_sync(&p->timer) >= 0)) { | 1234 | try_to_del_timer_sync(&p->timer) >= 0)) { |
1312 | mod_timer(&p->timer, time); | 1235 | mod_timer(&p->timer, time); |
1313 | |||
1314 | p->queries_sent = 0; | ||
1315 | mod_timer(&p->query_timer, now); | ||
1316 | } | 1236 | } |
1317 | 1237 | ||
1318 | break; | 1238 | break; |
@@ -1681,7 +1601,6 @@ void br_multicast_stop(struct net_bridge *br) | |||
1681 | hlist_for_each_entry_safe(mp, p, n, &mdb->mhash[i], | 1601 | hlist_for_each_entry_safe(mp, p, n, &mdb->mhash[i], |
1682 | hlist[ver]) { | 1602 | hlist[ver]) { |
1683 | del_timer(&mp->timer); | 1603 | del_timer(&mp->timer); |
1684 | del_timer(&mp->query_timer); | ||
1685 | call_rcu_bh(&mp->rcu, br_multicast_free_group); | 1604 | call_rcu_bh(&mp->rcu, br_multicast_free_group); |
1686 | } | 1605 | } |
1687 | } | 1606 | } |
diff --git a/net/bridge/br_private.h b/net/bridge/br_private.h index 0b67a63ad7a8..e1d882257877 100644 --- a/net/bridge/br_private.h +++ b/net/bridge/br_private.h | |||
@@ -82,9 +82,7 @@ struct net_bridge_port_group { | |||
82 | struct hlist_node mglist; | 82 | struct hlist_node mglist; |
83 | struct rcu_head rcu; | 83 | struct rcu_head rcu; |
84 | struct timer_list timer; | 84 | struct timer_list timer; |
85 | struct timer_list query_timer; | ||
86 | struct br_ip addr; | 85 | struct br_ip addr; |
87 | u32 queries_sent; | ||
88 | }; | 86 | }; |
89 | 87 | ||
90 | struct net_bridge_mdb_entry | 88 | struct net_bridge_mdb_entry |
@@ -94,10 +92,8 @@ struct net_bridge_mdb_entry | |||
94 | struct net_bridge_port_group __rcu *ports; | 92 | struct net_bridge_port_group __rcu *ports; |
95 | struct rcu_head rcu; | 93 | struct rcu_head rcu; |
96 | struct timer_list timer; | 94 | struct timer_list timer; |
97 | struct timer_list query_timer; | ||
98 | struct br_ip addr; | 95 | struct br_ip addr; |
99 | bool mglist; | 96 | bool mglist; |
100 | u32 queries_sent; | ||
101 | }; | 97 | }; |
102 | 98 | ||
103 | struct net_bridge_mdb_htable | 99 | struct net_bridge_mdb_htable |
diff --git a/net/core/skbuff.c b/net/core/skbuff.c index baf8d281152c..e59840010d45 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c | |||
@@ -952,9 +952,11 @@ int pskb_expand_head(struct sk_buff *skb, int nhead, int ntail, | |||
952 | goto adjust_others; | 952 | goto adjust_others; |
953 | } | 953 | } |
954 | 954 | ||
955 | data = kmalloc(size + sizeof(struct skb_shared_info), gfp_mask); | 955 | data = kmalloc(size + SKB_DATA_ALIGN(sizeof(struct skb_shared_info)), |
956 | gfp_mask); | ||
956 | if (!data) | 957 | if (!data) |
957 | goto nodata; | 958 | goto nodata; |
959 | size = SKB_WITH_OVERHEAD(ksize(data)); | ||
958 | 960 | ||
959 | /* Copy only real data... and, alas, header. This should be | 961 | /* Copy only real data... and, alas, header. This should be |
960 | * optimized for the cases when header is void. | 962 | * optimized for the cases when header is void. |
diff --git a/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c b/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c index de9da21113a1..cf73cc70ed2d 100644 --- a/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c +++ b/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c | |||
@@ -74,16 +74,24 @@ static int ipv4_get_l4proto(const struct sk_buff *skb, unsigned int nhoff, | |||
74 | 74 | ||
75 | iph = skb_header_pointer(skb, nhoff, sizeof(_iph), &_iph); | 75 | iph = skb_header_pointer(skb, nhoff, sizeof(_iph), &_iph); |
76 | if (iph == NULL) | 76 | if (iph == NULL) |
77 | return -NF_DROP; | 77 | return -NF_ACCEPT; |
78 | 78 | ||
79 | /* Conntrack defragments packets, we might still see fragments | 79 | /* Conntrack defragments packets, we might still see fragments |
80 | * inside ICMP packets though. */ | 80 | * inside ICMP packets though. */ |
81 | if (iph->frag_off & htons(IP_OFFSET)) | 81 | if (iph->frag_off & htons(IP_OFFSET)) |
82 | return -NF_DROP; | 82 | return -NF_ACCEPT; |
83 | 83 | ||
84 | *dataoff = nhoff + (iph->ihl << 2); | 84 | *dataoff = nhoff + (iph->ihl << 2); |
85 | *protonum = iph->protocol; | 85 | *protonum = iph->protocol; |
86 | 86 | ||
87 | /* Check bogus IP headers */ | ||
88 | if (*dataoff > skb->len) { | ||
89 | pr_debug("nf_conntrack_ipv4: bogus IPv4 packet: " | ||
90 | "nhoff %u, ihl %u, skblen %u\n", | ||
91 | nhoff, iph->ihl << 2, skb->len); | ||
92 | return -NF_ACCEPT; | ||
93 | } | ||
94 | |||
87 | return NF_ACCEPT; | 95 | return NF_ACCEPT; |
88 | } | 96 | } |
89 | 97 | ||
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 0cd36e33273b..8bb6adeb62c0 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
@@ -701,11 +701,12 @@ struct sk_buff *sk_stream_alloc_skb(struct sock *sk, int size, gfp_t gfp) | |||
701 | skb = alloc_skb_fclone(size + sk->sk_prot->max_header, gfp); | 701 | skb = alloc_skb_fclone(size + sk->sk_prot->max_header, gfp); |
702 | if (skb) { | 702 | if (skb) { |
703 | if (sk_wmem_schedule(sk, skb->truesize)) { | 703 | if (sk_wmem_schedule(sk, skb->truesize)) { |
704 | skb_reserve(skb, sk->sk_prot->max_header); | ||
704 | /* | 705 | /* |
705 | * Make sure that we have exactly size bytes | 706 | * Make sure that we have exactly size bytes |
706 | * available to the caller, no more, no less. | 707 | * available to the caller, no more, no less. |
707 | */ | 708 | */ |
708 | skb_reserve(skb, skb_tailroom(skb) - size); | 709 | skb->avail_size = size; |
709 | return skb; | 710 | return skb; |
710 | } | 711 | } |
711 | __kfree_skb(skb); | 712 | __kfree_skb(skb); |
@@ -995,10 +996,9 @@ new_segment: | |||
995 | copy = seglen; | 996 | copy = seglen; |
996 | 997 | ||
997 | /* Where to copy to? */ | 998 | /* Where to copy to? */ |
998 | if (skb_tailroom(skb) > 0) { | 999 | if (skb_availroom(skb) > 0) { |
999 | /* We have some space in skb head. Superb! */ | 1000 | /* We have some space in skb head. Superb! */ |
1000 | if (copy > skb_tailroom(skb)) | 1001 | copy = min_t(int, copy, skb_availroom(skb)); |
1001 | copy = skb_tailroom(skb); | ||
1002 | err = skb_add_data_nocache(sk, skb, from, copy); | 1002 | err = skb_add_data_nocache(sk, skb, from, copy); |
1003 | if (err) | 1003 | if (err) |
1004 | goto do_fault; | 1004 | goto do_fault; |
@@ -3302,8 +3302,7 @@ void __init tcp_init(void) | |||
3302 | 3302 | ||
3303 | tcp_init_mem(&init_net); | 3303 | tcp_init_mem(&init_net); |
3304 | /* Set per-socket limits to no more than 1/128 the pressure threshold */ | 3304 | /* Set per-socket limits to no more than 1/128 the pressure threshold */ |
3305 | limit = nr_free_buffer_pages() << (PAGE_SHIFT - 10); | 3305 | limit = nr_free_buffer_pages() << (PAGE_SHIFT - 7); |
3306 | limit = max(limit, 128UL); | ||
3307 | max_share = min(4UL*1024*1024, limit); | 3306 | max_share = min(4UL*1024*1024, limit); |
3308 | 3307 | ||
3309 | sysctl_tcp_wmem[0] = SK_MEM_QUANTUM; | 3308 | sysctl_tcp_wmem[0] = SK_MEM_QUANTUM; |
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 05b2dd569691..9944c1d9a218 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
@@ -474,8 +474,11 @@ static void tcp_rcv_rtt_update(struct tcp_sock *tp, u32 sample, int win_dep) | |||
474 | if (!win_dep) { | 474 | if (!win_dep) { |
475 | m -= (new_sample >> 3); | 475 | m -= (new_sample >> 3); |
476 | new_sample += m; | 476 | new_sample += m; |
477 | } else if (m < new_sample) | 477 | } else { |
478 | new_sample = m << 3; | 478 | m <<= 3; |
479 | if (m < new_sample) | ||
480 | new_sample = m; | ||
481 | } | ||
479 | } else { | 482 | } else { |
480 | /* No previous measure. */ | 483 | /* No previous measure. */ |
481 | new_sample = m << 3; | 484 | new_sample = m << 3; |
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index 364784a91939..376b2cfbb685 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c | |||
@@ -2060,7 +2060,7 @@ static void tcp_retrans_try_collapse(struct sock *sk, struct sk_buff *to, | |||
2060 | /* Punt if not enough space exists in the first SKB for | 2060 | /* Punt if not enough space exists in the first SKB for |
2061 | * the data in the second | 2061 | * the data in the second |
2062 | */ | 2062 | */ |
2063 | if (skb->len > skb_tailroom(to)) | 2063 | if (skb->len > skb_availroom(to)) |
2064 | break; | 2064 | break; |
2065 | 2065 | ||
2066 | if (after(TCP_SKB_CB(skb)->end_seq, tcp_wnd_end(tp))) | 2066 | if (after(TCP_SKB_CB(skb)->end_seq, tcp_wnd_end(tp))) |
diff --git a/net/ipv6/netfilter/ip6_tables.c b/net/ipv6/netfilter/ip6_tables.c index 94874b0bdcdc..9d4e15559319 100644 --- a/net/ipv6/netfilter/ip6_tables.c +++ b/net/ipv6/netfilter/ip6_tables.c | |||
@@ -78,19 +78,6 @@ EXPORT_SYMBOL_GPL(ip6t_alloc_initial_table); | |||
78 | 78 | ||
79 | Hence the start of any table is given by get_table() below. */ | 79 | Hence the start of any table is given by get_table() below. */ |
80 | 80 | ||
81 | /* Check for an extension */ | ||
82 | int | ||
83 | ip6t_ext_hdr(u8 nexthdr) | ||
84 | { | ||
85 | return (nexthdr == IPPROTO_HOPOPTS) || | ||
86 | (nexthdr == IPPROTO_ROUTING) || | ||
87 | (nexthdr == IPPROTO_FRAGMENT) || | ||
88 | (nexthdr == IPPROTO_ESP) || | ||
89 | (nexthdr == IPPROTO_AH) || | ||
90 | (nexthdr == IPPROTO_NONE) || | ||
91 | (nexthdr == IPPROTO_DSTOPTS); | ||
92 | } | ||
93 | |||
94 | /* Returns whether matches rule or not. */ | 81 | /* Returns whether matches rule or not. */ |
95 | /* Performance critical - called for every packet */ | 82 | /* Performance critical - called for every packet */ |
96 | static inline bool | 83 | static inline bool |
@@ -2366,7 +2353,6 @@ int ipv6_find_hdr(const struct sk_buff *skb, unsigned int *offset, | |||
2366 | EXPORT_SYMBOL(ip6t_register_table); | 2353 | EXPORT_SYMBOL(ip6t_register_table); |
2367 | EXPORT_SYMBOL(ip6t_unregister_table); | 2354 | EXPORT_SYMBOL(ip6t_unregister_table); |
2368 | EXPORT_SYMBOL(ip6t_do_table); | 2355 | EXPORT_SYMBOL(ip6t_do_table); |
2369 | EXPORT_SYMBOL(ip6t_ext_hdr); | ||
2370 | EXPORT_SYMBOL(ipv6_find_hdr); | 2356 | EXPORT_SYMBOL(ipv6_find_hdr); |
2371 | 2357 | ||
2372 | module_init(ip6_tables_init); | 2358 | module_init(ip6_tables_init); |
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index 576fb25456dd..f76da5b3f5c5 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
@@ -3387,8 +3387,7 @@ int ieee80211_mgd_assoc(struct ieee80211_sub_if_data *sdata, | |||
3387 | */ | 3387 | */ |
3388 | printk(KERN_DEBUG "%s: waiting for beacon from %pM\n", | 3388 | printk(KERN_DEBUG "%s: waiting for beacon from %pM\n", |
3389 | sdata->name, ifmgd->bssid); | 3389 | sdata->name, ifmgd->bssid); |
3390 | assoc_data->timeout = jiffies + | 3390 | assoc_data->timeout = TU_TO_EXP_TIME(req->bss->beacon_interval); |
3391 | TU_TO_EXP_TIME(req->bss->beacon_interval); | ||
3392 | } else { | 3391 | } else { |
3393 | assoc_data->have_beacon = true; | 3392 | assoc_data->have_beacon = true; |
3394 | assoc_data->sent_assoc = false; | 3393 | assoc_data->sent_assoc = false; |
diff --git a/net/netfilter/nf_conntrack_core.c b/net/netfilter/nf_conntrack_core.c index 3cc4487ac349..729f157a0efa 100644 --- a/net/netfilter/nf_conntrack_core.c +++ b/net/netfilter/nf_conntrack_core.c | |||
@@ -1592,7 +1592,7 @@ static int nf_conntrack_init_net(struct net *net) | |||
1592 | return 0; | 1592 | return 0; |
1593 | 1593 | ||
1594 | err_timeout: | 1594 | err_timeout: |
1595 | nf_conntrack_timeout_fini(net); | 1595 | nf_conntrack_ecache_fini(net); |
1596 | err_ecache: | 1596 | err_ecache: |
1597 | nf_conntrack_tstamp_fini(net); | 1597 | nf_conntrack_tstamp_fini(net); |
1598 | err_tstamp: | 1598 | err_tstamp: |
diff --git a/net/netfilter/nf_conntrack_proto_tcp.c b/net/netfilter/nf_conntrack_proto_tcp.c index 361eade62a09..0d07a1dcf605 100644 --- a/net/netfilter/nf_conntrack_proto_tcp.c +++ b/net/netfilter/nf_conntrack_proto_tcp.c | |||
@@ -584,8 +584,8 @@ static bool tcp_in_window(const struct nf_conn *ct, | |||
584 | * Let's try to use the data from the packet. | 584 | * Let's try to use the data from the packet. |
585 | */ | 585 | */ |
586 | sender->td_end = end; | 586 | sender->td_end = end; |
587 | win <<= sender->td_scale; | 587 | swin = win << sender->td_scale; |
588 | sender->td_maxwin = (win == 0 ? 1 : win); | 588 | sender->td_maxwin = (swin == 0 ? 1 : swin); |
589 | sender->td_maxend = end + sender->td_maxwin; | 589 | sender->td_maxend = end + sender->td_maxwin; |
590 | /* | 590 | /* |
591 | * We haven't seen traffic in the other direction yet | 591 | * We haven't seen traffic in the other direction yet |
diff --git a/net/nfc/llcp/commands.c b/net/nfc/llcp/commands.c index 7b76eb7192f3..ef10ffcb4b6f 100644 --- a/net/nfc/llcp/commands.c +++ b/net/nfc/llcp/commands.c | |||
@@ -474,7 +474,7 @@ int nfc_llcp_send_i_frame(struct nfc_llcp_sock *sock, | |||
474 | 474 | ||
475 | while (remaining_len > 0) { | 475 | while (remaining_len > 0) { |
476 | 476 | ||
477 | frag_len = min_t(u16, local->remote_miu, remaining_len); | 477 | frag_len = min_t(size_t, local->remote_miu, remaining_len); |
478 | 478 | ||
479 | pr_debug("Fragment %zd bytes remaining %zd", | 479 | pr_debug("Fragment %zd bytes remaining %zd", |
480 | frag_len, remaining_len); | 480 | frag_len, remaining_len); |
@@ -497,7 +497,7 @@ int nfc_llcp_send_i_frame(struct nfc_llcp_sock *sock, | |||
497 | release_sock(sk); | 497 | release_sock(sk); |
498 | 498 | ||
499 | remaining_len -= frag_len; | 499 | remaining_len -= frag_len; |
500 | msg_ptr += len; | 500 | msg_ptr += frag_len; |
501 | } | 501 | } |
502 | 502 | ||
503 | kfree(msg_data); | 503 | kfree(msg_data); |
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index e49da2797022..f432c57af05d 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
@@ -1294,6 +1294,11 @@ static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info) | |||
1294 | goto bad_res; | 1294 | goto bad_res; |
1295 | } | 1295 | } |
1296 | 1296 | ||
1297 | if (!netif_running(netdev)) { | ||
1298 | result = -ENETDOWN; | ||
1299 | goto bad_res; | ||
1300 | } | ||
1301 | |||
1297 | nla_for_each_nested(nl_txq_params, | 1302 | nla_for_each_nested(nl_txq_params, |
1298 | info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS], | 1303 | info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS], |
1299 | rem_txq_params) { | 1304 | rem_txq_params) { |
@@ -6384,7 +6389,7 @@ static struct genl_ops nl80211_ops[] = { | |||
6384 | .doit = nl80211_get_key, | 6389 | .doit = nl80211_get_key, |
6385 | .policy = nl80211_policy, | 6390 | .policy = nl80211_policy, |
6386 | .flags = GENL_ADMIN_PERM, | 6391 | .flags = GENL_ADMIN_PERM, |
6387 | .internal_flags = NL80211_FLAG_NEED_NETDEV | | 6392 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
6388 | NL80211_FLAG_NEED_RTNL, | 6393 | NL80211_FLAG_NEED_RTNL, |
6389 | }, | 6394 | }, |
6390 | { | 6395 | { |
@@ -6416,7 +6421,7 @@ static struct genl_ops nl80211_ops[] = { | |||
6416 | .policy = nl80211_policy, | 6421 | .policy = nl80211_policy, |
6417 | .flags = GENL_ADMIN_PERM, | 6422 | .flags = GENL_ADMIN_PERM, |
6418 | .doit = nl80211_set_beacon, | 6423 | .doit = nl80211_set_beacon, |
6419 | .internal_flags = NL80211_FLAG_NEED_NETDEV | | 6424 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
6420 | NL80211_FLAG_NEED_RTNL, | 6425 | NL80211_FLAG_NEED_RTNL, |
6421 | }, | 6426 | }, |
6422 | { | 6427 | { |
@@ -6424,7 +6429,7 @@ static struct genl_ops nl80211_ops[] = { | |||
6424 | .policy = nl80211_policy, | 6429 | .policy = nl80211_policy, |
6425 | .flags = GENL_ADMIN_PERM, | 6430 | .flags = GENL_ADMIN_PERM, |
6426 | .doit = nl80211_start_ap, | 6431 | .doit = nl80211_start_ap, |
6427 | .internal_flags = NL80211_FLAG_NEED_NETDEV | | 6432 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
6428 | NL80211_FLAG_NEED_RTNL, | 6433 | NL80211_FLAG_NEED_RTNL, |
6429 | }, | 6434 | }, |
6430 | { | 6435 | { |
@@ -6432,7 +6437,7 @@ static struct genl_ops nl80211_ops[] = { | |||
6432 | .policy = nl80211_policy, | 6437 | .policy = nl80211_policy, |
6433 | .flags = GENL_ADMIN_PERM, | 6438 | .flags = GENL_ADMIN_PERM, |
6434 | .doit = nl80211_stop_ap, | 6439 | .doit = nl80211_stop_ap, |
6435 | .internal_flags = NL80211_FLAG_NEED_NETDEV | | 6440 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
6436 | NL80211_FLAG_NEED_RTNL, | 6441 | NL80211_FLAG_NEED_RTNL, |
6437 | }, | 6442 | }, |
6438 | { | 6443 | { |
@@ -6448,7 +6453,7 @@ static struct genl_ops nl80211_ops[] = { | |||
6448 | .doit = nl80211_set_station, | 6453 | .doit = nl80211_set_station, |
6449 | .policy = nl80211_policy, | 6454 | .policy = nl80211_policy, |
6450 | .flags = GENL_ADMIN_PERM, | 6455 | .flags = GENL_ADMIN_PERM, |
6451 | .internal_flags = NL80211_FLAG_NEED_NETDEV | | 6456 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
6452 | NL80211_FLAG_NEED_RTNL, | 6457 | NL80211_FLAG_NEED_RTNL, |
6453 | }, | 6458 | }, |
6454 | { | 6459 | { |
@@ -6464,7 +6469,7 @@ static struct genl_ops nl80211_ops[] = { | |||
6464 | .doit = nl80211_del_station, | 6469 | .doit = nl80211_del_station, |
6465 | .policy = nl80211_policy, | 6470 | .policy = nl80211_policy, |
6466 | .flags = GENL_ADMIN_PERM, | 6471 | .flags = GENL_ADMIN_PERM, |
6467 | .internal_flags = NL80211_FLAG_NEED_NETDEV | | 6472 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
6468 | NL80211_FLAG_NEED_RTNL, | 6473 | NL80211_FLAG_NEED_RTNL, |
6469 | }, | 6474 | }, |
6470 | { | 6475 | { |
@@ -6497,7 +6502,7 @@ static struct genl_ops nl80211_ops[] = { | |||
6497 | .doit = nl80211_del_mpath, | 6502 | .doit = nl80211_del_mpath, |
6498 | .policy = nl80211_policy, | 6503 | .policy = nl80211_policy, |
6499 | .flags = GENL_ADMIN_PERM, | 6504 | .flags = GENL_ADMIN_PERM, |
6500 | .internal_flags = NL80211_FLAG_NEED_NETDEV | | 6505 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
6501 | NL80211_FLAG_NEED_RTNL, | 6506 | NL80211_FLAG_NEED_RTNL, |
6502 | }, | 6507 | }, |
6503 | { | 6508 | { |
@@ -6505,7 +6510,7 @@ static struct genl_ops nl80211_ops[] = { | |||
6505 | .doit = nl80211_set_bss, | 6510 | .doit = nl80211_set_bss, |
6506 | .policy = nl80211_policy, | 6511 | .policy = nl80211_policy, |
6507 | .flags = GENL_ADMIN_PERM, | 6512 | .flags = GENL_ADMIN_PERM, |
6508 | .internal_flags = NL80211_FLAG_NEED_NETDEV | | 6513 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
6509 | NL80211_FLAG_NEED_RTNL, | 6514 | NL80211_FLAG_NEED_RTNL, |
6510 | }, | 6515 | }, |
6511 | { | 6516 | { |
@@ -6531,7 +6536,7 @@ static struct genl_ops nl80211_ops[] = { | |||
6531 | .doit = nl80211_get_mesh_config, | 6536 | .doit = nl80211_get_mesh_config, |
6532 | .policy = nl80211_policy, | 6537 | .policy = nl80211_policy, |
6533 | /* can be retrieved by unprivileged users */ | 6538 | /* can be retrieved by unprivileged users */ |
6534 | .internal_flags = NL80211_FLAG_NEED_NETDEV | | 6539 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
6535 | NL80211_FLAG_NEED_RTNL, | 6540 | NL80211_FLAG_NEED_RTNL, |
6536 | }, | 6541 | }, |
6537 | { | 6542 | { |
@@ -6664,7 +6669,7 @@ static struct genl_ops nl80211_ops[] = { | |||
6664 | .doit = nl80211_setdel_pmksa, | 6669 | .doit = nl80211_setdel_pmksa, |
6665 | .policy = nl80211_policy, | 6670 | .policy = nl80211_policy, |
6666 | .flags = GENL_ADMIN_PERM, | 6671 | .flags = GENL_ADMIN_PERM, |
6667 | .internal_flags = NL80211_FLAG_NEED_NETDEV | | 6672 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
6668 | NL80211_FLAG_NEED_RTNL, | 6673 | NL80211_FLAG_NEED_RTNL, |
6669 | }, | 6674 | }, |
6670 | { | 6675 | { |
@@ -6672,7 +6677,7 @@ static struct genl_ops nl80211_ops[] = { | |||
6672 | .doit = nl80211_setdel_pmksa, | 6677 | .doit = nl80211_setdel_pmksa, |
6673 | .policy = nl80211_policy, | 6678 | .policy = nl80211_policy, |
6674 | .flags = GENL_ADMIN_PERM, | 6679 | .flags = GENL_ADMIN_PERM, |
6675 | .internal_flags = NL80211_FLAG_NEED_NETDEV | | 6680 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
6676 | NL80211_FLAG_NEED_RTNL, | 6681 | NL80211_FLAG_NEED_RTNL, |
6677 | }, | 6682 | }, |
6678 | { | 6683 | { |
@@ -6680,7 +6685,7 @@ static struct genl_ops nl80211_ops[] = { | |||
6680 | .doit = nl80211_flush_pmksa, | 6685 | .doit = nl80211_flush_pmksa, |
6681 | .policy = nl80211_policy, | 6686 | .policy = nl80211_policy, |
6682 | .flags = GENL_ADMIN_PERM, | 6687 | .flags = GENL_ADMIN_PERM, |
6683 | .internal_flags = NL80211_FLAG_NEED_NETDEV | | 6688 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
6684 | NL80211_FLAG_NEED_RTNL, | 6689 | NL80211_FLAG_NEED_RTNL, |
6685 | }, | 6690 | }, |
6686 | { | 6691 | { |
@@ -6840,7 +6845,7 @@ static struct genl_ops nl80211_ops[] = { | |||
6840 | .doit = nl80211_probe_client, | 6845 | .doit = nl80211_probe_client, |
6841 | .policy = nl80211_policy, | 6846 | .policy = nl80211_policy, |
6842 | .flags = GENL_ADMIN_PERM, | 6847 | .flags = GENL_ADMIN_PERM, |
6843 | .internal_flags = NL80211_FLAG_NEED_NETDEV | | 6848 | .internal_flags = NL80211_FLAG_NEED_NETDEV_UP | |
6844 | NL80211_FLAG_NEED_RTNL, | 6849 | NL80211_FLAG_NEED_RTNL, |
6845 | }, | 6850 | }, |
6846 | { | 6851 | { |
diff --git a/net/wireless/wext-core.c b/net/wireless/wext-core.c index 0af7f54e4f61..af648e08e61b 100644 --- a/net/wireless/wext-core.c +++ b/net/wireless/wext-core.c | |||
@@ -780,8 +780,10 @@ static int ioctl_standard_iw_point(struct iw_point *iwp, unsigned int cmd, | |||
780 | if (cmd == SIOCSIWENCODEEXT) { | 780 | if (cmd == SIOCSIWENCODEEXT) { |
781 | struct iw_encode_ext *ee = (void *) extra; | 781 | struct iw_encode_ext *ee = (void *) extra; |
782 | 782 | ||
783 | if (iwp->length < sizeof(*ee) + ee->key_len) | 783 | if (iwp->length < sizeof(*ee) + ee->key_len) { |
784 | return -EFAULT; | 784 | err = -EFAULT; |
785 | goto out; | ||
786 | } | ||
785 | } | 787 | } |
786 | } | 788 | } |
787 | 789 | ||