mt7915: introduce dbdc support
Subsystems (3)
Lorenzo Bianconi
maintainerv2 cover mt7915: introduce dbdc support
Similar to mt7615 devices, mt7915d chipset supports dbdc mode where the hw exports a primary phy on 2.4GHz band and a secondary phy on 5GHz band.
Changes since v1:
- drop patch 1/6, 2/6, 3/6 since they have been already applied
- fix a mac address configuration issue for mt7615 ext_phy
- improve commit log
- remove unnecessary chunk in mt7915_phy_get_nf()
Lorenzo Bianconi (3):
mt76: move hw mac_addr in mt76_phy
mt76: mt7915: introduce dbdc support
mt76: mt7915: get rid of dbdc debugfs knob
drivers/net/wireless/mediatek/mt76/eeprom.c | 12 +- drivers/net/wireless/mediatek/mt76/mac80211.c | 11 +- drivers/net/wireless/mediatek/mt76/mt76.h | 6 +- .../wireless/mediatek/mt76/mt7603/eeprom.c | 4 +- .../wireless/mediatek/mt76/mt7615/eeprom.c | 4 +- .../net/wireless/mediatek/mt76/mt7615/init.c | 7 +- .../wireless/mediatek/mt76/mt76x0/eeprom.c | 6 +- .../net/wireless/mediatek/mt76/mt76x02_mac.c | 16 +- .../net/wireless/mediatek/mt76/mt76x02_util.c | 8 +- .../wireless/mediatek/mt76/mt76x2/eeprom.c | 6 +- .../wireless/mediatek/mt76/mt76x2/pci_init.c | 2 +- .../wireless/mediatek/mt76/mt7915/debugfs.c | 40 +- .../net/wireless/mediatek/mt76/mt7915/dma.c | 19 +- .../wireless/mediatek/mt76/mt7915/eeprom.c | 51 ++- .../wireless/mediatek/mt76/mt7915/eeprom.h | 1 + .../net/wireless/mediatek/mt76/mt7915/init.c | 382 +++++++++--------- .../net/wireless/mediatek/mt76/mt7915/mac.c | 14 +- .../net/wireless/mediatek/mt76/mt7915/main.c | 3 +- .../net/wireless/mediatek/mt76/mt7915/mcu.c | 4 +- .../wireless/mediatek/mt76/mt7915/mt7915.h | 5 +- .../net/wireless/mediatek/mt76/mt7915/pci.c | 19 +- .../net/wireless/mediatek/mt76/mt7915/regs.h | 13 +- drivers/net/wireless/mediatek/mt76/testmode.c | 17 +- 23 files changed, 330 insertions(+), 320 deletions(-)
Signature · 1 line
2.26.2
Lorenzo Bianconi
maintainerPATCH v2 1/3 mt76: move hw mac_addr in mt76_phy
This is a preliminary patch to properly support mt7915 dbdc
--- drivers/net/wireless/mediatek/mt76/eeprom.c | 12 +++++++----- drivers/net/wireless/mediatek/mt76/mac80211.c | 11 ++++++----- drivers/net/wireless/mediatek/mt76/mt76.h | 5 +++-- .../net/wireless/mediatek/mt76/mt7603/eeprom.c | 4 ++-- .../net/wireless/mediatek/mt76/mt7615/eeprom.c | 4 ++-- .../net/wireless/mediatek/mt76/mt7615/init.c | 7 +++++-- .../net/wireless/mediatek/mt76/mt76x0/eeprom.c | 6 +++--- .../net/wireless/mediatek/mt76/mt76x02_mac.c | 16 ++++++++-------- .../net/wireless/mediatek/mt76/mt76x02_util.c | 8 ++++---- .../net/wireless/mediatek/mt76/mt76x2/eeprom.c | 6 +++--- .../wireless/mediatek/mt76/mt76x2/pci_init.c | 2 +- .../net/wireless/mediatek/mt76/mt7915/eeprom.c | 4 ++-- drivers/net/wireless/mediatek/mt76/testmode.c | 17 +++++++++-------- 13 files changed, 55 insertions(+), 47 deletions(-)
drivers/net/wireless/mediatek/mt76/eeprom.c +7 -5
@@ -88,8 +88,10 @@ mt76_get_of_eeprom(struct mt76_dev *dev, int len) }void -mt76_eeprom_override (struct mt76_dev *dev) +mt76_eeprom_override (struct mt76_phy *phy) { +struct mt76_dev *dev = phy->dev; +#ifdef CONFIG_OF struct device_node *np = dev->dev->of_node;const u8 *mac =NULL ;
@@ -97,14 +99,14 @@ mt76_eeprom_override(struct mt76_dev *dev)if (np) mac =of_get_mac_address (np);if (!IS_ERR_OR_NULL (mac)) -ether_addr_copy (dev->macaddr, mac); +ether_addr_copy (phy->macaddr, mac);#endif -if (!is_valid_ether_addr (dev->macaddr)) { -eth_random_addr (dev->macaddr); +if (!is_valid_ether_addr (phy->macaddr)) { +eth_random_addr (phy->macaddr);dev_info (dev->dev,"Invalid MAC address, using random address %pM\n" , - dev->macaddr); + phy->macaddr); } }EXPORT_SYMBOL_GPL (mt76_eeprom_override);
drivers/net/wireless/mediatek/mt76/mac80211.c +6 -5
@@ -273,12 +273,13 @@ mt76_check_sband(struct mt76_phy *phy, struct mt76_sband *msband, }static void -mt76_phy_init (struct mt76_dev *dev,struct ieee80211_hw *hw) +mt76_phy_init (struct mt76_phy *phy,struct ieee80211_hw *hw) { +struct mt76_dev *dev = phy->dev;struct wiphy *wiphy = hw->wiphy;SET_IEEE80211_DEV (hw, dev->dev); -SET_IEEE80211_PERM_ADDR (hw, dev->macaddr); +SET_IEEE80211_PERM_ADDR (hw, phy->macaddr); wiphy->features |=NL80211_FEATURE_ACTIVE_MONITOR ; wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH |
@@ -354,7 +355,7 @@ int mt76_register_phy(struct mt76_phy *phy, bool vht, {int ret; -mt76_phy_init (phy->dev, phy->hw); +mt76_phy_init (phy, phy->hw);if (phy->cap.has_2ghz) { ret =mt76_init_sband_2g (phy, rates, n_rates);
@@ -450,7 +451,7 @@ int mt76_register_device(struct mt76_dev *dev, bool vht,int ret;dev_set_drvdata (dev->dev, dev); -mt76_phy_init (dev, hw); +mt76_phy_init (phy, hw);if (phy->cap.has_2ghz) { ret =mt76_init_sband_2g (phy, rates, n_rates);
@@ -830,7 +831,7 @@ mt76_airtime_check(struct mt76_dev *dev, struct sk_buff *skb)return ;if (!wcid || !wcid->sta) { -if (!ether_addr_equal (hdr->addr1, dev->macaddr)) +if (!ether_addr_equal (hdr->addr1, dev->phy.macaddr))return ; wcid =NULL ;
drivers/net/wireless/mediatek/mt76/mt76.h +3 -2
@@ -573,6 +573,8 @@ struct mt76_phy {struct mt76_sband sband_2g;struct mt76_sband sband_5g; +u8 macaddr[ETH_ALEN ]; +u32 vif_mask;int txpower_cur;
@@ -628,7 +630,6 @@ struct mt76_dev {struct mt76_wcid global_wcid;struct mt76_wcid __rcu *wcid[MT76_N_WCIDS ]; -u8 macaddr[ETH_ALEN ];u32 rev;u32 aggr_stats[32 ];
@@ -784,7 +785,7 @@ void mt76_seq_puts_array(struct seq_file *file, const char *str, s8 *val, int len);int mt76_eeprom_init (struct mt76_dev *dev,int len); -void mt76_eeprom_override (struct mt76_dev *dev); +void mt76_eeprom_override (struct mt76_phy *phy);struct mt76_queue * mt76_init_queue(struct mt76_dev *dev, int qid, int idx, int n_desc,
drivers/net/wireless/mediatek/mt76/mt7603/eeprom.c +2 -2
@@ -172,7 +172,7 @@ int mt7603_eeprom_init(struct mt7603_dev *dev) eeprom = (u8 *)dev->mt76.eeprom.data; dev->mphy.cap.has_2ghz = true; -memcpy (dev->mt76.macaddr, eeprom +MT_EE_MAC_ADDR ,ETH_ALEN ); +memcpy (dev->mphy.macaddr, eeprom +MT_EE_MAC_ADDR ,ETH_ALEN );/* Check for 1SS devices */ dev->mphy.antenna_mask =3 ;
@@ -181,7 +181,7 @@ int mt7603_eeprom_init(struct mt7603_dev *dev) is_mt7688(dev)) dev->mphy.antenna_mask =1 ; -mt76_eeprom_override (&dev->mt76); +mt76_eeprom_override (&dev->mphy);return 0 ; }
drivers/net/wireless/mediatek/mt76/mt7615/eeprom.c +2 -2
@@ -342,10 +342,10 @@ int mt7615_eeprom_init(struct mt7615_dev *dev, u32 addr) }mt7615_eeprom_parse_hw_cap (dev); -memcpy (dev->mt76.macaddr, dev->mt76.eeprom.data +MT_EE_MAC_ADDR , +memcpy (dev->mphy.macaddr, dev->mt76.eeprom.data +MT_EE_MAC_ADDR ,ETH_ALEN ); -mt76_eeprom_override (&dev->mt76); +mt76_eeprom_override (&dev->mphy);return 0 ; }
drivers/net/wireless/mediatek/mt76/mt7615/init.c +5 -2
@@ -422,8 +422,11 @@ int mt7615_register_ext_phy(struct mt7615_dev *dev)* Make the secondary PHY MAC address local without overlapping with * the usual MAC address allocation scheme on multiple virtual interfaces */ - mphy->hw->wiphy->perm_addr[0 ] |=2 ; - mphy->hw->wiphy->perm_addr[0 ] ^=BIT (7 ); +memcpy (mphy->macaddr, dev->mt76.eeprom.data +MT_EE_MAC_ADDR , +ETH_ALEN ); + mphy->macaddr[0 ] |=2 ; + mphy->macaddr[0 ] ^=BIT (7 ); +mt76_eeprom_override (mphy);/* second phy can only handle 5 GHz */ mphy->cap.has_5ghz = true;
drivers/net/wireless/mediatek/mt76/mt76x0/eeprom.c +3 -3
@@ -342,10 +342,10 @@ int mt76x0_eeprom_init(struct mt76x02_dev *dev)dev_info (dev->mt76.dev,"EEPROM ver:%02hhx fae:%02hhx\n" , version, fae); -memcpy (dev->mt76.macaddr, (u8 *)dev->mt76.eeprom.data +MT_EE_MAC_ADDR , +memcpy (dev->mphy.macaddr, (u8 *)dev->mt76.eeprom.data +MT_EE_MAC_ADDR ,ETH_ALEN ); -mt76_eeprom_override (&dev->mt76); -mt76x02_mac_setaddr (dev, dev->mt76.macaddr); +mt76_eeprom_override (&dev->mphy); +mt76x02_mac_setaddr (dev, dev->mphy.macaddr);mt76x0_set_chip_cap (dev);mt76x0_set_freq_offset (dev);
drivers/net/wireless/mediatek/mt76/mt76x02_mac.c +8 -8
@@ -727,24 +727,24 @@ void mt76x02_mac_setaddr(struct mt76x02_dev *dev, const u8 *addr)static const u8 null_addr[ETH_ALEN ] = {};int i; -ether_addr_copy (dev->mt76.macaddr, addr); +ether_addr_copy (dev->mphy.macaddr, addr); -if (!is_valid_ether_addr (dev->mt76.macaddr)) { -eth_random_addr (dev->mt76.macaddr); +if (!is_valid_ether_addr (dev->mphy.macaddr)) { +eth_random_addr (dev->mphy.macaddr);dev_info (dev->mt76.dev,"Invalid MAC address, using random address %pM\n" , - dev->mt76.macaddr); + dev->mphy.macaddr); } -mt76_wr (dev,MT_MAC_ADDR_DW0 ,get_unaligned_le32 (dev->mt76.macaddr)); +mt76_wr (dev,MT_MAC_ADDR_DW0 ,get_unaligned_le32 (dev->mphy.macaddr));mt76_wr (dev,MT_MAC_ADDR_DW1 , -get_unaligned_le16 (dev->mt76.macaddr +4 ) | +get_unaligned_le16 (dev->mphy.macaddr +4 ) |FIELD_PREP (MT_MAC_ADDR_DW1_U2ME_MASK ,0xff ));mt76_wr (dev,MT_MAC_BSSID_DW0 , -get_unaligned_le32 (dev->mt76.macaddr)); +get_unaligned_le32 (dev->mphy.macaddr));mt76_wr (dev,MT_MAC_BSSID_DW1 , -get_unaligned_le16 (dev->mt76.macaddr +4 ) | +get_unaligned_le16 (dev->mphy.macaddr +4 ) |FIELD_PREP (MT_MAC_BSSID_DW1_MBSS_MODE ,3 ) |/* 8 APs + 8 STAs */ MT_MAC_BSSID_DW1_MBSS_LOCAL_BIT );/* enable 7 additional beacon slots and control them with bypass mask */
drivers/net/wireless/mediatek/mt76/mt76x02_util.c +4 -4
@@ -305,12 +305,12 @@ mt76x02_add_interface(struct ieee80211_hw *hw, struct ieee80211_vif *vif)/* Allow to change address in HW if we create first interface. */ if (!dev->mphy.vif_mask && - (((vif->addr[0 ] ^ dev->mt76.macaddr[0 ]) & ~GENMASK (4 ,1 )) || -memcmp (vif->addr +1 , dev->mt76.macaddr +1 ,ETH_ALEN -1 ))) + (((vif->addr[0 ] ^ dev->mphy.macaddr[0 ]) & ~GENMASK (4 ,1 )) || +memcmp (vif->addr +1 , dev->mphy.macaddr +1 ,ETH_ALEN -1 )))mt76x02_mac_setaddr (dev, vif->addr);if (vif->addr[0 ] &BIT (1 )) - idx =1 + (((dev->mt76.macaddr[0 ] ^ vif->addr[0 ]) >>2 ) &7 ); + idx =1 + (((dev->mphy.macaddr[0 ] ^ vif->addr[0 ]) >>2 ) &7 );/* * Client mode typically only has one configurable BSSID register,
@@ -678,7 +678,7 @@ void mt76x02_config_mac_addr_list(struct mt76x02_dev *dev)for (i =0 ; i <ARRAY_SIZE (dev->macaddr_list); i++) {u8 *addr = dev->macaddr_list[i].addr; -memcpy (addr, dev->mt76.macaddr,ETH_ALEN ); +memcpy (addr, dev->mphy.macaddr,ETH_ALEN );if (!i)continue ;
drivers/net/wireless/mediatek/mt76/mt76x2/eeprom.c +3 -3
@@ -16,7 +16,7 @@ mt76x2_eeprom_get_macaddr(struct mt76x02_dev *dev) {void *src = dev->mt76.eeprom.data +MT_EE_MAC_ADDR ; -memcpy (dev->mt76.macaddr, src,ETH_ALEN ); +memcpy (dev->mphy.macaddr, src,ETH_ALEN );return 0 ; }
@@ -502,8 +502,8 @@ int mt76x2_eeprom_init(struct mt76x02_dev *dev)mt76x02_eeprom_parse_hw_cap (dev);mt76x2_eeprom_get_macaddr (dev); -mt76_eeprom_override (&dev->mt76); - dev->mt76.macaddr[0 ] &= ~BIT (1 ); +mt76_eeprom_override (&dev->mphy); + dev->mphy.macaddr[0 ] &= ~BIT (1 );return 0 ; }
drivers/net/wireless/mediatek/mt76/mt76x2/pci_init.c +1 -1
@@ -69,7 +69,7 @@ mt76x2_fixup_xtal(struct mt76x02_dev *dev)int mt76x2_mac_reset (struct mt76x02_dev *dev,bool hard) { -const u8 *macaddr = dev->mt76.macaddr; +const u8 *macaddr = dev->mphy.macaddr;u32 val;int i, k;
drivers/net/wireless/mediatek/mt76/mt7915/eeprom.c +2 -2
@@ -87,10 +87,10 @@ int mt7915_eeprom_init(struct mt7915_dev *dev)return ret;mt7915_eeprom_parse_hw_cap (dev); -memcpy (dev->mt76.macaddr, dev->mt76.eeprom.data +MT_EE_MAC_ADDR , +memcpy (dev->mphy.macaddr, dev->mt76.eeprom.data +MT_EE_MAC_ADDR ,ETH_ALEN ); -mt76_eeprom_override (&dev->mt76); +mt76_eeprom_override (&dev->mphy);return 0 ; }
drivers/net/wireless/mediatek/mt76/testmode.c +9 -8
@@ -59,13 +59,14 @@ static int mt76_testmode_tx_init(struct mt76_dev *dev) {struct mt76_testmode_data *td = &dev->test; +struct mt76_phy *phy = &dev->phy;struct ieee80211_tx_info *info;struct ieee80211_hdr *hdr;struct sk_buff *skb;u16 fc =IEEE80211_FTYPE_DATA |IEEE80211_STYPE_DATA |IEEE80211_FCTL_FROMDS ;struct ieee80211_tx_rate *rate; -u8 max_nss =hweight8 (dev->phy.antenna_mask); +u8 max_nss =hweight8 (phy->antenna_mask);if (td->tx_antenna_mask) max_nss =min_t (u8, max_nss,hweight8 (td->tx_antenna_mask));
@@ -78,9 +79,9 @@ mt76_testmode_tx_init(struct mt76_dev *dev) td->tx_skb = skb; hdr =__skb_put_zero (skb, td->tx_msdu_len); hdr->frame_control =cpu_to_le16 (fc); -memcpy (hdr->addr1, dev->macaddr,sizeof (dev->macaddr)); -memcpy (hdr->addr2, dev->macaddr,sizeof (dev->macaddr)); -memcpy (hdr->addr3, dev->macaddr,sizeof (dev->macaddr)); +memcpy (hdr->addr1, phy->macaddr,sizeof (phy->macaddr)); +memcpy (hdr->addr2, phy->macaddr,sizeof (phy->macaddr)); +memcpy (hdr->addr3, phy->macaddr,sizeof (phy->macaddr)); info =IEEE80211_SKB_CB (skb); info->flags = IEEE80211_TX_CTL_INJECTED |
@@ -96,14 +97,14 @@ mt76_testmode_tx_init(struct mt76_dev *dev)switch (td->tx_rate_mode) {case MT76_TM_TX_MODE_CCK : -if (dev->phy.chandef.chan->band !=NL80211_BAND_2GHZ ) +if (phy->chandef.chan->band !=NL80211_BAND_2GHZ )return -EINVAL ;if (rate->idx >4 )return -EINVAL ;break ;case MT76_TM_TX_MODE_OFDM : -if (dev->phy.chandef.chan->band !=NL80211_BAND_2GHZ ) +if (phy->chandef.chan->band !=NL80211_BAND_2GHZ )break ;if (rate->idx >8 )
@@ -114,7 +115,7 @@ mt76_testmode_tx_init(struct mt76_dev *dev)case MT76_TM_TX_MODE_HT :if (rate->idx >8 * max_nss && !(rate->idx ==32 && - dev->phy.chandef.width >=NL80211_CHAN_WIDTH_40 )) + phy->chandef.width >=NL80211_CHAN_WIDTH_40 ))return -EINVAL ; rate->flags |=IEEE80211_TX_RC_MCS ;
@@ -143,7 +144,7 @@ mt76_testmode_tx_init(struct mt76_dev *dev) info->flags |=IEEE80211_TX_CTL_STBC ;if (td->tx_rate_mode >=MT76_TM_TX_MODE_HT ) { -switch (dev->phy.chandef.width) { +switch (phy->chandef.width) {case NL80211_CHAN_WIDTH_40 : rate->flags |=IEEE80211_TX_RC_40_MHZ_WIDTH ;break ;
Signature · 1 line
2.26.2
Lorenzo Bianconi
maintainerPATCH v2 2/3 mt76: mt7915: introduce dbdc support
In reply to Lorenzo BianconiIntroduce mt7915 dbdc support. If dbdc is available, mt7915 primary phy will work on 2.4GHz band, while secondary one on 5GHz band.
--- drivers/net/wireless/mediatek/mt76/mt76.h | 1 + .../wireless/mediatek/mt76/mt7915/debugfs.c | 13 ++- .../net/wireless/mediatek/mt76/mt7915/dma.c | 19 ++-- .../wireless/mediatek/mt76/mt7915/eeprom.c | 47 +++++--- .../wireless/mediatek/mt76/mt7915/eeprom.h | 1 + .../net/wireless/mediatek/mt76/mt7915/init.c | 102 +++++++----------- .../net/wireless/mediatek/mt76/mt7915/mac.c | 14 ++- .../net/wireless/mediatek/mt76/mt7915/main.c | 3 +- .../net/wireless/mediatek/mt76/mt7915/mcu.c | 4 +- .../wireless/mediatek/mt76/mt7915/mt7915.h | 3 + .../net/wireless/mediatek/mt76/mt7915/pci.c | 19 +++- .../net/wireless/mediatek/mt76/mt7915/regs.h | 13 ++- 12 files changed, 135 insertions(+), 104 deletions(-)
drivers/net/wireless/mediatek/mt76/mt76.h +1 -0
@@ -80,6 +80,7 @@ enum mt76_rxq_id {MT_RXQ_MAIN ,MT_RXQ_MCU ,MT_RXQ_MCU_WA , +MT_RXQ_EXT , __MT_RXQ_MAX };
drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c +10 -3
@@ -280,13 +280,17 @@ static int mt7915_queues_read(struct seq_file *s, void *data) { struct mt7915_dev *dev = dev_get_drvdata(s->private); +struct mt76_phy *mphy_ext = dev->mt76.phy2; +struct mt76_queue *ext_q = mphy_ext ? mphy_ext->q_tx[MT_TXQ_BE ] :NULL ;struct {struct mt76_queue *q;char *queue; } queue_map[] = { - { dev->mphy.q_tx[MT_TXQ_BE ],"WFDMA0" }, - { dev->mt76.q_mcu[MT_MCUQ_WM ],"MCUWM" }, - { dev->mt76.q_mcu[MT_MCUQ_WA ],"MCUWA" }, + { dev->mphy.q_tx[MT_TXQ_BE ],"WFDMA0" }, + { ext_q,"WFDMA1" }, + { dev->mphy.q_tx[MT_TXQ_BE ],"WFDMA0" }, + { dev->mt76.q_mcu[MT_MCUQ_WM ],"MCUWM" }, + { dev->mt76.q_mcu[MT_MCUQ_WA ],"MCUWA" }, { dev->mt76.q_mcu[MT_MCUQ_FWDL ],"MCUFWQ" }, };int i;
@@ -294,6 +298,9 @@ mt7915_queues_read(struct seq_file *s, void *data)for (i =0 ; i <ARRAY_SIZE (queue_map); i++) {struct mt76_queue *q = queue_map[i].q; +if (!q) +continue ; + seq_printf(s, "%s: queued=%d head=%d tail=%d\n", queue_map[i].queue, q->queued, q->head,
drivers/net/wireless/mediatek/mt76/mt7915/dma.c +13 -6
@@ -5,8 +5,7 @@#include "../dma.h" #include "mac.h" -static int -mt7915_init_tx_queues (struct mt7915_phy *phy,int idx,int n_desc) +int mt7915_init_tx_queues (struct mt7915_phy *phy,int idx,int n_desc) {int i, err;
@@ -274,13 +273,21 @@ int mt7915_dma_init(struct mt7915_dev *dev)if (ret)return ret; -/* rx data */ - ret =mt76_queue_alloc (dev, &dev->mt76.q_rx[MT_RXQ_MAIN ],0 , -MT7915_RX_RING_SIZE , rx_buf_size, -MT_RX_DATA_RING_BASE ); +/* rx data queue */ + ret =mt76_queue_alloc (dev, &dev->mt76.q_rx[MT_RXQ_MAIN ], +MT7915_RXQ_BAND0 ,MT7915_RX_RING_SIZE , + rx_buf_size,MT_RX_DATA_RING_BASE );if (ret)return ret; +if (dev->dbdc_support) { + ret =mt76_queue_alloc (dev, &dev->mt76.q_rx[MT_RXQ_EXT ], +MT7915_RXQ_BAND1 ,MT7915_RX_RING_SIZE , + rx_buf_size,MT_RX_DATA_RING_BASE ); +if (ret) +return ret; + } + ret =mt76_init_queues (dev);if (ret <0 )return ret;
drivers/net/wireless/mediatek/mt76/mt7915/eeprom.c +31 -16
66 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7915/eeprom.h +1 -0
@@ -15,6 +15,7 @@ enum mt7915_eeprom_field {MT_EE_CHIP_ID =0x000 ,MT_EE_VERSION =0x002 ,MT_EE_MAC_ADDR =0x004 , +MT_EE_MAC_ADDR2 =0x00a ,MT_EE_DDIE_FT_VERSION =0x050 ,MT_EE_WIFI_CONF =0x190 , MT_EE_TX0_POWER_2G = 0x2fc,
drivers/net/wireless/mediatek/mt76/mt7915/init.c +41 -61
173 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7915/mac.c +11 -3
@@ -1077,6 +1077,7 @@ void mt7915_mac_tx_free(struct mt7915_dev *dev, struct sk_buff *skb) {struct mt7915_tx_free *free = (struct mt7915_tx_free *)skb->data;struct mt76_dev *mdev = &dev->mt76; +struct mt76_phy *mphy_ext = mdev->phy2;struct mt76_txwi_cache *txwi;struct ieee80211_sta *sta =NULL ;LIST_HEAD (free_list);
@@ -1086,6 +1087,10 @@ void mt7915_mac_tx_free(struct mt7915_dev *dev, struct sk_buff *skb)/* clean DMA queues and unmap buffers first */ mt76_queue_tx_cleanup (dev, dev->mphy.q_tx[MT_TXQ_PSD ], false);mt76_queue_tx_cleanup (dev, dev->mphy.q_tx[MT_TXQ_BE ], false); +if (mphy_ext) { +mt76_queue_tx_cleanup (dev, mphy_ext->q_tx[MT_TXQ_PSD ], false); +mt76_queue_tx_cleanup (dev, mphy_ext->q_tx[MT_TXQ_BE ], false); + }/* * TODO: MT_TX_FREE_LATENCY is msdu time from the TXD is queued into PLE,
@@ -1321,9 +1326,8 @@ mt7915_phy_get_nf(struct mt7915_phy *phy, int idx)u32 val, sum =0 , n =0 ;int nss, i; -/* TODO: DBDC: 0,1 for 2.4G, 2,3 for 5G */ for (nss =0 ; nss <hweight8 (phy->chainmask); nss++) { -u32 reg =MT_WF_IRPI (nss); +u32 reg =MT_WF_IRPI (nss + (idx << dev->dbdc_support));for (i =0 ; i <ARRAY_SIZE (nf_power); i++, reg +=4 ) { val =mt7915_l2_rr (dev, reg);
@@ -1425,6 +1429,7 @@ static void mt7915_dma_reset(struct mt7915_phy *phy) {struct mt7915_dev *dev = phy->dev; +struct mt76_phy *mphy_ext = dev->mt76.phy2;int i; mt76_clear(dev, MT_WFDMA0_GLO_CFG,
@@ -1434,8 +1439,11 @@ mt7915_dma_reset(struct mt7915_phy *phy)usleep_range (1000 ,2000 );mt76_queue_tx_cleanup (dev, dev->mt76.q_mcu[MT_MCUQ_WA ], true); -for (i =0 ; i < __MT_TXQ_MAX; i++) +for (i =0 ; i < __MT_TXQ_MAX; i++) {mt76_queue_tx_cleanup (dev, phy->mt76->q_tx[i], true); +if (mphy_ext) +mt76_queue_tx_cleanup (dev, mphy_ext->q_tx[i], true); + }mt76_for_each_q_rx (&dev->mt76, i) {mt76_queue_rx_reset (dev, i);
drivers/net/wireless/mediatek/mt76/mt7915/main.c +2 -1
@@ -394,7 +394,8 @@ static int mt7915_config(struct ieee80211_hw *hw, u32 changed)else phy->rxfilter &= ~MT_WF_RFCR_DROP_OTHER_UC ; -mt76_rmw_field (dev,MT_DMA_DCR0 ,MT_DMA_DCR0_RXD_G5_EN , enabled); +mt76_rmw_field (dev,MT_DMA_DCR0 (band),MT_DMA_DCR0_RXD_G5_EN , + enabled);mt76_testmode_reset (&dev->mt76, true);mt76_wr (dev,MT_WF_RFCR (band), phy->rxfilter); }
drivers/net/wireless/mediatek/mt76/mt7915/mcu.c +2 -2
@@ -962,7 +962,7 @@ mt7915_mcu_muar_config(struct mt7915_phy *phy, struct ieee80211_vif *vif, .mode = !!mask || enable, .entry_count = 1, .write = 1, - + .band = phy != &dev->phy, .index = idx * 2 + bssid, };
@@ -3146,7 +3146,7 @@ int mt7915_mcu_set_chan_info(struct mt7915_phy *phy, int cmd) .center_ch = ieee80211_frequency_to_channel(freq1), .bw = mt7915_mcu_chan_bw(chandef), .tx_streams_num = hweight8(phy->mt76->antenna_mask), - .rx_streams = phy->chainmask, + .rx_streams = phy->mt76->antenna_mask, .band_idx = phy != &dev->phy, .channel_band = chandef->chan->band, };
drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h +3 -0
@@ -165,6 +165,7 @@ struct mt7915_dev {s8 **rate_power;/* TODO: use mt76_rate_power */ +bool dbdc_support;bool fw_debug;#ifdef CONFIG_NL80211_TESTMODE
@@ -278,6 +279,7 @@ void mt7915_unregister_device(struct mt7915_dev *dev);int mt7915_register_ext_phy (struct mt7915_dev *dev);void mt7915_unregister_ext_phy (struct mt7915_dev *dev);int mt7915_eeprom_init (struct mt7915_dev *dev); +void mt7915_eeprom_parse_band_config (struct mt7915_phy *phy);int mt7915_eeprom_get_target_power (struct mt7915_dev *dev,struct ieee80211_channel *chan,u8 chain_idx);
@@ -461,6 +463,7 @@ int mt7915_tx_prepare_skb(struct mt76_dev *mdev, void *txwi_ptr,struct ieee80211_sta *sta, struct mt76_tx_info *tx_info);void mt7915_tx_complete_skb (struct mt76_dev *mdev,struct mt76_queue_entry *e); +int mt7915_init_tx_queues (struct mt7915_phy *phy,int idx,int n_desc);void mt7915_queue_rx_skb (struct mt76_dev *mdev,enum mt76_rxq_id q,struct sk_buff *skb);void mt7915_sta_ps (struct mt76_dev *mdev,struct ieee80211_sta *sta,bool ps);
drivers/net/wireless/mediatek/mt76/mt7915/pci.c +14 -5
@@ -21,8 +21,14 @@ static void mt7915_rx_poll_complete(struct mt76_dev *mdev, enum mt76_rxq_id q) { struct mt7915_dev *dev = container_of(mdev, struct mt7915_dev, mt76); +static const u32 rx_irq_mask[] = { + [MT_RXQ_MAIN ] =MT_INT_RX_DONE_DATA0 , + [MT_RXQ_EXT ] =MT_INT_RX_DONE_DATA1 , + [MT_RXQ_MCU ] =MT_INT_RX_DONE_WM , + [MT_RXQ_MCU_WA ] =MT_INT_RX_DONE_WA , + }; -mt7915_irq_enable (dev,MT_INT_RX_DONE (q)); +mt7915_irq_enable (dev, rx_irq_mask[q]); }/* TODO: support 2/4/6/8 MSI-X vectors */
@@ -49,14 +55,17 @@ static irqreturn_t mt7915_irq_handler(int irq, void *dev_instance)if (intr &MT_INT_TX_DONE_MCU )napi_schedule (&dev->mt76.tx_napi); -if (intr &MT_INT_RX_DONE_DATA ) -napi_schedule (&dev->mt76.napi[0 ]); +if (intr &MT_INT_RX_DONE_DATA0 ) +napi_schedule (&dev->mt76.napi[MT_RXQ_MAIN ]); + +if (intr &MT_INT_RX_DONE_DATA1 ) +napi_schedule (&dev->mt76.napi[MT_RXQ_EXT ]);if (intr &MT_INT_RX_DONE_WM ) -napi_schedule (&dev->mt76.napi[1 ]); +napi_schedule (&dev->mt76.napi[MT_RXQ_MCU ]);if (intr &MT_INT_RX_DONE_WA ) -napi_schedule (&dev->mt76.napi[2 ]); +napi_schedule (&dev->mt76.napi[MT_RXQ_MCU_WA ]);if (intr &MT_INT_MCU_CMD ) {u32 val =mt76_rr (dev,MT_MCU_CMD );
drivers/net/wireless/mediatek/mt76/mt7915/regs.h +6 -7
@@ -73,11 +73,10 @@#define MT_TMAC_TRCR0 (_band) MT_WF_TMAC(_band, 0x09c)#define MT_TMAC_TFCR0 (_band) MT_WF_TMAC(_band, 0x1e0) -/* DMA Band 0 */ -#define MT_WF_DMA_BASE 0x21e00 -#define MT_WF_DMA (ofs) (MT_WF_DMA_BASE + (ofs)) +#define MT_WF_DMA_BASE (_band) ((_band) ? 0xa1e00 : 0x21e00) +#define MT_WF_DMA (_band, ofs) (MT_WF_DMA_BASE(_band) + (ofs)) -#define MT_DMA_DCR0 MT_WF_DMA(0x000) +#define MT_DMA_DCR0 (_band) MT_WF_DMA(_band, 0x000)#define MT_DMA_DCR0_MAX_RX_LEN GENMASK(15, 3)#define MT_DMA_DCR0_RXD_G5_EN BIT(23)
@@ -339,11 +338,11 @@#define MT_INT_SOURCE_CSR MT_WFDMA_EXT_CSR(0x10)#define MT_INT_MASK_CSR MT_WFDMA_EXT_CSR(0x14) -#define MT_INT_RX_DONE_DATA BIT(16) +#define MT_INT_RX_DONE_DATA0 BIT(16) +#define MT_INT_RX_DONE_DATA1 BIT(17)#define MT_INT_RX_DONE_WM BIT(0)#define MT_INT_RX_DONE_WA BIT(1) -#define MT_INT_RX_DONE (_n) ((_n) ? BIT((_n) - 1) : BIT(16)) -#define MT_INT_RX_DONE_ALL (BIT(0) | BIT(1) | BIT(16)) +#define MT_INT_RX_DONE_ALL (BIT(0) | BIT(1) | GENMASK(17, 16))#define MT_INT_TX_DONE_MCU_WA BIT(15)#define MT_INT_TX_DONE_FWDL BIT(26)#define MT_INT_TX_DONE_MCU_WM BIT(27)
Signature · 1 line
2.26.2
Lorenzo Bianconi
maintainerPATCH v2 3/3 mt76: mt7915: get rid of dbdc debugfs knob
In reply to Lorenzo Bianconimt7915 automatically detects dbdc feature so drop debugfs knob. Move if_comb, mt7915_rates, if_limits structs and mt7915_regd_notifier(), mt7915_init_wiphy() routines at the begging of init.c in order to make mt7915_register_ext_phy routine static
--- .../wireless/mediatek/mt76/mt7915/debugfs.c | 27 -- .../net/wireless/mediatek/mt76/mt7915/init.c | 324 +++++++++--------- .../wireless/mediatek/mt76/mt7915/mt7915.h | 2 - 3 files changed, 162 insertions(+), 191 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c +0 -27
@@ -47,32 +47,6 @@ mt7915_radar_trigger(void *data, u64 val)DEFINE_DEBUGFS_ATTRIBUTE (fops_radar_trigger,NULL , mt7915_radar_trigger,"%lld\n" ); -static int -mt7915_dbdc_set (void *data,u64 val) -{ -struct mt7915_dev *dev = data; - -if (val) -mt7915_register_ext_phy (dev); -else -mt7915_unregister_ext_phy (dev); - -return 0 ; -} - -static int -mt7915_dbdc_get (void *data,u64 *val) -{ -struct mt7915_dev *dev = data; - - *val = !!mt7915_ext_phy (dev); - -return 0 ; -} - -DEFINE_DEBUGFS_ATTRIBUTE (fops_dbdc, mt7915_dbdc_get, - mt7915_dbdc_set,"%lld\n" ); -static int mt7915_fw_debug_set (void *data,u64 val) {
@@ -380,7 +354,6 @@ int mt7915_init_debugfs(struct mt7915_dev *dev)debugfs_create_devm_seqfile (dev->mt76.dev,"acq" , dir, mt7915_queues_acq);debugfs_create_file ("tx_stats" ,0400 , dir, dev, &fops_tx_stats); -debugfs_create_file ("dbdc" ,0600 , dir, dev, &fops_dbdc);debugfs_create_file ("fw_debug" ,0600 , dir, dev, &fops_fw_debug);debugfs_create_u32 ("dfs_hw_pattern" ,0400 , dir, &dev->hw_pattern);/* test knobs */
drivers/net/wireless/mediatek/mt76/mt7915/init.c +162 -162
348 lines not on this page · raw message
drivers/net/wireless/mediatek/mt76/mt7915/mt7915.h +0 -2
@@ -276,8 +276,6 @@ u32 mt7915_reg_map(struct mt7915_dev *dev, u32 addr);int mt7915_register_device (struct mt7915_dev *dev);void mt7915_unregister_device (struct mt7915_dev *dev); -int mt7915_register_ext_phy (struct mt7915_dev *dev); -void mt7915_unregister_ext_phy (struct mt7915_dev *dev);int mt7915_eeprom_init (struct mt7915_dev *dev);void mt7915_eeprom_parse_band_config (struct mt7915_phy *phy); int mt7915_eeprom_get_target_power(struct mt7915_dev *dev,
Signature · 1 line
2.26.2