ath10k: replace vdev_id and tid in skb cb
This prepares the driver for future ieee80211_txq and wake_tx_queue() support. Signed-off-by: Michal Kazior <michal.kazior@tieto.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
This commit is contained in:
parent
d668dbaebe
commit
609db229b4
@ -86,16 +86,16 @@ enum ath10k_skb_flags {
|
|||||||
ATH10K_SKB_F_DTIM_ZERO = BIT(1),
|
ATH10K_SKB_F_DTIM_ZERO = BIT(1),
|
||||||
ATH10K_SKB_F_DELIVER_CAB = BIT(2),
|
ATH10K_SKB_F_DELIVER_CAB = BIT(2),
|
||||||
ATH10K_SKB_F_MGMT = BIT(3),
|
ATH10K_SKB_F_MGMT = BIT(3),
|
||||||
|
ATH10K_SKB_F_QOS = BIT(4),
|
||||||
};
|
};
|
||||||
|
|
||||||
struct ath10k_skb_cb {
|
struct ath10k_skb_cb {
|
||||||
dma_addr_t paddr;
|
dma_addr_t paddr;
|
||||||
u8 flags;
|
u8 flags;
|
||||||
u8 eid;
|
u8 eid;
|
||||||
u8 vdev_id;
|
struct ieee80211_vif *vif;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
u8 tid;
|
|
||||||
struct ath10k_htt_txbuf *txbuf;
|
struct ath10k_htt_txbuf *txbuf;
|
||||||
u32 txbuf_paddr;
|
u32 txbuf_paddr;
|
||||||
} __packed htt;
|
} __packed htt;
|
||||||
|
@ -439,6 +439,35 @@ int ath10k_htt_h2t_aggr_cfg_msg(struct ath10k_htt *htt,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static u8 ath10k_htt_tx_get_vdev_id(struct ath10k *ar, struct sk_buff *skb)
|
||||||
|
{
|
||||||
|
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
||||||
|
struct ath10k_skb_cb *cb = ATH10K_SKB_CB(skb);
|
||||||
|
struct ath10k_vif *arvif = (void *)cb->vif->drv_priv;
|
||||||
|
|
||||||
|
if (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN)
|
||||||
|
return ar->scan.vdev_id;
|
||||||
|
else if (cb->vif)
|
||||||
|
return arvif->vdev_id;
|
||||||
|
else if (ar->monitor_started)
|
||||||
|
return ar->monitor_vdev_id;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static u8 ath10k_htt_tx_get_tid(struct sk_buff *skb, bool is_eth)
|
||||||
|
{
|
||||||
|
struct ieee80211_hdr *hdr = (void *)skb->data;
|
||||||
|
struct ath10k_skb_cb *cb = ATH10K_SKB_CB(skb);
|
||||||
|
|
||||||
|
if (!is_eth && ieee80211_is_mgmt(hdr->frame_control))
|
||||||
|
return HTT_DATA_TX_EXT_TID_MGMT;
|
||||||
|
else if (cb->flags & ATH10K_SKB_F_QOS)
|
||||||
|
return skb->priority % IEEE80211_QOS_CTL_TID_MASK;
|
||||||
|
else
|
||||||
|
return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
|
||||||
|
}
|
||||||
|
|
||||||
int ath10k_htt_mgmt_tx(struct ath10k_htt *htt, struct sk_buff *msdu)
|
int ath10k_htt_mgmt_tx(struct ath10k_htt *htt, struct sk_buff *msdu)
|
||||||
{
|
{
|
||||||
struct ath10k *ar = htt->ar;
|
struct ath10k *ar = htt->ar;
|
||||||
@ -446,7 +475,7 @@ int ath10k_htt_mgmt_tx(struct ath10k_htt *htt, struct sk_buff *msdu)
|
|||||||
struct sk_buff *txdesc = NULL;
|
struct sk_buff *txdesc = NULL;
|
||||||
struct htt_cmd *cmd;
|
struct htt_cmd *cmd;
|
||||||
struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(msdu);
|
struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(msdu);
|
||||||
u8 vdev_id = skb_cb->vdev_id;
|
u8 vdev_id = ath10k_htt_tx_get_vdev_id(ar, msdu);
|
||||||
int len = 0;
|
int len = 0;
|
||||||
int msdu_id = -1;
|
int msdu_id = -1;
|
||||||
int res;
|
int res;
|
||||||
@ -542,8 +571,9 @@ int ath10k_htt_tx(struct ath10k_htt *htt, enum ath10k_hw_txrx_mode txmode,
|
|||||||
struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(msdu);
|
struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(msdu);
|
||||||
struct ath10k_hif_sg_item sg_items[2];
|
struct ath10k_hif_sg_item sg_items[2];
|
||||||
struct htt_data_tx_desc_frag *frags;
|
struct htt_data_tx_desc_frag *frags;
|
||||||
u8 vdev_id = skb_cb->vdev_id;
|
bool is_eth = (txmode == ATH10K_HW_TXRX_ETHERNET);
|
||||||
u8 tid = skb_cb->htt.tid;
|
u8 vdev_id = ath10k_htt_tx_get_vdev_id(ar, msdu);
|
||||||
|
u8 tid = ath10k_htt_tx_get_tid(msdu, is_eth);
|
||||||
int prefetch_len;
|
int prefetch_len;
|
||||||
int res;
|
int res;
|
||||||
u8 flags0 = 0;
|
u8 flags0 = 0;
|
||||||
|
@ -3122,32 +3122,6 @@ void ath10k_mac_handle_tx_pause_vdev(struct ath10k *ar, u32 vdev_id,
|
|||||||
spin_unlock_bh(&ar->htt.tx_lock);
|
spin_unlock_bh(&ar->htt.tx_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static u8 ath10k_tx_h_get_tid(struct ieee80211_hdr *hdr)
|
|
||||||
{
|
|
||||||
if (ieee80211_is_mgmt(hdr->frame_control))
|
|
||||||
return HTT_DATA_TX_EXT_TID_MGMT;
|
|
||||||
|
|
||||||
if (!ieee80211_is_data_qos(hdr->frame_control))
|
|
||||||
return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
|
|
||||||
|
|
||||||
if (!is_unicast_ether_addr(ieee80211_get_DA(hdr)))
|
|
||||||
return HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
|
|
||||||
|
|
||||||
return ieee80211_get_qos_ctl(hdr)[0] & IEEE80211_QOS_CTL_TID_MASK;
|
|
||||||
}
|
|
||||||
|
|
||||||
static u8 ath10k_tx_h_get_vdev_id(struct ath10k *ar, struct ieee80211_vif *vif)
|
|
||||||
{
|
|
||||||
if (vif)
|
|
||||||
return ath10k_vif_to_arvif(vif)->vdev_id;
|
|
||||||
|
|
||||||
if (ar->monitor_started)
|
|
||||||
return ar->monitor_vdev_id;
|
|
||||||
|
|
||||||
ath10k_warn(ar, "failed to resolve vdev id\n");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static enum ath10k_hw_txrx_mode
|
static enum ath10k_hw_txrx_mode
|
||||||
ath10k_mac_tx_h_get_txmode(struct ath10k *ar,
|
ath10k_mac_tx_h_get_txmode(struct ath10k *ar,
|
||||||
struct ieee80211_vif *vif,
|
struct ieee80211_vif *vif,
|
||||||
@ -3244,7 +3218,7 @@ static void ath10k_tx_h_nwifi(struct ieee80211_hw *hw, struct sk_buff *skb)
|
|||||||
*/
|
*/
|
||||||
hdr = (void *)skb->data;
|
hdr = (void *)skb->data;
|
||||||
if (ieee80211_is_qos_nullfunc(hdr->frame_control))
|
if (ieee80211_is_qos_nullfunc(hdr->frame_control))
|
||||||
cb->htt.tid = HTT_DATA_TX_EXT_TID_NON_QOS_MCAST_BCAST;
|
cb->flags &= ~ATH10K_SKB_F_QOS;
|
||||||
|
|
||||||
hdr->frame_control &= ~__cpu_to_le16(IEEE80211_STYPE_QOS_DATA);
|
hdr->frame_control &= ~__cpu_to_le16(IEEE80211_STYPE_QOS_DATA);
|
||||||
}
|
}
|
||||||
@ -3413,9 +3387,9 @@ void ath10k_offchan_tx_work(struct work_struct *work)
|
|||||||
|
|
||||||
hdr = (struct ieee80211_hdr *)skb->data;
|
hdr = (struct ieee80211_hdr *)skb->data;
|
||||||
peer_addr = ieee80211_get_DA(hdr);
|
peer_addr = ieee80211_get_DA(hdr);
|
||||||
vdev_id = ATH10K_SKB_CB(skb)->vdev_id;
|
|
||||||
|
|
||||||
spin_lock_bh(&ar->data_lock);
|
spin_lock_bh(&ar->data_lock);
|
||||||
|
vdev_id = ar->scan.vdev_id;
|
||||||
peer = ath10k_peer_find(ar, vdev_id, peer_addr);
|
peer = ath10k_peer_find(ar, vdev_id, peer_addr);
|
||||||
spin_unlock_bh(&ar->data_lock);
|
spin_unlock_bh(&ar->data_lock);
|
||||||
|
|
||||||
@ -3692,8 +3666,10 @@ static void ath10k_tx(struct ieee80211_hw *hw,
|
|||||||
if (ieee80211_is_mgmt(hdr->frame_control))
|
if (ieee80211_is_mgmt(hdr->frame_control))
|
||||||
skb_cb->flags |= ATH10K_SKB_F_MGMT;
|
skb_cb->flags |= ATH10K_SKB_F_MGMT;
|
||||||
|
|
||||||
skb_cb->htt.tid = ath10k_tx_h_get_tid(hdr);
|
if (ieee80211_is_data_qos(hdr->frame_control))
|
||||||
skb_cb->vdev_id = ath10k_tx_h_get_vdev_id(ar, vif);
|
skb_cb->flags |= ATH10K_SKB_F_QOS;
|
||||||
|
|
||||||
|
skb_cb->vif = vif;
|
||||||
|
|
||||||
switch (txmode) {
|
switch (txmode) {
|
||||||
case ATH10K_HW_TXRX_MGMT:
|
case ATH10K_HW_TXRX_MGMT:
|
||||||
@ -3714,10 +3690,6 @@ static void ath10k_tx(struct ieee80211_hw *hw,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) {
|
if (info->flags & IEEE80211_TX_CTL_TX_OFFCHAN) {
|
||||||
spin_lock_bh(&ar->data_lock);
|
|
||||||
ATH10K_SKB_CB(skb)->vdev_id = ar->scan.vdev_id;
|
|
||||||
spin_unlock_bh(&ar->data_lock);
|
|
||||||
|
|
||||||
if (!ath10k_mac_tx_frm_has_freq(ar)) {
|
if (!ath10k_mac_tx_frm_has_freq(ar)) {
|
||||||
ath10k_dbg(ar, ATH10K_DBG_MAC, "queued offchannel skb %p\n",
|
ath10k_dbg(ar, ATH10K_DBG_MAC, "queued offchannel skb %p\n",
|
||||||
skb);
|
skb);
|
||||||
|
@ -1814,16 +1814,24 @@ int ath10k_wmi_cmd_send(struct ath10k *ar, struct sk_buff *skb, u32 cmd_id)
|
|||||||
static struct sk_buff *
|
static struct sk_buff *
|
||||||
ath10k_wmi_op_gen_mgmt_tx(struct ath10k *ar, struct sk_buff *msdu)
|
ath10k_wmi_op_gen_mgmt_tx(struct ath10k *ar, struct sk_buff *msdu)
|
||||||
{
|
{
|
||||||
|
struct ath10k_skb_cb *cb = ATH10K_SKB_CB(msdu);
|
||||||
|
struct ath10k_vif *arvif = (void *)cb->vif->drv_priv;
|
||||||
struct wmi_mgmt_tx_cmd *cmd;
|
struct wmi_mgmt_tx_cmd *cmd;
|
||||||
struct ieee80211_hdr *hdr;
|
struct ieee80211_hdr *hdr;
|
||||||
struct sk_buff *skb;
|
struct sk_buff *skb;
|
||||||
int len;
|
int len;
|
||||||
|
u32 vdev_id;
|
||||||
u32 buf_len = msdu->len;
|
u32 buf_len = msdu->len;
|
||||||
u16 fc;
|
u16 fc;
|
||||||
|
|
||||||
hdr = (struct ieee80211_hdr *)msdu->data;
|
hdr = (struct ieee80211_hdr *)msdu->data;
|
||||||
fc = le16_to_cpu(hdr->frame_control);
|
fc = le16_to_cpu(hdr->frame_control);
|
||||||
|
|
||||||
|
if (cb->vif)
|
||||||
|
vdev_id = arvif->vdev_id;
|
||||||
|
else
|
||||||
|
vdev_id = 0;
|
||||||
|
|
||||||
if (WARN_ON_ONCE(!ieee80211_is_mgmt(hdr->frame_control)))
|
if (WARN_ON_ONCE(!ieee80211_is_mgmt(hdr->frame_control)))
|
||||||
return ERR_PTR(-EINVAL);
|
return ERR_PTR(-EINVAL);
|
||||||
|
|
||||||
@ -1845,7 +1853,7 @@ ath10k_wmi_op_gen_mgmt_tx(struct ath10k *ar, struct sk_buff *msdu)
|
|||||||
|
|
||||||
cmd = (struct wmi_mgmt_tx_cmd *)skb->data;
|
cmd = (struct wmi_mgmt_tx_cmd *)skb->data;
|
||||||
|
|
||||||
cmd->hdr.vdev_id = __cpu_to_le32(ATH10K_SKB_CB(msdu)->vdev_id);
|
cmd->hdr.vdev_id = __cpu_to_le32(vdev_id);
|
||||||
cmd->hdr.tx_rate = 0;
|
cmd->hdr.tx_rate = 0;
|
||||||
cmd->hdr.tx_power = 0;
|
cmd->hdr.tx_power = 0;
|
||||||
cmd->hdr.buf_len = __cpu_to_le32(buf_len);
|
cmd->hdr.buf_len = __cpu_to_le32(buf_len);
|
||||||
|
Loading…
Reference in New Issue
Block a user