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