mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-27 11:55:53 +00:00
Merge ath-next from git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git
ath.git patches for 4.12. Major changes: ath9k * add support for Dell Wireless 1601 PCI device * add debugfs file to manually override noise floor ath10k * bump up FW API to 6 for a new QCA6174 firmware branch wil6210 * support 8 kB RX buffers
This commit is contained in:
commit
0b16e0e98e
@ -640,6 +640,7 @@ static int ath10k_ahb_hif_start(struct ath10k *ar)
|
||||
{
|
||||
ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot ahb hif start\n");
|
||||
|
||||
napi_enable(&ar->napi);
|
||||
ath10k_ce_enable_interrupts(ar);
|
||||
ath10k_pci_enable_legacy_irq(ar);
|
||||
|
||||
@ -692,7 +693,6 @@ static int ath10k_ahb_hif_power_up(struct ath10k *ar)
|
||||
ath10k_err(ar, "could not wake up target CPU: %d\n", ret);
|
||||
goto err_ce_deinit;
|
||||
}
|
||||
napi_enable(&ar->napi);
|
||||
|
||||
return 0;
|
||||
|
||||
|
@ -176,7 +176,8 @@ union bmi_resp {
|
||||
} rompatch_uninstall;
|
||||
struct {
|
||||
/* 0 = nothing executed
|
||||
* otherwise = NVRAM segment return value */
|
||||
* otherwise = NVRAM segment return value
|
||||
*/
|
||||
__le32 result;
|
||||
} nvram_process;
|
||||
u8 payload[BMI_MAX_CMDBUF_SIZE];
|
||||
|
@ -261,8 +261,7 @@ static inline void ath10k_ce_engine_int_status_clear(struct ath10k *ar,
|
||||
}
|
||||
|
||||
/*
|
||||
* Guts of ath10k_ce_send, used by both ath10k_ce_send and
|
||||
* ath10k_ce_sendlist_send.
|
||||
* Guts of ath10k_ce_send.
|
||||
* The caller takes responsibility for any needed locking.
|
||||
*/
|
||||
int ath10k_ce_send_nolock(struct ath10k_ce_pipe *ce_state,
|
||||
@ -1052,7 +1051,7 @@ int ath10k_ce_alloc_pipe(struct ath10k *ar, int ce_id,
|
||||
*/
|
||||
BUILD_BUG_ON(2 * TARGET_NUM_MSDU_DESC >
|
||||
(CE_HTT_H2T_MSG_SRC_NENTRIES - 1));
|
||||
BUILD_BUG_ON(2 * TARGET_10X_NUM_MSDU_DESC >
|
||||
BUILD_BUG_ON(2 * TARGET_10_4_NUM_MSDU_DESC_PFC >
|
||||
(CE_HTT_H2T_MSG_SRC_NENTRIES - 1));
|
||||
BUILD_BUG_ON(2 * TARGET_TLV_NUM_MSDU_DESC >
|
||||
(CE_HTT_H2T_MSG_SRC_NENTRIES - 1));
|
||||
|
@ -71,6 +71,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
},
|
||||
.hw_ops = &qca988x_ops,
|
||||
.decap_align_bytes = 4,
|
||||
.spectral_bin_discard = 0,
|
||||
},
|
||||
{
|
||||
.id = QCA9887_HW_1_0_VERSION,
|
||||
@ -91,6 +92,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
},
|
||||
.hw_ops = &qca988x_ops,
|
||||
.decap_align_bytes = 4,
|
||||
.spectral_bin_discard = 0,
|
||||
},
|
||||
{
|
||||
.id = QCA6174_HW_2_1_VERSION,
|
||||
@ -110,6 +112,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
},
|
||||
.hw_ops = &qca988x_ops,
|
||||
.decap_align_bytes = 4,
|
||||
.spectral_bin_discard = 0,
|
||||
},
|
||||
{
|
||||
.id = QCA6174_HW_2_1_VERSION,
|
||||
@ -129,6 +132,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
},
|
||||
.hw_ops = &qca988x_ops,
|
||||
.decap_align_bytes = 4,
|
||||
.spectral_bin_discard = 0,
|
||||
},
|
||||
{
|
||||
.id = QCA6174_HW_3_0_VERSION,
|
||||
@ -148,6 +152,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
},
|
||||
.hw_ops = &qca988x_ops,
|
||||
.decap_align_bytes = 4,
|
||||
.spectral_bin_discard = 0,
|
||||
},
|
||||
{
|
||||
.id = QCA6174_HW_3_2_VERSION,
|
||||
@ -170,6 +175,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
.hw_clk = qca6174_clk,
|
||||
.target_cpu_freq = 176000000,
|
||||
.decap_align_bytes = 4,
|
||||
.spectral_bin_discard = 0,
|
||||
},
|
||||
{
|
||||
.id = QCA99X0_HW_2_0_DEV_VERSION,
|
||||
@ -195,6 +201,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
.sw_decrypt_mcast_mgmt = true,
|
||||
.hw_ops = &qca99x0_ops,
|
||||
.decap_align_bytes = 1,
|
||||
.spectral_bin_discard = 4,
|
||||
},
|
||||
{
|
||||
.id = QCA9984_HW_1_0_DEV_VERSION,
|
||||
@ -221,6 +228,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
.sw_decrypt_mcast_mgmt = true,
|
||||
.hw_ops = &qca99x0_ops,
|
||||
.decap_align_bytes = 1,
|
||||
.spectral_bin_discard = 12,
|
||||
},
|
||||
{
|
||||
.id = QCA9888_HW_2_0_DEV_VERSION,
|
||||
@ -246,6 +254,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
.sw_decrypt_mcast_mgmt = true,
|
||||
.hw_ops = &qca99x0_ops,
|
||||
.decap_align_bytes = 1,
|
||||
.spectral_bin_discard = 12,
|
||||
},
|
||||
{
|
||||
.id = QCA9377_HW_1_0_DEV_VERSION,
|
||||
@ -265,6 +274,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
},
|
||||
.hw_ops = &qca988x_ops,
|
||||
.decap_align_bytes = 4,
|
||||
.spectral_bin_discard = 0,
|
||||
},
|
||||
{
|
||||
.id = QCA9377_HW_1_1_DEV_VERSION,
|
||||
@ -286,6 +296,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
.hw_clk = qca6174_clk,
|
||||
.target_cpu_freq = 176000000,
|
||||
.decap_align_bytes = 4,
|
||||
.spectral_bin_discard = 0,
|
||||
},
|
||||
{
|
||||
.id = QCA4019_HW_1_0_DEV_VERSION,
|
||||
@ -312,6 +323,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
.sw_decrypt_mcast_mgmt = true,
|
||||
.hw_ops = &qca99x0_ops,
|
||||
.decap_align_bytes = 1,
|
||||
.spectral_bin_discard = 4,
|
||||
},
|
||||
};
|
||||
|
||||
@ -1627,6 +1639,13 @@ static void ath10k_core_restart(struct work_struct *work)
|
||||
wake_up(&ar->wmi.tx_credits_wq);
|
||||
wake_up(&ar->peer_mapping_wq);
|
||||
|
||||
/* TODO: We can have one instance of cancelling coverage_class_work by
|
||||
* moving it to ath10k_halt(), so that both stop() and restart() would
|
||||
* call that but it takes conf_mutex() and if we call cancel_work_sync()
|
||||
* with conf_mutex it will deadlock.
|
||||
*/
|
||||
cancel_work_sync(&ar->set_coverage_class_work);
|
||||
|
||||
mutex_lock(&ar->conf_mutex);
|
||||
|
||||
switch (ar->state) {
|
||||
@ -1638,7 +1657,8 @@ static void ath10k_core_restart(struct work_struct *work)
|
||||
break;
|
||||
case ATH10K_STATE_OFF:
|
||||
/* this can happen if driver is being unloaded
|
||||
* or if the crash happens during FW probing */
|
||||
* or if the crash happens during FW probing
|
||||
*/
|
||||
ath10k_warn(ar, "cannot restart a device that hasn't been started\n");
|
||||
break;
|
||||
case ATH10K_STATE_RESTARTING:
|
||||
@ -2166,7 +2186,8 @@ EXPORT_SYMBOL(ath10k_core_stop);
|
||||
/* mac80211 manages fw/hw initialization through start/stop hooks. However in
|
||||
* order to know what hw capabilities should be advertised to mac80211 it is
|
||||
* necessary to load the firmware (and tear it down immediately since start
|
||||
* hook will try to init it again) before registering */
|
||||
* hook will try to init it again) before registering
|
||||
*/
|
||||
static int ath10k_core_probe_fw(struct ath10k *ar)
|
||||
{
|
||||
struct bmi_target_info target_info;
|
||||
@ -2360,7 +2381,8 @@ void ath10k_core_unregister(struct ath10k *ar)
|
||||
|
||||
/* We must unregister from mac80211 before we stop HTC and HIF.
|
||||
* Otherwise we will fail to submit commands to FW and mac80211 will be
|
||||
* unhappy about callback failures. */
|
||||
* unhappy about callback failures.
|
||||
*/
|
||||
ath10k_mac_unregister(ar);
|
||||
|
||||
ath10k_testmode_destroy(ar);
|
||||
|
@ -501,14 +501,16 @@ enum ath10k_state {
|
||||
* stopped in ath10k_core_restart() work holding conf_mutex. The state
|
||||
* RESTARTED means that the device is up and mac80211 has started hw
|
||||
* reconfiguration. Once mac80211 is done with the reconfiguration we
|
||||
* set the state to STATE_ON in reconfig_complete(). */
|
||||
* set the state to STATE_ON in reconfig_complete().
|
||||
*/
|
||||
ATH10K_STATE_RESTARTING,
|
||||
ATH10K_STATE_RESTARTED,
|
||||
|
||||
/* The device has crashed while restarting hw. This state is like ON
|
||||
* but commands are blocked in HTC and -ECOMM response is given. This
|
||||
* prevents completion timeouts and makes the driver more responsive to
|
||||
* userspace commands. This is also prevents recursive recovery. */
|
||||
* userspace commands. This is also prevents recursive recovery.
|
||||
*/
|
||||
ATH10K_STATE_WEDGED,
|
||||
|
||||
/* factory tests */
|
||||
@ -920,7 +922,8 @@ struct ath10k {
|
||||
struct work_struct restart_work;
|
||||
|
||||
/* cycle count is reported twice for each visited channel during scan.
|
||||
* access protected by data_lock */
|
||||
* access protected by data_lock
|
||||
*/
|
||||
u32 survey_last_rx_clear_count;
|
||||
u32 survey_last_cycle_count;
|
||||
struct survey_info survey[ATH10K_NUM_CHANS];
|
||||
|
@ -1816,7 +1816,7 @@ static void ath10k_tpc_stats_fill(struct ath10k *ar,
|
||||
tpc_stats->num_tx_chain,
|
||||
tpc_stats->rate_max);
|
||||
|
||||
for (j = 0; j < tpc_stats->num_tx_chain ; j++) {
|
||||
for (j = 0; j < WMI_TPC_FLAG; j++) {
|
||||
switch (j) {
|
||||
case WMI_TPC_TABLE_TYPE_CDD:
|
||||
if (tpc_stats->flag[j] == ATH10K_TPC_TABLE_TYPE_FLAG) {
|
||||
@ -1982,7 +1982,8 @@ void ath10k_debug_stop(struct ath10k *ar)
|
||||
|
||||
/* Must not use _sync to avoid deadlock, we do that in
|
||||
* ath10k_debug_destroy(). The check for htt_stats_mask is to avoid
|
||||
* warning from del_timer(). */
|
||||
* warning from del_timer().
|
||||
*/
|
||||
if (ar->debug.htt_stats_mask != 0)
|
||||
cancel_delayed_work(&ar->debug.htt_stats_dwork);
|
||||
|
||||
@ -2443,86 +2444,82 @@ int ath10k_debug_register(struct ath10k *ar)
|
||||
init_completion(&ar->debug.tpc_complete);
|
||||
init_completion(&ar->debug.fw_stats_complete);
|
||||
|
||||
debugfs_create_file("fw_stats", S_IRUSR, ar->debug.debugfs_phy, ar,
|
||||
debugfs_create_file("fw_stats", 0400, ar->debug.debugfs_phy, ar,
|
||||
&fops_fw_stats);
|
||||
|
||||
debugfs_create_file("fw_reset_stats", S_IRUSR, ar->debug.debugfs_phy,
|
||||
ar, &fops_fw_reset_stats);
|
||||
debugfs_create_file("fw_reset_stats", 0400, ar->debug.debugfs_phy, ar,
|
||||
&fops_fw_reset_stats);
|
||||
|
||||
debugfs_create_file("wmi_services", S_IRUSR, ar->debug.debugfs_phy, ar,
|
||||
debugfs_create_file("wmi_services", 0400, ar->debug.debugfs_phy, ar,
|
||||
&fops_wmi_services);
|
||||
|
||||
debugfs_create_file("simulate_fw_crash", S_IRUSR | S_IWUSR,
|
||||
ar->debug.debugfs_phy, ar, &fops_simulate_fw_crash);
|
||||
debugfs_create_file("simulate_fw_crash", 0600, ar->debug.debugfs_phy, ar,
|
||||
&fops_simulate_fw_crash);
|
||||
|
||||
debugfs_create_file("fw_crash_dump", S_IRUSR, ar->debug.debugfs_phy,
|
||||
ar, &fops_fw_crash_dump);
|
||||
debugfs_create_file("fw_crash_dump", 0400, ar->debug.debugfs_phy, ar,
|
||||
&fops_fw_crash_dump);
|
||||
|
||||
debugfs_create_file("reg_addr", S_IRUSR | S_IWUSR,
|
||||
ar->debug.debugfs_phy, ar, &fops_reg_addr);
|
||||
debugfs_create_file("reg_addr", 0600, ar->debug.debugfs_phy, ar,
|
||||
&fops_reg_addr);
|
||||
|
||||
debugfs_create_file("reg_value", S_IRUSR | S_IWUSR,
|
||||
ar->debug.debugfs_phy, ar, &fops_reg_value);
|
||||
debugfs_create_file("reg_value", 0600, ar->debug.debugfs_phy, ar,
|
||||
&fops_reg_value);
|
||||
|
||||
debugfs_create_file("mem_value", S_IRUSR | S_IWUSR,
|
||||
ar->debug.debugfs_phy, ar, &fops_mem_value);
|
||||
debugfs_create_file("mem_value", 0600, ar->debug.debugfs_phy, ar,
|
||||
&fops_mem_value);
|
||||
|
||||
debugfs_create_file("chip_id", S_IRUSR, ar->debug.debugfs_phy,
|
||||
ar, &fops_chip_id);
|
||||
debugfs_create_file("chip_id", 0400, ar->debug.debugfs_phy, ar,
|
||||
&fops_chip_id);
|
||||
|
||||
debugfs_create_file("htt_stats_mask", S_IRUSR | S_IWUSR,
|
||||
ar->debug.debugfs_phy, ar, &fops_htt_stats_mask);
|
||||
debugfs_create_file("htt_stats_mask", 0600, ar->debug.debugfs_phy, ar,
|
||||
&fops_htt_stats_mask);
|
||||
|
||||
debugfs_create_file("htt_max_amsdu_ampdu", S_IRUSR | S_IWUSR,
|
||||
ar->debug.debugfs_phy, ar,
|
||||
debugfs_create_file("htt_max_amsdu_ampdu", 0600, ar->debug.debugfs_phy, ar,
|
||||
&fops_htt_max_amsdu_ampdu);
|
||||
|
||||
debugfs_create_file("fw_dbglog", S_IRUSR | S_IWUSR,
|
||||
ar->debug.debugfs_phy, ar, &fops_fw_dbglog);
|
||||
debugfs_create_file("fw_dbglog", 0600, ar->debug.debugfs_phy, ar,
|
||||
&fops_fw_dbglog);
|
||||
|
||||
debugfs_create_file("cal_data", S_IRUSR, ar->debug.debugfs_phy,
|
||||
ar, &fops_cal_data);
|
||||
debugfs_create_file("cal_data", 0400, ar->debug.debugfs_phy, ar,
|
||||
&fops_cal_data);
|
||||
|
||||
debugfs_create_file("ani_enable", S_IRUSR | S_IWUSR,
|
||||
ar->debug.debugfs_phy, ar, &fops_ani_enable);
|
||||
debugfs_create_file("ani_enable", 0600, ar->debug.debugfs_phy, ar,
|
||||
&fops_ani_enable);
|
||||
|
||||
debugfs_create_file("nf_cal_period", S_IRUSR | S_IWUSR,
|
||||
ar->debug.debugfs_phy, ar, &fops_nf_cal_period);
|
||||
debugfs_create_file("nf_cal_period", 0600, ar->debug.debugfs_phy, ar,
|
||||
&fops_nf_cal_period);
|
||||
|
||||
if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED)) {
|
||||
debugfs_create_file("dfs_simulate_radar", S_IWUSR,
|
||||
ar->debug.debugfs_phy, ar,
|
||||
&fops_simulate_radar);
|
||||
debugfs_create_file("dfs_simulate_radar", 0200, ar->debug.debugfs_phy,
|
||||
ar, &fops_simulate_radar);
|
||||
|
||||
debugfs_create_bool("dfs_block_radar_events", S_IWUSR,
|
||||
debugfs_create_bool("dfs_block_radar_events", 0200,
|
||||
ar->debug.debugfs_phy,
|
||||
&ar->dfs_block_radar_events);
|
||||
|
||||
debugfs_create_file("dfs_stats", S_IRUSR,
|
||||
ar->debug.debugfs_phy, ar,
|
||||
debugfs_create_file("dfs_stats", 0400, ar->debug.debugfs_phy, ar,
|
||||
&fops_dfs_stats);
|
||||
}
|
||||
|
||||
debugfs_create_file("pktlog_filter", S_IRUGO | S_IWUSR,
|
||||
ar->debug.debugfs_phy, ar, &fops_pktlog_filter);
|
||||
debugfs_create_file("pktlog_filter", 0644, ar->debug.debugfs_phy, ar,
|
||||
&fops_pktlog_filter);
|
||||
|
||||
debugfs_create_file("quiet_period", S_IRUGO | S_IWUSR,
|
||||
ar->debug.debugfs_phy, ar, &fops_quiet_period);
|
||||
debugfs_create_file("quiet_period", 0644, ar->debug.debugfs_phy, ar,
|
||||
&fops_quiet_period);
|
||||
|
||||
debugfs_create_file("tpc_stats", S_IRUSR,
|
||||
ar->debug.debugfs_phy, ar, &fops_tpc_stats);
|
||||
debugfs_create_file("tpc_stats", 0400, ar->debug.debugfs_phy, ar,
|
||||
&fops_tpc_stats);
|
||||
|
||||
if (test_bit(WMI_SERVICE_COEX_GPIO, ar->wmi.svc_map))
|
||||
debugfs_create_file("btcoex", S_IRUGO | S_IWUSR,
|
||||
ar->debug.debugfs_phy, ar, &fops_btcoex);
|
||||
debugfs_create_file("btcoex", 0644, ar->debug.debugfs_phy, ar,
|
||||
&fops_btcoex);
|
||||
|
||||
if (test_bit(WMI_SERVICE_PEER_STATS, ar->wmi.svc_map))
|
||||
debugfs_create_file("peer_stats", S_IRUGO | S_IWUSR,
|
||||
ar->debug.debugfs_phy, ar,
|
||||
debugfs_create_file("peer_stats", 0644, ar->debug.debugfs_phy, ar,
|
||||
&fops_peer_stats);
|
||||
|
||||
debugfs_create_file("fw_checksums", S_IRUSR,
|
||||
ar->debug.debugfs_phy, ar, &fops_fw_checksums);
|
||||
debugfs_create_file("fw_checksums", 0400, ar->debug.debugfs_phy, ar,
|
||||
&fops_fw_checksums);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -372,11 +372,10 @@ static const struct file_operations fops_peer_debug_trigger = {
|
||||
void ath10k_sta_add_debugfs(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta, struct dentry *dir)
|
||||
{
|
||||
debugfs_create_file("aggr_mode", S_IRUGO | S_IWUSR, dir, sta,
|
||||
&fops_aggr_mode);
|
||||
debugfs_create_file("addba", S_IWUSR, dir, sta, &fops_addba);
|
||||
debugfs_create_file("addba_resp", S_IWUSR, dir, sta, &fops_addba_resp);
|
||||
debugfs_create_file("delba", S_IWUSR, dir, sta, &fops_delba);
|
||||
debugfs_create_file("aggr_mode", 0644, dir, sta, &fops_aggr_mode);
|
||||
debugfs_create_file("addba", 0200, dir, sta, &fops_addba);
|
||||
debugfs_create_file("addba_resp", 0200, dir, sta, &fops_addba_resp);
|
||||
debugfs_create_file("delba", 0200, dir, sta, &fops_delba);
|
||||
debugfs_create_file("peer_debug_trigger", 0600, dir, sta,
|
||||
&fops_peer_debug_trigger);
|
||||
}
|
||||
|
@ -54,7 +54,8 @@ struct ath10k_hif_ops {
|
||||
int (*start)(struct ath10k *ar);
|
||||
|
||||
/* Clean up what start() did. This does not revert to BMI phase. If
|
||||
* desired so, call power_down() and power_up() */
|
||||
* desired so, call power_down() and power_up()
|
||||
*/
|
||||
void (*stop)(struct ath10k *ar);
|
||||
|
||||
int (*map_service_to_pipe)(struct ath10k *ar, u16 service_id,
|
||||
@ -82,7 +83,8 @@ struct ath10k_hif_ops {
|
||||
int (*power_up)(struct ath10k *ar);
|
||||
|
||||
/* Power down the device and free up resources. stop() must be called
|
||||
* before this if start() was called earlier */
|
||||
* before this if start() was called earlier
|
||||
*/
|
||||
void (*power_down)(struct ath10k *ar);
|
||||
|
||||
int (*suspend)(struct ath10k *ar);
|
||||
|
@ -119,6 +119,9 @@ int ath10k_htc_send(struct ath10k_htc *htc,
|
||||
credits = DIV_ROUND_UP(skb->len, htc->target_credit_size);
|
||||
spin_lock_bh(&htc->tx_lock);
|
||||
if (ep->tx_credits < credits) {
|
||||
ath10k_dbg(ar, ATH10K_DBG_HTC,
|
||||
"htc insufficient credits ep %d required %d available %d\n",
|
||||
eid, credits, ep->tx_credits);
|
||||
spin_unlock_bh(&htc->tx_lock);
|
||||
ret = -EAGAIN;
|
||||
goto err_pull;
|
||||
@ -419,7 +422,8 @@ static void ath10k_htc_control_rx_complete(struct ath10k *ar,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
/* This is unexpected. FW is not supposed to send regular rx on this
|
||||
* endpoint. */
|
||||
* endpoint.
|
||||
*/
|
||||
ath10k_warn(ar, "unexpected htc rx\n");
|
||||
kfree_skb(skb);
|
||||
}
|
||||
|
@ -51,7 +51,8 @@ enum htt_h2t_msg_type { /* host-to-target */
|
||||
HTT_H2T_MSG_TYPE_FRAG_DESC_BANK_CFG = 6,
|
||||
|
||||
/* This command is used for sending management frames in HTT < 3.0.
|
||||
* HTT >= 3.0 uses TX_FRM for everything. */
|
||||
* HTT >= 3.0 uses TX_FRM for everything.
|
||||
*/
|
||||
HTT_H2T_MSG_TYPE_MGMT_TX = 7,
|
||||
HTT_H2T_MSG_TYPE_TX_FETCH_RESP = 11,
|
||||
|
||||
@ -910,7 +911,8 @@ struct htt_rx_test {
|
||||
|
||||
/* payload consists of 2 lists:
|
||||
* a) num_ints * sizeof(__le32)
|
||||
* b) num_chars * sizeof(u8) aligned to 4bytes */
|
||||
* b) num_chars * sizeof(u8) aligned to 4bytes
|
||||
*/
|
||||
u8 payload[0];
|
||||
} __packed;
|
||||
|
||||
@ -1307,7 +1309,8 @@ struct htt_frag_desc_bank_id {
|
||||
} __packed;
|
||||
|
||||
/* real is 16 but it wouldn't fit in the max htt message size
|
||||
* so we use a conservatively safe value for now */
|
||||
* so we use a conservatively safe value for now
|
||||
*/
|
||||
#define HTT_FRAG_DESC_BANK_MAX 4
|
||||
|
||||
#define HTT_FRAG_DESC_BANK_CFG_INFO_PDEV_ID_MASK 0x03
|
||||
@ -1684,12 +1687,14 @@ struct ath10k_htt {
|
||||
DECLARE_KFIFO_PTR(txdone_fifo, struct htt_tx_done);
|
||||
|
||||
/* set if host-fw communication goes haywire
|
||||
* used to avoid further failures */
|
||||
* used to avoid further failures
|
||||
*/
|
||||
bool rx_confused;
|
||||
atomic_t num_mpdus_ready;
|
||||
|
||||
/* This is used to group tx/rx completions separately and process them
|
||||
* in batches to reduce cache stalls */
|
||||
* in batches to reduce cache stalls
|
||||
*/
|
||||
struct sk_buff_head rx_compl_q;
|
||||
struct sk_buff_head rx_in_ord_compl_q;
|
||||
struct sk_buff_head tx_fetch_ind_q;
|
||||
@ -1725,11 +1730,13 @@ struct ath10k_htt {
|
||||
|
||||
/* This structure layout is programmed via rx ring setup
|
||||
* so that FW knows how to transfer the rx descriptor to the host.
|
||||
* Buffers like this are placed on the rx ring. */
|
||||
* Buffers like this are placed on the rx ring.
|
||||
*/
|
||||
struct htt_rx_desc {
|
||||
union {
|
||||
/* This field is filled on the host using the msdu buffer
|
||||
* from htt_rx_indication */
|
||||
* from htt_rx_indication
|
||||
*/
|
||||
struct fw_rx_desc_base fw_desc;
|
||||
u32 pad;
|
||||
} __packed;
|
||||
@ -1760,7 +1767,8 @@ struct htt_rx_desc {
|
||||
#define HTT_RX_MSDU_SIZE (HTT_RX_BUF_SIZE - (int)sizeof(struct htt_rx_desc))
|
||||
|
||||
/* Refill a bunch of RX buffers for each refill round so that FW/HW can handle
|
||||
* aggregated traffic more nicely. */
|
||||
* aggregated traffic more nicely.
|
||||
*/
|
||||
#define ATH10K_HTT_MAX_NUM_REFILL 100
|
||||
|
||||
/*
|
||||
|
@ -177,7 +177,8 @@ static void ath10k_htt_rx_msdu_buff_replenish(struct ath10k_htt *htt)
|
||||
* automatically balances load wrt to CPU power.
|
||||
*
|
||||
* This probably comes at a cost of lower maximum throughput but
|
||||
* improves the average and stability. */
|
||||
* improves the average and stability.
|
||||
*/
|
||||
spin_lock_bh(&htt->rx_ring.lock);
|
||||
num_deficit = htt->rx_ring.fill_level - htt->rx_ring.fill_cnt;
|
||||
num_to_fill = min(ATH10K_HTT_MAX_NUM_REFILL, num_deficit);
|
||||
@ -304,7 +305,8 @@ static int ath10k_htt_rx_amsdu_pop(struct ath10k_htt *htt,
|
||||
rx_desc = (struct htt_rx_desc *)msdu->data;
|
||||
|
||||
/* FIXME: we must report msdu payload since this is what caller
|
||||
* expects now */
|
||||
* expects now
|
||||
*/
|
||||
skb_put(msdu, offsetof(struct htt_rx_desc, msdu_payload));
|
||||
skb_pull(msdu, offsetof(struct htt_rx_desc, msdu_payload));
|
||||
|
||||
@ -639,7 +641,8 @@ static void ath10k_htt_rx_h_rates(struct ath10k *ar,
|
||||
case HTT_RX_VHT:
|
||||
case HTT_RX_VHT_WITH_TXBF:
|
||||
/* VHT-SIG-A1 in info2, VHT-SIG-A2 in info3
|
||||
TODO check this */
|
||||
* TODO check this
|
||||
*/
|
||||
bw = info2 & 3;
|
||||
sgi = info3 & 1;
|
||||
group_id = (info2 >> 4) & 0x3F;
|
||||
|
@ -526,7 +526,8 @@ int ath10k_htt_h2t_stats_req(struct ath10k_htt *htt, u8 mask, u64 cookie)
|
||||
memset(req, 0, sizeof(*req));
|
||||
|
||||
/* currently we support only max 8 bit masks so no need to worry
|
||||
* about endian support */
|
||||
* about endian support
|
||||
*/
|
||||
req->upload_types[0] = mask;
|
||||
req->reset_types[0] = mask;
|
||||
req->stat_type = HTT_STATS_REQ_CFG_STAT_TYPE_INVALID;
|
||||
@ -1008,7 +1009,8 @@ int ath10k_htt_tx(struct ath10k_htt *htt, enum ath10k_hw_txrx_mode txmode,
|
||||
* There is simply no point in pushing HTT TX_FRM through HTC tx path
|
||||
* as it's a waste of resources. By bypassing HTC it is possible to
|
||||
* avoid extra memory allocations, compress data structures and thus
|
||||
* improve performance. */
|
||||
* improve performance.
|
||||
*/
|
||||
|
||||
txbuf->htc_hdr.eid = htt->eid;
|
||||
txbuf->htc_hdr.len = __cpu_to_le16(sizeof(txbuf->cmd_hdr) +
|
||||
|
@ -129,7 +129,7 @@ enum qca9377_chip_id_rev {
|
||||
#define QCA4019_HW_1_0_PATCH_LOAD_ADDR 0x1234
|
||||
|
||||
#define ATH10K_FW_FILE_BASE "firmware"
|
||||
#define ATH10K_FW_API_MAX 5
|
||||
#define ATH10K_FW_API_MAX 6
|
||||
#define ATH10K_FW_API_MIN 2
|
||||
|
||||
#define ATH10K_FW_API2_FILE "firmware-2.bin"
|
||||
@ -141,6 +141,9 @@ enum qca9377_chip_id_rev {
|
||||
/* HTT id conflict fix for management frames over HTT */
|
||||
#define ATH10K_FW_API5_FILE "firmware-5.bin"
|
||||
|
||||
/* the firmware-6.bin blob */
|
||||
#define ATH10K_FW_API6_FILE "firmware-6.bin"
|
||||
|
||||
#define ATH10K_FW_UTF_FILE "utf.bin"
|
||||
#define ATH10K_FW_UTF_API2_FILE "utf-2.bin"
|
||||
|
||||
@ -296,7 +299,8 @@ void ath10k_hw_fill_survey_time(struct ath10k *ar, struct survey_info *survey,
|
||||
* - raw appears in nwifi decap, raw and nwifi appear in ethernet decap
|
||||
* - raw have FCS, nwifi doesn't
|
||||
* - ethernet frames have 802.11 header decapped and parts (base hdr, cipher
|
||||
* param, llc/snap) are aligned to 4byte boundaries each */
|
||||
* param, llc/snap) are aligned to 4byte boundaries each
|
||||
*/
|
||||
enum ath10k_hw_txrx_mode {
|
||||
ATH10K_HW_TXRX_RAW = 0,
|
||||
|
||||
@ -447,6 +451,9 @@ struct ath10k_hw_params {
|
||||
/* hw specific clock control parameters */
|
||||
const struct ath10k_hw_clk_params *hw_clk;
|
||||
int target_cpu_freq;
|
||||
|
||||
/* Number of bytes to be discarded for each FFT sample */
|
||||
int spectral_bin_discard;
|
||||
};
|
||||
|
||||
struct htt_rx_desc;
|
||||
|
@ -457,7 +457,8 @@ static int ath10k_clear_vdev_key(struct ath10k_vif *arvif,
|
||||
|
||||
for (;;) {
|
||||
/* since ath10k_install_key we can't hold data_lock all the
|
||||
* time, so we try to remove the keys incrementally */
|
||||
* time, so we try to remove the keys incrementally
|
||||
*/
|
||||
spin_lock_bh(&ar->data_lock);
|
||||
i = 0;
|
||||
list_for_each_entry(peer, &ar->peers, list) {
|
||||
@ -609,7 +610,8 @@ static u8 ath10k_parse_mpdudensity(u8 mpdudensity)
|
||||
case 2:
|
||||
case 3:
|
||||
/* Our lower layer calculations limit our precision to
|
||||
1 microsecond */
|
||||
* 1 microsecond
|
||||
*/
|
||||
return 1;
|
||||
case 4:
|
||||
return 2;
|
||||
@ -978,7 +980,8 @@ static int ath10k_monitor_vdev_start(struct ath10k *ar, int vdev_id)
|
||||
arg.channel.band_center_freq2 = chandef->center_freq2;
|
||||
|
||||
/* TODO setup this dynamically, what in case we
|
||||
don't have any vifs? */
|
||||
* don't have any vifs?
|
||||
*/
|
||||
arg.channel.mode = chan_to_phymode(chandef);
|
||||
arg.channel.chan_radar =
|
||||
!!(channel->flags & IEEE80211_CHAN_RADAR);
|
||||
@ -2373,9 +2376,10 @@ static int ath10k_peer_assoc_qos_ap(struct ath10k *ar,
|
||||
}
|
||||
|
||||
/* TODO setup this based on STA listen interval and
|
||||
beacon interval. Currently we don't know
|
||||
sta->listen_interval - mac80211 patch required.
|
||||
Currently use 10 seconds */
|
||||
* beacon interval. Currently we don't know
|
||||
* sta->listen_interval - mac80211 patch required.
|
||||
* Currently use 10 seconds
|
||||
*/
|
||||
ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, sta->addr,
|
||||
WMI_AP_PS_PEER_PARAM_AGEOUT_TIME,
|
||||
10);
|
||||
@ -2451,6 +2455,8 @@ static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
|
||||
enum nl80211_band band;
|
||||
const u16 *vht_mcs_mask;
|
||||
u8 ampdu_factor;
|
||||
u8 max_nss, vht_mcs;
|
||||
int i;
|
||||
|
||||
if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
|
||||
return;
|
||||
@ -2478,7 +2484,8 @@ static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
|
||||
/* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
|
||||
* zero in VHT IE. Using it would result in degraded throughput.
|
||||
* arg->peer_max_mpdu at this point contains HT max_mpdu so keep
|
||||
* it if VHT max_mpdu is smaller. */
|
||||
* it if VHT max_mpdu is smaller.
|
||||
*/
|
||||
arg->peer_max_mpdu = max(arg->peer_max_mpdu,
|
||||
(1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
|
||||
ampdu_factor)) - 1);
|
||||
@ -2489,6 +2496,18 @@ static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
|
||||
if (sta->bandwidth == IEEE80211_STA_RX_BW_160)
|
||||
arg->peer_flags |= ar->wmi.peer_flags->bw160;
|
||||
|
||||
/* Calculate peer NSS capability from VHT capabilities if STA
|
||||
* supports VHT.
|
||||
*/
|
||||
for (i = 0, max_nss = 0, vht_mcs = 0; i < NL80211_VHT_NSS_MAX; i++) {
|
||||
vht_mcs = __le16_to_cpu(vht_cap->vht_mcs.rx_mcs_map) >>
|
||||
(2 * i) & 3;
|
||||
|
||||
if ((vht_mcs != IEEE80211_VHT_MCS_NOT_SUPPORTED) &&
|
||||
vht_mcs_mask[i])
|
||||
max_nss = i + 1;
|
||||
}
|
||||
arg->peer_num_spatial_streams = min(sta->rx_nss, max_nss);
|
||||
arg->peer_vht_rates.rx_max_rate =
|
||||
__le16_to_cpu(vht_cap->vht_mcs.rx_highest);
|
||||
arg->peer_vht_rates.rx_mcs_set =
|
||||
@ -2779,7 +2798,8 @@ static void ath10k_bss_assoc(struct ieee80211_hw *hw,
|
||||
}
|
||||
|
||||
/* ap_sta must be accessed only within rcu section which must be left
|
||||
* before calling ath10k_setup_peer_smps() which might sleep. */
|
||||
* before calling ath10k_setup_peer_smps() which might sleep.
|
||||
*/
|
||||
ht_cap = ap_sta->ht_cap;
|
||||
vht_cap = ap_sta->vht_cap;
|
||||
|
||||
@ -3050,7 +3070,8 @@ static int ath10k_update_channel_list(struct ath10k *ar)
|
||||
|
||||
/* FIXME: why use only legacy modes, why not any
|
||||
* HT/VHT modes? Would that even make any
|
||||
* difference? */
|
||||
* difference?
|
||||
*/
|
||||
if (channel->band == NL80211_BAND_2GHZ)
|
||||
ch->mode = MODE_11G;
|
||||
else
|
||||
@ -3114,7 +3135,8 @@ static void ath10k_regd_update(struct ath10k *ar)
|
||||
}
|
||||
|
||||
/* Target allows setting up per-band regdomain but ath_common provides
|
||||
* a combined one only */
|
||||
* a combined one only
|
||||
*/
|
||||
ret = ath10k_wmi_pdev_set_regdomain(ar,
|
||||
regpair->reg_domain,
|
||||
regpair->reg_domain, /* 2ghz */
|
||||
@ -3663,7 +3685,8 @@ void ath10k_offchan_tx_work(struct work_struct *work)
|
||||
* never transmitted. We delete the peer upon tx completion.
|
||||
* It is unlikely that a peer for offchannel tx will already be
|
||||
* present. However it may be in some rare cases so account for that.
|
||||
* Otherwise we might remove a legitimate peer and break stuff. */
|
||||
* Otherwise we might remove a legitimate peer and break stuff.
|
||||
*/
|
||||
|
||||
for (;;) {
|
||||
skb = skb_dequeue(&ar->offchan_tx_queue);
|
||||
@ -4703,6 +4726,7 @@ static void ath10k_stop(struct ieee80211_hw *hw)
|
||||
}
|
||||
mutex_unlock(&ar->conf_mutex);
|
||||
|
||||
cancel_work_sync(&ar->set_coverage_class_work);
|
||||
cancel_delayed_work_sync(&ar->scan.timeout);
|
||||
cancel_work_sync(&ar->restart_work);
|
||||
}
|
||||
@ -5702,7 +5726,8 @@ static int ath10k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
||||
}
|
||||
|
||||
/* the peer should not disappear in mid-way (unless FW goes awry) since
|
||||
* we already hold conf_mutex. we just make sure its there now. */
|
||||
* we already hold conf_mutex. we just make sure its there now.
|
||||
*/
|
||||
spin_lock_bh(&ar->data_lock);
|
||||
peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
|
||||
spin_unlock_bh(&ar->data_lock);
|
||||
@ -5714,8 +5739,7 @@ static int ath10k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
||||
ret = -EOPNOTSUPP;
|
||||
goto exit;
|
||||
} else {
|
||||
/* if the peer doesn't exist there is no key to disable
|
||||
* anymore */
|
||||
/* if the peer doesn't exist there is no key to disable anymore */
|
||||
goto exit;
|
||||
}
|
||||
}
|
||||
@ -6574,7 +6598,8 @@ static void ath10k_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
long time_left;
|
||||
|
||||
/* mac80211 doesn't care if we really xmit queued frames or not
|
||||
* we'll collect those frames either way if we stop/delete vdevs */
|
||||
* we'll collect those frames either way if we stop/delete vdevs
|
||||
*/
|
||||
if (drop)
|
||||
return;
|
||||
|
||||
@ -6625,7 +6650,8 @@ static void ath10k_reconfig_complete(struct ieee80211_hw *hw,
|
||||
mutex_lock(&ar->conf_mutex);
|
||||
|
||||
/* If device failed to restart it will be in a different state, e.g.
|
||||
* ATH10K_STATE_WEDGED */
|
||||
* ATH10K_STATE_WEDGED
|
||||
*/
|
||||
if (ar->state == ATH10K_STATE_RESTARTED) {
|
||||
ath10k_info(ar, "device successfully recovered\n");
|
||||
ar->state = ATH10K_STATE_ON;
|
||||
|
@ -720,14 +720,16 @@ void ath10k_pci_disable_and_clear_legacy_irq(struct ath10k *ar)
|
||||
{
|
||||
/* IMPORTANT: INTR_CLR register has to be set after
|
||||
* INTR_ENABLE is set to 0, otherwise interrupt can not be
|
||||
* really cleared. */
|
||||
* really cleared.
|
||||
*/
|
||||
ath10k_pci_write32(ar, SOC_CORE_BASE_ADDRESS + PCIE_INTR_ENABLE_ADDRESS,
|
||||
0);
|
||||
ath10k_pci_write32(ar, SOC_CORE_BASE_ADDRESS + PCIE_INTR_CLR_ADDRESS,
|
||||
PCIE_INTR_FIRMWARE_MASK | PCIE_INTR_CE_MASK_ALL);
|
||||
|
||||
/* IMPORTANT: this extra read transaction is required to
|
||||
* flush the posted write buffer. */
|
||||
* flush the posted write buffer.
|
||||
*/
|
||||
(void)ath10k_pci_read32(ar, SOC_CORE_BASE_ADDRESS +
|
||||
PCIE_INTR_ENABLE_ADDRESS);
|
||||
}
|
||||
@ -739,7 +741,8 @@ void ath10k_pci_enable_legacy_irq(struct ath10k *ar)
|
||||
PCIE_INTR_FIRMWARE_MASK | PCIE_INTR_CE_MASK_ALL);
|
||||
|
||||
/* IMPORTANT: this extra read transaction is required to
|
||||
* flush the posted write buffer. */
|
||||
* flush the posted write buffer.
|
||||
*/
|
||||
(void)ath10k_pci_read32(ar, SOC_CORE_BASE_ADDRESS +
|
||||
PCIE_INTR_ENABLE_ADDRESS);
|
||||
}
|
||||
@ -2908,7 +2911,8 @@ static int ath10k_pci_init_irq(struct ath10k *ar)
|
||||
* host won't know when target writes BAR to CORE_CTRL.
|
||||
* This write might get lost if target has NOT written BAR.
|
||||
* For now, fix the race by repeating the write in below
|
||||
* synchronization checking. */
|
||||
* synchronization checking.
|
||||
*/
|
||||
ar_pci->oper_irq_mode = ATH10K_PCI_IRQ_LEGACY;
|
||||
|
||||
ath10k_pci_write32(ar, SOC_CORE_BASE_ADDRESS + PCIE_INTR_ENABLE_ADDRESS,
|
||||
@ -3424,6 +3428,7 @@ MODULE_FIRMWARE(QCA6174_HW_2_1_FW_DIR "/" ATH10K_BOARD_API2_FILE);
|
||||
/* QCA6174 3.1 firmware files */
|
||||
MODULE_FIRMWARE(QCA6174_HW_3_0_FW_DIR "/" ATH10K_FW_API4_FILE);
|
||||
MODULE_FIRMWARE(QCA6174_HW_3_0_FW_DIR "/" ATH10K_FW_API5_FILE);
|
||||
MODULE_FIRMWARE(QCA6174_HW_3_0_FW_DIR "/" ATH10K_FW_API6_FILE);
|
||||
MODULE_FIRMWARE(QCA6174_HW_3_0_FW_DIR "/" QCA6174_HW_3_0_BOARD_DATA_FILE);
|
||||
MODULE_FIRMWARE(QCA6174_HW_3_0_FW_DIR "/" ATH10K_BOARD_API2_FILE);
|
||||
|
||||
|
@ -439,19 +439,22 @@ struct rx_mpdu_end {
|
||||
* c) A-MSDU subframe header (14 bytes) if appliable
|
||||
* d) LLC/SNAP (RFC1042, 8 bytes)
|
||||
*
|
||||
* In case of A-MSDU only first frame in sequence contains (a) and (b). */
|
||||
* In case of A-MSDU only first frame in sequence contains (a) and (b).
|
||||
*/
|
||||
enum rx_msdu_decap_format {
|
||||
RX_MSDU_DECAP_RAW = 0,
|
||||
|
||||
/* Note: QoS frames are reported as non-QoS. The rx_hdr_status in
|
||||
* htt_rx_desc contains the original decapped 802.11 header. */
|
||||
* htt_rx_desc contains the original decapped 802.11 header.
|
||||
*/
|
||||
RX_MSDU_DECAP_NATIVE_WIFI = 1,
|
||||
|
||||
/* Payload contains an ethernet header (struct ethhdr). */
|
||||
RX_MSDU_DECAP_ETHERNET2_DIX = 2,
|
||||
|
||||
/* Payload contains two 48-bit addresses and 2-byte length (14 bytes
|
||||
* total), followed by an RFC1042 header (8 bytes). */
|
||||
* total), followed by an RFC1042 header (8 bytes).
|
||||
*/
|
||||
RX_MSDU_DECAP_8023_SNAP_LLC = 3
|
||||
};
|
||||
|
||||
@ -867,7 +870,7 @@ struct rx_ppdu_start {
|
||||
*
|
||||
* reserved_9
|
||||
* Reserved: HW should fill with 0, FW should ignore.
|
||||
*/
|
||||
*/
|
||||
|
||||
#define RX_PPDU_END_FLAGS_PHY_ERR (1 << 0)
|
||||
#define RX_PPDU_END_FLAGS_RX_LOCATION (1 << 1)
|
||||
@ -1207,7 +1210,7 @@ struct rx_ppdu_end {
|
||||
* Every time HW sets this bit in memory FW/SW must clear this
|
||||
* bit in memory. FW will initialize all the ppdu_done dword
|
||||
* to 0.
|
||||
*/
|
||||
*/
|
||||
|
||||
#define FW_RX_DESC_INFO0_DISCARD (1 << 0)
|
||||
#define FW_RX_DESC_INFO0_FORWARD (1 << 1)
|
||||
|
@ -56,6 +56,21 @@ static uint8_t get_max_exp(s8 max_index, u16 max_magnitude, size_t bin_len,
|
||||
return max_exp;
|
||||
}
|
||||
|
||||
static inline size_t ath10k_spectral_fix_bin_size(struct ath10k *ar,
|
||||
size_t bin_len)
|
||||
{
|
||||
/* some chipsets reports bin size as 2^n bytes + 'm' bytes in
|
||||
* report mode 2. First 2^n bytes carries inband tones and last
|
||||
* 'm' bytes carries band edge detection data mainly used in
|
||||
* radar detection purpose. Strip last 'm' bytes to make bin size
|
||||
* as a valid one. 'm' can take possible values of 4, 12.
|
||||
*/
|
||||
if (!is_power_of_2(bin_len))
|
||||
bin_len -= ar->hw_params.spectral_bin_discard;
|
||||
|
||||
return bin_len;
|
||||
}
|
||||
|
||||
int ath10k_spectral_process_fft(struct ath10k *ar,
|
||||
struct wmi_phyerr_ev_arg *phyerr,
|
||||
const struct phyerr_fft_report *fftr,
|
||||
@ -70,18 +85,11 @@ int ath10k_spectral_process_fft(struct ath10k *ar,
|
||||
|
||||
fft_sample = (struct fft_sample_ath10k *)&buf;
|
||||
|
||||
bin_len = ath10k_spectral_fix_bin_size(ar, bin_len);
|
||||
|
||||
if (bin_len < 64 || bin_len > SPECTRAL_ATH10K_MAX_NUM_BINS)
|
||||
return -EINVAL;
|
||||
|
||||
/* qca99x0 reports bin size as 68 bytes (64 bytes + 4 bytes) in
|
||||
* report mode 2. First 64 bytes carries inband tones (-32 to +31)
|
||||
* and last 4 byte carries band edge detection data (+32) mainly
|
||||
* used in radar detection purpose. Strip last 4 byte to make bin
|
||||
* size is valid one.
|
||||
*/
|
||||
if (bin_len == 68)
|
||||
bin_len -= 4;
|
||||
|
||||
reg0 = __le32_to_cpu(fftr->reg0);
|
||||
reg1 = __le32_to_cpu(fftr->reg1);
|
||||
|
||||
@ -536,15 +544,15 @@ int ath10k_spectral_create(struct ath10k *ar)
|
||||
1140, 2500,
|
||||
&rfs_spec_scan_cb, NULL);
|
||||
debugfs_create_file("spectral_scan_ctl",
|
||||
S_IRUSR | S_IWUSR,
|
||||
0600,
|
||||
ar->debug.debugfs_phy, ar,
|
||||
&fops_spec_scan_ctl);
|
||||
debugfs_create_file("spectral_count",
|
||||
S_IRUSR | S_IWUSR,
|
||||
0600,
|
||||
ar->debug.debugfs_phy, ar,
|
||||
&fops_spectral_count);
|
||||
debugfs_create_file("spectral_bins",
|
||||
S_IRUSR | S_IWUSR,
|
||||
0600,
|
||||
ar->debug.debugfs_phy, ar,
|
||||
&fops_spectral_bins);
|
||||
|
||||
|
@ -268,13 +268,13 @@ struct host_interest {
|
||||
#define HI_OPTION_FW_BRIDGE_SHIFT 0x04
|
||||
|
||||
/*
|
||||
Fw Mode/SubMode Mask
|
||||
|-----------------------------------------------------------------------------|
|
||||
| SUB | SUB | SUB | SUB | | | | |
|
||||
|MODE[3] | MODE[2] | MODE[1] | MODE[0] | MODE[3] | MODE[2] | MODE[1] | MODE[0]|
|
||||
| (2) | (2) | (2) | (2) | (2) | (2) | (2) | (2) |
|
||||
|-----------------------------------------------------------------------------|
|
||||
*/
|
||||
* Fw Mode/SubMode Mask
|
||||
*-----------------------------------------------------------------------------
|
||||
* SUB | SUB | SUB | SUB | | | |
|
||||
*MODE[3] | MODE[2] | MODE[1] | MODE[0] | MODE[3] | MODE[2] | MODE[1] | MODE[0]
|
||||
* (2) | (2) | (2) | (2) | (2) | (2) | (2) | (2)
|
||||
*-----------------------------------------------------------------------------
|
||||
*/
|
||||
#define HI_OPTION_FW_MODE_BITS 0x2
|
||||
#define HI_OPTION_FW_MODE_MASK 0x3
|
||||
#define HI_OPTION_FW_MODE_SHIFT 0xC
|
||||
@ -428,8 +428,9 @@ Fw Mode/SubMode Mask
|
||||
#define HI_PWR_SAVE_LPL_ENABLED 0x1
|
||||
/*b1-b3 reserved*/
|
||||
/*b4-b5 : dev0 LPL type : 0 - none
|
||||
1- Reduce Pwr Search
|
||||
2- Reduce Pwr Listen*/
|
||||
* 1- Reduce Pwr Search
|
||||
* 2- Reduce Pwr Listen
|
||||
*/
|
||||
/*b6-b7 : dev1 LPL type and so on for Max 8 devices*/
|
||||
#define HI_PWR_SAVE_LPL_DEV0_LSB 4
|
||||
#define HI_PWR_SAVE_LPL_DEV_MASK 0x3
|
||||
|
@ -124,7 +124,7 @@ void ath10k_thermal_event_temperature(struct ath10k *ar, int temperature)
|
||||
complete(&ar->thermal.wmi_sync);
|
||||
}
|
||||
|
||||
static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, ath10k_thermal_show_temp,
|
||||
static SENSOR_DEVICE_ATTR(temp1_input, 0444, ath10k_thermal_show_temp,
|
||||
NULL, 0);
|
||||
|
||||
static struct attribute *ath10k_hwmon_attrs[] = {
|
||||
@ -191,7 +191,8 @@ int ath10k_thermal_register(struct ath10k *ar)
|
||||
return 0;
|
||||
|
||||
/* Avoid linking error on devm_hwmon_device_register_with_groups, I
|
||||
* guess linux/hwmon.h is missing proper stubs. */
|
||||
* guess linux/hwmon.h is missing proper stubs.
|
||||
*/
|
||||
if (!IS_REACHABLE(CONFIG_HWMON))
|
||||
return 0;
|
||||
|
||||
|
@ -34,7 +34,8 @@ static void ath10k_report_offchan_tx(struct ath10k *ar, struct sk_buff *skb)
|
||||
/* If the original wait_for_completion() timed out before
|
||||
* {data,mgmt}_tx_completed() was called then we could complete
|
||||
* offchan_tx_completed for a different skb. Prevent this by using
|
||||
* offchan_tx_skb. */
|
||||
* offchan_tx_skb.
|
||||
*/
|
||||
spin_lock_bh(&ar->data_lock);
|
||||
if (ar->offchan_tx_skb != skb) {
|
||||
ath10k_warn(ar, "completed old offchannel frame\n");
|
||||
|
@ -390,7 +390,8 @@ ath10k_wmi_mgmt_tx(struct ath10k *ar, struct sk_buff *msdu)
|
||||
return ret;
|
||||
|
||||
/* FIXME There's no ACK event for Management Tx. This probably
|
||||
* shouldn't be called here either. */
|
||||
* shouldn't be called here either.
|
||||
*/
|
||||
info->flags |= IEEE80211_TX_STAT_ACK;
|
||||
ieee80211_tx_status_irqsafe(ar->hw, msdu);
|
||||
|
||||
|
@ -3210,7 +3210,8 @@ static void ath10k_wmi_update_tim(struct ath10k *ar,
|
||||
tim_len = tim_info->tim_len ? __le32_to_cpu(tim_info->tim_len) : 1;
|
||||
|
||||
/* if next SWBA has no tim_changed the tim_bitmap is garbage.
|
||||
* we must copy the bitmap upon change and reuse it later */
|
||||
* we must copy the bitmap upon change and reuse it later
|
||||
*/
|
||||
if (__le32_to_cpu(tim_info->tim_changed)) {
|
||||
int i;
|
||||
|
||||
@ -3529,7 +3530,8 @@ void ath10k_wmi_event_host_swba(struct ath10k *ar, struct sk_buff *skb)
|
||||
* before telling mac80211 to decrement CSA counter
|
||||
*
|
||||
* Once CSA counter is completed stop sending beacons until
|
||||
* actual channel switch is done */
|
||||
* actual channel switch is done
|
||||
*/
|
||||
if (arvif->vif->csa_active &&
|
||||
ieee80211_csa_is_complete(arvif->vif)) {
|
||||
ieee80211_csa_finish(arvif->vif);
|
||||
@ -3691,7 +3693,8 @@ radar_detected:
|
||||
ATH10K_DFS_STAT_INC(ar, radar_detected);
|
||||
|
||||
/* Control radar events reporting in debugfs file
|
||||
dfs_block_radar_events */
|
||||
* dfs_block_radar_events
|
||||
*/
|
||||
if (ar->dfs_block_radar_events) {
|
||||
ath10k_info(ar, "DFS Radar detected, but ignored as requested\n");
|
||||
return;
|
||||
@ -4769,9 +4772,10 @@ static void ath10k_wmi_event_service_ready_work(struct work_struct *work)
|
||||
num_units = ar->max_num_peers + 1;
|
||||
} else if (num_unit_info & NUM_UNITS_IS_NUM_PEERS) {
|
||||
/* number of units to allocate is number of
|
||||
* peers, 1 extra for self peer on target */
|
||||
/* this needs to be tied, host and target
|
||||
* can get out of sync */
|
||||
* peers, 1 extra for self peer on target
|
||||
* this needs to be tied, host and target
|
||||
* can get out of sync
|
||||
*/
|
||||
num_units = ar->max_num_peers + 1;
|
||||
} else if (num_unit_info & NUM_UNITS_IS_NUM_VDEVS) {
|
||||
num_units = ar->max_num_vdevs + 1;
|
||||
|
@ -1038,7 +1038,8 @@ enum wmi_cmd_id {
|
||||
WMI_STA_UAPSD_AUTO_TRIG_CMDID,
|
||||
|
||||
/* STA Keep alive parameter configuration,
|
||||
Requires WMI_SERVICE_STA_KEEP_ALIVE */
|
||||
* Requires WMI_SERVICE_STA_KEEP_ALIVE
|
||||
*/
|
||||
WMI_STA_KEEPALIVE_CMD,
|
||||
|
||||
/* misc command group */
|
||||
@ -1774,7 +1775,8 @@ static inline const char *ath10k_wmi_phymode_str(enum wmi_phy_mode mode)
|
||||
break;
|
||||
|
||||
/* no default handler to allow compiler to check that the
|
||||
* enum is fully handled */
|
||||
* enum is fully handled
|
||||
*/
|
||||
};
|
||||
|
||||
return "<unknown>";
|
||||
@ -2974,7 +2976,8 @@ struct wmi_start_scan_arg {
|
||||
/* When set, DFS channels will not be scanned */
|
||||
#define WMI_SCAN_BYPASS_DFS_CHN 0x40
|
||||
/* Different FW scan engine may choose to bail out on errors.
|
||||
* Allow the driver to have influence over that. */
|
||||
* Allow the driver to have influence over that.
|
||||
*/
|
||||
#define WMI_SCAN_CONTINUE_ON_ERROR 0x80
|
||||
|
||||
/* WMI_SCAN_CLASS_MASK must be the same value as IEEE80211_SCAN_CLASS_MASK */
|
||||
@ -4447,14 +4450,16 @@ enum wmi_vdev_subtype_10_4 {
|
||||
/* values for vdev_start_request flags */
|
||||
/*
|
||||
* Indicates that AP VDEV uses hidden ssid. only valid for
|
||||
* AP/GO */
|
||||
* AP/GO
|
||||
*/
|
||||
#define WMI_VDEV_START_HIDDEN_SSID (1 << 0)
|
||||
/*
|
||||
* Indicates if robust management frame/management frame
|
||||
* protection is enabled. For GO/AP vdevs, it indicates that
|
||||
* it may support station/client associations with RMF enabled.
|
||||
* For STA/client vdevs, it indicates that sta will
|
||||
* associate with AP with RMF enabled. */
|
||||
* associate with AP with RMF enabled.
|
||||
*/
|
||||
#define WMI_VDEV_START_PMF_ENABLED (1 << 1)
|
||||
|
||||
struct wmi_p2p_noa_descriptor {
|
||||
@ -4814,7 +4819,8 @@ enum wmi_vdev_param {
|
||||
* An associated STA is considered unresponsive if there is no recent
|
||||
* TX/RX activity and downlink frames are buffered for it. Once a STA
|
||||
* exceeds the maximum unresponsive time, the AP will send a
|
||||
* WMI_STA_KICKOUT event to the host so the STA can be deleted. */
|
||||
* WMI_STA_KICKOUT event to the host so the STA can be deleted.
|
||||
*/
|
||||
WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS,
|
||||
|
||||
/* Enable NAWDS : MCAST INSPECT Enable, NAWDS Flag set */
|
||||
@ -4941,7 +4947,8 @@ enum wmi_10x_vdev_param {
|
||||
* An associated STA is considered unresponsive if there is no recent
|
||||
* TX/RX activity and downlink frames are buffered for it. Once a STA
|
||||
* exceeds the maximum unresponsive time, the AP will send a
|
||||
* WMI_10X_STA_KICKOUT event to the host so the STA can be deleted. */
|
||||
* WMI_10X_STA_KICKOUT event to the host so the STA can be deleted.
|
||||
*/
|
||||
WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS,
|
||||
|
||||
/* Enable NAWDS : MCAST INSPECT Enable, NAWDS Flag set */
|
||||
@ -5605,12 +5612,14 @@ struct wmi_tim_info_arg {
|
||||
|
||||
struct wmi_p2p_noa_info {
|
||||
/* Bit 0 - Flag to indicate an update in NOA schedule
|
||||
Bits 7-1 - Reserved */
|
||||
* Bits 7-1 - Reserved
|
||||
*/
|
||||
u8 changed;
|
||||
/* NOA index */
|
||||
u8 index;
|
||||
/* Bit 0 - Opp PS state of the AP
|
||||
Bits 1-7 - Ctwindow in TUs */
|
||||
* Bits 1-7 - Ctwindow in TUs
|
||||
*/
|
||||
u8 ctwindow_oppps;
|
||||
/* Number of NOA descriptors */
|
||||
u8 num_descriptors;
|
||||
@ -6000,7 +6009,8 @@ struct wmi_main_peer_assoc_complete_cmd {
|
||||
struct wmi_common_peer_assoc_complete_cmd cmd;
|
||||
|
||||
/* HT Operation Element of the peer. Five bytes packed in 2
|
||||
* INT32 array and filled from lsb to msb. */
|
||||
* INT32 array and filled from lsb to msb.
|
||||
*/
|
||||
__le32 peer_ht_info[2];
|
||||
} __packed;
|
||||
|
||||
|
@ -63,6 +63,7 @@ int ath6kl_read_tgt_stats(struct ath6kl *ar, struct ath6kl_vif *vif);
|
||||
|
||||
#ifdef CONFIG_ATH6KL_DEBUG
|
||||
|
||||
__printf(2, 3)
|
||||
void ath6kl_dbg(enum ATH6K_DEBUG_MASK mask, const char *fmt, ...);
|
||||
void ath6kl_dbg_dump(enum ATH6K_DEBUG_MASK mask,
|
||||
const char *msg, const char *prefix,
|
||||
@ -83,6 +84,7 @@ int ath6kl_debug_init_fs(struct ath6kl *ar);
|
||||
void ath6kl_debug_cleanup(struct ath6kl *ar);
|
||||
|
||||
#else
|
||||
__printf(2, 3)
|
||||
static inline void ath6kl_dbg(enum ATH6K_DEBUG_MASK dbg_mask,
|
||||
const char *fmt, ...)
|
||||
{
|
||||
|
@ -995,7 +995,7 @@ static int ath6kl_htc_pipe_rx_complete(struct ath6kl *ar, struct sk_buff *skb,
|
||||
|
||||
if (netlen < (payload_len + HTC_HDR_LENGTH)) {
|
||||
ath6kl_dbg(ATH6KL_DBG_HTC,
|
||||
"HTC Rx: insufficient length, got:%d expected =%u\n",
|
||||
"HTC Rx: insufficient length, got:%d expected =%zu\n",
|
||||
netlen, payload_len + HTC_HDR_LENGTH);
|
||||
status = -EINVAL;
|
||||
goto free_skb;
|
||||
|
@ -1596,7 +1596,7 @@ static int ath6kl_wmi_txe_notify_event_rx(struct wmi *wmi, u8 *datap, int len,
|
||||
rate = le32_to_cpu(ev->rate);
|
||||
pkts = le32_to_cpu(ev->pkts);
|
||||
|
||||
ath6kl_dbg(ATH6KL_DBG_WMI, "TXE notify event: peer %pM rate %d% pkts %d intvl %ds\n",
|
||||
ath6kl_dbg(ATH6KL_DBG_WMI, "TXE notify event: peer %pM rate %d%% pkts %d intvl %ds\n",
|
||||
vif->bssid, rate, pkts, vif->txe_intvl);
|
||||
|
||||
cfg80211_cqm_txe_notify(vif->ndev, vif->bssid, pkts,
|
||||
|
@ -254,7 +254,9 @@ int ath9k_hw_loadnf(struct ath_hw *ah, struct ath9k_channel *chan)
|
||||
if ((i >= AR5416_MAX_CHAINS) && !IS_CHAN_HT40(chan))
|
||||
continue;
|
||||
|
||||
if (h)
|
||||
if (ah->nf_override)
|
||||
nfval = ah->nf_override;
|
||||
else if (h)
|
||||
nfval = h[i].privNF;
|
||||
else
|
||||
nfval = default_nf;
|
||||
@ -348,6 +350,7 @@ int ath9k_hw_loadnf(struct ath_hw *ah, struct ath9k_channel *chan)
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(ath9k_hw_loadnf);
|
||||
|
||||
|
||||
static void ath9k_hw_nf_sanitize(struct ath_hw *ah, s16 *nf)
|
||||
|
@ -1191,6 +1191,65 @@ static const struct file_operations fops_tpc = {
|
||||
.llseek = default_llseek,
|
||||
};
|
||||
|
||||
static ssize_t read_file_nf_override(struct file *file,
|
||||
char __user *user_buf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct ath_softc *sc = file->private_data;
|
||||
struct ath_hw *ah = sc->sc_ah;
|
||||
char buf[32];
|
||||
unsigned int len;
|
||||
|
||||
if (ah->nf_override == 0)
|
||||
len = sprintf(buf, "off\n");
|
||||
else
|
||||
len = sprintf(buf, "%d\n", ah->nf_override);
|
||||
|
||||
return simple_read_from_buffer(user_buf, count, ppos, buf, len);
|
||||
}
|
||||
|
||||
static ssize_t write_file_nf_override(struct file *file,
|
||||
const char __user *user_buf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct ath_softc *sc = file->private_data;
|
||||
struct ath_hw *ah = sc->sc_ah;
|
||||
long val;
|
||||
char buf[32];
|
||||
ssize_t len;
|
||||
|
||||
len = min(count, sizeof(buf) - 1);
|
||||
if (copy_from_user(buf, user_buf, len))
|
||||
return -EFAULT;
|
||||
|
||||
buf[len] = '\0';
|
||||
if (strncmp("off", buf, 3) == 0)
|
||||
val = 0;
|
||||
else if (kstrtol(buf, 0, &val))
|
||||
return -EINVAL;
|
||||
|
||||
if (val > 0)
|
||||
return -EINVAL;
|
||||
|
||||
if (val < -120)
|
||||
return -EINVAL;
|
||||
|
||||
ah->nf_override = val;
|
||||
|
||||
if (ah->curchan)
|
||||
ath9k_hw_loadnf(ah, ah->curchan);
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static const struct file_operations fops_nf_override = {
|
||||
.read = read_file_nf_override,
|
||||
.write = write_file_nf_override,
|
||||
.open = simple_open,
|
||||
.owner = THIS_MODULE,
|
||||
.llseek = default_llseek,
|
||||
};
|
||||
|
||||
/* Ethtool support for get-stats */
|
||||
|
||||
#define AMKSTR(nm) #nm "_BE", #nm "_BK", #nm "_VI", #nm "_VO"
|
||||
@ -1402,5 +1461,8 @@ int ath9k_init_debug(struct ath_hw *ah)
|
||||
debugfs_create_u16("airtime_flags", S_IRUSR | S_IWUSR,
|
||||
sc->debug.debugfs_phy, &sc->airtime_flags);
|
||||
|
||||
debugfs_create_file("nf_override", S_IRUSR | S_IWUSR,
|
||||
sc->debug.debugfs_phy, sc, &fops_nf_override);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -112,7 +112,7 @@ void ath9k_hw_usb_gen_fill_eeprom(struct ath_hw *ah, u16 *eep_data,
|
||||
static bool ath9k_hw_nvram_read_array(u16 *blob, size_t blob_size,
|
||||
off_t offset, u16 *data)
|
||||
{
|
||||
if (offset > blob_size)
|
||||
if (offset >= blob_size)
|
||||
return false;
|
||||
|
||||
*data = blob[offset];
|
||||
|
@ -106,7 +106,7 @@
|
||||
#define AR9285_RDEXT_DEFAULT 0x1F
|
||||
|
||||
#define ATH9K_POW_SM(_r, _s) (((_r) & 0x3f) << (_s))
|
||||
#define FREQ2FBIN(x, y) ((y) ? ((x) - 2300) : (((x) - 4800) / 5))
|
||||
#define FREQ2FBIN(x, y) (u8)((y) ? ((x) - 2300) : (((x) - 4800) / 5))
|
||||
#define FBIN2FREQ(x, y) ((y) ? (2300 + x) : (4800 + 5 * x))
|
||||
#define ath9k_hw_use_flash(_ah) (!(_ah->ah_flags & AH_USE_EEPROM))
|
||||
|
||||
|
@ -1220,6 +1220,9 @@ static int send_eject_command(struct usb_interface *interface)
|
||||
u8 bulk_out_ep;
|
||||
int r;
|
||||
|
||||
if (iface_desc->desc.bNumEndpoints < 2)
|
||||
return -ENODEV;
|
||||
|
||||
/* Find bulk out endpoint */
|
||||
for (r = 1; r >= 0; r--) {
|
||||
endpoint = &iface_desc->endpoint[r].desc;
|
||||
|
@ -803,6 +803,7 @@ struct ath_hw {
|
||||
u32 rfkill_gpio;
|
||||
u32 rfkill_polarity;
|
||||
u32 ah_flags;
|
||||
s16 nf_override;
|
||||
|
||||
bool reset_power_on;
|
||||
bool htc_reset_init;
|
||||
|
@ -383,6 +383,11 @@ static const struct pci_device_id ath_pci_id_table[] = {
|
||||
0x10CF, /* Fujitsu */
|
||||
0x1783),
|
||||
.driver_data = ATH9K_PCI_WOW },
|
||||
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
||||
0x0034,
|
||||
PCI_VENDOR_ID_DELL,
|
||||
0x020B),
|
||||
.driver_data = ATH9K_PCI_WOW },
|
||||
|
||||
/* Killer Wireless (2x2) */
|
||||
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
||||
|
@ -254,8 +254,12 @@ bool ath_is_49ghz_allowed(u16 regdomain)
|
||||
EXPORT_SYMBOL(ath_is_49ghz_allowed);
|
||||
|
||||
/* Frequency is one where radar detection is required */
|
||||
static bool ath_is_radar_freq(u16 center_freq)
|
||||
static bool ath_is_radar_freq(u16 center_freq,
|
||||
struct ath_regulatory *reg)
|
||||
|
||||
{
|
||||
if (reg->country_code == CTRY_INDIA)
|
||||
return (center_freq >= 5500 && center_freq <= 5700);
|
||||
return (center_freq >= 5260 && center_freq <= 5700);
|
||||
}
|
||||
|
||||
@ -306,7 +310,7 @@ __ath_reg_apply_beaconing_flags(struct wiphy *wiphy,
|
||||
enum nl80211_reg_initiator initiator,
|
||||
struct ieee80211_channel *ch)
|
||||
{
|
||||
if (ath_is_radar_freq(ch->center_freq) ||
|
||||
if (ath_is_radar_freq(ch->center_freq, reg) ||
|
||||
(ch->flags & IEEE80211_CHAN_RADAR))
|
||||
return;
|
||||
|
||||
@ -395,8 +399,9 @@ ath_reg_apply_ir_flags(struct wiphy *wiphy,
|
||||
}
|
||||
}
|
||||
|
||||
/* Always apply Radar/DFS rules on freq range 5260 MHz - 5700 MHz */
|
||||
static void ath_reg_apply_radar_flags(struct wiphy *wiphy)
|
||||
/* Always apply Radar/DFS rules on freq range 5500 MHz - 5700 MHz */
|
||||
static void ath_reg_apply_radar_flags(struct wiphy *wiphy,
|
||||
struct ath_regulatory *reg)
|
||||
{
|
||||
struct ieee80211_supported_band *sband;
|
||||
struct ieee80211_channel *ch;
|
||||
@ -409,7 +414,7 @@ static void ath_reg_apply_radar_flags(struct wiphy *wiphy)
|
||||
|
||||
for (i = 0; i < sband->n_channels; i++) {
|
||||
ch = &sband->channels[i];
|
||||
if (!ath_is_radar_freq(ch->center_freq))
|
||||
if (!ath_is_radar_freq(ch->center_freq, reg))
|
||||
continue;
|
||||
/* We always enable radar detection/DFS on this
|
||||
* frequency range. Additionally we also apply on
|
||||
@ -506,7 +511,7 @@ void ath_reg_notifier_apply(struct wiphy *wiphy,
|
||||
struct ath_common *common = container_of(reg, struct ath_common,
|
||||
regulatory);
|
||||
/* We always apply this */
|
||||
ath_reg_apply_radar_flags(wiphy);
|
||||
ath_reg_apply_radar_flags(wiphy, reg);
|
||||
|
||||
/*
|
||||
* This would happen when we have sent a custom regulatory request
|
||||
@ -654,7 +659,7 @@ ath_regd_init_wiphy(struct ath_regulatory *reg,
|
||||
}
|
||||
|
||||
wiphy_apply_custom_regulatory(wiphy, regd);
|
||||
ath_reg_apply_radar_flags(wiphy);
|
||||
ath_reg_apply_radar_flags(wiphy, reg);
|
||||
ath_reg_apply_world_flags(wiphy, NL80211_REGDOM_SET_BY_DRIVER, reg);
|
||||
return 0;
|
||||
}
|
||||
|
@ -1563,12 +1563,6 @@ static int wil_cfg80211_set_power_mgmt(struct wiphy *wiphy,
|
||||
{
|
||||
struct wil6210_priv *wil = wiphy_to_wil(wiphy);
|
||||
enum wmi_ps_profile_type ps_profile;
|
||||
int rc;
|
||||
|
||||
if (!test_bit(WMI_FW_CAPABILITY_PS_CONFIG, wil->fw_capabilities)) {
|
||||
wil_err(wil, "set_power_mgmt not supported\n");
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
wil_dbg_misc(wil, "enabled=%d, timeout=%d\n",
|
||||
enabled, timeout);
|
||||
@ -1578,11 +1572,7 @@ static int wil_cfg80211_set_power_mgmt(struct wiphy *wiphy,
|
||||
else
|
||||
ps_profile = WMI_PS_PROFILE_TYPE_PS_DISABLED;
|
||||
|
||||
rc = wmi_ps_dev_profile_cfg(wil, ps_profile);
|
||||
if (rc)
|
||||
wil_err(wil, "wmi_ps_dev_profile_cfg failed (%d)\n", rc);
|
||||
|
||||
return rc;
|
||||
return wil_ps_update(wil, ps_profile);
|
||||
}
|
||||
|
||||
static const struct cfg80211_ops wil_cfg80211_ops = {
|
||||
|
@ -524,9 +524,8 @@ static ssize_t wil_read_file_ioblob(struct file *file, char __user *user_buf,
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
|
||||
wil_memcpy_fromio_halp_vote(wil_blob->wil, buf,
|
||||
(const volatile void __iomem *)
|
||||
wil_blob->blob.data + pos, count);
|
||||
wil_memcpy_fromio_32(buf, (const void __iomem *)
|
||||
wil_blob->blob.data + pos, count);
|
||||
|
||||
ret = copy_to_user(user_buf, buf, count);
|
||||
kfree(buf);
|
||||
|
@ -554,5 +554,7 @@ bool wil_fw_verify_file_exists(struct wil6210_priv *wil, const char *name)
|
||||
rc = request_firmware(&fw, name, wil_to_dev(wil));
|
||||
if (!rc)
|
||||
release_firmware(fw);
|
||||
return rc != -ENOENT;
|
||||
else
|
||||
wil_dbg_fw(wil, "<%s> not available: %d\n", name, rc);
|
||||
return !rc;
|
||||
}
|
||||
|
@ -130,17 +130,15 @@ void wil_memcpy_fromio_32(void *dst, const volatile void __iomem *src,
|
||||
u32 *d = dst;
|
||||
const volatile u32 __iomem *s = src;
|
||||
|
||||
/* size_t is unsigned, if (count%4 != 0) it will wrap */
|
||||
for (count += 4; count > 4; count -= 4)
|
||||
for (; count >= 4; count -= 4)
|
||||
*d++ = __raw_readl(s++);
|
||||
}
|
||||
|
||||
void wil_memcpy_fromio_halp_vote(struct wil6210_priv *wil, void *dst,
|
||||
const volatile void __iomem *src, size_t count)
|
||||
{
|
||||
wil_halp_vote(wil);
|
||||
wil_memcpy_fromio_32(dst, src, count);
|
||||
wil_halp_unvote(wil);
|
||||
if (unlikely(count)) {
|
||||
/* count can be 1..3 */
|
||||
u32 tmp = __raw_readl(s);
|
||||
|
||||
memcpy(d, &tmp, count);
|
||||
}
|
||||
}
|
||||
|
||||
void wil_memcpy_toio_32(volatile void __iomem *dst, const void *src,
|
||||
@ -149,17 +147,16 @@ void wil_memcpy_toio_32(volatile void __iomem *dst, const void *src,
|
||||
volatile u32 __iomem *d = dst;
|
||||
const u32 *s = src;
|
||||
|
||||
for (count += 4; count > 4; count -= 4)
|
||||
for (; count >= 4; count -= 4)
|
||||
__raw_writel(*s++, d++);
|
||||
}
|
||||
|
||||
void wil_memcpy_toio_halp_vote(struct wil6210_priv *wil,
|
||||
volatile void __iomem *dst,
|
||||
const void *src, size_t count)
|
||||
{
|
||||
wil_halp_vote(wil);
|
||||
wil_memcpy_toio_32(dst, src, count);
|
||||
wil_halp_unvote(wil);
|
||||
if (unlikely(count)) {
|
||||
/* count can be 1..3 */
|
||||
u32 tmp = 0;
|
||||
|
||||
memcpy(&tmp, s, count);
|
||||
__raw_writel(tmp, d);
|
||||
}
|
||||
}
|
||||
|
||||
static void wil_disconnect_cid(struct wil6210_priv *wil, int cid,
|
||||
@ -576,6 +573,9 @@ int wil_priv_init(struct wil6210_priv *wil)
|
||||
|
||||
if (rx_ring_overflow_thrsh == WIL6210_RX_HIGH_TRSH_INIT)
|
||||
rx_ring_overflow_thrsh = WIL6210_RX_HIGH_TRSH_DEFAULT;
|
||||
|
||||
wil->ps_profile = WMI_PS_PROFILE_TYPE_DEFAULT;
|
||||
|
||||
return 0;
|
||||
|
||||
out_wmi_wq:
|
||||
@ -903,6 +903,24 @@ void wil_abort_scan(struct wil6210_priv *wil, bool sync)
|
||||
}
|
||||
}
|
||||
|
||||
int wil_ps_update(struct wil6210_priv *wil, enum wmi_ps_profile_type ps_profile)
|
||||
{
|
||||
int rc;
|
||||
|
||||
if (!test_bit(WMI_FW_CAPABILITY_PS_CONFIG, wil->fw_capabilities)) {
|
||||
wil_err(wil, "set_power_mgmt not supported\n");
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
|
||||
rc = wmi_ps_dev_profile_cfg(wil, ps_profile);
|
||||
if (rc)
|
||||
wil_err(wil, "wmi_ps_dev_profile_cfg failed (%d)\n", rc);
|
||||
else
|
||||
wil->ps_profile = ps_profile;
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
/*
|
||||
* We reset all the structures, and we reset the UMAC.
|
||||
* After calling this routine, you're expected to reload
|
||||
@ -948,15 +966,15 @@ int wil_reset(struct wil6210_priv *wil, bool load_fw)
|
||||
/* Disable device led before reset*/
|
||||
wmi_led_cfg(wil, false);
|
||||
|
||||
mutex_lock(&wil->p2p_wdev_mutex);
|
||||
wil_abort_scan(wil, false);
|
||||
mutex_unlock(&wil->p2p_wdev_mutex);
|
||||
|
||||
/* prevent NAPI from being scheduled and prevent wmi commands */
|
||||
mutex_lock(&wil->wmi_mutex);
|
||||
bitmap_zero(wil->status, wil_status_last);
|
||||
mutex_unlock(&wil->wmi_mutex);
|
||||
|
||||
mutex_lock(&wil->p2p_wdev_mutex);
|
||||
wil_abort_scan(wil, false);
|
||||
mutex_unlock(&wil->p2p_wdev_mutex);
|
||||
|
||||
wil_mask_irq(wil);
|
||||
|
||||
wmi_event_flush(wil);
|
||||
@ -1033,6 +1051,9 @@ int wil_reset(struct wil6210_priv *wil, bool load_fw)
|
||||
return rc;
|
||||
}
|
||||
|
||||
if (wil->ps_profile != WMI_PS_PROFILE_TYPE_DEFAULT)
|
||||
wil_ps_update(wil, wil->ps_profile);
|
||||
|
||||
wil_collect_fw_info(wil);
|
||||
|
||||
if (wil->platform_ops.notify) {
|
||||
|
@ -71,6 +71,11 @@ int wil_suspend(struct wil6210_priv *wil, bool is_runtime)
|
||||
|
||||
wil_dbg_pm(wil, "suspend: %s\n", is_runtime ? "runtime" : "system");
|
||||
|
||||
if (test_bit(wil_status_suspended, wil->status)) {
|
||||
wil_dbg_pm(wil, "trying to suspend while suspended\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* if netif up, hardware is alive, shut it down */
|
||||
if (ndev->flags & IFF_UP) {
|
||||
rc = wil_down(wil);
|
||||
@ -80,12 +85,24 @@ int wil_suspend(struct wil6210_priv *wil, bool is_runtime)
|
||||
}
|
||||
}
|
||||
|
||||
if (wil->platform_ops.suspend)
|
||||
/* Disable PCIe IRQ to prevent sporadic IRQs when PCIe is suspending */
|
||||
wil_dbg_pm(wil, "Disabling PCIe IRQ before suspending\n");
|
||||
wil_disable_irq(wil);
|
||||
|
||||
if (wil->platform_ops.suspend) {
|
||||
rc = wil->platform_ops.suspend(wil->platform_handle);
|
||||
if (rc) {
|
||||
wil_enable_irq(wil);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
|
||||
set_bit(wil_status_suspended, wil->status);
|
||||
|
||||
out:
|
||||
wil_dbg_pm(wil, "suspend: %s => %d\n",
|
||||
is_runtime ? "runtime" : "system", rc);
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
@ -104,12 +121,18 @@ int wil_resume(struct wil6210_priv *wil, bool is_runtime)
|
||||
}
|
||||
}
|
||||
|
||||
wil_dbg_pm(wil, "Enabling PCIe IRQ\n");
|
||||
wil_enable_irq(wil);
|
||||
|
||||
/* if netif up, bring hardware up
|
||||
* During open(), IFF_UP set after actual device method
|
||||
* invocation. This prevent recursive call to wil_up()
|
||||
* invocation. This prevent recursive call to wil_up().
|
||||
* wil_status_suspended will be cleared in wil_reset
|
||||
*/
|
||||
if (ndev->flags & IFF_UP)
|
||||
rc = wil_up(wil);
|
||||
else
|
||||
clear_bit(wil_status_suspended, wil->status);
|
||||
|
||||
out:
|
||||
wil_dbg_pm(wil, "resume: %s => %d\n",
|
||||
|
@ -200,7 +200,7 @@ void wil_pmc_alloc(struct wil6210_priv *wil,
|
||||
|
||||
release_pmc_skbs:
|
||||
wil_err(wil, "exit on error: Releasing skbs...\n");
|
||||
for (i = 0; pmc->descriptors[i].va && i < num_descriptors; i++) {
|
||||
for (i = 0; i < num_descriptors && pmc->descriptors[i].va; i++) {
|
||||
dma_free_coherent(dev,
|
||||
descriptor_size,
|
||||
pmc->descriptors[i].va,
|
||||
@ -283,7 +283,7 @@ void wil_pmc_free(struct wil6210_priv *wil, int send_pmc_cmd)
|
||||
int i;
|
||||
|
||||
for (i = 0;
|
||||
pmc->descriptors[i].va && i < pmc->num_descriptors; i++) {
|
||||
i < pmc->num_descriptors && pmc->descriptors[i].va; i++) {
|
||||
dma_free_coherent(dev,
|
||||
pmc->descriptor_size,
|
||||
pmc->descriptors[i].va,
|
||||
|
@ -343,8 +343,16 @@ __acquires(&sta->tid_rx_lock) __releases(&sta->tid_rx_lock)
|
||||
wil_err(wil, "BACK requested unsupported ba_policy == 1\n");
|
||||
status = WLAN_STATUS_INVALID_QOS_PARAM;
|
||||
}
|
||||
if (status == WLAN_STATUS_SUCCESS)
|
||||
agg_wsize = wil_agg_size(wil, req_agg_wsize);
|
||||
if (status == WLAN_STATUS_SUCCESS) {
|
||||
if (req_agg_wsize == 0) {
|
||||
wil_dbg_misc(wil, "Suggest BACK wsize %d\n",
|
||||
WIL_MAX_AGG_WSIZE);
|
||||
agg_wsize = WIL_MAX_AGG_WSIZE;
|
||||
} else {
|
||||
agg_wsize = min_t(u16,
|
||||
WIL_MAX_AGG_WSIZE, req_agg_wsize);
|
||||
}
|
||||
}
|
||||
|
||||
rc = wmi_addba_rx_resp(wil, cid, tid, dialog_token, status,
|
||||
agg_amsdu, agg_wsize, agg_timeout);
|
||||
|
@ -37,6 +37,10 @@ bool rx_align_2;
|
||||
module_param(rx_align_2, bool, 0444);
|
||||
MODULE_PARM_DESC(rx_align_2, " align Rx buffers on 4*n+2, default - no");
|
||||
|
||||
bool rx_large_buf;
|
||||
module_param(rx_large_buf, bool, 0444);
|
||||
MODULE_PARM_DESC(rx_large_buf, " allocate 8KB RX buffers, default - no");
|
||||
|
||||
static inline uint wil_rx_snaplen(void)
|
||||
{
|
||||
return rx_align_2 ? 6 : 0;
|
||||
@ -255,7 +259,7 @@ static int wil_vring_alloc_skb(struct wil6210_priv *wil, struct vring *vring,
|
||||
u32 i, int headroom)
|
||||
{
|
||||
struct device *dev = wil_to_dev(wil);
|
||||
unsigned int sz = mtu_max + ETH_HLEN + wil_rx_snaplen();
|
||||
unsigned int sz = wil->rx_buf_len + ETH_HLEN + wil_rx_snaplen();
|
||||
struct vring_rx_desc dd, *d = ⅆ
|
||||
volatile struct vring_rx_desc *_d = &vring->va[i].rx;
|
||||
dma_addr_t pa;
|
||||
@ -419,7 +423,7 @@ static struct sk_buff *wil_vring_reap_rx(struct wil6210_priv *wil,
|
||||
struct sk_buff *skb;
|
||||
dma_addr_t pa;
|
||||
unsigned int snaplen = wil_rx_snaplen();
|
||||
unsigned int sz = mtu_max + ETH_HLEN + snaplen;
|
||||
unsigned int sz = wil->rx_buf_len + ETH_HLEN + snaplen;
|
||||
u16 dmalen;
|
||||
u8 ftype;
|
||||
int cid;
|
||||
@ -780,6 +784,20 @@ void wil_rx_handle(struct wil6210_priv *wil, int *quota)
|
||||
wil_rx_refill(wil, v->size);
|
||||
}
|
||||
|
||||
static void wil_rx_buf_len_init(struct wil6210_priv *wil)
|
||||
{
|
||||
wil->rx_buf_len = rx_large_buf ?
|
||||
WIL_MAX_ETH_MTU : TXRX_BUF_LEN_DEFAULT - WIL_MAX_MPDU_OVERHEAD;
|
||||
if (mtu_max > wil->rx_buf_len) {
|
||||
/* do not allow RX buffers to be smaller than mtu_max, for
|
||||
* backward compatibility (mtu_max parameter was also used
|
||||
* to support receiving large packets)
|
||||
*/
|
||||
wil_info(wil, "Override RX buffer to mtu_max(%d)\n", mtu_max);
|
||||
wil->rx_buf_len = mtu_max;
|
||||
}
|
||||
}
|
||||
|
||||
int wil_rx_init(struct wil6210_priv *wil, u16 size)
|
||||
{
|
||||
struct vring *vring = &wil->vring_rx;
|
||||
@ -792,6 +810,8 @@ int wil_rx_init(struct wil6210_priv *wil, u16 size)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
wil_rx_buf_len_init(wil);
|
||||
|
||||
vring->size = size;
|
||||
rc = wil_vring_alloc(wil, vring);
|
||||
if (rc)
|
||||
|
@ -32,6 +32,7 @@ extern unsigned short rx_ring_overflow_thrsh;
|
||||
extern int agg_wsize;
|
||||
extern u32 vring_idle_trsh;
|
||||
extern bool rx_align_2;
|
||||
extern bool rx_large_buf;
|
||||
extern bool debug_fw;
|
||||
extern bool disable_ap_sme;
|
||||
|
||||
@ -411,6 +412,7 @@ enum { /* for wil6210_priv.status */
|
||||
wil_status_irqen, /* FIXME: interrupts enabled - for debug */
|
||||
wil_status_napi_en, /* NAPI enabled protected by wil->mutex */
|
||||
wil_status_resetting, /* reset in progress */
|
||||
wil_status_suspended, /* suspend completed, device is suspended */
|
||||
wil_status_last /* keep last */
|
||||
};
|
||||
|
||||
@ -656,6 +658,7 @@ struct wil6210_priv {
|
||||
struct work_struct probe_client_worker;
|
||||
/* DMA related */
|
||||
struct vring vring_rx;
|
||||
unsigned int rx_buf_len;
|
||||
struct vring vring_tx[WIL6210_MAX_TX_RINGS];
|
||||
struct vring_tx_data vring_tx_data[WIL6210_MAX_TX_RINGS];
|
||||
u8 vring2cid_tid[WIL6210_MAX_TX_RINGS][2]; /* [0] - CID, [1] - TID */
|
||||
@ -691,6 +694,8 @@ struct wil6210_priv {
|
||||
/* High Access Latency Policy voting */
|
||||
struct wil_halp halp;
|
||||
|
||||
enum wmi_ps_profile_type ps_profile;
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
struct notifier_block pm_notify;
|
||||
@ -799,12 +804,6 @@ void wil_memcpy_fromio_32(void *dst, const volatile void __iomem *src,
|
||||
size_t count);
|
||||
void wil_memcpy_toio_32(volatile void __iomem *dst, const void *src,
|
||||
size_t count);
|
||||
void wil_memcpy_fromio_halp_vote(struct wil6210_priv *wil, void *dst,
|
||||
const volatile void __iomem *src,
|
||||
size_t count);
|
||||
void wil_memcpy_toio_halp_vote(struct wil6210_priv *wil,
|
||||
volatile void __iomem *dst,
|
||||
const void *src, size_t count);
|
||||
|
||||
void *wil_if_alloc(struct device *dev);
|
||||
void wil_if_free(struct wil6210_priv *wil);
|
||||
@ -812,6 +811,8 @@ int wil_if_add(struct wil6210_priv *wil);
|
||||
void wil_if_remove(struct wil6210_priv *wil);
|
||||
int wil_priv_init(struct wil6210_priv *wil);
|
||||
void wil_priv_deinit(struct wil6210_priv *wil);
|
||||
int wil_ps_update(struct wil6210_priv *wil,
|
||||
enum wmi_ps_profile_type ps_profile);
|
||||
int wil_reset(struct wil6210_priv *wil, bool no_fw);
|
||||
void wil_fw_error_recovery(struct wil6210_priv *wil);
|
||||
void wil_set_recovery_state(struct wil6210_priv *wil, int state);
|
||||
|
@ -518,16 +518,16 @@ static void wmi_evt_connect(struct wil6210_priv *wil, int id, void *d, int len)
|
||||
assoc_resp_ielen = 0;
|
||||
}
|
||||
|
||||
mutex_lock(&wil->mutex);
|
||||
if (test_bit(wil_status_resetting, wil->status) ||
|
||||
!test_bit(wil_status_fwready, wil->status)) {
|
||||
wil_err(wil, "status_resetting, cancel connect event, CID %d\n",
|
||||
evt->cid);
|
||||
mutex_unlock(&wil->mutex);
|
||||
/* no need for cleanup, wil_reset will do that */
|
||||
return;
|
||||
}
|
||||
|
||||
mutex_lock(&wil->mutex);
|
||||
|
||||
if ((wdev->iftype == NL80211_IFTYPE_STATION) ||
|
||||
(wdev->iftype == NL80211_IFTYPE_P2P_CLIENT)) {
|
||||
if (!test_bit(wil_status_fwconnecting, wil->status)) {
|
||||
@ -631,6 +631,13 @@ static void wmi_evt_disconnect(struct wil6210_priv *wil, int id,
|
||||
|
||||
wil->sinfo_gen++;
|
||||
|
||||
if (test_bit(wil_status_resetting, wil->status) ||
|
||||
!test_bit(wil_status_fwready, wil->status)) {
|
||||
wil_err(wil, "status_resetting, cancel disconnect event\n");
|
||||
/* no need for cleanup, wil_reset will do that */
|
||||
return;
|
||||
}
|
||||
|
||||
mutex_lock(&wil->mutex);
|
||||
wil6210_disconnect(wil, evt->bssid, reason_code, true);
|
||||
mutex_unlock(&wil->mutex);
|
||||
@ -1398,7 +1405,8 @@ int wmi_rx_chain_add(struct wil6210_priv *wil, struct vring *vring)
|
||||
struct wmi_cfg_rx_chain_cmd cmd = {
|
||||
.action = WMI_RX_CHAIN_ADD,
|
||||
.rx_sw_ring = {
|
||||
.max_mpdu_size = cpu_to_le16(wil_mtu2macbuf(mtu_max)),
|
||||
.max_mpdu_size = cpu_to_le16(
|
||||
wil_mtu2macbuf(wil->rx_buf_len)),
|
||||
.ring_mem_base = cpu_to_le64(vring->pa),
|
||||
.ring_size = cpu_to_le16(vring->size),
|
||||
},
|
||||
|
@ -58,6 +58,7 @@ enum wmi_fw_capability {
|
||||
WMI_FW_CAPABILITY_MGMT_RETRY_LIMIT = 3,
|
||||
WMI_FW_CAPABILITY_DISABLE_AP_SME = 4,
|
||||
WMI_FW_CAPABILITY_WMI_ONLY = 5,
|
||||
WMI_FW_CAPABILITY_THERMAL_THROTTLING = 7,
|
||||
WMI_FW_CAPABILITY_MAX,
|
||||
};
|
||||
|
||||
@ -142,8 +143,6 @@ enum wmi_command_id {
|
||||
WMI_MAINTAIN_RESUME_CMDID = 0x851,
|
||||
WMI_RS_MGMT_CMDID = 0x852,
|
||||
WMI_RF_MGMT_CMDID = 0x853,
|
||||
WMI_THERMAL_THROTTLING_CTRL_CMDID = 0x854,
|
||||
WMI_THERMAL_THROTTLING_GET_STATUS_CMDID = 0x855,
|
||||
WMI_OTP_READ_CMDID = 0x856,
|
||||
WMI_OTP_WRITE_CMDID = 0x857,
|
||||
WMI_LED_CFG_CMDID = 0x858,
|
||||
@ -192,6 +191,8 @@ enum wmi_command_id {
|
||||
WMI_GET_MGMT_RETRY_LIMIT_CMDID = 0x931,
|
||||
WMI_NEW_STA_CMDID = 0x935,
|
||||
WMI_DEL_STA_CMDID = 0x936,
|
||||
WMI_SET_THERMAL_THROTTLING_CFG_CMDID = 0x940,
|
||||
WMI_GET_THERMAL_THROTTLING_CFG_CMDID = 0x941,
|
||||
WMI_TOF_SESSION_START_CMDID = 0x991,
|
||||
WMI_TOF_GET_CAPABILITIES_CMDID = 0x992,
|
||||
WMI_TOF_SET_LCR_CMDID = 0x993,
|
||||
@ -438,16 +439,6 @@ struct wmi_rf_mgmt_cmd {
|
||||
__le32 rf_mgmt_type;
|
||||
} __packed;
|
||||
|
||||
/* WMI_THERMAL_THROTTLING_CTRL_CMDID */
|
||||
#define THERMAL_THROTTLING_USE_DEFAULT_MAX_TXOP_LENGTH (0xFFFFFFFF)
|
||||
|
||||
/* WMI_THERMAL_THROTTLING_CTRL_CMDID */
|
||||
struct wmi_thermal_throttling_ctrl_cmd {
|
||||
__le32 time_on_usec;
|
||||
__le32 time_off_usec;
|
||||
__le32 max_txop_length_usec;
|
||||
} __packed;
|
||||
|
||||
/* WMI_RF_RX_TEST_CMDID */
|
||||
struct wmi_rf_rx_test_cmd {
|
||||
__le32 sector;
|
||||
@ -549,7 +540,7 @@ struct wmi_pcp_start_cmd {
|
||||
u8 hidden_ssid;
|
||||
u8 is_go;
|
||||
u8 reserved0[5];
|
||||
/* abft_len override if non-0 */
|
||||
/* A-BFT length override if non-0 */
|
||||
u8 abft_len;
|
||||
u8 disable_ap_sme;
|
||||
u8 network_type;
|
||||
@ -910,6 +901,39 @@ struct wmi_set_mgmt_retry_limit_cmd {
|
||||
u8 reserved[3];
|
||||
} __packed;
|
||||
|
||||
/* Zones: HIGH, MAX, CRITICAL */
|
||||
#define WMI_NUM_OF_TT_ZONES (3)
|
||||
|
||||
struct wmi_tt_zone_limits {
|
||||
/* Above this temperature this zone is active */
|
||||
u8 temperature_high;
|
||||
/* Below this temperature the adjacent lower zone is active */
|
||||
u8 temperature_low;
|
||||
u8 reserved[2];
|
||||
} __packed;
|
||||
|
||||
/* Struct used for both configuration and status commands of thermal
|
||||
* throttling
|
||||
*/
|
||||
struct wmi_tt_data {
|
||||
/* Enable/Disable TT algorithm for baseband */
|
||||
u8 bb_enabled;
|
||||
u8 reserved0[3];
|
||||
/* Define zones for baseband */
|
||||
struct wmi_tt_zone_limits bb_zones[WMI_NUM_OF_TT_ZONES];
|
||||
/* Enable/Disable TT algorithm for radio */
|
||||
u8 rf_enabled;
|
||||
u8 reserved1[3];
|
||||
/* Define zones for all radio chips */
|
||||
struct wmi_tt_zone_limits rf_zones[WMI_NUM_OF_TT_ZONES];
|
||||
} __packed;
|
||||
|
||||
/* WMI_SET_THERMAL_THROTTLING_CFG_CMDID */
|
||||
struct wmi_set_thermal_throttling_cfg_cmd {
|
||||
/* Command data */
|
||||
struct wmi_tt_data tt_data;
|
||||
} __packed;
|
||||
|
||||
/* WMI_NEW_STA_CMDID */
|
||||
struct wmi_new_sta_cmd {
|
||||
u8 dst_mac[WMI_MAC_LEN];
|
||||
@ -1040,7 +1064,6 @@ enum wmi_event_id {
|
||||
WMI_BF_RXSS_MGMT_DONE_EVENTID = 0x1839,
|
||||
WMI_RS_MGMT_DONE_EVENTID = 0x1852,
|
||||
WMI_RF_MGMT_STATUS_EVENTID = 0x1853,
|
||||
WMI_THERMAL_THROTTLING_STATUS_EVENTID = 0x1855,
|
||||
WMI_BF_SM_MGMT_DONE_EVENTID = 0x1838,
|
||||
WMI_RX_MGMT_PACKET_EVENTID = 0x1840,
|
||||
WMI_TX_MGMT_PACKET_EVENTID = 0x1841,
|
||||
@ -1090,6 +1113,8 @@ enum wmi_event_id {
|
||||
WMI_BRP_SET_ANT_LIMIT_EVENTID = 0x1924,
|
||||
WMI_SET_MGMT_RETRY_LIMIT_EVENTID = 0x1930,
|
||||
WMI_GET_MGMT_RETRY_LIMIT_EVENTID = 0x1931,
|
||||
WMI_SET_THERMAL_THROTTLING_CFG_EVENTID = 0x1940,
|
||||
WMI_GET_THERMAL_THROTTLING_CFG_EVENTID = 0x1941,
|
||||
WMI_TOF_SESSION_END_EVENTID = 0x1991,
|
||||
WMI_TOF_GET_CAPABILITIES_EVENTID = 0x1992,
|
||||
WMI_TOF_SET_LCR_EVENTID = 0x1993,
|
||||
@ -1133,13 +1158,6 @@ struct wmi_rf_mgmt_status_event {
|
||||
__le32 rf_status;
|
||||
} __packed;
|
||||
|
||||
/* WMI_THERMAL_THROTTLING_STATUS_EVENTID */
|
||||
struct wmi_thermal_throttling_status_event {
|
||||
__le32 time_on_usec;
|
||||
__le32 time_off_usec;
|
||||
__le32 max_txop_length_usec;
|
||||
} __packed;
|
||||
|
||||
/* WMI_GET_STATUS_DONE_EVENTID */
|
||||
struct wmi_get_status_done_event {
|
||||
__le32 is_associated;
|
||||
@ -2206,6 +2224,19 @@ struct wmi_tof_get_capabilities_event {
|
||||
__le32 aoa_supported_types;
|
||||
} __packed;
|
||||
|
||||
/* WMI_SET_THERMAL_THROTTLING_CFG_EVENTID */
|
||||
struct wmi_set_thermal_throttling_cfg_event {
|
||||
/* wmi_fw_status */
|
||||
u8 status;
|
||||
u8 reserved[3];
|
||||
} __packed;
|
||||
|
||||
/* WMI_GET_THERMAL_THROTTLING_CFG_EVENTID */
|
||||
struct wmi_get_thermal_throttling_cfg_event {
|
||||
/* Status data */
|
||||
struct wmi_tt_data tt_data;
|
||||
} __packed;
|
||||
|
||||
enum wmi_tof_session_end_status {
|
||||
WMI_TOF_SESSION_END_NO_ERROR = 0x00,
|
||||
WMI_TOF_SESSION_END_FAIL = 0x01,
|
||||
|
Loading…
Reference in New Issue
Block a user