mt76: move common beacon code in mt76 module
Subsystems (2)
Lorenzo Bianconi
maintainerv3 cover mt76: move common beacon code in mt76 module
Move beacon data structures shared between mt76x02 and mt7603 drivers in mt76_dev.
Enable/disable pre_tbtt_tasklet tasklet in mt7603_set_channel
Changes since v2:
- remove patch 2/5 and 3/5 since already applied
- do not run tbtt tasklet while offchannel
Changes since v1:
- added new patch: 'mt76: do not enable/disable pre_tbtt_tasklet in scan_start/scan_complete'
Lorenzo Bianconi (3):
mt76: move pre_tbtt_tasklet in mt76_dev
mt76: mt7603: enable/disable pre_tbtt_tasklet in mt7603_set_channel
mt76: do not enable/disable pre_tbtt_tasklet in
scan_start/scan_complete
drivers/net/wireless/mediatek/mt76/mt76.h | 1 + .../net/wireless/mediatek/mt76/mt7603/beacon.c | 3 +++ drivers/net/wireless/mediatek/mt76/mt7603/core.c | 2 +- drivers/net/wireless/mediatek/mt76/mt7603/init.c | 4 ++-- drivers/net/wireless/mediatek/mt76/mt7603/mac.c | 4 ++-- drivers/net/wireless/mediatek/mt76/mt7603/main.c | 12 ++++++++---- .../net/wireless/mediatek/mt76/mt7603/mt7603.h | 2 -- drivers/net/wireless/mediatek/mt76/mt76x0/pci.c | 2 +- drivers/net/wireless/mediatek/mt76/mt76x02.h | 1 - drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c | 15 +++++++++------ .../net/wireless/mediatek/mt76/mt76x02_usb_core.c | 3 +++ drivers/net/wireless/mediatek/mt76/mt76x02_util.c | 5 ----- .../net/wireless/mediatek/mt76/mt76x2/pci_init.c | 2 +- .../net/wireless/mediatek/mt76/mt76x2/pci_main.c | 4 ++-- 14 files changed, 33 insertions(+), 27 deletions(-)
Signature · 1 line
2.20.1
Lorenzo Bianconi
maintainerPATCH v3 1/3 mt76: move pre_tbtt_tasklet in mt76_dev
Move pre_tbtt_tasklet tasklet in mt76_dev data structure since it is used by all drivers
--- drivers/net/wireless/mediatek/mt76/mt76.h | 1 + drivers/net/wireless/mediatek/mt76/mt7603/core.c | 2 +- drivers/net/wireless/mediatek/mt76/mt7603/init.c | 4 ++-- drivers/net/wireless/mediatek/mt76/mt7603/mac.c | 4 ++-- drivers/net/wireless/mediatek/mt76/mt7603/main.c | 4 ++-- drivers/net/wireless/mediatek/mt76/mt7603/mt7603.h | 2 -- drivers/net/wireless/mediatek/mt76/mt76x0/pci.c | 2 +- drivers/net/wireless/mediatek/mt76/mt76x02.h | 1 - drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c | 12 ++++++------ drivers/net/wireless/mediatek/mt76/mt76x02_util.c | 4 ++-- drivers/net/wireless/mediatek/mt76/mt76x2/pci_init.c | 2 +- drivers/net/wireless/mediatek/mt76/mt76x2/pci_main.c | 4 ++-- 12 files changed, 20 insertions(+), 22 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76.h +1 -0
@@ -469,6 +469,7 @@ struct mt76_dev {u8 antenna_mask;u16 chainmask; +struct tasklet_struct pre_tbtt_tasklet;int beacon_int;u8 beacon_mask;
drivers/net/wireless/mediatek/mt76/mt7603/core.c +1 -1
@@ -27,7 +27,7 @@ irqreturn_t mt7603_irq_handler(int irq, void *dev_instance)mt76_wr (dev,MT_HW_INT_STATUS (3 ), hwintr);if (hwintr &MT_HW_INT3_PRE_TBTT0 ) -tasklet_schedule (&dev->pre_tbtt_tasklet); +tasklet_schedule (&dev->mt76.pre_tbtt_tasklet);if ((hwintr &MT_HW_INT3_TBTT0 ) && dev->mt76.csa_complete)mt76_csa_finish (&dev->mt76);
drivers/net/wireless/mediatek/mt76/mt7603/init.c +2 -2
@@ -515,7 +515,7 @@ int mt7603_register_device(struct mt7603_dev *dev)spin_lock_init (&dev->ps_lock);INIT_DELAYED_WORK (&dev->mt76.mac_work, mt7603_mac_work); -tasklet_init (&dev->pre_tbtt_tasklet, mt7603_pre_tbtt_tasklet, +tasklet_init (&dev->mt76.pre_tbtt_tasklet, mt7603_pre_tbtt_tasklet, (unsigned long )dev);/* Check for 7688, which only has 1SS */
@@ -574,7 +574,7 @@ int mt7603_register_device(struct mt7603_dev *dev)void mt7603_unregister_device (struct mt7603_dev *dev) { -tasklet_disable (&dev->pre_tbtt_tasklet); +tasklet_disable (&dev->mt76.pre_tbtt_tasklet);mt76_unregister_device (&dev->mt76);mt7603_mcu_exit (dev);mt7603_dma_cleanup (dev);
drivers/net/wireless/mediatek/mt76/mt7603/mac.c +2 -2
@@ -1279,7 +1279,7 @@ static void mt7603_mac_watchdog_reset(struct mt7603_dev *dev)mt76_txq_schedule_all (&dev->mt76);tasklet_disable (&dev->mt76.tx_tasklet); -tasklet_disable (&dev->pre_tbtt_tasklet); +tasklet_disable (&dev->mt76.pre_tbtt_tasklet);napi_disable (&dev->mt76.napi[0 ]);napi_disable (&dev->mt76.napi[1 ]);
@@ -1328,7 +1328,7 @@ static void mt7603_mac_watchdog_reset(struct mt7603_dev *dev)tasklet_enable (&dev->mt76.tx_tasklet);tasklet_schedule (&dev->mt76.tx_tasklet); -tasklet_enable (&dev->pre_tbtt_tasklet); +tasklet_enable (&dev->mt76.pre_tbtt_tasklet);mt7603_beacon_set_timer (dev,-1 , beacon_int);napi_enable (&dev->mt76.napi[0 ]);
drivers/net/wireless/mediatek/mt76/mt7603/main.c +2 -2
@@ -294,9 +294,9 @@ mt7603_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif,if (changed & (BSS_CHANGED_BEACON_ENABLED |BSS_CHANGED_BEACON_INT )) {int beacon_int = !!info->enable_beacon * info->beacon_int; -tasklet_disable (&dev->pre_tbtt_tasklet); +tasklet_disable (&dev->mt76.pre_tbtt_tasklet);mt7603_beacon_set_timer (dev, mvif->idx, beacon_int); -tasklet_enable (&dev->pre_tbtt_tasklet); +tasklet_enable (&dev->mt76.pre_tbtt_tasklet); }mutex_unlock (&dev->mt76.mutex);
drivers/net/wireless/mediatek/mt76/mt7603/mt7603.h +0 -2
@@ -140,8 +140,6 @@ struct mt7603_dev {u32 reset_test;unsigned int reset_cause[__RESET_CAUSE_MAX]; - -struct tasklet_struct pre_tbtt_tasklet; };extern const struct mt76_driver_ops mt7603_drv_ops;
drivers/net/wireless/mediatek/mt76/mt76x0/pci.c +1 -1
@@ -213,7 +213,7 @@ mt76x0e_probe(struct pci_dev *pdev, const struct pci_device_id *id)static void mt76x0e_cleanup (struct mt76x02_dev *dev) {clear_bit (MT76_STATE_INITIALIZED , &dev->mt76.state); -tasklet_disable (&dev->pre_tbtt_tasklet); +tasklet_disable (&dev->mt76.pre_tbtt_tasklet);mt76x0_chip_onoff (dev, false, false);mt76x0e_stop_hw (dev);mt76x02_dma_cleanup (dev);
drivers/net/wireless/mediatek/mt76/mt76x02.h +0 -1
@@ -91,7 +91,6 @@ struct mt76x02_dev {struct sk_buff *rx_head;struct napi_struct tx_napi; -struct tasklet_struct pre_tbtt_tasklet;struct delayed_work cal_work;struct delayed_work wdt_work;
drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c +6 -6
@@ -68,9 +68,9 @@ static void mt76x02_pre_tbtt_tasklet(unsigned long arg)static void mt76x02e_pre_tbtt_enable (struct mt76x02_dev *dev,bool en) {if (en) -tasklet_enable (&dev->pre_tbtt_tasklet); +tasklet_enable (&dev->mt76.pre_tbtt_tasklet);else -tasklet_disable (&dev->pre_tbtt_tasklet); +tasklet_disable (&dev->mt76.pre_tbtt_tasklet); }static void mt76x02e_beacon_enable (struct mt76x02_dev *dev,bool en)
@@ -198,7 +198,7 @@ int mt76x02_dma_init(struct mt76x02_dev *dev)tasklet_init (&dev->mt76.tx_tasklet, mt76x02_tx_tasklet, (unsigned long ) dev); -tasklet_init (&dev->pre_tbtt_tasklet, mt76x02_pre_tbtt_tasklet, +tasklet_init (&dev->mt76.pre_tbtt_tasklet, mt76x02_pre_tbtt_tasklet, (unsigned long )dev);spin_lock_init (&dev->txstatus_fifo_lock);
@@ -285,7 +285,7 @@ irqreturn_t mt76x02_irq_handler(int irq, void *dev_instance) }if (intr &MT_INT_PRE_TBTT ) -tasklet_schedule (&dev->pre_tbtt_tasklet); +tasklet_schedule (&dev->mt76.pre_tbtt_tasklet);/* send buffered multicast frames now */ if (intr &MT_INT_TBTT ) {
@@ -449,7 +449,7 @@ static void mt76x02_watchdog_reset(struct mt76x02_dev *dev)ieee80211_stop_queues (dev->mt76.hw);set_bit (MT76_RESET , &dev->mt76.state); -tasklet_disable (&dev->pre_tbtt_tasklet); +tasklet_disable (&dev->mt76.pre_tbtt_tasklet);tasklet_disable (&dev->mt76.tx_tasklet);napi_disable (&dev->tx_napi);
@@ -508,7 +508,7 @@ static void mt76x02_watchdog_reset(struct mt76x02_dev *dev)napi_enable (&dev->tx_napi);napi_schedule (&dev->tx_napi); -tasklet_enable (&dev->pre_tbtt_tasklet); +tasklet_enable (&dev->mt76.pre_tbtt_tasklet);for (i =0 ; i <ARRAY_SIZE (dev->mt76.napi); i++) {napi_enable (&dev->mt76.napi[i]);
drivers/net/wireless/mediatek/mt76/mt76x02_util.c +2 -2
@@ -594,7 +594,7 @@ void mt76x02_sw_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif,struct mt76x02_dev *dev = hw->priv;if (mt76_is_mmio (dev)) -tasklet_disable (&dev->pre_tbtt_tasklet); +tasklet_disable (&dev->mt76.pre_tbtt_tasklet);set_bit (MT76_SCANNING , &dev->mt76.state); }EXPORT_SYMBOL_GPL (mt76x02_sw_scan);
@@ -606,7 +606,7 @@ void mt76x02_sw_scan_complete(struct ieee80211_hw *hw,clear_bit (MT76_SCANNING , &dev->mt76.state);if (mt76_is_mmio (dev)) -tasklet_enable (&dev->pre_tbtt_tasklet); +tasklet_enable (&dev->mt76.pre_tbtt_tasklet);if (dev->cal.gain_init_done) {/* Restore AGC gain and resume calibration after scanning. */
drivers/net/wireless/mediatek/mt76/mt76x2/pci_init.c +1 -1
@@ -300,7 +300,7 @@ void mt76x2_stop_hardware(struct mt76x02_dev *dev)void mt76x2_cleanup (struct mt76x02_dev *dev) {tasklet_disable (&dev->dfs_pd.dfs_tasklet); -tasklet_disable (&dev->pre_tbtt_tasklet); +tasklet_disable (&dev->mt76.pre_tbtt_tasklet);mt76x2_stop_hardware (dev);mt76x02_dma_cleanup (dev);mt76x02_mcu_cleanup (dev);
drivers/net/wireless/mediatek/mt76/mt76x2/pci_main.c +2 -2
@@ -59,7 +59,7 @@ mt76x2_set_channel(struct mt76x02_dev *dev, struct cfg80211_chan_def *chandef)mt76_set_channel (&dev->mt76); -tasklet_disable (&dev->pre_tbtt_tasklet); +tasklet_disable (&dev->mt76.pre_tbtt_tasklet);tasklet_disable (&dev->dfs_pd.dfs_tasklet);mt76x2_mac_stop (dev, true);
@@ -73,7 +73,7 @@ mt76x2_set_channel(struct mt76x02_dev *dev, struct cfg80211_chan_def *chandef)mt76x2_mac_resume (dev);tasklet_enable (&dev->dfs_pd.dfs_tasklet); -tasklet_enable (&dev->pre_tbtt_tasklet); +tasklet_enable (&dev->mt76.pre_tbtt_tasklet);clear_bit (MT76_RESET , &dev->mt76.state);
Signature · 1 line
2.20.1
Lorenzo Bianconi
maintainerPATCH v3 2/3 mt76: mt7603: enable/disable pre_tbtt_tasklet in mt7603_set_channel
In reply to Lorenzo BianconiDisable pre_tbtt_tasklet tasklet before setting the operating channel. Enable/disable beacon_timer in mt7603_set_channel
--- drivers/net/wireless/mediatek/mt76/mt7603/beacon.c | 3 +++ drivers/net/wireless/mediatek/mt76/mt7603/main.c | 8 ++++++-- 2 files changed, 9 insertions(+), 2 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7603/beacon.c +3 -0
@@ -72,6 +72,9 @@ void mt7603_pre_tbtt_tasklet(unsigned long arg)struct sk_buff *skb;int i, nframes; +if (mt76_hw (dev)->conf.flags &IEEE80211_CONF_OFFCHANNEL ) +return ; + data.dev = dev;__skb_queue_head_init (&data.q);
drivers/net/wireless/mediatek/mt76/mt7603/main.c +6 -2
@@ -133,10 +133,12 @@ mt7603_set_channel(struct mt7603_dev *dev, struct cfg80211_chan_def *def)bool failed = false;cancel_delayed_work_sync (&dev->mt76.mac_work); +tasklet_disable (&dev->mt76.pre_tbtt_tasklet);mutex_lock (&dev->mt76.mutex);set_bit (MT76_RESET , &dev->mt76.state); +mt7603_beacon_set_timer (dev,-1 ,0 );mt76_set_channel (&dev->mt76);mt7603_mac_stop (dev);
@@ -186,8 +188,12 @@ mt7603_set_channel(struct mt7603_dev *dev, struct cfg80211_chan_def *def)mt7603_init_edcca (dev); out: +if (!(mt76_hw (dev)->conf.flags &IEEE80211_CONF_OFFCHANNEL )) +mt7603_beacon_set_timer (dev,-1 , dev->mt76.beacon_int);mutex_unlock (&dev->mt76.mutex); +tasklet_enable (&dev->mt76.pre_tbtt_tasklet); +if (failed)mt7603_mac_work (&dev->mt76.mac_work.work);
@@ -535,7 +541,6 @@ mt7603_sw_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif,struct mt7603_dev *dev = hw->priv;set_bit (MT76_SCANNING , &dev->mt76.state); -mt7603_beacon_set_timer (dev,-1 ,0 ); } static void
@@ -544,7 +549,6 @@ mt7603_sw_scan_complete(struct ieee80211_hw *hw, struct ieee80211_vif *vif)struct mt7603_dev *dev = hw->priv;clear_bit (MT76_SCANNING , &dev->mt76.state); -mt7603_beacon_set_timer (dev,-1 , dev->mt76.beacon_int); } static void
Signature · 1 line
2.20.1
Lorenzo Bianconi
maintainerPATCH v3 3/3 mt76: do not enable/disable pre_tbtt_tasklet in scan_start/scan_complete
In reply to Lorenzo BianconiDo not enable/disable pre_tbtt_tasklet tasklet in mt76x02_sw_scan/mt76x02_sw_scan_complete since it is already done setting the operating channel. Do run tbtt_tasklet while the device is offchannel
--- drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c | 3 +++ drivers/net/wireless/mediatek/mt76/mt76x02_usb_core.c | 3 +++ drivers/net/wireless/mediatek/mt76/mt76x02_util.c | 5 ----- 3 files changed, 6 insertions(+), 5 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c +3 -0
@@ -30,6 +30,9 @@ static void mt76x02_pre_tbtt_tasklet(unsigned long arg)struct sk_buff *skb;int i; +if (mt76_hw (dev)->conf.flags &IEEE80211_CONF_OFFCHANNEL ) +return ; +mt76x02_resync_beacon_timer (dev); ieee80211_iterate_active_interfaces_atomic(mt76_hw(dev),
drivers/net/wireless/mediatek/mt76/mt76x02_usb_core.c +3 -0
@@ -178,6 +178,9 @@ static void mt76x02u_pre_tbtt_work(struct work_struct *work)if (!dev->mt76.beacon_mask)return ; +if (mt76_hw (dev)->conf.flags &IEEE80211_CONF_OFFCHANNEL ) +return ; +mt76x02_resync_beacon_timer (dev); ieee80211_iterate_active_interfaces(mt76_hw(dev),
drivers/net/wireless/mediatek/mt76/mt76x02_util.c +0 -5
@@ -593,8 +593,6 @@ void mt76x02_sw_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif, {struct mt76x02_dev *dev = hw->priv; -if (mt76_is_mmio (dev)) -tasklet_disable (&dev->mt76.pre_tbtt_tasklet);set_bit (MT76_SCANNING , &dev->mt76.state); }EXPORT_SYMBOL_GPL (mt76x02_sw_scan);
@@ -605,9 +603,6 @@ void mt76x02_sw_scan_complete(struct ieee80211_hw *hw,struct mt76x02_dev *dev = hw->priv;clear_bit (MT76_SCANNING , &dev->mt76.state); -if (mt76_is_mmio (dev)) -tasklet_enable (&dev->mt76.pre_tbtt_tasklet); -if (dev->cal.gain_init_done) {/* Restore AGC gain and resume calibration after scanning. */ dev->cal.low_gain =-1 ;
Signature · 1 line
2.20.1