Commit 6f4d7cc8 authored by Lorenzo Bianconi's avatar Lorenzo Bianconi Committed by Felix Fietkau

mt76: mt7615: add mt7615_mcu_ops data structure

Introduce mt7615_mcu_ops data structure in order to support multiple
mcu ops API.
Move mt7615_mcu_set_{tx,rx}_ba to mt7615_mcu_ops differentiating between
fw v1 and v2. This is a preliminary patch to properly support mt7663e
firmware.
Rework utility routines to rely on skb APIs for msg parsing
Signed-off-by: default avatarLorenzo Bianconi <lorenzo@kernel.org>
Signed-off-by: default avatarFelix Fietkau <nbd@nbd.name>
parent f4d45fe2
...@@ -578,21 +578,21 @@ mt7615_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif, ...@@ -578,21 +578,21 @@ mt7615_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
case IEEE80211_AMPDU_RX_START: case IEEE80211_AMPDU_RX_START:
mt76_rx_aggr_start(&dev->mt76, &msta->wcid, tid, ssn, mt76_rx_aggr_start(&dev->mt76, &msta->wcid, tid, ssn,
params->buf_size); params->buf_size);
mt7615_mcu_set_rx_ba(dev, params, 1); mt7615_mcu_add_rx_ba(dev, params, true);
break; break;
case IEEE80211_AMPDU_RX_STOP: case IEEE80211_AMPDU_RX_STOP:
mt76_rx_aggr_stop(&dev->mt76, &msta->wcid, tid); mt76_rx_aggr_stop(&dev->mt76, &msta->wcid, tid);
mt7615_mcu_set_rx_ba(dev, params, 0); mt7615_mcu_add_rx_ba(dev, params, false);
break; break;
case IEEE80211_AMPDU_TX_OPERATIONAL: case IEEE80211_AMPDU_TX_OPERATIONAL:
mtxq->aggr = true; mtxq->aggr = true;
mtxq->send_bar = false; mtxq->send_bar = false;
mt7615_mcu_set_tx_ba(dev, params, 1); mt7615_mcu_add_tx_ba(dev, params, true);
break; break;
case IEEE80211_AMPDU_TX_STOP_FLUSH: case IEEE80211_AMPDU_TX_STOP_FLUSH:
case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT: case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT:
mtxq->aggr = false; mtxq->aggr = false;
mt7615_mcu_set_tx_ba(dev, params, 0); mt7615_mcu_add_tx_ba(dev, params, false);
break; break;
case IEEE80211_AMPDU_TX_START: case IEEE80211_AMPDU_TX_START:
mtxq->agg_ssn = IEEE80211_SN_TO_SEQ(ssn); mtxq->agg_ssn = IEEE80211_SN_TO_SEQ(ssn);
...@@ -600,7 +600,7 @@ mt7615_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif, ...@@ -600,7 +600,7 @@ mt7615_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
break; break;
case IEEE80211_AMPDU_TX_STOP_CONT: case IEEE80211_AMPDU_TX_STOP_CONT:
mtxq->aggr = false; mtxq->aggr = false;
mt7615_mcu_set_tx_ba(dev, params, 0); mt7615_mcu_add_tx_ba(dev, params, false);
ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid); ieee80211_stop_tx_ba_cb_irqsafe(vif, sta->addr, tid);
break; break;
} }
......
...@@ -274,6 +274,11 @@ enum { ...@@ -274,6 +274,11 @@ enum {
__DBDC_TYPE_MAX, __DBDC_TYPE_MAX,
}; };
struct tlv {
__le16 tag;
__le16 len;
} __packed;
struct bss_info_omac { struct bss_info_omac {
__le16 tag; __le16 tag;
__le16 len; __le16 len;
...@@ -496,6 +501,16 @@ struct wtbl_raw { ...@@ -496,6 +501,16 @@ struct wtbl_raw {
sizeof(struct wtbl_pn) + \ sizeof(struct wtbl_pn) + \
sizeof(struct wtbl_spe)) sizeof(struct wtbl_spe))
#define MT7615_STA_UPDATE_MAX_SIZE (sizeof(struct sta_req_hdr) + \
sizeof(struct sta_rec_basic) + \
sizeof(struct sta_rec_ht) + \
sizeof(struct sta_rec_vht) + \
sizeof(struct sta_rec_wtbl) + \
MT7615_WTBL_UPDATE_MAX_SIZE)
#define MT7615_WTBL_UPDATE_BA_SIZE (sizeof(struct wtbl_req_hdr) + \
sizeof(struct wtbl_ba))
enum { enum {
WTBL_GENERIC, WTBL_GENERIC,
WTBL_RX, WTBL_RX,
...@@ -517,6 +532,11 @@ enum { ...@@ -517,6 +532,11 @@ enum {
WTBL_MAX_NUM WTBL_MAX_NUM
}; };
struct sta_ntlv_hdr {
u8 rsv[2];
__le16 tlv_num;
} __packed;
struct sta_req_hdr { struct sta_req_hdr {
u8 bss_idx; u8 bss_idx;
u8 wlan_idx; u8 wlan_idx;
......
...@@ -144,6 +144,17 @@ struct mt7615_phy { ...@@ -144,6 +144,17 @@ struct mt7615_phy {
struct mib_stats mib; struct mib_stats mib;
}; };
#define mt7615_mcu_add_tx_ba(dev, ...) (dev)->mcu_ops->add_tx_ba((dev), __VA_ARGS__)
#define mt7615_mcu_add_rx_ba(dev, ...) (dev)->mcu_ops->add_rx_ba((dev), __VA_ARGS__)
struct mt7615_mcu_ops {
int (*add_tx_ba)(struct mt7615_dev *dev,
struct ieee80211_ampdu_params *params,
bool enable);
int (*add_rx_ba)(struct mt7615_dev *dev,
struct ieee80211_ampdu_params *params,
bool enable);
};
struct mt7615_dev { struct mt7615_dev {
union { /* must be first */ union { /* must be first */
struct mt76_dev mt76; struct mt76_dev mt76;
...@@ -156,6 +167,7 @@ struct mt7615_dev { ...@@ -156,6 +167,7 @@ struct mt7615_dev {
u16 chainmask; u16 chainmask;
const struct mt7615_mcu_ops *mcu_ops;
struct regmap *infracfg; struct regmap *infracfg;
struct work_struct mcu_work; struct work_struct mcu_work;
...@@ -302,12 +314,6 @@ int mt7615_mcu_set_bcn(struct ieee80211_hw *hw, struct ieee80211_vif *vif, ...@@ -302,12 +314,6 @@ int mt7615_mcu_set_bcn(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
int mt7615_mcu_set_chan_info(struct mt7615_phy *phy, int cmd); int mt7615_mcu_set_chan_info(struct mt7615_phy *phy, int cmd);
int mt7615_mcu_set_wmm(struct mt7615_dev *dev, u8 queue, int mt7615_mcu_set_wmm(struct mt7615_dev *dev, u8 queue,
const struct ieee80211_tx_queue_params *params); const struct ieee80211_tx_queue_params *params);
int mt7615_mcu_set_tx_ba(struct mt7615_dev *dev,
struct ieee80211_ampdu_params *params,
bool add);
int mt7615_mcu_set_rx_ba(struct mt7615_dev *dev,
struct ieee80211_ampdu_params *params,
bool add);
void mt7615_mcu_rx_event(struct mt7615_dev *dev, struct sk_buff *skb); void mt7615_mcu_rx_event(struct mt7615_dev *dev, struct sk_buff *skb);
int mt7615_mcu_rdd_cmd(struct mt7615_dev *dev, int mt7615_mcu_rdd_cmd(struct mt7615_dev *dev,
enum mt7615_rdd_cmd cmd, u8 index, enum mt7615_rdd_cmd cmd, u8 index,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment