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 | 6 - .../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(+), 550 deletions(-) delete mode 100644 drivers/net/wireless/mediatek/mt76/mt76x2/pci_tx.c
Signature · 1 line
2.19.1
PATCH 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
@@ -338,46 +338,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.1
PATCH 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
@@ -794,3 +794,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
@@ -227,4 +227,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.1
PATCH 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.1
PATCH 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.1
PATCH 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
@@ -65,10 +65,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
@@ -150,8 +150,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.1
PATCH 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
@@ -156,6 +156,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.1
PATCH 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.1
PATCH 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
@@ -135,8 +135,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);
@@ -297,11 +295,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);
@@ -309,6 +302,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.1
PATCH 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 | 2 -- .../net/wireless/mediatek/mt76/mt76x0/pci.c | 17 ++++++++++ 4 files changed, 32 insertions(+), 39 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76x0/mac.c +0 -20
@@ -75,23 +75,3 @@ void mt76x0_mac_set_protection(struct mt76x02_dev *dev, bool legacy_prot,for (i =0 ; i <6 ; i++)mt76_wr (dev,MT_CCK_PROT_CFG + i *4 , prot[i]); } - -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 ; -}
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 -2
@@ -78,6 +78,4 @@ void mt76x0_phy_calibrate(struct mt76x02_dev *dev, bool power_on);/* MAC */ void mt76x0_mac_set_protection (struct mt76x02_dev *dev,bool legacy_prot,int ht_mode); -void mt76x0_mac_config_tsf (struct mt76x02_dev *dev,bool enable,int interval); -#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.1
Quoted 3 lines · Lorenzo Bianconi
Add beacon transmission/management support to mt76x0 driver. Add missing mac80211 callbacks to mt76x0e driver in order to enable AP support
Applied, thanks.
- Felix