enable AP support in mt76x0e driver
Subsystems (2)
cover enable AP support in mt76x0e driver
Add beacon transmission/management support to mt76x0 driver. Add missing mac80211 callbacks to mt76x0e driver in order to enable AP support
Lorenzo Bianconi (9):
mt76: move mt76x02_init_device in mt76x02-lib module
mt76: move mac beacon routines in mt76x02-lib module
mt76: move tx beacon routines in mt76x02-lib module
mt76x0: pci: add pre_tbtt_tasklet support
mt76: move mt76x02_sw_scan and mt76x02_sw_scan_complete in mt76x02-lib
module
mt76: move mt76x02_get_txpower in mt76x02_util.c
mt76: move mt76x02_sta_ps in mt76x02-lib module
mt76: introduce mt76x02_init_beacon_config routine
mt76x0: pci: enable AP support
.../wireless/mediatek/mt76/mt76x0/eeprom.c | 2 - .../net/wireless/mediatek/mt76/mt76x0/init.c | 44 +---- .../net/wireless/mediatek/mt76/mt76x0/mac.c | 20 --- .../net/wireless/mediatek/mt76/mt76x0/main.c | 52 ++---- .../wireless/mediatek/mt76/mt76x0/mt76x0.h | 5 - .../net/wireless/mediatek/mt76/mt76x0/pci.c | 24 ++- .../net/wireless/mediatek/mt76/mt76x0/usb.c | 5 +- drivers/net/wireless/mediatek/mt76/mt76x02.h | 10 +- .../net/wireless/mediatek/mt76/mt76x02_mac.c | 123 +++++++++++++ .../net/wireless/mediatek/mt76/mt76x02_mac.h | 6 + .../net/wireless/mediatek/mt76/mt76x02_mmio.c | 127 ++++++++++++++ .../net/wireless/mediatek/mt76/mt76x02_util.c | 163 +++++++++++++++++- .../wireless/mediatek/mt76/mt76x2/Makefile | 4 +- .../net/wireless/mediatek/mt76/mt76x2/init.c | 34 ---- .../net/wireless/mediatek/mt76/mt76x2/mac.h | 5 - .../wireless/mediatek/mt76/mt76x2/mt76x2.h | 5 - .../wireless/mediatek/mt76/mt76x2/pci_init.c | 65 +------ .../wireless/mediatek/mt76/mt76x2/pci_mac.c | 118 ------------- .../wireless/mediatek/mt76/mt76x2/pci_main.c | 55 +----- .../wireless/mediatek/mt76/mt76x2/pci_tx.c | 142 --------------- .../wireless/mediatek/mt76/mt76x2/usb_init.c | 5 +- .../wireless/mediatek/mt76/mt76x2/usb_main.c | 22 +-- 22 files changed, 487 insertions(+), 549 deletions(-) delete mode 100644 drivers/net/wireless/mediatek/mt76/mt76x2/pci_tx.c
Signature · 1 line
2.19.0
RFC 1/9 mt76: move mt76x02_init_device in mt76x02-lib module
Move mt76x02_init_device routine in mt76x02_util.c in order to be reused by mt76x0 driver and remove duplicated code. Move interface combo definition supported by the driver in mt76x02_init_device routine
--- .../wireless/mediatek/mt76/mt76x0/eeprom.c | 2 - .../net/wireless/mediatek/mt76/mt76x0/init.c | 36 +-------- drivers/net/wireless/mediatek/mt76/mt76x02.h | 1 + .../net/wireless/mediatek/mt76/mt76x02_util.c | 81 +++++++++++++++++++ .../net/wireless/mediatek/mt76/mt76x2/init.c | 34 -------- .../wireless/mediatek/mt76/mt76x2/mt76x2.h | 1 - .../wireless/mediatek/mt76/mt76x2/pci_init.c | 41 +--------- .../wireless/mediatek/mt76/mt76x2/usb_init.c | 5 +- 8 files changed, 87 insertions(+), 114 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76x0/eeprom.c +0 -2
@@ -340,8 +340,6 @@ int mt76x0_eeprom_init(struct mt76x02_dev *dev)mt76x0_set_freq_offset (dev);mt76x0_set_temp_offset (dev); - dev->mt76.chainmask =0x0101 ; -return 0 ; }
drivers/net/wireless/mediatek/mt76/mt76x0/init.c +3 -33
@@ -339,46 +339,16 @@ EXPORT_SYMBOL_GPL(mt76x0_alloc_device);int mt76x0_register_device (struct mt76x02_dev *dev) { -struct mt76_dev *mdev = &dev->mt76; -struct ieee80211_hw *hw = mdev->hw; -struct wiphy *wiphy = hw->wiphy;int ret; -/* Reserve WCID 0 for mcast - thanks to this APs WCID will go to -* entry no. 1 like it does in the vendor driver. -*/ - mdev->wcid_mask[0 ] |=1 ; - -/* init fake wcid for monitor interfaces */ - mdev->global_wcid.idx =0xff ; - mdev->global_wcid.hw_key_idx =-1 ; - -/* init antenna configuration */ - mdev->antenna_mask =1 ; - - hw->queues =4 ; - hw->max_rates =1 ; - hw->max_report_rates =7 ; - hw->max_rate_tries =1 ; - hw->extra_tx_headroom =2 ; -if (mt76_is_usb (dev)) - hw->extra_tx_headroom +=sizeof (struct mt76x02_txwi ) + -MT_DMA_HDR_LEN ; - - hw->sta_data_size =sizeof (struct mt76x02_sta ); - hw->vif_data_size =sizeof (struct mt76x02_vif ); - - wiphy->interface_modes =BIT (NL80211_IFTYPE_STATION ); - -INIT_DELAYED_WORK (&dev->mac_work, mt76x02_mac_work); - - ret =mt76_register_device (mdev, true, mt76x02_rates, +mt76x02_init_device (dev); + ret =mt76_register_device (&dev->mt76, true, mt76x02_rates,ARRAY_SIZE (mt76x02_rates));if (ret)return ret;/* overwrite unsupported features */ -if (mdev->cap.has_5ghz) +if (dev->mt76.cap.has_5ghz)mt76x0_vht_cap_mask (&dev->mt76.sband_5g.sband);mt76x02_init_debugfs (dev);
drivers/net/wireless/mediatek/mt76/mt76x02.h +1 -0
@@ -102,6 +102,7 @@ struct mt76x02_dev {extern struct ieee80211_rate mt76x02_rates[12 ]; +void mt76x02_init_device (struct mt76x02_dev *dev);void mt76x02_configure_filter (struct ieee80211_hw *hw,unsigned int changed_flags,unsigned int *total_flags,u64 multicast);
drivers/net/wireless/mediatek/mt76/mt76x02_util.c +81 -0
87 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt76x2/init.c +0 -34
@@ -158,40 +158,6 @@ void mt76_write_mac_initvals(struct mt76x02_dev *dev) }EXPORT_SYMBOL_GPL (mt76_write_mac_initvals); -void mt76x2_init_device (struct mt76x02_dev *dev) -{ -struct ieee80211_hw *hw =mt76_hw (dev); - -INIT_DELAYED_WORK (&dev->mac_work, mt76x02_mac_work); - - hw->queues =4 ; - hw->max_rates =1 ; - hw->max_report_rates =7 ; - hw->max_rate_tries =1 ; - hw->extra_tx_headroom =2 ; -if (mt76_is_usb (dev)) - hw->extra_tx_headroom +=sizeof (struct mt76x02_txwi ) + -MT_DMA_HDR_LEN ; - - hw->sta_data_size =sizeof (struct mt76x02_sta ); - hw->vif_data_size =sizeof (struct mt76x02_vif ); - -ieee80211_hw_set (hw,SUPPORTS_HT_CCK_RATES ); -ieee80211_hw_set (hw,SUPPORTS_REORDERING_BUFFER ); - - dev->mt76.sband_2g.sband.ht_cap.cap |=IEEE80211_HT_CAP_LDPC_CODING ; - dev->mt76.sband_5g.sband.ht_cap.cap |=IEEE80211_HT_CAP_LDPC_CODING ; - - dev->mt76.chainmask =0x202 ; - dev->mt76.global_wcid.idx =255 ; - dev->mt76.global_wcid.hw_key_idx =-1 ; - dev->slottime =9 ; - -/* init antenna configuration */ - dev->mt76.antenna_mask =3 ; -} -EXPORT_SYMBOL_GPL (mt76x2_init_device); -void mt76x2_init_txpower (struct mt76x02_dev *dev,struct ieee80211_supported_band *sband) {
drivers/net/wireless/mediatek/mt76/mt76x2/mt76x2.h +0 -1
@@ -52,7 +52,6 @@ extern const struct ieee80211_ops mt76x2_ops;struct mt76x02_dev *mt76x2_alloc_device (struct device *pdev);int mt76x2_register_device (struct mt76x02_dev *dev); -void mt76x2_init_device (struct mt76x02_dev *dev);void mt76x2_phy_power_on (struct mt76x02_dev *dev);int mt76x2_init_hardware (struct mt76x02_dev *dev);
drivers/net/wireless/mediatek/mt76/mt76x2/pci_init.c +1 -40
61 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt76x2/usb_init.c +1 -4
@@ -245,11 +245,10 @@ int mt76x2u_init_hardware(struct mt76x02_dev *dev)int mt76x2u_register_device (struct mt76x02_dev *dev) {struct ieee80211_hw *hw =mt76_hw (dev); -struct wiphy *wiphy = hw->wiphy;int err;INIT_DELAYED_WORK (&dev->cal_work, mt76x2u_phy_calibrate); -mt76x2_init_device (dev); +mt76x02_init_device (dev); err =mt76x2u_init_eeprom (dev);if (err <0 )
@@ -267,8 +266,6 @@ int mt76x2u_register_device(struct mt76x02_dev *dev)if (err <0 ) goto fail; - wiphy->interface_modes =BIT (NL80211_IFTYPE_STATION ); - err =mt76_register_device (&dev->mt76, true, mt76x02_rates,ARRAY_SIZE (mt76x02_rates));if (err)
Signature · 1 line
2.19.0
RFC 2/9 mt76: move mac beacon routines in mt76x02-lib module
In reply to Lorenzo BianconiMove mt76x02_beacon mac routines in mt76x02_mac.c in order to be reused by mt76x0 driver adding AP support
--- .../net/wireless/mediatek/mt76/mt76x02_mac.c | 123 ++++++++++++++++++ .../net/wireless/mediatek/mt76/mt76x02_mac.h | 6 + .../net/wireless/mediatek/mt76/mt76x2/mac.h | 5 - .../wireless/mediatek/mt76/mt76x2/pci_init.c | 4 +- .../wireless/mediatek/mt76/mt76x2/pci_mac.c | 118 ----------------- .../wireless/mediatek/mt76/mt76x2/pci_main.c | 6 +- .../wireless/mediatek/mt76/mt76x2/pci_tx.c | 2 +- 7 files changed, 135 insertions(+), 129 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76x02_mac.c +123 -0
@@ -791,3 +791,126 @@ void mt76x02_mac_work(struct work_struct *work) MT_CALIBRATE_INTERVAL); }EXPORT_SYMBOL_GPL (mt76x02_mac_work); + +void mt76x02_mac_set_bssid (struct mt76x02_dev *dev,u8 idx,const u8 *addr) +{ + idx &=7 ; +mt76_wr (dev,MT_MAC_APC_BSSID_L (idx),get_unaligned_le32 (addr)); +mt76_rmw_field (dev,MT_MAC_APC_BSSID_H (idx),MT_MAC_APC_BSSID_H_ADDR , +get_unaligned_le16 (addr +4 )); +} +EXPORT_SYMBOL_GPL (mt76x02_mac_set_bssid); + +static int +mt76x02_write_beacon (struct mt76x02_dev *dev,int offset,struct sk_buff *skb) +{ +int beacon_len = mt76x02_beacon_offsets[1 ] - mt76x02_beacon_offsets[0 ]; +struct mt76x02_txwi txwi; + +if (WARN_ON_ONCE (beacon_len < skb->len +sizeof (struct mt76x02_txwi ))) +return -ENOSPC ; + +mt76x02_mac_write_txwi (dev, &txwi, skb,NULL ,NULL , skb->len); + +mt76_wr_copy (dev, offset, &txwi,sizeof (txwi)); + offset +=sizeof (txwi); + +mt76_wr_copy (dev, offset, skb->data, skb->len); +return 0 ; +} + +static int +__mt76x02_mac_set_beacon (struct mt76x02_dev *dev,u8 bcn_idx, +struct sk_buff *skb) +{ +int beacon_len = mt76x02_beacon_offsets[1 ] - mt76x02_beacon_offsets[0 ]; +int beacon_addr = mt76x02_beacon_offsets[bcn_idx]; +int ret =0 ; +int i; + +/* Prevent corrupt transmissions during update */ +mt76_set (dev,MT_BCN_BYPASS_MASK ,BIT (bcn_idx)); + +if (skb) { + ret =mt76x02_write_beacon (dev, beacon_addr, skb); +if (!ret) + dev->beacon_data_mask |=BIT (bcn_idx); + }else { + dev->beacon_data_mask &= ~BIT (bcn_idx); +for (i =0 ; i < beacon_len; i +=4 ) +mt76_wr (dev, beacon_addr + i,0 ); + } + +mt76_wr (dev,MT_BCN_BYPASS_MASK ,0xff00 | ~dev->beacon_data_mask); + +return ret; +} + +int mt76x02_mac_set_beacon (struct mt76x02_dev *dev,u8 vif_idx, +struct sk_buff *skb) +{ +bool force_update = false; +int bcn_idx =0 ; +int i; + +for (i =0 ; i <ARRAY_SIZE (dev->beacons); i++) { +if (vif_idx == i) { + force_update = !!dev->beacons[i] ^ !!skb; + +if (dev->beacons[i]) +dev_kfree_skb (dev->beacons[i]); + + dev->beacons[i] = skb; +__mt76x02_mac_set_beacon (dev, bcn_idx, skb); + }else if (force_update && dev->beacons[i]) { +__mt76x02_mac_set_beacon (dev, bcn_idx, + dev->beacons[i]); + } + + bcn_idx += !!dev->beacons[i]; + } + +for (i = bcn_idx; i <ARRAY_SIZE (dev->beacons); i++) { +if (!(dev->beacon_data_mask &BIT (i))) +break ; + +__mt76x02_mac_set_beacon (dev, i,NULL ); + } + +mt76_rmw_field (dev,MT_MAC_BSSID_DW1 ,MT_MAC_BSSID_DW1_MBEACON_N , + bcn_idx -1 ); +return 0 ; +} +EXPORT_SYMBOL_GPL (mt76x02_mac_set_beacon); + +void mt76x02_mac_set_beacon_enable (struct mt76x02_dev *dev, +u8 vif_idx,bool val) +{ +u8 old_mask = dev->beacon_mask; +bool en; +u32 reg; + +if (val) { + dev->beacon_mask |=BIT (vif_idx); + }else { + dev->beacon_mask &= ~BIT (vif_idx); +mt76x02_mac_set_beacon (dev, vif_idx,NULL ); + } + +if (!!old_mask == !!dev->beacon_mask) +return ; + + en = dev->beacon_mask; + +mt76_rmw_field (dev,MT_INT_TIMER_EN ,MT_INT_TIMER_EN_PRE_TBTT_EN , en); + reg =MT_BEACON_TIME_CFG_BEACON_TX | +MT_BEACON_TIME_CFG_TBTT_EN | +MT_BEACON_TIME_CFG_TIMER_EN ; +mt76_rmw (dev,MT_BEACON_TIME_CFG , reg, reg * en); + +if (en) +mt76x02_irq_enable (dev,MT_INT_PRE_TBTT |MT_INT_TBTT ); +else +mt76x02_irq_disable (dev,MT_INT_PRE_TBTT |MT_INT_TBTT ); +} +EXPORT_SYMBOL_GPL (mt76x02_mac_set_beacon_enable);
drivers/net/wireless/mediatek/mt76/mt76x02_mac.h +6 -0
@@ -228,4 +228,10 @@ void mt76x02_tx_complete_skb(struct mt76_dev *mdev, struct mt76_queue *q, struct mt76_queue_entry *e, bool flush);void mt76x02_update_channel (struct mt76_dev *mdev);void mt76x02_mac_work (struct work_struct *work); + +void mt76x02_mac_set_bssid (struct mt76x02_dev *dev,u8 idx,const u8 *addr); +int mt76x02_mac_set_beacon (struct mt76x02_dev *dev,u8 vif_idx, +struct sk_buff *skb); +void mt76x02_mac_set_beacon_enable (struct mt76x02_dev *dev,u8 vif_idx, +bool val);#endif
drivers/net/wireless/mediatek/mt76/mt76x2/mac.h +0 -5
@@ -26,10 +26,5 @@ struct mt76x02_vif;int mt76x2_mac_start (struct mt76x02_dev *dev);void mt76x2_mac_stop (struct mt76x02_dev *dev,bool force);void mt76x2_mac_resume (struct mt76x02_dev *dev); -void mt76x2_mac_set_bssid (struct mt76x02_dev *dev,u8 idx,const u8 *addr); - -int mt76x2_mac_set_beacon (struct mt76x02_dev *dev,u8 vif_idx, -struct sk_buff *skb); -void mt76x2_mac_set_beacon_enable (struct mt76x02_dev *dev,u8 vif_idx,bool val);#endif
drivers/net/wireless/mediatek/mt76/mt76x2/pci_init.c +2 -2
@@ -153,8 +153,8 @@ static int mt76x2_mac_reset(struct mt76x02_dev *dev, bool hard)mt76x02_mac_shared_key_setup (dev, i, k,NULL );for (i =0 ; i <8 ; i++) { -mt76x2_mac_set_bssid (dev, i, null_addr); -mt76x2_mac_set_beacon (dev, i,NULL ); +mt76x02_mac_set_bssid (dev, i, null_addr); +mt76x02_mac_set_beacon (dev, i,NULL ); }for (i =0 ; i <16 ; i++)
drivers/net/wireless/mediatek/mt76/mt76x2/pci_mac.c +0 -118
124 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt76x2/pci_main.c +3 -3
@@ -137,7 +137,7 @@ mt76x2_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif,mutex_lock (&dev->mt76.mutex);if (changed &BSS_CHANGED_BSSID ) -mt76x2_mac_set_bssid (dev, mvif->idx, info->bssid); +mt76x02_mac_set_bssid (dev, mvif->idx, info->bssid);if (changed &BSS_CHANGED_BEACON_INT ) { mt76_rmw_field(dev, MT_BEACON_TIME_CFG,
@@ -149,8 +149,8 @@ mt76x2_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif,if (changed &BSS_CHANGED_BEACON_ENABLED ) {tasklet_disable (&dev->pre_tbtt_tasklet); -mt76x2_mac_set_beacon_enable (dev, mvif->idx, - info->enable_beacon); +mt76x02_mac_set_beacon_enable (dev, mvif->idx, + info->enable_beacon);tasklet_enable (&dev->pre_tbtt_tasklet); }
drivers/net/wireless/mediatek/mt76/mt76x2/pci_tx.c +1 -1
@@ -36,7 +36,7 @@ mt76x2_update_beacon_iter(void *priv, u8 *mac, struct ieee80211_vif *vif)if (!skb)return ; -mt76x2_mac_set_beacon (dev, mvif->idx, skb); +mt76x02_mac_set_beacon (dev, mvif->idx, skb); } static void
Signature · 1 line
2.19.0
RFC 3/9 mt76: move tx beacon routines in mt76x02-lib module
In reply to Lorenzo BianconiMove mt76x02_tx beacon utility routines in mt76x02_mmio.c in order to be reused by mt76x0 driver adding AP support
--- drivers/net/wireless/mediatek/mt76/mt76x02.h | 2 + .../net/wireless/mediatek/mt76/mt76x02_mmio.c | 125 +++++++++++++++ .../wireless/mediatek/mt76/mt76x2/Makefile | 4 +- .../wireless/mediatek/mt76/mt76x2/mt76x2.h | 2 - .../wireless/mediatek/mt76/mt76x2/pci_init.c | 2 +- .../wireless/mediatek/mt76/mt76x2/pci_tx.c | 142 ------------------ 6 files changed, 130 insertions(+), 147 deletions(-) delete mode 100644 drivers/net/wireless/mediatek/mt76/mt76x2/pci_tx.c
drivers/net/wireless/mediatek/mt76/mt76x02.h +2 -0
@@ -148,6 +148,8 @@ int mt76x02_tx_prepare_skb(struct mt76_dev *mdev, void *txwi, struct mt76_wcid *wcid, struct ieee80211_sta *sta, u32 *tx_info); +void mt76x02_pre_tbtt_tasklet (unsigned long arg); +extern const u16 mt76x02_beacon_offsets[16 ];void mt76x02_set_beacon_offsets (struct mt76x02_dev *dev);void mt76x02_set_irq_mask (struct mt76x02_dev *dev,u32 clear,u32 set);
drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c +125 -0
131 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt76x2/Makefile +2 -2
@@ -6,8 +6,8 @@ mt76x2-common-y := \ eeprom.o mac.o init.o phy.o mcu.o mt76x2e-y := \ - pci.o pci_main.o pci_init.o pci_tx.o \ - pci_mac.o pci_mcu.o pci_phy.o pci_dfs.o + pci.o pci_main.o pci_init.o pci_mac.o \ + pci_mcu.o pci_phy.o pci_dfs.o mt76x2u-y := \ usb.o usb_init.o usb_main.o usb_mac.o usb_mcu.o \
drivers/net/wireless/mediatek/mt76/mt76x2/mt76x2.h +0 -2
@@ -77,8 +77,6 @@ void mt76x2_cleanup(struct mt76x02_dev *dev);void mt76x2_mac_set_tx_protection (struct mt76x02_dev *dev,u32 val); -void mt76x2_pre_tbtt_tasklet (unsigned long arg); -void mt76x2_sta_ps (struct mt76_dev *dev,struct ieee80211_sta *sta,bool ps);void mt76x2_reset_wlan (struct mt76x02_dev *dev,bool enable);
drivers/net/wireless/mediatek/mt76/mt76x2/pci_init.c +1 -1
@@ -298,7 +298,7 @@ int mt76x2_init_hardware(struct mt76x02_dev *dev) {int ret; -tasklet_init (&dev->pre_tbtt_tasklet, mt76x2_pre_tbtt_tasklet, +tasklet_init (&dev->pre_tbtt_tasklet, mt76x02_pre_tbtt_tasklet, (unsigned long ) dev);mt76x02_dma_disable (dev);
drivers/net/wireless/mediatek/mt76/mt76x2/pci_tx.c deleted +0 -142
142 lines not on this page · raw message
Signature · 1 line
2.19.0
RFC 4/9 mt76x0: pci: add pre_tbtt_tasklet support
In reply to Lorenzo BianconiEnable/disable pre_tbtt_tasklet in mt76x0 driver in order to add AP support
--- drivers/net/wireless/mediatek/mt76/mt76x0/main.c | 2 ++ drivers/net/wireless/mediatek/mt76/mt76x0/pci.c | 1 + drivers/net/wireless/mediatek/mt76/mt76x02.h | 2 -- drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c | 6 ++++-- drivers/net/wireless/mediatek/mt76/mt76x2/pci_init.c | 3 --- 5 files changed, 7 insertions(+), 7 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76x0/main.c +2 -0
@@ -22,6 +22,7 @@ mt76x0_set_channel(struct mt76x02_dev *dev, struct cfg80211_chan_def *chandef)int ret;cancel_delayed_work_sync (&dev->cal_work); +tasklet_disable (&dev->pre_tbtt_tasklet);mt76_set_channel (&dev->mt76); ret =mt76x0_phy_set_channel (dev, chandef);
@@ -30,6 +31,7 @@ mt76x0_set_channel(struct mt76x02_dev *dev, struct cfg80211_chan_def *chandef)mt76_rr (dev,MT_CH_IDLE );mt76_rr (dev,MT_CH_BUSY ); +tasklet_enable (&dev->pre_tbtt_tasklet);mt76_txq_schedule_all (&dev->mt76);return ret;
drivers/net/wireless/mediatek/mt76/mt76x0/pci.c +1 -0
@@ -187,6 +187,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);mt76x0_chip_onoff (dev, false, false);mt76x0e_stop_hw (dev);mt76x02_dma_cleanup (dev);
drivers/net/wireless/mediatek/mt76/mt76x02.h +0 -2
@@ -148,8 +148,6 @@ int mt76x02_tx_prepare_skb(struct mt76_dev *mdev, void *txwi, struct mt76_wcid *wcid, struct ieee80211_sta *sta, u32 *tx_info); -void mt76x02_pre_tbtt_tasklet (unsigned long arg); -extern const u16 mt76x02_beacon_offsets[16 ];void mt76x02_set_beacon_offsets (struct mt76x02_dev *dev);void mt76x02_set_irq_mask (struct mt76x02_dev *dev,u32 clear,u32 set);
drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c +4 -2
@@ -99,7 +99,7 @@ mt76x02_resync_beacon_timer(struct mt76x02_dev *dev) MT_BEACON_TIME_CFG_INTVAL, timer_val); } -void mt76x02_pre_tbtt_tasklet (unsigned long arg) +static void mt76x02_pre_tbtt_tasklet (unsigned long arg) {struct mt76x02_dev *dev = (struct mt76x02_dev *) arg;struct mt76_queue *q = &dev->mt76.q_tx[MT_TXQ_PSD ];
@@ -144,7 +144,6 @@ void mt76x02_pre_tbtt_tasklet(unsigned long arg) }spin_unlock_bh (&q->lock); } -EXPORT_SYMBOL_GPL (mt76x02_pre_tbtt_tasklet); static int mt76x02_init_tx_queue(struct mt76x02_dev *dev, struct mt76_queue *q,
@@ -223,6 +222,9 @@ int mt76x02_dma_init(struct mt76x02_dev *dev)return -ENOMEM ;tasklet_init (&dev->tx_tasklet, mt76x02_tx_tasklet, (unsigned long ) dev); +tasklet_init (&dev->pre_tbtt_tasklet, mt76x02_pre_tbtt_tasklet, + (unsigned long ) dev); +kfifo_init (&dev->txstatus_fifo, status_fifo, fifo_size);mt76_dma_attach (&dev->mt76);
drivers/net/wireless/mediatek/mt76/mt76x2/pci_init.c +0 -3
@@ -298,9 +298,6 @@ int mt76x2_init_hardware(struct mt76x02_dev *dev) {int ret; -tasklet_init (&dev->pre_tbtt_tasklet, mt76x02_pre_tbtt_tasklet, - (unsigned long ) dev); -mt76x02_dma_disable (dev);mt76x2_reset_wlan (dev, true);mt76x2_power_on (dev);
Signature · 1 line
2.19.0
Re: [RFC 4/9] mt76x0: pci: add pre_tbtt_tasklet support
Quoted 2 lines · Lorenzo Bianconi
Enable/disable
pre_tbtt_taskletin mt76x0 driver in order to add AP support
Is there some USB limitation that disallow tho do this for USB as well? Or perhaps this is easer for now do this for PCI devices and add AP support for USB later? But perhaps, since you adding support for AP you could do this for both buses.
Thanks
Stanislaw
Re: [RFC 4/9] mt76x0: pci: add pre_tbtt_tasklet support
Quoted 8 lines · Lorenzo Bianconi
Quoted 2 lines
Enable/disable
pre_tbtt_taskletin mt76x0 driver in order to add AP supportIs there some USB limitation that disallow tho do this for USB as well? Or perhaps this is easer for now do this for PCI devices and add AP support for USB later? But perhaps, since you adding support for AP you could do this for both buses.
AFAIK usb devices do not have TBTT interrupts so I think we can use a timer to load beacon frames into the device. Anyway I guess pre_tbtt_tasklet tasklet is something mmio specific.
Regards,
Lorenzo
Quoted 3 lines
Thanks
Stanislaw
RFC 5/9 mt76: move mt76x02_sw_scan and mt76x02_sw_scan_complete in mt76x02-lib module
In reply to Lorenzo BianconiMove mt76x02_sw_scan and mt76x02_sw_scan_complete utility routines in mt76x02_util.c in order to be reused by mt76x0 and mt76x2u drivers and remove duplicated code
--- .../net/wireless/mediatek/mt76/mt76x0/main.c | 18 --------------- .../wireless/mediatek/mt76/mt76x0/mt76x0.h | 4 ---- .../net/wireless/mediatek/mt76/mt76x0/pci.c | 4 ++-- .../net/wireless/mediatek/mt76/mt76x0/usb.c | 4 ++-- drivers/net/wireless/mediatek/mt76/mt76x02.h | 4 ++++ .../net/wireless/mediatek/mt76/mt76x02_util.c | 22 ++++++++++++++++++ .../wireless/mediatek/mt76/mt76x2/pci_main.c | 23 ++----------------- .../wireless/mediatek/mt76/mt76x2/usb_main.c | 21 ++--------------- 8 files changed, 34 insertions(+), 66 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76x0/main.c +0 -18
@@ -127,24 +127,6 @@ void mt76x0_bss_info_changed(struct ieee80211_hw *hw, }EXPORT_SYMBOL_GPL (mt76x0_bss_info_changed); -void mt76x0_sw_scan (struct ieee80211_hw *hw,struct ieee80211_vif *vif, -const u8 *mac_addr) -{ -struct mt76x02_dev *dev = hw->priv; - -set_bit (MT76_SCANNING , &dev->mt76.state); -} -EXPORT_SYMBOL_GPL (mt76x0_sw_scan); - -void mt76x0_sw_scan_complete (struct ieee80211_hw *hw, -struct ieee80211_vif *vif) -{ -struct mt76x02_dev *dev = hw->priv; - -clear_bit (MT76_SCANNING , &dev->mt76.state); -} -EXPORT_SYMBOL_GPL (mt76x0_sw_scan_complete); -int mt76x0_set_rts_threshold (struct ieee80211_hw *hw,u32 value) {struct mt76x02_dev *dev = hw->priv;
drivers/net/wireless/mediatek/mt76/mt76x0/mt76x0.h +0 -4
@@ -53,10 +53,6 @@ int mt76x0_config(struct ieee80211_hw *hw, u32 changed);void mt76x0_bss_info_changed (struct ieee80211_hw *hw,struct ieee80211_vif *vif,struct ieee80211_bss_conf *info,u32 changed); -void mt76x0_sw_scan (struct ieee80211_hw *hw,struct ieee80211_vif *vif, -const u8 *mac_addr); -void mt76x0_sw_scan_complete (struct ieee80211_hw *hw, -struct ieee80211_vif *vif);int mt76x0_set_rts_threshold (struct ieee80211_hw *hw,u32 value);/* PHY */
drivers/net/wireless/mediatek/mt76/mt76x0/pci.c +2 -2
@@ -80,8 +80,8 @@ static const struct ieee80211_ops mt76x0e_ops = { .sta_remove = mt76x02_sta_remove, .set_key = mt76x02_set_key, .conf_tx = mt76x02_conf_tx, - .sw_scan_start = mt76x0_sw_scan, - .sw_scan_complete = mt76x0_sw_scan_complete, + .sw_scan_start = mt76x02_sw_scan, + .sw_scan_complete = mt76x02_sw_scan_complete, .ampdu_action = mt76x02_ampdu_action, .sta_rate_tbl_update = mt76x02_sta_rate_tbl_update, .wake_tx_queue = mt76_wake_tx_queue,
drivers/net/wireless/mediatek/mt76/mt76x0/usb.c +2 -2
@@ -151,8 +151,8 @@ static const struct ieee80211_ops mt76x0u_ops = { .sta_remove = mt76x02_sta_remove, .set_key = mt76x02_set_key, .conf_tx = mt76x02_conf_tx, - .sw_scan_start = mt76x0_sw_scan, - .sw_scan_complete = mt76x0_sw_scan_complete, + .sw_scan_start = mt76x02_sw_scan, + .sw_scan_complete = mt76x02_sw_scan_complete, .ampdu_action = mt76x02_ampdu_action, .sta_rate_tbl_update = mt76x02_sta_rate_tbl_update, .set_rts_threshold = mt76x0_set_rts_threshold,
drivers/net/wireless/mediatek/mt76/mt76x02.h +4 -0
@@ -147,6 +147,10 @@ int mt76x02_tx_prepare_skb(struct mt76_dev *mdev, void *txwi, struct sk_buff *skb, struct mt76_queue *q, struct mt76_wcid *wcid, struct ieee80211_sta *sta, u32 *tx_info); +void mt76x02_sw_scan (struct ieee80211_hw *hw,struct ieee80211_vif *vif, +const u8 *mac); +void mt76x02_sw_scan_complete (struct ieee80211_hw *hw, +struct ieee80211_vif *vif);extern const u16 mt76x02_beacon_offsets[16 ];void mt76x02_set_beacon_offsets (struct mt76x02_dev *dev);
drivers/net/wireless/mediatek/mt76/mt76x02_util.c +22 -0
@@ -486,6 +486,28 @@ void mt76x02_remove_hdr_pad(struct sk_buff *skb, int len) }EXPORT_SYMBOL_GPL (mt76x02_remove_hdr_pad); +void mt76x02_sw_scan (struct ieee80211_hw *hw,struct ieee80211_vif *vif, +const u8 *mac) +{ +struct mt76x02_dev *dev = hw->priv; + +if (mt76_is_mmio (dev)) +tasklet_disable (&dev->pre_tbtt_tasklet); +set_bit (MT76_SCANNING , &dev->mt76.state); +} +EXPORT_SYMBOL_GPL (mt76x02_sw_scan); + +void mt76x02_sw_scan_complete (struct ieee80211_hw *hw, +struct ieee80211_vif *vif) +{ +struct mt76x02_dev *dev = hw->priv; + +clear_bit (MT76_SCANNING , &dev->mt76.state); +if (mt76_is_mmio (dev)) +tasklet_enable (&dev->pre_tbtt_tasklet); +} +EXPORT_SYMBOL_GPL (mt76x02_sw_scan_complete); +const u16 mt76x02_beacon_offsets[16 ] = {/* 1024 byte per beacon */ 0xc000 ,
drivers/net/wireless/mediatek/mt76/mt76x2/pci_main.c +2 -21
@@ -175,25 +175,6 @@ mt76x2_sta_ps(struct mt76_dev *mdev, struct ieee80211_sta *sta, bool ps)mt76x02_mac_wcid_set_drop (dev, idx, ps); } -static void -mt76x2_sw_scan (struct ieee80211_hw *hw,struct ieee80211_vif *vif, -const u8 *mac) -{ -struct mt76x02_dev *dev = hw->priv; - -tasklet_disable (&dev->pre_tbtt_tasklet); -set_bit (MT76_SCANNING , &dev->mt76.state); -} - -static void -mt76x2_sw_scan_complete (struct ieee80211_hw *hw,struct ieee80211_vif *vif) -{ -struct mt76x02_dev *dev = hw->priv; - -clear_bit (MT76_SCANNING , &dev->mt76.state); -tasklet_enable (&dev->pre_tbtt_tasklet); -} -static void mt76x2_flush (struct ieee80211_hw *hw,struct ieee80211_vif *vif,u32 queues,bool drop)
@@ -292,8 +273,8 @@ const struct ieee80211_ops mt76x2_ops = { .sta_remove = mt76x02_sta_remove, .set_key = mt76x02_set_key, .conf_tx = mt76x02_conf_tx, - .sw_scan_start = mt76x2_sw_scan, - .sw_scan_complete = mt76x2_sw_scan_complete, + .sw_scan_start = mt76x02_sw_scan, + .sw_scan_complete = mt76x02_sw_scan_complete, .flush = mt76x2_flush, .ampdu_action = mt76x02_ampdu_action, .get_txpower = mt76x2_get_txpower,
drivers/net/wireless/mediatek/mt76/mt76x2/usb_main.c +2 -19
@@ -143,23 +143,6 @@ mt76x2u_config(struct ieee80211_hw *hw, u32 changed)return err; } -static void -mt76x2u_sw_scan (struct ieee80211_hw *hw,struct ieee80211_vif *vif, -const u8 *mac) -{ -struct mt76x02_dev *dev = hw->priv; - -set_bit (MT76_SCANNING , &dev->mt76.state); -} - -static void -mt76x2u_sw_scan_complete (struct ieee80211_hw *hw,struct ieee80211_vif *vif) -{ -struct mt76x02_dev *dev = hw->priv; - -clear_bit (MT76_SCANNING , &dev->mt76.state); -} -const struct ieee80211_ops mt76x2u_ops = { .tx = mt76x02_tx, .start = mt76x2u_start,
@@ -175,7 +158,7 @@ const struct ieee80211_ops mt76x2u_ops = { .bss_info_changed = mt76x2u_bss_info_changed, .configure_filter = mt76x02_configure_filter, .conf_tx = mt76x02_conf_tx, - .sw_scan_start = mt76x2u_sw_scan, - .sw_scan_complete = mt76x2u_sw_scan_complete, + .sw_scan_start = mt76x02_sw_scan, + .sw_scan_complete = mt76x02_sw_scan_complete, .sta_rate_tbl_update = mt76x02_sta_rate_tbl_update, };
Signature · 1 line
2.19.0
RFC 6/9 mt76: move mt76x02_get_txpower in mt76x02_util.c
In reply to Lorenzo BianconiMove mt76x02_get_txpower utility routine in mt76x02-lib module in order to be reused by mt76x0 and mt76x2u drivers
--- .../net/wireless/mediatek/mt76/mt76x0/pci.c | 1 + .../net/wireless/mediatek/mt76/mt76x0/usb.c | 1 + drivers/net/wireless/mediatek/mt76/mt76x02.h | 2 ++ .../net/wireless/mediatek/mt76/mt76x02_util.c | 18 ++++++++++++++++++ .../wireless/mediatek/mt76/mt76x2/pci_main.c | 15 +-------------- .../wireless/mediatek/mt76/mt76x2/usb_main.c | 1 + 6 files changed, 24 insertions(+), 14 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76x0/pci.c +1 -0
@@ -86,6 +86,7 @@ static const struct ieee80211_ops mt76x0e_ops = { .sta_rate_tbl_update = mt76x02_sta_rate_tbl_update, .wake_tx_queue = mt76_wake_tx_queue, .get_survey = mt76_get_survey, + .get_txpower = mt76x02_get_txpower, };static int mt76x0e_register_device (struct mt76x02_dev *dev)
drivers/net/wireless/mediatek/mt76/mt76x0/usb.c +1 -0
@@ -157,6 +157,7 @@ static const struct ieee80211_ops mt76x0u_ops = { .sta_rate_tbl_update = mt76x02_sta_rate_tbl_update, .set_rts_threshold = mt76x0_set_rts_threshold, .wake_tx_queue = mt76_wake_tx_queue, + .get_txpower = mt76x02_get_txpower, };static int mt76x0u_register_device (struct mt76x02_dev *dev)
drivers/net/wireless/mediatek/mt76/mt76x02.h +2 -0
@@ -151,6 +151,8 @@ void mt76x02_sw_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif, const u8 *mac);void mt76x02_sw_scan_complete (struct ieee80211_hw *hw,struct ieee80211_vif *vif); +int mt76x02_get_txpower (struct ieee80211_hw *hw, +struct ieee80211_vif *vif,int *dbm);extern const u16 mt76x02_beacon_offsets[16 ];void mt76x02_set_beacon_offsets (struct mt76x02_dev *dev);
drivers/net/wireless/mediatek/mt76/mt76x02_util.c +18 -0
@@ -508,6 +508,24 @@ void mt76x02_sw_scan_complete(struct ieee80211_hw *hw, }EXPORT_SYMBOL_GPL (mt76x02_sw_scan_complete); +int mt76x02_get_txpower (struct ieee80211_hw *hw, +struct ieee80211_vif *vif,int *dbm) +{ +struct mt76x02_dev *dev = hw->priv; +u8 nstreams = dev->mt76.chainmask &0xf ; + + *dbm = dev->mt76.txpower_cur /2 ; + +/* convert from per-chain power to combined +* output on 2x2 devices +*/ +if (nstreams >1 ) + *dbm +=3 ; + +return 0 ; +} +EXPORT_SYMBOL_GPL (mt76x02_get_txpower); +const u16 mt76x02_beacon_offsets[16 ] = {/* 1024 byte per beacon */ 0xc000 ,
drivers/net/wireless/mediatek/mt76/mt76x2/pci_main.c +1 -14
@@ -181,19 +181,6 @@ mt76x2_flush(struct ieee80211_hw *hw, struct ieee80211_vif *vif, { } -static int -mt76x2_get_txpower (struct ieee80211_hw *hw,struct ieee80211_vif *vif,int *dbm) -{ -struct mt76x02_dev *dev = hw->priv; - - *dbm = dev->mt76.txpower_cur /2 ; - -/* convert from per-chain power to combined output on 2x2 devices */ - *dbm +=3 ; - -return 0 ; -} -static void mt76x2_set_coverage_class (struct ieee80211_hw *hw,s16 coverage_class) {
@@ -277,7 +264,7 @@ const struct ieee80211_ops mt76x2_ops = { .sw_scan_complete = mt76x02_sw_scan_complete, .flush = mt76x2_flush, .ampdu_action = mt76x02_ampdu_action, - .get_txpower = mt76x2_get_txpower, + .get_txpower = mt76x02_get_txpower, .wake_tx_queue = mt76_wake_tx_queue, .sta_rate_tbl_update = mt76x02_sta_rate_tbl_update, .release_buffered_frames = mt76_release_buffered_frames,
drivers/net/wireless/mediatek/mt76/mt76x2/usb_main.c +1 -0
@@ -161,4 +161,5 @@ const struct ieee80211_ops mt76x2u_ops = { .sw_scan_start = mt76x02_sw_scan, .sw_scan_complete = mt76x02_sw_scan_complete, .sta_rate_tbl_update = mt76x02_sta_rate_tbl_update, + .get_txpower = mt76x02_get_txpower, };
Signature · 1 line
2.19.0
RFC 7/9 mt76: move mt76x02_sta_ps in mt76x02-lib module
In reply to Lorenzo BianconiMove mt76x02_sta_ps utility routine in mt76x02_util.c in order to be reused by mt76x0 driver adding AP support
--- drivers/net/wireless/mediatek/mt76/mt76x0/pci.c | 1 + drivers/net/wireless/mediatek/mt76/mt76x02.h | 1 + drivers/net/wireless/mediatek/mt76/mt76x02_util.c | 12 ++++++++++++ drivers/net/wireless/mediatek/mt76/mt76x2/mt76x2.h | 2 -- drivers/net/wireless/mediatek/mt76/mt76x2/pci_init.c | 2 +- drivers/net/wireless/mediatek/mt76/mt76x2/pci_main.c | 11 ----------- 6 files changed, 15 insertions(+), 14 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76x0/pci.c +1 -0
@@ -142,6 +142,7 @@ mt76x0e_probe(struct pci_dev *pdev, const struct pci_device_id *id) .tx_complete_skb = mt76x02_tx_complete_skb, .rx_skb = mt76x02_queue_rx_skb, .rx_poll_complete = mt76x02_rx_poll_complete, + .sta_ps = mt76x02_sta_ps, };struct mt76x02_dev *dev;int ret;
drivers/net/wireless/mediatek/mt76/mt76x02.h +1 -0
@@ -153,6 +153,7 @@ void mt76x02_sw_scan_complete(struct ieee80211_hw *hw, struct ieee80211_vif *vif);int mt76x02_get_txpower (struct ieee80211_hw *hw,struct ieee80211_vif *vif,int *dbm); +void mt76x02_sta_ps (struct mt76_dev *dev,struct ieee80211_sta *sta,bool ps);extern const u16 mt76x02_beacon_offsets[16 ];void mt76x02_set_beacon_offsets (struct mt76x02_dev *dev);
drivers/net/wireless/mediatek/mt76/mt76x02_util.c +12 -0
@@ -526,6 +526,18 @@ int mt76x02_get_txpower(struct ieee80211_hw *hw, }EXPORT_SYMBOL_GPL (mt76x02_get_txpower); +void mt76x02_sta_ps (struct mt76_dev *mdev,struct ieee80211_sta *sta, +bool ps) +{ + struct mt76x02_dev *dev = container_of(mdev, struct mt76x02_dev, mt76); +struct mt76x02_sta *msta = (struct mt76x02_sta *)sta->drv_priv; +int idx = msta->wcid.idx; + +mt76_stop_tx_queues (&dev->mt76, sta, true); +mt76x02_mac_wcid_set_drop (dev, idx, ps); +} +EXPORT_SYMBOL_GPL (mt76x02_sta_ps); +const u16 mt76x02_beacon_offsets[16 ] = {/* 1024 byte per beacon */ 0xc000 ,
drivers/net/wireless/mediatek/mt76/mt76x2/mt76x2.h +0 -2
@@ -77,8 +77,6 @@ void mt76x2_cleanup(struct mt76x02_dev *dev);void mt76x2_mac_set_tx_protection (struct mt76x02_dev *dev,u32 val); -void mt76x2_sta_ps (struct mt76_dev *dev,struct ieee80211_sta *sta,bool ps); -void mt76x2_reset_wlan (struct mt76x02_dev *dev,bool enable);void mt76x2_init_txpower (struct mt76x02_dev *dev,struct ieee80211_supported_band *sband);
drivers/net/wireless/mediatek/mt76/mt76x2/pci_init.c +1 -1
@@ -356,7 +356,7 @@ struct mt76x02_dev *mt76x2_alloc_device(struct device *pdev) .tx_complete_skb = mt76x02_tx_complete_skb, .rx_skb = mt76x02_queue_rx_skb, .rx_poll_complete = mt76x02_rx_poll_complete, - .sta_ps = mt76x2_sta_ps, + .sta_ps = mt76x02_sta_ps, };struct mt76x02_dev *dev;struct mt76_dev *mdev;
drivers/net/wireless/mediatek/mt76/mt76x2/pci_main.c +0 -11
@@ -164,17 +164,6 @@ mt76x2_bss_info_changed(struct ieee80211_hw *hw, struct ieee80211_vif *vif,mutex_unlock (&dev->mt76.mutex); } -void -mt76x2_sta_ps (struct mt76_dev *mdev,struct ieee80211_sta *sta,bool ps) -{ -struct mt76x02_sta *msta = (struct mt76x02_sta *) sta->drv_priv; - struct mt76x02_dev *dev = container_of(mdev, struct mt76x02_dev, mt76); -int idx = msta->wcid.idx; - -mt76_stop_tx_queues (&dev->mt76, sta, true); -mt76x02_mac_wcid_set_drop (dev, idx, ps); -} -static void mt76x2_flush (struct ieee80211_hw *hw,struct ieee80211_vif *vif,u32 queues,bool drop)
Signature · 1 line
2.19.0
RFC 8/9 mt76: introduce mt76x02_init_beacon_config routine
In reply to Lorenzo BianconiAdd mt76x02_init_beacon_config utility routine in mt76x02-lib module in order to be reused by mt76x0 driver configuring BSSID registers and remove duplicated code
--- .../net/wireless/mediatek/mt76/mt76x0/init.c | 8 +---- drivers/net/wireless/mediatek/mt76/mt76x02.h | 2 +- .../net/wireless/mediatek/mt76/mt76x02_util.c | 30 +++++++++++++++++-- .../wireless/mediatek/mt76/mt76x2/pci_init.c | 19 +----------- 4 files changed, 31 insertions(+), 28 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76x0/init.c +1 -7
@@ -136,8 +136,6 @@ static void mt76x0_init_mac_registers(struct mt76x02_dev *dev) {RANDOM_WRITE (dev, common_mac_reg_table); -mt76x02_set_beacon_offsets (dev); -/* Enable PBF and MAC clock SYS_CTRL[11:10] = 0x3 */ RANDOM_WRITE (dev, mt76x0_mac_reg_table);
@@ -298,11 +296,6 @@ int mt76x0_init_hardware(struct mt76x02_dev *dev)if (ret)return ret; -mt76_clear (dev,MT_BEACON_TIME_CFG , (MT_BEACON_TIME_CFG_TIMER_EN | -MT_BEACON_TIME_CFG_SYNC_MODE | -MT_BEACON_TIME_CFG_TBTT_EN | -MT_BEACON_TIME_CFG_BEACON_TX )); -mt76x0_reset_counters (dev); ret =mt76x0_eeprom_init (dev);
@@ -310,6 +303,7 @@ int mt76x0_init_hardware(struct mt76x02_dev *dev)return ret;mt76x0_phy_init (dev); +mt76x02_init_beacon_config (dev);return 0 ; }
drivers/net/wireless/mediatek/mt76/mt76x02.h +1 -1
@@ -156,7 +156,7 @@ int mt76x02_get_txpower(struct ieee80211_hw *hw,void mt76x02_sta_ps (struct mt76_dev *dev,struct ieee80211_sta *sta,bool ps);extern const u16 mt76x02_beacon_offsets[16 ]; -void mt76x02_set_beacon_offsets (struct mt76x02_dev *dev); +void mt76x02_init_beacon_config (struct mt76x02_dev *dev);void mt76x02_set_irq_mask (struct mt76x02_dev *dev,u32 clear,u32 set);void mt76x02_mac_start (struct mt76x02_dev *dev);
drivers/net/wireless/mediatek/mt76/mt76x02_util.c +28 -2
@@ -560,7 +560,7 @@ const u16 mt76x02_beacon_offsets[16] = { };EXPORT_SYMBOL_GPL (mt76x02_beacon_offsets); -void mt76x02_set_beacon_offsets (struct mt76x02_dev *dev) +static void mt76x02_set_beacon_offsets (struct mt76x02_dev *dev) {u16 val, base =MT_BEACON_BASE ;u32 regs[4 ] = {};
@@ -574,6 +574,32 @@ void mt76x02_set_beacon_offsets(struct mt76x02_dev *dev)for (i =0 ; i <4 ; i++)mt76_wr (dev,MT_BCN_OFFSET (i), regs[i]); } -EXPORT_SYMBOL_GPL (mt76x02_set_beacon_offsets); + +void mt76x02_init_beacon_config (struct mt76x02_dev *dev) +{ +static const u8 null_addr[ETH_ALEN ] = {}; +int i; + +mt76_wr (dev,MT_MAC_BSSID_DW0 , +get_unaligned_le32 (dev->mt76.macaddr)); +mt76_wr (dev,MT_MAC_BSSID_DW1 , +get_unaligned_le16 (dev->mt76.macaddr +4 ) | +FIELD_PREP (MT_MAC_BSSID_DW1_MBSS_MODE ,3 ) |/* 8 beacons */ +MT_MAC_BSSID_DW1_MBSS_LOCAL_BIT ); + +/* Fire a pre-TBTT interrupt 8 ms before TBTT */ +mt76_rmw_field (dev,MT_INT_TIMER_CFG ,MT_INT_TIMER_CFG_PRE_TBTT , +8 <<4 ); +mt76_wr (dev,MT_INT_TIMER_EN ,0 ); + +mt76_wr (dev,MT_BCN_BYPASS_MASK ,0xffff ); + +for (i =0 ; i <8 ; i++) { +mt76x02_mac_set_bssid (dev, i, null_addr); +mt76x02_mac_set_beacon (dev, i,NULL ); + } +mt76x02_set_beacon_offsets (dev); +} +EXPORT_SYMBOL_GPL (mt76x02_init_beacon_config);MODULE_LICENSE ("Dual BSD/GPL" );
drivers/net/wireless/mediatek/mt76/mt76x2/pci_init.c +1 -18
@@ -79,7 +79,6 @@ mt76x2_fixup_xtal(struct mt76x02_dev *dev)static int mt76x2_mac_reset (struct mt76x02_dev *dev,bool hard) { -static const u8 null_addr[ETH_ALEN ] = {};const u8 *macaddr = dev->mt76.macaddr;u32 val;int i, k;
@@ -123,19 +122,10 @@ static int mt76x2_mac_reset(struct mt76x02_dev *dev, bool hard)mt76_wr (dev,MT_MAC_ADDR_DW0 ,get_unaligned_le32 (macaddr));mt76_wr (dev,MT_MAC_ADDR_DW1 ,get_unaligned_le16 (macaddr +4 )); -mt76_wr (dev,MT_MAC_BSSID_DW0 ,get_unaligned_le32 (macaddr)); -mt76_wr (dev,MT_MAC_BSSID_DW1 ,get_unaligned_le16 (macaddr +4 ) | -FIELD_PREP (MT_MAC_BSSID_DW1_MBSS_MODE ,3 ) |/* 8 beacons */ -MT_MAC_BSSID_DW1_MBSS_LOCAL_BIT ); - -/* Fire a pre-TBTT interrupt 8 ms before TBTT */ -mt76_rmw_field (dev,MT_INT_TIMER_CFG ,MT_INT_TIMER_CFG_PRE_TBTT , -8 <<4 );mt76_rmw_field (dev,MT_INT_TIMER_CFG ,MT_INT_TIMER_CFG_GP_TIMER ,MT_DFS_GP_INTERVAL ); -mt76_wr (dev,MT_INT_TIMER_EN ,0 ); -mt76_wr (dev,MT_BCN_BYPASS_MASK ,0xffff ); +mt76x02_init_beacon_config (dev);if (!hard)return 0 ;
@@ -152,11 +142,6 @@ static int mt76x2_mac_reset(struct mt76x02_dev *dev, bool hard)for (k =0 ; k <4 ; k++)mt76x02_mac_shared_key_setup (dev, i, k,NULL ); -for (i =0 ; i <8 ; i++) { -mt76x02_mac_set_bssid (dev, i, null_addr); -mt76x02_mac_set_beacon (dev, i,NULL ); - } -for (i =0 ; i <16 ; i++)mt76_rr (dev,MT_TX_STAT_FIFO );
@@ -168,8 +153,6 @@ static int mt76x2_mac_reset(struct mt76x02_dev *dev, bool hard)MT_CH_TIME_CFG_EIFS_AS_BUSY | FIELD_PREP(MT_CH_TIME_CFG_CH_TIMER_CLR, 1)); -mt76x02_set_beacon_offsets (dev); -mt76x2_set_tx_ackto (dev);return 0 ;
Signature · 1 line
2.19.0
RFC 9/9 mt76x0: pci: enable AP support
In reply to Lorenzo BianconiAdd missing mac80211 callbacks to mt76x0e_ops data structure and add mt76x02_beacon utility routines in mt76x0_bss_info_changed in order to enable/disable beacon transmission
--- .../net/wireless/mediatek/mt76/mt76x0/mac.c | 20 ------------ .../net/wireless/mediatek/mt76/mt76x0/main.c | 32 +++++++++---------- .../wireless/mediatek/mt76/mt76x0/mt76x0.h | 1 - .../net/wireless/mediatek/mt76/mt76x0/pci.c | 17 ++++++++++ 4 files changed, 32 insertions(+), 38 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76x0/mac.c +0 -20
@@ -85,26 +85,6 @@ void mt76x0_mac_set_short_preamble(struct mt76x02_dev *dev, bool short_preamb)mt76_clear (dev,MT_AUTO_RSP_CFG ,MT_AUTO_RSP_PREAMB_SHORT ); } -void mt76x0_mac_config_tsf (struct mt76x02_dev *dev,bool enable,int interval) -{ -u32 val =mt76_rr (dev,MT_BEACON_TIME_CFG ); - - val &= ~(MT_BEACON_TIME_CFG_TIMER_EN | -MT_BEACON_TIME_CFG_SYNC_MODE | -MT_BEACON_TIME_CFG_TBTT_EN ); - -if (!enable) { -mt76_wr (dev,MT_BEACON_TIME_CFG , val); -return ; - } - - val &= ~MT_BEACON_TIME_CFG_INTVAL ; - val |=FIELD_PREP (MT_BEACON_TIME_CFG_INTVAL , interval <<4 ) | -MT_BEACON_TIME_CFG_TIMER_EN | -MT_BEACON_TIME_CFG_SYNC_MODE | -MT_BEACON_TIME_CFG_TBTT_EN ; -} -void mt76x0_mac_set_ampdu_factor (struct mt76x02_dev *dev) {struct ieee80211_sta *sta;
drivers/net/wireless/mediatek/mt76/mt76x0/main.c +15 -17
@@ -72,30 +72,23 @@ int mt76x0_config(struct ieee80211_hw *hw, u32 changed) }EXPORT_SYMBOL_GPL (mt76x0_config); -static void -mt76x0_addr_wr (struct mt76x02_dev *dev,const u32 offset,const u8 *addr) -{ -mt76_wr (dev, offset,get_unaligned_le32 (addr)); -mt76_wr (dev, offset +4 , addr[4 ] | addr[5 ] <<8 ); -} -void mt76x0_bss_info_changed (struct ieee80211_hw *hw,struct ieee80211_vif *vif,struct ieee80211_bss_conf *info,u32 changed) { +struct mt76x02_vif *mvif = (struct mt76x02_vif *)vif->drv_priv;struct mt76x02_dev *dev = hw->priv;mutex_lock (&dev->mt76.mutex); -if (changed &BSS_CHANGED_BSSID ) { -mt76x0_addr_wr (dev,MT_MAC_BSSID_DW0 , info->bssid); +if (changed &BSS_CHANGED_BSSID ) +mt76x02_mac_set_bssid (dev, mvif->idx, info->bssid); -/* Note: this is a hack because beacon_int is not changed -* on leave nor is any more appropriate event generated. -* rt2x00 doesn't seem to be bothered though. -*/ -if (is_zero_ether_addr (info->bssid)) -mt76x0_mac_config_tsf (dev, false,0 ); +if (changed &BSS_CHANGED_BEACON_ENABLED ) { +tasklet_disable (&dev->pre_tbtt_tasklet); +mt76x02_mac_set_beacon_enable (dev, mvif->idx, + info->enable_beacon); +tasklet_enable (&dev->pre_tbtt_tasklet); }if (changed &BSS_CHANGED_BASIC_RATES ) {
@@ -106,8 +99,13 @@ void mt76x0_bss_info_changed(struct ieee80211_hw *hw,mt76_wr (dev,MT_LG_FBK_CFG1 ,0x00002100 ); } -if (changed &BSS_CHANGED_BEACON_INT ) -mt76x0_mac_config_tsf (dev, true, info->beacon_int); +if (changed &BSS_CHANGED_BEACON_INT ) { +mt76_rmw_field (dev,MT_BEACON_TIME_CFG , +MT_BEACON_TIME_CFG_INTVAL , + info->beacon_int <<4 ); + dev->beacon_int = info->beacon_int; + dev->tbtt_count =0 ; + }if (changed &BSS_CHANGED_HT || changed &BSS_CHANGED_ERP_CTS_PROT ) mt76x0_mac_set_protection(dev, info->use_cts_prot,
drivers/net/wireless/mediatek/mt76/mt76x0/mt76x0.h +0 -1
@@ -67,7 +67,6 @@ void mt76x0_phy_calibrate(struct mt76x02_dev *dev, bool power_on);void mt76x0_mac_set_protection (struct mt76x02_dev *dev,bool legacy_prot,int ht_mode);void mt76x0_mac_set_short_preamble (struct mt76x02_dev *dev,bool short_preamb); -void mt76x0_mac_config_tsf (struct mt76x02_dev *dev,bool enable,int interval);void mt76x0_mac_set_ampdu_factor (struct mt76x02_dev *dev);#endif
drivers/net/wireless/mediatek/mt76/mt76x0/pci.c +17 -0
@@ -68,6 +68,19 @@ static void mt76x0e_stop(struct ieee80211_hw *hw)mutex_unlock (&dev->mt76.mutex); } +static void +mt76x0e_flush (struct ieee80211_hw *hw,struct ieee80211_vif *vif, +u32 queues,bool drop) +{ +} + +static int +mt76x0e_set_tim (struct ieee80211_hw *hw,struct ieee80211_sta *sta, +bool set) +{ +return 0 ; +} +static const struct ieee80211_ops mt76x0e_ops = { .tx = mt76x02_tx, .start = mt76x0e_start,
@@ -76,6 +89,7 @@ static const struct ieee80211_ops mt76x0e_ops = { .remove_interface = mt76x02_remove_interface, .config = mt76x0_config, .configure_filter = mt76x02_configure_filter, + .bss_info_changed = mt76x0_bss_info_changed, .sta_add = mt76x02_sta_add, .sta_remove = mt76x02_sta_remove, .set_key = mt76x02_set_key,
@@ -87,6 +101,9 @@ static const struct ieee80211_ops mt76x0e_ops = { .wake_tx_queue = mt76_wake_tx_queue, .get_survey = mt76_get_survey, .get_txpower = mt76x02_get_txpower, + .flush = mt76x0e_flush, + .set_tim = mt76x0e_set_tim, + .release_buffered_frames = mt76_release_buffered_frames, };static int mt76x0e_register_device (struct mt76x02_dev *dev)
Signature · 1 line
2.19.0