Merge git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers.git
Stephen Rothwell reported quite a few conflicts in iwlwifi between wireless-drivers and wireless-drivers-next. To avoid any problems later in other trees merge w-d to w-d-next to fix those conflicts early.
This commit is contained in:
commit
5307eca136
@ -159,8 +159,10 @@ void brcmf_feat_attach(struct brcmf_pub *drvr)
|
|||||||
|
|
||||||
brcmf_feat_firmware_capabilities(ifp);
|
brcmf_feat_firmware_capabilities(ifp);
|
||||||
memset(&gscan_cfg, 0, sizeof(gscan_cfg));
|
memset(&gscan_cfg, 0, sizeof(gscan_cfg));
|
||||||
brcmf_feat_iovar_data_set(ifp, BRCMF_FEAT_GSCAN, "pfn_gscan_cfg",
|
if (drvr->bus_if->chip != BRCM_CC_43430_CHIP_ID)
|
||||||
&gscan_cfg, sizeof(gscan_cfg));
|
brcmf_feat_iovar_data_set(ifp, BRCMF_FEAT_GSCAN,
|
||||||
|
"pfn_gscan_cfg",
|
||||||
|
&gscan_cfg, sizeof(gscan_cfg));
|
||||||
brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_PNO, "pfn");
|
brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_PNO, "pfn");
|
||||||
if (drvr->bus_if->wowl_supported)
|
if (drvr->bus_if->wowl_supported)
|
||||||
brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_WOWL, "wowl");
|
brcmf_feat_iovar_int_get(ifp, BRCMF_FEAT_WOWL, "wowl");
|
||||||
|
@ -154,7 +154,7 @@ static const struct iwl_tt_params iwl9000_tt_params = {
|
|||||||
const struct iwl_cfg iwl9160_2ac_cfg = {
|
const struct iwl_cfg iwl9160_2ac_cfg = {
|
||||||
.name = "Intel(R) Dual Band Wireless AC 9160",
|
.name = "Intel(R) Dual Band Wireless AC 9160",
|
||||||
.fw_name_pre = IWL9260A_FW_PRE,
|
.fw_name_pre = IWL9260A_FW_PRE,
|
||||||
.fw_name_pre_next_step = IWL9260B_FW_PRE,
|
.fw_name_pre_b_or_c_step = IWL9260B_FW_PRE,
|
||||||
IWL_DEVICE_9000,
|
IWL_DEVICE_9000,
|
||||||
.ht_params = &iwl9000_ht_params,
|
.ht_params = &iwl9000_ht_params,
|
||||||
.nvm_ver = IWL9000_NVM_VERSION,
|
.nvm_ver = IWL9000_NVM_VERSION,
|
||||||
@ -165,7 +165,7 @@ const struct iwl_cfg iwl9160_2ac_cfg = {
|
|||||||
const struct iwl_cfg iwl9260_2ac_cfg = {
|
const struct iwl_cfg iwl9260_2ac_cfg = {
|
||||||
.name = "Intel(R) Dual Band Wireless AC 9260",
|
.name = "Intel(R) Dual Band Wireless AC 9260",
|
||||||
.fw_name_pre = IWL9260A_FW_PRE,
|
.fw_name_pre = IWL9260A_FW_PRE,
|
||||||
.fw_name_pre_next_step = IWL9260B_FW_PRE,
|
.fw_name_pre_b_or_c_step = IWL9260B_FW_PRE,
|
||||||
IWL_DEVICE_9000,
|
IWL_DEVICE_9000,
|
||||||
.ht_params = &iwl9000_ht_params,
|
.ht_params = &iwl9000_ht_params,
|
||||||
.nvm_ver = IWL9000_NVM_VERSION,
|
.nvm_ver = IWL9000_NVM_VERSION,
|
||||||
@ -176,7 +176,7 @@ const struct iwl_cfg iwl9260_2ac_cfg = {
|
|||||||
const struct iwl_cfg iwl9270_2ac_cfg = {
|
const struct iwl_cfg iwl9270_2ac_cfg = {
|
||||||
.name = "Intel(R) Dual Band Wireless AC 9270",
|
.name = "Intel(R) Dual Band Wireless AC 9270",
|
||||||
.fw_name_pre = IWL9260A_FW_PRE,
|
.fw_name_pre = IWL9260A_FW_PRE,
|
||||||
.fw_name_pre_next_step = IWL9260B_FW_PRE,
|
.fw_name_pre_b_or_c_step = IWL9260B_FW_PRE,
|
||||||
IWL_DEVICE_9000,
|
IWL_DEVICE_9000,
|
||||||
.ht_params = &iwl9000_ht_params,
|
.ht_params = &iwl9000_ht_params,
|
||||||
.nvm_ver = IWL9000_NVM_VERSION,
|
.nvm_ver = IWL9000_NVM_VERSION,
|
||||||
@ -186,8 +186,8 @@ const struct iwl_cfg iwl9270_2ac_cfg = {
|
|||||||
|
|
||||||
const struct iwl_cfg iwl9460_2ac_cfg = {
|
const struct iwl_cfg iwl9460_2ac_cfg = {
|
||||||
.name = "Intel(R) Dual Band Wireless AC 9460",
|
.name = "Intel(R) Dual Band Wireless AC 9460",
|
||||||
.fw_name_pre = IWL9000_FW_PRE,
|
.fw_name_pre = IWL9260A_FW_PRE,
|
||||||
.fw_name_pre_rf_next_step = IWL9000RFB_FW_PRE,
|
.fw_name_pre_b_or_c_step = IWL9260B_FW_PRE,
|
||||||
IWL_DEVICE_9000,
|
IWL_DEVICE_9000,
|
||||||
.ht_params = &iwl9000_ht_params,
|
.ht_params = &iwl9000_ht_params,
|
||||||
.nvm_ver = IWL9000_NVM_VERSION,
|
.nvm_ver = IWL9000_NVM_VERSION,
|
||||||
@ -198,8 +198,8 @@ const struct iwl_cfg iwl9460_2ac_cfg = {
|
|||||||
|
|
||||||
const struct iwl_cfg iwl9560_2ac_cfg = {
|
const struct iwl_cfg iwl9560_2ac_cfg = {
|
||||||
.name = "Intel(R) Dual Band Wireless AC 9560",
|
.name = "Intel(R) Dual Band Wireless AC 9560",
|
||||||
.fw_name_pre = IWL9000_FW_PRE,
|
.fw_name_pre = IWL9260A_FW_PRE,
|
||||||
.fw_name_pre_rf_next_step = IWL9000RFB_FW_PRE,
|
.fw_name_pre_b_or_c_step = IWL9260B_FW_PRE,
|
||||||
IWL_DEVICE_9000,
|
IWL_DEVICE_9000,
|
||||||
.ht_params = &iwl9000_ht_params,
|
.ht_params = &iwl9000_ht_params,
|
||||||
.nvm_ver = IWL9000_NVM_VERSION,
|
.nvm_ver = IWL9000_NVM_VERSION,
|
||||||
|
@ -332,6 +332,7 @@ typedef unsigned int __bitwise iwl_ucode_tlv_capa_t;
|
|||||||
* @IWL_UCODE_TLV_CAPA_TX_POWER_ACK: reduced TX power API has larger
|
* @IWL_UCODE_TLV_CAPA_TX_POWER_ACK: reduced TX power API has larger
|
||||||
* command size (command version 4) that supports toggling ACK TX
|
* command size (command version 4) that supports toggling ACK TX
|
||||||
* power reduction.
|
* power reduction.
|
||||||
|
* @IWL_UCODE_TLV_CAPA_MLME_OFFLOAD: supports MLME offload
|
||||||
*
|
*
|
||||||
* @NUM_IWL_UCODE_TLV_CAPA: number of bits used
|
* @NUM_IWL_UCODE_TLV_CAPA: number of bits used
|
||||||
*/
|
*/
|
||||||
@ -377,6 +378,7 @@ enum iwl_ucode_tlv_capa {
|
|||||||
IWL_UCODE_TLV_CAPA_EXTEND_SHARED_MEM_CFG = (__force iwl_ucode_tlv_capa_t)80,
|
IWL_UCODE_TLV_CAPA_EXTEND_SHARED_MEM_CFG = (__force iwl_ucode_tlv_capa_t)80,
|
||||||
IWL_UCODE_TLV_CAPA_LQM_SUPPORT = (__force iwl_ucode_tlv_capa_t)81,
|
IWL_UCODE_TLV_CAPA_LQM_SUPPORT = (__force iwl_ucode_tlv_capa_t)81,
|
||||||
IWL_UCODE_TLV_CAPA_TX_POWER_ACK = (__force iwl_ucode_tlv_capa_t)84,
|
IWL_UCODE_TLV_CAPA_TX_POWER_ACK = (__force iwl_ucode_tlv_capa_t)84,
|
||||||
|
IWL_UCODE_TLV_CAPA_MLME_OFFLOAD = (__force iwl_ucode_tlv_capa_t)96,
|
||||||
|
|
||||||
NUM_IWL_UCODE_TLV_CAPA
|
NUM_IWL_UCODE_TLV_CAPA
|
||||||
#ifdef __CHECKER__
|
#ifdef __CHECKER__
|
||||||
|
@ -276,10 +276,10 @@ struct iwl_pwr_tx_backoff {
|
|||||||
* @fw_name_pre: Firmware filename prefix. The api version and extension
|
* @fw_name_pre: Firmware filename prefix. The api version and extension
|
||||||
* (.ucode) will be added to filename before loading from disk. The
|
* (.ucode) will be added to filename before loading from disk. The
|
||||||
* filename is constructed as fw_name_pre<api>.ucode.
|
* filename is constructed as fw_name_pre<api>.ucode.
|
||||||
* @fw_name_pre_next_step: same as @fw_name_pre, only for next step
|
* @fw_name_pre_b_or_c_step: same as @fw_name_pre, only for b or c steps
|
||||||
* (if supported)
|
* (if supported)
|
||||||
* @fw_name_pre_rf_next_step: same as @fw_name_pre_next_step, only for rf next
|
* @fw_name_pre_rf_next_step: same as @fw_name_pre_b_or_c_step, only for rf
|
||||||
* step. Supported only in integrated solutions.
|
* next step. Supported only in integrated solutions.
|
||||||
* @ucode_api_max: Highest version of uCode API supported by driver.
|
* @ucode_api_max: Highest version of uCode API supported by driver.
|
||||||
* @ucode_api_min: Lowest version of uCode API supported by driver.
|
* @ucode_api_min: Lowest version of uCode API supported by driver.
|
||||||
* @max_inst_size: The maximal length of the fw inst section
|
* @max_inst_size: The maximal length of the fw inst section
|
||||||
@ -330,7 +330,7 @@ struct iwl_cfg {
|
|||||||
/* params specific to an individual device within a device family */
|
/* params specific to an individual device within a device family */
|
||||||
const char *name;
|
const char *name;
|
||||||
const char *fw_name_pre;
|
const char *fw_name_pre;
|
||||||
const char *fw_name_pre_next_step;
|
const char *fw_name_pre_b_or_c_step;
|
||||||
const char *fw_name_pre_rf_next_step;
|
const char *fw_name_pre_rf_next_step;
|
||||||
/* params not likely to change within a device family */
|
/* params not likely to change within a device family */
|
||||||
const struct iwl_base_params *base_params;
|
const struct iwl_base_params *base_params;
|
||||||
|
@ -216,8 +216,9 @@ static int iwl_request_firmware(struct iwl_drv *drv, bool first)
|
|||||||
const char *fw_pre_name;
|
const char *fw_pre_name;
|
||||||
|
|
||||||
if (drv->trans->cfg->device_family == IWL_DEVICE_FAMILY_9000 &&
|
if (drv->trans->cfg->device_family == IWL_DEVICE_FAMILY_9000 &&
|
||||||
CSR_HW_REV_STEP(drv->trans->hw_rev) == SILICON_B_STEP)
|
(CSR_HW_REV_STEP(drv->trans->hw_rev) == SILICON_B_STEP ||
|
||||||
fw_pre_name = cfg->fw_name_pre_next_step;
|
CSR_HW_REV_STEP(drv->trans->hw_rev) == SILICON_C_STEP))
|
||||||
|
fw_pre_name = cfg->fw_name_pre_b_or_c_step;
|
||||||
else if (drv->trans->cfg->integrated &&
|
else if (drv->trans->cfg->integrated &&
|
||||||
CSR_HW_RFID_STEP(drv->trans->hw_rf_id) == SILICON_B_STEP &&
|
CSR_HW_RFID_STEP(drv->trans->hw_rf_id) == SILICON_B_STEP &&
|
||||||
cfg->fw_name_pre_rf_next_step)
|
cfg->fw_name_pre_rf_next_step)
|
||||||
|
@ -832,7 +832,8 @@ iwl_parse_nvm_mcc_info(struct device *dev, const struct iwl_cfg *cfg,
|
|||||||
int num_of_ch, __le32 *channels, u16 fw_mcc)
|
int num_of_ch, __le32 *channels, u16 fw_mcc)
|
||||||
{
|
{
|
||||||
int ch_idx;
|
int ch_idx;
|
||||||
u16 ch_flags, prev_ch_flags = 0;
|
u16 ch_flags;
|
||||||
|
u32 reg_rule_flags, prev_reg_rule_flags = 0;
|
||||||
const u8 *nvm_chan = cfg->ext_nvm ?
|
const u8 *nvm_chan = cfg->ext_nvm ?
|
||||||
iwl_ext_nvm_channels : iwl_nvm_channels;
|
iwl_ext_nvm_channels : iwl_nvm_channels;
|
||||||
struct ieee80211_regdomain *regd;
|
struct ieee80211_regdomain *regd;
|
||||||
@ -881,8 +882,11 @@ iwl_parse_nvm_mcc_info(struct device *dev, const struct iwl_cfg *cfg,
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
reg_rule_flags = iwl_nvm_get_regdom_bw_flags(nvm_chan, ch_idx,
|
||||||
|
ch_flags, cfg);
|
||||||
|
|
||||||
/* we can't continue the same rule */
|
/* we can't continue the same rule */
|
||||||
if (ch_idx == 0 || prev_ch_flags != ch_flags ||
|
if (ch_idx == 0 || prev_reg_rule_flags != reg_rule_flags ||
|
||||||
center_freq - prev_center_freq > 20) {
|
center_freq - prev_center_freq > 20) {
|
||||||
valid_rules++;
|
valid_rules++;
|
||||||
new_rule = true;
|
new_rule = true;
|
||||||
@ -901,18 +905,17 @@ iwl_parse_nvm_mcc_info(struct device *dev, const struct iwl_cfg *cfg,
|
|||||||
rule->power_rule.max_eirp =
|
rule->power_rule.max_eirp =
|
||||||
DBM_TO_MBM(IWL_DEFAULT_MAX_TX_POWER);
|
DBM_TO_MBM(IWL_DEFAULT_MAX_TX_POWER);
|
||||||
|
|
||||||
rule->flags = iwl_nvm_get_regdom_bw_flags(nvm_chan, ch_idx,
|
rule->flags = reg_rule_flags;
|
||||||
ch_flags, cfg);
|
|
||||||
|
|
||||||
/* rely on auto-calculation to merge BW of contiguous chans */
|
/* rely on auto-calculation to merge BW of contiguous chans */
|
||||||
rule->flags |= NL80211_RRF_AUTO_BW;
|
rule->flags |= NL80211_RRF_AUTO_BW;
|
||||||
rule->freq_range.max_bandwidth_khz = 0;
|
rule->freq_range.max_bandwidth_khz = 0;
|
||||||
|
|
||||||
prev_ch_flags = ch_flags;
|
|
||||||
prev_center_freq = center_freq;
|
prev_center_freq = center_freq;
|
||||||
|
prev_reg_rule_flags = reg_rule_flags;
|
||||||
|
|
||||||
IWL_DEBUG_DEV(dev, IWL_DL_LAR,
|
IWL_DEBUG_DEV(dev, IWL_DL_LAR,
|
||||||
"Ch. %d [%sGHz] %s%s%s%s%s%s%s%s%s%s%s%s(0x%02x): %s\n",
|
"Ch. %d [%sGHz] %s%s%s%s%s%s%s%s%s%s%s%s(0x%02x) reg_flags 0x%x: %s\n",
|
||||||
center_freq,
|
center_freq,
|
||||||
band == NL80211_BAND_5GHZ ? "5.2" : "2.4",
|
band == NL80211_BAND_5GHZ ? "5.2" : "2.4",
|
||||||
CHECK_AND_PRINT_I(VALID),
|
CHECK_AND_PRINT_I(VALID),
|
||||||
@ -927,7 +930,7 @@ iwl_parse_nvm_mcc_info(struct device *dev, const struct iwl_cfg *cfg,
|
|||||||
CHECK_AND_PRINT_I(80MHZ),
|
CHECK_AND_PRINT_I(80MHZ),
|
||||||
CHECK_AND_PRINT_I(160MHZ),
|
CHECK_AND_PRINT_I(160MHZ),
|
||||||
CHECK_AND_PRINT_I(DC_HIGH),
|
CHECK_AND_PRINT_I(DC_HIGH),
|
||||||
ch_flags,
|
ch_flags, reg_rule_flags,
|
||||||
((ch_flags & NVM_CHANNEL_ACTIVE) &&
|
((ch_flags & NVM_CHANNEL_ACTIVE) &&
|
||||||
!(ch_flags & NVM_CHANNEL_RADAR))
|
!(ch_flags & NVM_CHANNEL_RADAR))
|
||||||
? "Ad-Hoc" : "");
|
? "Ad-Hoc" : "");
|
||||||
|
@ -841,8 +841,10 @@ static int iwl_mvm_sar_get_wgds_table(struct iwl_mvm *mvm)
|
|||||||
|
|
||||||
entry = &wifi_pkg->package.elements[idx++];
|
entry = &wifi_pkg->package.elements[idx++];
|
||||||
if ((entry->type != ACPI_TYPE_INTEGER) ||
|
if ((entry->type != ACPI_TYPE_INTEGER) ||
|
||||||
(entry->integer.value > U8_MAX))
|
(entry->integer.value > U8_MAX)) {
|
||||||
return -EINVAL;
|
ret = -EINVAL;
|
||||||
|
goto out_free;
|
||||||
|
}
|
||||||
|
|
||||||
mvm->geo_profiles[i].values[j] = entry->integer.value;
|
mvm->geo_profiles[i].values[j] = entry->integer.value;
|
||||||
}
|
}
|
||||||
|
@ -2553,8 +2553,18 @@ static void iwl_mvm_purge_deferred_tx_frames(struct iwl_mvm *mvm,
|
|||||||
spin_lock_bh(&mvm_sta->lock);
|
spin_lock_bh(&mvm_sta->lock);
|
||||||
for (i = 0; i <= IWL_MAX_TID_COUNT; i++) {
|
for (i = 0; i <= IWL_MAX_TID_COUNT; i++) {
|
||||||
tid_data = &mvm_sta->tid_data[i];
|
tid_data = &mvm_sta->tid_data[i];
|
||||||
while ((skb = __skb_dequeue(&tid_data->deferred_tx_frames)))
|
|
||||||
|
while ((skb = __skb_dequeue(&tid_data->deferred_tx_frames))) {
|
||||||
|
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The first deferred frame should've stopped the MAC
|
||||||
|
* queues, so we should never get a second deferred
|
||||||
|
* frame for the RA/TID.
|
||||||
|
*/
|
||||||
|
iwl_mvm_start_mac_queues(mvm, info->hw_queue);
|
||||||
ieee80211_free_txskb(mvm->hw, skb);
|
ieee80211_free_txskb(mvm->hw, skb);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
spin_unlock_bh(&mvm_sta->lock);
|
spin_unlock_bh(&mvm_sta->lock);
|
||||||
}
|
}
|
||||||
|
@ -1336,7 +1336,7 @@ void iwl_mvm_rs_tx_status(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
|
|||||||
* first index into rate scale table.
|
* first index into rate scale table.
|
||||||
*/
|
*/
|
||||||
if (info->flags & IEEE80211_TX_STAT_AMPDU) {
|
if (info->flags & IEEE80211_TX_STAT_AMPDU) {
|
||||||
rs_collect_tpc_data(mvm, lq_sta, curr_tbl, lq_rate.index,
|
rs_collect_tpc_data(mvm, lq_sta, curr_tbl, tx_resp_rate.index,
|
||||||
info->status.ampdu_len,
|
info->status.ampdu_len,
|
||||||
info->status.ampdu_ack_len,
|
info->status.ampdu_ack_len,
|
||||||
reduced_txp);
|
reduced_txp);
|
||||||
@ -1357,8 +1357,7 @@ void iwl_mvm_rs_tx_status(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
|
|||||||
if (info->status.ampdu_ack_len == 0)
|
if (info->status.ampdu_ack_len == 0)
|
||||||
info->status.ampdu_len = 1;
|
info->status.ampdu_len = 1;
|
||||||
|
|
||||||
rs_collect_tlc_data(mvm, mvmsta, tid, curr_tbl,
|
rs_collect_tlc_data(mvm, mvmsta, tid, curr_tbl, tx_resp_rate.index,
|
||||||
lq_rate.index,
|
|
||||||
info->status.ampdu_len,
|
info->status.ampdu_len,
|
||||||
info->status.ampdu_ack_len);
|
info->status.ampdu_ack_len);
|
||||||
|
|
||||||
@ -1394,11 +1393,11 @@ void iwl_mvm_rs_tx_status(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
rs_collect_tpc_data(mvm, lq_sta, tmp_tbl,
|
rs_collect_tpc_data(mvm, lq_sta, tmp_tbl,
|
||||||
lq_rate.index, 1,
|
tx_resp_rate.index, 1,
|
||||||
i < retries ? 0 : legacy_success,
|
i < retries ? 0 : legacy_success,
|
||||||
reduced_txp);
|
reduced_txp);
|
||||||
rs_collect_tlc_data(mvm, mvmsta, tid, tmp_tbl,
|
rs_collect_tlc_data(mvm, mvmsta, tid, tmp_tbl,
|
||||||
lq_rate.index, 1,
|
tx_resp_rate.index, 1,
|
||||||
i < retries ? 0 : legacy_success);
|
i < retries ? 0 : legacy_success);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -635,9 +635,9 @@ static bool iwl_mvm_reorder(struct iwl_mvm *mvm,
|
|||||||
|
|
||||||
baid_data = rcu_dereference(mvm->baid_map[baid]);
|
baid_data = rcu_dereference(mvm->baid_map[baid]);
|
||||||
if (!baid_data) {
|
if (!baid_data) {
|
||||||
WARN(!(reorder & IWL_RX_MPDU_REORDER_BA_OLD_SN),
|
IWL_DEBUG_RX(mvm,
|
||||||
"Received baid %d, but no data exists for this BAID - reorder data 0x%x\n",
|
"Got valid BAID but no baid allocated, bypass the re-ordering buffer. Baid %d reorder 0x%x\n",
|
||||||
baid, reorder);
|
baid, reorder);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -758,9 +758,9 @@ static void iwl_mvm_agg_rx_received(struct iwl_mvm *mvm,
|
|||||||
|
|
||||||
data = rcu_dereference(mvm->baid_map[baid]);
|
data = rcu_dereference(mvm->baid_map[baid]);
|
||||||
if (!data) {
|
if (!data) {
|
||||||
WARN(!(reorder_data & IWL_RX_MPDU_REORDER_BA_OLD_SN),
|
IWL_DEBUG_RX(mvm,
|
||||||
"OLD_SN isn't set, but no data exists for baid %d - reorder data 0x%x\n",
|
"Got valid BAID but no baid allocated, bypass the re-ordering buffer. Baid %d reorder 0x%x\n",
|
||||||
baid, reorder_data);
|
baid, reorder_data);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -121,7 +121,8 @@ int iwl_mvm_sta_send_to_fw(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
|
|||||||
.mac_id_n_color = cpu_to_le32(mvm_sta->mac_id_n_color),
|
.mac_id_n_color = cpu_to_le32(mvm_sta->mac_id_n_color),
|
||||||
.add_modify = update ? 1 : 0,
|
.add_modify = update ? 1 : 0,
|
||||||
.station_flags_msk = cpu_to_le32(STA_FLG_FAT_EN_MSK |
|
.station_flags_msk = cpu_to_le32(STA_FLG_FAT_EN_MSK |
|
||||||
STA_FLG_MIMO_EN_MSK),
|
STA_FLG_MIMO_EN_MSK |
|
||||||
|
STA_FLG_RTS_MIMO_PROT),
|
||||||
.tid_disable_tx = cpu_to_le16(mvm_sta->tid_disable_agg),
|
.tid_disable_tx = cpu_to_le16(mvm_sta->tid_disable_agg),
|
||||||
};
|
};
|
||||||
int ret;
|
int ret;
|
||||||
@ -290,8 +291,8 @@ static void iwl_mvm_rx_agg_session_expired(unsigned long data)
|
|||||||
goto unlock;
|
goto unlock;
|
||||||
|
|
||||||
mvm_sta = iwl_mvm_sta_from_mac80211(sta);
|
mvm_sta = iwl_mvm_sta_from_mac80211(sta);
|
||||||
ieee80211_stop_rx_ba_session_offl(mvm_sta->vif,
|
ieee80211_rx_ba_timer_expired(mvm_sta->vif,
|
||||||
sta->addr, ba_data->tid);
|
sta->addr, ba_data->tid);
|
||||||
unlock:
|
unlock:
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
}
|
}
|
||||||
|
@ -184,8 +184,14 @@ static u16 iwl_mvm_tx_csum(struct iwl_mvm *mvm, struct sk_buff *skb,
|
|||||||
else
|
else
|
||||||
udp_hdr(skb)->check = 0;
|
udp_hdr(skb)->check = 0;
|
||||||
|
|
||||||
/* mac header len should include IV, size is in words */
|
/*
|
||||||
if (info->control.hw_key)
|
* mac header len should include IV, size is in words unless
|
||||||
|
* the IV is added by the firmware like in WEP.
|
||||||
|
* In new Tx API, the IV is always added by the firmware.
|
||||||
|
*/
|
||||||
|
if (!iwl_mvm_has_new_tx_api(mvm) && info->control.hw_key &&
|
||||||
|
info->control.hw_key->cipher != WLAN_CIPHER_SUITE_WEP40 &&
|
||||||
|
info->control.hw_key->cipher != WLAN_CIPHER_SUITE_WEP104)
|
||||||
mh_len += info->control.hw_key->iv_len;
|
mh_len += info->control.hw_key->iv_len;
|
||||||
mh_len /= 2;
|
mh_len /= 2;
|
||||||
offload_assist |= mh_len << TX_CMD_OFFLD_MH_SIZE;
|
offload_assist |= mh_len << TX_CMD_OFFLD_MH_SIZE;
|
||||||
@ -1735,6 +1741,8 @@ void iwl_mvm_rx_ba_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb)
|
|||||||
struct iwl_mvm_tid_data *tid_data;
|
struct iwl_mvm_tid_data *tid_data;
|
||||||
struct iwl_mvm_sta *mvmsta;
|
struct iwl_mvm_sta *mvmsta;
|
||||||
|
|
||||||
|
ba_info.flags = IEEE80211_TX_STAT_AMPDU;
|
||||||
|
|
||||||
if (iwl_mvm_has_new_tx_api(mvm)) {
|
if (iwl_mvm_has_new_tx_api(mvm)) {
|
||||||
struct iwl_mvm_compressed_ba_notif *ba_res =
|
struct iwl_mvm_compressed_ba_notif *ba_res =
|
||||||
(void *)pkt->data;
|
(void *)pkt->data;
|
||||||
|
@ -511,9 +511,17 @@ static const struct pci_device_id iwl_hw_card_ids[] = {
|
|||||||
|
|
||||||
/* 9000 Series */
|
/* 9000 Series */
|
||||||
{IWL_PCI_DEVICE(0x271B, 0x0010, iwl9160_2ac_cfg)},
|
{IWL_PCI_DEVICE(0x271B, 0x0010, iwl9160_2ac_cfg)},
|
||||||
|
{IWL_PCI_DEVICE(0x271B, 0x0014, iwl9160_2ac_cfg)},
|
||||||
|
{IWL_PCI_DEVICE(0x271B, 0x0210, iwl9160_2ac_cfg)},
|
||||||
{IWL_PCI_DEVICE(0x2526, 0x0000, iwl9260_2ac_cfg)},
|
{IWL_PCI_DEVICE(0x2526, 0x0000, iwl9260_2ac_cfg)},
|
||||||
{IWL_PCI_DEVICE(0x2526, 0x0010, iwl9260_2ac_cfg)},
|
{IWL_PCI_DEVICE(0x2526, 0x0010, iwl9260_2ac_cfg)},
|
||||||
|
{IWL_PCI_DEVICE(0x2526, 0x0014, iwl9260_2ac_cfg)},
|
||||||
|
{IWL_PCI_DEVICE(0x2526, 0xA014, iwl9260_2ac_cfg)},
|
||||||
|
{IWL_PCI_DEVICE(0x2526, 0x4010, iwl9260_2ac_cfg)},
|
||||||
|
{IWL_PCI_DEVICE(0x2526, 0x0210, iwl9260_2ac_cfg)},
|
||||||
|
{IWL_PCI_DEVICE(0x2526, 0x0214, iwl9260_2ac_cfg)},
|
||||||
{IWL_PCI_DEVICE(0x2526, 0x1410, iwl9270_2ac_cfg)},
|
{IWL_PCI_DEVICE(0x2526, 0x1410, iwl9270_2ac_cfg)},
|
||||||
|
{IWL_PCI_DEVICE(0x2526, 0x1610, iwl9270_2ac_cfg)},
|
||||||
{IWL_PCI_DEVICE(0x9DF0, 0x0A10, iwl9460_2ac_cfg)},
|
{IWL_PCI_DEVICE(0x9DF0, 0x0A10, iwl9460_2ac_cfg)},
|
||||||
{IWL_PCI_DEVICE(0x9DF0, 0x0010, iwl9460_2ac_cfg)},
|
{IWL_PCI_DEVICE(0x9DF0, 0x0010, iwl9460_2ac_cfg)},
|
||||||
{IWL_PCI_DEVICE(0x9DF0, 0x0210, iwl9460_2ac_cfg)},
|
{IWL_PCI_DEVICE(0x9DF0, 0x0210, iwl9460_2ac_cfg)},
|
||||||
@ -528,10 +536,22 @@ static const struct pci_device_id iwl_hw_card_ids[] = {
|
|||||||
{IWL_PCI_DEVICE(0x9DF0, 0x2A10, iwl9460_2ac_cfg)},
|
{IWL_PCI_DEVICE(0x9DF0, 0x2A10, iwl9460_2ac_cfg)},
|
||||||
{IWL_PCI_DEVICE(0x30DC, 0x0060, iwl9460_2ac_cfg)},
|
{IWL_PCI_DEVICE(0x30DC, 0x0060, iwl9460_2ac_cfg)},
|
||||||
{IWL_PCI_DEVICE(0x2526, 0x0060, iwl9460_2ac_cfg)},
|
{IWL_PCI_DEVICE(0x2526, 0x0060, iwl9460_2ac_cfg)},
|
||||||
|
{IWL_PCI_DEVICE(0x2526, 0x0260, iwl9460_2ac_cfg)},
|
||||||
|
{IWL_PCI_DEVICE(0x2526, 0x0064, iwl9460_2ac_cfg)},
|
||||||
|
{IWL_PCI_DEVICE(0x2526, 0x00A4, iwl9460_2ac_cfg)},
|
||||||
|
{IWL_PCI_DEVICE(0x2526, 0x40A4, iwl9460_2ac_cfg)},
|
||||||
|
{IWL_PCI_DEVICE(0x2526, 0x02A4, iwl9460_2ac_cfg)},
|
||||||
|
{IWL_PCI_DEVICE(0x2526, 0x00A0, iwl9460_2ac_cfg)},
|
||||||
|
{IWL_PCI_DEVICE(0x2526, 0x02A0, iwl9460_2ac_cfg)},
|
||||||
{IWL_PCI_DEVICE(0x9DF0, 0x0060, iwl9460_2ac_cfg)},
|
{IWL_PCI_DEVICE(0x9DF0, 0x0060, iwl9460_2ac_cfg)},
|
||||||
{IWL_PCI_DEVICE(0xA370, 0x0060, iwl9460_2ac_cfg)},
|
{IWL_PCI_DEVICE(0xA370, 0x0060, iwl9460_2ac_cfg)},
|
||||||
{IWL_PCI_DEVICE(0x31DC, 0x0060, iwl9460_2ac_cfg)},
|
{IWL_PCI_DEVICE(0x31DC, 0x0060, iwl9460_2ac_cfg)},
|
||||||
{IWL_PCI_DEVICE(0x2526, 0x0030, iwl9560_2ac_cfg)},
|
{IWL_PCI_DEVICE(0x2526, 0x0030, iwl9560_2ac_cfg)},
|
||||||
|
{IWL_PCI_DEVICE(0x2526, 0x4030, iwl9560_2ac_cfg)},
|
||||||
|
{IWL_PCI_DEVICE(0x2526, 0x0230, iwl9560_2ac_cfg)},
|
||||||
|
{IWL_PCI_DEVICE(0x2526, 0x0234, iwl9560_2ac_cfg)},
|
||||||
|
{IWL_PCI_DEVICE(0x2526, 0x0238, iwl9560_2ac_cfg)},
|
||||||
|
{IWL_PCI_DEVICE(0x2526, 0x023C, iwl9560_2ac_cfg)},
|
||||||
{IWL_PCI_DEVICE(0x9DF0, 0x0030, iwl9560_2ac_cfg)},
|
{IWL_PCI_DEVICE(0x9DF0, 0x0030, iwl9560_2ac_cfg)},
|
||||||
{IWL_PCI_DEVICE(0xA370, 0x0030, iwl9560_2ac_cfg)},
|
{IWL_PCI_DEVICE(0xA370, 0x0030, iwl9560_2ac_cfg)},
|
||||||
{IWL_PCI_DEVICE(0x31DC, 0x0030, iwl9560_2ac_cfg)},
|
{IWL_PCI_DEVICE(0x31DC, 0x0030, iwl9560_2ac_cfg)},
|
||||||
|
@ -5499,6 +5499,21 @@ static inline void ieee80211_stop_rx_ba_session_offl(struct ieee80211_vif *vif,
|
|||||||
ieee80211_manage_rx_ba_offl(vif, addr, tid + IEEE80211_NUM_TIDS);
|
ieee80211_manage_rx_ba_offl(vif, addr, tid + IEEE80211_NUM_TIDS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ieee80211_rx_ba_timer_expired - stop a Rx BA session due to timeout
|
||||||
|
*
|
||||||
|
* Some device drivers do not offload AddBa/DelBa negotiation, but handle rx
|
||||||
|
* buffer reording internally, and therefore also handle the session timer.
|
||||||
|
*
|
||||||
|
* Trigger the timeout flow, which sends a DelBa.
|
||||||
|
*
|
||||||
|
* @vif: &struct ieee80211_vif pointer from the add_interface callback
|
||||||
|
* @addr: station mac address
|
||||||
|
* @tid: the rx tid
|
||||||
|
*/
|
||||||
|
void ieee80211_rx_ba_timer_expired(struct ieee80211_vif *vif,
|
||||||
|
const u8 *addr, unsigned int tid);
|
||||||
|
|
||||||
/* Rate control API */
|
/* Rate control API */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
* Copyright 2006-2007 Jiri Benc <jbenc@suse.cz>
|
* Copyright 2006-2007 Jiri Benc <jbenc@suse.cz>
|
||||||
* Copyright 2007, Michael Wu <flamingice@sourmilk.net>
|
* Copyright 2007, Michael Wu <flamingice@sourmilk.net>
|
||||||
* Copyright 2007-2010, Intel Corporation
|
* Copyright 2007-2010, Intel Corporation
|
||||||
* Copyright(c) 2015 Intel Deutschland GmbH
|
* Copyright(c) 2015-2017 Intel Deutschland GmbH
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License version 2 as
|
* it under the terms of the GNU General Public License version 2 as
|
||||||
@ -466,3 +466,23 @@ void ieee80211_manage_rx_ba_offl(struct ieee80211_vif *vif,
|
|||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(ieee80211_manage_rx_ba_offl);
|
EXPORT_SYMBOL(ieee80211_manage_rx_ba_offl);
|
||||||
|
|
||||||
|
void ieee80211_rx_ba_timer_expired(struct ieee80211_vif *vif,
|
||||||
|
const u8 *addr, unsigned int tid)
|
||||||
|
{
|
||||||
|
struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif);
|
||||||
|
struct ieee80211_local *local = sdata->local;
|
||||||
|
struct sta_info *sta;
|
||||||
|
|
||||||
|
rcu_read_lock();
|
||||||
|
sta = sta_info_get_bss(sdata, addr);
|
||||||
|
if (!sta)
|
||||||
|
goto unlock;
|
||||||
|
|
||||||
|
set_bit(tid, sta->ampdu_mlme.tid_rx_timer_expired);
|
||||||
|
ieee80211_queue_work(&local->hw, &sta->ampdu_mlme.work);
|
||||||
|
|
||||||
|
unlock:
|
||||||
|
rcu_read_unlock();
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(ieee80211_rx_ba_timer_expired);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user