Commit 5d22df200beccb1dea26fe4d8684ed93ae2f0aeb
Exists in
master
and in
38 other branches
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless
Conflicts: drivers/net/wireless/iwlwifi/iwl-agn.c
Showing 13 changed files Side-by-side Diff
- drivers/net/wireless/ath/ath9k/main.c
- drivers/net/wireless/ath/ath9k/rc.c
- drivers/net/wireless/iwlwifi/iwl-agn-rxon.c
- drivers/net/wireless/iwlwifi/iwl-agn-tx.c
- drivers/net/wireless/iwlwifi/iwl-mac80211.c
- drivers/net/wireless/mwifiex/cmdevt.c
- drivers/net/wireless/rtlwifi/rtl8192ce/phy.c
- drivers/net/wireless/rtlwifi/rtl8192cu/phy.c
- drivers/net/wireless/rtlwifi/rtl8192de/phy.c
- drivers/net/wireless/rtlwifi/rtl8192se/phy.c
- drivers/ssb/driver_pcicore.c
- net/mac80211/agg-tx.c
- net/nfc/nci/core.c
drivers/net/wireless/ath/ath9k/main.c
... | ... | @@ -286,7 +286,7 @@ |
286 | 286 | ath_start_ani(common); |
287 | 287 | } |
288 | 288 | |
289 | - if (ath9k_hw_ops(ah)->antdiv_comb_conf_get && sc->ant_rx != 3) { | |
289 | + if ((ah->caps.hw_caps & ATH9K_HW_CAP_ANT_DIV_COMB) && sc->ant_rx != 3) { | |
290 | 290 | struct ath_hw_antcomb_conf div_ant_conf; |
291 | 291 | u8 lna_conf; |
292 | 292 |
drivers/net/wireless/ath/ath9k/rc.c
... | ... | @@ -1271,7 +1271,9 @@ |
1271 | 1271 | |
1272 | 1272 | ath_rc_priv->max_valid_rate = k; |
1273 | 1273 | ath_rc_sort_validrates(rate_table, ath_rc_priv); |
1274 | - ath_rc_priv->rate_max_phy = ath_rc_priv->valid_rate_index[k-4]; | |
1274 | + ath_rc_priv->rate_max_phy = (k > 4) ? | |
1275 | + ath_rc_priv->valid_rate_index[k-4] : | |
1276 | + ath_rc_priv->valid_rate_index[k-1]; | |
1275 | 1277 | ath_rc_priv->rate_table = rate_table; |
1276 | 1278 | |
1277 | 1279 | ath_dbg(common, ATH_DBG_CONFIG, |
drivers/net/wireless/iwlwifi/iwl-agn-rxon.c
... | ... | @@ -610,8 +610,8 @@ |
610 | 610 | if (ctx->ht.enabled) { |
611 | 611 | /* if HT40 is used, it should not change |
612 | 612 | * after associated except channel switch */ |
613 | - if (iwl_is_associated_ctx(ctx) && | |
614 | - !ctx->ht.is_40mhz) | |
613 | + if (!ctx->ht.is_40mhz || | |
614 | + !iwl_is_associated_ctx(ctx)) | |
615 | 615 | iwlagn_config_ht40(conf, ctx); |
616 | 616 | } else |
617 | 617 | ctx->ht.is_40mhz = false; |
drivers/net/wireless/iwlwifi/iwl-agn-tx.c
... | ... | @@ -91,7 +91,10 @@ |
91 | 91 | tx_cmd->tid_tspec = qc[0] & 0xf; |
92 | 92 | tx_flags &= ~TX_CMD_FLG_SEQ_CTL_MSK; |
93 | 93 | } else { |
94 | - tx_flags |= TX_CMD_FLG_SEQ_CTL_MSK; | |
94 | + if (info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) | |
95 | + tx_flags |= TX_CMD_FLG_SEQ_CTL_MSK; | |
96 | + else | |
97 | + tx_flags &= ~TX_CMD_FLG_SEQ_CTL_MSK; | |
95 | 98 | } |
96 | 99 | |
97 | 100 | iwlagn_tx_cmd_protection(priv, info, fc, &tx_flags); |
drivers/net/wireless/iwlwifi/iwl-mac80211.c
... | ... | @@ -1048,6 +1048,9 @@ |
1048 | 1048 | int ret; |
1049 | 1049 | u8 sta_id; |
1050 | 1050 | |
1051 | + if (ctx->ctxid != IWL_RXON_CTX_PAN) | |
1052 | + return 0; | |
1053 | + | |
1051 | 1054 | IWL_DEBUG_MAC80211(priv, "enter\n"); |
1052 | 1055 | mutex_lock(&priv->shrd->mutex); |
1053 | 1056 | |
... | ... | @@ -1096,6 +1099,9 @@ |
1096 | 1099 | struct iwl_priv *priv = hw->priv; |
1097 | 1100 | struct iwl_vif_priv *vif_priv = (void *)vif->drv_priv; |
1098 | 1101 | struct iwl_rxon_context *ctx = vif_priv->ctx; |
1102 | + | |
1103 | + if (ctx->ctxid != IWL_RXON_CTX_PAN) | |
1104 | + return; | |
1099 | 1105 | |
1100 | 1106 | IWL_DEBUG_MAC80211(priv, "enter\n"); |
1101 | 1107 | mutex_lock(&priv->shrd->mutex); |
drivers/net/wireless/mwifiex/cmdevt.c
... | ... | @@ -939,7 +939,6 @@ |
939 | 939 | { |
940 | 940 | struct cmd_ctrl_node *cmd_node = NULL, *tmp_node = NULL; |
941 | 941 | unsigned long cmd_flags; |
942 | - unsigned long cmd_pending_q_flags; | |
943 | 942 | unsigned long scan_pending_q_flags; |
944 | 943 | uint16_t cancel_scan_cmd = false; |
945 | 944 | |
946 | 945 | |
... | ... | @@ -949,12 +948,9 @@ |
949 | 948 | cmd_node = adapter->curr_cmd; |
950 | 949 | cmd_node->wait_q_enabled = false; |
951 | 950 | cmd_node->cmd_flag |= CMD_F_CANCELED; |
952 | - spin_lock_irqsave(&adapter->cmd_pending_q_lock, | |
953 | - cmd_pending_q_flags); | |
954 | - list_del(&cmd_node->list); | |
955 | - spin_unlock_irqrestore(&adapter->cmd_pending_q_lock, | |
956 | - cmd_pending_q_flags); | |
957 | 951 | mwifiex_insert_cmd_to_free_q(adapter, cmd_node); |
952 | + mwifiex_complete_cmd(adapter, adapter->curr_cmd); | |
953 | + adapter->curr_cmd = NULL; | |
958 | 954 | spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, cmd_flags); |
959 | 955 | } |
960 | 956 | |
... | ... | @@ -981,7 +977,6 @@ |
981 | 977 | spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, cmd_flags); |
982 | 978 | } |
983 | 979 | adapter->cmd_wait_q.status = -1; |
984 | - mwifiex_complete_cmd(adapter, adapter->curr_cmd); | |
985 | 980 | } |
986 | 981 | |
987 | 982 | /* |
drivers/net/wireless/rtlwifi/rtl8192ce/phy.c
drivers/net/wireless/rtlwifi/rtl8192cu/phy.c
drivers/net/wireless/rtlwifi/rtl8192de/phy.c
drivers/net/wireless/rtlwifi/rtl8192se/phy.c
drivers/ssb/driver_pcicore.c
... | ... | @@ -517,10 +517,14 @@ |
517 | 517 | |
518 | 518 | static void __devinit ssb_pcicore_init_clientmode(struct ssb_pcicore *pc) |
519 | 519 | { |
520 | - ssb_pcicore_fix_sprom_core_index(pc); | |
520 | + struct ssb_device *pdev = pc->dev; | |
521 | + struct ssb_bus *bus = pdev->bus; | |
521 | 522 | |
523 | + if (bus->bustype == SSB_BUSTYPE_PCI) | |
524 | + ssb_pcicore_fix_sprom_core_index(pc); | |
525 | + | |
522 | 526 | /* Disable PCI interrupts. */ |
523 | - ssb_write32(pc->dev, SSB_INTVEC, 0); | |
527 | + ssb_write32(pdev, SSB_INTVEC, 0); | |
524 | 528 | |
525 | 529 | /* Additional PCIe always once-executed workarounds */ |
526 | 530 | if (pc->dev->id.coreid == SSB_DEV_PCIE) { |
net/mac80211/agg-tx.c
... | ... | @@ -309,6 +309,38 @@ |
309 | 309 | __release(agg_queue); |
310 | 310 | } |
311 | 311 | |
312 | +/* | |
313 | + * splice packets from the STA's pending to the local pending, | |
314 | + * requires a call to ieee80211_agg_splice_finish later | |
315 | + */ | |
316 | +static void __acquires(agg_queue) | |
317 | +ieee80211_agg_splice_packets(struct ieee80211_local *local, | |
318 | + struct tid_ampdu_tx *tid_tx, u16 tid) | |
319 | +{ | |
320 | + int queue = ieee80211_ac_from_tid(tid); | |
321 | + unsigned long flags; | |
322 | + | |
323 | + ieee80211_stop_queue_agg(local, tid); | |
324 | + | |
325 | + if (WARN(!tid_tx, "TID %d gone but expected when splicing aggregates" | |
326 | + " from the pending queue\n", tid)) | |
327 | + return; | |
328 | + | |
329 | + if (!skb_queue_empty(&tid_tx->pending)) { | |
330 | + spin_lock_irqsave(&local->queue_stop_reason_lock, flags); | |
331 | + /* copy over remaining packets */ | |
332 | + skb_queue_splice_tail_init(&tid_tx->pending, | |
333 | + &local->pending[queue]); | |
334 | + spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); | |
335 | + } | |
336 | +} | |
337 | + | |
338 | +static void __releases(agg_queue) | |
339 | +ieee80211_agg_splice_finish(struct ieee80211_local *local, u16 tid) | |
340 | +{ | |
341 | + ieee80211_wake_queue_agg(local, tid); | |
342 | +} | |
343 | + | |
312 | 344 | void ieee80211_tx_ba_session_handle_start(struct sta_info *sta, int tid) |
313 | 345 | { |
314 | 346 | struct tid_ampdu_tx *tid_tx; |
315 | 347 | |
316 | 348 | |
... | ... | @@ -320,19 +352,17 @@ |
320 | 352 | tid_tx = rcu_dereference_protected_tid_tx(sta, tid); |
321 | 353 | |
322 | 354 | /* |
323 | - * While we're asking the driver about the aggregation, | |
324 | - * stop the AC queue so that we don't have to worry | |
325 | - * about frames that came in while we were doing that, | |
326 | - * which would require us to put them to the AC pending | |
327 | - * afterwards which just makes the code more complex. | |
355 | + * Start queuing up packets for this aggregation session. | |
356 | + * We're going to release them once the driver is OK with | |
357 | + * that. | |
328 | 358 | */ |
329 | - ieee80211_stop_queue_agg(local, tid); | |
330 | - | |
331 | 359 | clear_bit(HT_AGG_STATE_WANT_START, &tid_tx->state); |
332 | 360 | |
333 | 361 | /* |
334 | - * make sure no packets are being processed to get | |
335 | - * valid starting sequence number | |
362 | + * Make sure no packets are being processed. This ensures that | |
363 | + * we have a valid starting sequence number and that in-flight | |
364 | + * packets have been flushed out and no packets for this TID | |
365 | + * will go into the driver during the ampdu_action call. | |
336 | 366 | */ |
337 | 367 | synchronize_net(); |
338 | 368 | |
339 | 369 | |
340 | 370 | |
341 | 371 | |
... | ... | @@ -346,17 +376,15 @@ |
346 | 376 | " tid %d\n", tid); |
347 | 377 | #endif |
348 | 378 | spin_lock_bh(&sta->lock); |
379 | + ieee80211_agg_splice_packets(local, tid_tx, tid); | |
349 | 380 | ieee80211_assign_tid_tx(sta, tid, NULL); |
381 | + ieee80211_agg_splice_finish(local, tid); | |
350 | 382 | spin_unlock_bh(&sta->lock); |
351 | 383 | |
352 | - ieee80211_wake_queue_agg(local, tid); | |
353 | 384 | kfree_rcu(tid_tx, rcu_head); |
354 | 385 | return; |
355 | 386 | } |
356 | 387 | |
357 | - /* we can take packets again now */ | |
358 | - ieee80211_wake_queue_agg(local, tid); | |
359 | - | |
360 | 388 | /* activate the timer for the recipient's addBA response */ |
361 | 389 | mod_timer(&tid_tx->addba_resp_timer, jiffies + ADDBA_RESP_INTERVAL); |
362 | 390 | #ifdef CONFIG_MAC80211_HT_DEBUG |
... | ... | @@ -515,38 +543,6 @@ |
515 | 543 | return ret; |
516 | 544 | } |
517 | 545 | EXPORT_SYMBOL(ieee80211_start_tx_ba_session); |
518 | - | |
519 | -/* | |
520 | - * splice packets from the STA's pending to the local pending, | |
521 | - * requires a call to ieee80211_agg_splice_finish later | |
522 | - */ | |
523 | -static void __acquires(agg_queue) | |
524 | -ieee80211_agg_splice_packets(struct ieee80211_local *local, | |
525 | - struct tid_ampdu_tx *tid_tx, u16 tid) | |
526 | -{ | |
527 | - int queue = ieee80211_ac_from_tid(tid); | |
528 | - unsigned long flags; | |
529 | - | |
530 | - ieee80211_stop_queue_agg(local, tid); | |
531 | - | |
532 | - if (WARN(!tid_tx, "TID %d gone but expected when splicing aggregates" | |
533 | - " from the pending queue\n", tid)) | |
534 | - return; | |
535 | - | |
536 | - if (!skb_queue_empty(&tid_tx->pending)) { | |
537 | - spin_lock_irqsave(&local->queue_stop_reason_lock, flags); | |
538 | - /* copy over remaining packets */ | |
539 | - skb_queue_splice_tail_init(&tid_tx->pending, | |
540 | - &local->pending[queue]); | |
541 | - spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags); | |
542 | - } | |
543 | -} | |
544 | - | |
545 | -static void __releases(agg_queue) | |
546 | -ieee80211_agg_splice_finish(struct ieee80211_local *local, u16 tid) | |
547 | -{ | |
548 | - ieee80211_wake_queue_agg(local, tid); | |
549 | -} | |
550 | 546 | |
551 | 547 | static void ieee80211_agg_tx_operational(struct ieee80211_local *local, |
552 | 548 | struct sta_info *sta, u16 tid) |