add 802.11 ps support to mt7663 driver
Subsystems (2)
Lorenzo Bianconi
maintainercover add 802.11 ps support to mt7663 driver
Introduce 802.11 power-save support for mt7663 station mode enabling ps firmware support
Lorenzo Bianconi (3):
mt76: mt7615: provide aid info to the mcu
mt76: remove PS_NULLFUNC_STACK capability
mt76: mt7663: introduce 802.11 PS support in sta mode
drivers/net/wireless/mediatek/mt76/mac80211.c | 1 - drivers/net/wireless/mediatek/mt76/mt76.h | 1 + .../net/wireless/mediatek/mt76/mt7615/init.c | 4 +++ .../net/wireless/mediatek/mt76/mt7615/mac.c | 7 ++++-- .../net/wireless/mediatek/mt76/mt7615/main.c | 23 +++++++++++++++++ .../net/wireless/mediatek/mt76/mt7615/mcu.c | 25 ++++++++++++++++++- .../net/wireless/mediatek/mt76/mt7615/mcu.h | 1 + .../wireless/mediatek/mt76/mt7615/mt7615.h | 4 +++ .../wireless/mediatek/mt76/mt7615/pci_init.c | 8 ++++-- .../wireless/mediatek/mt76/mt7615/usb_init.c | 3 +++ 10 files changed, 71 insertions(+), 6 deletions(-)
Signature · 1 line
2.25.2
Lorenzo Bianconi
maintainerPATCH 1/3 mt76: mt7615: provide aid info to the mcu
For sta mode mac80211 provides aid in vif->bss_conf.aid. In order to properly support 802.11 power-save, configure correct aid to mcu during sta association
--- 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
@@ -790,12 +790,15 @@ mt7615_mcu_sta_basic_tlv(struct sk_buff *skb, struct ieee80211_vif *vif,case NL80211_IFTYPE_MESH_POINT :case NL80211_IFTYPE_AP : basic->conn_type =cpu_to_le32 (CONNECTION_INFRA_STA ); + basic->aid =cpu_to_le16 (sta->aid);break ;case NL80211_IFTYPE_STATION : basic->conn_type =cpu_to_le32 (CONNECTION_INFRA_AP ); + basic->aid =cpu_to_le16 (vif->bss_conf.aid);break ;case NL80211_IFTYPE_ADHOC : basic->conn_type =cpu_to_le32 (CONNECTION_IBSS_ADHOC ); + basic->aid =cpu_to_le16 (sta->aid);break ;default :WARN_ON (1 );
@@ -803,7 +806,6 @@ mt7615_mcu_sta_basic_tlv(struct sk_buff *skb, struct ieee80211_vif *vif, }memcpy (basic->peer_addr, sta->addr,ETH_ALEN ); - basic->aid =cpu_to_le16 (sta->aid); basic->qos = sta->wme; }
Signature · 1 line
2.25.2
Lorenzo Bianconi
maintainerPATCH 2/3 mt76: remove PS_NULLFUNC_STACK capability
In reply to Lorenzo Bianconiremove IEEE80211_HW_PS_NULLFUNC_STACK capability from mt76_phy_init routine since 802.11 ps is not currently supported by any devices and it will conflict with mt7663 ps fw support
--- drivers/net/wireless/mediatek/mt76/mac80211.c | 1 - 1 file changed, 1 deletion(-)
drivers/net/wireless/mediatek/mt76/mac80211.c +0 -1
@@ -294,7 +294,6 @@ mt76_phy_init(struct mt76_dev *dev, struct ieee80211_hw *hw) hw->max_tx_fragments =16 ;ieee80211_hw_set (hw,SIGNAL_DBM ); -ieee80211_hw_set (hw,PS_NULLFUNC_STACK );ieee80211_hw_set (hw,AMPDU_AGGREGATION );ieee80211_hw_set (hw,SUPPORTS_RC_TABLE );ieee80211_hw_set (hw,SUPPORT_FAST_XMIT );
Signature · 1 line
2.25.2
Lorenzo Bianconi
maintainerPATCH 3/3 mt76: mt7663: introduce 802.11 PS support in sta mode
In reply to Lorenzo BianconiEnable 802.11 power-save support available in mt7663 firmware
--- drivers/net/wireless/mediatek/mt76/mt76.h | 1 + .../net/wireless/mediatek/mt76/mt7615/init.c | 4 ++++ .../net/wireless/mediatek/mt76/mt7615/mac.c | 7 ++++-- .../net/wireless/mediatek/mt76/mt7615/main.c | 23 +++++++++++++++++++ .../net/wireless/mediatek/mt76/mt7615/mcu.c | 21 +++++++++++++++++ .../net/wireless/mediatek/mt76/mt7615/mcu.h | 1 + .../wireless/mediatek/mt76/mt7615/mt7615.h | 4 ++++ .../wireless/mediatek/mt76/mt7615/pci_init.c | 8 +++++-- .../wireless/mediatek/mt76/mt7615/usb_init.c | 3 +++ 9 files changed, 68 insertions(+), 4 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76.h +1 -0
@@ -286,6 +286,7 @@ enum {MT76_REMOVED ,MT76_READING_STATS ,MT76_STATE_POWER_OFF , + MT76_STATE_PS, }; struct mt76_hw_cap {
drivers/net/wireless/mediatek/mt76/mt7615/init.c +4 -0
@@ -323,6 +323,8 @@ int mt7615_register_ext_phy(struct mt7615_dev *dev)INIT_DELAYED_WORK (&phy->scan_work, mt7615_scan_work);skb_queue_head_init (&phy->scan_event_list); +INIT_WORK (&dev->phy.ps_work, mt7615_ps_work); +mt7615_cap_dbdc_enable (dev); mphy =mt76_alloc_phy (&dev->mt76,sizeof (*phy), &mt7615_ops);if (!mphy)
@@ -386,7 +388,9 @@ void mt7615_init_device(struct mt7615_dev *dev)INIT_LIST_HEAD (&dev->sta_poll_list);spin_lock_init (&dev->sta_poll_lock);init_waitqueue_head (&dev->reset_wait); +INIT_WORK (&dev->reset_work, mt7615_mac_reset_work); +INIT_WORK (&dev->phy.ps_work, mt7615_ps_work);mt7615_init_wiphy (hw); dev->mphy.sband_2g.sband.ht_cap.cap |=IEEE80211_HT_CAP_LDPC_CODING ;
drivers/net/wireless/mediatek/mt76/mt7615/mac.c +5 -2
@@ -605,8 +605,11 @@ int mt7615_mac_write_txwi(struct mt7615_dev *dev, __le32 *txwi, }if (!ieee80211_is_beacon (fc)) { - val =MT_TXD5_TX_STATUS_HOST |MT_TXD5_SW_POWER_MGMT | -FIELD_PREP (MT_TXD5_PID , pid); +struct ieee80211_hw *hw =mt76_hw (dev); + + val =MT_TXD5_TX_STATUS_HOST |FIELD_PREP (MT_TXD5_PID , pid); +if (!ieee80211_hw_check (hw,SUPPORTS_PS )) + val |=MT_TXD5_SW_POWER_MGMT ; txwi[5 ] =cpu_to_le32 (val); }else { txwi[5 ] =0 ;
drivers/net/wireless/mediatek/mt76/mt7615/main.c +23 -0
@@ -71,6 +71,7 @@ static void mt7615_stop(struct ieee80211_hw *hw)struct mt7615_phy *phy =mt7615_hw_phy (hw);cancel_delayed_work_sync (&phy->mac_work); +cancel_work_sync (&phy->ps_work);mutex_lock (&dev->mt76.mutex);
@@ -362,6 +363,20 @@ static int mt7615_set_key(struct ieee80211_hw *hw, enum set_key_cmd cmd,return mt7615_mac_wtbl_set_key (dev, wcid, key, cmd); } +void mt7615_ps_work (struct work_struct *work) +{ +struct mt7615_phy *phy; + + phy = (struct mt7615_phy *)container_of(work, struct mt7615_phy, + ps_work); + +mutex_lock (&phy->dev->mt76.mutex); +ieee80211_iterate_active_interfaces (phy->mt76->hw, +IEEE80211_IFACE_ITER_RESUME_ALL , + m7615_mcu_set_ps_iter, phy); +mutex_unlock (&phy->dev->mt76.mutex); +} +static int mt7615_config (struct ieee80211_hw *hw,u32 changed) {struct mt7615_dev *dev =mt7615_hw_dev (hw);
@@ -387,6 +402,14 @@ static int mt7615_config(struct ieee80211_hw *hw, u32 changed)mt76_wr (dev,MT_WF_RFCR (band), phy->rxfilter); } +if (changed &IEEE80211_CONF_CHANGE_PS ) { +if (hw->conf.flags &IEEE80211_CONF_PS ) +set_bit (MT76_STATE_PS , &phy->mt76->state); +else +clear_bit (MT76_STATE_PS , &phy->mt76->state); +ieee80211_queue_work (hw, &phy->ps_work); + } +mutex_unlock (&dev->mt76.mutex);return ret;
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +21 -0
@@ -2586,6 +2586,27 @@ int mt7615_mcu_set_sku_en(struct mt7615_phy *phy, bool enable) sizeof(req), true); } +void m7615_mcu_set_ps_iter (void *priv,u8 *mac,struct ieee80211_vif *vif) +{ +struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv; +struct mt7615_phy *phy = priv; +struct mt76_phy *mphy = phy->mt76; +struct { +u8 bss_idx; +u8 ps_state;/* 0: device awake +* 1: static power save +* 2: dynamic power saving +*/ + } req = { + .bss_idx = mvif->idx, + .ps_state =test_bit (MT76_STATE_PS , &mphy->state) ?2 :0 , + }; + +if (vif->type ==NL80211_IFTYPE_STATION ) +__mt76_mcu_send_msg (&phy->dev->mt76,MCU_CMD_SET_PS_PROFILE , + &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 +1 -0
@@ -411,6 +411,7 @@ struct mt7615_mcu_bss_event {/* offload mcu commands */ 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_CANCEL_HW_SCAN =MCU_CE_PREFIX |0x1b ,MCU_CMD_SCHED_SCAN_ENABLE =MCU_CE_PREFIX |0x61 ,
drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h +4 -0
@@ -197,6 +197,8 @@ struct mt7615_phy {struct sk_buff_head scan_event_list;struct delayed_work scan_work; + +struct work_struct ps_work; };#define mt7615_mcu_add_tx_ba (dev, ...) (dev)->mcu_ops->add_tx_ba((dev), __VA_ARGS__)
@@ -423,6 +425,7 @@ static inline bool mt7615_firmware_offload(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,struct ieee80211_supported_band *sband);void mt7615_phy_init (struct mt7615_dev *dev);
@@ -508,6 +511,7 @@ int mt7615_mcu_set_radar_th(struct mt7615_dev *dev, int index,int mt7615_mcu_set_sku_en (struct mt7615_phy *phy,bool enable);int mt7615_mcu_apply_rx_dcoc (struct mt7615_phy *phy);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_init_debugfs (struct mt7615_dev *dev);
drivers/net/wireless/mediatek/mt76/mt7615/pci_init.c +6 -2
@@ -16,6 +16,7 @@ static void mt7615_init_work(struct work_struct *work) { struct mt7615_dev *dev = container_of(work, struct mt7615_dev, mcu_work); +struct ieee80211_hw *hw =mt76_hw (dev);if (mt7615_mcu_init (dev))return ;
@@ -25,8 +26,11 @@ static void mt7615_init_work(struct work_struct *work)mt7615_phy_init (dev);mt7615_mcu_del_wtbl_all (dev); -if (!mt7615_firmware_offload (dev)) { -struct wiphy *wiphy =mt76_hw (dev)->wiphy; +if (mt7615_firmware_offload (dev)) { +ieee80211_hw_set (hw,SUPPORTS_PS ); +ieee80211_hw_set (hw,SUPPORTS_DYNAMIC_PS ); + }else { +struct wiphy *wiphy = hw->wiphy; dev->ops->hw_scan =NULL ; dev->ops->cancel_hw_scan =NULL ;
drivers/net/wireless/mediatek/mt76/mt7615/usb_init.c +3 -0
@@ -119,6 +119,9 @@ int mt7663u_register_device(struct mt7615_dev *dev)if (err)return err; +ieee80211_hw_set (hw,SUPPORTS_PS ); +ieee80211_hw_set (hw,SUPPORTS_DYNAMIC_PS ); + hw->extra_tx_headroom +=MT_USB_HDR_SIZE +MT_USB_TXD_SIZE ;/* check hw sg support in order to enable AMSDU */ hw->max_tx_fragments = dev->mt76.usb.sg_en ?MT_HW_TXP_MAX_BUF_NUM :1 ;
Signature · 1 line
2.25.2