mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-23 23:31:02 +07:00
ath10k: store msdu_id instead of txbuf pointers
Txbuf is no longer a DMA pool and can be easily tracked with a mere msdu_id. This saves 10 bytes on 64bit systems and 6 bytes on 32bit systems of precious sk_buff control buffer. Signed-off-by: Michal Kazior <michal.kazior@tieto.com> Signed-off-by: Kalle Valo <kvalo@qca.qualcomm.com>
This commit is contained in:
parent
609db229b4
commit
aca146afbc
@ -93,12 +93,8 @@ struct ath10k_skb_cb {
|
|||||||
dma_addr_t paddr;
|
dma_addr_t paddr;
|
||||||
u8 flags;
|
u8 flags;
|
||||||
u8 eid;
|
u8 eid;
|
||||||
|
u16 msdu_id;
|
||||||
struct ieee80211_vif *vif;
|
struct ieee80211_vif *vif;
|
||||||
|
|
||||||
struct {
|
|
||||||
struct ath10k_htt_txbuf *txbuf;
|
|
||||||
u32 txbuf_paddr;
|
|
||||||
} __packed htt;
|
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
struct ath10k_skb_rxcb {
|
struct ath10k_skb_rxcb {
|
||||||
|
@ -539,8 +539,6 @@ int ath10k_htt_mgmt_tx(struct ath10k_htt *htt, struct sk_buff *msdu)
|
|||||||
memcpy(cmd->mgmt_tx.hdr, msdu->data,
|
memcpy(cmd->mgmt_tx.hdr, msdu->data,
|
||||||
min_t(int, msdu->len, HTT_MGMT_FRM_HDR_DOWNLOAD_LEN));
|
min_t(int, msdu->len, HTT_MGMT_FRM_HDR_DOWNLOAD_LEN));
|
||||||
|
|
||||||
skb_cb->htt.txbuf = NULL;
|
|
||||||
|
|
||||||
res = ath10k_htc_send(&htt->ar->htc, htt->eid, txdesc);
|
res = ath10k_htc_send(&htt->ar->htc, htt->eid, txdesc);
|
||||||
if (res)
|
if (res)
|
||||||
goto err_unmap_msdu;
|
goto err_unmap_msdu;
|
||||||
@ -570,6 +568,7 @@ int ath10k_htt_tx(struct ath10k_htt *htt, enum ath10k_hw_txrx_mode txmode,
|
|||||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(msdu);
|
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(msdu);
|
||||||
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 ath10k_htt_txbuf *txbuf;
|
||||||
struct htt_data_tx_desc_frag *frags;
|
struct htt_data_tx_desc_frag *frags;
|
||||||
bool is_eth = (txmode == ATH10K_HW_TXRX_ETHERNET);
|
bool is_eth = (txmode == ATH10K_HW_TXRX_ETHERNET);
|
||||||
u8 vdev_id = ath10k_htt_tx_get_vdev_id(ar, msdu);
|
u8 vdev_id = ath10k_htt_tx_get_vdev_id(ar, msdu);
|
||||||
@ -580,6 +579,7 @@ int ath10k_htt_tx(struct ath10k_htt *htt, enum ath10k_hw_txrx_mode txmode,
|
|||||||
u16 msdu_id, flags1 = 0;
|
u16 msdu_id, flags1 = 0;
|
||||||
u16 freq = 0;
|
u16 freq = 0;
|
||||||
u32 frags_paddr = 0;
|
u32 frags_paddr = 0;
|
||||||
|
u32 txbuf_paddr;
|
||||||
struct htt_msdu_ext_desc *ext_desc = NULL;
|
struct htt_msdu_ext_desc *ext_desc = NULL;
|
||||||
bool limit_mgmt_desc = false;
|
bool limit_mgmt_desc = false;
|
||||||
bool is_probe_resp = false;
|
bool is_probe_resp = false;
|
||||||
@ -607,8 +607,8 @@ int ath10k_htt_tx(struct ath10k_htt *htt, enum ath10k_hw_txrx_mode txmode,
|
|||||||
prefetch_len = min(htt->prefetch_len, msdu->len);
|
prefetch_len = min(htt->prefetch_len, msdu->len);
|
||||||
prefetch_len = roundup(prefetch_len, 4);
|
prefetch_len = roundup(prefetch_len, 4);
|
||||||
|
|
||||||
skb_cb->htt.txbuf = &htt->txbuf.vaddr[msdu_id];
|
txbuf = &htt->txbuf.vaddr[msdu_id];
|
||||||
skb_cb->htt.txbuf_paddr = htt->txbuf.paddr +
|
txbuf_paddr = htt->txbuf.paddr +
|
||||||
(sizeof(struct ath10k_htt_txbuf) * msdu_id);
|
(sizeof(struct ath10k_htt_txbuf) * msdu_id);
|
||||||
|
|
||||||
if ((ieee80211_is_action(hdr->frame_control) ||
|
if ((ieee80211_is_action(hdr->frame_control) ||
|
||||||
@ -653,14 +653,14 @@ int ath10k_htt_tx(struct ath10k_htt *htt, enum ath10k_hw_txrx_mode txmode,
|
|||||||
frags_paddr = htt->frag_desc.paddr +
|
frags_paddr = htt->frag_desc.paddr +
|
||||||
(sizeof(struct htt_msdu_ext_desc) * msdu_id);
|
(sizeof(struct htt_msdu_ext_desc) * msdu_id);
|
||||||
} else {
|
} else {
|
||||||
frags = skb_cb->htt.txbuf->frags;
|
frags = txbuf->frags;
|
||||||
frags[0].dword_addr.paddr =
|
frags[0].dword_addr.paddr =
|
||||||
__cpu_to_le32(skb_cb->paddr);
|
__cpu_to_le32(skb_cb->paddr);
|
||||||
frags[0].dword_addr.len = __cpu_to_le32(msdu->len);
|
frags[0].dword_addr.len = __cpu_to_le32(msdu->len);
|
||||||
frags[1].dword_addr.paddr = 0;
|
frags[1].dword_addr.paddr = 0;
|
||||||
frags[1].dword_addr.len = 0;
|
frags[1].dword_addr.len = 0;
|
||||||
|
|
||||||
frags_paddr = skb_cb->htt.txbuf_paddr;
|
frags_paddr = txbuf_paddr;
|
||||||
}
|
}
|
||||||
flags0 |= SM(txmode, HTT_DATA_TX_DESC_FLAGS0_PKT_TYPE);
|
flags0 |= SM(txmode, HTT_DATA_TX_DESC_FLAGS0_PKT_TYPE);
|
||||||
break;
|
break;
|
||||||
@ -689,12 +689,11 @@ int ath10k_htt_tx(struct ath10k_htt *htt, enum ath10k_hw_txrx_mode txmode,
|
|||||||
* avoid extra memory allocations, compress data structures and thus
|
* avoid extra memory allocations, compress data structures and thus
|
||||||
* improve performance. */
|
* improve performance. */
|
||||||
|
|
||||||
skb_cb->htt.txbuf->htc_hdr.eid = htt->eid;
|
txbuf->htc_hdr.eid = htt->eid;
|
||||||
skb_cb->htt.txbuf->htc_hdr.len = __cpu_to_le16(
|
txbuf->htc_hdr.len = __cpu_to_le16(sizeof(txbuf->cmd_hdr) +
|
||||||
sizeof(skb_cb->htt.txbuf->cmd_hdr) +
|
sizeof(txbuf->cmd_tx) +
|
||||||
sizeof(skb_cb->htt.txbuf->cmd_tx) +
|
|
||||||
prefetch_len);
|
prefetch_len);
|
||||||
skb_cb->htt.txbuf->htc_hdr.flags = 0;
|
txbuf->htc_hdr.flags = 0;
|
||||||
|
|
||||||
if (skb_cb->flags & ATH10K_SKB_F_NO_HWCRYPT)
|
if (skb_cb->flags & ATH10K_SKB_F_NO_HWCRYPT)
|
||||||
flags0 |= HTT_DATA_TX_DESC_FLAGS0_NO_ENCRYPT;
|
flags0 |= HTT_DATA_TX_DESC_FLAGS0_NO_ENCRYPT;
|
||||||
@ -715,19 +714,19 @@ int ath10k_htt_tx(struct ath10k_htt *htt, enum ath10k_hw_txrx_mode txmode,
|
|||||||
*/
|
*/
|
||||||
flags1 |= HTT_DATA_TX_DESC_FLAGS1_POSTPONED;
|
flags1 |= HTT_DATA_TX_DESC_FLAGS1_POSTPONED;
|
||||||
|
|
||||||
skb_cb->htt.txbuf->cmd_hdr.msg_type = HTT_H2T_MSG_TYPE_TX_FRM;
|
txbuf->cmd_hdr.msg_type = HTT_H2T_MSG_TYPE_TX_FRM;
|
||||||
skb_cb->htt.txbuf->cmd_tx.flags0 = flags0;
|
txbuf->cmd_tx.flags0 = flags0;
|
||||||
skb_cb->htt.txbuf->cmd_tx.flags1 = __cpu_to_le16(flags1);
|
txbuf->cmd_tx.flags1 = __cpu_to_le16(flags1);
|
||||||
skb_cb->htt.txbuf->cmd_tx.len = __cpu_to_le16(msdu->len);
|
txbuf->cmd_tx.len = __cpu_to_le16(msdu->len);
|
||||||
skb_cb->htt.txbuf->cmd_tx.id = __cpu_to_le16(msdu_id);
|
txbuf->cmd_tx.id = __cpu_to_le16(msdu_id);
|
||||||
skb_cb->htt.txbuf->cmd_tx.frags_paddr = __cpu_to_le32(frags_paddr);
|
txbuf->cmd_tx.frags_paddr = __cpu_to_le32(frags_paddr);
|
||||||
if (ath10k_mac_tx_frm_has_freq(ar)) {
|
if (ath10k_mac_tx_frm_has_freq(ar)) {
|
||||||
skb_cb->htt.txbuf->cmd_tx.offchan_tx.peerid =
|
txbuf->cmd_tx.offchan_tx.peerid =
|
||||||
__cpu_to_le16(HTT_INVALID_PEERID);
|
__cpu_to_le16(HTT_INVALID_PEERID);
|
||||||
skb_cb->htt.txbuf->cmd_tx.offchan_tx.freq =
|
txbuf->cmd_tx.offchan_tx.freq =
|
||||||
__cpu_to_le16(freq);
|
__cpu_to_le16(freq);
|
||||||
} else {
|
} else {
|
||||||
skb_cb->htt.txbuf->cmd_tx.peerid =
|
txbuf->cmd_tx.peerid =
|
||||||
__cpu_to_le32(HTT_INVALID_PEERID);
|
__cpu_to_le32(HTT_INVALID_PEERID);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -743,12 +742,12 @@ int ath10k_htt_tx(struct ath10k_htt *htt, enum ath10k_hw_txrx_mode txmode,
|
|||||||
|
|
||||||
sg_items[0].transfer_id = 0;
|
sg_items[0].transfer_id = 0;
|
||||||
sg_items[0].transfer_context = NULL;
|
sg_items[0].transfer_context = NULL;
|
||||||
sg_items[0].vaddr = &skb_cb->htt.txbuf->htc_hdr;
|
sg_items[0].vaddr = &txbuf->htc_hdr;
|
||||||
sg_items[0].paddr = skb_cb->htt.txbuf_paddr +
|
sg_items[0].paddr = txbuf_paddr +
|
||||||
sizeof(skb_cb->htt.txbuf->frags);
|
sizeof(txbuf->frags);
|
||||||
sg_items[0].len = sizeof(skb_cb->htt.txbuf->htc_hdr) +
|
sg_items[0].len = sizeof(txbuf->htc_hdr) +
|
||||||
sizeof(skb_cb->htt.txbuf->cmd_hdr) +
|
sizeof(txbuf->cmd_hdr) +
|
||||||
sizeof(skb_cb->htt.txbuf->cmd_tx);
|
sizeof(txbuf->cmd_tx);
|
||||||
|
|
||||||
sg_items[1].transfer_id = 0;
|
sg_items[1].transfer_id = 0;
|
||||||
sg_items[1].transfer_context = NULL;
|
sg_items[1].transfer_context = NULL;
|
||||||
|
Loading…
Reference in New Issue
Block a user