Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/iwlwifi/iwlwifi-next
This commit is contained in:
Коммит
d91a48cbae
|
@ -42,7 +42,7 @@ config IWLWIFI
|
|||
config IWLWIFI_LEDS
|
||||
bool
|
||||
depends on IWLWIFI
|
||||
depends on LEDS_CLASS
|
||||
depends on LEDS_CLASS=y || LEDS_CLASS=IWLWIFI
|
||||
select LEDS_TRIGGERS
|
||||
select MAC80211_LEDS
|
||||
default y
|
||||
|
@ -128,7 +128,6 @@ config IWLWIFI_DEBUG_EXPERIMENTAL_UCODE
|
|||
Enable use of experimental ucode for testing and debugging.
|
||||
|
||||
config IWLWIFI_DEVICE_TRACING
|
||||
|
||||
bool "iwlwifi device access tracing"
|
||||
depends on IWLWIFI
|
||||
depends on EVENT_TRACING
|
||||
|
|
|
@ -94,7 +94,6 @@ int iwl_send_calib_results(struct iwl_priv *priv)
|
|||
{
|
||||
struct iwl_host_cmd hcmd = {
|
||||
.id = REPLY_PHY_CALIBRATION_CMD,
|
||||
.flags = CMD_SYNC,
|
||||
};
|
||||
struct iwl_calib_result *res;
|
||||
|
||||
|
|
|
@ -1481,7 +1481,7 @@ static ssize_t iwl_dbgfs_ucode_bt_stats_read(struct file *file,
|
|||
|
||||
/* make request to uCode to retrieve statistics information */
|
||||
mutex_lock(&priv->mutex);
|
||||
ret = iwl_send_statistics_request(priv, CMD_SYNC, false);
|
||||
ret = iwl_send_statistics_request(priv, 0, false);
|
||||
mutex_unlock(&priv->mutex);
|
||||
|
||||
if (ret)
|
||||
|
@ -1868,7 +1868,7 @@ static ssize_t iwl_dbgfs_clear_ucode_statistics_write(struct file *file,
|
|||
|
||||
/* make request to uCode to retrieve statistics information */
|
||||
mutex_lock(&priv->mutex);
|
||||
iwl_send_statistics_request(priv, CMD_SYNC, true);
|
||||
iwl_send_statistics_request(priv, 0, true);
|
||||
mutex_unlock(&priv->mutex);
|
||||
|
||||
return count;
|
||||
|
@ -2188,7 +2188,6 @@ static int iwl_cmd_echo_test(struct iwl_priv *priv)
|
|||
struct iwl_host_cmd cmd = {
|
||||
.id = REPLY_ECHO,
|
||||
.len = { 0 },
|
||||
.flags = CMD_SYNC,
|
||||
};
|
||||
|
||||
ret = iwl_dvm_send_cmd(priv, &cmd);
|
||||
|
@ -2320,7 +2319,7 @@ static ssize_t iwl_dbgfs_fw_restart_write(struct file *file,
|
|||
mutex_lock(&priv->mutex);
|
||||
|
||||
/* take the return value to make compiler happy - it will fail anyway */
|
||||
ret = iwl_dvm_send_cmd_pdu(priv, REPLY_ERROR, CMD_SYNC, 0, NULL);
|
||||
ret = iwl_dvm_send_cmd_pdu(priv, REPLY_ERROR, 0, 0, NULL);
|
||||
|
||||
mutex_unlock(&priv->mutex);
|
||||
|
||||
|
|
|
@ -417,7 +417,6 @@ static int iwl5000_hw_channel_switch(struct iwl_priv *priv,
|
|||
struct iwl_host_cmd hcmd = {
|
||||
.id = REPLY_CHANNEL_SWITCH,
|
||||
.len = { sizeof(cmd), },
|
||||
.flags = CMD_SYNC,
|
||||
.data = { &cmd, },
|
||||
};
|
||||
|
||||
|
@ -579,7 +578,6 @@ static int iwl6000_hw_channel_switch(struct iwl_priv *priv,
|
|||
struct iwl_host_cmd hcmd = {
|
||||
.id = REPLY_CHANNEL_SWITCH,
|
||||
.len = { sizeof(*cmd), },
|
||||
.flags = CMD_SYNC,
|
||||
.dataflags[0] = IWL_HCMD_DFL_NOCOPY,
|
||||
};
|
||||
int err;
|
||||
|
|
|
@ -81,7 +81,7 @@ int iwlagn_send_tx_power(struct iwl_priv *priv)
|
|||
else
|
||||
tx_ant_cfg_cmd = REPLY_TX_POWER_DBM_CMD;
|
||||
|
||||
return iwl_dvm_send_cmd_pdu(priv, tx_ant_cfg_cmd, CMD_SYNC,
|
||||
return iwl_dvm_send_cmd_pdu(priv, tx_ant_cfg_cmd, 0,
|
||||
sizeof(tx_power_cmd), &tx_power_cmd);
|
||||
}
|
||||
|
||||
|
@ -141,7 +141,6 @@ int iwlagn_txfifo_flush(struct iwl_priv *priv, u32 scd_q_msk)
|
|||
struct iwl_host_cmd cmd = {
|
||||
.id = REPLY_TXFIFO_FLUSH,
|
||||
.len = { sizeof(struct iwl_txfifo_flush_cmd), },
|
||||
.flags = CMD_SYNC,
|
||||
.data = { &flush_cmd, },
|
||||
};
|
||||
|
||||
|
@ -333,12 +332,12 @@ void iwlagn_send_advance_bt_config(struct iwl_priv *priv)
|
|||
memcpy(&bt_cmd_v2.basic, &basic,
|
||||
sizeof(basic));
|
||||
ret = iwl_dvm_send_cmd_pdu(priv, REPLY_BT_CONFIG,
|
||||
CMD_SYNC, sizeof(bt_cmd_v2), &bt_cmd_v2);
|
||||
0, sizeof(bt_cmd_v2), &bt_cmd_v2);
|
||||
} else {
|
||||
memcpy(&bt_cmd_v1.basic, &basic,
|
||||
sizeof(basic));
|
||||
ret = iwl_dvm_send_cmd_pdu(priv, REPLY_BT_CONFIG,
|
||||
CMD_SYNC, sizeof(bt_cmd_v1), &bt_cmd_v1);
|
||||
0, sizeof(bt_cmd_v1), &bt_cmd_v1);
|
||||
}
|
||||
if (ret)
|
||||
IWL_ERR(priv, "failed to send BT Coex Config\n");
|
||||
|
@ -1044,7 +1043,6 @@ int iwlagn_send_patterns(struct iwl_priv *priv,
|
|||
struct iwl_host_cmd cmd = {
|
||||
.id = REPLY_WOWLAN_PATTERNS,
|
||||
.dataflags[0] = IWL_HCMD_DFL_NOCOPY,
|
||||
.flags = CMD_SYNC,
|
||||
};
|
||||
int i, err;
|
||||
|
||||
|
@ -1201,7 +1199,6 @@ int iwlagn_suspend(struct iwl_priv *priv, struct cfg80211_wowlan *wowlan)
|
|||
if (key_data.use_rsc_tsc) {
|
||||
struct iwl_host_cmd rsc_tsc_cmd = {
|
||||
.id = REPLY_WOWLAN_TSC_RSC_PARAMS,
|
||||
.flags = CMD_SYNC,
|
||||
.data[0] = key_data.rsc_tsc,
|
||||
.dataflags[0] = IWL_HCMD_DFL_NOCOPY,
|
||||
.len[0] = sizeof(*key_data.rsc_tsc),
|
||||
|
@ -1215,7 +1212,7 @@ int iwlagn_suspend(struct iwl_priv *priv, struct cfg80211_wowlan *wowlan)
|
|||
if (key_data.use_tkip) {
|
||||
ret = iwl_dvm_send_cmd_pdu(priv,
|
||||
REPLY_WOWLAN_TKIP_PARAMS,
|
||||
CMD_SYNC, sizeof(tkip_cmd),
|
||||
0, sizeof(tkip_cmd),
|
||||
&tkip_cmd);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
@ -1231,20 +1228,20 @@ int iwlagn_suspend(struct iwl_priv *priv, struct cfg80211_wowlan *wowlan)
|
|||
|
||||
ret = iwl_dvm_send_cmd_pdu(priv,
|
||||
REPLY_WOWLAN_KEK_KCK_MATERIAL,
|
||||
CMD_SYNC, sizeof(kek_kck_cmd),
|
||||
0, sizeof(kek_kck_cmd),
|
||||
&kek_kck_cmd);
|
||||
if (ret)
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
ret = iwl_dvm_send_cmd_pdu(priv, REPLY_D3_CONFIG, CMD_SYNC,
|
||||
ret = iwl_dvm_send_cmd_pdu(priv, REPLY_D3_CONFIG, 0,
|
||||
sizeof(d3_cfg_cmd), &d3_cfg_cmd);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
ret = iwl_dvm_send_cmd_pdu(priv, REPLY_WOWLAN_WAKEUP_FILTER,
|
||||
CMD_SYNC, sizeof(wakeup_filter_cmd),
|
||||
0, sizeof(wakeup_filter_cmd),
|
||||
&wakeup_filter_cmd);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
|
|
@ -128,7 +128,6 @@ int iwlagn_send_beacon_cmd(struct iwl_priv *priv)
|
|||
struct iwl_tx_beacon_cmd *tx_beacon_cmd;
|
||||
struct iwl_host_cmd cmd = {
|
||||
.id = REPLY_TX_BEACON,
|
||||
.flags = CMD_SYNC,
|
||||
};
|
||||
struct ieee80211_tx_info *info;
|
||||
u32 frame_size;
|
||||
|
@ -311,8 +310,7 @@ int iwl_send_statistics_request(struct iwl_priv *priv, u8 flags, bool clear)
|
|||
sizeof(struct iwl_statistics_cmd),
|
||||
&statistics_cmd);
|
||||
else
|
||||
return iwl_dvm_send_cmd_pdu(priv, REPLY_STATISTICS_CMD,
|
||||
CMD_SYNC,
|
||||
return iwl_dvm_send_cmd_pdu(priv, REPLY_STATISTICS_CMD, 0,
|
||||
sizeof(struct iwl_statistics_cmd),
|
||||
&statistics_cmd);
|
||||
}
|
||||
|
@ -622,7 +620,7 @@ static void iwl_rf_kill_ct_config(struct iwl_priv *priv)
|
|||
|
||||
ret = iwl_dvm_send_cmd_pdu(priv,
|
||||
REPLY_CT_KILL_CONFIG_CMD,
|
||||
CMD_SYNC, sizeof(adv_cmd), &adv_cmd);
|
||||
0, sizeof(adv_cmd), &adv_cmd);
|
||||
if (ret)
|
||||
IWL_ERR(priv, "REPLY_CT_KILL_CONFIG_CMD failed\n");
|
||||
else
|
||||
|
@ -637,7 +635,7 @@ static void iwl_rf_kill_ct_config(struct iwl_priv *priv)
|
|||
|
||||
ret = iwl_dvm_send_cmd_pdu(priv,
|
||||
REPLY_CT_KILL_CONFIG_CMD,
|
||||
CMD_SYNC, sizeof(cmd), &cmd);
|
||||
0, sizeof(cmd), &cmd);
|
||||
if (ret)
|
||||
IWL_ERR(priv, "REPLY_CT_KILL_CONFIG_CMD failed\n");
|
||||
else
|
||||
|
@ -673,9 +671,7 @@ static int iwlagn_send_tx_ant_config(struct iwl_priv *priv, u8 valid_tx_ant)
|
|||
|
||||
if (IWL_UCODE_API(priv->fw->ucode_ver) > 1) {
|
||||
IWL_DEBUG_HC(priv, "select valid tx ant: %u\n", valid_tx_ant);
|
||||
return iwl_dvm_send_cmd_pdu(priv,
|
||||
TX_ANT_CONFIGURATION_CMD,
|
||||
CMD_SYNC,
|
||||
return iwl_dvm_send_cmd_pdu(priv, TX_ANT_CONFIGURATION_CMD, 0,
|
||||
sizeof(struct iwl_tx_ant_config_cmd),
|
||||
&tx_ant_cmd);
|
||||
} else {
|
||||
|
@ -703,7 +699,7 @@ static void iwl_send_bt_config(struct iwl_priv *priv)
|
|||
(bt_cmd.flags == BT_COEX_DISABLE) ? "disable" : "active");
|
||||
|
||||
if (iwl_dvm_send_cmd_pdu(priv, REPLY_BT_CONFIG,
|
||||
CMD_SYNC, sizeof(struct iwl_bt_cmd), &bt_cmd))
|
||||
0, sizeof(struct iwl_bt_cmd), &bt_cmd))
|
||||
IWL_ERR(priv, "failed to send BT Coex Config\n");
|
||||
}
|
||||
|
||||
|
@ -987,7 +983,7 @@ static void iwl_bg_restart(struct work_struct *data)
|
|||
ieee80211_restart_hw(priv->hw);
|
||||
else
|
||||
IWL_ERR(priv,
|
||||
"Cannot request restart before registrating with mac80211");
|
||||
"Cannot request restart before registrating with mac80211\n");
|
||||
} else {
|
||||
WARN_ON(1);
|
||||
}
|
||||
|
@ -1127,7 +1123,6 @@ static void iwl_option_config(struct iwl_priv *priv)
|
|||
static int iwl_eeprom_init_hw_params(struct iwl_priv *priv)
|
||||
{
|
||||
struct iwl_nvm_data *data = priv->nvm_data;
|
||||
char *debug_msg;
|
||||
|
||||
if (data->sku_cap_11n_enable &&
|
||||
!priv->cfg->ht_params) {
|
||||
|
@ -1141,8 +1136,8 @@ static int iwl_eeprom_init_hw_params(struct iwl_priv *priv)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
debug_msg = "Device SKU: 24GHz %s %s, 52GHz %s %s, 11.n %s %s\n";
|
||||
IWL_DEBUG_INFO(priv, debug_msg,
|
||||
IWL_DEBUG_INFO(priv,
|
||||
"Device SKU: 24GHz %s %s, 52GHz %s %s, 11.n %s %s\n",
|
||||
data->sku_cap_band_24GHz_enable ? "" : "NOT", "enabled",
|
||||
data->sku_cap_band_52GHz_enable ? "" : "NOT", "enabled",
|
||||
data->sku_cap_11n_enable ? "" : "NOT", "enabled");
|
||||
|
@ -1350,7 +1345,7 @@ static struct iwl_op_mode *iwl_op_mode_dvm_start(struct iwl_trans *trans,
|
|||
iwl_set_hw_params(priv);
|
||||
|
||||
if (!(priv->nvm_data->sku_cap_ipan_enable)) {
|
||||
IWL_DEBUG_INFO(priv, "Your EEPROM disabled PAN");
|
||||
IWL_DEBUG_INFO(priv, "Your EEPROM disabled PAN\n");
|
||||
ucode_flags &= ~IWL_UCODE_TLV_FLAGS_PAN;
|
||||
/*
|
||||
* if not PAN, then don't support P2P -- might be a uCode
|
||||
|
@ -2019,10 +2014,10 @@ void iwlagn_lift_passive_no_rx(struct iwl_priv *priv)
|
|||
|
||||
for (mq = 0; mq < IWLAGN_FIRST_AMPDU_QUEUE; mq++) {
|
||||
if (!test_bit(mq, &priv->transport_queue_stop)) {
|
||||
IWL_DEBUG_TX_QUEUES(priv, "Wake queue %d", mq);
|
||||
IWL_DEBUG_TX_QUEUES(priv, "Wake queue %d\n", mq);
|
||||
ieee80211_wake_queue(priv->hw, mq);
|
||||
} else {
|
||||
IWL_DEBUG_TX_QUEUES(priv, "Don't wake queue %d", mq);
|
||||
IWL_DEBUG_TX_QUEUES(priv, "Don't wake queue %d\n", mq);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -278,7 +278,7 @@ static int iwl_set_power(struct iwl_priv *priv, struct iwl_powertable_cmd *cmd)
|
|||
le32_to_cpu(cmd->sleep_interval[3]),
|
||||
le32_to_cpu(cmd->sleep_interval[4]));
|
||||
|
||||
return iwl_dvm_send_cmd_pdu(priv, POWER_TABLE_CMD, CMD_SYNC,
|
||||
return iwl_dvm_send_cmd_pdu(priv, POWER_TABLE_CMD, 0,
|
||||
sizeof(struct iwl_powertable_cmd), cmd);
|
||||
}
|
||||
|
||||
|
@ -361,7 +361,7 @@ int iwl_power_set_mode(struct iwl_priv *priv, struct iwl_powertable_cmd *cmd,
|
|||
|
||||
memcpy(&priv->power_data.sleep_cmd, cmd, sizeof(*cmd));
|
||||
} else
|
||||
IWL_ERR(priv, "set power fail, ret = %d", ret);
|
||||
IWL_ERR(priv, "set power fail, ret = %d\n", ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -1453,7 +1453,7 @@ static int rs_move_legacy_other(struct iwl_priv *priv,
|
|||
tbl->action = IWL_LEGACY_SWITCH_SISO;
|
||||
break;
|
||||
default:
|
||||
IWL_ERR(priv, "Invalid BT load %d", priv->bt_traffic_load);
|
||||
IWL_ERR(priv, "Invalid BT load %d\n", priv->bt_traffic_load);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1628,7 +1628,7 @@ static int rs_move_siso_to_other(struct iwl_priv *priv,
|
|||
tbl->action = IWL_SISO_SWITCH_ANTENNA1;
|
||||
break;
|
||||
default:
|
||||
IWL_ERR(priv, "Invalid BT load %d", priv->bt_traffic_load);
|
||||
IWL_ERR(priv, "Invalid BT load %d\n", priv->bt_traffic_load);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1799,7 +1799,7 @@ static int rs_move_mimo2_to_other(struct iwl_priv *priv,
|
|||
tbl->action = IWL_MIMO2_SWITCH_SISO_A;
|
||||
break;
|
||||
default:
|
||||
IWL_ERR(priv, "Invalid BT load %d", priv->bt_traffic_load);
|
||||
IWL_ERR(priv, "Invalid BT load %d\n", priv->bt_traffic_load);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1969,7 +1969,7 @@ static int rs_move_mimo3_to_other(struct iwl_priv *priv,
|
|||
tbl->action = IWL_MIMO3_SWITCH_SISO_A;
|
||||
break;
|
||||
default:
|
||||
IWL_ERR(priv, "Invalid BT load %d", priv->bt_traffic_load);
|
||||
IWL_ERR(priv, "Invalid BT load %d\n", priv->bt_traffic_load);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -2709,7 +2709,7 @@ static void rs_initialize_lq(struct iwl_priv *priv,
|
|||
rs_set_expected_tpt_table(lq_sta, tbl);
|
||||
rs_fill_link_cmd(NULL, lq_sta, rate);
|
||||
priv->stations[lq_sta->lq.sta_id].lq = &lq_sta->lq;
|
||||
iwl_send_lq_cmd(priv, ctx, &lq_sta->lq, CMD_SYNC, true);
|
||||
iwl_send_lq_cmd(priv, ctx, &lq_sta->lq, 0, true);
|
||||
}
|
||||
|
||||
static void rs_get_rate(void *priv_r, struct ieee80211_sta *sta, void *priv_sta,
|
||||
|
|
|
@ -786,7 +786,7 @@ static void iwlagn_pass_packet_to_mac80211(struct iwl_priv *priv,
|
|||
|
||||
memcpy(IEEE80211_SKB_RXCB(skb), stats, sizeof(*stats));
|
||||
|
||||
ieee80211_rx_ni(priv->hw, skb);
|
||||
ieee80211_rx(priv->hw, skb);
|
||||
}
|
||||
|
||||
static u32 iwlagn_translate_rx_status(struct iwl_priv *priv, u32 decrypt_in)
|
||||
|
|
|
@ -104,7 +104,7 @@ static int iwlagn_disable_bss(struct iwl_priv *priv,
|
|||
|
||||
send->filter_flags &= ~RXON_FILTER_ASSOC_MSK;
|
||||
ret = iwl_dvm_send_cmd_pdu(priv, ctx->rxon_cmd,
|
||||
CMD_SYNC, sizeof(*send), send);
|
||||
0, sizeof(*send), send);
|
||||
|
||||
send->filter_flags = old_filter;
|
||||
|
||||
|
@ -134,7 +134,7 @@ static int iwlagn_disable_pan(struct iwl_priv *priv,
|
|||
send->filter_flags &= ~RXON_FILTER_ASSOC_MSK;
|
||||
send->dev_type = RXON_DEV_TYPE_P2P;
|
||||
ret = iwl_dvm_send_cmd_pdu(priv, ctx->rxon_cmd,
|
||||
CMD_SYNC, sizeof(*send), send);
|
||||
0, sizeof(*send), send);
|
||||
|
||||
send->filter_flags = old_filter;
|
||||
send->dev_type = old_dev_type;
|
||||
|
@ -160,7 +160,7 @@ static int iwlagn_disconn_pan(struct iwl_priv *priv,
|
|||
int ret;
|
||||
|
||||
send->filter_flags &= ~RXON_FILTER_ASSOC_MSK;
|
||||
ret = iwl_dvm_send_cmd_pdu(priv, ctx->rxon_cmd, CMD_SYNC,
|
||||
ret = iwl_dvm_send_cmd_pdu(priv, ctx->rxon_cmd, 0,
|
||||
sizeof(*send), send);
|
||||
|
||||
send->filter_flags = old_filter;
|
||||
|
@ -189,7 +189,7 @@ static void iwlagn_update_qos(struct iwl_priv *priv,
|
|||
ctx->qos_data.qos_active,
|
||||
ctx->qos_data.def_qos_parm.qos_flags);
|
||||
|
||||
ret = iwl_dvm_send_cmd_pdu(priv, ctx->qos_cmd, CMD_SYNC,
|
||||
ret = iwl_dvm_send_cmd_pdu(priv, ctx->qos_cmd, 0,
|
||||
sizeof(struct iwl_qosparam_cmd),
|
||||
&ctx->qos_data.def_qos_parm);
|
||||
if (ret)
|
||||
|
@ -353,7 +353,7 @@ static int iwl_send_rxon_timing(struct iwl_priv *priv,
|
|||
le16_to_cpu(ctx->timing.atim_window));
|
||||
|
||||
return iwl_dvm_send_cmd_pdu(priv, ctx->rxon_timing_cmd,
|
||||
CMD_SYNC, sizeof(ctx->timing), &ctx->timing);
|
||||
0, sizeof(ctx->timing), &ctx->timing);
|
||||
}
|
||||
|
||||
static int iwlagn_rxon_disconn(struct iwl_priv *priv,
|
||||
|
@ -495,7 +495,7 @@ static int iwlagn_rxon_connect(struct iwl_priv *priv,
|
|||
* Associated RXON doesn't clear the station table in uCode,
|
||||
* so we don't need to restore stations etc. after this.
|
||||
*/
|
||||
ret = iwl_dvm_send_cmd_pdu(priv, ctx->rxon_cmd, CMD_SYNC,
|
||||
ret = iwl_dvm_send_cmd_pdu(priv, ctx->rxon_cmd, 0,
|
||||
sizeof(struct iwl_rxon_cmd), &ctx->staging);
|
||||
if (ret) {
|
||||
IWL_ERR(priv, "Error setting new RXON (%d)\n", ret);
|
||||
|
@ -610,7 +610,7 @@ int iwlagn_set_pan_params(struct iwl_priv *priv)
|
|||
cmd.slots[0].width = cpu_to_le16(slot0);
|
||||
cmd.slots[1].width = cpu_to_le16(slot1);
|
||||
|
||||
ret = iwl_dvm_send_cmd_pdu(priv, REPLY_WIPAN_PARAMS, CMD_SYNC,
|
||||
ret = iwl_dvm_send_cmd_pdu(priv, REPLY_WIPAN_PARAMS, 0,
|
||||
sizeof(cmd), &cmd);
|
||||
if (ret)
|
||||
IWL_ERR(priv, "Error setting PAN parameters (%d)\n", ret);
|
||||
|
@ -823,7 +823,7 @@ static int iwl_check_rxon_cmd(struct iwl_priv *priv,
|
|||
|
||||
if ((rxon->flags & (RXON_FLG_CCK_MSK | RXON_FLG_AUTO_DETECT_MSK))
|
||||
== (RXON_FLG_CCK_MSK | RXON_FLG_AUTO_DETECT_MSK)) {
|
||||
IWL_WARN(priv, "CCK and auto detect");
|
||||
IWL_WARN(priv, "CCK and auto detect\n");
|
||||
errors |= BIT(8);
|
||||
}
|
||||
|
||||
|
@ -1395,7 +1395,7 @@ static void iwlagn_chain_noise_reset(struct iwl_priv *priv)
|
|||
priv->phy_calib_chain_noise_reset_cmd);
|
||||
ret = iwl_dvm_send_cmd_pdu(priv,
|
||||
REPLY_PHY_CALIBRATION_CMD,
|
||||
CMD_SYNC, sizeof(cmd), &cmd);
|
||||
0, sizeof(cmd), &cmd);
|
||||
if (ret)
|
||||
IWL_ERR(priv,
|
||||
"Could not send REPLY_PHY_CALIBRATION_CMD\n");
|
||||
|
|
|
@ -59,7 +59,7 @@ static int iwl_send_scan_abort(struct iwl_priv *priv)
|
|||
int ret;
|
||||
struct iwl_host_cmd cmd = {
|
||||
.id = REPLY_SCAN_ABORT_CMD,
|
||||
.flags = CMD_SYNC | CMD_WANT_SKB,
|
||||
.flags = CMD_WANT_SKB,
|
||||
};
|
||||
__le32 *status;
|
||||
|
||||
|
@ -639,7 +639,6 @@ static int iwlagn_request_scan(struct iwl_priv *priv, struct ieee80211_vif *vif)
|
|||
struct iwl_host_cmd cmd = {
|
||||
.id = REPLY_SCAN_CMD,
|
||||
.len = { sizeof(struct iwl_scan_cmd), },
|
||||
.flags = CMD_SYNC,
|
||||
};
|
||||
struct iwl_scan_cmd *scan;
|
||||
struct iwl_rxon_context *ctx = &priv->contexts[IWL_RXON_CTX_BSS];
|
||||
|
|
|
@ -39,7 +39,7 @@ static int iwl_sta_ucode_activate(struct iwl_priv *priv, u8 sta_id)
|
|||
lockdep_assert_held(&priv->sta_lock);
|
||||
|
||||
if (sta_id >= IWLAGN_STATION_COUNT) {
|
||||
IWL_ERR(priv, "invalid sta_id %u", sta_id);
|
||||
IWL_ERR(priv, "invalid sta_id %u\n", sta_id);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (!(priv->stations[sta_id].used & IWL_STA_DRIVER_ACTIVE))
|
||||
|
@ -165,7 +165,7 @@ int iwl_send_add_sta(struct iwl_priv *priv,
|
|||
iwl_free_resp(&cmd);
|
||||
|
||||
if (cmd.handler_status)
|
||||
IWL_ERR(priv, "%s - error in the CMD response %d", __func__,
|
||||
IWL_ERR(priv, "%s - error in the CMD response %d\n", __func__,
|
||||
cmd.handler_status);
|
||||
|
||||
return cmd.handler_status;
|
||||
|
@ -261,7 +261,7 @@ int iwl_sta_update_ht(struct iwl_priv *priv, struct iwl_rxon_context *ctx,
|
|||
cmd.station_flags = flags;
|
||||
cmd.sta.sta_id = sta_id;
|
||||
|
||||
return iwl_send_add_sta(priv, &cmd, CMD_SYNC);
|
||||
return iwl_send_add_sta(priv, &cmd, 0);
|
||||
}
|
||||
|
||||
static void iwl_set_ht_add_station(struct iwl_priv *priv, u8 index,
|
||||
|
@ -413,7 +413,7 @@ int iwl_add_station_common(struct iwl_priv *priv, struct iwl_rxon_context *ctx,
|
|||
spin_unlock_bh(&priv->sta_lock);
|
||||
|
||||
/* Add station to device's station table */
|
||||
ret = iwl_send_add_sta(priv, &sta_cmd, CMD_SYNC);
|
||||
ret = iwl_send_add_sta(priv, &sta_cmd, 0);
|
||||
if (ret) {
|
||||
spin_lock_bh(&priv->sta_lock);
|
||||
IWL_ERR(priv, "Adding station %pM failed.\n",
|
||||
|
@ -456,7 +456,6 @@ static int iwl_send_remove_station(struct iwl_priv *priv,
|
|||
struct iwl_host_cmd cmd = {
|
||||
.id = REPLY_REMOVE_STA,
|
||||
.len = { sizeof(struct iwl_rem_sta_cmd), },
|
||||
.flags = CMD_SYNC,
|
||||
.data = { &rm_sta_cmd, },
|
||||
};
|
||||
|
||||
|
@ -740,7 +739,7 @@ void iwl_restore_stations(struct iwl_priv *priv, struct iwl_rxon_context *ctx)
|
|||
send_lq = true;
|
||||
}
|
||||
spin_unlock_bh(&priv->sta_lock);
|
||||
ret = iwl_send_add_sta(priv, &sta_cmd, CMD_SYNC);
|
||||
ret = iwl_send_add_sta(priv, &sta_cmd, 0);
|
||||
if (ret) {
|
||||
spin_lock_bh(&priv->sta_lock);
|
||||
IWL_ERR(priv, "Adding station %pM failed.\n",
|
||||
|
@ -756,8 +755,7 @@ void iwl_restore_stations(struct iwl_priv *priv, struct iwl_rxon_context *ctx)
|
|||
* current LQ command
|
||||
*/
|
||||
if (send_lq)
|
||||
iwl_send_lq_cmd(priv, ctx, &lq,
|
||||
CMD_SYNC, true);
|
||||
iwl_send_lq_cmd(priv, ctx, &lq, 0, true);
|
||||
spin_lock_bh(&priv->sta_lock);
|
||||
priv->stations[i].used &= ~IWL_STA_UCODE_INPROGRESS;
|
||||
}
|
||||
|
@ -968,7 +966,7 @@ int iwlagn_add_bssid_station(struct iwl_priv *priv,
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
ret = iwl_send_lq_cmd(priv, ctx, link_cmd, CMD_SYNC, true);
|
||||
ret = iwl_send_lq_cmd(priv, ctx, link_cmd, 0, true);
|
||||
if (ret)
|
||||
IWL_ERR(priv, "Link quality command failed (%d)\n", ret);
|
||||
|
||||
|
@ -999,7 +997,6 @@ static int iwl_send_static_wepkey_cmd(struct iwl_priv *priv,
|
|||
struct iwl_host_cmd cmd = {
|
||||
.id = ctx->wep_key_cmd,
|
||||
.data = { wep_cmd, },
|
||||
.flags = CMD_SYNC,
|
||||
};
|
||||
|
||||
might_sleep();
|
||||
|
@ -1248,7 +1245,7 @@ int iwl_remove_dynamic_key(struct iwl_priv *priv,
|
|||
sta_cmd.sta.modify_mask = STA_MODIFY_KEY_MASK;
|
||||
sta_cmd.mode = STA_CONTROL_MODIFY_MSK;
|
||||
|
||||
return iwl_send_add_sta(priv, &sta_cmd, CMD_SYNC);
|
||||
return iwl_send_add_sta(priv, &sta_cmd, 0);
|
||||
}
|
||||
|
||||
int iwl_set_dynamic_key(struct iwl_priv *priv,
|
||||
|
@ -1284,13 +1281,13 @@ int iwl_set_dynamic_key(struct iwl_priv *priv,
|
|||
ieee80211_get_key_rx_seq(keyconf, 0, &seq);
|
||||
ieee80211_get_tkip_rx_p1k(keyconf, addr, seq.tkip.iv32, p1k);
|
||||
ret = iwlagn_send_sta_key(priv, keyconf, sta_id,
|
||||
seq.tkip.iv32, p1k, CMD_SYNC);
|
||||
seq.tkip.iv32, p1k, 0);
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_CCMP:
|
||||
case WLAN_CIPHER_SUITE_WEP40:
|
||||
case WLAN_CIPHER_SUITE_WEP104:
|
||||
ret = iwlagn_send_sta_key(priv, keyconf, sta_id,
|
||||
0, NULL, CMD_SYNC);
|
||||
0, NULL, 0);
|
||||
break;
|
||||
default:
|
||||
IWL_ERR(priv, "Unknown cipher %x\n", keyconf->cipher);
|
||||
|
@ -1409,7 +1406,7 @@ int iwl_sta_tx_modify_enable_tid(struct iwl_priv *priv, int sta_id, int tid)
|
|||
memcpy(&sta_cmd, &priv->stations[sta_id].sta, sizeof(struct iwl_addsta_cmd));
|
||||
spin_unlock_bh(&priv->sta_lock);
|
||||
|
||||
return iwl_send_add_sta(priv, &sta_cmd, CMD_SYNC);
|
||||
return iwl_send_add_sta(priv, &sta_cmd, 0);
|
||||
}
|
||||
|
||||
int iwl_sta_rx_agg_start(struct iwl_priv *priv, struct ieee80211_sta *sta,
|
||||
|
@ -1433,7 +1430,7 @@ int iwl_sta_rx_agg_start(struct iwl_priv *priv, struct ieee80211_sta *sta,
|
|||
memcpy(&sta_cmd, &priv->stations[sta_id].sta, sizeof(struct iwl_addsta_cmd));
|
||||
spin_unlock_bh(&priv->sta_lock);
|
||||
|
||||
return iwl_send_add_sta(priv, &sta_cmd, CMD_SYNC);
|
||||
return iwl_send_add_sta(priv, &sta_cmd, 0);
|
||||
}
|
||||
|
||||
int iwl_sta_rx_agg_stop(struct iwl_priv *priv, struct ieee80211_sta *sta,
|
||||
|
@ -1458,7 +1455,7 @@ int iwl_sta_rx_agg_stop(struct iwl_priv *priv, struct ieee80211_sta *sta,
|
|||
memcpy(&sta_cmd, &priv->stations[sta_id].sta, sizeof(struct iwl_addsta_cmd));
|
||||
spin_unlock_bh(&priv->sta_lock);
|
||||
|
||||
return iwl_send_add_sta(priv, &sta_cmd, CMD_SYNC);
|
||||
return iwl_send_add_sta(priv, &sta_cmd, 0);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -236,7 +236,7 @@ static void iwl_prepare_ct_kill_task(struct iwl_priv *priv)
|
|||
{
|
||||
IWL_DEBUG_TEMP(priv, "Prepare to enter IWL_TI_CT_KILL\n");
|
||||
/* make request to retrieve statistics information */
|
||||
iwl_send_statistics_request(priv, CMD_SYNC, false);
|
||||
iwl_send_statistics_request(priv, 0, false);
|
||||
/* Reschedule the ct_kill wait timer */
|
||||
mod_timer(&priv->thermal_throttle.ct_kill_waiting_tm,
|
||||
jiffies + msecs_to_jiffies(CT_KILL_WAITING_DURATION));
|
||||
|
|
|
@ -402,10 +402,10 @@ int iwlagn_tx_skb(struct iwl_priv *priv,
|
|||
/* aggregation is on for this <sta,tid> */
|
||||
if (info->flags & IEEE80211_TX_CTL_AMPDU &&
|
||||
tid_data->agg.state != IWL_AGG_ON) {
|
||||
IWL_ERR(priv, "TX_CTL_AMPDU while not in AGG:"
|
||||
" Tx flags = 0x%08x, agg.state = %d",
|
||||
IWL_ERR(priv,
|
||||
"TX_CTL_AMPDU while not in AGG: Tx flags = 0x%08x, agg.state = %d\n",
|
||||
info->flags, tid_data->agg.state);
|
||||
IWL_ERR(priv, "sta_id = %d, tid = %d seq_num = %d",
|
||||
IWL_ERR(priv, "sta_id = %d, tid = %d seq_num = %d\n",
|
||||
sta_id, tid,
|
||||
IEEE80211_SEQ_TO_SN(tid_data->seq_number));
|
||||
goto drop_unlock_sta;
|
||||
|
@ -416,7 +416,7 @@ int iwlagn_tx_skb(struct iwl_priv *priv,
|
|||
*/
|
||||
if (WARN_ONCE(tid_data->agg.state != IWL_AGG_ON &&
|
||||
tid_data->agg.state != IWL_AGG_OFF,
|
||||
"Tx while agg.state = %d", tid_data->agg.state))
|
||||
"Tx while agg.state = %d\n", tid_data->agg.state))
|
||||
goto drop_unlock_sta;
|
||||
|
||||
seq_number = tid_data->seq_number;
|
||||
|
@ -778,8 +778,8 @@ static void iwlagn_check_ratid_empty(struct iwl_priv *priv, int sta_id, u8 tid)
|
|||
/* There are no packets for this RA / TID in the HW any more */
|
||||
if (tid_data->agg.ssn == tid_data->next_reclaimed) {
|
||||
IWL_DEBUG_TX_QUEUES(priv,
|
||||
"Can continue DELBA flow ssn = next_recl ="
|
||||
" %d", tid_data->next_reclaimed);
|
||||
"Can continue DELBA flow ssn = next_recl = %d\n",
|
||||
tid_data->next_reclaimed);
|
||||
iwl_trans_txq_disable(priv->trans,
|
||||
tid_data->agg.txq_id);
|
||||
iwlagn_dealloc_agg_txq(priv, tid_data->agg.txq_id);
|
||||
|
@ -791,8 +791,8 @@ static void iwlagn_check_ratid_empty(struct iwl_priv *priv, int sta_id, u8 tid)
|
|||
/* There are no packets for this RA / TID in the HW any more */
|
||||
if (tid_data->agg.ssn == tid_data->next_reclaimed) {
|
||||
IWL_DEBUG_TX_QUEUES(priv,
|
||||
"Can continue ADDBA flow ssn = next_recl ="
|
||||
" %d", tid_data->next_reclaimed);
|
||||
"Can continue ADDBA flow ssn = next_recl = %d\n",
|
||||
tid_data->next_reclaimed);
|
||||
tid_data->agg.state = IWL_AGG_STARTING;
|
||||
ieee80211_start_tx_ba_cb_irqsafe(vif, addr, tid);
|
||||
}
|
||||
|
@ -1216,8 +1216,8 @@ int iwlagn_rx_reply_tx(struct iwl_priv *priv, struct iwl_rx_cmd_buffer *rxb,
|
|||
ctx->vif->type == NL80211_IFTYPE_STATION) {
|
||||
/* block and stop all queues */
|
||||
priv->passive_no_rx = true;
|
||||
IWL_DEBUG_TX_QUEUES(priv, "stop all queues: "
|
||||
"passive channel");
|
||||
IWL_DEBUG_TX_QUEUES(priv,
|
||||
"stop all queues: passive channel\n");
|
||||
ieee80211_stop_queues(priv->hw);
|
||||
|
||||
IWL_DEBUG_TX_REPLY(priv,
|
||||
|
@ -1271,7 +1271,7 @@ int iwlagn_rx_reply_tx(struct iwl_priv *priv, struct iwl_rx_cmd_buffer *rxb,
|
|||
|
||||
while (!skb_queue_empty(&skbs)) {
|
||||
skb = __skb_dequeue(&skbs);
|
||||
ieee80211_tx_status_ni(priv->hw, skb);
|
||||
ieee80211_tx_status(priv->hw, skb);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -1411,7 +1411,7 @@ int iwlagn_rx_reply_compressed_ba(struct iwl_priv *priv,
|
|||
|
||||
while (!skb_queue_empty(&reclaimed_skbs)) {
|
||||
skb = __skb_dequeue(&reclaimed_skbs);
|
||||
ieee80211_tx_status_ni(priv->hw, skb);
|
||||
ieee80211_tx_status(priv->hw, skb);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -172,7 +172,7 @@ static int iwl_send_wimax_coex(struct iwl_priv *priv)
|
|||
memset(&coex_cmd, 0, sizeof(coex_cmd));
|
||||
|
||||
return iwl_dvm_send_cmd_pdu(priv,
|
||||
COEX_PRIORITY_TABLE_CMD, CMD_SYNC,
|
||||
COEX_PRIORITY_TABLE_CMD, 0,
|
||||
sizeof(coex_cmd), &coex_cmd);
|
||||
}
|
||||
|
||||
|
@ -205,7 +205,7 @@ void iwl_send_prio_tbl(struct iwl_priv *priv)
|
|||
memcpy(prio_tbl_cmd.prio_tbl, iwl_bt_prio_tbl,
|
||||
sizeof(iwl_bt_prio_tbl));
|
||||
if (iwl_dvm_send_cmd_pdu(priv,
|
||||
REPLY_BT_COEX_PRIO_TABLE, CMD_SYNC,
|
||||
REPLY_BT_COEX_PRIO_TABLE, 0,
|
||||
sizeof(prio_tbl_cmd), &prio_tbl_cmd))
|
||||
IWL_ERR(priv, "failed to send BT prio tbl command\n");
|
||||
}
|
||||
|
@ -218,7 +218,7 @@ int iwl_send_bt_env(struct iwl_priv *priv, u8 action, u8 type)
|
|||
env_cmd.action = action;
|
||||
env_cmd.type = type;
|
||||
ret = iwl_dvm_send_cmd_pdu(priv,
|
||||
REPLY_BT_COEX_PROT_ENV, CMD_SYNC,
|
||||
REPLY_BT_COEX_PROT_ENV, 0,
|
||||
sizeof(env_cmd), &env_cmd);
|
||||
if (ret)
|
||||
IWL_ERR(priv, "failed to send BT env command\n");
|
||||
|
|
|
@ -83,6 +83,7 @@
|
|||
#define IWL8000_MODULE_FIRMWARE(api) IWL8000_FW_PRE __stringify(api) ".ucode"
|
||||
|
||||
#define NVM_HW_SECTION_NUM_FAMILY_8000 10
|
||||
#define DEFAULT_NVM_FILE_FAMILY_8000 "iwl_nvm_8000.bin"
|
||||
|
||||
static const struct iwl_base_params iwl8000_base_params = {
|
||||
.eeprom_size = OTP_LOW_IMAGE_SIZE_FAMILY_8000,
|
||||
|
@ -118,6 +119,7 @@ const struct iwl_cfg iwl8260_2ac_cfg = {
|
|||
.ht_params = &iwl8000_ht_params,
|
||||
.nvm_ver = IWL8000_NVM_VERSION,
|
||||
.nvm_calib_ver = IWL8000_TX_POWER_VERSION,
|
||||
.default_nvm_file = DEFAULT_NVM_FILE_FAMILY_8000,
|
||||
};
|
||||
|
||||
const struct iwl_cfg iwl8260_n_cfg = {
|
||||
|
@ -127,6 +129,7 @@ const struct iwl_cfg iwl8260_n_cfg = {
|
|||
.ht_params = &iwl8000_ht_params,
|
||||
.nvm_ver = IWL8000_NVM_VERSION,
|
||||
.nvm_calib_ver = IWL8000_TX_POWER_VERSION,
|
||||
.default_nvm_file = DEFAULT_NVM_FILE_FAMILY_8000,
|
||||
};
|
||||
|
||||
MODULE_FIRMWARE(IWL8000_MODULE_FIRMWARE(IWL8000_UCODE_API_OK));
|
||||
|
|
|
@ -195,7 +195,7 @@ struct iwl_ht_params {
|
|||
|
||||
/* lower blocks contain EEPROM image and calibration data */
|
||||
#define OTP_LOW_IMAGE_SIZE (2 * 512 * sizeof(u16)) /* 2 KB */
|
||||
#define OTP_LOW_IMAGE_SIZE_FAMILY_7000 (4 * 512 * sizeof(u16)) /* 4 KB */
|
||||
#define OTP_LOW_IMAGE_SIZE_FAMILY_7000 (16 * 512 * sizeof(u16)) /* 16 KB */
|
||||
#define OTP_LOW_IMAGE_SIZE_FAMILY_8000 (32 * 512 * sizeof(u16)) /* 32 KB */
|
||||
|
||||
struct iwl_eeprom_params {
|
||||
|
@ -275,6 +275,7 @@ struct iwl_cfg {
|
|||
bool lp_xtal_workaround;
|
||||
const struct iwl_pwr_tx_backoff *pwr_tx_backoffs;
|
||||
bool no_power_up_nic_in_init;
|
||||
const char *default_nvm_file;
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
@ -61,8 +61,6 @@
|
|||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#define DEBUG
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/export.h>
|
||||
|
@ -128,8 +126,8 @@ void __iwl_dbg(struct device *dev,
|
|||
#ifdef CONFIG_IWLWIFI_DEBUG
|
||||
if (iwl_have_debug_level(level) &&
|
||||
(!limit || net_ratelimit()))
|
||||
dev_dbg(dev, "%c %s %pV", in_interrupt() ? 'I' : 'U',
|
||||
function, &vaf);
|
||||
dev_printk(KERN_DEBUG, dev, "%c %s %pV",
|
||||
in_interrupt() ? 'I' : 'U', function, &vaf);
|
||||
#endif
|
||||
trace_iwlwifi_dbg(level, in_interrupt(), function, &vaf);
|
||||
va_end(args);
|
||||
|
|
|
@ -47,12 +47,32 @@ void __iwl_warn(struct device *dev, const char *fmt, ...) __printf(2, 3);
|
|||
void __iwl_info(struct device *dev, const char *fmt, ...) __printf(2, 3);
|
||||
void __iwl_crit(struct device *dev, const char *fmt, ...) __printf(2, 3);
|
||||
|
||||
/* not all compilers can evaluate strlen() at compile time, so use sizeof() */
|
||||
#define CHECK_FOR_NEWLINE(f) BUILD_BUG_ON(f[sizeof(f) - 2] != '\n')
|
||||
|
||||
/* No matter what is m (priv, bus, trans), this will work */
|
||||
#define IWL_ERR(m, f, a...) __iwl_err((m)->dev, false, false, f, ## a)
|
||||
#define IWL_ERR_DEV(d, f, a...) __iwl_err((d), false, false, f, ## a)
|
||||
#define IWL_WARN(m, f, a...) __iwl_warn((m)->dev, f, ## a)
|
||||
#define IWL_INFO(m, f, a...) __iwl_info((m)->dev, f, ## a)
|
||||
#define IWL_CRIT(m, f, a...) __iwl_crit((m)->dev, f, ## a)
|
||||
#define IWL_ERR_DEV(d, f, a...) \
|
||||
do { \
|
||||
CHECK_FOR_NEWLINE(f); \
|
||||
__iwl_err((d), false, false, f, ## a); \
|
||||
} while (0)
|
||||
#define IWL_ERR(m, f, a...) \
|
||||
IWL_ERR_DEV((m)->dev, f, ## a)
|
||||
#define IWL_WARN(m, f, a...) \
|
||||
do { \
|
||||
CHECK_FOR_NEWLINE(f); \
|
||||
__iwl_warn((m)->dev, f, ## a); \
|
||||
} while (0)
|
||||
#define IWL_INFO(m, f, a...) \
|
||||
do { \
|
||||
CHECK_FOR_NEWLINE(f); \
|
||||
__iwl_info((m)->dev, f, ## a); \
|
||||
} while (0)
|
||||
#define IWL_CRIT(m, f, a...) \
|
||||
do { \
|
||||
CHECK_FOR_NEWLINE(f); \
|
||||
__iwl_crit((m)->dev, f, ## a); \
|
||||
} while (0)
|
||||
|
||||
#if defined(CONFIG_IWLWIFI_DEBUG) || defined(CONFIG_IWLWIFI_DEVICE_TRACING)
|
||||
void __iwl_dbg(struct device *dev,
|
||||
|
@ -72,12 +92,17 @@ do { \
|
|||
DUMP_PREFIX_OFFSET, 16, 1, p, len, 1); \
|
||||
} while (0)
|
||||
|
||||
#define __IWL_DEBUG_DEV(dev, level, limit, fmt, args...) \
|
||||
do { \
|
||||
CHECK_FOR_NEWLINE(fmt); \
|
||||
__iwl_dbg(dev, level, limit, __func__, fmt, ##args); \
|
||||
} while (0)
|
||||
#define IWL_DEBUG(m, level, fmt, args...) \
|
||||
__iwl_dbg((m)->dev, level, false, __func__, fmt, ##args)
|
||||
__IWL_DEBUG_DEV((m)->dev, level, false, fmt, ##args)
|
||||
#define IWL_DEBUG_DEV(dev, level, fmt, args...) \
|
||||
__iwl_dbg((dev), level, false, __func__, fmt, ##args)
|
||||
__IWL_DEBUG_DEV(dev, level, false, fmt, ##args)
|
||||
#define IWL_DEBUG_LIMIT(m, level, fmt, args...) \
|
||||
__iwl_dbg((m)->dev, level, true, __func__, fmt, ##args)
|
||||
__IWL_DEBUG_DEV((m)->dev, level, true, fmt, ##args)
|
||||
|
||||
#ifdef CONFIG_IWLWIFI_DEBUG
|
||||
#define iwl_print_hex_dump(m, level, p, len) \
|
||||
|
|
|
@ -1243,6 +1243,7 @@ struct iwl_mod_params iwlwifi_mod_params = {
|
|||
.bt_coex_active = true,
|
||||
.power_level = IWL_POWER_INDEX_1,
|
||||
.wd_disable = true,
|
||||
.uapsd_disable = false,
|
||||
/* the rest are 0 by default */
|
||||
};
|
||||
IWL_EXPORT_SYMBOL(iwlwifi_mod_params);
|
||||
|
@ -1356,6 +1357,10 @@ MODULE_PARM_DESC(wd_disable,
|
|||
module_param_named(nvm_file, iwlwifi_mod_params.nvm_file, charp, S_IRUGO);
|
||||
MODULE_PARM_DESC(nvm_file, "NVM file name");
|
||||
|
||||
module_param_named(uapsd_disable, iwlwifi_mod_params.uapsd_disable,
|
||||
bool, S_IRUGO);
|
||||
MODULE_PARM_DESC(uapsd_disable, "disable U-APSD functionality (default: N)");
|
||||
|
||||
/*
|
||||
* set bt_coex_active to true, uCode will do kill/defer
|
||||
* every time the priority line is asserted (BT is sending signals on the
|
||||
|
|
|
@ -74,7 +74,7 @@
|
|||
* @IWL_UCODE_TLV_FLAGS_MFP: This uCode image supports MFP (802.11w).
|
||||
* @IWL_UCODE_TLV_FLAGS_P2P: This uCode image supports P2P.
|
||||
* @IWL_UCODE_TLV_FLAGS_DW_BC_TABLE: The SCD byte count table is in DWORDS
|
||||
* @IWL_UCODE_TLV_FLAGS_UAPSD: This uCode image supports uAPSD
|
||||
* @IWL_UCODE_TLV_FLAGS_UAPSD_SUPPORT: This uCode image supports uAPSD
|
||||
* @IWL_UCODE_TLV_FLAGS_SHORT_BL: 16 entries of black list instead of 64 in scan
|
||||
* offload profile config command.
|
||||
* @IWL_UCODE_TLV_FLAGS_D3_6_IPV6_ADDRS: D3 image supports up to six
|
||||
|
@ -107,6 +107,7 @@ enum iwl_ucode_tlv_flag {
|
|||
IWL_UCODE_TLV_FLAGS_P2P_PM = BIT(21),
|
||||
IWL_UCODE_TLV_FLAGS_BSS_P2P_PS_DCM = BIT(22),
|
||||
IWL_UCODE_TLV_FLAGS_BSS_P2P_PS_SCM = BIT(23),
|
||||
IWL_UCODE_TLV_FLAGS_UAPSD_SUPPORT = BIT(24),
|
||||
IWL_UCODE_TLV_FLAGS_EBS_SUPPORT = BIT(25),
|
||||
IWL_UCODE_TLV_FLAGS_P2P_PS_UAPSD = BIT(26),
|
||||
IWL_UCODE_TLV_FLAGS_BCAST_FILTERING = BIT(29),
|
||||
|
@ -196,6 +197,11 @@ struct fw_img {
|
|||
bool is_dual_cpus;
|
||||
};
|
||||
|
||||
struct iwl_sf_region {
|
||||
u32 addr;
|
||||
u32 size;
|
||||
};
|
||||
|
||||
/* uCode version contains 4 values: Major/Minor/API/Serial */
|
||||
#define IWL_UCODE_MAJOR(ver) (((ver) & 0xFF000000) >> 24)
|
||||
#define IWL_UCODE_MINOR(ver) (((ver) & 0x00FF0000) >> 16)
|
||||
|
|
|
@ -33,6 +33,7 @@
|
|||
#include "iwl-io.h"
|
||||
#include "iwl-csr.h"
|
||||
#include "iwl-debug.h"
|
||||
#include "iwl-prph.h"
|
||||
#include "iwl-fh.h"
|
||||
|
||||
#define IWL_POLL_INTERVAL 10 /* microseconds */
|
||||
|
@ -183,6 +184,23 @@ void iwl_clear_bits_prph(struct iwl_trans *trans, u32 ofs, u32 mask)
|
|||
}
|
||||
IWL_EXPORT_SYMBOL(iwl_clear_bits_prph);
|
||||
|
||||
void iwl_force_nmi(struct iwl_trans *trans)
|
||||
{
|
||||
/*
|
||||
* In HW previous to the 8000 HW family, and in the 8000 HW family
|
||||
* itself when the revision step==0, the DEVICE_SET_NMI_REG is used
|
||||
* to force an NMI. Otherwise, a different register -
|
||||
* DEVICE_SET_NMI_8000B_REG - is used.
|
||||
*/
|
||||
if ((trans->cfg->device_family != IWL_DEVICE_FAMILY_8000) ||
|
||||
((trans->hw_rev & 0xc) == 0x0))
|
||||
iwl_write_prph(trans, DEVICE_SET_NMI_REG, DEVICE_SET_NMI_VAL);
|
||||
else
|
||||
iwl_write_prph(trans, DEVICE_SET_NMI_8000B_REG,
|
||||
DEVICE_SET_NMI_8000B_VAL);
|
||||
}
|
||||
IWL_EXPORT_SYMBOL(iwl_force_nmi);
|
||||
|
||||
static const char *get_fh_string(int cmd)
|
||||
{
|
||||
#define IWL_CMD(x) case x: return #x
|
||||
|
|
|
@ -80,6 +80,7 @@ void iwl_set_bits_prph(struct iwl_trans *trans, u32 ofs, u32 mask);
|
|||
void iwl_set_bits_mask_prph(struct iwl_trans *trans, u32 ofs,
|
||||
u32 bits, u32 mask);
|
||||
void iwl_clear_bits_prph(struct iwl_trans *trans, u32 ofs, u32 mask);
|
||||
void iwl_force_nmi(struct iwl_trans *trans);
|
||||
|
||||
/* Error handling */
|
||||
int iwl_dump_fh(struct iwl_trans *trans, char **buf);
|
||||
|
|
|
@ -119,6 +119,7 @@ struct iwl_mod_params {
|
|||
#endif
|
||||
int ant_coupling;
|
||||
char *nvm_file;
|
||||
bool uapsd_disable;
|
||||
};
|
||||
|
||||
#endif /* #__iwl_modparams_h__ */
|
||||
|
|
|
@ -128,7 +128,7 @@ static const u8 iwl_nvm_channels[] = {
|
|||
|
||||
static const u8 iwl_nvm_channels_family_8000[] = {
|
||||
/* 2.4 GHz */
|
||||
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
|
||||
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
|
||||
/* 5 GHz */
|
||||
36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80, 84, 88, 92,
|
||||
96, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 144,
|
||||
|
@ -138,7 +138,7 @@ static const u8 iwl_nvm_channels_family_8000[] = {
|
|||
#define IWL_NUM_CHANNELS ARRAY_SIZE(iwl_nvm_channels)
|
||||
#define IWL_NUM_CHANNELS_FAMILY_8000 ARRAY_SIZE(iwl_nvm_channels_family_8000)
|
||||
#define NUM_2GHZ_CHANNELS 14
|
||||
#define NUM_2GHZ_CHANNELS_FAMILY_8000 13
|
||||
#define NUM_2GHZ_CHANNELS_FAMILY_8000 14
|
||||
#define FIRST_2GHZ_HT_MINUS 5
|
||||
#define LAST_2GHZ_HT_PLUS 9
|
||||
#define LAST_5GHZ_HT 161
|
||||
|
|
|
@ -345,7 +345,6 @@ static int iwl_send_phy_db_cmd(struct iwl_phy_db *phy_db, u16 type,
|
|||
struct iwl_phy_db_cmd phy_db_cmd;
|
||||
struct iwl_host_cmd cmd = {
|
||||
.id = PHY_DB_CMD,
|
||||
.flags = CMD_SYNC,
|
||||
};
|
||||
|
||||
IWL_DEBUG_INFO(phy_db->trans,
|
||||
|
@ -393,13 +392,13 @@ static int iwl_phy_db_send_all_channel_groups(
|
|||
entry->data);
|
||||
if (err) {
|
||||
IWL_ERR(phy_db->trans,
|
||||
"Can't SEND phy_db section %d (%d), err %d",
|
||||
"Can't SEND phy_db section %d (%d), err %d\n",
|
||||
type, i, err);
|
||||
return err;
|
||||
}
|
||||
|
||||
IWL_DEBUG_INFO(phy_db->trans,
|
||||
"Sent PHY_DB HCMD, type = %d num = %d",
|
||||
"Sent PHY_DB HCMD, type = %d num = %d\n",
|
||||
type, i);
|
||||
}
|
||||
|
||||
|
@ -451,7 +450,7 @@ int iwl_send_phy_db_data(struct iwl_phy_db *phy_db)
|
|||
IWL_NUM_PAPD_CH_GROUPS);
|
||||
if (err) {
|
||||
IWL_ERR(phy_db->trans,
|
||||
"Cannot send channel specific PAPD groups");
|
||||
"Cannot send channel specific PAPD groups\n");
|
||||
return err;
|
||||
}
|
||||
|
||||
|
@ -461,7 +460,7 @@ int iwl_send_phy_db_data(struct iwl_phy_db *phy_db)
|
|||
IWL_NUM_TXP_CH_GROUPS);
|
||||
if (err) {
|
||||
IWL_ERR(phy_db->trans,
|
||||
"Cannot send channel specific TX power groups");
|
||||
"Cannot send channel specific TX power groups\n");
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
@ -105,6 +105,9 @@
|
|||
|
||||
/* Device NMI register */
|
||||
#define DEVICE_SET_NMI_REG 0x00a01c30
|
||||
#define DEVICE_SET_NMI_VAL 0x1
|
||||
#define DEVICE_SET_NMI_8000B_REG 0x00a01c24
|
||||
#define DEVICE_SET_NMI_8000B_VAL 0x1000000
|
||||
|
||||
/* Shared registers (0x0..0x3ff, via target indirect or periphery */
|
||||
#define SHR_BASE 0x00a10000
|
||||
|
|
|
@ -189,10 +189,9 @@ static inline u32 iwl_rx_packet_payload_len(const struct iwl_rx_packet *pkt)
|
|||
/**
|
||||
* enum CMD_MODE - how to send the host commands ?
|
||||
*
|
||||
* @CMD_SYNC: The caller will be stalled until the fw responds to the command
|
||||
* @CMD_ASYNC: Return right away and don't wait for the response
|
||||
* @CMD_WANT_SKB: valid only with CMD_SYNC. The caller needs the buffer of the
|
||||
* response. The caller needs to call iwl_free_resp when done.
|
||||
* @CMD_WANT_SKB: Not valid with CMD_ASYNC. The caller needs the buffer of
|
||||
* the response. The caller needs to call iwl_free_resp when done.
|
||||
* @CMD_HIGH_PRIO: The command is high priority - it goes to the front of the
|
||||
* command queue, but after other high priority commands. valid only
|
||||
* with CMD_ASYNC.
|
||||
|
@ -202,7 +201,6 @@ static inline u32 iwl_rx_packet_payload_len(const struct iwl_rx_packet *pkt)
|
|||
* (i.e. mark it as non-idle).
|
||||
*/
|
||||
enum CMD_MODE {
|
||||
CMD_SYNC = 0,
|
||||
CMD_ASYNC = BIT(0),
|
||||
CMD_WANT_SKB = BIT(1),
|
||||
CMD_SEND_IN_RFKILL = BIT(2),
|
||||
|
@ -427,7 +425,7 @@ struct iwl_trans;
|
|||
* @send_cmd:send a host command. Must return -ERFKILL if RFkill is asserted.
|
||||
* If RFkill is asserted in the middle of a SYNC host command, it must
|
||||
* return -ERFKILL straight away.
|
||||
* May sleep only if CMD_SYNC is set
|
||||
* May sleep only if CMD_ASYNC is not set
|
||||
* @tx: send an skb
|
||||
* Must be atomic
|
||||
* @reclaim: free packet until ssn. Returns a list of freed packets.
|
||||
|
@ -475,6 +473,8 @@ struct iwl_trans_ops {
|
|||
void (*op_mode_leave)(struct iwl_trans *iwl_trans);
|
||||
int (*start_fw)(struct iwl_trans *trans, const struct fw_img *fw,
|
||||
bool run_in_rfkill);
|
||||
int (*update_sf)(struct iwl_trans *trans,
|
||||
struct iwl_sf_region *st_fwrd_space);
|
||||
void (*fw_alive)(struct iwl_trans *trans, u32 scd_addr);
|
||||
void (*stop_device)(struct iwl_trans *trans);
|
||||
|
||||
|
@ -638,6 +638,17 @@ static inline int iwl_trans_start_fw(struct iwl_trans *trans,
|
|||
return trans->ops->start_fw(trans, fw, run_in_rfkill);
|
||||
}
|
||||
|
||||
static inline int iwl_trans_update_sf(struct iwl_trans *trans,
|
||||
struct iwl_sf_region *st_fwrd_space)
|
||||
{
|
||||
might_sleep();
|
||||
|
||||
if (trans->ops->update_sf)
|
||||
return trans->ops->update_sf(trans, st_fwrd_space);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void iwl_trans_stop_device(struct iwl_trans *trans)
|
||||
{
|
||||
might_sleep();
|
||||
|
@ -696,7 +707,7 @@ static inline int iwl_trans_send_cmd(struct iwl_trans *trans,
|
|||
return -EIO;
|
||||
|
||||
if (unlikely(trans->state != IWL_TRANS_FW_ALIVE)) {
|
||||
IWL_ERR(trans, "%s bad state = %d", __func__, trans->state);
|
||||
IWL_ERR(trans, "%s bad state = %d\n", __func__, trans->state);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
|
@ -738,7 +749,7 @@ static inline int iwl_trans_tx(struct iwl_trans *trans, struct sk_buff *skb,
|
|||
return -EIO;
|
||||
|
||||
if (unlikely(trans->state != IWL_TRANS_FW_ALIVE))
|
||||
IWL_ERR(trans, "%s bad state = %d", __func__, trans->state);
|
||||
IWL_ERR(trans, "%s bad state = %d\n", __func__, trans->state);
|
||||
|
||||
return trans->ops->tx(trans, skb, dev_cmd, queue);
|
||||
}
|
||||
|
@ -747,7 +758,7 @@ static inline void iwl_trans_reclaim(struct iwl_trans *trans, int queue,
|
|||
int ssn, struct sk_buff_head *skbs)
|
||||
{
|
||||
if (unlikely(trans->state != IWL_TRANS_FW_ALIVE))
|
||||
IWL_ERR(trans, "%s bad state = %d", __func__, trans->state);
|
||||
IWL_ERR(trans, "%s bad state = %d\n", __func__, trans->state);
|
||||
|
||||
trans->ops->reclaim(trans, queue, ssn, skbs);
|
||||
}
|
||||
|
@ -764,7 +775,7 @@ static inline void iwl_trans_txq_enable(struct iwl_trans *trans, int queue,
|
|||
might_sleep();
|
||||
|
||||
if (unlikely((trans->state != IWL_TRANS_FW_ALIVE)))
|
||||
IWL_ERR(trans, "%s bad state = %d", __func__, trans->state);
|
||||
IWL_ERR(trans, "%s bad state = %d\n", __func__, trans->state);
|
||||
|
||||
trans->ops->txq_enable(trans, queue, fifo, sta_id, tid,
|
||||
frame_limit, ssn);
|
||||
|
@ -781,7 +792,7 @@ static inline int iwl_trans_wait_tx_queue_empty(struct iwl_trans *trans,
|
|||
u32 txq_bm)
|
||||
{
|
||||
if (unlikely(trans->state != IWL_TRANS_FW_ALIVE))
|
||||
IWL_ERR(trans, "%s bad state = %d", __func__, trans->state);
|
||||
IWL_ERR(trans, "%s bad state = %d\n", __func__, trans->state);
|
||||
|
||||
return trans->ops->wait_tx_queue_empty(trans, txq_bm);
|
||||
}
|
||||
|
|
|
@ -106,7 +106,7 @@ static const u8 iwl_bt_prio_tbl[BT_COEX_PRIO_TBL_EVT_MAX] = {
|
|||
|
||||
static int iwl_send_bt_prio_tbl(struct iwl_mvm *mvm)
|
||||
{
|
||||
return iwl_mvm_send_cmd_pdu(mvm, BT_COEX_PRIO_TABLE, CMD_SYNC,
|
||||
return iwl_mvm_send_cmd_pdu(mvm, BT_COEX_PRIO_TABLE, 0,
|
||||
sizeof(struct iwl_bt_coex_prio_tbl_cmd),
|
||||
&iwl_bt_prio_tbl);
|
||||
}
|
||||
|
@ -124,10 +124,10 @@ const u32 iwl_bt_cts_kill_msk[BT_KILL_MSK_MAX] = {
|
|||
};
|
||||
|
||||
static const __le32 iwl_bt_prio_boost[BT_COEX_BOOST_SIZE] = {
|
||||
cpu_to_le32(0xf0f0f0f0),
|
||||
cpu_to_le32(0xc0c0c0c0),
|
||||
cpu_to_le32(0xfcfcfcfc),
|
||||
cpu_to_le32(0xff00ff00),
|
||||
cpu_to_le32(0xf0f0f0f0), /* 50% */
|
||||
cpu_to_le32(0xc0c0c0c0), /* 25% */
|
||||
cpu_to_le32(0xfcfcfcfc), /* 75% */
|
||||
cpu_to_le32(0xfefefefe), /* 87.5% */
|
||||
};
|
||||
|
||||
static const __le32 iwl_single_shared_ant[BT_COEX_MAX_LUT][BT_COEX_LUT_SIZE] = {
|
||||
|
@ -300,8 +300,8 @@ static const __le64 iwl_ci_mask[][3] = {
|
|||
};
|
||||
|
||||
static const __le32 iwl_bt_mprio_lut[BT_COEX_MULTI_PRIO_LUT_SIZE] = {
|
||||
cpu_to_le32(0x22002200),
|
||||
cpu_to_le32(0x33113311),
|
||||
cpu_to_le32(0x28412201),
|
||||
cpu_to_le32(0x11118451),
|
||||
};
|
||||
|
||||
struct corunning_block_luts {
|
||||
|
@ -565,7 +565,6 @@ int iwl_send_bt_init_conf(struct iwl_mvm *mvm)
|
|||
.id = BT_CONFIG,
|
||||
.len = { sizeof(*bt_cmd), },
|
||||
.dataflags = { IWL_HCMD_DFL_NOCOPY, },
|
||||
.flags = CMD_SYNC,
|
||||
};
|
||||
int ret;
|
||||
u32 flags;
|
||||
|
@ -663,7 +662,6 @@ static int iwl_mvm_bt_udpate_ctrl_kill_msk(struct iwl_mvm *mvm,
|
|||
.data[0] = &bt_cmd,
|
||||
.len = { sizeof(*bt_cmd), },
|
||||
.dataflags = { IWL_HCMD_DFL_NOCOPY, },
|
||||
.flags = CMD_SYNC,
|
||||
};
|
||||
int ret = 0;
|
||||
|
||||
|
@ -803,23 +801,10 @@ static void iwl_mvm_bt_notif_iterator(void *_data, u8 *mac,
|
|||
|
||||
switch (vif->type) {
|
||||
case NL80211_IFTYPE_STATION:
|
||||
/* Count BSSes vifs */
|
||||
data->num_bss_ifaces++;
|
||||
/* default smps_mode for BSS / P2P client is AUTOMATIC */
|
||||
smps_mode = IEEE80211_SMPS_AUTOMATIC;
|
||||
data->num_bss_ifaces++;
|
||||
|
||||
/*
|
||||
* Count unassoc BSSes, relax SMSP constraints
|
||||
* and disable reduced Tx Power
|
||||
*/
|
||||
if (!vif->bss_conf.assoc) {
|
||||
iwl_mvm_update_smps(mvm, vif, IWL_MVM_SMPS_REQ_BT_COEX,
|
||||
smps_mode);
|
||||
if (iwl_mvm_bt_coex_reduced_txp(mvm,
|
||||
mvmvif->ap_sta_id,
|
||||
false))
|
||||
IWL_ERR(mvm, "Couldn't send BT_CONFIG cmd\n");
|
||||
return;
|
||||
}
|
||||
break;
|
||||
case NL80211_IFTYPE_AP:
|
||||
/* default smps_mode for AP / GO is OFF */
|
||||
|
@ -845,6 +830,7 @@ static void iwl_mvm_bt_notif_iterator(void *_data, u8 *mac,
|
|||
/* ... relax constraints and disable rssi events */
|
||||
iwl_mvm_update_smps(mvm, vif, IWL_MVM_SMPS_REQ_BT_COEX,
|
||||
smps_mode);
|
||||
data->reduced_tx_power = false;
|
||||
if (vif->type == NL80211_IFTYPE_STATION)
|
||||
iwl_mvm_bt_coex_enable_rssi_event(mvm, vif, false, 0);
|
||||
return;
|
||||
|
@ -857,6 +843,11 @@ static void iwl_mvm_bt_notif_iterator(void *_data, u8 *mac,
|
|||
smps_mode = vif->type == NL80211_IFTYPE_AP ?
|
||||
IEEE80211_SMPS_OFF :
|
||||
IEEE80211_SMPS_DYNAMIC;
|
||||
|
||||
/* relax SMPS contraints for next association */
|
||||
if (!vif->bss_conf.assoc)
|
||||
smps_mode = IEEE80211_SMPS_AUTOMATIC;
|
||||
|
||||
IWL_DEBUG_COEX(data->mvm,
|
||||
"mac %d: bt_status %d bt_activity_grading %d smps_req %d\n",
|
||||
mvmvif->id, data->notif->bt_status, bt_activity_grading,
|
||||
|
@ -903,26 +894,21 @@ static void iwl_mvm_bt_notif_iterator(void *_data, u8 *mac,
|
|||
/* if secondary is not NULL, it might be a GO */
|
||||
data->secondary = chanctx_conf;
|
||||
|
||||
/* don't reduce the Tx power if in loose scheme */
|
||||
/*
|
||||
* don't reduce the Tx power if one of these is true:
|
||||
* we are in LOOSE
|
||||
* single share antenna product
|
||||
* BT is active
|
||||
* we are associated
|
||||
*/
|
||||
if (iwl_get_coex_type(mvm, vif) == BT_COEX_LOOSE_LUT ||
|
||||
mvm->cfg->bt_shared_single_ant) {
|
||||
mvm->cfg->bt_shared_single_ant || !vif->bss_conf.assoc ||
|
||||
!data->notif->bt_status) {
|
||||
data->reduced_tx_power = false;
|
||||
iwl_mvm_bt_coex_enable_rssi_event(mvm, vif, false, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
/* reduced Txpower only if BT is on, so ...*/
|
||||
if (!data->notif->bt_status) {
|
||||
/* ... cancel reduced Tx power ... */
|
||||
if (iwl_mvm_bt_coex_reduced_txp(mvm, mvmvif->ap_sta_id, false))
|
||||
IWL_ERR(mvm, "Couldn't send BT_CONFIG cmd\n");
|
||||
data->reduced_tx_power = false;
|
||||
|
||||
/* ... and there is no need to get reports on RSSI any more. */
|
||||
iwl_mvm_bt_coex_enable_rssi_event(mvm, vif, false, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
/* try to get the avg rssi from fw */
|
||||
ave_rssi = mvmvif->bf_data.ave_beacon_signal;
|
||||
|
||||
|
@ -1022,9 +1008,9 @@ static void iwl_mvm_bt_coex_notif_handle(struct iwl_mvm *mvm)
|
|||
|
||||
/* Don't spam the fw with the same command over and over */
|
||||
if (memcmp(&cmd, &mvm->last_bt_ci_cmd, sizeof(cmd))) {
|
||||
if (iwl_mvm_send_cmd_pdu(mvm, BT_COEX_CI, CMD_SYNC,
|
||||
if (iwl_mvm_send_cmd_pdu(mvm, BT_COEX_CI, 0,
|
||||
sizeof(cmd), &cmd))
|
||||
IWL_ERR(mvm, "Failed to send BT_CI cmd");
|
||||
IWL_ERR(mvm, "Failed to send BT_CI cmd\n");
|
||||
memcpy(&mvm->last_bt_ci_cmd, &cmd, sizeof(cmd));
|
||||
}
|
||||
|
||||
|
@ -1039,7 +1025,6 @@ static void iwl_mvm_bt_coex_notif_handle(struct iwl_mvm *mvm)
|
|||
IWL_ERR(mvm, "Failed to update the ctrl_kill_msk\n");
|
||||
}
|
||||
|
||||
/* upon association, the fw will send in BT Coex notification */
|
||||
int iwl_mvm_rx_bt_coex_notif(struct iwl_mvm *mvm,
|
||||
struct iwl_rx_cmd_buffer *rxb,
|
||||
struct iwl_device_cmd *dev_cmd)
|
||||
|
@ -1278,7 +1263,6 @@ int iwl_mvm_rx_ant_coupling_notif(struct iwl_mvm *mvm,
|
|||
.id = BT_CONFIG,
|
||||
.len = { sizeof(*bt_cmd), },
|
||||
.dataflags = { IWL_HCMD_DFL_NOCOPY, },
|
||||
.flags = CMD_SYNC,
|
||||
};
|
||||
|
||||
if (!IWL_MVM_BT_COEX_CORUNNING)
|
||||
|
|
|
@ -193,8 +193,7 @@ static void iwl_mvm_wowlan_program_keys(struct ieee80211_hw *hw,
|
|||
wkc.wep_key.key_offset = data->wep_key_idx;
|
||||
}
|
||||
|
||||
ret = iwl_mvm_send_cmd_pdu(mvm, WEP_KEY, CMD_SYNC,
|
||||
sizeof(wkc), &wkc);
|
||||
ret = iwl_mvm_send_cmd_pdu(mvm, WEP_KEY, 0, sizeof(wkc), &wkc);
|
||||
data->error = ret != 0;
|
||||
|
||||
mvm->ptk_ivlen = key->iv_len;
|
||||
|
@ -341,7 +340,6 @@ static int iwl_mvm_send_patterns(struct iwl_mvm *mvm,
|
|||
struct iwl_host_cmd cmd = {
|
||||
.id = WOWLAN_PATTERNS,
|
||||
.dataflags[0] = IWL_HCMD_DFL_NOCOPY,
|
||||
.flags = CMD_SYNC,
|
||||
};
|
||||
int i, err;
|
||||
|
||||
|
@ -518,7 +516,6 @@ static int iwl_mvm_send_remote_wake_cfg(struct iwl_mvm *mvm,
|
|||
.id = REMOTE_WAKE_CONFIG_CMD,
|
||||
.len = { sizeof(*cfg), },
|
||||
.dataflags = { IWL_HCMD_DFL_NOCOPY, },
|
||||
.flags = CMD_SYNC,
|
||||
};
|
||||
int ret;
|
||||
|
||||
|
@ -719,7 +716,7 @@ static int iwl_mvm_d3_reprogram(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
|||
for (i = 1; i < MAX_BINDINGS; i++)
|
||||
quota_cmd.quotas[i].id_and_color = cpu_to_le32(FW_CTXT_INVALID);
|
||||
|
||||
ret = iwl_mvm_send_cmd_pdu(mvm, TIME_QUOTA_CMD, CMD_SYNC,
|
||||
ret = iwl_mvm_send_cmd_pdu(mvm, TIME_QUOTA_CMD, 0,
|
||||
sizeof(quota_cmd), "a_cmd);
|
||||
if (ret)
|
||||
IWL_ERR(mvm, "Failed to send quota: %d\n", ret);
|
||||
|
@ -739,7 +736,7 @@ static int iwl_mvm_get_last_nonqos_seq(struct iwl_mvm *mvm,
|
|||
};
|
||||
struct iwl_host_cmd cmd = {
|
||||
.id = NON_QOS_TX_COUNTER_CMD,
|
||||
.flags = CMD_SYNC | CMD_WANT_SKB,
|
||||
.flags = CMD_WANT_SKB,
|
||||
};
|
||||
int err;
|
||||
u32 size;
|
||||
|
@ -781,7 +778,7 @@ void iwl_mvm_set_last_nonqos_seq(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
|
|||
|
||||
mvmvif->seqno_valid = false;
|
||||
|
||||
if (iwl_mvm_send_cmd_pdu(mvm, NON_QOS_TX_COUNTER_CMD, CMD_SYNC,
|
||||
if (iwl_mvm_send_cmd_pdu(mvm, NON_QOS_TX_COUNTER_CMD, 0,
|
||||
sizeof(query_cmd), &query_cmd))
|
||||
IWL_ERR(mvm, "failed to set non-QoS seqno\n");
|
||||
}
|
||||
|
@ -796,7 +793,7 @@ iwl_mvm_send_wowlan_config_cmd(struct iwl_mvm *mvm,
|
|||
if (mvm->fw->ucode_capa.api[0] & IWL_UCODE_TLV_API_WOWLAN_CONFIG_TID)
|
||||
cmd_len = sizeof(*cmd);
|
||||
|
||||
return iwl_mvm_send_cmd_pdu(mvm, WOWLAN_CONFIGURATION, CMD_SYNC,
|
||||
return iwl_mvm_send_cmd_pdu(mvm, WOWLAN_CONFIGURATION, 0,
|
||||
cmd_len, cmd);
|
||||
}
|
||||
|
||||
|
@ -825,7 +822,7 @@ static int __iwl_mvm_suspend(struct ieee80211_hw *hw,
|
|||
};
|
||||
struct iwl_host_cmd d3_cfg_cmd = {
|
||||
.id = D3_CONFIG_CMD,
|
||||
.flags = CMD_SYNC | CMD_WANT_SKB,
|
||||
.flags = CMD_WANT_SKB,
|
||||
.data[0] = &d3_cfg_cmd_data,
|
||||
.len[0] = sizeof(d3_cfg_cmd_data),
|
||||
};
|
||||
|
@ -975,7 +972,6 @@ static int __iwl_mvm_suspend(struct ieee80211_hw *hw,
|
|||
if (key_data.use_rsc_tsc) {
|
||||
struct iwl_host_cmd rsc_tsc_cmd = {
|
||||
.id = WOWLAN_TSC_RSC_PARAM,
|
||||
.flags = CMD_SYNC,
|
||||
.data[0] = key_data.rsc_tsc,
|
||||
.dataflags[0] = IWL_HCMD_DFL_NOCOPY,
|
||||
.len[0] = sizeof(*key_data.rsc_tsc),
|
||||
|
@ -989,7 +985,7 @@ static int __iwl_mvm_suspend(struct ieee80211_hw *hw,
|
|||
if (key_data.use_tkip) {
|
||||
ret = iwl_mvm_send_cmd_pdu(mvm,
|
||||
WOWLAN_TKIP_PARAM,
|
||||
CMD_SYNC, sizeof(tkip_cmd),
|
||||
0, sizeof(tkip_cmd),
|
||||
&tkip_cmd);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
@ -1006,8 +1002,7 @@ static int __iwl_mvm_suspend(struct ieee80211_hw *hw,
|
|||
kek_kck_cmd.replay_ctr = mvmvif->rekey_data.replay_ctr;
|
||||
|
||||
ret = iwl_mvm_send_cmd_pdu(mvm,
|
||||
WOWLAN_KEK_KCK_MATERIAL,
|
||||
CMD_SYNC,
|
||||
WOWLAN_KEK_KCK_MATERIAL, 0,
|
||||
sizeof(kek_kck_cmd),
|
||||
&kek_kck_cmd);
|
||||
if (ret)
|
||||
|
@ -1023,7 +1018,7 @@ static int __iwl_mvm_suspend(struct ieee80211_hw *hw,
|
|||
if (ret)
|
||||
goto out;
|
||||
|
||||
ret = iwl_mvm_send_proto_offload(mvm, vif, false, CMD_SYNC);
|
||||
ret = iwl_mvm_send_proto_offload(mvm, vif, false, 0);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
|
@ -1466,7 +1461,7 @@ static bool iwl_mvm_query_wakeup_reasons(struct iwl_mvm *mvm,
|
|||
} err_info;
|
||||
struct iwl_host_cmd cmd = {
|
||||
.id = WOWLAN_GET_STATUSES,
|
||||
.flags = CMD_SYNC | CMD_WANT_SKB,
|
||||
.flags = CMD_WANT_SKB,
|
||||
};
|
||||
struct iwl_wowlan_status_data status;
|
||||
struct iwl_wowlan_status *fw_status;
|
||||
|
@ -1492,7 +1487,7 @@ static bool iwl_mvm_query_wakeup_reasons(struct iwl_mvm *mvm,
|
|||
}
|
||||
|
||||
/* only for tracing for now */
|
||||
ret = iwl_mvm_send_cmd_pdu(mvm, OFFLOADS_QUERY_CMD, CMD_SYNC, 0, NULL);
|
||||
ret = iwl_mvm_send_cmd_pdu(mvm, OFFLOADS_QUERY_CMD, 0, 0, NULL);
|
||||
if (ret)
|
||||
IWL_ERR(mvm, "failed to query offload statistics (%d)\n", ret);
|
||||
|
||||
|
|
|
@ -452,9 +452,9 @@ static ssize_t iwl_dbgfs_bf_params_write(struct ieee80211_vif *vif, char *buf,
|
|||
mutex_lock(&mvm->mutex);
|
||||
iwl_dbgfs_update_bf(vif, param, value);
|
||||
if (param == MVM_DEBUGFS_BF_ENABLE_BEACON_FILTER && !value)
|
||||
ret = iwl_mvm_disable_beacon_filter(mvm, vif, CMD_SYNC);
|
||||
ret = iwl_mvm_disable_beacon_filter(mvm, vif, 0);
|
||||
else
|
||||
ret = iwl_mvm_enable_beacon_filter(mvm, vif, CMD_SYNC);
|
||||
ret = iwl_mvm_enable_beacon_filter(mvm, vif, 0);
|
||||
mutex_unlock(&mvm->mutex);
|
||||
|
||||
return ret ?: count;
|
||||
|
|
|
@ -65,7 +65,6 @@
|
|||
#include "mvm.h"
|
||||
#include "sta.h"
|
||||
#include "iwl-io.h"
|
||||
#include "iwl-prph.h"
|
||||
#include "debugfs.h"
|
||||
#include "iwl-fw-error-dump.h"
|
||||
|
||||
|
@ -681,7 +680,7 @@ static ssize_t iwl_dbgfs_fw_restart_write(struct iwl_mvm *mvm, char *buf,
|
|||
mvm->restart_fw++;
|
||||
|
||||
/* take the return value to make compiler happy - it will fail anyway */
|
||||
ret = iwl_mvm_send_cmd_pdu(mvm, REPLY_ERROR, CMD_SYNC, 0, NULL);
|
||||
ret = iwl_mvm_send_cmd_pdu(mvm, REPLY_ERROR, 0, 0, NULL);
|
||||
|
||||
mutex_unlock(&mvm->mutex);
|
||||
|
||||
|
@ -691,7 +690,7 @@ static ssize_t iwl_dbgfs_fw_restart_write(struct iwl_mvm *mvm, char *buf,
|
|||
static ssize_t iwl_dbgfs_fw_nmi_write(struct iwl_mvm *mvm, char *buf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
iwl_write_prph(mvm->trans, DEVICE_SET_NMI_REG, 1);
|
||||
iwl_force_nmi(mvm->trans);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
@ -838,7 +837,7 @@ static ssize_t iwl_dbgfs_bcast_filters_write(struct iwl_mvm *mvm, char *buf,
|
|||
/* send updated bcast filtering configuration */
|
||||
if (mvm->dbgfs_bcast_filtering.override &&
|
||||
iwl_mvm_bcast_filter_build_cmd(mvm, &cmd))
|
||||
err = iwl_mvm_send_cmd_pdu(mvm, BCAST_FILTER_CMD, CMD_SYNC,
|
||||
err = iwl_mvm_send_cmd_pdu(mvm, BCAST_FILTER_CMD, 0,
|
||||
sizeof(cmd), &cmd);
|
||||
mutex_unlock(&mvm->mutex);
|
||||
|
||||
|
@ -910,7 +909,7 @@ static ssize_t iwl_dbgfs_bcast_filters_macs_write(struct iwl_mvm *mvm,
|
|||
/* send updated bcast filtering configuration */
|
||||
if (mvm->dbgfs_bcast_filtering.override &&
|
||||
iwl_mvm_bcast_filter_build_cmd(mvm, &cmd))
|
||||
err = iwl_mvm_send_cmd_pdu(mvm, BCAST_FILTER_CMD, CMD_SYNC,
|
||||
err = iwl_mvm_send_cmd_pdu(mvm, BCAST_FILTER_CMD, 0,
|
||||
sizeof(cmd), &cmd);
|
||||
mutex_unlock(&mvm->mutex);
|
||||
|
||||
|
|
|
@ -99,7 +99,7 @@ static int iwl_send_tx_ant_cfg(struct iwl_mvm *mvm, u8 valid_tx_ant)
|
|||
};
|
||||
|
||||
IWL_DEBUG_FW(mvm, "select valid tx ant: %u\n", valid_tx_ant);
|
||||
return iwl_mvm_send_cmd_pdu(mvm, TX_ANT_CONFIGURATION_CMD, CMD_SYNC,
|
||||
return iwl_mvm_send_cmd_pdu(mvm, TX_ANT_CONFIGURATION_CMD, 0,
|
||||
sizeof(tx_ant_cmd), &tx_ant_cmd);
|
||||
}
|
||||
|
||||
|
@ -137,6 +137,8 @@ static bool iwl_alive_fn(struct iwl_notif_wait_data *notif_wait,
|
|||
alive_data->scd_base_addr = le32_to_cpu(palive2->scd_base_ptr);
|
||||
mvm->umac_error_event_table =
|
||||
le32_to_cpu(palive2->error_info_addr);
|
||||
mvm->sf_space.addr = le32_to_cpu(palive2->st_fwrd_addr);
|
||||
mvm->sf_space.size = le32_to_cpu(palive2->st_fwrd_size);
|
||||
|
||||
alive_data->valid = le16_to_cpu(palive2->status) ==
|
||||
IWL_ALIVE_STATUS_OK;
|
||||
|
@ -180,6 +182,7 @@ static int iwl_mvm_load_ucode_wait_alive(struct iwl_mvm *mvm,
|
|||
int ret, i;
|
||||
enum iwl_ucode_type old_type = mvm->cur_ucode;
|
||||
static const u8 alive_cmd[] = { MVM_ALIVE };
|
||||
struct iwl_sf_region st_fwrd_space;
|
||||
|
||||
fw = iwl_get_ucode_image(mvm, ucode_type);
|
||||
if (WARN_ON(!fw))
|
||||
|
@ -215,6 +218,14 @@ static int iwl_mvm_load_ucode_wait_alive(struct iwl_mvm *mvm,
|
|||
return -EIO;
|
||||
}
|
||||
|
||||
/*
|
||||
* update the sdio allocation according to the pointer we get in the
|
||||
* alive notification.
|
||||
*/
|
||||
st_fwrd_space.addr = mvm->sf_space.addr;
|
||||
st_fwrd_space.size = mvm->sf_space.size;
|
||||
ret = iwl_trans_update_sf(mvm->trans, &st_fwrd_space);
|
||||
|
||||
iwl_trans_fw_alive(mvm->trans, alive_data.scd_base_addr);
|
||||
|
||||
/*
|
||||
|
@ -256,7 +267,7 @@ static int iwl_send_phy_cfg_cmd(struct iwl_mvm *mvm)
|
|||
IWL_DEBUG_INFO(mvm, "Sending Phy CFG command: 0x%x\n",
|
||||
phy_cfg_cmd.phy_cfg);
|
||||
|
||||
return iwl_mvm_send_cmd_pdu(mvm, PHY_CONFIGURATION_CMD, CMD_SYNC,
|
||||
return iwl_mvm_send_cmd_pdu(mvm, PHY_CONFIGURATION_CMD, 0,
|
||||
sizeof(phy_cfg_cmd), &phy_cfg_cmd);
|
||||
}
|
||||
|
||||
|
@ -303,7 +314,7 @@ int iwl_run_init_mvm_ucode(struct iwl_mvm *mvm, bool read_nvm)
|
|||
}
|
||||
|
||||
/* In case we read the NVM from external file, load it to the NIC */
|
||||
if (iwlwifi_mod_params.nvm_file)
|
||||
if (mvm->nvm_file_name)
|
||||
iwl_mvm_load_nvm_to_nic(mvm);
|
||||
|
||||
ret = iwl_nvm_check_version(mvm->nvm_data, mvm->trans);
|
||||
|
|
|
@ -685,7 +685,7 @@ static void iwl_mvm_mac_ctxt_cmd_common(struct iwl_mvm *mvm,
|
|||
static int iwl_mvm_mac_ctxt_send_cmd(struct iwl_mvm *mvm,
|
||||
struct iwl_mac_ctx_cmd *cmd)
|
||||
{
|
||||
int ret = iwl_mvm_send_cmd_pdu(mvm, MAC_CONTEXT_CMD, CMD_SYNC,
|
||||
int ret = iwl_mvm_send_cmd_pdu(mvm, MAC_CONTEXT_CMD, 0,
|
||||
sizeof(*cmd), cmd);
|
||||
if (ret)
|
||||
IWL_ERR(mvm, "Failed to send MAC context (action:%d): %d\n",
|
||||
|
@ -693,14 +693,37 @@ static int iwl_mvm_mac_ctxt_send_cmd(struct iwl_mvm *mvm,
|
|||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
* Fill the specific data for mac context of type station or p2p client
|
||||
*/
|
||||
static void iwl_mvm_mac_ctxt_cmd_fill_sta(struct iwl_mvm *mvm,
|
||||
struct ieee80211_vif *vif,
|
||||
struct iwl_mac_data_sta *ctxt_sta,
|
||||
bool force_assoc_off)
|
||||
static int iwl_mvm_mac_ctxt_cmd_sta(struct iwl_mvm *mvm,
|
||||
struct ieee80211_vif *vif,
|
||||
u32 action, bool force_assoc_off)
|
||||
{
|
||||
struct iwl_mac_ctx_cmd cmd = {};
|
||||
struct iwl_mac_data_sta *ctxt_sta;
|
||||
|
||||
WARN_ON(vif->type != NL80211_IFTYPE_STATION);
|
||||
|
||||
/* Fill the common data for all mac context types */
|
||||
iwl_mvm_mac_ctxt_cmd_common(mvm, vif, &cmd, action);
|
||||
|
||||
if (vif->p2p) {
|
||||
struct ieee80211_p2p_noa_attr *noa =
|
||||
&vif->bss_conf.p2p_noa_attr;
|
||||
|
||||
cmd.p2p_sta.ctwin = cpu_to_le32(noa->oppps_ctwindow &
|
||||
IEEE80211_P2P_OPPPS_CTWINDOW_MASK);
|
||||
ctxt_sta = &cmd.p2p_sta.sta;
|
||||
} else {
|
||||
/* Allow beacons to pass through as long as we are not
|
||||
* associated, or we do not have dtim period information.
|
||||
*/
|
||||
if (!vif->bss_conf.assoc || !vif->bss_conf.dtim_period)
|
||||
cmd.filter_flags |= cpu_to_le32(MAC_FILTER_IN_BEACON);
|
||||
else
|
||||
cmd.filter_flags &= ~cpu_to_le32(MAC_FILTER_IN_BEACON);
|
||||
|
||||
ctxt_sta = &cmd.sta;
|
||||
}
|
||||
|
||||
/* We need the dtim_period to set the MAC as associated */
|
||||
if (vif->bss_conf.assoc && vif->bss_conf.dtim_period &&
|
||||
!force_assoc_off) {
|
||||
|
@ -752,51 +775,6 @@ static void iwl_mvm_mac_ctxt_cmd_fill_sta(struct iwl_mvm *mvm,
|
|||
|
||||
ctxt_sta->listen_interval = cpu_to_le32(mvm->hw->conf.listen_interval);
|
||||
ctxt_sta->assoc_id = cpu_to_le32(vif->bss_conf.aid);
|
||||
}
|
||||
|
||||
static int iwl_mvm_mac_ctxt_cmd_station(struct iwl_mvm *mvm,
|
||||
struct ieee80211_vif *vif,
|
||||
u32 action)
|
||||
{
|
||||
struct iwl_mac_ctx_cmd cmd = {};
|
||||
|
||||
WARN_ON(vif->type != NL80211_IFTYPE_STATION || vif->p2p);
|
||||
|
||||
/* Fill the common data for all mac context types */
|
||||
iwl_mvm_mac_ctxt_cmd_common(mvm, vif, &cmd, action);
|
||||
|
||||
/* Allow beacons to pass through as long as we are not associated,or we
|
||||
* do not have dtim period information */
|
||||
if (!vif->bss_conf.assoc || !vif->bss_conf.dtim_period)
|
||||
cmd.filter_flags |= cpu_to_le32(MAC_FILTER_IN_BEACON);
|
||||
else
|
||||
cmd.filter_flags &= ~cpu_to_le32(MAC_FILTER_IN_BEACON);
|
||||
|
||||
/* Fill the data specific for station mode */
|
||||
iwl_mvm_mac_ctxt_cmd_fill_sta(mvm, vif, &cmd.sta,
|
||||
action == FW_CTXT_ACTION_ADD);
|
||||
|
||||
return iwl_mvm_mac_ctxt_send_cmd(mvm, &cmd);
|
||||
}
|
||||
|
||||
static int iwl_mvm_mac_ctxt_cmd_p2p_client(struct iwl_mvm *mvm,
|
||||
struct ieee80211_vif *vif,
|
||||
u32 action)
|
||||
{
|
||||
struct iwl_mac_ctx_cmd cmd = {};
|
||||
struct ieee80211_p2p_noa_attr *noa = &vif->bss_conf.p2p_noa_attr;
|
||||
|
||||
WARN_ON(vif->type != NL80211_IFTYPE_STATION || !vif->p2p);
|
||||
|
||||
/* Fill the common data for all mac context types */
|
||||
iwl_mvm_mac_ctxt_cmd_common(mvm, vif, &cmd, action);
|
||||
|
||||
/* Fill the data specific for station mode */
|
||||
iwl_mvm_mac_ctxt_cmd_fill_sta(mvm, vif, &cmd.p2p_sta.sta,
|
||||
action == FW_CTXT_ACTION_ADD);
|
||||
|
||||
cmd.p2p_sta.ctwin = cpu_to_le32(noa->oppps_ctwindow &
|
||||
IEEE80211_P2P_OPPPS_CTWINDOW_MASK);
|
||||
|
||||
return iwl_mvm_mac_ctxt_send_cmd(mvm, &cmd);
|
||||
}
|
||||
|
@ -1138,12 +1116,8 @@ static int iwl_mvm_mac_ctx_send(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
|||
{
|
||||
switch (vif->type) {
|
||||
case NL80211_IFTYPE_STATION:
|
||||
if (!vif->p2p)
|
||||
return iwl_mvm_mac_ctxt_cmd_station(mvm, vif,
|
||||
action);
|
||||
else
|
||||
return iwl_mvm_mac_ctxt_cmd_p2p_client(mvm, vif,
|
||||
action);
|
||||
return iwl_mvm_mac_ctxt_cmd_sta(mvm, vif, action,
|
||||
action == FW_CTXT_ACTION_ADD);
|
||||
break;
|
||||
case NL80211_IFTYPE_AP:
|
||||
if (!vif->p2p)
|
||||
|
@ -1211,7 +1185,7 @@ int iwl_mvm_mac_ctxt_remove(struct iwl_mvm *mvm, struct ieee80211_vif *vif)
|
|||
mvmvif->color));
|
||||
cmd.action = cpu_to_le32(FW_CTXT_ACTION_REMOVE);
|
||||
|
||||
ret = iwl_mvm_send_cmd_pdu(mvm, MAC_CONTEXT_CMD, CMD_SYNC,
|
||||
ret = iwl_mvm_send_cmd_pdu(mvm, MAC_CONTEXT_CMD, 0,
|
||||
sizeof(cmd), &cmd);
|
||||
if (ret) {
|
||||
IWL_ERR(mvm, "Failed to remove MAC context: %d\n", ret);
|
||||
|
|
|
@ -276,7 +276,6 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
|
|||
IEEE80211_HW_AMPDU_AGGREGATION |
|
||||
IEEE80211_HW_TIMING_BEACON_ONLY |
|
||||
IEEE80211_HW_CONNECTION_MONITOR |
|
||||
IEEE80211_HW_SUPPORTS_UAPSD |
|
||||
IEEE80211_HW_SUPPORTS_DYNAMIC_SMPS |
|
||||
IEEE80211_HW_SUPPORTS_STATIC_SMPS;
|
||||
|
||||
|
@ -286,8 +285,6 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
|
|||
IEEE80211_RADIOTAP_MCS_HAVE_STBC;
|
||||
hw->radiotap_vht_details |= IEEE80211_RADIOTAP_VHT_KNOWN_STBC;
|
||||
hw->rate_control_algorithm = "iwl-mvm-rs";
|
||||
hw->uapsd_queues = IWL_UAPSD_AC_INFO;
|
||||
hw->uapsd_max_sp_len = IWL_UAPSD_MAX_SP;
|
||||
|
||||
/*
|
||||
* Enable 11w if advertised by firmware and software crypto
|
||||
|
@ -298,9 +295,13 @@ int iwl_mvm_mac_setup_register(struct iwl_mvm *mvm)
|
|||
!iwlwifi_mod_params.sw_crypto)
|
||||
hw->flags |= IEEE80211_HW_MFP_CAPABLE;
|
||||
|
||||
/* Disable uAPSD due to firmware issues */
|
||||
if (true)
|
||||
hw->flags &= ~IEEE80211_HW_SUPPORTS_UAPSD;
|
||||
if (mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_UAPSD_SUPPORT &&
|
||||
IWL_UCODE_API(mvm->fw->ucode_ver) >= 9 &&
|
||||
!iwlwifi_mod_params.uapsd_disable) {
|
||||
hw->flags |= IEEE80211_HW_SUPPORTS_UAPSD;
|
||||
hw->uapsd_queues = IWL_UAPSD_AC_INFO;
|
||||
hw->uapsd_max_sp_len = IWL_UAPSD_MAX_SP;
|
||||
}
|
||||
|
||||
hw->sta_data_size = sizeof(struct iwl_mvm_sta);
|
||||
hw->vif_data_size = sizeof(struct iwl_mvm_vif);
|
||||
|
@ -772,7 +773,7 @@ static int iwl_mvm_set_tx_power(struct iwl_mvm *mvm, struct ieee80211_vif *vif,
|
|||
.pwr_restriction = cpu_to_le16(tx_power),
|
||||
};
|
||||
|
||||
return iwl_mvm_send_cmd_pdu(mvm, REDUCE_TX_POWER_CMD, CMD_SYNC,
|
||||
return iwl_mvm_send_cmd_pdu(mvm, REDUCE_TX_POWER_CMD, 0,
|
||||
sizeof(reduce_txpwr_cmd),
|
||||
&reduce_txpwr_cmd);
|
||||
}
|
||||
|
@ -836,7 +837,7 @@ static int iwl_mvm_mac_add_interface(struct ieee80211_hw *hw,
|
|||
goto out_release;
|
||||
|
||||
/* beacon filtering */
|
||||
ret = iwl_mvm_disable_beacon_filter(mvm, vif, CMD_SYNC);
|
||||
ret = iwl_mvm_disable_beacon_filter(mvm, vif, 0);
|
||||
if (ret)
|
||||
goto out_remove_mac;
|
||||
|
||||
|
@ -1243,7 +1244,7 @@ static int iwl_mvm_configure_bcast_filter(struct iwl_mvm *mvm,
|
|||
if (!iwl_mvm_bcast_filter_build_cmd(mvm, &cmd))
|
||||
return 0;
|
||||
|
||||
return iwl_mvm_send_cmd_pdu(mvm, BCAST_FILTER_CMD, CMD_SYNC,
|
||||
return iwl_mvm_send_cmd_pdu(mvm, BCAST_FILTER_CMD, 0,
|
||||
sizeof(cmd), &cmd);
|
||||
}
|
||||
#else
|
||||
|
@ -1350,7 +1351,7 @@ static void iwl_mvm_bss_info_changed_station(struct iwl_mvm *mvm,
|
|||
iwl_mvm_remove_time_event(mvm, mvmvif,
|
||||
&mvmvif->time_event_data);
|
||||
iwl_mvm_sf_update(mvm, vif, false);
|
||||
WARN_ON(iwl_mvm_enable_beacon_filter(mvm, vif, CMD_SYNC));
|
||||
WARN_ON(iwl_mvm_enable_beacon_filter(mvm, vif, 0));
|
||||
} else if (changes & (BSS_CHANGED_PS | BSS_CHANGED_P2P_PS |
|
||||
BSS_CHANGED_QOS)) {
|
||||
ret = iwl_mvm_power_update_mac(mvm, vif);
|
||||
|
@ -1364,16 +1365,16 @@ static void iwl_mvm_bss_info_changed_station(struct iwl_mvm *mvm,
|
|||
}
|
||||
|
||||
if (changes & BSS_CHANGED_CQM) {
|
||||
IWL_DEBUG_MAC80211(mvm, "cqm info_changed");
|
||||
IWL_DEBUG_MAC80211(mvm, "cqm info_changed\n");
|
||||
/* reset cqm events tracking */
|
||||
mvmvif->bf_data.last_cqm_event = 0;
|
||||
ret = iwl_mvm_update_beacon_filter(mvm, vif, false, CMD_SYNC);
|
||||
ret = iwl_mvm_update_beacon_filter(mvm, vif, false, 0);
|
||||
if (ret)
|
||||
IWL_ERR(mvm, "failed to update CQM thresholds\n");
|
||||
}
|
||||
|
||||
if (changes & BSS_CHANGED_ARP_FILTER) {
|
||||
IWL_DEBUG_MAC80211(mvm, "arp filter changed");
|
||||
IWL_DEBUG_MAC80211(mvm, "arp filter changed\n");
|
||||
iwl_mvm_configure_bcast_filter(mvm, vif);
|
||||
}
|
||||
}
|
||||
|
@ -1512,6 +1513,9 @@ static void iwl_mvm_bss_info_changed(struct ieee80211_hw *hw,
|
|||
|
||||
mutex_lock(&mvm->mutex);
|
||||
|
||||
if (changes & BSS_CHANGED_IDLE && !bss_conf->idle)
|
||||
iwl_mvm_sched_scan_stop(mvm, true);
|
||||
|
||||
switch (vif->type) {
|
||||
case NL80211_IFTYPE_STATION:
|
||||
iwl_mvm_bss_info_changed_station(mvm, vif, bss_conf, changes);
|
||||
|
@ -1542,7 +1546,7 @@ static int iwl_mvm_mac_hw_scan(struct ieee80211_hw *hw,
|
|||
|
||||
switch (mvm->scan_status) {
|
||||
case IWL_MVM_SCAN_SCHED:
|
||||
ret = iwl_mvm_sched_scan_stop(mvm);
|
||||
ret = iwl_mvm_sched_scan_stop(mvm, true);
|
||||
if (ret) {
|
||||
ret = -EBUSY;
|
||||
goto out;
|
||||
|
@ -1731,13 +1735,12 @@ static int iwl_mvm_mac_sta_state(struct ieee80211_hw *hw,
|
|||
new_state == IEEE80211_STA_AUTHORIZED) {
|
||||
/* enable beacon filtering */
|
||||
if (vif->bss_conf.dtim_period)
|
||||
WARN_ON(iwl_mvm_enable_beacon_filter(mvm, vif,
|
||||
CMD_SYNC));
|
||||
WARN_ON(iwl_mvm_enable_beacon_filter(mvm, vif, 0));
|
||||
ret = 0;
|
||||
} else if (old_state == IEEE80211_STA_AUTHORIZED &&
|
||||
new_state == IEEE80211_STA_ASSOC) {
|
||||
/* disable beacon filtering */
|
||||
WARN_ON(iwl_mvm_disable_beacon_filter(mvm, vif, CMD_SYNC));
|
||||
WARN_ON(iwl_mvm_disable_beacon_filter(mvm, vif, 0));
|
||||
ret = 0;
|
||||
} else if (old_state == IEEE80211_STA_ASSOC &&
|
||||
new_state == IEEE80211_STA_AUTH) {
|
||||
|
@ -1887,7 +1890,7 @@ static int iwl_mvm_mac_sched_scan_stop(struct ieee80211_hw *hw,
|
|||
int ret;
|
||||
|
||||
mutex_lock(&mvm->mutex);
|
||||
ret = iwl_mvm_sched_scan_stop(mvm);
|
||||
ret = iwl_mvm_sched_scan_stop(mvm, false);
|
||||
mutex_unlock(&mvm->mutex);
|
||||
iwl_mvm_wait_for_async_handlers(mvm);
|
||||
|
||||
|
@ -2183,10 +2186,10 @@ static void iwl_mvm_change_chanctx(struct ieee80211_hw *hw,
|
|||
return;
|
||||
|
||||
mutex_lock(&mvm->mutex);
|
||||
iwl_mvm_bt_coex_vif_change(mvm);
|
||||
iwl_mvm_phy_ctxt_changed(mvm, phy_ctxt, &ctx->min_def,
|
||||
ctx->rx_chains_static,
|
||||
ctx->rx_chains_dynamic);
|
||||
iwl_mvm_bt_coex_vif_change(mvm);
|
||||
mutex_unlock(&mvm->mutex);
|
||||
}
|
||||
|
||||
|
@ -2363,9 +2366,8 @@ static int __iwl_mvm_mac_testmode_cmd(struct iwl_mvm *mvm,
|
|||
return -EINVAL;
|
||||
|
||||
if (nla_get_u32(tb[IWL_MVM_TM_ATTR_BEACON_FILTER_STATE]))
|
||||
return iwl_mvm_enable_beacon_filter(mvm, vif,
|
||||
CMD_SYNC);
|
||||
return iwl_mvm_disable_beacon_filter(mvm, vif, CMD_SYNC);
|
||||
return iwl_mvm_enable_beacon_filter(mvm, vif, 0);
|
||||
return iwl_mvm_disable_beacon_filter(mvm, vif, 0);
|
||||
}
|
||||
|
||||
return -EOPNOTSUPP;
|
||||
|
|
|
@ -490,6 +490,7 @@ struct iwl_mvm {
|
|||
u32 log_event_table;
|
||||
u32 umac_error_event_table;
|
||||
bool support_umac_log;
|
||||
struct iwl_sf_region sf_space;
|
||||
|
||||
u32 ampdu_ref;
|
||||
|
||||
|
@ -501,6 +502,7 @@ struct iwl_mvm {
|
|||
u8 queue_to_mac80211[IWL_MAX_HW_QUEUES];
|
||||
atomic_t queue_stop_count[IWL_MAX_HW_QUEUES];
|
||||
|
||||
const char *nvm_file_name;
|
||||
struct iwl_nvm_data *nvm_data;
|
||||
/* NVM sections */
|
||||
struct iwl_nvm_section nvm_sections[NVM_MAX_NUM_SECTIONS];
|
||||
|
@ -856,7 +858,7 @@ int iwl_mvm_config_sched_scan_profiles(struct iwl_mvm *mvm,
|
|||
struct cfg80211_sched_scan_request *req);
|
||||
int iwl_mvm_sched_scan_start(struct iwl_mvm *mvm,
|
||||
struct cfg80211_sched_scan_request *req);
|
||||
int iwl_mvm_sched_scan_stop(struct iwl_mvm *mvm);
|
||||
int iwl_mvm_sched_scan_stop(struct iwl_mvm *mvm, bool notify);
|
||||
int iwl_mvm_rx_sched_scan_results(struct iwl_mvm *mvm,
|
||||
struct iwl_rx_cmd_buffer *rxb,
|
||||
struct iwl_device_cmd *cmd);
|
||||
|
|
|
@ -74,6 +74,12 @@
|
|||
#define NVM_WRITE_OPCODE 1
|
||||
#define NVM_READ_OPCODE 0
|
||||
|
||||
/* load nvm chunk response */
|
||||
enum {
|
||||
READ_NVM_CHUNK_SUCCEED = 0,
|
||||
READ_NVM_CHUNK_NOT_VALID_ADDRESS = 1
|
||||
};
|
||||
|
||||
/*
|
||||
* prepare the NVM host command w/ the pointers to the nvm buffer
|
||||
* and send it to fw
|
||||
|
@ -90,7 +96,7 @@ static int iwl_nvm_write_chunk(struct iwl_mvm *mvm, u16 section,
|
|||
struct iwl_host_cmd cmd = {
|
||||
.id = NVM_ACCESS_CMD,
|
||||
.len = { sizeof(struct iwl_nvm_access_cmd), length },
|
||||
.flags = CMD_SYNC | CMD_SEND_IN_RFKILL,
|
||||
.flags = CMD_SEND_IN_RFKILL,
|
||||
.data = { &nvm_access_cmd, data },
|
||||
/* data may come from vmalloc, so use _DUP */
|
||||
.dataflags = { 0, IWL_HCMD_DFL_DUP },
|
||||
|
@ -112,7 +118,7 @@ static int iwl_nvm_read_chunk(struct iwl_mvm *mvm, u16 section,
|
|||
struct iwl_rx_packet *pkt;
|
||||
struct iwl_host_cmd cmd = {
|
||||
.id = NVM_ACCESS_CMD,
|
||||
.flags = CMD_SYNC | CMD_WANT_SKB | CMD_SEND_IN_RFKILL,
|
||||
.flags = CMD_WANT_SKB | CMD_SEND_IN_RFKILL,
|
||||
.data = { &nvm_access_cmd, },
|
||||
};
|
||||
int ret, bytes_read, offset_read;
|
||||
|
@ -139,10 +145,26 @@ static int iwl_nvm_read_chunk(struct iwl_mvm *mvm, u16 section,
|
|||
offset_read = le16_to_cpu(nvm_resp->offset);
|
||||
resp_data = nvm_resp->data;
|
||||
if (ret) {
|
||||
IWL_ERR(mvm,
|
||||
"NVM access command failed with status %d (device: %s)\n",
|
||||
ret, mvm->cfg->name);
|
||||
ret = -EINVAL;
|
||||
if ((offset != 0) &&
|
||||
(ret == READ_NVM_CHUNK_NOT_VALID_ADDRESS)) {
|
||||
/*
|
||||
* meaning of NOT_VALID_ADDRESS:
|
||||
* driver try to read chunk from address that is
|
||||
* multiple of 2K and got an error since addr is empty.
|
||||
* meaning of (offset != 0): driver already
|
||||
* read valid data from another chunk so this case
|
||||
* is not an error.
|
||||
*/
|
||||
IWL_DEBUG_EEPROM(mvm->trans->dev,
|
||||
"NVM access command failed on offset 0x%x since that section size is multiple 2K\n",
|
||||
offset);
|
||||
ret = 0;
|
||||
} else {
|
||||
IWL_DEBUG_EEPROM(mvm->trans->dev,
|
||||
"NVM access command failed with status %d (device: %s)\n",
|
||||
ret, mvm->cfg->name);
|
||||
ret = -EIO;
|
||||
}
|
||||
goto exit;
|
||||
}
|
||||
|
||||
|
@ -211,9 +233,9 @@ static int iwl_nvm_read_section(struct iwl_mvm *mvm, u16 section,
|
|||
while (ret == length) {
|
||||
ret = iwl_nvm_read_chunk(mvm, section, offset, length, data);
|
||||
if (ret < 0) {
|
||||
IWL_ERR(mvm,
|
||||
"Cannot read NVM from section %d offset %d, length %d\n",
|
||||
section, offset, length);
|
||||
IWL_DEBUG_EEPROM(mvm->trans->dev,
|
||||
"Cannot read NVM from section %d offset %d, length %d\n",
|
||||
section, offset, length);
|
||||
return ret;
|
||||
}
|
||||
offset += ret;
|
||||
|
@ -318,16 +340,16 @@ static int iwl_mvm_read_external_nvm(struct iwl_mvm *mvm)
|
|||
* get here after that we assume the NVM request can be satisfied
|
||||
* synchronously.
|
||||
*/
|
||||
ret = request_firmware(&fw_entry, iwlwifi_mod_params.nvm_file,
|
||||
ret = request_firmware(&fw_entry, mvm->nvm_file_name,
|
||||
mvm->trans->dev);
|
||||
if (ret) {
|
||||
IWL_ERR(mvm, "ERROR: %s isn't available %d\n",
|
||||
iwlwifi_mod_params.nvm_file, ret);
|
||||
mvm->nvm_file_name, ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
IWL_INFO(mvm, "Loaded NVM file %s (%zu bytes)\n",
|
||||
iwlwifi_mod_params.nvm_file, fw_entry->size);
|
||||
mvm->nvm_file_name, fw_entry->size);
|
||||
|
||||
if (fw_entry->size < sizeof(*file_sec)) {
|
||||
IWL_ERR(mvm, "NVM file too small\n");
|
||||
|
@ -436,32 +458,14 @@ int iwl_mvm_load_nvm_to_nic(struct iwl_mvm *mvm)
|
|||
|
||||
int iwl_nvm_init(struct iwl_mvm *mvm, bool read_nvm_from_nic)
|
||||
{
|
||||
int ret, i, section;
|
||||
int ret, section;
|
||||
u8 *nvm_buffer, *temp;
|
||||
int nvm_to_read[NVM_MAX_NUM_SECTIONS];
|
||||
int num_of_sections_to_read;
|
||||
|
||||
if (WARN_ON_ONCE(mvm->cfg->nvm_hw_section_num >= NVM_MAX_NUM_SECTIONS))
|
||||
return -EINVAL;
|
||||
|
||||
/* load NVM values from nic */
|
||||
if (read_nvm_from_nic) {
|
||||
/* list of NVM sections we are allowed/need to read */
|
||||
if (mvm->trans->cfg->device_family != IWL_DEVICE_FAMILY_8000) {
|
||||
nvm_to_read[0] = mvm->cfg->nvm_hw_section_num;
|
||||
nvm_to_read[1] = NVM_SECTION_TYPE_SW;
|
||||
nvm_to_read[2] = NVM_SECTION_TYPE_CALIBRATION;
|
||||
nvm_to_read[3] = NVM_SECTION_TYPE_PRODUCTION;
|
||||
num_of_sections_to_read = 4;
|
||||
} else {
|
||||
nvm_to_read[0] = NVM_SECTION_TYPE_SW;
|
||||
nvm_to_read[1] = NVM_SECTION_TYPE_CALIBRATION;
|
||||
nvm_to_read[2] = NVM_SECTION_TYPE_PRODUCTION;
|
||||
nvm_to_read[3] = NVM_SECTION_TYPE_REGULATORY;
|
||||
nvm_to_read[4] = NVM_SECTION_TYPE_MAC_OVERRIDE;
|
||||
num_of_sections_to_read = 5;
|
||||
}
|
||||
|
||||
/* Read From FW NVM */
|
||||
IWL_DEBUG_EEPROM(mvm->trans->dev, "Read from NVM\n");
|
||||
|
||||
|
@ -469,12 +473,11 @@ int iwl_nvm_init(struct iwl_mvm *mvm, bool read_nvm_from_nic)
|
|||
GFP_KERNEL);
|
||||
if (!nvm_buffer)
|
||||
return -ENOMEM;
|
||||
for (i = 0; i < num_of_sections_to_read; i++) {
|
||||
section = nvm_to_read[i];
|
||||
for (section = 0; section < NVM_MAX_NUM_SECTIONS; section++) {
|
||||
/* we override the constness for initial read */
|
||||
ret = iwl_nvm_read_section(mvm, section, nvm_buffer);
|
||||
if (ret < 0)
|
||||
break;
|
||||
continue;
|
||||
temp = kmemdup(nvm_buffer, ret, GFP_KERNEL);
|
||||
if (!temp) {
|
||||
ret = -ENOMEM;
|
||||
|
@ -503,17 +506,14 @@ int iwl_nvm_init(struct iwl_mvm *mvm, bool read_nvm_from_nic)
|
|||
mvm->nvm_hw_blob.size = ret;
|
||||
break;
|
||||
}
|
||||
WARN(1, "section: %d", section);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
kfree(nvm_buffer);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* load external NVM if configured */
|
||||
if (iwlwifi_mod_params.nvm_file) {
|
||||
if (mvm->nvm_file_name) {
|
||||
/* move to External NVM flow */
|
||||
ret = iwl_mvm_read_external_nvm(mvm);
|
||||
if (ret)
|
||||
|
|
|
@ -466,8 +466,13 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,
|
|||
|
||||
min_backoff = calc_min_backoff(trans, cfg);
|
||||
iwl_mvm_tt_initialize(mvm, min_backoff);
|
||||
/* set the nvm_file_name according to priority */
|
||||
if (iwlwifi_mod_params.nvm_file)
|
||||
mvm->nvm_file_name = iwlwifi_mod_params.nvm_file;
|
||||
else
|
||||
mvm->nvm_file_name = mvm->cfg->default_nvm_file;
|
||||
|
||||
if (WARN(cfg->no_power_up_nic_in_init && !iwlwifi_mod_params.nvm_file,
|
||||
if (WARN(cfg->no_power_up_nic_in_init && !mvm->nvm_file_name,
|
||||
"not allowing power-up and not having nvm_file\n"))
|
||||
goto out_free;
|
||||
|
||||
|
@ -477,7 +482,7 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,
|
|||
* and not in the file.
|
||||
* for nics with no_power_up_nic_in_init: rely completley on nvm_file
|
||||
*/
|
||||
if (cfg->no_power_up_nic_in_init && iwlwifi_mod_params.nvm_file) {
|
||||
if (cfg->no_power_up_nic_in_init && mvm->nvm_file_name) {
|
||||
err = iwl_nvm_init(mvm, false);
|
||||
if (err)
|
||||
goto out_free;
|
||||
|
@ -525,7 +530,7 @@ iwl_op_mode_mvm_start(struct iwl_trans *trans, const struct iwl_cfg *cfg,
|
|||
out_free:
|
||||
iwl_phy_db_free(mvm->phy_db);
|
||||
kfree(mvm->scan_cmd);
|
||||
if (!cfg->no_power_up_nic_in_init || !iwlwifi_mod_params.nvm_file)
|
||||
if (!cfg->no_power_up_nic_in_init || !mvm->nvm_file_name)
|
||||
iwl_trans_op_mode_leave(trans);
|
||||
ieee80211_free_hw(mvm->hw);
|
||||
return NULL;
|
||||
|
@ -1163,7 +1168,7 @@ static void iwl_mvm_d0i3_exit_work(struct work_struct *wk)
|
|||
struct iwl_mvm *mvm = container_of(wk, struct iwl_mvm, d0i3_exit_work);
|
||||
struct iwl_host_cmd get_status_cmd = {
|
||||
.id = WOWLAN_GET_STATUSES,
|
||||
.flags = CMD_SYNC | CMD_HIGH_PRIO | CMD_WANT_SKB,
|
||||
.flags = CMD_HIGH_PRIO | CMD_WANT_SKB,
|
||||
};
|
||||
struct iwl_wowlan_status *status;
|
||||
int ret;
|
||||
|
|
|
@ -156,6 +156,19 @@ static void iwl_mvm_phy_ctxt_cmd_data(struct iwl_mvm *mvm,
|
|||
idle_cnt = chains_static;
|
||||
active_cnt = chains_dynamic;
|
||||
|
||||
/* In scenarios where we only ever use a single-stream rates,
|
||||
* i.e. legacy 11b/g/a associations, single-stream APs or even
|
||||
* static SMPS, enable both chains to get diversity, improving
|
||||
* the case where we're far enough from the AP that attenuation
|
||||
* between the two antennas is sufficiently different to impact
|
||||
* performance.
|
||||
*/
|
||||
if (active_cnt == 1 && num_of_ant(mvm->fw->valid_rx_ant) > 1 &&
|
||||
!mvm->cfg->rx_with_siso_diversity) {
|
||||
idle_cnt = 2;
|
||||
active_cnt = 2;
|
||||
}
|
||||
|
||||
cmd->rxchain_info = cpu_to_le32(mvm->fw->valid_rx_ant <<
|
||||
PHY_RX_CHAIN_VALID_POS);
|
||||
cmd->rxchain_info |= cpu_to_le32(idle_cnt << PHY_RX_CHAIN_CNT_POS);
|
||||
|
@ -187,7 +200,7 @@ static int iwl_mvm_phy_ctxt_apply(struct iwl_mvm *mvm,
|
|||
iwl_mvm_phy_ctxt_cmd_data(mvm, &cmd, chandef,
|
||||
chains_static, chains_dynamic);
|
||||
|
||||
ret = iwl_mvm_send_cmd_pdu(mvm, PHY_CONTEXT_CMD, CMD_SYNC,
|
||||
ret = iwl_mvm_send_cmd_pdu(mvm, PHY_CONTEXT_CMD, 0,
|
||||
sizeof(struct iwl_phy_context_cmd),
|
||||
&cmd);
|
||||
if (ret)
|
||||
|
|
|
@ -142,7 +142,7 @@ int iwl_mvm_update_beacon_abort(struct iwl_mvm *mvm,
|
|||
mvmvif->bf_data.ba_enabled = enable;
|
||||
iwl_mvm_beacon_filter_set_cqm_params(mvm, vif, &cmd);
|
||||
iwl_mvm_beacon_filter_debugfs_parameters(vif, &cmd);
|
||||
return iwl_mvm_beacon_filter_send_cmd(mvm, &cmd, CMD_SYNC);
|
||||
return iwl_mvm_beacon_filter_send_cmd(mvm, &cmd, 0);
|
||||
}
|
||||
|
||||
static void iwl_mvm_power_log(struct iwl_mvm *mvm,
|
||||
|
@ -268,10 +268,30 @@ static void iwl_mvm_power_configure_uapsd(struct iwl_mvm *mvm,
|
|||
IWL_MVM_PS_HEAVY_RX_THLD_PERCENT;
|
||||
}
|
||||
|
||||
static void iwl_mvm_binding_iterator(void *_data, u8 *mac,
|
||||
struct ieee80211_vif *vif)
|
||||
{
|
||||
unsigned long *data = _data;
|
||||
struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
|
||||
|
||||
if (!mvmvif->phy_ctxt)
|
||||
return;
|
||||
|
||||
if (vif->type == NL80211_IFTYPE_STATION ||
|
||||
vif->type == NL80211_IFTYPE_AP)
|
||||
__set_bit(mvmvif->phy_ctxt->id, data);
|
||||
}
|
||||
|
||||
static bool iwl_mvm_power_allow_uapsd(struct iwl_mvm *mvm,
|
||||
struct ieee80211_vif *vif)
|
||||
{
|
||||
struct iwl_mvm_vif *mvmvif = iwl_mvm_vif_from_mac80211(vif);
|
||||
unsigned long phy_ctxt_counter = 0;
|
||||
|
||||
ieee80211_iterate_active_interfaces_atomic(mvm->hw,
|
||||
IEEE80211_IFACE_ITER_NORMAL,
|
||||
iwl_mvm_binding_iterator,
|
||||
&phy_ctxt_counter);
|
||||
|
||||
if (!memcmp(mvmvif->uapsd_misbehaving_bssid, vif->bss_conf.bssid,
|
||||
ETH_ALEN))
|
||||
|
@ -289,6 +309,13 @@ static bool iwl_mvm_power_allow_uapsd(struct iwl_mvm *mvm,
|
|||
IEEE80211_P2P_OPPPS_ENABLE_BIT))
|
||||
return false;
|
||||
|
||||
/*
|
||||
* Avoid using uAPSD if client is in DCM -
|
||||
* low latency issue in Miracast
|
||||
*/
|
||||
if (hweight8(phy_ctxt_counter) >= 2)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -429,7 +456,7 @@ static int iwl_mvm_power_send_cmd(struct iwl_mvm *mvm,
|
|||
memcpy(&iwl_mvm_vif_from_mac80211(vif)->mac_pwr_cmd, &cmd, sizeof(cmd));
|
||||
#endif
|
||||
|
||||
return iwl_mvm_send_cmd_pdu(mvm, MAC_PM_POWER_TABLE, CMD_SYNC,
|
||||
return iwl_mvm_send_cmd_pdu(mvm, MAC_PM_POWER_TABLE, 0,
|
||||
sizeof(cmd), &cmd);
|
||||
}
|
||||
|
||||
|
@ -455,7 +482,7 @@ int iwl_mvm_power_update_device(struct iwl_mvm *mvm)
|
|||
"Sending device power command with flags = 0x%X\n",
|
||||
cmd.flags);
|
||||
|
||||
return iwl_mvm_send_cmd_pdu(mvm, POWER_TABLE_CMD, CMD_SYNC, sizeof(cmd),
|
||||
return iwl_mvm_send_cmd_pdu(mvm, POWER_TABLE_CMD, 0, sizeof(cmd),
|
||||
&cmd);
|
||||
}
|
||||
|
||||
|
@ -613,11 +640,15 @@ iwl_mvm_power_set_pm(struct iwl_mvm *mvm,
|
|||
ap_same_channel = (bss_mvmvif->phy_ctxt->id ==
|
||||
ap_mvmvif->phy_ctxt->id);
|
||||
|
||||
/* bss is not stand alone: enable PM if alone on its channel */
|
||||
if (vifs->bss_active && !(client_same_channel || ap_same_channel) &&
|
||||
/* clients are not stand alone: enable PM if DCM */
|
||||
if (!(client_same_channel || ap_same_channel) &&
|
||||
(mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_BSS_P2P_PS_DCM)) {
|
||||
if (vifs->bss_active)
|
||||
bss_mvmvif->pm_enabled = true;
|
||||
return;
|
||||
if (vifs->p2p_active &&
|
||||
(mvm->fw->ucode_capa.flags & IWL_UCODE_TLV_FLAGS_P2P_PM))
|
||||
p2p_mvmvif->pm_enabled = true;
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -871,9 +902,10 @@ int iwl_mvm_update_d0i3_power_mode(struct iwl_mvm *mvm,
|
|||
if (WARN_ON(!dtimper_msec))
|
||||
return 0;
|
||||
|
||||
cmd.flags |=
|
||||
cpu_to_le16(POWER_FLAGS_SKIP_OVER_DTIM_MSK);
|
||||
cmd.skip_dtim_periods = 300 / dtimper_msec;
|
||||
if (cmd.skip_dtim_periods)
|
||||
cmd.flags |=
|
||||
cpu_to_le16(POWER_FLAGS_SKIP_OVER_DTIM_MSK);
|
||||
}
|
||||
iwl_mvm_power_log(mvm, &cmd);
|
||||
#ifdef CONFIG_IWLWIFI_DEBUGFS
|
||||
|
|
|
@ -285,7 +285,7 @@ int iwl_mvm_update_quotas(struct iwl_mvm *mvm, struct ieee80211_vif *newvif)
|
|||
|
||||
iwl_mvm_adjust_quota_for_noa(mvm, &cmd);
|
||||
|
||||
ret = iwl_mvm_send_cmd_pdu(mvm, TIME_QUOTA_CMD, CMD_SYNC,
|
||||
ret = iwl_mvm_send_cmd_pdu(mvm, TIME_QUOTA_CMD, 0,
|
||||
sizeof(cmd), &cmd);
|
||||
if (ret)
|
||||
IWL_ERR(mvm, "Failed to send quota: %d\n", ret);
|
||||
|
|
|
@ -1866,7 +1866,7 @@ static bool rs_tpc_perform(struct iwl_mvm *mvm,
|
|||
|
||||
#ifdef CONFIG_MAC80211_DEBUGFS
|
||||
if (lq_sta->dbg_fixed_txp_reduction <= TPC_MAX_REDUCTION) {
|
||||
IWL_DEBUG_RATE(mvm, "fixed tpc: %d",
|
||||
IWL_DEBUG_RATE(mvm, "fixed tpc: %d\n",
|
||||
lq_sta->dbg_fixed_txp_reduction);
|
||||
lq_sta->lq.reduced_tpc = lq_sta->dbg_fixed_txp_reduction;
|
||||
return cur != lq_sta->dbg_fixed_txp_reduction;
|
||||
|
@ -1883,7 +1883,7 @@ static bool rs_tpc_perform(struct iwl_mvm *mvm,
|
|||
|
||||
if (!rs_tpc_allowed(mvm, vif, rate, band)) {
|
||||
IWL_DEBUG_RATE(mvm,
|
||||
"tpc is not allowed. remove txp restrictions");
|
||||
"tpc is not allowed. remove txp restrictions\n");
|
||||
lq_sta->lq.reduced_tpc = TPC_NO_REDUCTION;
|
||||
return cur != TPC_NO_REDUCTION;
|
||||
}
|
||||
|
@ -1909,12 +1909,12 @@ static bool rs_tpc_perform(struct iwl_mvm *mvm,
|
|||
|
||||
/* override actions if we are on the edge */
|
||||
if (weak == TPC_INVALID && action == TPC_ACTION_DECREASE) {
|
||||
IWL_DEBUG_RATE(mvm, "already in lowest txp, stay");
|
||||
IWL_DEBUG_RATE(mvm, "already in lowest txp, stay\n");
|
||||
action = TPC_ACTION_STAY;
|
||||
} else if (strong == TPC_INVALID &&
|
||||
(action == TPC_ACTION_INCREASE ||
|
||||
action == TPC_ACTION_NO_RESTIRCTION)) {
|
||||
IWL_DEBUG_RATE(mvm, "already in highest txp, stay");
|
||||
IWL_DEBUG_RATE(mvm, "already in highest txp, stay\n");
|
||||
action = TPC_ACTION_STAY;
|
||||
}
|
||||
|
||||
|
|
|
@ -306,7 +306,6 @@ int iwl_mvm_scan_request(struct iwl_mvm *mvm,
|
|||
.id = SCAN_REQUEST_CMD,
|
||||
.len = { 0, },
|
||||
.data = { mvm->scan_cmd, },
|
||||
.flags = CMD_SYNC,
|
||||
.dataflags = { IWL_HCMD_DFL_NOCOPY, },
|
||||
};
|
||||
struct iwl_scan_cmd *cmd = mvm->scan_cmd;
|
||||
|
@ -517,7 +516,7 @@ int iwl_mvm_cancel_scan(struct iwl_mvm *mvm)
|
|||
ARRAY_SIZE(scan_abort_notif),
|
||||
iwl_mvm_scan_abort_notif, NULL);
|
||||
|
||||
ret = iwl_mvm_send_cmd_pdu(mvm, SCAN_ABORT_CMD, CMD_SYNC, 0, NULL);
|
||||
ret = iwl_mvm_send_cmd_pdu(mvm, SCAN_ABORT_CMD, 0, 0, NULL);
|
||||
if (ret) {
|
||||
IWL_ERR(mvm, "Couldn't send SCAN_ABORT_CMD: %d\n", ret);
|
||||
/* mac80211's state will be cleaned in the nic_restart flow */
|
||||
|
@ -749,7 +748,6 @@ int iwl_mvm_config_sched_scan(struct iwl_mvm *mvm,
|
|||
struct iwl_scan_offload_cfg *scan_cfg;
|
||||
struct iwl_host_cmd cmd = {
|
||||
.id = SCAN_OFFLOAD_CONFIG_CMD,
|
||||
.flags = CMD_SYNC,
|
||||
};
|
||||
struct iwl_mvm_scan_params params = {};
|
||||
|
||||
|
@ -807,7 +805,6 @@ int iwl_mvm_config_sched_scan_profiles(struct iwl_mvm *mvm,
|
|||
struct iwl_scan_offload_blacklist *blacklist;
|
||||
struct iwl_host_cmd cmd = {
|
||||
.id = SCAN_OFFLOAD_UPDATE_PROFILES_CMD,
|
||||
.flags = CMD_SYNC,
|
||||
.len[1] = sizeof(*profile_cfg),
|
||||
.dataflags[0] = IWL_HCMD_DFL_NOCOPY,
|
||||
.dataflags[1] = IWL_HCMD_DFL_NOCOPY,
|
||||
|
@ -898,7 +895,7 @@ int iwl_mvm_sched_scan_start(struct iwl_mvm *mvm,
|
|||
scan_req.flags |=
|
||||
cpu_to_le16(IWL_SCAN_OFFLOAD_FLAG_EBS_ACCURATE_MODE);
|
||||
|
||||
return iwl_mvm_send_cmd_pdu(mvm, SCAN_OFFLOAD_REQUEST_CMD, CMD_SYNC,
|
||||
return iwl_mvm_send_cmd_pdu(mvm, SCAN_OFFLOAD_REQUEST_CMD, 0,
|
||||
sizeof(scan_req), &scan_req);
|
||||
}
|
||||
|
||||
|
@ -907,7 +904,6 @@ static int iwl_mvm_send_sched_scan_abort(struct iwl_mvm *mvm)
|
|||
int ret;
|
||||
struct iwl_host_cmd cmd = {
|
||||
.id = SCAN_OFFLOAD_ABORT_CMD,
|
||||
.flags = CMD_SYNC,
|
||||
};
|
||||
u32 status;
|
||||
|
||||
|
@ -936,7 +932,7 @@ static int iwl_mvm_send_sched_scan_abort(struct iwl_mvm *mvm)
|
|||
return ret;
|
||||
}
|
||||
|
||||
int iwl_mvm_sched_scan_stop(struct iwl_mvm *mvm)
|
||||
int iwl_mvm_sched_scan_stop(struct iwl_mvm *mvm, bool notify)
|
||||
{
|
||||
int ret;
|
||||
struct iwl_notification_wait wait_scan_done;
|
||||
|
@ -974,5 +970,8 @@ int iwl_mvm_sched_scan_stop(struct iwl_mvm *mvm)
|
|||
*/
|
||||
mvm->scan_status = IWL_MVM_SCAN_NONE;
|
||||
|
||||
if (notify)
|
||||
ieee80211_sched_scan_stopped(mvm->hw);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -327,7 +327,7 @@ static int iwl_mvm_rm_sta_common(struct iwl_mvm *mvm, u8 sta_id)
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = iwl_mvm_send_cmd_pdu(mvm, REMOVE_STA, CMD_SYNC,
|
||||
ret = iwl_mvm_send_cmd_pdu(mvm, REMOVE_STA, 0,
|
||||
sizeof(rm_sta_cmd), &rm_sta_cmd);
|
||||
if (ret) {
|
||||
IWL_ERR(mvm, "Failed to remove station. Id=%d\n", sta_id);
|
||||
|
@ -1053,12 +1053,12 @@ static int iwl_mvm_send_sta_key(struct iwl_mvm *mvm,
|
|||
cmd.sta_id = sta_id;
|
||||
|
||||
status = ADD_STA_SUCCESS;
|
||||
if (cmd_flags == CMD_SYNC)
|
||||
ret = iwl_mvm_send_cmd_pdu_status(mvm, ADD_STA_KEY, sizeof(cmd),
|
||||
&cmd, &status);
|
||||
else
|
||||
if (cmd_flags & CMD_ASYNC)
|
||||
ret = iwl_mvm_send_cmd_pdu(mvm, ADD_STA_KEY, CMD_ASYNC,
|
||||
sizeof(cmd), &cmd);
|
||||
else
|
||||
ret = iwl_mvm_send_cmd_pdu_status(mvm, ADD_STA_KEY, sizeof(cmd),
|
||||
&cmd, &status);
|
||||
|
||||
switch (status) {
|
||||
case ADD_STA_SUCCESS:
|
||||
|
@ -1111,7 +1111,7 @@ static int iwl_mvm_send_sta_igtk(struct iwl_mvm *mvm,
|
|||
remove_key ? "removing" : "installing",
|
||||
igtk_cmd.sta_id);
|
||||
|
||||
return iwl_mvm_send_cmd_pdu(mvm, MGMT_MCAST_KEY, CMD_SYNC,
|
||||
return iwl_mvm_send_cmd_pdu(mvm, MGMT_MCAST_KEY, 0,
|
||||
sizeof(igtk_cmd), &igtk_cmd);
|
||||
}
|
||||
|
||||
|
@ -1198,15 +1198,15 @@ int iwl_mvm_set_sta_key(struct iwl_mvm *mvm,
|
|||
ieee80211_get_key_rx_seq(keyconf, 0, &seq);
|
||||
ieee80211_get_tkip_rx_p1k(keyconf, addr, seq.tkip.iv32, p1k);
|
||||
ret = iwl_mvm_send_sta_key(mvm, mvm_sta, keyconf, sta_id,
|
||||
seq.tkip.iv32, p1k, CMD_SYNC);
|
||||
seq.tkip.iv32, p1k, 0);
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_CCMP:
|
||||
ret = iwl_mvm_send_sta_key(mvm, mvm_sta, keyconf, sta_id,
|
||||
0, NULL, CMD_SYNC);
|
||||
0, NULL, 0);
|
||||
break;
|
||||
default:
|
||||
ret = iwl_mvm_send_sta_key(mvm, mvm_sta, keyconf,
|
||||
sta_id, 0, NULL, CMD_SYNC);
|
||||
sta_id, 0, NULL, 0);
|
||||
}
|
||||
|
||||
if (ret)
|
||||
|
|
|
@ -312,7 +312,7 @@ static int iwl_mvm_time_event_send_add(struct iwl_mvm *mvm,
|
|||
ARRAY_SIZE(time_event_response),
|
||||
iwl_mvm_time_event_response, te_data);
|
||||
|
||||
ret = iwl_mvm_send_cmd_pdu(mvm, TIME_EVENT_CMD, CMD_SYNC,
|
||||
ret = iwl_mvm_send_cmd_pdu(mvm, TIME_EVENT_CMD, 0,
|
||||
sizeof(*te_cmd), te_cmd);
|
||||
if (ret) {
|
||||
IWL_ERR(mvm, "Couldn't send TIME_EVENT_CMD: %d\n", ret);
|
||||
|
@ -434,7 +434,7 @@ void iwl_mvm_remove_time_event(struct iwl_mvm *mvm,
|
|||
cpu_to_le32(FW_CMD_ID_AND_COLOR(mvmvif->id, mvmvif->color));
|
||||
|
||||
IWL_DEBUG_TE(mvm, "Removing TE 0x%x\n", le32_to_cpu(time_cmd.id));
|
||||
ret = iwl_mvm_send_cmd_pdu(mvm, TIME_EVENT_CMD, CMD_SYNC,
|
||||
ret = iwl_mvm_send_cmd_pdu(mvm, TIME_EVENT_CMD, 0,
|
||||
sizeof(time_cmd), &time_cmd);
|
||||
if (WARN_ON(ret))
|
||||
return;
|
||||
|
|
|
@ -409,7 +409,6 @@ void iwl_mvm_tt_tx_backoff(struct iwl_mvm *mvm, u32 backoff)
|
|||
.id = REPLY_THERMAL_MNG_BACKOFF,
|
||||
.len = { sizeof(u32), },
|
||||
.data = { &backoff, },
|
||||
.flags = CMD_SYNC,
|
||||
};
|
||||
|
||||
backoff = max(backoff, mvm->thermal_throttle.min_backoff);
|
||||
|
|
|
@ -958,7 +958,7 @@ int iwl_mvm_flush_tx_path(struct iwl_mvm *mvm, u32 tfd_msk, bool sync)
|
|||
.flush_ctl = cpu_to_le16(DUMP_TX_FIFO_FLUSH),
|
||||
};
|
||||
|
||||
u32 flags = sync ? CMD_SYNC : CMD_ASYNC;
|
||||
u32 flags = sync ? 0 : CMD_ASYNC;
|
||||
|
||||
ret = iwl_mvm_send_cmd_pdu(mvm, TXPATH_FLUSH, flags,
|
||||
sizeof(flush_cmd), &flush_cmd);
|
||||
|
|
|
@ -144,7 +144,7 @@ int iwl_mvm_send_cmd_status(struct iwl_mvm *mvm, struct iwl_host_cmd *cmd,
|
|||
"cmd flags %x", cmd->flags))
|
||||
return -EINVAL;
|
||||
|
||||
cmd->flags |= CMD_SYNC | CMD_WANT_SKB;
|
||||
cmd->flags |= CMD_WANT_SKB;
|
||||
|
||||
ret = iwl_trans_send_cmd(mvm->trans, cmd);
|
||||
if (ret == -ERFKILL) {
|
||||
|
@ -599,7 +599,7 @@ int iwl_mvm_send_lq_cmd(struct iwl_mvm *mvm, struct iwl_lq_cmd *lq, bool init)
|
|||
struct iwl_host_cmd cmd = {
|
||||
.id = LQ_CMD,
|
||||
.len = { sizeof(struct iwl_lq_cmd), },
|
||||
.flags = init ? CMD_SYNC : CMD_ASYNC,
|
||||
.flags = init ? 0 : CMD_ASYNC,
|
||||
.data = { lq, },
|
||||
};
|
||||
|
||||
|
|
|
@ -417,7 +417,7 @@ static u64 splx_get_pwr_limit(struct iwl_trans *trans, union acpi_object *splx)
|
|||
splx->package.count != 2 ||
|
||||
splx->package.elements[0].type != ACPI_TYPE_INTEGER ||
|
||||
splx->package.elements[0].integer.value != 0) {
|
||||
IWL_ERR(trans, "Unsupported splx structure");
|
||||
IWL_ERR(trans, "Unsupported splx structure\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -426,14 +426,14 @@ static u64 splx_get_pwr_limit(struct iwl_trans *trans, union acpi_object *splx)
|
|||
limits->package.count < 2 ||
|
||||
limits->package.elements[0].type != ACPI_TYPE_INTEGER ||
|
||||
limits->package.elements[1].type != ACPI_TYPE_INTEGER) {
|
||||
IWL_ERR(trans, "Invalid limits element");
|
||||
IWL_ERR(trans, "Invalid limits element\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
domain_type = &limits->package.elements[0];
|
||||
power_limit = &limits->package.elements[1];
|
||||
if (!(domain_type->integer.value & SPL_DOMAINTYPE_WIFI)) {
|
||||
IWL_DEBUG_INFO(trans, "WiFi power is not limited");
|
||||
IWL_DEBUG_INFO(trans, "WiFi power is not limited\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -450,26 +450,26 @@ static void set_dflt_pwr_limit(struct iwl_trans *trans, struct pci_dev *pdev)
|
|||
pxsx_handle = ACPI_HANDLE(&pdev->dev);
|
||||
if (!pxsx_handle) {
|
||||
IWL_DEBUG_INFO(trans,
|
||||
"Could not retrieve root port ACPI handle");
|
||||
"Could not retrieve root port ACPI handle\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/* Get the method's handle */
|
||||
status = acpi_get_handle(pxsx_handle, (acpi_string)SPL_METHOD, &handle);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
IWL_DEBUG_INFO(trans, "SPL method not found");
|
||||
IWL_DEBUG_INFO(trans, "SPL method not found\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/* Call SPLC with no arguments */
|
||||
status = acpi_evaluate_object(handle, NULL, NULL, &splx);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
IWL_ERR(trans, "SPLC invocation failed (0x%x)", status);
|
||||
IWL_ERR(trans, "SPLC invocation failed (0x%x)\n", status);
|
||||
return;
|
||||
}
|
||||
|
||||
trans->dflt_pwr_limit = splx_get_pwr_limit(trans, splx.pointer);
|
||||
IWL_DEBUG_INFO(trans, "Default power limit set to %lld",
|
||||
IWL_DEBUG_INFO(trans, "Default power limit set to %lld\n",
|
||||
trans->dflt_pwr_limit);
|
||||
kfree(splx.pointer);
|
||||
}
|
||||
|
|
|
@ -454,6 +454,7 @@ static int iwl_pcie_prepare_card_hw(struct iwl_trans *trans)
|
|||
{
|
||||
int ret;
|
||||
int t = 0;
|
||||
int iter;
|
||||
|
||||
IWL_DEBUG_INFO(trans, "iwl_trans_prepare_card_hw enter\n");
|
||||
|
||||
|
@ -462,18 +463,23 @@ static int iwl_pcie_prepare_card_hw(struct iwl_trans *trans)
|
|||
if (ret >= 0)
|
||||
return 0;
|
||||
|
||||
/* If HW is not ready, prepare the conditions to check again */
|
||||
iwl_set_bit(trans, CSR_HW_IF_CONFIG_REG,
|
||||
CSR_HW_IF_CONFIG_REG_PREPARE);
|
||||
for (iter = 0; iter < 10; iter++) {
|
||||
/* If HW is not ready, prepare the conditions to check again */
|
||||
iwl_set_bit(trans, CSR_HW_IF_CONFIG_REG,
|
||||
CSR_HW_IF_CONFIG_REG_PREPARE);
|
||||
|
||||
do {
|
||||
ret = iwl_pcie_set_hw_ready(trans);
|
||||
if (ret >= 0)
|
||||
return 0;
|
||||
do {
|
||||
ret = iwl_pcie_set_hw_ready(trans);
|
||||
if (ret >= 0)
|
||||
return 0;
|
||||
|
||||
usleep_range(200, 1000);
|
||||
t += 200;
|
||||
} while (t < 150000);
|
||||
usleep_range(200, 1000);
|
||||
t += 200;
|
||||
} while (t < 150000);
|
||||
msleep(25);
|
||||
}
|
||||
|
||||
IWL_DEBUG_INFO(trans, "got NIC after %d iterations\n", iter);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
|
|
@ -201,7 +201,7 @@ static void iwl_pcie_txq_stuck_timer(unsigned long data)
|
|||
IWL_ERR(trans, "scratch %d = 0x%08x\n", i,
|
||||
le32_to_cpu(txq->scratchbufs[i].scratch));
|
||||
|
||||
iwl_write_prph(trans, DEVICE_SET_NMI_REG, 1);
|
||||
iwl_force_nmi(trans);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -332,12 +332,12 @@ void iwl_pcie_txq_check_wrptrs(struct iwl_trans *trans)
|
|||
for (i = 0; i < trans->cfg->base_params->num_of_queues; i++) {
|
||||
struct iwl_txq *txq = &trans_pcie->txq[i];
|
||||
|
||||
spin_lock(&txq->lock);
|
||||
spin_lock_bh(&txq->lock);
|
||||
if (trans_pcie->txq[i].need_update) {
|
||||
iwl_pcie_txq_inc_wr_ptr(trans, txq);
|
||||
trans_pcie->txq[i].need_update = false;
|
||||
}
|
||||
spin_unlock(&txq->lock);
|
||||
spin_unlock_bh(&txq->lock);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1029,7 +1029,7 @@ static void iwl_pcie_cmdq_reclaim(struct iwl_trans *trans, int txq_id, int idx)
|
|||
if (nfreed++ > 0) {
|
||||
IWL_ERR(trans, "HCMD skipped: index (%d) %d %d\n",
|
||||
idx, q->write_ptr, q->read_ptr);
|
||||
iwl_write_prph(trans, DEVICE_SET_NMI_REG, 1);
|
||||
iwl_force_nmi(trans);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1600,7 +1600,7 @@ static int iwl_pcie_send_hcmd_sync(struct iwl_trans *trans,
|
|||
get_cmd_string(trans_pcie, cmd->id));
|
||||
ret = -ETIMEDOUT;
|
||||
|
||||
iwl_write_prph(trans, DEVICE_SET_NMI_REG, 1);
|
||||
iwl_force_nmi(trans);
|
||||
iwl_trans_fw_error(trans);
|
||||
|
||||
goto cancel;
|
||||
|
|
Загрузка…
Ссылка в новой задаче