xref: /OK3568_Linux_fs/kernel/drivers/net/wireless/st/cw1200/txrx.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Datapath interface for ST-Ericsson CW1200 mac80211 drivers
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (c) 2010, ST-Ericsson
6*4882a593Smuzhiyun  * Author: Dmitry Tarnyagin <dmitry.tarnyagin@lockless.no>
7*4882a593Smuzhiyun  */
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #ifndef CW1200_TXRX_H
10*4882a593Smuzhiyun #define CW1200_TXRX_H
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #include <linux/list.h>
13*4882a593Smuzhiyun 
14*4882a593Smuzhiyun /* extern */ struct ieee80211_hw;
15*4882a593Smuzhiyun /* extern */ struct sk_buff;
16*4882a593Smuzhiyun /* extern */ struct wsm_tx;
17*4882a593Smuzhiyun /* extern */ struct wsm_rx;
18*4882a593Smuzhiyun /* extern */ struct wsm_tx_confirm;
19*4882a593Smuzhiyun /* extern */ struct cw1200_txpriv;
20*4882a593Smuzhiyun 
21*4882a593Smuzhiyun struct tx_policy {
22*4882a593Smuzhiyun 	union {
23*4882a593Smuzhiyun 		__le32 tbl[3];
24*4882a593Smuzhiyun 		u8 raw[12];
25*4882a593Smuzhiyun 	};
26*4882a593Smuzhiyun 	u8  defined;
27*4882a593Smuzhiyun 	u8  usage_count;
28*4882a593Smuzhiyun 	u8  retry_count;
29*4882a593Smuzhiyun 	u8  uploaded;
30*4882a593Smuzhiyun };
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun struct tx_policy_cache_entry {
33*4882a593Smuzhiyun 	struct tx_policy policy;
34*4882a593Smuzhiyun 	struct list_head link;
35*4882a593Smuzhiyun };
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun #define TX_POLICY_CACHE_SIZE	(8)
38*4882a593Smuzhiyun struct tx_policy_cache {
39*4882a593Smuzhiyun 	struct tx_policy_cache_entry cache[TX_POLICY_CACHE_SIZE];
40*4882a593Smuzhiyun 	struct list_head used;
41*4882a593Smuzhiyun 	struct list_head free;
42*4882a593Smuzhiyun 	spinlock_t lock; /* Protect policy cache */
43*4882a593Smuzhiyun };
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun /* ******************************************************************** */
46*4882a593Smuzhiyun /* TX policy cache							*/
47*4882a593Smuzhiyun /* Intention of TX policy cache is an overcomplicated WSM API.
48*4882a593Smuzhiyun  * Device does not accept per-PDU tx retry sequence.
49*4882a593Smuzhiyun  * It uses "tx retry policy id" instead, so driver code has to sync
50*4882a593Smuzhiyun  * linux tx retry sequences with a retry policy table in the device.
51*4882a593Smuzhiyun  */
52*4882a593Smuzhiyun void tx_policy_init(struct cw1200_common *priv);
53*4882a593Smuzhiyun void tx_policy_upload_work(struct work_struct *work);
54*4882a593Smuzhiyun void tx_policy_clean(struct cw1200_common *priv);
55*4882a593Smuzhiyun 
56*4882a593Smuzhiyun /* ******************************************************************** */
57*4882a593Smuzhiyun /* TX implementation							*/
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun u32 cw1200_rate_mask_to_wsm(struct cw1200_common *priv,
60*4882a593Smuzhiyun 			       u32 rates);
61*4882a593Smuzhiyun void cw1200_tx(struct ieee80211_hw *dev,
62*4882a593Smuzhiyun 	       struct ieee80211_tx_control *control,
63*4882a593Smuzhiyun 	       struct sk_buff *skb);
64*4882a593Smuzhiyun void cw1200_skb_dtor(struct cw1200_common *priv,
65*4882a593Smuzhiyun 		     struct sk_buff *skb,
66*4882a593Smuzhiyun 		     const struct cw1200_txpriv *txpriv);
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun /* ******************************************************************** */
69*4882a593Smuzhiyun /* WSM callbacks							*/
70*4882a593Smuzhiyun 
71*4882a593Smuzhiyun void cw1200_tx_confirm_cb(struct cw1200_common *priv,
72*4882a593Smuzhiyun 			  int link_id,
73*4882a593Smuzhiyun 			  struct wsm_tx_confirm *arg);
74*4882a593Smuzhiyun void cw1200_rx_cb(struct cw1200_common *priv,
75*4882a593Smuzhiyun 		  struct wsm_rx *arg,
76*4882a593Smuzhiyun 		  int link_id,
77*4882a593Smuzhiyun 		  struct sk_buff **skb_p);
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun /* ******************************************************************** */
80*4882a593Smuzhiyun /* Timeout								*/
81*4882a593Smuzhiyun 
82*4882a593Smuzhiyun void cw1200_tx_timeout(struct work_struct *work);
83*4882a593Smuzhiyun 
84*4882a593Smuzhiyun /* ******************************************************************** */
85*4882a593Smuzhiyun /* Security								*/
86*4882a593Smuzhiyun int cw1200_alloc_key(struct cw1200_common *priv);
87*4882a593Smuzhiyun void cw1200_free_key(struct cw1200_common *priv, int idx);
88*4882a593Smuzhiyun void cw1200_free_keys(struct cw1200_common *priv);
89*4882a593Smuzhiyun int cw1200_upload_keys(struct cw1200_common *priv);
90*4882a593Smuzhiyun 
91*4882a593Smuzhiyun /* ******************************************************************** */
92*4882a593Smuzhiyun /* Workaround for WFD test case 6.1.10					*/
93*4882a593Smuzhiyun void cw1200_link_id_reset(struct work_struct *work);
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun #define CW1200_LINK_ID_GC_TIMEOUT ((unsigned long)(10 * HZ))
96*4882a593Smuzhiyun 
97*4882a593Smuzhiyun int cw1200_find_link_id(struct cw1200_common *priv, const u8 *mac);
98*4882a593Smuzhiyun int cw1200_alloc_link_id(struct cw1200_common *priv, const u8 *mac);
99*4882a593Smuzhiyun void cw1200_link_id_work(struct work_struct *work);
100*4882a593Smuzhiyun void cw1200_link_id_gc_work(struct work_struct *work);
101*4882a593Smuzhiyun 
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun #endif /* CW1200_TXRX_H */
104