mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-12 08:48:48 +00:00
wireless-drivers-next patches for 4.15
Mostly fixes this time, but also few new features. Major changes: wil6210 * remove ssid debugfs file rsi * add WOWLAN support for suspend, hibernate and shutdown states ath10k * add support for CCMP-256, GCMP and GCMP-256 ciphers on hardware where it's supported (QCA99x0 and QCA4019) -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAABAgAGBQJZ/HSCAAoJEG4XJFUm622b2sQH+wXgE1swS9xp1AfV3hcVLGoJ YjLjR3/BAxsIqkYwhswarTDrD3jsOKrL4ywRk+0BAdR7f2BeOYhQXtZqgjvE8cbu WWv5LmSwuKM6tF3ujgjQ6yZvgyDHl2d7lZL59EWG05K/yjJuU8ByoUhLKM5IiqPh SWXj3ZtydgGZm2eZTPyan+MFz91jw/X23Jm/AaIAxayf+1J4n1lNpc4rRhUxh/oy kGLQ2vsVnegSiHJWTboDFPeRha+daBsbf1MQc0Bh7MzDoWcaqSNX5VgrbaRqp35u sb9pmPZS4FzvAdU3bJ9AIPa9ujjblEvDp1JIhrfBUqiuTdvXDZ7XtW8kVsJk1RY= =MvWY -----END PGP SIGNATURE----- Merge tag 'wireless-drivers-next-for-davem-2017-11-03' of git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers-next Kalle Valo says: ==================== wireless-drivers-next patches for 4.15 Mostly fixes this time, but also few new features. Major changes: wil6210 * remove ssid debugfs file rsi * add WOWLAN support for suspend, hibernate and shutdown states ath10k * add support for CCMP-256, GCMP and GCMP-256 ciphers on hardware where it's supported (QCA99x0 and QCA4019) ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
commit
6e300769dc
@ -14569,7 +14569,6 @@ L: wil6210@qca.qualcomm.com
|
||||
S: Supported
|
||||
W: http://wireless.kernel.org/en/users/Drivers/wil6210
|
||||
F: drivers/net/wireless/ath/wil6210/
|
||||
F: include/uapi/linux/wil6210_uapi.h
|
||||
|
||||
WIMAX STACK
|
||||
M: Inaky Perez-Gonzalez <inaky.perez-gonzalez@intel.com>
|
||||
|
@ -184,11 +184,14 @@ static void bcma_core_mips_print_irq(struct bcma_device *dev, unsigned int irq)
|
||||
{
|
||||
int i;
|
||||
static const char *irq_name[] = {"2(S)", "3", "4", "5", "6", "D", "I"};
|
||||
char interrupts[20];
|
||||
char *ints = interrupts;
|
||||
|
||||
bcma_debug(dev->bus, "core 0x%04x, irq :", dev->id.id);
|
||||
for (i = 0; i <= 6; i++)
|
||||
pr_cont(" %s%s", irq_name[i], i == irq ? "*" : " ");
|
||||
pr_cont("\n");
|
||||
for (i = 0; i < ARRAY_SIZE(irq_name); i++)
|
||||
ints += sprintf(ints, " %s%c",
|
||||
irq_name[i], i == irq ? '*' : ' ');
|
||||
|
||||
bcma_debug(dev->bus, "core 0x%04x, irq:%s\n", dev->id.id, interrupts);
|
||||
}
|
||||
|
||||
static void bcma_core_mips_dump_irq(struct bcma_bus *bus)
|
||||
|
@ -889,9 +889,9 @@ static void ar5523_tx_work(struct work_struct *work)
|
||||
mutex_unlock(&ar->mutex);
|
||||
}
|
||||
|
||||
static void ar5523_tx_wd_timer(unsigned long arg)
|
||||
static void ar5523_tx_wd_timer(struct timer_list *t)
|
||||
{
|
||||
struct ar5523 *ar = (struct ar5523 *) arg;
|
||||
struct ar5523 *ar = from_timer(ar, t, tx_wd_timer);
|
||||
|
||||
ar5523_dbg(ar, "TX watchdog timer triggered\n");
|
||||
ieee80211_queue_work(ar->hw, &ar->tx_wd_work);
|
||||
@ -1599,8 +1599,7 @@ static int ar5523_probe(struct usb_interface *intf,
|
||||
mutex_init(&ar->mutex);
|
||||
|
||||
INIT_DELAYED_WORK(&ar->stat_work, ar5523_stat_work);
|
||||
init_timer(&ar->tx_wd_timer);
|
||||
setup_timer(&ar->tx_wd_timer, ar5523_tx_wd_timer, (unsigned long) ar);
|
||||
timer_setup(&ar->tx_wd_timer, ar5523_tx_wd_timer, 0);
|
||||
INIT_WORK(&ar->tx_wd_work, ar5523_tx_wd_work);
|
||||
INIT_WORK(&ar->tx_work, ar5523_tx_work);
|
||||
INIT_LIST_HEAD(&ar->tx_queue_pending);
|
||||
|
@ -74,6 +74,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
.spectral_bin_discard = 0,
|
||||
.vht160_mcs_rx_highest = 0,
|
||||
.vht160_mcs_tx_highest = 0,
|
||||
.n_cipher_suites = 8,
|
||||
},
|
||||
{
|
||||
.id = QCA9887_HW_1_0_VERSION,
|
||||
@ -97,6 +98,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
.spectral_bin_discard = 0,
|
||||
.vht160_mcs_rx_highest = 0,
|
||||
.vht160_mcs_tx_highest = 0,
|
||||
.n_cipher_suites = 8,
|
||||
},
|
||||
{
|
||||
.id = QCA6174_HW_2_1_VERSION,
|
||||
@ -119,6 +121,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
.spectral_bin_discard = 0,
|
||||
.vht160_mcs_rx_highest = 0,
|
||||
.vht160_mcs_tx_highest = 0,
|
||||
.n_cipher_suites = 8,
|
||||
},
|
||||
{
|
||||
.id = QCA6174_HW_2_1_VERSION,
|
||||
@ -141,6 +144,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
.spectral_bin_discard = 0,
|
||||
.vht160_mcs_rx_highest = 0,
|
||||
.vht160_mcs_tx_highest = 0,
|
||||
.n_cipher_suites = 8,
|
||||
},
|
||||
{
|
||||
.id = QCA6174_HW_3_0_VERSION,
|
||||
@ -163,6 +167,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
.spectral_bin_discard = 0,
|
||||
.vht160_mcs_rx_highest = 0,
|
||||
.vht160_mcs_tx_highest = 0,
|
||||
.n_cipher_suites = 8,
|
||||
},
|
||||
{
|
||||
.id = QCA6174_HW_3_2_VERSION,
|
||||
@ -188,6 +193,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
.spectral_bin_discard = 0,
|
||||
.vht160_mcs_rx_highest = 0,
|
||||
.vht160_mcs_tx_highest = 0,
|
||||
.n_cipher_suites = 8,
|
||||
},
|
||||
{
|
||||
.id = QCA99X0_HW_2_0_DEV_VERSION,
|
||||
@ -216,6 +222,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
.spectral_bin_discard = 4,
|
||||
.vht160_mcs_rx_highest = 0,
|
||||
.vht160_mcs_tx_highest = 0,
|
||||
.n_cipher_suites = 11,
|
||||
},
|
||||
{
|
||||
.id = QCA9984_HW_1_0_DEV_VERSION,
|
||||
@ -249,6 +256,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
*/
|
||||
.vht160_mcs_rx_highest = 1560,
|
||||
.vht160_mcs_tx_highest = 1560,
|
||||
.n_cipher_suites = 11,
|
||||
},
|
||||
{
|
||||
.id = QCA9888_HW_2_0_DEV_VERSION,
|
||||
@ -281,6 +289,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
*/
|
||||
.vht160_mcs_rx_highest = 780,
|
||||
.vht160_mcs_tx_highest = 780,
|
||||
.n_cipher_suites = 11,
|
||||
},
|
||||
{
|
||||
.id = QCA9377_HW_1_0_DEV_VERSION,
|
||||
@ -303,6 +312,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
.spectral_bin_discard = 0,
|
||||
.vht160_mcs_rx_highest = 0,
|
||||
.vht160_mcs_tx_highest = 0,
|
||||
.n_cipher_suites = 8,
|
||||
},
|
||||
{
|
||||
.id = QCA9377_HW_1_1_DEV_VERSION,
|
||||
@ -327,6 +337,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
.spectral_bin_discard = 0,
|
||||
.vht160_mcs_rx_highest = 0,
|
||||
.vht160_mcs_tx_highest = 0,
|
||||
.n_cipher_suites = 8,
|
||||
},
|
||||
{
|
||||
.id = QCA4019_HW_1_0_DEV_VERSION,
|
||||
@ -356,6 +367,7 @@ static const struct ath10k_hw_params ath10k_hw_params_list[] = {
|
||||
.spectral_bin_discard = 4,
|
||||
.vht160_mcs_rx_highest = 0,
|
||||
.vht160_mcs_tx_highest = 0,
|
||||
.n_cipher_suites = 11,
|
||||
},
|
||||
};
|
||||
|
||||
@ -377,6 +389,7 @@ static const char *const ath10k_core_fw_feature_str[] = {
|
||||
[ATH10K_FW_FEATURE_BTCOEX_PARAM] = "btcoex-param",
|
||||
[ATH10K_FW_FEATURE_SKIP_NULL_FUNC_WAR] = "skip-null-func-war",
|
||||
[ATH10K_FW_FEATURE_ALLOWS_MESH_BCAST] = "allows-mesh-bcast",
|
||||
[ATH10K_FW_FEATURE_NO_PS] = "no-ps",
|
||||
};
|
||||
|
||||
static unsigned int ath10k_core_get_fw_feature_str(char *buf,
|
||||
|
@ -612,6 +612,9 @@ enum ath10k_fw_features {
|
||||
*/
|
||||
ATH10K_FW_FEATURE_ALLOWS_MESH_BCAST = 16,
|
||||
|
||||
/* Firmware does not support power save in station mode. */
|
||||
ATH10K_FW_FEATURE_NO_PS = 17,
|
||||
|
||||
/* keep last */
|
||||
ATH10K_FW_FEATURE_COUNT,
|
||||
};
|
||||
|
@ -200,9 +200,9 @@ static void ath10k_htt_rx_msdu_buff_replenish(struct ath10k_htt *htt)
|
||||
spin_unlock_bh(&htt->rx_ring.lock);
|
||||
}
|
||||
|
||||
static void ath10k_htt_rx_ring_refill_retry(unsigned long arg)
|
||||
static void ath10k_htt_rx_ring_refill_retry(struct timer_list *t)
|
||||
{
|
||||
struct ath10k_htt *htt = (struct ath10k_htt *)arg;
|
||||
struct ath10k_htt *htt = from_timer(htt, t, rx_ring.refill_retry_timer);
|
||||
|
||||
ath10k_htt_rx_msdu_buff_replenish(htt);
|
||||
}
|
||||
@ -507,7 +507,7 @@ int ath10k_htt_rx_alloc(struct ath10k_htt *htt)
|
||||
*htt->rx_ring.alloc_idx.vaddr = 0;
|
||||
|
||||
/* Initialize the Rx refill retry timer */
|
||||
setup_timer(timer, ath10k_htt_rx_ring_refill_retry, (unsigned long)htt);
|
||||
timer_setup(timer, ath10k_htt_rx_ring_refill_retry, 0);
|
||||
|
||||
spin_lock_init(&htt->rx_ring.lock);
|
||||
|
||||
|
@ -310,7 +310,7 @@ static struct ath10k_hw_ce_dst_src_wm_regs wcn3990_wm_dst_ring = {
|
||||
.wm_high = &wcn3990_dst_wm_high,
|
||||
};
|
||||
|
||||
struct ath10k_hw_ce_regs wcn3990_ce_regs = {
|
||||
const struct ath10k_hw_ce_regs wcn3990_ce_regs = {
|
||||
.sr_base_addr = 0x00000000,
|
||||
.sr_size_addr = 0x00000008,
|
||||
.dr_base_addr = 0x0000000c,
|
||||
@ -457,7 +457,7 @@ static struct ath10k_hw_ce_dst_src_wm_regs qcax_wm_dst_ring = {
|
||||
.wm_high = &qcax_dst_wm_high,
|
||||
};
|
||||
|
||||
struct ath10k_hw_ce_regs qcax_ce_regs = {
|
||||
const struct ath10k_hw_ce_regs qcax_ce_regs = {
|
||||
.sr_base_addr = 0x00000000,
|
||||
.sr_size_addr = 0x00000004,
|
||||
.dr_base_addr = 0x00000008,
|
||||
@ -604,8 +604,13 @@ static void ath10k_hw_qca988x_set_coverage_class(struct ath10k *ar,
|
||||
|
||||
/* Only modify registers if the core is started. */
|
||||
if ((ar->state != ATH10K_STATE_ON) &&
|
||||
(ar->state != ATH10K_STATE_RESTARTED))
|
||||
(ar->state != ATH10K_STATE_RESTARTED)) {
|
||||
spin_lock_bh(&ar->data_lock);
|
||||
/* Store config value for when radio boots up */
|
||||
ar->fw_coverage.coverage_class = value;
|
||||
spin_unlock_bh(&ar->data_lock);
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
/* Retrieve the current values of the two registers that need to be
|
||||
* adjusted.
|
||||
@ -637,7 +642,7 @@ static void ath10k_hw_qca988x_set_coverage_class(struct ath10k *ar,
|
||||
ar->fw_coverage.reg_ack_cts_timeout_orig = timeout_reg;
|
||||
ar->fw_coverage.reg_phyclk = phyclk_reg;
|
||||
|
||||
/* Calculat new value based on the (original) firmware calculation. */
|
||||
/* Calculate new value based on the (original) firmware calculation. */
|
||||
slottime_reg = ar->fw_coverage.reg_slottime_orig;
|
||||
timeout_reg = ar->fw_coverage.reg_ack_cts_timeout_orig;
|
||||
|
||||
|
@ -369,8 +369,8 @@ extern const struct ath10k_hw_values qca99x0_values;
|
||||
extern const struct ath10k_hw_values qca9888_values;
|
||||
extern const struct ath10k_hw_values qca4019_values;
|
||||
extern const struct ath10k_hw_values wcn3990_values;
|
||||
extern struct ath10k_hw_ce_regs wcn3990_ce_regs;
|
||||
extern struct ath10k_hw_ce_regs qcax_ce_regs;
|
||||
extern const struct ath10k_hw_ce_regs wcn3990_ce_regs;
|
||||
extern const struct ath10k_hw_ce_regs qcax_ce_regs;
|
||||
|
||||
void ath10k_hw_fill_survey_time(struct ath10k *ar, struct survey_info *survey,
|
||||
u32 cc, u32 rcc, u32 cc_prev, u32 rcc_prev);
|
||||
@ -550,6 +550,9 @@ struct ath10k_hw_params {
|
||||
*/
|
||||
int vht160_mcs_rx_highest;
|
||||
int vht160_mcs_tx_highest;
|
||||
|
||||
/* Number of ciphers supported (i.e First N) in cipher_suites array */
|
||||
int n_cipher_suites;
|
||||
};
|
||||
|
||||
struct htt_rx_desc;
|
||||
|
@ -242,6 +242,16 @@ static int ath10k_send_key(struct ath10k_vif *arvif,
|
||||
case WLAN_CIPHER_SUITE_WEP104:
|
||||
arg.key_cipher = WMI_CIPHER_WEP;
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_CCMP_256:
|
||||
arg.key_cipher = WMI_CIPHER_AES_CCM;
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_GCMP:
|
||||
case WLAN_CIPHER_SUITE_GCMP_256:
|
||||
arg.key_cipher = WMI_CIPHER_AES_GCM;
|
||||
break;
|
||||
case WLAN_CIPHER_SUITE_BIP_GMAC_128:
|
||||
case WLAN_CIPHER_SUITE_BIP_GMAC_256:
|
||||
case WLAN_CIPHER_SUITE_BIP_CMAC_256:
|
||||
case WLAN_CIPHER_SUITE_AES_CMAC:
|
||||
WARN_ON(1);
|
||||
return -EINVAL;
|
||||
@ -5575,6 +5585,59 @@ static void ath10k_mac_op_set_coverage_class(struct ieee80211_hw *hw, s16 value)
|
||||
ar->hw_params.hw_ops->set_coverage_class(ar, value);
|
||||
}
|
||||
|
||||
struct ath10k_mac_tdls_iter_data {
|
||||
u32 num_tdls_stations;
|
||||
struct ieee80211_vif *curr_vif;
|
||||
};
|
||||
|
||||
static void ath10k_mac_tdls_vif_stations_count_iter(void *data,
|
||||
struct ieee80211_sta *sta)
|
||||
{
|
||||
struct ath10k_mac_tdls_iter_data *iter_data = data;
|
||||
struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
|
||||
struct ieee80211_vif *sta_vif = arsta->arvif->vif;
|
||||
|
||||
if (sta->tdls && sta_vif == iter_data->curr_vif)
|
||||
iter_data->num_tdls_stations++;
|
||||
}
|
||||
|
||||
static int ath10k_mac_tdls_vif_stations_count(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif)
|
||||
{
|
||||
struct ath10k_mac_tdls_iter_data data = {};
|
||||
|
||||
data.curr_vif = vif;
|
||||
|
||||
ieee80211_iterate_stations_atomic(hw,
|
||||
ath10k_mac_tdls_vif_stations_count_iter,
|
||||
&data);
|
||||
return data.num_tdls_stations;
|
||||
}
|
||||
|
||||
static void ath10k_mac_tdls_vifs_count_iter(void *data, u8 *mac,
|
||||
struct ieee80211_vif *vif)
|
||||
{
|
||||
struct ath10k_vif *arvif = (void *)vif->drv_priv;
|
||||
int *num_tdls_vifs = data;
|
||||
|
||||
if (vif->type != NL80211_IFTYPE_STATION)
|
||||
return;
|
||||
|
||||
if (ath10k_mac_tdls_vif_stations_count(arvif->ar->hw, vif) > 0)
|
||||
(*num_tdls_vifs)++;
|
||||
}
|
||||
|
||||
static int ath10k_mac_tdls_vifs_count(struct ieee80211_hw *hw)
|
||||
{
|
||||
int num_tdls_vifs = 0;
|
||||
|
||||
ieee80211_iterate_active_interfaces_atomic(hw,
|
||||
IEEE80211_IFACE_ITER_NORMAL,
|
||||
ath10k_mac_tdls_vifs_count_iter,
|
||||
&num_tdls_vifs);
|
||||
return num_tdls_vifs;
|
||||
}
|
||||
|
||||
static int ath10k_hw_scan(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_scan_request *hw_req)
|
||||
@ -5588,6 +5651,11 @@ static int ath10k_hw_scan(struct ieee80211_hw *hw,
|
||||
|
||||
mutex_lock(&ar->conf_mutex);
|
||||
|
||||
if (ath10k_mac_tdls_vif_stations_count(hw, vif) > 0) {
|
||||
ret = -EBUSY;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
spin_lock_bh(&ar->data_lock);
|
||||
switch (ar->scan.state) {
|
||||
case ATH10K_SCAN_IDLE:
|
||||
@ -5723,7 +5791,10 @@ static int ath10k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
|
||||
u32 flags2;
|
||||
|
||||
/* this one needs to be done in software */
|
||||
if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC)
|
||||
if (key->cipher == WLAN_CIPHER_SUITE_AES_CMAC ||
|
||||
key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_128 ||
|
||||
key->cipher == WLAN_CIPHER_SUITE_BIP_GMAC_256 ||
|
||||
key->cipher == WLAN_CIPHER_SUITE_BIP_CMAC_256)
|
||||
return 1;
|
||||
|
||||
if (arvif->nohwcrypt)
|
||||
@ -6000,59 +6071,6 @@ static void ath10k_mac_dec_num_stations(struct ath10k_vif *arvif,
|
||||
ar->num_stations--;
|
||||
}
|
||||
|
||||
struct ath10k_mac_tdls_iter_data {
|
||||
u32 num_tdls_stations;
|
||||
struct ieee80211_vif *curr_vif;
|
||||
};
|
||||
|
||||
static void ath10k_mac_tdls_vif_stations_count_iter(void *data,
|
||||
struct ieee80211_sta *sta)
|
||||
{
|
||||
struct ath10k_mac_tdls_iter_data *iter_data = data;
|
||||
struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
|
||||
struct ieee80211_vif *sta_vif = arsta->arvif->vif;
|
||||
|
||||
if (sta->tdls && sta_vif == iter_data->curr_vif)
|
||||
iter_data->num_tdls_stations++;
|
||||
}
|
||||
|
||||
static int ath10k_mac_tdls_vif_stations_count(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif)
|
||||
{
|
||||
struct ath10k_mac_tdls_iter_data data = {};
|
||||
|
||||
data.curr_vif = vif;
|
||||
|
||||
ieee80211_iterate_stations_atomic(hw,
|
||||
ath10k_mac_tdls_vif_stations_count_iter,
|
||||
&data);
|
||||
return data.num_tdls_stations;
|
||||
}
|
||||
|
||||
static void ath10k_mac_tdls_vifs_count_iter(void *data, u8 *mac,
|
||||
struct ieee80211_vif *vif)
|
||||
{
|
||||
struct ath10k_vif *arvif = (void *)vif->drv_priv;
|
||||
int *num_tdls_vifs = data;
|
||||
|
||||
if (vif->type != NL80211_IFTYPE_STATION)
|
||||
return;
|
||||
|
||||
if (ath10k_mac_tdls_vif_stations_count(arvif->ar->hw, vif) > 0)
|
||||
(*num_tdls_vifs)++;
|
||||
}
|
||||
|
||||
static int ath10k_mac_tdls_vifs_count(struct ieee80211_hw *hw)
|
||||
{
|
||||
int num_tdls_vifs = 0;
|
||||
|
||||
ieee80211_iterate_active_interfaces_atomic(hw,
|
||||
IEEE80211_IFACE_ITER_NORMAL,
|
||||
ath10k_mac_tdls_vifs_count_iter,
|
||||
&num_tdls_vifs);
|
||||
return num_tdls_vifs;
|
||||
}
|
||||
|
||||
static int ath10k_sta_state(struct ieee80211_hw *hw,
|
||||
struct ieee80211_vif *vif,
|
||||
struct ieee80211_sta *sta,
|
||||
@ -6477,6 +6495,11 @@ static int ath10k_remain_on_channel(struct ieee80211_hw *hw,
|
||||
|
||||
mutex_lock(&ar->conf_mutex);
|
||||
|
||||
if (ath10k_mac_tdls_vif_stations_count(hw, vif) > 0) {
|
||||
ret = -EBUSY;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
spin_lock_bh(&ar->data_lock);
|
||||
switch (ar->scan.state) {
|
||||
case ATH10K_SCAN_IDLE:
|
||||
@ -8074,7 +8097,22 @@ int ath10k_mac_register(struct ath10k *ar)
|
||||
WLAN_CIPHER_SUITE_WEP104,
|
||||
WLAN_CIPHER_SUITE_TKIP,
|
||||
WLAN_CIPHER_SUITE_CCMP,
|
||||
|
||||
/* Do not add hardware supported ciphers before this line.
|
||||
* Allow software encryption for all chips. Don't forget to
|
||||
* update n_cipher_suites below.
|
||||
*/
|
||||
WLAN_CIPHER_SUITE_AES_CMAC,
|
||||
WLAN_CIPHER_SUITE_BIP_CMAC_256,
|
||||
WLAN_CIPHER_SUITE_BIP_GMAC_128,
|
||||
WLAN_CIPHER_SUITE_BIP_GMAC_256,
|
||||
|
||||
/* Only QCA99x0 and QCA4019 varients support GCMP-128, GCMP-256
|
||||
* and CCMP-256 in hardware.
|
||||
*/
|
||||
WLAN_CIPHER_SUITE_GCMP,
|
||||
WLAN_CIPHER_SUITE_GCMP_256,
|
||||
WLAN_CIPHER_SUITE_CCMP_256,
|
||||
};
|
||||
struct ieee80211_supported_band *band;
|
||||
void *channels;
|
||||
@ -8146,8 +8184,13 @@ int ath10k_mac_register(struct ath10k *ar)
|
||||
BIT(NL80211_IFTYPE_P2P_GO);
|
||||
|
||||
ieee80211_hw_set(ar->hw, SIGNAL_DBM);
|
||||
ieee80211_hw_set(ar->hw, SUPPORTS_PS);
|
||||
ieee80211_hw_set(ar->hw, SUPPORTS_DYNAMIC_PS);
|
||||
|
||||
if (!test_bit(ATH10K_FW_FEATURE_NO_PS,
|
||||
ar->running_fw->fw_file.fw_features)) {
|
||||
ieee80211_hw_set(ar->hw, SUPPORTS_PS);
|
||||
ieee80211_hw_set(ar->hw, SUPPORTS_DYNAMIC_PS);
|
||||
}
|
||||
|
||||
ieee80211_hw_set(ar->hw, MFP_CAPABLE);
|
||||
ieee80211_hw_set(ar->hw, REPORTS_TX_ACK_STATUS);
|
||||
ieee80211_hw_set(ar->hw, HAS_RATE_CONTROL);
|
||||
@ -8313,7 +8356,18 @@ int ath10k_mac_register(struct ath10k *ar)
|
||||
}
|
||||
|
||||
ar->hw->wiphy->cipher_suites = cipher_suites;
|
||||
ar->hw->wiphy->n_cipher_suites = ARRAY_SIZE(cipher_suites);
|
||||
|
||||
/* QCA988x and QCA6174 family chips do not support CCMP-256, GCMP-128
|
||||
* and GCMP-256 ciphers in hardware. Fetch number of ciphers supported
|
||||
* from chip specific hw_param table.
|
||||
*/
|
||||
if (!ar->hw_params.n_cipher_suites ||
|
||||
ar->hw_params.n_cipher_suites > ARRAY_SIZE(cipher_suites)) {
|
||||
ath10k_err(ar, "invalid hw_params.n_cipher_suites %d\n",
|
||||
ar->hw_params.n_cipher_suites);
|
||||
ar->hw_params.n_cipher_suites = 8;
|
||||
}
|
||||
ar->hw->wiphy->n_cipher_suites = ar->hw_params.n_cipher_suites;
|
||||
|
||||
wiphy_ext_feature_set(ar->hw->wiphy, NL80211_EXT_FEATURE_CQM_RSSI_LIST);
|
||||
|
||||
|
@ -585,10 +585,10 @@ skip:
|
||||
spin_unlock_irqrestore(&ar_pci->ps_lock, flags);
|
||||
}
|
||||
|
||||
static void ath10k_pci_ps_timer(unsigned long ptr)
|
||||
static void ath10k_pci_ps_timer(struct timer_list *t)
|
||||
{
|
||||
struct ath10k *ar = (void *)ptr;
|
||||
struct ath10k_pci *ar_pci = ath10k_pci_priv(ar);
|
||||
struct ath10k_pci *ar_pci = from_timer(ar_pci, t, ps_timer);
|
||||
struct ath10k *ar = ar_pci->ar;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&ar_pci->ps_lock, flags);
|
||||
@ -838,9 +838,10 @@ void ath10k_pci_rx_post(struct ath10k *ar)
|
||||
ath10k_pci_rx_post_pipe(&ar_pci->pipe_info[i]);
|
||||
}
|
||||
|
||||
void ath10k_pci_rx_replenish_retry(unsigned long ptr)
|
||||
void ath10k_pci_rx_replenish_retry(struct timer_list *t)
|
||||
{
|
||||
struct ath10k *ar = (void *)ptr;
|
||||
struct ath10k_pci *ar_pci = from_timer(ar_pci, t, rx_post_retry);
|
||||
struct ath10k *ar = ar_pci->ar;
|
||||
|
||||
ath10k_pci_rx_post(ar);
|
||||
}
|
||||
@ -2577,9 +2578,13 @@ void ath10k_pci_hif_power_down(struct ath10k *ar)
|
||||
*/
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
static int ath10k_pci_hif_suspend(struct ath10k *ar)
|
||||
{
|
||||
/* Nothing to do; the important stuff is in the driver suspend. */
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ath10k_pci_suspend(struct ath10k *ar)
|
||||
{
|
||||
/* The grace timer can still be counting down and ar->ps_awake be true.
|
||||
* It is known that the device may be asleep after resuming regardless
|
||||
@ -2592,6 +2597,12 @@ static int ath10k_pci_hif_suspend(struct ath10k *ar)
|
||||
}
|
||||
|
||||
static int ath10k_pci_hif_resume(struct ath10k *ar)
|
||||
{
|
||||
/* Nothing to do; the important stuff is in the driver resume. */
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ath10k_pci_resume(struct ath10k *ar)
|
||||
{
|
||||
struct ath10k_pci *ar_pci = ath10k_pci_priv(ar);
|
||||
struct pci_dev *pdev = ar_pci->pdev;
|
||||
@ -2615,7 +2626,6 @@ static int ath10k_pci_hif_resume(struct ath10k *ar)
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
static bool ath10k_pci_validate_cal(void *data, size_t size)
|
||||
{
|
||||
@ -2770,10 +2780,8 @@ static const struct ath10k_hif_ops ath10k_pci_hif_ops = {
|
||||
.power_down = ath10k_pci_hif_power_down,
|
||||
.read32 = ath10k_pci_read32,
|
||||
.write32 = ath10k_pci_write32,
|
||||
#ifdef CONFIG_PM
|
||||
.suspend = ath10k_pci_hif_suspend,
|
||||
.resume = ath10k_pci_hif_resume,
|
||||
#endif
|
||||
.fetch_cal_eeprom = ath10k_pci_hif_fetch_cal_eeprom,
|
||||
};
|
||||
|
||||
@ -3157,8 +3165,7 @@ int ath10k_pci_setup_resource(struct ath10k *ar)
|
||||
spin_lock_init(&ce->ce_lock);
|
||||
spin_lock_init(&ar_pci->ps_lock);
|
||||
|
||||
setup_timer(&ar_pci->rx_post_retry, ath10k_pci_rx_replenish_retry,
|
||||
(unsigned long)ar);
|
||||
timer_setup(&ar_pci->rx_post_retry, ath10k_pci_rx_replenish_retry, 0);
|
||||
|
||||
if (QCA_REV_6174(ar) || QCA_REV_9377(ar))
|
||||
ath10k_pci_override_ce_config(ar);
|
||||
@ -3284,8 +3291,7 @@ static int ath10k_pci_probe(struct pci_dev *pdev,
|
||||
ar->id.subsystem_vendor = pdev->subsystem_vendor;
|
||||
ar->id.subsystem_device = pdev->subsystem_device;
|
||||
|
||||
setup_timer(&ar_pci->ps_timer, ath10k_pci_ps_timer,
|
||||
(unsigned long)ar);
|
||||
timer_setup(&ar_pci->ps_timer, ath10k_pci_ps_timer, 0);
|
||||
|
||||
ret = ath10k_pci_setup_resource(ar);
|
||||
if (ret) {
|
||||
@ -3401,11 +3407,7 @@ static __maybe_unused int ath10k_pci_pm_suspend(struct device *dev)
|
||||
struct ath10k *ar = dev_get_drvdata(dev);
|
||||
int ret;
|
||||
|
||||
if (test_bit(ATH10K_FW_FEATURE_WOWLAN_SUPPORT,
|
||||
ar->running_fw->fw_file.fw_features))
|
||||
return 0;
|
||||
|
||||
ret = ath10k_hif_suspend(ar);
|
||||
ret = ath10k_pci_suspend(ar);
|
||||
if (ret)
|
||||
ath10k_warn(ar, "failed to suspend hif: %d\n", ret);
|
||||
|
||||
@ -3417,11 +3419,7 @@ static __maybe_unused int ath10k_pci_pm_resume(struct device *dev)
|
||||
struct ath10k *ar = dev_get_drvdata(dev);
|
||||
int ret;
|
||||
|
||||
if (test_bit(ATH10K_FW_FEATURE_WOWLAN_SUPPORT,
|
||||
ar->running_fw->fw_file.fw_features))
|
||||
return 0;
|
||||
|
||||
ret = ath10k_hif_resume(ar);
|
||||
ret = ath10k_pci_resume(ar);
|
||||
if (ret)
|
||||
ath10k_warn(ar, "failed to resume hif: %d\n", ret);
|
||||
|
||||
|
@ -278,7 +278,7 @@ void ath10k_pci_hif_power_down(struct ath10k *ar);
|
||||
int ath10k_pci_alloc_pipes(struct ath10k *ar);
|
||||
void ath10k_pci_free_pipes(struct ath10k *ar);
|
||||
void ath10k_pci_free_pipes(struct ath10k *ar);
|
||||
void ath10k_pci_rx_replenish_retry(unsigned long ptr);
|
||||
void ath10k_pci_rx_replenish_retry(struct timer_list *t);
|
||||
void ath10k_pci_ce_deinit(struct ath10k *ar);
|
||||
void ath10k_pci_init_napi(struct ath10k *ar);
|
||||
int ath10k_pci_init_pipes(struct ath10k *ar);
|
||||
|
@ -406,7 +406,7 @@ static ssize_t write_file_spectral_count(struct file *file,
|
||||
if (kstrtoul(buf, 0, &val))
|
||||
return -EINVAL;
|
||||
|
||||
if (val < 0 || val > 255)
|
||||
if (val > 255)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&ar->conf_mutex);
|
||||
|
@ -7870,7 +7870,8 @@ ath10k_wmi_10_4_gen_update_fw_tdls_state(struct ath10k *ar, u32 vdev_id,
|
||||
if (!skb)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
if (test_bit(WMI_SERVICE_TDLS_EXPLICIT_MODE_ONLY, ar->wmi.svc_map))
|
||||
if (test_bit(WMI_SERVICE_TDLS_EXPLICIT_MODE_ONLY, ar->wmi.svc_map) &&
|
||||
state == WMI_TDLS_ENABLE_ACTIVE)
|
||||
state = WMI_TDLS_ENABLE_PASSIVE;
|
||||
|
||||
if (test_bit(WMI_SERVICE_TDLS_UAPSD_BUFFER_STA, ar->wmi.svc_map))
|
||||
|
@ -4751,6 +4751,7 @@ struct wmi_key_seq_counter {
|
||||
#define WMI_CIPHER_WAPI 0x5
|
||||
#define WMI_CIPHER_CKIP 0x6
|
||||
#define WMI_CIPHER_AES_CMAC 0x7
|
||||
#define WMI_CIPHER_AES_GCM 0x8
|
||||
|
||||
struct wmi_vdev_install_key_cmd {
|
||||
__le32 vdev_id;
|
||||
|
@ -3589,10 +3589,8 @@ static int ath6kl_cfg80211_vif_init(struct ath6kl_vif *vif)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
setup_timer(&vif->disconnect_timer, disconnect_timer_handler,
|
||||
(unsigned long) vif->ndev);
|
||||
setup_timer(&vif->sched_scan_timer, ath6kl_wmi_sscan_timer,
|
||||
(unsigned long) vif);
|
||||
timer_setup(&vif->disconnect_timer, disconnect_timer_handler, 0);
|
||||
timer_setup(&vif->sched_scan_timer, ath6kl_wmi_sscan_timer, 0);
|
||||
|
||||
set_bit(WMM_ENABLED, &vif->flags);
|
||||
spin_lock_init(&vif->if_lock);
|
||||
|
@ -893,7 +893,7 @@ static inline u32 ath6kl_get_hi_item_addr(struct ath6kl *ar,
|
||||
|
||||
int ath6kl_configure_target(struct ath6kl *ar);
|
||||
void ath6kl_detect_error(unsigned long ptr);
|
||||
void disconnect_timer_handler(unsigned long ptr);
|
||||
void disconnect_timer_handler(struct timer_list *t);
|
||||
void init_netdev(struct net_device *dev);
|
||||
void ath6kl_cookie_init(struct ath6kl *ar);
|
||||
void ath6kl_cookie_cleanup(struct ath6kl *ar);
|
||||
|
@ -494,10 +494,9 @@ void ath6kl_connect_ap_mode_sta(struct ath6kl_vif *vif, u16 aid, u8 *mac_addr,
|
||||
netif_wake_queue(vif->ndev);
|
||||
}
|
||||
|
||||
void disconnect_timer_handler(unsigned long ptr)
|
||||
void disconnect_timer_handler(struct timer_list *t)
|
||||
{
|
||||
struct net_device *dev = (struct net_device *)ptr;
|
||||
struct ath6kl_vif *vif = netdev_priv(dev);
|
||||
struct ath6kl_vif *vif = from_timer(vif, t, disconnect_timer);
|
||||
|
||||
ath6kl_init_profile_info(vif);
|
||||
ath6kl_disconnect(vif);
|
||||
|
@ -1620,10 +1620,10 @@ void ath6kl_rx(struct htc_target *target, struct htc_packet *packet)
|
||||
ath6kl_deliver_frames_to_nw_stack(vif->ndev, skb);
|
||||
}
|
||||
|
||||
static void aggr_timeout(unsigned long arg)
|
||||
static void aggr_timeout(struct timer_list *t)
|
||||
{
|
||||
u8 i, j;
|
||||
struct aggr_info_conn *aggr_conn = (struct aggr_info_conn *) arg;
|
||||
struct aggr_info_conn *aggr_conn = from_timer(aggr_conn, t, timer);
|
||||
struct rxtid *rxtid;
|
||||
struct rxtid_stats *stats;
|
||||
|
||||
@ -1753,7 +1753,7 @@ void aggr_conn_init(struct ath6kl_vif *vif, struct aggr_info *aggr_info,
|
||||
|
||||
aggr_conn->aggr_sz = AGGR_SZ_DEFAULT;
|
||||
aggr_conn->dev = vif->ndev;
|
||||
setup_timer(&aggr_conn->timer, aggr_timeout, (unsigned long)aggr_conn);
|
||||
timer_setup(&aggr_conn->timer, aggr_timeout, 0);
|
||||
aggr_conn->aggr_info = aggr_info;
|
||||
|
||||
aggr_conn->timer_scheduled = false;
|
||||
|
@ -1078,9 +1078,9 @@ static int ath6kl_wmi_tkip_micerr_event_rx(struct wmi *wmi, u8 *datap, int len,
|
||||
return 0;
|
||||
}
|
||||
|
||||
void ath6kl_wmi_sscan_timer(unsigned long ptr)
|
||||
void ath6kl_wmi_sscan_timer(struct timer_list *t)
|
||||
{
|
||||
struct ath6kl_vif *vif = (struct ath6kl_vif *) ptr;
|
||||
struct ath6kl_vif *vif = from_timer(vif, t, sched_scan_timer);
|
||||
|
||||
cfg80211_sched_scan_results(vif->ar->wiphy, 0);
|
||||
}
|
||||
|
@ -2719,7 +2719,7 @@ int ath6kl_wmi_set_appie_cmd(struct wmi *wmi, u8 if_idx, u8 mgmt_frm_type,
|
||||
|
||||
int ath6kl_wmi_set_inact_period(struct wmi *wmi, u8 if_idx, int inact_timeout);
|
||||
|
||||
void ath6kl_wmi_sscan_timer(unsigned long ptr);
|
||||
void ath6kl_wmi_sscan_timer(struct timer_list *t);
|
||||
|
||||
int ath6kl_wmi_get_challenge_resp_cmd(struct wmi *wmi, u32 cookie, u32 source);
|
||||
|
||||
|
@ -15,6 +15,7 @@
|
||||
*/
|
||||
|
||||
#include <asm/unaligned.h>
|
||||
#include <linux/kernel.h>
|
||||
#include "hw.h"
|
||||
#include "ar9003_phy.h"
|
||||
#include "ar9003_eeprom.h"
|
||||
@ -2946,14 +2947,12 @@ static const struct ar9300_eeprom *ar9300_eep_templates[] = {
|
||||
|
||||
static const struct ar9300_eeprom *ar9003_eeprom_struct_find_by_id(int id)
|
||||
{
|
||||
#define N_LOOP (sizeof(ar9300_eep_templates) / sizeof(ar9300_eep_templates[0]))
|
||||
int it;
|
||||
|
||||
for (it = 0; it < N_LOOP; it++)
|
||||
for (it = 0; it < ARRAY_SIZE(ar9300_eep_templates); it++)
|
||||
if (ar9300_eep_templates[it]->templateVersion == id)
|
||||
return ar9300_eep_templates[it];
|
||||
return NULL;
|
||||
#undef N_LOOP
|
||||
}
|
||||
|
||||
static int ath9k_hw_ar9300_check_eeprom(struct ath_hw *ah)
|
||||
|
@ -480,7 +480,7 @@ EXPORT_SYMBOL(ath9k_hw_addrxbuf_edma);
|
||||
int ath9k_hw_process_rxdesc_edma(struct ath_hw *ah, struct ath_rx_status *rxs,
|
||||
void *buf_addr)
|
||||
{
|
||||
struct ar9003_rxs *rxsp = (struct ar9003_rxs *) buf_addr;
|
||||
struct ar9003_rxs *rxsp = buf_addr;
|
||||
unsigned int phyerr;
|
||||
|
||||
if ((rxsp->status11 & AR_RxDone) == 0)
|
||||
@ -610,7 +610,7 @@ void ath9k_hw_setup_statusring(struct ath_hw *ah, void *ts_start,
|
||||
ah->ts_paddr_start = ts_paddr_start;
|
||||
ah->ts_paddr_end = ts_paddr_start + (size * sizeof(struct ar9003_txs));
|
||||
ah->ts_size = size;
|
||||
ah->ts_ring = (struct ar9003_txs *) ts_start;
|
||||
ah->ts_ring = ts_start;
|
||||
|
||||
ath9k_hw_reset_txstatus_ring(ah);
|
||||
}
|
||||
|
@ -750,14 +750,14 @@ void ath_reset_work(struct work_struct *work);
|
||||
bool ath_hw_check(struct ath_softc *sc);
|
||||
void ath_hw_pll_work(struct work_struct *work);
|
||||
void ath_paprd_calibrate(struct work_struct *work);
|
||||
void ath_ani_calibrate(unsigned long data);
|
||||
void ath_ani_calibrate(struct timer_list *t);
|
||||
void ath_start_ani(struct ath_softc *sc);
|
||||
void ath_stop_ani(struct ath_softc *sc);
|
||||
void ath_check_ani(struct ath_softc *sc);
|
||||
int ath_update_survey_stats(struct ath_softc *sc);
|
||||
void ath_update_survey_nf(struct ath_softc *sc, int channel);
|
||||
void ath9k_queue_reset(struct ath_softc *sc, enum ath_reset_type type);
|
||||
void ath_ps_full_sleep(unsigned long data);
|
||||
void ath_ps_full_sleep(struct timer_list *t);
|
||||
void __ath9k_flush(struct ieee80211_hw *hw, u32 queues, bool drop,
|
||||
bool sw_pending, bool timeout_override);
|
||||
|
||||
|
@ -29,6 +29,7 @@ static int ath_set_channel(struct ath_softc *sc)
|
||||
struct cfg80211_chan_def *chandef = &sc->cur_chan->chandef;
|
||||
struct ieee80211_channel *chan = chandef->chan;
|
||||
int pos = chan->hw_value;
|
||||
unsigned long flags;
|
||||
int old_pos = -1;
|
||||
int r;
|
||||
|
||||
@ -42,9 +43,9 @@ static int ath_set_channel(struct ath_softc *sc)
|
||||
chan->center_freq, chandef->width);
|
||||
|
||||
/* update survey stats for the old channel before switching */
|
||||
spin_lock_bh(&common->cc_lock);
|
||||
spin_lock_irqsave(&common->cc_lock, flags);
|
||||
ath_update_survey_stats(sc);
|
||||
spin_unlock_bh(&common->cc_lock);
|
||||
spin_unlock_irqrestore(&common->cc_lock, flags);
|
||||
|
||||
ath9k_cmn_get_channel(hw, ah, chandef);
|
||||
|
||||
@ -1042,9 +1043,9 @@ static void ath_scan_channel_start(struct ath_softc *sc)
|
||||
mod_timer(&sc->offchannel.timer, jiffies + sc->offchannel.duration);
|
||||
}
|
||||
|
||||
static void ath_chanctx_timer(unsigned long data)
|
||||
static void ath_chanctx_timer(struct timer_list *t)
|
||||
{
|
||||
struct ath_softc *sc = (struct ath_softc *) data;
|
||||
struct ath_softc *sc = from_timer(sc, t, sched.timer);
|
||||
struct ath_common *common = ath9k_hw_common(sc->sc_ah);
|
||||
|
||||
ath_dbg(common, CHAN_CTX,
|
||||
@ -1053,9 +1054,9 @@ static void ath_chanctx_timer(unsigned long data)
|
||||
ath_chanctx_event(sc, NULL, ATH_CHANCTX_EVENT_TSF_TIMER);
|
||||
}
|
||||
|
||||
static void ath_offchannel_timer(unsigned long data)
|
||||
static void ath_offchannel_timer(struct timer_list *t)
|
||||
{
|
||||
struct ath_softc *sc = (struct ath_softc *)data;
|
||||
struct ath_softc *sc = from_timer(sc, t, offchannel.timer);
|
||||
struct ath_chanctx *ctx;
|
||||
struct ath_common *common = ath9k_hw_common(sc->sc_ah);
|
||||
|
||||
@ -1361,10 +1362,8 @@ void ath9k_init_channel_context(struct ath_softc *sc)
|
||||
{
|
||||
INIT_WORK(&sc->chanctx_work, ath_chanctx_work);
|
||||
|
||||
setup_timer(&sc->offchannel.timer, ath_offchannel_timer,
|
||||
(unsigned long)sc);
|
||||
setup_timer(&sc->sched.timer, ath_chanctx_timer,
|
||||
(unsigned long)sc);
|
||||
timer_setup(&sc->offchannel.timer, ath_offchannel_timer, 0);
|
||||
timer_setup(&sc->sched.timer, ath_chanctx_timer, 0);
|
||||
|
||||
init_completion(&sc->go_beacon);
|
||||
}
|
||||
|
@ -916,7 +916,7 @@ static int open_file_regdump(struct inode *inode, struct file *file)
|
||||
u8 *buf;
|
||||
int i, j = 0;
|
||||
unsigned long num_regs, regdump_len, max_reg_offset;
|
||||
const struct reg_hole {
|
||||
static const struct reg_hole {
|
||||
u32 start;
|
||||
u32 end;
|
||||
} reg_hole_list[] = {
|
||||
@ -1167,7 +1167,7 @@ static ssize_t write_file_tpc(struct file *file, const char __user *user_buf,
|
||||
if (kstrtoul(buf, 0, &val))
|
||||
return -EINVAL;
|
||||
|
||||
if (val < 0 || val > 1)
|
||||
if (val > 1)
|
||||
return -EINVAL;
|
||||
|
||||
tpc_enabled = !!val;
|
||||
|
@ -326,7 +326,7 @@ void ath9k_dfs_process_phyerr(struct ath_softc *sc, void *data,
|
||||
if (ard.ext_rssi & 0x80)
|
||||
ard.ext_rssi = 0;
|
||||
|
||||
vdata_end = (char *)data + datalen;
|
||||
vdata_end = data + datalen;
|
||||
ard.pulse_bw_info = vdata_end[-1];
|
||||
ard.pulse_length_ext = vdata_end[-2];
|
||||
ard.pulse_length_pri = vdata_end[-3];
|
||||
|
@ -191,9 +191,9 @@ static void ath_mci_ftp_adjust(struct ath_softc *sc)
|
||||
* 45ms, bt traffic will be given priority during 55% of this
|
||||
* period while wlan gets remaining 45%
|
||||
*/
|
||||
static void ath_btcoex_period_timer(unsigned long data)
|
||||
static void ath_btcoex_period_timer(struct timer_list *t)
|
||||
{
|
||||
struct ath_softc *sc = (struct ath_softc *) data;
|
||||
struct ath_softc *sc = from_timer(sc, t, btcoex.period_timer);
|
||||
struct ath_hw *ah = sc->sc_ah;
|
||||
struct ath_btcoex *btcoex = &sc->btcoex;
|
||||
enum ath_stomp_type stomp_type;
|
||||
@ -252,9 +252,9 @@ skip_hw_wakeup:
|
||||
* Generic tsf based hw timer which configures weight
|
||||
* registers to time slice between wlan and bt traffic
|
||||
*/
|
||||
static void ath_btcoex_no_stomp_timer(unsigned long arg)
|
||||
static void ath_btcoex_no_stomp_timer(struct timer_list *t)
|
||||
{
|
||||
struct ath_softc *sc = (struct ath_softc *)arg;
|
||||
struct ath_softc *sc = from_timer(sc, t, btcoex.no_stomp_timer);
|
||||
struct ath_hw *ah = sc->sc_ah;
|
||||
struct ath_btcoex *btcoex = &sc->btcoex;
|
||||
|
||||
@ -284,10 +284,8 @@ static void ath_init_btcoex_timer(struct ath_softc *sc)
|
||||
btcoex->btcoex_period / 100;
|
||||
btcoex->bt_stomp_type = ATH_BTCOEX_STOMP_LOW;
|
||||
|
||||
setup_timer(&btcoex->period_timer, ath_btcoex_period_timer,
|
||||
(unsigned long) sc);
|
||||
setup_timer(&btcoex->no_stomp_timer, ath_btcoex_no_stomp_timer,
|
||||
(unsigned long) sc);
|
||||
timer_setup(&btcoex->period_timer, ath_btcoex_period_timer, 0);
|
||||
timer_setup(&btcoex->no_stomp_timer, ath_btcoex_no_stomp_timer, 0);
|
||||
|
||||
spin_lock_init(&btcoex->btcoex_lock);
|
||||
}
|
||||
|
@ -424,7 +424,7 @@ static int hif_usb_send_tx(struct hif_device_usb *hif_dev, struct sk_buff *skb)
|
||||
|
||||
static void hif_usb_start(void *hif_handle)
|
||||
{
|
||||
struct hif_device_usb *hif_dev = (struct hif_device_usb *)hif_handle;
|
||||
struct hif_device_usb *hif_dev = hif_handle;
|
||||
unsigned long flags;
|
||||
|
||||
hif_dev->flags |= HIF_USB_START;
|
||||
@ -436,7 +436,7 @@ static void hif_usb_start(void *hif_handle)
|
||||
|
||||
static void hif_usb_stop(void *hif_handle)
|
||||
{
|
||||
struct hif_device_usb *hif_dev = (struct hif_device_usb *)hif_handle;
|
||||
struct hif_device_usb *hif_dev = hif_handle;
|
||||
struct tx_buf *tx_buf = NULL, *tx_buf_tmp = NULL;
|
||||
unsigned long flags;
|
||||
|
||||
@ -457,7 +457,7 @@ static void hif_usb_stop(void *hif_handle)
|
||||
|
||||
static int hif_usb_send(void *hif_handle, u8 pipe_id, struct sk_buff *skb)
|
||||
{
|
||||
struct hif_device_usb *hif_dev = (struct hif_device_usb *)hif_handle;
|
||||
struct hif_device_usb *hif_dev = hif_handle;
|
||||
int ret = 0;
|
||||
|
||||
switch (pipe_id) {
|
||||
@ -492,7 +492,7 @@ static inline bool check_index(struct sk_buff *skb, u8 idx)
|
||||
|
||||
static void hif_usb_sta_drain(void *hif_handle, u8 idx)
|
||||
{
|
||||
struct hif_device_usb *hif_dev = (struct hif_device_usb *)hif_handle;
|
||||
struct hif_device_usb *hif_dev = hif_handle;
|
||||
struct sk_buff *skb, *tmp;
|
||||
unsigned long flags;
|
||||
|
||||
|
@ -584,7 +584,7 @@ void ath9k_htc_tx_clear_slot(struct ath9k_htc_priv *priv, int slot);
|
||||
void ath9k_htc_tx_drain(struct ath9k_htc_priv *priv);
|
||||
void ath9k_htc_txstatus(struct ath9k_htc_priv *priv, void *wmi_event);
|
||||
void ath9k_tx_failed_tasklet(unsigned long data);
|
||||
void ath9k_htc_tx_cleanup_timer(unsigned long data);
|
||||
void ath9k_htc_tx_cleanup_timer(struct timer_list *t);
|
||||
bool ath9k_htc_csa_is_finished(struct ath9k_htc_priv *priv);
|
||||
|
||||
int ath9k_rx_init(struct ath9k_htc_priv *priv);
|
||||
|
@ -384,7 +384,7 @@ void ath9k_htc_set_tsfadjust(struct ath9k_htc_priv *priv,
|
||||
|
||||
static void ath9k_htc_beacon_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
|
||||
{
|
||||
bool *beacon_configured = (bool *)data;
|
||||
bool *beacon_configured = data;
|
||||
struct ath9k_htc_vif *avp = (struct ath9k_htc_vif *) vif->drv_priv;
|
||||
|
||||
if (vif->type == NL80211_IFTYPE_STATION &&
|
||||
|
@ -233,7 +233,7 @@ static void ath9k_reg_notifier(struct wiphy *wiphy,
|
||||
|
||||
static unsigned int ath9k_regread(void *hw_priv, u32 reg_offset)
|
||||
{
|
||||
struct ath_hw *ah = (struct ath_hw *) hw_priv;
|
||||
struct ath_hw *ah = hw_priv;
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
|
||||
__be32 val, reg = cpu_to_be32(reg_offset);
|
||||
@ -255,7 +255,7 @@ static unsigned int ath9k_regread(void *hw_priv, u32 reg_offset)
|
||||
static void ath9k_multi_regread(void *hw_priv, u32 *addr,
|
||||
u32 *val, u16 count)
|
||||
{
|
||||
struct ath_hw *ah = (struct ath_hw *) hw_priv;
|
||||
struct ath_hw *ah = hw_priv;
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
|
||||
__be32 tmpaddr[8];
|
||||
@ -301,7 +301,7 @@ static void ath9k_regwrite_multi(struct ath_common *common)
|
||||
|
||||
static void ath9k_regwrite_single(void *hw_priv, u32 val, u32 reg_offset)
|
||||
{
|
||||
struct ath_hw *ah = (struct ath_hw *) hw_priv;
|
||||
struct ath_hw *ah = hw_priv;
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
|
||||
const __be32 buf[2] = {
|
||||
@ -322,7 +322,7 @@ static void ath9k_regwrite_single(void *hw_priv, u32 val, u32 reg_offset)
|
||||
|
||||
static void ath9k_regwrite_buffer(void *hw_priv, u32 val, u32 reg_offset)
|
||||
{
|
||||
struct ath_hw *ah = (struct ath_hw *) hw_priv;
|
||||
struct ath_hw *ah = hw_priv;
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
|
||||
|
||||
@ -345,7 +345,7 @@ static void ath9k_regwrite_buffer(void *hw_priv, u32 val, u32 reg_offset)
|
||||
|
||||
static void ath9k_regwrite(void *hw_priv, u32 val, u32 reg_offset)
|
||||
{
|
||||
struct ath_hw *ah = (struct ath_hw *) hw_priv;
|
||||
struct ath_hw *ah = hw_priv;
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
|
||||
|
||||
@ -357,7 +357,7 @@ static void ath9k_regwrite(void *hw_priv, u32 val, u32 reg_offset)
|
||||
|
||||
static void ath9k_enable_regwrite_buffer(void *hw_priv)
|
||||
{
|
||||
struct ath_hw *ah = (struct ath_hw *) hw_priv;
|
||||
struct ath_hw *ah = hw_priv;
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
|
||||
|
||||
@ -366,7 +366,7 @@ static void ath9k_enable_regwrite_buffer(void *hw_priv)
|
||||
|
||||
static void ath9k_regwrite_flush(void *hw_priv)
|
||||
{
|
||||
struct ath_hw *ah = (struct ath_hw *) hw_priv;
|
||||
struct ath_hw *ah = hw_priv;
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
|
||||
|
||||
@ -383,7 +383,7 @@ static void ath9k_regwrite_flush(void *hw_priv)
|
||||
static void ath9k_reg_rmw_buffer(void *hw_priv,
|
||||
u32 reg_offset, u32 set, u32 clr)
|
||||
{
|
||||
struct ath_hw *ah = (struct ath_hw *) hw_priv;
|
||||
struct ath_hw *ah = hw_priv;
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
|
||||
u32 rsp_status;
|
||||
@ -421,7 +421,7 @@ static void ath9k_reg_rmw_buffer(void *hw_priv,
|
||||
|
||||
static void ath9k_reg_rmw_flush(void *hw_priv)
|
||||
{
|
||||
struct ath_hw *ah = (struct ath_hw *) hw_priv;
|
||||
struct ath_hw *ah = hw_priv;
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
|
||||
u32 rsp_status;
|
||||
@ -453,7 +453,7 @@ static void ath9k_reg_rmw_flush(void *hw_priv)
|
||||
|
||||
static void ath9k_enable_rmw_buffer(void *hw_priv)
|
||||
{
|
||||
struct ath_hw *ah = (struct ath_hw *) hw_priv;
|
||||
struct ath_hw *ah = hw_priv;
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
|
||||
|
||||
@ -466,7 +466,7 @@ static void ath9k_enable_rmw_buffer(void *hw_priv)
|
||||
static u32 ath9k_reg_rmw_single(void *hw_priv,
|
||||
u32 reg_offset, u32 set, u32 clr)
|
||||
{
|
||||
struct ath_hw *ah = (struct ath_hw *) hw_priv;
|
||||
struct ath_hw *ah = hw_priv;
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
|
||||
struct register_rmw buf, buf_ret;
|
||||
@ -490,7 +490,7 @@ static u32 ath9k_reg_rmw_single(void *hw_priv,
|
||||
|
||||
static u32 ath9k_reg_rmw(void *hw_priv, u32 reg_offset, u32 set, u32 clr)
|
||||
{
|
||||
struct ath_hw *ah = (struct ath_hw *) hw_priv;
|
||||
struct ath_hw *ah = hw_priv;
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv;
|
||||
|
||||
@ -654,8 +654,7 @@ static int ath9k_init_priv(struct ath9k_htc_priv *priv,
|
||||
INIT_DELAYED_WORK(&priv->ani_work, ath9k_htc_ani_work);
|
||||
INIT_WORK(&priv->ps_work, ath9k_ps_work);
|
||||
INIT_WORK(&priv->fatal_work, ath9k_fatal_work);
|
||||
setup_timer(&priv->tx.cleanup_timer, ath9k_htc_tx_cleanup_timer,
|
||||
(unsigned long)priv);
|
||||
timer_setup(&priv->tx.cleanup_timer, ath9k_htc_tx_cleanup_timer, 0);
|
||||
|
||||
/*
|
||||
* Cache line size is used to size and align various
|
||||
|
@ -1483,7 +1483,7 @@ static void ath9k_htc_set_bssid(struct ath9k_htc_priv *priv)
|
||||
|
||||
static void ath9k_htc_bss_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
|
||||
{
|
||||
struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *)data;
|
||||
struct ath9k_htc_priv *priv = data;
|
||||
struct ath_common *common = ath9k_hw_common(priv->ah);
|
||||
struct ieee80211_bss_conf *bss_conf = &vif->bss_conf;
|
||||
|
||||
|
@ -641,7 +641,7 @@ static struct sk_buff* ath9k_htc_tx_get_packet(struct ath9k_htc_priv *priv,
|
||||
|
||||
void ath9k_htc_txstatus(struct ath9k_htc_priv *priv, void *wmi_event)
|
||||
{
|
||||
struct wmi_event_txstatus *txs = (struct wmi_event_txstatus *)wmi_event;
|
||||
struct wmi_event_txstatus *txs = wmi_event;
|
||||
struct __wmi_event_txstatus *__txs;
|
||||
struct sk_buff *skb;
|
||||
struct ath9k_htc_tx_event *tx_pend;
|
||||
@ -684,7 +684,7 @@ void ath9k_htc_txstatus(struct ath9k_htc_priv *priv, void *wmi_event)
|
||||
void ath9k_htc_txep(void *drv_priv, struct sk_buff *skb,
|
||||
enum htc_endpoint_id ep_id, bool txok)
|
||||
{
|
||||
struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) drv_priv;
|
||||
struct ath9k_htc_priv *priv = drv_priv;
|
||||
struct ath9k_htc_tx_ctl *tx_ctl;
|
||||
struct sk_buff_head *epid_queue;
|
||||
|
||||
@ -752,9 +752,9 @@ static void ath9k_htc_tx_cleanup_queue(struct ath9k_htc_priv *priv,
|
||||
}
|
||||
}
|
||||
|
||||
void ath9k_htc_tx_cleanup_timer(unsigned long data)
|
||||
void ath9k_htc_tx_cleanup_timer(struct timer_list *t)
|
||||
{
|
||||
struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) data;
|
||||
struct ath9k_htc_priv *priv = from_timer(priv, t, tx.cleanup_timer);
|
||||
struct ath_common *common = ath9k_hw_common(priv->ah);
|
||||
struct ath9k_htc_tx_event *event, *tmp;
|
||||
struct sk_buff *skb;
|
||||
@ -1103,7 +1103,7 @@ requeue:
|
||||
void ath9k_htc_rxep(void *drv_priv, struct sk_buff *skb,
|
||||
enum htc_endpoint_id ep_id)
|
||||
{
|
||||
struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *)drv_priv;
|
||||
struct ath9k_htc_priv *priv = drv_priv;
|
||||
struct ath_hw *ah = priv->ah;
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
struct ath9k_htc_rxbuf *rxbuf = NULL, *tmp_buf = NULL;
|
||||
|
@ -117,7 +117,7 @@ static const struct ath_ps_ops ath9k_ps_ops = {
|
||||
|
||||
static void ath9k_iowrite32(void *hw_priv, u32 val, u32 reg_offset)
|
||||
{
|
||||
struct ath_hw *ah = (struct ath_hw *) hw_priv;
|
||||
struct ath_hw *ah = hw_priv;
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
struct ath_softc *sc = (struct ath_softc *) common->priv;
|
||||
|
||||
@ -132,7 +132,7 @@ static void ath9k_iowrite32(void *hw_priv, u32 val, u32 reg_offset)
|
||||
|
||||
static unsigned int ath9k_ioread32(void *hw_priv, u32 reg_offset)
|
||||
{
|
||||
struct ath_hw *ah = (struct ath_hw *) hw_priv;
|
||||
struct ath_hw *ah = hw_priv;
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
struct ath_softc *sc = (struct ath_softc *) common->priv;
|
||||
u32 val;
|
||||
@ -172,7 +172,7 @@ static unsigned int __ath9k_reg_rmw(struct ath_softc *sc, u32 reg_offset,
|
||||
|
||||
static unsigned int ath9k_reg_rmw(void *hw_priv, u32 reg_offset, u32 set, u32 clr)
|
||||
{
|
||||
struct ath_hw *ah = (struct ath_hw *) hw_priv;
|
||||
struct ath_hw *ah = hw_priv;
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
struct ath_softc *sc = (struct ath_softc *) common->priv;
|
||||
unsigned long uninitialized_var(flags);
|
||||
@ -275,7 +275,7 @@ int ath_descdma_setup(struct ath_softc *sc, struct ath_descdma *dd,
|
||||
if (!dd->dd_desc)
|
||||
return -ENOMEM;
|
||||
|
||||
ds = (u8 *) dd->dd_desc;
|
||||
ds = dd->dd_desc;
|
||||
ath_dbg(common, CONFIG, "%s DMA map: %p (%u) -> %llx (%u)\n",
|
||||
name, ds, (u32) dd->dd_desc_len,
|
||||
ito64(dd->dd_desc_paddr), /*XXX*/(u32) dd->dd_desc_len);
|
||||
@ -369,7 +369,7 @@ static void ath9k_init_misc(struct ath_softc *sc)
|
||||
struct ath_common *common = ath9k_hw_common(sc->sc_ah);
|
||||
int i = 0;
|
||||
|
||||
setup_timer(&common->ani.timer, ath_ani_calibrate, (unsigned long)sc);
|
||||
timer_setup(&common->ani.timer, ath_ani_calibrate, 0);
|
||||
|
||||
common->last_rssi = ATH_RSSI_DUMMY_MARKER;
|
||||
memcpy(common->bssidmask, ath_bcast_mac, ETH_ALEN);
|
||||
@ -678,7 +678,7 @@ static int ath9k_init_softc(u16 devid, struct ath_softc *sc,
|
||||
tasklet_init(&sc->bcon_tasklet, ath9k_beacon_tasklet,
|
||||
(unsigned long)sc);
|
||||
|
||||
setup_timer(&sc->sleep_timer, ath_ps_full_sleep, (unsigned long)sc);
|
||||
timer_setup(&sc->sleep_timer, ath_ps_full_sleep, 0);
|
||||
INIT_WORK(&sc->hw_reset_work, ath_reset_work);
|
||||
INIT_WORK(&sc->paprd_work, ath_paprd_calibrate);
|
||||
INIT_DELAYED_WORK(&sc->hw_pll_work, ath_hw_pll_work);
|
||||
|
@ -301,11 +301,11 @@ fail_paprd:
|
||||
* When the task is complete, it reschedules itself depending on the
|
||||
* appropriate interval that was calculated.
|
||||
*/
|
||||
void ath_ani_calibrate(unsigned long data)
|
||||
void ath_ani_calibrate(struct timer_list *t)
|
||||
{
|
||||
struct ath_softc *sc = (struct ath_softc *)data;
|
||||
struct ath_common *common = from_timer(common, t, ani.timer);
|
||||
struct ath_softc *sc = (struct ath_softc *)common->priv;
|
||||
struct ath_hw *ah = sc->sc_ah;
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
bool longcal = false;
|
||||
bool shortcal = false;
|
||||
bool aniflag = false;
|
||||
@ -367,10 +367,10 @@ void ath_ani_calibrate(unsigned long data)
|
||||
|
||||
/* Call ANI routine if necessary */
|
||||
if (aniflag) {
|
||||
spin_lock(&common->cc_lock);
|
||||
spin_lock_irqsave(&common->cc_lock, flags);
|
||||
ath9k_hw_ani_monitor(ah, ah->curchan);
|
||||
ath_update_survey_stats(sc);
|
||||
spin_unlock(&common->cc_lock);
|
||||
spin_unlock_irqrestore(&common->cc_lock, flags);
|
||||
}
|
||||
|
||||
/* Perform calibration if necessary */
|
||||
|
@ -93,15 +93,16 @@ static bool ath9k_setpower(struct ath_softc *sc, enum ath9k_power_mode mode)
|
||||
return ret;
|
||||
}
|
||||
|
||||
void ath_ps_full_sleep(unsigned long data)
|
||||
void ath_ps_full_sleep(struct timer_list *t)
|
||||
{
|
||||
struct ath_softc *sc = (struct ath_softc *) data;
|
||||
struct ath_softc *sc = from_timer(sc, t, sleep_timer);
|
||||
struct ath_common *common = ath9k_hw_common(sc->sc_ah);
|
||||
unsigned long flags;
|
||||
bool reset;
|
||||
|
||||
spin_lock(&common->cc_lock);
|
||||
spin_lock_irqsave(&common->cc_lock, flags);
|
||||
ath_hw_cycle_counters_update(common);
|
||||
spin_unlock(&common->cc_lock);
|
||||
spin_unlock_irqrestore(&common->cc_lock, flags);
|
||||
|
||||
ath9k_hw_setrxabort(sc->sc_ah, 1);
|
||||
ath9k_hw_stopdmarecv(sc->sc_ah, &reset);
|
||||
@ -394,10 +395,10 @@ void ath9k_tasklet(unsigned long data)
|
||||
|
||||
if ((ah->config.hw_hang_checks & HW_BB_WATCHDOG) &&
|
||||
(status & ATH9K_INT_BB_WATCHDOG)) {
|
||||
spin_lock(&common->cc_lock);
|
||||
spin_lock_irqsave(&common->cc_lock, flags);
|
||||
ath_hw_cycle_counters_update(common);
|
||||
ar9003_hw_bb_watchdog_dbg_info(ah);
|
||||
spin_unlock(&common->cc_lock);
|
||||
spin_unlock_irqrestore(&common->cc_lock, flags);
|
||||
|
||||
if (ar9003_hw_bb_watchdog_check(ah)) {
|
||||
type = RESET_TYPE_BB_WATCHDOG;
|
||||
@ -1193,7 +1194,7 @@ void ath9k_calculate_summary_state(struct ath_softc *sc,
|
||||
|
||||
static void ath9k_tpc_vif_iter(void *data, u8 *mac, struct ieee80211_vif *vif)
|
||||
{
|
||||
int *power = (int *)data;
|
||||
int *power = data;
|
||||
|
||||
if (*power < vif->bss_conf.txpower)
|
||||
*power = vif->bss_conf.txpower;
|
||||
@ -1955,12 +1956,13 @@ static int ath9k_get_survey(struct ieee80211_hw *hw, int idx,
|
||||
struct ath_common *common = ath9k_hw_common(sc->sc_ah);
|
||||
struct ieee80211_supported_band *sband;
|
||||
struct ieee80211_channel *chan;
|
||||
unsigned long flags;
|
||||
int pos;
|
||||
|
||||
if (IS_ENABLED(CONFIG_ATH9K_TX99))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
spin_lock_bh(&common->cc_lock);
|
||||
spin_lock_irqsave(&common->cc_lock, flags);
|
||||
if (idx == 0)
|
||||
ath_update_survey_stats(sc);
|
||||
|
||||
@ -1974,7 +1976,7 @@ static int ath9k_get_survey(struct ieee80211_hw *hw, int idx,
|
||||
sband = hw->wiphy->bands[NL80211_BAND_5GHZ];
|
||||
|
||||
if (!sband || idx >= sband->n_channels) {
|
||||
spin_unlock_bh(&common->cc_lock);
|
||||
spin_unlock_irqrestore(&common->cc_lock, flags);
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
@ -1982,7 +1984,7 @@ static int ath9k_get_survey(struct ieee80211_hw *hw, int idx,
|
||||
pos = chan->hw_value;
|
||||
memcpy(survey, &sc->survey[pos], sizeof(*survey));
|
||||
survey->channel = chan;
|
||||
spin_unlock_bh(&common->cc_lock);
|
||||
spin_unlock_irqrestore(&common->cc_lock, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -453,7 +453,7 @@ int ath_mci_setup(struct ath_softc *sc)
|
||||
mci->sched_buf.bf_len = ATH_MCI_SCHED_BUF_SIZE;
|
||||
|
||||
mci->gpm_buf.bf_len = ATH_MCI_GPM_BUF_SIZE;
|
||||
mci->gpm_buf.bf_addr = (u8 *)mci->sched_buf.bf_addr + mci->sched_buf.bf_len;
|
||||
mci->gpm_buf.bf_addr = mci->sched_buf.bf_addr + mci->sched_buf.bf_len;
|
||||
mci->gpm_buf.bf_paddr = mci->sched_buf.bf_paddr + mci->sched_buf.bf_len;
|
||||
|
||||
ret = ar9003_mci_setup(sc->sc_ah, mci->gpm_buf.bf_paddr,
|
||||
|
@ -179,6 +179,9 @@ static ssize_t write_file_tx99(struct file *file, const char __user *user_buf,
|
||||
ssize_t len;
|
||||
int r;
|
||||
|
||||
if (count < 1)
|
||||
return -EINVAL;
|
||||
|
||||
if (sc->cur_chan->nvifs > 1)
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
@ -186,6 +189,8 @@ static ssize_t write_file_tx99(struct file *file, const char __user *user_buf,
|
||||
if (copy_from_user(buf, user_buf, len))
|
||||
return -EFAULT;
|
||||
|
||||
buf[len] = '\0';
|
||||
|
||||
if (strtobool(buf, &start))
|
||||
return -EINVAL;
|
||||
|
||||
|
@ -159,7 +159,7 @@ void ath9k_wmi_event_tasklet(unsigned long data)
|
||||
|
||||
switch (cmd_id) {
|
||||
case WMI_SWBA_EVENTID:
|
||||
swba = (struct wmi_event_swba *) wmi_event;
|
||||
swba = wmi_event;
|
||||
ath9k_htc_swba(priv, swba);
|
||||
break;
|
||||
case WMI_FATAL_EVENTID:
|
||||
@ -207,7 +207,7 @@ static void ath9k_wmi_rsp_callback(struct wmi *wmi, struct sk_buff *skb)
|
||||
static void ath9k_wmi_ctrl_rx(void *priv, struct sk_buff *skb,
|
||||
enum htc_endpoint_id epid)
|
||||
{
|
||||
struct wmi *wmi = (struct wmi *) priv;
|
||||
struct wmi *wmi = priv;
|
||||
struct wmi_cmd_hdr *hdr;
|
||||
u16 cmd_id;
|
||||
|
||||
|
@ -1135,7 +1135,8 @@ static int wcn36xx_init_ieee80211(struct wcn36xx *wcn)
|
||||
BIT(NL80211_IFTYPE_MESH_POINT);
|
||||
|
||||
wcn->hw->wiphy->bands[NL80211_BAND_2GHZ] = &wcn_band_2ghz;
|
||||
wcn->hw->wiphy->bands[NL80211_BAND_5GHZ] = &wcn_band_5ghz;
|
||||
if (wcn->rf_id != RF_IRIS_WCN3620)
|
||||
wcn->hw->wiphy->bands[NL80211_BAND_5GHZ] = &wcn_band_5ghz;
|
||||
|
||||
wcn->hw->wiphy->max_scan_ssids = WCN36XX_MAX_SCAN_SSIDS;
|
||||
wcn->hw->wiphy->max_scan_ie_len = WCN36XX_MAX_SCAN_IE_LEN;
|
||||
@ -1168,6 +1169,7 @@ static int wcn36xx_platform_get_resources(struct wcn36xx *wcn,
|
||||
struct platform_device *pdev)
|
||||
{
|
||||
struct device_node *mmio_node;
|
||||
struct device_node *iris_node;
|
||||
struct resource *res;
|
||||
int index;
|
||||
int ret;
|
||||
@ -1230,6 +1232,14 @@ static int wcn36xx_platform_get_resources(struct wcn36xx *wcn,
|
||||
goto unmap_ccu;
|
||||
}
|
||||
|
||||
/* External RF module */
|
||||
iris_node = of_find_node_by_name(mmio_node, "iris");
|
||||
if (iris_node) {
|
||||
if (of_device_is_compatible(iris_node, "qcom,wcn3620"))
|
||||
wcn->rf_id = RF_IRIS_WCN3620;
|
||||
of_node_put(iris_node);
|
||||
}
|
||||
|
||||
of_node_put(mmio_node);
|
||||
return 0;
|
||||
|
||||
|
@ -94,6 +94,9 @@ enum wcn36xx_ampdu_state {
|
||||
#define WCN36XX_FLAGS(__wcn) (__wcn->hw->flags)
|
||||
#define WCN36XX_MAX_POWER(__wcn) (__wcn->hw->conf.chandef.chan->max_power)
|
||||
|
||||
#define RF_UNKNOWN 0x0000
|
||||
#define RF_IRIS_WCN3620 0x3620
|
||||
|
||||
static inline void buff_to_be(u32 *buf, size_t len)
|
||||
{
|
||||
int i;
|
||||
@ -241,6 +244,9 @@ struct wcn36xx {
|
||||
|
||||
struct sk_buff *tx_ack_skb;
|
||||
|
||||
/* RF module */
|
||||
unsigned rf_id;
|
||||
|
||||
#ifdef CONFIG_WCN36XX_DEBUGFS
|
||||
/* Debug file system entry */
|
||||
struct wcn36xx_dfs_entry dfs;
|
||||
|
@ -1048,50 +1048,6 @@ static const struct file_operations fops_bf = {
|
||||
.llseek = seq_lseek,
|
||||
};
|
||||
|
||||
/*---------SSID------------*/
|
||||
static ssize_t wil_read_file_ssid(struct file *file, char __user *user_buf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct wil6210_priv *wil = file->private_data;
|
||||
struct wireless_dev *wdev = wil_to_wdev(wil);
|
||||
|
||||
return simple_read_from_buffer(user_buf, count, ppos,
|
||||
wdev->ssid, wdev->ssid_len);
|
||||
}
|
||||
|
||||
static ssize_t wil_write_file_ssid(struct file *file, const char __user *buf,
|
||||
size_t count, loff_t *ppos)
|
||||
{
|
||||
struct wil6210_priv *wil = file->private_data;
|
||||
struct wireless_dev *wdev = wil_to_wdev(wil);
|
||||
struct net_device *ndev = wil_to_ndev(wil);
|
||||
|
||||
if (*ppos != 0) {
|
||||
wil_err(wil, "Unable to set SSID substring from [%d]\n",
|
||||
(int)*ppos);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (count > sizeof(wdev->ssid)) {
|
||||
wil_err(wil, "SSID too long, len = %d\n", (int)count);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (netif_running(ndev)) {
|
||||
wil_err(wil, "Unable to change SSID on running interface\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
wdev->ssid_len = count;
|
||||
return simple_write_to_buffer(wdev->ssid, wdev->ssid_len, ppos,
|
||||
buf, count);
|
||||
}
|
||||
|
||||
static const struct file_operations fops_ssid = {
|
||||
.read = wil_read_file_ssid,
|
||||
.write = wil_write_file_ssid,
|
||||
.open = simple_open,
|
||||
};
|
||||
|
||||
/*---------temp------------*/
|
||||
static void print_temp(struct seq_file *s, const char *prefix, u32 t)
|
||||
{
|
||||
@ -1695,7 +1651,6 @@ static const struct {
|
||||
{"stations", 0444, &fops_sta},
|
||||
{"desc", 0444, &fops_txdesc},
|
||||
{"bf", 0444, &fops_bf},
|
||||
{"ssid", 0644, &fops_ssid},
|
||||
{"mem_val", 0644, &fops_memread},
|
||||
{"reset", 0244, &fops_reset},
|
||||
{"rxon", 0244, &fops_rxon},
|
||||
|
@ -336,9 +336,9 @@ static void wil_disconnect_worker(struct work_struct *work)
|
||||
clear_bit(wil_status_fwconnecting, wil->status);
|
||||
}
|
||||
|
||||
static void wil_connect_timer_fn(ulong x)
|
||||
static void wil_connect_timer_fn(struct timer_list *t)
|
||||
{
|
||||
struct wil6210_priv *wil = (void *)x;
|
||||
struct wil6210_priv *wil = from_timer(wil, t, connect_timer);
|
||||
bool q;
|
||||
|
||||
wil_err(wil, "Connect timeout detected, disconnect station\n");
|
||||
@ -351,9 +351,9 @@ static void wil_connect_timer_fn(ulong x)
|
||||
wil_dbg_wmi(wil, "queue_work of disconnect_worker -> %d\n", q);
|
||||
}
|
||||
|
||||
static void wil_scan_timer_fn(ulong x)
|
||||
static void wil_scan_timer_fn(struct timer_list *t)
|
||||
{
|
||||
struct wil6210_priv *wil = (void *)x;
|
||||
struct wil6210_priv *wil = from_timer(wil, t, scan_timer);
|
||||
|
||||
clear_bit(wil_status_fwready, wil->status);
|
||||
wil_err(wil, "Scan timeout detected, start fw error recovery\n");
|
||||
@ -540,10 +540,9 @@ int wil_priv_init(struct wil6210_priv *wil)
|
||||
init_completion(&wil->halp.comp);
|
||||
|
||||
wil->bcast_vring = -1;
|
||||
setup_timer(&wil->connect_timer, wil_connect_timer_fn, (ulong)wil);
|
||||
setup_timer(&wil->scan_timer, wil_scan_timer_fn, (ulong)wil);
|
||||
setup_timer(&wil->p2p.discovery_timer, wil_p2p_discovery_timer_fn,
|
||||
(ulong)wil);
|
||||
timer_setup(&wil->connect_timer, wil_connect_timer_fn, 0);
|
||||
timer_setup(&wil->scan_timer, wil_scan_timer_fn, 0);
|
||||
timer_setup(&wil->p2p.discovery_timer, wil_p2p_discovery_timer_fn, 0);
|
||||
|
||||
INIT_WORK(&wil->disconnect_worker, wil_disconnect_worker);
|
||||
INIT_WORK(&wil->wmi_event_worker, wmi_event_worker);
|
||||
|
@ -65,9 +65,9 @@ bool wil_p2p_is_social_scan(struct cfg80211_scan_request *request)
|
||||
(request->channels[0]->hw_value == P2P_DMG_SOCIAL_CHANNEL);
|
||||
}
|
||||
|
||||
void wil_p2p_discovery_timer_fn(ulong x)
|
||||
void wil_p2p_discovery_timer_fn(struct timer_list *t)
|
||||
{
|
||||
struct wil6210_priv *wil = (void *)x;
|
||||
struct wil6210_priv *wil = from_timer(wil, t, p2p.discovery_timer);
|
||||
|
||||
wil_dbg_misc(wil, "p2p_discovery_timer_fn\n");
|
||||
|
||||
|
@ -918,7 +918,7 @@ void wil6210_mask_halp(struct wil6210_priv *wil);
|
||||
|
||||
/* P2P */
|
||||
bool wil_p2p_is_social_scan(struct cfg80211_scan_request *request);
|
||||
void wil_p2p_discovery_timer_fn(ulong x);
|
||||
void wil_p2p_discovery_timer_fn(struct timer_list *t);
|
||||
int wil_p2p_search(struct wil6210_priv *wil,
|
||||
struct cfg80211_scan_request *request);
|
||||
int wil_p2p_listen(struct wil6210_priv *wil, struct wireless_dev *wdev,
|
||||
|
@ -586,7 +586,7 @@ static int atmel_validate_channel(struct atmel_private *priv, int channel);
|
||||
static void atmel_management_frame(struct atmel_private *priv,
|
||||
struct ieee80211_hdr *header,
|
||||
u16 frame_len, u8 rssi);
|
||||
static void atmel_management_timer(u_long a);
|
||||
static void atmel_management_timer(struct timer_list *t);
|
||||
static void atmel_send_command(struct atmel_private *priv, int command,
|
||||
void *cmd, int cmd_size);
|
||||
static int atmel_send_command_wait(struct atmel_private *priv, int command,
|
||||
@ -1579,8 +1579,7 @@ struct net_device *init_atmel_card(unsigned short irq, unsigned long port,
|
||||
priv->default_beacon_period = priv->beacon_period = 100;
|
||||
priv->listen_interval = 1;
|
||||
|
||||
setup_timer(&priv->management_timer, atmel_management_timer,
|
||||
(unsigned long)dev);
|
||||
timer_setup(&priv->management_timer, atmel_management_timer, 0);
|
||||
spin_lock_init(&priv->irqlock);
|
||||
spin_lock_init(&priv->timerlock);
|
||||
|
||||
@ -3434,10 +3433,9 @@ static void atmel_management_frame(struct atmel_private *priv,
|
||||
}
|
||||
|
||||
/* run when timer expires */
|
||||
static void atmel_management_timer(u_long a)
|
||||
static void atmel_management_timer(struct timer_list *t)
|
||||
{
|
||||
struct net_device *dev = (struct net_device *) a;
|
||||
struct atmel_private *priv = netdev_priv(dev);
|
||||
struct atmel_private *priv = from_timer(priv, t, management_timer);
|
||||
unsigned long flags;
|
||||
|
||||
/* Check if the card has been yanked. */
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -3429,7 +3429,7 @@ il3945_setup_deferred_work(struct il_priv *il)
|
||||
|
||||
il3945_hw_setup_deferred_work(il);
|
||||
|
||||
setup_timer(&il->watchdog, il_bg_watchdog, (unsigned long)il);
|
||||
timer_setup(&il->watchdog, il_bg_watchdog, 0);
|
||||
|
||||
tasklet_init(&il->irq_tasklet,
|
||||
(void (*)(unsigned long))il3945_irq_tasklet,
|
||||
|
@ -181,9 +181,9 @@ il3945_rate_scale_flush_wins(struct il3945_rs_sta *rs_sta)
|
||||
#define IL_AVERAGE_PACKETS 1500
|
||||
|
||||
static void
|
||||
il3945_bg_rate_scale_flush(unsigned long data)
|
||||
il3945_bg_rate_scale_flush(struct timer_list *t)
|
||||
{
|
||||
struct il3945_rs_sta *rs_sta = (void *)data;
|
||||
struct il3945_rs_sta *rs_sta = from_timer(rs_sta, t, rate_scale_flush);
|
||||
struct il_priv *il __maybe_unused = rs_sta->il;
|
||||
int unflushed = 0;
|
||||
unsigned long flags;
|
||||
@ -360,9 +360,6 @@ il3945_rs_rate_init(struct il_priv *il, struct ieee80211_sta *sta, u8 sta_id)
|
||||
rs_sta->flush_time = RATE_FLUSH;
|
||||
rs_sta->last_tx_packets = 0;
|
||||
|
||||
rs_sta->rate_scale_flush.data = (unsigned long)rs_sta;
|
||||
rs_sta->rate_scale_flush.function = il3945_bg_rate_scale_flush;
|
||||
|
||||
for (i = 0; i < RATE_COUNT_3945; i++)
|
||||
il3945_clear_win(&rs_sta->win[i]);
|
||||
|
||||
@ -415,8 +412,7 @@ il3945_rs_alloc_sta(void *il_priv, struct ieee80211_sta *sta, gfp_t gfp)
|
||||
rs_sta = &psta->rs_sta;
|
||||
|
||||
spin_lock_init(&rs_sta->lock);
|
||||
init_timer(&rs_sta->rate_scale_flush);
|
||||
|
||||
timer_setup(&rs_sta->rate_scale_flush, il3945_bg_rate_scale_flush, 0);
|
||||
D_RATE("leave\n");
|
||||
|
||||
return rs_sta;
|
||||
|
@ -4074,9 +4074,9 @@ il4965_hdl_alive(struct il_priv *il, struct il_rx_buf *rxb)
|
||||
* used for calibrating the TXPOWER.
|
||||
*/
|
||||
static void
|
||||
il4965_bg_stats_periodic(unsigned long data)
|
||||
il4965_bg_stats_periodic(struct timer_list *t)
|
||||
{
|
||||
struct il_priv *il = (struct il_priv *)data;
|
||||
struct il_priv *il = from_timer(il, t, stats_periodic);
|
||||
|
||||
if (test_bit(S_EXIT_PENDING, &il->status))
|
||||
return;
|
||||
@ -6258,10 +6258,9 @@ il4965_setup_deferred_work(struct il_priv *il)
|
||||
|
||||
INIT_WORK(&il->txpower_work, il4965_bg_txpower_work);
|
||||
|
||||
setup_timer(&il->stats_periodic, il4965_bg_stats_periodic,
|
||||
(unsigned long)il);
|
||||
timer_setup(&il->stats_periodic, il4965_bg_stats_periodic, 0);
|
||||
|
||||
setup_timer(&il->watchdog, il_bg_watchdog, (unsigned long)il);
|
||||
timer_setup(&il->watchdog, il_bg_watchdog, 0);
|
||||
|
||||
tasklet_init(&il->irq_tasklet,
|
||||
(void (*)(unsigned long))il4965_irq_tasklet,
|
||||
|
@ -4844,9 +4844,9 @@ il_check_stuck_queue(struct il_priv *il, int cnt)
|
||||
* we reset the firmware. If everything is fine just rearm the timer.
|
||||
*/
|
||||
void
|
||||
il_bg_watchdog(unsigned long data)
|
||||
il_bg_watchdog(struct timer_list *t)
|
||||
{
|
||||
struct il_priv *il = (struct il_priv *)data;
|
||||
struct il_priv *il = from_timer(il, t, watchdog);
|
||||
int cnt;
|
||||
unsigned long timeout;
|
||||
|
||||
|
@ -1832,7 +1832,7 @@ int il_enqueue_hcmd(struct il_priv *il, struct il_host_cmd *cmd);
|
||||
* PCI *
|
||||
*****************************************************/
|
||||
|
||||
void il_bg_watchdog(unsigned long data);
|
||||
void il_bg_watchdog(struct timer_list *t);
|
||||
u32 il_usecs_to_beacons(struct il_priv *il, u32 usec, u32 beacon_interval);
|
||||
__le32 il_add_beacon_time(struct il_priv *il, u32 base, u32 addon,
|
||||
u32 beacon_interval);
|
||||
|
@ -165,7 +165,8 @@ static const struct iwl_tt_params iwl8000_tt_params = {
|
||||
.thermal_params = &iwl8000_tt_params, \
|
||||
.apmg_not_supported = true, \
|
||||
.nvm_type = IWL_NVM_EXT, \
|
||||
.dbgc_supported = true
|
||||
.dbgc_supported = true, \
|
||||
.min_umac_error_event_table = 0x800000
|
||||
|
||||
#define IWL_DEVICE_8000 \
|
||||
IWL_DEVICE_8000_COMMON, \
|
||||
|
@ -149,7 +149,8 @@ static const struct iwl_tt_params iwl9000_tt_params = {
|
||||
.mac_addr_from_csr = true, \
|
||||
.rf_id = true, \
|
||||
.nvm_type = IWL_NVM_EXT, \
|
||||
.dbgc_supported = true
|
||||
.dbgc_supported = true, \
|
||||
.min_umac_error_event_table = 0x800000
|
||||
|
||||
const struct iwl_cfg iwl9160_2ac_cfg = {
|
||||
.name = "Intel(R) Dual Band Wireless AC 9160",
|
||||
|
@ -135,7 +135,8 @@ static const struct iwl_ht_params iwl_a000_ht_params = {
|
||||
.gen2 = true, \
|
||||
.nvm_type = IWL_NVM_EXT, \
|
||||
.dbgc_supported = true, \
|
||||
.tx_cmd_queue_size = 32
|
||||
.tx_cmd_queue_size = 32, \
|
||||
.min_umac_error_event_table = 0x400000
|
||||
|
||||
const struct iwl_cfg iwla000_2ac_cfg_hr = {
|
||||
.name = "Intel(R) Dual Band Wireless AC a000",
|
||||
|
@ -710,7 +710,7 @@ enum iwl_mvm_ba_resp_flags {
|
||||
* @reduced_txp: power reduced according to TPC. This is the actual value and
|
||||
* not a copy from the LQ command. Thus, if not the first rate was used
|
||||
* for Tx-ing then this value will be set to 0 by FW.
|
||||
* @initial_rate: TLC rate info, initial rate index, TLC table color
|
||||
* @tlc_rate_info: TLC rate info, initial rate index, TLC table color
|
||||
* @retry_cnt: retry count
|
||||
* @query_byte_cnt: SCD query byte count
|
||||
* @query_frame_cnt: SCD query frame count
|
||||
@ -730,7 +730,7 @@ struct iwl_mvm_compressed_ba_notif {
|
||||
__le32 flags;
|
||||
u8 sta_id;
|
||||
u8 reduced_txp;
|
||||
u8 initial_rate;
|
||||
u8 tlc_rate_info;
|
||||
u8 retry_cnt;
|
||||
__le32 query_byte_cnt;
|
||||
__le16 query_frame_cnt;
|
||||
|
@ -396,6 +396,7 @@ struct iwl_cfg {
|
||||
u8 max_vht_ampdu_exponent;
|
||||
u8 ucode_api_max;
|
||||
u8 ucode_api_min;
|
||||
u32 min_umac_error_event_table;
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -176,6 +176,7 @@ static bool iwl_alive_fn(struct iwl_notif_wait_data *notif_wait,
|
||||
struct iwl_lmac_alive *lmac1;
|
||||
struct iwl_lmac_alive *lmac2 = NULL;
|
||||
u16 status;
|
||||
u32 umac_error_event_table;
|
||||
|
||||
if (iwl_rx_packet_payload_len(pkt) == sizeof(*palive)) {
|
||||
palive = (void *)pkt->data;
|
||||
@ -198,12 +199,25 @@ static bool iwl_alive_fn(struct iwl_notif_wait_data *notif_wait,
|
||||
mvm->sf_space.addr = le32_to_cpu(lmac1->st_fwrd_addr);
|
||||
mvm->sf_space.size = le32_to_cpu(lmac1->st_fwrd_size);
|
||||
|
||||
mvm->umac_error_event_table = le32_to_cpu(umac->error_info_addr);
|
||||
umac_error_event_table = le32_to_cpu(umac->error_info_addr);
|
||||
|
||||
if (!umac_error_event_table) {
|
||||
mvm->support_umac_log = false;
|
||||
} else if (umac_error_event_table >=
|
||||
mvm->trans->cfg->min_umac_error_event_table) {
|
||||
mvm->support_umac_log = true;
|
||||
mvm->umac_error_event_table = umac_error_event_table;
|
||||
} else {
|
||||
IWL_ERR(mvm,
|
||||
"Not valid error log pointer 0x%08X for %s uCode\n",
|
||||
mvm->umac_error_event_table,
|
||||
(mvm->fwrt.cur_fw_img == IWL_UCODE_INIT) ?
|
||||
"Init" : "RT");
|
||||
mvm->support_umac_log = false;
|
||||
}
|
||||
|
||||
alive_data->scd_base_addr = le32_to_cpu(lmac1->scd_base_ptr);
|
||||
alive_data->valid = status == IWL_ALIVE_STATUS_OK;
|
||||
if (mvm->umac_error_event_table)
|
||||
mvm->support_umac_log = true;
|
||||
|
||||
IWL_DEBUG_FW(mvm,
|
||||
"Alive ucode status 0x%04x revision 0x%01X 0x%01X\n",
|
||||
|
@ -585,13 +585,9 @@ enum iwl_mvm_tdls_cs_state {
|
||||
* @head_sn: reorder window head sn
|
||||
* @num_stored: number of mpdus stored in the buffer
|
||||
* @buf_size: the reorder buffer size as set by the last addba request
|
||||
* @sta_id: sta id of this reorder buffer
|
||||
* @queue: queue of this reorder buffer
|
||||
* @last_amsdu: track last ASMDU SN for duplication detection
|
||||
* @last_sub_index: track ASMDU sub frame index for duplication detection
|
||||
* @tid: the tid
|
||||
* @entries: list of skbs stored
|
||||
* @reorder_time: time the packet was stored in the reorder buffer
|
||||
* @reorder_timer: timer for frames are in the reorder buffer. For AMSDU
|
||||
* it is the time of last received sub-frame
|
||||
* @removed: prevent timer re-arming
|
||||
@ -603,13 +599,9 @@ struct iwl_mvm_reorder_buffer {
|
||||
u16 head_sn;
|
||||
u16 num_stored;
|
||||
u8 buf_size;
|
||||
u8 sta_id;
|
||||
int queue;
|
||||
u16 last_amsdu;
|
||||
u8 last_sub_index;
|
||||
u8 tid;
|
||||
struct sk_buff_head entries[IEEE80211_MAX_AMPDU_BUF];
|
||||
unsigned long reorder_time[IEEE80211_MAX_AMPDU_BUF];
|
||||
struct timer_list reorder_timer;
|
||||
bool removed;
|
||||
bool valid;
|
||||
@ -617,16 +609,39 @@ struct iwl_mvm_reorder_buffer {
|
||||
struct iwl_mvm *mvm;
|
||||
} ____cacheline_aligned_in_smp;
|
||||
|
||||
/**
|
||||
* struct _iwl_mvm_reorder_buf_entry - reorder buffer entry per-queue/per-seqno
|
||||
* @frames: list of skbs stored
|
||||
* @reorder_time: time the packet was stored in the reorder buffer
|
||||
*/
|
||||
struct _iwl_mvm_reorder_buf_entry {
|
||||
struct sk_buff_head frames;
|
||||
unsigned long reorder_time;
|
||||
};
|
||||
|
||||
/* make this indirection to get the aligned thing */
|
||||
struct iwl_mvm_reorder_buf_entry {
|
||||
struct _iwl_mvm_reorder_buf_entry e;
|
||||
}
|
||||
#ifndef __CHECKER__
|
||||
/* sparse doesn't like this construct: "bad integer constant expression" */
|
||||
__aligned(roundup_pow_of_two(sizeof(struct _iwl_mvm_reorder_buf_entry)))
|
||||
#endif
|
||||
;
|
||||
|
||||
/**
|
||||
* struct iwl_mvm_baid_data - BA session data
|
||||
* @sta_id: station id
|
||||
* @tid: tid of the session
|
||||
* @baid baid of the session
|
||||
* @timeout: the timeout set in the addba request
|
||||
* @entries_per_queue: # of buffers per queue, this actually gets
|
||||
* aligned up to avoid cache line sharing between queues
|
||||
* @last_rx: last rx jiffies, updated only if timeout passed from last update
|
||||
* @session_timer: timer to check if BA session expired, runs at 2 * timeout
|
||||
* @mvm: mvm pointer, needed for timer context
|
||||
* @reorder_buf: reorder buffer, allocated per queue
|
||||
* @reorder_buf_data: data
|
||||
*/
|
||||
struct iwl_mvm_baid_data {
|
||||
struct rcu_head rcu_head;
|
||||
@ -634,12 +649,22 @@ struct iwl_mvm_baid_data {
|
||||
u8 tid;
|
||||
u8 baid;
|
||||
u16 timeout;
|
||||
u16 entries_per_queue;
|
||||
unsigned long last_rx;
|
||||
struct timer_list session_timer;
|
||||
struct iwl_mvm *mvm;
|
||||
struct iwl_mvm_reorder_buffer reorder_buf[];
|
||||
struct iwl_mvm_reorder_buffer reorder_buf[IWL_MAX_RX_HW_QUEUES];
|
||||
struct iwl_mvm_reorder_buf_entry entries[];
|
||||
};
|
||||
|
||||
static inline struct iwl_mvm_baid_data *
|
||||
iwl_mvm_baid_data_from_reorder_buf(struct iwl_mvm_reorder_buffer *buf)
|
||||
{
|
||||
return (void *)((u8 *)buf -
|
||||
offsetof(struct iwl_mvm_baid_data, reorder_buf) -
|
||||
sizeof(*buf) * buf->queue);
|
||||
}
|
||||
|
||||
/*
|
||||
* enum iwl_mvm_queue_status - queue status
|
||||
* @IWL_MVM_QUEUE_FREE: the queue is not allocated nor reserved
|
||||
|
@ -409,9 +409,13 @@ static bool iwl_mvm_is_sn_less(u16 sn1, u16 sn2, u16 buffer_size)
|
||||
static void iwl_mvm_release_frames(struct iwl_mvm *mvm,
|
||||
struct ieee80211_sta *sta,
|
||||
struct napi_struct *napi,
|
||||
struct iwl_mvm_baid_data *baid_data,
|
||||
struct iwl_mvm_reorder_buffer *reorder_buf,
|
||||
u16 nssn)
|
||||
{
|
||||
struct iwl_mvm_reorder_buf_entry *entries =
|
||||
&baid_data->entries[reorder_buf->queue *
|
||||
baid_data->entries_per_queue];
|
||||
u16 ssn = reorder_buf->head_sn;
|
||||
|
||||
lockdep_assert_held(&reorder_buf->lock);
|
||||
@ -422,7 +426,7 @@ static void iwl_mvm_release_frames(struct iwl_mvm *mvm,
|
||||
|
||||
while (iwl_mvm_is_sn_less(ssn, nssn, reorder_buf->buf_size)) {
|
||||
int index = ssn % reorder_buf->buf_size;
|
||||
struct sk_buff_head *skb_list = &reorder_buf->entries[index];
|
||||
struct sk_buff_head *skb_list = &entries[index].e.frames;
|
||||
struct sk_buff *skb;
|
||||
|
||||
ssn = ieee80211_sn_inc(ssn);
|
||||
@ -445,11 +449,11 @@ set_timer:
|
||||
if (reorder_buf->num_stored && !reorder_buf->removed) {
|
||||
u16 index = reorder_buf->head_sn % reorder_buf->buf_size;
|
||||
|
||||
while (skb_queue_empty(&reorder_buf->entries[index]))
|
||||
while (skb_queue_empty(&entries[index].e.frames))
|
||||
index = (index + 1) % reorder_buf->buf_size;
|
||||
/* modify timer to match next frame's expiration time */
|
||||
mod_timer(&reorder_buf->reorder_timer,
|
||||
reorder_buf->reorder_time[index] + 1 +
|
||||
entries[index].e.reorder_time + 1 +
|
||||
RX_REORDER_BUF_TIMEOUT_MQ);
|
||||
} else {
|
||||
del_timer(&reorder_buf->reorder_timer);
|
||||
@ -459,6 +463,10 @@ set_timer:
|
||||
void iwl_mvm_reorder_timer_expired(unsigned long data)
|
||||
{
|
||||
struct iwl_mvm_reorder_buffer *buf = (void *)data;
|
||||
struct iwl_mvm_baid_data *baid_data =
|
||||
iwl_mvm_baid_data_from_reorder_buf(buf);
|
||||
struct iwl_mvm_reorder_buf_entry *entries =
|
||||
&baid_data->entries[buf->queue * baid_data->entries_per_queue];
|
||||
int i;
|
||||
u16 sn = 0, index = 0;
|
||||
bool expired = false;
|
||||
@ -474,7 +482,7 @@ void iwl_mvm_reorder_timer_expired(unsigned long data)
|
||||
for (i = 0; i < buf->buf_size ; i++) {
|
||||
index = (buf->head_sn + i) % buf->buf_size;
|
||||
|
||||
if (skb_queue_empty(&buf->entries[index])) {
|
||||
if (skb_queue_empty(&entries[index].e.frames)) {
|
||||
/*
|
||||
* If there is a hole and the next frame didn't expire
|
||||
* we want to break and not advance SN
|
||||
@ -482,7 +490,8 @@ void iwl_mvm_reorder_timer_expired(unsigned long data)
|
||||
cont = false;
|
||||
continue;
|
||||
}
|
||||
if (!cont && !time_after(jiffies, buf->reorder_time[index] +
|
||||
if (!cont &&
|
||||
!time_after(jiffies, entries[index].e.reorder_time +
|
||||
RX_REORDER_BUF_TIMEOUT_MQ))
|
||||
break;
|
||||
|
||||
@ -495,18 +504,19 @@ void iwl_mvm_reorder_timer_expired(unsigned long data)
|
||||
if (expired) {
|
||||
struct ieee80211_sta *sta;
|
||||
struct iwl_mvm_sta *mvmsta;
|
||||
u8 sta_id = baid_data->sta_id;
|
||||
|
||||
rcu_read_lock();
|
||||
sta = rcu_dereference(buf->mvm->fw_id_to_mac_id[buf->sta_id]);
|
||||
sta = rcu_dereference(buf->mvm->fw_id_to_mac_id[sta_id]);
|
||||
mvmsta = iwl_mvm_sta_from_mac80211(sta);
|
||||
|
||||
/* SN is set to the last expired frame + 1 */
|
||||
IWL_DEBUG_HT(buf->mvm,
|
||||
"Releasing expired frames for sta %u, sn %d\n",
|
||||
buf->sta_id, sn);
|
||||
sta_id, sn);
|
||||
iwl_mvm_event_frame_timeout_callback(buf->mvm, mvmsta->vif,
|
||||
sta, buf->tid);
|
||||
iwl_mvm_release_frames(buf->mvm, sta, NULL, buf, sn);
|
||||
sta, baid_data->tid);
|
||||
iwl_mvm_release_frames(buf->mvm, sta, NULL, baid_data, buf, sn);
|
||||
rcu_read_unlock();
|
||||
} else {
|
||||
/*
|
||||
@ -515,7 +525,7 @@ void iwl_mvm_reorder_timer_expired(unsigned long data)
|
||||
* accordingly to this frame.
|
||||
*/
|
||||
mod_timer(&buf->reorder_timer,
|
||||
buf->reorder_time[index] +
|
||||
entries[index].e.reorder_time +
|
||||
1 + RX_REORDER_BUF_TIMEOUT_MQ);
|
||||
}
|
||||
spin_unlock(&buf->lock);
|
||||
@ -546,7 +556,7 @@ static void iwl_mvm_del_ba(struct iwl_mvm *mvm, int queue,
|
||||
|
||||
/* release all frames that are in the reorder buffer to the stack */
|
||||
spin_lock_bh(&reorder_buf->lock);
|
||||
iwl_mvm_release_frames(mvm, sta, NULL, reorder_buf,
|
||||
iwl_mvm_release_frames(mvm, sta, NULL, ba_data, reorder_buf,
|
||||
ieee80211_sn_add(reorder_buf->head_sn,
|
||||
reorder_buf->buf_size));
|
||||
spin_unlock_bh(&reorder_buf->lock);
|
||||
@ -610,6 +620,7 @@ static bool iwl_mvm_reorder(struct iwl_mvm *mvm,
|
||||
u8 tid = *ieee80211_get_qos_ctl(hdr) & IEEE80211_QOS_CTL_TID_MASK;
|
||||
u8 sub_frame_idx = desc->amsdu_info &
|
||||
IWL_RX_MPDU_AMSDU_SUBFRAME_IDX_MASK;
|
||||
struct iwl_mvm_reorder_buf_entry *entries;
|
||||
int index;
|
||||
u16 nssn, sn;
|
||||
u8 baid;
|
||||
@ -660,6 +671,7 @@ static bool iwl_mvm_reorder(struct iwl_mvm *mvm,
|
||||
IWL_RX_MPDU_REORDER_SN_SHIFT;
|
||||
|
||||
buffer = &baid_data->reorder_buf[queue];
|
||||
entries = &baid_data->entries[queue * baid_data->entries_per_queue];
|
||||
|
||||
spin_lock_bh(&buffer->lock);
|
||||
|
||||
@ -672,7 +684,7 @@ static bool iwl_mvm_reorder(struct iwl_mvm *mvm,
|
||||
}
|
||||
|
||||
if (ieee80211_is_back_req(hdr->frame_control)) {
|
||||
iwl_mvm_release_frames(mvm, sta, napi, buffer, nssn);
|
||||
iwl_mvm_release_frames(mvm, sta, napi, baid_data, buffer, nssn);
|
||||
goto drop;
|
||||
}
|
||||
|
||||
@ -688,7 +700,8 @@ static bool iwl_mvm_reorder(struct iwl_mvm *mvm,
|
||||
!ieee80211_sn_less(sn, buffer->head_sn + buffer->buf_size)) {
|
||||
u16 min_sn = ieee80211_sn_less(sn, nssn) ? sn : nssn;
|
||||
|
||||
iwl_mvm_release_frames(mvm, sta, napi, buffer, min_sn);
|
||||
iwl_mvm_release_frames(mvm, sta, napi, baid_data, buffer,
|
||||
min_sn);
|
||||
}
|
||||
|
||||
/* drop any oudated packets */
|
||||
@ -716,7 +729,7 @@ static bool iwl_mvm_reorder(struct iwl_mvm *mvm,
|
||||
* If it is the same SN then if the subframe index is incrementing it
|
||||
* is the same AMSDU - otherwise it is a retransmission.
|
||||
*/
|
||||
tail = skb_peek_tail(&buffer->entries[index]);
|
||||
tail = skb_peek_tail(&entries[index].e.frames);
|
||||
if (tail && !amsdu)
|
||||
goto drop;
|
||||
else if (tail && (sn != buffer->last_amsdu ||
|
||||
@ -724,9 +737,9 @@ static bool iwl_mvm_reorder(struct iwl_mvm *mvm,
|
||||
goto drop;
|
||||
|
||||
/* put in reorder buffer */
|
||||
__skb_queue_tail(&buffer->entries[index], skb);
|
||||
__skb_queue_tail(&entries[index].e.frames, skb);
|
||||
buffer->num_stored++;
|
||||
buffer->reorder_time[index] = jiffies;
|
||||
entries[index].e.reorder_time = jiffies;
|
||||
|
||||
if (amsdu) {
|
||||
buffer->last_amsdu = sn;
|
||||
@ -745,7 +758,7 @@ static bool iwl_mvm_reorder(struct iwl_mvm *mvm,
|
||||
* release notification with up to date NSSN.
|
||||
*/
|
||||
if (!amsdu || last_subframe)
|
||||
iwl_mvm_release_frames(mvm, sta, napi, buffer, nssn);
|
||||
iwl_mvm_release_frames(mvm, sta, napi, baid_data, buffer, nssn);
|
||||
|
||||
spin_unlock_bh(&buffer->lock);
|
||||
return true;
|
||||
@ -1065,7 +1078,7 @@ void iwl_mvm_rx_frame_release(struct iwl_mvm *mvm, struct napi_struct *napi,
|
||||
reorder_buf = &ba_data->reorder_buf[queue];
|
||||
|
||||
spin_lock_bh(&reorder_buf->lock);
|
||||
iwl_mvm_release_frames(mvm, sta, napi, reorder_buf,
|
||||
iwl_mvm_release_frames(mvm, sta, napi, ba_data, reorder_buf,
|
||||
le16_to_cpu(release->nssn));
|
||||
spin_unlock_bh(&reorder_buf->lock);
|
||||
|
||||
|
@ -2104,6 +2104,8 @@ static void iwl_mvm_free_reorder(struct iwl_mvm *mvm,
|
||||
int j;
|
||||
struct iwl_mvm_reorder_buffer *reorder_buf =
|
||||
&data->reorder_buf[i];
|
||||
struct iwl_mvm_reorder_buf_entry *entries =
|
||||
&data->entries[i * data->entries_per_queue];
|
||||
|
||||
spin_lock_bh(&reorder_buf->lock);
|
||||
if (likely(!reorder_buf->num_stored)) {
|
||||
@ -2119,7 +2121,7 @@ static void iwl_mvm_free_reorder(struct iwl_mvm *mvm,
|
||||
WARN_ON(1);
|
||||
|
||||
for (j = 0; j < reorder_buf->buf_size; j++)
|
||||
__skb_queue_purge(&reorder_buf->entries[j]);
|
||||
__skb_queue_purge(&entries[j].e.frames);
|
||||
/*
|
||||
* Prevent timer re-arm. This prevents a very far fetched case
|
||||
* where we timed out on the notification. There may be prior
|
||||
@ -2135,7 +2137,6 @@ static void iwl_mvm_free_reorder(struct iwl_mvm *mvm,
|
||||
}
|
||||
|
||||
static void iwl_mvm_init_reorder_buffer(struct iwl_mvm *mvm,
|
||||
u32 sta_id,
|
||||
struct iwl_mvm_baid_data *data,
|
||||
u16 ssn, u8 buf_size)
|
||||
{
|
||||
@ -2144,6 +2145,8 @@ static void iwl_mvm_init_reorder_buffer(struct iwl_mvm *mvm,
|
||||
for (i = 0; i < mvm->trans->num_rx_queues; i++) {
|
||||
struct iwl_mvm_reorder_buffer *reorder_buf =
|
||||
&data->reorder_buf[i];
|
||||
struct iwl_mvm_reorder_buf_entry *entries =
|
||||
&data->entries[i * data->entries_per_queue];
|
||||
int j;
|
||||
|
||||
reorder_buf->num_stored = 0;
|
||||
@ -2157,11 +2160,9 @@ static void iwl_mvm_init_reorder_buffer(struct iwl_mvm *mvm,
|
||||
spin_lock_init(&reorder_buf->lock);
|
||||
reorder_buf->mvm = mvm;
|
||||
reorder_buf->queue = i;
|
||||
reorder_buf->sta_id = sta_id;
|
||||
reorder_buf->tid = data->tid;
|
||||
reorder_buf->valid = false;
|
||||
for (j = 0; j < reorder_buf->buf_size; j++)
|
||||
__skb_queue_head_init(&reorder_buf->entries[j]);
|
||||
__skb_queue_head_init(&entries[j].e.frames);
|
||||
}
|
||||
}
|
||||
|
||||
@ -2182,16 +2183,44 @@ int iwl_mvm_sta_rx_agg(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
|
||||
}
|
||||
|
||||
if (iwl_mvm_has_new_rx_api(mvm) && start) {
|
||||
u16 reorder_buf_size = buf_size * sizeof(baid_data->entries[0]);
|
||||
|
||||
/* sparse doesn't like the __align() so don't check */
|
||||
#ifndef __CHECKER__
|
||||
/*
|
||||
* The division below will be OK if either the cache line size
|
||||
* can be divided by the entry size (ALIGN will round up) or if
|
||||
* if the entry size can be divided by the cache line size, in
|
||||
* which case the ALIGN() will do nothing.
|
||||
*/
|
||||
BUILD_BUG_ON(SMP_CACHE_BYTES % sizeof(baid_data->entries[0]) &&
|
||||
sizeof(baid_data->entries[0]) % SMP_CACHE_BYTES);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Upward align the reorder buffer size to fill an entire cache
|
||||
* line for each queue, to avoid sharing cache lines between
|
||||
* different queues.
|
||||
*/
|
||||
reorder_buf_size = ALIGN(reorder_buf_size, SMP_CACHE_BYTES);
|
||||
|
||||
/*
|
||||
* Allocate here so if allocation fails we can bail out early
|
||||
* before starting the BA session in the firmware
|
||||
*/
|
||||
baid_data = kzalloc(sizeof(*baid_data) +
|
||||
mvm->trans->num_rx_queues *
|
||||
sizeof(baid_data->reorder_buf[0]),
|
||||
reorder_buf_size,
|
||||
GFP_KERNEL);
|
||||
if (!baid_data)
|
||||
return -ENOMEM;
|
||||
|
||||
/*
|
||||
* This division is why we need the above BUILD_BUG_ON(),
|
||||
* if that doesn't hold then this will not be right.
|
||||
*/
|
||||
baid_data->entries_per_queue =
|
||||
reorder_buf_size / sizeof(baid_data->entries[0]);
|
||||
}
|
||||
|
||||
cmd.mac_id_n_color = cpu_to_le32(mvm_sta->mac_id_n_color);
|
||||
@ -2262,8 +2291,7 @@ int iwl_mvm_sta_rx_agg(struct iwl_mvm *mvm, struct ieee80211_sta *sta,
|
||||
mod_timer(&baid_data->session_timer,
|
||||
TU_TO_EXP_TIME(timeout * 2));
|
||||
|
||||
iwl_mvm_init_reorder_buffer(mvm, mvm_sta->sta_id,
|
||||
baid_data, ssn, buf_size);
|
||||
iwl_mvm_init_reorder_buffer(mvm, baid_data, ssn, buf_size);
|
||||
/*
|
||||
* protect the BA data with RCU to cover a case where our
|
||||
* internal RX sync mechanism will timeout (not that it's
|
||||
|
@ -1746,6 +1746,7 @@ void iwl_mvm_rx_ba_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb)
|
||||
if (iwl_mvm_has_new_tx_api(mvm)) {
|
||||
struct iwl_mvm_compressed_ba_notif *ba_res =
|
||||
(void *)pkt->data;
|
||||
u8 lq_color = TX_RES_RATE_TABLE_COL_GET(ba_res->tlc_rate_info);
|
||||
int i;
|
||||
|
||||
sta_id = ba_res->sta_id;
|
||||
@ -1759,11 +1760,18 @@ void iwl_mvm_rx_ba_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb)
|
||||
if (!le16_to_cpu(ba_res->tfd_cnt))
|
||||
goto out;
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
mvmsta = iwl_mvm_sta_from_staid_rcu(mvm, sta_id);
|
||||
if (!mvmsta)
|
||||
goto out_unlock;
|
||||
|
||||
/* Free per TID */
|
||||
for (i = 0; i < le16_to_cpu(ba_res->tfd_cnt); i++) {
|
||||
struct iwl_mvm_compressed_ba_tfd *ba_tfd =
|
||||
&ba_res->tfd[i];
|
||||
|
||||
mvmsta->tid_data[i].lq_color = lq_color;
|
||||
iwl_mvm_tx_reclaim(mvm, sta_id, ba_tfd->tid,
|
||||
(int)(le16_to_cpu(ba_tfd->q_num)),
|
||||
le16_to_cpu(ba_tfd->tfd_index),
|
||||
@ -1771,6 +1779,8 @@ void iwl_mvm_rx_ba_notif(struct iwl_mvm *mvm, struct iwl_rx_cmd_buffer *rxb)
|
||||
le32_to_cpu(ba_res->tx_rate));
|
||||
}
|
||||
|
||||
out_unlock:
|
||||
rcu_read_unlock();
|
||||
out:
|
||||
IWL_DEBUG_TX_REPLY(mvm,
|
||||
"BA_NOTIFICATION Received from sta_id = %d, flags %x, sent:%d, acked:%d\n",
|
||||
|
@ -455,20 +455,12 @@ static void iwl_mvm_dump_umac_error_log(struct iwl_mvm *mvm)
|
||||
{
|
||||
struct iwl_trans *trans = mvm->trans;
|
||||
struct iwl_umac_error_event_table table;
|
||||
u32 base;
|
||||
|
||||
base = mvm->umac_error_event_table;
|
||||
|
||||
if (base < 0x800000) {
|
||||
IWL_ERR(mvm,
|
||||
"Not valid error log pointer 0x%08X for %s uCode\n",
|
||||
base,
|
||||
(mvm->fwrt.cur_fw_img == IWL_UCODE_INIT)
|
||||
? "Init" : "RT");
|
||||
if (!mvm->support_umac_log)
|
||||
return;
|
||||
}
|
||||
|
||||
iwl_trans_read_mem_bytes(trans, base, &table, sizeof(table));
|
||||
iwl_trans_read_mem_bytes(trans, mvm->umac_error_event_table, &table,
|
||||
sizeof(table));
|
||||
|
||||
if (ERROR_START_OFFSET <= table.valid * ERROR_ELEM_SIZE) {
|
||||
IWL_ERR(trans, "Start IWL Error Log Dump:\n");
|
||||
@ -608,8 +600,7 @@ void iwl_mvm_dump_nic_error_log(struct iwl_mvm *mvm)
|
||||
if (mvm->error_event_table[1])
|
||||
iwl_mvm_dump_lmac_error_log(mvm, mvm->error_event_table[1]);
|
||||
|
||||
if (mvm->support_umac_log)
|
||||
iwl_mvm_dump_umac_error_log(mvm);
|
||||
iwl_mvm_dump_umac_error_log(mvm);
|
||||
}
|
||||
|
||||
int iwl_mvm_find_free_queue(struct iwl_mvm *mvm, u8 sta_id, u8 minq, u8 maxq)
|
||||
|
@ -512,65 +512,65 @@ static const struct pci_device_id iwl_hw_card_ids[] = {
|
||||
{IWL_PCI_DEVICE(0x24FD, 0x0012, iwl8275_2ac_cfg)},
|
||||
|
||||
/* 9000 Series */
|
||||
{IWL_PCI_DEVICE(0x271B, 0x0010, iwl9160_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x271B, 0x0014, iwl9160_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x271B, 0x0210, iwl9160_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x0000, iwl9260_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x0010, iwl9260_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x0014, iwl9260_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0xA014, iwl9260_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x4010, iwl9260_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x0030, iwl9560_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x0034, iwl9560_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x0038, iwl9560_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x003C, iwl9560_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x0060, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x0064, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x00A0, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x00A4, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x0210, iwl9260_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x0214, iwl9260_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x1410, iwl9270_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x1610, iwl9270_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x0A10, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x0010, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x0210, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x0410, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x0610, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x0310, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x0000, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x0510, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x2010, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x1420, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x0710, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x2A10, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x30DC, 0x0060, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x0060, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x0260, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x0064, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x00A4, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x40A4, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x02A4, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x00A0, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x02A0, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x0060, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0xA370, 0x0060, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x31DC, 0x0060, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x0030, iwl9560_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x4030, iwl9560_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x0230, iwl9560_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x0234, iwl9560_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x0238, iwl9560_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x023C, iwl9560_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x0030, iwl9560_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0xA370, 0x0030, iwl9560_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x31DC, 0x0030, iwl9560_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x0260, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x02A0, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x02A4, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x1030, iwl9560_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0xA370, 0x1030, iwl9560_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x0034, iwl9560_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0xA370, 0x0034, iwl9560_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x1410, iwl9270_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x1420, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x1610, iwl9270_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x4010, iwl9260_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x4030, iwl9560_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x40A4, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0xA014, iwl9260_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x271B, 0x0010, iwl9160_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x271B, 0x0014, iwl9160_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x271B, 0x0210, iwl9160_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x30DC, 0x0060, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x31DC, 0x0030, iwl9560_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x31DC, 0x0034, iwl9560_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x0038, iwl9560_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x003C, iwl9560_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x0038, iwl9560_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0xA370, 0x0038, iwl9560_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x31DC, 0x0038, iwl9560_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x003C, iwl9560_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0xA370, 0x003C, iwl9560_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x31DC, 0x003C, iwl9560_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x2526, 0x0034, iwl9560_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x31DC, 0x0060, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x0000, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x0010, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x0030, iwl9560_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x0034, iwl9560_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x0038, iwl9560_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x003C, iwl9560_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x0060, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x0210, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x0310, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x0410, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x0510, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x0610, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x0710, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x0A10, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x2010, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0x9DF0, 0x2A10, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0xA370, 0x0030, iwl9560_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0xA370, 0x0034, iwl9560_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0xA370, 0x0038, iwl9560_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0xA370, 0x003C, iwl9560_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0xA370, 0x0060, iwl9460_2ac_cfg)},
|
||||
{IWL_PCI_DEVICE(0xA370, 0x1030, iwl9560_2ac_cfg)},
|
||||
|
||||
/* a000 Series */
|
||||
{IWL_PCI_DEVICE(0x2720, 0x0A10, iwla000_2ac_cfg_hr_cdb)},
|
||||
|
@ -289,8 +289,7 @@ static int iwl_pcie_gen2_build_amsdu(struct iwl_trans *trans,
|
||||
struct sk_buff *csum_skb = NULL;
|
||||
unsigned int tb_len;
|
||||
dma_addr_t tb_phys;
|
||||
struct tcphdr *tcph;
|
||||
u8 *iph, *subf_hdrs_start = hdr_page->pos;
|
||||
u8 *subf_hdrs_start = hdr_page->pos;
|
||||
|
||||
total_len -= data_left;
|
||||
|
||||
@ -312,8 +311,6 @@ static int iwl_pcie_gen2_build_amsdu(struct iwl_trans *trans,
|
||||
* as MAC header.
|
||||
*/
|
||||
tso_build_hdr(skb, hdr_page->pos, &tso, data_left, !total_len);
|
||||
iph = hdr_page->pos + 8;
|
||||
tcph = (void *)(iph + ip_hdrlen);
|
||||
|
||||
hdr_page->pos += snap_ip_tcp_hdrlen;
|
||||
|
||||
|
@ -1699,9 +1699,6 @@ static void lbs_join_post(struct lbs_private *priv,
|
||||
0, GFP_KERNEL);
|
||||
cfg80211_put_bss(priv->wdev->wiphy, bss);
|
||||
|
||||
memcpy(priv->wdev->ssid, params->ssid, params->ssid_len);
|
||||
priv->wdev->ssid_len = params->ssid_len;
|
||||
|
||||
cfg80211_ibss_joined(priv->dev, bssid, params->chandef.chan,
|
||||
GFP_KERNEL);
|
||||
|
||||
|
@ -161,9 +161,9 @@ static void if_usb_setup_firmware(struct lbs_private *priv)
|
||||
}
|
||||
}
|
||||
|
||||
static void if_usb_fw_timeo(unsigned long priv)
|
||||
static void if_usb_fw_timeo(struct timer_list *t)
|
||||
{
|
||||
struct if_usb_card *cardp = (void *)priv;
|
||||
struct if_usb_card *cardp = from_timer(cardp, t, fw_timeout);
|
||||
|
||||
if (cardp->fwdnldover) {
|
||||
lbs_deb_usb("Download complete, no event. Assuming success\n");
|
||||
@ -205,7 +205,7 @@ static int if_usb_probe(struct usb_interface *intf,
|
||||
if (!cardp)
|
||||
goto error;
|
||||
|
||||
setup_timer(&cardp->fw_timeout, if_usb_fw_timeo, (unsigned long)cardp);
|
||||
timer_setup(&cardp->fw_timeout, if_usb_fw_timeo, 0);
|
||||
init_waitqueue_head(&cardp->fw_wq);
|
||||
|
||||
cardp->udev = udev;
|
||||
|
@ -722,9 +722,9 @@ EXPORT_SYMBOL_GPL(lbs_resume);
|
||||
*
|
||||
* @data: &struct lbs_private pointer
|
||||
*/
|
||||
static void lbs_cmd_timeout_handler(unsigned long data)
|
||||
static void lbs_cmd_timeout_handler(struct timer_list *t)
|
||||
{
|
||||
struct lbs_private *priv = (struct lbs_private *)data;
|
||||
struct lbs_private *priv = from_timer(priv, t, command_timer);
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&priv->driver_lock, flags);
|
||||
@ -756,9 +756,9 @@ out:
|
||||
*
|
||||
* @data: &struct lbs_private pointer
|
||||
*/
|
||||
static void lbs_tx_lockup_handler(unsigned long data)
|
||||
static void lbs_tx_lockup_handler(struct timer_list *t)
|
||||
{
|
||||
struct lbs_private *priv = (struct lbs_private *)data;
|
||||
struct lbs_private *priv = from_timer(priv, t, tx_lockup_timer);
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&priv->driver_lock, flags);
|
||||
@ -779,9 +779,9 @@ static void lbs_tx_lockup_handler(unsigned long data)
|
||||
* @data: &struct lbs_private pointer
|
||||
* returns: N/A
|
||||
*/
|
||||
static void auto_deepsleep_timer_fn(unsigned long data)
|
||||
static void auto_deepsleep_timer_fn(struct timer_list *t)
|
||||
{
|
||||
struct lbs_private *priv = (struct lbs_private *)data;
|
||||
struct lbs_private *priv = from_timer(priv, t, auto_deepsleep_timer);
|
||||
|
||||
if (priv->is_activity_detected) {
|
||||
priv->is_activity_detected = 0;
|
||||
@ -847,12 +847,9 @@ static int lbs_init_adapter(struct lbs_private *priv)
|
||||
init_waitqueue_head(&priv->fw_waitq);
|
||||
mutex_init(&priv->lock);
|
||||
|
||||
setup_timer(&priv->command_timer, lbs_cmd_timeout_handler,
|
||||
(unsigned long)priv);
|
||||
setup_timer(&priv->tx_lockup_timer, lbs_tx_lockup_handler,
|
||||
(unsigned long)priv);
|
||||
setup_timer(&priv->auto_deepsleep_timer, auto_deepsleep_timer_fn,
|
||||
(unsigned long)priv);
|
||||
timer_setup(&priv->command_timer, lbs_cmd_timeout_handler, 0);
|
||||
timer_setup(&priv->tx_lockup_timer, lbs_tx_lockup_handler, 0);
|
||||
timer_setup(&priv->auto_deepsleep_timer, auto_deepsleep_timer_fn, 0);
|
||||
|
||||
INIT_LIST_HEAD(&priv->cmdfreeq);
|
||||
INIT_LIST_HEAD(&priv->cmdpendingq);
|
||||
|
@ -115,9 +115,9 @@ static void if_usb_setup_firmware(struct lbtf_private *priv)
|
||||
lbtf_deb_leave(LBTF_DEB_USB);
|
||||
}
|
||||
|
||||
static void if_usb_fw_timeo(unsigned long priv)
|
||||
static void if_usb_fw_timeo(struct timer_list *t)
|
||||
{
|
||||
struct if_usb_card *cardp = (void *)priv;
|
||||
struct if_usb_card *cardp = from_timer(cardp, t, fw_timeout);
|
||||
|
||||
lbtf_deb_enter(LBTF_DEB_USB);
|
||||
if (!cardp->fwdnldover) {
|
||||
@ -156,7 +156,7 @@ static int if_usb_probe(struct usb_interface *intf,
|
||||
if (!cardp)
|
||||
goto error;
|
||||
|
||||
setup_timer(&cardp->fw_timeout, if_usb_fw_timeo, (unsigned long)cardp);
|
||||
timer_setup(&cardp->fw_timeout, if_usb_fw_timeo, 0);
|
||||
init_waitqueue_head(&cardp->fw_wq);
|
||||
|
||||
cardp->udev = udev;
|
||||
|
@ -165,9 +165,9 @@ done:
|
||||
* This function handles the timeout of command sending.
|
||||
* It will re-send the same command again.
|
||||
*/
|
||||
static void command_timer_fn(unsigned long data)
|
||||
static void command_timer_fn(struct timer_list *t)
|
||||
{
|
||||
struct lbtf_private *priv = (struct lbtf_private *)data;
|
||||
struct lbtf_private *priv = from_timer(priv, t, command_timer);
|
||||
unsigned long flags;
|
||||
lbtf_deb_enter(LBTF_DEB_CMD);
|
||||
|
||||
@ -196,8 +196,7 @@ static int lbtf_init_adapter(struct lbtf_private *priv)
|
||||
mutex_init(&priv->lock);
|
||||
|
||||
priv->vif = NULL;
|
||||
setup_timer(&priv->command_timer, command_timer_fn,
|
||||
(unsigned long)priv);
|
||||
timer_setup(&priv->command_timer, command_timer_fn, 0);
|
||||
|
||||
INIT_LIST_HEAD(&priv->cmdfreeq);
|
||||
INIT_LIST_HEAD(&priv->cmdpendingq);
|
||||
|
@ -312,10 +312,10 @@ mwifiex_11n_find_last_seq_num(struct reorder_tmr_cnxt *ctx)
|
||||
* them and then dumps the Rx reordering table.
|
||||
*/
|
||||
static void
|
||||
mwifiex_flush_data(unsigned long context)
|
||||
mwifiex_flush_data(struct timer_list *t)
|
||||
{
|
||||
struct reorder_tmr_cnxt *ctx =
|
||||
(struct reorder_tmr_cnxt *) context;
|
||||
from_timer(ctx, t, timer);
|
||||
int start_win, seq_num;
|
||||
|
||||
ctx->timer_is_set = false;
|
||||
@ -412,8 +412,7 @@ mwifiex_11n_create_rx_reorder_tbl(struct mwifiex_private *priv, u8 *ta,
|
||||
new_node->timer_context.priv = priv;
|
||||
new_node->timer_context.timer_is_set = false;
|
||||
|
||||
setup_timer(&new_node->timer_context.timer, mwifiex_flush_data,
|
||||
(unsigned long)&new_node->timer_context);
|
||||
timer_setup(&new_node->timer_context.timer, mwifiex_flush_data, 0);
|
||||
|
||||
for (i = 0; i < win_size; ++i)
|
||||
new_node->rx_reorder_ptr[i] = NULL;
|
||||
|
@ -920,10 +920,9 @@ int mwifiex_process_cmdresp(struct mwifiex_adapter *adapter)
|
||||
* It will re-send the same command again.
|
||||
*/
|
||||
void
|
||||
mwifiex_cmd_timeout_func(unsigned long function_context)
|
||||
mwifiex_cmd_timeout_func(struct timer_list *t)
|
||||
{
|
||||
struct mwifiex_adapter *adapter =
|
||||
(struct mwifiex_adapter *) function_context;
|
||||
struct mwifiex_adapter *adapter = from_timer(adapter, t, cmd_timer);
|
||||
struct cmd_ctrl_node *cmd_node;
|
||||
|
||||
adapter->is_cmd_timedout = 1;
|
||||
|
@ -225,7 +225,8 @@ enum MWIFIEX_802_11_PRIVACY_FILTER {
|
||||
|
||||
#define IS_11N_ENABLED(priv) ((priv->adapter->config_bands & BAND_GN || \
|
||||
priv->adapter->config_bands & BAND_AN) && \
|
||||
priv->curr_bss_params.bss_descriptor.bcn_ht_cap)
|
||||
priv->curr_bss_params.bss_descriptor.bcn_ht_cap && \
|
||||
!priv->curr_bss_params.bss_descriptor.disable_11n)
|
||||
#define INITIATOR_BIT(DelBAParamSet) (((DelBAParamSet) &\
|
||||
BIT(DELBA_INITIATOR_POS)) >> DELBA_INITIATOR_POS)
|
||||
|
||||
|
@ -52,9 +52,9 @@ static int mwifiex_add_bss_prio_tbl(struct mwifiex_private *priv)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void wakeup_timer_fn(unsigned long data)
|
||||
static void wakeup_timer_fn(struct timer_list *t)
|
||||
{
|
||||
struct mwifiex_adapter *adapter = (struct mwifiex_adapter *)data;
|
||||
struct mwifiex_adapter *adapter = from_timer(adapter, t, wakeup_timer);
|
||||
|
||||
mwifiex_dbg(adapter, ERROR, "Firmware wakeup failed\n");
|
||||
adapter->hw_status = MWIFIEX_HW_STATUS_RESET;
|
||||
@ -313,8 +313,7 @@ static void mwifiex_init_adapter(struct mwifiex_adapter *adapter)
|
||||
adapter->iface_limit.uap_intf = MWIFIEX_MAX_UAP_NUM;
|
||||
adapter->iface_limit.p2p_intf = MWIFIEX_MAX_P2P_NUM;
|
||||
adapter->active_scan_triggered = false;
|
||||
setup_timer(&adapter->wakeup_timer, wakeup_timer_fn,
|
||||
(unsigned long)adapter);
|
||||
timer_setup(&adapter->wakeup_timer, wakeup_timer_fn, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -100,8 +100,7 @@ static int mwifiex_register(void *card, struct device *dev,
|
||||
}
|
||||
mwifiex_init_lock_list(adapter);
|
||||
|
||||
setup_timer(&adapter->cmd_timer, mwifiex_cmd_timeout_func,
|
||||
(unsigned long)adapter);
|
||||
timer_setup(&adapter->cmd_timer, mwifiex_cmd_timeout_func, 0);
|
||||
|
||||
return 0;
|
||||
|
||||
|
@ -1072,7 +1072,7 @@ int mwifiex_complete_cmd(struct mwifiex_adapter *adapter,
|
||||
int mwifiex_send_cmd(struct mwifiex_private *priv, u16 cmd_no,
|
||||
u16 cmd_action, u32 cmd_oid, void *data_buf, bool sync);
|
||||
|
||||
void mwifiex_cmd_timeout_func(unsigned long function_context);
|
||||
void mwifiex_cmd_timeout_func(struct timer_list *t);
|
||||
|
||||
int mwifiex_get_debug_info(struct mwifiex_private *,
|
||||
struct mwifiex_debug_info *);
|
||||
@ -1617,7 +1617,7 @@ void mwifiex_auto_tdls_update_peer_status(struct mwifiex_private *priv,
|
||||
const u8 *mac, u8 link_status);
|
||||
void mwifiex_auto_tdls_update_peer_signal(struct mwifiex_private *priv,
|
||||
u8 *mac, s8 snr, s8 nflr);
|
||||
void mwifiex_check_auto_tdls(unsigned long context);
|
||||
void mwifiex_check_auto_tdls(struct timer_list *t);
|
||||
void mwifiex_add_auto_tdls_peer(struct mwifiex_private *priv, const u8 *mac);
|
||||
void mwifiex_setup_auto_tdls_timer(struct mwifiex_private *priv);
|
||||
void mwifiex_clean_auto_tdls(struct mwifiex_private *priv);
|
||||
|
@ -1389,9 +1389,9 @@ void mwifiex_auto_tdls_update_peer_signal(struct mwifiex_private *priv,
|
||||
spin_unlock_irqrestore(&priv->auto_tdls_lock, flags);
|
||||
}
|
||||
|
||||
void mwifiex_check_auto_tdls(unsigned long context)
|
||||
void mwifiex_check_auto_tdls(struct timer_list *t)
|
||||
{
|
||||
struct mwifiex_private *priv = (struct mwifiex_private *)context;
|
||||
struct mwifiex_private *priv = from_timer(priv, t, auto_tdls_timer);
|
||||
struct mwifiex_auto_tdls_peer *tdls_peer;
|
||||
unsigned long flags;
|
||||
u16 reason = WLAN_REASON_TDLS_TEARDOWN_UNSPECIFIED;
|
||||
@ -1456,8 +1456,7 @@ void mwifiex_check_auto_tdls(unsigned long context)
|
||||
|
||||
void mwifiex_setup_auto_tdls_timer(struct mwifiex_private *priv)
|
||||
{
|
||||
setup_timer(&priv->auto_tdls_timer, mwifiex_check_auto_tdls,
|
||||
(unsigned long)priv);
|
||||
timer_setup(&priv->auto_tdls_timer, mwifiex_check_auto_tdls, 0);
|
||||
priv->auto_tdls_timer_active = true;
|
||||
mod_timer(&priv->auto_tdls_timer,
|
||||
jiffies + msecs_to_jiffies(MWIFIEX_TIMER_10S));
|
||||
|
@ -1096,12 +1096,12 @@ postcopy_cur_buf:
|
||||
return -EINPROGRESS;
|
||||
}
|
||||
|
||||
static void mwifiex_usb_tx_aggr_tmo(unsigned long context)
|
||||
static void mwifiex_usb_tx_aggr_tmo(struct timer_list *t)
|
||||
{
|
||||
struct urb_context *urb_cnxt = NULL;
|
||||
struct sk_buff *skb_send = NULL;
|
||||
struct tx_aggr_tmr_cnxt *timer_context =
|
||||
(struct tx_aggr_tmr_cnxt *)context;
|
||||
from_timer(timer_context, t, hold_timer);
|
||||
struct mwifiex_adapter *adapter = timer_context->adapter;
|
||||
struct usb_tx_data_port *port = timer_context->port;
|
||||
unsigned long flags;
|
||||
@ -1236,9 +1236,8 @@ static int mwifiex_usb_tx_init(struct mwifiex_adapter *adapter)
|
||||
port->tx_aggr.timer_cnxt.port = port;
|
||||
port->tx_aggr.timer_cnxt.is_hold_timer_set = false;
|
||||
port->tx_aggr.timer_cnxt.hold_tmo_msecs = 0;
|
||||
setup_timer(&port->tx_aggr.timer_cnxt.hold_timer,
|
||||
mwifiex_usb_tx_aggr_tmo,
|
||||
(unsigned long)&port->tx_aggr.timer_cnxt);
|
||||
timer_setup(&port->tx_aggr.timer_cnxt.hold_timer,
|
||||
mwifiex_usb_tx_aggr_tmo, 0);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -73,7 +73,10 @@ qtnf_mgmt_stypes[NUM_NL80211_IFTYPES] = {
|
||||
[NL80211_IFTYPE_AP] = {
|
||||
.tx = BIT(IEEE80211_STYPE_ACTION >> 4),
|
||||
.rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
|
||||
BIT(IEEE80211_STYPE_PROBE_REQ >> 4),
|
||||
BIT(IEEE80211_STYPE_PROBE_REQ >> 4) |
|
||||
BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) |
|
||||
BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) |
|
||||
BIT(IEEE80211_STYPE_AUTH >> 4),
|
||||
},
|
||||
};
|
||||
|
||||
@ -353,6 +356,13 @@ qtnf_mgmt_frame_register(struct wiphy *wiphy, struct wireless_dev *wdev,
|
||||
return;
|
||||
|
||||
switch (frame_type & IEEE80211_FCTL_STYPE) {
|
||||
case IEEE80211_STYPE_REASSOC_REQ:
|
||||
case IEEE80211_STYPE_ASSOC_REQ:
|
||||
qlink_frame_type = QLINK_MGMT_FRAME_ASSOC_REQ;
|
||||
break;
|
||||
case IEEE80211_STYPE_AUTH:
|
||||
qlink_frame_type = QLINK_MGMT_FRAME_AUTH;
|
||||
break;
|
||||
case IEEE80211_STYPE_PROBE_REQ:
|
||||
qlink_frame_type = QLINK_MGMT_FRAME_PROBE_REQ;
|
||||
break;
|
||||
@ -538,9 +548,9 @@ qtnf_del_station(struct wiphy *wiphy, struct net_device *dev,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void qtnf_scan_timeout(unsigned long data)
|
||||
static void qtnf_scan_timeout(struct timer_list *t)
|
||||
{
|
||||
struct qtnf_wmac *mac = (struct qtnf_wmac *)data;
|
||||
struct qtnf_wmac *mac = from_timer(mac, t, scan_timeout);
|
||||
|
||||
pr_warn("mac%d scan timed out\n", mac->macid);
|
||||
qtnf_scan_done(mac, true);
|
||||
@ -559,8 +569,7 @@ qtnf_scan(struct wiphy *wiphy, struct cfg80211_scan_request *request)
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
mac->scan_timeout.data = (unsigned long)mac;
|
||||
mac->scan_timeout.function = qtnf_scan_timeout;
|
||||
mac->scan_timeout.function = (TIMER_FUNC_TYPE)qtnf_scan_timeout;
|
||||
mod_timer(&mac->scan_timeout,
|
||||
jiffies + QTNF_SCAN_TIMEOUT_SEC * HZ);
|
||||
|
||||
@ -947,7 +956,10 @@ int qtnf_wiphy_register(struct qtnf_hw_info *hw_info, struct qtnf_wmac *mac)
|
||||
|
||||
ether_addr_copy(wiphy->perm_addr, mac->macaddr);
|
||||
|
||||
if (hw_info->hw_capab & QLINK_HW_SUPPORTS_REG_UPDATE) {
|
||||
if (hw_info->hw_capab & QLINK_HW_CAPAB_STA_INACT_TIMEOUT)
|
||||
wiphy->features |= NL80211_FEATURE_INACTIVITY_TIMER;
|
||||
|
||||
if (hw_info->hw_capab & QLINK_HW_CAPAB_REG_UPDATE) {
|
||||
wiphy->regulatory_flags |= REGULATORY_STRICT_REG |
|
||||
REGULATORY_CUSTOM_REG;
|
||||
wiphy->reg_notifier = qtnf_cfg80211_reg_notifier;
|
||||
|
@ -975,10 +975,11 @@ qtnf_cmd_resp_proc_hw_info(struct qtnf_bus *bus,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
pr_info("fw_version=%d, MACs map %#x, alpha2=\"%c%c\", chains Tx=%u Rx=%u\n",
|
||||
pr_info("fw_version=%d, MACs map %#x, alpha2=\"%c%c\", chains Tx=%u Rx=%u, capab=0x%x\n",
|
||||
hwinfo->fw_ver, hwinfo->mac_bitmap,
|
||||
hwinfo->rd->alpha2[0], hwinfo->rd->alpha2[1],
|
||||
hwinfo->total_tx_chain, hwinfo->total_rx_chain);
|
||||
hwinfo->total_tx_chain, hwinfo->total_rx_chain,
|
||||
hwinfo->hw_capab);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -289,7 +289,7 @@ static struct qtnf_wmac *qtnf_core_mac_alloc(struct qtnf_bus *bus,
|
||||
mac->iflist[i].vifid = i;
|
||||
qtnf_sta_list_init(&mac->iflist[i].sta_list);
|
||||
mutex_init(&mac->mac_lock);
|
||||
init_timer(&mac->scan_timeout);
|
||||
setup_timer(&mac->scan_timeout, NULL, 0);
|
||||
}
|
||||
|
||||
qtnf_mac_init_primary_intf(mac);
|
||||
@ -618,6 +618,33 @@ out:
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(qtnf_classify_skb);
|
||||
|
||||
void qtnf_wake_all_queues(struct net_device *ndev)
|
||||
{
|
||||
struct qtnf_vif *vif = qtnf_netdev_get_priv(ndev);
|
||||
struct qtnf_wmac *mac;
|
||||
struct qtnf_bus *bus;
|
||||
int macid;
|
||||
int i;
|
||||
|
||||
if (unlikely(!vif || !vif->mac || !vif->mac->bus))
|
||||
return;
|
||||
|
||||
bus = vif->mac->bus;
|
||||
|
||||
for (macid = 0; macid < QTNF_MAX_MAC; macid++) {
|
||||
if (!(bus->hw_info.mac_bitmap & BIT(macid)))
|
||||
continue;
|
||||
|
||||
mac = bus->mac[macid];
|
||||
for (i = 0; i < QTNF_MAX_INTF; i++) {
|
||||
vif = &mac->iflist[i];
|
||||
if (vif->netdev && netif_queue_stopped(vif->netdev))
|
||||
netif_tx_wake_all_queues(vif->netdev);
|
||||
}
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(qtnf_wake_all_queues);
|
||||
|
||||
MODULE_AUTHOR("Quantenna Communications");
|
||||
MODULE_DESCRIPTION("Quantenna 802.11 wireless LAN FullMAC driver.");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -153,9 +153,7 @@ int qtnf_cmd_send_get_phy_params(struct qtnf_wmac *mac);
|
||||
|
||||
struct qtnf_wmac *qtnf_core_get_mac(const struct qtnf_bus *bus, u8 macid);
|
||||
struct net_device *qtnf_classify_skb(struct qtnf_bus *bus, struct sk_buff *skb);
|
||||
struct net_device *qtnf_classify_skb_no_mbss(struct qtnf_bus *bus,
|
||||
struct sk_buff *skb);
|
||||
|
||||
void qtnf_wake_all_queues(struct net_device *ndev);
|
||||
void qtnf_virtual_intf_cleanup(struct net_device *ndev);
|
||||
|
||||
void qtnf_netdev_updown(struct net_device *ndev, bool up);
|
||||
|
@ -617,9 +617,10 @@ static void qtnf_pcie_data_tx_reclaim(struct qtnf_pcie_bus_priv *priv)
|
||||
if (skb->dev) {
|
||||
skb->dev->stats.tx_packets++;
|
||||
skb->dev->stats.tx_bytes += skb->len;
|
||||
|
||||
if (netif_queue_stopped(skb->dev))
|
||||
netif_wake_queue(skb->dev);
|
||||
if (unlikely(priv->tx_stopped)) {
|
||||
qtnf_wake_all_queues(skb->dev);
|
||||
priv->tx_stopped = 0;
|
||||
}
|
||||
}
|
||||
|
||||
dev_kfree_skb_any(skb);
|
||||
@ -643,11 +644,11 @@ static int qtnf_tx_queue_ready(struct qtnf_pcie_bus_priv *priv)
|
||||
{
|
||||
if (!CIRC_SPACE(priv->tx_bd_w_index, priv->tx_bd_r_index,
|
||||
priv->tx_bd_num)) {
|
||||
pr_err_ratelimited("reclaim full Tx queue\n");
|
||||
qtnf_pcie_data_tx_reclaim(priv);
|
||||
|
||||
if (!CIRC_SPACE(priv->tx_bd_w_index, priv->tx_bd_r_index,
|
||||
priv->tx_bd_num)) {
|
||||
pr_warn_ratelimited("reclaim full Tx queue\n");
|
||||
priv->tx_full_count++;
|
||||
return 0;
|
||||
}
|
||||
@ -669,8 +670,10 @@ static int qtnf_pcie_data_tx(struct qtnf_bus *bus, struct sk_buff *skb)
|
||||
spin_lock_irqsave(&priv->tx0_lock, flags);
|
||||
|
||||
if (!qtnf_tx_queue_ready(priv)) {
|
||||
if (skb->dev)
|
||||
netif_stop_queue(skb->dev);
|
||||
if (skb->dev) {
|
||||
netif_tx_stop_all_queues(skb->dev);
|
||||
priv->tx_stopped = 1;
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&priv->tx0_lock, flags);
|
||||
return NETDEV_TX_BUSY;
|
||||
|
@ -37,6 +37,7 @@ struct qtnf_pcie_bus_priv {
|
||||
/* lock for tx0 operations */
|
||||
spinlock_t tx0_lock;
|
||||
u8 msi_enabled;
|
||||
u8 tx_stopped;
|
||||
int mps;
|
||||
|
||||
struct workqueue_struct *workqueue;
|
||||
|
@ -61,8 +61,17 @@ struct qlink_msg_header {
|
||||
/* Generic definitions of data and information carried in QLINK messages
|
||||
*/
|
||||
|
||||
/**
|
||||
* enum qlink_hw_capab - device capabilities.
|
||||
*
|
||||
* @QLINK_HW_CAPAB_REG_UPDATE: device can update it's regulatory region.
|
||||
* @QLINK_HW_CAPAB_STA_INACT_TIMEOUT: device implements a logic to kick-out
|
||||
* associated STAs due to inactivity. Inactivity timeout period is taken
|
||||
* from QLINK_CMD_START_AP parameters.
|
||||
*/
|
||||
enum qlink_hw_capab {
|
||||
QLINK_HW_SUPPORTS_REG_UPDATE = BIT(0),
|
||||
QLINK_HW_CAPAB_REG_UPDATE = BIT(0),
|
||||
QLINK_HW_CAPAB_STA_INACT_TIMEOUT = BIT(1),
|
||||
};
|
||||
|
||||
enum qlink_phy_mode {
|
||||
|
@ -457,10 +457,10 @@ static void _rtl_init_deferred_work(struct ieee80211_hw *hw)
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
|
||||
/* <1> timer */
|
||||
setup_timer(&rtlpriv->works.watchdog_timer,
|
||||
rtl_watch_dog_timer_callback, (unsigned long)hw);
|
||||
setup_timer(&rtlpriv->works.dualmac_easyconcurrent_retrytimer,
|
||||
rtl_easy_concurrent_retrytimer_callback, (unsigned long)hw);
|
||||
timer_setup(&rtlpriv->works.watchdog_timer,
|
||||
rtl_watch_dog_timer_callback, 0);
|
||||
timer_setup(&rtlpriv->works.dualmac_easyconcurrent_retrytimer,
|
||||
rtl_easy_concurrent_retrytimer_callback, 0);
|
||||
/* <2> work queue */
|
||||
rtlpriv->works.hw = hw;
|
||||
rtlpriv->works.rtl_wq = alloc_workqueue("%s", 0, 0, rtlpriv->cfg->name);
|
||||
@ -1618,9 +1618,8 @@ int rtl_tx_agg_start(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
|
||||
RT_TRACE(rtlpriv, COMP_SEND, DBG_DMESG,
|
||||
"on ra = %pM tid = %d seq:%d\n", sta->addr, tid,
|
||||
tid_data->seq_number);
|
||||
*ssn);
|
||||
|
||||
*ssn = tid_data->seq_number;
|
||||
tid_data->agg.agg_state = RTL_AGG_START;
|
||||
|
||||
ieee80211_start_tx_ba_cb_irqsafe(vif, sta->addr, tid);
|
||||
@ -1679,8 +1678,7 @@ int rtl_rx_agg_start(struct ieee80211_hw *hw,
|
||||
tid_data = &sta_entry->tids[tid];
|
||||
|
||||
RT_TRACE(rtlpriv, COMP_RECV, DBG_DMESG,
|
||||
"on ra = %pM tid = %d seq:%d\n", sta->addr, tid,
|
||||
tid_data->seq_number);
|
||||
"on ra = %pM tid = %d\n", sta->addr, tid);
|
||||
|
||||
tid_data->agg.rx_agg_state = RTL_RX_AGG_START;
|
||||
return 0;
|
||||
@ -2057,10 +2055,9 @@ label_lps_done:
|
||||
rtl_scan_list_expire(hw);
|
||||
}
|
||||
|
||||
void rtl_watch_dog_timer_callback(unsigned long data)
|
||||
void rtl_watch_dog_timer_callback(struct timer_list *t)
|
||||
{
|
||||
struct ieee80211_hw *hw = (struct ieee80211_hw *)data;
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
struct rtl_priv *rtlpriv = from_timer(rtlpriv, t, works.watchdog_timer);
|
||||
|
||||
queue_delayed_work(rtlpriv->works.rtl_wq,
|
||||
&rtlpriv->works.watchdog_wq, 0);
|
||||
@ -2166,10 +2163,11 @@ void rtl_c2hcmd_wq_callback(void *data)
|
||||
rtl_c2hcmd_launcher(hw, 1);
|
||||
}
|
||||
|
||||
void rtl_easy_concurrent_retrytimer_callback(unsigned long data)
|
||||
void rtl_easy_concurrent_retrytimer_callback(struct timer_list *t)
|
||||
{
|
||||
struct ieee80211_hw *hw = (struct ieee80211_hw *)data;
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
struct rtl_priv *rtlpriv =
|
||||
from_timer(rtlpriv, t, works.dualmac_easyconcurrent_retrytimer);
|
||||
struct ieee80211_hw *hw = rtlpriv->hw;
|
||||
struct rtl_priv *buddy_priv = rtlpriv->buddy_priv;
|
||||
|
||||
if (buddy_priv == NULL)
|
||||
|
@ -120,7 +120,7 @@ void rtl_init_rx_config(struct ieee80211_hw *hw);
|
||||
void rtl_init_rfkill(struct ieee80211_hw *hw);
|
||||
void rtl_deinit_rfkill(struct ieee80211_hw *hw);
|
||||
|
||||
void rtl_watch_dog_timer_callback(unsigned long data);
|
||||
void rtl_watch_dog_timer_callback(struct timer_list *t);
|
||||
void rtl_deinit_deferred_work(struct ieee80211_hw *hw);
|
||||
|
||||
bool rtl_action_proc(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx);
|
||||
@ -173,7 +173,7 @@ int rtl_send_smps_action(struct ieee80211_hw *hw,
|
||||
u8 *rtl_find_ie(u8 *data, unsigned int len, u8 ie);
|
||||
void rtl_recognize_peer(struct ieee80211_hw *hw, u8 *data, unsigned int len);
|
||||
u8 rtl_tid_to_ac(u8 tid);
|
||||
void rtl_easy_concurrent_retrytimer_callback(unsigned long data);
|
||||
void rtl_easy_concurrent_retrytimer_callback(struct timer_list *t);
|
||||
extern struct rtl_global_var rtl_global_var;
|
||||
void rtl_phy_scan_operation_backup(struct ieee80211_hw *hw, u8 operation);
|
||||
|
||||
|
@ -160,7 +160,7 @@ static int rtl_op_start(struct ieee80211_hw *hw)
|
||||
mutex_lock(&rtlpriv->locks.conf_mutex);
|
||||
err = rtlpriv->intf_ops->adapter_start(hw);
|
||||
if (!err)
|
||||
rtl_watch_dog_timer_callback((unsigned long)hw);
|
||||
rtl_watch_dog_timer_callback(&rtlpriv->works.watchdog_timer);
|
||||
mutex_unlock(&rtlpriv->locks.conf_mutex);
|
||||
return err;
|
||||
}
|
||||
|
@ -1623,7 +1623,6 @@ static int rtl_pci_tx(struct ieee80211_hw *hw,
|
||||
struct rtl_tcb_desc *ptcb_desc)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
struct rtl_sta_info *sta_entry = NULL;
|
||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
||||
struct rtl8192_tx_ring *ring;
|
||||
struct rtl_tx_desc *pdesc;
|
||||
@ -1635,9 +1634,6 @@ static int rtl_pci_tx(struct ieee80211_hw *hw,
|
||||
__le16 fc = rtl_get_fc(skb);
|
||||
u8 *pda_addr = hdr->addr1;
|
||||
struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw));
|
||||
/*ssn */
|
||||
u8 tid = 0;
|
||||
u16 seq_number = 0;
|
||||
u8 own;
|
||||
u8 temp_one = 1;
|
||||
|
||||
@ -1699,19 +1695,6 @@ static int rtl_pci_tx(struct ieee80211_hw *hw,
|
||||
return skb->len;
|
||||
}
|
||||
|
||||
if (ieee80211_is_data_qos(fc)) {
|
||||
tid = rtl_get_tid(skb);
|
||||
if (sta) {
|
||||
sta_entry = (struct rtl_sta_info *)sta->drv_priv;
|
||||
seq_number = (le16_to_cpu(hdr->seq_ctrl) &
|
||||
IEEE80211_SCTL_SEQ) >> 4;
|
||||
seq_number += 1;
|
||||
|
||||
if (!ieee80211_has_morefrags(hdr->frame_control))
|
||||
sta_entry->tids[tid].seq_number = seq_number;
|
||||
}
|
||||
}
|
||||
|
||||
if (ieee80211_is_data(fc))
|
||||
rtlpriv->cfg->ops->led_control(hw, LED_CTL_TX);
|
||||
|
||||
|
@ -55,7 +55,7 @@ bool rtl_ps_enable_nic(struct ieee80211_hw *hw)
|
||||
rtlpriv->cfg->ops->enable_interrupt(hw);
|
||||
|
||||
/*<enable timer> */
|
||||
rtl_watch_dog_timer_callback((unsigned long)hw);
|
||||
rtl_watch_dog_timer_callback(&rtlpriv->works.watchdog_timer);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
@ -1708,9 +1708,11 @@ static void rtl88e_dm_fast_ant_training(struct ieee80211_hw *hw)
|
||||
}
|
||||
}
|
||||
|
||||
void rtl88e_dm_fast_antenna_training_callback(unsigned long data)
|
||||
void rtl88e_dm_fast_antenna_training_callback(struct timer_list *t)
|
||||
{
|
||||
struct ieee80211_hw *hw = (struct ieee80211_hw *)data;
|
||||
struct rtl_priv *rtlpriv =
|
||||
from_timer(rtlpriv, t, works.fast_antenna_training_timer);
|
||||
struct ieee80211_hw *hw = rtlpriv->hw;
|
||||
|
||||
rtl88e_dm_fast_ant_training(hw);
|
||||
}
|
||||
|
@ -270,7 +270,7 @@ void rtl88e_dm_set_tx_ant_by_tx_info(struct ieee80211_hw *hw,
|
||||
void rtl88e_dm_ant_sel_statistics(struct ieee80211_hw *hw,
|
||||
u8 antsel_tr_mux, u32 mac_id,
|
||||
u32 rx_pwdb_all);
|
||||
void rtl88e_dm_fast_antenna_training_callback(unsigned long data);
|
||||
void rtl88e_dm_fast_antenna_training_callback(struct timer_list *t);
|
||||
void rtl88e_dm_init(struct ieee80211_hw *hw);
|
||||
void rtl88e_dm_watchdog(struct ieee80211_hw *hw);
|
||||
void rtl88e_dm_write_dig(struct ieee80211_hw *hw);
|
||||
|
@ -253,9 +253,12 @@ static void _rtl88ee_set_fw_ps_rf_off_low_power(struct ieee80211_hw *hw)
|
||||
rpwm_val |= FW_PS_STATE_RF_OFF_LOW_PWR_88E;
|
||||
_rtl88ee_set_fw_clock_off(hw, rpwm_val);
|
||||
}
|
||||
void rtl88ee_fw_clk_off_timer_callback(unsigned long data)
|
||||
|
||||
void rtl88ee_fw_clk_off_timer_callback(struct timer_list *t)
|
||||
{
|
||||
struct ieee80211_hw *hw = (struct ieee80211_hw *)data;
|
||||
struct rtl_priv *rtlpriv = from_timer(rtlpriv, t,
|
||||
works.fw_clockoff_timer);
|
||||
struct ieee80211_hw *hw = rtlpriv->hw;
|
||||
|
||||
_rtl88ee_set_fw_ps_rf_off_low_power(hw);
|
||||
}
|
||||
|
@ -58,6 +58,6 @@ void rtl8188ee_bt_reg_init(struct ieee80211_hw *hw);
|
||||
void rtl8188ee_bt_hw_init(struct ieee80211_hw *hw);
|
||||
void rtl88ee_suspend(struct ieee80211_hw *hw);
|
||||
void rtl88ee_resume(struct ieee80211_hw *hw);
|
||||
void rtl88ee_fw_clk_off_timer_callback(unsigned long data);
|
||||
void rtl88ee_fw_clk_off_timer_callback(struct timer_list *t);
|
||||
|
||||
#endif
|
||||
|
@ -190,16 +190,12 @@ int rtl88e_init_sw_vars(struct ieee80211_hw *hw)
|
||||
/*low power */
|
||||
rtlpriv->psc.low_power_enable = false;
|
||||
if (rtlpriv->psc.low_power_enable) {
|
||||
init_timer(&rtlpriv->works.fw_clockoff_timer);
|
||||
setup_timer(&rtlpriv->works.fw_clockoff_timer,
|
||||
rtl88ee_fw_clk_off_timer_callback,
|
||||
(unsigned long)hw);
|
||||
timer_setup(&rtlpriv->works.fw_clockoff_timer,
|
||||
rtl88ee_fw_clk_off_timer_callback, 0);
|
||||
}
|
||||
|
||||
init_timer(&rtlpriv->works.fast_antenna_training_timer);
|
||||
setup_timer(&rtlpriv->works.fast_antenna_training_timer,
|
||||
rtl88e_dm_fast_antenna_training_callback,
|
||||
(unsigned long)hw);
|
||||
timer_setup(&rtlpriv->works.fast_antenna_training_timer,
|
||||
rtl88e_dm_fast_antenna_training_callback, 0);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
@ -1131,13 +1131,13 @@ static u8 _rtl8821ae_dbi_read(struct rtl_priv *rtlpriv, u16 addr)
|
||||
static void _rtl8821ae_dbi_write(struct rtl_priv *rtlpriv, u16 addr, u8 data)
|
||||
{
|
||||
u8 tmp = 0, count = 0;
|
||||
u16 wrtie_addr, remainder = addr % 4;
|
||||
u16 write_addr, remainder = addr % 4;
|
||||
|
||||
wrtie_addr = REG_DBI_WDATA + remainder;
|
||||
rtl_write_byte(rtlpriv, wrtie_addr, data);
|
||||
write_addr = REG_DBI_WDATA + remainder;
|
||||
rtl_write_byte(rtlpriv, write_addr, data);
|
||||
|
||||
wrtie_addr = (addr & 0xfffc) | (BIT(0) << (remainder + 12));
|
||||
rtl_write_word(rtlpriv, REG_DBI_ADDR, wrtie_addr);
|
||||
write_addr = (addr & 0xfffc) | (BIT(0) << (remainder + 12));
|
||||
rtl_write_word(rtlpriv, REG_DBI_ADDR, write_addr);
|
||||
|
||||
rtl_write_byte(rtlpriv, REG_DBI_FLAG, 0x1);
|
||||
|
||||
|
@ -952,17 +952,12 @@ static void _rtl_usb_tx_preprocess(struct ieee80211_hw *hw,
|
||||
u16 hw_queue)
|
||||
{
|
||||
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||||
struct rtl_mac *mac = rtl_mac(rtl_priv(hw));
|
||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
||||
struct rtl_tx_desc *pdesc = NULL;
|
||||
struct rtl_tcb_desc tcb_desc;
|
||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)(skb->data);
|
||||
__le16 fc = hdr->frame_control;
|
||||
u8 *pda_addr = hdr->addr1;
|
||||
/* ssn */
|
||||
u8 *qc = NULL;
|
||||
u8 tid = 0;
|
||||
u16 seq_number = 0;
|
||||
|
||||
memset(&tcb_desc, 0, sizeof(struct rtl_tcb_desc));
|
||||
if (ieee80211_is_auth(fc)) {
|
||||
@ -983,20 +978,8 @@ static void _rtl_usb_tx_preprocess(struct ieee80211_hw *hw,
|
||||
rtlpriv->stats.txbytesbroadcast += skb->len;
|
||||
else
|
||||
rtlpriv->stats.txbytesunicast += skb->len;
|
||||
if (ieee80211_is_data_qos(fc)) {
|
||||
qc = ieee80211_get_qos_ctl(hdr);
|
||||
tid = qc[0] & IEEE80211_QOS_CTL_TID_MASK;
|
||||
seq_number = (le16_to_cpu(hdr->seq_ctrl) &
|
||||
IEEE80211_SCTL_SEQ) >> 4;
|
||||
seq_number += 1;
|
||||
seq_number <<= 4;
|
||||
}
|
||||
rtlpriv->cfg->ops->fill_tx_desc(hw, hdr, (u8 *)pdesc, NULL, info, sta, skb,
|
||||
hw_queue, &tcb_desc);
|
||||
if (!ieee80211_has_morefrags(hdr->frame_control)) {
|
||||
if (qc)
|
||||
mac->tids[tid].seq_number = seq_number;
|
||||
}
|
||||
if (ieee80211_is_data(fc))
|
||||
rtlpriv->cfg->ops->led_control(hw, LED_CTL_TX);
|
||||
}
|
||||
|
@ -1324,7 +1324,6 @@ struct rssi_sta {
|
||||
};
|
||||
|
||||
struct rtl_tid_data {
|
||||
u16 seq_number;
|
||||
struct rtl_ht_agg agg;
|
||||
};
|
||||
|
||||
|
@ -276,6 +276,8 @@ void rsi_core_qos_processor(struct rsi_common *common)
|
||||
rsi_dbg(DATA_TX_ZONE, "%s: No More Pkt\n", __func__);
|
||||
break;
|
||||
}
|
||||
if (common->hibernate_resume)
|
||||
break;
|
||||
|
||||
mutex_lock(&common->tx_lock);
|
||||
|
||||
@ -379,6 +381,12 @@ void rsi_core_xmit(struct rsi_common *common, struct sk_buff *skb)
|
||||
rsi_dbg(ERR_ZONE, "%s: FSM state not open\n", __func__);
|
||||
goto xmit_fail;
|
||||
}
|
||||
if (common->wow_flags & RSI_WOW_ENABLED) {
|
||||
rsi_dbg(ERR_ZONE,
|
||||
"%s: Blocking Tx_packets when WOWLAN is enabled\n",
|
||||
__func__);
|
||||
goto xmit_fail;
|
||||
}
|
||||
|
||||
info = IEEE80211_SKB_CB(skb);
|
||||
tx_params = (struct skb_info *)info->driver_data;
|
||||
|
@ -418,9 +418,9 @@ int rsi_prepare_beacon(struct rsi_common *common, struct sk_buff *skb)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void bl_cmd_timeout(unsigned long priv)
|
||||
static void bl_cmd_timeout(struct timer_list *t)
|
||||
{
|
||||
struct rsi_hw *adapter = (struct rsi_hw *)priv;
|
||||
struct rsi_hw *adapter = from_timer(adapter, t, bl_cmd_timer);
|
||||
|
||||
adapter->blcmd_timer_expired = true;
|
||||
del_timer(&adapter->bl_cmd_timer);
|
||||
@ -428,8 +428,7 @@ static void bl_cmd_timeout(unsigned long priv)
|
||||
|
||||
static int bl_start_cmd_timer(struct rsi_hw *adapter, u32 timeout)
|
||||
{
|
||||
setup_timer(&adapter->bl_cmd_timer, (void *)&bl_cmd_timeout,
|
||||
(unsigned long)adapter);
|
||||
timer_setup(&adapter->bl_cmd_timer, bl_cmd_timeout, 0);
|
||||
adapter->bl_cmd_timer.expires = (msecs_to_jiffies(timeout) + jiffies);
|
||||
|
||||
adapter->blcmd_timer_expired = false;
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user