Commit edb8236d authored by Michal Kazior's avatar Michal Kazior Committed by Kalle Valo

ath10k: embed HTT struct inside ath10k

This reduces number of allocations and simplifies
memory managemnt.
Signed-off-by: default avatarMichal Kazior <michal.kazior@tieto.com>
Signed-off-by: default avatarKalle Valo <kvalo@qca.qualcomm.com>
parent cd003fad
...@@ -556,9 +556,9 @@ int ath10k_core_register(struct ath10k *ar) ...@@ -556,9 +556,9 @@ int ath10k_core_register(struct ath10k *ar)
if (status) if (status)
goto err_wmi_detach; goto err_wmi_detach;
ar->htt = ath10k_htt_attach(ar); status = ath10k_htt_attach(ar);
if (!ar->htt) { if (status) {
status = -ENOMEM; ath10k_err("could not attach htt (%d)\n", status);
goto err_wmi_detach; goto err_wmi_detach;
} }
...@@ -585,7 +585,7 @@ int ath10k_core_register(struct ath10k *ar) ...@@ -585,7 +585,7 @@ int ath10k_core_register(struct ath10k *ar)
goto err_disconnect_htc; goto err_disconnect_htc;
} }
status = ath10k_htt_attach_target(ar->htt); status = ath10k_htt_attach_target(&ar->htt);
if (status) if (status)
goto err_disconnect_htc; goto err_disconnect_htc;
...@@ -606,7 +606,7 @@ int ath10k_core_register(struct ath10k *ar) ...@@ -606,7 +606,7 @@ int ath10k_core_register(struct ath10k *ar)
err_disconnect_htc: err_disconnect_htc:
ath10k_htc_stop(&ar->htc); ath10k_htc_stop(&ar->htc);
err_htt_detach: err_htt_detach:
ath10k_htt_detach(ar->htt); ath10k_htt_detach(&ar->htt);
err_wmi_detach: err_wmi_detach:
ath10k_wmi_detach(ar); ath10k_wmi_detach(ar);
err: err:
...@@ -621,7 +621,7 @@ void ath10k_core_unregister(struct ath10k *ar) ...@@ -621,7 +621,7 @@ void ath10k_core_unregister(struct ath10k *ar)
* unhappy about callback failures. */ * unhappy about callback failures. */
ath10k_mac_unregister(ar); ath10k_mac_unregister(ar);
ath10k_htc_stop(&ar->htc); ath10k_htc_stop(&ar->htc);
ath10k_htt_detach(ar->htt); ath10k_htt_detach(&ar->htt);
ath10k_wmi_detach(ar); ath10k_wmi_detach(ar);
} }
EXPORT_SYMBOL(ath10k_core_unregister); EXPORT_SYMBOL(ath10k_core_unregister);
......
...@@ -23,6 +23,7 @@ ...@@ -23,6 +23,7 @@
#include <linux/types.h> #include <linux/types.h>
#include <linux/pci.h> #include <linux/pci.h>
#include "htt.h"
#include "htc.h" #include "htc.h"
#include "hw.h" #include "hw.h"
#include "targaddrs.h" #include "targaddrs.h"
...@@ -273,15 +274,13 @@ struct ath10k { ...@@ -273,15 +274,13 @@ struct ath10k {
const struct ath10k_hif_ops *ops; const struct ath10k_hif_ops *ops;
} hif; } hif;
struct ath10k_wmi wmi;
wait_queue_head_t event_queue; wait_queue_head_t event_queue;
bool is_target_paused; bool is_target_paused;
struct ath10k_bmi bmi; struct ath10k_bmi bmi;
struct ath10k_wmi wmi;
struct ath10k_htc htc; struct ath10k_htc htc;
struct ath10k_htt htt;
struct ath10k_htt *htt;
struct ath10k_hw_params { struct ath10k_hw_params {
u32 id; u32 id;
......
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
*/ */
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/if_ether.h>
#include "htt.h" #include "htt.h"
#include "core.h" #include "core.h"
...@@ -47,15 +48,11 @@ static int ath10k_htt_htc_attach(struct ath10k_htt *htt) ...@@ -47,15 +48,11 @@ static int ath10k_htt_htc_attach(struct ath10k_htt *htt)
return 0; return 0;
} }
struct ath10k_htt *ath10k_htt_attach(struct ath10k *ar) int ath10k_htt_attach(struct ath10k *ar)
{ {
struct ath10k_htt *htt; struct ath10k_htt *htt = &ar->htt;
int ret; int ret;
htt = kzalloc(sizeof(*htt), GFP_KERNEL);
if (!htt)
return NULL;
htt->ar = ar; htt->ar = ar;
htt->max_throughput_mbps = 800; htt->max_throughput_mbps = 800;
...@@ -65,8 +62,11 @@ struct ath10k_htt *ath10k_htt_attach(struct ath10k *ar) ...@@ -65,8 +62,11 @@ struct ath10k_htt *ath10k_htt_attach(struct ath10k *ar)
* since ath10k_htt_rx_attach involves sending a rx ring configure * since ath10k_htt_rx_attach involves sending a rx ring configure
* message to the target. * message to the target.
*/ */
if (ath10k_htt_htc_attach(htt)) ret = ath10k_htt_htc_attach(htt);
if (ret) {
ath10k_err("could not attach htt htc (%d)\n", ret);
goto err_htc_attach; goto err_htc_attach;
}
ret = ath10k_htt_tx_attach(htt); ret = ath10k_htt_tx_attach(htt);
if (ret) { if (ret) {
...@@ -74,8 +74,11 @@ struct ath10k_htt *ath10k_htt_attach(struct ath10k *ar) ...@@ -74,8 +74,11 @@ struct ath10k_htt *ath10k_htt_attach(struct ath10k *ar)
goto err_htc_attach; goto err_htc_attach;
} }
if (ath10k_htt_rx_attach(htt)) ret = ath10k_htt_rx_attach(htt);
if (ret) {
ath10k_err("could not attach htt rx (%d)\n", ret);
goto err_rx_attach; goto err_rx_attach;
}
/* /*
* Prefetch enough data to satisfy target * Prefetch enough data to satisfy target
...@@ -89,13 +92,12 @@ struct ath10k_htt *ath10k_htt_attach(struct ath10k *ar) ...@@ -89,13 +92,12 @@ struct ath10k_htt *ath10k_htt_attach(struct ath10k *ar)
8 + /* llc snap */ 8 + /* llc snap */
2; /* ip4 dscp or ip6 priority */ 2; /* ip4 dscp or ip6 priority */
return htt; return 0;
err_rx_attach: err_rx_attach:
ath10k_htt_tx_detach(htt); ath10k_htt_tx_detach(htt);
err_htc_attach: err_htc_attach:
kfree(htt); return ret;
return NULL;
} }
#define HTT_TARGET_VERSION_TIMEOUT_HZ (3*HZ) #define HTT_TARGET_VERSION_TIMEOUT_HZ (3*HZ)
...@@ -148,5 +150,4 @@ void ath10k_htt_detach(struct ath10k_htt *htt) ...@@ -148,5 +150,4 @@ void ath10k_htt_detach(struct ath10k_htt *htt)
{ {
ath10k_htt_rx_detach(htt); ath10k_htt_rx_detach(htt);
ath10k_htt_tx_detach(htt); ath10k_htt_tx_detach(htt);
kfree(htt);
} }
...@@ -20,7 +20,6 @@ ...@@ -20,7 +20,6 @@
#include <linux/bug.h> #include <linux/bug.h>
#include "core.h"
#include "htc.h" #include "htc.h"
#include "rx_desc.h" #include "rx_desc.h"
...@@ -1317,7 +1316,7 @@ struct htt_rx_desc { ...@@ -1317,7 +1316,7 @@ struct htt_rx_desc {
#define HTT_LOG2_MAX_CACHE_LINE_SIZE 7 /* 2^7 = 128 */ #define HTT_LOG2_MAX_CACHE_LINE_SIZE 7 /* 2^7 = 128 */
#define HTT_MAX_CACHE_LINE_SIZE_MASK ((1 << HTT_LOG2_MAX_CACHE_LINE_SIZE) - 1) #define HTT_MAX_CACHE_LINE_SIZE_MASK ((1 << HTT_LOG2_MAX_CACHE_LINE_SIZE) - 1)
struct ath10k_htt *ath10k_htt_attach(struct ath10k *ar); int ath10k_htt_attach(struct ath10k *ar);
int ath10k_htt_attach_target(struct ath10k_htt *htt); int ath10k_htt_attach_target(struct ath10k_htt *htt);
void ath10k_htt_detach(struct ath10k_htt *htt); void ath10k_htt_detach(struct ath10k_htt *htt);
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/ */
#include "core.h"
#include "htc.h" #include "htc.h"
#include "htt.h" #include "htt.h"
#include "txrx.h" #include "txrx.h"
...@@ -1036,7 +1037,7 @@ static void ath10k_htt_rx_frag_handler(struct ath10k_htt *htt, ...@@ -1036,7 +1037,7 @@ static void ath10k_htt_rx_frag_handler(struct ath10k_htt *htt,
void ath10k_htt_t2h_msg_handler(struct ath10k *ar, struct sk_buff *skb) void ath10k_htt_t2h_msg_handler(struct ath10k *ar, struct sk_buff *skb)
{ {
struct ath10k_htt *htt = ar->htt; struct ath10k_htt *htt = &ar->htt;
struct htt_resp *resp = (struct htt_resp *)skb->data; struct htt_resp *resp = (struct htt_resp *)skb->data;
/* confirm alignment */ /* confirm alignment */
......
...@@ -153,7 +153,7 @@ void ath10k_htt_tx_detach(struct ath10k_htt *htt) ...@@ -153,7 +153,7 @@ void ath10k_htt_tx_detach(struct ath10k_htt *htt)
void ath10k_htt_htc_tx_complete(struct ath10k *ar, struct sk_buff *skb) void ath10k_htt_htc_tx_complete(struct ath10k *ar, struct sk_buff *skb)
{ {
struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(skb); struct ath10k_skb_cb *skb_cb = ATH10K_SKB_CB(skb);
struct ath10k_htt *htt = ar->htt; struct ath10k_htt *htt = &ar->htt;
if (skb_cb->htt.is_conf) { if (skb_cb->htt.is_conf) {
dev_kfree_skb_any(skb); dev_kfree_skb_any(skb);
......
...@@ -1397,15 +1397,15 @@ static void ath10k_tx_htt(struct ath10k *ar, struct sk_buff *skb) ...@@ -1397,15 +1397,15 @@ static void ath10k_tx_htt(struct ath10k *ar, struct sk_buff *skb)
int ret; int ret;
if (ieee80211_is_mgmt(hdr->frame_control)) if (ieee80211_is_mgmt(hdr->frame_control))
ret = ath10k_htt_mgmt_tx(ar->htt, skb); ret = ath10k_htt_mgmt_tx(&ar->htt, skb);
else if (ieee80211_is_nullfunc(hdr->frame_control)) else if (ieee80211_is_nullfunc(hdr->frame_control))
/* FW does not report tx status properly for NullFunc frames /* FW does not report tx status properly for NullFunc frames
* unless they are sent through mgmt tx path. mac80211 sends * unless they are sent through mgmt tx path. mac80211 sends
* those frames when it detects link/beacon loss and depends on * those frames when it detects link/beacon loss and depends on
* the tx status to be correct. */ * the tx status to be correct. */
ret = ath10k_htt_mgmt_tx(ar->htt, skb); ret = ath10k_htt_mgmt_tx(&ar->htt, skb);
else else
ret = ath10k_htt_tx(ar->htt, skb); ret = ath10k_htt_tx(&ar->htt, skb);
if (ret) { if (ret) {
ath10k_warn("tx failed (%d). dropping packet.\n", ret); ath10k_warn("tx failed (%d). dropping packet.\n", ret);
...@@ -2659,12 +2659,12 @@ static void ath10k_flush(struct ieee80211_hw *hw, u32 queues, bool drop) ...@@ -2659,12 +2659,12 @@ static void ath10k_flush(struct ieee80211_hw *hw, u32 queues, bool drop)
if (drop) if (drop)
return; return;
ret = wait_event_timeout(ar->htt->empty_tx_wq, ({ ret = wait_event_timeout(ar->htt.empty_tx_wq, ({
bool empty; bool empty;
spin_lock_bh(&ar->htt->tx_lock); spin_lock_bh(&ar->htt.tx_lock);
empty = bitmap_empty(ar->htt->used_msdu_ids, empty = bitmap_empty(ar->htt.used_msdu_ids,
ar->htt->max_num_pending_tx); ar->htt.max_num_pending_tx);
spin_unlock_bh(&ar->htt->tx_lock); spin_unlock_bh(&ar->htt.tx_lock);
(empty); (empty);
}), ATH10K_FLUSH_TIMEOUT_HZ); }), ATH10K_FLUSH_TIMEOUT_HZ);
if (ret <= 0) if (ret <= 0)
......
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