add p2p support to mt76 driver
Subsystems (2)
Lorenzo Bianconi
maintainercover add p2p support to mt76 driver
Introduce p2p support to mt76 driver. Supported modes:
- p2p-go
- p2p-gc
Improve mt7615 hw frequency scanning
Lorenzo Bianconi (3):
mt76: mt7615: do not report scan_complete twice to mac80211
mt76: mt7615: reduce hw scan timeout
mt76: enable p2p support
Sean Wang (1):
mt76: mt7615: configure bss info adding the interface
drivers/net/wireless/mediatek/mt76/mac80211.c | 2 + .../net/wireless/mediatek/mt76/mt7603/init.c | 2 + .../net/wireless/mediatek/mt76/mt7615/init.c | 6 +- .../net/wireless/mediatek/mt76/mt7615/main.c | 16 +- .../net/wireless/mediatek/mt76/mt7615/mcu.c | 175 +++++++++++++----- .../net/wireless/mediatek/mt76/mt7615/mcu.h | 27 +++ .../wireless/mediatek/mt76/mt7615/mt7615.h | 2 + .../net/wireless/mediatek/mt76/mt76x02_util.c | 4 + 8 files changed, 176 insertions(+), 58 deletions(-)
Signature · 1 line
2.26.2
Lorenzo Bianconi
maintainerPATCH 1/4 mt76: mt7615: do not report scan_complete twice to mac80211
Fix the following kernel warning that occurs if scan work is scheduled and the hw scan has been cancelled by mac80211
WARNING: CPU: 1 PID: 502 at net/mac80211/scan.c:391 __ieee80211_scan_completed+0x299/0x690 Modules linked in: CPU: 1 PID: 502 Comm: kworker/u4:4 Not tainted 5.7.0-rc1+ #2882 Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.13.0-2.fc32 04/01/2014 Workqueue: phy0 ieee80211_scan_work RIP: 0010:__ieee80211_scan_completed+0x299/0x690 RSP: 0018:ffffc9000036fda8 EFLAGS: 00010246 RAX: 0000000000000000 RBX: 0000000000000000 RCX: 8c6318c6318c6320 RDX: 0000000000000000 RSI: 00000000ffffffff RDI: ffff88803bb129b8 RBP: ffff88803bb10d80 R08: 0000000000000001 R09: 0000000000000001 R10: 0000000000000001 R11: 0000000000000000 R12: 0000000000000000 R13: 0000000000000000 R14: 0000000000000000 R15: ffff88803bb12ae8 FS: 0000000000000000(0000) GS:ffff88803ec00000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007f13ee5c1470 CR3: 000000003c790000 CR4: 00000000000006a0 Call Trace: ieee80211_scan_work+0x170/0x850 ? sched_clock_cpu+0x11/0xb0 process_one_work+0x24f/0x580 ? worker_thread+0xcc/0x3e0 worker_thread+0x4f/0x3e0 ? process_one_work+0x580/0x580 kthread+0x11b/0x140 ? __kthread_bind_mask+0x60/0x60 ret_from_fork+0x3a/0x50 irq event stamp: 9255532 hardirqs last enabled at (9255531): [<ffffffff81a504e4>] _raw_spin_unlock_irq+0x24/0x30 hardirqs last disabled at (9255532): [<ffffffff81001b3f>] trace_hardirqs_off_thunk+0x1a/0x1c softirqs last enabled at (9255526): [<ffffffff8107c9ef>] process_one_work+0x24f/0x580 softirqs last disabled at (9255524): [<ffffffff815f2f41>] mt7615_scan_work+0x91/0xc0
--- drivers/net/wireless/mediatek/mt76/mt7615/main.c | 8 ++++---- drivers/net/wireless/mediatek/mt76/mt7615/mcu.c | 12 +++++++----- 2 files changed, 11 insertions(+), 9 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/main.c +4 -4
@@ -810,15 +810,15 @@ void mt7615_scan_work(struct work_struct *work)break ; rxd = (struct mt7615_mcu_rxd *)skb->data; -if (rxd->eid ==MCU_EVENT_SCAN_DONE ) { +if (rxd->eid ==MCU_EVENT_SCHED_SCAN_DONE ) { +ieee80211_sched_scan_results (phy->mt76->hw); + }else if (test_and_clear_bit (MT76_HW_SCANNING , + &phy->mt76->state)) {struct cfg80211_scan_info info = { .aborted = false, }; -clear_bit (MT76_HW_SCANNING , &phy->mt76->state);ieee80211_scan_completed (phy->mt76->hw, &info); - }else { -ieee80211_sched_scan_results (phy->mt76->hw); }dev_kfree_skb (skb); }
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +7 -5
@@ -2861,9 +2861,6 @@ int mt7615_mcu_cancel_hw_scan(struct mt7615_phy *phy, {struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv;struct mt7615_dev *dev = phy->dev; -struct cfg80211_scan_info info = { - .aborted = true, - };struct {u8 seq_num;u8 is_ext_channel;
@@ -2872,8 +2869,13 @@ int mt7615_mcu_cancel_hw_scan(struct mt7615_phy *phy, .seq_num = mvif->scan_seq_num, }; -ieee80211_scan_completed (phy->mt76->hw, &info); -clear_bit (MT76_HW_SCANNING , &phy->mt76->state); +if (test_and_clear_bit (MT76_HW_SCANNING , &phy->mt76->state)) { +struct cfg80211_scan_info info = { + .aborted = true, + }; + +ieee80211_scan_completed (phy->mt76->hw, &info); + }return __mt76_mcu_send_msg (&dev->mt76,MCU_CMD_CANCEL_HW_SCAN , &req,sizeof (req), false);
Signature · 1 line
2.26.2
Lorenzo Bianconi
maintainerPATCH 2/4 mt76: mt7615: reduce hw scan timeout
In reply to Lorenzo BianconiDifferentiate hw scan channel time between passive and active scan
--- drivers/net/wireless/mediatek/mt76/mt7615/mcu.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +4 -1
@@ -2773,7 +2773,7 @@ int mt7615_mcu_set_channel_domain(struct mt7615_phy *phy) MCU_CMD_SET_CHAN_DOMAIN, false); } -#define MT7615_SCAN_CHANNEL_TIME 120 +#define MT7615_SCAN_CHANNEL_TIME 60int mt7615_mcu_hw_scan (struct mt7615_phy *phy,struct ieee80211_vif *vif,struct ieee80211_scan_request *scan_req) {
@@ -2819,6 +2819,9 @@ int mt7615_mcu_hw_scan(struct mt7615_phy *phy, struct ieee80211_vif *vif, req->ssid_type = n_ssids ?BIT (2 ) :BIT (0 ); req->ssids_num = n_ssids; +/* increase channel time for passive scan */ +if (!sreq->n_ssids) + duration *=2 ; req->timeout_value =cpu_to_le16 (sreq->n_channels * duration); req->channel_min_dwell_time =cpu_to_le16 (duration); req->channel_dwell_time =cpu_to_le16 (duration);
Signature · 1 line
2.26.2
Lorenzo Bianconi
maintainerPATCH 3/4 mt76: enable p2p support
In reply to Lorenzo BianconiIntroduce p2p-go/p2p-client suppor to mt76 driver
--- drivers/net/wireless/mediatek/mt76/mac80211.c | 2 + .../net/wireless/mediatek/mt76/mt7603/init.c | 2 + .../net/wireless/mediatek/mt76/mt7615/init.c | 6 +- .../net/wireless/mediatek/mt76/mt7615/main.c | 3 + .../net/wireless/mediatek/mt76/mt7615/mcu.c | 61 ++++++++++++++++--- .../net/wireless/mediatek/mt76/mt7615/mcu.h | 1 + .../wireless/mediatek/mt76/mt7615/mt7615.h | 2 + .../net/wireless/mediatek/mt76/mt76x02_util.c | 4 ++ 8 files changed, 72 insertions(+), 9 deletions(-)
drivers/net/wireless/mediatek/mt76/mac80211.c +2 -0
@@ -313,6 +313,8 @@ mt76_phy_init(struct mt76_dev *dev, struct ieee80211_hw *hw)#ifdef CONFIG_MAC80211_MESH BIT (NL80211_IFTYPE_MESH_POINT ) | #endif +BIT (NL80211_IFTYPE_P2P_CLIENT ) | +BIT (NL80211_IFTYPE_P2P_GO ) | BIT(NL80211_IFTYPE_ADHOC); }
drivers/net/wireless/mediatek/mt76/mt7603/init.c +2 -0
@@ -342,6 +342,8 @@ static const struct ieee80211_iface_limit if_limits[] = {#ifdef CONFIG_MAC80211_MESH BIT (NL80211_IFTYPE_MESH_POINT ) | #endif +BIT (NL80211_IFTYPE_P2P_CLIENT ) | +BIT (NL80211_IFTYPE_P2P_GO ) |BIT (NL80211_IFTYPE_AP ) }, };
drivers/net/wireless/mediatek/mt76/mt7615/init.c +5 -1
@@ -140,7 +140,9 @@ void mt7615_check_offload_capability(struct mt7615_dev *dev)ieee80211_hw_set (hw,SUPPORTS_DYNAMIC_PS ); wiphy->features |=NL80211_FEATURE_SCHED_SCAN_RANDOM_MAC_ADDR | -NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR ; +NL80211_FEATURE_SCAN_RANDOM_MAC_ADDR | +NL80211_FEATURE_P2P_GO_CTWIN | +NL80211_FEATURE_P2P_GO_OPPPS ; }else { dev->ops->hw_scan =NULL ; dev->ops->cancel_hw_scan =NULL ;
@@ -205,6 +207,8 @@ static const struct ieee80211_iface_limit if_limits[] = {#ifdef CONFIG_MAC80211_MESH BIT (NL80211_IFTYPE_MESH_POINT ) | #endif +BIT (NL80211_IFTYPE_P2P_CLIENT ) | +BIT (NL80211_IFTYPE_P2P_GO ) |BIT (NL80211_IFTYPE_STATION ) } };
drivers/net/wireless/mediatek/mt76/mt7615/main.c +3 -0
@@ -503,6 +503,9 @@ static void mt7615_bss_info_changed(struct ieee80211_hw *hw,if (changed &BSS_CHANGED_BEACON_ENABLED ) {mt7615_mcu_add_bss_info (phy, vif,NULL , info->enable_beacon);mt7615_mcu_sta_add (dev, vif,NULL , info->enable_beacon); + +if (vif->p2p && info->enable_beacon) +mt7615_mcu_set_p2p_oppps (hw, vif); } if (changed & (BSS_CHANGED_BEACON |
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +53 -8
109 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7615/mcu.h +1 -0
@@ -507,6 +507,7 @@ enum {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_SET_P2P_OPPPS =MCU_CE_PREFIX |0x33 ,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
@@ -530,6 +530,8 @@ 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_mcu_set_p2p_oppps (struct ieee80211_hw *hw, +struct ieee80211_vif *vif);int mt7615_firmware_own (struct mt7615_dev *dev);int mt7615_driver_own (struct mt7615_dev *dev);
drivers/net/wireless/mediatek/mt76/mt76x02_util.c +4 -0
@@ -46,6 +46,8 @@ static const struct ieee80211_iface_limit mt76x02_if_limits[] = {#ifdef CONFIG_MAC80211_MESH BIT (NL80211_IFTYPE_MESH_POINT ) | #endif +BIT (NL80211_IFTYPE_P2P_CLIENT ) | +BIT (NL80211_IFTYPE_P2P_GO ) |BIT (NL80211_IFTYPE_AP ) }, };
@@ -60,6 +62,8 @@ static const struct ieee80211_iface_limit mt76x02u_if_limits[] = {#ifdef CONFIG_MAC80211_MESH BIT (NL80211_IFTYPE_MESH_POINT ) | #endif +BIT (NL80211_IFTYPE_P2P_CLIENT ) | +BIT (NL80211_IFTYPE_P2P_GO ) |BIT (NL80211_IFTYPE_AP ) }, };
Signature · 1 line
2.26.2
Lorenzo Bianconi
maintainerPATCH 4/4 mt76: mt7615: configure bss info adding the interface
In reply to Lorenzo BianconiFrom: Sean Wang <[email protected]>
Introduce essential bss information for multiple vifs hw_scan in mt7615_mcu_uni_add_dev adding the interface
--- .../net/wireless/mediatek/mt76/mt7615/main.c | 5 +- .../net/wireless/mediatek/mt76/mt7615/mcu.c | 97 ++++++++++++------- .../net/wireless/mediatek/mt76/mt7615/mcu.h | 26 +++++ 3 files changed, 89 insertions(+), 39 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7615/main.c +1 -4
@@ -156,10 +156,6 @@ static int mt7615_add_interface(struct ieee80211_hw *hw,else mvif->wmm_idx = mvif->idx %MT7615_MAX_WMM_SETS ; - ret =mt7615_mcu_add_dev_info (dev, vif, true); -if (ret) - goto out; - dev->vif_mask |=BIT (mvif->idx); dev->omac_mask |=BIT (mvif->omac_idx); phy->omac_mask |=BIT (mvif->omac_idx);
@@ -182,6 +178,7 @@ static int mt7615_add_interface(struct ieee80211_hw *hw,mt76_txq_init (&dev->mt76, vif->txq); } + ret =mt7615_mcu_add_dev_info (dev, vif, true); out:mutex_unlock (&dev->mt76.mutex);
drivers/net/wireless/mediatek/mt76/mt7615/mcu.c +62 -35
140 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7615/mcu.h +26 -0
@@ -425,6 +425,32 @@ struct mt7615_mcu_bss_event {u8 pad; } __packed; +struct mt7615_bss_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;/* bit(0): A +* bit(1): B +* bit(2): G +* bit(3): GN +* bit(4): AN +* bit(5): AC +*/ +__le16 sta_idx; +u8 nonht_basic_phy; +u8 pad[3 ]; +} __packed; +struct mt7615_wow_ctrl_tlv {__le16 tag;__le16 len;
Signature · 1 line
2.26.2