mt7663 driver update
Subsystems (2)
Lorenzo Bianconi
maintainercover mt7663 driver update
This series add the following new features to mt7663e driver:
- hw scan
- scheduled scan
- noise floor estimation
Moreover it fixes some hw configuration issues
Lorenzo Bianconi (9):
mt76: mt7663: fix mt7615_mac_cca_stats_reset routine
mt76: mt7663: enable nf estimation
mt76: mt7615: make scs configurable per chain
mt76: mt7663: disable RDD commands
mt76: mt7615: add ethool support to mt7663 driver
mt76: mt7615: introduce mt7615_mcu_set_channel_domain mcu command
mt76: mt7615: introduce hw scan support
mt76: mt7615: introduce scheduled scan support
mt76: mt7615: introduce rlm tlv in bss_info mcu command
Sean Wang (3):
mt76: mt7663: keep Rx filters as the default
mt76: mt7615: introduce BSS absence event
mt76: mt7615: removing unnecessary register operations
drivers/net/wireless/mediatek/mt76/mt76.h | 2 + .../wireless/mediatek/mt76/mt7615/debugfs.c | 8 +- .../net/wireless/mediatek/mt76/mt7615/init.c | 45 +- .../net/wireless/mediatek/mt76/mt7615/mac.c | 76 +-- .../net/wireless/mediatek/mt76/mt7615/main.c | 86 +++- .../net/wireless/mediatek/mt76/mt7615/mcu.c | 434 +++++++++++++++++- .../net/wireless/mediatek/mt76/mt7615/mcu.h | 143 +++++- .../wireless/mediatek/mt76/mt7615/mt7615.h | 36 +- .../net/wireless/mediatek/mt76/mt7615/regs.h | 3 + 9 files changed, 767 insertions(+), 66 deletions(-)
Signature · 1 line
2.25.1
Lorenzo Bianconi
maintainerPATCH 1/12 mt76: mt7663: fix mt7615_mac_cca_stats_reset routine
Fix PHYMUX_5 register definition for mt7663 inmt7615_mac_cca_stats_reset routine
--- drivers/net/wireless/mediatek/mt76/mt7615/mac.c | 8 +++++++- drivers/net/wireless/mediatek/mt76/mt7615/regs.h | 1 + 2 files changed, 8 insertions(+), 1 deletion(-)
drivers/net/wireless/mediatek/mt76/mt7615/mac.c +7 -1
@@ -1574,8 +1574,14 @@ void mt7615_mac_cca_stats_reset(struct mt7615_phy *phy) {struct mt7615_dev *dev = phy->dev;bool ext_phy = phy != &dev->phy; -u32 reg =MT_WF_PHY_R0_PHYMUX_5 (ext_phy); +u32 reg; +if (is_mt7663 (&dev->mt76)) + reg =MT7663_WF_PHY_R0_PHYMUX_5 ; +else + reg =MT_WF_PHY_R0_PHYMUX_5 (ext_phy); + +/* reset PD and MDRDY counters */ mt76_clear (dev, reg,GENMASK (22 ,20 ));mt76_set (dev, reg,BIT (22 ) |BIT (20 )); }
drivers/net/wireless/mediatek/mt76/mt7615/regs.h +1 -0
@@ -151,6 +151,7 @@ enum mt7615_reg_base {#define MT_WF_PHY_WF2_RFCTRL0_LPBCN_EN BIT(9)#define MT_WF_PHY_R0_PHYMUX_5 (_phy) MT_WF_PHY(0x0614 + ((_phy) << 9)) +#define MT7663_WF_PHY_R0_PHYMUX_5 MT_WF_PHY(0x0414)#define MT_WF_PHY_R0_PHYCTRL_STS0 (_phy) MT_WF_PHY(0x020c + ((_phy) << 9))#define MT_WF_PHYCTRL_STAT_PD_OFDM GENMASK(31, 16)
Signature · 1 line
2.25.1
Lorenzo Bianconi
maintainerPATCH 2/12 mt76: mt7663: enable nf estimation
In reply to Lorenzo BianconiEnable Noise floor estimation for mt7663 driver
--- drivers/net/wireless/mediatek/mt76/mt7615/mac.c | 16 +++++++++++----- drivers/net/wireless/mediatek/mt76/mt7615/regs.h | 2 ++ 2 files changed, 13 insertions(+), 5 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/mac.c +11 -5
@@ -1556,10 +1556,12 @@ void mt7615_mac_set_scs(struct mt7615_dev *dev, bool enable)void mt7615_mac_enable_nf (struct mt7615_dev *dev,bool ext_phy) { -u32 rxtd; +u32 rxtd, reg;if (is_mt7663 (&dev->mt76)) -return ; + reg =MT7663_WF_PHY_R0_PHYMUX_5 ; +else + reg =MT_WF_PHY_R0_PHYMUX_5 (ext_phy);if (ext_phy) rxtd =MT_WF_PHY_RXTD2 (10 );
@@ -1567,7 +1569,7 @@ void mt7615_mac_enable_nf(struct mt7615_dev *dev, bool ext_phy) rxtd =MT_WF_PHY_RXTD (12 );mt76_set (dev, rxtd,BIT (18 ) |BIT (29 )); -mt76_set (dev,MT_WF_PHY_R0_PHYMUX_5 (ext_phy),0x5 <<12 ); +mt76_set (dev, reg,0x5 <<12 ); }void mt7615_mac_cca_stats_reset (struct mt7615_phy *phy)
@@ -1691,10 +1693,14 @@ static u8 mt7615_phy_get_nf(struct mt7615_dev *dev, int idx) {static const u8 nf_power[] = {92 ,89 ,86 ,83 ,80 ,75 ,70 ,65 ,60 ,55 ,52 }; -u32 reg = idx ?MT_WF_PHY_RXTD2 (17 ) :MT_WF_PHY_RXTD (20 ); -u32 val, sum =0 , n =0 ; +u32 reg, val, sum =0 , n =0 ;int i; +if (is_mt7663 (&dev->mt76)) + reg =MT7663_WF_PHY_RXTD (20 ); +else + reg = idx ?MT_WF_PHY_RXTD2 (17 ) :MT_WF_PHY_RXTD (20 ); +for (i =0 ; i <ARRAY_SIZE (nf_power); i++, reg +=4 ) { val =mt76_rr (dev, reg); sum += val * nf_power[i];
drivers/net/wireless/mediatek/mt76/mt7615/regs.h +2 -0
@@ -170,6 +170,8 @@ enum mt7615_reg_base {#define MT_WF_PHY_RXTD_BASE MT_WF_PHY(0x2200)#define MT_WF_PHY_RXTD (_n) (MT_WF_PHY_RXTD_BASE + ((_n) << 2)) +#define MT7663_WF_PHY_RXTD (_n) (MT_WF_PHY(0x25b0) + ((_n) << 2)) +#define MT_WF_PHY_RXTD_CCK_PD (_phy) MT_WF_PHY((_phy) ? 0x2314 : 0x2310)#define MT_WF_PHY_PD_CCK_MASK (_phy) (_phy) ? GENMASK(31, 24) : \ GENMASK(8, 1)
Signature · 1 line
2.25.1
Lorenzo Bianconi
maintainerPATCH 3/12 mt76: mt7615: make scs configurable per chain
In reply to Lorenzo BianconiMake scs configurable per chain since most of the chipsets do not support dbdc
--- .../wireless/mediatek/mt76/mt7615/debugfs.c | 8 +++-- .../net/wireless/mediatek/mt76/mt7615/init.c | 4 ++- .../net/wireless/mediatek/mt76/mt7615/mac.c | 29 +++++++------------ .../wireless/mediatek/mt76/mt7615/mt7615.h | 5 ++-- 4 files changed, 23 insertions(+), 23 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/debugfs.c +6 -2
@@ -20,11 +20,15 @@ static int mt7615_scs_set(void *data, u64 val) {struct mt7615_dev *dev = data; +struct mt7615_phy *ext_phy;if (!mt7615_wait_for_mcu_init (dev))return 0 ; -mt7615_mac_set_scs (dev, val); +mt7615_mac_set_scs (&dev->phy, val); + ext_phy =mt7615_ext_phy (dev); +if (ext_phy) +mt7615_mac_set_scs (ext_phy, val);return 0 ; }
@@ -34,7 +38,7 @@ mt7615_scs_get(void *data, u64 *val) {struct mt7615_dev *dev = data; - *val = dev->scs_en; + *val = dev->phy.scs_en;return 0 ; }
drivers/net/wireless/mediatek/mt76/mt7615/init.c +3 -1
@@ -90,7 +90,7 @@ static void mt7615_mac_init(struct mt7615_dev *dev) MT_TMAC_CTCR0_INS_DDLMT_EN);mt7615_mcu_set_rts_thresh (&dev->phy,0x92b ); -mt7615_mac_set_scs (dev, true); +mt7615_mac_set_scs (&dev->phy, true);mt76_rmw (dev,MT_AGG_SCR ,MT_AGG_SCR_NLNAV_MID_PTEC_DIS ,MT_AGG_SCR_NLNAV_MID_PTEC_DIS );
@@ -411,6 +411,8 @@ int mt7615_register_ext_phy(struct mt7615_dev *dev) mphy->antenna_mask =BIT (hweight8 (phy->chainmask)) -1 ;mt7615_init_wiphy (mphy->hw); +mt7615_mac_set_scs (phy, true); +/* * Make the secondary PHY MAC address local without overlapping with * the usual MAC address allocation scheme on multiple virtual interfaces
drivers/net/wireless/mediatek/mt76/mt7615/mac.c +11 -18
@@ -1515,40 +1515,33 @@ mt7615_mac_set_default_sensitivity(struct mt7615_phy *phy) phy->last_cca_adj = jiffies; } -void mt7615_mac_set_scs (struct mt7615_dev *dev,bool enable) +void mt7615_mac_set_scs (struct mt7615_phy *phy,bool enable) { -struct mt7615_phy *ext_phy; +struct mt7615_dev *dev = phy->dev; +bool ext_phy = phy != &dev->phy;mutex_lock (&dev->mt76.mutex); -if (dev->scs_en == enable) +if (phy->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 )); -mt76_set (dev,MT_WF_PHY_MIN_PRI_PWR (1 ), -MT_WF_PHY_PD_BLK (1 )); +mt76_set (dev,MT_WF_PHY_MIN_PRI_PWR (ext_phy), +MT_WF_PHY_PD_BLK (ext_phy));if (is_mt7622 (&dev->mt76)) {mt76_set (dev,MT_MIB_M0_MISC_CR ,0x7 <<8 );mt76_set (dev,MT_MIB_M0_MISC_CR ,0x7 ); } }else { -mt76_clear (dev,MT_WF_PHY_MIN_PRI_PWR (0 ), -MT_WF_PHY_PD_BLK (0 )); -mt76_clear (dev,MT_WF_PHY_MIN_PRI_PWR (1 ), -MT_WF_PHY_PD_BLK (1 )); +mt76_clear (dev,MT_WF_PHY_MIN_PRI_PWR (ext_phy), +MT_WF_PHY_PD_BLK (ext_phy)); } -mt7615_mac_set_default_sensitivity (&dev->phy); - ext_phy =mt7615_ext_phy (dev); -if (ext_phy) -mt7615_mac_set_default_sensitivity (ext_phy); - - dev->scs_en = enable; +mt7615_mac_set_default_sensitivity (phy); + phy->scs_en = enable; out:mutex_unlock (&dev->mt76.mutex);
@@ -1661,7 +1654,7 @@ mt7615_mac_scs_check(struct mt7615_phy *phy)u32 mdrdy_cck, mdrdy_ofdm, pd_cck, pd_ofdm;bool ext_phy = phy != &dev->phy; -if (!dev->scs_en) +if (!phy->scs_en)return ; val =mt76_rr (dev,MT_WF_PHY_R0_PHYCTRL_STS0 (ext_phy));
drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h +3 -2
@@ -128,6 +128,8 @@ struct mt7615_phy {u16 noise; +bool scs_en; +unsigned long last_cca_adj;int false_cca_ofdm, false_cca_cck;s8 ofdm_sensitivity;
@@ -209,7 +211,6 @@ struct mt7615_dev {u32 hw_pattern;u8 mac_work_count; -bool scs_en;bool fw_debug;spinlock_t token_lock;
@@ -367,7 +368,7 @@ void mt7615_update_channel(struct mt76_dev *mdev);bool mt7615_mac_wtbl_update (struct mt7615_dev *dev,int idx,u32 mask);void mt7615_mac_reset_counters (struct mt7615_dev *dev);void mt7615_mac_cca_stats_reset (struct mt7615_phy *phy); -void mt7615_mac_set_scs (struct mt7615_dev *dev,bool enable); +void mt7615_mac_set_scs (struct mt7615_phy *phy,bool enable);void mt7615_mac_enable_nf (struct mt7615_dev *dev,bool ext_phy);void mt7615_mac_sta_poll (struct mt7615_dev *dev); int mt7615_mac_write_txwi(struct mt7615_dev *dev, __le32 *txwi,
Signature · 1 line
2.25.1
Lorenzo Bianconi
maintainerPATCH 4/12 mt76: mt7663: disable RDD commands
In reply to Lorenzo BianconiDisable dfs RDD mcu commands for mt7663 driver since they are not currently supported by the 7663 firmware
--- drivers/net/wireless/mediatek/mt76/mt7615/mac.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/wireless/mediatek/mt76/mt7615/mac.c +3 -0
@@ -2036,6 +2036,9 @@ int mt7615_dfs_init_radar_detector(struct mt7615_phy *phy)bool ext_phy = phy != &dev->phy;int err; +if (is_mt7663 (&dev->mt76)) +return 0 ; +if (dev->mt76.region ==NL80211_DFS_UNSET ) { phy->dfs_state =-1 ;if (phy->rdd_state)
Signature · 1 line
2.25.1
Lorenzo Bianconi
maintainerPATCH 5/12 mt76: mt7615: add ethool support to mt7663 driver
In reply to Lorenzo BianconiReport n9 firmware version using ethtool
--- drivers/net/wireless/mediatek/mt76/mt7615/mcu.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +7 -1
@@ -1914,8 +1914,14 @@ static int mt7663_load_n9(struct mt7615_dev *dev, const char *name) } ret =mt7615_mcu_start_firmware (dev, override_addr, flag); -if (ret) +if (ret) {dev_err (dev->mt76.dev,"Failed to start N9 firmware\n" ); + goto out; + } + +snprintf (dev->mt76.hw->wiphy->fw_version, +sizeof (dev->mt76.hw->wiphy->fw_version), +"%.10s-%.15s" , hdr->fw_ver, hdr->build_date); out:release_firmware (fw);
Signature · 1 line
2.25.1
Lorenzo Bianconi
maintainerPATCH 6/12 mt76: mt7615: introduce mt7615_mcu_set_channel_domain mcu command
In reply to Lorenzo BianconiIntroduce mt7615_mcu_set_channel_domain routines in order to instruct the mcu about supported band/channels. This is a preliminary patch to add hw scan support to mt7663e driver
--- .../net/wireless/mediatek/mt76/mt7615/main.c | 1 + .../net/wireless/mediatek/mt76/mt7615/mcu.c | 72 ++++++++++++++++++- .../net/wireless/mediatek/mt76/mt7615/mcu.h | 9 ++- .../wireless/mediatek/mt76/mt7615/mt7615.h | 6 ++ 4 files changed, 85 insertions(+), 3 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/main.c +1 -0
@@ -50,6 +50,7 @@ static int mt7615_start(struct ieee80211_hw *hw)mt7615_mac_enable_nf (dev,1 ); } +mt7615_mcu_set_channel_domain (phy);mt7615_mcu_set_chan_info (phy,MCU_EXT_CMD_SET_RX_PATH );set_bit (MT76_STATE_RUNNING , &phy->mt76->state);
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +70 -2
87 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7615/mcu.h +8 -1
@@ -232,7 +232,9 @@ enum {#define MCU_FW_PREFIX BIT(31)#define MCU_UNI_PREFIX BIT(30) -#define MCU_CMD_MASK ~(MCU_FW_PREFIX | MCU_UNI_PREFIX) +#define MCU_CE_PREFIX BIT(29) +#define MCU_CMD_MASK ~(MCU_FW_PREFIX | MCU_UNI_PREFIX | \ + MCU_CE_PREFIX)enum {MCU_CMD_TARGET_ADDRESS_LEN_REQ =MCU_FW_PREFIX |0x01 ,
@@ -275,6 +277,11 @@ enum { MCU_UNI_CMD_STA_REC_UPDATE = MCU_UNI_PREFIX | 0x03, }; +/* offload mcu commands */ +enum { +MCU_CMD_SET_CHAN_DOMAIN =MCU_CE_PREFIX |0x0f , +}; +#define MCU_CMD_ACK BIT(0)#define MCU_CMD_UNI BIT(1)#define MCU_CMD_QUERY BIT(2)
drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h +6 -0
@@ -364,6 +364,11 @@ static inline void mt7615_irq_disable(struct mt7615_dev *dev, u32 mask)mt76_set_irq_mask (&dev->mt76,MT_INT_MASK_CSR , mask,0 ); } +static inline bool mt7615_firmware_offload (struct mt7615_dev *dev) +{ +return dev->fw_ver >MT7615_FIRMWARE_V2 ; +} +void mt7615_update_channel (struct mt76_dev *mdev);bool mt7615_mac_wtbl_update (struct mt7615_dev *dev,int idx,u32 mask);void mt7615_mac_reset_counters (struct mt7615_dev *dev);
@@ -393,6 +398,7 @@ 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_mcu_set_channel_domain (struct mt7615_phy *phy); 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 7/12 mt76: mt7663: keep Rx filters as the default
In reply to Lorenzo BianconiFrom: Sean Wang <[email protected]>
Keep Rx filters default value if the firmware supports offload and low power features.
--- .../net/wireless/mediatek/mt76/mt7615/init.c | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/init.c +14 -10
@@ -22,7 +22,7 @@ static void mt7615_phy_init(struct mt7615_dev *dev)static void mt7615_init_mac_chain (struct mt7615_dev *dev,int chain) { -u32 val, mask, set; +u32 val;if (!chain) val =MT_CFG_CCR_MAC_D0_1X_GC_EN |MT_CFG_CCR_MAC_D0_2X_GC_EN ;
@@ -62,15 +62,19 @@ mt7615_init_mac_chain(struct mt7615_dev *dev, int chain)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); +if (!mt7615_firmware_offload (dev)) { +u32 mask, set; + + 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)
Signature · 1 line
2.25.1
Lorenzo Bianconi
maintainerPATCH 8/12 mt76: mt7615: introduce hw scan support
In reply to Lorenzo BianconiIntroduce hw scan support to mt7663e driver
--- drivers/net/wireless/mediatek/mt76/mt76.h | 1 + .../net/wireless/mediatek/mt76/mt7615/init.c | 8 ++ .../net/wireless/mediatek/mt76/mt7615/mac.c | 19 ++- .../net/wireless/mediatek/mt76/mt7615/main.c | 34 +++++ .../net/wireless/mediatek/mt76/mt7615/mcu.c | 125 ++++++++++++++++++ .../net/wireless/mediatek/mt76/mt7615/mcu.h | 90 +++++++++++++ .../wireless/mediatek/mt76/mt7615/mt7615.h | 11 ++ 7 files changed, 285 insertions(+), 3 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76.h +1 -0
@@ -275,6 +275,7 @@ enum {MT76_STATE_RUNNING ,MT76_STATE_MCU_RUNNING ,MT76_SCANNING , +MT76_HW_SCANNING ,MT76_RESTART ,MT76_RESET , MT76_MCU_RESET,
drivers/net/wireless/mediatek/mt76/mt7615/init.c +8 -0
@@ -349,8 +349,13 @@ mt7615_init_wiphy(struct ieee80211_hw *hw) wiphy->n_iface_combinations =ARRAY_SIZE (if_comb); wiphy->reg_notifier = mt7615_regd_notifier; + wiphy->max_scan_ie_len =MT7615_SCAN_IE_LEN ; + wiphy->max_scan_ssids =4 ; + +wiphy_ext_feature_set (wiphy,NL80211_EXT_FEATURE_SET_SCAN_DWELL );wiphy_ext_feature_set (wiphy,NL80211_EXT_FEATURE_VHT_IBSS ); +ieee80211_hw_set (hw,SINGLE_SCAN_ON_ALL_BANDS );ieee80211_hw_set (hw,TX_STATUS_NO_AMPDU_LEN );if (is_mt7615 (&phy->dev->mt76))
@@ -403,6 +408,8 @@ int mt7615_register_ext_phy(struct mt7615_dev *dev)if (phy)return 0 ; +INIT_DELAYED_WORK (&phy->scan_work, mt7615_scan_work); +mt7615_cap_dbdc_enable (dev); mphy =mt76_alloc_phy (&dev->mt76,sizeof (*phy), &mt7615_ops);if (!mphy)
@@ -459,6 +466,7 @@ void mt7615_init_device(struct mt7615_dev *dev) dev->phy.mt76 = &dev->mt76.phy; dev->mt76.phy.priv = &dev->phy;INIT_DELAYED_WORK (&dev->mt76.mac_work, mt7615_mac_work); +INIT_DELAYED_WORK (&dev->phy.scan_work, mt7615_scan_work);INIT_LIST_HEAD (&dev->sta_poll_list);spin_lock_init (&dev->sta_poll_lock);init_waitqueue_head (&dev->reset_wait);
drivers/net/wireless/mediatek/mt76/mt7615/mac.c +16 -3
@@ -164,6 +164,20 @@ void mt7615_mac_set_timing(struct mt7615_phy *phy) } +static void +mt7615_get_status_freq_info (struct mt7615_dev *dev,struct mt76_phy *mphy, +struct mt76_rx_status *status,u8 chfreq) +{ +if (!test_bit (MT76_HW_SCANNING , &mphy->state)) { + status->freq = mphy->chandef.chan->center_freq; + status->band = mphy->chandef.chan->band; +return ; + } + + status->band = chfreq <=14 ?NL80211_BAND_2GHZ :NL80211_BAND_5GHZ ; + status->freq =ieee80211_channel_to_frequency (chfreq, status->band); +} +int mt7615_mac_fill_rx (struct mt7615_dev *dev,struct sk_buff *skb) {struct mt76_rx_status *status = (struct mt76_rx_status *)skb->cb;
@@ -282,11 +296,10 @@ int mt7615_mac_fill_rx(struct mt7615_dev *dev, struct sk_buff *skb) status->ext_phy = true; } -if (chfreq != phy->chfreq) +if (!mt7615_firmware_offload (dev) && chfreq != phy->chfreq)return -EINVAL ; - status->freq = mphy->chandef.chan->center_freq; - status->band = mphy->chandef.chan->band; +mt7615_get_status_freq_info (dev, mphy, status, chfreq);if (status->band ==NL80211_BAND_5GHZ ) sband = &mphy->sband_5g.sband;else
drivers/net/wireless/mediatek/mt76/mt7615/main.c +34 -0
@@ -77,6 +77,7 @@ static void mt7615_stop(struct ieee80211_hw *hw)mutex_lock (&dev->mt76.mutex);clear_bit (MT76_STATE_RUNNING , &phy->mt76->state); +cancel_delayed_work_sync (&phy->scan_work);if (phy != &dev->phy) {mt7615_mcu_set_pm (dev,1 ,1 );
@@ -702,6 +703,37 @@ mt7615_set_antenna(struct ieee80211_hw *hw, u32 tx_ant, u32 rx_ant)return 0 ; } +void mt7615_scan_work (struct work_struct *work) +{ +struct cfg80211_scan_info info = { + .aborted = false, + }; +struct mt7615_phy *phy; + + phy = (struct mt7615_phy *)container_of(work, struct mt7615_phy, + scan_work.work); + +clear_bit (MT76_HW_SCANNING , &phy->mt76->state); +ieee80211_scan_completed (phy->mt76->hw, &info); +} + +static int +mt7615_hw_scan (struct ieee80211_hw *hw,struct ieee80211_vif *vif, +struct ieee80211_scan_request *req) +{ +struct mt76_phy *mphy = hw->priv; + +return mt7615_mcu_hw_scan (mphy->priv, vif, req); +} + +static void +mt7615_cancel_hw_scan (struct ieee80211_hw *hw,struct ieee80211_vif *vif) +{ +struct mt76_phy *mphy = hw->priv; + +mt7615_mcu_cancel_hw_scan (mphy->priv, vif); +} +const struct ieee80211_ops mt7615_ops = { .tx = mt7615_tx, .start = mt7615_start,
@@ -731,6 +763,8 @@ const struct ieee80211_ops mt7615_ops = { .get_antenna = mt76_get_antenna, .set_antenna = mt7615_set_antenna, .set_coverage_class = mt7615_set_coverage_class, + .hw_scan = mt7615_hw_scan, + .cancel_hw_scan = mt7615_cancel_hw_scan, };static int __init mt7615_init (void )
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +125 -0
146 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7615/mcu.h +90 -0
105 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h +11 -0
@@ -18,6 +18,7 @@ MT7615_MAX_INTERFACES)#define MT7615_WATCHDOG_TIME (HZ / 10) +#define MT7615_HW_SCAN_TIMEOUT (HZ / 10)#define MT7615_RESET_TIMEOUT (30 * HZ)#define MT7615_RATE_RETRY 2
@@ -57,6 +58,8 @@#define MT7615_CFEND_RATE_DEFAULT 0x49/* OFDM 24M */ #define MT7615_CFEND_RATE_11B 0x03/* 11B LP, 11M */ +#define MT7615_SCAN_IE_LEN 600 +struct mt7615_vif ;struct mt7615_sta ;struct mt7615_dfs_pulse ;
@@ -108,6 +111,7 @@ struct mt7615_vif {u8 omac_idx;u8 band_idx;u8 wmm_idx; +u8 scan_seq_num;struct mt7615_sta sta; };
@@ -148,6 +152,8 @@ struct mt7615_phy {u32 ampdu_ref;struct mib_stats mib; + +struct delayed_work scan_work; };#define mt7615_mcu_add_tx_ba (dev, ...) (dev)->mcu_ops->add_tx_ba((dev), __VA_ARGS__)
@@ -369,6 +375,7 @@ static inline bool mt7615_firmware_offload(struct mt7615_dev *dev)return dev->fw_ver >MT7615_FIRMWARE_V2 ; } +void mt7615_scan_work (struct work_struct *work);void mt7615_update_channel (struct mt76_dev *mdev);bool mt7615_mac_wtbl_update (struct mt7615_dev *dev,int idx,u32 mask);void mt7615_mac_reset_counters (struct mt7615_dev *dev);
@@ -399,6 +406,10 @@ 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_mcu_set_channel_domain (struct mt7615_phy *phy); +int mt7615_mcu_hw_scan (struct mt7615_phy *phy,struct ieee80211_vif *vif, +struct ieee80211_scan_request *scan_req); +int mt7615_mcu_cancel_hw_scan (struct mt7615_phy *phy, +struct ieee80211_vif *vif); 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 9/12 mt76: mt7615: introduce scheduled scan support
In reply to Lorenzo BianconiIntroduce scheduled scan support for mt7663e devices
--- drivers/net/wireless/mediatek/mt76/mt76.h | 1 + .../net/wireless/mediatek/mt76/mt7615/init.c | 7 ++ .../net/wireless/mediatek/mt76/mt7615/mac.c | 3 +- .../net/wireless/mediatek/mt76/mt7615/main.c | 55 ++++++++- .../net/wireless/mediatek/mt76/mt7615/mcu.c | 110 ++++++++++++++++-- .../net/wireless/mediatek/mt76/mt7615/mcu.h | 35 ++++++ .../wireless/mediatek/mt76/mt7615/mt7615.h | 10 ++ 7 files changed, 207 insertions(+), 14 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76.h +1 -0
@@ -276,6 +276,7 @@ enum {MT76_STATE_MCU_RUNNING ,MT76_SCANNING ,MT76_HW_SCANNING , +MT76_HW_SCHED_SCANNING ,MT76_RESTART ,MT76_RESET , MT76_MCU_RESET,
drivers/net/wireless/mediatek/mt76/mt7615/init.c +7 -0
@@ -349,7 +349,12 @@ mt7615_init_wiphy(struct ieee80211_hw *hw) wiphy->n_iface_combinations =ARRAY_SIZE (if_comb); wiphy->reg_notifier = mt7615_regd_notifier; + wiphy->max_sched_scan_plan_interval =MT7615_MAX_SCHED_SCAN_INTERVAL ; + wiphy->max_sched_scan_ie_len =IEEE80211_MAX_DATA_LEN ; wiphy->max_scan_ie_len =MT7615_SCAN_IE_LEN ; + wiphy->max_sched_scan_ssids =MT7615_MAX_SCHED_SCAN_SSID ; + wiphy->max_match_sets =MT7615_MAX_SCAN_MATCH ; + wiphy->max_sched_scan_reqs =1 ; wiphy->max_scan_ssids =4 ;wiphy_ext_feature_set (wiphy,NL80211_EXT_FEATURE_SET_SCAN_DWELL );
@@ -409,6 +414,7 @@ int mt7615_register_ext_phy(struct mt7615_dev *dev)return 0 ;INIT_DELAYED_WORK (&phy->scan_work, mt7615_scan_work); +skb_queue_head_init (&phy->scan_event_list);mt7615_cap_dbdc_enable (dev); mphy =mt76_alloc_phy (&dev->mt76,sizeof (*phy), &mt7615_ops);
@@ -467,6 +473,7 @@ void mt7615_init_device(struct mt7615_dev *dev) dev->mt76.phy.priv = &dev->phy;INIT_DELAYED_WORK (&dev->mt76.mac_work, mt7615_mac_work);INIT_DELAYED_WORK (&dev->phy.scan_work, mt7615_scan_work); +skb_queue_head_init (&dev->phy.scan_event_list);INIT_LIST_HEAD (&dev->sta_poll_list);spin_lock_init (&dev->sta_poll_lock);init_waitqueue_head (&dev->reset_wait);
drivers/net/wireless/mediatek/mt76/mt7615/mac.c +2 -1
@@ -168,7 +168,8 @@ static void mt7615_get_status_freq_info(struct mt7615_dev *dev, struct mt76_phy *mphy, struct mt76_rx_status *status, u8 chfreq) { - if (!test_bit(MT76_HW_SCANNING, &mphy->state)) { + if (!test_bit(MT76_HW_SCANNING, &mphy->state) && + !test_bit(MT76_HW_SCHED_SCANNING, &mphy->state)) { status->freq = mphy->chandef.chan->center_freq; status->band = mphy->chandef.chan->band;return ;
drivers/net/wireless/mediatek/mt76/mt7615/main.c +50 -5
78 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +102 -8
141 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7615/mcu.h +35 -0
@@ -83,6 +83,7 @@ enum {MCU_EVENT_MT_PATCH_SEM =0x04 ,MCU_EVENT_SCAN_DONE =0x0d ,MCU_EVENT_CH_PRIVILEGE =0x18 , +MCU_EVENT_SCHED_SCAN_DONE =0x23 ,MCU_EVENT_EXT =0xed , MCU_EVENT_RESTART_DL = 0xef, };
@@ -291,6 +292,13 @@ struct mt7615_mcu_scan_channel {u8 channel_num; } __packed; +struct mt7615_mcu_scan_match { +__le32 rssi_th; +u8 ssid[IEEE80211_MAX_SSID_LEN ]; +u8 ssid_len; +u8 rsv[3 ]; +} __packed; +struct mt7615_hw_scan_req {u8 seq_num;u8 bss_idx;
@@ -365,11 +373,38 @@ struct mt7615_hw_scan_done {__le32 beacon_5g_num; } __packed; +struct mt7615_sched_scan_req { +u8 version; +u8 seq_num; +u8 stop_on_match; +u8 ssids_num; +u8 match_num; +u8 pad; +__le16 ie_len; +struct mt7615_mcu_scan_ssid ssids[MT7615_MAX_SCHED_SCAN_SSID ]; +struct mt7615_mcu_scan_match match[MT7615_MAX_SCAN_MATCH ]; +u8 channel_type; +u8 channels_num; +u8 intervals_num; +u8 scan_func; +struct mt7615_mcu_scan_channel channels[64 ]; +__le16 intervals[MT7615_MAX_SCHED_SCAN_INTERVAL ]; +u8 pad2[64 ]; +} __packed; + +struct nt7615_sched_scan_done { +u8 seq_num; +u8 status;/* 0: ssid found */ +__le16 pad; +} __packed; +/* offload mcu commands */ enum {MCU_CMD_START_HW_SCAN =MCU_CE_PREFIX |0x03 ,MCU_CMD_SET_CHAN_DOMAIN =MCU_CE_PREFIX |0x0f ,MCU_CMD_CANCEL_HW_SCAN =MCU_CE_PREFIX |0x1b , +MCU_CMD_SCHED_SCAN_ENABLE =MCU_CE_PREFIX |0x61 , +MCU_CMD_SCHED_SCAN_REQ =MCU_CE_PREFIX |0x62 , };#define MCU_CMD_ACK BIT(0)
drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h +10 -0
@@ -59,6 +59,9 @@#define MT7615_CFEND_RATE_11B 0x03/* 11B LP, 11M */ #define MT7615_SCAN_IE_LEN 600 +#define MT7615_MAX_SCHED_SCAN_INTERVAL 10 +#define MT7615_MAX_SCHED_SCAN_SSID 10 +#define MT7615_MAX_SCAN_MATCH 16struct mt7615_vif ;struct mt7615_sta ;
@@ -153,6 +156,7 @@ struct mt7615_phy {struct mib_stats mib; +struct sk_buff_head scan_event_list;struct delayed_work scan_work; };
@@ -410,6 +414,12 @@ int mt7615_mcu_hw_scan(struct mt7615_phy *phy, struct ieee80211_vif *vif, struct ieee80211_scan_request *scan_req);int mt7615_mcu_cancel_hw_scan (struct mt7615_phy *phy,struct ieee80211_vif *vif); +int mt7615_mcu_sched_scan_req (struct mt7615_phy *phy, +struct ieee80211_vif *vif, +struct cfg80211_sched_scan_request *sreq); +int mt7615_mcu_sched_scan_enable (struct mt7615_phy *phy, +struct ieee80211_vif *vif, +bool enable); 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 10/12 mt76: mt7615: introduce BSS absence event
In reply to Lorenzo BianconiFrom: Sean Wang <[email protected]>
Introduce BSS absence event that is reported when the fw is leaving or entering current operational channel.
--- .../net/wireless/mediatek/mt76/mt7615/mcu.c | 24 +++++++++++++++++++ .../net/wireless/mediatek/mt76/mt7615/mcu.h | 8 +++++++ 2 files changed, 32 insertions(+)
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +24 -0
@@ -339,6 +339,26 @@ mt7615_mcu_scan_event(struct mt7615_dev *dev, struct sk_buff *skb) MT7615_HW_SCAN_TIMEOUT); } +static void +mt7615_mcu_bss_event (struct mt7615_dev *dev,struct sk_buff *skb) +{ +struct mt7615_mcu_bss_event *event; +struct mt76_phy *mphy; + + event = (struct mt7615_mcu_bss_event *)(skb->data + +sizeof (struct mt7615_mcu_rxd )); + +if (event->bss_idx && dev->mt76.phy2) + mphy = dev->mt76.phy2; +else + mphy = &dev->mt76.phy; + +if (event->is_absent) +ieee80211_stop_queues (mphy->hw); +else +ieee80211_wake_queues (mphy->hw); +} +static void mt7615_mcu_rx_unsolicited_event (struct mt7615_dev *dev,struct sk_buff *skb) {
@@ -352,6 +372,9 @@ mt7615_mcu_rx_unsolicited_event(struct mt7615_dev *dev, struct sk_buff *skb)case MCU_EVENT_SCAN_DONE :mt7615_mcu_scan_event (dev, skb);return ; +case MCU_EVENT_BSS_ABSENCE : +mt7615_mcu_bss_event (dev, skb); +break ;default :break ; }
@@ -367,6 +390,7 @@ void mt7615_mcu_rx_event(struct mt7615_dev *dev, struct sk_buff *skb) rxd->ext_eid == MCU_EXT_EVENT_ASSERT_DUMP || rxd->ext_eid == MCU_EXT_EVENT_PS_SYNC || rxd->eid == MCU_EVENT_SCHED_SCAN_DONE || + rxd->eid == MCU_EVENT_BSS_ABSENCE || rxd->eid == MCU_EVENT_SCAN_DONE || !rxd->seq)mt7615_mcu_rx_unsolicited_event (dev, skb);
drivers/net/wireless/mediatek/mt76/mt7615/mcu.h +8 -0
@@ -82,6 +82,7 @@ enum {MCU_EVENT_ACCESS_REG =0x02 ,MCU_EVENT_MT_PATCH_SEM =0x04 ,MCU_EVENT_SCAN_DONE =0x0d , +MCU_EVENT_BSS_ABSENCE =0x11 ,MCU_EVENT_CH_PRIVILEGE =0x18 ,MCU_EVENT_SCHED_SCAN_DONE =0x23 , MCU_EVENT_EXT = 0xed,
@@ -398,6 +399,13 @@ struct nt7615_sched_scan_done {__le16 pad; } __packed; +struct mt7615_mcu_bss_event { +u8 bss_idx; +u8 is_absent; +u8 free_quota; +u8 pad; +} __packed; +/* offload mcu commands */ enum {MCU_CMD_START_HW_SCAN =MCU_CE_PREFIX |0x03 ,
Signature · 1 line
2.25.1
Lorenzo Bianconi
maintainerPATCH 11/12 mt76: mt7615: introduce rlm tlv in bss_info mcu command
In reply to Lorenzo BianconiIntroduce rlm tlv header in bss_info mcu command in order to inform the mcu about operating channel. Rlm header is necessary only if the mcu is running low power functionalities (e.g offloaded scan)
--- .../net/wireless/mediatek/mt76/mt7615/main.c | 6 +- .../net/wireless/mediatek/mt76/mt7615/mcu.c | 111 ++++++++++++++++-- .../net/wireless/mediatek/mt76/mt7615/mcu.h | 1 + .../wireless/mediatek/mt76/mt7615/mt7615.h | 4 +- 4 files changed, 104 insertions(+), 18 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/main.c +3 -3
@@ -410,15 +410,15 @@ static void mt7615_bss_info_changed(struct ieee80211_hw *hw, u32 changed) {struct mt7615_dev *dev =mt7615_hw_dev (hw); +struct mt7615_phy *phy =mt7615_hw_phy (hw);mutex_lock (&dev->mt76.mutex);if (changed &BSS_CHANGED_ASSOC ) -mt7615_mcu_add_bss_info (dev, vif, info->assoc); +mt7615_mcu_add_bss_info (phy, vif, info->assoc);if (changed &BSS_CHANGED_ERP_SLOT ) {int slottime = info->use_short_slot ?9 :20 ; -struct mt7615_phy *phy =mt7615_hw_phy (hw);if (slottime != phy->slottime) { phy->slottime = slottime;
@@ -427,7 +427,7 @@ static void mt7615_bss_info_changed(struct ieee80211_hw *hw, }if (changed &BSS_CHANGED_BEACON_ENABLED ) { -mt7615_mcu_add_bss_info (dev, vif, info->enable_beacon); +mt7615_mcu_add_bss_info (phy, vif, info->enable_beacon);mt7615_mcu_sta_add (dev, vif,NULL , info->enable_beacon); }
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +98 -13
169 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7615/mcu.h +1 -0
@@ -423,6 +423,7 @@ enum {enum {UNI_BSS_INFO_BASIC =0 , +UNI_BSS_INFO_RLM =2 ,UNI_BSS_INFO_BCN_CONTENT =7 , };
drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h +2 -2
@@ -164,7 +164,7 @@ struct mt7615_phy {#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_bss_info (phy, ...) (phy->dev)->mcu_ops->add_bss_info((phy), __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 {
@@ -179,7 +179,7 @@ struct mt7615_mcu_ops { 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, +int (*add_bss_info)(struct mt7615_phy *phy,struct ieee80211_vif *vif,bool enable); int (*add_beacon_offload)(struct mt7615_dev *dev, struct ieee80211_hw *hw,
Signature · 1 line
2.25.1
Lorenzo Bianconi
maintainerPATCH 12/12 mt76: mt7615: remove unnecessary register operations
In reply to Lorenzo BianconiFrom: Sean Wang <[email protected]>
Remove mt76_wr(dev, MT_CSR(0x010), 0x8208) that would cause MT_PCIE_IRQ_ENABLE to be disabled; MT_PCIE_IRQ_ENABLE should always keep on enabled when the driver is running.
0x44064 is a not existing address
--- drivers/net/wireless/mediatek/mt76/mt7615/init.c | 2 -- 1 file changed, 2 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/init.c +0 -2
@@ -117,8 +117,6 @@ static void mt7615_mac_init(struct mt7615_dev *dev)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 {
Signature · 1 line
2.25.1