Commit 8ea51e40 authored by Alagu Sankar's avatar Alagu Sankar Committed by Kalle Valo

ath10k: htt: support MSDU ids with SDIO

Transmit completion for SDIO is similar to PCIe, modify the high
latency path to allow SDIO modules to use the msdu id.

kvalo: the original patch from Alagu enabled this only for SDIO but I'm not
sure should we also enable this with USB. I'll use bus params to enable this
for so that it's easy to enable also for USB later.

Tested with QCA6174 SDIO with firmware WLAN.RMH.4.4.1-00007-QCARMSWP-1.
Co-developed-by: default avatarWen Gong <wgong@codeaurora.org>
Signed-off-by: default avatarAlagu Sankar <alagusankar@silex-india.com>
Signed-off-by: Wen Gong <wgong@codeaurora.org>.
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent 6d084ac2
...@@ -919,6 +919,7 @@ struct ath10k_bus_params { ...@@ -919,6 +919,7 @@ struct ath10k_bus_params {
u32 chip_id; u32 chip_id;
enum ath10k_dev_type dev_type; enum ath10k_dev_type dev_type;
bool link_can_suspend; bool link_can_suspend;
bool hl_msdu_ids;
}; };
struct ath10k { struct ath10k {
......
...@@ -1244,6 +1244,7 @@ static int ath10k_htt_tx_hl(struct ath10k_htt *htt, enum ath10k_hw_txrx_mode txm ...@@ -1244,6 +1244,7 @@ static int ath10k_htt_tx_hl(struct ath10k_htt *htt, enum ath10k_hw_txrx_mode txm
u8 tid = ath10k_htt_tx_get_tid(msdu, is_eth); u8 tid = ath10k_htt_tx_get_tid(msdu, is_eth);
u8 flags0 = 0; u8 flags0 = 0;
u16 flags1 = 0; u16 flags1 = 0;
u16 msdu_id = 0;
data_len = msdu->len; data_len = msdu->len;
...@@ -1291,6 +1292,16 @@ static int ath10k_htt_tx_hl(struct ath10k_htt *htt, enum ath10k_hw_txrx_mode txm ...@@ -1291,6 +1292,16 @@ static int ath10k_htt_tx_hl(struct ath10k_htt *htt, enum ath10k_hw_txrx_mode txm
} }
} }
if (ar->bus_param.hl_msdu_ids) {
flags1 |= HTT_DATA_TX_DESC_FLAGS1_POSTPONED;
res = ath10k_htt_tx_alloc_msdu_id(htt, msdu);
if (res < 0) {
ath10k_err(ar, "msdu_id allocation failed %d\n", res);
goto out;
}
msdu_id = res;
}
skb_push(msdu, sizeof(*cmd_hdr)); skb_push(msdu, sizeof(*cmd_hdr));
skb_push(msdu, sizeof(*tx_desc)); skb_push(msdu, sizeof(*tx_desc));
cmd_hdr = (struct htt_cmd_hdr *)msdu->data; cmd_hdr = (struct htt_cmd_hdr *)msdu->data;
...@@ -1300,7 +1311,7 @@ static int ath10k_htt_tx_hl(struct ath10k_htt *htt, enum ath10k_hw_txrx_mode txm ...@@ -1300,7 +1311,7 @@ static int ath10k_htt_tx_hl(struct ath10k_htt *htt, enum ath10k_hw_txrx_mode txm
tx_desc->flags0 = flags0; tx_desc->flags0 = flags0;
tx_desc->flags1 = __cpu_to_le16(flags1); tx_desc->flags1 = __cpu_to_le16(flags1);
tx_desc->len = __cpu_to_le16(data_len); tx_desc->len = __cpu_to_le16(data_len);
tx_desc->id = 0; tx_desc->id = __cpu_to_le16(msdu_id);
tx_desc->frags_paddr = 0; /* always zero */ tx_desc->frags_paddr = 0; /* always zero */
/* Initialize peer_id to INVALID_PEER because this is NOT /* Initialize peer_id to INVALID_PEER because this is NOT
* Reinjection path * Reinjection path
......
...@@ -2045,6 +2045,8 @@ static int ath10k_sdio_probe(struct sdio_func *func, ...@@ -2045,6 +2045,8 @@ static int ath10k_sdio_probe(struct sdio_func *func,
bus_params.dev_type = ATH10K_DEV_TYPE_HL; bus_params.dev_type = ATH10K_DEV_TYPE_HL;
/* TODO: don't know yet how to get chip_id with SDIO */ /* TODO: don't know yet how to get chip_id with SDIO */
bus_params.chip_id = 0; bus_params.chip_id = 0;
bus_params.hl_msdu_ids = true;
ret = ath10k_core_register(ar, &bus_params); ret = ath10k_core_register(ar, &bus_params);
if (ret) { if (ret) {
ath10k_err(ar, "failed to register driver core: %d\n", ret); ath10k_err(ar, "failed to register driver core: %d\n", ret);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment