Introduce mt7663e support to mt7615 driver
Subsystems (2)
Lorenzo Bianconi
maintainerv4 cover Introduce mt7663e support to mt7615 driver
Introduce support for mt7663e 802.11ac 2x2:2 chipset to mt7615 driver. Introduce mt7615e_reg_map and mt7663e_regmap to reuse mt7615 code. MCU code refactoring.
Introduce UNI MCU commands.
Changes since v3:
- align commands to new firmware version
Changes since v2:
- fix nss configuration
- remove mt7615_mcu_uni_set_state routine
Changes since v1:
- MCU code refactoring
- Introduce UNI MCU commands for firmware v3
- add firmware v3 support
Lorenzo Bianconi (25):
mt76: mt7615: introduce mt7615_mcu_fill_msg
mt76: mt7615: introduce mt7615_mcu_wait_response
mt76: mt7615: cleanup fw queue just for mmio devices
mt76: mt7615: introduce mt7615_init_device routine
mt76: always init to 0 mcu messages
mt76: mt7615: introduce mt7615_mcu_send_message routine
mt76: mt7615: add mt7615_mcu_ops data structure
mt76: mt7615: move mt7615_mcu_set_bmc to mt7615_mcu_ops
mt76: mt7615: move mt7615_mcu_set_sta in mt7615_mcu_ops
mt76: mt7615: rely on skb API for mt7615_mcu_set_eeprom
mt76: mt7615: rework mt7615_mcu_set_bss_info using skb APIs
mt76: mt7615: move more mcu commands in mt7615_mcu_ops data structure
mt76: mt7615: introduce MCU_FW_PREFIX for fw mcu commands
mt76: mt7615: introduce mt7615_register_map
mt76: mt7615: add mt7663e support to mt7615_reg_map
mt76: mt7615: add mt7663e support to mt7615_{driver,firmware}_own
mt76: mt7615: add mt7663e support to mt7615_mcu_set_eeprom
mt76: mt7615: introduce mt7615_eeprom_parse_hw_band_cap routine
mt76: mt7615: introduce mt7615_init_mac_chain routine
mt76: mt7615: introduce uni cmd command types
mt76: mt7615: introduce set_bmc and st_sta for uni commands
mt76: mt7615: add more uni mcu commands
mt76: mt7615: introduce set_ba uni command
mt76: mt7615: get rid of sta_rec_wtbl data structure
mt76: mt7615: introduce mt7663e support
drivers/net/wireless/mediatek/mt76/mcu.c | 6 +- drivers/net/wireless/mediatek/mt76/mt76.h | 4 + .../net/wireless/mediatek/mt76/mt7603/mcu.c | 1 - .../net/wireless/mediatek/mt76/mt7615/dma.c | 50 +- .../wireless/mediatek/mt76/mt7615/eeprom.c | 66 +- .../wireless/mediatek/mt76/mt7615/eeprom.h | 2 + .../net/wireless/mediatek/mt76/mt7615/init.c | 157 +- .../net/wireless/mediatek/mt76/mt7615/mac.c | 23 +- .../net/wireless/mediatek/mt76/mt7615/mac.h | 11 +- .../net/wireless/mediatek/mt76/mt7615/main.c | 36 +- .../net/wireless/mediatek/mt76/mt7615/mcu.c | 2761 ++++++++++------- .../net/wireless/mediatek/mt76/mt7615/mcu.h | 144 +- .../net/wireless/mediatek/mt76/mt7615/mmio.c | 67 +- .../wireless/mediatek/mt76/mt7615/mt7615.h | 63 +- .../net/wireless/mediatek/mt76/mt7615/pci.c | 8 +- .../net/wireless/mediatek/mt76/mt7615/regs.h | 87 +- .../net/wireless/mediatek/mt76/mt7615/soc.c | 2 +- 17 files changed, 2197 insertions(+), 1291 deletions(-)
Signature · 1 line
2.25.1
Lorenzo Bianconi
maintainerPATCH v4 1/25 mt76: mt7615: introduce mt7615_mcu_fill_msg
Introduce mt7615_mcu_fill_msg routine to initialize mcu messages. mt7615_mcu_fill_msg will be reused adding mt7663u support
--- .../net/wireless/mediatek/mt76/mt7615/mcu.c | 20 +++++++++++-------- .../wireless/mediatek/mt76/mt7615/mt7615.h | 2 ++ 2 files changed, 14 insertions(+), 8 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +12 -8
@@ -49,22 +49,20 @@ struct mt7615_fw_trailer {#define FW_START_OVERRIDE BIT(0)#define FW_START_WORKING_PDA_CR4 BIT(2) -static int __mt7615_mcu_msg_send (struct mt7615_dev *dev,struct sk_buff *skb, -int cmd,int *wait_seq) +void mt7615_mcu_fill_msg (struct mt7615_dev *dev,struct sk_buff *skb, +int cmd,int *wait_seq) {struct mt7615_mcu_txd *mcu_txd;u8 seq, q_idx, pkt_fmt; -enum mt76_txq_id qid; -u32 val;__le32 *txd; +u32 val; seq = ++dev->mt76.mcu.msg_seq &0xf ;if (!seq) seq = ++dev->mt76.mcu.msg_seq &0xf ; - mcu_txd = (struct mt7615_mcu_txd *)skb_push (skb, -sizeof (struct mt7615_mcu_txd )); -memset (mcu_txd,0 ,sizeof (struct mt7615_mcu_txd )); + mcu_txd = (struct mt7615_mcu_txd *)skb_push (skb,sizeof (*mcu_txd)); +memset (mcu_txd,0 ,sizeof (*mcu_txd));if (cmd != -MCU_CMD_FW_SCATTER ) { q_idx =MT_TX_MCU_PORT_RX_Q0 ;
@@ -73,7 +71,6 @@ static int __mt7615_mcu_msg_send(struct mt7615_dev *dev, struct sk_buff *skb, q_idx =MT_TX_MCU_PORT_RX_FWDL ; pkt_fmt =MT_TX_TYPE_FW ; } - txd = mcu_txd->txd; val = FIELD_PREP(MT_TXD0_TX_BYTES, skb->len) |
@@ -104,7 +101,14 @@ static int __mt7615_mcu_msg_send(struct mt7615_dev *dev, struct sk_buff *skb,if (wait_seq) *wait_seq = seq; +} + +static int __mt7615_mcu_msg_send (struct mt7615_dev *dev,struct sk_buff *skb, +int cmd,int *wait_seq) +{ +enum mt76_txq_id qid; +mt7615_mcu_fill_msg (dev, skb, cmd, wait_seq);if (test_bit (MT76_STATE_MCU_RUNNING , &dev->mphy.state)) qid =MT_TXQ_MCU ;else
drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h +2 -0
@@ -364,6 +364,8 @@ int mt7615_mcu_set_rts_thresh(struct mt7615_phy *phy, u32 val);int mt7615_mcu_ctrl_pm_state (struct mt7615_dev *dev,int band,int enter);int mt7615_mcu_get_temperature (struct mt7615_dev *dev,int index);void mt7615_mcu_exit (struct mt7615_dev *dev); +void mt7615_mcu_fill_msg (struct mt7615_dev *dev,struct sk_buff *skb, +int cmd,int *wait_seq); int mt7615_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr, enum mt76_txq_id qid, struct mt76_wcid *wcid,
Signature · 1 line
2.25.1
Lorenzo Bianconi
maintainerPATCH v4 2/25 mt76: mt7615: introduce mt7615_mcu_wait_response
In reply to Lorenzo BianconiIntroduce mt7615_mcu_wait_response in order to be reused parsing mt7663u mcu messages
--- .../net/wireless/mediatek/mt76/mt7615/mcu.c | 38 ++++++++++++------- 1 file changed, 24 insertions(+), 14 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +24 -14
@@ -144,12 +144,33 @@ mt7615_mcu_parse_response(struct mt7615_dev *dev, int cmd,return ret; } +int mt7615_mcu_wait_response (struct mt7615_dev *dev,int cmd,int seq) +{ +unsigned long expires = jiffies +20 *HZ ; +struct sk_buff *skb; +int ret =0 ; + +while (true) { + skb =mt76_mcu_get_response (&dev->mt76, expires); +if (!skb) { +dev_err (dev->mt76.dev,"Message %d (seq %d) timeout\n" , + cmd, seq); +return -ETIMEDOUT ; + } + + ret =mt7615_mcu_parse_response (dev, cmd, skb, seq); +if (ret != -EAGAIN ) +break ; + } + +return ret; +} +static int mt7615_mcu_msg_send (struct mt76_dev *mdev,int cmd,const void *data,int len,bool wait_resp) { struct mt7615_dev *dev = container_of(mdev, struct mt7615_dev, mt76); -unsigned long expires = jiffies +20 *HZ ;struct sk_buff *skb;int ret, seq;
@@ -163,19 +184,8 @@ mt7615_mcu_msg_send(struct mt76_dev *mdev, int cmd, const void *data,if (ret) goto out; -while (wait_resp) { - skb =mt76_mcu_get_response (mdev, expires); -if (!skb) { -dev_err (mdev->dev,"Message %d (seq %d) timeout\n" , - cmd, seq); - ret = -ETIMEDOUT ; -break ; - } - - ret =mt7615_mcu_parse_response (dev, cmd, skb, seq); -if (ret != -EAGAIN ) -break ; - } +if (wait_resp) + ret =mt7615_mcu_wait_response (dev, cmd, seq); out:mutex_unlock (&mdev->mcu.mutex);
Signature · 1 line
2.25.1
Lorenzo Bianconi
maintainerPATCH v4 3/25 mt76: mt7615: cleanup fw queue just for mmio devices
In reply to Lorenzo BianconiIn order to reuse mt7615_mcu_send_firmware routine adding support for usb devices, clean fw hw queue just for mmio devices
--- drivers/net/wireless/mediatek/mt76/mt7615/mcu.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +3 -1
@@ -321,7 +321,9 @@ static int mt7615_mcu_send_firmware(struct mt7615_dev *dev, const void *data, data += cur_len; len -= cur_len; -mt76_queue_tx_cleanup (dev,MT_TXQ_FWDL , false); + +if (mt76_is_mmio (&dev->mt76)) +mt76_queue_tx_cleanup (dev,MT_TXQ_FWDL , false); }return ret;
Signature · 1 line
2.25.1
Lorenzo Bianconi
maintainerPATCH v4 4/25 mt76: mt7615: introduce mt7615_init_device routine
In reply to Lorenzo BianconiAdd mt7615_init_device routine in order to be reused adding support for mt7663 in mt7615 driver
--- .../net/wireless/mediatek/mt76/mt7615/init.c | 27 +++++++++++-------- .../wireless/mediatek/mt76/mt7615/mt7615.h | 1 + 2 files changed, 17 insertions(+), 11 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/init.c +16 -11
@@ -429,11 +429,9 @@ void mt7615_unregister_ext_phy(struct mt7615_dev *dev)ieee80211_free_hw (mphy->hw); } - -int mt7615_register_device (struct mt7615_dev *dev) +void mt7615_init_device (struct mt7615_dev *dev) {struct ieee80211_hw *hw =mt76_hw (dev); -int ret; dev->phy.dev = dev; dev->phy.mt76 = &dev->mt76.phy;
@@ -444,14 +442,6 @@ int mt7615_register_device(struct mt7615_dev *dev)init_waitqueue_head (&dev->reset_wait);INIT_WORK (&dev->reset_work, mt7615_mac_reset_work); - ret =mt7622_wmac_init (dev); -if (ret) -return ret; - - ret =mt7615_init_hardware (dev); -if (ret) -return ret; -mt7615_init_wiphy (hw); dev->mphy.sband_2g.sband.ht_cap.cap |=IEEE80211_HT_CAP_LDPC_CODING ; dev->mphy.sband_5g.sband.ht_cap.cap |=IEEE80211_HT_CAP_LDPC_CODING ;
@@ -460,6 +450,13 @@ int mt7615_register_device(struct mt7615_dev *dev)IEEE80211_VHT_CAP_MAX_A_MPDU_LENGTH_EXPONENT_MASK ;mt7615_cap_dbdc_disable (dev); dev->phy.dfs_state =-1 ; +} + +int mt7615_register_device (struct mt7615_dev *dev) +{ +int ret; + +mt7615_init_device (dev);/* init led callbacks */ if (IS_ENABLED (CONFIG_MT76_LEDS )) {
@@ -467,6 +464,14 @@ int mt7615_register_device(struct mt7615_dev *dev) dev->mt76.led_cdev.blink_set = mt7615_led_set_blink; } + ret =mt7622_wmac_init (dev); +if (ret) +return ret; + + ret =mt7615_init_hardware (dev); +if (ret) +return ret; + ret =mt76_register_device (&dev->mt76, true, mt7615_rates,ARRAY_SIZE (mt7615_rates));if (ret)
drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h +1 -0
@@ -272,6 +272,7 @@ static inline int mt7622_wmac_init(struct mt7615_dev *dev)int mt7615_mmio_probe (struct device *pdev,void __iomem *mem_base,int irq);u32 mt7615_reg_map (struct mt7615_dev *dev,u32 addr); +void mt7615_init_device (struct mt7615_dev *dev);int mt7615_register_device (struct mt7615_dev *dev);void mt7615_unregister_device (struct mt7615_dev *dev);int mt7615_register_ext_phy (struct mt7615_dev *dev);
Signature · 1 line
2.25.1
Lorenzo Bianconi
maintainerPATCH v4 5/25 mt76: always init to 0 mcu messages
In reply to Lorenzo BianconiAlways initialize to 0 mcu messages since if they are not propely configured they could hang the firmware.
--- drivers/net/wireless/mediatek/mt76/mcu.c | 6 ++++-- drivers/net/wireless/mediatek/mt76/mt7603/mcu.c | 1 - drivers/net/wireless/mediatek/mt76/mt7615/mcu.c | 1 - 3 files changed, 4 insertions(+), 4 deletions(-)
drivers/net/wireless/mediatek/mt76/mcu.c +4 -2
@@ -9,14 +9,16 @@ struct sk_buff * mt76_mcu_msg_alloc(const void *data, int head_len, int data_len, int tail_len) { + int length = head_len + data_len + tail_len;struct sk_buff *skb; - skb =alloc_skb (head_len + data_len + tail_len, -GFP_KERNEL ); + skb =alloc_skb (length,GFP_KERNEL );if (!skb)return NULL ; +memset (skb->head,0 , length);skb_reserve (skb, head_len); +if (data && data_len)skb_put_data (skb, data, data_len);
drivers/net/wireless/mediatek/mt76/mt7603/mcu.c +0 -1
@@ -27,7 +27,6 @@ __mt7603_mcu_msg_send(struct mt7603_dev *dev, struct sk_buff *skb, seq = ++mdev->mcu.msg_seq &0xf ; txd = (struct mt7603_mcu_txd *)skb_push (skb, hdrlen); -memset (txd,0 , hdrlen); txd->len =cpu_to_le16 (skb->len);if (cmd == -MCU_CMD_FW_SCATTER )
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +0 -1
@@ -62,7 +62,6 @@ void mt7615_mcu_fill_msg(struct mt7615_dev *dev, struct sk_buff *skb, seq = ++dev->mt76.mcu.msg_seq &0xf ; mcu_txd = (struct mt7615_mcu_txd *)skb_push (skb,sizeof (*mcu_txd)); -memset (mcu_txd,0 ,sizeof (*mcu_txd));if (cmd != -MCU_CMD_FW_SCATTER ) { q_idx =MT_TX_MCU_PORT_RX_Q0 ;
Signature · 1 line
2.25.1
Lorenzo Bianconi
maintainerPATCH v4 6/25 mt76: mt7615: introduce mt7615_mcu_send_message routine
In reply to Lorenzo BianconiIntroduce mt7615_mcu_send_message routine in order to allocate mcu skb out of mcu sending routine. This approach is useful when the mcu message is complicated and it is convenient to rely on skb buffer API
--- drivers/net/wireless/mediatek/mt76/mt76.h | 4 ++++ .../net/wireless/mediatek/mt76/mt7615/mcu.c | 23 +++++++++++++------ 2 files changed, 20 insertions(+), 7 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76.h +4 -0
@@ -139,6 +139,8 @@ struct mt76_sw_queue {struct mt76_mcu_ops {int (*mcu_send_msg)(struct mt76_dev *dev,int cmd,const void *data,int len,bool wait_resp); +int (*mcu_skb_send_msg)(struct mt76_dev *dev,struct sk_buff *skb, +int cmd,bool wait_resp);int (*mcu_wr_rp)(struct mt76_dev *dev,u32 base,const struct mt76_reg_pair *rp,int len); int (*mcu_rd_rp)(struct mt76_dev *dev, u32 base,
@@ -588,7 +590,9 @@ enum mt76_phy_type {#define mt76_rd_rp (dev, ...) (dev)->mt76.bus->rd_rp(&((dev)->mt76), __VA_ARGS__)#define mt76_mcu_send_msg (dev, ...) (dev)->mt76.mcu_ops->mcu_send_msg(&((dev)->mt76), __VA_ARGS__) +#define __mt76_mcu_send_msg (dev, ...) (dev)->mcu_ops->mcu_send_msg((dev), __VA_ARGS__) +#define __mt76_mcu_skb_send_msg (dev, ...) (dev)->mcu_ops->mcu_skb_send_msg((dev), __VA_ARGS__)#define mt76_mcu_restart (dev, ...) (dev)->mt76.mcu_ops->mcu_restart(&((dev)->mt76))#define __mt76_mcu_restart (dev, ...) (dev)->mcu_ops->mcu_restart((dev))
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +16 -7
@@ -166,17 +166,12 @@ int mt7615_mcu_wait_response(struct mt7615_dev *dev, int cmd, int seq) }static int -mt7615_mcu_msg_send (struct mt76_dev *mdev,int cmd,const void *data, -int len,bool wait_resp) +mt7615_mcu_send_message (struct mt76_dev *mdev,struct sk_buff *skb, +int cmd,bool wait_resp) { struct mt7615_dev *dev = container_of(mdev, struct mt7615_dev, mt76); -struct sk_buff *skb;int ret, seq; - skb =mt7615_mcu_msg_alloc (data, len); -if (!skb) -return -ENOMEM ; -mutex_lock (&mdev->mcu.mutex); ret =__mt7615_mcu_msg_send (dev, skb, cmd, &seq);
@@ -192,6 +187,19 @@ mt7615_mcu_msg_send(struct mt76_dev *mdev, int cmd, const void *data,return ret; } +static int +mt7615_mcu_msg_send (struct mt76_dev *mdev,int cmd,const void *data, +int len,bool wait_resp) +{ +struct sk_buff *skb; + + skb =mt7615_mcu_msg_alloc (data, len); +if (!skb) +return -ENOMEM ; + +return __mt76_mcu_skb_send_msg (mdev, skb, cmd, wait_resp); +} +static void mt7615_mcu_csa_finish (void *priv,u8 *mac,struct ieee80211_vif *vif) {
@@ -704,6 +712,7 @@ int mt7615_mcu_fw_log_2_host(struct mt7615_dev *dev, u8 ctrl)int mt7615_mcu_init (struct mt7615_dev *dev) {static const struct mt76_mcu_ops mt7615_mcu_ops = { + .mcu_skb_send_msg = mt7615_mcu_send_message, .mcu_send_msg = mt7615_mcu_msg_send, .mcu_restart = mt7615_mcu_restart, };
Signature · 1 line
2.25.1
Lorenzo Bianconi
maintainerPATCH v4 7/25 mt76: mt7615: add mt7615_mcu_ops data structure
In reply to Lorenzo BianconiIntroduce 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
--- .../net/wireless/mediatek/mt76/mt7615/main.c | 10 +- .../net/wireless/mediatek/mt76/mt7615/mcu.c | 401 +++++++++++------- .../net/wireless/mediatek/mt76/mt7615/mcu.h | 20 + .../wireless/mediatek/mt76/mt7615/mt7615.h | 18 +- 4 files changed, 296 insertions(+), 153 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/main.c +5 -5
@@ -578,21 +578,21 @@ mt7615_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,case IEEE80211_AMPDU_RX_START :mt76_rx_aggr_start (&dev->mt76, &msta->wcid, tid, ssn, params->buf_size); -mt7615_mcu_set_rx_ba (dev, params,1 ); +mt7615_mcu_add_rx_ba (dev, params, true);break ;case IEEE80211_AMPDU_RX_STOP :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 ;case IEEE80211_AMPDU_TX_OPERATIONAL : mtxq->aggr = true; mtxq->send_bar = false; -mt7615_mcu_set_tx_ba (dev, params,1 ); +mt7615_mcu_add_tx_ba (dev, params, true);break ;case IEEE80211_AMPDU_TX_STOP_FLUSH :case IEEE80211_AMPDU_TX_STOP_FLUSH_CONT : mtxq->aggr = false; -mt7615_mcu_set_tx_ba (dev, params,0 ); +mt7615_mcu_add_tx_ba (dev, params, false);break ;case IEEE80211_AMPDU_TX_START : mtxq->agg_ssn =IEEE80211_SN_TO_SEQ (ssn);
@@ -600,7 +600,7 @@ mt7615_ampdu_action(struct ieee80211_hw *hw, struct ieee80211_vif *vif,break ;case IEEE80211_AMPDU_TX_STOP_CONT : 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);break ; }
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +259 -142
421 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7615/mcu.h +20 -0
@@ -274,6 +274,11 @@ enum { __DBDC_TYPE_MAX, }; +struct tlv { +__le16 tag; +__le16 len; +} __packed; +struct bss_info_omac {__le16 tag;__le16 len;
@@ -496,6 +501,16 @@ struct wtbl_raw { sizeof(struct wtbl_pn) + \ 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 {WTBL_GENERIC ,WTBL_RX ,
@@ -517,6 +532,11 @@ enum {WTBL_MAX_NUM }; +struct sta_ntlv_hdr { +u8 rsv[2 ]; +__le16 tlv_num; +} __packed; +struct sta_req_hdr {u8 bss_idx;u8 wlan_idx;
drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h +12 -6
@@ -144,6 +144,17 @@ struct mt7615_phy {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 {union {/* must be first */ struct mt76_dev mt76;
@@ -156,6 +167,7 @@ struct mt7615_dev {u16 chainmask; +const struct mt7615_mcu_ops *mcu_ops;struct regmap *infracfg;struct work_struct mcu_work;
@@ -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_wmm (struct mt7615_dev *dev,u8 queue,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); int mt7615_mcu_rdd_cmd(struct mt7615_dev *dev, enum mt7615_rdd_cmd cmd, u8 index,
Signature · 1 line
2.25.1
Lorenzo Bianconi
maintainerPATCH v4 8/25 mt76: mt7615: move mt7615_mcu_set_bmc to mt7615_mcu_ops
In reply to Lorenzo BianconiMove mt7615_mcu_set_bmc for fw version 1 and version 2 in mt7615_mcu_ops data structure. This is a preliminary patch to properly support mt7663e firmware.
Rework utility routines to rely on skb APIs for msg parsing
--- .../net/wireless/mediatek/mt76/mt7615/main.c | 2 +- .../net/wireless/mediatek/mt76/mt7615/mcu.c | 188 +++++++++++------- .../wireless/mediatek/mt76/mt7615/mt7615.h | 6 +- 3 files changed, 116 insertions(+), 80 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/main.c +1 -1
@@ -426,7 +426,7 @@ static void mt7615_bss_info_changed(struct ieee80211_hw *hw,if (changed &BSS_CHANGED_BEACON_ENABLED ) {mt7615_mcu_set_bss_info (dev, vif, info->enable_beacon); -mt7615_mcu_set_bmc (dev, vif, info->enable_beacon); +mt7615_mcu_sta_add (dev, vif,NULL , info->enable_beacon); } if (changed & (BSS_CHANGED_BEACON |
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +111 -77
224 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h +4 -2
@@ -146,6 +146,7 @@ struct mt7615_phy {#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__) +#define mt7615_mcu_sta_add (dev, ...) (dev)->mcu_ops->sta_add((dev), __VA_ARGS__)struct mt7615_mcu_ops { int (*add_tx_ba)(struct mt7615_dev *dev, struct ieee80211_ampdu_params *params,
@@ -153,6 +154,9 @@ struct mt7615_mcu_ops {int (*add_rx_ba)(struct mt7615_dev *dev,struct ieee80211_ampdu_params *params,bool enable); +int (*sta_add)(struct mt7615_dev *dev, +struct ieee80211_vif *vif, +struct ieee80211_sta *sta,bool enable); };struct mt7615_dev {
@@ -305,8 +309,6 @@ void mt7615_mac_set_rates(struct mt7615_phy *phy, struct mt7615_sta *sta,struct ieee80211_tx_rate *probe_rate, struct ieee80211_tx_rate *rates);int mt7615_mcu_del_wtbl_all (struct mt7615_dev *dev); -int mt7615_mcu_set_bmc (struct mt7615_dev *dev,struct ieee80211_vif *vif, -bool en);int mt7615_mcu_set_sta (struct mt7615_dev *dev,struct ieee80211_vif *vif,struct ieee80211_sta *sta,bool en); int mt7615_mcu_set_bcn(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
Signature · 1 line
2.25.1
Lorenzo Bianconi
maintainerPATCH v4 9/25 mt76: mt7615: move mt7615_mcu_set_sta in mt7615_mcu_ops
In reply to Lorenzo BianconiMove mt7615_mcu_set_sta for fw version 1 and version 2 in mt7615_mcu_ops data structure. This is a preliminary patch to properly support mt7663e firmware.
Rework utility routines to rely on skb APIs for msg parsing
--- .../net/wireless/mediatek/mt76/mt7615/main.c | 4 +- .../net/wireless/mediatek/mt76/mt7615/mcu.c | 399 +++++++----------- .../net/wireless/mediatek/mt76/mt7615/mcu.h | 24 +- .../wireless/mediatek/mt76/mt7615/mt7615.h | 2 - 4 files changed, 168 insertions(+), 261 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/main.c +2 -2
@@ -469,7 +469,7 @@ int mt7615_mac_sta_add(struct mt76_dev *mdev, struct ieee80211_vif *vif,mt7615_mac_wtbl_update (dev, idx,MT_WTBL_UPDATE_ADM_COUNT_CLEAR ); -mt7615_mcu_set_sta (dev, vif, sta,1 ); +mt7615_mcu_sta_add (dev, vif, sta, true);return 0 ; }
@@ -480,7 +480,7 @@ void mt7615_mac_sta_remove(struct mt76_dev *mdev, struct ieee80211_vif *vif, struct mt7615_dev *dev = container_of(mdev, struct mt7615_dev, mt76);struct mt7615_sta *msta = (struct mt7615_sta *)sta->drv_priv; -mt7615_mcu_set_sta (dev, vif, sta,0 ); +mt7615_mcu_sta_add (dev, vif, sta, false);mt7615_mac_wtbl_update (dev, msta->wcid.idx,MT_WTBL_UPDATE_ADM_COUNT_CLEAR );
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +154 -245
487 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7615/mcu.h +12 -12
@@ -488,18 +488,18 @@ struct wtbl_raw {__le32 val; } __packed; -#define MT7615_WTBL_UPDATE_MAX_SIZE (sizeof(struct wtbl_req_hdr) + \ - sizeof(struct wtbl_generic) + \ - sizeof(struct wtbl_rx) + \ - sizeof(struct wtbl_ht) + \ - sizeof(struct wtbl_vht) + \ - sizeof(struct wtbl_tx_ps) + \ - sizeof(struct wtbl_hdr_trans) + \ - sizeof(struct wtbl_ba) + \ - sizeof(struct wtbl_bf) + \ - sizeof(struct wtbl_smps) + \ - sizeof(struct wtbl_pn) + \ - sizeof(struct wtbl_spe)) +#define MT7615_WTBL_UPDATE_MAX_SIZE (sizeof(struct wtbl_req_hdr) + \ + sizeof(struct wtbl_generic) + \ + sizeof(struct wtbl_rx) + \ + sizeof(struct wtbl_ht) + \ + sizeof(struct wtbl_vht) + \ + sizeof(struct wtbl_tx_ps) + \ + sizeof(struct wtbl_hdr_trans) +\ + sizeof(struct wtbl_ba) + \ + sizeof(struct wtbl_bf) + \ + sizeof(struct wtbl_smps) + \ + sizeof(struct wtbl_pn) + \ + sizeof(struct wtbl_spe))#define MT7615_STA_UPDATE_MAX_SIZE (sizeof(struct sta_req_hdr) + \ sizeof(struct sta_rec_basic) + \
drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h +0 -2
@@ -309,8 +309,6 @@ void mt7615_mac_set_rates(struct mt7615_phy *phy, struct mt7615_sta *sta,struct ieee80211_tx_rate *probe_rate, struct ieee80211_tx_rate *rates);int mt7615_mcu_del_wtbl_all (struct mt7615_dev *dev); -int mt7615_mcu_set_sta (struct mt7615_dev *dev,struct ieee80211_vif *vif, -struct ieee80211_sta *sta,bool en);int mt7615_mcu_set_bcn (struct ieee80211_hw *hw,struct ieee80211_vif *vif,int en);int mt7615_mcu_set_chan_info (struct mt7615_phy *phy,int cmd);
Signature · 1 line
2.25.1
Lorenzo Bianconi
maintainerPATCH v4 10/25 mt76: mt7615: rely on skb API for mt7615_mcu_set_eeprom
In reply to Lorenzo BianconiRely on skb API and avoid kmalloc the buffer in mt7615_mcu_set_eeprom routine
--- .../net/wireless/mediatek/mt76/mt7615/mcu.c | 24 +++++++++---------- 1 file changed, 11 insertions(+), 13 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +11 -13
@@ -1262,28 +1262,26 @@ int mt7615_mcu_set_eeprom(struct mt7615_dev *dev) }__packed req_hdr = { .buffer_mode =1 , }; -int ret, len, eep_len; -u8 *req, *eep = (u8 *)dev->mt76.eeprom.data; +u8 *eep = (u8 *)dev->mt76.eeprom.data; +struct sk_buff *skb; +int eep_len;if (is_mt7622 (&dev->mt76)) eep_len =MT7622_EE_MAX -MT_EE_NIC_CONF_0 ;else eep_len =MT7615_EE_MAX -MT_EE_NIC_CONF_0 ; - len =sizeof (req_hdr) + eep_len; - req =kzalloc (len,GFP_KERNEL ); -if (!req) -return -ENOMEM ; - req_hdr.len =cpu_to_le16 (eep_len); -memcpy (req, &req_hdr,sizeof (req_hdr)); -memcpy (req +sizeof (req_hdr), eep +MT_EE_NIC_CONF_0 , eep_len); - ret =__mt76_mcu_send_msg (&dev->mt76,MCU_EXT_CMD_EFUSE_BUFFER_MODE , - req, len, true); -kfree (req); + skb =mt7615_mcu_msg_alloc (NULL ,sizeof (req_hdr) + eep_len); +if (!skb) +return -ENOMEM ; + +skb_put_data (skb, &req_hdr,sizeof (req_hdr)); +skb_put_data (skb, eep +MT_EE_NIC_CONF_0 , eep_len); -return ret; +return __mt76_mcu_skb_send_msg (&dev->mt76, skb, +MCU_EXT_CMD_EFUSE_BUFFER_MODE , true); }int mt7615_mcu_set_mac_enable (struct mt7615_dev *dev,int band,bool enable)
Signature · 1 line
2.25.1
Lorenzo Bianconi
maintainerPATCH v4 11/25 mt76: mt7615: rework mt7615_mcu_set_bss_info using skb APIs
In reply to Lorenzo BianconiSimplify mt7615_mcu_set_bss_info relying on mcu tlv helpers
--- .../net/wireless/mediatek/mt76/mt7615/mcu.c | 274 ++++++++---------- .../wireless/mediatek/mt76/mt7615/mt7615.h | 2 +- 2 files changed, 125 insertions(+), 151 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +124 -150
@@ -317,8 +317,8 @@ mt7615_mcu_alloc_sta_req(struct mt7615_vif *mvif, struct mt7615_sta *msta) {struct sta_req_hdr hdr = { .bss_idx = mvif->idx, - .wlan_idx = msta->wcid.idx, - .muar_idx = mvif->omac_idx, + .wlan_idx = msta ? msta->wcid.idx :0 , + .muar_idx = msta ? mvif->omac_idx :0 , .is_tlv_append =1 , };struct sk_buff *skb;
@@ -390,6 +390,115 @@ mt7615_mcu_add_tlv(struct sk_buff *skb, int tag, int len)return mt7615_mcu_add_nested_tlv (skb, tag, len, skb->data,NULL ); } +static int +mt7615_mcu_bss_basic_tlv (struct sk_buff *skb,struct ieee80211_vif *vif, +bool enable) +{ +struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv; +struct bss_info_basic *bss; +u8 wlan_idx = mvif->sta.wcid.idx; +u32 type =NETWORK_INFRA ; +struct tlv *tlv; + + tlv =mt7615_mcu_add_tlv (skb,BSS_INFO_BASIC ,sizeof (*bss)); + +switch (vif->type) { +case NL80211_IFTYPE_MESH_POINT : +case NL80211_IFTYPE_AP : +break ; +case NL80211_IFTYPE_STATION : +/* TODO: enable BSS_INFO_UAPSD & BSS_INFO_PM */ +if (enable) { +struct ieee80211_sta *sta; +struct mt7615_sta *msta; + +rcu_read_lock (); + sta =ieee80211_find_sta (vif, vif->bss_conf.bssid); +if (!sta) { +rcu_read_unlock (); +return -EINVAL ; + } + + msta = (struct mt7615_sta *)sta->drv_priv; + wlan_idx = msta->wcid.idx; +rcu_read_unlock (); + } +break ; +case NL80211_IFTYPE_ADHOC : + type =NETWORK_IBSS ; +break ; +default : +WARN_ON (1 ); +break ; + } + + bss = (struct bss_info_basic *)tlv; +memcpy (bss->bssid, vif->bss_conf.bssid,ETH_ALEN ); + bss->bcn_interval =cpu_to_le16 (vif->bss_conf.beacon_int); + bss->network_type =cpu_to_le32 (type); + bss->dtim_period = vif->bss_conf.dtim_period; + bss->bmc_tx_wlan_idx = wlan_idx; + bss->wmm_idx = mvif->wmm_idx; + bss->active = enable; + +return 0 ; +} + +static void +mt7615_mcu_bss_omac_tlv (struct sk_buff *skb,struct ieee80211_vif *vif) +{ +struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv; +struct bss_info_omac *omac; +struct tlv *tlv; +u32 type =0 ; +u8 idx; + + tlv =mt7615_mcu_add_tlv (skb,BSS_INFO_OMAC ,sizeof (*omac)); + +switch (vif->type) { +case NL80211_IFTYPE_MESH_POINT : +case NL80211_IFTYPE_AP : + type =CONNECTION_INFRA_AP ; +break ; +case NL80211_IFTYPE_STATION : + type =CONNECTION_INFRA_STA ; +break ; +case NL80211_IFTYPE_ADHOC : + type =CONNECTION_IBSS_ADHOC ; +break ; +default : +WARN_ON (1 ); +break ; + } + + omac = (struct bss_info_omac *)tlv; + idx = mvif->omac_idx >EXT_BSSID_START ?HW_BSSID_0 : mvif->omac_idx; + omac->conn_type =cpu_to_le32 (type); + omac->omac_idx = mvif->omac_idx; + omac->band_idx = mvif->band_idx; + omac->hw_bss_idx = idx; +} + +/* SIFS 20us + 512 byte beacon tranmitted by 1Mbps (3906us) */ +#define BCN_TX_ESTIMATE_TIME (4096 + 20) +static void +mt7615_mcu_bss_ext_tlv (struct sk_buff *skb,struct mt7615_vif *mvif) +{ +struct bss_info_ext_bss *ext; +int ext_bss_idx, tsf_offset; +struct tlv *tlv; + + ext_bss_idx = mvif->omac_idx -EXT_BSSID_START ; +if (ext_bss_idx <0 ) +return ; + + tlv =mt7615_mcu_add_tlv (skb,BSS_INFO_EXT_BSS ,sizeof (*ext)); + + ext = (struct bss_info_ext_bss *)tlv; + tsf_offset = ext_bss_idx *BCN_TX_ESTIMATE_TIME ; + ext->mbss_tsf_offset =cpu_to_le32 (tsf_offset); +} + static void mt7615_mcu_sta_ba_tlv(struct sk_buff *skb, struct ieee80211_ampdu_params *params,
@@ -1484,161 +1593,26 @@ int mt7615_mcu_set_dev_info(struct mt7615_dev *dev, &data, sizeof(data), true); } -static void -mt7615_mcu_bss_info_omac_header (struct mt7615_vif *mvif,u8 *data, -u32 conn_type) -{ -struct bss_info_omac *hdr = (struct bss_info_omac *)data; -u8 idx; - - idx = mvif->omac_idx >EXT_BSSID_START ?HW_BSSID_0 : mvif->omac_idx; - hdr->tag =cpu_to_le16 (BSS_INFO_OMAC ); - hdr->len =cpu_to_le16 (sizeof (struct bss_info_omac )); - hdr->hw_bss_idx = idx; - hdr->omac_idx = mvif->omac_idx; - hdr->band_idx = mvif->band_idx; - hdr->conn_type =cpu_to_le32 (conn_type); -} - -static void -mt7615_mcu_bss_info_basic_header (struct ieee80211_vif *vif,u8 *data, -u32 net_type,u8 tx_wlan_idx, -bool enable) +int mt7615_mcu_set_bss_info (struct mt7615_dev *dev,struct ieee80211_vif *vif, +bool enable) {struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv; -struct bss_info_basic *hdr = (struct bss_info_basic *)data; - - hdr->tag =cpu_to_le16 (BSS_INFO_BASIC ); - hdr->len =cpu_to_le16 (sizeof (struct bss_info_basic )); - hdr->network_type =cpu_to_le32 (net_type); - hdr->active = enable; - hdr->bcn_interval =cpu_to_le16 (vif->bss_conf.beacon_int); -memcpy (hdr->bssid, vif->bss_conf.bssid,ETH_ALEN ); - hdr->wmm_idx = mvif->wmm_idx; - hdr->dtim_period = vif->bss_conf.dtim_period; - hdr->bmc_tx_wlan_idx = tx_wlan_idx; -} - -static void -mt7615_mcu_bss_info_ext_header (struct mt7615_vif *mvif,u8 *data) -{ -/* SIFS 20us + 512 byte beacon tranmitted by 1Mbps (3906us) */ -#define BCN_TX_ESTIMATE_TIME (4096 + 20) -struct bss_info_ext_bss *hdr = (struct bss_info_ext_bss *)data; -int ext_bss_idx, tsf_offset; - - ext_bss_idx = mvif->omac_idx -EXT_BSSID_START ; -if (ext_bss_idx <0 ) -return ; - - hdr->tag =cpu_to_le16 (BSS_INFO_EXT_BSS ); - hdr->len =cpu_to_le16 (sizeof (struct bss_info_ext_bss )); - tsf_offset = ext_bss_idx *BCN_TX_ESTIMATE_TIME ; - hdr->mbss_tsf_offset =cpu_to_le32 (tsf_offset); -} - -int mt7615_mcu_set_bss_info (struct mt7615_dev *dev, -struct ieee80211_vif *vif,int en) -{ -struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv; -struct req_hdr { -u8 bss_idx; -u8 rsv0; -__le16 tlv_num; -u8 is_tlv_append; -u8 rsv1[3 ]; - } __packed; -int len =sizeof (struct req_hdr ) +sizeof (struct bss_info_basic ); -int ret, i, features =BIT (BSS_INFO_BASIC ), ntlv =1 ; -u32 conn_type =0 , net_type =NETWORK_INFRA ; -u8 *buf, *data, tx_wlan_idx =0 ; -struct req_hdr *hdr; - -if (en) { - len +=sizeof (struct bss_info_omac ); - features |=BIT (BSS_INFO_OMAC ); -if (mvif->omac_idx >EXT_BSSID_START ) { - len +=sizeof (struct bss_info_ext_bss ); - features |=BIT (BSS_INFO_EXT_BSS ); - ntlv++; - } - ntlv++; - } - -switch (vif->type) { -case NL80211_IFTYPE_AP : -case NL80211_IFTYPE_MESH_POINT : - tx_wlan_idx = mvif->sta.wcid.idx; - conn_type =CONNECTION_INFRA_AP ; -break ; -case NL80211_IFTYPE_STATION : { -/* TODO: enable BSS_INFO_UAPSD & BSS_INFO_PM */ -if (en) { -struct ieee80211_sta *sta; -struct mt7615_sta *msta; - -rcu_read_lock (); - sta =ieee80211_find_sta (vif, vif->bss_conf.bssid); -if (!sta) { -rcu_read_unlock (); -return -EINVAL ; - } - - msta = (struct mt7615_sta *)sta->drv_priv; - tx_wlan_idx = msta->wcid.idx; -rcu_read_unlock (); - } - conn_type =CONNECTION_INFRA_STA ; -break ; - } -case NL80211_IFTYPE_ADHOC : - conn_type =CONNECTION_IBSS_ADHOC ; - tx_wlan_idx = mvif->sta.wcid.idx; - net_type =NETWORK_IBSS ; -break ; -default : -WARN_ON (1 ); -break ; - } - - buf =kzalloc (len,GFP_KERNEL ); -if (!buf) -return -ENOMEM ; +struct sk_buff *skb; - hdr = (struct req_hdr *)buf; - hdr->bss_idx = mvif->idx; - hdr->tlv_num =cpu_to_le16 (ntlv); - hdr->is_tlv_append =1 ; + skb =mt7615_mcu_alloc_sta_req (mvif,NULL ); +if (IS_ERR (skb)) +return PTR_ERR (skb); - data = buf +sizeof (*hdr); -for (i =0 ; i <BSS_INFO_MAX_NUM ; i++) { -int tag =ffs (features &BIT (i)) -1 ; +if (enable) +mt7615_mcu_bss_omac_tlv (skb, vif); -switch (tag) { -case BSS_INFO_OMAC : -mt7615_mcu_bss_info_omac_header (mvif, data, - conn_type); - data +=sizeof (struct bss_info_omac ); -break ; -case BSS_INFO_BASIC : -mt7615_mcu_bss_info_basic_header (vif, data, net_type, - tx_wlan_idx, en); - data +=sizeof (struct bss_info_basic ); -break ; -case BSS_INFO_EXT_BSS : -mt7615_mcu_bss_info_ext_header (mvif, data); - data +=sizeof (struct bss_info_ext_bss ); -break ; -default : -break ; - } - } +mt7615_mcu_bss_basic_tlv (skb, vif, enable); - ret =__mt76_mcu_send_msg (&dev->mt76,MCU_EXT_CMD_BSS_INFO_UPDATE , - buf, len, true); -kfree (buf); +if (enable && mvif->omac_idx >EXT_BSSID_START ) +mt7615_mcu_bss_ext_tlv (skb, mvif); -return ret; +return __mt76_mcu_skb_send_msg (&dev->mt76, skb, +MCU_EXT_CMD_BSS_INFO_UPDATE , true); }int mt7615_mcu_del_wtbl_all (struct mt7615_dev *dev)
drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h +1 -1
@@ -304,7 +304,7 @@ bool mt7615_wait_for_mcu_init(struct mt7615_dev *dev);int mt7615_mcu_set_dev_info (struct mt7615_dev *dev,struct ieee80211_vif *vif,bool enable);int mt7615_mcu_set_bss_info (struct mt7615_dev *dev,struct ieee80211_vif *vif, -int en); +bool enable);void mt7615_mac_set_rates (struct mt7615_phy *phy,struct mt7615_sta *sta,struct ieee80211_tx_rate *probe_rate,struct ieee80211_tx_rate *rates);
Signature · 1 line
2.25.1
Lorenzo Bianconi
maintainerPATCH v4 12/25 mt76: mt7615: move more mcu commands in mt7615_mcu_ops data structure
In reply to Lorenzo BianconiMove mt7615_mcu_set_beacon_offload, mt7615_mcu_set_dev and mt7615_mcu_set_bss routine in mt7615_mcu_ops data structure. This is a preliminary patch to support mt7663 firmware
--- .../net/wireless/mediatek/mt76/mt7615/mac.c | 3 +- .../net/wireless/mediatek/mt76/mt7615/main.c | 20 +- .../net/wireless/mediatek/mt76/mt7615/mcu.c | 322 +++++++++--------- .../wireless/mediatek/mt76/mt7615/mt7615.h | 19 +- 4 files changed, 191 insertions(+), 173 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/mac.c +2 -1
@@ -1823,8 +1823,9 @@ static void mt7615_update_vif_beacon(void *priv, u8 *mac, struct ieee80211_vif *vif) {struct ieee80211_hw *hw = priv; +struct mt7615_dev *dev =mt7615_hw_dev (hw); -mt7615_mcu_set_bcn (hw, vif, vif->bss_conf.enable_beacon); +mt7615_mcu_add_beacon (dev, hw, vif, vif->bss_conf.enable_beacon); } static void
drivers/net/wireless/mediatek/mt76/mt7615/main.c +10 -10
@@ -39,13 +39,13 @@ static int mt7615_start(struct ieee80211_hw *hw) running =mt7615_dev_running (dev);if (!running) { -mt7615_mcu_ctrl_pm_state (dev,0 ,0 ); +mt7615_mcu_set_pm (dev,0 ,0 );mt7615_mcu_set_mac_enable (dev,0 , true);mt7615_mac_enable_nf (dev,0 ); }if (phy != &dev->phy) { -mt7615_mcu_ctrl_pm_state (dev,1 ,0 ); +mt7615_mcu_set_pm (dev,1 ,0 );mt7615_mcu_set_mac_enable (dev,1 , true);mt7615_mac_enable_nf (dev,1 ); }
@@ -78,14 +78,14 @@ static void mt7615_stop(struct ieee80211_hw *hw)clear_bit (MT76_STATE_RUNNING , &phy->mt76->state);if (phy != &dev->phy) { -mt7615_mcu_ctrl_pm_state (dev,1 ,1 ); +mt7615_mcu_set_pm (dev,1 ,1 );mt7615_mcu_set_mac_enable (dev,1 , false); }if (!mt7615_dev_running (dev)) {cancel_delayed_work_sync (&dev->mt76.mac_work); -mt7615_mcu_ctrl_pm_state (dev,0 ,1 ); +mt7615_mcu_set_pm (dev,0 ,1 );mt7615_mcu_set_mac_enable (dev,0 , false); }
@@ -157,7 +157,7 @@ static int mt7615_add_interface(struct ieee80211_hw *hw,else mvif->wmm_idx = mvif->idx %MT7615_MAX_WMM_SETS ; - ret =mt7615_mcu_set_dev_info (dev, vif,1 ); + ret =mt7615_mcu_add_dev_info (dev, vif, true);if (ret) goto out;
@@ -200,7 +200,7 @@ static void mt7615_remove_interface(struct ieee80211_hw *hw,/* TODO: disable beacon for the bss */ -mt7615_mcu_set_dev_info (dev, vif,0 ); +mt7615_mcu_add_dev_info (dev, vif, false);rcu_assign_pointer (dev->mt76.wcid[idx],NULL );if (vif->txq)
@@ -412,7 +412,7 @@ static void mt7615_bss_info_changed(struct ieee80211_hw *hw,mutex_lock (&dev->mt76.mutex);if (changed &BSS_CHANGED_ASSOC ) -mt7615_mcu_set_bss_info (dev, vif, info->assoc); +mt7615_mcu_add_bss_info (dev, vif, info->assoc);if (changed &BSS_CHANGED_ERP_SLOT ) {int slottime = info->use_short_slot ?9 :20 ;
@@ -425,13 +425,13 @@ static void mt7615_bss_info_changed(struct ieee80211_hw *hw, }if (changed &BSS_CHANGED_BEACON_ENABLED ) { -mt7615_mcu_set_bss_info (dev, vif, info->enable_beacon); +mt7615_mcu_add_bss_info (dev, vif, info->enable_beacon);mt7615_mcu_sta_add (dev, vif,NULL , info->enable_beacon); }if (changed & (BSS_CHANGED_BEACON |BSS_CHANGED_BEACON_ENABLED )) -mt7615_mcu_set_bcn (hw, vif, info->enable_beacon); +mt7615_mcu_add_beacon (dev, hw, vif, info->enable_beacon);mutex_unlock (&dev->mt76.mutex); }
@@ -444,7 +444,7 @@ mt7615_channel_switch_beacon(struct ieee80211_hw *hw,struct mt7615_dev *dev =mt7615_hw_dev (hw);mutex_lock (&dev->mt76.mutex); -mt7615_mcu_set_bcn (hw, vif, true); +mt7615_mcu_add_beacon (dev, hw, vif, true);mutex_unlock (&dev->mt76.mutex); }
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +167 -155
364 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h +12 -7
@@ -147,6 +147,10 @@ struct mt7615_phy {#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__)#define mt7615_mcu_sta_add (dev, ...) (dev)->mcu_ops->sta_add((dev), __VA_ARGS__) +#define mt7615_mcu_add_dev_info (dev, ...) (dev)->mcu_ops->add_dev_info((dev), __VA_ARGS__) +#define mt7615_mcu_add_bss_info (dev, ...) (dev)->mcu_ops->add_bss_info((dev), __VA_ARGS__) +#define mt7615_mcu_add_beacon (dev, ...) (dev)->mcu_ops->add_beacon_offload((dev), __VA_ARGS__) +#define mt7615_mcu_set_pm (dev, ...) (dev)->mcu_ops->set_pm_state((dev), __VA_ARGS__)struct mt7615_mcu_ops { int (*add_tx_ba)(struct mt7615_dev *dev, struct ieee80211_ampdu_params *params,
@@ -157,6 +161,14 @@ struct mt7615_mcu_ops {int (*sta_add)(struct mt7615_dev *dev,struct ieee80211_vif *vif,struct ieee80211_sta *sta,bool enable); +int (*add_dev_info)(struct mt7615_dev *dev, +struct ieee80211_vif *vif,bool enable); +int (*add_bss_info)(struct mt7615_dev *dev,struct ieee80211_vif *vif, +bool enable); +int (*add_beacon_offload)(struct mt7615_dev *dev, +struct ieee80211_hw *hw, +struct ieee80211_vif *vif,bool enable); +int (*set_pm_state)(struct mt7615_dev *dev,int band,int state); };struct mt7615_dev {
@@ -301,16 +313,10 @@ int mt7615_dma_init(struct mt7615_dev *dev);void mt7615_dma_cleanup (struct mt7615_dev *dev);int mt7615_mcu_init (struct mt7615_dev *dev);bool mt7615_wait_for_mcu_init (struct mt7615_dev *dev); -int mt7615_mcu_set_dev_info (struct mt7615_dev *dev, -struct ieee80211_vif *vif,bool enable); -int mt7615_mcu_set_bss_info (struct mt7615_dev *dev,struct ieee80211_vif *vif, -bool enable);void mt7615_mac_set_rates (struct mt7615_phy *phy,struct mt7615_sta *sta,struct ieee80211_tx_rate *probe_rate,struct ieee80211_tx_rate *rates);int mt7615_mcu_del_wtbl_all (struct mt7615_dev *dev); -int mt7615_mcu_set_bcn (struct ieee80211_hw *hw,struct ieee80211_vif *vif, -int en);int mt7615_mcu_set_chan_info (struct mt7615_phy *phy,int cmd);int mt7615_mcu_set_wmm (struct mt7615_dev *dev,u8 queue,const struct ieee80211_tx_queue_params *params);
@@ -368,7 +374,6 @@ int mt7615_mcu_set_dbdc(struct mt7615_dev *dev);int mt7615_mcu_set_eeprom (struct mt7615_dev *dev);int mt7615_mcu_set_mac_enable (struct mt7615_dev *dev,int band,bool enable);int mt7615_mcu_set_rts_thresh (struct mt7615_phy *phy,u32 val); -int mt7615_mcu_ctrl_pm_state (struct mt7615_dev *dev,int band,int enter);int mt7615_mcu_get_temperature (struct mt7615_dev *dev,int index);void mt7615_mcu_exit (struct mt7615_dev *dev); void mt7615_mcu_fill_msg(struct mt7615_dev *dev, struct sk_buff *skb,
Signature · 1 line
2.25.1
Lorenzo Bianconi
maintainerPATCH v4 13/25 mt76: mt7615: introduce MCU_FW_PREFIX for fw mcu commands
In reply to Lorenzo BianconiCurrently fw commands rely on negative cmds since they need different mcu msg metadata. Extend this approach introducing MCU_FW_PREFIX. This is a preliminary patch to support new mt7663e firmware commands
--- .../net/wireless/mediatek/mt76/mt7615/mcu.c | 25 ++++++++++--------- .../net/wireless/mediatek/mt76/mt7615/mcu.h | 15 ++++++----- 2 files changed, 22 insertions(+), 18 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +13 -12
@@ -52,6 +52,7 @@ struct mt7615_fw_trailer {void mt7615_mcu_fill_msg (struct mt7615_dev *dev,struct sk_buff *skb,int cmd,int *wait_seq) { +int mcu_cmd = cmd &MCU_CMD_MASK ;struct mt7615_mcu_txd *mcu_txd;u8 seq, q_idx, pkt_fmt;__le32 *txd;
@@ -63,7 +64,7 @@ void mt7615_mcu_fill_msg(struct mt7615_dev *dev, struct sk_buff *skb, mcu_txd = (struct mt7615_mcu_txd *)skb_push (skb,sizeof (*mcu_txd)); -if (cmd != -MCU_CMD_FW_SCATTER ) { +if (cmd !=MCU_CMD_FW_SCATTER ) { q_idx =MT_TX_MCU_PORT_RX_Q0 ; pkt_fmt =MT_TX_TYPE_CMD ; }else {
@@ -87,9 +88,9 @@ void mt7615_mcu_fill_msg(struct mt7615_dev *dev, struct sk_buff *skb, mcu_txd->pkt_type =MCU_PKT_ID ; mcu_txd->seq = seq; -if (cmd <0 ) { +if (cmd &MCU_FW_PREFIX ) { mcu_txd->set_query =MCU_Q_NA ; - mcu_txd->cid = -cmd; + mcu_txd->cid = mcu_cmd; }else { mcu_txd->cid =MCU_CMD_EXT_CID ; mcu_txd->set_query =MCU_Q_SET ;
@@ -127,7 +128,7 @@ mt7615_mcu_parse_response(struct mt7615_dev *dev, int cmd,return -EAGAIN ;switch (cmd) { -case -MCU_CMD_PATCH_SEM_CONTROL : +case MCU_CMD_PATCH_SEM_CONTROL :skb_pull (skb,sizeof (*rxd) -4 ); ret = *skb->data;break ;
@@ -152,8 +153,8 @@ int mt7615_mcu_wait_response(struct mt7615_dev *dev, int cmd, int seq)while (true) { skb =mt76_mcu_get_response (&dev->mt76, expires);if (!skb) { -dev_err (dev->mt76.dev,"Message %d (seq %d) timeout\n" , - cmd, seq); +dev_err (dev->mt76.dev,"Message %ld (seq %d) timeout\n" , + cmd &MCU_CMD_MASK , seq);return -ETIMEDOUT ; }
@@ -308,7 +309,7 @@ static int mt7615_mcu_init_download(struct mt7615_dev *dev, u32 addr, .mode = cpu_to_le32(mode), }; -return __mt76_mcu_send_msg (&dev->mt76, -MCU_CMD_TARGET_ADDRESS_LEN_REQ , +return __mt76_mcu_send_msg (&dev->mt76,MCU_CMD_TARGET_ADDRESS_LEN_REQ , &req,sizeof (req), true); }
@@ -1101,7 +1102,7 @@ static int mt7615_mcu_send_firmware(struct mt7615_dev *dev, const void *data, cur_len =min_t (int,4096 -sizeof (struct mt7615_mcu_txd ), len); - ret =__mt76_mcu_send_msg (&dev->mt76, -MCU_CMD_FW_SCATTER , + ret =__mt76_mcu_send_msg (&dev->mt76,MCU_CMD_FW_SCATTER , data, cur_len, false);if (ret)break ;
@@ -1127,13 +1128,13 @@ static int mt7615_mcu_start_firmware(struct mt7615_dev *dev, u32 addr, .addr = cpu_to_le32(addr), }; -return __mt76_mcu_send_msg (&dev->mt76, -MCU_CMD_FW_START_REQ , +return __mt76_mcu_send_msg (&dev->mt76,MCU_CMD_FW_START_REQ , &req,sizeof (req), true); }static int mt7615_mcu_restart (struct mt76_dev *dev) { -return __mt76_mcu_send_msg (dev, -MCU_CMD_RESTART_DL_REQ ,NULL , +return __mt76_mcu_send_msg (dev,MCU_CMD_RESTART_DL_REQ ,NULL ,0 , true); }
@@ -1145,7 +1146,7 @@ static int mt7615_mcu_patch_sem_ctrl(struct mt7615_dev *dev, bool get) .op = cpu_to_le32(get ? PATCH_SEM_GET : PATCH_SEM_RELEASE), }; -return __mt76_mcu_send_msg (&dev->mt76, -MCU_CMD_PATCH_SEM_CONTROL , +return __mt76_mcu_send_msg (&dev->mt76,MCU_CMD_PATCH_SEM_CONTROL , &req,sizeof (req), true); }
@@ -1158,7 +1159,7 @@ static int mt7615_mcu_start_patch(struct mt7615_dev *dev) .check_crc = 0, }; -return __mt76_mcu_send_msg (&dev->mt76, -MCU_CMD_PATCH_FINISH_REQ , +return __mt76_mcu_send_msg (&dev->mt76,MCU_CMD_PATCH_FINISH_REQ , &req,sizeof (req), true); }
drivers/net/wireless/mediatek/mt76/mt7615/mcu.h +9 -6
@@ -179,16 +179,19 @@ enum {MCU_S2D_H2CN }; +#define MCU_FW_PREFIX BIT(31) +#define MCU_CMD_MASK ~MCU_FW_PREFIX +enum { -MCU_CMD_TARGET_ADDRESS_LEN_REQ =0x01 , -MCU_CMD_FW_START_REQ =0x02 , +MCU_CMD_TARGET_ADDRESS_LEN_REQ =MCU_FW_PREFIX |0x01 , +MCU_CMD_FW_START_REQ =MCU_FW_PREFIX |0x02 ,MCU_CMD_INIT_ACCESS_REG =0x3 ,MCU_CMD_PATCH_START_REQ =0x05 , -MCU_CMD_PATCH_FINISH_REQ =0x07 , -MCU_CMD_PATCH_SEM_CONTROL =0x10 , +MCU_CMD_PATCH_FINISH_REQ =MCU_FW_PREFIX |0x07 , +MCU_CMD_PATCH_SEM_CONTROL =MCU_FW_PREFIX |0x10 ,MCU_CMD_EXT_CID =0xED , -MCU_CMD_FW_SCATTER =0xEE , -MCU_CMD_RESTART_DL_REQ =0xEF , +MCU_CMD_FW_SCATTER =MCU_FW_PREFIX |0xEE , +MCU_CMD_RESTART_DL_REQ =MCU_FW_PREFIX |0xEF , };enum {
Signature · 1 line
2.25.1
Lorenzo Bianconi
maintainerPATCH v4 14/25 mt76: mt7615: introduce mt7615_register_map
In reply to Lorenzo BianconiIn order to reuse mt7615 code adding support for mt7663e driver, introduce mt7615e_reg_map since mt7663e and mt7615 rely on a different base registers definitions.
--- .../net/wireless/mediatek/mt76/mt7615/mac.c | 14 ++-- .../net/wireless/mediatek/mt76/mt7615/mmio.c | 27 ++++++- .../wireless/mediatek/mt76/mt7615/mt7615.h | 5 +- .../net/wireless/mediatek/mt76/mt7615/pci.c | 3 +- .../net/wireless/mediatek/mt76/mt7615/regs.h | 72 +++++++++++++------ .../net/wireless/mediatek/mt76/mt7615/soc.c | 2 +- 6 files changed, 91 insertions(+), 32 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/mac.c +7 -7
@@ -703,9 +703,9 @@ void mt7615_txp_skb_unmap(struct mt76_dev *dev,mt7615_txp_skb_unmap_hw (dev, &txp->hw); } -static u32 mt7615_mac_wtbl_addr (int wcid) +static u32 mt7615_mac_wtbl_addr (struct mt7615_dev *dev,int wcid) { -return MT_WTBL_BASE + wcid *MT_WTBL_ENTRY_SIZE ; +return MT_WTBL_BASE (dev) + wcid *MT_WTBL_ENTRY_SIZE ; }bool mt7615_mac_wtbl_update (struct mt7615_dev *dev,int idx,u32 mask)
@@ -751,7 +751,7 @@ void mt7615_mac_sta_poll(struct mt7615_dev *dev)list_del_init (&msta->poll_list);spin_unlock_bh (&dev->sta_poll_lock); - addr =mt7615_mac_wtbl_addr (msta->wcid.idx) +19 *4 ; + addr =mt7615_mac_wtbl_addr (dev, msta->wcid.idx) +19 *4 ;for (i =0 ; i <4 ; i++, addr +=8 ) {u32 tx_last = msta->airtime_ac[i];
@@ -801,7 +801,7 @@ void mt7615_mac_set_rates(struct mt7615_phy *phy, struct mt7615_sta *sta,struct mt76_phy *mphy = phy->mt76;struct ieee80211_tx_rate *ref;int wcid = sta->wcid.idx; -u32 addr =mt7615_mac_wtbl_addr (wcid); +u32 addr =mt7615_mac_wtbl_addr (dev, wcid);bool stbc = false;int n_rates = sta->n_rates;u8 bw, bw_prev, bw_idx =0 ;
@@ -966,7 +966,7 @@ mt7615_mac_wtbl_update_key(struct mt7615_dev *dev, struct mt76_wcid *wcid, enum mt7615_cipher_type cipher, enum set_key_cmd cmd) { -u32 addr =mt7615_mac_wtbl_addr (wcid->idx) +30 *4 ; +u32 addr =mt7615_mac_wtbl_addr (dev, wcid->idx) +30 *4 ;u8 data[32 ] = {};if (key->keylen >sizeof (data))
@@ -1004,7 +1004,7 @@ mt7615_mac_wtbl_update_pk(struct mt7615_dev *dev, struct mt76_wcid *wcid, enum mt7615_cipher_type cipher, int keyidx, enum set_key_cmd cmd) { - u32 addr = mt7615_mac_wtbl_addr(wcid->idx), w0, w1; + u32 addr = mt7615_mac_wtbl_addr(dev, wcid->idx), w0, w1;if (!mt76_poll (dev,MT_WTBL_UPDATE ,MT_WTBL_UPDATE_BUSY ,0 ,5000 ))return -ETIMEDOUT ;
@@ -1040,7 +1040,7 @@ mt7615_mac_wtbl_update_cipher(struct mt7615_dev *dev, struct mt76_wcid *wcid, enum mt7615_cipher_type cipher, enum set_key_cmd cmd) { -u32 addr =mt7615_mac_wtbl_addr (wcid->idx); +u32 addr =mt7615_mac_wtbl_addr (dev, wcid->idx);if (cmd ==SET_KEY ) {if (cipher !=MT_CIPHER_BIP_CMAC_128 || !wcid->cipher)
drivers/net/wireless/mediatek/mt76/mt7615/mmio.c +26 -1
@@ -2,9 +2,32 @@#include <linux/module.h> #include "mt7615.h" +#include "regs.h" #include "mac.h" #include "../trace.h" +const u32 mt7615e_reg_map[] = { + [MT_TOP_CFG_BASE ] =0x01000 , + [MT_HW_BASE ] =0x01000 , + [MT_PCIE_REMAP_2 ] =0x02504 , + [MT_HIF_BASE ] =0x04000 , + [MT_CSR_BASE ] =0x07000 , + [MT_PHY_BASE ] =0x10000 , + [MT_CFG_BASE ] =0x20200 , + [MT_AGG_BASE ] =0x20a00 , + [MT_TMAC_BASE ] =0x21000 , + [MT_RMAC_BASE ] =0x21200 , + [MT_DMA_BASE ] =0x21800 , + [MT_WTBL_BASE_ON ] =0x23000 , + [MT_WTBL_BASE_OFF ] =0x23400 , + [MT_LPON_BASE ] =0x24200 , + [MT_MIB_BASE ] =0x24800 , + [MT_WTBL_BASE_ADDR ] =0x30000 , + [MT_PCIE_REMAP_BASE2 ] =0x80000 , + [MT_TOP_MISC_BASE ] =0xc0000 , + [MT_EFUSE_ADDR_BASE ] =0x81070000 , +}; +u32 mt7615_reg_map (struct mt7615_dev *dev,u32 addr) {u32 base = addr &MT_MCU_PCIE_REMAP_2_BASE ;
@@ -66,7 +89,8 @@ static irqreturn_t mt7615_irq_handler(int irq, void *dev_instance)return IRQ_HANDLED ; } -int mt7615_mmio_probe (struct device *pdev,void __iomem *mem_base,int irq) +int mt7615_mmio_probe (struct device *pdev,void __iomem *mem_base, +int irq,const u32 *map) {static const struct mt76_driver_ops drv_ops = {/* txwi_size = txd size + txp size */
@@ -95,6 +119,7 @@ int mt7615_mmio_probe(struct device *pdev, void __iomem *mem_base, int irq) dev = container_of(mdev, struct mt7615_dev, mt76);mt76_mmio_init (&dev->mt76, mem_base); + dev->reg_map = map; mdev->rev = (mt76_rr (dev,MT_HW_CHIPID ) <<16 ) | (mt76_rr (dev,MT_HW_REV ) &0xff );dev_dbg (mdev->dev,"ASIC revision: %04x\n" , mdev->rev);
drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h +4 -1
@@ -185,6 +185,7 @@ struct mt7615_dev {const struct mt7615_mcu_ops *mcu_ops;struct regmap *infracfg; +const u32 *reg_map;struct work_struct mcu_work;
@@ -285,6 +286,7 @@ mt7615_ext_phy(struct mt7615_dev *dev) }extern const struct ieee80211_ops mt7615_ops; +extern const u32 mt7615e_reg_map[__MT_BASE_MAX];extern struct pci_driver mt7615_pci_driver;extern struct platform_driver mt7622_wmac_driver;
@@ -297,7 +299,8 @@ static inline int mt7622_wmac_init(struct mt7615_dev *dev) }#endif -int mt7615_mmio_probe (struct device *pdev,void __iomem *mem_base,int irq); +int mt7615_mmio_probe (struct device *pdev,void __iomem *mem_base, +int irq,const u32 *map);u32 mt7615_reg_map (struct mt7615_dev *dev,u32 addr);void mt7615_init_device (struct mt7615_dev *dev);
drivers/net/wireless/mediatek/mt76/mt7615/pci.c +2 -1
@@ -35,7 +35,8 @@ static int mt7615_pci_probe(struct pci_dev *pdev,if (ret)return ret; -return mt7615_mmio_probe (&pdev->dev,pcim_iomap_table (pdev)[0 ], pdev->irq); +return mt7615_mmio_probe (&pdev->dev,pcim_iomap_table (pdev)[0 ], + pdev->irq, mt7615e_reg_map); }static void mt7615_pci_remove (struct pci_dev *pdev)
drivers/net/wireless/mediatek/mt76/mt7615/regs.h +51 -21
166 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7615/soc.c +1 -1
@@ -47,7 +47,7 @@ static int mt7622_wmac_probe(struct platform_device *pdev)return PTR_ERR (mem_base); } -return mt7615_mmio_probe (&pdev->dev, mem_base, irq); +return mt7615_mmio_probe (&pdev->dev, mem_base, irq, mt7615e_reg_map); }static int mt7622_wmac_remove (struct platform_device *pdev)
Signature · 1 line
2.25.1
Lorenzo Bianconi
maintainerPATCH v4 15/25 mt76: mt7615: add mt7663e support to mt7615_reg_map
In reply to Lorenzo BianconiIntroduce mt7663e support to mt7615_reg_map routine in order to reuse it adding support for mt7663e driver
--- drivers/net/wireless/mediatek/mt76/mt7615/mmio.c | 12 +++++++++--- drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h | 5 +++++ drivers/net/wireless/mediatek/mt76/mt7615/regs.h | 3 +++ 3 files changed, 17 insertions(+), 3 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/mmio.c +9 -3
@@ -30,9 +30,15 @@ const u32 mt7615e_reg_map[] = {u32 mt7615_reg_map (struct mt7615_dev *dev,u32 addr) { -u32 base = addr &MT_MCU_PCIE_REMAP_2_BASE ; -u32 offset = addr &MT_MCU_PCIE_REMAP_2_OFFSET ; - +u32 base, offset; + +if (is_mt7663 (&dev->mt76)) { + base = addr &MT7663_MCU_PCIE_REMAP_2_BASE ; + offset = addr &MT7663_MCU_PCIE_REMAP_2_OFFSET ; + }else { + base = addr &MT_MCU_PCIE_REMAP_2_BASE ; + offset = addr &MT_MCU_PCIE_REMAP_2_OFFSET ; + }mt76_wr (dev,MT_MCU_PCIE_REMAP_2 , base);return MT_PCIE_REMAP_BASE_2 + offset;
drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h +5 -0
@@ -343,6 +343,11 @@ static inline bool is_mt7615(struct mt76_dev *dev)return mt76_chip (dev) ==0x7615 ; } +static inline bool is_mt7663 (struct mt76_dev *dev) +{ +return mt76_chip (dev) ==0x7663 ; +} +static inline void mt7615_irq_enable (struct mt7615_dev *dev,u32 mask) {mt76_set_irq_mask (&dev->mt76,MT_INT_MASK_CSR ,0 , mask);
drivers/net/wireless/mediatek/mt76/mt7615/regs.h +3 -0
@@ -55,6 +55,9 @@ enum mt7615_reg_base {#define MT_HIF (ofs) ((dev)->reg_map[MT_HIF_BASE] + (ofs)) +#define MT7663_MCU_PCIE_REMAP_2_OFFSET GENMASK(15, 0) +#define MT7663_MCU_PCIE_REMAP_2_BASE GENMASK(31, 16) +#define MT_CFG_LPCR_HOST MT_HIF(0x1f0)#define MT_CFG_LPCR_HOST_FW_OWN BIT(0)#define MT_CFG_LPCR_HOST_DRV_OWN BIT(1)
Signature · 1 line
2.25.1
Lorenzo Bianconi
maintainerPATCH v4 16/25 mt76: mt7615: add mt7663e support to mt7615_{driver, firmware}_own
In reply to Lorenzo BianconiExtend mt7615_driver_own and mt7615_firmware_own in order to reuse them adding mt7663e support to mt7615 driver
--- drivers/net/wireless/mediatek/mt76/mt7615/mcu.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +9 -4
@@ -1175,11 +1175,13 @@ static void mt7622_trigger_hif_int(struct mt7615_dev *dev, bool en)static int mt7615_driver_own (struct mt7615_dev *dev) { -mt76_wr (dev,MT_CFG_LPCR_HOST ,MT_CFG_LPCR_HOST_DRV_OWN ); +u32 addr; + + addr =is_mt7663 (&dev->mt76) ?MT_CONN_HIF_ON_LPCTL :MT_CFG_LPCR_HOST ; +mt76_wr (dev, addr,MT_CFG_LPCR_HOST_DRV_OWN );mt7622_trigger_hif_int (dev, true); -if (!mt76_poll_msec (dev,MT_CFG_LPCR_HOST , -MT_CFG_LPCR_HOST_FW_OWN ,0 ,3000 )) { +if (!mt76_poll_msec (dev, addr,MT_CFG_LPCR_HOST_FW_OWN ,0 ,3000 )) {dev_err (dev->mt76.dev,"Timeout for driver own\n" );return -EIO ; }
@@ -1190,9 +1192,12 @@ static int mt7615_driver_own(struct mt7615_dev *dev) static int mt7615_firmware_own(struct mt7615_dev *dev) { + u32 addr; + + addr = is_mt7663(&dev->mt76) ? MT_CONN_HIF_ON_LPCTL : MT_CFG_LPCR_HOST; mt7622_trigger_hif_int(dev, true); - mt76_wr(dev, MT_CFG_LPCR_HOST, MT_CFG_LPCR_HOST_FW_OWN); + mt76_wr(dev, addr, MT_CFG_LPCR_HOST_FW_OWN); if (is_mt7622(&dev->mt76) && !mt76_poll_msec(dev, MT_CFG_LPCR_HOST,
Signature · 1 line
2.25.1
Lorenzo Bianconi
maintainerPATCH v4 17/25 mt76: mt7615: add mt7663e support to mt7615_mcu_set_eeprom
In reply to Lorenzo BianconiExtend mt7615_mcu_set_eeprom routine in order to be reused adding mt7663e support to mt7615 driver
--- .../wireless/mediatek/mt76/mt7615/eeprom.h | 2 ++ .../net/wireless/mediatek/mt76/mt7615/mcu.c | 21 ++++++++++++++----- 2 files changed, 18 insertions(+), 5 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/eeprom.h +2 -0
@@ -18,11 +18,13 @@ enum mt7615_eeprom_field {MT_EE_TX1_5G_G0_TARGET_POWER =0x098 ,MT_EE_EXT_PA_2G_TARGET_POWER =0x0f2 ,MT_EE_EXT_PA_5G_TARGET_POWER =0x0f3 , +MT7663_EE_TX0_2G_TARGET_POWER =0x123 ,MT_EE_TX2_5G_G0_TARGET_POWER =0x142 ,MT_EE_TX3_5G_G0_TARGET_POWER =0x16a ,MT7615_EE_MAX =0x3bf ,MT7622_EE_MAX =0x3db , + MT7663_EE_MAX = 0x400, };#define MT_EE_NIC_CONF_TX_MASK GENMASK(7, 4)
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +16 -5
@@ -1539,19 +1539,30 @@ int mt7615_mcu_set_eeprom(struct mt7615_dev *dev) {struct {u8 buffer_mode; -u8 pad; +u8 content_format;__le16 len; } __packed req_hdr = { .buffer_mode =1 , };u8 *eep = (u8 *)dev->mt76.eeprom.data;struct sk_buff *skb; -int eep_len; +int eep_len, offset; -if (is_mt7622 (&dev->mt76)) +switch (mt76_chip (&dev->mt76)) { +case 0x7622 : eep_len =MT7622_EE_MAX -MT_EE_NIC_CONF_0 ; -else + offset =MT_EE_NIC_CONF_0 ; +break ; +case 0x7663 : + eep_len =MT7663_EE_MAX -MT_EE_CHIP_ID ; + req_hdr.content_format =1 ; + offset =MT_EE_CHIP_ID ; +break ; +default : eep_len =MT7615_EE_MAX -MT_EE_NIC_CONF_0 ; + offset =MT_EE_NIC_CONF_0 ; +break ; + } req_hdr.len =cpu_to_le16 (eep_len);
@@ -1560,7 +1571,7 @@ int mt7615_mcu_set_eeprom(struct mt7615_dev *dev)return -ENOMEM ;skb_put_data (skb, &req_hdr,sizeof (req_hdr)); -skb_put_data (skb, eep +MT_EE_NIC_CONF_0 , eep_len); +skb_put_data (skb, eep + offset, eep_len);return __mt76_mcu_skb_send_msg (&dev->mt76, skb,MCU_EXT_CMD_EFUSE_BUFFER_MODE , true);
Signature · 1 line
2.25.1
Lorenzo Bianconi
maintainerPATCH v4 18/25 mt76: mt7615: introduce mt7615_eeprom_parse_hw_band_cap routine
In reply to Lorenzo BianconiIntroduce mt7615_eeprom_parse_hw_band_cap routine in order to configure supported band for mt7663e and mt7622 devices since they do not rely on eeprom data to enable 2GHz/5GHz bands
--- .../wireless/mediatek/mt76/mt7615/eeprom.c | 30 +++++++++++++++---- 1 file changed, 24 insertions(+), 6 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/eeprom.c +24 -6
@@ -91,11 +91,23 @@ static int mt7615_check_eeprom(struct mt76_dev *dev) } } -static void mt7615_eeprom_parse_hw_cap (struct mt7615_dev *dev) +static void +mt7615_eeprom_parse_hw_band_cap (struct mt7615_dev *dev) { -u8 *eeprom = dev->mt76.eeprom.data; -u8 tx_mask, max_nss; -u32 val; +u8 val, *eeprom = dev->mt76.eeprom.data; + +if (is_mt7663 (&dev->mt76)) { +/* dual band */ + dev->mt76.cap.has_2ghz = true; + dev->mt76.cap.has_5ghz = true; +return ; + } + +if (is_mt7622 (&dev->mt76)) { +/* 2GHz only */ + dev->mt76.cap.has_2ghz = true; +return ; + } val =FIELD_GET (MT_EE_NIC_WIFI_CONF_BAND_SEL , eeprom[MT_EE_WIFI_CONF ]);
@@ -111,9 +123,15 @@ static void mt7615_eeprom_parse_hw_cap(struct mt7615_dev *dev) dev->mt76.cap.has_5ghz = true;break ; } +} + +static void mt7615_eeprom_parse_hw_cap (struct mt7615_dev *dev) +{ +u8 *eeprom = dev->mt76.eeprom.data; +u8 tx_mask, max_nss; +u32 val; -if (is_mt7622 (&dev->mt76)) - dev->mt76.cap.has_5ghz = false; +mt7615_eeprom_parse_hw_band_cap (dev);/* read tx-rx mask from eeprom */ val =mt76_rr (dev,MT_TOP_STRAP_STA );
Signature · 1 line
2.25.1
Lorenzo Bianconi
maintainerPATCH v4 19/25 mt76: mt7615: introduce mt7615_init_mac_chain routine
In reply to Lorenzo BianconiIntroduce mt7615_init_mac_chain routine to configure per band mac register since new devices (e.g. mt7663e) do not support dbdc
--- .../net/wireless/mediatek/mt76/mt7615/init.c | 118 +++++++++--------- 1 file changed, 62 insertions(+), 56 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/init.c +62 -56
@@ -18,27 +18,66 @@ static void mt7615_phy_init(struct mt7615_dev *dev)mt76_set (dev,MT_WF_PHY_WF2_RFCTRL0 (1 ),MT_WF_PHY_WF2_RFCTRL0_LPBCN_EN ); } -static void mt7615_mac_init (struct mt7615_dev *dev) +static void +mt7615_init_mac_chain (struct mt7615_dev *dev,int chain) {u32 val, mask, set; -int i; + +if (!chain) + val =MT_CFG_CCR_MAC_D0_1X_GC_EN |MT_CFG_CCR_MAC_D0_2X_GC_EN ; +else + val =MT_CFG_CCR_MAC_D1_1X_GC_EN |MT_CFG_CCR_MAC_D1_2X_GC_EN ;/* enable band 0/1 clk */ -mt76_set (dev,MT_CFG_CCR , -MT_CFG_CCR_MAC_D0_1X_GC_EN |MT_CFG_CCR_MAC_D0_2X_GC_EN | -MT_CFG_CCR_MAC_D1_1X_GC_EN |MT_CFG_CCR_MAC_D1_2X_GC_EN ); - - val =mt76_rmw (dev,MT_TMAC_TRCR (0 ), -MT_TMAC_TRCR_CCA_SEL |MT_TMAC_TRCR_SEC_CCA_SEL , -FIELD_PREP (MT_TMAC_TRCR_CCA_SEL ,2 ) | -FIELD_PREP (MT_TMAC_TRCR_SEC_CCA_SEL ,0 )); -mt76_wr (dev,MT_TMAC_TRCR (1 ), val); - - val =MT_AGG_ACR_PKT_TIME_EN |MT_AGG_ACR_NO_BA_AR_RULE | -FIELD_PREP (MT_AGG_ACR_CFEND_RATE ,MT7615_CFEND_RATE_DEFAULT ) | -FIELD_PREP (MT_AGG_ACR_BAR_RATE ,MT7615_BAR_RATE_DEFAULT ); -mt76_wr (dev,MT_AGG_ACR (0 ), val); -mt76_wr (dev,MT_AGG_ACR (1 ), val); +mt76_set (dev,MT_CFG_CCR , val); + +mt76_rmw (dev,MT_TMAC_TRCR (chain), +MT_TMAC_TRCR_CCA_SEL |MT_TMAC_TRCR_SEC_CCA_SEL , +FIELD_PREP (MT_TMAC_TRCR_CCA_SEL ,2 ) | +FIELD_PREP (MT_TMAC_TRCR_SEC_CCA_SEL ,0 )); + +mt76_wr (dev,MT_AGG_ACR (chain), +MT_AGG_ACR_PKT_TIME_EN |MT_AGG_ACR_NO_BA_AR_RULE | +FIELD_PREP (MT_AGG_ACR_CFEND_RATE ,MT7615_CFEND_RATE_DEFAULT ) | +FIELD_PREP (MT_AGG_ACR_BAR_RATE ,MT7615_BAR_RATE_DEFAULT )); + +mt76_wr (dev,MT_AGG_ARUCR (chain), +FIELD_PREP (MT_AGG_ARxCR_LIMIT (0 ),7 ) | +FIELD_PREP (MT_AGG_ARxCR_LIMIT (1 ),2 ) | +FIELD_PREP (MT_AGG_ARxCR_LIMIT (2 ),2 ) | +FIELD_PREP (MT_AGG_ARxCR_LIMIT (3 ),2 ) | +FIELD_PREP (MT_AGG_ARxCR_LIMIT (4 ),1 ) | +FIELD_PREP (MT_AGG_ARxCR_LIMIT (5 ),1 ) | +FIELD_PREP (MT_AGG_ARxCR_LIMIT (6 ),1 ) | +FIELD_PREP (MT_AGG_ARxCR_LIMIT (7 ),1 )); + +mt76_wr (dev,MT_AGG_ARDCR (chain), +FIELD_PREP (MT_AGG_ARxCR_LIMIT (0 ),MT7615_RATE_RETRY -1 ) | +FIELD_PREP (MT_AGG_ARxCR_LIMIT (1 ),MT7615_RATE_RETRY -1 ) | +FIELD_PREP (MT_AGG_ARxCR_LIMIT (2 ),MT7615_RATE_RETRY -1 ) | +FIELD_PREP (MT_AGG_ARxCR_LIMIT (3 ),MT7615_RATE_RETRY -1 ) | +FIELD_PREP (MT_AGG_ARxCR_LIMIT (4 ),MT7615_RATE_RETRY -1 ) | +FIELD_PREP (MT_AGG_ARxCR_LIMIT (5 ),MT7615_RATE_RETRY -1 ) | +FIELD_PREP (MT_AGG_ARxCR_LIMIT (6 ),MT7615_RATE_RETRY -1 ) | +FIELD_PREP (MT_AGG_ARxCR_LIMIT (7 ),MT7615_RATE_RETRY -1 )); + + mask =MT_DMA_RCFR0_MCU_RX_MGMT | +MT_DMA_RCFR0_MCU_RX_CTL_NON_BAR | +MT_DMA_RCFR0_MCU_RX_CTL_BAR | +MT_DMA_RCFR0_MCU_RX_BYPASS | +MT_DMA_RCFR0_RX_DROPPED_UCAST | +MT_DMA_RCFR0_RX_DROPPED_MCAST ; + set =FIELD_PREP (MT_DMA_RCFR0_RX_DROPPED_UCAST ,2 ) | +FIELD_PREP (MT_DMA_RCFR0_RX_DROPPED_MCAST ,2 ); +mt76_rmw (dev,MT_DMA_RCFR0 (chain), mask, set); +} + +static void mt7615_mac_init (struct mt7615_dev *dev) +{ +int i; + +mt7615_init_mac_chain (dev,0 ); +mt7615_init_mac_chain (dev,1 );mt76_rmw_field (dev,MT_TMAC_CTCR0 ,MT_TMAC_CTCR0_INS_DDLMT_REFTIME ,0x3f );
@@ -56,47 +95,14 @@ static void mt7615_mac_init(struct mt7615_dev *dev)mt76_rmw (dev,MT_AGG_SCR ,MT_AGG_SCR_NLNAV_MID_PTEC_DIS ,MT_AGG_SCR_NLNAV_MID_PTEC_DIS ); -mt76_wr (dev,MT_DMA_DCR0 ,MT_DMA_DCR0_RX_VEC_DROP | -FIELD_PREP (MT_DMA_DCR0_MAX_RX_LEN ,3072 )); - - val =FIELD_PREP (MT_AGG_ARxCR_LIMIT (0 ),7 ) | -FIELD_PREP (MT_AGG_ARxCR_LIMIT (1 ),2 ) | -FIELD_PREP (MT_AGG_ARxCR_LIMIT (2 ),2 ) | -FIELD_PREP (MT_AGG_ARxCR_LIMIT (3 ),2 ) | -FIELD_PREP (MT_AGG_ARxCR_LIMIT (4 ),1 ) | -FIELD_PREP (MT_AGG_ARxCR_LIMIT (5 ),1 ) | -FIELD_PREP (MT_AGG_ARxCR_LIMIT (6 ),1 ) | -FIELD_PREP (MT_AGG_ARxCR_LIMIT (7 ),1 ); -mt76_wr (dev,MT_AGG_ARUCR (0 ), val); -mt76_wr (dev,MT_AGG_ARUCR (1 ), val); - - val =FIELD_PREP (MT_AGG_ARxCR_LIMIT (0 ),MT7615_RATE_RETRY -1 ) | -FIELD_PREP (MT_AGG_ARxCR_LIMIT (1 ),MT7615_RATE_RETRY -1 ) | -FIELD_PREP (MT_AGG_ARxCR_LIMIT (2 ),MT7615_RATE_RETRY -1 ) | -FIELD_PREP (MT_AGG_ARxCR_LIMIT (3 ),MT7615_RATE_RETRY -1 ) | -FIELD_PREP (MT_AGG_ARxCR_LIMIT (4 ),MT7615_RATE_RETRY -1 ) | -FIELD_PREP (MT_AGG_ARxCR_LIMIT (5 ),MT7615_RATE_RETRY -1 ) | -FIELD_PREP (MT_AGG_ARxCR_LIMIT (6 ),MT7615_RATE_RETRY -1 ) | -FIELD_PREP (MT_AGG_ARxCR_LIMIT (7 ),MT7615_RATE_RETRY -1 ); -mt76_wr (dev,MT_AGG_ARDCR (0 ), val); -mt76_wr (dev,MT_AGG_ARDCR (1 ), val); -mt76_wr (dev,MT_AGG_ARCR , - (FIELD_PREP (MT_AGG_ARCR_RTS_RATE_THR ,2 ) | -MT_AGG_ARCR_RATE_DOWN_RATIO_EN | -FIELD_PREP (MT_AGG_ARCR_RATE_DOWN_RATIO ,1 ) | -FIELD_PREP (MT_AGG_ARCR_RATE_UP_EXTRA_TH ,4 ))); +FIELD_PREP (MT_AGG_ARCR_RTS_RATE_THR ,2 ) | +MT_AGG_ARCR_RATE_DOWN_RATIO_EN | +FIELD_PREP (MT_AGG_ARCR_RATE_DOWN_RATIO ,1 ) | +FIELD_PREP (MT_AGG_ARCR_RATE_UP_EXTRA_TH ,4 )); - mask =MT_DMA_RCFR0_MCU_RX_MGMT | -MT_DMA_RCFR0_MCU_RX_CTL_NON_BAR | -MT_DMA_RCFR0_MCU_RX_CTL_BAR | -MT_DMA_RCFR0_MCU_RX_BYPASS | -MT_DMA_RCFR0_RX_DROPPED_UCAST | -MT_DMA_RCFR0_RX_DROPPED_MCAST ; - set =FIELD_PREP (MT_DMA_RCFR0_RX_DROPPED_UCAST ,2 ) | -FIELD_PREP (MT_DMA_RCFR0_RX_DROPPED_MCAST ,2 ); -mt76_rmw (dev,MT_DMA_RCFR0 (0 ), mask, set); -mt76_rmw (dev,MT_DMA_RCFR0 (1 ), mask, set); +mt76_wr (dev,MT_DMA_DCR0 ,MT_DMA_DCR0_RX_VEC_DROP | +FIELD_PREP (MT_DMA_DCR0_MAX_RX_LEN ,3072 ));for (i =0 ; i <MT7615_WTBL_SIZE ; i++) mt7615_mac_wtbl_update(dev, i,
Signature · 1 line
2.25.1
Lorenzo Bianconi
maintainerPATCH v4 20/25 mt76: mt7615: introduce uni cmd command types
In reply to Lorenzo BianconiIntroduce mcu uni command type. Uni commands rely on a stripped verions of mt7615_mcu_txd data strutture. Split mt7615_mcu_txd_common and mt7615_mcu_txd. Uni commands will be use by mt7663e driver
--- .../net/wireless/mediatek/mt76/mt7615/mcu.c | 27 ++++++--- .../net/wireless/mediatek/mt76/mt7615/mcu.h | 60 ++++++++++++++++++- 2 files changed, 79 insertions(+), 8 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +20 -7
@@ -52,7 +52,8 @@ struct mt7615_fw_trailer {void mt7615_mcu_fill_msg (struct mt7615_dev *dev,struct sk_buff *skb,int cmd,int *wait_seq) { -int mcu_cmd = cmd &MCU_CMD_MASK ; +int txd_len, mcu_cmd = cmd &MCU_CMD_MASK ; +struct mt7615_uni_txd *uni_txd;struct mt7615_mcu_txd *mcu_txd;u8 seq, q_idx, pkt_fmt;__le32 *txd;
@@ -61,8 +62,11 @@ void mt7615_mcu_fill_msg(struct mt7615_dev *dev, struct sk_buff *skb, seq = ++dev->mt76.mcu.msg_seq &0xf ;if (!seq) seq = ++dev->mt76.mcu.msg_seq &0xf ; +if (wait_seq) + *wait_seq = seq; - mcu_txd = (struct mt7615_mcu_txd *)skb_push (skb,sizeof (*mcu_txd)); + txd_len = cmd &MCU_UNI_PREFIX ?sizeof (*uni_txd) :sizeof (*mcu_txd); + txd = (__le32 *)skb_push (skb, txd_len);if (cmd !=MCU_CMD_FW_SCATTER ) { q_idx =MT_TX_MCU_PORT_RX_Q0 ;
@@ -71,7 +75,6 @@ void mt7615_mcu_fill_msg(struct mt7615_dev *dev, struct sk_buff *skb, q_idx =MT_TX_MCU_PORT_RX_FWDL ; pkt_fmt =MT_TX_TYPE_FW ; } - txd = mcu_txd->txd; val =FIELD_PREP (MT_TXD0_TX_BYTES , skb->len) | FIELD_PREP(MT_TXD0_P_IDX, MT_TX_PORT_IDX_MCU) |
@@ -83,8 +86,22 @@ void mt7615_mcu_fill_msg(struct mt7615_dev *dev, struct sk_buff *skb,FIELD_PREP (MT_TXD1_PKT_FMT , pkt_fmt); txd[1 ] =cpu_to_le32 (val); +if (cmd &MCU_UNI_PREFIX ) { + uni_txd = (struct mt7615_uni_txd *)txd; + uni_txd->len =cpu_to_le16 (skb->len -sizeof (uni_txd->txd)); + uni_txd->option =MCU_CMD_UNI_EXT_ACK ; + uni_txd->s2d_index =MCU_S2D_H2N ; + uni_txd->pkt_type =MCU_PKT_ID ; + uni_txd->cid = mcu_cmd; + uni_txd->seq = seq; + +return ; + } + + mcu_txd = (struct mt7615_mcu_txd *)txd; mcu_txd->len =cpu_to_le16 (skb->len -sizeof (mcu_txd->txd)); mcu_txd->pq_id =cpu_to_le16 (MCU_PQ_ID (MT_TX_PORT_IDX_MCU , q_idx)); + mcu_txd->s2d_index =MCU_S2D_H2N ; mcu_txd->pkt_type =MCU_PKT_ID ; mcu_txd->seq = seq;
@@ -97,10 +114,6 @@ void mt7615_mcu_fill_msg(struct mt7615_dev *dev, struct sk_buff *skb, mcu_txd->ext_cid = cmd; mcu_txd->ext_cid_ack =1 ; } - mcu_txd->s2d_index =MCU_S2D_H2N ; - -if (wait_seq) - *wait_seq = seq; } static int __mt7615_mcu_msg_send(struct mt7615_dev *dev, struct sk_buff *skb,
drivers/net/wireless/mediatek/mt76/mt7615/mcu.h +59 -1
78 lines not on this page · raw message
Signature · 1 line
2.25.1
Lorenzo Bianconi
maintainerPATCH v4 21/25 mt76: mt7615: introduce set_bmc and st_sta for uni commands
In reply to Lorenzo BianconiIntroduce mt7615_mcu_uni_set_bmc and mt7615_mcu_uni_set_sta routines for mt7663e commands.
--- .../net/wireless/mediatek/mt76/mt7615/mcu.c | 27 ++++++++++++++++--- .../net/wireless/mediatek/mt76/mt7615/mcu.h | 15 ++++++++++- 2 files changed, 37 insertions(+), 5 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +23 -4
@@ -1062,8 +1062,8 @@ mt7615_mcu_sta_rx_ba(struct mt7615_dev *dev, }static int -mt7615_mcu_add_sta (struct mt7615_dev *dev,struct ieee80211_vif *vif, -struct ieee80211_sta *sta,bool enable) +mt7615_mcu_add_sta_cmd (struct mt7615_dev *dev,struct ieee80211_vif *vif, +struct ieee80211_sta *sta,bool enable,int cmd) {struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;struct wtbl_req_hdr *wtbl_hdr;
@@ -1092,8 +1092,15 @@ mt7615_mcu_add_sta(struct mt7615_dev *dev, struct ieee80211_vif *vif,mt7615_mcu_wtbl_ht_tlv (skb, sta, sta_wtbl, wtbl_hdr); } -return __mt76_mcu_skb_send_msg (&dev->mt76, skb, -MCU_EXT_CMD_STA_REC_UPDATE , true); +return __mt76_mcu_skb_send_msg (&dev->mt76, skb, cmd, true); +} + +static int +mt7615_mcu_add_sta (struct mt7615_dev *dev,struct ieee80211_vif *vif, +struct ieee80211_sta *sta,bool enable) +{ +return mt7615_mcu_add_sta_cmd (dev, vif, sta, enable, +MCU_EXT_CMD_STA_REC_UPDATE ); }static const struct mt7615_mcu_ops sta_update_ops = {
@@ -1106,6 +1113,18 @@ static const struct mt7615_mcu_ops sta_update_ops = { .sta_add = mt7615_mcu_add_sta, }; +static int +mt7615_mcu_uni_add_sta (struct mt7615_dev *dev,struct ieee80211_vif *vif, +struct ieee80211_sta *sta,bool enable) +{ +return mt7615_mcu_add_sta_cmd (dev, vif, sta, enable, +MCU_UNI_CMD_STA_REC_UPDATE ); +} + +static const struct mt7615_mcu_ops uni_update_ops = { + .sta_add = mt7615_mcu_uni_add_sta, +}; +static int mt7615_mcu_send_firmware (struct mt7615_dev *dev,const void *data,int len) {
drivers/net/wireless/mediatek/mt76/mt7615/mcu.h +14 -1
@@ -269,6 +269,10 @@ enum { MCU_EXT_CMD_SET_RDD_PATTERN = 0x7d, }; +enum { +MCU_UNI_CMD_STA_REC_UPDATE =MCU_UNI_PREFIX |0x03 , +}; +#define MCU_CMD_ACK BIT(0)#define MCU_CMD_UNI BIT(1)#define MCU_CMD_QUERY BIT(2)
@@ -607,6 +611,15 @@ struct sta_req_hdr {u8 rsv[2 ]; } __packed; +struct sta_rec_state { +__le16 tag; +__le16 len; +u8 state; +__le32 flags; +u8 vhtop; +u8 pad[2 ]; +} __packed; +struct sta_rec_basic {__le16 tag;__le16 len;
@@ -659,7 +672,7 @@ enum {STA_REC_BF ,STA_REC_AMSDU ,/* for CR4 */ STA_REC_BA , -STA_REC_RED ,/* not used */ +STA_REC_STATE ,STA_REC_TX_PROC ,/* for hdr trans and CSO in CR4 */ STA_REC_HT , STA_REC_VHT,
Signature · 1 line
2.25.1
Lorenzo Bianconi
maintainerPATCH v4 22/25 mt76: mt7615: add more uni mcu commands
In reply to Lorenzo BianconiFrom: Sean Wang <[email protected]>
Introduce mt7615_mcu_uni_set_bss, mt7615_mcu_uni_set_dev and mt7615_mcu_uni_set_beacon_offload uni mcu commands. This is a preliminary patch to add mt7663e support
--- .../net/wireless/mediatek/mt76/mt7615/mcu.c | 205 ++++++++++++++++++ .../net/wireless/mediatek/mt76/mt7615/mcu.h | 7 + 2 files changed, 212 insertions(+)
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +205 -0
@@ -1113,6 +1113,207 @@ static const struct mt7615_mcu_ops sta_update_ops = { .sta_add = mt7615_mcu_add_sta, }; +static int +mt7615_mcu_uni_add_dev (struct mt7615_dev *dev, +struct ieee80211_vif *vif,bool enable) +{ +struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv; +struct { +struct req_hdr { +u8 omac_idx; +u8 band_idx; +__le16 pad; + } __packed hdr; +struct req_tlv { +__le16 tag; +__le16 len; +u8 active; +u8 pad; +u8 omac_addr[ETH_ALEN ]; + } __packed tlv; + } data = { + .hdr = { + .omac_idx = mvif->omac_idx, + .band_idx = mvif->band_idx, + }, + .tlv = { + .tag =cpu_to_le16 (DEV_INFO_ACTIVE ), + .len =cpu_to_le16 (sizeof (struct req_tlv )), + .active = enable, + }, + }; + +memcpy (data.tlv.omac_addr, vif->addr,ETH_ALEN ); + +return __mt76_mcu_send_msg (&dev->mt76,MCU_UNI_CMD_DEV_INFO_UPDATE , + &data,sizeof (data), true); +} + +static int +mt7615_mcu_uni_ctrl_pm_state (struct mt7615_dev *dev,int band,int state) +{ +return 0 ; +} + +static int +mt7615_mcu_uni_add_bss (struct mt7615_dev *dev, +struct ieee80211_vif *vif,bool enable) +{ +struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv; +struct { +struct req_hdr { +u8 bss_idx; +u8 pad[3 ]; + } __packed hdr; +struct basic_tlv { +__le16 tag; +__le16 len; +u8 active; +u8 omac_idx; +u8 hw_bss_idx; +u8 band_idx; +__le32 conn_type; +u8 conn_state; +u8 wmm_idx; +u8 bssid[ETH_ALEN ]; +__le16 bmc_tx_wlan_idx; +__le16 bcn_interval; +u8 dtim_period; +u8 phymode; +__le16 sta_idx; +u8 nonht_basic_phy; +u8 pad[3 ]; + } __packed basic; + } req = { + .hdr = { + .bss_idx = mvif->idx, + }, + .basic = { + .tag =cpu_to_le16 (UNI_BSS_INFO_BASIC ), + .len =cpu_to_le16 (sizeof (struct basic_tlv )), + .bcn_interval =cpu_to_le16 (vif->bss_conf.beacon_int), + .dtim_period = vif->bss_conf.dtim_period, + .omac_idx = mvif->omac_idx, + .band_idx = mvif->band_idx, + .wmm_idx = mvif->wmm_idx, + .active = enable, + }, + }; +u8 idx, tx_wlan_idx =0 ; + + idx = mvif->omac_idx >EXT_BSSID_START ?HW_BSSID_0 : mvif->omac_idx; + req.basic.hw_bss_idx = idx; + +switch (vif->type) { +case NL80211_IFTYPE_MESH_POINT : +case NL80211_IFTYPE_AP : + req.basic.conn_type =cpu_to_le32 (CONNECTION_INFRA_AP ); + tx_wlan_idx = mvif->sta.wcid.idx; +break ; +case NL80211_IFTYPE_STATION : +if (enable) { +struct ieee80211_sta *sta; +struct mt7615_sta *msta; + +rcu_read_lock (); + sta =ieee80211_find_sta (vif, vif->bss_conf.bssid); +if (!sta) { +rcu_read_unlock (); +return -EINVAL ; + } + + msta = (struct mt7615_sta *)sta->drv_priv; + tx_wlan_idx = msta->wcid.idx; +rcu_read_unlock (); + } + req.basic.conn_type =cpu_to_le32 (CONNECTION_INFRA_STA ); +break ; +default : +WARN_ON (1 ); +break ; + } + +memcpy (req.basic.bssid, vif->bss_conf.bssid,ETH_ALEN ); + req.basic.bmc_tx_wlan_idx =cpu_to_le16 (tx_wlan_idx); + req.basic.sta_idx =cpu_to_le16 (tx_wlan_idx); + req.basic.conn_state = !enable; + +return __mt76_mcu_send_msg (&dev->mt76,MCU_UNI_CMD_BSS_INFO_UPDATE , + &req,sizeof (req), true); +} + +static int +mt7615_mcu_uni_add_beacon_offload (struct mt7615_dev *dev, +struct ieee80211_hw *hw, +struct ieee80211_vif *vif, +bool enable) +{ +struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv; +struct mt76_wcid *wcid = &dev->mt76.global_wcid; +struct ieee80211_mutable_offsets offs; +struct { +struct req_hdr { +u8 bss_idx; +u8 pad[3 ]; + } __packed hdr; +struct bcn_content_tlv { +__le16 tag; +__le16 len; +__le16 tim_ie_pos; +__le16 csa_ie_pos; +__le16 bcc_ie_pos; +/* 0: enable beacon offload +* 1: disable beacon offload +* 2: update probe respond offload +*/ +u8 enable; +/* 0: legacy format (TXD + payload) +* 1: only cap field IE +*/ +u8 type; +__le16 pkt_len; +u8 pkt[512 ]; + } __packed beacon_tlv; + } req = { + .hdr = { + .bss_idx = mvif->idx, + }, + .beacon_tlv = { + .tag =cpu_to_le16 (UNI_BSS_INFO_BCN_CONTENT ), + .len =cpu_to_le16 (sizeof (struct bcn_content_tlv )), + .enable = enable, + }, + }; +struct sk_buff *skb; + + skb =ieee80211_beacon_get_template (mt76_hw (dev), vif, &offs); +if (!skb) +return -EINVAL ; + +if (skb->len >512 -MT_TXD_SIZE ) { +dev_err (dev->mt76.dev,"beacon size limit exceed\n" ); +dev_kfree_skb (skb); +return -EINVAL ; + } + +mt7615_mac_write_txwi (dev, (__le32 *)(req.beacon_tlv.pkt), skb, + wcid,NULL ,0 ,NULL , true); +memcpy (req.beacon_tlv.pkt +MT_TXD_SIZE , skb->data, skb->len); + req.beacon_tlv.pkt_len =cpu_to_le16 (MT_TXD_SIZE + skb->len); + req.beacon_tlv.tim_ie_pos =cpu_to_le16 (MT_TXD_SIZE + offs.tim_offset); + +if (offs.csa_counter_offs[0 ]) { +u16 csa_offs; + + csa_offs =MT_TXD_SIZE + offs.csa_counter_offs[0 ] -4 ; + req.beacon_tlv.csa_ie_pos =cpu_to_le16 (csa_offs); + } +dev_kfree_skb (skb); + +return __mt76_mcu_send_msg (&dev->mt76,MCU_UNI_CMD_BSS_INFO_UPDATE , + &req,sizeof (req), true); +} +static int mt7615_mcu_uni_add_sta (struct mt7615_dev *dev,struct ieee80211_vif *vif,struct ieee80211_sta *sta,bool enable)
@@ -1122,6 +1323,10 @@ mt7615_mcu_uni_add_sta(struct mt7615_dev *dev, struct ieee80211_vif *vif, }static const struct mt7615_mcu_ops uni_update_ops = { + .add_beacon_offload = mt7615_mcu_uni_add_beacon_offload, + .set_pm_state = mt7615_mcu_uni_ctrl_pm_state, + .add_dev_info = mt7615_mcu_uni_add_dev, + .add_bss_info = mt7615_mcu_uni_add_bss, .sta_add = mt7615_mcu_uni_add_sta, };
drivers/net/wireless/mediatek/mt76/mt7615/mcu.h +7 -0
@@ -270,6 +270,8 @@ enum { };enum { +MCU_UNI_CMD_DEV_INFO_UPDATE =MCU_UNI_PREFIX |0x01 , +MCU_UNI_CMD_BSS_INFO_UPDATE =MCU_UNI_PREFIX |0x02 ,MCU_UNI_CMD_STA_REC_UPDATE =MCU_UNI_PREFIX |0x03 , };
@@ -279,6 +281,11 @@ enum {#define MCU_CMD_UNI_EXT_ACK (MCU_CMD_ACK | MCU_CMD_UNI | MCU_CMD_QUERY) +enum { +UNI_BSS_INFO_BASIC =0 , +UNI_BSS_INFO_BCN_CONTENT =7 , +}; +enum {PATCH_SEM_RELEASE =0x0 ,PATCH_SEM_GET =0x1
Signature · 1 line
2.25.1
Lorenzo Bianconi
maintainerPATCH v4 23/25 mt76: mt7615: introduce set_ba uni command
In reply to Lorenzo BianconiIntroduce mt7615_mcu_uni_set_ba routine in order to add support for mt7663e driver
--- .../net/wireless/mediatek/mt76/mt7615/mcu.c | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+)
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +84 -0
@@ -1314,6 +1314,88 @@ mt7615_mcu_uni_add_beacon_offload(struct mt7615_dev *dev, &req, sizeof(req), true); } +static int +mt7615_mcu_uni_tx_ba (struct mt7615_dev *dev, +struct ieee80211_ampdu_params *params, +bool enable) +{ +struct mt7615_sta *msta = (struct mt7615_sta *)params->sta->drv_priv; +struct mt7615_vif *mvif = msta->vif; +struct wtbl_req_hdr *wtbl_hdr; +struct tlv *sta_wtbl; +struct sk_buff *skb; +int err; + + skb =mt7615_mcu_alloc_sta_req (mvif, msta); +if (IS_ERR (skb)) +return PTR_ERR (skb); + + sta_wtbl =mt7615_mcu_add_tlv (skb,STA_REC_WTBL , +sizeof (struct sta_rec_wtbl )); + + wtbl_hdr =mt7615_mcu_alloc_wtbl_req (msta,WTBL_SET , sta_wtbl, &skb); +if (IS_ERR (wtbl_hdr)) +return PTR_ERR (wtbl_hdr); + +mt7615_mcu_wtbl_ba_tlv (skb, params, enable, true, sta_wtbl, + wtbl_hdr); + + err =__mt76_mcu_skb_send_msg (&dev->mt76, skb, +MCU_UNI_CMD_STA_REC_UPDATE , true); +if (err <0 ) +return err; + + skb =mt7615_mcu_alloc_sta_req (mvif, msta); +if (IS_ERR (skb)) +return PTR_ERR (skb); + +mt7615_mcu_sta_ba_tlv (skb, params, enable, true); + +return __mt76_mcu_skb_send_msg (&dev->mt76, skb, +MCU_UNI_CMD_STA_REC_UPDATE , true); +} + +static int +mt7615_mcu_uni_rx_ba (struct mt7615_dev *dev, +struct ieee80211_ampdu_params *params, +bool enable) +{ +struct mt7615_sta *msta = (struct mt7615_sta *)params->sta->drv_priv; +struct mt7615_vif *mvif = msta->vif; +struct wtbl_req_hdr *wtbl_hdr; +struct tlv *sta_wtbl; +struct sk_buff *skb; +int err; + + skb =mt7615_mcu_alloc_sta_req (mvif, msta); +if (IS_ERR (skb)) +return PTR_ERR (skb); + +mt7615_mcu_sta_ba_tlv (skb, params, enable, false); + + err =__mt76_mcu_skb_send_msg (&dev->mt76, skb, +MCU_UNI_CMD_STA_REC_UPDATE , true); +if (err <0 || !enable) +return err; + + skb =mt7615_mcu_alloc_sta_req (mvif, msta); +if (IS_ERR (skb)) +return PTR_ERR (skb); + + sta_wtbl =mt7615_mcu_add_tlv (skb,STA_REC_WTBL , +sizeof (struct sta_rec_wtbl )); + + wtbl_hdr =mt7615_mcu_alloc_wtbl_req (msta,WTBL_SET , sta_wtbl, &skb); +if (IS_ERR (wtbl_hdr)) +return PTR_ERR (wtbl_hdr); + +mt7615_mcu_wtbl_ba_tlv (skb, params, enable, false, sta_wtbl, + wtbl_hdr); + +return __mt76_mcu_skb_send_msg (&dev->mt76, skb, +MCU_UNI_CMD_STA_REC_UPDATE , true); +} +static int mt7615_mcu_uni_add_sta (struct mt7615_dev *dev,struct ieee80211_vif *vif,struct ieee80211_sta *sta,bool enable)
@@ -1327,6 +1409,8 @@ static const struct mt7615_mcu_ops uni_update_ops = { .set_pm_state = mt7615_mcu_uni_ctrl_pm_state, .add_dev_info = mt7615_mcu_uni_add_dev, .add_bss_info = mt7615_mcu_uni_add_bss, + .add_tx_ba = mt7615_mcu_uni_tx_ba, + .add_rx_ba = mt7615_mcu_uni_rx_ba, .sta_add = mt7615_mcu_uni_add_sta, };
Signature · 1 line
2.25.1
Lorenzo Bianconi
maintainerPATCH v4 24/25 mt76: mt7615: get rid of sta_rec_wtbl data structure
In reply to Lorenzo BianconiSobstitute sta_rec_wtbl data structure with tlv one
--- drivers/net/wireless/mediatek/mt76/mt7615/mcu.c | 17 +++++++---------- drivers/net/wireless/mediatek/mt76/mt7615/mcu.h | 7 +------ 2 files changed, 8 insertions(+), 16 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +7 -10
@@ -486,7 +486,7 @@ static struct wtbl_req_hdr * mt7615_mcu_alloc_wtbl_req(struct mt7615_sta *msta, int cmd, void *sta_wtbl, struct sk_buff **skb) { - struct sta_rec_wtbl *sta_hdr = sta_wtbl; + struct tlv *sta_hdr = sta_wtbl; struct wtbl_req_hdr hdr = { .wlan_idx = msta->wcid.idx, .operation = cmd,
@@ -512,7 +512,7 @@ mt7615_mcu_add_nested_tlv(struct sk_buff *skb, int tag, int len, void *sta_ntlv, void *sta_wtbl) { struct sta_ntlv_hdr *ntlv_hdr = sta_ntlv; -struct sta_rec_wtbl *sta_hdr = sta_wtbl; +struct tlv *sta_hdr = sta_wtbl; struct tlv *ptlv, tlv = { .tag = cpu_to_le16(tag), .len = cpu_to_le16(len),
@@ -1035,8 +1035,8 @@ mt7615_mcu_sta_ba(struct mt7615_dev *dev,return PTR_ERR (skb);mt7615_mcu_sta_ba_tlv (skb, params, enable, tx); - sta_wtbl =mt7615_mcu_add_tlv (skb,STA_REC_WTBL , -sizeof (struct sta_rec_wtbl )); + + sta_wtbl =mt7615_mcu_add_tlv (skb,STA_REC_WTBL ,sizeof (struct tlv )); wtbl_hdr =mt7615_mcu_alloc_wtbl_req (msta,WTBL_SET , sta_wtbl, &skb);mt7615_mcu_wtbl_ba_tlv (skb, params, enable, tx, sta_wtbl, wtbl_hdr);
@@ -1081,8 +1081,7 @@ mt7615_mcu_add_sta_cmd(struct mt7615_dev *dev, struct ieee80211_vif *vif,if (enable && sta)mt7615_mcu_sta_ht_tlv (skb, sta); - sta_wtbl =mt7615_mcu_add_tlv (skb,STA_REC_WTBL , -sizeof (struct sta_rec_wtbl )); + sta_wtbl =mt7615_mcu_add_tlv (skb,STA_REC_WTBL ,sizeof (struct tlv )); wtbl_hdr =mt7615_mcu_alloc_wtbl_req (msta,WTBL_RESET_AND_SET , sta_wtbl, &skb);
@@ -1330,8 +1329,7 @@ mt7615_mcu_uni_tx_ba(struct mt7615_dev *dev,if (IS_ERR (skb))return PTR_ERR (skb); - sta_wtbl =mt7615_mcu_add_tlv (skb,STA_REC_WTBL , -sizeof (struct sta_rec_wtbl )); + sta_wtbl =mt7615_mcu_add_tlv (skb,STA_REC_WTBL ,sizeof (struct tlv )); wtbl_hdr =mt7615_mcu_alloc_wtbl_req (msta,WTBL_SET , sta_wtbl, &skb);if (IS_ERR (wtbl_hdr))
@@ -1382,8 +1380,7 @@ mt7615_mcu_uni_rx_ba(struct mt7615_dev *dev,if (IS_ERR (skb))return PTR_ERR (skb); - sta_wtbl =mt7615_mcu_add_tlv (skb,STA_REC_WTBL , -sizeof (struct sta_rec_wtbl )); + sta_wtbl =mt7615_mcu_add_tlv (skb,STA_REC_WTBL ,sizeof (struct tlv )); wtbl_hdr =mt7615_mcu_alloc_wtbl_req (msta,WTBL_SET , sta_wtbl, &skb);if (IS_ERR (wtbl_hdr))
drivers/net/wireless/mediatek/mt76/mt7615/mcu.h +1 -6
@@ -577,7 +577,7 @@ struct wtbl_raw { sizeof(struct sta_rec_basic) + \ sizeof(struct sta_rec_ht) + \ sizeof(struct sta_rec_vht) + \ - sizeof(struct sta_rec_wtbl) + \ + sizeof(struct tlv) + \ MT7615_WTBL_UPDATE_MAX_SIZE)#define MT7615_WTBL_UPDATE_BA_SIZE (sizeof(struct wtbl_req_hdr) + \
@@ -666,11 +666,6 @@ struct sta_rec_ba {__le16 winsize; } __packed; -struct sta_rec_wtbl { -__le16 tag; -__le16 len; -} __packed; -enum {STA_REC_BASIC ,STA_REC_RA ,
Signature · 1 line
2.25.1
Lorenzo Bianconi
maintainerPATCH v4 25/25 mt76: mt7615: introduce mt7663e support
In reply to Lorenzo BianconiIntroduce support for mt7663e 802.11ac 2x2:2 chipset to mt7615 driver.
--- .../net/wireless/mediatek/mt76/mt7615/dma.c | 50 +++++- .../wireless/mediatek/mt76/mt7615/eeprom.c | 40 +++-- .../net/wireless/mediatek/mt76/mt7615/init.c | 18 +- .../net/wireless/mediatek/mt76/mt7615/mac.c | 6 + .../net/wireless/mediatek/mt76/mt7615/mac.h | 11 +- .../net/wireless/mediatek/mt76/mt7615/mcu.c | 156 +++++++++++++++++- .../net/wireless/mediatek/mt76/mt7615/mmio.c | 28 ++++ .../wireless/mediatek/mt76/mt7615/mt7615.h | 5 + .../net/wireless/mediatek/mt76/mt7615/pci.c | 7 +- .../net/wireless/mediatek/mt76/mt7615/regs.h | 12 +- 10 files changed, 308 insertions(+), 25 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/dma.c +46 -4
@@ -101,8 +101,12 @@ void mt7615_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q,__le32 *rxd = (__le32 *)skb->data;__le32 *end = (__le32 *)&skb->data[skb->len];enum rx_pkt_type type; +u16 flag; type =FIELD_GET (MT_RXD0_PKT_TYPE ,le32_to_cpu (rxd[0 ])); + flag =FIELD_GET (MT_RXD0_PKT_FLAG ,le32_to_cpu (rxd[0 ])); +if (type ==PKT_TYPE_RX_EVENT && flag ==0x1 ) + type =PKT_TYPE_NORMAL_MCU ;switch (type) {case PKT_TYPE_TXS :
@@ -116,6 +120,7 @@ void mt7615_queue_rx_skb(struct mt76_dev *mdev, enum mt76_rxq_id q,case PKT_TYPE_RX_EVENT :mt7615_mcu_rx_event (dev, skb);break ; +case PKT_TYPE_NORMAL_MCU :case PKT_TYPE_NORMAL :if (!mt7615_mac_fill_rx (dev, skb)) {mt76_rx (&dev->mt76, q, skb);
@@ -186,6 +191,41 @@ static void mt7622_dma_sched_init(struct mt7615_dev *dev)mt76_wr (dev, reg +MT_DMASHDL_SCHED_SET1 ,0xedcba987 ); } +static void mt7663_dma_sched_init (struct mt7615_dev *dev) +{ +int i; + +mt76_rmw (dev,MT_DMA_SHDL (MT_DMASHDL_PKT_MAX_SIZE ), +MT_DMASHDL_PKT_MAX_SIZE_PLE |MT_DMASHDL_PKT_MAX_SIZE_PSE , +FIELD_PREP (MT_DMASHDL_PKT_MAX_SIZE_PLE ,1 ) | +FIELD_PREP (MT_DMASHDL_PKT_MAX_SIZE_PSE ,8 )); + +/* enable refill control group 0, 1, 2, 4, 5 */ +mt76_wr (dev,MT_DMA_SHDL (MT_DMASHDL_REFILL ),0xffc80000 ); +/* enable group 0, 1, 2, 4, 5, 15 */ +mt76_wr (dev,MT_DMA_SHDL (MT_DMASHDL_OPTIONAL ),0x70068037 ); + +/* each group min quota must larger then PLE_PKT_MAX_SIZE_NUM */ +for (i =0 ; i <5 ; i++) +mt76_wr (dev,MT_DMA_SHDL (MT_DMASHDL_GROUP_QUOTA (i)), +FIELD_PREP (MT_DMASHDL_GROUP_QUOTA_MIN ,0x40 ) | +FIELD_PREP (MT_DMASHDL_GROUP_QUOTA_MAX ,0x800 )); +mt76_wr (dev,MT_DMA_SHDL (MT_DMASHDL_GROUP_QUOTA (5 )), +FIELD_PREP (MT_DMASHDL_GROUP_QUOTA_MIN ,0x40 ) | +FIELD_PREP (MT_DMASHDL_GROUP_QUOTA_MAX ,0x40 )); +mt76_wr (dev,MT_DMA_SHDL (MT_DMASHDL_GROUP_QUOTA (15 )), +FIELD_PREP (MT_DMASHDL_GROUP_QUOTA_MIN ,0x20 ) | +FIELD_PREP (MT_DMASHDL_GROUP_QUOTA_MAX ,0x20 )); + +mt76_wr (dev,MT_DMA_SHDL (MT_DMASHDL_Q_MAP (0 )),0x42104210 ); +mt76_wr (dev,MT_DMA_SHDL (MT_DMASHDL_Q_MAP (1 )),0x42104210 ); +mt76_wr (dev,MT_DMA_SHDL (MT_DMASHDL_Q_MAP (2 )),0x00050005 ); +mt76_wr (dev,MT_DMA_SHDL (MT_DMASHDL_Q_MAP (3 )),0 ); +/* ALTX0 and ALTX1 QID mapping to group 5 */ +mt76_wr (dev,MT_DMA_SHDL (MT_DMASHDL_SCHED_SET0 ),0x6012345f ); +mt76_wr (dev,MT_DMA_SHDL (MT_DMASHDL_SCHED_SET1 ),0xedcba987 ); +} +int mt7615_dma_init (struct mt7615_dev *dev) {int rx_ring_size =MT7615_RX_RING_SIZE ;
@@ -198,10 +238,6 @@ int mt7615_dma_init(struct mt7615_dev *dev)MT_WPDMA_GLO_CFG_FIFO_LITTLE_ENDIAN | MT_WPDMA_GLO_CFG_OMIT_TX_INFO); -if (!is_mt7622 (&dev->mt76)) -mt76_set (dev,MT_WPDMA_GLO_CFG , -MT_WPDMA_GLO_CFG_FIRST_TOKEN_ONLY ); -mt76_rmw_field (dev,MT_WPDMA_GLO_CFG ,MT_WPDMA_GLO_CFG_TX_BT_SIZE_BIT0 ,0x1 );
@@ -215,6 +251,9 @@ int mt7615_dma_init(struct mt7615_dev *dev) MT_WPDMA_GLO_CFG_MULTI_DMA_EN, 0x3);if (is_mt7615 (&dev->mt76)) { +mt76_set (dev,MT_WPDMA_GLO_CFG , +MT_WPDMA_GLO_CFG_FIRST_TOKEN_ONLY ); +mt76_wr (dev,MT_WPDMA_GLO_CFG1 ,0x1 );mt76_wr (dev,MT_WPDMA_TX_PRE_CFG ,0xf0000 );mt76_wr (dev,MT_WPDMA_RX_PRE_CFG ,0xf7f0000 );
@@ -271,6 +310,9 @@ int mt7615_dma_init(struct mt7615_dev *dev)if (is_mt7622 (&dev->mt76))mt7622_dma_sched_init (dev); +if (is_mt7663 (&dev->mt76)) +mt7663_dma_sched_init (dev); +return 0 ; }
drivers/net/wireless/mediatek/mt76/mt7615/eeprom.c +28 -12
@@ -128,19 +128,25 @@ mt7615_eeprom_parse_hw_band_cap(struct mt7615_dev *dev)static void mt7615_eeprom_parse_hw_cap (struct mt7615_dev *dev) {u8 *eeprom = dev->mt76.eeprom.data; -u8 tx_mask, max_nss; -u32 val; +u8 tx_mask;mt7615_eeprom_parse_hw_band_cap (dev); -/* read tx-rx mask from eeprom */ - val =mt76_rr (dev,MT_TOP_STRAP_STA ); - max_nss = val &MT_TOP_3NSS ?3 :4 ; +if (is_mt7663 (&dev->mt76)) { + tx_mask =2 ; + }else { +u8 max_nss; +u32 val; - tx_mask =FIELD_GET (MT_EE_NIC_CONF_TX_MASK , - eeprom[MT_EE_NIC_CONF_0 ]); -if (!tx_mask || tx_mask > max_nss) - tx_mask = max_nss; +/* read tx-rx mask from eeprom */ + val =mt76_rr (dev,MT_TOP_STRAP_STA ); + max_nss = val &MT_TOP_3NSS ?3 :4 ; + + tx_mask =FIELD_GET (MT_EE_NIC_CONF_TX_MASK , + eeprom[MT_EE_NIC_CONF_0 ]); +if (!tx_mask || tx_mask > max_nss) + tx_mask = max_nss; + } dev->chainmask =BIT (tx_mask) -1 ; dev->mphy.antenna_mask = dev->chainmask;
@@ -247,6 +253,18 @@ static void mt7622_apply_cal_free_data(struct mt7615_dev *dev) } } +static void mt7615_cal_free_data (struct mt7615_dev *dev) +{ +switch (mt76_chip (&dev->mt76)) { +case 0x7622 : +mt7622_apply_cal_free_data (dev); +break ; +case 0x7615 : +mt7615_apply_cal_free_data (dev); +break ; + } +} +int mt7615_eeprom_init (struct mt7615_dev *dev) {int ret;
@@ -259,10 +277,8 @@ int mt7615_eeprom_init(struct mt7615_dev *dev)if (ret && dev->mt76.otp.data)memcpy (dev->mt76.eeprom.data, dev->mt76.otp.data,MT7615_EEPROM_SIZE ); -else if (is_mt7622 (&dev->mt76)) -mt7622_apply_cal_free_data (dev);else -mt7615_apply_cal_free_data (dev); +mt7615_cal_free_data (dev);mt7615_eeprom_parse_hw_cap (dev); memcpy(dev->mt76.macaddr, dev->mt76.eeprom.data + MT_EE_MAC_ADDR,
drivers/net/wireless/mediatek/mt76/mt7615/init.c +14 -4
@@ -4,6 +4,7 @@* Author: Roy Luo <[email protected]> * Ryder Lee <[email protected]> * Felix Fietkau <[email protected]> +* Lorenzo Bianconi <[email protected]> */ #include <linux/etherdevice.h>
@@ -77,7 +78,6 @@ static void mt7615_mac_init(struct mt7615_dev *dev)int i;mt7615_init_mac_chain (dev,0 ); -mt7615_init_mac_chain (dev,1 );mt76_rmw_field (dev,MT_TMAC_CTCR0 ,MT_TMAC_CTCR0_INS_DDLMT_REFTIME ,0x3f );
@@ -101,15 +101,25 @@ static void mt7615_mac_init(struct mt7615_dev *dev)FIELD_PREP (MT_AGG_ARCR_RATE_DOWN_RATIO ,1 ) | FIELD_PREP(MT_AGG_ARCR_RATE_UP_EXTRA_TH, 4)); -mt76_wr (dev,MT_DMA_DCR0 ,MT_DMA_DCR0_RX_VEC_DROP | -FIELD_PREP (MT_DMA_DCR0_MAX_RX_LEN ,3072 )); -for (i =0 ; i <MT7615_WTBL_SIZE ; i++)mt7615_mac_wtbl_update (dev, i,MT_WTBL_UPDATE_ADM_COUNT_CLEAR );mt76_set (dev,MT_WF_RMAC_MIB_TIME0 ,MT_WF_RMAC_MIB_RXTIME_EN );mt76_set (dev,MT_WF_RMAC_MIB_AIRTIME0 ,MT_WF_RMAC_MIB_RXTIME_EN ); + +/* disable hdr translation and hw AMSDU */ +mt76_wr (dev,MT_DMA_DCR0 , +FIELD_PREP (MT_DMA_DCR0_MAX_RX_LEN ,3072 ) | +MT_DMA_DCR0_RX_VEC_DROP ); +if (is_mt7663 (&dev->mt76)) { +mt76_wr (dev,MT_CSR (0x010 ),0x8208 ); +mt76_wr (dev,0x44064 ,0x2000000 ); +mt76_wr (dev,MT_WF_AGG (0x160 ),0x5c341c02 ); +mt76_wr (dev,MT_WF_AGG (0x164 ),0x70708040 ); + }else { +mt7615_init_mac_chain (dev,1 ); + } }bool mt7615_wait_for_mcu_init (struct mt7615_dev *dev)
drivers/net/wireless/mediatek/mt76/mt7615/mac.c +6 -0
@@ -1524,6 +1524,9 @@ void mt7615_mac_set_scs(struct mt7615_dev *dev, bool enable)if (dev->scs_en == enable) goto out; +if (is_mt7663 (&dev->mt76)) + goto out; +if (enable) {mt76_set (dev,MT_WF_PHY_MIN_PRI_PWR (0 ),MT_WF_PHY_PD_BLK (0 ));
@@ -1555,6 +1558,9 @@ void mt7615_mac_enable_nf(struct mt7615_dev *dev, bool ext_phy) {u32 rxtd; +if (is_mt7663 (&dev->mt76)) +return ; +if (ext_phy) rxtd =MT_WF_PHY_RXTD2 (10 );else
drivers/net/wireless/mediatek/mt76/mt7615/mac.h +10 -1
@@ -8,6 +8,7 @@#define MT_CT_DMA_BUF_NUM 2#define MT_RXD0_LENGTH GENMASK(15, 0) +#define MT_RXD0_PKT_FLAG GENMASK(19, 16)#define MT_RXD0_PKT_TYPE GENMASK(31, 29)#define MT_RXD0_NORMAL_ETH_TYPE_OFS GENMASK(22, 16)
@@ -26,7 +27,8 @@ enum rx_pkt_type {PKT_TYPE_RX_TMR ,PKT_TYPE_RETRIEVE ,PKT_TYPE_TXRX_NOTIFY , - PKT_TYPE_RX_EVENT +PKT_TYPE_RX_EVENT , + PKT_TYPE_NORMAL_MCU, };#define MT_RXD1_NORMAL_BSSID GENMASK(31, 26)
@@ -229,8 +231,15 @@ enum tx_phy_bandwidth {#define MT_TXD6_FIXED_BW BIT(2)#define MT_TXD6_BW GENMASK(1, 0) +/* MT7663 DW7 HW-AMSDU */ +#define MT_TXD7_HW_AMSDU_CAP BIT(30)#define MT_TXD7_TYPE GENMASK(21, 20)#define MT_TXD7_SUB_TYPE GENMASK(19, 16) +#define MT_TXD7_SPE_IDX GENMASK(15, 11) +#define MT_TXD7_SPE_IDX_SLE BIT(10) + +#define MT_TXD8_L_TYPE GENMASK(5, 4) +#define MT_TXD8_L_SUB_TYPE GENMASK(3, 0)#define MT_TX_RATE_STBC BIT(11)#define MT_TX_RATE_NSS GENMASK(10, 9)
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +154 -2
184 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7615/mmio.c +28 -0
@@ -10,6 +10,7 @@ const u32 mt7615e_reg_map[] = { [MT_TOP_CFG_BASE] = 0x01000, [MT_HW_BASE] = 0x01000, [MT_PCIE_REMAP_2] = 0x02504, + [MT_ARB_BASE] = 0x20c00, [MT_HIF_BASE] = 0x04000, [MT_CSR_BASE] = 0x07000, [MT_PHY_BASE] = 0x10000,
@@ -28,6 +29,30 @@ const u32 mt7615e_reg_map[] = { [MT_EFUSE_ADDR_BASE] = 0x81070000, }; +const u32 mt7663e_reg_map[] = { + [MT_TOP_CFG_BASE ] =0x01000 , + [MT_HW_BASE ] =0x02000 , + [MT_DMA_SHDL_BASE ] =0x06000 , + [MT_PCIE_REMAP_2 ] =0x0700c , + [MT_ARB_BASE ] =0x20c00 , + [MT_HIF_BASE ] =0x04000 , + [MT_CSR_BASE ] =0x07000 , + [MT_PHY_BASE ] =0x10000 , + [MT_CFG_BASE ] =0x20000 , + [MT_AGG_BASE ] =0x22000 , + [MT_TMAC_BASE ] =0x24000 , + [MT_RMAC_BASE ] =0x25000 , + [MT_DMA_BASE ] =0x27000 , + [MT_WTBL_BASE_ON ] =0x29000 , + [MT_WTBL_BASE_OFF ] =0x29800 , + [MT_LPON_BASE ] =0x2b000 , + [MT_MIB_BASE ] =0x2d000 , + [MT_WTBL_BASE_ADDR ] =0x30000 , + [MT_PCIE_REMAP_BASE2 ] =0x90000 , + [MT_TOP_MISC_BASE ] =0xc0000 , + [MT_EFUSE_ADDR_BASE ] =0x78011000 , +}; +u32 mt7615_reg_map (struct mt7615_dev *dev,u32 addr) {u32 base, offset;
@@ -135,6 +160,9 @@ int mt7615_mmio_probe(struct device *pdev, void __iomem *mem_base,if (ret) goto error; +if (is_mt7663 (mdev)) +mt76_wr (dev,MT_PCIE_IRQ_ENABLE ,1 ); + ret =mt7615_register_device (dev);if (ret) goto error;
drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h +5 -0
@@ -38,6 +38,10 @@#define MT7615_FIRMWARE_V1 1#define MT7615_FIRMWARE_V2 2 +#define MT7615_FIRMWARE_V3 3 + +#define MT7663_ROM_PATCH "mediatek/mt7663pr2h_v3.bin" +#define MT7663_FIRMWARE_N9 "mediatek/mt7663_n9_v3.bin"#define MT7615_EEPROM_SIZE 1024#define MT7615_TOKEN_SIZE 4096
@@ -287,6 +291,7 @@ mt7615_ext_phy(struct mt7615_dev *dev)extern const struct ieee80211_ops mt7615_ops;extern const u32 mt7615e_reg_map[__MT_BASE_MAX]; +extern const u32 mt7663e_reg_map[__MT_BASE_MAX];extern struct pci_driver mt7615_pci_driver;extern struct platform_driver mt7622_wmac_driver;
drivers/net/wireless/mediatek/mt76/mt7615/pci.c +6 -1
@@ -13,12 +13,14 @@static const struct pci_device_id mt7615_pci_device_table[] = { {PCI_DEVICE (0x14c3 ,0x7615 ) }, + {PCI_DEVICE (0x14c3 ,0x7663 ) }, { }, };static int mt7615_pci_probe (struct pci_dev *pdev,const struct pci_device_id *id) { +const u32 *map;int ret; ret =pcim_enable_device (pdev);
@@ -35,8 +37,9 @@ static int mt7615_pci_probe(struct pci_dev *pdev,if (ret)return ret; + map = id->device ==0x7663 ? mt7663e_reg_map : mt7615e_reg_map;return mt7615_mmio_probe (&pdev->dev,pcim_iomap_table (pdev)[0 ], - pdev->irq, mt7615e_reg_map); + pdev->irq, map); }static void mt7615_pci_remove (struct pci_dev *pdev)
@@ -58,3 +61,5 @@ MODULE_DEVICE_TABLE(pci, mt7615_pci_device_table);MODULE_FIRMWARE (MT7615_FIRMWARE_CR4 );MODULE_FIRMWARE (MT7615_FIRMWARE_N9 );MODULE_FIRMWARE (MT7615_ROM_PATCH ); +MODULE_FIRMWARE (MT7663_FIRMWARE_N9 ); +MODULE_FIRMWARE (MT7663_ROM_PATCH );
drivers/net/wireless/mediatek/mt76/mt7615/regs.h +11 -1
@@ -7,7 +7,9 @@enum mt7615_reg_base {MT_TOP_CFG_BASE ,MT_HW_BASE , +MT_DMA_SHDL_BASE ,MT_PCIE_REMAP_2 , +MT_ARB_BASE ,MT_HIF_BASE ,MT_CSR_BASE ,MT_PHY_BASE ,
@@ -40,6 +42,8 @@ enum mt7615_reg_base {#define MT_TOP_MISC2 ((dev)->reg_map[MT_TOP_CFG_BASE] + 0x134)#define MT_TOP_MISC2_FW_STATE GENMASK(2, 0) +#define MT7663_TOP_MISC2_FW_STATE GENMASK(3, 1) +#define MT_MCU_BASE 0x2000#define MT_MCU (ofs) (MT_MCU_BASE + (ofs))
@@ -58,6 +62,10 @@ enum mt7615_reg_base {#define MT7663_MCU_PCIE_REMAP_2_OFFSET GENMASK(15, 0)#define MT7663_MCU_PCIE_REMAP_2_BASE GENMASK(31, 16) +#define MT_HIF2_BASE 0xf0000 +#define MT_HIF2 (ofs) (MT_HIF2_BASE + (ofs)) +#define MT_PCIE_IRQ_ENABLE MT_HIF2(0x188) +#define MT_CFG_LPCR_HOST MT_HIF(0x1f0)#define MT_CFG_LPCR_HOST_FW_OWN BIT(0)#define MT_CFG_LPCR_HOST_DRV_OWN BIT(1)
@@ -209,7 +217,7 @@ enum mt7615_reg_base {#define MT_AGG_SCR MT_WF_AGG(0x0fc)#define MT_AGG_SCR_NLNAV_MID_PTEC_DIS BIT(3) -#define MT_WF_ARB_BASE 0x20c00 +#define MT_WF_ARB_BASE ((dev)->reg_map[MT_ARB_BASE])#define MT_WF_ARB (ofs) (MT_WF_ARB_BASE + (ofs))#define MT_ARB_SCR MT_WF_ARB(0x080)
@@ -400,6 +408,8 @@ enum mt7615_reg_base {#define MT_TX_AGG_CNT (n) MT_WF_MIB(0xa8 + ((n) << 2)) +#define MT_DMA_SHDL (ofs) (dev->reg_map[MT_DMA_SHDL_BASE] + (ofs)) +#define MT_DMASHDL_BASE 0x5000a000#define MT_DMASHDL_OPTIONAL 0x008#define MT_DMASHDL_PAGE 0x00c
Signature · 1 line
2.25.1