Introduce WoW support to mt7663 driver
Subsystems (2)
Lorenzo Bianconi
maintainercover Introduce WoW support to mt7663 driver
Introduce PM and WoW support to mt7615 driver if it is running offload firmware
Lorenzo Bianconi (5):
mt76: mt7615: introduce support for hardware beacon filter
mt76: mt7615: add WoW support
mt76: mt7615: introduce PM support
mt76: mt7615: add gtk rekey offload support
mt76: mt7615: introduce beacon_loss mcu event
Sean Wang (2):
mt76: mt7615: introduce mt7615_mcu_set_hif_suspend mcu command
mt76: mt7663u: introduce suspend/resume to mt7663u
drivers/net/wireless/mediatek/mt76/mt76.h | 2 + .../net/wireless/mediatek/mt76/mt7615/dma.c | 37 ++ .../net/wireless/mediatek/mt76/mt7615/init.c | 1 + .../net/wireless/mediatek/mt76/mt7615/mac.c | 4 +- .../net/wireless/mediatek/mt76/mt7615/main.c | 87 +++++ .../net/wireless/mediatek/mt76/mt7615/mcu.c | 353 +++++++++++++++++- .../net/wireless/mediatek/mt76/mt7615/mcu.h | 101 +++++ .../net/wireless/mediatek/mt76/mt7615/mmio.c | 4 + .../wireless/mediatek/mt76/mt7615/mt7615.h | 12 + .../net/wireless/mediatek/mt76/mt7615/pci.c | 107 ++++++ .../net/wireless/mediatek/mt76/mt7615/regs.h | 28 +- .../net/wireless/mediatek/mt76/mt7615/usb.c | 43 ++- 12 files changed, 766 insertions(+), 13 deletions(-)
Signature · 1 line
2.25.4
Lorenzo Bianconi
maintainerPATCH 1/7 mt76: mt7615: introduce support for hardware beacon filter
Introduce support for hw beacon filter if available in the firmware
--- .../net/wireless/mediatek/mt76/mt7615/mcu.c | 41 +++++++++++++++++++ .../net/wireless/mediatek/mt76/mt7615/mcu.h | 2 + .../wireless/mediatek/mt76/mt7615/mt7615.h | 2 + 3 files changed, 45 insertions(+)
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +41 -0
@@ -2646,6 +2646,47 @@ void m7615_mcu_set_ps_iter(void *priv, u8 *mac, struct ieee80211_vif *vif) &req, sizeof(req), false); } +int mt7615_mcu_set_bss_pm (struct mt7615_dev *dev,struct ieee80211_vif *vif, +bool enable) +{ +struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv; +struct { +u8 bss_idx; +u8 dtim_period; +__le16 aid; +__le16 bcn_interval; +__le16 atim_window; +u8 uapsd; +u8 bmc_delivered_ac; +u8 bmc_triggered_ac; +u8 pad; + } req = { + .bss_idx = mvif->idx, + .aid =cpu_to_le16 (vif->bss_conf.aid), + .dtim_period = vif->bss_conf.dtim_period, + .bcn_interval =cpu_to_le16 (vif->bss_conf.beacon_int), + }; +struct { +u8 bss_idx; +u8 pad[3 ]; + } req_hdr = { + .bss_idx = mvif->idx, + }; +int err; + +if (vif->type !=NL80211_IFTYPE_STATION || + !mt7615_firmware_offload (dev)) +return -ENOTSUPP ; + + err =__mt76_mcu_send_msg (&dev->mt76,MCU_CMD_SET_BSS_ABORT , + &req_hdr,sizeof (req_hdr), false); +if (err <0 || !enable) +return err; + +return __mt76_mcu_send_msg (&dev->mt76,MCU_CMD_SET_BSS_CONNECTED , + &req,sizeof (req), false); +} +int mt7615_mcu_set_channel_domain (struct mt7615_phy *phy) {struct mt76_phy *mphy = phy->mt76;
drivers/net/wireless/mediatek/mt76/mt7615/mcu.h +2 -0
@@ -419,6 +419,8 @@ enum {MCU_CMD_START_HW_SCAN =MCU_CE_PREFIX |0x03 ,MCU_CMD_SET_PS_PROFILE =MCU_CE_PREFIX |0x05 ,MCU_CMD_SET_CHAN_DOMAIN =MCU_CE_PREFIX |0x0f , +MCU_CMD_SET_BSS_CONNECTED =MCU_CE_PREFIX |0x16 , +MCU_CMD_SET_BSS_ABORT =MCU_CE_PREFIX |0x17 ,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,
drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h +2 -0
@@ -474,6 +474,8 @@ int mt7615_mac_wtbl_update_key(struct mt7615_dev *dev, enum set_key_cmd cmd);void mt7615_mac_reset_work (struct work_struct *work); +int mt7615_mcu_set_bss_pm (struct mt7615_dev *dev,struct ieee80211_vif *vif, +bool enable);int mt7615_mcu_wait_response (struct mt7615_dev *dev,int cmd,int seq);int mt7615_mcu_msg_send (struct mt76_dev *mdev,int cmd,const void *data,int len,bool wait_resp);
Signature · 1 line
2.25.4
Lorenzo Bianconi
maintainerPATCH 2/7 mt76: mt7615: introduce mt7615_mcu_set_hif_suspend mcu command
In reply to Lorenzo BianconiFrom: Sean Wang <[email protected]>
Introduce the mt7615_mcu_set_hif_suspend mcu command, which is usually used to configure the interface including PCIe, USB or SDIO to the right state during operation suspend / resume.
--- .../net/wireless/mediatek/mt76/mt7615/mcu.c | 36 ++++++++++++++++++- .../net/wireless/mediatek/mt76/mt7615/mcu.h | 1 + .../wireless/mediatek/mt76/mt7615/mt7615.h | 2 ++ 3 files changed, 38 insertions(+), 1 deletion(-)
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +35 -1
@@ -194,7 +194,8 @@ mt7615_mcu_parse_response(struct mt7615_dev *dev, int cmd,break ;case MCU_UNI_CMD_DEV_INFO_UPDATE :case MCU_UNI_CMD_BSS_INFO_UPDATE : -case MCU_UNI_CMD_STA_REC_UPDATE : { +case MCU_UNI_CMD_STA_REC_UPDATE : +case MCU_UNI_CMD_HIF_CTRL : {struct mt7615_mcu_uni_event *event;skb_pull (skb,sizeof (*rxd));
@@ -3212,3 +3213,36 @@ int mt7615_mcu_apply_tx_dpd(struct mt7615_phy *phy)return ret; } + +int mt7615_mcu_set_hif_suspend (struct mt7615_dev *dev,bool suspend) +{ +struct { +struct { +u8 hif_type;/* 0x0: HIF_SDIO +* 0x1: HIF_USB +* 0x2: HIF_PCIE +*/ +u8 pad[3 ]; + } __packed hdr; +struct hif_suspend_tlv { +__le16 tag; +__le16 len; +u8 suspend; + } __packed hif_suspend; + } req = { + .hif_suspend = { + .tag =cpu_to_le16 (0 ),/* 0: UNI_HIF_CTRL_BASIC */ + .len =cpu_to_le16 (sizeof (struct hif_suspend_tlv )), + .suspend = suspend, + }, + }; + +if (mt76_is_mmio (&dev->mt76)) + req.hdr.hif_type =2 ; +else if (mt76_is_usb (&dev->mt76)) + req.hdr.hif_type =1 ; + +return __mt76_mcu_send_msg (&dev->mt76,MCU_UNI_CMD_HIF_CTRL , + &req,sizeof (req), true); +} +EXPORT_SYMBOL_GPL (mt7615_mcu_set_hif_suspend);
drivers/net/wireless/mediatek/mt76/mt7615/mcu.h +1 -0
@@ -280,6 +280,7 @@ 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 , + MCU_UNI_CMD_HIF_CTRL = MCU_UNI_PREFIX | 0x07, }; struct mt7615_mcu_uni_event {
drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h +2 -0
@@ -531,6 +531,8 @@ int mt7615_dfs_init_radar_detector(struct mt7615_phy *phy);int mt7615_init_debugfs (struct mt7615_dev *dev);int mt7615_mcu_wait_response (struct mt7615_dev *dev,int cmd,int seq); +int mt7615_mcu_set_hif_suspend (struct mt7615_dev *dev,bool suspend); +int __mt7663_load_firmware (struct mt7615_dev *dev);/* usb */
Signature · 1 line
2.25.4
Lorenzo Bianconi
maintainerPATCH 3/7 mt76: mt7615: add WoW support
In reply to Lorenzo BianconiIntroduce WoW support to mt7615 driver.
Current supported trigger are:
- magic-packet
- disconnect
- user-pattern
--- drivers/net/wireless/mediatek/mt76/mt76.h | 1 + .../net/wireless/mediatek/mt76/mt7615/main.c | 78 ++++++++++ .../net/wireless/mediatek/mt76/mt7615/mcu.c | 138 +++++++++++++++++- .../net/wireless/mediatek/mt76/mt7615/mcu.h | 62 ++++++++ .../wireless/mediatek/mt76/mt7615/mt7615.h | 4 +- 5 files changed, 278 insertions(+), 5 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76.h +1 -0
@@ -287,6 +287,7 @@ enum {MT76_READING_STATS ,MT76_STATE_POWER_OFF ,MT76_STATE_PS , + MT76_STATE_SUSPEND, }; struct mt76_hw_cap {
drivers/net/wireless/mediatek/mt76/mt7615/main.c +78 -0
90 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +135 -3
165 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7615/mcu.h +62 -0
80 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h +2 -2
@@ -474,8 +474,6 @@ int mt7615_mac_wtbl_update_key(struct mt7615_dev *dev, enum set_key_cmd cmd);void mt7615_mac_reset_work (struct work_struct *work); -int mt7615_mcu_set_bss_pm (struct mt7615_dev *dev,struct ieee80211_vif *vif, -bool enable);int mt7615_mcu_wait_response (struct mt7615_dev *dev,int cmd,int seq);int mt7615_mcu_msg_send (struct mt76_dev *mdev,int cmd,const void *data,int len,bool wait_resp);
@@ -532,6 +530,8 @@ int mt7615_init_debugfs(struct mt7615_dev *dev);int mt7615_mcu_wait_response (struct mt7615_dev *dev,int cmd,int seq);int mt7615_mcu_set_hif_suspend (struct mt7615_dev *dev,bool suspend); +void mt7615_mcu_set_suspend_iter (void *priv,u8 *mac, +struct ieee80211_vif *vif);int __mt7663_load_firmware (struct mt7615_dev *dev);
Signature · 1 line
2.25.4
Lorenzo Bianconi
maintainerPATCH 4/7 mt76: mt7663u: introduce suspend/resume to mt7663u
In reply to Lorenzo BianconiFrom: Sean Wang <[email protected]>
Tested on Chromebok by "echo mem to /sys/power/state" to suspend and then waked up by keyboard keystrokes to resume system.
--- drivers/net/wireless/mediatek/mt76/mt76.h | 1 + .../net/wireless/mediatek/mt76/mt7615/usb.c | 43 ++++++++++++++++--- 2 files changed, 38 insertions(+), 6 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76.h +1 -0
@@ -381,6 +381,7 @@ enum mt_vendor_req {MT_VEND_READ_CFG =0x47 ,MT_VEND_READ_EXT =0x63 ,MT_VEND_WRITE_EXT =0x66 , + MT_VEND_FEATURE_SET = 0x91, }; enum mt76u_in_ep {
drivers/net/wireless/mediatek/mt76/mt7615/usb.c +37 -6
54 lines not on this page · raw message
Signature · 1 line
2.25.4
Lorenzo Bianconi
maintainerPATCH 5/7 mt76: mt7615: introduce PM support
In reply to Lorenzo BianconiIntroduce suspend/resume to mt7615e driver
--- .../net/wireless/mediatek/mt76/mt7615/dma.c | 37 ++++++ .../net/wireless/mediatek/mt76/mt7615/mac.c | 4 +- .../net/wireless/mediatek/mt76/mt7615/mcu.c | 6 +- .../net/wireless/mediatek/mt76/mt7615/mmio.c | 4 + .../wireless/mediatek/mt76/mt7615/mt7615.h | 5 + .../net/wireless/mediatek/mt76/mt7615/pci.c | 107 ++++++++++++++++++ .../net/wireless/mediatek/mt76/mt7615/regs.h | 28 ++++- 7 files changed, 185 insertions(+), 6 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/dma.c +37 -0
@@ -130,6 +130,43 @@ static int mt7615_poll_tx(struct napi_struct *napi, int budget)return 0 ; } +int mt7615_wait_pdma_busy (struct mt7615_dev *dev) +{ +struct mt76_dev *mdev = &dev->mt76; + +if (!is_mt7663 (mdev)) { +u32 mask =MT_PDMA_TX_BUSY |MT_PDMA_RX_BUSY ; +u32 reg =mt7615_reg_map (dev,MT_PDMA_BUSY ); + +if (!mt76_poll_msec (dev, reg, mask,0 ,1000 )) { +dev_err (mdev->dev,"PDMA engine busy\n" ); +return -EIO ; + } + +return 0 ; + } + +if (!mt76_poll_msec (dev,MT_PDMA_BUSY_STATUS , +MT_PDMA_TX_IDX_BUSY ,0 ,1000 )) { +dev_err (mdev->dev,"PDMA engine tx busy\n" ); +return -EIO ; + } + +if (!mt76_poll_msec (dev,MT_PSE_PG_INFO , +MT_PSE_SRC_CNT ,0 ,1000 )) { +dev_err (mdev->dev,"PSE engine busy\n" ); +return -EIO ; + } + +if (!mt76_poll_msec (dev,MT_PDMA_BUSY_STATUS , +MT_PDMA_BUSY_IDX ,0 ,1000 )) { +dev_err (mdev->dev,"PDMA engine busy\n" ); +return -EIO ; + } + +return 0 ; +} +static void mt7622_dma_sched_init (struct mt7615_dev *dev) {u32 reg =mt7615_reg_map (dev,MT_DMASHDL_BASE );
drivers/net/wireless/mediatek/mt76/mt7615/mac.c +2 -2
@@ -1806,8 +1806,7 @@ mt7615_update_beacons(struct mt7615_dev *dev) mt7615_update_vif_beacon, dev->mt76.phy2->hw); } -static void -mt7615_dma_reset (struct mt7615_dev *dev) +void mt7615_dma_reset (struct mt7615_dev *dev) {int i;
@@ -1826,6 +1825,7 @@ mt7615_dma_reset(struct mt7615_dev *dev)MT_WPDMA_GLO_CFG_RX_DMA_EN |MT_WPDMA_GLO_CFG_TX_DMA_EN | MT_WPDMA_GLO_CFG_TX_WRITEBACK_DONE); } +EXPORT_SYMBOL_GPL (mt7615_dma_reset);void mt7615_mac_reset_work (struct work_struct *work) {
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +4 -2
@@ -1677,7 +1677,7 @@ static void mt7622_trigger_hif_int(struct mt7615_dev *dev, bool en) !en * MT_INFRACFG_MISC_AP2CONN_WAKE); } -static int mt7615_driver_own (struct mt7615_dev *dev) +int mt7615_driver_own (struct mt7615_dev *dev) {struct mt76_dev *mdev = &dev->mt76;u32 addr;
@@ -1697,8 +1697,9 @@ static int mt7615_driver_own(struct mt7615_dev *dev)return 0 ; } +EXPORT_SYMBOL_GPL (mt7615_driver_own); -static int mt7615_firmware_own (struct mt7615_dev *dev) +int mt7615_firmware_own (struct mt7615_dev *dev) {u32 addr;
@@ -1717,6 +1718,7 @@ static int mt7615_firmware_own(struct mt7615_dev *dev)return 0 ; } +EXPORT_SYMBOL_GPL (mt7615_firmware_own);static int mt7615_load_patch (struct mt7615_dev *dev,u32 addr,const char *name) {
drivers/net/wireless/mediatek/mt76/mt7615/mmio.c +4 -0
@@ -15,6 +15,8 @@ const u32 mt7615e_reg_map[] = { [MT_ARB_BASE] = 0x20c00, [MT_HIF_BASE] = 0x04000, [MT_CSR_BASE] = 0x07000, + [MT_PLE_BASE] = 0x08000, + [MT_PSE_BASE] = 0x0c000, [MT_PHY_BASE] = 0x10000, [MT_CFG_BASE] = 0x20200, [MT_AGG_BASE] = 0x20a00,
@@ -40,6 +42,8 @@ const u32 mt7663e_reg_map[] = { [MT_ARB_BASE] = 0x20c00, [MT_HIF_BASE] = 0x04000, [MT_CSR_BASE] = 0x07000, + [MT_PLE_BASE] = 0x08000, + [MT_PSE_BASE] = 0x0c000, [MT_PHY_BASE] = 0x10000, [MT_CFG_BASE] = 0x20000, [MT_AGG_BASE] = 0x22000,
drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h +5 -0
@@ -380,6 +380,7 @@ int mt7615_eeprom_init(struct mt7615_dev *dev, u32 addr);int mt7615_eeprom_get_power_index (struct mt7615_dev *dev,struct ieee80211_channel *chan,u8 chain_idx); +int mt7615_wait_pdma_busy (struct mt7615_dev *dev);int mt7615_dma_init (struct mt7615_dev *dev);void mt7615_dma_cleanup (struct mt7615_dev *dev);int mt7615_mcu_init (struct mt7615_dev *dev);
@@ -436,6 +437,7 @@ static inline u16 mt7615_wtbl_size(struct mt7615_dev *dev)return MT7615_WTBL_SIZE ; } +void mt7615_dma_reset (struct mt7615_dev *dev);void mt7615_scan_work (struct work_struct *work);void mt7615_ps_work (struct work_struct *work); void mt7615_init_txpower(struct mt7615_dev *dev,
@@ -526,6 +528,9 @@ int mt7615_mcu_apply_tx_dpd(struct mt7615_phy *phy);void m7615_mcu_set_ps_iter (void *priv,u8 *mac,struct ieee80211_vif *vif);int mt7615_dfs_init_radar_detector (struct mt7615_phy *phy); +int mt7615_firmware_own (struct mt7615_dev *dev); +int mt7615_driver_own (struct mt7615_dev *dev); +int mt7615_init_debugfs (struct mt7615_dev *dev);int mt7615_mcu_wait_response (struct mt7615_dev *dev,int cmd,int seq);
drivers/net/wireless/mediatek/mt76/mt7615/pci.c +107 -0
118 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7615/regs.h +26 -2
@@ -12,6 +12,8 @@ enum mt7615_reg_base {MT_ARB_BASE ,MT_HIF_BASE ,MT_CSR_BASE , +MT_PLE_BASE , +MT_PSE_BASE ,MT_PHY_BASE ,MT_CFG_BASE , MT_AGG_BASE,
@@ -63,6 +65,17 @@ enum mt7615_reg_base {#define MT_HIF_RST MT_HIF(0x100)#define MT_HIF_LOGIC_RST_N BIT(4) +#define MT_PDMA_SLP_PROT MT_HIF(0x154) +#define MT_PDMA_AXI_SLPPROT_ENABLE BIT(0) +#define MT_PDMA_AXI_SLPPROT_RDY BIT(16) + +#define MT_PDMA_BUSY_STATUS MT_HIF(0x168) +#define MT_PDMA_TX_IDX_BUSY BIT(2) +#define MT_PDMA_BUSY_IDX BIT(31) + +#define MT_WPDMA_TX_RING0_CTRL0 MT_HIF(0x300) +#define MT_WPDMA_TX_RING0_CTRL1 MT_HIF(0x304) +#define MT7663_MCU_PCIE_REMAP_2_OFFSET GENMASK(15, 0)#define MT7663_MCU_PCIE_REMAP_2_BASE GENMASK(31, 16)
@@ -138,8 +151,7 @@ enum mt7615_reg_base {#define MT_CSR (ofs) ((dev)->reg_map[MT_CSR_BASE] + (ofs))#define MT_CONN_HIF_ON_LPCTL MT_CSR(0x000) -#define MT_PLE_BASE 0x8000 -#define MT_PLE (ofs) (MT_PLE_BASE + (ofs)) +#define MT_PLE (ofs) ((dev)->reg_map[MT_PLE_BASE] + (ofs))#define MT_PLE_FL_Q0_CTRL MT_PLE(0x1b0)#define MT_PLE_FL_Q1_CTRL MT_PLE(0x1b4)
@@ -149,6 +161,14 @@ enum mt7615_reg_base {#define MT_PLE_AC_QEMPTY (ac, n) MT_PLE(0x300 + 0x10 * (ac) + \ ((n) << 2)) +#define MT_PSE (ofs) ((dev)->reg_map[MT_PSE_BASE] + (ofs)) +#define MT_PSE_QUEUE_EMPTY MT_PSE(0x0b4) +#define MT_HIF_0_EMPTY_MASK BIT(16) +#define MT_HIF_1_EMPTY_MASK BIT(17) +#define MT_HIF_ALL_EMPTY_MASK GENMASK(17, 16) +#define MT_PSE_PG_INFO MT_PSE(0x194) +#define MT_PSE_SRC_CNT GENMASK(27, 16) +#define MT_WF_PHY_BASE ((dev)->reg_map[MT_PHY_BASE])#define MT_WF_PHY (ofs) (MT_WF_PHY_BASE + (ofs))
@@ -482,6 +502,10 @@ enum mt7615_reg_base {#define MT_LED_STATUS_ON GENMASK(23, 16)#define MT_LED_STATUS_DURATION GENMASK(15, 0) +#define MT_PDMA_BUSY 0x82000504 +#define MT_PDMA_TX_BUSY BIT(0) +#define MT_PDMA_RX_BUSY BIT(1) +#define MT_EFUSE_BASE ((dev)->reg_map[MT_EFUSE_ADDR_BASE])#define MT_EFUSE_BASE_CTRL 0x000#define MT_EFUSE_BASE_CTRL_EMPTY BIT(30)
Signature · 1 line
2.25.4
Lorenzo Bianconi
maintainerPATCH 6/7 mt76: mt7615: add gtk rekey offload support
In reply to Lorenzo BianconiAdd KCK and KEK offload support to mt7615 driver in order to support GTK rekeying during PM suspend
--- .../net/wireless/mediatek/mt76/mt7615/init.c | 1 + .../net/wireless/mediatek/mt76/mt7615/main.c | 9 ++ .../net/wireless/mediatek/mt76/mt7615/mcu.c | 102 +++++++++++++++++- .../net/wireless/mediatek/mt76/mt7615/mcu.h | 29 +++++ .../wireless/mediatek/mt76/mt7615/mt7615.h | 3 + 5 files changed, 143 insertions(+), 1 deletion(-)
drivers/net/wireless/mediatek/mt76/mt7615/init.c +1 -0
@@ -145,6 +145,7 @@ void mt7615_check_offload_capability(struct mt7615_dev *dev) dev->ops->cancel_hw_scan =NULL ; dev->ops->sched_scan_start =NULL ; dev->ops->sched_scan_stop =NULL ; + dev->ops->set_rekey_data =NULL ; wiphy->max_sched_scan_plan_interval =0 ; wiphy->max_sched_scan_ie_len =0 ;
drivers/net/wireless/mediatek/mt76/mt7615/main.c +9 -0
@@ -937,6 +937,14 @@ mt7615_set_wakeup(struct ieee80211_hw *hw, bool enabled)device_set_wakeup_enable (mdev->dev, enabled); } +static void __maybe_unused +mt7615_set_rekey_data (struct ieee80211_hw *hw, +struct ieee80211_vif *vif, +struct cfg80211_gtk_rekey_data *data) +{ +mt7615_mcu_update_gtk_rekey (hw, vif, data); +} +const struct ieee80211_ops mt7615_ops = { .tx = mt7615_tx, .start = mt7615_start,
@@ -974,6 +982,7 @@ const struct ieee80211_ops mt7615_ops = { .suspend = mt7615_suspend, .resume = mt7615_resume, .set_wakeup = mt7615_set_wakeup, + .set_rekey_data = mt7615_set_rekey_data,#endif /* CONFIG_PM */ };EXPORT_SYMBOL_GPL (mt7615_ops);
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +101 -1
129 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7615/mcu.h +29 -0
@@ -281,6 +281,7 @@ enum {MCU_UNI_CMD_BSS_INFO_UPDATE =MCU_UNI_PREFIX |0x02 ,MCU_UNI_CMD_STA_REC_UPDATE =MCU_UNI_PREFIX |0x03 ,MCU_UNI_CMD_SUSPEND =MCU_UNI_PREFIX |0x05 , +MCU_UNI_CMD_OFFLOAD =MCU_UNI_PREFIX |0x06 , MCU_UNI_CMD_HIF_CTRL = MCU_UNI_PREFIX | 0x07, };
@@ -469,6 +470,27 @@ struct mt7615_suspend_tlv {u8 pad[5 ]; } __packed; +struct mt7615_gtk_rekey_tlv { +__le16 tag; +__le16 len; +u8 kek[NL80211_KEK_LEN ]; +u8 kck[NL80211_KCK_LEN ]; +u8 replay_ctr[NL80211_REPLAY_CTR_LEN ]; +u8 rekey_mode;/* 0: rekey offload enable +* 1: rekey offload disable +* 2: rekey update +*/ +u8 keyid; +u8 pad[2 ]; +__le32 proto;/* WPA-RSN-WAPI-OPSN */ +__le32 pairwise_cipher; +__le32 group_cipher; +__le32 key_mgmt;/* NONE-PSK-IEEE802.1X */ +__le32 mgmt_group_cipher; +u8 option;/* 1: rekey data update without enabling offload */ +u8 reserverd[3 ]; +} __packed; +/* offload mcu commands */ enum {MCU_CMD_START_HW_SCAN =MCU_CE_PREFIX |0x03 ,
@@ -501,6 +523,13 @@ enum { UNI_SUSPEND_WOW_PATTERN, }; +enum { +UNI_OFFLOAD_OFFLOAD_ARPNS_IPV4 , +UNI_OFFLOAD_OFFLOAD_ARPNS_IPV6 , +UNI_OFFLOAD_OFFLOAD_GTK_REKEY , +UNI_OFFLOAD_OFFLOAD_BMC_RPY_DETECT , +}; +enum {PATCH_SEM_RELEASE =0x0 ,PATCH_SEM_GET =0x1
drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h +3 -0
@@ -537,6 +537,9 @@ int mt7615_mcu_wait_response(struct mt7615_dev *dev, int cmd, int seq);int mt7615_mcu_set_hif_suspend (struct mt7615_dev *dev,bool suspend);void mt7615_mcu_set_suspend_iter (void *priv,u8 *mac,struct ieee80211_vif *vif); +int mt7615_mcu_update_gtk_rekey (struct ieee80211_hw *hw, +struct ieee80211_vif *vif, +struct cfg80211_gtk_rekey_data *key);int __mt7663_load_firmware (struct mt7615_dev *dev);
Signature · 1 line
2.25.4
Lorenzo Bianconi
maintainerPATCH 7/7 mt76: mt7615: introduce beacon_loss mcu event
In reply to Lorenzo BianconiIf device has enabled beacon hw filter rx beacons are not reported to the host. Introduce beacon_loss mcu event to trigger mac80211 mlme connection state machine in this configuration. IEEE80211_VIF_BEACON_FILTER has not set in vif flags since hw beacon filter is not enabled yet
--- .../net/wireless/mediatek/mt76/mt7615/mcu.c | 38 +++++++++++++++++++ .../net/wireless/mediatek/mt76/mt7615/mcu.h | 7 ++++ 2 files changed, 45 insertions(+)
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +38 -0
@@ -359,6 +359,40 @@ mt7615_mcu_scan_event(struct mt7615_dev *dev, struct sk_buff *skb) MT7615_HW_SCAN_TIMEOUT); } +static void +mt7615_mcu_beacon_loss_iter (void *priv,u8 *mac,struct ieee80211_vif *vif) +{ +struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv; +struct mt7615_beacon_loss_event *event = priv; + +if (mvif->idx != event->bss_idx) +return ; + +if (!(vif->driver_flags &IEEE80211_VIF_BEACON_FILTER )) +return ; + +ieee80211_beacon_loss (vif); +} + +static void +mt7615_mcu_beacon_loss_event (struct mt7615_dev *dev,struct sk_buff *skb) +{ +struct mt7615_beacon_loss_event *event; +struct mt76_phy *mphy; +u8 band_idx =0 ;/* DBDC support */ + +skb_pull (skb,sizeof (struct mt7615_mcu_rxd )); + event = (struct mt7615_beacon_loss_event *)skb->data; +if (band_idx && dev->mt76.phy2) + mphy = dev->mt76.phy2; +else + mphy = &dev->mt76.phy; + +ieee80211_iterate_active_interfaces_atomic (mphy->hw, +IEEE80211_IFACE_ITER_RESUME_ALL , + mt7615_mcu_beacon_loss_iter, event); +} +static void mt7615_mcu_bss_event (struct mt7615_dev *dev,struct sk_buff *skb) {
@@ -389,6 +423,9 @@ mt7615_mcu_rx_unsolicited_event(struct mt7615_dev *dev, struct sk_buff *skb)case MCU_EVENT_EXT :mt7615_mcu_rx_ext_event (dev, skb);break ; +case MCU_EVENT_BSS_BEACON_LOSS : +mt7615_mcu_beacon_loss_event (dev, skb); +break ;case MCU_EVENT_SCHED_SCAN_DONE :case MCU_EVENT_SCAN_DONE :mt7615_mcu_scan_event (dev, skb);
@@ -410,6 +447,7 @@ void mt7615_mcu_rx_event(struct mt7615_dev *dev, struct sk_buff *skb) rxd->ext_eid ==MCU_EXT_EVENT_FW_LOG_2_HOST || rxd->ext_eid ==MCU_EXT_EVENT_ASSERT_DUMP || rxd->ext_eid ==MCU_EXT_EVENT_PS_SYNC || + rxd->eid ==MCU_EVENT_BSS_BEACON_LOSS || rxd->eid ==MCU_EVENT_SCHED_SCAN_DONE || rxd->eid ==MCU_EVENT_BSS_ABSENCE || rxd->eid == MCU_EVENT_SCAN_DONE ||
drivers/net/wireless/mediatek/mt76/mt7615/mcu.h +7 -0
@@ -83,6 +83,7 @@ enum {MCU_EVENT_MT_PATCH_SEM =0x04 ,MCU_EVENT_SCAN_DONE =0x0d ,MCU_EVENT_BSS_ABSENCE =0x11 , +MCU_EVENT_BSS_BEACON_LOSS =0x13 ,MCU_EVENT_CH_PRIVILEGE =0x18 ,MCU_EVENT_SCHED_SCAN_DONE =0x23 , MCU_EVENT_EXT = 0xed,
@@ -291,6 +292,12 @@ struct mt7615_mcu_uni_event {__le32 status;/* 0: success, others: fail */ } __packed; +struct mt7615_beacon_loss_event { +u8 bss_idx; +u8 reason; +u8 pad[2 ]; +} __packed; +struct mt7615_mcu_scan_ssid {__le32 ssid_len;u8 ssid[IEEE80211_MAX_SSID_LEN ];
Signature · 1 line
2.25.4