1*4a5fb1bbSJérôme Pouiller /* SPDX-License-Identifier: GPL-2.0-only */ 2*4a5fb1bbSJérôme Pouiller /* 3*4a5fb1bbSJérôme Pouiller * Data transmitting implementation. 4*4a5fb1bbSJérôme Pouiller * 5*4a5fb1bbSJérôme Pouiller * Copyright (c) 2017-2020, Silicon Laboratories, Inc. 6*4a5fb1bbSJérôme Pouiller * Copyright (c) 2010, ST-Ericsson 7*4a5fb1bbSJérôme Pouiller */ 8*4a5fb1bbSJérôme Pouiller #ifndef WFX_DATA_TX_H 9*4a5fb1bbSJérôme Pouiller #define WFX_DATA_TX_H 10*4a5fb1bbSJérôme Pouiller 11*4a5fb1bbSJérôme Pouiller #include <linux/list.h> 12*4a5fb1bbSJérôme Pouiller #include <net/mac80211.h> 13*4a5fb1bbSJérôme Pouiller 14*4a5fb1bbSJérôme Pouiller #include "hif_api_cmd.h" 15*4a5fb1bbSJérôme Pouiller #include "hif_api_mib.h" 16*4a5fb1bbSJérôme Pouiller 17*4a5fb1bbSJérôme Pouiller struct wfx_tx_priv; 18*4a5fb1bbSJérôme Pouiller struct wfx_dev; 19*4a5fb1bbSJérôme Pouiller struct wfx_vif; 20*4a5fb1bbSJérôme Pouiller 21*4a5fb1bbSJérôme Pouiller struct wfx_tx_policy { 22*4a5fb1bbSJérôme Pouiller struct list_head link; 23*4a5fb1bbSJérôme Pouiller int usage_count; 24*4a5fb1bbSJérôme Pouiller u8 rates[12]; 25*4a5fb1bbSJérôme Pouiller bool uploaded; 26*4a5fb1bbSJérôme Pouiller }; 27*4a5fb1bbSJérôme Pouiller 28*4a5fb1bbSJérôme Pouiller struct wfx_tx_policy_cache { 29*4a5fb1bbSJérôme Pouiller struct wfx_tx_policy cache[HIF_TX_RETRY_POLICY_MAX]; 30*4a5fb1bbSJérôme Pouiller /* FIXME: use a trees and drop hash from tx_policy */ 31*4a5fb1bbSJérôme Pouiller struct list_head used; 32*4a5fb1bbSJérôme Pouiller struct list_head free; 33*4a5fb1bbSJérôme Pouiller spinlock_t lock; 34*4a5fb1bbSJérôme Pouiller }; 35*4a5fb1bbSJérôme Pouiller 36*4a5fb1bbSJérôme Pouiller struct wfx_tx_priv { 37*4a5fb1bbSJérôme Pouiller ktime_t xmit_timestamp; 38*4a5fb1bbSJérôme Pouiller unsigned char icv_size; 39*4a5fb1bbSJérôme Pouiller }; 40*4a5fb1bbSJérôme Pouiller 41*4a5fb1bbSJérôme Pouiller void wfx_tx_policy_init(struct wfx_vif *wvif); 42*4a5fb1bbSJérôme Pouiller void wfx_tx_policy_upload_work(struct work_struct *work); 43*4a5fb1bbSJérôme Pouiller 44*4a5fb1bbSJérôme Pouiller void wfx_tx(struct ieee80211_hw *hw, struct ieee80211_tx_control *control, struct sk_buff *skb); 45*4a5fb1bbSJérôme Pouiller void wfx_tx_confirm_cb(struct wfx_dev *wdev, const struct wfx_hif_cnf_tx *arg); 46*4a5fb1bbSJérôme Pouiller void wfx_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif, u32 queues, bool drop); 47*4a5fb1bbSJérôme Pouiller wfx_skb_tx_priv(struct sk_buff * skb)48*4a5fb1bbSJérôme Pouillerstatic inline struct wfx_tx_priv *wfx_skb_tx_priv(struct sk_buff *skb) 49*4a5fb1bbSJérôme Pouiller { 50*4a5fb1bbSJérôme Pouiller struct ieee80211_tx_info *tx_info; 51*4a5fb1bbSJérôme Pouiller 52*4a5fb1bbSJérôme Pouiller if (!skb) 53*4a5fb1bbSJérôme Pouiller return NULL; 54*4a5fb1bbSJérôme Pouiller tx_info = IEEE80211_SKB_CB(skb); 55*4a5fb1bbSJérôme Pouiller return (struct wfx_tx_priv *)tx_info->rate_driver_data; 56*4a5fb1bbSJérôme Pouiller } 57*4a5fb1bbSJérôme Pouiller wfx_skb_txreq(struct sk_buff * skb)58*4a5fb1bbSJérôme Pouillerstatic inline struct wfx_hif_req_tx *wfx_skb_txreq(struct sk_buff *skb) 59*4a5fb1bbSJérôme Pouiller { 60*4a5fb1bbSJérôme Pouiller struct wfx_hif_msg *hif = (struct wfx_hif_msg *)skb->data; 61*4a5fb1bbSJérôme Pouiller struct wfx_hif_req_tx *req = (struct wfx_hif_req_tx *)hif->body; 62*4a5fb1bbSJérôme Pouiller 63*4a5fb1bbSJérôme Pouiller return req; 64*4a5fb1bbSJérôme Pouiller } 65*4a5fb1bbSJérôme Pouiller 66*4a5fb1bbSJérôme Pouiller #endif 67