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