···942942 for (chains = status->chains; chains; chains >>= 1, chain_signal++) {943943 int cur, diff;944944945945- if (!(chains & BIT(0)))945945+ cur = *chain_signal;946946+ if (!(chains & BIT(0)) ||947947+ cur > 0)946948 continue;947949948948- cur = *chain_signal;949950 if (cur > signal)950951 swap(cur, signal);951952
···271271 case MT76_TM_TX_MODE_OFDM:272272 if (mphy->chandef.chan->band == NL80211_BAND_5GHZ)273273 sband = &mphy->sband_5g.sband;274274+ else if (mphy->chandef.chan->band == NL80211_BAND_6GHZ)275275+ sband = &mphy->sband_6g.sband;274276 else275277 sband = &mphy->sband_2g.sband;276278···574572575573 if (chandef->chan->band == NL80211_BAND_5GHZ)576574 sband = &phy->mt76->sband_5g.sband;575575+ else if (chandef->chan->band == NL80211_BAND_6GHZ)576576+ sband = &phy->mt76->sband_6g.sband;577577 else578578 sband = &phy->mt76->sband_2g.sband;579579
+11
drivers/net/wireless/mediatek/mt76/mt7921/Kconfig
···2424 This adds support for MT7921S 802.11ax 2x2:2SS wireless devices.25252626 To compile this driver as a module, choose M here.2727+2828+config MT7921U2929+ tristate "MediaTek MT7921U (USB) support"3030+ select MT76_USB3131+ select MT7921_COMMON3232+ depends on MAC802113333+ depends on USB3434+ help3535+ This adds support for MT7921U 802.11ax 2x2:2SS wireless devices.3636+3737+ To compile this driver as a module, choose M here.
···129129130130 mt7921_mutex_acquire(dev);131131132132- for (i = 0; i < 16; i++) {133133- int j, acs = i / 4, index = i % 4;132132+ for (i = 0; i < 4; i++) {134133 u32 ctrl, val, qlen = 0;134134+ int j;135135136136- val = mt76_rr(dev, MT_PLE_AC_QEMPTY(acs, index));137137- ctrl = BIT(31) | BIT(15) | (acs << 8);136136+ val = mt76_rr(dev, MT_PLE_AC_QEMPTY(i));137137+ ctrl = BIT(31) | BIT(11) | (i << 24);138138139139 for (j = 0; j < 32; j++) {140140 if (val & BIT(j))141141 continue;142142143143- mt76_wr(dev, MT_PLE_FL_Q0_CTRL,144144- ctrl | (j + (index << 5)));143143+ mt76_wr(dev, MT_PLE_FL_Q0_CTRL, ctrl | j);145144 qlen += mt76_get_field(dev, MT_PLE_FL_Q3_CTRL,146145 GENMASK(11, 0));147146 }148148- seq_printf(s, "AC%d%d: queued=%d\n", acs, index, qlen);147147+ seq_printf(s, "AC%d: queued=%d\n", i, qlen);149148 }150149151150 mt7921_mutex_release(dev);···267268 struct mt7921_dev *dev = data;268269 struct mt76_connac_pm *pm = &dev->pm;269270271271+ if (mt76_is_usb(&dev->mt76))272272+ return -EOPNOTSUPP;273273+270274 mutex_lock(&dev->mt76.mutex);271275272276 if (val == pm->enable_user)···313311 struct mt76_connac_pm *pm = &dev->pm;314312 bool monitor = !!(dev->mphy.hw->conf.flags & IEEE80211_CONF_MONITOR);315313 bool enable = !!val;314314+315315+ if (mt76_is_usb(&dev->mt76))316316+ return -EOPNOTSUPP;316317317318 mt7921_mutex_acquire(dev);318319 if (pm->ds_enable_user == enable)···434429 if (!dir)435430 return -ENOMEM;436431437437- debugfs_create_devm_seqfile(dev->mt76.dev, "queues", dir,438438- mt7921_queues_read);432432+ if (mt76_is_mmio(&dev->mt76))433433+ debugfs_create_devm_seqfile(dev->mt76.dev, "xmit-queues",434434+ dir, mt7921_queues_read);435435+ else436436+ debugfs_create_devm_seqfile(dev->mt76.dev, "xmit-queues",437437+ dir, mt76_queues_read);438438+439439 debugfs_create_devm_seqfile(dev->mt76.dev, "acq", dir,440440 mt7921_queues_acq);441441 debugfs_create_devm_seqfile(dev->mt76.dev, "txpower_sku", dir,
+1-1
drivers/net/wireless/mediatek/mt76/mt7921/dma.c
···55#include "../dma.h"66#include "mac.h"7788-int mt7921_init_tx_queues(struct mt7921_phy *phy, int idx, int n_desc)88+static int mt7921_init_tx_queues(struct mt7921_phy *phy, int idx, int n_desc)99{1010 int i, err;1111
+50-24
drivers/net/wireless/mediatek/mt76/mt7921/init.c
···165165166166static int mt7921_init_hardware(struct mt7921_dev *dev)167167{168168- int ret, idx, i;168168+ int ret, i;169169170170 set_bit(MT76_STATE_INITIALIZED, &dev->mphy.state);171171···182182 return ret;183183 }184184185185+ return 0;186186+}187187+188188+static int mt7921_init_wcid(struct mt7921_dev *dev)189189+{190190+ int idx;191191+185192 /* Beacon and mgmt frames should occupy wcid 0 */186193 idx = mt76_wcid_alloc(dev->mt76.wcid_mask, MT7921_WTBL_STA - 1);187194 if (idx)···200193 rcu_assign_pointer(dev->mt76.wcid[idx], &dev->mt76.global_wcid);201194202195 return 0;196196+}197197+198198+static void mt7921_init_work(struct work_struct *work)199199+{200200+ struct mt7921_dev *dev = container_of(work, struct mt7921_dev,201201+ init_work);202202+ int ret;203203+204204+ ret = mt7921_init_hardware(dev);205205+ if (ret)206206+ return;207207+208208+ mt76_set_stream_caps(&dev->mphy, true);209209+ mt7921_set_stream_he_caps(&dev->phy);210210+211211+ ret = mt76_register_device(&dev->mt76, true, mt76_rates,212212+ ARRAY_SIZE(mt76_rates));213213+ if (ret) {214214+ dev_err(dev->mt76.dev, "register device failed\n");215215+ return;216216+ }217217+218218+ ret = mt7921_init_debugfs(dev);219219+ if (ret) {220220+ dev_err(dev->mt76.dev, "register debugfs failed\n");221221+ return;222222+ }223223+224224+ /* we support chip reset now */225225+ dev->hw_init_done = true;226226+227227+ mt76_connac_mcu_set_deep_sleep(&dev->mt76, dev->pm.ds_enable);203228}204229205230int mt7921_register_device(struct mt7921_dev *dev)···261222 spin_lock_init(&dev->sta_poll_lock);262223263224 INIT_WORK(&dev->reset_work, mt7921_mac_reset_work);225225+ INIT_WORK(&dev->init_work, mt7921_init_work);264226265227 dev->pm.idle_timeout = MT7921_PM_TIMEOUT;266228 dev->pm.stats.last_wake_event = jiffies;267229 dev->pm.stats.last_doze_event = jiffies;268268- dev->pm.enable_user = true;269269- dev->pm.enable = true;270270- dev->pm.ds_enable_user = true;271271- dev->pm.ds_enable = true;230230+ if (!mt76_is_usb(&dev->mt76)) {231231+ dev->pm.enable_user = true;232232+ dev->pm.enable = true;233233+ dev->pm.ds_enable_user = true;234234+ dev->pm.ds_enable = true;235235+ }272236273273- if (mt76_is_sdio(&dev->mt76))237237+ if (!mt76_is_mmio(&dev->mt76))274238 hw->extra_tx_headroom += MT_SDIO_TXD_SIZE + MT_SDIO_HDR_SIZE;275239276276- ret = mt7921_init_hardware(dev);240240+ ret = mt7921_init_wcid(dev);277241 if (ret)278242 return ret;279243···304262 dev->mphy.hw->wiphy->available_antennas_rx = dev->mphy.chainmask;305263 dev->mphy.hw->wiphy->available_antennas_tx = dev->mphy.chainmask;306264307307- mt76_set_stream_caps(&dev->mphy, true);308308- mt7921_set_stream_he_caps(&dev->phy);309309-310310- ret = mt76_register_device(&dev->mt76, true, mt76_rates,311311- ARRAY_SIZE(mt76_rates));312312- if (ret)313313- return ret;314314-315315- ret = mt7921_init_debugfs(dev);316316- if (ret)317317- return ret;318318-319319- ret = mt76_connac_mcu_set_deep_sleep(&dev->mt76, dev->pm.ds_enable);320320- if (ret)321321- return ret;322322-323323- dev->hw_init_done = true;265265+ queue_work(system_wq, &dev->init_work);324266325267 return 0;326268}
···137137138138 wcid_idx = wcid->idx;139139 } else {140140- wcid_idx = FIELD_GET(MT_TXD1_WLAN_IDX, le32_to_cpu(txwi[1]));140140+ wcid_idx = le32_get_bits(txwi[1], MT_TXD1_WLAN_IDX);141141 }142142143143 __mt76_tx_complete_skb(mdev, wcid_idx, t->skb, free_list);···164164 mt76_queue_tx_cleanup(dev, dev->mphy.q_tx[MT_TXQ_PSD], false);165165 mt76_queue_tx_cleanup(dev, dev->mphy.q_tx[MT_TXQ_BE], false);166166167167- /* TODO: MT_TX_FREE_LATENCY is msdu time from the TXD is queued into PLE,168168- * to the time ack is received or dropped by hw (air + hw queue time).169169- * Should avoid accessing WTBL to get Tx airtime, and use it instead.170170- */171171- count = FIELD_GET(MT_TX_FREE_MSDU_CNT, le16_to_cpu(free->ctrl));167167+ count = le16_get_bits(free->ctrl, MT_TX_FREE_MSDU_CNT);172168 if (WARN_ON_ONCE((void *)&free->info[count] > end))173169 return;174170···227231 __le32 *end = (__le32 *)&rxd[len / 4];228232 enum rx_pkt_type type;229233230230- type = FIELD_GET(MT_RXD0_PKT_TYPE, le32_to_cpu(rxd[0]));234234+ type = le32_get_bits(rxd[0], MT_RXD0_PKT_TYPE);235235+231236 switch (type) {232237 case PKT_TYPE_TXRX_NOTIFY:233238 mt7921e_mac_tx_free(dev, data, len);···249252 __le32 *rxd = (__le32 *)skb->data;250253 enum rx_pkt_type type;251254252252- type = FIELD_GET(MT_RXD0_PKT_TYPE, le32_to_cpu(rxd[0]));255255+ type = le32_get_bits(rxd[0], MT_RXD0_PKT_TYPE);253256254257 switch (type) {255258 case PKT_TYPE_TXRX_NOTIFY: