Commit 0a878747e18d4d14c5b772dcddddd86bb4c26f8f

Authored by John W. Linville

Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/…

…wireless into for-davem

Also fixed-up a badly indented closing brace...

Signed-off-by: John W. Linville <linville@tuxdriver.com>

Showing 27 changed files Side-by-side Diff

drivers/bcma/driver_pci.c
... ... @@ -210,25 +210,6 @@
210 210 }
211 211 }
212 212  
213   -static void bcma_core_pci_power_save(struct bcma_drv_pci *pc, bool up)
214   -{
215   - u16 data;
216   -
217   - if (pc->core->id.rev >= 15 && pc->core->id.rev <= 20) {
218   - data = up ? 0x74 : 0x7C;
219   - bcma_pcie_mdio_writeread(pc, BCMA_CORE_PCI_MDIO_BLK1,
220   - BCMA_CORE_PCI_MDIO_BLK1_MGMT1, 0x7F64);
221   - bcma_pcie_mdio_writeread(pc, BCMA_CORE_PCI_MDIO_BLK1,
222   - BCMA_CORE_PCI_MDIO_BLK1_MGMT3, data);
223   - } else if (pc->core->id.rev >= 21 && pc->core->id.rev <= 22) {
224   - data = up ? 0x75 : 0x7D;
225   - bcma_pcie_mdio_writeread(pc, BCMA_CORE_PCI_MDIO_BLK1,
226   - BCMA_CORE_PCI_MDIO_BLK1_MGMT1, 0x7E65);
227   - bcma_pcie_mdio_writeread(pc, BCMA_CORE_PCI_MDIO_BLK1,
228   - BCMA_CORE_PCI_MDIO_BLK1_MGMT3, data);
229   - }
230   -}
231   -
232 213 /**************************************************
233 214 * Init.
234 215 **************************************************/
... ... @@ -255,6 +236,32 @@
255 236 bcma_core_pci_clientmode_init(pc);
256 237 }
257 238  
  239 +void bcma_core_pci_power_save(struct bcma_bus *bus, bool up)
  240 +{
  241 + struct bcma_drv_pci *pc;
  242 + u16 data;
  243 +
  244 + if (bus->hosttype != BCMA_HOSTTYPE_PCI)
  245 + return;
  246 +
  247 + pc = &bus->drv_pci[0];
  248 +
  249 + if (pc->core->id.rev >= 15 && pc->core->id.rev <= 20) {
  250 + data = up ? 0x74 : 0x7C;
  251 + bcma_pcie_mdio_writeread(pc, BCMA_CORE_PCI_MDIO_BLK1,
  252 + BCMA_CORE_PCI_MDIO_BLK1_MGMT1, 0x7F64);
  253 + bcma_pcie_mdio_writeread(pc, BCMA_CORE_PCI_MDIO_BLK1,
  254 + BCMA_CORE_PCI_MDIO_BLK1_MGMT3, data);
  255 + } else if (pc->core->id.rev >= 21 && pc->core->id.rev <= 22) {
  256 + data = up ? 0x75 : 0x7D;
  257 + bcma_pcie_mdio_writeread(pc, BCMA_CORE_PCI_MDIO_BLK1,
  258 + BCMA_CORE_PCI_MDIO_BLK1_MGMT1, 0x7E65);
  259 + bcma_pcie_mdio_writeread(pc, BCMA_CORE_PCI_MDIO_BLK1,
  260 + BCMA_CORE_PCI_MDIO_BLK1_MGMT3, data);
  261 + }
  262 +}
  263 +EXPORT_SYMBOL_GPL(bcma_core_pci_power_save);
  264 +
258 265 int bcma_core_pci_irq_ctl(struct bcma_drv_pci *pc, struct bcma_device *core,
259 266 bool enable)
260 267 {
... ... @@ -310,8 +317,6 @@
310 317  
311 318 pc = &bus->drv_pci[0];
312 319  
313   - bcma_core_pci_power_save(pc, true);
314   -
315 320 bcma_core_pci_extend_L1timer(pc, true);
316 321 }
317 322 EXPORT_SYMBOL_GPL(bcma_core_pci_up);
... ... @@ -326,8 +331,6 @@
326 331 pc = &bus->drv_pci[0];
327 332  
328 333 bcma_core_pci_extend_L1timer(pc, false);
329   -
330   - bcma_core_pci_power_save(pc, false);
331 334 }
332 335 EXPORT_SYMBOL_GPL(bcma_core_pci_down);
drivers/bluetooth/ath3k.c
... ... @@ -85,6 +85,7 @@
85 85 { USB_DEVICE(0x04CA, 0x3008) },
86 86 { USB_DEVICE(0x13d3, 0x3362) },
87 87 { USB_DEVICE(0x0CF3, 0xE004) },
  88 + { USB_DEVICE(0x0CF3, 0xE005) },
88 89 { USB_DEVICE(0x0930, 0x0219) },
89 90 { USB_DEVICE(0x0489, 0xe057) },
90 91 { USB_DEVICE(0x13d3, 0x3393) },
... ... @@ -126,6 +127,7 @@
126 127 { USB_DEVICE(0x04ca, 0x3008), .driver_info = BTUSB_ATH3012 },
127 128 { USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 },
128 129 { USB_DEVICE(0x0cf3, 0xe004), .driver_info = BTUSB_ATH3012 },
  130 + { USB_DEVICE(0x0cf3, 0xe005), .driver_info = BTUSB_ATH3012 },
129 131 { USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 },
130 132 { USB_DEVICE(0x0489, 0xe057), .driver_info = BTUSB_ATH3012 },
131 133 { USB_DEVICE(0x13d3, 0x3393), .driver_info = BTUSB_ATH3012 },
drivers/bluetooth/btusb.c
... ... @@ -102,6 +102,7 @@
102 102  
103 103 /* Broadcom BCM20702A0 */
104 104 { USB_DEVICE(0x0b05, 0x17b5) },
  105 + { USB_DEVICE(0x0b05, 0x17cb) },
105 106 { USB_DEVICE(0x04ca, 0x2003) },
106 107 { USB_DEVICE(0x0489, 0xe042) },
107 108 { USB_DEVICE(0x413c, 0x8197) },
... ... @@ -112,6 +113,9 @@
112 113 /*Broadcom devices with vendor specific id */
113 114 { USB_VENDOR_AND_INTERFACE_INFO(0x0a5c, 0xff, 0x01, 0x01) },
114 115  
  116 + /* Belkin F8065bf - Broadcom based */
  117 + { USB_VENDOR_AND_INTERFACE_INFO(0x050d, 0xff, 0x01, 0x01) },
  118 +
115 119 { } /* Terminating entry */
116 120 };
117 121  
... ... @@ -148,6 +152,7 @@
148 152 { USB_DEVICE(0x04ca, 0x3008), .driver_info = BTUSB_ATH3012 },
149 153 { USB_DEVICE(0x13d3, 0x3362), .driver_info = BTUSB_ATH3012 },
150 154 { USB_DEVICE(0x0cf3, 0xe004), .driver_info = BTUSB_ATH3012 },
  155 + { USB_DEVICE(0x0cf3, 0xe005), .driver_info = BTUSB_ATH3012 },
151 156 { USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 },
152 157 { USB_DEVICE(0x0489, 0xe057), .driver_info = BTUSB_ATH3012 },
153 158 { USB_DEVICE(0x13d3, 0x3393), .driver_info = BTUSB_ATH3012 },
drivers/net/wireless/ath/ath9k/recv.c
... ... @@ -1270,13 +1270,6 @@
1270 1270 return;
1271 1271  
1272 1272 /*
1273   - * All MPDUs in an aggregate will use the same LNA
1274   - * as the first MPDU.
1275   - */
1276   - if (rs->rs_isaggr && !rs->rs_firstaggr)
1277   - return;
1278   -
1279   - /*
1280 1273 * Change the default rx antenna if rx diversity
1281 1274 * chooses the other antenna 3 times in a row.
1282 1275 */
drivers/net/wireless/ath/ath9k/xmit.c
... ... @@ -399,6 +399,7 @@
399 399 tbf->bf_buf_addr = bf->bf_buf_addr;
400 400 memcpy(tbf->bf_desc, bf->bf_desc, sc->sc_ah->caps.tx_desc_len);
401 401 tbf->bf_state = bf->bf_state;
  402 + tbf->bf_state.stale = false;
402 403  
403 404 return tbf;
404 405 }
405 406  
406 407  
... ... @@ -1389,12 +1390,16 @@
1389 1390 u16 tid, u16 *ssn)
1390 1391 {
1391 1392 struct ath_atx_tid *txtid;
  1393 + struct ath_txq *txq;
1392 1394 struct ath_node *an;
1393 1395 u8 density;
1394 1396  
1395 1397 an = (struct ath_node *)sta->drv_priv;
1396 1398 txtid = ATH_AN_2_TID(an, tid);
  1399 + txq = txtid->ac->txq;
1397 1400  
  1401 + ath_txq_lock(sc, txq);
  1402 +
1398 1403 /* update ampdu factor/density, they may have changed. This may happen
1399 1404 * in HT IBSS when a beacon with HT-info is received after the station
1400 1405 * has already been added.
... ... @@ -1417,6 +1422,8 @@
1417 1422 memset(txtid->tx_buf, 0, sizeof(txtid->tx_buf));
1418 1423 txtid->baw_head = txtid->baw_tail = 0;
1419 1424  
  1425 + ath_txq_unlock_complete(sc, txq);
  1426 +
1420 1427 return 0;
1421 1428 }
1422 1429  
... ... @@ -1555,8 +1562,10 @@
1555 1562 __skb_unlink(bf->bf_mpdu, tid_q);
1556 1563 list_add_tail(&bf->list, &bf_q);
1557 1564 ath_set_rates(tid->an->vif, tid->an->sta, bf);
1558   - ath_tx_addto_baw(sc, tid, bf);
1559   - bf->bf_state.bf_type &= ~BUF_AGGR;
  1565 + if (bf_isampdu(bf)) {
  1566 + ath_tx_addto_baw(sc, tid, bf);
  1567 + bf->bf_state.bf_type &= ~BUF_AGGR;
  1568 + }
1560 1569 if (bf_tail)
1561 1570 bf_tail->bf_next = bf;
1562 1571  
... ... @@ -1950,7 +1959,9 @@
1950 1959 if (bf_is_ampdu_not_probing(bf))
1951 1960 txq->axq_ampdu_depth++;
1952 1961  
1953   - bf = bf->bf_lastbf->bf_next;
  1962 + bf_last = bf->bf_lastbf;
  1963 + bf = bf_last->bf_next;
  1964 + bf_last->bf_next = NULL;
1954 1965 }
1955 1966 }
1956 1967 }
drivers/net/wireless/brcm80211/brcmfmac/bcmsdh_sdmmc.c
... ... @@ -464,8 +464,6 @@
464 464  
465 465 static int brcmf_sdio_pd_probe(struct platform_device *pdev)
466 466 {
467   - int ret;
468   -
469 467 brcmf_dbg(SDIO, "Enter\n");
470 468  
471 469 brcmfmac_sdio_pdata = pdev->dev.platform_data;
... ... @@ -473,11 +471,7 @@
473 471 if (brcmfmac_sdio_pdata->power_on)
474 472 brcmfmac_sdio_pdata->power_on();
475 473  
476   - ret = sdio_register_driver(&brcmf_sdmmc_driver);
477   - if (ret)
478   - brcmf_err("sdio_register_driver failed: %d\n", ret);
479   -
480   - return ret;
  474 + return 0;
481 475 }
482 476  
483 477 static int brcmf_sdio_pd_remove(struct platform_device *pdev)
... ... @@ -500,6 +494,15 @@
500 494 }
501 495 };
502 496  
  497 +void brcmf_sdio_register(void)
  498 +{
  499 + int ret;
  500 +
  501 + ret = sdio_register_driver(&brcmf_sdmmc_driver);
  502 + if (ret)
  503 + brcmf_err("sdio_register_driver failed: %d\n", ret);
  504 +}
  505 +
503 506 void brcmf_sdio_exit(void)
504 507 {
505 508 brcmf_dbg(SDIO, "Enter\n");
506 509  
... ... @@ -510,19 +513,14 @@
510 513 sdio_unregister_driver(&brcmf_sdmmc_driver);
511 514 }
512 515  
513   -void brcmf_sdio_init(void)
  516 +void __init brcmf_sdio_init(void)
514 517 {
515 518 int ret;
516 519  
517 520 brcmf_dbg(SDIO, "Enter\n");
518 521  
519 522 ret = platform_driver_probe(&brcmf_sdio_pd, brcmf_sdio_pd_probe);
520   - if (ret == -ENODEV) {
521   - brcmf_dbg(SDIO, "No platform data available, registering without.\n");
522   - ret = sdio_register_driver(&brcmf_sdmmc_driver);
523   - }
524   -
525   - if (ret)
526   - brcmf_err("driver registration failed: %d\n", ret);
  523 + if (ret == -ENODEV)
  524 + brcmf_dbg(SDIO, "No platform data available.\n");
527 525 }
drivers/net/wireless/brcm80211/brcmfmac/dhd_bus.h
... ... @@ -156,10 +156,11 @@
156 156 #ifdef CONFIG_BRCMFMAC_SDIO
157 157 extern void brcmf_sdio_exit(void);
158 158 extern void brcmf_sdio_init(void);
  159 +extern void brcmf_sdio_register(void);
159 160 #endif
160 161 #ifdef CONFIG_BRCMFMAC_USB
161 162 extern void brcmf_usb_exit(void);
162   -extern void brcmf_usb_init(void);
  163 +extern void brcmf_usb_register(void);
163 164 #endif
164 165  
165 166 #endif /* _BRCMF_BUS_H_ */
drivers/net/wireless/brcm80211/brcmfmac/dhd_linux.c
... ... @@ -1231,21 +1231,23 @@
1231 1231 return bus->chip << 4 | bus->chiprev;
1232 1232 }
1233 1233  
1234   -static void brcmf_driver_init(struct work_struct *work)
  1234 +static void brcmf_driver_register(struct work_struct *work)
1235 1235 {
1236   - brcmf_debugfs_init();
1237   -
1238 1236 #ifdef CONFIG_BRCMFMAC_SDIO
1239   - brcmf_sdio_init();
  1237 + brcmf_sdio_register();
1240 1238 #endif
1241 1239 #ifdef CONFIG_BRCMFMAC_USB
1242   - brcmf_usb_init();
  1240 + brcmf_usb_register();
1243 1241 #endif
1244 1242 }
1245   -static DECLARE_WORK(brcmf_driver_work, brcmf_driver_init);
  1243 +static DECLARE_WORK(brcmf_driver_work, brcmf_driver_register);
1246 1244  
1247 1245 static int __init brcmfmac_module_init(void)
1248 1246 {
  1247 + brcmf_debugfs_init();
  1248 +#ifdef CONFIG_BRCMFMAC_SDIO
  1249 + brcmf_sdio_init();
  1250 +#endif
1249 1251 if (!schedule_work(&brcmf_driver_work))
1250 1252 return -EBUSY;
1251 1253  
drivers/net/wireless/brcm80211/brcmfmac/usb.c
... ... @@ -1539,7 +1539,7 @@
1539 1539 brcmf_release_fw(&fw_image_list);
1540 1540 }
1541 1541  
1542   -void brcmf_usb_init(void)
  1542 +void brcmf_usb_register(void)
1543 1543 {
1544 1544 brcmf_dbg(USB, "Enter\n");
1545 1545 INIT_LIST_HEAD(&fw_image_list);
drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
... ... @@ -457,6 +457,8 @@
457 457 if (err != 0)
458 458 brcms_err(wl->wlc->hw->d11core, "%s: brcms_up() returned %d\n",
459 459 __func__, err);
  460 +
  461 + bcma_core_pci_power_save(wl->wlc->hw->d11core->bus, true);
460 462 return err;
461 463 }
462 464  
... ... @@ -478,6 +480,8 @@
478 480 "wl: brcms_ops_stop: chipmatch failed\n");
479 481 return;
480 482 }
  483 +
  484 + bcma_core_pci_power_save(wl->wlc->hw->d11core->bus, false);
481 485  
482 486 /* put driver in down state */
483 487 spin_lock_bh(&wl->lock);
drivers/net/wireless/cw1200/cw1200_spi.c
... ... @@ -42,7 +42,6 @@
42 42 spinlock_t lock; /* Serialize all bus operations */
43 43 wait_queue_head_t wq;
44 44 int claimed;
45   - int irq_disabled;
46 45 };
47 46  
48 47 #define SDIO_TO_SPI_ADDR(addr) ((addr & 0x1f)>>2)
... ... @@ -238,8 +237,6 @@
238 237 struct hwbus_priv *self = dev_id;
239 238  
240 239 if (self->core) {
241   - disable_irq_nosync(self->func->irq);
242   - self->irq_disabled = 1;
243 240 cw1200_irq_handler(self->core);
244 241 return IRQ_HANDLED;
245 242 } else {
... ... @@ -253,9 +250,10 @@
253 250  
254 251 pr_debug("SW IRQ subscribe\n");
255 252  
256   - ret = request_any_context_irq(self->func->irq, cw1200_spi_irq_handler,
257   - IRQF_TRIGGER_HIGH,
258   - "cw1200_wlan_irq", self);
  253 + ret = request_threaded_irq(self->func->irq, NULL,
  254 + cw1200_spi_irq_handler,
  255 + IRQF_TRIGGER_HIGH | IRQF_ONESHOT,
  256 + "cw1200_wlan_irq", self);
259 257 if (WARN_ON(ret < 0))
260 258 goto exit;
261 259  
262 260  
263 261  
... ... @@ -273,24 +271,15 @@
273 271  
274 272 static int cw1200_spi_irq_unsubscribe(struct hwbus_priv *self)
275 273 {
  274 + int ret = 0;
  275 +
276 276 pr_debug("SW IRQ unsubscribe\n");
277 277 disable_irq_wake(self->func->irq);
278 278 free_irq(self->func->irq, self);
279 279  
280   - return 0;
  280 + return ret;
281 281 }
282 282  
283   -static int cw1200_spi_irq_enable(struct hwbus_priv *self, int enable)
284   -{
285   - /* Disables are handled by the interrupt handler */
286   - if (enable && self->irq_disabled) {
287   - enable_irq(self->func->irq);
288   - self->irq_disabled = 0;
289   - }
290   -
291   - return 0;
292   -}
293   -
294 283 static int cw1200_spi_off(const struct cw1200_platform_data_spi *pdata)
295 284 {
296 285 if (pdata->reset) {
... ... @@ -368,7 +357,6 @@
368 357 .unlock = cw1200_spi_unlock,
369 358 .align_size = cw1200_spi_align_size,
370 359 .power_mgmt = cw1200_spi_pm,
371   - .irq_enable = cw1200_spi_irq_enable,
372 360 };
373 361  
374 362 /* Probe Function to be called by SPI stack when device is discovered */
drivers/net/wireless/cw1200/fwio.c
... ... @@ -485,7 +485,7 @@
485 485  
486 486 /* Enable interrupt signalling */
487 487 priv->hwbus_ops->lock(priv->hwbus_priv);
488   - ret = __cw1200_irq_enable(priv, 2);
  488 + ret = __cw1200_irq_enable(priv, 1);
489 489 priv->hwbus_ops->unlock(priv->hwbus_priv);
490 490 if (ret < 0)
491 491 goto unsubscribe;
drivers/net/wireless/cw1200/hwbus.h
... ... @@ -28,7 +28,6 @@
28 28 void (*unlock)(struct hwbus_priv *self);
29 29 size_t (*align_size)(struct hwbus_priv *self, size_t size);
30 30 int (*power_mgmt)(struct hwbus_priv *self, bool suspend);
31   - int (*irq_enable)(struct hwbus_priv *self, int enable);
32 31 };
33 32  
34 33 #endif /* CW1200_HWBUS_H */
drivers/net/wireless/cw1200/hwio.c
... ... @@ -273,21 +273,6 @@
273 273 u16 val16;
274 274 int ret;
275 275  
276   - /* We need to do this hack because the SPI layer can sleep on I/O
277   - and the general path involves I/O to the device in interrupt
278   - context.
279   -
280   - However, the initial enable call needs to go to the hardware.
281   -
282   - We don't worry about shutdown because we do a full reset which
283   - clears the interrupt enabled bits.
284   - */
285   - if (priv->hwbus_ops->irq_enable) {
286   - ret = priv->hwbus_ops->irq_enable(priv->hwbus_priv, enable);
287   - if (ret || enable < 2)
288   - return ret;
289   - }
290   -
291 276 if (HIF_8601_SILICON == priv->hw_type) {
292 277 ret = __cw1200_reg_read_32(priv, ST90TDS_CONFIG_REG_ID, &val32);
293 278 if (ret < 0) {
drivers/net/wireless/mwifiex/11n_aggr.c
... ... @@ -150,7 +150,7 @@
150 150 */
151 151 int
152 152 mwifiex_11n_aggregate_pkt(struct mwifiex_private *priv,
153   - struct mwifiex_ra_list_tbl *pra_list, int headroom,
  153 + struct mwifiex_ra_list_tbl *pra_list,
154 154 int ptrindex, unsigned long ra_list_flags)
155 155 __releases(&priv->wmm.ra_list_spinlock)
156 156 {
... ... @@ -160,6 +160,7 @@
160 160 int pad = 0, ret;
161 161 struct mwifiex_tx_param tx_param;
162 162 struct txpd *ptx_pd = NULL;
  163 + int headroom = adapter->iface_type == MWIFIEX_USB ? 0 : INTF_HEADER_LEN;
163 164  
164 165 skb_src = skb_peek(&pra_list->skb_head);
165 166 if (!skb_src) {
drivers/net/wireless/mwifiex/11n_aggr.h
... ... @@ -26,7 +26,7 @@
26 26 int mwifiex_11n_deaggregate_pkt(struct mwifiex_private *priv,
27 27 struct sk_buff *skb);
28 28 int mwifiex_11n_aggregate_pkt(struct mwifiex_private *priv,
29   - struct mwifiex_ra_list_tbl *ptr, int headroom,
  29 + struct mwifiex_ra_list_tbl *ptr,
30 30 int ptr_index, unsigned long flags)
31 31 __releases(&priv->wmm.ra_list_spinlock);
32 32  
drivers/net/wireless/mwifiex/cmdevt.c
... ... @@ -1155,7 +1155,7 @@
1155 1155 uint32_t conditions = le32_to_cpu(phs_cfg->params.hs_config.conditions);
1156 1156  
1157 1157 if (phs_cfg->action == cpu_to_le16(HS_ACTIVATE) &&
1158   - adapter->iface_type == MWIFIEX_SDIO) {
  1158 + adapter->iface_type != MWIFIEX_USB) {
1159 1159 mwifiex_hs_activated_event(priv, true);
1160 1160 return 0;
1161 1161 } else {
... ... @@ -1167,8 +1167,7 @@
1167 1167 }
1168 1168 if (conditions != HS_CFG_CANCEL) {
1169 1169 adapter->is_hs_configured = true;
1170   - if (adapter->iface_type == MWIFIEX_USB ||
1171   - adapter->iface_type == MWIFIEX_PCIE)
  1170 + if (adapter->iface_type == MWIFIEX_USB)
1172 1171 mwifiex_hs_activated_event(priv, true);
1173 1172 } else {
1174 1173 adapter->is_hs_configured = false;
drivers/net/wireless/mwifiex/usb.c
... ... @@ -447,9 +447,6 @@
447 447 */
448 448 adapter->is_suspended = true;
449 449  
450   - for (i = 0; i < adapter->priv_num; i++)
451   - netif_carrier_off(adapter->priv[i]->netdev);
452   -
453 450 if (atomic_read(&card->rx_cmd_urb_pending) && card->rx_cmd.urb)
454 451 usb_kill_urb(card->rx_cmd.urb);
455 452  
... ... @@ -508,10 +505,6 @@
508 505 mwifiex_usb_submit_rx_urb(&card->rx_cmd,
509 506 MWIFIEX_RX_CMD_BUF_SIZE);
510 507 }
511   -
512   - for (i = 0; i < adapter->priv_num; i++)
513   - if (adapter->priv[i]->media_connected)
514   - netif_carrier_on(adapter->priv[i]->netdev);
515 508  
516 509 /* Disable Host Sleep */
517 510 if (adapter->hs_activated)
drivers/net/wireless/mwifiex/wmm.c
... ... @@ -1239,8 +1239,7 @@
1239 1239 if (enable_tx_amsdu && mwifiex_is_amsdu_allowed(priv, tid) &&
1240 1240 mwifiex_is_11n_aggragation_possible(priv, ptr,
1241 1241 adapter->tx_buf_size))
1242   - mwifiex_11n_aggregate_pkt(priv, ptr, INTF_HEADER_LEN,
1243   - ptr_index, flags);
  1242 + mwifiex_11n_aggregate_pkt(priv, ptr, ptr_index, flags);
1244 1243 /* ra_list_spinlock has been freed in
1245 1244 mwifiex_11n_aggregate_pkt() */
1246 1245 else
drivers/net/wireless/p54/p54usb.c
... ... @@ -83,6 +83,7 @@
83 83 {USB_DEVICE(0x06a9, 0x000e)}, /* Westell 802.11g USB (A90-211WG-01) */
84 84 {USB_DEVICE(0x06b9, 0x0121)}, /* Thomson SpeedTouch 121g */
85 85 {USB_DEVICE(0x0707, 0xee13)}, /* SMC 2862W-G version 2 */
  86 + {USB_DEVICE(0x07aa, 0x0020)}, /* Corega WLUSB2GTST USB */
86 87 {USB_DEVICE(0x0803, 0x4310)}, /* Zoom 4410a */
87 88 {USB_DEVICE(0x083a, 0x4521)}, /* Siemens Gigaset USB Adapter 54 version 2 */
88 89 {USB_DEVICE(0x083a, 0x4531)}, /* T-Com Sinus 154 data II */
... ... @@ -979,6 +980,7 @@
979 980 if (err) {
980 981 dev_err(&priv->udev->dev, "(p54usb) cannot load firmware %s "
981 982 "(%d)!\n", p54u_fwlist[i].fw, err);
  983 + usb_put_dev(udev);
982 984 }
983 985  
984 986 return err;
drivers/net/wireless/rtlwifi/wifi.h
... ... @@ -2057,7 +2057,7 @@
2057 2057 that it points to the data allocated
2058 2058 beyond this structure like:
2059 2059 rtl_pci_priv or rtl_usb_priv */
2060   - u8 priv[0];
  2060 + u8 priv[0] __aligned(sizeof(void *));
2061 2061 };
2062 2062  
2063 2063 #define rtl_priv(hw) (((struct rtl_priv *)(hw)->priv))
include/linux/bcma/bcma_driver_pci.h
... ... @@ -242,6 +242,7 @@
242 242 struct bcma_device *core, bool enable);
243 243 extern void bcma_core_pci_up(struct bcma_bus *bus);
244 244 extern void bcma_core_pci_down(struct bcma_bus *bus);
  245 +extern void bcma_core_pci_power_save(struct bcma_bus *bus, bool up);
245 246  
246 247 extern int bcma_core_pci_pcibios_map_irq(const struct pci_dev *dev);
247 248 extern int bcma_core_pci_plat_dev_init(struct pci_dev *dev);
include/net/bluetooth/hci.h
... ... @@ -104,6 +104,7 @@
104 104 enum {
105 105 HCI_SETUP,
106 106 HCI_AUTO_OFF,
  107 + HCI_RFKILLED,
107 108 HCI_MGMT,
108 109 HCI_PAIRABLE,
109 110 HCI_SERVICE_CACHE,
net/bluetooth/hci_core.c
... ... @@ -1146,7 +1146,11 @@
1146 1146 goto done;
1147 1147 }
1148 1148  
1149   - if (hdev->rfkill && rfkill_blocked(hdev->rfkill)) {
  1149 + /* Check for rfkill but allow the HCI setup stage to proceed
  1150 + * (which in itself doesn't cause any RF activity).
  1151 + */
  1152 + if (test_bit(HCI_RFKILLED, &hdev->dev_flags) &&
  1153 + !test_bit(HCI_SETUP, &hdev->dev_flags)) {
1150 1154 ret = -ERFKILL;
1151 1155 goto done;
1152 1156 }
1153 1157  
... ... @@ -1566,11 +1570,14 @@
1566 1570  
1567 1571 BT_DBG("%p name %s blocked %d", hdev, hdev->name, blocked);
1568 1572  
1569   - if (!blocked)
1570   - return 0;
  1573 + if (blocked) {
  1574 + set_bit(HCI_RFKILLED, &hdev->dev_flags);
  1575 + if (!test_bit(HCI_SETUP, &hdev->dev_flags))
  1576 + hci_dev_do_close(hdev);
  1577 + } else {
  1578 + clear_bit(HCI_RFKILLED, &hdev->dev_flags);
  1579 + }
1571 1580  
1572   - hci_dev_do_close(hdev);
1573   -
1574 1581 return 0;
1575 1582 }
1576 1583  
1577 1584  
... ... @@ -1591,9 +1598,13 @@
1591 1598 return;
1592 1599 }
1593 1600  
1594   - if (test_bit(HCI_AUTO_OFF, &hdev->dev_flags))
  1601 + if (test_bit(HCI_RFKILLED, &hdev->dev_flags)) {
  1602 + clear_bit(HCI_AUTO_OFF, &hdev->dev_flags);
  1603 + hci_dev_do_close(hdev);
  1604 + } else if (test_bit(HCI_AUTO_OFF, &hdev->dev_flags)) {
1595 1605 queue_delayed_work(hdev->req_workqueue, &hdev->power_off,
1596 1606 HCI_AUTO_OFF_TIMEOUT);
  1607 + }
1597 1608  
1598 1609 if (test_and_clear_bit(HCI_SETUP, &hdev->dev_flags))
1599 1610 mgmt_index_added(hdev);
... ... @@ -2208,6 +2219,9 @@
2208 2219 hdev->rfkill = NULL;
2209 2220 }
2210 2221 }
  2222 +
  2223 + if (hdev->rfkill && rfkill_blocked(hdev->rfkill))
  2224 + set_bit(HCI_RFKILLED, &hdev->dev_flags);
2211 2225  
2212 2226 set_bit(HCI_SETUP, &hdev->dev_flags);
2213 2227  
net/bluetooth/hci_event.c
... ... @@ -3557,7 +3557,11 @@
3557 3557 cp.handle = cpu_to_le16(conn->handle);
3558 3558  
3559 3559 if (ltk->authenticated)
3560   - conn->sec_level = BT_SECURITY_HIGH;
  3560 + conn->pending_sec_level = BT_SECURITY_HIGH;
  3561 + else
  3562 + conn->pending_sec_level = BT_SECURITY_MEDIUM;
  3563 +
  3564 + conn->enc_key_size = ltk->enc_size;
3561 3565  
3562 3566 hci_send_cmd(hdev, HCI_OP_LE_LTK_REPLY, sizeof(cp), &cp);
3563 3567  
net/bluetooth/l2cap_core.c
... ... @@ -3755,6 +3755,13 @@
3755 3755  
3756 3756 sk = chan->sk;
3757 3757  
  3758 + /* For certain devices (ex: HID mouse), support for authentication,
  3759 + * pairing and bonding is optional. For such devices, inorder to avoid
  3760 + * the ACL alive for too long after L2CAP disconnection, reset the ACL
  3761 + * disc_timeout back to HCI_DISCONN_TIMEOUT during L2CAP connect.
  3762 + */
  3763 + conn->hcon->disc_timeout = HCI_DISCONN_TIMEOUT;
  3764 +
