diff options
author | Felix Fietkau | 2018-01-24 16:19:14 +0100 |
---|---|---|
committer | Kalle Valo | 2018-01-26 10:18:39 +0100 |
commit | aee5b8cf2477bbb293cb84a4f726f5c0f91f587e (patch) | |
tree | dc5e4cdb5f4c35af89432ad85bf13c8693b96552 /drivers/net/wireless/mediatek/mt76/mt76.h | |
parent | mt76: get station pointer by wcid and pass it to mac80211 (diff) | |
download | kernel-qcow2-linux-aee5b8cf2477bbb293cb84a4f726f5c0f91f587e.tar.gz kernel-qcow2-linux-aee5b8cf2477bbb293cb84a4f726f5c0f91f587e.tar.xz kernel-qcow2-linux-aee5b8cf2477bbb293cb84a4f726f5c0f91f587e.zip |
mt76: implement A-MPDU rx reordering in the driver code
This is required for performing CCMP PN validation in software
Signed-off-by: Felix Fietkau <nbd@nbd.name>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Diffstat (limited to 'drivers/net/wireless/mediatek/mt76/mt76.h')
-rw-r--r-- | drivers/net/wireless/mediatek/mt76/mt76.h | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/drivers/net/wireless/mediatek/mt76/mt76.h b/drivers/net/wireless/mediatek/mt76/mt76.h index e20c52607c66..cde199ed3f57 100644 --- a/drivers/net/wireless/mediatek/mt76/mt76.h +++ b/drivers/net/wireless/mediatek/mt76/mt76.h @@ -122,6 +122,10 @@ struct mt76_queue_ops { }; struct mt76_wcid { + struct mt76_rx_tid __rcu *aggr[IEEE80211_NUM_TIDS]; + + struct work_struct aggr_work; + u8 idx; u8 hw_key_idx; @@ -152,6 +156,24 @@ struct mt76_txwi_cache { struct list_head list; }; + +struct mt76_rx_tid { + struct rcu_head rcu_head; + + struct mt76_dev *dev; + + spinlock_t lock; + struct delayed_work reorder_work; + + u16 head; + u8 size; + u8 nframes; + + u8 started:1, stopped:1, timer_pending:1; + + struct sk_buff *reorder_buf[]; +}; + enum { MT76_STATE_INITIALIZED, MT76_STATE_RUNNING, @@ -254,6 +276,13 @@ struct mt76_rate_power { struct mt76_rx_status { struct mt76_wcid *wcid; + + unsigned long reorder_time; + + u8 aggr; + u8 tid; + u16 seqno; + u32 flag; u16 freq; u8 enc_flags; @@ -380,9 +409,15 @@ void mt76_set_channel(struct mt76_dev *dev); int mt76_get_survey(struct ieee80211_hw *hw, int idx, struct survey_info *survey); +int mt76_rx_aggr_start(struct mt76_dev *dev, struct mt76_wcid *wcid, u8 tid, + u16 ssn, u8 size); +void mt76_rx_aggr_stop(struct mt76_dev *dev, struct mt76_wcid *wcid, u8 tid); + /* internal */ void mt76_tx_free(struct mt76_dev *dev); void mt76_put_txwi(struct mt76_dev *dev, struct mt76_txwi_cache *t); void mt76_rx_complete(struct mt76_dev *dev, enum mt76_rxq_id q); +void mt76_rx_aggr_reorder(struct sk_buff *skb, struct sk_buff_head *frames); +struct ieee80211_sta *mt76_rx_convert(struct sk_buff *skb); #endif |