xref: /linux/drivers/net/wireless/silabs/wfx/data_tx.h (revision 0ea5c948cb64bab5bc7a5516774eb8536f05aa0d)
14a5fb1bbSJérôme Pouiller /* SPDX-License-Identifier: GPL-2.0-only */
24a5fb1bbSJérôme Pouiller /*
34a5fb1bbSJérôme Pouiller  * Data transmitting implementation.
44a5fb1bbSJérôme Pouiller  *
54a5fb1bbSJérôme Pouiller  * Copyright (c) 2017-2020, Silicon Laboratories, Inc.
64a5fb1bbSJérôme Pouiller  * Copyright (c) 2010, ST-Ericsson
74a5fb1bbSJérôme Pouiller  */
84a5fb1bbSJérôme Pouiller #ifndef WFX_DATA_TX_H
94a5fb1bbSJérôme Pouiller #define WFX_DATA_TX_H
104a5fb1bbSJérôme Pouiller 
114a5fb1bbSJérôme Pouiller #include <linux/list.h>
124a5fb1bbSJérôme Pouiller #include <net/mac80211.h>
134a5fb1bbSJérôme Pouiller 
144a5fb1bbSJérôme Pouiller #include "hif_api_cmd.h"
154a5fb1bbSJérôme Pouiller #include "hif_api_mib.h"
164a5fb1bbSJérôme Pouiller 
174a5fb1bbSJérôme Pouiller struct wfx_tx_priv;
184a5fb1bbSJérôme Pouiller struct wfx_dev;
194a5fb1bbSJérôme Pouiller struct wfx_vif;
204a5fb1bbSJérôme Pouiller 
214a5fb1bbSJérôme Pouiller struct wfx_tx_policy {
224a5fb1bbSJérôme Pouiller 	struct list_head link;
234a5fb1bbSJérôme Pouiller 	int usage_count;
244a5fb1bbSJérôme Pouiller 	u8 rates[12];
254a5fb1bbSJérôme Pouiller 	bool uploaded;
264a5fb1bbSJérôme Pouiller };
274a5fb1bbSJérôme Pouiller 
284a5fb1bbSJérôme Pouiller struct wfx_tx_policy_cache {
294a5fb1bbSJérôme Pouiller 	struct wfx_tx_policy cache[HIF_TX_RETRY_POLICY_MAX];
304a5fb1bbSJérôme Pouiller 	/* FIXME: use a trees and drop hash from tx_policy */
314a5fb1bbSJérôme Pouiller 	struct list_head used;
324a5fb1bbSJérôme Pouiller 	struct list_head free;
334a5fb1bbSJérôme Pouiller 	spinlock_t lock;
344a5fb1bbSJérôme Pouiller };
354a5fb1bbSJérôme Pouiller 
364a5fb1bbSJérôme Pouiller struct wfx_tx_priv {
374a5fb1bbSJérôme Pouiller 	ktime_t xmit_timestamp;
384a5fb1bbSJérôme Pouiller 	unsigned char icv_size;
39*f7385a20SJérôme Pouiller 	unsigned char vif_id;
404a5fb1bbSJérôme Pouiller };
414a5fb1bbSJérôme Pouiller 
424a5fb1bbSJérôme Pouiller void wfx_tx_policy_init(struct wfx_vif *wvif);
434a5fb1bbSJérôme Pouiller void wfx_tx_policy_upload_work(struct work_struct *work);
444a5fb1bbSJérôme Pouiller 
454a5fb1bbSJérôme Pouiller void wfx_tx(struct ieee80211_hw *hw, struct ieee80211_tx_control *control, struct sk_buff *skb);
464a5fb1bbSJérôme Pouiller void wfx_tx_confirm_cb(struct wfx_dev *wdev, const struct wfx_hif_cnf_tx *arg);
474a5fb1bbSJérôme Pouiller void wfx_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif, u32 queues, bool drop);
484a5fb1bbSJérôme Pouiller 
49cf0cc05cSJérôme Pouiller struct wfx_tx_priv *wfx_skb_tx_priv(struct sk_buff *skb);
50cf0cc05cSJérôme Pouiller struct wfx_hif_req_tx *wfx_skb_txreq(struct sk_buff *skb);
51*f7385a20SJérôme Pouiller struct wfx_vif *wfx_skb_wvif(struct wfx_dev *wdev, struct sk_buff *skb);
524a5fb1bbSJérôme Pouiller 
534a5fb1bbSJérôme Pouiller #endif
54