Merge remote-tracking branch 'wireless/main' into wireless-next
Merge wireless/main to get the rx.link fix, which is needed for further work in this area. Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
Коммит
b38d15294f
|
@ -2403,7 +2403,7 @@ il4965_rs_fill_link_cmd(struct il_priv *il, struct il_lq_sta *lq_sta,
|
|||
/* Repeat initial/next rate.
|
||||
* For legacy IL_NUMBER_TRY == 1, this loop will not execute.
|
||||
* For HT IL_HT_NUMBER_TRY == 3, this executes twice. */
|
||||
while (repeat_rate > 0) {
|
||||
while (repeat_rate > 0 && idx < (LINK_QUAL_MAX_RETRY_NUM - 1)) {
|
||||
if (is_legacy(tbl_type.lq_type)) {
|
||||
if (ant_toggle_cnt < NUM_TRY_BEFORE_ANT_TOGGLE)
|
||||
ant_toggle_cnt++;
|
||||
|
@ -2422,8 +2422,6 @@ il4965_rs_fill_link_cmd(struct il_priv *il, struct il_lq_sta *lq_sta,
|
|||
cpu_to_le32(new_rate);
|
||||
repeat_rate--;
|
||||
idx++;
|
||||
if (idx >= LINK_QUAL_MAX_RETRY_NUM)
|
||||
goto out;
|
||||
}
|
||||
|
||||
il4965_rs_get_tbl_info_from_mcs(new_rate, lq_sta->band,
|
||||
|
@ -2468,7 +2466,6 @@ il4965_rs_fill_link_cmd(struct il_priv *il, struct il_lq_sta *lq_sta,
|
|||
repeat_rate--;
|
||||
}
|
||||
|
||||
out:
|
||||
lq_cmd->agg_params.agg_frame_cnt_limit = LINK_QUAL_AGG_FRAME_LIMIT_DEF;
|
||||
lq_cmd->agg_params.agg_dis_start_th = LINK_QUAL_AGG_DISABLE_START_DEF;
|
||||
|
||||
|
|
|
@ -5422,6 +5422,10 @@ static int hwsim_virtio_handle_cmd(struct sk_buff *skb)
|
|||
|
||||
nlh = nlmsg_hdr(skb);
|
||||
gnlh = nlmsg_data(nlh);
|
||||
|
||||
if (skb->len < nlh->nlmsg_len)
|
||||
return -EINVAL;
|
||||
|
||||
err = genlmsg_parse(nlh, &hwsim_genl_family, tb, HWSIM_ATTR_MAX,
|
||||
hwsim_genl_policy, NULL);
|
||||
if (err) {
|
||||
|
@ -5464,7 +5468,8 @@ static void hwsim_virtio_rx_work(struct work_struct *work)
|
|||
spin_unlock_irqrestore(&hwsim_virtio_lock, flags);
|
||||
|
||||
skb->data = skb->head;
|
||||
skb_set_tail_pointer(skb, len);
|
||||
skb_reset_tail_pointer(skb);
|
||||
skb_put(skb, len);
|
||||
hwsim_virtio_handle_cmd(skb);
|
||||
|
||||
spin_lock_irqsave(&hwsim_virtio_lock, flags);
|
||||
|
|
|
@ -261,7 +261,7 @@ int mt7921e_mac_reset(struct mt7921_dev *dev)
|
|||
|
||||
err = mt7921e_driver_own(dev);
|
||||
if (err)
|
||||
return err;
|
||||
goto out;
|
||||
|
||||
err = mt7921_run_firmware(dev);
|
||||
if (err)
|
||||
|
|
|
@ -245,6 +245,7 @@ struct wilc {
|
|||
u8 *rx_buffer;
|
||||
u32 rx_buffer_offset;
|
||||
u8 *tx_buffer;
|
||||
u32 *vmm_table;
|
||||
|
||||
struct txq_handle txq[NQUEUES];
|
||||
int txq_entries;
|
||||
|
|
|
@ -28,6 +28,7 @@ struct wilc_sdio {
|
|||
u32 block_size;
|
||||
bool isinit;
|
||||
int has_thrpt_enh3;
|
||||
u8 *cmd53_buf;
|
||||
};
|
||||
|
||||
struct sdio_cmd52 {
|
||||
|
@ -47,6 +48,7 @@ struct sdio_cmd53 {
|
|||
u32 count: 9;
|
||||
u8 *buffer;
|
||||
u32 block_size;
|
||||
bool use_global_buf;
|
||||
};
|
||||
|
||||
static const struct wilc_hif_func wilc_hif_sdio;
|
||||
|
@ -91,6 +93,8 @@ static int wilc_sdio_cmd53(struct wilc *wilc, struct sdio_cmd53 *cmd)
|
|||
{
|
||||
struct sdio_func *func = container_of(wilc->dev, struct sdio_func, dev);
|
||||
int size, ret;
|
||||
struct wilc_sdio *sdio_priv = wilc->bus_data;
|
||||
u8 *buf = cmd->buffer;
|
||||
|
||||
sdio_claim_host(func);
|
||||
|
||||
|
@ -101,12 +105,23 @@ static int wilc_sdio_cmd53(struct wilc *wilc, struct sdio_cmd53 *cmd)
|
|||
else
|
||||
size = cmd->count;
|
||||
|
||||
if (cmd->use_global_buf) {
|
||||
if (size > sizeof(u32))
|
||||
return -EINVAL;
|
||||
|
||||
buf = sdio_priv->cmd53_buf;
|
||||
}
|
||||
|
||||
if (cmd->read_write) { /* write */
|
||||
ret = sdio_memcpy_toio(func, cmd->address,
|
||||
(void *)cmd->buffer, size);
|
||||
if (cmd->use_global_buf)
|
||||
memcpy(buf, cmd->buffer, size);
|
||||
|
||||
ret = sdio_memcpy_toio(func, cmd->address, buf, size);
|
||||
} else { /* read */
|
||||
ret = sdio_memcpy_fromio(func, (void *)cmd->buffer,
|
||||
cmd->address, size);
|
||||
ret = sdio_memcpy_fromio(func, buf, cmd->address, size);
|
||||
|
||||
if (cmd->use_global_buf)
|
||||
memcpy(cmd->buffer, buf, size);
|
||||
}
|
||||
|
||||
sdio_release_host(func);
|
||||
|
@ -128,6 +143,12 @@ static int wilc_sdio_probe(struct sdio_func *func,
|
|||
if (!sdio_priv)
|
||||
return -ENOMEM;
|
||||
|
||||
sdio_priv->cmd53_buf = kzalloc(sizeof(u32), GFP_KERNEL);
|
||||
if (!sdio_priv->cmd53_buf) {
|
||||
ret = -ENOMEM;
|
||||
goto free;
|
||||
}
|
||||
|
||||
ret = wilc_cfg80211_init(&wilc, &func->dev, WILC_HIF_SDIO,
|
||||
&wilc_hif_sdio);
|
||||
if (ret)
|
||||
|
@ -161,6 +182,7 @@ dispose_irq:
|
|||
irq_dispose_mapping(wilc->dev_irq_num);
|
||||
wilc_netdev_cleanup(wilc);
|
||||
free:
|
||||
kfree(sdio_priv->cmd53_buf);
|
||||
kfree(sdio_priv);
|
||||
return ret;
|
||||
}
|
||||
|
@ -172,6 +194,7 @@ static void wilc_sdio_remove(struct sdio_func *func)
|
|||
|
||||
clk_disable_unprepare(wilc->rtc_clk);
|
||||
wilc_netdev_cleanup(wilc);
|
||||
kfree(sdio_priv->cmd53_buf);
|
||||
kfree(sdio_priv);
|
||||
}
|
||||
|
||||
|
@ -375,8 +398,9 @@ static int wilc_sdio_write_reg(struct wilc *wilc, u32 addr, u32 data)
|
|||
cmd.address = WILC_SDIO_FBR_DATA_REG;
|
||||
cmd.block_mode = 0;
|
||||
cmd.increment = 1;
|
||||
cmd.count = 4;
|
||||
cmd.count = sizeof(u32);
|
||||
cmd.buffer = (u8 *)&data;
|
||||
cmd.use_global_buf = true;
|
||||
cmd.block_size = sdio_priv->block_size;
|
||||
ret = wilc_sdio_cmd53(wilc, &cmd);
|
||||
if (ret)
|
||||
|
@ -414,6 +438,7 @@ static int wilc_sdio_write(struct wilc *wilc, u32 addr, u8 *buf, u32 size)
|
|||
nblk = size / block_size;
|
||||
nleft = size % block_size;
|
||||
|
||||
cmd.use_global_buf = false;
|
||||
if (nblk > 0) {
|
||||
cmd.block_mode = 1;
|
||||
cmd.increment = 1;
|
||||
|
@ -492,8 +517,9 @@ static int wilc_sdio_read_reg(struct wilc *wilc, u32 addr, u32 *data)
|
|||
cmd.address = WILC_SDIO_FBR_DATA_REG;
|
||||
cmd.block_mode = 0;
|
||||
cmd.increment = 1;
|
||||
cmd.count = 4;
|
||||
cmd.count = sizeof(u32);
|
||||
cmd.buffer = (u8 *)data;
|
||||
cmd.use_global_buf = true;
|
||||
|
||||
cmd.block_size = sdio_priv->block_size;
|
||||
ret = wilc_sdio_cmd53(wilc, &cmd);
|
||||
|
@ -535,6 +561,7 @@ static int wilc_sdio_read(struct wilc *wilc, u32 addr, u8 *buf, u32 size)
|
|||
nblk = size / block_size;
|
||||
nleft = size % block_size;
|
||||
|
||||
cmd.use_global_buf = false;
|
||||
if (nblk > 0) {
|
||||
cmd.block_mode = 1;
|
||||
cmd.increment = 1;
|
||||
|
|
|
@ -714,7 +714,7 @@ int wilc_wlan_handle_txq(struct wilc *wilc, u32 *txq_count)
|
|||
int ret = 0;
|
||||
int counter;
|
||||
int timeout;
|
||||
u32 vmm_table[WILC_VMM_TBL_SIZE];
|
||||
u32 *vmm_table = wilc->vmm_table;
|
||||
u8 ac_pkt_num_to_chip[NQUEUES] = {0, 0, 0, 0};
|
||||
const struct wilc_hif_func *func;
|
||||
int srcu_idx;
|
||||
|
@ -1252,6 +1252,8 @@ void wilc_wlan_cleanup(struct net_device *dev)
|
|||
while ((rqe = wilc_wlan_rxq_remove(wilc)))
|
||||
kfree(rqe);
|
||||
|
||||
kfree(wilc->vmm_table);
|
||||
wilc->vmm_table = NULL;
|
||||
kfree(wilc->rx_buffer);
|
||||
wilc->rx_buffer = NULL;
|
||||
kfree(wilc->tx_buffer);
|
||||
|
@ -1489,6 +1491,14 @@ int wilc_wlan_init(struct net_device *dev)
|
|||
goto fail;
|
||||
}
|
||||
|
||||
if (!wilc->vmm_table)
|
||||
wilc->vmm_table = kzalloc(WILC_VMM_TBL_SIZE, GFP_KERNEL);
|
||||
|
||||
if (!wilc->vmm_table) {
|
||||
ret = -ENOBUFS;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (!wilc->tx_buffer)
|
||||
wilc->tx_buffer = kmalloc(WILC_TX_BUFF_SIZE, GFP_KERNEL);
|
||||
|
||||
|
@ -1513,7 +1523,8 @@ int wilc_wlan_init(struct net_device *dev)
|
|||
return 0;
|
||||
|
||||
fail:
|
||||
|
||||
kfree(wilc->vmm_table);
|
||||
wilc->vmm_table = NULL;
|
||||
kfree(wilc->rx_buffer);
|
||||
wilc->rx_buffer = NULL;
|
||||
kfree(wilc->tx_buffer);
|
||||
|
|
|
@ -310,9 +310,11 @@ static inline u16 ieee80211_sn_sub(u16 sn1, u16 sn2)
|
|||
struct ieee80211_hdr {
|
||||
__le16 frame_control;
|
||||
__le16 duration_id;
|
||||
u8 addr1[ETH_ALEN];
|
||||
u8 addr2[ETH_ALEN];
|
||||
u8 addr3[ETH_ALEN];
|
||||
struct_group(addrs,
|
||||
u8 addr1[ETH_ALEN];
|
||||
u8 addr2[ETH_ALEN];
|
||||
u8 addr3[ETH_ALEN];
|
||||
);
|
||||
__le16 seq_ctrl;
|
||||
u8 addr4[ETH_ALEN];
|
||||
} __packed __aligned(2);
|
||||
|
|
|
@ -3443,11 +3443,11 @@ static void ieee80211_destroy_auth_data(struct ieee80211_sub_if_data *sdata,
|
|||
ieee80211_link_info_change_notify(sdata, &sdata->deflink,
|
||||
BSS_CHANGED_BSSID);
|
||||
sdata->u.mgd.flags = 0;
|
||||
|
||||
mutex_lock(&sdata->local->mtx);
|
||||
ieee80211_link_release_channel(&sdata->deflink);
|
||||
mutex_unlock(&sdata->local->mtx);
|
||||
|
||||
ieee80211_vif_set_links(sdata, 0);
|
||||
mutex_unlock(&sdata->local->mtx);
|
||||
}
|
||||
|
||||
cfg80211_put_bss(sdata->local->hw.wiphy, auth_data->bss);
|
||||
|
@ -3485,10 +3485,6 @@ static void ieee80211_destroy_assoc_data(struct ieee80211_sub_if_data *sdata,
|
|||
sdata->u.mgd.flags = 0;
|
||||
sdata->vif.bss_conf.mu_mimo_owner = false;
|
||||
|
||||
mutex_lock(&sdata->local->mtx);
|
||||
ieee80211_link_release_channel(&sdata->deflink);
|
||||
mutex_unlock(&sdata->local->mtx);
|
||||
|
||||
if (status != ASSOC_REJECTED) {
|
||||
struct cfg80211_assoc_failure data = {
|
||||
.timeout = status == ASSOC_TIMEOUT,
|
||||
|
@ -3507,7 +3503,10 @@ static void ieee80211_destroy_assoc_data(struct ieee80211_sub_if_data *sdata,
|
|||
cfg80211_assoc_failure(sdata->dev, &data);
|
||||
}
|
||||
|
||||
mutex_lock(&sdata->local->mtx);
|
||||
ieee80211_link_release_channel(&sdata->deflink);
|
||||
ieee80211_vif_set_links(sdata, 0);
|
||||
mutex_unlock(&sdata->local->mtx);
|
||||
}
|
||||
|
||||
kfree(assoc_data);
|
||||
|
@ -6562,6 +6561,7 @@ static int ieee80211_prep_connection(struct ieee80211_sub_if_data *sdata,
|
|||
return 0;
|
||||
|
||||
out_err:
|
||||
ieee80211_link_release_channel(&sdata->deflink);
|
||||
ieee80211_vif_set_links(sdata, 0);
|
||||
return err;
|
||||
}
|
||||
|
|
|
@ -4084,6 +4084,7 @@ void ieee80211_release_reorder_timeout(struct sta_info *sta, int tid)
|
|||
.link_id = -1,
|
||||
};
|
||||
struct tid_ampdu_rx *tid_agg_rx;
|
||||
u8 link_id;
|
||||
|
||||
tid_agg_rx = rcu_dereference(sta->ampdu_mlme.tid_rx[tid]);
|
||||
if (!tid_agg_rx)
|
||||
|
@ -4103,6 +4104,9 @@ void ieee80211_release_reorder_timeout(struct sta_info *sta, int tid)
|
|||
};
|
||||
drv_event_callback(rx.local, rx.sdata, &event);
|
||||
}
|
||||
/* FIXME: statistics won't be right with this */
|
||||
link_id = sta->sta.valid_links ? ffs(sta->sta.valid_links) - 1 : 0;
|
||||
rx.link = rcu_dereference(sta->sdata->link[link_id]);
|
||||
|
||||
ieee80211_rx_handlers(&rx, &frames);
|
||||
}
|
||||
|
|
|
@ -351,7 +351,7 @@ static u8 ccmp_gcmp_aad(struct sk_buff *skb, u8 *aad)
|
|||
* FC | A1 | A2 | A3 | SC | [A4] | [QC] */
|
||||
put_unaligned_be16(len_a, &aad[0]);
|
||||
put_unaligned(mask_fc, (__le16 *)&aad[2]);
|
||||
memcpy(&aad[4], &hdr->addr1, 3 * ETH_ALEN);
|
||||
memcpy(&aad[4], &hdr->addrs, 3 * ETH_ALEN);
|
||||
|
||||
/* Mask Seq#, leave Frag# */
|
||||
aad[22] = *((u8 *) &hdr->seq_ctrl) & 0x0f;
|
||||
|
@ -792,7 +792,7 @@ static void bip_aad(struct sk_buff *skb, u8 *aad)
|
|||
IEEE80211_FCTL_MOREDATA);
|
||||
put_unaligned(mask_fc, (__le16 *) &aad[0]);
|
||||
/* A1 || A2 || A3 */
|
||||
memcpy(aad + 2, &hdr->addr1, 3 * ETH_ALEN);
|
||||
memcpy(aad + 2, &hdr->addrs, 3 * ETH_ALEN);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -136,7 +136,7 @@ static int ccmp_init_iv_and_aad(const struct ieee80211_hdr *hdr,
|
|||
pos = (u8 *) hdr;
|
||||
aad[0] = pos[0] & 0x8f;
|
||||
aad[1] = pos[1] & 0xc7;
|
||||
memcpy(aad + 2, hdr->addr1, 3 * ETH_ALEN);
|
||||
memcpy(aad + 2, &hdr->addrs, 3 * ETH_ALEN);
|
||||
pos = (u8 *) & hdr->seq_ctrl;
|
||||
aad[20] = pos[0] & 0x0f;
|
||||
aad[21] = 0; /* all bits masked */
|
||||
|
|
Загрузка…
Ссылка в новой задаче