mirror of
https://github.com/FEX-Emu/linux.git
synced 2024-12-28 04:17:47 +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");
|
ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot ahb hif start\n");
|
||||||
|
|
||||||
|
napi_enable(&ar->napi);
|
||||||
ath10k_ce_enable_interrupts(ar);
|
ath10k_ce_enable_interrupts(ar);
|
||||||
ath10k_pci_enable_legacy_irq(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);
|
ath10k_err(ar, "could not wake up target CPU: %d\n", ret);
|
||||||
goto err_ce_deinit;
|
goto err_ce_deinit;
|
||||||
}
|
}
|
||||||
napi_enable(&ar->napi);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -176,7 +176,8 @@ union bmi_resp {
|
|||||||
} rompatch_uninstall;
|
} rompatch_uninstall;
|
||||||
struct {
|
struct {
|
||||||
/* 0 = nothing executed
|
/* 0 = nothing executed
|
||||||
* otherwise = NVRAM segment return value */
|
* otherwise = NVRAM segment return value
|
||||||
|
*/
|
||||||
__le32 result;
|
__le32 result;
|
||||||
} nvram_process;
|
} nvram_process;
|
||||||
u8 payload[BMI_MAX_CMDBUF_SIZE];
|
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
|
* Guts of ath10k_ce_send.
|
||||||
* ath10k_ce_sendlist_send.
|
|
||||||
* The caller takes responsibility for any needed locking.
|
* The caller takes responsibility for any needed locking.
|
||||||
*/
|
*/
|
||||||
int ath10k_ce_send_nolock(struct ath10k_ce_pipe *ce_state,
|
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 >
|
BUILD_BUG_ON(2 * TARGET_NUM_MSDU_DESC >
|
||||||
(CE_HTT_H2T_MSG_SRC_NENTRIES - 1));
|
(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));
|
(CE_HTT_H2T_MSG_SRC_NENTRIES - 1));
|
||||||
BUILD_BUG_ON(2 * TARGET_TLV_NUM_MSDU_DESC >
|
BUILD_BUG_ON(2 * TARGET_TLV_NUM_MSDU_DESC >
|
||||||
(CE_HTT_H2T_MSG_SRC_NENTRIES - 1));
|
(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,
|
.hw_ops = &qca988x_ops,
|
||||||
.decap_align_bytes = 4,
|
.decap_align_bytes = 4,
|
||||||
|
.spectral_bin_discard = 0,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.id = QCA9887_HW_1_0_VERSION,
|
.id = QCA9887_HW_1_0_VERSION,
|
||||||
@ -91,6 +92,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
|||||||
},
|
},
|
||||||
.hw_ops = &qca988x_ops,
|
.hw_ops = &qca988x_ops,
|
||||||
.decap_align_bytes = 4,
|
.decap_align_bytes = 4,
|
||||||
|
.spectral_bin_discard = 0,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.id = QCA6174_HW_2_1_VERSION,
|
.id = QCA6174_HW_2_1_VERSION,
|
||||||
@ -110,6 +112,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
|||||||
},
|
},
|
||||||
.hw_ops = &qca988x_ops,
|
.hw_ops = &qca988x_ops,
|
||||||
.decap_align_bytes = 4,
|
.decap_align_bytes = 4,
|
||||||
|
.spectral_bin_discard = 0,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.id = QCA6174_HW_2_1_VERSION,
|
.id = QCA6174_HW_2_1_VERSION,
|
||||||
@ -129,6 +132,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
|||||||
},
|
},
|
||||||
.hw_ops = &qca988x_ops,
|
.hw_ops = &qca988x_ops,
|
||||||
.decap_align_bytes = 4,
|
.decap_align_bytes = 4,
|
||||||
|
.spectral_bin_discard = 0,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.id = QCA6174_HW_3_0_VERSION,
|
.id = QCA6174_HW_3_0_VERSION,
|
||||||
@ -148,6 +152,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
|||||||
},
|
},
|
||||||
.hw_ops = &qca988x_ops,
|
.hw_ops = &qca988x_ops,
|
||||||
.decap_align_bytes = 4,
|
.decap_align_bytes = 4,
|
||||||
|
.spectral_bin_discard = 0,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.id = QCA6174_HW_3_2_VERSION,
|
.id = QCA6174_HW_3_2_VERSION,
|
||||||
@ -170,6 +175,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
|||||||
.hw_clk = qca6174_clk,
|
.hw_clk = qca6174_clk,
|
||||||
.target_cpu_freq = 176000000,
|
.target_cpu_freq = 176000000,
|
||||||
.decap_align_bytes = 4,
|
.decap_align_bytes = 4,
|
||||||
|
.spectral_bin_discard = 0,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.id = QCA99X0_HW_2_0_DEV_VERSION,
|
.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,
|
.sw_decrypt_mcast_mgmt = true,
|
||||||
.hw_ops = &qca99x0_ops,
|
.hw_ops = &qca99x0_ops,
|
||||||
.decap_align_bytes = 1,
|
.decap_align_bytes = 1,
|
||||||
|
.spectral_bin_discard = 4,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.id = QCA9984_HW_1_0_DEV_VERSION,
|
.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,
|
.sw_decrypt_mcast_mgmt = true,
|
||||||
.hw_ops = &qca99x0_ops,
|
.hw_ops = &qca99x0_ops,
|
||||||
.decap_align_bytes = 1,
|
.decap_align_bytes = 1,
|
||||||
|
.spectral_bin_discard = 12,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.id = QCA9888_HW_2_0_DEV_VERSION,
|
.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,
|
.sw_decrypt_mcast_mgmt = true,
|
||||||
.hw_ops = &qca99x0_ops,
|
.hw_ops = &qca99x0_ops,
|
||||||
.decap_align_bytes = 1,
|
.decap_align_bytes = 1,
|
||||||
|
.spectral_bin_discard = 12,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.id = QCA9377_HW_1_0_DEV_VERSION,
|
.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,
|
.hw_ops = &qca988x_ops,
|
||||||
.decap_align_bytes = 4,
|
.decap_align_bytes = 4,
|
||||||
|
.spectral_bin_discard = 0,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.id = QCA9377_HW_1_1_DEV_VERSION,
|
.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,
|
.hw_clk = qca6174_clk,
|
||||||
.target_cpu_freq = 176000000,
|
.target_cpu_freq = 176000000,
|
||||||
.decap_align_bytes = 4,
|
.decap_align_bytes = 4,
|
||||||
|
.spectral_bin_discard = 0,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.id = QCA4019_HW_1_0_DEV_VERSION,
|
.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,
|
.sw_decrypt_mcast_mgmt = true,
|
||||||
.hw_ops = &qca99x0_ops,
|
.hw_ops = &qca99x0_ops,
|
||||||
.decap_align_bytes = 1,
|
.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->wmi.tx_credits_wq);
|
||||||
wake_up(&ar->peer_mapping_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);
|
mutex_lock(&ar->conf_mutex);
|
||||||
|
|
||||||
switch (ar->state) {
|
switch (ar->state) {
|
||||||
@ -1638,7 +1657,8 @@ static void ath10k_core_restart(struct work_struct *work)
|
|||||||
break;
|
break;
|
||||||
case ATH10K_STATE_OFF:
|
case ATH10K_STATE_OFF:
|
||||||
/* this can happen if driver is being unloaded
|
/* 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");
|
ath10k_warn(ar, "cannot restart a device that hasn't been started\n");
|
||||||
break;
|
break;
|
||||||
case ATH10K_STATE_RESTARTING:
|
case ATH10K_STATE_RESTARTING:
|
||||||
@ -2166,7 +2186,8 @@ EXPORT_SYMBOL(ath10k_core_stop);
|
|||||||
/* mac80211 manages fw/hw initialization through start/stop hooks. However in
|
/* mac80211 manages fw/hw initialization through start/stop hooks. However in
|
||||||
* order to know what hw capabilities should be advertised to mac80211 it is
|
* 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
|
* 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)
|
static int ath10k_core_probe_fw(struct ath10k *ar)
|
||||||
{
|
{
|
||||||
struct bmi_target_info target_info;
|
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.
|
/* We must unregister from mac80211 before we stop HTC and HIF.
|
||||||
* Otherwise we will fail to submit commands to FW and mac80211 will be
|
* 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_mac_unregister(ar);
|
||||||
|
|
||||||
ath10k_testmode_destroy(ar);
|
ath10k_testmode_destroy(ar);
|
||||||
|
@ -501,14 +501,16 @@ enum ath10k_state {
|
|||||||
* stopped in ath10k_core_restart() work holding conf_mutex. The state
|
* stopped in ath10k_core_restart() work holding conf_mutex. The state
|
||||||
* RESTARTED means that the device is up and mac80211 has started hw
|
* RESTARTED means that the device is up and mac80211 has started hw
|
||||||
* reconfiguration. Once mac80211 is done with the reconfiguration we
|
* 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_RESTARTING,
|
||||||
ATH10K_STATE_RESTARTED,
|
ATH10K_STATE_RESTARTED,
|
||||||
|
|
||||||
/* The device has crashed while restarting hw. This state is like ON
|
/* The device has crashed while restarting hw. This state is like ON
|
||||||
* but commands are blocked in HTC and -ECOMM response is given. This
|
* but commands are blocked in HTC and -ECOMM response is given. This
|
||||||
* prevents completion timeouts and makes the driver more responsive to
|
* 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,
|
ATH10K_STATE_WEDGED,
|
||||||
|
|
||||||
/* factory tests */
|
/* factory tests */
|
||||||
@ -920,7 +922,8 @@ struct ath10k {
|
|||||||
struct work_struct restart_work;
|
struct work_struct restart_work;
|
||||||
|
|
||||||
/* cycle count is reported twice for each visited channel during scan.
|
/* 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_rx_clear_count;
|
||||||
u32 survey_last_cycle_count;
|
u32 survey_last_cycle_count;
|
||||||
struct survey_info survey[ATH10K_NUM_CHANS];
|
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->num_tx_chain,
|
||||||
tpc_stats->rate_max);
|
tpc_stats->rate_max);
|
||||||
|
|
||||||
for (j = 0; j < tpc_stats->num_tx_chain ; j++) {
|
for (j = 0; j < WMI_TPC_FLAG; j++) {
|
||||||
switch (j) {
|
switch (j) {
|
||||||
case WMI_TPC_TABLE_TYPE_CDD:
|
case WMI_TPC_TABLE_TYPE_CDD:
|
||||||
if (tpc_stats->flag[j] == ATH10K_TPC_TABLE_TYPE_FLAG) {
|
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
|
/* Must not use _sync to avoid deadlock, we do that in
|
||||||
* ath10k_debug_destroy(). The check for htt_stats_mask is to avoid
|
* 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)
|
if (ar->debug.htt_stats_mask != 0)
|
||||||
cancel_delayed_work(&ar->debug.htt_stats_dwork);
|
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.tpc_complete);
|
||||||
init_completion(&ar->debug.fw_stats_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);
|
&fops_fw_stats);
|
||||||
|
|
||||||
debugfs_create_file("fw_reset_stats", S_IRUSR, ar->debug.debugfs_phy,
|
debugfs_create_file("fw_reset_stats", 0400, ar->debug.debugfs_phy, ar,
|
||||||
ar, &fops_fw_reset_stats);
|
&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);
|
&fops_wmi_services);
|
||||||
|
|
||||||
debugfs_create_file("simulate_fw_crash", S_IRUSR | S_IWUSR,
|
debugfs_create_file("simulate_fw_crash", 0600, ar->debug.debugfs_phy, ar,
|
||||||
ar->debug.debugfs_phy, ar, &fops_simulate_fw_crash);
|
&fops_simulate_fw_crash);
|
||||||
|
|
||||||
debugfs_create_file("fw_crash_dump", S_IRUSR, ar->debug.debugfs_phy,
|
debugfs_create_file("fw_crash_dump", 0400, ar->debug.debugfs_phy, ar,
|
||||||
ar, &fops_fw_crash_dump);
|
&fops_fw_crash_dump);
|
||||||
|
|
||||||
debugfs_create_file("reg_addr", S_IRUSR | S_IWUSR,
|
debugfs_create_file("reg_addr", 0600, ar->debug.debugfs_phy, ar,
|
||||||
ar->debug.debugfs_phy, ar, &fops_reg_addr);
|
&fops_reg_addr);
|
||||||
|
|
||||||
debugfs_create_file("reg_value", S_IRUSR | S_IWUSR,
|
debugfs_create_file("reg_value", 0600, ar->debug.debugfs_phy, ar,
|
||||||
ar->debug.debugfs_phy, ar, &fops_reg_value);
|
&fops_reg_value);
|
||||||
|
|
||||||
debugfs_create_file("mem_value", S_IRUSR | S_IWUSR,
|
debugfs_create_file("mem_value", 0600, ar->debug.debugfs_phy, ar,
|
||||||
ar->debug.debugfs_phy, ar, &fops_mem_value);
|
&fops_mem_value);
|
||||||
|
|
||||||
debugfs_create_file("chip_id", S_IRUSR, ar->debug.debugfs_phy,
|
debugfs_create_file("chip_id", 0400, ar->debug.debugfs_phy, ar,
|
||||||
ar, &fops_chip_id);
|
&fops_chip_id);
|
||||||
|
|
||||||
debugfs_create_file("htt_stats_mask", S_IRUSR | S_IWUSR,
|
debugfs_create_file("htt_stats_mask", 0600, ar->debug.debugfs_phy, ar,
|
||||||
ar->debug.debugfs_phy, ar, &fops_htt_stats_mask);
|
&fops_htt_stats_mask);
|
||||||
|
|
||||||
debugfs_create_file("htt_max_amsdu_ampdu", S_IRUSR | S_IWUSR,
|
debugfs_create_file("htt_max_amsdu_ampdu", 0600, ar->debug.debugfs_phy, ar,
|
||||||
ar->debug.debugfs_phy, ar,
|
|
||||||
&fops_htt_max_amsdu_ampdu);
|
&fops_htt_max_amsdu_ampdu);
|
||||||
|
|
||||||
debugfs_create_file("fw_dbglog", S_IRUSR | S_IWUSR,
|
debugfs_create_file("fw_dbglog", 0600, ar->debug.debugfs_phy, ar,
|
||||||
ar->debug.debugfs_phy, ar, &fops_fw_dbglog);
|
&fops_fw_dbglog);
|
||||||
|
|
||||||
debugfs_create_file("cal_data", S_IRUSR, ar->debug.debugfs_phy,
|
debugfs_create_file("cal_data", 0400, ar->debug.debugfs_phy, ar,
|
||||||
ar, &fops_cal_data);
|
&fops_cal_data);
|
||||||
|
|
||||||
debugfs_create_file("ani_enable", S_IRUSR | S_IWUSR,
|
debugfs_create_file("ani_enable", 0600, ar->debug.debugfs_phy, ar,
|
||||||
ar->debug.debugfs_phy, ar, &fops_ani_enable);
|
&fops_ani_enable);
|
||||||
|
|
||||||
debugfs_create_file("nf_cal_period", S_IRUSR | S_IWUSR,
|
debugfs_create_file("nf_cal_period", 0600, ar->debug.debugfs_phy, ar,
|
||||||
ar->debug.debugfs_phy, ar, &fops_nf_cal_period);
|
&fops_nf_cal_period);
|
||||||
|
|
||||||
if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED)) {
|
if (IS_ENABLED(CONFIG_ATH10K_DFS_CERTIFIED)) {
|
||||||
debugfs_create_file("dfs_simulate_radar", S_IWUSR,
|
debugfs_create_file("dfs_simulate_radar", 0200, ar->debug.debugfs_phy,
|
||||||
ar->debug.debugfs_phy, ar,
|
ar, &fops_simulate_radar);
|
||||||
&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->debug.debugfs_phy,
|
||||||
&ar->dfs_block_radar_events);
|
&ar->dfs_block_radar_events);
|
||||||
|
|
||||||
debugfs_create_file("dfs_stats", S_IRUSR,
|
debugfs_create_file("dfs_stats", 0400, ar->debug.debugfs_phy, ar,
|
||||||
ar->debug.debugfs_phy, ar,
|
|
||||||
&fops_dfs_stats);
|
&fops_dfs_stats);
|
||||||
}
|
}
|
||||||
|
|
||||||
debugfs_create_file("pktlog_filter", S_IRUGO | S_IWUSR,
|
debugfs_create_file("pktlog_filter", 0644, ar->debug.debugfs_phy, ar,
|
||||||
ar->debug.debugfs_phy, ar, &fops_pktlog_filter);
|
&fops_pktlog_filter);
|
||||||
|
|
||||||
debugfs_create_file("quiet_period", S_IRUGO | S_IWUSR,
|
debugfs_create_file("quiet_period", 0644, ar->debug.debugfs_phy, ar,
|
||||||
ar->debug.debugfs_phy, ar, &fops_quiet_period);
|
&fops_quiet_period);
|
||||||
|
|
||||||
debugfs_create_file("tpc_stats", S_IRUSR,
|
debugfs_create_file("tpc_stats", 0400, ar->debug.debugfs_phy, ar,
|
||||||
ar->debug.debugfs_phy, ar, &fops_tpc_stats);
|
&fops_tpc_stats);
|
||||||
|
|
||||||
if (test_bit(WMI_SERVICE_COEX_GPIO, ar->wmi.svc_map))
|
if (test_bit(WMI_SERVICE_COEX_GPIO, ar->wmi.svc_map))
|
||||||
debugfs_create_file("btcoex", S_IRUGO | S_IWUSR,
|
debugfs_create_file("btcoex", 0644, ar->debug.debugfs_phy, ar,
|
||||||
ar->debug.debugfs_phy, ar, &fops_btcoex);
|
&fops_btcoex);
|
||||||
|
|
||||||
if (test_bit(WMI_SERVICE_PEER_STATS, ar->wmi.svc_map))
|
if (test_bit(WMI_SERVICE_PEER_STATS, ar->wmi.svc_map))
|
||||||
debugfs_create_file("peer_stats", S_IRUGO | S_IWUSR,
|
debugfs_create_file("peer_stats", 0644, ar->debug.debugfs_phy, ar,
|
||||||
ar->debug.debugfs_phy, ar,
|
|
||||||
&fops_peer_stats);
|
&fops_peer_stats);
|
||||||
|
|
||||||
debugfs_create_file("fw_checksums", S_IRUSR,
|
debugfs_create_file("fw_checksums", 0400, ar->debug.debugfs_phy, ar,
|
||||||
ar->debug.debugfs_phy, ar, &fops_fw_checksums);
|
&fops_fw_checksums);
|
||||||
|
|
||||||
return 0;
|
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,
|
void ath10k_sta_add_debugfs(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||||
struct ieee80211_sta *sta, struct dentry *dir)
|
struct ieee80211_sta *sta, struct dentry *dir)
|
||||||
{
|
{
|
||||||
debugfs_create_file("aggr_mode", S_IRUGO | S_IWUSR, dir, sta,
|
debugfs_create_file("aggr_mode", 0644, dir, sta, &fops_aggr_mode);
|
||||||
&fops_aggr_mode);
|
debugfs_create_file("addba", 0200, dir, sta, &fops_addba);
|
||||||
debugfs_create_file("addba", S_IWUSR, dir, sta, &fops_addba);
|
debugfs_create_file("addba_resp", 0200, dir, sta, &fops_addba_resp);
|
||||||
debugfs_create_file("addba_resp", S_IWUSR, dir, sta, &fops_addba_resp);
|
debugfs_create_file("delba", 0200, dir, sta, &fops_delba);
|
||||||
debugfs_create_file("delba", S_IWUSR, dir, sta, &fops_delba);
|
|
||||||
debugfs_create_file("peer_debug_trigger", 0600, dir, sta,
|
debugfs_create_file("peer_debug_trigger", 0600, dir, sta,
|
||||||
&fops_peer_debug_trigger);
|
&fops_peer_debug_trigger);
|
||||||
}
|
}
|
||||||
|
@ -54,7 +54,8 @@ struct ath10k_hif_ops {
|
|||||||
int (*start)(struct ath10k *ar);
|
int (*start)(struct ath10k *ar);
|
||||||
|
|
||||||
/* Clean up what start() did. This does not revert to BMI phase. If
|
/* 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);
|
void (*stop)(struct ath10k *ar);
|
||||||
|
|
||||||
int (*map_service_to_pipe)(struct ath10k *ar, u16 service_id,
|
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);
|
int (*power_up)(struct ath10k *ar);
|
||||||
|
|
||||||
/* Power down the device and free up resources. stop() must be called
|
/* 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);
|
void (*power_down)(struct ath10k *ar);
|
||||||
|
|
||||||
int (*suspend)(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);
|
credits = DIV_ROUND_UP(skb->len, htc->target_credit_size);
|
||||||
spin_lock_bh(&htc->tx_lock);
|
spin_lock_bh(&htc->tx_lock);
|
||||||
if (ep->tx_credits < credits) {
|
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);
|
spin_unlock_bh(&htc->tx_lock);
|
||||||
ret = -EAGAIN;
|
ret = -EAGAIN;
|
||||||
goto err_pull;
|
goto err_pull;
|
||||||
@ -419,7 +422,8 @@ static void ath10k_htc_control_rx_complete(struct ath10k *ar,
|
|||||||
struct sk_buff *skb)
|
struct sk_buff *skb)
|
||||||
{
|
{
|
||||||
/* This is unexpected. FW is not supposed to send regular rx on this
|
/* This is unexpected. FW is not supposed to send regular rx on this
|
||||||
* endpoint. */
|
* endpoint.
|
||||||
|
*/
|
||||||
ath10k_warn(ar, "unexpected htc rx\n");
|
ath10k_warn(ar, "unexpected htc rx\n");
|
||||||
kfree_skb(skb);
|
kfree_skb(skb);
|
||||||
}
|
}
|
||||||
|
@ -51,7 +51,8 @@ enum htt_h2t_msg_type { /* host-to-target */
|
|||||||
HTT_H2T_MSG_TYPE_FRAG_DESC_BANK_CFG = 6,
|
HTT_H2T_MSG_TYPE_FRAG_DESC_BANK_CFG = 6,
|
||||||
|
|
||||||
/* This command is used for sending management frames in HTT < 3.0.
|
/* 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_MGMT_TX = 7,
|
||||||
HTT_H2T_MSG_TYPE_TX_FETCH_RESP = 11,
|
HTT_H2T_MSG_TYPE_TX_FETCH_RESP = 11,
|
||||||
|
|
||||||
@ -910,7 +911,8 @@ struct htt_rx_test {
|
|||||||
|
|
||||||
/* payload consists of 2 lists:
|
/* payload consists of 2 lists:
|
||||||
* a) num_ints * sizeof(__le32)
|
* a) num_ints * sizeof(__le32)
|
||||||
* b) num_chars * sizeof(u8) aligned to 4bytes */
|
* b) num_chars * sizeof(u8) aligned to 4bytes
|
||||||
|
*/
|
||||||
u8 payload[0];
|
u8 payload[0];
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
@ -1307,7 +1309,8 @@ struct htt_frag_desc_bank_id {
|
|||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
/* real is 16 but it wouldn't fit in the max htt message size
|
/* 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_MAX 4
|
||||||
|
|
||||||
#define HTT_FRAG_DESC_BANK_CFG_INFO_PDEV_ID_MASK 0x03
|
#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);
|
DECLARE_KFIFO_PTR(txdone_fifo, struct htt_tx_done);
|
||||||
|
|
||||||
/* set if host-fw communication goes haywire
|
/* set if host-fw communication goes haywire
|
||||||
* used to avoid further failures */
|
* used to avoid further failures
|
||||||
|
*/
|
||||||
bool rx_confused;
|
bool rx_confused;
|
||||||
atomic_t num_mpdus_ready;
|
atomic_t num_mpdus_ready;
|
||||||
|
|
||||||
/* This is used to group tx/rx completions separately and process them
|
/* 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_compl_q;
|
||||||
struct sk_buff_head rx_in_ord_compl_q;
|
struct sk_buff_head rx_in_ord_compl_q;
|
||||||
struct sk_buff_head tx_fetch_ind_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
|
/* This structure layout is programmed via rx ring setup
|
||||||
* so that FW knows how to transfer the rx descriptor to the host.
|
* 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 {
|
struct htt_rx_desc {
|
||||||
union {
|
union {
|
||||||
/* This field is filled on the host using the msdu buffer
|
/* 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;
|
struct fw_rx_desc_base fw_desc;
|
||||||
u32 pad;
|
u32 pad;
|
||||||
} __packed;
|
} __packed;
|
||||||
@ -1760,7 +1767,8 @@ struct htt_rx_desc {
|
|||||||
#define HTT_RX_MSDU_SIZE (HTT_RX_BUF_SIZE - (int)sizeof(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
|
/* 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
|
#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.
|
* automatically balances load wrt to CPU power.
|
||||||
*
|
*
|
||||||
* This probably comes at a cost of lower maximum throughput but
|
* 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);
|
spin_lock_bh(&htt->rx_ring.lock);
|
||||||
num_deficit = htt->rx_ring.fill_level - htt->rx_ring.fill_cnt;
|
num_deficit = htt->rx_ring.fill_level - htt->rx_ring.fill_cnt;
|
||||||
num_to_fill = min(ATH10K_HTT_MAX_NUM_REFILL, num_deficit);
|
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;
|
rx_desc = (struct htt_rx_desc *)msdu->data;
|
||||||
|
|
||||||
/* FIXME: we must report msdu payload since this is what caller
|
/* 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_put(msdu, offsetof(struct htt_rx_desc, msdu_payload));
|
||||||
skb_pull(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:
|
||||||
case HTT_RX_VHT_WITH_TXBF:
|
case HTT_RX_VHT_WITH_TXBF:
|
||||||
/* VHT-SIG-A1 in info2, VHT-SIG-A2 in info3
|
/* VHT-SIG-A1 in info2, VHT-SIG-A2 in info3
|
||||||
TODO check this */
|
* TODO check this
|
||||||
|
*/
|
||||||
bw = info2 & 3;
|
bw = info2 & 3;
|
||||||
sgi = info3 & 1;
|
sgi = info3 & 1;
|
||||||
group_id = (info2 >> 4) & 0x3F;
|
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));
|
memset(req, 0, sizeof(*req));
|
||||||
|
|
||||||
/* currently we support only max 8 bit masks so no need to worry
|
/* 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->upload_types[0] = mask;
|
||||||
req->reset_types[0] = mask;
|
req->reset_types[0] = mask;
|
||||||
req->stat_type = HTT_STATS_REQ_CFG_STAT_TYPE_INVALID;
|
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
|
* 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
|
* as it's a waste of resources. By bypassing HTC it is possible to
|
||||||
* avoid extra memory allocations, compress data structures and thus
|
* avoid extra memory allocations, compress data structures and thus
|
||||||
* improve performance. */
|
* improve performance.
|
||||||
|
*/
|
||||||
|
|
||||||
txbuf->htc_hdr.eid = htt->eid;
|
txbuf->htc_hdr.eid = htt->eid;
|
||||||
txbuf->htc_hdr.len = __cpu_to_le16(sizeof(txbuf->cmd_hdr) +
|
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 QCA4019_HW_1_0_PATCH_LOAD_ADDR 0x1234
|
||||||
|
|
||||||
#define ATH10K_FW_FILE_BASE "firmware"
|
#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_API_MIN 2
|
||||||
|
|
||||||
#define ATH10K_FW_API2_FILE "firmware-2.bin"
|
#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 */
|
/* HTT id conflict fix for management frames over HTT */
|
||||||
#define ATH10K_FW_API5_FILE "firmware-5.bin"
|
#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_FILE "utf.bin"
|
||||||
#define ATH10K_FW_UTF_API2_FILE "utf-2.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 appears in nwifi decap, raw and nwifi appear in ethernet decap
|
||||||
* - raw have FCS, nwifi doesn't
|
* - raw have FCS, nwifi doesn't
|
||||||
* - ethernet frames have 802.11 header decapped and parts (base hdr, cipher
|
* - 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 {
|
enum ath10k_hw_txrx_mode {
|
||||||
ATH10K_HW_TXRX_RAW = 0,
|
ATH10K_HW_TXRX_RAW = 0,
|
||||||
|
|
||||||
@ -447,6 +451,9 @@ struct ath10k_hw_params {
|
|||||||
/* hw specific clock control parameters */
|
/* hw specific clock control parameters */
|
||||||
const struct ath10k_hw_clk_params *hw_clk;
|
const struct ath10k_hw_clk_params *hw_clk;
|
||||||
int target_cpu_freq;
|
int target_cpu_freq;
|
||||||
|
|
||||||
|
/* Number of bytes to be discarded for each FFT sample */
|
||||||
|
int spectral_bin_discard;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct htt_rx_desc;
|
struct htt_rx_desc;
|
||||||
|
@ -457,7 +457,8 @@ static int ath10k_clear_vdev_key(struct ath10k_vif *arvif,
|
|||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
/* since ath10k_install_key we can't hold data_lock all the
|
/* 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);
|
spin_lock_bh(&ar->data_lock);
|
||||||
i = 0;
|
i = 0;
|
||||||
list_for_each_entry(peer, &ar->peers, list) {
|
list_for_each_entry(peer, &ar->peers, list) {
|
||||||
@ -609,7 +610,8 @@ static u8 ath10k_parse_mpdudensity(u8 mpdudensity)
|
|||||||
case 2:
|
case 2:
|
||||||
case 3:
|
case 3:
|
||||||
/* Our lower layer calculations limit our precision to
|
/* Our lower layer calculations limit our precision to
|
||||||
1 microsecond */
|
* 1 microsecond
|
||||||
|
*/
|
||||||
return 1;
|
return 1;
|
||||||
case 4:
|
case 4:
|
||||||
return 2;
|
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;
|
arg.channel.band_center_freq2 = chandef->center_freq2;
|
||||||
|
|
||||||
/* TODO setup this dynamically, what in case we
|
/* 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.mode = chan_to_phymode(chandef);
|
||||||
arg.channel.chan_radar =
|
arg.channel.chan_radar =
|
||||||
!!(channel->flags & IEEE80211_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
|
/* TODO setup this based on STA listen interval and
|
||||||
beacon interval. Currently we don't know
|
* beacon interval. Currently we don't know
|
||||||
sta->listen_interval - mac80211 patch required.
|
* sta->listen_interval - mac80211 patch required.
|
||||||
Currently use 10 seconds */
|
* Currently use 10 seconds
|
||||||
|
*/
|
||||||
ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, sta->addr,
|
ret = ath10k_wmi_set_ap_ps_param(ar, arvif->vdev_id, sta->addr,
|
||||||
WMI_AP_PS_PEER_PARAM_AGEOUT_TIME,
|
WMI_AP_PS_PEER_PARAM_AGEOUT_TIME,
|
||||||
10);
|
10);
|
||||||
@ -2451,6 +2455,8 @@ static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
|
|||||||
enum nl80211_band band;
|
enum nl80211_band band;
|
||||||
const u16 *vht_mcs_mask;
|
const u16 *vht_mcs_mask;
|
||||||
u8 ampdu_factor;
|
u8 ampdu_factor;
|
||||||
|
u8 max_nss, vht_mcs;
|
||||||
|
int i;
|
||||||
|
|
||||||
if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
|
if (WARN_ON(ath10k_mac_vif_chan(vif, &def)))
|
||||||
return;
|
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
|
/* Workaround: Some Netgear/Linksys 11ac APs set Rx A-MPDU factor to
|
||||||
* zero in VHT IE. Using it would result in degraded throughput.
|
* zero in VHT IE. Using it would result in degraded throughput.
|
||||||
* arg->peer_max_mpdu at this point contains HT max_mpdu so keep
|
* 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,
|
arg->peer_max_mpdu = max(arg->peer_max_mpdu,
|
||||||
(1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
|
(1U << (IEEE80211_HT_MAX_AMPDU_FACTOR +
|
||||||
ampdu_factor)) - 1);
|
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)
|
if (sta->bandwidth == IEEE80211_STA_RX_BW_160)
|
||||||
arg->peer_flags |= ar->wmi.peer_flags->bw160;
|
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 =
|
arg->peer_vht_rates.rx_max_rate =
|
||||||
__le16_to_cpu(vht_cap->vht_mcs.rx_highest);
|
__le16_to_cpu(vht_cap->vht_mcs.rx_highest);
|
||||||
arg->peer_vht_rates.rx_mcs_set =
|
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
|
/* 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;
|
ht_cap = ap_sta->ht_cap;
|
||||||
vht_cap = ap_sta->vht_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
|
/* FIXME: why use only legacy modes, why not any
|
||||||
* HT/VHT modes? Would that even make any
|
* HT/VHT modes? Would that even make any
|
||||||
* difference? */
|
* difference?
|
||||||
|
*/
|
||||||
if (channel->band == NL80211_BAND_2GHZ)
|
if (channel->band == NL80211_BAND_2GHZ)
|
||||||
ch->mode = MODE_11G;
|
ch->mode = MODE_11G;
|
||||||
else
|
else
|
||||||
@ -3114,7 +3135,8 @@ static void ath10k_regd_update(struct ath10k *ar)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Target allows setting up per-band regdomain but ath_common provides
|
/* 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,
|
ret = ath10k_wmi_pdev_set_regdomain(ar,
|
||||||
regpair->reg_domain,
|
regpair->reg_domain,
|
||||||
regpair->reg_domain, /* 2ghz */
|
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.
|
* never transmitted. We delete the peer upon tx completion.
|
||||||
* It is unlikely that a peer for offchannel tx will already be
|
* 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.
|
* 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 (;;) {
|
for (;;) {
|
||||||
skb = skb_dequeue(&ar->offchan_tx_queue);
|
skb = skb_dequeue(&ar->offchan_tx_queue);
|
||||||
@ -4703,6 +4726,7 @@ static void ath10k_stop(struct ieee80211_hw *hw)
|
|||||||
}
|
}
|
||||||
mutex_unlock(&ar->conf_mutex);
|
mutex_unlock(&ar->conf_mutex);
|
||||||
|
|
||||||
|
cancel_work_sync(&ar->set_coverage_class_work);
|
||||||
cancel_delayed_work_sync(&ar->scan.timeout);
|
cancel_delayed_work_sync(&ar->scan.timeout);
|
||||||
cancel_work_sync(&ar->restart_work);
|
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
|
/* 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);
|
spin_lock_bh(&ar->data_lock);
|
||||||
peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
|
peer = ath10k_peer_find(ar, arvif->vdev_id, peer_addr);
|
||||||
spin_unlock_bh(&ar->data_lock);
|
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;
|
ret = -EOPNOTSUPP;
|
||||||
goto exit;
|
goto exit;
|
||||||
} else {
|
} else {
|
||||||
/* if the peer doesn't exist there is no key to disable
|
/* if the peer doesn't exist there is no key to disable anymore */
|
||||||
* anymore */
|
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -6574,7 +6598,8 @@ static void ath10k_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
|||||||
long time_left;
|
long time_left;
|
||||||
|
|
||||||
/* mac80211 doesn't care if we really xmit queued frames or not
|
/* 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)
|
if (drop)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@ -6625,7 +6650,8 @@ static void ath10k_reconfig_complete(struct ieee80211_hw *hw,
|
|||||||
mutex_lock(&ar->conf_mutex);
|
mutex_lock(&ar->conf_mutex);
|
||||||
|
|
||||||
/* If device failed to restart it will be in a different state, e.g.
|
/* 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) {
|
if (ar->state == ATH10K_STATE_RESTARTED) {
|
||||||
ath10k_info(ar, "device successfully recovered\n");
|
ath10k_info(ar, "device successfully recovered\n");
|
||||||
ar->state = ATH10K_STATE_ON;
|
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
|
/* IMPORTANT: INTR_CLR register has to be set after
|
||||||
* INTR_ENABLE is set to 0, otherwise interrupt can not be
|
* 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,
|
ath10k_pci_write32(ar, SOC_CORE_BASE_ADDRESS + PCIE_INTR_ENABLE_ADDRESS,
|
||||||
0);
|
0);
|
||||||
ath10k_pci_write32(ar, SOC_CORE_BASE_ADDRESS + PCIE_INTR_CLR_ADDRESS,
|
ath10k_pci_write32(ar, SOC_CORE_BASE_ADDRESS + PCIE_INTR_CLR_ADDRESS,
|
||||||
PCIE_INTR_FIRMWARE_MASK | PCIE_INTR_CE_MASK_ALL);
|
PCIE_INTR_FIRMWARE_MASK | PCIE_INTR_CE_MASK_ALL);
|
||||||
|
|
||||||
/* IMPORTANT: this extra read transaction is required to
|
/* 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 +
|
(void)ath10k_pci_read32(ar, SOC_CORE_BASE_ADDRESS +
|
||||||
PCIE_INTR_ENABLE_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);
|
PCIE_INTR_FIRMWARE_MASK | PCIE_INTR_CE_MASK_ALL);
|
||||||
|
|
||||||
/* IMPORTANT: this extra read transaction is required to
|
/* 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 +
|
(void)ath10k_pci_read32(ar, SOC_CORE_BASE_ADDRESS +
|
||||||
PCIE_INTR_ENABLE_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.
|
* host won't know when target writes BAR to CORE_CTRL.
|
||||||
* This write might get lost if target has NOT written BAR.
|
* This write might get lost if target has NOT written BAR.
|
||||||
* For now, fix the race by repeating the write in below
|
* For now, fix the race by repeating the write in below
|
||||||
* synchronization checking. */
|
* synchronization checking.
|
||||||
|
*/
|
||||||
ar_pci->oper_irq_mode = ATH10K_PCI_IRQ_LEGACY;
|
ar_pci->oper_irq_mode = ATH10K_PCI_IRQ_LEGACY;
|
||||||
|
|
||||||
ath10k_pci_write32(ar, SOC_CORE_BASE_ADDRESS + PCIE_INTR_ENABLE_ADDRESS,
|
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 */
|
/* 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_API4_FILE);
|
||||||
MODULE_FIRMWARE(QCA6174_HW_3_0_FW_DIR "/" ATH10K_FW_API5_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 "/" QCA6174_HW_3_0_BOARD_DATA_FILE);
|
||||||
MODULE_FIRMWARE(QCA6174_HW_3_0_FW_DIR "/" ATH10K_BOARD_API2_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
|
* c) A-MSDU subframe header (14 bytes) if appliable
|
||||||
* d) LLC/SNAP (RFC1042, 8 bytes)
|
* 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 {
|
enum rx_msdu_decap_format {
|
||||||
RX_MSDU_DECAP_RAW = 0,
|
RX_MSDU_DECAP_RAW = 0,
|
||||||
|
|
||||||
/* Note: QoS frames are reported as non-QoS. The rx_hdr_status in
|
/* 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,
|
RX_MSDU_DECAP_NATIVE_WIFI = 1,
|
||||||
|
|
||||||
/* Payload contains an ethernet header (struct ethhdr). */
|
/* Payload contains an ethernet header (struct ethhdr). */
|
||||||
RX_MSDU_DECAP_ETHERNET2_DIX = 2,
|
RX_MSDU_DECAP_ETHERNET2_DIX = 2,
|
||||||
|
|
||||||
/* Payload contains two 48-bit addresses and 2-byte length (14 bytes
|
/* 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
|
RX_MSDU_DECAP_8023_SNAP_LLC = 3
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -867,7 +870,7 @@ struct rx_ppdu_start {
|
|||||||
*
|
*
|
||||||
* reserved_9
|
* reserved_9
|
||||||
* Reserved: HW should fill with 0, FW should ignore.
|
* Reserved: HW should fill with 0, FW should ignore.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define RX_PPDU_END_FLAGS_PHY_ERR (1 << 0)
|
#define RX_PPDU_END_FLAGS_PHY_ERR (1 << 0)
|
||||||
#define RX_PPDU_END_FLAGS_RX_LOCATION (1 << 1)
|
#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
|
* Every time HW sets this bit in memory FW/SW must clear this
|
||||||
* bit in memory. FW will initialize all the ppdu_done dword
|
* bit in memory. FW will initialize all the ppdu_done dword
|
||||||
* to 0.
|
* to 0.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define FW_RX_DESC_INFO0_DISCARD (1 << 0)
|
#define FW_RX_DESC_INFO0_DISCARD (1 << 0)
|
||||||
#define FW_RX_DESC_INFO0_FORWARD (1 << 1)
|
#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;
|
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,
|
int ath10k_spectral_process_fft(struct ath10k *ar,
|
||||||
struct wmi_phyerr_ev_arg *phyerr,
|
struct wmi_phyerr_ev_arg *phyerr,
|
||||||
const struct phyerr_fft_report *fftr,
|
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;
|
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)
|
if (bin_len < 64 || bin_len > SPECTRAL_ATH10K_MAX_NUM_BINS)
|
||||||
return -EINVAL;
|
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);
|
reg0 = __le32_to_cpu(fftr->reg0);
|
||||||
reg1 = __le32_to_cpu(fftr->reg1);
|
reg1 = __le32_to_cpu(fftr->reg1);
|
||||||
|
|
||||||
@ -536,15 +544,15 @@ int ath10k_spectral_create(struct ath10k *ar)
|
|||||||
1140, 2500,
|
1140, 2500,
|
||||||
&rfs_spec_scan_cb, NULL);
|
&rfs_spec_scan_cb, NULL);
|
||||||
debugfs_create_file("spectral_scan_ctl",
|
debugfs_create_file("spectral_scan_ctl",
|
||||||
S_IRUSR | S_IWUSR,
|
0600,
|
||||||
ar->debug.debugfs_phy, ar,
|
ar->debug.debugfs_phy, ar,
|
||||||
&fops_spec_scan_ctl);
|
&fops_spec_scan_ctl);
|
||||||
debugfs_create_file("spectral_count",
|
debugfs_create_file("spectral_count",
|
||||||
S_IRUSR | S_IWUSR,
|
0600,
|
||||||
ar->debug.debugfs_phy, ar,
|
ar->debug.debugfs_phy, ar,
|
||||||
&fops_spectral_count);
|
&fops_spectral_count);
|
||||||
debugfs_create_file("spectral_bins",
|
debugfs_create_file("spectral_bins",
|
||||||
S_IRUSR | S_IWUSR,
|
0600,
|
||||||
ar->debug.debugfs_phy, ar,
|
ar->debug.debugfs_phy, ar,
|
||||||
&fops_spectral_bins);
|
&fops_spectral_bins);
|
||||||
|
|
||||||
|
@ -268,13 +268,13 @@ struct host_interest {
|
|||||||
#define HI_OPTION_FW_BRIDGE_SHIFT 0x04
|
#define HI_OPTION_FW_BRIDGE_SHIFT 0x04
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Fw Mode/SubMode Mask
|
* Fw Mode/SubMode Mask
|
||||||
|-----------------------------------------------------------------------------|
|
*-----------------------------------------------------------------------------
|
||||||
| SUB | SUB | SUB | SUB | | | | |
|
* SUB | SUB | SUB | SUB | | | |
|
||||||
|MODE[3] | MODE[2] | MODE[1] | MODE[0] | MODE[3] | MODE[2] | MODE[1] | MODE[0]|
|
*MODE[3] | MODE[2] | MODE[1] | MODE[0] | MODE[3] | MODE[2] | MODE[1] | MODE[0]
|
||||||
| (2) | (2) | (2) | (2) | (2) | (2) | (2) | (2) |
|
* (2) | (2) | (2) | (2) | (2) | (2) | (2) | (2)
|
||||||
|-----------------------------------------------------------------------------|
|
*-----------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
#define HI_OPTION_FW_MODE_BITS 0x2
|
#define HI_OPTION_FW_MODE_BITS 0x2
|
||||||
#define HI_OPTION_FW_MODE_MASK 0x3
|
#define HI_OPTION_FW_MODE_MASK 0x3
|
||||||
#define HI_OPTION_FW_MODE_SHIFT 0xC
|
#define HI_OPTION_FW_MODE_SHIFT 0xC
|
||||||
@ -428,8 +428,9 @@ Fw Mode/SubMode Mask
|
|||||||
#define HI_PWR_SAVE_LPL_ENABLED 0x1
|
#define HI_PWR_SAVE_LPL_ENABLED 0x1
|
||||||
/*b1-b3 reserved*/
|
/*b1-b3 reserved*/
|
||||||
/*b4-b5 : dev0 LPL type : 0 - none
|
/*b4-b5 : dev0 LPL type : 0 - none
|
||||||
1- Reduce Pwr Search
|
* 1- Reduce Pwr Search
|
||||||
2- Reduce Pwr Listen*/
|
* 2- Reduce Pwr Listen
|
||||||
|
*/
|
||||||
/*b6-b7 : dev1 LPL type and so on for Max 8 devices*/
|
/*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_DEV0_LSB 4
|
||||||
#define HI_PWR_SAVE_LPL_DEV_MASK 0x3
|
#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);
|
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);
|
NULL, 0);
|
||||||
|
|
||||||
static struct attribute *ath10k_hwmon_attrs[] = {
|
static struct attribute *ath10k_hwmon_attrs[] = {
|
||||||
@ -191,7 +191,8 @@ int ath10k_thermal_register(struct ath10k *ar)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
/* Avoid linking error on devm_hwmon_device_register_with_groups, I
|
/* 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))
|
if (!IS_REACHABLE(CONFIG_HWMON))
|
||||||
return 0;
|
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
|
/* If the original wait_for_completion() timed out before
|
||||||
* {data,mgmt}_tx_completed() was called then we could complete
|
* {data,mgmt}_tx_completed() was called then we could complete
|
||||||
* offchan_tx_completed for a different skb. Prevent this by using
|
* offchan_tx_completed for a different skb. Prevent this by using
|
||||||
* offchan_tx_skb. */
|
* offchan_tx_skb.
|
||||||
|
*/
|
||||||
spin_lock_bh(&ar->data_lock);
|
spin_lock_bh(&ar->data_lock);
|
||||||
if (ar->offchan_tx_skb != skb) {
|
if (ar->offchan_tx_skb != skb) {
|
||||||
ath10k_warn(ar, "completed old offchannel frame\n");
|
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;
|
return ret;
|
||||||
|
|
||||||
/* FIXME There's no ACK event for Management Tx. This probably
|
/* 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;
|
info->flags |= IEEE80211_TX_STAT_ACK;
|
||||||
ieee80211_tx_status_irqsafe(ar->hw, msdu);
|
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;
|
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.
|
/* 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)) {
|
if (__le32_to_cpu(tim_info->tim_changed)) {
|
||||||
int i;
|
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
|
* before telling mac80211 to decrement CSA counter
|
||||||
*
|
*
|
||||||
* Once CSA counter is completed stop sending beacons until
|
* Once CSA counter is completed stop sending beacons until
|
||||||
* actual channel switch is done */
|
* actual channel switch is done
|
||||||
|
*/
|
||||||
if (arvif->vif->csa_active &&
|
if (arvif->vif->csa_active &&
|
||||||
ieee80211_csa_is_complete(arvif->vif)) {
|
ieee80211_csa_is_complete(arvif->vif)) {
|
||||||
ieee80211_csa_finish(arvif->vif);
|
ieee80211_csa_finish(arvif->vif);
|
||||||
@ -3691,7 +3693,8 @@ radar_detected:
|
|||||||
ATH10K_DFS_STAT_INC(ar, radar_detected);
|
ATH10K_DFS_STAT_INC(ar, radar_detected);
|
||||||
|
|
||||||
/* Control radar events reporting in debugfs file
|
/* Control radar events reporting in debugfs file
|
||||||
dfs_block_radar_events */
|
* dfs_block_radar_events
|
||||||
|
*/
|
||||||
if (ar->dfs_block_radar_events) {
|
if (ar->dfs_block_radar_events) {
|
||||||
ath10k_info(ar, "DFS Radar detected, but ignored as requested\n");
|
ath10k_info(ar, "DFS Radar detected, but ignored as requested\n");
|
||||||
return;
|
return;
|
||||||
@ -4769,9 +4772,10 @@ static void ath10k_wmi_event_service_ready_work(struct work_struct *work)
|
|||||||
num_units = ar->max_num_peers + 1;
|
num_units = ar->max_num_peers + 1;
|
||||||
} else if (num_unit_info & NUM_UNITS_IS_NUM_PEERS) {
|
} else if (num_unit_info & NUM_UNITS_IS_NUM_PEERS) {
|
||||||
/* number of units to allocate is number of
|
/* number of units to allocate is number of
|
||||||
* peers, 1 extra for self peer on target */
|
* peers, 1 extra for self peer on target
|
||||||
/* this needs to be tied, host and target
|
* this needs to be tied, host and target
|
||||||
* can get out of sync */
|
* can get out of sync
|
||||||
|
*/
|
||||||
num_units = ar->max_num_peers + 1;
|
num_units = ar->max_num_peers + 1;
|
||||||
} else if (num_unit_info & NUM_UNITS_IS_NUM_VDEVS) {
|
} else if (num_unit_info & NUM_UNITS_IS_NUM_VDEVS) {
|
||||||
num_units = ar->max_num_vdevs + 1;
|
num_units = ar->max_num_vdevs + 1;
|
||||||
|
@ -1038,7 +1038,8 @@ enum wmi_cmd_id {
|
|||||||
WMI_STA_UAPSD_AUTO_TRIG_CMDID,
|
WMI_STA_UAPSD_AUTO_TRIG_CMDID,
|
||||||
|
|
||||||
/* STA Keep alive parameter configuration,
|
/* STA Keep alive parameter configuration,
|
||||||
Requires WMI_SERVICE_STA_KEEP_ALIVE */
|
* Requires WMI_SERVICE_STA_KEEP_ALIVE
|
||||||
|
*/
|
||||||
WMI_STA_KEEPALIVE_CMD,
|
WMI_STA_KEEPALIVE_CMD,
|
||||||
|
|
||||||
/* misc command group */
|
/* misc command group */
|
||||||
@ -1774,7 +1775,8 @@ static inline const char *ath10k_wmi_phymode_str(enum wmi_phy_mode mode)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
/* no default handler to allow compiler to check that the
|
/* no default handler to allow compiler to check that the
|
||||||
* enum is fully handled */
|
* enum is fully handled
|
||||||
|
*/
|
||||||
};
|
};
|
||||||
|
|
||||||
return "<unknown>";
|
return "<unknown>";
|
||||||
@ -2974,7 +2976,8 @@ struct wmi_start_scan_arg {
|
|||||||
/* When set, DFS channels will not be scanned */
|
/* When set, DFS channels will not be scanned */
|
||||||
#define WMI_SCAN_BYPASS_DFS_CHN 0x40
|
#define WMI_SCAN_BYPASS_DFS_CHN 0x40
|
||||||
/* Different FW scan engine may choose to bail out on errors.
|
/* 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
|
#define WMI_SCAN_CONTINUE_ON_ERROR 0x80
|
||||||
|
|
||||||
/* WMI_SCAN_CLASS_MASK must be the same value as IEEE80211_SCAN_CLASS_MASK */
|
/* 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 */
|
/* values for vdev_start_request flags */
|
||||||
/*
|
/*
|
||||||
* Indicates that AP VDEV uses hidden ssid. only valid for
|
* Indicates that AP VDEV uses hidden ssid. only valid for
|
||||||
* AP/GO */
|
* AP/GO
|
||||||
|
*/
|
||||||
#define WMI_VDEV_START_HIDDEN_SSID (1 << 0)
|
#define WMI_VDEV_START_HIDDEN_SSID (1 << 0)
|
||||||
/*
|
/*
|
||||||
* Indicates if robust management frame/management frame
|
* Indicates if robust management frame/management frame
|
||||||
* protection is enabled. For GO/AP vdevs, it indicates that
|
* protection is enabled. For GO/AP vdevs, it indicates that
|
||||||
* it may support station/client associations with RMF enabled.
|
* it may support station/client associations with RMF enabled.
|
||||||
* For STA/client vdevs, it indicates that sta will
|
* 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)
|
#define WMI_VDEV_START_PMF_ENABLED (1 << 1)
|
||||||
|
|
||||||
struct wmi_p2p_noa_descriptor {
|
struct wmi_p2p_noa_descriptor {
|
||||||
@ -4814,7 +4819,8 @@ enum wmi_vdev_param {
|
|||||||
* An associated STA is considered unresponsive if there is no recent
|
* An associated STA is considered unresponsive if there is no recent
|
||||||
* TX/RX activity and downlink frames are buffered for it. Once a STA
|
* TX/RX activity and downlink frames are buffered for it. Once a STA
|
||||||
* exceeds the maximum unresponsive time, the AP will send a
|
* 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,
|
WMI_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS,
|
||||||
|
|
||||||
/* Enable NAWDS : MCAST INSPECT Enable, NAWDS Flag set */
|
/* 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
|
* An associated STA is considered unresponsive if there is no recent
|
||||||
* TX/RX activity and downlink frames are buffered for it. Once a STA
|
* TX/RX activity and downlink frames are buffered for it. Once a STA
|
||||||
* exceeds the maximum unresponsive time, the AP will send a
|
* 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,
|
WMI_10X_VDEV_PARAM_AP_KEEPALIVE_MAX_UNRESPONSIVE_TIME_SECS,
|
||||||
|
|
||||||
/* Enable NAWDS : MCAST INSPECT Enable, NAWDS Flag set */
|
/* Enable NAWDS : MCAST INSPECT Enable, NAWDS Flag set */
|
||||||
@ -5605,12 +5612,14 @@ struct wmi_tim_info_arg {
|
|||||||
|
|
||||||
struct wmi_p2p_noa_info {
|
struct wmi_p2p_noa_info {
|
||||||
/* Bit 0 - Flag to indicate an update in NOA schedule
|
/* Bit 0 - Flag to indicate an update in NOA schedule
|
||||||
Bits 7-1 - Reserved */
|
* Bits 7-1 - Reserved
|
||||||
|
*/
|
||||||
u8 changed;
|
u8 changed;
|
||||||
/* NOA index */
|
/* NOA index */
|
||||||
u8 index;
|
u8 index;
|
||||||
/* Bit 0 - Opp PS state of the AP
|
/* Bit 0 - Opp PS state of the AP
|
||||||
Bits 1-7 - Ctwindow in TUs */
|
* Bits 1-7 - Ctwindow in TUs
|
||||||
|
*/
|
||||||
u8 ctwindow_oppps;
|
u8 ctwindow_oppps;
|
||||||
/* Number of NOA descriptors */
|
/* Number of NOA descriptors */
|
||||||
u8 num_descriptors;
|
u8 num_descriptors;
|
||||||
@ -6000,7 +6009,8 @@ struct wmi_main_peer_assoc_complete_cmd {
|
|||||||
struct wmi_common_peer_assoc_complete_cmd cmd;
|
struct wmi_common_peer_assoc_complete_cmd cmd;
|
||||||
|
|
||||||
/* HT Operation Element of the peer. Five bytes packed in 2
|
/* 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];
|
__le32 peer_ht_info[2];
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
|
@ -63,6 +63,7 @@ int ath6kl_read_tgt_stats(struct ath6kl *ar, struct ath6kl_vif *vif);
|
|||||||
|
|
||||||
#ifdef CONFIG_ATH6KL_DEBUG
|
#ifdef CONFIG_ATH6KL_DEBUG
|
||||||
|
|
||||||
|
__printf(2, 3)
|
||||||
void ath6kl_dbg(enum ATH6K_DEBUG_MASK mask, const char *fmt, ...);
|
void ath6kl_dbg(enum ATH6K_DEBUG_MASK mask, const char *fmt, ...);
|
||||||
void ath6kl_dbg_dump(enum ATH6K_DEBUG_MASK mask,
|
void ath6kl_dbg_dump(enum ATH6K_DEBUG_MASK mask,
|
||||||
const char *msg, const char *prefix,
|
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);
|
void ath6kl_debug_cleanup(struct ath6kl *ar);
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
__printf(2, 3)
|
||||||
static inline void ath6kl_dbg(enum ATH6K_DEBUG_MASK dbg_mask,
|
static inline void ath6kl_dbg(enum ATH6K_DEBUG_MASK dbg_mask,
|
||||||
const char *fmt, ...)
|
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)) {
|
if (netlen < (payload_len + HTC_HDR_LENGTH)) {
|
||||||
ath6kl_dbg(ATH6KL_DBG_HTC,
|
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);
|
netlen, payload_len + HTC_HDR_LENGTH);
|
||||||
status = -EINVAL;
|
status = -EINVAL;
|
||||||
goto free_skb;
|
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);
|
rate = le32_to_cpu(ev->rate);
|
||||||
pkts = le32_to_cpu(ev->pkts);
|
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);
|
vif->bssid, rate, pkts, vif->txe_intvl);
|
||||||
|
|
||||||
cfg80211_cqm_txe_notify(vif->ndev, vif->bssid, pkts,
|
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))
|
if ((i >= AR5416_MAX_CHAINS) && !IS_CHAN_HT40(chan))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (h)
|
if (ah->nf_override)
|
||||||
|
nfval = ah->nf_override;
|
||||||
|
else if (h)
|
||||||
nfval = h[i].privNF;
|
nfval = h[i].privNF;
|
||||||
else
|
else
|
||||||
nfval = default_nf;
|
nfval = default_nf;
|
||||||
@ -348,6 +350,7 @@ int ath9k_hw_loadnf(struct ath_hw *ah, struct ath9k_channel *chan)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL(ath9k_hw_loadnf);
|
||||||
|
|
||||||
|
|
||||||
static void ath9k_hw_nf_sanitize(struct ath_hw *ah, s16 *nf)
|
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,
|
.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 */
|
/* Ethtool support for get-stats */
|
||||||
|
|
||||||
#define AMKSTR(nm) #nm "_BE", #nm "_BK", #nm "_VI", #nm "_VO"
|
#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,
|
debugfs_create_u16("airtime_flags", S_IRUSR | S_IWUSR,
|
||||||
sc->debug.debugfs_phy, &sc->airtime_flags);
|
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;
|
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,
|
static bool ath9k_hw_nvram_read_array(u16 *blob, size_t blob_size,
|
||||||
off_t offset, u16 *data)
|
off_t offset, u16 *data)
|
||||||
{
|
{
|
||||||
if (offset > blob_size)
|
if (offset >= blob_size)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
*data = blob[offset];
|
*data = blob[offset];
|
||||||
|
@ -106,7 +106,7 @@
|
|||||||
#define AR9285_RDEXT_DEFAULT 0x1F
|
#define AR9285_RDEXT_DEFAULT 0x1F
|
||||||
|
|
||||||
#define ATH9K_POW_SM(_r, _s) (((_r) & 0x3f) << (_s))
|
#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 FBIN2FREQ(x, y) ((y) ? (2300 + x) : (4800 + 5 * x))
|
||||||
#define ath9k_hw_use_flash(_ah) (!(_ah->ah_flags & AH_USE_EEPROM))
|
#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;
|
u8 bulk_out_ep;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
|
if (iface_desc->desc.bNumEndpoints < 2)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
/* Find bulk out endpoint */
|
/* Find bulk out endpoint */
|
||||||
for (r = 1; r >= 0; r--) {
|
for (r = 1; r >= 0; r--) {
|
||||||
endpoint = &iface_desc->endpoint[r].desc;
|
endpoint = &iface_desc->endpoint[r].desc;
|
||||||
|
@ -803,6 +803,7 @@ struct ath_hw {
|
|||||||
u32 rfkill_gpio;
|
u32 rfkill_gpio;
|
||||||
u32 rfkill_polarity;
|
u32 rfkill_polarity;
|
||||||
u32 ah_flags;
|
u32 ah_flags;
|
||||||
|
s16 nf_override;
|
||||||
|
|
||||||
bool reset_power_on;
|
bool reset_power_on;
|
||||||
bool htc_reset_init;
|
bool htc_reset_init;
|
||||||
|
@ -383,6 +383,11 @@ static const struct pci_device_id ath_pci_id_table[] = {
|
|||||||
0x10CF, /* Fujitsu */
|
0x10CF, /* Fujitsu */
|
||||||
0x1783),
|
0x1783),
|
||||||
.driver_data = ATH9K_PCI_WOW },
|
.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) */
|
/* Killer Wireless (2x2) */
|
||||||
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
{ PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
|
||||||
|
@ -254,8 +254,12 @@ bool ath_is_49ghz_allowed(u16 regdomain)
|
|||||||
EXPORT_SYMBOL(ath_is_49ghz_allowed);
|
EXPORT_SYMBOL(ath_is_49ghz_allowed);
|
||||||
|
|
||||||
/* Frequency is one where radar detection is required */
|
/* 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);
|
return (center_freq >= 5260 && center_freq <= 5700);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -306,7 +310,7 @@ __ath_reg_apply_beaconing_flags(struct wiphy *wiphy,
|
|||||||
enum nl80211_reg_initiator initiator,
|
enum nl80211_reg_initiator initiator,
|
||||||
struct ieee80211_channel *ch)
|
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))
|
(ch->flags & IEEE80211_CHAN_RADAR))
|
||||||
return;
|
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 */
|
/* Always apply Radar/DFS rules on freq range 5500 MHz - 5700 MHz */
|
||||||
static void ath_reg_apply_radar_flags(struct wiphy *wiphy)
|
static void ath_reg_apply_radar_flags(struct wiphy *wiphy,
|
||||||
|
struct ath_regulatory *reg)
|
||||||
{
|
{
|
||||||
struct ieee80211_supported_band *sband;
|
struct ieee80211_supported_band *sband;
|
||||||
struct ieee80211_channel *ch;
|
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++) {
|
for (i = 0; i < sband->n_channels; i++) {
|
||||||
ch = &sband->channels[i];
|
ch = &sband->channels[i];
|
||||||
if (!ath_is_radar_freq(ch->center_freq))
|
if (!ath_is_radar_freq(ch->center_freq, reg))
|
||||||
continue;
|
continue;
|
||||||
/* We always enable radar detection/DFS on this
|
/* We always enable radar detection/DFS on this
|
||||||
* frequency range. Additionally we also apply on
|
* 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,
|
struct ath_common *common = container_of(reg, struct ath_common,
|
||||||
regulatory);
|
regulatory);
|
||||||
/* We always apply this */
|
/* 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
|
* 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);
|
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);
|
ath_reg_apply_world_flags(wiphy, NL80211_REGDOM_SET_BY_DRIVER, reg);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1563,12 +1563,6 @@ static int wil_cfg80211_set_power_mgmt(struct wiphy *wiphy,
|
|||||||
{
|
{
|
||||||
struct wil6210_priv *wil = wiphy_to_wil(wiphy);
|
struct wil6210_priv *wil = wiphy_to_wil(wiphy);
|
||||||
enum wmi_ps_profile_type ps_profile;
|
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",
|
wil_dbg_misc(wil, "enabled=%d, timeout=%d\n",
|
||||||
enabled, timeout);
|
enabled, timeout);
|
||||||
@ -1578,11 +1572,7 @@ static int wil_cfg80211_set_power_mgmt(struct wiphy *wiphy,
|
|||||||
else
|
else
|
||||||
ps_profile = WMI_PS_PROFILE_TYPE_PS_DISABLED;
|
ps_profile = WMI_PS_PROFILE_TYPE_PS_DISABLED;
|
||||||
|
|
||||||
rc = wmi_ps_dev_profile_cfg(wil, ps_profile);
|
return wil_ps_update(wil, ps_profile);
|
||||||
if (rc)
|
|
||||||
wil_err(wil, "wmi_ps_dev_profile_cfg failed (%d)\n", rc);
|
|
||||||
|
|
||||||
return rc;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct cfg80211_ops wil_cfg80211_ops = {
|
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)
|
if (!buf)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
wil_memcpy_fromio_halp_vote(wil_blob->wil, buf,
|
wil_memcpy_fromio_32(buf, (const void __iomem *)
|
||||||
(const volatile void __iomem *)
|
wil_blob->blob.data + pos, count);
|
||||||
wil_blob->blob.data + pos, count);
|
|
||||||
|
|
||||||
ret = copy_to_user(user_buf, buf, count);
|
ret = copy_to_user(user_buf, buf, count);
|
||||||
kfree(buf);
|
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));
|
rc = request_firmware(&fw, name, wil_to_dev(wil));
|
||||||
if (!rc)
|
if (!rc)
|
||||||
release_firmware(fw);
|
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;
|
u32 *d = dst;
|
||||||
const volatile u32 __iomem *s = src;
|
const volatile u32 __iomem *s = src;
|
||||||
|
|
||||||
/* size_t is unsigned, if (count%4 != 0) it will wrap */
|
for (; count >= 4; count -= 4)
|
||||||
for (count += 4; count > 4; count -= 4)
|
|
||||||
*d++ = __raw_readl(s++);
|
*d++ = __raw_readl(s++);
|
||||||
}
|
|
||||||
|
|
||||||
void wil_memcpy_fromio_halp_vote(struct wil6210_priv *wil, void *dst,
|
if (unlikely(count)) {
|
||||||
const volatile void __iomem *src, size_t count)
|
/* count can be 1..3 */
|
||||||
{
|
u32 tmp = __raw_readl(s);
|
||||||
wil_halp_vote(wil);
|
|
||||||
wil_memcpy_fromio_32(dst, src, count);
|
memcpy(d, &tmp, count);
|
||||||
wil_halp_unvote(wil);
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void wil_memcpy_toio_32(volatile void __iomem *dst, const void *src,
|
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;
|
volatile u32 __iomem *d = dst;
|
||||||
const u32 *s = src;
|
const u32 *s = src;
|
||||||
|
|
||||||
for (count += 4; count > 4; count -= 4)
|
for (; count >= 4; count -= 4)
|
||||||
__raw_writel(*s++, d++);
|
__raw_writel(*s++, d++);
|
||||||
}
|
|
||||||
|
|
||||||
void wil_memcpy_toio_halp_vote(struct wil6210_priv *wil,
|
if (unlikely(count)) {
|
||||||
volatile void __iomem *dst,
|
/* count can be 1..3 */
|
||||||
const void *src, size_t count)
|
u32 tmp = 0;
|
||||||
{
|
|
||||||
wil_halp_vote(wil);
|
memcpy(&tmp, s, count);
|
||||||
wil_memcpy_toio_32(dst, src, count);
|
__raw_writel(tmp, d);
|
||||||
wil_halp_unvote(wil);
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void wil_disconnect_cid(struct wil6210_priv *wil, int cid,
|
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)
|
if (rx_ring_overflow_thrsh == WIL6210_RX_HIGH_TRSH_INIT)
|
||||||
rx_ring_overflow_thrsh = WIL6210_RX_HIGH_TRSH_DEFAULT;
|
rx_ring_overflow_thrsh = WIL6210_RX_HIGH_TRSH_DEFAULT;
|
||||||
|
|
||||||
|
wil->ps_profile = WMI_PS_PROFILE_TYPE_DEFAULT;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
out_wmi_wq:
|
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.
|
* We reset all the structures, and we reset the UMAC.
|
||||||
* After calling this routine, you're expected to reload
|
* 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*/
|
/* Disable device led before reset*/
|
||||||
wmi_led_cfg(wil, false);
|
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 */
|
/* prevent NAPI from being scheduled and prevent wmi commands */
|
||||||
mutex_lock(&wil->wmi_mutex);
|
mutex_lock(&wil->wmi_mutex);
|
||||||
bitmap_zero(wil->status, wil_status_last);
|
bitmap_zero(wil->status, wil_status_last);
|
||||||
mutex_unlock(&wil->wmi_mutex);
|
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);
|
wil_mask_irq(wil);
|
||||||
|
|
||||||
wmi_event_flush(wil);
|
wmi_event_flush(wil);
|
||||||
@ -1033,6 +1051,9 @@ int wil_reset(struct wil6210_priv *wil, bool load_fw)
|
|||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (wil->ps_profile != WMI_PS_PROFILE_TYPE_DEFAULT)
|
||||||
|
wil_ps_update(wil, wil->ps_profile);
|
||||||
|
|
||||||
wil_collect_fw_info(wil);
|
wil_collect_fw_info(wil);
|
||||||
|
|
||||||
if (wil->platform_ops.notify) {
|
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");
|
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 netif up, hardware is alive, shut it down */
|
||||||
if (ndev->flags & IFF_UP) {
|
if (ndev->flags & IFF_UP) {
|
||||||
rc = wil_down(wil);
|
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);
|
rc = wil->platform_ops.suspend(wil->platform_handle);
|
||||||
|
if (rc) {
|
||||||
|
wil_enable_irq(wil);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
set_bit(wil_status_suspended, wil->status);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
wil_dbg_pm(wil, "suspend: %s => %d\n",
|
wil_dbg_pm(wil, "suspend: %s => %d\n",
|
||||||
is_runtime ? "runtime" : "system", rc);
|
is_runtime ? "runtime" : "system", rc);
|
||||||
|
|
||||||
return 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
|
/* if netif up, bring hardware up
|
||||||
* During open(), IFF_UP set after actual device method
|
* 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)
|
if (ndev->flags & IFF_UP)
|
||||||
rc = wil_up(wil);
|
rc = wil_up(wil);
|
||||||
|
else
|
||||||
|
clear_bit(wil_status_suspended, wil->status);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
wil_dbg_pm(wil, "resume: %s => %d\n",
|
wil_dbg_pm(wil, "resume: %s => %d\n",
|
||||||
|
@ -200,7 +200,7 @@ void wil_pmc_alloc(struct wil6210_priv *wil,
|
|||||||
|
|
||||||
release_pmc_skbs:
|
release_pmc_skbs:
|
||||||
wil_err(wil, "exit on error: Releasing skbs...\n");
|
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,
|
dma_free_coherent(dev,
|
||||||
descriptor_size,
|
descriptor_size,
|
||||||
pmc->descriptors[i].va,
|
pmc->descriptors[i].va,
|
||||||
@ -283,7 +283,7 @@ void wil_pmc_free(struct wil6210_priv *wil, int send_pmc_cmd)
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0;
|
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,
|
dma_free_coherent(dev,
|
||||||
pmc->descriptor_size,
|
pmc->descriptor_size,
|
||||||
pmc->descriptors[i].va,
|
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");
|
wil_err(wil, "BACK requested unsupported ba_policy == 1\n");
|
||||||
status = WLAN_STATUS_INVALID_QOS_PARAM;
|
status = WLAN_STATUS_INVALID_QOS_PARAM;
|
||||||
}
|
}
|
||||||
if (status == WLAN_STATUS_SUCCESS)
|
if (status == WLAN_STATUS_SUCCESS) {
|
||||||
agg_wsize = wil_agg_size(wil, req_agg_wsize);
|
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,
|
rc = wmi_addba_rx_resp(wil, cid, tid, dialog_token, status,
|
||||||
agg_amsdu, agg_wsize, agg_timeout);
|
agg_amsdu, agg_wsize, agg_timeout);
|
||||||
|
@ -37,6 +37,10 @@ bool rx_align_2;
|
|||||||
module_param(rx_align_2, bool, 0444);
|
module_param(rx_align_2, bool, 0444);
|
||||||
MODULE_PARM_DESC(rx_align_2, " align Rx buffers on 4*n+2, default - no");
|
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)
|
static inline uint wil_rx_snaplen(void)
|
||||||
{
|
{
|
||||||
return rx_align_2 ? 6 : 0;
|
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)
|
u32 i, int headroom)
|
||||||
{
|
{
|
||||||
struct device *dev = wil_to_dev(wil);
|
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 = ⅆ
|
struct vring_rx_desc dd, *d = ⅆ
|
||||||
volatile struct vring_rx_desc *_d = &vring->va[i].rx;
|
volatile struct vring_rx_desc *_d = &vring->va[i].rx;
|
||||||
dma_addr_t pa;
|
dma_addr_t pa;
|
||||||
@ -419,7 +423,7 @@ static struct sk_buff *wil_vring_reap_rx(struct wil6210_priv *wil,
|
|||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
dma_addr_t pa;
|
dma_addr_t pa;
|
||||||
unsigned int snaplen = wil_rx_snaplen();
|
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;
|
u16 dmalen;
|
||||||
u8 ftype;
|
u8 ftype;
|
||||||
int cid;
|
int cid;
|
||||||
@ -780,6 +784,20 @@ void wil_rx_handle(struct wil6210_priv *wil, int *quota)
|
|||||||
wil_rx_refill(wil, v->size);
|
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)
|
int wil_rx_init(struct wil6210_priv *wil, u16 size)
|
||||||
{
|
{
|
||||||
struct vring *vring = &wil->vring_rx;
|
struct vring *vring = &wil->vring_rx;
|
||||||
@ -792,6 +810,8 @@ int wil_rx_init(struct wil6210_priv *wil, u16 size)
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wil_rx_buf_len_init(wil);
|
||||||
|
|
||||||
vring->size = size;
|
vring->size = size;
|
||||||
rc = wil_vring_alloc(wil, vring);
|
rc = wil_vring_alloc(wil, vring);
|
||||||
if (rc)
|
if (rc)
|
||||||
|
@ -32,6 +32,7 @@ extern unsigned short rx_ring_overflow_thrsh;
|
|||||||
extern int agg_wsize;
|
extern int agg_wsize;
|
||||||
extern u32 vring_idle_trsh;
|
extern u32 vring_idle_trsh;
|
||||||
extern bool rx_align_2;
|
extern bool rx_align_2;
|
||||||
|
extern bool rx_large_buf;
|
||||||
extern bool debug_fw;
|
extern bool debug_fw;
|
||||||
extern bool disable_ap_sme;
|
extern bool disable_ap_sme;
|
||||||
|
|
||||||
@ -411,6 +412,7 @@ enum { /* for wil6210_priv.status */
|
|||||||
wil_status_irqen, /* FIXME: interrupts enabled - for debug */
|
wil_status_irqen, /* FIXME: interrupts enabled - for debug */
|
||||||
wil_status_napi_en, /* NAPI enabled protected by wil->mutex */
|
wil_status_napi_en, /* NAPI enabled protected by wil->mutex */
|
||||||
wil_status_resetting, /* reset in progress */
|
wil_status_resetting, /* reset in progress */
|
||||||
|
wil_status_suspended, /* suspend completed, device is suspended */
|
||||||
wil_status_last /* keep last */
|
wil_status_last /* keep last */
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -656,6 +658,7 @@ struct wil6210_priv {
|
|||||||
struct work_struct probe_client_worker;
|
struct work_struct probe_client_worker;
|
||||||
/* DMA related */
|
/* DMA related */
|
||||||
struct vring vring_rx;
|
struct vring vring_rx;
|
||||||
|
unsigned int rx_buf_len;
|
||||||
struct vring vring_tx[WIL6210_MAX_TX_RINGS];
|
struct vring vring_tx[WIL6210_MAX_TX_RINGS];
|
||||||
struct vring_tx_data vring_tx_data[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 */
|
u8 vring2cid_tid[WIL6210_MAX_TX_RINGS][2]; /* [0] - CID, [1] - TID */
|
||||||
@ -691,6 +694,8 @@ struct wil6210_priv {
|
|||||||
/* High Access Latency Policy voting */
|
/* High Access Latency Policy voting */
|
||||||
struct wil_halp halp;
|
struct wil_halp halp;
|
||||||
|
|
||||||
|
enum wmi_ps_profile_type ps_profile;
|
||||||
|
|
||||||
#ifdef CONFIG_PM
|
#ifdef CONFIG_PM
|
||||||
#ifdef CONFIG_PM_SLEEP
|
#ifdef CONFIG_PM_SLEEP
|
||||||
struct notifier_block pm_notify;
|
struct notifier_block pm_notify;
|
||||||
@ -799,12 +804,6 @@ void wil_memcpy_fromio_32(void *dst, const volatile void __iomem *src,
|
|||||||
size_t count);
|
size_t count);
|
||||||
void wil_memcpy_toio_32(volatile void __iomem *dst, const void *src,
|
void wil_memcpy_toio_32(volatile void __iomem *dst, const void *src,
|
||||||
size_t count);
|
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_alloc(struct device *dev);
|
||||||
void wil_if_free(struct wil6210_priv *wil);
|
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);
|
void wil_if_remove(struct wil6210_priv *wil);
|
||||||
int wil_priv_init(struct wil6210_priv *wil);
|
int wil_priv_init(struct wil6210_priv *wil);
|
||||||
void wil_priv_deinit(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);
|
int wil_reset(struct wil6210_priv *wil, bool no_fw);
|
||||||
void wil_fw_error_recovery(struct wil6210_priv *wil);
|
void wil_fw_error_recovery(struct wil6210_priv *wil);
|
||||||
void wil_set_recovery_state(struct wil6210_priv *wil, int state);
|
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;
|
assoc_resp_ielen = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
mutex_lock(&wil->mutex);
|
|
||||||
if (test_bit(wil_status_resetting, wil->status) ||
|
if (test_bit(wil_status_resetting, wil->status) ||
|
||||||
!test_bit(wil_status_fwready, wil->status)) {
|
!test_bit(wil_status_fwready, wil->status)) {
|
||||||
wil_err(wil, "status_resetting, cancel connect event, CID %d\n",
|
wil_err(wil, "status_resetting, cancel connect event, CID %d\n",
|
||||||
evt->cid);
|
evt->cid);
|
||||||
mutex_unlock(&wil->mutex);
|
|
||||||
/* no need for cleanup, wil_reset will do that */
|
/* no need for cleanup, wil_reset will do that */
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mutex_lock(&wil->mutex);
|
||||||
|
|
||||||
if ((wdev->iftype == NL80211_IFTYPE_STATION) ||
|
if ((wdev->iftype == NL80211_IFTYPE_STATION) ||
|
||||||
(wdev->iftype == NL80211_IFTYPE_P2P_CLIENT)) {
|
(wdev->iftype == NL80211_IFTYPE_P2P_CLIENT)) {
|
||||||
if (!test_bit(wil_status_fwconnecting, wil->status)) {
|
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++;
|
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);
|
mutex_lock(&wil->mutex);
|
||||||
wil6210_disconnect(wil, evt->bssid, reason_code, true);
|
wil6210_disconnect(wil, evt->bssid, reason_code, true);
|
||||||
mutex_unlock(&wil->mutex);
|
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 = {
|
struct wmi_cfg_rx_chain_cmd cmd = {
|
||||||
.action = WMI_RX_CHAIN_ADD,
|
.action = WMI_RX_CHAIN_ADD,
|
||||||
.rx_sw_ring = {
|
.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_mem_base = cpu_to_le64(vring->pa),
|
||||||
.ring_size = cpu_to_le16(vring->size),
|
.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_MGMT_RETRY_LIMIT = 3,
|
||||||
WMI_FW_CAPABILITY_DISABLE_AP_SME = 4,
|
WMI_FW_CAPABILITY_DISABLE_AP_SME = 4,
|
||||||
WMI_FW_CAPABILITY_WMI_ONLY = 5,
|
WMI_FW_CAPABILITY_WMI_ONLY = 5,
|
||||||
|
WMI_FW_CAPABILITY_THERMAL_THROTTLING = 7,
|
||||||
WMI_FW_CAPABILITY_MAX,
|
WMI_FW_CAPABILITY_MAX,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -142,8 +143,6 @@ enum wmi_command_id {
|
|||||||
WMI_MAINTAIN_RESUME_CMDID = 0x851,
|
WMI_MAINTAIN_RESUME_CMDID = 0x851,
|
||||||
WMI_RS_MGMT_CMDID = 0x852,
|
WMI_RS_MGMT_CMDID = 0x852,
|
||||||
WMI_RF_MGMT_CMDID = 0x853,
|
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_READ_CMDID = 0x856,
|
||||||
WMI_OTP_WRITE_CMDID = 0x857,
|
WMI_OTP_WRITE_CMDID = 0x857,
|
||||||
WMI_LED_CFG_CMDID = 0x858,
|
WMI_LED_CFG_CMDID = 0x858,
|
||||||
@ -192,6 +191,8 @@ enum wmi_command_id {
|
|||||||
WMI_GET_MGMT_RETRY_LIMIT_CMDID = 0x931,
|
WMI_GET_MGMT_RETRY_LIMIT_CMDID = 0x931,
|
||||||
WMI_NEW_STA_CMDID = 0x935,
|
WMI_NEW_STA_CMDID = 0x935,
|
||||||
WMI_DEL_STA_CMDID = 0x936,
|
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_SESSION_START_CMDID = 0x991,
|
||||||
WMI_TOF_GET_CAPABILITIES_CMDID = 0x992,
|
WMI_TOF_GET_CAPABILITIES_CMDID = 0x992,
|
||||||
WMI_TOF_SET_LCR_CMDID = 0x993,
|
WMI_TOF_SET_LCR_CMDID = 0x993,
|
||||||
@ -438,16 +439,6 @@ struct wmi_rf_mgmt_cmd {
|
|||||||
__le32 rf_mgmt_type;
|
__le32 rf_mgmt_type;
|
||||||
} __packed;
|
} __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 */
|
/* WMI_RF_RX_TEST_CMDID */
|
||||||
struct wmi_rf_rx_test_cmd {
|
struct wmi_rf_rx_test_cmd {
|
||||||
__le32 sector;
|
__le32 sector;
|
||||||
@ -549,7 +540,7 @@ struct wmi_pcp_start_cmd {
|
|||||||
u8 hidden_ssid;
|
u8 hidden_ssid;
|
||||||
u8 is_go;
|
u8 is_go;
|
||||||
u8 reserved0[5];
|
u8 reserved0[5];
|
||||||
/* abft_len override if non-0 */
|
/* A-BFT length override if non-0 */
|
||||||
u8 abft_len;
|
u8 abft_len;
|
||||||
u8 disable_ap_sme;
|
u8 disable_ap_sme;
|
||||||
u8 network_type;
|
u8 network_type;
|
||||||
@ -910,6 +901,39 @@ struct wmi_set_mgmt_retry_limit_cmd {
|
|||||||
u8 reserved[3];
|
u8 reserved[3];
|
||||||
} __packed;
|
} __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 */
|
/* WMI_NEW_STA_CMDID */
|
||||||
struct wmi_new_sta_cmd {
|
struct wmi_new_sta_cmd {
|
||||||
u8 dst_mac[WMI_MAC_LEN];
|
u8 dst_mac[WMI_MAC_LEN];
|
||||||
@ -1040,7 +1064,6 @@ enum wmi_event_id {
|
|||||||
WMI_BF_RXSS_MGMT_DONE_EVENTID = 0x1839,
|
WMI_BF_RXSS_MGMT_DONE_EVENTID = 0x1839,
|
||||||
WMI_RS_MGMT_DONE_EVENTID = 0x1852,
|
WMI_RS_MGMT_DONE_EVENTID = 0x1852,
|
||||||
WMI_RF_MGMT_STATUS_EVENTID = 0x1853,
|
WMI_RF_MGMT_STATUS_EVENTID = 0x1853,
|
||||||
WMI_THERMAL_THROTTLING_STATUS_EVENTID = 0x1855,
|
|
||||||
WMI_BF_SM_MGMT_DONE_EVENTID = 0x1838,
|
WMI_BF_SM_MGMT_DONE_EVENTID = 0x1838,
|
||||||
WMI_RX_MGMT_PACKET_EVENTID = 0x1840,
|
WMI_RX_MGMT_PACKET_EVENTID = 0x1840,
|
||||||
WMI_TX_MGMT_PACKET_EVENTID = 0x1841,
|
WMI_TX_MGMT_PACKET_EVENTID = 0x1841,
|
||||||
@ -1090,6 +1113,8 @@ enum wmi_event_id {
|
|||||||
WMI_BRP_SET_ANT_LIMIT_EVENTID = 0x1924,
|
WMI_BRP_SET_ANT_LIMIT_EVENTID = 0x1924,
|
||||||
WMI_SET_MGMT_RETRY_LIMIT_EVENTID = 0x1930,
|
WMI_SET_MGMT_RETRY_LIMIT_EVENTID = 0x1930,
|
||||||
WMI_GET_MGMT_RETRY_LIMIT_EVENTID = 0x1931,
|
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_SESSION_END_EVENTID = 0x1991,
|
||||||
WMI_TOF_GET_CAPABILITIES_EVENTID = 0x1992,
|
WMI_TOF_GET_CAPABILITIES_EVENTID = 0x1992,
|
||||||
WMI_TOF_SET_LCR_EVENTID = 0x1993,
|
WMI_TOF_SET_LCR_EVENTID = 0x1993,
|
||||||
@ -1133,13 +1158,6 @@ struct wmi_rf_mgmt_status_event {
|
|||||||
__le32 rf_status;
|
__le32 rf_status;
|
||||||
} __packed;
|
} __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 */
|
/* WMI_GET_STATUS_DONE_EVENTID */
|
||||||
struct wmi_get_status_done_event {
|
struct wmi_get_status_done_event {
|
||||||
__le32 is_associated;
|
__le32 is_associated;
|
||||||
@ -2206,6 +2224,19 @@ struct wmi_tof_get_capabilities_event {
|
|||||||
__le32 aoa_supported_types;
|
__le32 aoa_supported_types;
|
||||||
} __packed;
|
} __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 {
|
enum wmi_tof_session_end_status {
|
||||||
WMI_TOF_SESSION_END_NO_ERROR = 0x00,
|
WMI_TOF_SESSION_END_NO_ERROR = 0x00,
|
||||||
WMI_TOF_SESSION_END_FAIL = 0x01,
|
WMI_TOF_SESSION_END_FAIL = 0x01,
|
||||||
|
Loading…
Reference in New Issue
Block a user