3758 3765 bacpy(&bt_sk(sk)->src, conn->src);
3759 3766 bacpy(&bt_sk(sk)->dst, conn->dst);
3760 3767 chan->psm = psm;
net/bluetooth/rfcomm/tty.c
... ... @@ -569,7 +569,6 @@
569 569 static void rfcomm_dev_state_change(struct rfcomm_dlc *dlc, int err)
570 570 {
571 571 struct rfcomm_dev *dev = dlc->owner;
572   - struct tty_struct *tty;
573 572 if (!dev)
574 573 return;
575 574  
... ... @@ -581,38 +580,8 @@
581 580 DPM_ORDER_DEV_AFTER_PARENT);
582 581  
583 582 wake_up_interruptible(&dev->port.open_wait);
584   - } else if (dlc->state == BT_CLOSED) {
585   - tty = tty_port_tty_get(&dev->port);
586   - if (!tty) {
587   - if (test_bit(RFCOMM_RELEASE_ONHUP, &dev->flags)) {
588   - /* Drop DLC lock here to avoid deadlock
589   - * 1. rfcomm_dev_get will take rfcomm_dev_lock
590   - * but in rfcomm_dev_add there's lock order:
591   - * rfcomm_dev_lock -> dlc lock
592   - * 2. tty_port_put will deadlock if it's
593   - * the last reference
594   - *
595   - * FIXME: when we release the lock anything
596   - * could happen to dev, even its destruction
597   - */
598   - rfcomm_dlc_unlock(dlc);
599   - if (rfcomm_dev_get(dev->id) == NULL) {
600   - rfcomm_dlc_lock(dlc);
601   - return;
602   - }
603   -
604   - if (!test_and_set_bit(RFCOMM_TTY_RELEASED,
605   - &dev->flags))
606   - tty_port_put(&dev->port);
607   -
608   - tty_port_put(&dev->port);
609   - rfcomm_dlc_lock(dlc);
610   - }
611   - } else {
612   - tty_hangup(tty);
613   - tty_kref_put(tty);
614   - }
615   - }
  583 + } else if (dlc->state == BT_CLOSED)
  584 + tty_port_tty_hangup(&dev->port, false);
616 585 }
617 586  
618 587 static void rfcomm_dev_modem_status(struct rfcomm_dlc *dlc, u8 v24_sig)