diff options
Diffstat (limited to 'drivers/net/wireless/iwlwifi')
| -rw-r--r-- | drivers/net/wireless/iwlwifi/dvm/dev.h | 1 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/dvm/mac80211.c | 17 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/dvm/ucode.c | 5 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/iwl-drv.c | 1 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/rs.c | 24 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/time-event.c | 2 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/mvm/tx.c | 6 | ||||
| -rw-r--r-- | drivers/net/wireless/iwlwifi/pcie/drv.c | 6 |
8 files changed, 42 insertions, 20 deletions
diff --git a/drivers/net/wireless/iwlwifi/dvm/dev.h b/drivers/net/wireless/iwlwifi/dvm/dev.h index a6f22c32a279..3811878ab9cd 100644 --- a/drivers/net/wireless/iwlwifi/dvm/dev.h +++ b/drivers/net/wireless/iwlwifi/dvm/dev.h | |||
| @@ -708,7 +708,6 @@ struct iwl_priv { | |||
| 708 | unsigned long reload_jiffies; | 708 | unsigned long reload_jiffies; |
| 709 | int reload_count; | 709 | int reload_count; |
| 710 | bool ucode_loaded; | 710 | bool ucode_loaded; |
| 711 | bool init_ucode_run; /* Don't run init uCode again */ | ||
| 712 | 711 | ||
| 713 | u8 plcp_delta_threshold; | 712 | u8 plcp_delta_threshold; |
| 714 | 713 | ||
diff --git a/drivers/net/wireless/iwlwifi/dvm/mac80211.c b/drivers/net/wireless/iwlwifi/dvm/mac80211.c index 47e64e8b9517..cceb026e0793 100644 --- a/drivers/net/wireless/iwlwifi/dvm/mac80211.c +++ b/drivers/net/wireless/iwlwifi/dvm/mac80211.c | |||
| @@ -1114,16 +1114,17 @@ static void iwlagn_mac_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif, | |||
| 1114 | scd_queues &= ~(BIT(IWL_IPAN_CMD_QUEUE_NUM) | | 1114 | scd_queues &= ~(BIT(IWL_IPAN_CMD_QUEUE_NUM) | |
| 1115 | BIT(IWL_DEFAULT_CMD_QUEUE_NUM)); | 1115 | BIT(IWL_DEFAULT_CMD_QUEUE_NUM)); |
| 1116 | 1116 | ||
| 1117 | if (vif) | 1117 | if (drop) { |
| 1118 | scd_queues &= ~BIT(vif->hw_queue[IEEE80211_AC_VO]); | 1118 | IWL_DEBUG_TX_QUEUES(priv, "Flushing SCD queues: 0x%x\n", |
| 1119 | 1119 | scd_queues); | |
| 1120 | IWL_DEBUG_TX_QUEUES(priv, "Flushing SCD queues: 0x%x\n", scd_queues); | 1120 | if (iwlagn_txfifo_flush(priv, scd_queues)) { |
| 1121 | if (iwlagn_txfifo_flush(priv, scd_queues)) { | 1121 | IWL_ERR(priv, "flush request fail\n"); |
| 1122 | IWL_ERR(priv, "flush request fail\n"); | 1122 | goto done; |
| 1123 | goto done; | 1123 | } |
| 1124 | } | 1124 | } |
| 1125 | |||
| 1125 | IWL_DEBUG_TX_QUEUES(priv, "wait transmit/flush all frames\n"); | 1126 | IWL_DEBUG_TX_QUEUES(priv, "wait transmit/flush all frames\n"); |
| 1126 | iwl_trans_wait_tx_queue_empty(priv->trans, 0xffffffff); | 1127 | iwl_trans_wait_tx_queue_empty(priv->trans, scd_queues); |
| 1127 | done: | 1128 | done: |
| 1128 | mutex_unlock(&priv->mutex); | 1129 | mutex_unlock(&priv->mutex); |
| 1129 | IWL_DEBUG_MAC80211(priv, "leave\n"); | 1130 | IWL_DEBUG_MAC80211(priv, "leave\n"); |
diff --git a/drivers/net/wireless/iwlwifi/dvm/ucode.c b/drivers/net/wireless/iwlwifi/dvm/ucode.c index 4dbef7e58c2e..5244e43bfafb 100644 --- a/drivers/net/wireless/iwlwifi/dvm/ucode.c +++ b/drivers/net/wireless/iwlwifi/dvm/ucode.c | |||
| @@ -418,9 +418,6 @@ int iwl_run_init_ucode(struct iwl_priv *priv) | |||
| 418 | if (!priv->fw->img[IWL_UCODE_INIT].sec[0].len) | 418 | if (!priv->fw->img[IWL_UCODE_INIT].sec[0].len) |
| 419 | return 0; | 419 | return 0; |
| 420 | 420 | ||
| 421 | if (priv->init_ucode_run) | ||
| 422 | return 0; | ||
| 423 | |||
| 424 | iwl_init_notification_wait(&priv->notif_wait, &calib_wait, | 421 | iwl_init_notification_wait(&priv->notif_wait, &calib_wait, |
| 425 | calib_complete, ARRAY_SIZE(calib_complete), | 422 | calib_complete, ARRAY_SIZE(calib_complete), |
| 426 | iwlagn_wait_calib, priv); | 423 | iwlagn_wait_calib, priv); |
| @@ -440,8 +437,6 @@ int iwl_run_init_ucode(struct iwl_priv *priv) | |||
| 440 | */ | 437 | */ |
| 441 | ret = iwl_wait_notification(&priv->notif_wait, &calib_wait, | 438 | ret = iwl_wait_notification(&priv->notif_wait, &calib_wait, |
| 442 | UCODE_CALIB_TIMEOUT); | 439 | UCODE_CALIB_TIMEOUT); |
| 443 | if (!ret) | ||
| 444 | priv->init_ucode_run = true; | ||
| 445 | 440 | ||
| 446 | goto out; | 441 | goto out; |
| 447 | 442 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-drv.c b/drivers/net/wireless/iwlwifi/iwl-drv.c index 996e7f16adf9..c7154ac42c8c 100644 --- a/drivers/net/wireless/iwlwifi/iwl-drv.c +++ b/drivers/net/wireless/iwlwifi/iwl-drv.c | |||
| @@ -1257,6 +1257,7 @@ static void iwl_req_fw_callback(const struct firmware *ucode_raw, void *context) | |||
| 1257 | op->name, err); | 1257 | op->name, err); |
| 1258 | #endif | 1258 | #endif |
| 1259 | } | 1259 | } |
| 1260 | kfree(pieces); | ||
| 1260 | return; | 1261 | return; |
| 1261 | 1262 | ||
| 1262 | try_again: | 1263 | try_again: |
diff --git a/drivers/net/wireless/iwlwifi/mvm/rs.c b/drivers/net/wireless/iwlwifi/mvm/rs.c index efa9688a4cf1..078f24cf4af3 100644 --- a/drivers/net/wireless/iwlwifi/mvm/rs.c +++ b/drivers/net/wireless/iwlwifi/mvm/rs.c | |||
| @@ -1278,6 +1278,9 @@ static void rs_mac80211_tx_status(void *mvm_r, | |||
| 1278 | struct iwl_mvm *mvm = IWL_OP_MODE_GET_MVM(op_mode); | 1278 | struct iwl_mvm *mvm = IWL_OP_MODE_GET_MVM(op_mode); |
| 1279 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); | 1279 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); |
| 1280 | 1280 | ||
| 1281 | if (!iwl_mvm_sta_from_mac80211(sta)->vif) | ||
| 1282 | return; | ||
| 1283 | |||
| 1281 | if (!ieee80211_is_data(hdr->frame_control) || | 1284 | if (!ieee80211_is_data(hdr->frame_control) || |
| 1282 | info->flags & IEEE80211_TX_CTL_NO_ACK) | 1285 | info->flags & IEEE80211_TX_CTL_NO_ACK) |
| 1283 | return; | 1286 | return; |
| @@ -2511,6 +2514,14 @@ static void rs_get_rate(void *mvm_r, struct ieee80211_sta *sta, void *mvm_sta, | |||
| 2511 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); | 2514 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); |
| 2512 | struct iwl_lq_sta *lq_sta = mvm_sta; | 2515 | struct iwl_lq_sta *lq_sta = mvm_sta; |
| 2513 | 2516 | ||
| 2517 | if (sta && !iwl_mvm_sta_from_mac80211(sta)->vif) { | ||
| 2518 | /* if vif isn't initialized mvm doesn't know about | ||
| 2519 | * this station, so don't do anything with the it | ||
| 2520 | */ | ||
| 2521 | sta = NULL; | ||
| 2522 | mvm_sta = NULL; | ||
| 2523 | } | ||
| 2524 | |||
| 2514 | /* TODO: handle rate_idx_mask and rate_idx_mcs_mask */ | 2525 | /* TODO: handle rate_idx_mask and rate_idx_mcs_mask */ |
| 2515 | 2526 | ||
| 2516 | /* Treat uninitialized rate scaling data same as non-existing. */ | 2527 | /* Treat uninitialized rate scaling data same as non-existing. */ |
| @@ -2827,6 +2838,9 @@ static void rs_rate_update(void *mvm_r, | |||
| 2827 | (struct iwl_op_mode *)mvm_r; | 2838 | (struct iwl_op_mode *)mvm_r; |
| 2828 | struct iwl_mvm *mvm = IWL_OP_MODE_GET_MVM(op_mode); | 2839 | struct iwl_mvm *mvm = IWL_OP_MODE_GET_MVM(op_mode); |
| 2829 | 2840 | ||
| 2841 | if (!iwl_mvm_sta_from_mac80211(sta)->vif) | ||
| 2842 | return; | ||
| 2843 | |||
| 2830 | /* Stop any ongoing aggregations as rs starts off assuming no agg */ | 2844 | /* Stop any ongoing aggregations as rs starts off assuming no agg */ |
| 2831 | for (tid = 0; tid < IWL_MAX_TID_COUNT; tid++) | 2845 | for (tid = 0; tid < IWL_MAX_TID_COUNT; tid++) |
| 2832 | ieee80211_stop_tx_ba_session(sta, tid); | 2846 | ieee80211_stop_tx_ba_session(sta, tid); |
| @@ -3587,9 +3601,15 @@ static ssize_t iwl_dbgfs_ss_force_write(struct iwl_lq_sta *lq_sta, char *buf, | |||
| 3587 | 3601 | ||
| 3588 | MVM_DEBUGFS_READ_WRITE_FILE_OPS(ss_force, 32); | 3602 | MVM_DEBUGFS_READ_WRITE_FILE_OPS(ss_force, 32); |
| 3589 | 3603 | ||
| 3590 | static void rs_add_debugfs(void *mvm, void *mvm_sta, struct dentry *dir) | 3604 | static void rs_add_debugfs(void *mvm, void *priv_sta, struct dentry *dir) |
| 3591 | { | 3605 | { |
| 3592 | struct iwl_lq_sta *lq_sta = mvm_sta; | 3606 | struct iwl_lq_sta *lq_sta = priv_sta; |
| 3607 | struct iwl_mvm_sta *mvmsta; | ||
| 3608 | |||
| 3609 | mvmsta = container_of(lq_sta, struct iwl_mvm_sta, lq_sta); | ||
| 3610 | |||
| 3611 | if (!mvmsta->vif) | ||
| 3612 | return; | ||
| 3593 | 3613 | ||
| 3594 | debugfs_create_file("rate_scale_table", S_IRUSR | S_IWUSR, dir, | 3614 | debugfs_create_file("rate_scale_table", S_IRUSR | S_IWUSR, dir, |
| 3595 | lq_sta, &rs_sta_dbgfs_scale_table_ops); | 3615 | lq_sta, &rs_sta_dbgfs_scale_table_ops); |
diff --git a/drivers/net/wireless/iwlwifi/mvm/time-event.c b/drivers/net/wireless/iwlwifi/mvm/time-event.c index f8d6f306dd76..4b81c0bf63b0 100644 --- a/drivers/net/wireless/iwlwifi/mvm/time-event.c +++ b/drivers/net/wireless/iwlwifi/mvm/time-event.c | |||
| @@ -197,6 +197,8 @@ iwl_mvm_te_handle_notify_csa(struct iwl_mvm *mvm, | |||
| 197 | struct iwl_time_event_notif *notif) | 197 | struct iwl_time_event_notif *notif) |
| 198 | { | 198 | { |
| 199 | if (!le32_to_cpu(notif->status)) { | 199 | if (!le32_to_cpu(notif->status)) { |
| 200 | if (te_data->vif->type == NL80211_IFTYPE_STATION) | ||
| 201 | ieee80211_connection_loss(te_data->vif); | ||
| 200 | IWL_DEBUG_TE(mvm, "CSA time event failed to start\n"); | 202 | IWL_DEBUG_TE(mvm, "CSA time event failed to start\n"); |
| 201 | iwl_mvm_te_clear_data(mvm, te_data); | 203 | iwl_mvm_te_clear_data(mvm, te_data); |
| 202 | return; | 204 | return; |
diff --git a/drivers/net/wireless/iwlwifi/mvm/tx.c b/drivers/net/wireless/iwlwifi/mvm/tx.c index 07304e1fd64a..96a05406babf 100644 --- a/drivers/net/wireless/iwlwifi/mvm/tx.c +++ b/drivers/net/wireless/iwlwifi/mvm/tx.c | |||
| @@ -949,8 +949,10 @@ int iwl_mvm_rx_ba_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb, | |||
| 949 | mvmsta = iwl_mvm_sta_from_mac80211(sta); | 949 | mvmsta = iwl_mvm_sta_from_mac80211(sta); |
| 950 | tid_data = &mvmsta->tid_data[tid]; | 950 | tid_data = &mvmsta->tid_data[tid]; |
| 951 | 951 | ||
| 952 | if (WARN_ONCE(tid_data->txq_id != scd_flow, "Q %d, tid %d, flow %d", | 952 | if (tid_data->txq_id != scd_flow) { |
| 953 | tid_data->txq_id, tid, scd_flow)) { | 953 | IWL_ERR(mvm, |
| 954 | "invalid BA notification: Q %d, tid %d, flow %d\n", | ||
| 955 | tid_data->txq_id, tid, scd_flow); | ||
| 954 | rcu_read_unlock(); | 956 | rcu_read_unlock(); |
| 955 | return 0; | 957 | return 0; |
| 956 | } | 958 | } |
diff --git a/drivers/net/wireless/iwlwifi/pcie/drv.c b/drivers/net/wireless/iwlwifi/pcie/drv.c index dbd6bcf52205..686dd301cd53 100644 --- a/drivers/net/wireless/iwlwifi/pcie/drv.c +++ b/drivers/net/wireless/iwlwifi/pcie/drv.c | |||
| @@ -368,10 +368,12 @@ static const struct pci_device_id iwl_hw_card_ids[] = { | |||
| 368 | /* 3165 Series */ | 368 | /* 3165 Series */ |
| 369 | {IWL_PCI_DEVICE(0x3165, 0x4010, iwl3165_2ac_cfg)}, | 369 | {IWL_PCI_DEVICE(0x3165, 0x4010, iwl3165_2ac_cfg)}, |
| 370 | {IWL_PCI_DEVICE(0x3165, 0x4012, iwl3165_2ac_cfg)}, | 370 | {IWL_PCI_DEVICE(0x3165, 0x4012, iwl3165_2ac_cfg)}, |
| 371 | {IWL_PCI_DEVICE(0x3165, 0x4110, iwl3165_2ac_cfg)}, | ||
| 372 | {IWL_PCI_DEVICE(0x3165, 0x4210, iwl3165_2ac_cfg)}, | ||
| 373 | {IWL_PCI_DEVICE(0x3165, 0x4410, iwl3165_2ac_cfg)}, | 371 | {IWL_PCI_DEVICE(0x3165, 0x4410, iwl3165_2ac_cfg)}, |
| 374 | {IWL_PCI_DEVICE(0x3165, 0x4510, iwl3165_2ac_cfg)}, | 372 | {IWL_PCI_DEVICE(0x3165, 0x4510, iwl3165_2ac_cfg)}, |
| 373 | {IWL_PCI_DEVICE(0x3165, 0x4110, iwl3165_2ac_cfg)}, | ||
| 374 | {IWL_PCI_DEVICE(0x3166, 0x4310, iwl3165_2ac_cfg)}, | ||
| 375 | {IWL_PCI_DEVICE(0x3166, 0x4210, iwl3165_2ac_cfg)}, | ||
| 376 | {IWL_PCI_DEVICE(0x3165, 0x8010, iwl3165_2ac_cfg)}, | ||
| 375 | 377 | ||
| 376 | /* 7265 Series */ | 378 | /* 7265 Series */ |
| 377 | {IWL_PCI_DEVICE(0x095A, 0x5010, iwl7265_2ac_cfg)}, | 379 | {IWL_PCI_DEVICE(0x095A, 0x5010, iwl7265_2ac_cfg)}, |
