Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'mt76-for-kvalo-2020-06-07' of https://github.com/nbd168/wireless

mt76 patches for 5.8

* tx queueing fixes for mt7615/22/63
* locking fix

# gpg: Signature made Sun 07 Jun 2020 06:17:47 PM EEST using DSA key ID 02A76EF5
# gpg: Good signature from "Felix Fietkau <nbd@nbd.name>"
# gpg: WARNING: This key is not certified with a trusted signature!
# gpg: There is no indication that the signature belongs to the owner.
# Primary key fingerprint: 75D1 1A7D 91A7 710F 4900 42EF D77D 141D 02A7 6EF5

+76 -47
+1
drivers/net/wireless/mediatek/mt76/mt76.h
··· 301 301 #define MT_DRV_TX_ALIGNED4_SKBS BIT(1) 302 302 #define MT_DRV_SW_RX_AIRTIME BIT(2) 303 303 #define MT_DRV_RX_DMA_HDR BIT(3) 304 + #define MT_DRV_HW_MGMT_TXQ BIT(4) 304 305 305 306 struct mt76_driver_ops { 306 307 u32 drv_flags;
+2
drivers/net/wireless/mediatek/mt76/mt7603/main.c
··· 642 642 { 643 643 struct mt7603_dev *dev = hw->priv; 644 644 645 + mutex_lock(&dev->mt76.mutex); 645 646 dev->coverage_class = max_t(s16, coverage_class, 0); 646 647 mt7603_mac_set_timing(dev); 648 + mutex_unlock(&dev->mt76.mutex); 647 649 } 648 650 649 651 static void mt7603_tx(struct ieee80211_hw *hw,
+5 -4
drivers/net/wireless/mediatek/mt76/mt7615/debugfs.c
··· 234 234 int i; 235 235 236 236 for (i = 0; i < 16; i++) { 237 - int j, acs = i / 4, index = i % 4; 237 + int j, wmm_idx = i % MT7615_MAX_WMM_SETS; 238 + int acs = i / MT7615_MAX_WMM_SETS; 238 239 u32 ctrl, val, qlen = 0; 239 240 240 - val = mt76_rr(dev, MT_PLE_AC_QEMPTY(acs, index)); 241 + val = mt76_rr(dev, MT_PLE_AC_QEMPTY(acs, wmm_idx)); 241 242 ctrl = BIT(31) | BIT(15) | (acs << 8); 242 243 243 244 for (j = 0; j < 32; j++) { ··· 246 245 continue; 247 246 248 247 mt76_wr(dev, MT_PLE_FL_Q0_CTRL, 249 - ctrl | (j + (index << 5))); 248 + ctrl | (j + (wmm_idx << 5))); 250 249 qlen += mt76_get_field(dev, MT_PLE_FL_Q3_CTRL, 251 250 GENMASK(11, 0)); 252 251 } 253 - seq_printf(s, "AC%d%d: queued=%d\n", acs, index, qlen); 252 + seq_printf(s, "AC%d%d: queued=%d\n", wmm_idx, acs, qlen); 254 253 } 255 254 256 255 return 0;
+5 -4
drivers/net/wireless/mediatek/mt76/mt7615/dma.c
··· 36 36 mt7622_init_tx_queues_multi(struct mt7615_dev *dev) 37 37 { 38 38 static const u8 wmm_queue_map[] = { 39 - MT7622_TXQ_AC0, 40 - MT7622_TXQ_AC1, 41 - MT7622_TXQ_AC2, 42 - MT7622_TXQ_AC3, 39 + [IEEE80211_AC_BK] = MT7622_TXQ_AC0, 40 + [IEEE80211_AC_BE] = MT7622_TXQ_AC1, 41 + [IEEE80211_AC_VI] = MT7622_TXQ_AC2, 42 + [IEEE80211_AC_VO] = MT7622_TXQ_AC3, 43 43 }; 44 44 int ret; 45 45 int i; ··· 100 100 int i; 101 101 102 102 mt76_queue_tx_cleanup(dev, MT_TXQ_MCU, false); 103 + mt76_queue_tx_cleanup(dev, MT_TXQ_PSD, false); 103 104 if (is_mt7615(&dev->mt76)) { 104 105 mt76_queue_tx_cleanup(dev, MT_TXQ_BE, false); 105 106 } else {
+8 -14
drivers/net/wireless/mediatek/mt76/mt7615/mac.c
··· 526 526 fc_type = (le16_to_cpu(fc) & IEEE80211_FCTL_FTYPE) >> 2; 527 527 fc_stype = (le16_to_cpu(fc) & IEEE80211_FCTL_STYPE) >> 4; 528 528 529 - if (ieee80211_is_data(fc) || ieee80211_is_bufferable_mmpdu(fc)) { 530 - q_idx = wmm_idx * MT7615_MAX_WMM_SETS + 531 - skb_get_queue_mapping(skb); 532 - p_fmt = is_usb ? MT_TX_TYPE_SF : MT_TX_TYPE_CT; 533 - } else if (beacon) { 534 - if (ext_phy) 535 - q_idx = MT_LMAC_BCN1; 536 - else 537 - q_idx = MT_LMAC_BCN0; 529 + if (beacon) { 538 530 p_fmt = MT_TX_TYPE_FW; 539 - } else { 540 - if (ext_phy) 541 - q_idx = MT_LMAC_ALTX1; 542 - else 543 - q_idx = MT_LMAC_ALTX0; 531 + q_idx = ext_phy ? MT_LMAC_BCN1 : MT_LMAC_BCN0; 532 + } else if (skb_get_queue_mapping(skb) >= MT_TXQ_PSD) { 544 533 p_fmt = is_usb ? MT_TX_TYPE_SF : MT_TX_TYPE_CT; 534 + q_idx = ext_phy ? MT_LMAC_ALTX1 : MT_LMAC_ALTX0; 535 + } else { 536 + p_fmt = is_usb ? MT_TX_TYPE_SF : MT_TX_TYPE_CT; 537 + q_idx = wmm_idx * MT7615_MAX_WMM_SETS + 538 + mt7615_lmac_mapping(dev, skb_get_queue_mapping(skb)); 545 539 } 546 540 547 541 val = FIELD_PREP(MT_TXD0_TX_BYTES, skb->len + sz_txd) |
-15
drivers/net/wireless/mediatek/mt76/mt7615/mac.h
··· 124 124 MT_TX_TYPE_FW, 125 125 }; 126 126 127 - enum tx_pkt_queue_idx { 128 - MT_LMAC_AC00, 129 - MT_LMAC_AC01, 130 - MT_LMAC_AC02, 131 - MT_LMAC_AC03, 132 - MT_LMAC_ALTX0 = 0x10, 133 - MT_LMAC_BMC0, 134 - MT_LMAC_BCN0, 135 - MT_LMAC_PSMP0, 136 - MT_LMAC_ALTX1, 137 - MT_LMAC_BMC1, 138 - MT_LMAC_BCN1, 139 - MT_LMAC_PSMP1, 140 - }; 141 - 142 127 enum tx_port_idx { 143 128 MT_TX_PORT_IDX_LMAC, 144 129 MT_TX_PORT_IDX_MCU
+4
drivers/net/wireless/mediatek/mt76/mt7615/main.c
··· 397 397 struct mt7615_vif *mvif = (struct mt7615_vif *)vif->drv_priv; 398 398 struct mt7615_dev *dev = mt7615_hw_dev(hw); 399 399 400 + queue = mt7615_lmac_mapping(dev, queue); 400 401 queue += mvif->wmm_idx * MT7615_MAX_WMM_SETS; 401 402 402 403 return mt7615_mcu_set_wmm(dev, queue, params); ··· 736 735 mt7615_set_coverage_class(struct ieee80211_hw *hw, s16 coverage_class) 737 736 { 738 737 struct mt7615_phy *phy = mt7615_hw_phy(hw); 738 + struct mt7615_dev *dev = phy->dev; 739 739 740 + mutex_lock(&dev->mt76.mutex); 740 741 phy->coverage_class = max_t(s16, coverage_class, 0); 741 742 mt7615_mac_set_timing(phy); 743 + mutex_unlock(&dev->mt76.mutex); 742 744 } 743 745 744 746 static int
+1 -1
drivers/net/wireless/mediatek/mt76/mt7615/mmio.c
··· 146 146 static const struct mt76_driver_ops drv_ops = { 147 147 /* txwi_size = txd size + txp size */ 148 148 .txwi_size = MT_TXD_SIZE + sizeof(struct mt7615_txp_common), 149 - .drv_flags = MT_DRV_TXWI_NO_FREE, 149 + .drv_flags = MT_DRV_TXWI_NO_FREE | MT_DRV_HW_MGMT_TXQ, 150 150 .survey_flags = SURVEY_INFO_TIME_TX | 151 151 SURVEY_INFO_TIME_RX | 152 152 SURVEY_INFO_TIME_BSS_RX,
+30
drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h
··· 282 282 struct list_head wd_head; 283 283 }; 284 284 285 + enum tx_pkt_queue_idx { 286 + MT_LMAC_AC00, 287 + MT_LMAC_AC01, 288 + MT_LMAC_AC02, 289 + MT_LMAC_AC03, 290 + MT_LMAC_ALTX0 = 0x10, 291 + MT_LMAC_BMC0, 292 + MT_LMAC_BCN0, 293 + MT_LMAC_PSMP0, 294 + MT_LMAC_ALTX1, 295 + MT_LMAC_BMC1, 296 + MT_LMAC_BCN1, 297 + MT_LMAC_PSMP1, 298 + }; 299 + 285 300 enum { 286 301 HW_BSSID_0 = 0x0, 287 302 HW_BSSID_1, ··· 460 445 return MT7663_WTBL_SIZE; 461 446 else 462 447 return MT7615_WTBL_SIZE; 448 + } 449 + 450 + static inline u8 mt7615_lmac_mapping(struct mt7615_dev *dev, u8 ac) 451 + { 452 + static const u8 lmac_queue_map[] = { 453 + [IEEE80211_AC_BK] = MT_LMAC_AC00, 454 + [IEEE80211_AC_BE] = MT_LMAC_AC01, 455 + [IEEE80211_AC_VI] = MT_LMAC_AC02, 456 + [IEEE80211_AC_VO] = MT_LMAC_AC03, 457 + }; 458 + 459 + if (WARN_ON_ONCE(ac >= ARRAY_SIZE(lmac_queue_map))) 460 + return MT_LMAC_AC01; /* BE */ 461 + 462 + return lmac_queue_map[ac]; 463 463 } 464 464 465 465 void mt7615_dma_reset(struct mt7615_dev *dev);
+1 -1
drivers/net/wireless/mediatek/mt76/mt7615/usb.c
··· 270 270 { 271 271 static const struct mt76_driver_ops drv_ops = { 272 272 .txwi_size = MT_USB_TXD_SIZE, 273 - .drv_flags = MT_DRV_RX_DMA_HDR, 273 + .drv_flags = MT_DRV_RX_DMA_HDR | MT_DRV_HW_MGMT_TXQ, 274 274 .tx_prepare_skb = mt7663u_tx_prepare_skb, 275 275 .tx_complete_skb = mt7663u_tx_complete_skb, 276 276 .tx_status_data = mt7663u_tx_status_data,
+3
drivers/net/wireless/mediatek/mt76/mt7915/main.c
··· 716 716 mt7915_set_coverage_class(struct ieee80211_hw *hw, s16 coverage_class) 717 717 { 718 718 struct mt7915_phy *phy = mt7915_hw_phy(hw); 719 + struct mt7915_dev *dev = phy->dev; 719 720 721 + mutex_lock(&dev->mt76.mutex); 720 722 phy->coverage_class = max_t(s16, coverage_class, 0); 721 723 mt7915_mac_set_timing(phy); 724 + mutex_unlock(&dev->mt76.mutex); 722 725 } 723 726 724 727 static int
+7
drivers/net/wireless/mediatek/mt76/tx.c
··· 264 264 skb_set_queue_mapping(skb, qid); 265 265 } 266 266 267 + if ((dev->drv->drv_flags & MT_DRV_HW_MGMT_TXQ) && 268 + !ieee80211_is_data(hdr->frame_control) && 269 + !ieee80211_is_bufferable_mmpdu(hdr->frame_control)) { 270 + qid = MT_TXQ_PSD; 271 + skb_set_queue_mapping(skb, qid); 272 + } 273 + 267 274 if (!(wcid->tx_info & MT_WCID_TX_INFO_SET)) 268 275 ieee80211_get_tx_rates(info->control.vif, sta, skb, 269 276 info->control.rates, 1);
+9 -8
drivers/net/wireless/mediatek/mt76/usb.c
··· 1010 1010 static u8 mt76u_ac_to_hwq(struct mt76_dev *dev, u8 ac) 1011 1011 { 1012 1012 if (mt76_chip(dev) == 0x7663) { 1013 - static const u8 wmm_queue_map[] = { 1014 - [IEEE80211_AC_VO] = 0, 1015 - [IEEE80211_AC_VI] = 1, 1016 - [IEEE80211_AC_BE] = 2, 1017 - [IEEE80211_AC_BK] = 4, 1013 + static const u8 lmac_queue_map[] = { 1014 + /* ac to lmac mapping */ 1015 + [IEEE80211_AC_BK] = 0, 1016 + [IEEE80211_AC_BE] = 1, 1017 + [IEEE80211_AC_VI] = 2, 1018 + [IEEE80211_AC_VO] = 4, 1018 1019 }; 1019 1020 1020 - if (WARN_ON(ac >= ARRAY_SIZE(wmm_queue_map))) 1021 - return 2; /* BE */ 1021 + if (WARN_ON(ac >= ARRAY_SIZE(lmac_queue_map))) 1022 + return 1; /* BE */ 1022 1023 1023 - return wmm_queue_map[ac]; 1024 + return lmac_queue_map[ac]; 1024 1025 } 1025 1026 1026 1027 return mt76_ac_to_hwq(ac);