Merge ath-next from git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/ath.git

ath.git patches for 4.11. Major changes:

ath10k

* when trying older firmware versions don't confuse user with error messages

ath9k

* fix crash in AP mode (regression)
* fix relayfs crash (regression)
* fix initialisation with AR9340 and AR9550
This commit is contained in:
Kalle Valo 2017-02-15 16:01:04 +02:00
commit b065d3f59f
17 changed files with 140 additions and 170 deletions

View File

@ -351,7 +351,7 @@ void ath10k_core_get_fw_features_str(struct ath10k *ar,
char *buf, char *buf,
size_t buf_len) size_t buf_len)
{ {
unsigned int len = 0; size_t len = 0;
int i; int i;
for (i = 0; i < ATH10K_FW_FEATURE_COUNT; i++) { for (i = 0; i < ATH10K_FW_FEATURE_COUNT; i++) {
@ -456,7 +456,10 @@ static const struct firmware *ath10k_fetch_fw_file(struct ath10k *ar,
dir = "."; dir = ".";
snprintf(filename, sizeof(filename), "%s/%s", dir, file); snprintf(filename, sizeof(filename), "%s/%s", dir, file);
ret = request_firmware(&fw, filename, ar->dev); ret = request_firmware_direct(&fw, filename, ar->dev);
ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot fw request '%s': %d\n",
filename, ret);
if (ret) if (ret)
return ERR_PTR(ret); return ERR_PTR(ret);
@ -698,7 +701,8 @@ static int ath10k_core_get_board_id_from_otp(struct ath10k *ar)
if ((result & ATH10K_BMI_BOARD_ID_STATUS_MASK) != 0 || if ((result & ATH10K_BMI_BOARD_ID_STATUS_MASK) != 0 ||
(board_id == 0)) { (board_id == 0)) {
ath10k_warn(ar, "board id is not exist in otp, ignore it\n"); ath10k_dbg(ar, ATH10K_DBG_BOOT,
"board id does not exist in otp, ignore it\n");
return -EOPNOTSUPP; return -EOPNOTSUPP;
} }
@ -1122,7 +1126,7 @@ static int ath10k_core_create_board_name(struct ath10k *ar, char *name,
size_t name_len) size_t name_len)
{ {
/* strlen(',variant=') + strlen(ar->id.bdf_ext) */ /* strlen(',variant=') + strlen(ar->id.bdf_ext) */
char variant[9 + ATH10K_SMBIOS_BDF_EXT_STR_LENGTH]; char variant[9 + ATH10K_SMBIOS_BDF_EXT_STR_LENGTH] = { 0 };
if (ar->id.bmi_ids_valid) { if (ar->id.bmi_ids_valid) {
scnprintf(name, name_len, scnprintf(name, name_len,
@ -1168,7 +1172,8 @@ static int ath10k_core_fetch_board_file(struct ath10k *ar)
ar->bd_api = 1; ar->bd_api = 1;
ret = ath10k_core_fetch_board_data_api_1(ar); ret = ath10k_core_fetch_board_data_api_1(ar);
if (ret) { if (ret) {
ath10k_err(ar, "failed to fetch board data\n"); ath10k_err(ar, "failed to fetch board-2.bin or board.bin from %s\n",
ar->hw_params.fw.dir);
return ret; return ret;
} }
@ -1189,12 +1194,8 @@ int ath10k_core_fetch_firmware_api_n(struct ath10k *ar, const char *name,
/* first fetch the firmware file (firmware-*.bin) */ /* first fetch the firmware file (firmware-*.bin) */
fw_file->firmware = ath10k_fetch_fw_file(ar, ar->hw_params.fw.dir, fw_file->firmware = ath10k_fetch_fw_file(ar, ar->hw_params.fw.dir,
name); name);
if (IS_ERR(fw_file->firmware)) { if (IS_ERR(fw_file->firmware))
ath10k_err(ar, "could not fetch firmware file '%s/%s': %ld\n",
ar->hw_params.fw.dir, name,
PTR_ERR(fw_file->firmware));
return PTR_ERR(fw_file->firmware); return PTR_ERR(fw_file->firmware);
}
data = fw_file->firmware->data; data = fw_file->firmware->data;
len = fw_file->firmware->size; len = fw_file->firmware->size;
@ -1358,44 +1359,39 @@ int ath10k_core_fetch_firmware_api_n(struct ath10k *ar, const char *name,
return ret; return ret;
} }
static void ath10k_core_get_fw_name(struct ath10k *ar, char *fw_name,
size_t fw_name_len, int fw_api)
{
scnprintf(fw_name, fw_name_len, "%s-%d.bin", ATH10K_FW_FILE_BASE, fw_api);
}
static int ath10k_core_fetch_firmware_files(struct ath10k *ar) static int ath10k_core_fetch_firmware_files(struct ath10k *ar)
{ {
int ret; int ret, i;
char fw_name[100];
/* calibration file is optional, don't check for any errors */ /* calibration file is optional, don't check for any errors */
ath10k_fetch_cal_file(ar); ath10k_fetch_cal_file(ar);
ar->fw_api = 5; for (i = ATH10K_FW_API_MAX; i >= ATH10K_FW_API_MIN; i--) {
ath10k_dbg(ar, ATH10K_DBG_BOOT, "trying fw api %d\n", ar->fw_api); ar->fw_api = i;
ath10k_dbg(ar, ATH10K_DBG_BOOT, "trying fw api %d\n",
ar->fw_api);
ret = ath10k_core_fetch_firmware_api_n(ar, ATH10K_FW_API5_FILE, ath10k_core_get_fw_name(ar, fw_name, sizeof(fw_name), ar->fw_api);
&ar->normal_mode_fw.fw_file); ret = ath10k_core_fetch_firmware_api_n(ar, fw_name,
if (ret == 0) &ar->normal_mode_fw.fw_file);
goto success; if (!ret)
goto success;
}
ar->fw_api = 4; /* we end up here if we couldn't fetch any firmware */
ath10k_dbg(ar, ATH10K_DBG_BOOT, "trying fw api %d\n", ar->fw_api);
ret = ath10k_core_fetch_firmware_api_n(ar, ATH10K_FW_API4_FILE, ath10k_err(ar, "Failed to find firmware-N.bin (N between %d and %d) from %s: %d",
&ar->normal_mode_fw.fw_file); ATH10K_FW_API_MIN, ATH10K_FW_API_MAX, ar->hw_params.fw.dir,
if (ret == 0) ret);
goto success;
ar->fw_api = 3; return ret;
ath10k_dbg(ar, ATH10K_DBG_BOOT, "trying fw api %d\n", ar->fw_api);
ret = ath10k_core_fetch_firmware_api_n(ar, ATH10K_FW_API3_FILE,
&ar->normal_mode_fw.fw_file);
if (ret == 0)
goto success;
ar->fw_api = 2;
ath10k_dbg(ar, ATH10K_DBG_BOOT, "trying fw api %d\n", ar->fw_api);
ret = ath10k_core_fetch_firmware_api_n(ar, ATH10K_FW_API2_FILE,
&ar->normal_mode_fw.fw_file);
if (ret)
return ret;
success: success:
ath10k_dbg(ar, ATH10K_DBG_BOOT, "using fw api %d\n", ar->fw_api); ath10k_dbg(ar, ATH10K_DBG_BOOT, "using fw api %d\n", ar->fw_api);

View File

@ -237,7 +237,7 @@ static ssize_t ath10k_read_wmi_services(struct file *file,
{ {
struct ath10k *ar = file->private_data; struct ath10k *ar = file->private_data;
char *buf; char *buf;
unsigned int len = 0, buf_len = 4096; size_t len = 0, buf_len = 4096;
const char *name; const char *name;
ssize_t ret_cnt; ssize_t ret_cnt;
bool enabled; bool enabled;
@ -529,7 +529,7 @@ static ssize_t ath10k_fw_stats_read(struct file *file, char __user *user_buf,
size_t count, loff_t *ppos) size_t count, loff_t *ppos)
{ {
const char *buf = file->private_data; const char *buf = file->private_data;
unsigned int len = strlen(buf); size_t len = strlen(buf);
return simple_read_from_buffer(user_buf, count, ppos, buf, len); return simple_read_from_buffer(user_buf, count, ppos, buf, len);
} }
@ -547,17 +547,16 @@ static ssize_t ath10k_debug_fw_reset_stats_read(struct file *file,
size_t count, loff_t *ppos) size_t count, loff_t *ppos)
{ {
struct ath10k *ar = file->private_data; struct ath10k *ar = file->private_data;
int ret, len, buf_len; int ret;
size_t len = 0, buf_len = 500;
char *buf; char *buf;
buf_len = 500;
buf = kmalloc(buf_len, GFP_KERNEL); buf = kmalloc(buf_len, GFP_KERNEL);
if (!buf) if (!buf)
return -ENOMEM; return -ENOMEM;
spin_lock_bh(&ar->data_lock); spin_lock_bh(&ar->data_lock);
len = 0;
len += scnprintf(buf + len, buf_len - len, len += scnprintf(buf + len, buf_len - len,
"fw_crash_counter\t\t%d\n", ar->stats.fw_crash_counter); "fw_crash_counter\t\t%d\n", ar->stats.fw_crash_counter);
len += scnprintf(buf + len, buf_len - len, len += scnprintf(buf + len, buf_len - len,
@ -696,7 +695,7 @@ static ssize_t ath10k_read_chip_id(struct file *file, char __user *user_buf,
size_t count, loff_t *ppos) size_t count, loff_t *ppos)
{ {
struct ath10k *ar = file->private_data; struct ath10k *ar = file->private_data;
unsigned int len; size_t len;
char buf[50]; char buf[50];
len = scnprintf(buf, sizeof(buf), "0x%08x\n", ar->chip_id); len = scnprintf(buf, sizeof(buf), "0x%08x\n", ar->chip_id);
@ -733,8 +732,8 @@ static struct ath10k_dump_file_data *ath10k_build_dump_file(struct ath10k *ar,
struct ath10k_ce_crash_hdr *ce_hdr; struct ath10k_ce_crash_hdr *ce_hdr;
struct ath10k_dump_file_data *dump_data; struct ath10k_dump_file_data *dump_data;
struct ath10k_tlv_dump_data *dump_tlv; struct ath10k_tlv_dump_data *dump_tlv;
int hdr_len = sizeof(*dump_data); size_t hdr_len = sizeof(*dump_data);
unsigned int len, sofar = 0; size_t len, sofar = 0;
unsigned char *buf; unsigned char *buf;
len = hdr_len; len = hdr_len;
@ -900,7 +899,7 @@ static ssize_t ath10k_reg_addr_read(struct file *file,
{ {
struct ath10k *ar = file->private_data; struct ath10k *ar = file->private_data;
u8 buf[32]; u8 buf[32];
unsigned int len = 0; size_t len = 0;
u32 reg_addr; u32 reg_addr;
mutex_lock(&ar->conf_mutex); mutex_lock(&ar->conf_mutex);
@ -948,7 +947,7 @@ static ssize_t ath10k_reg_value_read(struct file *file,
{ {
struct ath10k *ar = file->private_data; struct ath10k *ar = file->private_data;
u8 buf[48]; u8 buf[48];
unsigned int len; size_t len;
u32 reg_addr, reg_val; u32 reg_addr, reg_val;
int ret; int ret;
@ -1171,7 +1170,7 @@ static ssize_t ath10k_read_htt_stats_mask(struct file *file,
{ {
struct ath10k *ar = file->private_data; struct ath10k *ar = file->private_data;
char buf[32]; char buf[32];
unsigned int len; size_t len;
len = scnprintf(buf, sizeof(buf), "%lu\n", ar->debug.htt_stats_mask); len = scnprintf(buf, sizeof(buf), "%lu\n", ar->debug.htt_stats_mask);
@ -1225,7 +1224,7 @@ static ssize_t ath10k_read_htt_max_amsdu_ampdu(struct file *file,
struct ath10k *ar = file->private_data; struct ath10k *ar = file->private_data;
char buf[64]; char buf[64];
u8 amsdu, ampdu; u8 amsdu, ampdu;
unsigned int len; size_t len;
mutex_lock(&ar->conf_mutex); mutex_lock(&ar->conf_mutex);
@ -1285,7 +1284,7 @@ static ssize_t ath10k_read_fw_dbglog(struct file *file,
size_t count, loff_t *ppos) size_t count, loff_t *ppos)
{ {
struct ath10k *ar = file->private_data; struct ath10k *ar = file->private_data;
unsigned int len; size_t len;
char buf[96]; char buf[96];
len = scnprintf(buf, sizeof(buf), "0x%16llx %u\n", len = scnprintf(buf, sizeof(buf), "0x%16llx %u\n",
@ -1611,11 +1610,10 @@ static ssize_t ath10k_read_ani_enable(struct file *file, char __user *user_buf,
size_t count, loff_t *ppos) size_t count, loff_t *ppos)
{ {
struct ath10k *ar = file->private_data; struct ath10k *ar = file->private_data;
int len = 0; size_t len;
char buf[32]; char buf[32];
len = scnprintf(buf, sizeof(buf) - len, "%d\n", len = scnprintf(buf, sizeof(buf), "%d\n", ar->ani_enabled);
ar->ani_enabled);
return simple_read_from_buffer(user_buf, count, ppos, buf, len); return simple_read_from_buffer(user_buf, count, ppos, buf, len);
} }
@ -1640,11 +1638,10 @@ static ssize_t ath10k_read_nf_cal_period(struct file *file,
size_t count, loff_t *ppos) size_t count, loff_t *ppos)
{ {
struct ath10k *ar = file->private_data; struct ath10k *ar = file->private_data;
unsigned int len; size_t len;
char buf[32]; char buf[32];
len = scnprintf(buf, sizeof(buf), "%d\n", len = scnprintf(buf, sizeof(buf), "%d\n", ar->debug.nf_cal_period);
ar->debug.nf_cal_period);
return simple_read_from_buffer(user_buf, count, ppos, buf, len); return simple_read_from_buffer(user_buf, count, ppos, buf, len);
} }
@ -1740,9 +1737,10 @@ void ath10k_debug_tpc_stats_process(struct ath10k *ar,
} }
static void ath10k_tpc_stats_print(struct ath10k_tpc_stats *tpc_stats, static void ath10k_tpc_stats_print(struct ath10k_tpc_stats *tpc_stats,
unsigned int j, char *buf, unsigned int *len) unsigned int j, char *buf, size_t *len)
{ {
unsigned int i, buf_len; int i;
size_t buf_len;
static const char table_str[][5] = { "CDD", static const char table_str[][5] = { "CDD",
"STBC", "STBC",
"TXBF" }; "TXBF" };
@ -1782,7 +1780,8 @@ static void ath10k_tpc_stats_fill(struct ath10k *ar,
struct ath10k_tpc_stats *tpc_stats, struct ath10k_tpc_stats *tpc_stats,
char *buf) char *buf)
{ {
unsigned int len, j, buf_len; int j;
size_t len, buf_len;
len = 0; len = 0;
buf_len = ATH10K_TPC_CONFIG_BUF_SIZE; buf_len = ATH10K_TPC_CONFIG_BUF_SIZE;
@ -1916,7 +1915,7 @@ static ssize_t ath10k_tpc_stats_read(struct file *file, char __user *user_buf,
size_t count, loff_t *ppos) size_t count, loff_t *ppos)
{ {
const char *buf = file->private_data; const char *buf = file->private_data;
unsigned int len = strlen(buf); size_t len = strlen(buf);
return simple_read_from_buffer(user_buf, count, ppos, buf, len); return simple_read_from_buffer(user_buf, count, ppos, buf, len);
} }
@ -2340,7 +2339,7 @@ static ssize_t ath10k_debug_fw_checksums_read(struct file *file,
size_t count, loff_t *ppos) size_t count, loff_t *ppos)
{ {
struct ath10k *ar = file->private_data; struct ath10k *ar = file->private_data;
unsigned int len = 0, buf_len = 4096; size_t len = 0, buf_len = 4096;
ssize_t ret_cnt; ssize_t ret_cnt;
char *buf; char *buf;
@ -2556,7 +2555,7 @@ void ath10k_dbg_dump(struct ath10k *ar,
const void *buf, size_t len) const void *buf, size_t len)
{ {
char linebuf[256]; char linebuf[256];
unsigned int linebuflen; size_t linebuflen;
const void *ptr; const void *ptr;
if (ath10k_debug_mask & mask) { if (ath10k_debug_mask & mask) {

View File

@ -128,6 +128,10 @@ enum qca9377_chip_id_rev {
#define QCA4019_HW_1_0_BOARD_DATA_FILE "board.bin" #define QCA4019_HW_1_0_BOARD_DATA_FILE "board.bin"
#define QCA4019_HW_1_0_PATCH_LOAD_ADDR 0x1234 #define QCA4019_HW_1_0_PATCH_LOAD_ADDR 0x1234
#define ATH10K_FW_FILE_BASE "firmware"
#define ATH10K_FW_API_MAX 5
#define ATH10K_FW_API_MIN 2
#define ATH10K_FW_API2_FILE "firmware-2.bin" #define ATH10K_FW_API2_FILE "firmware-2.bin"
#define ATH10K_FW_API3_FILE "firmware-3.bin" #define ATH10K_FW_API3_FILE "firmware-3.bin"

View File

@ -1993,7 +1993,7 @@ static void ath10k_mac_handle_beacon_iter(void *data, u8 *mac,
{ {
struct sk_buff *skb = data; struct sk_buff *skb = data;
struct ieee80211_mgmt *mgmt = (void *)skb->data; struct ieee80211_mgmt *mgmt = (void *)skb->data;
struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); struct ath10k_vif *arvif = (void *)vif->drv_priv;
if (vif->type != NL80211_IFTYPE_STATION) if (vif->type != NL80211_IFTYPE_STATION)
return; return;
@ -2016,7 +2016,7 @@ static void ath10k_mac_handle_beacon_miss_iter(void *data, u8 *mac,
struct ieee80211_vif *vif) struct ieee80211_vif *vif)
{ {
u32 *vdev_id = data; u32 *vdev_id = data;
struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); struct ath10k_vif *arvif = (void *)vif->drv_priv;
struct ath10k *ar = arvif->ar; struct ath10k *ar = arvif->ar;
struct ieee80211_hw *hw = ar->hw; struct ieee80211_hw *hw = ar->hw;
@ -2083,7 +2083,7 @@ static void ath10k_peer_assoc_h_basic(struct ath10k *ar,
struct ieee80211_sta *sta, struct ieee80211_sta *sta,
struct wmi_peer_assoc_complete_arg *arg) struct wmi_peer_assoc_complete_arg *arg)
{ {
struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); struct ath10k_vif *arvif = (void *)vif->drv_priv;
u32 aid; u32 aid;
lockdep_assert_held(&ar->conf_mutex); lockdep_assert_held(&ar->conf_mutex);
@ -2159,7 +2159,7 @@ static void ath10k_peer_assoc_h_rates(struct ath10k *ar,
struct ieee80211_sta *sta, struct ieee80211_sta *sta,
struct wmi_peer_assoc_complete_arg *arg) struct wmi_peer_assoc_complete_arg *arg)
{ {
struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); struct ath10k_vif *arvif = (void *)vif->drv_priv;
struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates; struct wmi_rate_set_arg *rateset = &arg->peer_legacy_rates;
struct cfg80211_chan_def def; struct cfg80211_chan_def def;
const struct ieee80211_supported_band *sband; const struct ieee80211_supported_band *sband;
@ -2222,7 +2222,7 @@ static void ath10k_peer_assoc_h_ht(struct ath10k *ar,
struct wmi_peer_assoc_complete_arg *arg) struct wmi_peer_assoc_complete_arg *arg)
{ {
const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap; const struct ieee80211_sta_ht_cap *ht_cap = &sta->ht_cap;
struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); struct ath10k_vif *arvif = (void *)vif->drv_priv;
struct cfg80211_chan_def def; struct cfg80211_chan_def def;
enum nl80211_band band; enum nl80211_band band;
const u8 *ht_mcs_mask; const u8 *ht_mcs_mask;
@ -2446,7 +2446,7 @@ static void ath10k_peer_assoc_h_vht(struct ath10k *ar,
struct wmi_peer_assoc_complete_arg *arg) struct wmi_peer_assoc_complete_arg *arg)
{ {
const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap; const struct ieee80211_sta_vht_cap *vht_cap = &sta->vht_cap;
struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); struct ath10k_vif *arvif = (void *)vif->drv_priv;
struct cfg80211_chan_def def; struct cfg80211_chan_def def;
enum nl80211_band band; enum nl80211_band band;
const u16 *vht_mcs_mask; const u16 *vht_mcs_mask;
@ -2507,7 +2507,7 @@ static void ath10k_peer_assoc_h_qos(struct ath10k *ar,
struct ieee80211_sta *sta, struct ieee80211_sta *sta,
struct wmi_peer_assoc_complete_arg *arg) struct wmi_peer_assoc_complete_arg *arg)
{ {
struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); struct ath10k_vif *arvif = (void *)vif->drv_priv;
switch (arvif->vdev_type) { switch (arvif->vdev_type) {
case WMI_VDEV_TYPE_AP: case WMI_VDEV_TYPE_AP:
@ -2574,7 +2574,7 @@ static void ath10k_peer_assoc_h_phymode(struct ath10k *ar,
struct ieee80211_sta *sta, struct ieee80211_sta *sta,
struct wmi_peer_assoc_complete_arg *arg) struct wmi_peer_assoc_complete_arg *arg)
{ {
struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); struct ath10k_vif *arvif = (void *)vif->drv_priv;
struct cfg80211_chan_def def; struct cfg80211_chan_def def;
enum nl80211_band band; enum nl80211_band band;
const u8 *ht_mcs_mask; const u8 *ht_mcs_mask;
@ -2689,7 +2689,7 @@ static int ath10k_mac_vif_recalc_txbf(struct ath10k *ar,
struct ieee80211_vif *vif, struct ieee80211_vif *vif,
struct ieee80211_sta_vht_cap vht_cap) struct ieee80211_sta_vht_cap vht_cap)
{ {
struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); struct ath10k_vif *arvif = (void *)vif->drv_priv;
int ret; int ret;
u32 param; u32 param;
u32 value; u32 value;
@ -2756,7 +2756,7 @@ static void ath10k_bss_assoc(struct ieee80211_hw *hw,
struct ieee80211_bss_conf *bss_conf) struct ieee80211_bss_conf *bss_conf)
{ {
struct ath10k *ar = hw->priv; struct ath10k *ar = hw->priv;
struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); struct ath10k_vif *arvif = (void *)vif->drv_priv;
struct ieee80211_sta_ht_cap ht_cap; struct ieee80211_sta_ht_cap ht_cap;
struct ieee80211_sta_vht_cap vht_cap; struct ieee80211_sta_vht_cap vht_cap;
struct wmi_peer_assoc_complete_arg peer_arg; struct wmi_peer_assoc_complete_arg peer_arg;
@ -2849,7 +2849,7 @@ static void ath10k_bss_disassoc(struct ieee80211_hw *hw,
struct ieee80211_vif *vif) struct ieee80211_vif *vif)
{ {
struct ath10k *ar = hw->priv; struct ath10k *ar = hw->priv;
struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); struct ath10k_vif *arvif = (void *)vif->drv_priv;
struct ieee80211_sta_vht_cap vht_cap = {}; struct ieee80211_sta_vht_cap vht_cap = {};
int ret; int ret;
@ -2882,7 +2882,7 @@ static int ath10k_station_assoc(struct ath10k *ar,
struct ieee80211_sta *sta, struct ieee80211_sta *sta,
bool reassoc) bool reassoc)
{ {
struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); struct ath10k_vif *arvif = (void *)vif->drv_priv;
struct wmi_peer_assoc_complete_arg peer_arg; struct wmi_peer_assoc_complete_arg peer_arg;
int ret = 0; int ret = 0;
@ -2949,7 +2949,7 @@ static int ath10k_station_disassoc(struct ath10k *ar,
struct ieee80211_vif *vif, struct ieee80211_vif *vif,
struct ieee80211_sta *sta) struct ieee80211_sta *sta)
{ {
struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); struct ath10k_vif *arvif = (void *)vif->drv_priv;
int ret = 0; int ret = 0;
lockdep_assert_held(&ar->conf_mutex); lockdep_assert_held(&ar->conf_mutex);
@ -3175,7 +3175,7 @@ static void ath10k_mac_tx_unlock_iter(void *data, u8 *mac,
struct ieee80211_vif *vif) struct ieee80211_vif *vif)
{ {
struct ath10k *ar = data; struct ath10k *ar = data;
struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); struct ath10k_vif *arvif = (void *)vif->drv_priv;
if (arvif->tx_paused) if (arvif->tx_paused)
return; return;
@ -3262,7 +3262,7 @@ struct ath10k_mac_tx_pause {
static void ath10k_mac_handle_tx_pause_iter(void *data, u8 *mac, static void ath10k_mac_handle_tx_pause_iter(void *data, u8 *mac,
struct ieee80211_vif *vif) struct ieee80211_vif *vif)
{ {
struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); struct ath10k_vif *arvif = (void *)vif->drv_priv;
struct ath10k_mac_tx_pause *arg = data; struct ath10k_mac_tx_pause *arg = data;
if (arvif->vdev_id != arg->vdev_id) if (arvif->vdev_id != arg->vdev_id)
@ -3358,7 +3358,7 @@ static bool ath10k_tx_h_use_hwcrypto(struct ieee80211_vif *vif,
return false; return false;
if (vif) if (vif)
return !ath10k_vif_to_arvif(vif)->nohwcrypt; return !((struct ath10k_vif *)vif->drv_priv)->nohwcrypt;
return true; return true;
} }
@ -3423,7 +3423,7 @@ static void ath10k_tx_h_add_p2p_noa_ie(struct ath10k *ar,
struct sk_buff *skb) struct sk_buff *skb)
{ {
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); struct ath10k_vif *arvif = (void *)vif->drv_priv;
/* This is case only for P2P_GO */ /* This is case only for P2P_GO */
if (vif->type != NL80211_IFTYPE_AP || !vif->p2p) if (vif->type != NL80211_IFTYPE_AP || !vif->p2p)
@ -4849,7 +4849,7 @@ static int ath10k_add_interface(struct ieee80211_hw *hw,
struct ieee80211_vif *vif) struct ieee80211_vif *vif)
{ {
struct ath10k *ar = hw->priv; struct ath10k *ar = hw->priv;
struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); struct ath10k_vif *arvif = (void *)vif->drv_priv;
struct ath10k_peer *peer; struct ath10k_peer *peer;
enum wmi_sta_powersave_param param; enum wmi_sta_powersave_param param;
int ret = 0; int ret = 0;
@ -5185,7 +5185,7 @@ static void ath10k_remove_interface(struct ieee80211_hw *hw,
struct ieee80211_vif *vif) struct ieee80211_vif *vif)
{ {
struct ath10k *ar = hw->priv; struct ath10k *ar = hw->priv;
struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); struct ath10k_vif *arvif = (void *)vif->drv_priv;
struct ath10k_peer *peer; struct ath10k_peer *peer;
int ret; int ret;
int i; int i;
@ -5320,7 +5320,7 @@ static void ath10k_bss_info_changed(struct ieee80211_hw *hw,
u32 changed) u32 changed)
{ {
struct ath10k *ar = hw->priv; struct ath10k *ar = hw->priv;
struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); struct ath10k_vif *arvif = (void *)vif->drv_priv;
int ret = 0; int ret = 0;
u32 vdev_param, pdev_param, slottime, preamble; u32 vdev_param, pdev_param, slottime, preamble;
@ -5512,7 +5512,7 @@ static int ath10k_hw_scan(struct ieee80211_hw *hw,
struct ieee80211_scan_request *hw_req) struct ieee80211_scan_request *hw_req)
{ {
struct ath10k *ar = hw->priv; struct ath10k *ar = hw->priv;
struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); struct ath10k_vif *arvif = (void *)vif->drv_priv;
struct cfg80211_scan_request *req = &hw_req->req; struct cfg80211_scan_request *req = &hw_req->req;
struct wmi_start_scan_arg arg; struct wmi_start_scan_arg arg;
int ret = 0; int ret = 0;
@ -5644,7 +5644,7 @@ static int ath10k_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,
struct ieee80211_key_conf *key) struct ieee80211_key_conf *key)
{ {
struct ath10k *ar = hw->priv; struct ath10k *ar = hw->priv;
struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); struct ath10k_vif *arvif = (void *)vif->drv_priv;
struct ath10k_peer *peer; struct ath10k_peer *peer;
const u8 *peer_addr; const u8 *peer_addr;
bool is_wep = key->cipher == WLAN_CIPHER_SUITE_WEP40 || bool is_wep = key->cipher == WLAN_CIPHER_SUITE_WEP40 ||
@ -5783,7 +5783,7 @@ static void ath10k_set_default_unicast_key(struct ieee80211_hw *hw,
int keyidx) int keyidx)
{ {
struct ath10k *ar = hw->priv; struct ath10k *ar = hw->priv;
struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); struct ath10k_vif *arvif = (void *)vif->drv_priv;
int ret; int ret;
mutex_lock(&arvif->ar->conf_mutex); mutex_lock(&arvif->ar->conf_mutex);
@ -5964,7 +5964,7 @@ static int ath10k_mac_tdls_vif_stations_count(struct ieee80211_hw *hw,
static void ath10k_mac_tdls_vifs_count_iter(void *data, u8 *mac, static void ath10k_mac_tdls_vifs_count_iter(void *data, u8 *mac,
struct ieee80211_vif *vif) struct ieee80211_vif *vif)
{ {
struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); struct ath10k_vif *arvif = (void *)vif->drv_priv;
int *num_tdls_vifs = data; int *num_tdls_vifs = data;
if (vif->type != NL80211_IFTYPE_STATION) if (vif->type != NL80211_IFTYPE_STATION)
@ -5992,7 +5992,7 @@ static int ath10k_sta_state(struct ieee80211_hw *hw,
enum ieee80211_sta_state new_state) enum ieee80211_sta_state new_state)
{ {
struct ath10k *ar = hw->priv; struct ath10k *ar = hw->priv;
struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); struct ath10k_vif *arvif = (void *)vif->drv_priv;
struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv; struct ath10k_sta *arsta = (struct ath10k_sta *)sta->drv_priv;
struct ath10k_peer *peer; struct ath10k_peer *peer;
int ret = 0; int ret = 0;
@ -6227,7 +6227,7 @@ static int ath10k_sta_state(struct ieee80211_hw *hw,
static int ath10k_conf_tx_uapsd(struct ath10k *ar, struct ieee80211_vif *vif, static int ath10k_conf_tx_uapsd(struct ath10k *ar, struct ieee80211_vif *vif,
u16 ac, bool enable) u16 ac, bool enable)
{ {
struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); struct ath10k_vif *arvif = (void *)vif->drv_priv;
struct wmi_sta_uapsd_auto_trig_arg arg = {}; struct wmi_sta_uapsd_auto_trig_arg arg = {};
u32 prio = 0, acc = 0; u32 prio = 0, acc = 0;
u32 value = 0; u32 value = 0;
@ -6335,7 +6335,7 @@ static int ath10k_conf_tx(struct ieee80211_hw *hw,
const struct ieee80211_tx_queue_params *params) const struct ieee80211_tx_queue_params *params)
{ {
struct ath10k *ar = hw->priv; struct ath10k *ar = hw->priv;
struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); struct ath10k_vif *arvif = (void *)vif->drv_priv;
struct wmi_wmm_params_arg *p = NULL; struct wmi_wmm_params_arg *p = NULL;
int ret; int ret;
@ -6409,7 +6409,7 @@ static int ath10k_remain_on_channel(struct ieee80211_hw *hw,
enum ieee80211_roc_type type) enum ieee80211_roc_type type)
{ {
struct ath10k *ar = hw->priv; struct ath10k *ar = hw->priv;
struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); struct ath10k_vif *arvif = (void *)vif->drv_priv;
struct wmi_start_scan_arg arg; struct wmi_start_scan_arg arg;
int ret = 0; int ret = 0;
u32 scan_time_msec; u32 scan_time_msec;
@ -6909,7 +6909,7 @@ static int ath10k_mac_op_set_bitrate_mask(struct ieee80211_hw *hw,
struct ieee80211_vif *vif, struct ieee80211_vif *vif,
const struct cfg80211_bitrate_mask *mask) const struct cfg80211_bitrate_mask *mask)
{ {
struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); struct ath10k_vif *arvif = (void *)vif->drv_priv;
struct cfg80211_chan_def def; struct cfg80211_chan_def def;
struct ath10k *ar = arvif->ar; struct ath10k *ar = arvif->ar;
enum nl80211_band band; enum nl80211_band band;
@ -7060,7 +7060,7 @@ static void ath10k_offset_tsf(struct ieee80211_hw *hw,
struct ieee80211_vif *vif, s64 tsf_offset) struct ieee80211_vif *vif, s64 tsf_offset)
{ {
struct ath10k *ar = hw->priv; struct ath10k *ar = hw->priv;
struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); struct ath10k_vif *arvif = (void *)vif->drv_priv;
u32 offset, vdev_param; u32 offset, vdev_param;
int ret; int ret;
@ -7085,7 +7085,7 @@ static int ath10k_ampdu_action(struct ieee80211_hw *hw,
struct ieee80211_ampdu_params *params) struct ieee80211_ampdu_params *params)
{ {
struct ath10k *ar = hw->priv; struct ath10k *ar = hw->priv;
struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); struct ath10k_vif *arvif = (void *)vif->drv_priv;
struct ieee80211_sta *sta = params->sta; struct ieee80211_sta *sta = params->sta;
enum ieee80211_ampdu_mlme_action action = params->action; enum ieee80211_ampdu_mlme_action action = params->action;
u16 tid = params->tid; u16 tid = params->tid;
@ -7183,7 +7183,7 @@ ath10k_mac_update_vif_chan(struct ath10k *ar,
ath10k_monitor_stop(ar); ath10k_monitor_stop(ar);
for (i = 0; i < n_vifs; i++) { for (i = 0; i < n_vifs; i++) {
arvif = ath10k_vif_to_arvif(vifs[i].vif); arvif = (void *)vifs[i].vif->drv_priv;
ath10k_dbg(ar, ATH10K_DBG_MAC, ath10k_dbg(ar, ATH10K_DBG_MAC,
"mac chanctx switch vdev_id %i freq %hu->%hu width %d->%d\n", "mac chanctx switch vdev_id %i freq %hu->%hu width %d->%d\n",
@ -7216,7 +7216,7 @@ ath10k_mac_update_vif_chan(struct ath10k *ar,
spin_unlock_bh(&ar->data_lock); spin_unlock_bh(&ar->data_lock);
for (i = 0; i < n_vifs; i++) { for (i = 0; i < n_vifs; i++) {
arvif = ath10k_vif_to_arvif(vifs[i].vif); arvif = (void *)vifs[i].vif->drv_priv;
if (WARN_ON(!arvif->is_started)) if (WARN_ON(!arvif->is_started))
continue; continue;
@ -7873,7 +7873,7 @@ static void ath10k_get_arvif_iter(void *data, u8 *mac,
struct ieee80211_vif *vif) struct ieee80211_vif *vif)
{ {
struct ath10k_vif_iter *arvif_iter = data; struct ath10k_vif_iter *arvif_iter = data;
struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); struct ath10k_vif *arvif = (void *)vif->drv_priv;
if (arvif->vdev_id == arvif_iter->vdev_id) if (arvif->vdev_id == arvif_iter->vdev_id)
arvif_iter->arvif = arvif; arvif_iter->arvif = arvif;

View File

@ -83,17 +83,12 @@ struct ieee80211_txq *ath10k_mac_txq_lookup(struct ath10k *ar,
u8 tid); u8 tid);
int ath10k_mac_ext_resource_config(struct ath10k *ar, u32 val); int ath10k_mac_ext_resource_config(struct ath10k *ar, u32 val);
static inline struct ath10k_vif *ath10k_vif_to_arvif(struct ieee80211_vif *vif)
{
return (struct ath10k_vif *)vif->drv_priv;
}
static inline void ath10k_tx_h_seq_no(struct ieee80211_vif *vif, static inline void ath10k_tx_h_seq_no(struct ieee80211_vif *vif,
struct sk_buff *skb) struct sk_buff *skb)
{ {
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data; struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); struct ath10k_vif *arvif = (void *)vif->drv_priv;
if (info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) { if (info->flags & IEEE80211_TX_CTL_ASSIGN_SEQ) {
if (arvif->tx_seq_no == 0) if (arvif->tx_seq_no == 0)

View File

@ -132,7 +132,7 @@ struct ath10k_p2p_noa_arg {
static void ath10k_p2p_noa_update_vdev_iter(void *data, u8 *mac, static void ath10k_p2p_noa_update_vdev_iter(void *data, u8 *mac,
struct ieee80211_vif *vif) struct ieee80211_vif *vif)
{ {
struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); struct ath10k_vif *arvif = (void *)vif->drv_priv;
struct ath10k_p2p_noa_arg *arg = data; struct ath10k_p2p_noa_arg *arg = data;
if (arvif->vdev_id != arg->vdev_id) if (arvif->vdev_id != arg->vdev_id)

View File

@ -1651,6 +1651,8 @@ static int ath10k_pci_hif_start(struct ath10k *ar)
ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot hif start\n"); ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot hif start\n");
napi_enable(&ar->napi);
ath10k_pci_irq_enable(ar); ath10k_pci_irq_enable(ar);
ath10k_pci_rx_post(ar); ath10k_pci_rx_post(ar);
@ -2535,7 +2537,6 @@ static int ath10k_pci_hif_power_up(struct ath10k *ar)
ath10k_err(ar, "could not wake up target CPU: %d\n", ret); ath10k_err(ar, "could not wake up target CPU: %d\n", ret);
goto err_ce; goto err_ce;
} }
napi_enable(&ar->napi);
return 0; return 0;

View File

@ -278,7 +278,7 @@ static ssize_t read_file_spec_scan_ctl(struct file *file, char __user *user_buf,
{ {
struct ath10k *ar = file->private_data; struct ath10k *ar = file->private_data;
char *mode = ""; char *mode = "";
unsigned int len; size_t len;
enum ath10k_spectral_mode spectral_mode; enum ath10k_spectral_mode spectral_mode;
mutex_lock(&ar->conf_mutex); mutex_lock(&ar->conf_mutex);
@ -370,7 +370,7 @@ static ssize_t read_file_spectral_count(struct file *file,
{ {
struct ath10k *ar = file->private_data; struct ath10k *ar = file->private_data;
char buf[32]; char buf[32];
unsigned int len; size_t len;
u8 spectral_count; u8 spectral_count;
mutex_lock(&ar->conf_mutex); mutex_lock(&ar->conf_mutex);
@ -422,7 +422,8 @@ static ssize_t read_file_spectral_bins(struct file *file,
{ {
struct ath10k *ar = file->private_data; struct ath10k *ar = file->private_data;
char buf[32]; char buf[32];
unsigned int len, bins, fft_size, bin_scale; unsigned int bins, fft_size, bin_scale;
size_t len;
mutex_lock(&ar->conf_mutex); mutex_lock(&ar->conf_mutex);

View File

@ -150,7 +150,10 @@ static int ath10k_tm_fetch_utf_firmware_api_1(struct ath10k *ar,
ar->hw_params.fw.dir, ATH10K_FW_UTF_FILE); ar->hw_params.fw.dir, ATH10K_FW_UTF_FILE);
/* load utf firmware image */ /* load utf firmware image */
ret = request_firmware(&fw_file->firmware, filename, ar->dev); ret = request_firmware_direct(&fw_file->firmware, filename, ar->dev);
ath10k_dbg(ar, ATH10K_DBG_TESTMODE, "testmode fw request '%s': %d\n",
filename, ret);
if (ret) { if (ret) {
ath10k_warn(ar, "failed to retrieve utf firmware '%s': %d\n", ath10k_warn(ar, "failed to retrieve utf firmware '%s': %d\n",
filename, ret); filename, ret);

View File

@ -1779,7 +1779,7 @@ static void ath10k_wmi_tx_beacon_nowait(struct ath10k_vif *arvif)
static void ath10k_wmi_tx_beacons_iter(void *data, u8 *mac, static void ath10k_wmi_tx_beacons_iter(void *data, u8 *mac,
struct ieee80211_vif *vif) struct ieee80211_vif *vif)
{ {
struct ath10k_vif *arvif = ath10k_vif_to_arvif(vif); struct ath10k_vif *arvif = (void *)vif->drv_priv;
ath10k_wmi_tx_beacon_nowait(arvif); ath10k_wmi_tx_beacon_nowait(arvif);
} }

View File

@ -75,7 +75,7 @@ struct wmi_cmd_hdr {
/* /*
* There is no signed version of __le32, so for a temporary solution come * There is no signed version of __le32, so for a temporary solution come
* up with our own version. The idea is from fs/ntfs/types.h. * up with our own version. The idea is from fs/ntfs/endian.h.
* *
* Use a_ prefix so that it doesn't conflict if we get proper support to * Use a_ prefix so that it doesn't conflict if we get proper support to
* linux/types.h. * linux/types.h.

View File

@ -641,7 +641,6 @@ struct ath6kl_vif {
u32 txe_intvl; u32 txe_intvl;
u16 bg_scan_period; u16 bg_scan_period;
u8 assoc_bss_dtim_period; u8 assoc_bss_dtim_period;
struct net_device_stats net_stats;
struct target_stats target_stats; struct target_stats target_stats;
struct wmi_connect_cmd profile; struct wmi_connect_cmd profile;
u16 rsn_capab; u16 rsn_capab;

View File

@ -1113,13 +1113,6 @@ static int ath6kl_close(struct net_device *dev)
return 0; return 0;
} }
static struct net_device_stats *ath6kl_get_stats(struct net_device *dev)
{
struct ath6kl_vif *vif = netdev_priv(dev);
return &vif->net_stats;
}
static int ath6kl_set_features(struct net_device *dev, static int ath6kl_set_features(struct net_device *dev,
netdev_features_t features) netdev_features_t features)
{ {
@ -1285,7 +1278,6 @@ static const struct net_device_ops ath6kl_netdev_ops = {
.ndo_open = ath6kl_open, .ndo_open = ath6kl_open,
.ndo_stop = ath6kl_close, .ndo_stop = ath6kl_close,
.ndo_start_xmit = ath6kl_data_tx, .ndo_start_xmit = ath6kl_data_tx,
.ndo_get_stats = ath6kl_get_stats,
.ndo_set_features = ath6kl_set_features, .ndo_set_features = ath6kl_set_features,
.ndo_set_rx_mode = ath6kl_set_multicast_list, .ndo_set_rx_mode = ath6kl_set_multicast_list,
}; };

View File

@ -405,7 +405,7 @@ int ath6kl_data_tx(struct sk_buff *skb, struct net_device *dev)
skb = skb_realloc_headroom(skb, dev->needed_headroom); skb = skb_realloc_headroom(skb, dev->needed_headroom);
kfree_skb(tmp_skb); kfree_skb(tmp_skb);
if (skb == NULL) { if (skb == NULL) {
vif->net_stats.tx_dropped++; dev->stats.tx_dropped++;
return 0; return 0;
} }
} }
@ -520,8 +520,8 @@ int ath6kl_data_tx(struct sk_buff *skb, struct net_device *dev)
fail_tx: fail_tx:
dev_kfree_skb(skb); dev_kfree_skb(skb);
vif->net_stats.tx_dropped++; dev->stats.tx_dropped++;
vif->net_stats.tx_aborted_errors++; dev->stats.tx_aborted_errors++;
return 0; return 0;
} }
@ -767,7 +767,7 @@ void ath6kl_tx_complete(struct htc_target *target,
/* a packet was flushed */ /* a packet was flushed */
flushing[if_idx] = true; flushing[if_idx] = true;
vif->net_stats.tx_errors++; vif->ndev->stats.tx_errors++;
if (status != -ENOSPC && status != -ECANCELED) if (status != -ENOSPC && status != -ECANCELED)
ath6kl_warn("tx complete error: %d\n", status); ath6kl_warn("tx complete error: %d\n", status);
@ -783,8 +783,8 @@ void ath6kl_tx_complete(struct htc_target *target,
eid, "OK"); eid, "OK");
flushing[if_idx] = false; flushing[if_idx] = false;
vif->net_stats.tx_packets++; vif->ndev->stats.tx_packets++;
vif->net_stats.tx_bytes += skb->len; vif->ndev->stats.tx_bytes += skb->len;
} }
ath6kl_tx_clear_node_map(vif, eid, map_no); ath6kl_tx_clear_node_map(vif, eid, map_no);
@ -1365,8 +1365,8 @@ void ath6kl_rx(struct htc_target *target, struct htc_packet *packet)
*/ */
spin_lock_bh(&vif->if_lock); spin_lock_bh(&vif->if_lock);
vif->net_stats.rx_packets++; vif->ndev->stats.rx_packets++;
vif->net_stats.rx_bytes += packet->act_len; vif->ndev->stats.rx_bytes += packet->act_len;
spin_unlock_bh(&vif->if_lock); spin_unlock_bh(&vif->if_lock);
@ -1395,8 +1395,8 @@ void ath6kl_rx(struct htc_target *target, struct htc_packet *packet)
((packet->act_len < min_hdr_len) || ((packet->act_len < min_hdr_len) ||
(packet->act_len > WMI_MAX_AMSDU_RX_DATA_FRAME_LENGTH))) { (packet->act_len > WMI_MAX_AMSDU_RX_DATA_FRAME_LENGTH))) {
ath6kl_info("frame len is too short or too long\n"); ath6kl_info("frame len is too short or too long\n");
vif->net_stats.rx_errors++; vif->ndev->stats.rx_errors++;
vif->net_stats.rx_length_errors++; vif->ndev->stats.rx_length_errors++;
dev_kfree_skb(skb); dev_kfree_skb(skb);
return; return;
} }
@ -1619,7 +1619,7 @@ void ath6kl_rx(struct htc_target *target, struct htc_packet *packet)
return; return;
} }
} else if (!is_broadcast_ether_addr(datap->h_dest)) { } else if (!is_broadcast_ether_addr(datap->h_dest)) {
vif->net_stats.multicast++; vif->ndev->stats.multicast++;
} }
ath6kl_deliver_frames_to_nw_stack(vif->ndev, skb); ath6kl_deliver_frames_to_nw_stack(vif->ndev, skb);

View File

@ -75,13 +75,13 @@
#define AR9300_OTP_BASE \ #define AR9300_OTP_BASE \
((AR_SREV_9340(ah) || AR_SREV_9550(ah)) ? 0x30000 : 0x14000) ((AR_SREV_9340(ah) || AR_SREV_9550(ah)) ? 0x30000 : 0x14000)
#define AR9300_OTP_STATUS \ #define AR9300_OTP_STATUS \
((AR_SREV_9340(ah) || AR_SREV_9550(ah)) ? 0x30018 : 0x15f18) ((AR_SREV_9340(ah) || AR_SREV_9550(ah)) ? 0x31018 : 0x15f18)
#define AR9300_OTP_STATUS_TYPE 0x7 #define AR9300_OTP_STATUS_TYPE 0x7
#define AR9300_OTP_STATUS_VALID 0x4 #define AR9300_OTP_STATUS_VALID 0x4
#define AR9300_OTP_STATUS_ACCESS_BUSY 0x2 #define AR9300_OTP_STATUS_ACCESS_BUSY 0x2
#define AR9300_OTP_STATUS_SM_BUSY 0x1 #define AR9300_OTP_STATUS_SM_BUSY 0x1
#define AR9300_OTP_READ_DATA \ #define AR9300_OTP_READ_DATA \
((AR_SREV_9340(ah) || AR_SREV_9550(ah)) ? 0x3001c : 0x15f1c) ((AR_SREV_9340(ah) || AR_SREV_9550(ah)) ? 0x3101c : 0x15f1c)
enum targetPowerHTRates { enum targetPowerHTRates {
HT_TARGET_RATE_0_8_16, HT_TARGET_RATE_0_8_16,

View File

@ -482,7 +482,7 @@ ath_cmn_is_fft_buf_full(struct ath_spec_scan_priv *spec_priv)
struct rchan *rc = spec_priv->rfs_chan_spec_scan; struct rchan *rc = spec_priv->rfs_chan_spec_scan;
for_each_online_cpu(i) for_each_online_cpu(i)
ret += relay_buf_full(rc->buf[i]); ret += relay_buf_full(*per_cpu_ptr(rc->buf, i));
i = num_online_cpus(); i = num_online_cpus();

View File

@ -699,51 +699,31 @@ static bool bf_is_ampdu_not_probing(struct ath_buf *bf)
return bf_isampdu(bf) && !(info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE); return bf_isampdu(bf) && !(info->flags & IEEE80211_TX_CTL_RATE_CTRL_PROBE);
} }
static void ath_tx_count_airtime(struct ath_softc *sc, struct ath_txq *txq, static void ath_tx_count_airtime(struct ath_softc *sc, struct ath_node *an,
struct ath_buf *bf, struct ath_tx_status *ts) struct ath_atx_tid *tid, struct ath_buf *bf,
struct ath_tx_status *ts)
{ {
struct ath_node *an; struct ath_txq *txq = tid->txq;
struct ath_acq *acq = &sc->cur_chan->acq[txq->mac80211_qnum];
struct sk_buff *skb;
struct ieee80211_hdr *hdr;
struct ieee80211_hw *hw = sc->hw;
struct ieee80211_tx_rate rates[4];
struct ieee80211_sta *sta;
int i;
u32 airtime = 0; u32 airtime = 0;
int i;
skb = bf->bf_mpdu;
if(!skb)
return;
hdr = (struct ieee80211_hdr *)skb->data;
memcpy(rates, bf->rates, sizeof(rates));
rcu_read_lock();
sta = ieee80211_find_sta_by_ifaddr(hw, hdr->addr1, hdr->addr2);
if(!sta)
goto exit;
an = (struct ath_node *) sta->drv_priv;
airtime += ts->duration * (ts->ts_longretry + 1); airtime += ts->duration * (ts->ts_longretry + 1);
for(i = 0; i < ts->ts_rateindex; i++) {
int rate_dur = ath9k_hw_get_duration(sc->sc_ah, bf->bf_desc, i);
airtime += rate_dur * bf->rates[i].count;
}
for(i=0; i < ts->ts_rateindex; i++) if (sc->airtime_flags & AIRTIME_USE_TX) {
airtime += ath9k_hw_get_duration(sc->sc_ah, bf->bf_desc, i) * rates[i].count; int q = txq->mac80211_qnum;
struct ath_acq *acq = &sc->cur_chan->acq[q];
if (!!(sc->airtime_flags & AIRTIME_USE_TX)) {
spin_lock_bh(&acq->lock); spin_lock_bh(&acq->lock);
an->airtime_deficit[txq->mac80211_qnum] -= airtime; an->airtime_deficit[q] -= airtime;
if (an->airtime_deficit[txq->mac80211_qnum] <= 0) if (an->airtime_deficit[q] <= 0)
__ath_tx_queue_tid(sc, ath_get_skb_tid(sc, an, skb)); __ath_tx_queue_tid(sc, tid);
spin_unlock_bh(&acq->lock); spin_unlock_bh(&acq->lock);
} }
ath_debug_airtime(sc, an, 0, airtime); ath_debug_airtime(sc, an, 0, airtime);
exit:
rcu_read_unlock();
} }
static void ath_tx_process_buffer(struct ath_softc *sc, struct ath_txq *txq, static void ath_tx_process_buffer(struct ath_softc *sc, struct ath_txq *txq,
@ -767,13 +747,13 @@ static void ath_tx_process_buffer(struct ath_softc *sc, struct ath_txq *txq,
ts->duration = ath9k_hw_get_duration(sc->sc_ah, bf->bf_desc, ts->duration = ath9k_hw_get_duration(sc->sc_ah, bf->bf_desc,
ts->ts_rateindex); ts->ts_rateindex);
ath_tx_count_airtime(sc, txq, bf, ts);
hdr = (struct ieee80211_hdr *) bf->bf_mpdu->data; hdr = (struct ieee80211_hdr *) bf->bf_mpdu->data;
sta = ieee80211_find_sta_by_ifaddr(hw, hdr->addr1, hdr->addr2); sta = ieee80211_find_sta_by_ifaddr(hw, hdr->addr1, hdr->addr2);
if (sta) { if (sta) {
struct ath_node *an = (struct ath_node *)sta->drv_priv; struct ath_node *an = (struct ath_node *)sta->drv_priv;
tid = ath_get_skb_tid(sc, an, bf->bf_mpdu); tid = ath_get_skb_tid(sc, an, bf->bf_mpdu);
ath_tx_count_airtime(sc, an, tid, bf, ts);
if (ts->ts_status & (ATH9K_TXERR_FILT | ATH9K_TXERR_XRETRY)) if (ts->ts_status & (ATH9K_TXERR_FILT | ATH9K_TXERR_XRETRY))
tid->clear_ps_filter = true; tid->clear_ps_filter = true;
} }