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

Merge tag 'wireless-next-2023-01-23' of git://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless-next

Kalle Valo says:

====================
wireless-next patches for v6.3

First set of patches for v6.3. The most important change here is that
the old Wireless Extension user space interface is not supported on
Wi-Fi 7 devices at all. We also added a warning if anyone with modern
drivers (ie. cfg80211 and mac80211 drivers) tries to use Wireless
Extensions, everyone should switch to using nl80211 interface instead.

Static WEP support is removed, there wasn't any driver using that
anyway so there's no user impact. Otherwise it's smaller features and
fixes as usual.

Note: As mt76 had tricky conflicts due to the fixes in wireless tree,
we decided to merge wireless into wireless-next to solve them easily.
There should not be any merge problems anymore.

Major changes:

cfg80211
- remove never used static WEP support
- warn if Wireless Extention interface is used with cfg80211/mac80211 drivers
- stop supporting Wireless Extensions with Wi-Fi 7 devices
- support minimal Wi-Fi 7 Extremely High Throughput (EHT) rate reporting

rfkill
- add GPIO DT support

bitfield
- add FIELD_PREP_CONST()

mt76
- per-PHY LED support

rtw89
- support new Bluetooth co-existance version

rtl8xxxu
- support RTL8188EU

* tag 'wireless-next-2023-01-23' of git://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless-next: (123 commits)
wifi: wireless: deny wireless extensions on MLO-capable devices
wifi: wireless: warn on most wireless extension usage
wifi: mac80211: drop extra 'e' from ieeee80211... name
wifi: cfg80211: Deduplicate certificate loading
bitfield: add FIELD_PREP_CONST()
wifi: mac80211: add kernel-doc for EHT structure
mac80211: support minimal EHT rate reporting on RX
wifi: mac80211: Add HE MU-MIMO related flags in ieee80211_bss_conf
wifi: mac80211: Add VHT MU-MIMO related flags in ieee80211_bss_conf
wifi: cfg80211: Use MLD address to indicate MLD STA disconnection
wifi: cfg80211: Support 32 bytes KCK key in GTK rekey offload
wifi: cfg80211: Fix extended KCK key length check in nl80211_set_rekey_data()
wifi: cfg80211: remove support for static WEP
wifi: rtl8xxxu: Dump the efuse only for untested devices
wifi: rtl8xxxu: Print the ROM version too
wifi: rtw88: Use non-atomic sta iterator in rtw_ra_mask_info_update()
wifi: rtw88: Use rtw_iterate_vifs() for rtw_vif_watch_dog_iter()
wifi: rtw88: Move register access from rtw_bf_assoc() outside the RCU
wifi: rtl8xxxu: Use a longer retry limit of 48
wifi: rtl8xxxu: Report the RSSI to the firmware
...
====================

Link: https://lore.kernel.org/r/20230123103338.330CBC433EF@smtp.kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>

+5095 -1357
+51
Documentation/devicetree/bindings/net/rfkill-gpio.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/net/rfkill-gpio.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: GPIO controlled rfkill switch 8 + 9 + maintainers: 10 + - Johannes Berg <johannes@sipsolutions.net> 11 + - Philipp Zabel <p.zabel@pengutronix.de> 12 + 13 + properties: 14 + compatible: 15 + const: rfkill-gpio 16 + 17 + label: 18 + description: rfkill switch name, defaults to node name 19 + 20 + radio-type: 21 + description: rfkill radio type 22 + enum: 23 + - bluetooth 24 + - fm 25 + - gps 26 + - nfc 27 + - ultrawideband 28 + - wimax 29 + - wlan 30 + - wwan 31 + 32 + shutdown-gpios: 33 + maxItems: 1 34 + 35 + required: 36 + - compatible 37 + - radio-type 38 + - shutdown-gpios 39 + 40 + additionalProperties: false 41 + 42 + examples: 43 + - | 44 + #include <dt-bindings/gpio/gpio.h> 45 + 46 + rfkill { 47 + compatible = "rfkill-gpio"; 48 + label = "rfkill-pcie-wlan"; 49 + radio-type = "wlan"; 50 + shutdown-gpios = <&gpio2 25 GPIO_ACTIVE_HIGH>; 51 + };
+1
crypto/asymmetric_keys/x509_loader.c
··· 55 55 pr_err("Problem parsing in-kernel X.509 certificate list\n"); 56 56 return 0; 57 57 } 58 + EXPORT_SYMBOL_GPL(x509_load_certificate_list);
+2 -2
drivers/net/wireless/ath/ath11k/wmi.c
··· 3853 3853 3854 3854 switch (ev->evt_type) { 3855 3855 case WMI_BSS_COLOR_COLLISION_DETECTION: 3856 - ieeee80211_obss_color_collision_notify(arvif->vif, ev->obss_color_bitmap, 3857 - GFP_KERNEL); 3856 + ieee80211_obss_color_collision_notify(arvif->vif, ev->obss_color_bitmap, 3857 + GFP_KERNEL); 3858 3858 ath11k_dbg(ab, ATH11K_DBG_WMI, 3859 3859 "OBSS color collision detected vdev:%d, event:%d, bitmap:%08llx\n", 3860 3860 ev->vdev_id, ev->evt_type, ev->obss_color_bitmap);
+5 -2
drivers/net/wireless/broadcom/brcm80211/brcmfmac/common.c
··· 299 299 err); 300 300 goto done; 301 301 } 302 + buf[sizeof(buf) - 1] = '\0'; 302 303 ptr = (char *)buf; 303 304 strsep(&ptr, "\n"); 304 305 ··· 320 319 if (err) { 321 320 brcmf_dbg(TRACE, "retrieving clmver failed, %d\n", err); 322 321 } else { 322 + buf[sizeof(buf) - 1] = '\0'; 323 323 clmver = (char *)buf; 324 - /* store CLM version for adding it to revinfo debugfs file */ 325 - memcpy(ifp->drvr->clmver, clmver, sizeof(ifp->drvr->clmver)); 326 324 327 325 /* Replace all newline/linefeed characters with space 328 326 * character 329 327 */ 330 328 strreplace(clmver, '\n', ' '); 329 + 330 + /* store CLM version for adding it to revinfo debugfs file */ 331 + memcpy(ifp->drvr->clmver, clmver, sizeof(ifp->drvr->clmver)); 331 332 332 333 brcmf_dbg(INFO, "CLM version = %s\n", clmver); 333 334 }
+1
drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c
··· 336 336 bphy_err(drvr, "%s: failed to expand headroom\n", 337 337 brcmf_ifname(ifp)); 338 338 atomic_inc(&drvr->bus_if->stats.pktcow_failed); 339 + dev_kfree_skb(skb); 339 340 goto done; 340 341 } 341 342 }
+4 -1
drivers/net/wireless/broadcom/brcm80211/brcmfmac/msgbuf.c
··· 347 347 count++; 348 348 } while (count < pktids->array_size); 349 349 350 - if (count == pktids->array_size) 350 + if (count == pktids->array_size) { 351 + dma_unmap_single(dev, *physaddr, skb->len - data_offset, 352 + pktids->direction); 351 353 return -ENOMEM; 354 + } 352 355 353 356 array[*idx].data_offset = data_offset; 354 357 array[*idx].physaddr = *physaddr;
+8 -3
drivers/net/wireless/intel/ipw2x00/ipw2200.c
··· 3427 3427 dma_unmap_single(&priv->pci_dev->dev, 3428 3428 rxq->pool[i].dma_addr, 3429 3429 IPW_RX_BUF_SIZE, DMA_FROM_DEVICE); 3430 - dev_kfree_skb(rxq->pool[i].skb); 3430 + dev_kfree_skb_irq(rxq->pool[i].skb); 3431 3431 rxq->pool[i].skb = NULL; 3432 3432 } 3433 3433 list_add_tail(&rxq->pool[i].list, &rxq->rx_used); ··· 11383 11383 set_wiphy_dev(wdev->wiphy, &priv->pci_dev->dev); 11384 11384 11385 11385 /* With that information in place, we can now register the wiphy... */ 11386 - if (wiphy_register(wdev->wiphy)) 11387 - rc = -EIO; 11386 + rc = wiphy_register(wdev->wiphy); 11387 + if (rc) 11388 + goto out; 11389 + 11390 + return 0; 11388 11391 out: 11392 + kfree(priv->ieee->a_band.channels); 11393 + kfree(priv->ieee->bg_band.channels); 11389 11394 return rc; 11390 11395 } 11391 11396
+2 -2
drivers/net/wireless/intel/iwlegacy/common.c
··· 5174 5174 memset(&il->current_ht_config, 0, sizeof(struct il_ht_config)); 5175 5175 5176 5176 /* new association get rid of ibss beacon skb */ 5177 - dev_kfree_skb(il->beacon_skb); 5177 + dev_consume_skb_irq(il->beacon_skb); 5178 5178 il->beacon_skb = NULL; 5179 5179 il->timestamp = 0; 5180 5180 ··· 5293 5293 } 5294 5294 5295 5295 spin_lock_irqsave(&il->lock, flags); 5296 - dev_kfree_skb(il->beacon_skb); 5296 + dev_consume_skb_irq(il->beacon_skb); 5297 5297 il->beacon_skb = skb; 5298 5298 5299 5299 timestamp = ((struct ieee80211_mgmt *)skb->data)->u.beacon.timestamp;
+2
drivers/net/wireless/intersil/orinoco/hw.c
··· 931 931 err = hermes_write_wordrec(hw, USER_BAP, 932 932 HERMES_RID_CNFAUTHENTICATION_AGERE, 933 933 auth_flag); 934 + if (err) 935 + return err; 934 936 } 935 937 err = hermes_write_wordrec(hw, USER_BAP, 936 938 HERMES_RID_CNFWEPENABLED_AGERE,
+1 -1
drivers/net/wireless/marvell/libertas/cmdresp.c
··· 48 48 49 49 /* Free Tx and Rx packets */ 50 50 spin_lock_irqsave(&priv->driver_lock, flags); 51 - kfree_skb(priv->currenttxskb); 51 + dev_kfree_skb_irq(priv->currenttxskb); 52 52 priv->currenttxskb = NULL; 53 53 priv->tx_pending_len = 0; 54 54 spin_unlock_irqrestore(&priv->driver_lock, flags);
+1 -1
drivers/net/wireless/marvell/libertas/if_usb.c
··· 637 637 priv->resp_len[i] = (recvlength - MESSAGE_HEADER_LEN); 638 638 memcpy(priv->resp_buf[i], recvbuff + MESSAGE_HEADER_LEN, 639 639 priv->resp_len[i]); 640 - kfree_skb(skb); 640 + dev_kfree_skb_irq(skb); 641 641 lbs_notify_command_response(priv, i); 642 642 643 643 spin_unlock_irqrestore(&priv->driver_lock, flags);
+2 -1
drivers/net/wireless/marvell/libertas/main.c
··· 216 216 217 217 spin_lock_irqsave(&priv->driver_lock, flags); 218 218 priv->iface_running = false; 219 - kfree_skb(priv->currenttxskb); 219 + dev_kfree_skb_irq(priv->currenttxskb); 220 220 priv->currenttxskb = NULL; 221 221 priv->tx_pending_len = 0; 222 222 spin_unlock_irqrestore(&priv->driver_lock, flags); ··· 869 869 ret = kfifo_alloc(&priv->event_fifo, sizeof(u32) * 16, GFP_KERNEL); 870 870 if (ret) { 871 871 pr_err("Out of memory allocating event FIFO buffer\n"); 872 + lbs_free_cmd_buffer(priv); 872 873 goto out; 873 874 } 874 875
+1 -1
drivers/net/wireless/marvell/libertas_tf/if_usb.c
··· 613 613 spin_lock_irqsave(&priv->driver_lock, flags); 614 614 memcpy(priv->cmd_resp_buff, recvbuff + MESSAGE_HEADER_LEN, 615 615 recvlength - MESSAGE_HEADER_LEN); 616 - kfree_skb(skb); 616 + dev_kfree_skb_irq(skb); 617 617 lbtf_cmd_response_rx(priv); 618 618 spin_unlock_irqrestore(&priv->driver_lock, flags); 619 619 }
+1 -1
drivers/net/wireless/mediatek/mt76/debugfs.c
··· 112 112 if (!dir) 113 113 return NULL; 114 114 115 - debugfs_create_u8("led_pin", 0600, dir, &dev->led_pin); 115 + debugfs_create_u8("led_pin", 0600, dir, &phy->leds.pin); 116 116 debugfs_create_u32("regidx", 0600, dir, &dev->debugfs_reg); 117 117 debugfs_create_file_unsafe("regval", 0600, dir, dev, fops); 118 118 debugfs_create_file_unsafe("napi_threaded", 0600, dir, dev,
+1 -15
drivers/net/wireless/mediatek/mt76/dma.c
··· 582 582 return ret; 583 583 } 584 584 585 - static struct page_frag_cache * 586 - mt76_dma_rx_get_frag_cache(struct mt76_dev *dev, struct mt76_queue *q) 587 - { 588 - struct page_frag_cache *rx_page = &q->rx_page; 589 - 590 - #ifdef CONFIG_NET_MEDIATEK_SOC_WED 591 - if ((q->flags & MT_QFLAG_WED) && 592 - FIELD_GET(MT_QFLAG_WED_TYPE, q->flags) == MT76_WED_Q_RX) 593 - rx_page = &dev->mmio.wed.rx_buf_ring.rx_page; 594 - #endif 595 - return rx_page; 596 - } 597 - 598 585 static int 599 586 mt76_dma_rx_fill(struct mt76_dev *dev, struct mt76_queue *q) 600 587 { 601 - struct page_frag_cache *rx_page = mt76_dma_rx_get_frag_cache(dev, q); 602 588 int len = SKB_WITH_OVERHEAD(q->buf_size); 603 589 int frames = 0, offset = q->buf_offset; 604 590 dma_addr_t addr; ··· 598 612 struct mt76_queue_buf qbuf; 599 613 void *buf = NULL; 600 614 601 - buf = page_frag_alloc(rx_page, q->buf_size, GFP_ATOMIC); 615 + buf = page_frag_alloc(&q->rx_page, q->buf_size, GFP_ATOMIC); 602 616 if (!buf) 603 617 break; 604 618
+35 -21
drivers/net/wireless/mediatek/mt76/mac80211.c
··· 192 192 .freq_ranges = &mt76_sar_freq_ranges[0], 193 193 }; 194 194 195 - static int mt76_led_init(struct mt76_dev *dev) 195 + static int mt76_led_init(struct mt76_phy *phy) 196 196 { 197 - struct device_node *np = dev->dev->of_node; 198 - struct ieee80211_hw *hw = dev->hw; 199 - int led_pin; 197 + struct mt76_dev *dev = phy->dev; 198 + struct ieee80211_hw *hw = phy->hw; 200 199 201 - if (!dev->led_cdev.brightness_set && !dev->led_cdev.blink_set) 200 + if (!phy->leds.cdev.brightness_set && !phy->leds.cdev.blink_set) 202 201 return 0; 203 202 204 - snprintf(dev->led_name, sizeof(dev->led_name), 205 - "mt76-%s", wiphy_name(hw->wiphy)); 203 + snprintf(phy->leds.name, sizeof(phy->leds.name), "mt76-%s", 204 + wiphy_name(hw->wiphy)); 206 205 207 - dev->led_cdev.name = dev->led_name; 208 - dev->led_cdev.default_trigger = 206 + phy->leds.cdev.name = phy->leds.name; 207 + phy->leds.cdev.default_trigger = 209 208 ieee80211_create_tpt_led_trigger(hw, 210 209 IEEE80211_TPT_LEDTRIG_FL_RADIO, 211 210 mt76_tpt_blink, 212 211 ARRAY_SIZE(mt76_tpt_blink)); 213 212 214 - np = of_get_child_by_name(np, "led"); 215 - if (np) { 216 - if (!of_property_read_u32(np, "led-sources", &led_pin)) 217 - dev->led_pin = led_pin; 218 - dev->led_al = of_property_read_bool(np, "led-active-low"); 219 - of_node_put(np); 213 + if (phy == &dev->phy) { 214 + struct device_node *np = dev->dev->of_node; 215 + 216 + np = of_get_child_by_name(np, "led"); 217 + if (np) { 218 + int led_pin; 219 + 220 + if (!of_property_read_u32(np, "led-sources", &led_pin)) 221 + phy->leds.pin = led_pin; 222 + phy->leds.al = of_property_read_bool(np, 223 + "led-active-low"); 224 + of_node_put(np); 225 + } 220 226 } 221 227 222 - return led_classdev_register(dev->dev, &dev->led_cdev); 228 + return led_classdev_register(dev->dev, &phy->leds.cdev); 223 229 } 224 230 225 - static void mt76_led_cleanup(struct mt76_dev *dev) 231 + static void mt76_led_cleanup(struct mt76_phy *phy) 226 232 { 227 - if (!dev->led_cdev.brightness_set && !dev->led_cdev.blink_set) 233 + if (!phy->leds.cdev.brightness_set && !phy->leds.cdev.blink_set) 228 234 return; 229 235 230 - led_classdev_unregister(&dev->led_cdev); 236 + led_classdev_unregister(&phy->leds.cdev); 231 237 } 232 238 233 239 static void mt76_init_stream_cap(struct mt76_phy *phy, ··· 523 517 return ret; 524 518 } 525 519 520 + if (IS_ENABLED(CONFIG_MT76_LEDS)) { 521 + ret = mt76_led_init(phy); 522 + if (ret) 523 + return ret; 524 + } 525 + 526 526 wiphy_read_of_freq_limits(phy->hw->wiphy); 527 527 mt76_check_sband(phy, &phy->sband_2g, NL80211_BAND_2GHZ); 528 528 mt76_check_sband(phy, &phy->sband_5g, NL80211_BAND_5GHZ); ··· 548 536 { 549 537 struct mt76_dev *dev = phy->dev; 550 538 539 + if (IS_ENABLED(CONFIG_MT76_LEDS)) 540 + mt76_led_cleanup(phy); 551 541 mt76_tx_status_check(dev, true); 552 542 ieee80211_unregister_hw(phy->hw); 553 543 dev->phys[phy->band_idx] = NULL; ··· 667 653 mt76_check_sband(&dev->phy, &phy->sband_6g, NL80211_BAND_6GHZ); 668 654 669 655 if (IS_ENABLED(CONFIG_MT76_LEDS)) { 670 - ret = mt76_led_init(dev); 656 + ret = mt76_led_init(phy); 671 657 if (ret) 672 658 return ret; 673 659 } ··· 688 674 struct ieee80211_hw *hw = dev->hw; 689 675 690 676 if (IS_ENABLED(CONFIG_MT76_LEDS)) 691 - mt76_led_cleanup(dev); 677 + mt76_led_cleanup(&dev->phy); 692 678 mt76_tx_status_check(dev, true); 693 679 ieee80211_unregister_hw(hw); 694 680 }
+7 -5
drivers/net/wireless/mediatek/mt76/mt76.h
··· 731 731 } rx_amsdu[__MT_RXQ_MAX]; 732 732 733 733 struct mt76_freq_range_power *frp; 734 + 735 + struct { 736 + struct led_classdev cdev; 737 + char name[32]; 738 + bool al; 739 + u8 pin; 740 + } leds; 734 741 }; 735 742 736 743 struct mt76_dev { ··· 818 811 enum nl80211_dfs_regions region; 819 812 820 813 u32 debugfs_reg; 821 - 822 - struct led_classdev led_cdev; 823 - char led_name[32]; 824 - bool led_al; 825 - u8 led_pin; 826 814 827 815 u8 csa_complete; 828 816
+17 -17
drivers/net/wireless/mediatek/mt76/mt7603/init.c
··· 330 330 } 331 331 }; 332 332 333 - static void mt7603_led_set_config(struct mt76_dev *mt76, u8 delay_on, 333 + static void mt7603_led_set_config(struct mt76_phy *mphy, u8 delay_on, 334 334 u8 delay_off) 335 335 { 336 - struct mt7603_dev *dev = container_of(mt76, struct mt7603_dev, 336 + struct mt7603_dev *dev = container_of(mphy->dev, struct mt7603_dev, 337 337 mt76); 338 338 u32 val, addr; 339 339 ··· 341 341 FIELD_PREP(MT_LED_STATUS_OFF, delay_off) | 342 342 FIELD_PREP(MT_LED_STATUS_ON, delay_on); 343 343 344 - addr = mt7603_reg_map(dev, MT_LED_STATUS_0(mt76->led_pin)); 344 + addr = mt7603_reg_map(dev, MT_LED_STATUS_0(mphy->leds.pin)); 345 345 mt76_wr(dev, addr, val); 346 - addr = mt7603_reg_map(dev, MT_LED_STATUS_1(mt76->led_pin)); 346 + addr = mt7603_reg_map(dev, MT_LED_STATUS_1(mphy->leds.pin)); 347 347 mt76_wr(dev, addr, val); 348 348 349 - val = MT_LED_CTRL_REPLAY(mt76->led_pin) | 350 - MT_LED_CTRL_KICK(mt76->led_pin); 351 - if (mt76->led_al) 352 - val |= MT_LED_CTRL_POLARITY(mt76->led_pin); 349 + val = MT_LED_CTRL_REPLAY(mphy->leds.pin) | 350 + MT_LED_CTRL_KICK(mphy->leds.pin); 351 + if (mphy->leds.al) 352 + val |= MT_LED_CTRL_POLARITY(mphy->leds.pin); 353 353 addr = mt7603_reg_map(dev, MT_LED_CTRL); 354 354 mt76_wr(dev, addr, val); 355 355 } ··· 358 358 unsigned long *delay_on, 359 359 unsigned long *delay_off) 360 360 { 361 - struct mt76_dev *mt76 = container_of(led_cdev, struct mt76_dev, 362 - led_cdev); 361 + struct mt76_phy *mphy = container_of(led_cdev, struct mt76_phy, 362 + leds.cdev); 363 363 u8 delta_on, delta_off; 364 364 365 365 delta_off = max_t(u8, *delay_off / 10, 1); 366 366 delta_on = max_t(u8, *delay_on / 10, 1); 367 367 368 - mt7603_led_set_config(mt76, delta_on, delta_off); 368 + mt7603_led_set_config(mphy, delta_on, delta_off); 369 369 return 0; 370 370 } 371 371 372 372 static void mt7603_led_set_brightness(struct led_classdev *led_cdev, 373 373 enum led_brightness brightness) 374 374 { 375 - struct mt76_dev *mt76 = container_of(led_cdev, struct mt76_dev, 376 - led_cdev); 375 + struct mt76_phy *mphy = container_of(led_cdev, struct mt76_phy, 376 + leds.cdev); 377 377 378 378 if (!brightness) 379 - mt7603_led_set_config(mt76, 0, 0xff); 379 + mt7603_led_set_config(mphy, 0, 0xff); 380 380 else 381 - mt7603_led_set_config(mt76, 0xff, 0); 381 + mt7603_led_set_config(mphy, 0xff, 0); 382 382 } 383 383 384 384 static u32 __mt7603_reg_addr(struct mt7603_dev *dev, u32 addr) ··· 535 535 536 536 /* init led callbacks */ 537 537 if (IS_ENABLED(CONFIG_MT76_LEDS)) { 538 - dev->mt76.led_cdev.brightness_set = mt7603_led_set_brightness; 539 - dev->mt76.led_cdev.blink_set = mt7603_led_set_blink; 538 + dev->mphy.leds.cdev.brightness_set = mt7603_led_set_brightness; 539 + dev->mphy.leds.cdev.blink_set = mt7603_led_set_blink; 540 540 } 541 541 542 542 wiphy->reg_notifier = mt7603_regd_notifier;
+85
drivers/net/wireless/mediatek/mt76/mt7615/init.c
··· 443 443 mt76_set_stream_caps(&dev->mphy, true); 444 444 } 445 445 446 + u32 mt7615_reg_map(struct mt7615_dev *dev, u32 addr) 447 + { 448 + u32 base, offset; 449 + 450 + if (is_mt7663(&dev->mt76)) { 451 + base = addr & MT7663_MCU_PCIE_REMAP_2_BASE; 452 + offset = addr & MT7663_MCU_PCIE_REMAP_2_OFFSET; 453 + } else { 454 + base = addr & MT_MCU_PCIE_REMAP_2_BASE; 455 + offset = addr & MT_MCU_PCIE_REMAP_2_OFFSET; 456 + } 457 + mt76_wr(dev, MT_MCU_PCIE_REMAP_2, base); 458 + 459 + return MT_PCIE_REMAP_BASE_2 + offset; 460 + } 461 + EXPORT_SYMBOL_GPL(mt7615_reg_map); 462 + 463 + static void 464 + mt7615_led_set_config(struct led_classdev *led_cdev, 465 + u8 delay_on, u8 delay_off) 466 + { 467 + struct mt7615_dev *dev; 468 + struct mt76_phy *mphy; 469 + u32 val, addr; 470 + u8 index; 471 + 472 + mphy = container_of(led_cdev, struct mt76_phy, leds.cdev); 473 + dev = container_of(mphy->dev, struct mt7615_dev, mt76); 474 + 475 + if (!mt76_connac_pm_ref(mphy, &dev->pm)) 476 + return; 477 + 478 + val = FIELD_PREP(MT_LED_STATUS_DURATION, 0xffff) | 479 + FIELD_PREP(MT_LED_STATUS_OFF, delay_off) | 480 + FIELD_PREP(MT_LED_STATUS_ON, delay_on); 481 + 482 + index = dev->dbdc_support ? mphy->band_idx : mphy->leds.pin; 483 + addr = mt7615_reg_map(dev, MT_LED_STATUS_0(index)); 484 + mt76_wr(dev, addr, val); 485 + addr = mt7615_reg_map(dev, MT_LED_STATUS_1(index)); 486 + mt76_wr(dev, addr, val); 487 + 488 + val = MT_LED_CTRL_REPLAY(index) | MT_LED_CTRL_KICK(index); 489 + if (dev->mphy.leds.al) 490 + val |= MT_LED_CTRL_POLARITY(index); 491 + if (mphy->band_idx) 492 + val |= MT_LED_CTRL_BAND(index); 493 + 494 + addr = mt7615_reg_map(dev, MT_LED_CTRL); 495 + mt76_wr(dev, addr, val); 496 + 497 + mt76_connac_pm_unref(mphy, &dev->pm); 498 + } 499 + 500 + int mt7615_led_set_blink(struct led_classdev *led_cdev, 501 + unsigned long *delay_on, 502 + unsigned long *delay_off) 503 + { 504 + u8 delta_on, delta_off; 505 + 506 + delta_off = max_t(u8, *delay_off / 10, 1); 507 + delta_on = max_t(u8, *delay_on / 10, 1); 508 + 509 + mt7615_led_set_config(led_cdev, delta_on, delta_off); 510 + 511 + return 0; 512 + } 513 + EXPORT_SYMBOL_GPL(mt7615_led_set_blink); 514 + 515 + void mt7615_led_set_brightness(struct led_classdev *led_cdev, 516 + enum led_brightness brightness) 517 + { 518 + if (!brightness) 519 + mt7615_led_set_config(led_cdev, 0, 0xff); 520 + else 521 + mt7615_led_set_config(led_cdev, 0xff, 0); 522 + } 523 + EXPORT_SYMBOL_GPL(mt7615_led_set_brightness); 524 + 446 525 int mt7615_register_ext_phy(struct mt7615_dev *dev) 447 526 { 448 527 struct mt7615_phy *phy = mt7615_ext_phy(dev); ··· 575 496 /* mt7615 second phy shares the same hw queues with the primary one */ 576 497 for (i = 0; i <= MT_TXQ_PSD ; i++) 577 498 mphy->q_tx[i] = dev->mphy.q_tx[i]; 499 + 500 + /* init led callbacks */ 501 + if (IS_ENABLED(CONFIG_MT76_LEDS)) { 502 + mphy->leds.cdev.brightness_set = mt7615_led_set_brightness; 503 + mphy->leds.cdev.blink_set = mt7615_led_set_blink; 504 + } 578 505 579 506 ret = mt76_register_phy(mphy, true, mt76_rates, 580 507 ARRAY_SIZE(mt76_rates));
-16
drivers/net/wireless/mediatek/mt76/mt7615/mmio.c
··· 63 63 [MT_EFUSE_ADDR_BASE] = 0x78011000, 64 64 }; 65 65 66 - u32 mt7615_reg_map(struct mt7615_dev *dev, u32 addr) 67 - { 68 - u32 base, offset; 69 - 70 - if (is_mt7663(&dev->mt76)) { 71 - base = addr & MT7663_MCU_PCIE_REMAP_2_BASE; 72 - offset = addr & MT7663_MCU_PCIE_REMAP_2_OFFSET; 73 - } else { 74 - base = addr & MT_MCU_PCIE_REMAP_2_BASE; 75 - offset = addr & MT_MCU_PCIE_REMAP_2_OFFSET; 76 - } 77 - mt76_wr(dev, MT_MCU_PCIE_REMAP_2, base); 78 - 79 - return MT_PCIE_REMAP_BASE_2 + offset; 80 - } 81 - 82 66 static void 83 67 mt7615_rx_poll_complete(struct mt76_dev *mdev, enum mt76_rxq_id q) 84 68 {
+6
drivers/net/wireless/mediatek/mt76/mt7615/mt7615.h
··· 376 376 int irq, const u32 *map); 377 377 u32 mt7615_reg_map(struct mt7615_dev *dev, u32 addr); 378 378 379 + u32 mt7615_reg_map(struct mt7615_dev *dev, u32 addr); 380 + int mt7615_led_set_blink(struct led_classdev *led_cdev, 381 + unsigned long *delay_on, 382 + unsigned long *delay_off); 383 + void mt7615_led_set_brightness(struct led_classdev *led_cdev, 384 + enum led_brightness brightness); 379 385 void mt7615_init_device(struct mt7615_dev *dev); 380 386 int mt7615_register_device(struct mt7615_dev *dev); 381 387 void mt7615_unregister_device(struct mt7615_dev *dev);
+2 -60
drivers/net/wireless/mediatek/mt76/mt7615/pci_init.c
··· 66 66 return 0; 67 67 } 68 68 69 - static void 70 - mt7615_led_set_config(struct led_classdev *led_cdev, 71 - u8 delay_on, u8 delay_off) 72 - { 73 - struct mt7615_dev *dev; 74 - struct mt76_dev *mt76; 75 - u32 val, addr; 76 - 77 - mt76 = container_of(led_cdev, struct mt76_dev, led_cdev); 78 - dev = container_of(mt76, struct mt7615_dev, mt76); 79 - 80 - if (!mt76_connac_pm_ref(&dev->mphy, &dev->pm)) 81 - return; 82 - 83 - val = FIELD_PREP(MT_LED_STATUS_DURATION, 0xffff) | 84 - FIELD_PREP(MT_LED_STATUS_OFF, delay_off) | 85 - FIELD_PREP(MT_LED_STATUS_ON, delay_on); 86 - 87 - addr = mt7615_reg_map(dev, MT_LED_STATUS_0(mt76->led_pin)); 88 - mt76_wr(dev, addr, val); 89 - addr = mt7615_reg_map(dev, MT_LED_STATUS_1(mt76->led_pin)); 90 - mt76_wr(dev, addr, val); 91 - 92 - val = MT_LED_CTRL_REPLAY(mt76->led_pin) | 93 - MT_LED_CTRL_KICK(mt76->led_pin); 94 - if (mt76->led_al) 95 - val |= MT_LED_CTRL_POLARITY(mt76->led_pin); 96 - addr = mt7615_reg_map(dev, MT_LED_CTRL); 97 - mt76_wr(dev, addr, val); 98 - 99 - mt76_connac_pm_unref(&dev->mphy, &dev->pm); 100 - } 101 - 102 - static int 103 - mt7615_led_set_blink(struct led_classdev *led_cdev, 104 - unsigned long *delay_on, 105 - unsigned long *delay_off) 106 - { 107 - u8 delta_on, delta_off; 108 - 109 - delta_off = max_t(u8, *delay_off / 10, 1); 110 - delta_on = max_t(u8, *delay_on / 10, 1); 111 - 112 - mt7615_led_set_config(led_cdev, delta_on, delta_off); 113 - 114 - return 0; 115 - } 116 - 117 - static void 118 - mt7615_led_set_brightness(struct led_classdev *led_cdev, 119 - enum led_brightness brightness) 120 - { 121 - if (!brightness) 122 - mt7615_led_set_config(led_cdev, 0, 0xff); 123 - else 124 - mt7615_led_set_config(led_cdev, 0xff, 0); 125 - } 126 - 127 69 int mt7615_register_device(struct mt7615_dev *dev) 128 70 { 129 71 int ret; ··· 75 133 76 134 /* init led callbacks */ 77 135 if (IS_ENABLED(CONFIG_MT76_LEDS)) { 78 - dev->mt76.led_cdev.brightness_set = mt7615_led_set_brightness; 79 - dev->mt76.led_cdev.blink_set = mt7615_led_set_blink; 136 + dev->mphy.leds.cdev.brightness_set = mt7615_led_set_brightness; 137 + dev->mphy.leds.cdev.blink_set = mt7615_led_set_blink; 80 138 } 81 139 82 140 ret = mt7622_wmac_init(dev);
+1
drivers/net/wireless/mediatek/mt76/mt7615/regs.h
··· 544 544 #define MT_LED_CTRL_POLARITY(_n) BIT(1 + (8 * (_n))) 545 545 #define MT_LED_CTRL_TX_BLINK_MODE(_n) BIT(2 + (8 * (_n))) 546 546 #define MT_LED_CTRL_TX_MANUAL_BLINK(_n) BIT(3 + (8 * (_n))) 547 + #define MT_LED_CTRL_BAND(_n) BIT(4 + (8 * (_n))) 547 548 #define MT_LED_CTRL_TX_OVER_BLINK(_n) BIT(5 + (8 * (_n))) 548 549 #define MT_LED_CTRL_KICK(_n) BIT(7 + (8 * (_n))) 549 550
+1 -1
drivers/net/wireless/mediatek/mt76/mt76_connac_mac.c
··· 930 930 ether_addr_copy(hdr.addr4, eth_hdr->h_source); 931 931 break; 932 932 default: 933 - break; 933 + return -EINVAL; 934 934 } 935 935 936 936 skb_pull(skb, hdr_offset + sizeof(struct ethhdr) - 2);
+6 -1
drivers/net/wireless/mediatek/mt76/mt76x0/phy.c
··· 642 642 if (tx_rate > 9) 643 643 return -EINVAL; 644 644 645 - *target_power = cur_power + dev->rate_power.vht[tx_rate]; 645 + *target_power = cur_power; 646 + if (tx_rate > 7) 647 + *target_power += dev->rate_power.vht[tx_rate - 8]; 648 + else 649 + *target_power += dev->rate_power.ht[tx_rate]; 650 + 646 651 *target_pa_power = mt76x0_phy_get_rf_pa_mode(dev, 1, tx_rate); 647 652 break; 648 653 default:
+17 -18
drivers/net/wireless/mediatek/mt76/mt76x02_util.c
··· 87 87 }; 88 88 89 89 static void 90 - mt76x02_led_set_config(struct mt76_dev *mdev, u8 delay_on, 91 - u8 delay_off) 90 + mt76x02_led_set_config(struct mt76_phy *mphy, u8 delay_on, u8 delay_off) 92 91 { 93 - struct mt76x02_dev *dev = container_of(mdev, struct mt76x02_dev, 92 + struct mt76x02_dev *dev = container_of(mphy->dev, struct mt76x02_dev, 94 93 mt76); 95 94 u32 val; 96 95 ··· 97 98 FIELD_PREP(MT_LED_STATUS_OFF, delay_off) | 98 99 FIELD_PREP(MT_LED_STATUS_ON, delay_on); 99 100 100 - mt76_wr(dev, MT_LED_S0(mdev->led_pin), val); 101 - mt76_wr(dev, MT_LED_S1(mdev->led_pin), val); 101 + mt76_wr(dev, MT_LED_S0(mphy->leds.pin), val); 102 + mt76_wr(dev, MT_LED_S1(mphy->leds.pin), val); 102 103 103 - val = MT_LED_CTRL_REPLAY(mdev->led_pin) | 104 - MT_LED_CTRL_KICK(mdev->led_pin); 105 - if (mdev->led_al) 106 - val |= MT_LED_CTRL_POLARITY(mdev->led_pin); 104 + val = MT_LED_CTRL_REPLAY(mphy->leds.pin) | 105 + MT_LED_CTRL_KICK(mphy->leds.pin); 106 + if (mphy->leds.al) 107 + val |= MT_LED_CTRL_POLARITY(mphy->leds.pin); 107 108 mt76_wr(dev, MT_LED_CTRL, val); 108 109 } 109 110 ··· 112 113 unsigned long *delay_on, 113 114 unsigned long *delay_off) 114 115 { 115 - struct mt76_dev *mdev = container_of(led_cdev, struct mt76_dev, 116 - led_cdev); 116 + struct mt76_phy *mphy = container_of(led_cdev, struct mt76_phy, 117 + leds.cdev); 117 118 u8 delta_on, delta_off; 118 119 119 120 delta_off = max_t(u8, *delay_off / 10, 1); 120 121 delta_on = max_t(u8, *delay_on / 10, 1); 121 122 122 - mt76x02_led_set_config(mdev, delta_on, delta_off); 123 + mt76x02_led_set_config(mphy, delta_on, delta_off); 123 124 124 125 return 0; 125 126 } ··· 128 129 mt76x02_led_set_brightness(struct led_classdev *led_cdev, 129 130 enum led_brightness brightness) 130 131 { 131 - struct mt76_dev *mdev = container_of(led_cdev, struct mt76_dev, 132 - led_cdev); 132 + struct mt76_phy *mphy = container_of(led_cdev, struct mt76_phy, 133 + leds.cdev); 133 134 134 135 if (!brightness) 135 - mt76x02_led_set_config(mdev, 0, 0xff); 136 + mt76x02_led_set_config(mphy, 0, 0xff); 136 137 else 137 - mt76x02_led_set_config(mdev, 0xff, 0); 138 + mt76x02_led_set_config(mphy, 0xff, 0); 138 139 } 139 140 140 141 int mt76x02_init_device(struct mt76x02_dev *dev) ··· 166 167 167 168 /* init led callbacks */ 168 169 if (IS_ENABLED(CONFIG_MT76_LEDS)) { 169 - dev->mt76.led_cdev.brightness_set = 170 + dev->mphy.leds.cdev.brightness_set = 170 171 mt76x02_led_set_brightness; 171 - dev->mt76.led_cdev.blink_set = mt76x02_led_set_blink; 172 + dev->mphy.leds.cdev.blink_set = mt76x02_led_set_blink; 172 173 } 173 174 } 174 175
+4 -2
drivers/net/wireless/mediatek/mt76/mt7915/debugfs.c
··· 811 811 if (val & BIT(map[i].index)) 812 812 continue; 813 813 814 - ctrl = BIT(31) | (map[i].pid << 10) | (map[i].qid << 24); 814 + ctrl = BIT(31) | (map[i].pid << 10) | ((u32)map[i].qid << 24); 815 815 mt76_wr(dev, MT_FL_Q0_CTRL, ctrl); 816 816 817 817 head = mt76_get_field(dev, MT_FL_Q2_CTRL, ··· 996 996 997 997 ret = mt7915_mcu_get_txpower_sku(phy, txpwr, sizeof(txpwr)); 998 998 if (ret) 999 - return ret; 999 + goto out; 1000 1000 1001 1001 /* Txpower propagation path: TMAC -> TXV -> BBP */ 1002 1002 len += scnprintf(buf + len, sz - len, ··· 1047 1047 mt76_get_field(dev, reg, MT_WF_PHY_TPC_POWER)); 1048 1048 1049 1049 ret = simple_read_from_buffer(user_buf, count, ppos, buf, len); 1050 + 1051 + out: 1050 1052 kfree(buf); 1051 1053 return ret; 1052 1054 }
+12 -7
drivers/net/wireless/mediatek/mt76/mt7915/eeprom.c
··· 110 110 } else { 111 111 u8 free_block_num; 112 112 u32 block_num, i; 113 + u32 eeprom_blk_size = MT7915_EEPROM_BLOCK_SIZE; 113 114 114 - mt7915_mcu_get_eeprom_free_block(dev, &free_block_num); 115 - /* efuse info not enough */ 115 + ret = mt7915_mcu_get_eeprom_free_block(dev, &free_block_num); 116 + if (ret < 0) 117 + return ret; 118 + 119 + /* efuse info isn't enough */ 116 120 if (free_block_num >= 29) 117 121 return -EINVAL; 118 122 119 123 /* read eeprom data from efuse */ 120 - block_num = DIV_ROUND_UP(eeprom_size, 121 - MT7915_EEPROM_BLOCK_SIZE); 122 - for (i = 0; i < block_num; i++) 123 - mt7915_mcu_get_eeprom(dev, 124 - i * MT7915_EEPROM_BLOCK_SIZE); 124 + block_num = DIV_ROUND_UP(eeprom_size, eeprom_blk_size); 125 + for (i = 0; i < block_num; i++) { 126 + ret = mt7915_mcu_get_eeprom(dev, i * eeprom_blk_size); 127 + if (ret < 0) 128 + return ret; 129 + } 125 130 } 126 131 127 132 return mt7915_check_eeprom(dev);
+94 -30
drivers/net/wireless/mediatek/mt76/mt7915/init.c
··· 209 209 u8 delay_on, u8 delay_off) 210 210 { 211 211 struct mt7915_dev *dev; 212 - struct mt76_dev *mt76; 212 + struct mt76_phy *mphy; 213 213 u32 val; 214 214 215 - mt76 = container_of(led_cdev, struct mt76_dev, led_cdev); 216 - dev = container_of(mt76, struct mt7915_dev, mt76); 215 + mphy = container_of(led_cdev, struct mt76_phy, leds.cdev); 216 + dev = container_of(mphy->dev, struct mt7915_dev, mt76); 217 217 218 - /* select TX blink mode, 2: only data frames */ 219 - mt76_rmw_field(dev, MT_TMAC_TCR0(0), MT_TMAC_TCR0_TX_BLINK, 2); 218 + /* set PWM mode */ 219 + val = FIELD_PREP(MT_LED_STATUS_DURATION, 0xffff) | 220 + FIELD_PREP(MT_LED_STATUS_OFF, delay_off) | 221 + FIELD_PREP(MT_LED_STATUS_ON, delay_on); 222 + mt76_wr(dev, MT_LED_STATUS_0(mphy->band_idx), val); 223 + mt76_wr(dev, MT_LED_STATUS_1(mphy->band_idx), val); 220 224 221 225 /* enable LED */ 222 - mt76_wr(dev, MT_LED_EN(0), 1); 223 - 224 - /* set LED Tx blink on/off time */ 225 - val = FIELD_PREP(MT_LED_TX_BLINK_ON_MASK, delay_on) | 226 - FIELD_PREP(MT_LED_TX_BLINK_OFF_MASK, delay_off); 227 - mt76_wr(dev, MT_LED_TX_BLINK(0), val); 226 + mt76_wr(dev, MT_LED_EN(mphy->band_idx), 1); 228 227 229 228 /* control LED */ 230 - val = MT_LED_CTRL_BLINK_MODE | MT_LED_CTRL_KICK; 231 - if (dev->mt76.led_al) 229 + val = MT_LED_CTRL_KICK; 230 + if (dev->mphy.leds.al) 232 231 val |= MT_LED_CTRL_POLARITY; 232 + if (mphy->band_idx) 233 + val |= MT_LED_CTRL_BAND; 233 234 234 - mt76_wr(dev, MT_LED_CTRL(0), val); 235 - mt76_clear(dev, MT_LED_CTRL(0), MT_LED_CTRL_KICK); 235 + mt76_wr(dev, MT_LED_CTRL(mphy->band_idx), val); 236 + mt76_clear(dev, MT_LED_CTRL(mphy->band_idx), MT_LED_CTRL_KICK); 236 237 } 237 238 238 239 static int mt7915_led_set_blink(struct led_classdev *led_cdev, ··· 320 319 } 321 320 322 321 static void 323 - mt7915_init_wiphy(struct ieee80211_hw *hw) 322 + mt7915_init_wiphy(struct mt7915_phy *phy) 324 323 { 325 - struct mt7915_phy *phy = mt7915_hw_phy(hw); 324 + struct mt76_phy *mphy = phy->mt76; 325 + struct ieee80211_hw *hw = mphy->hw; 326 326 struct mt76_dev *mdev = &phy->dev->mt76; 327 327 struct wiphy *wiphy = hw->wiphy; 328 328 struct mt7915_dev *dev = phy->dev; ··· 417 415 418 416 wiphy->available_antennas_rx = phy->mt76->antenna_mask; 419 417 wiphy->available_antennas_tx = phy->mt76->antenna_mask; 418 + 419 + /* init led callbacks */ 420 + if (IS_ENABLED(CONFIG_MT76_LEDS)) { 421 + mphy->leds.cdev.brightness_set = mt7915_led_set_brightness; 422 + mphy->leds.cdev.blink_set = mt7915_led_set_blink; 423 + } 420 424 } 421 425 422 426 static void ··· 481 473 mt76_rmw(dev, MT_WTBLOFF_TOP_RSCR(band), mask, set); 482 474 } 483 475 476 + static void 477 + mt7915_init_led_mux(struct mt7915_dev *dev) 478 + { 479 + if (!IS_ENABLED(CONFIG_MT76_LEDS)) 480 + return; 481 + 482 + if (dev->dbdc_support) { 483 + switch (mt76_chip(&dev->mt76)) { 484 + case 0x7915: 485 + mt76_rmw_field(dev, MT_LED_GPIO_MUX2, 486 + GENMASK(11, 8), 4); 487 + mt76_rmw_field(dev, MT_LED_GPIO_MUX3, 488 + GENMASK(11, 8), 4); 489 + break; 490 + case 0x7986: 491 + mt76_rmw_field(dev, MT_LED_GPIO_MUX0, 492 + GENMASK(7, 4), 1); 493 + mt76_rmw_field(dev, MT_LED_GPIO_MUX0, 494 + GENMASK(11, 8), 1); 495 + break; 496 + case 0x7916: 497 + mt76_rmw_field(dev, MT_LED_GPIO_MUX1, 498 + GENMASK(27, 24), 3); 499 + mt76_rmw_field(dev, MT_LED_GPIO_MUX1, 500 + GENMASK(31, 28), 3); 501 + break; 502 + default: 503 + break; 504 + } 505 + } else if (dev->mphy.leds.pin) { 506 + switch (mt76_chip(&dev->mt76)) { 507 + case 0x7915: 508 + mt76_rmw_field(dev, MT_LED_GPIO_MUX3, 509 + GENMASK(11, 8), 4); 510 + break; 511 + case 0x7986: 512 + mt76_rmw_field(dev, MT_LED_GPIO_MUX0, 513 + GENMASK(11, 8), 1); 514 + break; 515 + case 0x7916: 516 + mt76_rmw_field(dev, MT_LED_GPIO_MUX1, 517 + GENMASK(31, 28), 3); 518 + break; 519 + default: 520 + break; 521 + } 522 + } else { 523 + switch (mt76_chip(&dev->mt76)) { 524 + case 0x7915: 525 + mt76_rmw_field(dev, MT_LED_GPIO_MUX2, 526 + GENMASK(11, 8), 4); 527 + break; 528 + case 0x7986: 529 + mt76_rmw_field(dev, MT_LED_GPIO_MUX0, 530 + GENMASK(7, 4), 1); 531 + break; 532 + case 0x7916: 533 + mt76_rmw_field(dev, MT_LED_GPIO_MUX1, 534 + GENMASK(27, 24), 3); 535 + break; 536 + default: 537 + break; 538 + } 539 + } 540 + } 541 + 484 542 void mt7915_mac_init(struct mt7915_dev *dev) 485 543 { 486 544 int i; ··· 571 497 for (i = 0; i < 2; i++) 572 498 mt7915_mac_init_band(dev, i); 573 499 574 - if (IS_ENABLED(CONFIG_MT76_LEDS)) { 575 - i = dev->mt76.led_pin ? MT_LED_GPIO_MUX3 : MT_LED_GPIO_MUX2; 576 - mt76_rmw_field(dev, i, MT_LED_GPIO_SEL_MASK, 4); 577 - } 500 + mt7915_init_led_mux(dev); 578 501 } 579 502 580 503 int mt7915_txbf_init(struct mt7915_dev *dev) ··· 640 569 mt76_eeprom_override(mphy); 641 570 642 571 /* init wiphy according to mphy and phy */ 643 - mt7915_init_wiphy(mphy->hw); 572 + mt7915_init_wiphy(phy); 644 573 645 574 ret = mt76_register_phy(mphy, true, mt76_rates, 646 575 ARRAY_SIZE(mt76_rates)); ··· 1175 1104 1176 1105 int mt7915_register_device(struct mt7915_dev *dev) 1177 1106 { 1178 - struct ieee80211_hw *hw = mt76_hw(dev); 1179 1107 struct mt7915_phy *phy2; 1180 1108 int ret; 1181 1109 ··· 1203 1133 if (ret) 1204 1134 goto free_phy2; 1205 1135 1206 - mt7915_init_wiphy(hw); 1136 + mt7915_init_wiphy(&dev->phy); 1207 1137 1208 1138 #ifdef CONFIG_NL80211_TESTMODE 1209 1139 dev->mt76.test_ops = &mt7915_testmode_ops; 1210 1140 #endif 1211 - 1212 - /* init led callbacks */ 1213 - if (IS_ENABLED(CONFIG_MT76_LEDS)) { 1214 - dev->mt76.led_cdev.brightness_set = mt7915_led_set_brightness; 1215 - dev->mt76.led_cdev.blink_set = mt7915_led_set_blink; 1216 - } 1217 1141 1218 1142 ret = mt76_register_device(&dev->mt76, true, mt76_rates, 1219 1143 ARRAY_SIZE(mt76_rates));
+50 -31
drivers/net/wireless/mediatek/mt76/mt7915/mcu.c
··· 232 232 233 233 c = (struct mt7915_mcu_csa_notify *)skb->data; 234 234 235 + if (c->band_idx > MT_BAND1) 236 + return; 237 + 235 238 if ((c->band_idx && !dev->phy.mt76->band_idx) && 236 - dev->mt76.phys[MT_BAND1]) 239 + dev->mt76.phys[MT_BAND1]) 237 240 mphy = dev->mt76.phys[MT_BAND1]; 238 241 239 242 ieee80211_iterate_active_interfaces_atomic(mphy->hw, ··· 255 252 if (t->ctrl.ctrl_id != THERMAL_PROTECT_ENABLE) 256 253 return; 257 254 255 + if (t->ctrl.band_idx > MT_BAND1) 256 + return; 257 + 258 258 if ((t->ctrl.band_idx && !dev->phy.mt76->band_idx) && 259 - dev->mt76.phys[MT_BAND1]) 259 + dev->mt76.phys[MT_BAND1]) 260 260 mphy = dev->mt76.phys[MT_BAND1]; 261 261 262 262 phy = (struct mt7915_phy *)mphy->priv; ··· 274 268 275 269 r = (struct mt7915_mcu_rdd_report *)skb->data; 276 270 271 + if (r->band_idx > MT_BAND1) 272 + return; 273 + 277 274 if ((r->band_idx && !dev->phy.mt76->band_idx) && 278 - dev->mt76.phys[MT_BAND1]) 275 + dev->mt76.phys[MT_BAND1]) 279 276 mphy = dev->mt76.phys[MT_BAND1]; 280 277 281 278 if (r->band_idx == MT_RX_SEL2) ··· 335 326 336 327 b = (struct mt7915_mcu_bcc_notify *)skb->data; 337 328 338 - if ((b->band_idx && !dev->phy.mt76->band_idx) && dev->mt76.phys[MT_BAND1]) 329 + if (b->band_idx > MT_BAND1) 330 + return; 331 + 332 + if ((b->band_idx && !dev->phy.mt76->band_idx) && 333 + dev->mt76.phys[MT_BAND1]) 339 334 mphy = dev->mt76.phys[MT_BAND1]; 340 335 341 336 ieee80211_iterate_active_interfaces_atomic(mphy->hw, ··· 2805 2792 int ret; 2806 2793 u8 *buf; 2807 2794 2808 - ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_EXT_QUERY(EFUSE_ACCESS), &req, 2809 - sizeof(req), true, &skb); 2795 + ret = mt76_mcu_send_and_get_msg(&dev->mt76, 2796 + MCU_EXT_QUERY(EFUSE_ACCESS), 2797 + &req, sizeof(req), true, &skb); 2810 2798 if (ret) 2811 2799 return ret; 2812 2800 ··· 2832 2818 struct sk_buff *skb; 2833 2819 int ret; 2834 2820 2835 - ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_EXT_QUERY(EFUSE_FREE_BLOCK), &req, 2836 - sizeof(req), true, &skb); 2821 + ret = mt76_mcu_send_and_get_msg(&dev->mt76, 2822 + MCU_EXT_QUERY(EFUSE_FREE_BLOCK), 2823 + &req, sizeof(req), true, &skb); 2837 2824 if (ret) 2838 2825 return ret; 2839 2826 ··· 2989 2974 2990 2975 int mt7915_mcu_get_chan_mib_info(struct mt7915_phy *phy, bool chan_switch) 2991 2976 { 2992 - /* strict order */ 2993 - static const u32 offs[] = { 2994 - MIB_NON_WIFI_TIME, 2995 - MIB_TX_TIME, 2996 - MIB_RX_TIME, 2997 - MIB_OBSS_AIRTIME, 2998 - MIB_TXOP_INIT_COUNT, 2999 - /* v2 */ 3000 - MIB_NON_WIFI_TIME_V2, 3001 - MIB_TX_TIME_V2, 3002 - MIB_RX_TIME_V2, 3003 - MIB_OBSS_AIRTIME_V2 3004 - }; 3005 2977 struct mt76_channel_state *state = phy->mt76->chan_state; 3006 2978 struct mt76_channel_state *state_ts = &phy->state_ts; 3007 2979 struct mt7915_dev *dev = phy->dev; 3008 2980 struct mt7915_mcu_mib *res, req[5]; 3009 2981 struct sk_buff *skb; 3010 - int i, ret, start = 0, ofs = 20; 2982 + static const u32 *offs; 2983 + int i, ret, len, offs_cc; 3011 2984 u64 cc_tx; 3012 2985 3013 - if (!is_mt7915(&dev->mt76)) { 3014 - start = 5; 3015 - ofs = 0; 2986 + /* strict order */ 2987 + if (is_mt7915(&dev->mt76)) { 2988 + static const u32 chip_offs[] = { 2989 + MIB_NON_WIFI_TIME, 2990 + MIB_TX_TIME, 2991 + MIB_RX_TIME, 2992 + MIB_OBSS_AIRTIME, 2993 + MIB_TXOP_INIT_COUNT, 2994 + }; 2995 + len = ARRAY_SIZE(chip_offs); 2996 + offs = chip_offs; 2997 + offs_cc = 20; 2998 + } else { 2999 + static const u32 chip_offs[] = { 3000 + MIB_NON_WIFI_TIME_V2, 3001 + MIB_TX_TIME_V2, 3002 + MIB_RX_TIME_V2, 3003 + MIB_OBSS_AIRTIME_V2 3004 + }; 3005 + len = ARRAY_SIZE(chip_offs); 3006 + offs = chip_offs; 3007 + offs_cc = 0; 3016 3008 } 3017 3009 3018 - for (i = 0; i < 5; i++) { 3010 + for (i = 0; i < len; i++) { 3019 3011 req[i].band = cpu_to_le32(phy->mt76->band_idx); 3020 - req[i].offs = cpu_to_le32(offs[i + start]); 3021 - 3022 - if (!is_mt7915(&dev->mt76) && i == 3) 3023 - break; 3012 + req[i].offs = cpu_to_le32(offs[i]); 3024 3013 } 3025 3014 3026 3015 ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_EXT_CMD(GET_MIB_INFO), ··· 3032 3013 if (ret) 3033 3014 return ret; 3034 3015 3035 - res = (struct mt7915_mcu_mib *)(skb->data + ofs); 3016 + res = (struct mt7915_mcu_mib *)(skb->data + offs_cc); 3036 3017 3037 3018 #define __res_u64(s) le64_to_cpu(res[s].data) 3038 3019 /* subtract Tx backoff time from Tx duration */
+12 -15
drivers/net/wireless/mediatek/mt76/mt7915/mmio.c
··· 495 495 496 496 if (dev_is_pci(dev->mt76.dev) && 497 497 ((addr >= MT_CBTOP1_PHY_START && addr <= MT_CBTOP1_PHY_END) || 498 - (addr >= MT_CBTOP2_PHY_START && addr <= MT_CBTOP2_PHY_END))) 498 + addr >= MT_CBTOP2_PHY_START)) 499 499 return mt7915_reg_map_l1(dev, addr); 500 500 501 501 /* CONN_INFRA: covert to phyiscal addr and use layer 1 remap */ ··· 594 594 static void mt7915_mmio_wed_release_rx_buf(struct mtk_wed_device *wed) 595 595 { 596 596 struct mt7915_dev *dev; 597 - struct page *page; 597 + u32 length; 598 598 int i; 599 599 600 600 dev = container_of(wed, struct mt7915_dev, mt76.mmio.wed); 601 + length = SKB_DATA_ALIGN(NET_SKB_PAD + wed->wlan.rx_size + 602 + sizeof(struct skb_shared_info)); 603 + 601 604 for (i = 0; i < dev->mt76.rx_token_size; i++) { 602 605 struct mt76_txwi_cache *t; 603 606 ··· 610 607 611 608 dma_unmap_single(dev->mt76.dma_dev, t->dma_addr, 612 609 wed->wlan.rx_size, DMA_FROM_DEVICE); 613 - skb_free_frag(t->ptr); 610 + __free_pages(virt_to_page(t->ptr), get_order(length)); 614 611 t->ptr = NULL; 615 612 616 613 mt76_put_rxwi(&dev->mt76, t); 617 614 } 618 - 619 - if (!wed->rx_buf_ring.rx_page.va) 620 - return; 621 - 622 - page = virt_to_page(wed->rx_buf_ring.rx_page.va); 623 - __page_frag_cache_drain(page, wed->rx_buf_ring.rx_page.pagecnt_bias); 624 - memset(&wed->rx_buf_ring.rx_page, 0, sizeof(wed->rx_buf_ring.rx_page)); 625 615 } 626 616 627 617 static u32 mt7915_mmio_wed_init_rx_buf(struct mtk_wed_device *wed, int size) ··· 631 635 for (i = 0; i < size; i++) { 632 636 struct mt76_txwi_cache *t = mt76_get_rxwi(&dev->mt76); 633 637 dma_addr_t phy_addr; 638 + struct page *page; 634 639 int token; 635 640 void *ptr; 636 641 637 - ptr = page_frag_alloc(&wed->rx_buf_ring.rx_page, length, 638 - GFP_KERNEL); 639 - if (!ptr) 642 + page = __dev_alloc_pages(GFP_KERNEL, get_order(length)); 643 + if (!page) 640 644 goto unmap; 641 645 646 + ptr = page_address(page); 642 647 phy_addr = dma_map_single(dev->mt76.dma_dev, ptr, 643 648 wed->wlan.rx_size, 644 649 DMA_TO_DEVICE); 645 650 if (unlikely(dma_mapping_error(dev->mt76.dev, phy_addr))) { 646 - skb_free_frag(ptr); 651 + __free_pages(page, get_order(length)); 647 652 goto unmap; 648 653 } 649 654 ··· 653 656 if (token < 0) { 654 657 dma_unmap_single(dev->mt76.dma_dev, phy_addr, 655 658 wed->wlan.rx_size, DMA_TO_DEVICE); 656 - skb_free_frag(ptr); 659 + __free_pages(page, get_order(length)); 657 660 goto unmap; 658 661 } 659 662
+10 -3
drivers/net/wireless/mediatek/mt76/mt7915/regs.h
··· 803 803 #define MT_CBTOP1_PHY_START 0x70000000 804 804 #define MT_CBTOP1_PHY_END __REG(CBTOP1_PHY_END) 805 805 #define MT_CBTOP2_PHY_START 0xf0000000 806 - #define MT_CBTOP2_PHY_END 0xffffffff 807 806 #define MT_INFRA_MCU_START 0x7c000000 808 807 #define MT_INFRA_MCU_END __REG(INFRA_MCU_ADDR_END) 809 808 #define MT_CONN_INFRA_OFFSET(p) ((p) - MT_INFRA_BASE) ··· 1054 1055 1055 1056 #define MT_LED_CTRL(_n) MT_LED_PHYS(0x00 + ((_n) * 4)) 1056 1057 #define MT_LED_CTRL_KICK BIT(7) 1058 + #define MT_LED_CTRL_BAND BIT(4) 1057 1059 #define MT_LED_CTRL_BLINK_MODE BIT(2) 1058 1060 #define MT_LED_CTRL_POLARITY BIT(1) 1059 1061 ··· 1062 1062 #define MT_LED_TX_BLINK_ON_MASK GENMASK(7, 0) 1063 1063 #define MT_LED_TX_BLINK_OFF_MASK GENMASK(15, 8) 1064 1064 1065 + #define MT_LED_STATUS_0(_n) MT_LED_PHYS(0x20 + ((_n) * 8)) 1066 + #define MT_LED_STATUS_1(_n) MT_LED_PHYS(0x24 + ((_n) * 8)) 1067 + #define MT_LED_STATUS_OFF GENMASK(31, 24) 1068 + #define MT_LED_STATUS_ON GENMASK(23, 16) 1069 + #define MT_LED_STATUS_DURATION GENMASK(15, 0) 1070 + 1065 1071 #define MT_LED_EN(_n) MT_LED_PHYS(0x40 + ((_n) * 4)) 1066 1072 1073 + #define MT_LED_GPIO_MUX0 0x70005050 /* GPIO 1 and GPIO 2 */ 1074 + #define MT_LED_GPIO_MUX1 0x70005054 /* GPIO 14 and 15 */ 1067 1075 #define MT_LED_GPIO_MUX2 0x70005058 /* GPIO 18 */ 1068 - #define MT_LED_GPIO_MUX3 0x7000505C /* GPIO 26 */ 1069 - #define MT_LED_GPIO_SEL_MASK GENMASK(11, 8) 1076 + #define MT_LED_GPIO_MUX3 0x7000505c /* GPIO 26 */ 1070 1077 1071 1078 /* MT TOP */ 1072 1079 #define MT_TOP_BASE 0x18060000
+1
drivers/net/wireless/mediatek/mt76/mt7915/soc.c
··· 278 278 return -EINVAL; 279 279 280 280 rmem = of_reserved_mem_lookup(np); 281 + of_node_put(np); 281 282 if (!rmem) 282 283 return -EINVAL; 283 284
+55
drivers/net/wireless/mediatek/mt76/mt7921/acpi_sar.c
··· 135 135 return ret; 136 136 } 137 137 138 + /* MTFG : Flag Table */ 139 + static int 140 + mt7921_asar_acpi_read_mtfg(struct mt7921_dev *dev, u8 **table) 141 + { 142 + int len, ret; 143 + 144 + ret = mt7921_acpi_read(dev, MT7921_ACPI_MTFG, table, &len); 145 + if (ret) 146 + return ret; 147 + 148 + if (len < MT7921_ASAR_MIN_FG) 149 + ret = -EINVAL; 150 + 151 + return ret; 152 + } 153 + 138 154 int mt7921_init_acpi_sar(struct mt7921_dev *dev) 139 155 { 140 156 struct mt7921_acpi_sar *asar; ··· 178 162 asar->geo = NULL; 179 163 } 180 164 165 + /* MTFG is optional */ 166 + ret = mt7921_asar_acpi_read_mtfg(dev, (u8 **)&asar->fg); 167 + if (ret) { 168 + devm_kfree(dev->mt76.dev, asar->fg); 169 + asar->fg = NULL; 170 + } 181 171 dev->phy.acpisar = asar; 182 172 183 173 return 0; ··· 301 279 } 302 280 303 281 return 0; 282 + } 283 + 284 + u8 mt7921_acpi_get_flags(struct mt7921_phy *phy) 285 + { 286 + struct mt7921_asar_fg *fg; 287 + struct { 288 + u8 acpi_idx; 289 + u8 chip_idx; 290 + } map[] = { 291 + {1, 1}, 292 + {4, 2}, 293 + }; 294 + u8 flags = BIT(0); 295 + int i, j; 296 + 297 + if (!phy->acpisar) 298 + return 0; 299 + 300 + fg = phy->acpisar->fg; 301 + if (!fg) 302 + return flags; 303 + 304 + /* pickup necessary settings per device and 305 + * translate the index of bitmap for chip command. 306 + */ 307 + for (i = 0; i < fg->nr_flag; i++) 308 + for (j = 0; j < ARRAY_SIZE(map); j++) 309 + if (fg->flag[i] == map[j].acpi_idx) { 310 + flags |= BIT(map[j].chip_idx); 311 + break; 312 + } 313 + 314 + return flags; 304 315 }
+12
drivers/net/wireless/mediatek/mt76/mt7921/acpi_sar.h
··· 8 8 #define MT7921_ASAR_MAX_DYN 8 9 9 #define MT7921_ASAR_MIN_GEO 3 10 10 #define MT7921_ASAR_MAX_GEO 8 11 + #define MT7921_ASAR_MIN_FG 8 11 12 12 13 #define MT7921_ACPI_MTCL "MTCL" 13 14 #define MT7921_ACPI_MTDS "MTDS" 14 15 #define MT7921_ACPI_MTGS "MTGS" 16 + #define MT7921_ACPI_MTFG "MTFG" 15 17 16 18 struct mt7921_asar_dyn_limit { 17 19 u8 idx; ··· 79 77 u8 cl6g[6]; 80 78 } __packed; 81 79 80 + struct mt7921_asar_fg { 81 + u8 names[4]; 82 + u8 version; 83 + u8 rsvd; 84 + u8 nr_flag; 85 + u8 rsvd1; 86 + u8 flag[0]; 87 + } __packed; 88 + 82 89 struct mt7921_acpi_sar { 83 90 u8 ver; 84 91 union { ··· 99 88 struct mt7921_asar_geo_v2 *geo_v2; 100 89 }; 101 90 struct mt7921_asar_cl *countrylist; 91 + struct mt7921_asar_fg *fg; 102 92 }; 103 93 104 94 #endif
+2 -1
drivers/net/wireless/mediatek/mt76/mt7921/init.c
··· 175 175 176 176 if (!fw || !fw->data || fw->size < sizeof(*hdr)) { 177 177 dev_err(dev, "Invalid firmware\n"); 178 - return -EINVAL; 178 + goto out; 179 179 } 180 180 181 181 data = fw->data; ··· 206 206 data += le16_to_cpu(rel_info->len) + rel_info->pad_len; 207 207 } 208 208 209 + out: 209 210 release_firmware(fw); 210 211 211 212 return features ? features->data : 0;
+3 -1
drivers/net/wireless/mediatek/mt76/mt7921/mcu.c
··· 1184 1184 __le16 len; 1185 1185 u8 idx; 1186 1186 u8 env; 1187 - u8 pad1[2]; 1187 + u8 acpi_conf; 1188 + u8 pad1; 1188 1189 u8 alpha2[2]; 1189 1190 u8 type[2]; 1190 1191 u8 rsvd[64]; 1191 1192 } __packed req = { 1192 1193 .idx = idx, 1193 1194 .env = env_cap, 1195 + .acpi_conf = mt7921_acpi_get_flags(&dev->phy), 1194 1196 }; 1195 1197 int ret, valid_cnt = 0; 1196 1198 u8 i, *pos;
+7
drivers/net/wireless/mediatek/mt76/mt7921/mt7921.h
··· 554 554 #ifdef CONFIG_ACPI 555 555 int mt7921_init_acpi_sar(struct mt7921_dev *dev); 556 556 int mt7921_init_acpi_sar_power(struct mt7921_phy *phy, bool set_default); 557 + u8 mt7921_acpi_get_flags(struct mt7921_phy *phy); 557 558 #else 558 559 static inline int 559 560 mt7921_init_acpi_sar(struct mt7921_dev *dev) ··· 564 563 565 564 static inline int 566 565 mt7921_init_acpi_sar_power(struct mt7921_phy *phy, bool set_default) 566 + { 567 + return 0; 568 + } 569 + 570 + static inline u8 571 + mt7921_acpi_get_flags(struct mt7921_phy *phy) 567 572 { 568 573 return 0; 569 574 }
+3 -2
drivers/net/wireless/mediatek/mt76/mt7996/debugfs.c
··· 457 457 if (val & BIT(map[i].index)) 458 458 continue; 459 459 460 - ctrl = BIT(31) | (map[i].pid << 10) | (map[i].qid << 24); 460 + ctrl = BIT(31) | (map[i].pid << 10) | ((u32)map[i].qid << 24); 461 461 mt76_wr(dev, MT_FL_Q0_CTRL, ctrl); 462 462 463 463 head = mt76_get_field(dev, MT_FL_Q2_CTRL, ··· 653 653 mt7996_rf_regval_set(void *data, u64 val) 654 654 { 655 655 struct mt7996_dev *dev = data; 656 + u32 val32 = val; 656 657 657 - return mt7996_mcu_rf_regval(dev, dev->mt76.debugfs_reg, (u32 *)&val, true); 658 + return mt7996_mcu_rf_regval(dev, dev->mt76.debugfs_reg, &val32, true); 658 659 } 659 660 660 661 DEFINE_DEBUGFS_ATTRIBUTE(fops_rf_regval, mt7996_rf_regval_get,
+12 -6
drivers/net/wireless/mediatek/mt76/mt7996/eeprom.c
··· 65 65 } else { 66 66 u8 free_block_num; 67 67 u32 block_num, i; 68 + u32 eeprom_blk_size = MT7996_EEPROM_BLOCK_SIZE; 68 69 69 - /* TODO: check free block event */ 70 - mt7996_mcu_get_eeprom_free_block(dev, &free_block_num); 71 - /* efuse info not enough */ 70 + ret = mt7996_mcu_get_eeprom_free_block(dev, &free_block_num); 71 + if (ret < 0) 72 + return ret; 73 + 74 + /* efuse info isn't enough */ 72 75 if (free_block_num >= 59) 73 76 return -EINVAL; 74 77 75 78 /* read eeprom data from efuse */ 76 - block_num = DIV_ROUND_UP(MT7996_EEPROM_SIZE, MT7996_EEPROM_BLOCK_SIZE); 77 - for (i = 0; i < block_num; i++) 78 - mt7996_mcu_get_eeprom(dev, i * MT7996_EEPROM_BLOCK_SIZE); 79 + block_num = DIV_ROUND_UP(MT7996_EEPROM_SIZE, eeprom_blk_size); 80 + for (i = 0; i < block_num; i++) { 81 + ret = mt7996_mcu_get_eeprom(dev, i * eeprom_blk_size); 82 + if (ret < 0) 83 + return ret; 84 + } 79 85 } 80 86 81 87 return mt7996_check_eeprom(dev);
+7 -7
drivers/net/wireless/mediatek/mt76/mt7996/init.c
··· 46 46 u8 delay_on, u8 delay_off) 47 47 { 48 48 struct mt7996_dev *dev; 49 - struct mt76_dev *mt76; 49 + struct mt76_phy *mphy; 50 50 u32 val; 51 51 52 - mt76 = container_of(led_cdev, struct mt76_dev, led_cdev); 53 - dev = container_of(mt76, struct mt7996_dev, mt76); 52 + mphy = container_of(led_cdev, struct mt76_phy, leds.cdev); 53 + dev = container_of(mphy->dev, struct mt7996_dev, mt76); 54 54 55 55 /* select TX blink mode, 2: only data frames */ 56 56 mt76_rmw_field(dev, MT_TMAC_TCR0(0), MT_TMAC_TCR0_TX_BLINK, 2); ··· 65 65 66 66 /* control LED */ 67 67 val = MT_LED_CTRL_BLINK_MODE | MT_LED_CTRL_KICK; 68 - if (dev->mt76.led_al) 68 + if (mphy->leds.al) 69 69 val |= MT_LED_CTRL_POLARITY; 70 70 71 71 mt76_wr(dev, MT_LED_CTRL(0), val); ··· 261 261 MT_WTBL_UPDATE_ADM_COUNT_CLEAR); 262 262 263 263 if (IS_ENABLED(CONFIG_MT76_LEDS)) { 264 - i = dev->mt76.led_pin ? MT_LED_GPIO_MUX3 : MT_LED_GPIO_MUX2; 264 + i = dev->mphy.leds.pin ? MT_LED_GPIO_MUX3 : MT_LED_GPIO_MUX2; 265 265 mt76_rmw_field(dev, i, MT_LED_GPIO_SEL_MASK, 4); 266 266 } 267 267 ··· 787 787 788 788 /* init led callbacks */ 789 789 if (IS_ENABLED(CONFIG_MT76_LEDS)) { 790 - dev->mt76.led_cdev.brightness_set = mt7996_led_set_brightness; 791 - dev->mt76.led_cdev.blink_set = mt7996_led_set_blink; 790 + dev->mphy.leds.cdev.brightness_set = mt7996_led_set_brightness; 791 + dev->mphy.leds.cdev.blink_set = mt7996_led_set_blink; 792 792 } 793 793 794 794 ret = mt76_register_device(&dev->mt76, true, mt76_rates,
+11 -4
drivers/net/wireless/mediatek/mt76/mt7996/mcu.c
··· 335 335 336 336 r = (struct mt7996_mcu_rdd_report *)skb->data; 337 337 338 + if (r->band_idx >= ARRAY_SIZE(dev->mt76.phys)) 339 + return; 340 + 338 341 mphy = dev->mt76.phys[r->band_idx]; 339 342 if (!mphy) 340 343 return; ··· 414 411 const char *data = (char *)&rxd[1], *tail; 415 412 struct header *hdr = (struct header *)data; 416 413 struct tlv *tlv = (struct tlv *)(data + 4); 414 + 415 + if (hdr->band >= ARRAY_SIZE(dev->mt76.phys)) 416 + return; 417 417 418 418 if (hdr->band && dev->mt76.phys[hdr->band]) 419 419 mphy = dev->mt76.phys[hdr->band]; ··· 909 903 he = (struct sta_rec_he_v2 *)tlv; 910 904 for (i = 0; i < 11; i++) { 911 905 if (i < 6) 912 - he->he_mac_cap[i] = cpu_to_le16(elem->mac_cap_info[i]); 913 - he->he_phy_cap[i] = cpu_to_le16(elem->phy_cap_info[i]); 906 + he->he_mac_cap[i] = elem->mac_cap_info[i]; 907 + he->he_phy_cap[i] = elem->phy_cap_info[i]; 914 908 } 915 909 916 910 mcs_map = sta->deflink.he_cap.he_mcs_nss_supp; ··· 2927 2921 bool valid; 2928 2922 int ret; 2929 2923 2930 - ret = mt76_mcu_send_and_get_msg(&dev->mt76, MCU_WM_UNI_CMD_QUERY(EFUSE_CTRL), &req, 2931 - sizeof(req), true, &skb); 2924 + ret = mt76_mcu_send_and_get_msg(&dev->mt76, 2925 + MCU_WM_UNI_CMD_QUERY(EFUSE_CTRL), 2926 + &req, sizeof(req), true, &skb); 2932 2927 if (ret) 2933 2928 return ret; 2934 2929
+1 -1
drivers/net/wireless/mediatek/mt76/mt7996/mmio.c
··· 149 149 150 150 if (dev_is_pci(dev->mt76.dev) && 151 151 ((addr >= MT_CBTOP1_PHY_START && addr <= MT_CBTOP1_PHY_END) || 152 - (addr >= MT_CBTOP2_PHY_START && addr <= MT_CBTOP2_PHY_END))) 152 + addr >= MT_CBTOP2_PHY_START)) 153 153 return mt7996_reg_map_l1(dev, addr); 154 154 155 155 /* CONN_INFRA: covert to phyiscal addr and use layer 1 remap */
-1
drivers/net/wireless/mediatek/mt76/mt7996/regs.h
··· 463 463 #define MT_CBTOP1_PHY_START 0x70000000 464 464 #define MT_CBTOP1_PHY_END 0x77ffffff 465 465 #define MT_CBTOP2_PHY_START 0xf0000000 466 - #define MT_CBTOP2_PHY_END 0xffffffff 467 466 #define MT_INFRA_MCU_START 0x7c000000 468 467 #define MT_INFRA_MCU_END 0x7c3fffff 469 468
+4
drivers/net/wireless/mediatek/mt76/sdio_txrx.c
··· 254 254 255 255 if (!test_bit(MT76_STATE_MCU_RUNNING, &dev->phy.state)) { 256 256 __skb_put_zero(e->skb, 4); 257 + err = __skb_grow(e->skb, roundup(e->skb->len, 258 + sdio->func->cur_blksize)); 259 + if (err) 260 + return err; 257 261 err = __mt76s_xmit_queue(dev, e->skb->data, 258 262 e->skb->len); 259 263 if (err)
+2 -1
drivers/net/wireless/mediatek/mt7601u/dma.c
··· 123 123 if (data_len < min_seg_len || 124 124 WARN_ON_ONCE(!dma_len) || 125 125 WARN_ON_ONCE(dma_len + MT_DMA_HDRS > data_len) || 126 - WARN_ON_ONCE(dma_len & 0x3)) 126 + WARN_ON_ONCE(dma_len & 0x3) || 127 + WARN_ON_ONCE(dma_len < min_seg_len)) 127 128 return 0; 128 129 129 130 return MT_DMA_HDRS + dma_len;
+7 -1
drivers/net/wireless/microchip/wilc1000/netdev.c
··· 730 730 731 731 if (skb->dev != ndev) { 732 732 netdev_err(ndev, "Packet not destined to this device\n"); 733 + dev_kfree_skb(skb); 733 734 return NETDEV_TX_OK; 734 735 } 735 736 ··· 981 980 ndev->name); 982 981 if (!wl->hif_workqueue) { 983 982 ret = -ENOMEM; 984 - goto error; 983 + goto unregister_netdev; 985 984 } 986 985 987 986 ndev->needs_free_netdev = true; ··· 996 995 997 996 return vif; 998 997 998 + unregister_netdev: 999 + if (rtnl_locked) 1000 + cfg80211_unregister_netdevice(ndev); 1001 + else 1002 + unregister_netdev(ndev); 999 1003 error: 1000 1004 free_netdev(ndev); 1001 1005 return ERR_PTR(ret);
-2
drivers/net/wireless/ralink/rt2x00/rt2800lib.c
··· 8924 8924 8925 8925 if (i < 2 && (bbptemp & 0x800000)) 8926 8926 result = (bbptemp & 0xffffff) - 0x1000000; 8927 - else if (i == 4) 8928 - result = bbptemp; 8929 8927 else 8930 8928 result = bbptemp; 8931 8929
+1 -1
drivers/net/wireless/realtek/rtl8xxxu/Kconfig
··· 10 10 parts written to utilize the Linux mac80211 stack. 11 11 The driver is known to work with a number of RTL8723AU, 12 12 RL8188CU, RTL8188RU, RTL8191CU, RTL8192CU, RTL8723BU, RTL8192EU, 13 - and RTL8188FU devices. 13 + RTL8188FU, and RTL8188EU devices. 14 14 15 15 This driver is under development and has a limited feature 16 16 set. In particular it does not yet support 40MHz channels
+2 -1
drivers/net/wireless/realtek/rtl8xxxu/Makefile
··· 2 2 obj-$(CONFIG_RTL8XXXU) += rtl8xxxu.o 3 3 4 4 rtl8xxxu-y := rtl8xxxu_core.o rtl8xxxu_8192e.o rtl8xxxu_8723b.o \ 5 - rtl8xxxu_8723a.o rtl8xxxu_8192c.o rtl8xxxu_8188f.o 5 + rtl8xxxu_8723a.o rtl8xxxu_8192c.o rtl8xxxu_8188f.o \ 6 + rtl8xxxu_8188e.o
+131 -3
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
··· 36 36 37 37 #define TX_TOTAL_PAGE_NUM 0xf8 38 38 #define TX_TOTAL_PAGE_NUM_8188F 0xf7 39 + #define TX_TOTAL_PAGE_NUM_8188E 0xa9 39 40 #define TX_TOTAL_PAGE_NUM_8192E 0xf3 40 41 #define TX_TOTAL_PAGE_NUM_8723B 0xf7 41 42 /* (HPQ + LPQ + NPQ + PUBQ) = TX_TOTAL_PAGE_NUM */ ··· 49 48 #define TX_PAGE_NUM_HI_PQ_8188F 0x0c 50 49 #define TX_PAGE_NUM_LO_PQ_8188F 0x02 51 50 #define TX_PAGE_NUM_NORM_PQ_8188F 0x02 51 + 52 + #define TX_PAGE_NUM_PUBQ_8188E 0x47 53 + #define TX_PAGE_NUM_HI_PQ_8188E 0x29 54 + #define TX_PAGE_NUM_LO_PQ_8188E 0x1c 55 + #define TX_PAGE_NUM_NORM_PQ_8188E 0x1c 52 56 53 57 #define TX_PAGE_NUM_PUBQ_8192E 0xe7 54 58 #define TX_PAGE_NUM_HI_PQ_8192E 0x08 ··· 159 153 u32 htc:1; 160 154 u32 eosp:1; 161 155 u32 bssidfit:2; 162 - u32 reserved1:16; 156 + u32 rpt_sel:2; /* 8188e */ 157 + u32 reserved1:14; 163 158 u32 unicastwake:1; 164 159 u32 magicwake:1; 165 160 ··· 218 211 219 212 u32 magicwake:1; 220 213 u32 unicastwake:1; 221 - u32 reserved1:16; 214 + u32 reserved1:14; 215 + u32 rpt_sel:2; /* 8188e */ 222 216 u32 bssidfit:2; 223 217 u32 eosp:1; 224 218 u32 htc:1; ··· 510 502 #define TXDESC_AMPDU_DENSITY_SHIFT 20 511 503 #define TXDESC40_BT_INT BIT(23) 512 504 #define TXDESC40_GID_SHIFT 24 505 + #define TXDESC_ANTENNA_SELECT_A BIT(24) 506 + #define TXDESC_ANTENNA_SELECT_B BIT(25) 513 507 514 508 /* Word 3 */ 515 509 #define TXDESC40_USE_DRIVER_RATE BIT(8) ··· 531 521 #define TXDESC32_CTS_SELF_ENABLE BIT(11) 532 522 #define TXDESC32_RTS_CTS_ENABLE BIT(12) 533 523 #define TXDESC32_HW_RTS_ENABLE BIT(13) 524 + #define TXDESC32_PT_STAGE_MASK GENMASK(17, 15) 534 525 #define TXDESC_PRIME_CH_OFF_LOWER BIT(20) 535 526 #define TXDESC_PRIME_CH_OFF_UPPER BIT(21) 536 527 #define TXDESC32_SHORT_PREAMBLE BIT(24) ··· 557 546 558 547 /* Word 6 */ 559 548 #define TXDESC_MAX_AGG_SHIFT 11 549 + #define TXDESC_USB_TX_AGG_SHIT 24 550 + 551 + /* Word 7 */ 552 + #define TXDESC_ANTENNA_SELECT_C BIT(29) 560 553 561 554 /* Word 8 */ 562 555 #define TXDESC40_HW_SEQ_ENABLE BIT(15) ··· 576 561 u8 trsw:1, gain:7; 577 562 #endif 578 563 }; 564 + 565 + #define CCK_AGC_RPT_LNA_IDX_MASK GENMASK(7, 5) 566 + #define CCK_AGC_RPT_VGA_IDX_MASK GENMASK(4, 0) 579 567 580 568 struct rtl8723au_phy_stats { 581 569 struct phy_rx_agc_info path_agc[RTL8723A_MAX_RF_PATHS]; ··· 927 909 u8 res11[0xc3]; 928 910 }; 929 911 912 + struct rtl8188eu_efuse { 913 + __le16 rtl_id; 914 + u8 res0[0x0e]; 915 + struct rtl8192eu_efuse_tx_power tx_power_index_A; /* 0x10 */ 916 + u8 res1[0x7e]; /* 0x3a */ 917 + u8 channel_plan; /* 0xb8 */ 918 + u8 xtal_k; 919 + u8 thermal_meter; 920 + u8 iqk_lck; 921 + u8 res2[5]; 922 + u8 rf_board_option; 923 + u8 rf_feature_option; 924 + u8 rf_bt_setting; 925 + u8 eeprom_version; 926 + u8 eeprom_customer_id; 927 + u8 res3[3]; 928 + u8 rf_antenna_option; /* 0xc9 */ 929 + u8 res4[6]; 930 + u8 vid; /* 0xd0 */ 931 + u8 res5[1]; 932 + u8 pid; /* 0xd2 */ 933 + u8 res6[1]; 934 + u8 usb_optional_function; 935 + u8 res7[2]; 936 + u8 mac_addr[ETH_ALEN]; /* 0xd7 */ 937 + u8 res8[2]; 938 + u8 vendor_name[7]; 939 + u8 res9[2]; 940 + u8 device_name[0x0b]; /* 0xe8 */ 941 + u8 res10[2]; 942 + u8 serial[0x0b]; /* 0xf5 */ 943 + u8 res11[0x30]; 944 + u8 unknown[0x0d]; /* 0x130 */ 945 + u8 res12[0xc3]; 946 + } __packed; 947 + 930 948 struct rtl8xxxu_reg8val { 931 949 u16 reg; 932 950 u8 val; ··· 1168 1114 u8 cmd; 1169 1115 u8 data; 1170 1116 } __packed bt_grant; 1117 + struct { 1118 + u8 cmd; 1119 + u8 macid; 1120 + u8 unknown0; 1121 + u8 rssi; 1122 + /* 1123 + * [0] - is_rx 1124 + * [1] - stbc_en 1125 + * [2] - noisy_decision 1126 + * [6] - bf_en 1127 + */ 1128 + u8 data; 1129 + /* 1130 + * [0:6] - ra_th_offset 1131 + * [7] - ra_offset_direction 1132 + */ 1133 + u8 ra_th_offset; 1134 + u8 unknown1; 1135 + u8 unknown2; 1136 + } __packed rssi_report; 1171 1137 }; 1172 1138 }; 1173 1139 ··· 1397 1323 u8 desc_rate; 1398 1324 }; 1399 1325 1326 + struct rtl8xxxu_ra_info { 1327 + u8 rate_id; 1328 + u32 rate_mask; 1329 + u32 ra_use_rate; 1330 + u8 rate_sgi; 1331 + u8 rssi_sta_ra; /* Percentage */ 1332 + u8 pre_rssi_sta_ra; 1333 + u8 sgi_enable; 1334 + u8 decision_rate; 1335 + u8 pre_rate; 1336 + u8 highest_rate; 1337 + u8 lowest_rate; 1338 + u32 nsc_up; 1339 + u32 nsc_down; 1340 + u32 total; 1341 + u16 retry[5]; 1342 + u16 drop; 1343 + u16 rpt_time; 1344 + u16 pre_min_rpt_time; 1345 + u8 dynamic_tx_rpt_timing_counter; 1346 + u8 ra_waiting_counter; 1347 + u8 ra_pending_counter; 1348 + u8 ra_drop_after_down; 1349 + u8 pt_try_state; /* 0 trying state, 1 for decision state */ 1350 + u8 pt_stage; /* 0~6 */ 1351 + u8 pt_stop_count; /* Stop PT counter */ 1352 + u8 pt_pre_rate; /* if rate change do PT */ 1353 + u8 pt_pre_rssi; /* if RSSI change 5% do PT */ 1354 + u8 pt_mode_ss; /* decide which rate should do PT */ 1355 + u8 ra_stage; /* StageRA, decide how many times RA will be done between PT */ 1356 + u8 pt_smooth_factor; 1357 + }; 1358 + 1400 1359 #define CFO_TH_XTAL_HIGH 20 /* kHz */ 1401 1360 #define CFO_TH_XTAL_LOW 10 /* kHz */ 1402 1361 #define CFO_TH_ATC 80 /* kHz */ ··· 1539 1432 struct rtl8192cu_efuse efuse8192; 1540 1433 struct rtl8192eu_efuse efuse8192eu; 1541 1434 struct rtl8188fu_efuse efuse8188fu; 1435 + struct rtl8188eu_efuse efuse8188eu; 1542 1436 } efuse_wifi; 1543 1437 u32 adda_backup[RTL8XXXU_ADDA_REGS]; 1544 1438 u32 mac_backup[RTL8XXXU_MAC_REGS]; ··· 1563 1455 struct rtl8xxxu_btcoex bt_coex; 1564 1456 struct rtl8xxxu_ra_report ra_report; 1565 1457 struct rtl8xxxu_cfo_tracking cfo_tracking; 1458 + struct rtl8xxxu_ra_info ra_info; 1566 1459 }; 1567 1460 1568 1461 struct rtl8xxxu_rx_urb { ··· 1605 1496 u32 ramask, u8 rateid, int sgi, int txbw_40mhz); 1606 1497 void (*report_connect) (struct rtl8xxxu_priv *priv, 1607 1498 u8 macid, bool connect); 1499 + void (*report_rssi) (struct rtl8xxxu_priv *priv, u8 macid, u8 rssi); 1608 1500 void (*fill_txdesc) (struct ieee80211_hw *hw, struct ieee80211_hdr *hdr, 1609 1501 struct ieee80211_tx_info *tx_info, 1610 1502 struct rtl8xxxu_txdesc32 *tx_desc, bool sgi, ··· 1633 1523 u8 page_num_hi; 1634 1524 u8 page_num_lo; 1635 1525 u8 page_num_norm; 1526 + u8 last_llt_entry; 1636 1527 }; 1637 1528 1638 1529 extern int rtl8xxxu_debug; ··· 1671 1560 enum rtl8xxxu_rfpath path); 1672 1561 int rtl8xxxu_init_phy_regs(struct rtl8xxxu_priv *priv, 1673 1562 const struct rtl8xxxu_reg32val *array); 1674 - int rtl8xxxu_load_firmware(struct rtl8xxxu_priv *priv, char *fw_name); 1563 + int rtl8xxxu_load_firmware(struct rtl8xxxu_priv *priv, const char *fw_name); 1675 1564 void rtl8xxxu_firmware_self_reset(struct rtl8xxxu_priv *priv); 1676 1565 void rtl8xxxu_power_off(struct rtl8xxxu_priv *priv); 1677 1566 void rtl8xxxu_identify_vendor_1bit(struct rtl8xxxu_priv *priv, u32 vendor); ··· 1693 1582 void rtl8xxxu_gen1_init_phy_bb(struct rtl8xxxu_priv *priv); 1694 1583 void rtl8xxxu_gen1_set_tx_power(struct rtl8xxxu_priv *priv, 1695 1584 int channel, bool ht40); 1585 + void rtl8188f_set_tx_power(struct rtl8xxxu_priv *priv, 1586 + int channel, bool ht40); 1696 1587 void rtl8xxxu_gen1_config_channel(struct ieee80211_hw *hw); 1697 1588 void rtl8xxxu_gen2_config_channel(struct ieee80211_hw *hw); 1698 1589 void rtl8xxxu_gen1_usb_quirks(struct rtl8xxxu_priv *priv); ··· 1707 1594 u8 macid, bool connect); 1708 1595 void rtl8xxxu_gen2_report_connect(struct rtl8xxxu_priv *priv, 1709 1596 u8 macid, bool connect); 1597 + void rtl8xxxu_gen1_report_rssi(struct rtl8xxxu_priv *priv, u8 macid, u8 rssi); 1598 + void rtl8xxxu_gen2_report_rssi(struct rtl8xxxu_priv *priv, u8 macid, u8 rssi); 1710 1599 void rtl8xxxu_gen1_init_aggregation(struct rtl8xxxu_priv *priv); 1711 1600 void rtl8xxxu_gen1_enable_rf(struct rtl8xxxu_priv *priv); 1712 1601 void rtl8xxxu_gen1_disable_rf(struct rtl8xxxu_priv *priv); ··· 1717 1602 int rtl8xxxu_parse_rxdesc16(struct rtl8xxxu_priv *priv, struct sk_buff *skb); 1718 1603 int rtl8xxxu_parse_rxdesc24(struct rtl8xxxu_priv *priv, struct sk_buff *skb); 1719 1604 int rtl8xxxu_gen2_channel_to_group(int channel); 1605 + bool rtl8xxxu_simularity_compare(struct rtl8xxxu_priv *priv, 1606 + int result[][8], int c1, int c2); 1720 1607 bool rtl8xxxu_gen2_simularity_compare(struct rtl8xxxu_priv *priv, 1721 1608 int result[][8], int c1, int c2); 1722 1609 void rtl8xxxu_fill_txdesc_v1(struct ieee80211_hw *hw, struct ieee80211_hdr *hdr, ··· 1731 1614 struct rtl8xxxu_txdesc32 *tx_desc32, bool sgi, 1732 1615 bool short_preamble, bool ampdu_enable, 1733 1616 u32 rts_rate); 1617 + void rtl8xxxu_fill_txdesc_v3(struct ieee80211_hw *hw, struct ieee80211_hdr *hdr, 1618 + struct ieee80211_tx_info *tx_info, 1619 + struct rtl8xxxu_txdesc32 *tx_desc32, bool sgi, 1620 + bool short_preamble, bool ampdu_enable, 1621 + u32 rts_rate); 1734 1622 void rtl8723bu_set_ps_tdma(struct rtl8xxxu_priv *priv, 1735 1623 u8 arg1, u8 arg2, u8 arg3, u8 arg4, u8 arg5); 1736 1624 void rtl8723bu_phy_init_antenna_selection(struct rtl8xxxu_priv *priv); 1737 1625 void rtl8723a_set_crystal_cap(struct rtl8xxxu_priv *priv, u8 crystal_cap); 1626 + void rtl8188f_set_crystal_cap(struct rtl8xxxu_priv *priv, u8 crystal_cap); 1738 1627 s8 rtl8723a_cck_rssi(struct rtl8xxxu_priv *priv, u8 cck_agc_rpt); 1628 + void rtl8xxxu_update_ra_report(struct rtl8xxxu_ra_report *rarpt, 1629 + u8 rate, u8 sgi, u8 bw); 1630 + void rtl8188e_ra_info_init_all(struct rtl8xxxu_ra_info *ra); 1631 + void rtl8188e_handle_ra_tx_report2(struct rtl8xxxu_priv *priv, struct sk_buff *skb); 1739 1632 1740 1633 extern struct rtl8xxxu_fileops rtl8188fu_fops; 1634 + extern struct rtl8xxxu_fileops rtl8188eu_fops; 1741 1635 extern struct rtl8xxxu_fileops rtl8192cu_fops; 1742 1636 extern struct rtl8xxxu_fileops rtl8192eu_fops; 1743 1637 extern struct rtl8xxxu_fileops rtl8723au_fops;
+1874
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188e.c
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + /* 3 + * RTL8XXXU mac80211 USB driver - 8188e specific subdriver 4 + * 5 + * Copyright (c) 2014 - 2016 Jes Sorensen <Jes.Sorensen@gmail.com> 6 + * 7 + * Portions, notably calibration code: 8 + * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved. 9 + * 10 + * This driver was written as a replacement for the vendor provided 11 + * rtl8723au driver. As the Realtek 8xxx chips are very similar in 12 + * their programming interface, I have started adding support for 13 + * additional 8xxx chips like the 8192cu, 8188cus, etc. 14 + */ 15 + 16 + #include <linux/init.h> 17 + #include <linux/kernel.h> 18 + #include <linux/sched.h> 19 + #include <linux/errno.h> 20 + #include <linux/slab.h> 21 + #include <linux/module.h> 22 + #include <linux/spinlock.h> 23 + #include <linux/list.h> 24 + #include <linux/usb.h> 25 + #include <linux/netdevice.h> 26 + #include <linux/etherdevice.h> 27 + #include <linux/ethtool.h> 28 + #include <linux/wireless.h> 29 + #include <linux/firmware.h> 30 + #include <linux/moduleparam.h> 31 + #include <net/mac80211.h> 32 + #include "rtl8xxxu.h" 33 + #include "rtl8xxxu_regs.h" 34 + 35 + static const struct rtl8xxxu_reg8val rtl8188e_mac_init_table[] = { 36 + {0x026, 0x41}, {0x027, 0x35}, {0x040, 0x00}, {0x421, 0x0f}, 37 + {0x428, 0x0a}, {0x429, 0x10}, {0x430, 0x00}, {0x431, 0x01}, 38 + {0x432, 0x02}, {0x433, 0x04}, {0x434, 0x05}, {0x435, 0x06}, 39 + {0x436, 0x07}, {0x437, 0x08}, {0x438, 0x00}, {0x439, 0x00}, 40 + {0x43a, 0x01}, {0x43b, 0x02}, {0x43c, 0x04}, {0x43d, 0x05}, 41 + {0x43e, 0x06}, {0x43f, 0x07}, {0x440, 0x5d}, {0x441, 0x01}, 42 + {0x442, 0x00}, {0x444, 0x15}, {0x445, 0xf0}, {0x446, 0x0f}, 43 + {0x447, 0x00}, {0x458, 0x41}, {0x459, 0xa8}, {0x45a, 0x72}, 44 + {0x45b, 0xb9}, {0x460, 0x66}, {0x461, 0x66}, {0x480, 0x08}, 45 + {0x4c8, 0xff}, {0x4c9, 0x08}, {0x4cc, 0xff}, {0x4cd, 0xff}, 46 + {0x4ce, 0x01}, {0x4d3, 0x01}, {0x500, 0x26}, {0x501, 0xa2}, 47 + {0x502, 0x2f}, {0x503, 0x00}, {0x504, 0x28}, {0x505, 0xa3}, 48 + {0x506, 0x5e}, {0x507, 0x00}, {0x508, 0x2b}, {0x509, 0xa4}, 49 + {0x50a, 0x5e}, {0x50b, 0x00}, {0x50c, 0x4f}, {0x50d, 0xa4}, 50 + {0x50e, 0x00}, {0x50f, 0x00}, {0x512, 0x1c}, {0x514, 0x0a}, 51 + {0x516, 0x0a}, {0x525, 0x4f}, {0x550, 0x10}, {0x551, 0x10}, 52 + {0x559, 0x02}, {0x55d, 0xff}, {0x605, 0x30}, {0x608, 0x0e}, 53 + {0x609, 0x2a}, {0x620, 0xff}, {0x621, 0xff}, {0x622, 0xff}, 54 + {0x623, 0xff}, {0x624, 0xff}, {0x625, 0xff}, {0x626, 0xff}, 55 + {0x627, 0xff}, {0x63c, 0x08}, {0x63d, 0x08}, {0x63e, 0x0c}, 56 + {0x63f, 0x0c}, {0x640, 0x40}, {0x652, 0x20}, {0x66e, 0x05}, 57 + {0x700, 0x21}, {0x701, 0x43}, {0x702, 0x65}, {0x703, 0x87}, 58 + {0x708, 0x21}, {0x709, 0x43}, {0x70a, 0x65}, {0x70b, 0x87}, 59 + {0xffff, 0xff}, 60 + }; 61 + 62 + static const struct rtl8xxxu_reg32val rtl8188eu_phy_init_table[] = { 63 + {0x800, 0x80040000}, {0x804, 0x00000003}, 64 + {0x808, 0x0000fc00}, {0x80c, 0x0000000a}, 65 + {0x810, 0x10001331}, {0x814, 0x020c3d10}, 66 + {0x818, 0x02200385}, {0x81c, 0x00000000}, 67 + {0x820, 0x01000100}, {0x824, 0x00390204}, 68 + {0x828, 0x00000000}, {0x82c, 0x00000000}, 69 + {0x830, 0x00000000}, {0x834, 0x00000000}, 70 + {0x838, 0x00000000}, {0x83c, 0x00000000}, 71 + {0x840, 0x00010000}, {0x844, 0x00000000}, 72 + {0x848, 0x00000000}, {0x84c, 0x00000000}, 73 + {0x850, 0x00000000}, {0x854, 0x00000000}, 74 + {0x858, 0x569a11a9}, {0x85c, 0x01000014}, 75 + {0x860, 0x66f60110}, {0x864, 0x061f0649}, 76 + {0x868, 0x00000000}, {0x86c, 0x27272700}, 77 + {0x870, 0x07000760}, {0x874, 0x25004000}, 78 + {0x878, 0x00000808}, {0x87c, 0x00000000}, 79 + {0x880, 0xb0000c1c}, {0x884, 0x00000001}, 80 + {0x888, 0x00000000}, {0x88c, 0xccc000c0}, 81 + {0x890, 0x00000800}, {0x894, 0xfffffffe}, 82 + {0x898, 0x40302010}, {0x89c, 0x00706050}, 83 + {0x900, 0x00000000}, {0x904, 0x00000023}, 84 + {0x908, 0x00000000}, {0x90c, 0x81121111}, 85 + {0x910, 0x00000002}, {0x914, 0x00000201}, 86 + {0xa00, 0x00d047c8}, {0xa04, 0x80ff800c}, 87 + {0xa08, 0x8c838300}, {0xa0c, 0x2e7f120f}, 88 + {0xa10, 0x9500bb7e}, {0xa14, 0x1114d028}, 89 + {0xa18, 0x00881117}, {0xa1c, 0x89140f00}, 90 + {0xa20, 0x1a1b0000}, {0xa24, 0x090e1317}, 91 + {0xa28, 0x00000204}, {0xa2c, 0x00d30000}, 92 + {0xa70, 0x101fbf00}, {0xa74, 0x00000007}, 93 + {0xa78, 0x00000900}, {0xa7c, 0x225b0606}, 94 + {0xa80, 0x218075b1}, {0xb2c, 0x80000000}, 95 + {0xc00, 0x48071d40}, {0xc04, 0x03a05611}, 96 + {0xc08, 0x000000e4}, {0xc0c, 0x6c6c6c6c}, 97 + {0xc10, 0x08800000}, {0xc14, 0x40000100}, 98 + {0xc18, 0x08800000}, {0xc1c, 0x40000100}, 99 + {0xc20, 0x00000000}, {0xc24, 0x00000000}, 100 + {0xc28, 0x00000000}, {0xc2c, 0x00000000}, 101 + {0xc30, 0x69e9ac47}, {0xc34, 0x469652af}, 102 + {0xc38, 0x49795994}, {0xc3c, 0x0a97971c}, 103 + {0xc40, 0x1f7c403f}, {0xc44, 0x000100b7}, 104 + {0xc48, 0xec020107}, {0xc4c, 0x007f037f}, 105 + {0xc50, 0x69553420}, {0xc54, 0x43bc0094}, 106 + {0xc58, 0x00013169}, {0xc5c, 0x00250492}, 107 + {0xc60, 0x00000000}, {0xc64, 0x7112848b}, 108 + {0xc68, 0x47c00bff}, {0xc6c, 0x00000036}, 109 + {0xc70, 0x2c7f000d}, {0xc74, 0x020610db}, 110 + {0xc78, 0x0000001f}, {0xc7c, 0x00b91612}, 111 + {0xc80, 0x390000e4}, {0xc84, 0x21f60000}, 112 + {0xc88, 0x40000100}, {0xc8c, 0x20200000}, 113 + {0xc90, 0x00091521}, {0xc94, 0x00000000}, 114 + {0xc98, 0x00121820}, {0xc9c, 0x00007f7f}, 115 + {0xca0, 0x00000000}, {0xca4, 0x000300a0}, 116 + {0xca8, 0x00000000}, {0xcac, 0x00000000}, 117 + {0xcb0, 0x00000000}, {0xcb4, 0x00000000}, 118 + {0xcb8, 0x00000000}, {0xcbc, 0x28000000}, 119 + {0xcc0, 0x00000000}, {0xcc4, 0x00000000}, 120 + {0xcc8, 0x00000000}, {0xccc, 0x00000000}, 121 + {0xcd0, 0x00000000}, {0xcd4, 0x00000000}, 122 + {0xcd8, 0x64b22427}, {0xcdc, 0x00766932}, 123 + {0xce0, 0x00222222}, {0xce4, 0x00000000}, 124 + {0xce8, 0x37644302}, {0xcec, 0x2f97d40c}, 125 + {0xd00, 0x00000740}, {0xd04, 0x00020401}, 126 + {0xd08, 0x0000907f}, {0xd0c, 0x20010201}, 127 + {0xd10, 0xa0633333}, {0xd14, 0x3333bc43}, 128 + {0xd18, 0x7a8f5b6f}, {0xd2c, 0xcc979975}, 129 + {0xd30, 0x00000000}, {0xd34, 0x80608000}, 130 + {0xd38, 0x00000000}, {0xd3c, 0x00127353}, 131 + {0xd40, 0x00000000}, {0xd44, 0x00000000}, 132 + {0xd48, 0x00000000}, {0xd4c, 0x00000000}, 133 + {0xd50, 0x6437140a}, {0xd54, 0x00000000}, 134 + {0xd58, 0x00000282}, {0xd5c, 0x30032064}, 135 + {0xd60, 0x4653de68}, {0xd64, 0x04518a3c}, 136 + {0xd68, 0x00002101}, {0xd6c, 0x2a201c16}, 137 + {0xd70, 0x1812362e}, {0xd74, 0x322c2220}, 138 + {0xd78, 0x000e3c24}, {0xe00, 0x2d2d2d2d}, 139 + {0xe04, 0x2d2d2d2d}, {0xe08, 0x0390272d}, 140 + {0xe10, 0x2d2d2d2d}, {0xe14, 0x2d2d2d2d}, 141 + {0xe18, 0x2d2d2d2d}, {0xe1c, 0x2d2d2d2d}, 142 + {0xe28, 0x00000000}, {0xe30, 0x1000dc1f}, 143 + {0xe34, 0x10008c1f}, {0xe38, 0x02140102}, 144 + {0xe3c, 0x681604c2}, {0xe40, 0x01007c00}, 145 + {0xe44, 0x01004800}, {0xe48, 0xfb000000}, 146 + {0xe4c, 0x000028d1}, {0xe50, 0x1000dc1f}, 147 + {0xe54, 0x10008c1f}, {0xe58, 0x02140102}, 148 + {0xe5c, 0x28160d05}, {0xe60, 0x00000048}, 149 + {0xe68, 0x001b25a4}, {0xe6c, 0x00c00014}, 150 + {0xe70, 0x00c00014}, {0xe74, 0x01000014}, 151 + {0xe78, 0x01000014}, {0xe7c, 0x01000014}, 152 + {0xe80, 0x01000014}, {0xe84, 0x00c00014}, 153 + {0xe88, 0x01000014}, {0xe8c, 0x00c00014}, 154 + {0xed0, 0x00c00014}, {0xed4, 0x00c00014}, 155 + {0xed8, 0x00c00014}, {0xedc, 0x00000014}, 156 + {0xee0, 0x00000014}, {0xee8, 0x21555448}, 157 + {0xeec, 0x01c00014}, {0xf14, 0x00000003}, 158 + {0xf4c, 0x00000000}, {0xf00, 0x00000300}, 159 + {0xffff, 0xffffffff}, 160 + }; 161 + 162 + static const struct rtl8xxxu_reg32val rtl8188e_agc_table[] = { 163 + {0xc78, 0xfb000001}, {0xc78, 0xfb010001}, 164 + {0xc78, 0xfb020001}, {0xc78, 0xfb030001}, 165 + {0xc78, 0xfb040001}, {0xc78, 0xfb050001}, 166 + {0xc78, 0xfa060001}, {0xc78, 0xf9070001}, 167 + {0xc78, 0xf8080001}, {0xc78, 0xf7090001}, 168 + {0xc78, 0xf60a0001}, {0xc78, 0xf50b0001}, 169 + {0xc78, 0xf40c0001}, {0xc78, 0xf30d0001}, 170 + {0xc78, 0xf20e0001}, {0xc78, 0xf10f0001}, 171 + {0xc78, 0xf0100001}, {0xc78, 0xef110001}, 172 + {0xc78, 0xee120001}, {0xc78, 0xed130001}, 173 + {0xc78, 0xec140001}, {0xc78, 0xeb150001}, 174 + {0xc78, 0xea160001}, {0xc78, 0xe9170001}, 175 + {0xc78, 0xe8180001}, {0xc78, 0xe7190001}, 176 + {0xc78, 0xe61a0001}, {0xc78, 0xe51b0001}, 177 + {0xc78, 0xe41c0001}, {0xc78, 0xe31d0001}, 178 + {0xc78, 0xe21e0001}, {0xc78, 0xe11f0001}, 179 + {0xc78, 0x8a200001}, {0xc78, 0x89210001}, 180 + {0xc78, 0x88220001}, {0xc78, 0x87230001}, 181 + {0xc78, 0x86240001}, {0xc78, 0x85250001}, 182 + {0xc78, 0x84260001}, {0xc78, 0x83270001}, 183 + {0xc78, 0x82280001}, {0xc78, 0x6b290001}, 184 + {0xc78, 0x6a2a0001}, {0xc78, 0x692b0001}, 185 + {0xc78, 0x682c0001}, {0xc78, 0x672d0001}, 186 + {0xc78, 0x662e0001}, {0xc78, 0x652f0001}, 187 + {0xc78, 0x64300001}, {0xc78, 0x63310001}, 188 + {0xc78, 0x62320001}, {0xc78, 0x61330001}, 189 + {0xc78, 0x46340001}, {0xc78, 0x45350001}, 190 + {0xc78, 0x44360001}, {0xc78, 0x43370001}, 191 + {0xc78, 0x42380001}, {0xc78, 0x41390001}, 192 + {0xc78, 0x403a0001}, {0xc78, 0x403b0001}, 193 + {0xc78, 0x403c0001}, {0xc78, 0x403d0001}, 194 + {0xc78, 0x403e0001}, {0xc78, 0x403f0001}, 195 + {0xc78, 0xfb400001}, {0xc78, 0xfb410001}, 196 + {0xc78, 0xfb420001}, {0xc78, 0xfb430001}, 197 + {0xc78, 0xfb440001}, {0xc78, 0xfb450001}, 198 + {0xc78, 0xfb460001}, {0xc78, 0xfb470001}, 199 + {0xc78, 0xfb480001}, {0xc78, 0xfa490001}, 200 + {0xc78, 0xf94a0001}, {0xc78, 0xf84b0001}, 201 + {0xc78, 0xf74c0001}, {0xc78, 0xf64d0001}, 202 + {0xc78, 0xf54e0001}, {0xc78, 0xf44f0001}, 203 + {0xc78, 0xf3500001}, {0xc78, 0xf2510001}, 204 + {0xc78, 0xf1520001}, {0xc78, 0xf0530001}, 205 + {0xc78, 0xef540001}, {0xc78, 0xee550001}, 206 + {0xc78, 0xed560001}, {0xc78, 0xec570001}, 207 + {0xc78, 0xeb580001}, {0xc78, 0xea590001}, 208 + {0xc78, 0xe95a0001}, {0xc78, 0xe85b0001}, 209 + {0xc78, 0xe75c0001}, {0xc78, 0xe65d0001}, 210 + {0xc78, 0xe55e0001}, {0xc78, 0xe45f0001}, 211 + {0xc78, 0xe3600001}, {0xc78, 0xe2610001}, 212 + {0xc78, 0xc3620001}, {0xc78, 0xc2630001}, 213 + {0xc78, 0xc1640001}, {0xc78, 0x8b650001}, 214 + {0xc78, 0x8a660001}, {0xc78, 0x89670001}, 215 + {0xc78, 0x88680001}, {0xc78, 0x87690001}, 216 + {0xc78, 0x866a0001}, {0xc78, 0x856b0001}, 217 + {0xc78, 0x846c0001}, {0xc78, 0x676d0001}, 218 + {0xc78, 0x666e0001}, {0xc78, 0x656f0001}, 219 + {0xc78, 0x64700001}, {0xc78, 0x63710001}, 220 + {0xc78, 0x62720001}, {0xc78, 0x61730001}, 221 + {0xc78, 0x60740001}, {0xc78, 0x46750001}, 222 + {0xc78, 0x45760001}, {0xc78, 0x44770001}, 223 + {0xc78, 0x43780001}, {0xc78, 0x42790001}, 224 + {0xc78, 0x417a0001}, {0xc78, 0x407b0001}, 225 + {0xc78, 0x407c0001}, {0xc78, 0x407d0001}, 226 + {0xc78, 0x407e0001}, {0xc78, 0x407f0001}, 227 + {0xc50, 0x69553422}, {0xc50, 0x69553420}, 228 + {0xffff, 0xffffffff} 229 + }; 230 + 231 + static const struct rtl8xxxu_rfregval rtl8188eu_radioa_init_table[] = { 232 + {0x00, 0x00030000}, {0x08, 0x00084000}, 233 + {0x18, 0x00000407}, {0x19, 0x00000012}, 234 + {0x1e, 0x00080009}, {0x1f, 0x00000880}, 235 + {0x2f, 0x0001a060}, {0x3f, 0x00000000}, 236 + {0x42, 0x000060c0}, {0x57, 0x000d0000}, 237 + {0x58, 0x000be180}, {0x67, 0x00001552}, 238 + {0x83, 0x00000000}, {0xb0, 0x000ff8fc}, 239 + {0xb1, 0x00054400}, {0xb2, 0x000ccc19}, 240 + {0xb4, 0x00043003}, {0xb6, 0x0004953e}, 241 + {0xb7, 0x0001c718}, {0xb8, 0x000060ff}, 242 + {0xb9, 0x00080001}, {0xba, 0x00040000}, 243 + {0xbb, 0x00000400}, {0xbf, 0x000c0000}, 244 + {0xc2, 0x00002400}, {0xc3, 0x00000009}, 245 + {0xc4, 0x00040c91}, {0xc5, 0x00099999}, 246 + {0xc6, 0x000000a3}, {0xc7, 0x00088820}, 247 + {0xc8, 0x00076c06}, {0xc9, 0x00000000}, 248 + {0xca, 0x00080000}, {0xdf, 0x00000180}, 249 + {0xef, 0x000001a0}, {0x51, 0x0006b27d}, 250 + {0x52, 0x0007e49d}, /* Set to 0x0007e4dd for SDIO */ 251 + {0x53, 0x00000073}, {0x56, 0x00051ff3}, 252 + {0x35, 0x00000086}, {0x35, 0x00000186}, 253 + {0x35, 0x00000286}, {0x36, 0x00001c25}, 254 + {0x36, 0x00009c25}, {0x36, 0x00011c25}, 255 + {0x36, 0x00019c25}, {0xb6, 0x00048538}, 256 + {0x18, 0x00000c07}, {0x5a, 0x0004bd00}, 257 + {0x19, 0x000739d0}, {0x34, 0x0000adf3}, 258 + {0x34, 0x00009df0}, {0x34, 0x00008ded}, 259 + {0x34, 0x00007dea}, {0x34, 0x00006de7}, 260 + {0x34, 0x000054ee}, {0x34, 0x000044eb}, 261 + {0x34, 0x000034e8}, {0x34, 0x0000246b}, 262 + {0x34, 0x00001468}, {0x34, 0x0000006d}, 263 + {0x00, 0x00030159}, {0x84, 0x00068200}, 264 + {0x86, 0x000000ce}, {0x87, 0x00048a00}, 265 + {0x8e, 0x00065540}, {0x8f, 0x00088000}, 266 + {0xef, 0x000020a0}, {0x3b, 0x000f02b0}, 267 + {0x3b, 0x000ef7b0}, {0x3b, 0x000d4fb0}, 268 + {0x3b, 0x000cf060}, {0x3b, 0x000b0090}, 269 + {0x3b, 0x000a0080}, {0x3b, 0x00090080}, 270 + {0x3b, 0x0008f780}, {0x3b, 0x000722b0}, 271 + {0x3b, 0x0006f7b0}, {0x3b, 0x00054fb0}, 272 + {0x3b, 0x0004f060}, {0x3b, 0x00030090}, 273 + {0x3b, 0x00020080}, {0x3b, 0x00010080}, 274 + {0x3b, 0x0000f780}, {0xef, 0x000000a0}, 275 + {0x00, 0x00010159}, {0x18, 0x0000f407}, 276 + {0xFE, 0x00000000}, {0xFE, 0x00000000}, 277 + {0x1F, 0x00080003}, {0xFE, 0x00000000}, 278 + {0xFE, 0x00000000}, {0x1E, 0x00000001}, 279 + {0x1F, 0x00080000}, {0x00, 0x00033e60}, 280 + {0xff, 0xffffffff} 281 + }; 282 + 283 + #define PERENTRY 23 284 + #define RETRYSIZE 5 285 + #define RATESIZE 28 286 + #define TX_RPT2_ITEM_SIZE 8 287 + 288 + static const u8 retry_penalty[PERENTRY][RETRYSIZE + 1] = { 289 + {5, 4, 3, 2, 0, 3}, /* 92 , idx=0 */ 290 + {6, 5, 4, 3, 0, 4}, /* 86 , idx=1 */ 291 + {6, 5, 4, 2, 0, 4}, /* 81 , idx=2 */ 292 + {8, 7, 6, 4, 0, 6}, /* 75 , idx=3 */ 293 + {10, 9, 8, 6, 0, 8}, /* 71 , idx=4 */ 294 + {10, 9, 8, 4, 0, 8}, /* 66 , idx=5 */ 295 + {10, 9, 8, 2, 0, 8}, /* 62 , idx=6 */ 296 + {10, 9, 8, 0, 0, 8}, /* 59 , idx=7 */ 297 + {18, 17, 16, 8, 0, 16}, /* 53 , idx=8 */ 298 + {26, 25, 24, 16, 0, 24}, /* 50 , idx=9 */ 299 + {34, 33, 32, 24, 0, 32}, /* 47 , idx=0x0a */ 300 + {34, 31, 28, 20, 0, 32}, /* 43 , idx=0x0b */ 301 + {34, 31, 27, 18, 0, 32}, /* 40 , idx=0x0c */ 302 + {34, 31, 26, 16, 0, 32}, /* 37 , idx=0x0d */ 303 + {34, 30, 22, 16, 0, 32}, /* 32 , idx=0x0e */ 304 + {34, 30, 24, 16, 0, 32}, /* 26 , idx=0x0f */ 305 + {49, 46, 40, 16, 0, 48}, /* 20 , idx=0x10 */ 306 + {49, 45, 32, 0, 0, 48}, /* 17 , idx=0x11 */ 307 + {49, 45, 22, 18, 0, 48}, /* 15 , idx=0x12 */ 308 + {49, 40, 24, 16, 0, 48}, /* 12 , idx=0x13 */ 309 + {49, 32, 18, 12, 0, 48}, /* 9 , idx=0x14 */ 310 + {49, 22, 18, 14, 0, 48}, /* 6 , idx=0x15 */ 311 + {49, 16, 16, 0, 0, 48} /* 3, idx=0x16 */ 312 + }; 313 + 314 + static const u8 pt_penalty[RETRYSIZE + 1] = {34, 31, 30, 24, 0, 32}; 315 + 316 + static const u8 retry_penalty_idx_normal[2][RATESIZE] = { 317 + { /* RSSI>TH */ 318 + 4, 4, 4, 5, 319 + 4, 4, 5, 7, 7, 7, 8, 0x0a, 320 + 4, 4, 4, 4, 6, 0x0a, 0x0b, 0x0d, 321 + 5, 5, 7, 7, 8, 0x0b, 0x0d, 0x0f 322 + }, 323 + { /* RSSI<TH */ 324 + 0x0a, 0x0a, 0x0b, 0x0c, 325 + 0x0a, 0x0a, 0x0b, 0x0c, 0x0d, 0x10, 0x13, 0x13, 326 + 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x11, 0x13, 0x13, 327 + 9, 9, 9, 9, 0x0c, 0x0e, 0x11, 0x13 328 + } 329 + }; 330 + 331 + static const u8 retry_penalty_idx_cut_i[2][RATESIZE] = { 332 + { /* RSSI>TH */ 333 + 4, 4, 4, 5, 334 + 4, 4, 5, 7, 7, 7, 8, 0x0a, 335 + 4, 4, 4, 4, 6, 0x0a, 0x0b, 0x0d, 336 + 5, 5, 7, 7, 8, 0x0b, 0x0d, 0x0f 337 + }, 338 + { /* RSSI<TH */ 339 + 0x0a, 0x0a, 0x0b, 0x0c, 340 + 0x0a, 0x0a, 0x0b, 0x0c, 0x0d, 0x10, 0x13, 0x13, 341 + 0x06, 0x07, 0x08, 0x0d, 0x0e, 0x11, 0x11, 0x11, 342 + 9, 9, 9, 9, 0x0c, 0x0e, 0x11, 0x13 343 + } 344 + }; 345 + 346 + static const u8 retry_penalty_up_idx_normal[RATESIZE] = { 347 + 0x0c, 0x0d, 0x0d, 0x0f, 348 + 0x0d, 0x0e, 0x0f, 0x0f, 0x10, 0x12, 0x13, 0x14, 349 + 0x0f, 0x10, 0x10, 0x12, 0x12, 0x13, 0x14, 0x15, 350 + 0x11, 0x11, 0x12, 0x13, 0x13, 0x13, 0x14, 0x15 351 + }; 352 + 353 + static const u8 retry_penalty_up_idx_cut_i[RATESIZE] = { 354 + 0x0c, 0x0d, 0x0d, 0x0f, 355 + 0x0d, 0x0e, 0x0f, 0x0f, 0x10, 0x12, 0x13, 0x14, 356 + 0x0b, 0x0b, 0x11, 0x11, 0x12, 0x12, 0x12, 0x12, 357 + 0x11, 0x11, 0x12, 0x13, 0x13, 0x13, 0x14, 0x15 358 + }; 359 + 360 + static const u8 rssi_threshold[RATESIZE] = { 361 + 0, 0, 0, 0, 362 + 0, 0, 0, 0, 0, 0x24, 0x26, 0x2a, 363 + 0x18, 0x1a, 0x1d, 0x1f, 0x21, 0x27, 0x29, 0x2a, 364 + 0, 0, 0, 0x1f, 0x23, 0x28, 0x2a, 0x2c 365 + }; 366 + 367 + static const u16 n_threshold_high[RATESIZE] = { 368 + 4, 4, 8, 16, 369 + 24, 36, 48, 72, 96, 144, 192, 216, 370 + 60, 80, 100, 160, 240, 400, 600, 800, 371 + 300, 320, 480, 720, 1000, 1200, 1600, 2000 372 + }; 373 + 374 + static const u16 n_threshold_low[RATESIZE] = { 375 + 2, 2, 4, 8, 376 + 12, 18, 24, 36, 48, 72, 96, 108, 377 + 30, 40, 50, 80, 120, 200, 300, 400, 378 + 150, 160, 240, 360, 500, 600, 800, 1000 379 + }; 380 + 381 + static const u8 dropping_necessary[RATESIZE] = { 382 + 1, 1, 1, 1, 383 + 1, 2, 3, 4, 5, 6, 7, 8, 384 + 1, 2, 3, 4, 5, 6, 7, 8, 385 + 5, 6, 7, 8, 9, 10, 11, 12 386 + }; 387 + 388 + static const u8 pending_for_rate_up_fail[5] = {2, 10, 24, 40, 60}; 389 + 390 + static const u16 dynamic_tx_rpt_timing[6] = { 391 + 0x186a, 0x30d4, 0x493e, 0x61a8, 0x7a12, 0x927c /* 200ms-1200ms */ 392 + }; 393 + 394 + enum rtl8188e_tx_rpt_timing { 395 + DEFAULT_TIMING = 0, 396 + INCREASE_TIMING, 397 + DECREASE_TIMING 398 + }; 399 + 400 + static int rtl8188eu_identify_chip(struct rtl8xxxu_priv *priv) 401 + { 402 + struct device *dev = &priv->udev->dev; 403 + u32 sys_cfg, vendor; 404 + int ret = 0; 405 + 406 + strscpy(priv->chip_name, "8188EU", sizeof(priv->chip_name)); 407 + priv->rtl_chip = RTL8188E; 408 + priv->rf_paths = 1; 409 + priv->rx_paths = 1; 410 + priv->tx_paths = 1; 411 + priv->has_wifi = 1; 412 + 413 + sys_cfg = rtl8xxxu_read32(priv, REG_SYS_CFG); 414 + priv->chip_cut = u32_get_bits(sys_cfg, SYS_CFG_CHIP_VERSION_MASK); 415 + if (sys_cfg & SYS_CFG_TRP_VAUX_EN) { 416 + dev_info(dev, "Unsupported test chip\n"); 417 + return -EOPNOTSUPP; 418 + } 419 + 420 + /* 421 + * TODO: At a glance, I cut requires a different firmware, 422 + * different initialisation tables, and no software rate 423 + * control. The vendor driver is not configured to handle 424 + * I cut chips by default. Are there any in the wild? 425 + */ 426 + if (priv->chip_cut == 8) { 427 + dev_info(dev, "RTL8188EU cut I is not supported. Please complain about it at linux-wireless@vger.kernel.org.\n"); 428 + return -EOPNOTSUPP; 429 + } 430 + 431 + vendor = sys_cfg & SYS_CFG_VENDOR_ID; 432 + rtl8xxxu_identify_vendor_1bit(priv, vendor); 433 + 434 + ret = rtl8xxxu_config_endpoints_no_sie(priv); 435 + 436 + return ret; 437 + } 438 + 439 + static void rtl8188eu_config_channel(struct ieee80211_hw *hw) 440 + { 441 + struct rtl8xxxu_priv *priv = hw->priv; 442 + u32 val32, rsr; 443 + u8 opmode; 444 + int sec_ch_above, channel; 445 + int i; 446 + 447 + opmode = rtl8xxxu_read8(priv, REG_BW_OPMODE); 448 + rsr = rtl8xxxu_read32(priv, REG_RESPONSE_RATE_SET); 449 + channel = hw->conf.chandef.chan->hw_value; 450 + 451 + switch (hw->conf.chandef.width) { 452 + case NL80211_CHAN_WIDTH_20_NOHT: 453 + case NL80211_CHAN_WIDTH_20: 454 + opmode |= BW_OPMODE_20MHZ; 455 + rtl8xxxu_write8(priv, REG_BW_OPMODE, opmode); 456 + 457 + val32 = rtl8xxxu_read32(priv, REG_FPGA0_RF_MODE); 458 + val32 &= ~FPGA_RF_MODE; 459 + rtl8xxxu_write32(priv, REG_FPGA0_RF_MODE, val32); 460 + 461 + val32 = rtl8xxxu_read32(priv, REG_FPGA1_RF_MODE); 462 + val32 &= ~FPGA_RF_MODE; 463 + rtl8xxxu_write32(priv, REG_FPGA1_RF_MODE, val32); 464 + break; 465 + case NL80211_CHAN_WIDTH_40: 466 + if (hw->conf.chandef.center_freq1 > 467 + hw->conf.chandef.chan->center_freq) { 468 + sec_ch_above = 1; 469 + channel += 2; 470 + } else { 471 + sec_ch_above = 0; 472 + channel -= 2; 473 + } 474 + 475 + opmode &= ~BW_OPMODE_20MHZ; 476 + rtl8xxxu_write8(priv, REG_BW_OPMODE, opmode); 477 + rsr &= ~RSR_RSC_BANDWIDTH_40M; 478 + if (sec_ch_above) 479 + rsr |= RSR_RSC_LOWER_SUB_CHANNEL; 480 + else 481 + rsr |= RSR_RSC_UPPER_SUB_CHANNEL; 482 + rtl8xxxu_write32(priv, REG_RESPONSE_RATE_SET, rsr); 483 + 484 + val32 = rtl8xxxu_read32(priv, REG_FPGA0_RF_MODE); 485 + val32 |= FPGA_RF_MODE; 486 + rtl8xxxu_write32(priv, REG_FPGA0_RF_MODE, val32); 487 + 488 + val32 = rtl8xxxu_read32(priv, REG_FPGA1_RF_MODE); 489 + val32 |= FPGA_RF_MODE; 490 + rtl8xxxu_write32(priv, REG_FPGA1_RF_MODE, val32); 491 + 492 + /* 493 + * Set Control channel to upper or lower. These settings 494 + * are required only for 40MHz 495 + */ 496 + val32 = rtl8xxxu_read32(priv, REG_CCK0_SYSTEM); 497 + val32 &= ~CCK0_SIDEBAND; 498 + if (!sec_ch_above) 499 + val32 |= CCK0_SIDEBAND; 500 + rtl8xxxu_write32(priv, REG_CCK0_SYSTEM, val32); 501 + 502 + val32 = rtl8xxxu_read32(priv, REG_OFDM1_LSTF); 503 + val32 &= ~OFDM_LSTF_PRIME_CH_MASK; /* 0xc00 */ 504 + if (sec_ch_above) 505 + val32 |= OFDM_LSTF_PRIME_CH_LOW; 506 + else 507 + val32 |= OFDM_LSTF_PRIME_CH_HIGH; 508 + rtl8xxxu_write32(priv, REG_OFDM1_LSTF, val32); 509 + 510 + val32 = rtl8xxxu_read32(priv, REG_FPGA0_POWER_SAVE); 511 + val32 &= ~(FPGA0_PS_LOWER_CHANNEL | FPGA0_PS_UPPER_CHANNEL); 512 + if (sec_ch_above) 513 + val32 |= FPGA0_PS_UPPER_CHANNEL; 514 + else 515 + val32 |= FPGA0_PS_LOWER_CHANNEL; 516 + rtl8xxxu_write32(priv, REG_FPGA0_POWER_SAVE, val32); 517 + break; 518 + 519 + default: 520 + break; 521 + } 522 + 523 + for (i = RF_A; i < priv->rf_paths; i++) { 524 + val32 = rtl8xxxu_read_rfreg(priv, i, RF6052_REG_MODE_AG); 525 + u32p_replace_bits(&val32, channel, MODE_AG_CHANNEL_MASK); 526 + rtl8xxxu_write_rfreg(priv, i, RF6052_REG_MODE_AG, val32); 527 + } 528 + 529 + for (i = RF_A; i < priv->rf_paths; i++) { 530 + val32 = rtl8xxxu_read_rfreg(priv, i, RF6052_REG_MODE_AG); 531 + val32 &= ~MODE_AG_BW_MASK; 532 + if (hw->conf.chandef.width == NL80211_CHAN_WIDTH_40) 533 + val32 |= MODE_AG_BW_40MHZ_8723B; 534 + else 535 + val32 |= MODE_AG_BW_20MHZ_8723B; 536 + rtl8xxxu_write_rfreg(priv, i, RF6052_REG_MODE_AG, val32); 537 + } 538 + } 539 + 540 + static void rtl8188eu_init_aggregation(struct rtl8xxxu_priv *priv) 541 + { 542 + u8 agg_ctrl, usb_spec; 543 + 544 + usb_spec = rtl8xxxu_read8(priv, REG_USB_SPECIAL_OPTION); 545 + usb_spec &= ~USB_SPEC_USB_AGG_ENABLE; 546 + rtl8xxxu_write8(priv, REG_USB_SPECIAL_OPTION, usb_spec); 547 + 548 + agg_ctrl = rtl8xxxu_read8(priv, REG_TRXDMA_CTRL); 549 + agg_ctrl &= ~TRXDMA_CTRL_RXDMA_AGG_EN; 550 + rtl8xxxu_write8(priv, REG_TRXDMA_CTRL, agg_ctrl); 551 + } 552 + 553 + static int rtl8188eu_parse_efuse(struct rtl8xxxu_priv *priv) 554 + { 555 + struct rtl8188eu_efuse *efuse = &priv->efuse_wifi.efuse8188eu; 556 + 557 + if (efuse->rtl_id != cpu_to_le16(0x8129)) 558 + return -EINVAL; 559 + 560 + ether_addr_copy(priv->mac_addr, efuse->mac_addr); 561 + 562 + memcpy(priv->cck_tx_power_index_A, efuse->tx_power_index_A.cck_base, 563 + sizeof(efuse->tx_power_index_A.cck_base)); 564 + 565 + memcpy(priv->ht40_1s_tx_power_index_A, 566 + efuse->tx_power_index_A.ht40_base, 567 + sizeof(efuse->tx_power_index_A.ht40_base)); 568 + 569 + priv->default_crystal_cap = efuse->xtal_k & 0x3f; 570 + 571 + dev_info(&priv->udev->dev, "Vendor: %.7s\n", efuse->vendor_name); 572 + dev_info(&priv->udev->dev, "Product: %.11s\n", efuse->device_name); 573 + dev_info(&priv->udev->dev, "Serial: %.11s\n", efuse->serial); 574 + 575 + return 0; 576 + } 577 + 578 + static void rtl8188eu_reset_8051(struct rtl8xxxu_priv *priv) 579 + { 580 + u16 sys_func; 581 + 582 + sys_func = rtl8xxxu_read16(priv, REG_SYS_FUNC); 583 + sys_func &= ~SYS_FUNC_CPU_ENABLE; 584 + rtl8xxxu_write16(priv, REG_SYS_FUNC, sys_func); 585 + 586 + sys_func |= SYS_FUNC_CPU_ENABLE; 587 + rtl8xxxu_write16(priv, REG_SYS_FUNC, sys_func); 588 + } 589 + 590 + static int rtl8188eu_load_firmware(struct rtl8xxxu_priv *priv) 591 + { 592 + const char *fw_name; 593 + int ret; 594 + 595 + fw_name = "rtlwifi/rtl8188eufw.bin"; 596 + 597 + ret = rtl8xxxu_load_firmware(priv, fw_name); 598 + 599 + return ret; 600 + } 601 + 602 + static void rtl8188eu_init_phy_bb(struct rtl8xxxu_priv *priv) 603 + { 604 + u8 val8; 605 + u16 val16; 606 + 607 + val16 = rtl8xxxu_read16(priv, REG_SYS_FUNC); 608 + val16 |= SYS_FUNC_BB_GLB_RSTN | SYS_FUNC_BBRSTB | SYS_FUNC_DIO_RF; 609 + rtl8xxxu_write16(priv, REG_SYS_FUNC, val16); 610 + 611 + /* 612 + * Per vendor driver, run power sequence before init of RF 613 + */ 614 + val8 = RF_ENABLE | RF_RSTB | RF_SDMRSTB; 615 + rtl8xxxu_write8(priv, REG_RF_CTRL, val8); 616 + 617 + val8 = SYS_FUNC_USBA | SYS_FUNC_USBD | 618 + SYS_FUNC_BB_GLB_RSTN | SYS_FUNC_BBRSTB; 619 + rtl8xxxu_write8(priv, REG_SYS_FUNC, val8); 620 + 621 + rtl8xxxu_init_phy_regs(priv, rtl8188eu_phy_init_table); 622 + rtl8xxxu_init_phy_regs(priv, rtl8188e_agc_table); 623 + } 624 + 625 + static int rtl8188eu_init_phy_rf(struct rtl8xxxu_priv *priv) 626 + { 627 + return rtl8xxxu_init_phy_rf(priv, rtl8188eu_radioa_init_table, RF_A); 628 + } 629 + 630 + static int rtl8188eu_iqk_path_a(struct rtl8xxxu_priv *priv) 631 + { 632 + u32 reg_eac, reg_e94, reg_e9c; 633 + int result = 0; 634 + 635 + /* Path A IQK setting */ 636 + rtl8xxxu_write32(priv, REG_TX_IQK_TONE_A, 0x10008c1c); 637 + rtl8xxxu_write32(priv, REG_RX_IQK_TONE_A, 0x30008c1c); 638 + 639 + rtl8xxxu_write32(priv, REG_TX_IQK_PI_A, 0x8214032a); 640 + rtl8xxxu_write32(priv, REG_RX_IQK_PI_A, 0x28160000); 641 + 642 + /* LO calibration setting */ 643 + rtl8xxxu_write32(priv, REG_IQK_AGC_RSP, 0x00462911); 644 + 645 + /* One shot, path A LOK & IQK */ 646 + rtl8xxxu_write32(priv, REG_IQK_AGC_PTS, 0xf9000000); 647 + rtl8xxxu_write32(priv, REG_IQK_AGC_PTS, 0xf8000000); 648 + 649 + mdelay(10); 650 + 651 + /* Check failed */ 652 + reg_eac = rtl8xxxu_read32(priv, REG_RX_POWER_AFTER_IQK_A_2); 653 + reg_e94 = rtl8xxxu_read32(priv, REG_TX_POWER_BEFORE_IQK_A); 654 + reg_e9c = rtl8xxxu_read32(priv, REG_TX_POWER_AFTER_IQK_A); 655 + 656 + if (!(reg_eac & BIT(28)) && 657 + ((reg_e94 & 0x03ff0000) != 0x01420000) && 658 + ((reg_e9c & 0x03ff0000) != 0x00420000)) 659 + result |= 0x01; 660 + 661 + return result; 662 + } 663 + 664 + static int rtl8188eu_rx_iqk_path_a(struct rtl8xxxu_priv *priv) 665 + { 666 + u32 reg_ea4, reg_eac, reg_e94, reg_e9c, val32; 667 + int result = 0; 668 + 669 + /* Leave IQK mode */ 670 + val32 = rtl8xxxu_read32(priv, REG_FPGA0_IQK); 671 + u32p_replace_bits(&val32, 0, 0xffffff00); 672 + rtl8xxxu_write32(priv, REG_FPGA0_IQK, val32); 673 + 674 + /* Enable path A PA in TX IQK mode */ 675 + rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_WE_LUT, 0x800a0); 676 + rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_RCK_OS, 0x30000); 677 + rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_TXPA_G1, 0x0000f); 678 + rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_TXPA_G2, 0xf117b); 679 + 680 + /* Enter IQK mode */ 681 + val32 = rtl8xxxu_read32(priv, REG_FPGA0_IQK); 682 + u32p_replace_bits(&val32, 0x808000, 0xffffff00); 683 + rtl8xxxu_write32(priv, REG_FPGA0_IQK, val32); 684 + 685 + /* TX IQK setting */ 686 + rtl8xxxu_write32(priv, REG_TX_IQK, 0x01007c00); 687 + rtl8xxxu_write32(priv, REG_RX_IQK, 0x81004800); 688 + 689 + /* path-A IQK setting */ 690 + rtl8xxxu_write32(priv, REG_TX_IQK_TONE_A, 0x10008c1c); 691 + rtl8xxxu_write32(priv, REG_RX_IQK_TONE_A, 0x30008c1c); 692 + 693 + rtl8xxxu_write32(priv, REG_TX_IQK_PI_A, 0x82160804); 694 + rtl8xxxu_write32(priv, REG_RX_IQK_PI_A, 0x28160000); 695 + 696 + /* LO calibration setting */ 697 + rtl8xxxu_write32(priv, REG_IQK_AGC_RSP, 0x0046a911); 698 + 699 + /* One shot, path A LOK & IQK */ 700 + rtl8xxxu_write32(priv, REG_IQK_AGC_PTS, 0xf9000000); 701 + rtl8xxxu_write32(priv, REG_IQK_AGC_PTS, 0xf8000000); 702 + 703 + mdelay(10); 704 + 705 + /* Check failed */ 706 + reg_eac = rtl8xxxu_read32(priv, REG_RX_POWER_AFTER_IQK_A_2); 707 + reg_e94 = rtl8xxxu_read32(priv, REG_TX_POWER_BEFORE_IQK_A); 708 + reg_e9c = rtl8xxxu_read32(priv, REG_TX_POWER_AFTER_IQK_A); 709 + 710 + if (!(reg_eac & BIT(28)) && 711 + ((reg_e94 & 0x03ff0000) != 0x01420000) && 712 + ((reg_e9c & 0x03ff0000) != 0x00420000)) 713 + result |= 0x01; 714 + else 715 + goto out; 716 + 717 + val32 = 0x80007c00 | 718 + (reg_e94 & 0x03ff0000) | ((reg_e9c >> 16) & 0x03ff); 719 + rtl8xxxu_write32(priv, REG_TX_IQK, val32); 720 + 721 + /* Modify RX IQK mode table */ 722 + val32 = rtl8xxxu_read32(priv, REG_FPGA0_IQK); 723 + u32p_replace_bits(&val32, 0, 0xffffff00); 724 + rtl8xxxu_write32(priv, REG_FPGA0_IQK, val32); 725 + 726 + rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_WE_LUT, 0x800a0); 727 + rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_RCK_OS, 0x30000); 728 + rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_TXPA_G1, 0x0000f); 729 + rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_TXPA_G2, 0xf7ffa); 730 + 731 + /* Enter IQK mode */ 732 + val32 = rtl8xxxu_read32(priv, REG_FPGA0_IQK); 733 + u32p_replace_bits(&val32, 0x808000, 0xffffff00); 734 + rtl8xxxu_write32(priv, REG_FPGA0_IQK, val32); 735 + 736 + /* IQK setting */ 737 + rtl8xxxu_write32(priv, REG_RX_IQK, 0x01004800); 738 + 739 + /* Path A IQK setting */ 740 + rtl8xxxu_write32(priv, REG_TX_IQK_TONE_A, 0x30008c1c); 741 + rtl8xxxu_write32(priv, REG_RX_IQK_TONE_A, 0x10008c1c); 742 + 743 + rtl8xxxu_write32(priv, REG_TX_IQK_PI_A, 0x82160c05); 744 + rtl8xxxu_write32(priv, REG_RX_IQK_PI_A, 0x28160c05); 745 + 746 + /* LO calibration setting */ 747 + rtl8xxxu_write32(priv, REG_IQK_AGC_RSP, 0x0046a911); 748 + 749 + /* One shot, path A LOK & IQK */ 750 + rtl8xxxu_write32(priv, REG_IQK_AGC_PTS, 0xf9000000); 751 + rtl8xxxu_write32(priv, REG_IQK_AGC_PTS, 0xf8000000); 752 + 753 + mdelay(10); 754 + 755 + reg_eac = rtl8xxxu_read32(priv, REG_RX_POWER_AFTER_IQK_A_2); 756 + reg_ea4 = rtl8xxxu_read32(priv, REG_RX_POWER_BEFORE_IQK_A_2); 757 + 758 + if (!(reg_eac & BIT(27)) && 759 + ((reg_ea4 & 0x03ff0000) != 0x01320000) && 760 + ((reg_eac & 0x03ff0000) != 0x00360000)) 761 + result |= 0x02; 762 + else 763 + dev_warn(&priv->udev->dev, "%s: Path A RX IQK failed!\n", 764 + __func__); 765 + 766 + out: 767 + return result; 768 + } 769 + 770 + static void rtl8188eu_phy_iqcalibrate(struct rtl8xxxu_priv *priv, 771 + int result[][8], int t) 772 + { 773 + struct device *dev = &priv->udev->dev; 774 + u32 i, val32; 775 + int path_a_ok; 776 + int retry = 2; 777 + static const u32 adda_regs[RTL8XXXU_ADDA_REGS] = { 778 + REG_FPGA0_XCD_SWITCH_CTRL, REG_BLUETOOTH, 779 + REG_RX_WAIT_CCA, REG_TX_CCK_RFON, 780 + REG_TX_CCK_BBON, REG_TX_OFDM_RFON, 781 + REG_TX_OFDM_BBON, REG_TX_TO_RX, 782 + REG_TX_TO_TX, REG_RX_CCK, 783 + REG_RX_OFDM, REG_RX_WAIT_RIFS, 784 + REG_RX_TO_RX, REG_STANDBY, 785 + REG_SLEEP, REG_PMPD_ANAEN 786 + }; 787 + static const u32 iqk_mac_regs[RTL8XXXU_MAC_REGS] = { 788 + REG_TXPAUSE, REG_BEACON_CTRL, 789 + REG_BEACON_CTRL_1, REG_GPIO_MUXCFG 790 + }; 791 + static const u32 iqk_bb_regs[RTL8XXXU_BB_REGS] = { 792 + REG_OFDM0_TRX_PATH_ENABLE, REG_OFDM0_TR_MUX_PAR, 793 + REG_FPGA0_XCD_RF_SW_CTRL, REG_CONFIG_ANT_A, REG_CONFIG_ANT_B, 794 + REG_FPGA0_XAB_RF_SW_CTRL, REG_FPGA0_XA_RF_INT_OE, 795 + REG_FPGA0_XB_RF_INT_OE, REG_CCK0_AFE_SETTING 796 + }; 797 + 798 + /* 799 + * Note: IQ calibration must be performed after loading 800 + * PHY_REG.txt , and radio_a, radio_b.txt 801 + */ 802 + 803 + if (t == 0) { 804 + /* Save ADDA parameters, turn Path A ADDA on */ 805 + rtl8xxxu_save_regs(priv, adda_regs, priv->adda_backup, 806 + RTL8XXXU_ADDA_REGS); 807 + rtl8xxxu_save_mac_regs(priv, iqk_mac_regs, priv->mac_backup); 808 + rtl8xxxu_save_regs(priv, iqk_bb_regs, 809 + priv->bb_backup, RTL8XXXU_BB_REGS); 810 + } 811 + 812 + rtl8xxxu_path_adda_on(priv, adda_regs, true); 813 + 814 + if (t == 0) { 815 + val32 = rtl8xxxu_read32(priv, REG_FPGA0_XA_HSSI_PARM1); 816 + priv->pi_enabled = u32_get_bits(val32, FPGA0_HSSI_PARM1_PI); 817 + } 818 + 819 + if (!priv->pi_enabled) { 820 + /* Switch BB to PI mode to do IQ Calibration. */ 821 + rtl8xxxu_write32(priv, REG_FPGA0_XA_HSSI_PARM1, 0x01000100); 822 + rtl8xxxu_write32(priv, REG_FPGA0_XB_HSSI_PARM1, 0x01000100); 823 + } 824 + 825 + /* MAC settings */ 826 + rtl8xxxu_mac_calibration(priv, iqk_mac_regs, priv->mac_backup); 827 + 828 + val32 = rtl8xxxu_read32(priv, REG_CCK0_AFE_SETTING); 829 + u32p_replace_bits(&val32, 0xf, 0x0f000000); 830 + rtl8xxxu_write32(priv, REG_CCK0_AFE_SETTING, val32); 831 + 832 + rtl8xxxu_write32(priv, REG_OFDM0_TRX_PATH_ENABLE, 0x03a05600); 833 + rtl8xxxu_write32(priv, REG_OFDM0_TR_MUX_PAR, 0x000800e4); 834 + rtl8xxxu_write32(priv, REG_FPGA0_XCD_RF_SW_CTRL, 0x22204000); 835 + 836 + if (!priv->no_pape) { 837 + val32 = rtl8xxxu_read32(priv, REG_FPGA0_XAB_RF_SW_CTRL); 838 + val32 |= (FPGA0_RF_PAPE | 839 + (FPGA0_RF_PAPE << FPGA0_RF_BD_CTRL_SHIFT)); 840 + rtl8xxxu_write32(priv, REG_FPGA0_XAB_RF_SW_CTRL, val32); 841 + } 842 + 843 + val32 = rtl8xxxu_read32(priv, REG_FPGA0_XA_RF_INT_OE); 844 + val32 &= ~BIT(10); 845 + rtl8xxxu_write32(priv, REG_FPGA0_XA_RF_INT_OE, val32); 846 + val32 = rtl8xxxu_read32(priv, REG_FPGA0_XB_RF_INT_OE); 847 + val32 &= ~BIT(10); 848 + rtl8xxxu_write32(priv, REG_FPGA0_XB_RF_INT_OE, val32); 849 + 850 + /* Page B init */ 851 + rtl8xxxu_write32(priv, REG_CONFIG_ANT_A, 0x0f600000); 852 + 853 + /* IQ calibration setting */ 854 + val32 = rtl8xxxu_read32(priv, REG_FPGA0_IQK); 855 + u32p_replace_bits(&val32, 0x808000, 0xffffff00); 856 + rtl8xxxu_write32(priv, REG_FPGA0_IQK, val32); 857 + rtl8xxxu_write32(priv, REG_TX_IQK, 0x01007c00); 858 + rtl8xxxu_write32(priv, REG_RX_IQK, 0x81004800); 859 + 860 + for (i = 0; i < retry; i++) { 861 + path_a_ok = rtl8188eu_iqk_path_a(priv); 862 + if (path_a_ok == 0x01) { 863 + val32 = rtl8xxxu_read32(priv, 864 + REG_TX_POWER_BEFORE_IQK_A); 865 + result[t][0] = (val32 >> 16) & 0x3ff; 866 + val32 = rtl8xxxu_read32(priv, 867 + REG_TX_POWER_AFTER_IQK_A); 868 + result[t][1] = (val32 >> 16) & 0x3ff; 869 + break; 870 + } 871 + } 872 + 873 + if (!path_a_ok) 874 + dev_dbg(dev, "%s: Path A TX IQK failed!\n", __func__); 875 + 876 + for (i = 0; i < retry; i++) { 877 + path_a_ok = rtl8188eu_rx_iqk_path_a(priv); 878 + if (path_a_ok == 0x03) { 879 + val32 = rtl8xxxu_read32(priv, 880 + REG_RX_POWER_BEFORE_IQK_A_2); 881 + result[t][2] = (val32 >> 16) & 0x3ff; 882 + val32 = rtl8xxxu_read32(priv, 883 + REG_RX_POWER_AFTER_IQK_A_2); 884 + result[t][3] = (val32 >> 16) & 0x3ff; 885 + 886 + break; 887 + } 888 + } 889 + 890 + if (!path_a_ok) 891 + dev_dbg(dev, "%s: Path A RX IQK failed!\n", __func__); 892 + 893 + /* Back to BB mode, load original value */ 894 + val32 = rtl8xxxu_read32(priv, REG_FPGA0_IQK); 895 + u32p_replace_bits(&val32, 0, 0xffffff00); 896 + rtl8xxxu_write32(priv, REG_FPGA0_IQK, val32); 897 + 898 + if (t == 0) 899 + return; 900 + 901 + if (!priv->pi_enabled) { 902 + /* Switch back BB to SI mode after finishing IQ Calibration */ 903 + rtl8xxxu_write32(priv, REG_FPGA0_XA_HSSI_PARM1, 0x01000000); 904 + rtl8xxxu_write32(priv, REG_FPGA0_XB_HSSI_PARM1, 0x01000000); 905 + } 906 + 907 + /* Reload ADDA power saving parameters */ 908 + rtl8xxxu_restore_regs(priv, adda_regs, priv->adda_backup, 909 + RTL8XXXU_ADDA_REGS); 910 + 911 + /* Reload MAC parameters */ 912 + rtl8xxxu_restore_mac_regs(priv, iqk_mac_regs, priv->mac_backup); 913 + 914 + /* Reload BB parameters */ 915 + rtl8xxxu_restore_regs(priv, iqk_bb_regs, 916 + priv->bb_backup, RTL8XXXU_BB_REGS); 917 + 918 + /* Restore RX initial gain */ 919 + rtl8xxxu_write32(priv, REG_FPGA0_XA_LSSI_PARM, 0x00032ed3); 920 + 921 + /* Load 0xe30 IQC default value */ 922 + rtl8xxxu_write32(priv, REG_TX_IQK_TONE_A, 0x01008c00); 923 + rtl8xxxu_write32(priv, REG_RX_IQK_TONE_A, 0x01008c00); 924 + } 925 + 926 + static void rtl8188eu_phy_iq_calibrate(struct rtl8xxxu_priv *priv) 927 + { 928 + struct device *dev = &priv->udev->dev; 929 + int result[4][8]; /* last is final result */ 930 + int i, candidate; 931 + bool path_a_ok; 932 + u32 reg_e94, reg_e9c, reg_ea4, reg_eac; 933 + u32 reg_eb4, reg_ebc, reg_ec4, reg_ecc; 934 + bool simu; 935 + 936 + memset(result, 0, sizeof(result)); 937 + result[3][0] = 0x100; 938 + result[3][2] = 0x100; 939 + result[3][4] = 0x100; 940 + result[3][6] = 0x100; 941 + 942 + candidate = -1; 943 + 944 + path_a_ok = false; 945 + 946 + for (i = 0; i < 3; i++) { 947 + rtl8188eu_phy_iqcalibrate(priv, result, i); 948 + 949 + if (i == 1) { 950 + simu = rtl8xxxu_simularity_compare(priv, 951 + result, 0, 1); 952 + if (simu) { 953 + candidate = 0; 954 + break; 955 + } 956 + } 957 + 958 + if (i == 2) { 959 + simu = rtl8xxxu_simularity_compare(priv, 960 + result, 0, 2); 961 + if (simu) { 962 + candidate = 0; 963 + break; 964 + } 965 + 966 + simu = rtl8xxxu_simularity_compare(priv, 967 + result, 1, 2); 968 + if (simu) 969 + candidate = 1; 970 + else 971 + candidate = 3; 972 + } 973 + } 974 + 975 + if (candidate >= 0) { 976 + reg_e94 = result[candidate][0]; 977 + priv->rege94 = reg_e94; 978 + reg_e9c = result[candidate][1]; 979 + priv->rege9c = reg_e9c; 980 + reg_ea4 = result[candidate][2]; 981 + reg_eac = result[candidate][3]; 982 + reg_eb4 = result[candidate][4]; 983 + priv->regeb4 = reg_eb4; 984 + reg_ebc = result[candidate][5]; 985 + priv->regebc = reg_ebc; 986 + reg_ec4 = result[candidate][6]; 987 + reg_ecc = result[candidate][7]; 988 + dev_dbg(dev, "%s: candidate is %x\n", __func__, candidate); 989 + dev_dbg(dev, 990 + "%s: e94=%x e9c=%x ea4=%x eac=%x eb4=%x ebc=%x ec4=%x ecc=%x\n", 991 + __func__, reg_e94, reg_e9c, reg_ea4, reg_eac, 992 + reg_eb4, reg_ebc, reg_ec4, reg_ecc); 993 + path_a_ok = true; 994 + } else { 995 + reg_e94 = 0x100; 996 + reg_eb4 = 0x100; 997 + priv->rege94 = 0x100; 998 + priv->regeb4 = 0x100; 999 + reg_e9c = 0x0; 1000 + reg_ebc = 0x0; 1001 + priv->rege9c = 0x0; 1002 + priv->regebc = 0x0; 1003 + } 1004 + 1005 + if (reg_e94 && candidate >= 0) 1006 + rtl8xxxu_fill_iqk_matrix_a(priv, path_a_ok, result, 1007 + candidate, (reg_ea4 == 0)); 1008 + 1009 + rtl8xxxu_save_regs(priv, rtl8xxxu_iqk_phy_iq_bb_reg, 1010 + priv->bb_recovery_backup, RTL8XXXU_BB_REGS); 1011 + } 1012 + 1013 + static void rtl8188e_disabled_to_emu(struct rtl8xxxu_priv *priv) 1014 + { 1015 + u16 val16; 1016 + 1017 + val16 = rtl8xxxu_read16(priv, REG_APS_FSMCO); 1018 + val16 &= ~(APS_FSMCO_HW_SUSPEND | APS_FSMCO_PCIE); 1019 + rtl8xxxu_write16(priv, REG_APS_FSMCO, val16); 1020 + } 1021 + 1022 + static int rtl8188e_emu_to_active(struct rtl8xxxu_priv *priv) 1023 + { 1024 + u8 val8; 1025 + u32 val32; 1026 + u16 val16; 1027 + int count, ret = 0; 1028 + 1029 + /* wait till 0x04[17] = 1 power ready*/ 1030 + for (count = RTL8XXXU_MAX_REG_POLL; count; count--) { 1031 + val32 = rtl8xxxu_read32(priv, REG_APS_FSMCO); 1032 + if (val32 & BIT(17)) 1033 + break; 1034 + 1035 + udelay(10); 1036 + } 1037 + 1038 + if (!count) { 1039 + ret = -EBUSY; 1040 + goto exit; 1041 + } 1042 + 1043 + /* reset baseband */ 1044 + val8 = rtl8xxxu_read8(priv, REG_SYS_FUNC); 1045 + val8 &= ~(SYS_FUNC_BBRSTB | SYS_FUNC_BB_GLB_RSTN); 1046 + rtl8xxxu_write8(priv, REG_SYS_FUNC, val8); 1047 + 1048 + /*0x24[23] = 2b'01 schmit trigger */ 1049 + val32 = rtl8xxxu_read32(priv, REG_AFE_XTAL_CTRL); 1050 + val32 |= BIT(23); 1051 + rtl8xxxu_write32(priv, REG_AFE_XTAL_CTRL, val32); 1052 + 1053 + /* 0x04[15] = 0 disable HWPDN (control by DRV)*/ 1054 + val16 = rtl8xxxu_read16(priv, REG_APS_FSMCO); 1055 + val16 &= ~APS_FSMCO_HW_POWERDOWN; 1056 + rtl8xxxu_write16(priv, REG_APS_FSMCO, val16); 1057 + 1058 + /*0x04[12:11] = 2b'00 disable WL suspend*/ 1059 + val16 = rtl8xxxu_read16(priv, REG_APS_FSMCO); 1060 + val16 &= ~(APS_FSMCO_HW_SUSPEND | APS_FSMCO_PCIE); 1061 + rtl8xxxu_write16(priv, REG_APS_FSMCO, val16); 1062 + 1063 + /* set, then poll until 0 */ 1064 + val32 = rtl8xxxu_read32(priv, REG_APS_FSMCO); 1065 + val32 |= APS_FSMCO_MAC_ENABLE; 1066 + rtl8xxxu_write32(priv, REG_APS_FSMCO, val32); 1067 + 1068 + for (count = RTL8XXXU_MAX_REG_POLL; count; count--) { 1069 + val32 = rtl8xxxu_read32(priv, REG_APS_FSMCO); 1070 + if ((val32 & APS_FSMCO_MAC_ENABLE) == 0) { 1071 + ret = 0; 1072 + break; 1073 + } 1074 + udelay(10); 1075 + } 1076 + 1077 + if (!count) { 1078 + ret = -EBUSY; 1079 + goto exit; 1080 + } 1081 + 1082 + /* LDO normal mode*/ 1083 + val8 = rtl8xxxu_read8(priv, REG_LPLDO_CTRL); 1084 + val8 &= ~BIT(4); 1085 + rtl8xxxu_write8(priv, REG_LPLDO_CTRL, val8); 1086 + 1087 + exit: 1088 + return ret; 1089 + } 1090 + 1091 + static int rtl8188eu_active_to_emu(struct rtl8xxxu_priv *priv) 1092 + { 1093 + u8 val8; 1094 + 1095 + /* Turn off RF */ 1096 + val8 = rtl8xxxu_read8(priv, REG_RF_CTRL); 1097 + val8 &= ~RF_ENABLE; 1098 + rtl8xxxu_write8(priv, REG_RF_CTRL, val8); 1099 + 1100 + /* LDO Sleep mode */ 1101 + val8 = rtl8xxxu_read8(priv, REG_LPLDO_CTRL); 1102 + val8 |= BIT(4); 1103 + rtl8xxxu_write8(priv, REG_LPLDO_CTRL, val8); 1104 + 1105 + return 0; 1106 + } 1107 + 1108 + static int rtl8188eu_emu_to_disabled(struct rtl8xxxu_priv *priv) 1109 + { 1110 + u32 val32; 1111 + u16 val16; 1112 + u8 val8; 1113 + 1114 + val32 = rtl8xxxu_read32(priv, REG_AFE_XTAL_CTRL); 1115 + val32 |= BIT(23); 1116 + rtl8xxxu_write32(priv, REG_AFE_XTAL_CTRL, val32); 1117 + 1118 + val16 = rtl8xxxu_read16(priv, REG_APS_FSMCO); 1119 + val16 &= ~APS_FSMCO_PCIE; 1120 + val16 |= APS_FSMCO_HW_SUSPEND; 1121 + rtl8xxxu_write16(priv, REG_APS_FSMCO, val16); 1122 + 1123 + rtl8xxxu_write8(priv, REG_APS_FSMCO + 3, 0x00); 1124 + 1125 + val8 = rtl8xxxu_read8(priv, REG_GPIO_MUXCFG + 1); 1126 + val8 &= ~BIT(4); 1127 + rtl8xxxu_write8(priv, REG_GPIO_MUXCFG + 1, val8); 1128 + 1129 + /* Set USB suspend enable local register 0xfe10[4]=1 */ 1130 + val8 = rtl8xxxu_read8(priv, 0xfe10); 1131 + val8 |= BIT(4); 1132 + rtl8xxxu_write8(priv, 0xfe10, val8); 1133 + 1134 + return 0; 1135 + } 1136 + 1137 + static int rtl8188eu_active_to_lps(struct rtl8xxxu_priv *priv) 1138 + { 1139 + struct device *dev = &priv->udev->dev; 1140 + u8 val8; 1141 + u16 val16; 1142 + u32 val32; 1143 + int retry, retval; 1144 + 1145 + rtl8xxxu_write8(priv, REG_TXPAUSE, 0x7f); 1146 + 1147 + retry = 100; 1148 + retval = -EBUSY; 1149 + /* Poll 32 bit wide REG_SCH_TX_CMD for 0 to ensure no TX is pending. */ 1150 + do { 1151 + val32 = rtl8xxxu_read32(priv, REG_SCH_TX_CMD); 1152 + if (!val32) { 1153 + retval = 0; 1154 + break; 1155 + } 1156 + } while (retry--); 1157 + 1158 + if (!retry) { 1159 + dev_warn(dev, "Failed to flush TX queue\n"); 1160 + retval = -EBUSY; 1161 + goto out; 1162 + } 1163 + 1164 + /* Disable CCK and OFDM, clock gated */ 1165 + val8 = rtl8xxxu_read8(priv, REG_SYS_FUNC); 1166 + val8 &= ~SYS_FUNC_BBRSTB; 1167 + rtl8xxxu_write8(priv, REG_SYS_FUNC, val8); 1168 + 1169 + udelay(2); 1170 + 1171 + /* Reset MAC TRX */ 1172 + val16 = rtl8xxxu_read16(priv, REG_CR); 1173 + val16 |= 0xff; 1174 + val16 &= ~(CR_MAC_TX_ENABLE | CR_MAC_RX_ENABLE | CR_SECURITY_ENABLE); 1175 + rtl8xxxu_write16(priv, REG_CR, val16); 1176 + 1177 + val8 = rtl8xxxu_read8(priv, REG_DUAL_TSF_RST); 1178 + val8 |= DUAL_TSF_TX_OK; 1179 + rtl8xxxu_write8(priv, REG_DUAL_TSF_RST, val8); 1180 + 1181 + out: 1182 + return retval; 1183 + } 1184 + 1185 + static int rtl8188eu_power_on(struct rtl8xxxu_priv *priv) 1186 + { 1187 + u16 val16; 1188 + int ret; 1189 + 1190 + rtl8188e_disabled_to_emu(priv); 1191 + 1192 + ret = rtl8188e_emu_to_active(priv); 1193 + if (ret) 1194 + goto exit; 1195 + 1196 + /* 1197 + * Enable MAC DMA/WMAC/SCHEDULE/SEC block 1198 + * Set CR bit10 to enable 32k calibration. 1199 + * We do not set CR_MAC_TX_ENABLE | CR_MAC_RX_ENABLE here 1200 + * due to a hardware bug in the 88E, requiring those to be 1201 + * set after REG_TRXFF_BNDY is set. If not the RXFF bundary 1202 + * will get set to a larger buffer size than the real buffer 1203 + * size. 1204 + */ 1205 + val16 = (CR_HCI_TXDMA_ENABLE | CR_HCI_RXDMA_ENABLE | 1206 + CR_TXDMA_ENABLE | CR_RXDMA_ENABLE | 1207 + CR_PROTOCOL_ENABLE | CR_SCHEDULE_ENABLE | 1208 + CR_SECURITY_ENABLE | CR_CALTIMER_ENABLE); 1209 + rtl8xxxu_write16(priv, REG_CR, val16); 1210 + 1211 + exit: 1212 + return ret; 1213 + } 1214 + 1215 + static void rtl8188eu_power_off(struct rtl8xxxu_priv *priv) 1216 + { 1217 + u8 val8; 1218 + u16 val16; 1219 + 1220 + rtl8xxxu_flush_fifo(priv); 1221 + 1222 + val8 = rtl8xxxu_read8(priv, REG_TX_REPORT_CTRL); 1223 + val8 &= ~TX_REPORT_CTRL_TIMER_ENABLE; 1224 + rtl8xxxu_write8(priv, REG_TX_REPORT_CTRL, val8); 1225 + 1226 + /* Turn off RF */ 1227 + rtl8xxxu_write8(priv, REG_RF_CTRL, 0x00); 1228 + 1229 + rtl8188eu_active_to_lps(priv); 1230 + 1231 + /* Reset Firmware if running in RAM */ 1232 + if (rtl8xxxu_read8(priv, REG_MCU_FW_DL) & MCU_FW_RAM_SEL) 1233 + rtl8xxxu_firmware_self_reset(priv); 1234 + 1235 + /* Reset MCU */ 1236 + val16 = rtl8xxxu_read16(priv, REG_SYS_FUNC); 1237 + val16 &= ~SYS_FUNC_CPU_ENABLE; 1238 + rtl8xxxu_write16(priv, REG_SYS_FUNC, val16); 1239 + 1240 + /* Reset MCU ready status */ 1241 + rtl8xxxu_write8(priv, REG_MCU_FW_DL, 0x00); 1242 + 1243 + /* 32K_CTRL looks to be very 8188e specific */ 1244 + val8 = rtl8xxxu_read8(priv, REG_32K_CTRL); 1245 + val8 &= ~BIT(0); 1246 + rtl8xxxu_write8(priv, REG_32K_CTRL, val8); 1247 + 1248 + rtl8188eu_active_to_emu(priv); 1249 + rtl8188eu_emu_to_disabled(priv); 1250 + 1251 + /* Reset MCU IO Wrapper */ 1252 + val8 = rtl8xxxu_read8(priv, REG_RSV_CTRL + 1); 1253 + val8 &= ~BIT(3); 1254 + rtl8xxxu_write8(priv, REG_RSV_CTRL + 1, val8); 1255 + 1256 + val8 = rtl8xxxu_read8(priv, REG_RSV_CTRL + 1); 1257 + val8 |= BIT(3); 1258 + rtl8xxxu_write8(priv, REG_RSV_CTRL + 1, val8); 1259 + 1260 + /* Vendor driver refers to GPIO_IN */ 1261 + val8 = rtl8xxxu_read8(priv, REG_GPIO_PIN_CTRL); 1262 + /* Vendor driver refers to GPIO_OUT */ 1263 + rtl8xxxu_write8(priv, REG_GPIO_PIN_CTRL + 1, val8); 1264 + rtl8xxxu_write8(priv, REG_GPIO_PIN_CTRL + 2, 0xff); 1265 + 1266 + val8 = rtl8xxxu_read8(priv, REG_GPIO_IO_SEL); 1267 + rtl8xxxu_write8(priv, REG_GPIO_IO_SEL, val8 << 4); 1268 + val8 = rtl8xxxu_read8(priv, REG_GPIO_IO_SEL + 1); 1269 + rtl8xxxu_write8(priv, REG_GPIO_IO_SEL + 1, val8 | 0x0f); 1270 + 1271 + /* 1272 + * Set LNA, TRSW, EX_PA Pin to output mode 1273 + * Referred to as REG_BB_PAD_CTRL in 8188eu vendor driver 1274 + */ 1275 + rtl8xxxu_write32(priv, REG_PAD_CTRL1, 0x00080808); 1276 + 1277 + rtl8xxxu_write8(priv, REG_RSV_CTRL, 0x00); 1278 + 1279 + rtl8xxxu_write32(priv, REG_GPIO_MUXCFG, 0x00000000); 1280 + } 1281 + 1282 + static void rtl8188e_enable_rf(struct rtl8xxxu_priv *priv) 1283 + { 1284 + u32 val32; 1285 + 1286 + rtl8xxxu_write8(priv, REG_RF_CTRL, RF_ENABLE | RF_RSTB | RF_SDMRSTB); 1287 + 1288 + val32 = rtl8xxxu_read32(priv, REG_OFDM0_TRX_PATH_ENABLE); 1289 + val32 &= ~(OFDM_RF_PATH_RX_MASK | OFDM_RF_PATH_TX_MASK); 1290 + val32 |= OFDM_RF_PATH_RX_A | OFDM_RF_PATH_TX_A; 1291 + rtl8xxxu_write32(priv, REG_OFDM0_TRX_PATH_ENABLE, val32); 1292 + 1293 + rtl8xxxu_write8(priv, REG_TXPAUSE, 0x00); 1294 + } 1295 + 1296 + static void rtl8188e_disable_rf(struct rtl8xxxu_priv *priv) 1297 + { 1298 + u32 val32; 1299 + 1300 + val32 = rtl8xxxu_read32(priv, REG_OFDM0_TRX_PATH_ENABLE); 1301 + val32 &= ~OFDM_RF_PATH_TX_MASK; 1302 + rtl8xxxu_write32(priv, REG_OFDM0_TRX_PATH_ENABLE, val32); 1303 + 1304 + /* Power down RF module */ 1305 + rtl8xxxu_write_rfreg(priv, RF_A, RF6052_REG_AC, 0); 1306 + 1307 + rtl8188eu_active_to_emu(priv); 1308 + } 1309 + 1310 + static void rtl8188e_usb_quirks(struct rtl8xxxu_priv *priv) 1311 + { 1312 + u16 val16; 1313 + 1314 + /* 1315 + * Technically this is not a USB quirk, but a chip quirk. 1316 + * This has to be done after REG_TRXFF_BNDY is set, see 1317 + * rtl8188eu_power_on() for details. 1318 + */ 1319 + val16 = rtl8xxxu_read16(priv, REG_CR); 1320 + val16 |= (CR_MAC_TX_ENABLE | CR_MAC_RX_ENABLE); 1321 + rtl8xxxu_write16(priv, REG_CR, val16); 1322 + 1323 + rtl8xxxu_gen2_usb_quirks(priv); 1324 + 1325 + /* Pre-TX enable WEP/TKIP security */ 1326 + rtl8xxxu_write8(priv, REG_EARLY_MODE_CONTROL_8188E + 3, 0x01); 1327 + } 1328 + 1329 + static s8 rtl8188e_cck_rssi(struct rtl8xxxu_priv *priv, u8 cck_agc_rpt) 1330 + { 1331 + /* only use lna 0/1/2/3/7 */ 1332 + static const s8 lna_gain_table_0[8] = {17, -1, -13, -29, -32, -35, -38, -41}; 1333 + /* only use lna 3/7 */ 1334 + static const s8 lna_gain_table_1[8] = {29, 20, 12, 3, -6, -15, -24, -33}; 1335 + 1336 + s8 rx_pwr_all = 0x00; 1337 + u8 vga_idx, lna_idx; 1338 + s8 lna_gain = 0; 1339 + 1340 + lna_idx = u8_get_bits(cck_agc_rpt, CCK_AGC_RPT_LNA_IDX_MASK); 1341 + vga_idx = u8_get_bits(cck_agc_rpt, CCK_AGC_RPT_VGA_IDX_MASK); 1342 + 1343 + if (priv->chip_cut >= 8) /* cut I */ /* SMIC */ 1344 + lna_gain = lna_gain_table_0[lna_idx]; 1345 + else /* TSMC */ 1346 + lna_gain = lna_gain_table_1[lna_idx]; 1347 + 1348 + rx_pwr_all = lna_gain - (2 * vga_idx); 1349 + 1350 + return rx_pwr_all; 1351 + } 1352 + 1353 + static void rtl8188e_set_tx_rpt_timing(struct rtl8xxxu_ra_info *ra, u8 timing) 1354 + { 1355 + u8 idx; 1356 + 1357 + for (idx = 0; idx < 5; idx++) 1358 + if (dynamic_tx_rpt_timing[idx] == ra->rpt_time) 1359 + break; 1360 + 1361 + if (timing == DEFAULT_TIMING) { 1362 + idx = 0; /* 200ms */ 1363 + } else if (timing == INCREASE_TIMING) { 1364 + if (idx < 5) 1365 + idx++; 1366 + } else if (timing == DECREASE_TIMING) { 1367 + if (idx > 0) 1368 + idx--; 1369 + } 1370 + 1371 + ra->rpt_time = dynamic_tx_rpt_timing[idx]; 1372 + } 1373 + 1374 + static void rtl8188e_rate_down(struct rtl8xxxu_ra_info *ra) 1375 + { 1376 + u8 rate_id = ra->pre_rate; 1377 + u8 lowest_rate = ra->lowest_rate; 1378 + u8 highest_rate = ra->highest_rate; 1379 + s8 i; 1380 + 1381 + if (rate_id > highest_rate) { 1382 + rate_id = highest_rate; 1383 + } else if (ra->rate_sgi) { 1384 + ra->rate_sgi = 0; 1385 + } else if (rate_id > lowest_rate) { 1386 + if (rate_id > 0) { 1387 + for (i = rate_id - 1; i >= lowest_rate; i--) { 1388 + if (ra->ra_use_rate & BIT(i)) { 1389 + rate_id = i; 1390 + goto rate_down_finish; 1391 + } 1392 + } 1393 + } 1394 + } else if (rate_id <= lowest_rate) { 1395 + rate_id = lowest_rate; 1396 + } 1397 + 1398 + rate_down_finish: 1399 + if (ra->ra_waiting_counter == 1) { 1400 + ra->ra_waiting_counter++; 1401 + ra->ra_pending_counter++; 1402 + } else if (ra->ra_waiting_counter > 1) { 1403 + ra->ra_waiting_counter = 0; 1404 + ra->ra_pending_counter = 0; 1405 + } 1406 + 1407 + if (ra->ra_pending_counter >= 4) 1408 + ra->ra_pending_counter = 4; 1409 + 1410 + ra->ra_drop_after_down = 1; 1411 + 1412 + ra->decision_rate = rate_id; 1413 + 1414 + rtl8188e_set_tx_rpt_timing(ra, DECREASE_TIMING); 1415 + } 1416 + 1417 + static void rtl8188e_rate_up(struct rtl8xxxu_ra_info *ra) 1418 + { 1419 + u8 rate_id = ra->pre_rate; 1420 + u8 highest_rate = ra->highest_rate; 1421 + u8 i; 1422 + 1423 + if (ra->ra_waiting_counter == 1) { 1424 + ra->ra_waiting_counter = 0; 1425 + ra->ra_pending_counter = 0; 1426 + } else if (ra->ra_waiting_counter > 1) { 1427 + ra->pre_rssi_sta_ra = ra->rssi_sta_ra; 1428 + goto rate_up_finish; 1429 + } 1430 + 1431 + rtl8188e_set_tx_rpt_timing(ra, DEFAULT_TIMING); 1432 + 1433 + if (rate_id < highest_rate) { 1434 + for (i = rate_id + 1; i <= highest_rate; i++) { 1435 + if (ra->ra_use_rate & BIT(i)) { 1436 + rate_id = i; 1437 + goto rate_up_finish; 1438 + } 1439 + } 1440 + } else if (rate_id == highest_rate) { 1441 + if (ra->sgi_enable && !ra->rate_sgi) 1442 + ra->rate_sgi = 1; 1443 + else if (!ra->sgi_enable) 1444 + ra->rate_sgi = 0; 1445 + } else { /* rate_id > ra->highest_rate */ 1446 + rate_id = highest_rate; 1447 + } 1448 + 1449 + rate_up_finish: 1450 + if (ra->ra_waiting_counter == (4 + pending_for_rate_up_fail[ra->ra_pending_counter])) 1451 + ra->ra_waiting_counter = 0; 1452 + else 1453 + ra->ra_waiting_counter++; 1454 + 1455 + ra->decision_rate = rate_id; 1456 + } 1457 + 1458 + static void rtl8188e_reset_ra_counter(struct rtl8xxxu_ra_info *ra) 1459 + { 1460 + u8 rate_id = ra->decision_rate; 1461 + 1462 + ra->nsc_up = (n_threshold_high[rate_id] + n_threshold_low[rate_id]) >> 1; 1463 + ra->nsc_down = (n_threshold_high[rate_id] + n_threshold_low[rate_id]) >> 1; 1464 + } 1465 + 1466 + static void rtl8188e_rate_decision(struct rtl8xxxu_ra_info *ra) 1467 + { 1468 + struct rtl8xxxu_priv *priv = container_of(ra, struct rtl8xxxu_priv, ra_info); 1469 + const u8 *retry_penalty_idx_0; 1470 + const u8 *retry_penalty_idx_1; 1471 + const u8 *retry_penalty_up_idx; 1472 + u8 rate_id, penalty_id1, penalty_id2; 1473 + int i; 1474 + 1475 + if (ra->total == 0) 1476 + return; 1477 + 1478 + if (ra->ra_drop_after_down) { 1479 + ra->ra_drop_after_down--; 1480 + 1481 + rtl8188e_reset_ra_counter(ra); 1482 + 1483 + return; 1484 + } 1485 + 1486 + if (priv->chip_cut == 8) { /* cut I */ 1487 + retry_penalty_idx_0 = retry_penalty_idx_cut_i[0]; 1488 + retry_penalty_idx_1 = retry_penalty_idx_cut_i[1]; 1489 + retry_penalty_up_idx = retry_penalty_up_idx_cut_i; 1490 + } else { 1491 + retry_penalty_idx_0 = retry_penalty_idx_normal[0]; 1492 + retry_penalty_idx_1 = retry_penalty_idx_normal[1]; 1493 + retry_penalty_up_idx = retry_penalty_up_idx_normal; 1494 + } 1495 + 1496 + if (ra->rssi_sta_ra < (ra->pre_rssi_sta_ra - 3) || 1497 + ra->rssi_sta_ra > (ra->pre_rssi_sta_ra + 3)) { 1498 + ra->pre_rssi_sta_ra = ra->rssi_sta_ra; 1499 + ra->ra_waiting_counter = 0; 1500 + ra->ra_pending_counter = 0; 1501 + } 1502 + 1503 + /* Start RA decision */ 1504 + if (ra->pre_rate > ra->highest_rate) 1505 + rate_id = ra->highest_rate; 1506 + else 1507 + rate_id = ra->pre_rate; 1508 + 1509 + /* rate down */ 1510 + if (ra->rssi_sta_ra > rssi_threshold[rate_id]) 1511 + penalty_id1 = retry_penalty_idx_0[rate_id]; 1512 + else 1513 + penalty_id1 = retry_penalty_idx_1[rate_id]; 1514 + 1515 + for (i = 0; i < 5; i++) 1516 + ra->nsc_down += ra->retry[i] * retry_penalty[penalty_id1][i]; 1517 + 1518 + if (ra->nsc_down > (ra->total * retry_penalty[penalty_id1][5])) 1519 + ra->nsc_down -= ra->total * retry_penalty[penalty_id1][5]; 1520 + else 1521 + ra->nsc_down = 0; 1522 + 1523 + /* rate up */ 1524 + penalty_id2 = retry_penalty_up_idx[rate_id]; 1525 + 1526 + for (i = 0; i < 5; i++) 1527 + ra->nsc_up += ra->retry[i] * retry_penalty[penalty_id2][i]; 1528 + 1529 + if (ra->nsc_up > (ra->total * retry_penalty[penalty_id2][5])) 1530 + ra->nsc_up -= ra->total * retry_penalty[penalty_id2][5]; 1531 + else 1532 + ra->nsc_up = 0; 1533 + 1534 + if (ra->nsc_down < n_threshold_low[rate_id] || 1535 + ra->drop > dropping_necessary[rate_id]) { 1536 + rtl8188e_rate_down(ra); 1537 + 1538 + rtl8xxxu_update_ra_report(&priv->ra_report, ra->decision_rate, 1539 + ra->rate_sgi, priv->ra_report.txrate.bw); 1540 + } else if (ra->nsc_up > n_threshold_high[rate_id]) { 1541 + rtl8188e_rate_up(ra); 1542 + 1543 + rtl8xxxu_update_ra_report(&priv->ra_report, ra->decision_rate, 1544 + ra->rate_sgi, priv->ra_report.txrate.bw); 1545 + } 1546 + 1547 + if (ra->decision_rate == ra->pre_rate) 1548 + ra->dynamic_tx_rpt_timing_counter++; 1549 + else 1550 + ra->dynamic_tx_rpt_timing_counter = 0; 1551 + 1552 + if (ra->dynamic_tx_rpt_timing_counter >= 4) { 1553 + /* Rate didn't change 4 times, extend RPT timing */ 1554 + rtl8188e_set_tx_rpt_timing(ra, INCREASE_TIMING); 1555 + ra->dynamic_tx_rpt_timing_counter = 0; 1556 + } 1557 + 1558 + ra->pre_rate = ra->decision_rate; 1559 + 1560 + rtl8188e_reset_ra_counter(ra); 1561 + } 1562 + 1563 + static void rtl8188e_power_training_try_state(struct rtl8xxxu_ra_info *ra) 1564 + { 1565 + ra->pt_try_state = 0; 1566 + switch (ra->pt_mode_ss) { 1567 + case 3: 1568 + if (ra->decision_rate >= DESC_RATE_MCS13) 1569 + ra->pt_try_state = 1; 1570 + break; 1571 + case 2: 1572 + if (ra->decision_rate >= DESC_RATE_MCS5) 1573 + ra->pt_try_state = 1; 1574 + break; 1575 + case 1: 1576 + if (ra->decision_rate >= DESC_RATE_48M) 1577 + ra->pt_try_state = 1; 1578 + break; 1579 + case 0: 1580 + if (ra->decision_rate >= DESC_RATE_11M) 1581 + ra->pt_try_state = 1; 1582 + break; 1583 + default: 1584 + break; 1585 + } 1586 + 1587 + if (ra->rssi_sta_ra < 48) { 1588 + ra->pt_stage = 0; 1589 + } else if (ra->pt_try_state == 1) { 1590 + if ((ra->pt_stop_count >= 10) || 1591 + (ra->pt_pre_rssi > ra->rssi_sta_ra + 5) || 1592 + (ra->pt_pre_rssi < ra->rssi_sta_ra - 5) || 1593 + (ra->decision_rate != ra->pt_pre_rate)) { 1594 + if (ra->pt_stage == 0) 1595 + ra->pt_stage = 1; 1596 + else if (ra->pt_stage == 1) 1597 + ra->pt_stage = 3; 1598 + else 1599 + ra->pt_stage = 5; 1600 + 1601 + ra->pt_pre_rssi = ra->rssi_sta_ra; 1602 + ra->pt_stop_count = 0; 1603 + } else { 1604 + ra->ra_stage = 0; 1605 + ra->pt_stop_count++; 1606 + } 1607 + } else { 1608 + ra->pt_stage = 0; 1609 + ra->ra_stage = 0; 1610 + } 1611 + 1612 + ra->pt_pre_rate = ra->decision_rate; 1613 + 1614 + /* TODO: implement the "false alarm" statistics for this */ 1615 + /* Disable power training when noisy environment */ 1616 + /* if (p_dm_odm->is_disable_power_training) { */ 1617 + if (1) { 1618 + ra->pt_stage = 0; 1619 + ra->ra_stage = 0; 1620 + ra->pt_stop_count = 0; 1621 + } 1622 + } 1623 + 1624 + static void rtl8188e_power_training_decision(struct rtl8xxxu_ra_info *ra) 1625 + { 1626 + u8 temp_stage; 1627 + u32 numsc; 1628 + u32 num_total; 1629 + u8 stage_id; 1630 + u8 j; 1631 + 1632 + numsc = 0; 1633 + num_total = ra->total * pt_penalty[5]; 1634 + for (j = 0; j <= 4; j++) { 1635 + numsc += ra->retry[j] * pt_penalty[j]; 1636 + 1637 + if (numsc > num_total) 1638 + break; 1639 + } 1640 + 1641 + j >>= 1; 1642 + temp_stage = (ra->pt_stage + 1) >> 1; 1643 + if (temp_stage > j) 1644 + stage_id = temp_stage - j; 1645 + else 1646 + stage_id = 0; 1647 + 1648 + ra->pt_smooth_factor = (ra->pt_smooth_factor >> 1) + 1649 + (ra->pt_smooth_factor >> 2) + 1650 + stage_id * 16 + 2; 1651 + if (ra->pt_smooth_factor > 192) 1652 + ra->pt_smooth_factor = 192; 1653 + stage_id = ra->pt_smooth_factor >> 6; 1654 + temp_stage = stage_id * 2; 1655 + if (temp_stage != 0) 1656 + temp_stage--; 1657 + if (ra->drop > 3) 1658 + temp_stage = 0; 1659 + ra->pt_stage = temp_stage; 1660 + } 1661 + 1662 + void rtl8188e_handle_ra_tx_report2(struct rtl8xxxu_priv *priv, struct sk_buff *skb) 1663 + { 1664 + u32 *_rx_desc = (u32 *)(skb->data - sizeof(struct rtl8xxxu_rxdesc16)); 1665 + struct rtl8xxxu_rxdesc16 *rx_desc = (struct rtl8xxxu_rxdesc16 *)_rx_desc; 1666 + struct device *dev = &priv->udev->dev; 1667 + struct rtl8xxxu_ra_info *ra = &priv->ra_info; 1668 + u32 tx_rpt_len = rx_desc->pktlen & 0x3ff; 1669 + u32 items = tx_rpt_len / TX_RPT2_ITEM_SIZE; 1670 + u64 macid_valid = ((u64)_rx_desc[5] << 32) | _rx_desc[4]; 1671 + u32 macid; 1672 + u8 *rpt = skb->data; 1673 + bool valid; 1674 + u16 min_rpt_time = 0x927c; 1675 + 1676 + dev_dbg(dev, "%s: len: %d items: %d\n", __func__, tx_rpt_len, items); 1677 + 1678 + for (macid = 0; macid < items; macid++) { 1679 + valid = false; 1680 + 1681 + if (macid < 64) 1682 + valid = macid_valid & BIT(macid); 1683 + 1684 + if (valid) { 1685 + ra->retry[0] = le16_to_cpu(*(__le16 *)rpt); 1686 + ra->retry[1] = rpt[2]; 1687 + ra->retry[2] = rpt[3]; 1688 + ra->retry[3] = rpt[4]; 1689 + ra->retry[4] = rpt[5]; 1690 + ra->drop = rpt[6]; 1691 + ra->total = ra->retry[0] + ra->retry[1] + ra->retry[2] + 1692 + ra->retry[3] + ra->retry[4] + ra->drop; 1693 + 1694 + if (ra->total > 0) { 1695 + if (ra->ra_stage < 5) 1696 + rtl8188e_rate_decision(ra); 1697 + else if (ra->ra_stage == 5) 1698 + rtl8188e_power_training_try_state(ra); 1699 + else /* ra->ra_stage == 6 */ 1700 + rtl8188e_power_training_decision(ra); 1701 + 1702 + if (ra->ra_stage <= 5) 1703 + ra->ra_stage++; 1704 + else 1705 + ra->ra_stage = 0; 1706 + } 1707 + } else if (macid == 0) { 1708 + dev_warn(dev, "%s: TX report item 0 not valid\n", __func__); 1709 + } 1710 + 1711 + dev_dbg(dev, "%s: valid: %d retry: %d %d %d %d %d drop: %d\n", 1712 + __func__, valid, 1713 + ra->retry[0], ra->retry[1], ra->retry[2], 1714 + ra->retry[3], ra->retry[4], ra->drop); 1715 + 1716 + if (min_rpt_time > ra->rpt_time) 1717 + min_rpt_time = ra->rpt_time; 1718 + 1719 + rpt += TX_RPT2_ITEM_SIZE; 1720 + 1721 + /* 1722 + * We only use macid 0, so only the first item is relevant. 1723 + * AP mode will use more of them if it's ever implemented. 1724 + */ 1725 + break; 1726 + } 1727 + 1728 + if (min_rpt_time != ra->pre_min_rpt_time) { 1729 + rtl8xxxu_write16(priv, REG_TX_REPORT_TIME, min_rpt_time); 1730 + ra->pre_min_rpt_time = min_rpt_time; 1731 + } 1732 + } 1733 + 1734 + static void rtl8188e_arfb_refresh(struct rtl8xxxu_ra_info *ra) 1735 + { 1736 + s8 i; 1737 + 1738 + ra->ra_use_rate = ra->rate_mask; 1739 + 1740 + /* Highest rate */ 1741 + if (ra->ra_use_rate) { 1742 + for (i = RATESIZE; i >= 0; i--) { 1743 + if (ra->ra_use_rate & BIT(i)) { 1744 + ra->highest_rate = i; 1745 + break; 1746 + } 1747 + } 1748 + } else { 1749 + ra->highest_rate = 0; 1750 + } 1751 + 1752 + /* Lowest rate */ 1753 + if (ra->ra_use_rate) { 1754 + for (i = 0; i < RATESIZE; i++) { 1755 + if (ra->ra_use_rate & BIT(i)) { 1756 + ra->lowest_rate = i; 1757 + break; 1758 + } 1759 + } 1760 + } else { 1761 + ra->lowest_rate = 0; 1762 + } 1763 + 1764 + if (ra->highest_rate > DESC_RATE_MCS7) 1765 + ra->pt_mode_ss = 3; 1766 + else if (ra->highest_rate > DESC_RATE_54M) 1767 + ra->pt_mode_ss = 2; 1768 + else if (ra->highest_rate > DESC_RATE_11M) 1769 + ra->pt_mode_ss = 1; 1770 + else 1771 + ra->pt_mode_ss = 0; 1772 + } 1773 + 1774 + static void 1775 + rtl8188e_update_rate_mask(struct rtl8xxxu_priv *priv, 1776 + u32 ramask, u8 rateid, int sgi, int txbw_40mhz) 1777 + { 1778 + struct rtl8xxxu_ra_info *ra = &priv->ra_info; 1779 + 1780 + ra->rate_id = rateid; 1781 + ra->rate_mask = ramask; 1782 + ra->sgi_enable = sgi; 1783 + 1784 + rtl8188e_arfb_refresh(ra); 1785 + } 1786 + 1787 + static void rtl8188e_ra_set_rssi(struct rtl8xxxu_priv *priv, u8 macid, u8 rssi) 1788 + { 1789 + priv->ra_info.rssi_sta_ra = rssi; 1790 + } 1791 + 1792 + void rtl8188e_ra_info_init_all(struct rtl8xxxu_ra_info *ra) 1793 + { 1794 + ra->decision_rate = DESC_RATE_MCS7; 1795 + ra->pre_rate = DESC_RATE_MCS7; 1796 + ra->highest_rate = DESC_RATE_MCS7; 1797 + ra->lowest_rate = 0; 1798 + ra->rate_id = 0; 1799 + ra->rate_mask = 0xfffff; 1800 + ra->rssi_sta_ra = 0; 1801 + ra->pre_rssi_sta_ra = 0; 1802 + ra->sgi_enable = 0; 1803 + ra->ra_use_rate = 0xfffff; 1804 + ra->nsc_down = (n_threshold_high[DESC_RATE_MCS7] + n_threshold_low[DESC_RATE_MCS7]) / 2; 1805 + ra->nsc_up = (n_threshold_high[DESC_RATE_MCS7] + n_threshold_low[DESC_RATE_MCS7]) / 2; 1806 + ra->rate_sgi = 0; 1807 + ra->rpt_time = 0x927c; 1808 + ra->drop = 0; 1809 + ra->retry[0] = 0; 1810 + ra->retry[1] = 0; 1811 + ra->retry[2] = 0; 1812 + ra->retry[3] = 0; 1813 + ra->retry[4] = 0; 1814 + ra->total = 0; 1815 + ra->ra_waiting_counter = 0; 1816 + ra->ra_pending_counter = 0; 1817 + ra->ra_drop_after_down = 0; 1818 + 1819 + ra->pt_try_state = 0; 1820 + ra->pt_stage = 5; 1821 + ra->pt_smooth_factor = 192; 1822 + ra->pt_stop_count = 0; 1823 + ra->pt_pre_rate = 0; 1824 + ra->pt_pre_rssi = 0; 1825 + ra->pt_mode_ss = 0; 1826 + ra->ra_stage = 0; 1827 + } 1828 + 1829 + struct rtl8xxxu_fileops rtl8188eu_fops = { 1830 + .identify_chip = rtl8188eu_identify_chip, 1831 + .parse_efuse = rtl8188eu_parse_efuse, 1832 + .load_firmware = rtl8188eu_load_firmware, 1833 + .power_on = rtl8188eu_power_on, 1834 + .power_off = rtl8188eu_power_off, 1835 + .reset_8051 = rtl8188eu_reset_8051, 1836 + .llt_init = rtl8xxxu_init_llt_table, 1837 + .init_phy_bb = rtl8188eu_init_phy_bb, 1838 + .init_phy_rf = rtl8188eu_init_phy_rf, 1839 + .phy_lc_calibrate = rtl8723a_phy_lc_calibrate, 1840 + .phy_iq_calibrate = rtl8188eu_phy_iq_calibrate, 1841 + .config_channel = rtl8188eu_config_channel, 1842 + .parse_rx_desc = rtl8xxxu_parse_rxdesc16, 1843 + .init_aggregation = rtl8188eu_init_aggregation, 1844 + .enable_rf = rtl8188e_enable_rf, 1845 + .disable_rf = rtl8188e_disable_rf, 1846 + .usb_quirks = rtl8188e_usb_quirks, 1847 + .set_tx_power = rtl8188f_set_tx_power, 1848 + .update_rate_mask = rtl8188e_update_rate_mask, 1849 + .report_connect = rtl8xxxu_gen2_report_connect, 1850 + .report_rssi = rtl8188e_ra_set_rssi, 1851 + .fill_txdesc = rtl8xxxu_fill_txdesc_v3, 1852 + .set_crystal_cap = rtl8188f_set_crystal_cap, 1853 + .cck_rssi = rtl8188e_cck_rssi, 1854 + .writeN_block_size = 128, 1855 + .rx_desc_size = sizeof(struct rtl8xxxu_rxdesc16), 1856 + .tx_desc_size = sizeof(struct rtl8xxxu_txdesc32), 1857 + .has_tx_report = 1, 1858 + .gen2_thermal_meter = 1, 1859 + .adda_1t_init = 0x0b1b25a0, 1860 + .adda_1t_path_on = 0x0bdb25a0, 1861 + /* 1862 + * Use 9K for 8188e normal chip 1863 + * Max RX buffer = 10K - max(TxReportSize(64*8), WOLPattern(16*24)) 1864 + */ 1865 + .trxff_boundary = 0x25ff, 1866 + .pbp_rx = PBP_PAGE_SIZE_128, 1867 + .pbp_tx = PBP_PAGE_SIZE_128, 1868 + .mactable = rtl8188e_mac_init_table, 1869 + .total_page_num = TX_TOTAL_PAGE_NUM_8188E, 1870 + .page_num_hi = TX_PAGE_NUM_HI_PQ_8188E, 1871 + .page_num_lo = TX_PAGE_NUM_LO_PQ_8188E, 1872 + .page_num_norm = TX_PAGE_NUM_NORM_PQ_8188E, 1873 + .last_llt_entry = 175, 1874 + };
+7 -17
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8188f.c
··· 370 370 *cck_group = *group; 371 371 } 372 372 373 - static void 373 + void 374 374 rtl8188f_set_tx_power(struct rtl8xxxu_priv *priv, int channel, bool ht40) 375 375 { 376 376 u32 val32, ofdm, mcs; ··· 716 716 static int rtl8188fu_parse_efuse(struct rtl8xxxu_priv *priv) 717 717 { 718 718 struct rtl8188fu_efuse *efuse = &priv->efuse_wifi.efuse8188fu; 719 - int i; 720 719 721 720 if (efuse->rtl_id != cpu_to_le16(0x8129)) 722 721 return -EINVAL; ··· 737 738 dev_info(&priv->udev->dev, "Vendor: %.7s\n", efuse->vendor_name); 738 739 dev_info(&priv->udev->dev, "Product: %.7s\n", efuse->device_name); 739 740 740 - if (rtl8xxxu_debug & RTL8XXXU_DEBUG_EFUSE) { 741 - unsigned char *raw = priv->efuse_wifi.raw; 742 - 743 - dev_info(&priv->udev->dev, 744 - "%s: dumping efuse (0x%02zx bytes):\n", 745 - __func__, sizeof(struct rtl8188fu_efuse)); 746 - for (i = 0; i < sizeof(struct rtl8188fu_efuse); i += 8) 747 - dev_info(&priv->udev->dev, "%02x: %8ph\n", i, &raw[i]); 748 - } 749 - 750 741 return 0; 751 742 } 752 743 753 744 static int rtl8188fu_load_firmware(struct rtl8xxxu_priv *priv) 754 745 { 755 - char *fw_name; 746 + const char *fw_name; 756 747 int ret; 757 748 758 749 fw_name = "rtlwifi/rtl8188fufw.bin"; ··· 1111 1122 1112 1123 if (t == 0) { 1113 1124 val32 = rtl8xxxu_read32(priv, REG_FPGA0_XA_HSSI_PARM1); 1114 - priv->pi_enabled = val32 & FPGA0_HSSI_PARM1_PI; 1125 + priv->pi_enabled = u32_get_bits(val32, FPGA0_HSSI_PARM1_PI); 1115 1126 } 1116 1127 1117 1128 /* save RF path */ ··· 1651 1662 #define XTAL1 GENMASK(22, 17) 1652 1663 #define XTAL0 GENMASK(16, 11) 1653 1664 1654 - static void rtl8188f_set_crystal_cap(struct rtl8xxxu_priv *priv, u8 crystal_cap) 1665 + void rtl8188f_set_crystal_cap(struct rtl8xxxu_priv *priv, u8 crystal_cap) 1655 1666 { 1656 1667 struct rtl8xxxu_cfo_tracking *cfo = &priv->cfo_tracking; 1657 1668 u32 val32; ··· 1682 1693 s8 rx_pwr_all = 0x00; 1683 1694 u8 vga_idx, lna_idx; 1684 1695 1685 - lna_idx = (cck_agc_rpt & 0xE0) >> 5; 1686 - vga_idx = cck_agc_rpt & 0x1F; 1696 + lna_idx = u8_get_bits(cck_agc_rpt, CCK_AGC_RPT_LNA_IDX_MASK); 1697 + vga_idx = u8_get_bits(cck_agc_rpt, CCK_AGC_RPT_VGA_IDX_MASK); 1687 1698 1688 1699 switch (lna_idx) { 1689 1700 case 7: ··· 1732 1743 .set_tx_power = rtl8188f_set_tx_power, 1733 1744 .update_rate_mask = rtl8xxxu_gen2_update_rate_mask, 1734 1745 .report_connect = rtl8xxxu_gen2_report_connect, 1746 + .report_rssi = rtl8xxxu_gen2_report_rssi, 1735 1747 .fill_txdesc = rtl8xxxu_fill_txdesc_v2, 1736 1748 .set_crystal_cap = rtl8188f_set_crystal_cap, 1737 1749 .cck_rssi = rtl8188f_cck_rssi,
+2 -11
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8192c.c
··· 386 386 387 387 static int rtl8192cu_load_firmware(struct rtl8xxxu_priv *priv) 388 388 { 389 - char *fw_name; 389 + const char *fw_name; 390 390 int ret; 391 391 392 392 if (!priv->vendor_umc) ··· 404 404 static int rtl8192cu_parse_efuse(struct rtl8xxxu_priv *priv) 405 405 { 406 406 struct rtl8192cu_efuse *efuse = &priv->efuse_wifi.efuse8192; 407 - int i; 408 407 409 408 if (efuse->rtl_id != cpu_to_le16(0x8129)) 410 409 return -EINVAL; ··· 456 457 priv->power_base = &rtl8188r_power_base; 457 458 } 458 459 459 - if (rtl8xxxu_debug & RTL8XXXU_DEBUG_EFUSE) { 460 - unsigned char *raw = priv->efuse_wifi.raw; 461 - 462 - dev_info(&priv->udev->dev, 463 - "%s: dumping efuse (0x%02zx bytes):\n", 464 - __func__, sizeof(struct rtl8192cu_efuse)); 465 - for (i = 0; i < sizeof(struct rtl8192cu_efuse); i += 8) 466 - dev_info(&priv->udev->dev, "%02x: %8ph\n", i, &raw[i]); 467 - } 468 460 return 0; 469 461 } 470 462 ··· 609 619 .set_tx_power = rtl8xxxu_gen1_set_tx_power, 610 620 .update_rate_mask = rtl8xxxu_update_rate_mask, 611 621 .report_connect = rtl8xxxu_gen1_report_connect, 622 + .report_rssi = rtl8xxxu_gen1_report_rssi, 612 623 .fill_txdesc = rtl8xxxu_fill_txdesc_v1, 613 624 .cck_rssi = rtl8723a_cck_rssi, 614 625 .writeN_block_size = 128,
+9 -12
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8192e.c
··· 704 704 rtl8192eu_log_next_device_info(priv, "Product", efuse->device_info, &record_offset); 705 705 rtl8192eu_log_next_device_info(priv, "Serial", efuse->device_info, &record_offset); 706 706 707 - if (rtl8xxxu_debug & RTL8XXXU_DEBUG_EFUSE) { 708 - unsigned char *raw = priv->efuse_wifi.raw; 709 - 710 - dev_info(&priv->udev->dev, 711 - "%s: dumping efuse (0x%02zx bytes):\n", 712 - __func__, sizeof(struct rtl8192eu_efuse)); 713 - for (i = 0; i < sizeof(struct rtl8192eu_efuse); i += 8) 714 - dev_info(&priv->udev->dev, "%02x: %8ph\n", i, &raw[i]); 715 - } 716 707 return 0; 717 708 } 718 709 719 710 static int rtl8192eu_load_firmware(struct rtl8xxxu_priv *priv) 720 711 { 721 - char *fw_name; 712 + const char *fw_name; 722 713 int ret; 723 714 724 715 fw_name = "rtlwifi/rtl8192eu_nic.bin"; ··· 1735 1744 val8 = rtl8xxxu_read8(priv, REG_PAD_CTRL1); 1736 1745 val8 &= ~BIT(0); 1737 1746 rtl8xxxu_write8(priv, REG_PAD_CTRL1, val8); 1747 + 1748 + /* 1749 + * Fix transmission failure of rtl8192e. 1750 + */ 1751 + rtl8xxxu_write8(priv, REG_TXPAUSE, 0x00); 1738 1752 } 1739 1753 1740 1754 static s8 rtl8192e_cck_rssi(struct rtl8xxxu_priv *priv, u8 cck_agc_rpt) ··· 1751 1755 u8 vga_idx, lna_idx; 1752 1756 s8 lna_gain = 0; 1753 1757 1754 - lna_idx = (cck_agc_rpt & 0xE0) >> 5; 1755 - vga_idx = cck_agc_rpt & 0x1F; 1758 + lna_idx = u8_get_bits(cck_agc_rpt, CCK_AGC_RPT_LNA_IDX_MASK); 1759 + vga_idx = u8_get_bits(cck_agc_rpt, CCK_AGC_RPT_VGA_IDX_MASK); 1756 1760 1757 1761 if (priv->cck_agc_report_type == 0) 1758 1762 lna_gain = lna_gain_table_0[lna_idx]; ··· 1784 1788 .set_tx_power = rtl8192e_set_tx_power, 1785 1789 .update_rate_mask = rtl8xxxu_gen2_update_rate_mask, 1786 1790 .report_connect = rtl8xxxu_gen2_report_connect, 1791 + .report_rssi = rtl8xxxu_gen2_report_rssi, 1787 1792 .fill_txdesc = rtl8xxxu_fill_txdesc_v2, 1788 1793 .set_crystal_cap = rtl8723a_set_crystal_cap, 1789 1794 .cck_rssi = rtl8192e_cck_rssi,
+2 -1
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8723a.c
··· 231 231 232 232 static int rtl8723au_load_firmware(struct rtl8xxxu_priv *priv) 233 233 { 234 - char *fw_name; 234 + const char *fw_name; 235 235 int ret; 236 236 237 237 switch (priv->chip_cut) { ··· 478 478 .set_tx_power = rtl8xxxu_gen1_set_tx_power, 479 479 .update_rate_mask = rtl8xxxu_update_rate_mask, 480 480 .report_connect = rtl8xxxu_gen1_report_connect, 481 + .report_rssi = rtl8xxxu_gen1_report_rssi, 481 482 .fill_txdesc = rtl8xxxu_fill_txdesc_v1, 482 483 .set_crystal_cap = rtl8723a_set_crystal_cap, 483 484 .cck_rssi = rtl8723a_cck_rssi,
+4 -14
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_8723b.c
··· 497 497 dev_info(&priv->udev->dev, "Vendor: %.7s\n", efuse->vendor_name); 498 498 dev_info(&priv->udev->dev, "Product: %.41s\n", efuse->device_name); 499 499 500 - if (rtl8xxxu_debug & RTL8XXXU_DEBUG_EFUSE) { 501 - int i; 502 - unsigned char *raw = priv->efuse_wifi.raw; 503 - 504 - dev_info(&priv->udev->dev, 505 - "%s: dumping efuse (0x%02zx bytes):\n", 506 - __func__, sizeof(struct rtl8723bu_efuse)); 507 - for (i = 0; i < sizeof(struct rtl8723bu_efuse); i += 8) 508 - dev_info(&priv->udev->dev, "%02x: %8ph\n", i, &raw[i]); 509 - } 510 - 511 500 return 0; 512 501 } 513 502 514 503 static int rtl8723bu_load_firmware(struct rtl8xxxu_priv *priv) 515 504 { 516 - char *fw_name; 505 + const char *fw_name; 517 506 int ret; 518 507 519 508 if (priv->enable_bluetooth) ··· 1680 1691 s8 rx_pwr_all = 0x00; 1681 1692 u8 vga_idx, lna_idx; 1682 1693 1683 - lna_idx = (cck_agc_rpt & 0xE0) >> 5; 1684 - vga_idx = cck_agc_rpt & 0x1F; 1694 + lna_idx = u8_get_bits(cck_agc_rpt, CCK_AGC_RPT_LNA_IDX_MASK); 1695 + vga_idx = u8_get_bits(cck_agc_rpt, CCK_AGC_RPT_VGA_IDX_MASK); 1685 1696 1686 1697 switch (lna_idx) { 1687 1698 case 6: ··· 1727 1738 .set_tx_power = rtl8723b_set_tx_power, 1728 1739 .update_rate_mask = rtl8xxxu_gen2_update_rate_mask, 1729 1740 .report_connect = rtl8xxxu_gen2_report_connect, 1741 + .report_rssi = rtl8xxxu_gen2_report_rssi, 1730 1742 .fill_txdesc = rtl8xxxu_fill_txdesc_v2, 1731 1743 .set_crystal_cap = rtl8723a_set_crystal_cap, 1732 1744 .cck_rssi = rtl8723b_cck_rssi,
+350 -74
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c
··· 34 34 35 35 #define DRIVER_NAME "rtl8xxxu" 36 36 37 - int rtl8xxxu_debug = RTL8XXXU_DEBUG_EFUSE; 37 + int rtl8xxxu_debug; 38 38 static bool rtl8xxxu_ht40_2g; 39 39 static bool rtl8xxxu_dma_aggregation; 40 40 static int rtl8xxxu_dma_agg_timeout = -1; ··· 46 46 MODULE_FIRMWARE("rtlwifi/rtl8723aufw_A.bin"); 47 47 MODULE_FIRMWARE("rtlwifi/rtl8723aufw_B.bin"); 48 48 MODULE_FIRMWARE("rtlwifi/rtl8723aufw_B_NoBT.bin"); 49 + MODULE_FIRMWARE("rtlwifi/rtl8188eufw.bin"); 49 50 MODULE_FIRMWARE("rtlwifi/rtl8192cufw_A.bin"); 50 51 MODULE_FIRMWARE("rtlwifi/rtl8192cufw_B.bin"); 51 52 MODULE_FIRMWARE("rtlwifi/rtl8192cufw_TMSC.bin"); ··· 1582 1581 cut = 'A' + priv->chip_cut; 1583 1582 1584 1583 dev_info(dev, 1585 - "RTL%s rev %c (%s) %iT%iR, TX queues %i, WiFi=%i, BT=%i, GPS=%i, HI PA=%i\n", 1586 - priv->chip_name, cut, priv->chip_vendor, priv->tx_paths, 1587 - priv->rx_paths, priv->ep_tx_count, priv->has_wifi, 1588 - priv->has_bluetooth, priv->has_gps, priv->hi_pa); 1584 + "RTL%s rev %c (%s) romver %d, %iT%iR, TX queues %i, WiFi=%i, BT=%i, GPS=%i, HI PA=%i\n", 1585 + priv->chip_name, cut, priv->chip_vendor, priv->rom_rev, 1586 + priv->tx_paths, priv->rx_paths, priv->ep_tx_count, 1587 + priv->has_wifi, priv->has_bluetooth, priv->has_gps, 1588 + priv->hi_pa); 1589 1589 1590 1590 dev_info(dev, "RTL%s MAC: %pM\n", priv->chip_name, priv->mac_addr); 1591 1591 } ··· 1815 1813 return ret; 1816 1814 } 1817 1815 1816 + static void rtl8xxxu_dump_efuse(struct rtl8xxxu_priv *priv) 1817 + { 1818 + dev_info(&priv->udev->dev, 1819 + "Dumping efuse for RTL%s (0x%02x bytes):\n", 1820 + priv->chip_name, EFUSE_MAP_LEN); 1821 + 1822 + print_hex_dump(KERN_INFO, "", DUMP_PREFIX_OFFSET, 16, 1, 1823 + priv->efuse_wifi.raw, EFUSE_MAP_LEN, true); 1824 + } 1825 + 1818 1826 void rtl8xxxu_reset_8051(struct rtl8xxxu_priv *priv) 1819 1827 { 1820 1828 u8 val8; ··· 1982 1970 return ret; 1983 1971 } 1984 1972 1985 - int rtl8xxxu_load_firmware(struct rtl8xxxu_priv *priv, char *fw_name) 1973 + int rtl8xxxu_load_firmware(struct rtl8xxxu_priv *priv, const char *fw_name) 1986 1974 { 1987 1975 struct device *dev = &priv->udev->dev; 1988 1976 const struct firmware *fw; ··· 2012 2000 switch (signature & 0xfff0) { 2013 2001 case 0x92e0: 2014 2002 case 0x92c0: 2003 + case 0x88e0: 2015 2004 case 0x88c0: 2016 2005 case 0x5300: 2017 2006 case 0x2300: ··· 2084 2071 } 2085 2072 } 2086 2073 2087 - if (priv->rtl_chip != RTL8723B && 2088 - priv->rtl_chip != RTL8192E && 2089 - priv->rtl_chip != RTL8188F) 2074 + switch (priv->rtl_chip) { 2075 + case RTL8188C: 2076 + case RTL8188R: 2077 + case RTL8191C: 2078 + case RTL8192C: 2079 + case RTL8723A: 2090 2080 rtl8xxxu_write8(priv, REG_MAX_AGGR_NUM, 0x0a); 2081 + break; 2082 + case RTL8188E: 2083 + rtl8xxxu_write16(priv, REG_MAX_AGGR_NUM, 0x0707); 2084 + break; 2085 + default: 2086 + break; 2087 + } 2091 2088 2092 2089 return 0; 2093 2090 } ··· 2396 2373 int rtl8xxxu_init_llt_table(struct rtl8xxxu_priv *priv) 2397 2374 { 2398 2375 int ret; 2399 - int i; 2376 + int i, last_entry; 2400 2377 u8 last_tx_page; 2401 2378 2402 2379 last_tx_page = priv->fops->total_page_num; 2380 + 2381 + if (priv->fops->last_llt_entry) 2382 + last_entry = priv->fops->last_llt_entry; 2383 + else 2384 + last_entry = 255; 2403 2385 2404 2386 for (i = 0; i < last_tx_page; i++) { 2405 2387 ret = rtl8xxxu_llt_write(priv, i, i + 1); ··· 2417 2389 goto exit; 2418 2390 2419 2391 /* Mark remaining pages as a ring buffer */ 2420 - for (i = last_tx_page + 1; i < 0xff; i++) { 2392 + for (i = last_tx_page + 1; i < last_entry; i++) { 2421 2393 ret = rtl8xxxu_llt_write(priv, i, (i + 1)); 2422 2394 if (ret) 2423 2395 goto exit; 2424 2396 } 2425 2397 2426 2398 /* Let last entry point to the start entry of ring buffer */ 2427 - ret = rtl8xxxu_llt_write(priv, 0xff, last_tx_page + 1); 2399 + ret = rtl8xxxu_llt_write(priv, last_entry, last_tx_page + 1); 2428 2400 if (ret) 2429 2401 goto exit; 2430 2402 ··· 2732 2704 2733 2705 #define MAX_TOLERANCE 5 2734 2706 2735 - static bool rtl8xxxu_simularity_compare(struct rtl8xxxu_priv *priv, 2736 - int result[][8], int c1, int c2) 2707 + bool rtl8xxxu_simularity_compare(struct rtl8xxxu_priv *priv, 2708 + int result[][8], int c1, int c2) 2737 2709 { 2738 2710 u32 i, j, diff, simubitmap, bound = 0; 2739 2711 int candidate[2] = {-1, -1}; /* for path A and path B */ ··· 3926 3898 goto exit; 3927 3899 3928 3900 /* RFSW Control - clear bit 14 ?? */ 3929 - if (priv->rtl_chip != RTL8723B && priv->rtl_chip != RTL8192E) 3901 + if (priv->rtl_chip != RTL8723B && priv->rtl_chip != RTL8192E && 3902 + priv->rtl_chip != RTL8188E) 3930 3903 rtl8xxxu_write32(priv, REG_FPGA0_TX_INFO, 0x00000003); 3931 3904 3932 3905 val32 = FPGA0_RF_TRSW | FPGA0_RF_TRSWB | FPGA0_RF_ANTSW | ··· 3940 3911 rtl8xxxu_write32(priv, REG_FPGA0_XAB_RF_SW_CTRL, val32); 3941 3912 3942 3913 /* 0x860[6:5]= 00 - why? - this sets antenna B */ 3943 - if (priv->rtl_chip != RTL8192E) 3914 + if (priv->rtl_chip != RTL8192E && priv->rtl_chip != RTL8188E) 3944 3915 rtl8xxxu_write32(priv, REG_FPGA0_XA_RF_INT_OE, 0x66f60210); 3945 3916 3946 3917 if (!macpower) { ··· 3982 3953 * Enable TX report and TX report timer for 8723bu/8188eu/... 3983 3954 */ 3984 3955 if (fops->has_tx_report) { 3956 + /* 3957 + * The RTL8188EU has two types of TX reports: 3958 + * rpt_sel=1: 3959 + * One report for one frame. We can use this for frames 3960 + * with IEEE80211_TX_CTL_REQ_TX_STATUS. 3961 + * rpt_sel=2: 3962 + * One report for many frames transmitted over a period 3963 + * of time. (This is what REG_TX_REPORT_TIME is for.) The 3964 + * report includes the number of frames transmitted 3965 + * successfully, and the number of unsuccessful 3966 + * transmissions. We use this for software rate control. 3967 + * 3968 + * Bit 0 of REG_TX_REPORT_CTRL is required for both types. 3969 + * Bit 1 (TX_REPORT_CTRL_TIMER_ENABLE) is required for 3970 + * type 2. 3971 + */ 3985 3972 val8 = rtl8xxxu_read8(priv, REG_TX_REPORT_CTRL); 3973 + if (priv->rtl_chip == RTL8188E) 3974 + val8 |= BIT(0); 3986 3975 val8 |= TX_REPORT_CTRL_TIMER_ENABLE; 3987 3976 rtl8xxxu_write8(priv, REG_TX_REPORT_CTRL, val8); 3988 3977 /* Set MAX RPT MACID */ ··· 4026 3979 } else if (priv->rtl_chip == RTL8188F) { 4027 3980 rtl8xxxu_write32(priv, REG_HISR0, 0xffffffff); 4028 3981 rtl8xxxu_write32(priv, REG_HISR1, 0xffffffff); 3982 + } else if (priv->rtl_chip == RTL8188E) { 3983 + rtl8xxxu_write32(priv, REG_HISR0, 0xffffffff); 3984 + val32 = IMR0_PSTIMEOUT | IMR0_TBDER | IMR0_CPWM | IMR0_CPWM2; 3985 + rtl8xxxu_write32(priv, REG_HIMR0, val32); 3986 + val32 = IMR1_TXERR | IMR1_RXERR | IMR1_TXFOVW | IMR1_RXFOVW; 3987 + rtl8xxxu_write32(priv, REG_HIMR1, val32); 3988 + val8 = rtl8xxxu_read8(priv, REG_USB_SPECIAL_OPTION); 3989 + val8 |= USB_SPEC_INT_BULK_SELECT; 3990 + rtl8xxxu_write8(priv, REG_USB_SPECIAL_OPTION, val8); 4029 3991 } else { 4030 3992 /* 4031 3993 * Enable all interrupts - not obvious USB needs to do this ··· 4140 4084 if (fops->init_aggregation) 4141 4085 fops->init_aggregation(priv); 4142 4086 4143 - if (priv->rtl_chip == RTL8188F) { 4087 + if (priv->rtl_chip == RTL8188F || priv->rtl_chip == RTL8188E) { 4144 4088 rtl8xxxu_write16(priv, REG_PKT_VO_VI_LIFE_TIME, 0x0400); /* unit: 256us. 256ms */ 4145 4089 rtl8xxxu_write16(priv, REG_PKT_BE_BK_LIFE_TIME, 0x0400); /* unit: 256us. 256ms */ 4146 4090 } ··· 4174 4118 /* Disable BAR - not sure if this has any effect on USB */ 4175 4119 rtl8xxxu_write32(priv, REG_BAR_MODE_CTRL, 0x0201ffff); 4176 4120 4177 - if (priv->rtl_chip != RTL8188F) 4121 + if (priv->rtl_chip != RTL8188F && priv->rtl_chip != RTL8188E) 4178 4122 rtl8xxxu_write16(priv, REG_FAST_EDCA_CTRL, 0); 4179 4123 4180 4124 if (fops->init_statistics) ··· 4192 4136 * Reset USB mode switch setting 4193 4137 */ 4194 4138 rtl8xxxu_write8(priv, REG_ACLK_MON, 0x00); 4195 - } else if (priv->rtl_chip == RTL8188F) { 4139 + } else if (priv->rtl_chip == RTL8188F || priv->rtl_chip == RTL8188E) { 4196 4140 /* 4197 - * Init GPIO settings for 8188f 4141 + * Init GPIO settings for 8188f, 8188e 4198 4142 */ 4199 4143 val8 = rtl8xxxu_read8(priv, REG_GPIO_MUXCFG); 4200 4144 val8 &= ~GPIO_MUXCFG_IO_SEL_ENBT; ··· 4240 4184 val32 |= FPGA_RF_MODE_CCK; 4241 4185 rtl8xxxu_write32(priv, REG_FPGA0_RF_MODE, val32); 4242 4186 } 4243 - } else if (priv->rtl_chip == RTL8192E) { 4187 + } else if (priv->rtl_chip == RTL8192E || priv->rtl_chip == RTL8188E) { 4244 4188 rtl8xxxu_write8(priv, REG_USB_HRPWM, 0x00); 4245 4189 } 4246 4190 ··· 4264 4208 * should be equal or CCK RSSI report may be incorrect 4265 4209 */ 4266 4210 val32 = rtl8xxxu_read32(priv, REG_FPGA0_XA_HSSI_PARM2); 4267 - priv->cck_agc_report_type = val32 & FPGA0_HSSI_PARM2_CCK_HIGH_PWR; 4211 + priv->cck_agc_report_type = 4212 + u32_get_bits(val32, FPGA0_HSSI_PARM2_CCK_HIGH_PWR); 4268 4213 4269 4214 val32 = rtl8xxxu_read32(priv, REG_FPGA0_XB_HSSI_PARM2); 4270 - if (priv->cck_agc_report_type != (bool)(val32 & FPGA0_HSSI_PARM2_CCK_HIGH_PWR)) { 4215 + if (priv->cck_agc_report_type != 4216 + u32_get_bits(val32, FPGA0_HSSI_PARM2_CCK_HIGH_PWR)) { 4271 4217 if (priv->cck_agc_report_type) 4272 4218 val32 |= FPGA0_HSSI_PARM2_CCK_HIGH_PWR; 4273 4219 else ··· 4292 4234 priv->cfo_tracking.adjust = true; 4293 4235 priv->cfo_tracking.crystal_cap = priv->default_crystal_cap; 4294 4236 } 4237 + 4238 + if (priv->rtl_chip == RTL8188E) 4239 + rtl8188e_ra_info_init_all(&priv->ra_info); 4295 4240 4296 4241 exit: 4297 4242 return ret; ··· 4460 4399 h2c.media_status_rpt.parm &= ~BIT(0); 4461 4400 4462 4401 rtl8xxxu_gen2_h2c_cmd(priv, &h2c, sizeof(h2c.media_status_rpt)); 4402 + } 4403 + 4404 + void rtl8xxxu_gen1_report_rssi(struct rtl8xxxu_priv *priv, u8 macid, u8 rssi) 4405 + { 4406 + struct h2c_cmd h2c; 4407 + const int h2c_size = 4; 4408 + 4409 + memset(&h2c, 0, sizeof(struct h2c_cmd)); 4410 + 4411 + h2c.rssi_report.cmd = H2C_SET_RSSI; 4412 + h2c.rssi_report.macid = macid; 4413 + h2c.rssi_report.rssi = rssi; 4414 + 4415 + rtl8xxxu_gen1_h2c_cmd(priv, &h2c, h2c_size); 4416 + } 4417 + 4418 + void rtl8xxxu_gen2_report_rssi(struct rtl8xxxu_priv *priv, u8 macid, u8 rssi) 4419 + { 4420 + struct h2c_cmd h2c; 4421 + int h2c_size = sizeof(h2c.rssi_report); 4422 + 4423 + if (priv->rtl_chip == RTL8723B) 4424 + h2c_size = 4; 4425 + 4426 + memset(&h2c, 0, sizeof(struct h2c_cmd)); 4427 + 4428 + h2c.rssi_report.cmd = H2C_8723B_RSSI_SETTING; 4429 + h2c.rssi_report.macid = macid; 4430 + h2c.rssi_report.rssi = rssi; 4431 + 4432 + rtl8xxxu_gen2_h2c_cmd(priv, &h2c, h2c_size); 4463 4433 } 4464 4434 4465 4435 void rtl8xxxu_gen1_init_aggregation(struct rtl8xxxu_priv *priv) ··· 4690 4598 } 4691 4599 } 4692 4600 4693 - static void rtl8xxxu_update_ra_report(struct rtl8xxxu_ra_report *rarpt, 4694 - u8 rate, u8 sgi, u8 bw) 4601 + void rtl8xxxu_update_ra_report(struct rtl8xxxu_ra_report *rarpt, 4602 + u8 rate, u8 sgi, u8 bw) 4695 4603 { 4696 4604 u8 mcs, nss; 4697 4605 ··· 5161 5069 } 5162 5070 } 5163 5071 5072 + /* 5073 + * Fill in v3 (gen1) specific TX descriptor bits. 5074 + * This format is a hybrid between the v1 and v2 formats, only seen 5075 + * on 8188eu devices so far. 5076 + */ 5077 + void 5078 + rtl8xxxu_fill_txdesc_v3(struct ieee80211_hw *hw, struct ieee80211_hdr *hdr, 5079 + struct ieee80211_tx_info *tx_info, 5080 + struct rtl8xxxu_txdesc32 *tx_desc, bool sgi, 5081 + bool short_preamble, bool ampdu_enable, u32 rts_rate) 5082 + { 5083 + struct ieee80211_rate *tx_rate = ieee80211_get_tx_rate(hw, tx_info); 5084 + struct rtl8xxxu_priv *priv = hw->priv; 5085 + struct device *dev = &priv->udev->dev; 5086 + struct rtl8xxxu_ra_info *ra = &priv->ra_info; 5087 + u8 *qc = ieee80211_get_qos_ctl(hdr); 5088 + u8 tid = qc[0] & IEEE80211_QOS_CTL_TID_MASK; 5089 + u32 rate; 5090 + u16 rate_flags = tx_info->control.rates[0].flags; 5091 + u16 seq_number; 5092 + 5093 + if (rate_flags & IEEE80211_TX_RC_MCS && 5094 + !ieee80211_is_mgmt(hdr->frame_control)) 5095 + rate = tx_info->control.rates[0].idx + DESC_RATE_MCS0; 5096 + else 5097 + rate = tx_rate->hw_value; 5098 + 5099 + seq_number = IEEE80211_SEQ_TO_SN(le16_to_cpu(hdr->seq_ctrl)); 5100 + 5101 + if (ieee80211_is_data(hdr->frame_control)) { 5102 + rate = ra->decision_rate; 5103 + tx_desc->txdw5 = cpu_to_le32(rate); 5104 + tx_desc->txdw4 |= cpu_to_le32(TXDESC32_USE_DRIVER_RATE); 5105 + tx_desc->txdw4 |= le32_encode_bits(ra->pt_stage, TXDESC32_PT_STAGE_MASK); 5106 + /* Data/RTS rate FB limit */ 5107 + tx_desc->txdw5 |= cpu_to_le32(0x0001ff00); 5108 + } 5109 + 5110 + if (rtl8xxxu_debug & RTL8XXXU_DEBUG_TX) 5111 + dev_info(dev, "%s: TX rate: %d, pkt size %d\n", 5112 + __func__, rate, le16_to_cpu(tx_desc->pkt_size)); 5113 + 5114 + tx_desc->txdw3 = cpu_to_le32((u32)seq_number << TXDESC32_SEQ_SHIFT); 5115 + 5116 + if (ampdu_enable && test_bit(tid, priv->tid_tx_operational)) 5117 + tx_desc->txdw2 |= cpu_to_le32(TXDESC40_AGG_ENABLE); 5118 + else 5119 + tx_desc->txdw2 |= cpu_to_le32(TXDESC40_AGG_BREAK); 5120 + 5121 + if (ieee80211_is_mgmt(hdr->frame_control)) { 5122 + tx_desc->txdw5 = cpu_to_le32(rate); 5123 + tx_desc->txdw4 |= cpu_to_le32(TXDESC32_USE_DRIVER_RATE); 5124 + tx_desc->txdw5 |= cpu_to_le32(6 << TXDESC32_RETRY_LIMIT_SHIFT); 5125 + tx_desc->txdw5 |= cpu_to_le32(TXDESC32_RETRY_LIMIT_ENABLE); 5126 + } 5127 + 5128 + if (ieee80211_is_data_qos(hdr->frame_control)) { 5129 + tx_desc->txdw4 |= cpu_to_le32(TXDESC32_QOS); 5130 + 5131 + if (conf_is_ht40(&hw->conf)) { 5132 + tx_desc->txdw4 |= cpu_to_le32(TXDESC_DATA_BW); 5133 + 5134 + if (conf_is_ht40_minus(&hw->conf)) 5135 + tx_desc->txdw4 |= cpu_to_le32(TXDESC_PRIME_CH_OFF_UPPER); 5136 + else 5137 + tx_desc->txdw4 |= cpu_to_le32(TXDESC_PRIME_CH_OFF_LOWER); 5138 + } 5139 + } 5140 + 5141 + if (short_preamble) 5142 + tx_desc->txdw4 |= cpu_to_le32(TXDESC32_SHORT_PREAMBLE); 5143 + 5144 + if (sgi && ra->rate_sgi) 5145 + tx_desc->txdw5 |= cpu_to_le32(TXDESC32_SHORT_GI); 5146 + 5147 + /* 5148 + * rts_rate is zero if RTS/CTS or CTS to SELF are not enabled 5149 + */ 5150 + tx_desc->txdw4 |= cpu_to_le32(rts_rate << TXDESC32_RTS_RATE_SHIFT); 5151 + if (ampdu_enable || (rate_flags & IEEE80211_TX_RC_USE_RTS_CTS)) { 5152 + tx_desc->txdw4 |= cpu_to_le32(TXDESC32_RTS_CTS_ENABLE); 5153 + tx_desc->txdw4 |= cpu_to_le32(TXDESC32_HW_RTS_ENABLE); 5154 + } else if (rate_flags & IEEE80211_TX_RC_USE_CTS_PROTECT) { 5155 + tx_desc->txdw4 |= cpu_to_le32(TXDESC32_CTS_SELF_ENABLE); 5156 + tx_desc->txdw4 |= cpu_to_le32(TXDESC32_HW_RTS_ENABLE); 5157 + } 5158 + 5159 + tx_desc->txdw2 |= cpu_to_le32(TXDESC_ANTENNA_SELECT_A | 5160 + TXDESC_ANTENNA_SELECT_B); 5161 + tx_desc->txdw7 |= cpu_to_le32(TXDESC_ANTENNA_SELECT_C); 5162 + } 5163 + 5164 5164 static void rtl8xxxu_tx(struct ieee80211_hw *hw, 5165 5165 struct ieee80211_tx_control *control, 5166 5166 struct sk_buff *skb) ··· 5458 5274 pending = priv->rx_urb_pending_count; 5459 5275 } else { 5460 5276 skb = (struct sk_buff *)rx_urb->urb.context; 5461 - dev_kfree_skb(skb); 5277 + dev_kfree_skb_irq(skb); 5462 5278 usb_free_urb(&rx_urb->urb); 5463 5279 } 5464 5280 ··· 5734 5550 btcoex = &priv->bt_coex; 5735 5551 rarpt = &priv->ra_report; 5736 5552 5737 - if (priv->rf_paths > 1) 5738 - goto out; 5739 - 5740 5553 while (!skb_queue_empty(&priv->c2hcmd_queue)) { 5741 5554 skb = skb_dequeue(&priv->c2hcmd_queue); 5742 5555 ··· 5766 5585 default: 5767 5586 break; 5768 5587 } 5769 - } 5770 5588 5771 - out: 5772 - dev_kfree_skb(skb); 5589 + dev_kfree_skb(skb); 5590 + } 5773 5591 } 5774 5592 5775 5593 static void rtl8723bu_handle_c2h(struct rtl8xxxu_priv *priv, ··· 5818 5638 skb_queue_tail(&priv->c2hcmd_queue, skb); 5819 5639 5820 5640 schedule_work(&priv->c2hcmd_work); 5641 + } 5642 + 5643 + static void rtl8188e_c2hcmd_callback(struct work_struct *work) 5644 + { 5645 + struct rtl8xxxu_priv *priv = container_of(work, struct rtl8xxxu_priv, c2hcmd_work); 5646 + struct device *dev = &priv->udev->dev; 5647 + struct sk_buff *skb = NULL; 5648 + struct rtl8xxxu_rxdesc16 *rx_desc; 5649 + 5650 + while (!skb_queue_empty(&priv->c2hcmd_queue)) { 5651 + skb = skb_dequeue(&priv->c2hcmd_queue); 5652 + 5653 + rx_desc = (struct rtl8xxxu_rxdesc16 *)(skb->data - sizeof(struct rtl8xxxu_rxdesc16)); 5654 + 5655 + switch (rx_desc->rpt_sel) { 5656 + case 1: 5657 + dev_dbg(dev, "C2H TX report type 1\n"); 5658 + 5659 + break; 5660 + case 2: 5661 + dev_dbg(dev, "C2H TX report type 2\n"); 5662 + 5663 + rtl8188e_handle_ra_tx_report2(priv, skb); 5664 + 5665 + break; 5666 + case 3: 5667 + dev_dbg(dev, "C2H USB interrupt report\n"); 5668 + 5669 + break; 5670 + default: 5671 + dev_warn(dev, "%s: rpt_sel should not be %d\n", 5672 + __func__, rx_desc->rpt_sel); 5673 + 5674 + break; 5675 + } 5676 + 5677 + dev_kfree_skb(skb); 5678 + } 5821 5679 } 5822 5680 5823 5681 int rtl8xxxu_parse_rxdesc16(struct rtl8xxxu_priv *priv, struct sk_buff *skb) ··· 5913 5695 5914 5696 skb_pull(skb, sizeof(struct rtl8xxxu_rxdesc16)); 5915 5697 5916 - phy_stats = (struct rtl8723au_phy_stats *)skb->data; 5917 - 5918 - skb_pull(skb, drvinfo_sz + desc_shift); 5919 - 5920 - skb_trim(skb, pkt_len); 5921 - 5922 - if (rx_desc->phy_stats) 5923 - rtl8xxxu_rx_parse_phystats(priv, rx_status, phy_stats, 5924 - rx_desc->rxmcs, (struct ieee80211_hdr *)skb->data, 5925 - rx_desc->crc32 || rx_desc->icverr); 5926 - 5927 - rx_status->mactime = rx_desc->tsfl; 5928 - rx_status->flag |= RX_FLAG_MACTIME_START; 5929 - 5930 - if (!rx_desc->swdec) 5931 - rx_status->flag |= RX_FLAG_DECRYPTED; 5932 - if (rx_desc->crc32) 5933 - rx_status->flag |= RX_FLAG_FAILED_FCS_CRC; 5934 - if (rx_desc->bw) 5935 - rx_status->bw = RATE_INFO_BW_40; 5936 - 5937 - if (rx_desc->rxht) { 5938 - rx_status->encoding = RX_ENC_HT; 5939 - rx_status->rate_idx = rx_desc->rxmcs - DESC_RATE_MCS0; 5698 + if (rx_desc->rpt_sel) { 5699 + skb_queue_tail(&priv->c2hcmd_queue, skb); 5700 + schedule_work(&priv->c2hcmd_work); 5940 5701 } else { 5941 - rx_status->rate_idx = rx_desc->rxmcs; 5702 + phy_stats = (struct rtl8723au_phy_stats *)skb->data; 5703 + 5704 + skb_pull(skb, drvinfo_sz + desc_shift); 5705 + 5706 + skb_trim(skb, pkt_len); 5707 + 5708 + if (rx_desc->phy_stats) 5709 + rtl8xxxu_rx_parse_phystats( 5710 + priv, rx_status, phy_stats, 5711 + rx_desc->rxmcs, 5712 + (struct ieee80211_hdr *)skb->data, 5713 + rx_desc->crc32 || rx_desc->icverr); 5714 + 5715 + rx_status->mactime = rx_desc->tsfl; 5716 + rx_status->flag |= RX_FLAG_MACTIME_START; 5717 + 5718 + if (!rx_desc->swdec) 5719 + rx_status->flag |= RX_FLAG_DECRYPTED; 5720 + if (rx_desc->crc32) 5721 + rx_status->flag |= RX_FLAG_FAILED_FCS_CRC; 5722 + if (rx_desc->bw) 5723 + rx_status->bw = RATE_INFO_BW_40; 5724 + 5725 + if (rx_desc->rxht) { 5726 + rx_status->encoding = RX_ENC_HT; 5727 + rx_status->rate_idx = rx_desc->rxmcs - DESC_RATE_MCS0; 5728 + } else { 5729 + rx_status->rate_idx = rx_desc->rxmcs; 5730 + } 5731 + 5732 + rx_status->freq = hw->conf.chandef.chan->center_freq; 5733 + rx_status->band = hw->conf.chandef.chan->band; 5734 + 5735 + ieee80211_rx_irqsafe(hw, skb); 5942 5736 } 5943 - 5944 - rx_status->freq = hw->conf.chandef.chan->center_freq; 5945 - rx_status->band = hw->conf.chandef.chan->band; 5946 - 5947 - ieee80211_rx_irqsafe(hw, skb); 5948 5737 5949 5738 skb = next_skb; 5950 5739 if (skb) ··· 6181 5956 { 6182 5957 struct rtl8xxxu_priv *priv = hw->priv; 6183 5958 struct device *dev = &priv->udev->dev; 6184 - u16 val16; 6185 5959 int ret = 0, channel; 6186 5960 bool ht40; 6187 5961 ··· 6189 5965 "%s: channel: %i (changed %08x chandef.width %02x)\n", 6190 5966 __func__, hw->conf.chandef.chan->hw_value, 6191 5967 changed, hw->conf.chandef.width); 6192 - 6193 - if (changed & IEEE80211_CONF_CHANGE_RETRY_LIMITS) { 6194 - val16 = ((hw->conf.long_frame_max_tx_count << 6195 - RETRY_LIMIT_LONG_SHIFT) & RETRY_LIMIT_LONG_MASK) | 6196 - ((hw->conf.short_frame_max_tx_count << 6197 - RETRY_LIMIT_SHORT_SHIFT) & RETRY_LIMIT_SHORT_MASK); 6198 - rtl8xxxu_write16(priv, REG_RETRY_LIMIT, val16); 6199 - } 6200 5968 6201 5969 if (changed & IEEE80211_CONF_CHANGE_CHANNEL) { 6202 5970 switch (hw->conf.chandef.width) { ··· 6720 6504 6721 6505 signal = ieee80211_ave_rssi(vif); 6722 6506 6507 + priv->fops->report_rssi(priv, 0, 6508 + rtl8xxxu_signal_to_snr(signal)); 6509 + 6723 6510 if (priv->fops->set_crystal_cap) 6724 6511 rtl8xxxu_track_cfo(priv); 6725 6512 ··· 6806 6587 rtl8xxxu_write16(priv, REG_RXFLTMAP2, 0xffff); 6807 6588 rtl8xxxu_write16(priv, REG_RXFLTMAP0, 0xffff); 6808 6589 6809 - rtl8xxxu_write32(priv, REG_OFDM0_XA_AGC_CORE1, 0x6954341e); 6590 + if (priv->rtl_chip == RTL8188E) 6591 + rtl8xxxu_write32(priv, REG_OFDM0_XA_AGC_CORE1, 0x6955341e); 6592 + else 6593 + rtl8xxxu_write32(priv, REG_OFDM0_XA_AGC_CORE1, 0x6954341e); 6810 6594 6811 6595 return ret; 6812 6596 ··· 6976 6754 case 0x817f: 6977 6755 case 0x818b: 6978 6756 case 0xf179: 6757 + case 0x8179: 6979 6758 untested = 0; 6980 6759 break; 6981 6760 } ··· 7032 6809 spin_lock_init(&priv->rx_urb_lock); 7033 6810 INIT_WORK(&priv->rx_urb_wq, rtl8xxxu_rx_urb_work); 7034 6811 INIT_DELAYED_WORK(&priv->ra_watchdog, rtl8xxxu_watchdog_callback); 7035 - INIT_WORK(&priv->c2hcmd_work, rtl8xxxu_c2hcmd_callback); 7036 6812 skb_queue_head_init(&priv->c2hcmd_queue); 7037 6813 7038 6814 usb_set_intfdata(interface, hw); ··· 7049 6827 hw->wiphy->available_antennas_tx = BIT(priv->tx_paths) - 1; 7050 6828 hw->wiphy->available_antennas_rx = BIT(priv->rx_paths) - 1; 7051 6829 6830 + if (priv->rtl_chip == RTL8188E) 6831 + INIT_WORK(&priv->c2hcmd_work, rtl8188e_c2hcmd_callback); 6832 + else 6833 + INIT_WORK(&priv->c2hcmd_work, rtl8xxxu_c2hcmd_callback); 6834 + 7052 6835 ret = rtl8xxxu_read_efuse(priv); 7053 6836 if (ret) { 7054 6837 dev_err(&udev->dev, "Fatal - failed to read EFuse\n"); ··· 7065 6838 dev_err(&udev->dev, "Fatal - failed to parse EFuse\n"); 7066 6839 goto err_set_intfdata; 7067 6840 } 6841 + 6842 + if (rtl8xxxu_debug & RTL8XXXU_DEBUG_EFUSE) 6843 + rtl8xxxu_dump_efuse(priv); 7068 6844 7069 6845 rtl8xxxu_print_chipinfo(priv); 7070 6846 ··· 7117 6887 7118 6888 hw->extra_tx_headroom = priv->fops->tx_desc_size; 7119 6889 ieee80211_hw_set(hw, SIGNAL_DBM); 6890 + 7120 6891 /* 7121 - * The firmware handles rate control 6892 + * The firmware handles rate control, except for RTL8188EU, 6893 + * where we handle the rate control in the driver. 7122 6894 */ 7123 6895 ieee80211_hw_set(hw, HAS_RATE_CONTROL); 7124 6896 ieee80211_hw_set(hw, SUPPORT_FAST_XMIT); ··· 7205 6973 /* RTL8188FU */ 7206 6974 {USB_DEVICE_AND_INTERFACE_INFO(USB_VENDOR_ID_REALTEK, 0xf179, 0xff, 0xff, 0xff), 7207 6975 .driver_info = (unsigned long)&rtl8188fu_fops}, 6976 + {USB_DEVICE_AND_INTERFACE_INFO(USB_VENDOR_ID_REALTEK, 0x8179, 0xff, 0xff, 0xff), 6977 + .driver_info = (unsigned long)&rtl8188eu_fops}, 6978 + /* Tested by Hans de Goede - rtl8188etv */ 6979 + {USB_DEVICE_AND_INTERFACE_INFO(USB_VENDOR_ID_REALTEK, 0x0179, 0xff, 0xff, 0xff), 6980 + .driver_info = (unsigned long)&rtl8188eu_fops}, 6981 + /* Sitecom rtl8188eus */ 6982 + {USB_DEVICE_AND_INTERFACE_INFO(0x0df6, 0x0076, 0xff, 0xff, 0xff), 6983 + .driver_info = (unsigned long)&rtl8188eu_fops}, 6984 + /* D-Link USB-GO-N150 */ 6985 + {USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x3311, 0xff, 0xff, 0xff), 6986 + .driver_info = (unsigned long)&rtl8188eu_fops}, 6987 + /* D-Link DWA-125 REV D1 */ 6988 + {USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x330f, 0xff, 0xff, 0xff), 6989 + .driver_info = (unsigned long)&rtl8188eu_fops}, 6990 + /* D-Link DWA-123 REV D1 */ 6991 + {USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x3310, 0xff, 0xff, 0xff), 6992 + .driver_info = (unsigned long)&rtl8188eu_fops}, 6993 + /* D-Link DWA-121 rev B1 */ 6994 + {USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x331b, 0xff, 0xff, 0xff), 6995 + .driver_info = (unsigned long)&rtl8188eu_fops}, 6996 + /* Abocom - Abocom */ 6997 + {USB_DEVICE_AND_INTERFACE_INFO(0x07b8, 0x8179, 0xff, 0xff, 0xff), 6998 + .driver_info = (unsigned long)&rtl8188eu_fops}, 6999 + /* Elecom WDC-150SU2M */ 7000 + {USB_DEVICE_AND_INTERFACE_INFO(0x056e, 0x4008, 0xff, 0xff, 0xff), 7001 + .driver_info = (unsigned long)&rtl8188eu_fops}, 7002 + /* TP-Link TL-WN722N v2 */ 7003 + {USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x010c, 0xff, 0xff, 0xff), 7004 + .driver_info = (unsigned long)&rtl8188eu_fops}, 7005 + /* TP-Link TL-WN727N v5.21 */ 7006 + {USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x0111, 0xff, 0xff, 0xff), 7007 + .driver_info = (unsigned long)&rtl8188eu_fops}, 7008 + /* MERCUSYS MW150US v2 */ 7009 + {USB_DEVICE_AND_INTERFACE_INFO(0x2c4e, 0x0102, 0xff, 0xff, 0xff), 7010 + .driver_info = (unsigned long)&rtl8188eu_fops}, 7011 + /* ASUS USB-N10 Nano B1 */ 7012 + {USB_DEVICE_AND_INTERFACE_INFO(0x0b05, 0x18f0, 0xff, 0xff, 0xff), 7013 + .driver_info = (unsigned long)&rtl8188eu_fops}, 7014 + /* Edimax EW-7811Un V2 */ 7015 + {USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0xb811, 0xff, 0xff, 0xff), 7016 + .driver_info = (unsigned long)&rtl8188eu_fops}, 7017 + /* Rosewill USB-N150 Nano */ 7018 + {USB_DEVICE_AND_INTERFACE_INFO(USB_VENDOR_ID_REALTEK, 0xffef, 0xff, 0xff, 0xff), 7019 + .driver_info = (unsigned long)&rtl8188eu_fops}, 7208 7020 #ifdef CONFIG_RTL8XXXU_UNTESTED 7209 7021 /* Still supported by rtlwifi */ 7210 7022 {USB_DEVICE_AND_INTERFACE_INFO(USB_VENDOR_ID_REALTEK, 0x8176, 0xff, 0xff, 0xff),
+38 -2
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_regs.h
··· 371 371 #define PBP_PAGE_SIZE_512 0x3 372 372 #define PBP_PAGE_SIZE_1024 0x4 373 373 374 + /* 8188eu IOL magic */ 375 + #define REG_PKT_BUF_ACCESS_CTRL 0x0106 376 + #define PKT_BUF_ACCESS_CTRL_TX 0x69 377 + #define PKT_BUF_ACCESS_CTRL_RX 0xa5 378 + 374 379 #define REG_TRXDMA_CTRL 0x010c 375 380 #define TRXDMA_CTRL_RXDMA_AGG_EN BIT(2) 376 381 #define TRXDMA_CTRL_VOQ_SHIFT 4 ··· 412 407 #define REG_MBIST_START 0x0174 413 408 #define REG_MBIST_DONE 0x0178 414 409 #define REG_MBIST_FAIL 0x017c 410 + /* 8188EU */ 411 + #define REG_32K_CTRL 0x0194 415 412 #define REG_C2HEVT_MSG_NORMAL 0x01a0 416 413 /* 8192EU/8723BU/8812 */ 417 414 #define REG_C2HEVT_CMD_ID_8723B 0x01ae ··· 949 942 #define REG_FPGA1_RF_MODE 0x0900 950 943 951 944 #define REG_FPGA1_TX_INFO 0x090c 945 + #define FPGA1_TX_ANT_MASK 0x0000000f 946 + #define FPGA1_TX_ANT_L_MASK 0x000000f0 947 + #define FPGA1_TX_ANT_NON_HT_MASK 0x00000f00 948 + #define FPGA1_TX_ANT_HT1_MASK 0x0000f000 949 + #define FPGA1_TX_ANT_HT2_MASK 0x000f0000 950 + #define FPGA1_TX_ANT_HT_S1_MASK 0x00f00000 951 + #define FPGA1_TX_ANT_NON_HT_S1_MASK 0x0f000000 952 + #define FPGA1_TX_OFDM_TXSC_MASK 0x30000000 953 + 954 + #define REG_ANT_MAPPING1 0x0914 952 955 #define REG_DPDT_CTRL 0x092c /* 8723BU */ 953 956 #define REG_RFE_CTRL_ANTA_SRC 0x0930 /* 8723BU */ 954 957 #define REG_RFE_PATH_SELECT 0x0940 /* 8723BU */ ··· 971 954 972 955 #define REG_CCK0_AFE_SETTING 0x0a04 973 956 #define CCK0_AFE_RX_MASK 0x0f000000 974 - #define CCK0_AFE_RX_ANT_AB BIT(24) 957 + #define CCK0_AFE_TX_MASK 0xf0000000 975 958 #define CCK0_AFE_RX_ANT_A 0 976 - #define CCK0_AFE_RX_ANT_B (BIT(24) | BIT(26)) 959 + #define CCK0_AFE_RX_ANT_B BIT(26) 960 + #define CCK0_AFE_RX_ANT_C BIT(27) 961 + #define CCK0_AFE_RX_ANT_D (BIT(26) | BIT(27)) 962 + #define CCK0_AFE_RX_ANT_OPTION_A 0 963 + #define CCK0_AFE_RX_ANT_OPTION_B BIT(24) 964 + #define CCK0_AFE_RX_ANT_OPTION_C BIT(25) 965 + #define CCK0_AFE_RX_ANT_OPTION_D (BIT(24) | BIT(25)) 966 + #define CCK0_AFE_TX_ANT_A BIT(31) 967 + #define CCK0_AFE_TX_ANT_B BIT(30) 968 + 969 + #define REG_CCK_ANTDIV_PARA2 0x0a04 970 + #define REG_BB_POWER_SAVE4 0x0a74 971 + 972 + /* 8188eu */ 973 + #define REG_LNA_SWITCH 0x0b2c 974 + #define LNA_SWITCH_DISABLE_CSCG BIT(22) 975 + #define LNA_SWITCH_OUTPUT_CG BIT(31) 977 976 978 977 #define REG_CCK_PD_THRESH 0x0a0a 979 978 #define CCK_PD_TYPE1_LV0_TH 0x40 ··· 1052 1019 #define REG_OFDM0_XD_TX_AFE 0x0c9c 1053 1020 1054 1021 #define REG_OFDM0_RX_IQ_EXT_ANTA 0x0ca0 1022 + 1023 + /* 8188eu */ 1024 + #define REG_ANTDIV_PARA1 0x0ca4 1055 1025 1056 1026 /* 8723bu */ 1057 1027 #define REG_OFDM0_TX_PSDO_NOISE_WEIGHT 0x0ce4
+5 -1
drivers/net/wireless/realtek/rtlwifi/rtl8188ee/hw.c
··· 68 68 struct rtl_priv *rtlpriv = rtl_priv(hw); 69 69 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 70 70 struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[BEACON_QUEUE]; 71 + struct sk_buff_head free_list; 71 72 unsigned long flags; 72 73 74 + skb_queue_head_init(&free_list); 73 75 spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags); 74 76 while (skb_queue_len(&ring->queue)) { 75 77 struct rtl_tx_desc *entry = &ring->desc[ring->idx]; ··· 81 79 rtlpriv->cfg->ops->get_desc(hw, (u8 *)entry, 82 80 true, HW_DESC_TXBUFF_ADDR), 83 81 skb->len, DMA_TO_DEVICE); 84 - kfree_skb(skb); 82 + __skb_queue_tail(&free_list, skb); 85 83 ring->idx = (ring->idx + 1) % ring->entries; 86 84 } 87 85 spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags); 86 + 87 + __skb_queue_purge(&free_list); 88 88 } 89 89 90 90 static void _rtl88ee_disable_bcn_sub_func(struct ieee80211_hw *hw)
+1 -1
drivers/net/wireless/realtek/rtlwifi/rtl8723ae/hal_bt_coexist.h
··· 116 116 long rtl8723e_dm_bt_get_rx_ss(struct ieee80211_hw *hw); 117 117 void rtl8723e_dm_bt_balance(struct ieee80211_hw *hw, 118 118 bool balance_on, u8 ms0, u8 ms1); 119 - void rtl8723e_dm_bt_agc_table(struct ieee80211_hw *hw, u8 tyep); 119 + void rtl8723e_dm_bt_agc_table(struct ieee80211_hw *hw, u8 type); 120 120 void rtl8723e_dm_bt_bb_back_off_level(struct ieee80211_hw *hw, u8 type); 121 121 u8 rtl8723e_dm_bt_check_coex_rssi_state(struct ieee80211_hw *hw, 122 122 u8 level_num, u8 rssi_thresh,
+5 -1
drivers/net/wireless/realtek/rtlwifi/rtl8723be/hw.c
··· 30 30 struct rtl_priv *rtlpriv = rtl_priv(hw); 31 31 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 32 32 struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[BEACON_QUEUE]; 33 + struct sk_buff_head free_list; 33 34 unsigned long flags; 34 35 36 + skb_queue_head_init(&free_list); 35 37 spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags); 36 38 while (skb_queue_len(&ring->queue)) { 37 39 struct rtl_tx_desc *entry = &ring->desc[ring->idx]; ··· 43 41 rtlpriv->cfg->ops->get_desc(hw, (u8 *)entry, 44 42 true, HW_DESC_TXBUFF_ADDR), 45 43 skb->len, DMA_TO_DEVICE); 46 - kfree_skb(skb); 44 + __skb_queue_tail(&free_list, skb); 47 45 ring->idx = (ring->idx + 1) % ring->entries; 48 46 } 49 47 spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags); 48 + 49 + __skb_queue_purge(&free_list); 50 50 } 51 51 52 52 static void _rtl8723be_set_bcn_ctrl_reg(struct ieee80211_hw *hw,
+5 -1
drivers/net/wireless/realtek/rtlwifi/rtl8821ae/hw.c
··· 26 26 struct rtl_priv *rtlpriv = rtl_priv(hw); 27 27 struct rtl_pci *rtlpci = rtl_pcidev(rtl_pcipriv(hw)); 28 28 struct rtl8192_tx_ring *ring = &rtlpci->tx_ring[BEACON_QUEUE]; 29 + struct sk_buff_head free_list; 29 30 unsigned long flags; 30 31 32 + skb_queue_head_init(&free_list); 31 33 spin_lock_irqsave(&rtlpriv->locks.irq_th_lock, flags); 32 34 while (skb_queue_len(&ring->queue)) { 33 35 struct rtl_tx_desc *entry = &ring->desc[ring->idx]; ··· 39 37 rtlpriv->cfg->ops->get_desc(hw, (u8 *)entry, 40 38 true, HW_DESC_TXBUFF_ADDR), 41 39 skb->len, DMA_TO_DEVICE); 42 - kfree_skb(skb); 40 + __skb_queue_tail(&free_list, skb); 43 41 ring->idx = (ring->idx + 1) % ring->entries; 44 42 } 45 43 spin_unlock_irqrestore(&rtlpriv->locks.irq_th_lock, flags); 44 + 45 + __skb_queue_purge(&free_list); 46 46 } 47 47 48 48 static void _rtl8821ae_set_bcn_ctrl_reg(struct ieee80211_hw *hw,
+20 -32
drivers/net/wireless/realtek/rtlwifi/rtl8821ae/phy.c
··· 1598 1598 return true; 1599 1599 } 1600 1600 1601 - static bool _rtl8812ae_eq_n_byte(const char *str1, const char *str2, u32 num) 1602 - { 1603 - if (num == 0) 1604 - return false; 1605 - while (num > 0) { 1606 - num--; 1607 - if (str1[num] != str2[num]) 1608 - return false; 1609 - } 1610 - return true; 1611 - } 1612 - 1613 1601 static s8 _rtl8812ae_phy_get_chnl_idx_of_txpwr_lmt(struct ieee80211_hw *hw, 1614 1602 u8 band, u8 channel) 1615 1603 { ··· 1647 1659 power_limit = power_limit > MAX_POWER_INDEX ? 1648 1660 MAX_POWER_INDEX : power_limit; 1649 1661 1650 - if (_rtl8812ae_eq_n_byte(pregulation, "FCC", 3)) 1662 + if (strcmp(pregulation, "FCC") == 0) 1651 1663 regulation = 0; 1652 - else if (_rtl8812ae_eq_n_byte(pregulation, "MKK", 3)) 1664 + else if (strcmp(pregulation, "MKK") == 0) 1653 1665 regulation = 1; 1654 - else if (_rtl8812ae_eq_n_byte(pregulation, "ETSI", 4)) 1666 + else if (strcmp(pregulation, "ETSI") == 0) 1655 1667 regulation = 2; 1656 - else if (_rtl8812ae_eq_n_byte(pregulation, "WW13", 4)) 1668 + else if (strcmp(pregulation, "WW13") == 0) 1657 1669 regulation = 3; 1658 1670 1659 - if (_rtl8812ae_eq_n_byte(prate_section, "CCK", 3)) 1671 + if (strcmp(prate_section, "CCK") == 0) 1660 1672 rate_section = 0; 1661 - else if (_rtl8812ae_eq_n_byte(prate_section, "OFDM", 4)) 1673 + else if (strcmp(prate_section, "OFDM") == 0) 1662 1674 rate_section = 1; 1663 - else if (_rtl8812ae_eq_n_byte(prate_section, "HT", 2) && 1664 - _rtl8812ae_eq_n_byte(prf_path, "1T", 2)) 1675 + else if (strcmp(prate_section, "HT") == 0 && 1676 + strcmp(prf_path, "1T") == 0) 1665 1677 rate_section = 2; 1666 - else if (_rtl8812ae_eq_n_byte(prate_section, "HT", 2) && 1667 - _rtl8812ae_eq_n_byte(prf_path, "2T", 2)) 1678 + else if (strcmp(prate_section, "HT") == 0 && 1679 + strcmp(prf_path, "2T") == 0) 1668 1680 rate_section = 3; 1669 - else if (_rtl8812ae_eq_n_byte(prate_section, "VHT", 3) && 1670 - _rtl8812ae_eq_n_byte(prf_path, "1T", 2)) 1681 + else if (strcmp(prate_section, "VHT") == 0 && 1682 + strcmp(prf_path, "1T") == 0) 1671 1683 rate_section = 4; 1672 - else if (_rtl8812ae_eq_n_byte(prate_section, "VHT", 3) && 1673 - _rtl8812ae_eq_n_byte(prf_path, "2T", 2)) 1684 + else if (strcmp(prate_section, "VHT") == 0 && 1685 + strcmp(prf_path, "2T") == 0) 1674 1686 rate_section = 5; 1675 1687 1676 - if (_rtl8812ae_eq_n_byte(pbandwidth, "20M", 3)) 1688 + if (strcmp(pbandwidth, "20M") == 0) 1677 1689 bandwidth = 0; 1678 - else if (_rtl8812ae_eq_n_byte(pbandwidth, "40M", 3)) 1690 + else if (strcmp(pbandwidth, "40M") == 0) 1679 1691 bandwidth = 1; 1680 - else if (_rtl8812ae_eq_n_byte(pbandwidth, "80M", 3)) 1692 + else if (strcmp(pbandwidth, "80M") == 0) 1681 1693 bandwidth = 2; 1682 - else if (_rtl8812ae_eq_n_byte(pbandwidth, "160M", 4)) 1694 + else if (strcmp(pbandwidth, "160M") == 0) 1683 1695 bandwidth = 3; 1684 1696 1685 - if (_rtl8812ae_eq_n_byte(pband, "2.4G", 4)) { 1697 + if (strcmp(pband, "2.4G") == 0) { 1686 1698 ret = _rtl8812ae_phy_get_chnl_idx_of_txpwr_lmt(hw, 1687 1699 BAND_ON_2_4G, 1688 1700 channel); ··· 1706 1718 regulation, bandwidth, rate_section, channel_index, 1707 1719 rtlphy->txpwr_limit_2_4g[regulation][bandwidth] 1708 1720 [rate_section][channel_index][RF90_PATH_A]); 1709 - } else if (_rtl8812ae_eq_n_byte(pband, "5G", 2)) { 1721 + } else if (strcmp(pband, "5G") == 0) { 1710 1722 ret = _rtl8812ae_phy_get_chnl_idx_of_txpwr_lmt(hw, 1711 1723 BAND_ON_5G, 1712 1724 channel);
+7 -6
drivers/net/wireless/realtek/rtw88/bf.c
··· 49 49 50 50 sta = ieee80211_find_sta(vif, bssid); 51 51 if (!sta) { 52 + rcu_read_unlock(); 53 + 52 54 rtw_warn(rtwdev, "failed to find station entry for bss %pM\n", 53 55 bssid); 54 - goto out_unlock; 56 + return; 55 57 } 56 58 57 59 ic_vht_cap = &hw->wiphy->bands[NL80211_BAND_5GHZ]->vht_cap; 58 60 vht_cap = &sta->deflink.vht_cap; 59 61 62 + rcu_read_unlock(); 63 + 60 64 if ((ic_vht_cap->cap & IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE) && 61 65 (vht_cap->cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE)) { 62 66 if (bfinfo->bfer_mu_cnt >= chip->bfer_mu_max_num) { 63 67 rtw_dbg(rtwdev, RTW_DBG_BF, "mu bfer number over limit\n"); 64 - goto out_unlock; 68 + return; 65 69 } 66 70 67 71 ether_addr_copy(bfee->mac_addr, bssid); ··· 79 75 (vht_cap->cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)) { 80 76 if (bfinfo->bfer_su_cnt >= chip->bfer_su_max_num) { 81 77 rtw_dbg(rtwdev, RTW_DBG_BF, "su bfer number over limit\n"); 82 - goto out_unlock; 78 + return; 83 79 } 84 80 85 81 sound_dim = vht_cap->cap & ··· 102 98 103 99 rtw_chip_config_bfee(rtwdev, rtwvif, bfee, true); 104 100 } 105 - 106 - out_unlock: 107 - rcu_read_unlock(); 108 101 } 109 102 110 103 void rtw_bf_init_bfer_entry_mu(struct rtw_dev *rtwdev,
+3 -1
drivers/net/wireless/realtek/rtw88/mac80211.c
··· 737 737 br_data.rtwdev = rtwdev; 738 738 br_data.vif = vif; 739 739 br_data.mask = mask; 740 - rtw_iterate_stas_atomic(rtwdev, rtw_ra_mask_info_update_iter, &br_data); 740 + rtw_iterate_stas(rtwdev, rtw_ra_mask_info_update_iter, &br_data); 741 741 } 742 742 743 743 static int rtw_ops_set_bitrate_mask(struct ieee80211_hw *hw, ··· 746 746 { 747 747 struct rtw_dev *rtwdev = hw->priv; 748 748 749 + mutex_lock(&rtwdev->mutex); 749 750 rtw_ra_mask_info_update(rtwdev, vif, mask); 751 + mutex_unlock(&rtwdev->mutex); 750 752 751 753 return 0; 752 754 }
+4 -2
drivers/net/wireless/realtek/rtw88/main.c
··· 241 241 rtw_phy_dynamic_mechanism(rtwdev); 242 242 243 243 data.rtwdev = rtwdev; 244 - /* use atomic version to avoid taking local->iflist_mtx mutex */ 245 - rtw_iterate_vifs_atomic(rtwdev, rtw_vif_watch_dog_iter, &data); 244 + /* rtw_iterate_vifs internally uses an atomic iterator which is needed 245 + * to avoid taking local->iflist_mtx mutex 246 + */ 247 + rtw_iterate_vifs(rtwdev, rtw_vif_watch_dog_iter, &data); 246 248 247 249 /* fw supports only one station associated to enter lps, if there are 248 250 * more than two stations associated to the AP, then we can not enter
+1118 -569
drivers/net/wireless/realtek/rtw89/coex.c
··· 120 120 0xfafadafa /* 19 */ 121 121 }; 122 122 123 + static const struct rtw89_btc_ver rtw89_btc_ver_defs[] = { 124 + /* firmware version must be in decreasing order for each chip */ 125 + {RTL8852C, RTW89_FW_VER_CODE(0, 27, 57, 0), 126 + .fcxbtcrpt = 4, .fcxtdma = 3, .fcxslots = 1, .fcxcysta = 3, 127 + .fcxstep = 3, .fcxnullsta = 2, .fcxmreg = 1, .fcxgpiodbg = 1, 128 + .fcxbtver = 1, .fcxbtscan = 1, .fcxbtafh = 2, .fcxbtdevinfo = 1, 129 + .fwlrole = 1, .frptmap = 3, .fcxctrl = 1, 130 + .info_buf = 1280, .max_role_num = 5, 131 + }, 132 + {RTL8852C, RTW89_FW_VER_CODE(0, 27, 42, 0), 133 + .fcxbtcrpt = 4, .fcxtdma = 3, .fcxslots = 1, .fcxcysta = 3, 134 + .fcxstep = 3, .fcxnullsta = 2, .fcxmreg = 1, .fcxgpiodbg = 1, 135 + .fcxbtver = 1, .fcxbtscan = 1, .fcxbtafh = 2, .fcxbtdevinfo = 1, 136 + .fwlrole = 1, .frptmap = 2, .fcxctrl = 1, 137 + .info_buf = 1280, .max_role_num = 5, 138 + }, 139 + {RTL8852C, RTW89_FW_VER_CODE(0, 27, 0, 0), 140 + .fcxbtcrpt = 4, .fcxtdma = 3, .fcxslots = 1, .fcxcysta = 3, 141 + .fcxstep = 3, .fcxnullsta = 2, .fcxmreg = 1, .fcxgpiodbg = 1, 142 + .fcxbtver = 1, .fcxbtscan = 1, .fcxbtafh = 1, .fcxbtdevinfo = 1, 143 + .fwlrole = 1, .frptmap = 2, .fcxctrl = 1, 144 + .info_buf = 1280, .max_role_num = 5, 145 + }, 146 + {RTL8852B, RTW89_FW_VER_CODE(0, 29, 14, 0), 147 + .fcxbtcrpt = 5, .fcxtdma = 3, .fcxslots = 1, .fcxcysta = 4, 148 + .fcxstep = 3, .fcxnullsta = 2, .fcxmreg = 1, .fcxgpiodbg = 1, 149 + .fcxbtver = 1, .fcxbtscan = 1, .fcxbtafh = 2, .fcxbtdevinfo = 1, 150 + .fwlrole = 1, .frptmap = 3, .fcxctrl = 1, 151 + .info_buf = 1800, .max_role_num = 6, 152 + }, 153 + {RTL8852B, RTW89_FW_VER_CODE(0, 27, 0, 0), 154 + .fcxbtcrpt = 4, .fcxtdma = 3, .fcxslots = 1, .fcxcysta = 3, 155 + .fcxstep = 3, .fcxnullsta = 2, .fcxmreg = 1, .fcxgpiodbg = 1, 156 + .fcxbtver = 1, .fcxbtscan = 1, .fcxbtafh = 1, .fcxbtdevinfo = 1, 157 + .fwlrole = 1, .frptmap = 1, .fcxctrl = 1, 158 + .info_buf = 1280, .max_role_num = 5, 159 + }, 160 + {RTL8852A, RTW89_FW_VER_CODE(0, 13, 37, 0), 161 + .fcxbtcrpt = 4, .fcxtdma = 3, .fcxslots = 1, .fcxcysta = 3, 162 + .fcxstep = 3, .fcxnullsta = 2, .fcxmreg = 1, .fcxgpiodbg = 1, 163 + .fcxbtver = 1, .fcxbtscan = 1, .fcxbtafh = 2, .fcxbtdevinfo = 1, 164 + .fwlrole = 1, .frptmap = 3, .fcxctrl = 1, 165 + .info_buf = 1280, .max_role_num = 5, 166 + }, 167 + {RTL8852A, RTW89_FW_VER_CODE(0, 13, 0, 0), 168 + .fcxbtcrpt = 1, .fcxtdma = 1, .fcxslots = 1, .fcxcysta = 2, 169 + .fcxstep = 2, .fcxnullsta = 1, .fcxmreg = 1, .fcxgpiodbg = 1, 170 + .fcxbtver = 1, .fcxbtscan = 1, .fcxbtafh = 1, .fcxbtdevinfo = 1, 171 + .fwlrole = 0, .frptmap = 0, .fcxctrl = 0, 172 + .info_buf = 1024, .max_role_num = 5, 173 + }, 174 + 175 + /* keep it to be the last as default entry */ 176 + {0, RTW89_FW_VER_CODE(0, 0, 0, 0), 177 + .fcxbtcrpt = 1, .fcxtdma = 1, .fcxslots = 1, .fcxcysta = 2, 178 + .fcxstep = 2, .fcxnullsta = 1, .fcxmreg = 1, .fcxgpiodbg = 1, 179 + .fcxbtver = 1, .fcxbtscan = 1, .fcxbtafh = 1, .fcxbtdevinfo = 1, 180 + .fwlrole = 0, .frptmap = 0, .fcxctrl = 0, 181 + .info_buf = 1024, .max_role_num = 5, 182 + }, 183 + }; 184 + 185 + #define RTW89_DEFAULT_BTC_VER_IDX (ARRAY_SIZE(rtw89_btc_ver_defs) - 1) 186 + 123 187 struct rtw89_btc_btf_tlv { 124 188 u8 type; 125 189 u8 len; ··· 191 127 } __packed; 192 128 193 129 enum btc_btf_set_report_en { 194 - RPT_EN_TDMA = BIT(0), 195 - RPT_EN_CYCLE = BIT(1), 196 - RPT_EN_MREG = BIT(2), 197 - RPT_EN_BT_VER_INFO = BIT(3), 198 - RPT_EN_BT_SCAN_INFO = BIT(4), 199 - RPT_EN_BT_AFH_MAP = BIT(5), 200 - RPT_EN_BT_DEVICE_INFO = BIT(6), 201 - RPT_EN_WL_ALL = GENMASK(2, 0), 202 - RPT_EN_BT_ALL = GENMASK(6, 3), 203 - RPT_EN_ALL = GENMASK(6, 0), 130 + RPT_EN_TDMA, 131 + RPT_EN_CYCLE, 132 + RPT_EN_MREG, 133 + RPT_EN_BT_VER_INFO, 134 + RPT_EN_BT_SCAN_INFO, 135 + RPT_EN_BT_DEVICE_INFO, 136 + RPT_EN_BT_AFH_MAP, 137 + RPT_EN_BT_AFH_MAP_LE, 138 + RPT_EN_FW_STEP_INFO, 139 + RPT_EN_TEST, 140 + RPT_EN_WL_ALL, 141 + RPT_EN_BT_ALL, 142 + RPT_EN_ALL, 143 + RPT_EN_MONITER, 204 144 }; 205 145 206 146 #define BTF_SET_REPORT_VER 1 ··· 854 786 static void _update_bt_report(struct rtw89_dev *rtwdev, u8 rpt_type, u8 *pfinfo) 855 787 { 856 788 struct rtw89_btc *btc = &rtwdev->btc; 789 + const struct rtw89_btc_ver *ver = btc->ver; 857 790 struct rtw89_btc_bt_info *bt = &btc->cx.bt; 858 791 struct rtw89_btc_bt_link_info *bt_linfo = &bt->link_info; 859 792 struct rtw89_btc_bt_a2dp_desc *a2dp = &bt_linfo->a2dp_desc; 860 793 struct rtw89_btc_fbtc_btver *pver = NULL; 861 794 struct rtw89_btc_fbtc_btscan *pscan = NULL; 862 - struct rtw89_btc_fbtc_btafh *pafh = NULL; 795 + struct rtw89_btc_fbtc_btafh *pafh_v1 = NULL; 796 + struct rtw89_btc_fbtc_btafh_v2 *pafh_v2 = NULL; 863 797 struct rtw89_btc_fbtc_btdevinfo *pdev = NULL; 864 798 865 799 pver = (struct rtw89_btc_fbtc_btver *)pfinfo; 866 800 pscan = (struct rtw89_btc_fbtc_btscan *)pfinfo; 867 - pafh = (struct rtw89_btc_fbtc_btafh *)pfinfo; 868 801 pdev = (struct rtw89_btc_fbtc_btdevinfo *)pfinfo; 869 802 870 803 rtw89_debug(rtwdev, RTW89_DBG_BTC, ··· 882 813 memcpy(bt->scan_info, pscan->scan, BTC_SCAN_MAX1); 883 814 break; 884 815 case BTC_RPT_TYPE_BT_AFH: 885 - memcpy(&bt_linfo->afh_map[0], pafh->afh_l, 4); 886 - memcpy(&bt_linfo->afh_map[4], pafh->afh_m, 4); 887 - memcpy(&bt_linfo->afh_map[8], pafh->afh_h, 2); 816 + if (ver->fcxbtafh == 2) { 817 + pafh_v2 = (struct rtw89_btc_fbtc_btafh_v2 *)pfinfo; 818 + if (pafh_v2->map_type & RPT_BT_AFH_SEQ_LEGACY) { 819 + memcpy(&bt_linfo->afh_map[0], pafh_v2->afh_l, 4); 820 + memcpy(&bt_linfo->afh_map[4], pafh_v2->afh_m, 4); 821 + memcpy(&bt_linfo->afh_map[8], pafh_v2->afh_h, 2); 822 + } 823 + if (pafh_v2->map_type & RPT_BT_AFH_SEQ_LE) { 824 + memcpy(&bt_linfo->afh_map_le[0], pafh_v2->afh_le_a, 4); 825 + memcpy(&bt_linfo->afh_map_le[4], pafh_v2->afh_le_b, 1); 826 + } 827 + } else if (ver->fcxbtafh == 1) { 828 + pafh_v1 = (struct rtw89_btc_fbtc_btafh *)pfinfo; 829 + memcpy(&bt_linfo->afh_map[0], pafh_v1->afh_l, 4); 830 + memcpy(&bt_linfo->afh_map[4], pafh_v1->afh_m, 4); 831 + memcpy(&bt_linfo->afh_map[8], pafh_v1->afh_h, 2); 832 + } 888 833 break; 889 834 case BTC_RPT_TYPE_BT_DEVICE: 890 835 a2dp->device_name = le32_to_cpu(pdev->dev_name); ··· 908 825 default: 909 826 break; 910 827 } 911 - } 912 - 913 - struct rtw89_btc_fbtc_cysta_cpu { 914 - u8 fver; 915 - u8 rsvd; 916 - u16 cycles; 917 - u16 cycles_a2dp[CXT_FLCTRL_MAX]; 918 - u16 a2dpept; 919 - u16 a2dpeptto; 920 - u16 tavg_cycle[CXT_MAX]; 921 - u16 tmax_cycle[CXT_MAX]; 922 - u16 tmaxdiff_cycle[CXT_MAX]; 923 - u16 tavg_a2dp[CXT_FLCTRL_MAX]; 924 - u16 tmax_a2dp[CXT_FLCTRL_MAX]; 925 - u16 tavg_a2dpept; 926 - u16 tmax_a2dpept; 927 - u16 tavg_lk; 928 - u16 tmax_lk; 929 - u32 slot_cnt[CXST_MAX]; 930 - u32 bcn_cnt[CXBCN_MAX]; 931 - u32 leakrx_cnt; 932 - u32 collision_cnt; 933 - u32 skip_cnt; 934 - u32 exception; 935 - u32 except_cnt; 936 - u16 tslot_cycle[BTC_CYCLE_SLOT_MAX]; 937 - }; 938 - 939 - static void rtw89_btc_fbtc_cysta_to_cpu(const struct rtw89_btc_fbtc_cysta *src, 940 - struct rtw89_btc_fbtc_cysta_cpu *dst) 941 - { 942 - static_assert(sizeof(*src) == sizeof(*dst)); 943 - 944 - #define __CPY_U8(_x) ({dst->_x = src->_x; }) 945 - #define __CPY_LE16(_x) ({dst->_x = le16_to_cpu(src->_x); }) 946 - #define __CPY_LE16S(_x) ({int _i; for (_i = 0; _i < ARRAY_SIZE(dst->_x); _i++) \ 947 - dst->_x[_i] = le16_to_cpu(src->_x[_i]); }) 948 - #define __CPY_LE32(_x) ({dst->_x = le32_to_cpu(src->_x); }) 949 - #define __CPY_LE32S(_x) ({int _i; for (_i = 0; _i < ARRAY_SIZE(dst->_x); _i++) \ 950 - dst->_x[_i] = le32_to_cpu(src->_x[_i]); }) 951 - 952 - __CPY_U8(fver); 953 - __CPY_U8(rsvd); 954 - __CPY_LE16(cycles); 955 - __CPY_LE16S(cycles_a2dp); 956 - __CPY_LE16(a2dpept); 957 - __CPY_LE16(a2dpeptto); 958 - __CPY_LE16S(tavg_cycle); 959 - __CPY_LE16S(tmax_cycle); 960 - __CPY_LE16S(tmaxdiff_cycle); 961 - __CPY_LE16S(tavg_a2dp); 962 - __CPY_LE16S(tmax_a2dp); 963 - __CPY_LE16(tavg_a2dpept); 964 - __CPY_LE16(tmax_a2dpept); 965 - __CPY_LE16(tavg_lk); 966 - __CPY_LE16(tmax_lk); 967 - __CPY_LE32S(slot_cnt); 968 - __CPY_LE32S(bcn_cnt); 969 - __CPY_LE32(leakrx_cnt); 970 - __CPY_LE32(collision_cnt); 971 - __CPY_LE32(skip_cnt); 972 - __CPY_LE32(exception); 973 - __CPY_LE32(except_cnt); 974 - __CPY_LE16S(tslot_cycle); 975 - 976 - #undef __CPY_U8 977 - #undef __CPY_LE16 978 - #undef __CPY_LE16S 979 - #undef __CPY_LE32 980 - #undef __CPY_LE32S 981 828 } 982 829 983 830 #define BTC_LEAK_AP_TH 10 ··· 923 910 struct rtw89_btc_btf_fwinfo *pfwinfo, 924 911 u8 *prptbuf, u32 index) 925 912 { 926 - const struct rtw89_chip_info *chip = rtwdev->chip; 927 913 struct rtw89_btc *btc = &rtwdev->btc; 914 + const struct rtw89_btc_ver *ver = btc->ver; 928 915 struct rtw89_btc_dm *dm = &btc->dm; 929 916 struct rtw89_btc_rpt_cmn_info *pcinfo = NULL; 930 917 struct rtw89_btc_wl_info *wl = &btc->cx.wl; 931 918 struct rtw89_btc_bt_info *bt = &btc->cx.bt; 932 - struct rtw89_btc_fbtc_rpt_ctrl *prpt; 933 - struct rtw89_btc_fbtc_rpt_ctrl_v1 *prpt_v1; 934 - struct rtw89_btc_fbtc_cysta *pcysta_le32 = NULL; 935 - struct rtw89_btc_fbtc_cysta_v1 *pcysta_v1 = NULL; 936 - struct rtw89_btc_fbtc_cysta_cpu pcysta[1]; 919 + union rtw89_btc_fbtc_rpt_ctrl_ver_info *prpt = NULL; 920 + union rtw89_btc_fbtc_cysta_info *pcysta = NULL; 937 921 struct rtw89_btc_prpt *btc_prpt = NULL; 938 - struct rtw89_btc_fbtc_slot *rtp_slot = NULL; 939 922 void *rpt_content = NULL, *pfinfo = NULL; 940 923 u8 rpt_type = 0; 941 924 u16 wl_slot_set = 0, wl_slot_real = 0; ··· 960 951 switch (rpt_type) { 961 952 case BTC_RPT_TYPE_CTRL: 962 953 pcinfo = &pfwinfo->rpt_ctrl.cinfo; 963 - if (chip->chip_id == RTL8852A) { 964 - pfinfo = &pfwinfo->rpt_ctrl.finfo; 965 - pcinfo->req_len = sizeof(pfwinfo->rpt_ctrl.finfo); 954 + prpt = &pfwinfo->rpt_ctrl.finfo; 955 + if (ver->fcxbtcrpt == 1) { 956 + pfinfo = &pfwinfo->rpt_ctrl.finfo.v1; 957 + pcinfo->req_len = sizeof(pfwinfo->rpt_ctrl.finfo.v1); 958 + } else if (ver->fcxbtcrpt == 4) { 959 + pfinfo = &pfwinfo->rpt_ctrl.finfo.v4; 960 + pcinfo->req_len = sizeof(pfwinfo->rpt_ctrl.finfo.v4); 961 + } else if (ver->fcxbtcrpt == 5) { 962 + pfinfo = &pfwinfo->rpt_ctrl.finfo.v5; 963 + pcinfo->req_len = sizeof(pfwinfo->rpt_ctrl.finfo.v5); 966 964 } else { 967 - pfinfo = &pfwinfo->rpt_ctrl.finfo_v1; 968 - pcinfo->req_len = sizeof(pfwinfo->rpt_ctrl.finfo_v1); 965 + goto err; 969 966 } 970 - pcinfo->req_fver = chip->fcxbtcrpt_ver; 971 - pcinfo->rx_len = rpt_len; 972 - pcinfo->rx_cnt++; 967 + pcinfo->req_fver = ver->fcxbtcrpt; 973 968 break; 974 969 case BTC_RPT_TYPE_TDMA: 975 970 pcinfo = &pfwinfo->rpt_fbtc_tdma.cinfo; 976 - if (chip->chip_id == RTL8852A) { 977 - pfinfo = &pfwinfo->rpt_fbtc_tdma.finfo; 978 - pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_tdma.finfo); 971 + if (ver->fcxtdma == 1) { 972 + pfinfo = &pfwinfo->rpt_fbtc_tdma.finfo.v1; 973 + pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_tdma.finfo.v1); 974 + } else if (ver->fcxtdma == 3) { 975 + pfinfo = &pfwinfo->rpt_fbtc_tdma.finfo.v3; 976 + pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_tdma.finfo.v3); 979 977 } else { 980 - pfinfo = &pfwinfo->rpt_fbtc_tdma.finfo_v1; 981 - pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_tdma.finfo_v1); 978 + goto err; 982 979 } 983 - pcinfo->req_fver = chip->fcxtdma_ver; 984 - pcinfo->rx_len = rpt_len; 985 - pcinfo->rx_cnt++; 980 + pcinfo->req_fver = ver->fcxtdma; 986 981 break; 987 982 case BTC_RPT_TYPE_SLOT: 988 983 pcinfo = &pfwinfo->rpt_fbtc_slots.cinfo; 989 984 pfinfo = &pfwinfo->rpt_fbtc_slots.finfo; 990 985 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_slots.finfo); 991 - pcinfo->req_fver = chip->fcxslots_ver; 992 - pcinfo->rx_len = rpt_len; 993 - pcinfo->rx_cnt++; 986 + pcinfo->req_fver = ver->fcxslots; 994 987 break; 995 988 case BTC_RPT_TYPE_CYSTA: 996 989 pcinfo = &pfwinfo->rpt_fbtc_cysta.cinfo; 997 - if (chip->chip_id == RTL8852A) { 998 - pfinfo = &pfwinfo->rpt_fbtc_cysta.finfo; 999 - pcysta_le32 = &pfwinfo->rpt_fbtc_cysta.finfo; 1000 - rtw89_btc_fbtc_cysta_to_cpu(pcysta_le32, pcysta); 1001 - pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_cysta.finfo); 990 + pcysta = &pfwinfo->rpt_fbtc_cysta.finfo; 991 + if (ver->fcxcysta == 2) { 992 + pfinfo = &pfwinfo->rpt_fbtc_cysta.finfo.v2; 993 + pcysta->v2 = pfwinfo->rpt_fbtc_cysta.finfo.v2; 994 + pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_cysta.finfo.v2); 995 + } else if (ver->fcxcysta == 3) { 996 + pfinfo = &pfwinfo->rpt_fbtc_cysta.finfo.v3; 997 + pcysta->v3 = pfwinfo->rpt_fbtc_cysta.finfo.v3; 998 + pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_cysta.finfo.v3); 999 + } else if (ver->fcxcysta == 4) { 1000 + pfinfo = &pfwinfo->rpt_fbtc_cysta.finfo.v4; 1001 + pcysta->v4 = pfwinfo->rpt_fbtc_cysta.finfo.v4; 1002 + pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_cysta.finfo.v4); 1002 1003 } else { 1003 - pfinfo = &pfwinfo->rpt_fbtc_cysta.finfo_v1; 1004 - pcysta_v1 = &pfwinfo->rpt_fbtc_cysta.finfo_v1; 1005 - pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_cysta.finfo_v1); 1004 + goto err; 1006 1005 } 1007 - pcinfo->req_fver = chip->fcxcysta_ver; 1008 - pcinfo->rx_len = rpt_len; 1009 - pcinfo->rx_cnt++; 1006 + pcinfo->req_fver = ver->fcxcysta; 1010 1007 break; 1011 1008 case BTC_RPT_TYPE_STEP: 1012 1009 pcinfo = &pfwinfo->rpt_fbtc_step.cinfo; 1013 - if (chip->chip_id == RTL8852A) { 1014 - pfinfo = &pfwinfo->rpt_fbtc_step.finfo; 1015 - pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_step.finfo.step[0]) * 1010 + if (ver->fcxstep == 2) { 1011 + pfinfo = &pfwinfo->rpt_fbtc_step.finfo.v2; 1012 + pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_step.finfo.v2.step[0]) * 1016 1013 trace_step + 1017 - offsetof(struct rtw89_btc_fbtc_steps, step); 1014 + offsetof(struct rtw89_btc_fbtc_steps_v2, step); 1015 + } else if (ver->fcxstep == 3) { 1016 + pfinfo = &pfwinfo->rpt_fbtc_step.finfo.v3; 1017 + pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_step.finfo.v3.step[0]) * 1018 + trace_step + 1019 + offsetof(struct rtw89_btc_fbtc_steps_v3, step); 1018 1020 } else { 1019 - pfinfo = &pfwinfo->rpt_fbtc_step.finfo_v1; 1020 - pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_step.finfo_v1.step[0]) * 1021 - trace_step + 1022 - offsetof(struct rtw89_btc_fbtc_steps_v1, step); 1021 + goto err; 1023 1022 } 1024 - pcinfo->req_fver = chip->fcxstep_ver; 1025 - pcinfo->rx_len = rpt_len; 1026 - pcinfo->rx_cnt++; 1023 + pcinfo->req_fver = ver->fcxstep; 1027 1024 break; 1028 1025 case BTC_RPT_TYPE_NULLSTA: 1029 1026 pcinfo = &pfwinfo->rpt_fbtc_nullsta.cinfo; 1030 - if (chip->chip_id == RTL8852A) { 1027 + if (ver->fcxnullsta == 1) { 1031 1028 pfinfo = &pfwinfo->rpt_fbtc_nullsta.finfo; 1032 - pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_nullsta.finfo); 1029 + pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_nullsta.finfo.v1); 1030 + } else if (ver->fcxnullsta == 2) { 1031 + pfinfo = &pfwinfo->rpt_fbtc_nullsta.finfo.v2; 1032 + pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_nullsta.finfo.v2); 1033 1033 } else { 1034 - pfinfo = &pfwinfo->rpt_fbtc_nullsta.finfo_v1; 1035 - pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_nullsta.finfo_v1); 1034 + goto err; 1036 1035 } 1037 - pcinfo->req_fver = chip->fcxnullsta_ver; 1038 - pcinfo->rx_len = rpt_len; 1039 - pcinfo->rx_cnt++; 1036 + pcinfo->req_fver = ver->fcxnullsta; 1040 1037 break; 1041 1038 case BTC_RPT_TYPE_MREG: 1042 1039 pcinfo = &pfwinfo->rpt_fbtc_mregval.cinfo; 1043 1040 pfinfo = &pfwinfo->rpt_fbtc_mregval.finfo; 1044 1041 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_mregval.finfo); 1045 - pcinfo->req_fver = chip->fcxmreg_ver; 1046 - pcinfo->rx_len = rpt_len; 1047 - pcinfo->rx_cnt++; 1042 + pcinfo->req_fver = ver->fcxmreg; 1048 1043 break; 1049 1044 case BTC_RPT_TYPE_GPIO_DBG: 1050 1045 pcinfo = &pfwinfo->rpt_fbtc_gpio_dbg.cinfo; 1051 1046 pfinfo = &pfwinfo->rpt_fbtc_gpio_dbg.finfo; 1052 1047 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_gpio_dbg.finfo); 1053 - pcinfo->req_fver = chip->fcxgpiodbg_ver; 1054 - pcinfo->rx_len = rpt_len; 1055 - pcinfo->rx_cnt++; 1048 + pcinfo->req_fver = ver->fcxgpiodbg; 1056 1049 break; 1057 1050 case BTC_RPT_TYPE_BT_VER: 1058 1051 pcinfo = &pfwinfo->rpt_fbtc_btver.cinfo; 1059 1052 pfinfo = &pfwinfo->rpt_fbtc_btver.finfo; 1060 1053 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_btver.finfo); 1061 - pcinfo->req_fver = chip->fcxbtver_ver; 1062 - pcinfo->rx_len = rpt_len; 1063 - pcinfo->rx_cnt++; 1054 + pcinfo->req_fver = ver->fcxbtver; 1064 1055 break; 1065 1056 case BTC_RPT_TYPE_BT_SCAN: 1066 1057 pcinfo = &pfwinfo->rpt_fbtc_btscan.cinfo; 1067 1058 pfinfo = &pfwinfo->rpt_fbtc_btscan.finfo; 1068 1059 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_btscan.finfo); 1069 - pcinfo->req_fver = chip->fcxbtscan_ver; 1070 - pcinfo->rx_len = rpt_len; 1071 - pcinfo->rx_cnt++; 1060 + pcinfo->req_fver = ver->fcxbtscan; 1072 1061 break; 1073 1062 case BTC_RPT_TYPE_BT_AFH: 1074 1063 pcinfo = &pfwinfo->rpt_fbtc_btafh.cinfo; 1075 - pfinfo = &pfwinfo->rpt_fbtc_btafh.finfo; 1076 - pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_btafh.finfo); 1077 - pcinfo->req_fver = chip->fcxbtafh_ver; 1078 - pcinfo->rx_len = rpt_len; 1079 - pcinfo->rx_cnt++; 1064 + if (ver->fcxbtafh == 1) { 1065 + pfinfo = &pfwinfo->rpt_fbtc_btafh.finfo.v1; 1066 + pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_btafh.finfo.v1); 1067 + } else if (ver->fcxbtafh == 2) { 1068 + pfinfo = &pfwinfo->rpt_fbtc_btafh.finfo.v2; 1069 + pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_btafh.finfo.v2); 1070 + } else { 1071 + goto err; 1072 + } 1073 + pcinfo->req_fver = ver->fcxbtafh; 1080 1074 break; 1081 1075 case BTC_RPT_TYPE_BT_DEVICE: 1082 1076 pcinfo = &pfwinfo->rpt_fbtc_btdev.cinfo; 1083 1077 pfinfo = &pfwinfo->rpt_fbtc_btdev.finfo; 1084 1078 pcinfo->req_len = sizeof(pfwinfo->rpt_fbtc_btdev.finfo); 1085 - pcinfo->req_fver = chip->fcxbtdevinfo_ver; 1086 - pcinfo->rx_len = rpt_len; 1087 - pcinfo->rx_cnt++; 1079 + pcinfo->req_fver = ver->fcxbtdevinfo; 1088 1080 break; 1089 1081 default: 1090 1082 pfwinfo->err[BTFRE_UNDEF_TYPE]++; 1091 1083 return 0; 1092 1084 } 1085 + 1086 + pcinfo->rx_len = rpt_len; 1087 + pcinfo->rx_cnt++; 1093 1088 1094 1089 if (rpt_len != pcinfo->req_len) { 1095 1090 if (rpt_type < BTC_RPT_TYPE_MAX) ··· 1115 1102 memcpy(pfinfo, rpt_content, pcinfo->req_len); 1116 1103 pcinfo->valid = 1; 1117 1104 1118 - if (rpt_type == BTC_RPT_TYPE_TDMA && chip->chip_id == RTL8852A) { 1105 + switch (rpt_type) { 1106 + case BTC_RPT_TYPE_CTRL: 1107 + if (ver->fcxbtcrpt == 1) { 1108 + prpt->v1 = pfwinfo->rpt_ctrl.finfo.v1; 1109 + btc->fwinfo.rpt_en_map = prpt->v1.rpt_enable; 1110 + wl->ver_info.fw_coex = prpt->v1.wl_fw_coex_ver; 1111 + wl->ver_info.fw = prpt->v1.wl_fw_ver; 1112 + dm->wl_fw_cx_offload = !!prpt->v1.wl_fw_cx_offload; 1113 + 1114 + _chk_btc_err(rtwdev, BTC_DCNT_RPT_FREEZE, 1115 + pfwinfo->event[BTF_EVNT_RPT]); 1116 + 1117 + /* To avoid I/O if WL LPS or power-off */ 1118 + if (wl->status.map.lps != BTC_LPS_RF_OFF && 1119 + !wl->status.map.rf_off) { 1120 + rtwdev->chip->ops->btc_update_bt_cnt(rtwdev); 1121 + _chk_btc_err(rtwdev, BTC_DCNT_BTCNT_FREEZE, 0); 1122 + 1123 + btc->cx.cnt_bt[BTC_BCNT_POLUT] = 1124 + rtw89_mac_get_plt_cnt(rtwdev, 1125 + RTW89_MAC_0); 1126 + } 1127 + } else if (ver->fcxbtcrpt == 4) { 1128 + prpt->v4 = pfwinfo->rpt_ctrl.finfo.v4; 1129 + btc->fwinfo.rpt_en_map = le32_to_cpu(prpt->v4.rpt_info.en); 1130 + wl->ver_info.fw_coex = le32_to_cpu(prpt->v4.wl_fw_info.cx_ver); 1131 + wl->ver_info.fw = le32_to_cpu(prpt->v4.wl_fw_info.fw_ver); 1132 + dm->wl_fw_cx_offload = !!le32_to_cpu(prpt->v4.wl_fw_info.cx_offload); 1133 + 1134 + for (i = RTW89_PHY_0; i < RTW89_PHY_MAX; i++) 1135 + memcpy(&dm->gnt.band[i], &prpt->v4.gnt_val[i], 1136 + sizeof(dm->gnt.band[i])); 1137 + 1138 + btc->cx.cnt_bt[BTC_BCNT_HIPRI_TX] = 1139 + le32_to_cpu(prpt->v4.bt_cnt[BTC_BCNT_HI_TX]); 1140 + btc->cx.cnt_bt[BTC_BCNT_HIPRI_RX] = 1141 + le32_to_cpu(prpt->v4.bt_cnt[BTC_BCNT_HI_RX]); 1142 + btc->cx.cnt_bt[BTC_BCNT_LOPRI_TX] = 1143 + le32_to_cpu(prpt->v4.bt_cnt[BTC_BCNT_LO_TX]); 1144 + btc->cx.cnt_bt[BTC_BCNT_LOPRI_RX] = 1145 + le32_to_cpu(prpt->v4.bt_cnt[BTC_BCNT_LO_RX]); 1146 + btc->cx.cnt_bt[BTC_BCNT_POLUT] = 1147 + le32_to_cpu(prpt->v4.bt_cnt[BTC_BCNT_POLLUTED]); 1148 + 1149 + _chk_btc_err(rtwdev, BTC_DCNT_BTCNT_FREEZE, 0); 1150 + _chk_btc_err(rtwdev, BTC_DCNT_RPT_FREEZE, 1151 + pfwinfo->event[BTF_EVNT_RPT]); 1152 + 1153 + if (le32_to_cpu(prpt->v4.bt_cnt[BTC_BCNT_RFK_TIMEOUT]) > 0) 1154 + bt->rfk_info.map.timeout = 1; 1155 + else 1156 + bt->rfk_info.map.timeout = 0; 1157 + 1158 + dm->error.map.bt_rfk_timeout = bt->rfk_info.map.timeout; 1159 + } else if (ver->fcxbtcrpt == 5) { 1160 + prpt->v5 = pfwinfo->rpt_ctrl.finfo.v5; 1161 + pfwinfo->rpt_en_map = le32_to_cpu(prpt->v5.rpt_info.en); 1162 + wl->ver_info.fw_coex = le32_to_cpu(prpt->v5.rpt_info.cx_ver); 1163 + wl->ver_info.fw = le32_to_cpu(prpt->v5.rpt_info.fw_ver); 1164 + dm->wl_fw_cx_offload = 0; 1165 + 1166 + for (i = RTW89_PHY_0; i < RTW89_PHY_MAX; i++) 1167 + memcpy(&dm->gnt.band[i], &prpt->v5.gnt_val[i][0], 1168 + sizeof(dm->gnt.band[i])); 1169 + 1170 + btc->cx.cnt_bt[BTC_BCNT_HIPRI_TX] = 1171 + le16_to_cpu(prpt->v5.bt_cnt[BTC_BCNT_HI_TX]); 1172 + btc->cx.cnt_bt[BTC_BCNT_HIPRI_RX] = 1173 + le16_to_cpu(prpt->v5.bt_cnt[BTC_BCNT_HI_RX]); 1174 + btc->cx.cnt_bt[BTC_BCNT_LOPRI_TX] = 1175 + le16_to_cpu(prpt->v5.bt_cnt[BTC_BCNT_LO_TX]); 1176 + btc->cx.cnt_bt[BTC_BCNT_LOPRI_RX] = 1177 + le16_to_cpu(prpt->v5.bt_cnt[BTC_BCNT_LO_RX]); 1178 + btc->cx.cnt_bt[BTC_BCNT_POLUT] = 1179 + le16_to_cpu(prpt->v5.bt_cnt[BTC_BCNT_POLLUTED]); 1180 + 1181 + _chk_btc_err(rtwdev, BTC_DCNT_BTCNT_FREEZE, 0); 1182 + _chk_btc_err(rtwdev, BTC_DCNT_RPT_FREEZE, 1183 + pfwinfo->event[BTF_EVNT_RPT]); 1184 + 1185 + dm->error.map.bt_rfk_timeout = bt->rfk_info.map.timeout; 1186 + } else { 1187 + goto err; 1188 + } 1189 + break; 1190 + case BTC_RPT_TYPE_TDMA: 1119 1191 rtw89_debug(rtwdev, RTW89_DBG_BTC, 1120 1192 "[BTC], %s(): check %d %zu\n", __func__, 1121 - BTC_DCNT_TDMA_NONSYNC, sizeof(dm->tdma_now)); 1122 - 1123 - if (memcmp(&dm->tdma_now, &pfwinfo->rpt_fbtc_tdma.finfo, 1124 - sizeof(dm->tdma_now)) != 0) { 1125 - rtw89_debug(rtwdev, RTW89_DBG_BTC, 1126 - "[BTC], %s(): %d tdma_now %x %x %x %x %x %x %x %x\n", 1127 - __func__, BTC_DCNT_TDMA_NONSYNC, 1128 - dm->tdma_now.type, dm->tdma_now.rxflctrl, 1129 - dm->tdma_now.txpause, dm->tdma_now.wtgle_n, 1130 - dm->tdma_now.leak_n, dm->tdma_now.ext_ctrl, 1131 - dm->tdma_now.rxflctrl_role, 1132 - dm->tdma_now.option_ctrl); 1133 - 1134 - rtw89_debug(rtwdev, RTW89_DBG_BTC, 1135 - "[BTC], %s(): %d rpt_fbtc_tdma %x %x %x %x %x %x %x %x\n", 1136 - __func__, BTC_DCNT_TDMA_NONSYNC, 1137 - pfwinfo->rpt_fbtc_tdma.finfo.type, 1138 - pfwinfo->rpt_fbtc_tdma.finfo.rxflctrl, 1139 - pfwinfo->rpt_fbtc_tdma.finfo.txpause, 1140 - pfwinfo->rpt_fbtc_tdma.finfo.wtgle_n, 1141 - pfwinfo->rpt_fbtc_tdma.finfo.leak_n, 1142 - pfwinfo->rpt_fbtc_tdma.finfo.ext_ctrl, 1143 - pfwinfo->rpt_fbtc_tdma.finfo.rxflctrl_role, 1144 - pfwinfo->rpt_fbtc_tdma.finfo.option_ctrl); 1145 - } 1146 - 1147 - _chk_btc_err(rtwdev, BTC_DCNT_TDMA_NONSYNC, 1148 - memcmp(&dm->tdma_now, 1149 - &pfwinfo->rpt_fbtc_tdma.finfo, 1150 - sizeof(dm->tdma_now))); 1151 - } else if (rpt_type == BTC_RPT_TYPE_TDMA) { 1152 - rtw89_debug(rtwdev, RTW89_DBG_BTC, 1153 - "[BTC], %s(): check %d %zu\n", __func__, 1154 - BTC_DCNT_TDMA_NONSYNC, sizeof(dm->tdma_now)); 1155 - 1156 - if (memcmp(&dm->tdma_now, &pfwinfo->rpt_fbtc_tdma.finfo_v1.tdma, 1157 - sizeof(dm->tdma_now)) != 0) { 1158 - rtw89_debug(rtwdev, RTW89_DBG_BTC, 1159 - "[BTC], %s(): %d tdma_now %x %x %x %x %x %x %x %x\n", 1160 - __func__, BTC_DCNT_TDMA_NONSYNC, 1161 - dm->tdma_now.type, dm->tdma_now.rxflctrl, 1162 - dm->tdma_now.txpause, dm->tdma_now.wtgle_n, 1163 - dm->tdma_now.leak_n, dm->tdma_now.ext_ctrl, 1164 - dm->tdma_now.rxflctrl_role, 1165 - dm->tdma_now.option_ctrl); 1166 - rtw89_debug(rtwdev, RTW89_DBG_BTC, 1167 - "[BTC], %s(): %d rpt_fbtc_tdma %x %x %x %x %x %x %x %x\n", 1168 - __func__, BTC_DCNT_TDMA_NONSYNC, 1169 - pfwinfo->rpt_fbtc_tdma.finfo_v1.tdma.type, 1170 - pfwinfo->rpt_fbtc_tdma.finfo_v1.tdma.rxflctrl, 1171 - pfwinfo->rpt_fbtc_tdma.finfo_v1.tdma.txpause, 1172 - pfwinfo->rpt_fbtc_tdma.finfo_v1.tdma.wtgle_n, 1173 - pfwinfo->rpt_fbtc_tdma.finfo_v1.tdma.leak_n, 1174 - pfwinfo->rpt_fbtc_tdma.finfo_v1.tdma.ext_ctrl, 1175 - pfwinfo->rpt_fbtc_tdma.finfo_v1.tdma.rxflctrl_role, 1176 - pfwinfo->rpt_fbtc_tdma.finfo_v1.tdma.option_ctrl); 1177 - } 1178 - 1179 - _chk_btc_err(rtwdev, BTC_DCNT_TDMA_NONSYNC, 1180 - memcmp(&dm->tdma_now, 1181 - &pfwinfo->rpt_fbtc_tdma.finfo_v1.tdma, 1182 - sizeof(dm->tdma_now))); 1183 - } 1184 - 1185 - if (rpt_type == BTC_RPT_TYPE_SLOT) { 1193 + BTC_DCNT_TDMA_NONSYNC, 1194 + sizeof(dm->tdma_now)); 1195 + if (ver->fcxtdma == 1) 1196 + _chk_btc_err(rtwdev, BTC_DCNT_TDMA_NONSYNC, 1197 + memcmp(&dm->tdma_now, 1198 + &pfwinfo->rpt_fbtc_tdma.finfo.v1, 1199 + sizeof(dm->tdma_now))); 1200 + else if (ver->fcxtdma == 3) 1201 + _chk_btc_err(rtwdev, BTC_DCNT_TDMA_NONSYNC, 1202 + memcmp(&dm->tdma_now, 1203 + &pfwinfo->rpt_fbtc_tdma.finfo.v3.tdma, 1204 + sizeof(dm->tdma_now))); 1205 + else 1206 + goto err; 1207 + break; 1208 + case BTC_RPT_TYPE_SLOT: 1186 1209 rtw89_debug(rtwdev, RTW89_DBG_BTC, 1187 1210 "[BTC], %s(): check %d %zu\n", 1188 1211 __func__, BTC_DCNT_SLOT_NONSYNC, 1189 1212 sizeof(dm->slot_now)); 1190 - 1191 - if (memcmp(dm->slot_now, pfwinfo->rpt_fbtc_slots.finfo.slot, 1192 - sizeof(dm->slot_now)) != 0) { 1193 - for (i = 0; i < CXST_MAX; i++) { 1194 - rtp_slot = 1195 - &pfwinfo->rpt_fbtc_slots.finfo.slot[i]; 1196 - if (memcmp(&dm->slot_now[i], rtp_slot, 1197 - sizeof(dm->slot_now[i])) != 0) { 1198 - rtw89_debug(rtwdev, RTW89_DBG_BTC, 1199 - "[BTC], %s(): %d slot_now[%d] dur=0x%04x tbl=%08x type=0x%04x\n", 1200 - __func__, 1201 - BTC_DCNT_SLOT_NONSYNC, i, 1202 - dm->slot_now[i].dur, 1203 - dm->slot_now[i].cxtbl, 1204 - dm->slot_now[i].cxtype); 1205 - 1206 - rtw89_debug(rtwdev, RTW89_DBG_BTC, 1207 - "[BTC], %s(): %d rpt_fbtc_slots[%d] dur=0x%04x tbl=%08x type=0x%04x\n", 1208 - __func__, 1209 - BTC_DCNT_SLOT_NONSYNC, i, 1210 - rtp_slot->dur, 1211 - rtp_slot->cxtbl, 1212 - rtp_slot->cxtype); 1213 - } 1214 - } 1215 - } 1216 1213 _chk_btc_err(rtwdev, BTC_DCNT_SLOT_NONSYNC, 1217 1214 memcmp(dm->slot_now, 1218 1215 pfwinfo->rpt_fbtc_slots.finfo.slot, 1219 1216 sizeof(dm->slot_now))); 1220 - } 1221 - 1222 - if (rpt_type == BTC_RPT_TYPE_CYSTA && chip->chip_id == RTL8852A && 1223 - pcysta->cycles >= BTC_CYSTA_CHK_PERIOD) { 1224 - /* Check Leak-AP */ 1225 - if (pcysta->slot_cnt[CXST_LK] != 0 && 1226 - pcysta->leakrx_cnt != 0 && dm->tdma_now.rxflctrl) { 1227 - if (pcysta->slot_cnt[CXST_LK] < 1228 - BTC_LEAK_AP_TH * pcysta->leakrx_cnt) 1229 - dm->leak_ap = 1; 1230 - } 1231 - 1232 - /* Check diff time between WL slot and W1/E2G slot */ 1233 - if (dm->tdma_now.type == CXTDMA_OFF && 1234 - dm->tdma_now.ext_ctrl == CXECTL_EXT) 1235 - wl_slot_set = le16_to_cpu(dm->slot_now[CXST_E2G].dur); 1236 - else 1237 - wl_slot_set = le16_to_cpu(dm->slot_now[CXST_W1].dur); 1238 - 1239 - if (pcysta->tavg_cycle[CXT_WL] > wl_slot_set) { 1240 - diff_t = pcysta->tavg_cycle[CXT_WL] - wl_slot_set; 1241 - _chk_btc_err(rtwdev, BTC_DCNT_WL_SLOT_DRIFT, diff_t); 1242 - } 1243 - 1244 - _chk_btc_err(rtwdev, BTC_DCNT_W1_FREEZE, pcysta->slot_cnt[CXST_W1]); 1245 - _chk_btc_err(rtwdev, BTC_DCNT_W1_FREEZE, pcysta->slot_cnt[CXST_B1]); 1246 - _chk_btc_err(rtwdev, BTC_DCNT_CYCLE_FREEZE, (u32)pcysta->cycles); 1247 - } else if (rpt_type == BTC_RPT_TYPE_CYSTA && pcysta_v1 && 1248 - le16_to_cpu(pcysta_v1->cycles) >= BTC_CYSTA_CHK_PERIOD) { 1249 - cnt_leak_slot = le32_to_cpu(pcysta_v1->slot_cnt[CXST_LK]); 1250 - cnt_rx_imr = le32_to_cpu(pcysta_v1->leak_slot.cnt_rximr); 1251 - /* Check Leak-AP */ 1252 - if (cnt_leak_slot != 0 && cnt_rx_imr != 0 && 1253 - dm->tdma_now.rxflctrl) { 1254 - if (cnt_leak_slot < BTC_LEAK_AP_TH * cnt_rx_imr) 1255 - dm->leak_ap = 1; 1256 - } 1257 - 1258 - /* Check diff time between real WL slot and W1 slot */ 1259 - if (dm->tdma_now.type == CXTDMA_OFF) { 1260 - wl_slot_set = le16_to_cpu(dm->slot_now[CXST_W1].dur); 1261 - wl_slot_real = le16_to_cpu(pcysta_v1->cycle_time.tavg[CXT_WL]); 1262 - if (wl_slot_real > wl_slot_set) { 1263 - diff_t = wl_slot_real - wl_slot_set; 1264 - _chk_btc_err(rtwdev, BTC_DCNT_WL_SLOT_DRIFT, diff_t); 1217 + break; 1218 + case BTC_RPT_TYPE_CYSTA: 1219 + if (ver->fcxcysta == 2) { 1220 + if (le16_to_cpu(pcysta->v2.cycles) < BTC_CYSTA_CHK_PERIOD) 1221 + break; 1222 + /* Check Leak-AP */ 1223 + if (le32_to_cpu(pcysta->v2.slot_cnt[CXST_LK]) != 0 && 1224 + le32_to_cpu(pcysta->v2.leakrx_cnt) != 0 && dm->tdma_now.rxflctrl) { 1225 + if (le32_to_cpu(pcysta->v2.slot_cnt[CXST_LK]) < 1226 + BTC_LEAK_AP_TH * le32_to_cpu(pcysta->v2.leakrx_cnt)) 1227 + dm->leak_ap = 1; 1265 1228 } 1266 - } 1267 1229 1268 - /* Check diff time between real BT slot and EBT/E5G slot */ 1269 - if (dm->tdma_now.type == CXTDMA_OFF && 1270 - dm->tdma_now.ext_ctrl == CXECTL_EXT && 1271 - btc->bt_req_len != 0) { 1272 - bt_slot_real = le16_to_cpu(pcysta_v1->cycle_time.tavg[CXT_BT]); 1230 + /* Check diff time between WL slot and W1/E2G slot */ 1231 + if (dm->tdma_now.type == CXTDMA_OFF && 1232 + dm->tdma_now.ext_ctrl == CXECTL_EXT) 1233 + wl_slot_set = le16_to_cpu(dm->slot_now[CXST_E2G].dur); 1234 + else 1235 + wl_slot_set = le16_to_cpu(dm->slot_now[CXST_W1].dur); 1273 1236 1274 - if (btc->bt_req_len > bt_slot_real) { 1275 - diff_t = btc->bt_req_len - bt_slot_real; 1276 - _chk_btc_err(rtwdev, BTC_DCNT_BT_SLOT_DRIFT, diff_t); 1237 + if (le16_to_cpu(pcysta->v2.tavg_cycle[CXT_WL]) > wl_slot_set) { 1238 + diff_t = le16_to_cpu(pcysta->v2.tavg_cycle[CXT_WL]) - wl_slot_set; 1239 + _chk_btc_err(rtwdev, 1240 + BTC_DCNT_WL_SLOT_DRIFT, diff_t); 1277 1241 } 1242 + 1243 + _chk_btc_err(rtwdev, BTC_DCNT_W1_FREEZE, 1244 + le32_to_cpu(pcysta->v2.slot_cnt[CXST_W1])); 1245 + _chk_btc_err(rtwdev, BTC_DCNT_W1_FREEZE, 1246 + le32_to_cpu(pcysta->v2.slot_cnt[CXST_B1])); 1247 + _chk_btc_err(rtwdev, BTC_DCNT_CYCLE_FREEZE, 1248 + le16_to_cpu(pcysta->v2.cycles)); 1249 + } else if (ver->fcxcysta == 3) { 1250 + if (le16_to_cpu(pcysta->v3.cycles) < BTC_CYSTA_CHK_PERIOD) 1251 + break; 1252 + 1253 + cnt_leak_slot = le32_to_cpu(pcysta->v3.slot_cnt[CXST_LK]); 1254 + cnt_rx_imr = le32_to_cpu(pcysta->v3.leak_slot.cnt_rximr); 1255 + 1256 + /* Check Leak-AP */ 1257 + if (cnt_leak_slot != 0 && cnt_rx_imr != 0 && 1258 + dm->tdma_now.rxflctrl) { 1259 + if (cnt_leak_slot < BTC_LEAK_AP_TH * cnt_rx_imr) 1260 + dm->leak_ap = 1; 1261 + } 1262 + 1263 + /* Check diff time between real WL slot and W1 slot */ 1264 + if (dm->tdma_now.type == CXTDMA_OFF) { 1265 + wl_slot_set = le16_to_cpu(dm->slot_now[CXST_W1].dur); 1266 + wl_slot_real = le16_to_cpu(pcysta->v3.cycle_time.tavg[CXT_WL]); 1267 + if (wl_slot_real > wl_slot_set) { 1268 + diff_t = wl_slot_real - wl_slot_set; 1269 + _chk_btc_err(rtwdev, BTC_DCNT_WL_SLOT_DRIFT, diff_t); 1270 + } 1271 + } 1272 + 1273 + /* Check diff time between real BT slot and EBT/E5G slot */ 1274 + if (dm->tdma_now.type == CXTDMA_OFF && 1275 + dm->tdma_now.ext_ctrl == CXECTL_EXT && 1276 + btc->bt_req_len != 0) { 1277 + bt_slot_real = le16_to_cpu(pcysta->v3.cycle_time.tavg[CXT_BT]); 1278 + if (btc->bt_req_len > bt_slot_real) { 1279 + diff_t = btc->bt_req_len - bt_slot_real; 1280 + _chk_btc_err(rtwdev, BTC_DCNT_BT_SLOT_DRIFT, diff_t); 1281 + } 1282 + } 1283 + 1284 + _chk_btc_err(rtwdev, BTC_DCNT_W1_FREEZE, 1285 + le32_to_cpu(pcysta->v3.slot_cnt[CXST_W1])); 1286 + _chk_btc_err(rtwdev, BTC_DCNT_B1_FREEZE, 1287 + le32_to_cpu(pcysta->v3.slot_cnt[CXST_B1])); 1288 + _chk_btc_err(rtwdev, BTC_DCNT_CYCLE_FREEZE, 1289 + le16_to_cpu(pcysta->v3.cycles)); 1290 + } else if (ver->fcxcysta == 4) { 1291 + if (le16_to_cpu(pcysta->v4.cycles) < BTC_CYSTA_CHK_PERIOD) 1292 + break; 1293 + 1294 + cnt_leak_slot = le16_to_cpu(pcysta->v4.slot_cnt[CXST_LK]); 1295 + cnt_rx_imr = le32_to_cpu(pcysta->v4.leak_slot.cnt_rximr); 1296 + 1297 + /* Check Leak-AP */ 1298 + if (cnt_leak_slot != 0 && cnt_rx_imr != 0 && 1299 + dm->tdma_now.rxflctrl) { 1300 + if (cnt_leak_slot < BTC_LEAK_AP_TH * cnt_rx_imr) 1301 + dm->leak_ap = 1; 1302 + } 1303 + 1304 + /* Check diff time between real WL slot and W1 slot */ 1305 + if (dm->tdma_now.type == CXTDMA_OFF) { 1306 + wl_slot_set = le16_to_cpu(dm->slot_now[CXST_W1].dur); 1307 + wl_slot_real = le16_to_cpu(pcysta->v4.cycle_time.tavg[CXT_WL]); 1308 + if (wl_slot_real > wl_slot_set) { 1309 + diff_t = wl_slot_real - wl_slot_set; 1310 + _chk_btc_err(rtwdev, BTC_DCNT_WL_SLOT_DRIFT, diff_t); 1311 + } 1312 + } 1313 + 1314 + /* Check diff time between real BT slot and EBT/E5G slot */ 1315 + if (dm->tdma_now.type == CXTDMA_OFF && 1316 + dm->tdma_now.ext_ctrl == CXECTL_EXT && 1317 + btc->bt_req_len != 0) { 1318 + bt_slot_real = le16_to_cpu(pcysta->v4.cycle_time.tavg[CXT_BT]); 1319 + 1320 + if (btc->bt_req_len > bt_slot_real) { 1321 + diff_t = btc->bt_req_len - bt_slot_real; 1322 + _chk_btc_err(rtwdev, BTC_DCNT_BT_SLOT_DRIFT, diff_t); 1323 + } 1324 + } 1325 + 1326 + _chk_btc_err(rtwdev, BTC_DCNT_W1_FREEZE, 1327 + le16_to_cpu(pcysta->v4.slot_cnt[CXST_W1])); 1328 + _chk_btc_err(rtwdev, BTC_DCNT_B1_FREEZE, 1329 + le16_to_cpu(pcysta->v4.slot_cnt[CXST_B1])); 1330 + _chk_btc_err(rtwdev, BTC_DCNT_CYCLE_FREEZE, 1331 + le16_to_cpu(pcysta->v4.cycles)); 1332 + } else { 1333 + goto err; 1278 1334 } 1279 - 1280 - _chk_btc_err(rtwdev, BTC_DCNT_W1_FREEZE, 1281 - le32_to_cpu(pcysta_v1->slot_cnt[CXST_W1])); 1282 - _chk_btc_err(rtwdev, BTC_DCNT_B1_FREEZE, 1283 - le32_to_cpu(pcysta_v1->slot_cnt[CXST_B1])); 1284 - _chk_btc_err(rtwdev, BTC_DCNT_CYCLE_FREEZE, 1285 - (u32)le16_to_cpu(pcysta_v1->cycles)); 1286 - } 1287 - 1288 - if (rpt_type == BTC_RPT_TYPE_CTRL && chip->chip_id == RTL8852A) { 1289 - prpt = &pfwinfo->rpt_ctrl.finfo; 1290 - btc->fwinfo.rpt_en_map = prpt->rpt_enable; 1291 - wl->ver_info.fw_coex = prpt->wl_fw_coex_ver; 1292 - wl->ver_info.fw = prpt->wl_fw_ver; 1293 - dm->wl_fw_cx_offload = !!prpt->wl_fw_cx_offload; 1294 - 1295 - _chk_btc_err(rtwdev, BTC_DCNT_RPT_FREEZE, 1296 - pfwinfo->event[BTF_EVNT_RPT]); 1297 - 1298 - /* To avoid I/O if WL LPS or power-off */ 1299 - if (wl->status.map.lps != BTC_LPS_RF_OFF && !wl->status.map.rf_off) { 1300 - rtwdev->chip->ops->btc_update_bt_cnt(rtwdev); 1301 - _chk_btc_err(rtwdev, BTC_DCNT_BTCNT_FREEZE, 0); 1302 - 1303 - btc->cx.cnt_bt[BTC_BCNT_POLUT] = 1304 - rtw89_mac_get_plt_cnt(rtwdev, RTW89_MAC_0); 1305 - } 1306 - } else if (rpt_type == BTC_RPT_TYPE_CTRL) { 1307 - prpt_v1 = &pfwinfo->rpt_ctrl.finfo_v1; 1308 - btc->fwinfo.rpt_en_map = le32_to_cpu(prpt_v1->rpt_info.en); 1309 - wl->ver_info.fw_coex = le32_to_cpu(prpt_v1->wl_fw_info.cx_ver); 1310 - wl->ver_info.fw = le32_to_cpu(prpt_v1->wl_fw_info.fw_ver); 1311 - dm->wl_fw_cx_offload = !!le32_to_cpu(prpt_v1->wl_fw_info.cx_offload); 1312 - 1313 - for (i = RTW89_PHY_0; i < RTW89_PHY_MAX; i++) 1314 - memcpy(&dm->gnt.band[i], &prpt_v1->gnt_val[i], 1315 - sizeof(dm->gnt.band[i])); 1316 - 1317 - btc->cx.cnt_bt[BTC_BCNT_HIPRI_TX] = le32_to_cpu(prpt_v1->bt_cnt[BTC_BCNT_HI_TX]); 1318 - btc->cx.cnt_bt[BTC_BCNT_HIPRI_RX] = le32_to_cpu(prpt_v1->bt_cnt[BTC_BCNT_HI_RX]); 1319 - btc->cx.cnt_bt[BTC_BCNT_LOPRI_TX] = le32_to_cpu(prpt_v1->bt_cnt[BTC_BCNT_LO_TX]); 1320 - btc->cx.cnt_bt[BTC_BCNT_LOPRI_RX] = le32_to_cpu(prpt_v1->bt_cnt[BTC_BCNT_LO_RX]); 1321 - btc->cx.cnt_bt[BTC_BCNT_POLUT] = le32_to_cpu(prpt_v1->bt_cnt[BTC_BCNT_POLLUTED]); 1322 - 1323 - _chk_btc_err(rtwdev, BTC_DCNT_BTCNT_FREEZE, 0); 1324 - _chk_btc_err(rtwdev, BTC_DCNT_RPT_FREEZE, 1325 - pfwinfo->event[BTF_EVNT_RPT]); 1326 - 1327 - if (le32_to_cpu(prpt_v1->bt_cnt[BTC_BCNT_RFK_TIMEOUT]) > 0) 1328 - bt->rfk_info.map.timeout = 1; 1329 - else 1330 - bt->rfk_info.map.timeout = 0; 1331 - 1332 - dm->error.map.bt_rfk_timeout = bt->rfk_info.map.timeout; 1333 - } 1334 - 1335 - if (rpt_type >= BTC_RPT_TYPE_BT_VER && 1336 - rpt_type <= BTC_RPT_TYPE_BT_DEVICE) 1335 + break; 1336 + case BTC_RPT_TYPE_BT_VER: 1337 + case BTC_RPT_TYPE_BT_SCAN: 1338 + case BTC_RPT_TYPE_BT_AFH: 1339 + case BTC_RPT_TYPE_BT_DEVICE: 1337 1340 _update_bt_report(rtwdev, rpt_type, pfinfo); 1338 - 1341 + break; 1342 + } 1339 1343 return (rpt_len + BTC_RPT_HDR_SIZE); 1344 + 1345 + err: 1346 + rtw89_debug(rtwdev, RTW89_DBG_BTC, 1347 + "[BTC], %s(): Undefined version for type=%d\n", __func__, rpt_type); 1348 + return 0; 1340 1349 } 1341 1350 1342 1351 static void _parse_btc_report(struct rtw89_dev *rtwdev, 1343 1352 struct rtw89_btc_btf_fwinfo *pfwinfo, 1344 1353 u8 *pbuf, u32 buf_len) 1345 1354 { 1346 - const struct rtw89_chip_info *chip = rtwdev->chip; 1355 + const struct rtw89_btc_ver *ver = rtwdev->btc.ver; 1347 1356 struct rtw89_btc_prpt *btc_prpt = NULL; 1348 1357 u32 index = 0, rpt_len = 0; 1349 1358 ··· 1375 1340 1376 1341 while (pbuf) { 1377 1342 btc_prpt = (struct rtw89_btc_prpt *)&pbuf[index]; 1378 - if (index + 2 >= chip->btc_fwinfo_buf) 1343 + if (index + 2 >= ver->info_buf) 1379 1344 break; 1380 1345 /* At least 3 bytes: type(1) & len(2) */ 1381 1346 rpt_len = le16_to_cpu(btc_prpt->len); ··· 1393 1358 1394 1359 static void _append_tdma(struct rtw89_dev *rtwdev) 1395 1360 { 1396 - const struct rtw89_chip_info *chip = rtwdev->chip; 1397 1361 struct rtw89_btc *btc = &rtwdev->btc; 1362 + const struct rtw89_btc_ver *ver = btc->ver; 1398 1363 struct rtw89_btc_dm *dm = &btc->dm; 1399 1364 struct rtw89_btc_btf_tlv *tlv; 1400 1365 struct rtw89_btc_fbtc_tdma *v; 1401 - struct rtw89_btc_fbtc_tdma_v1 *v1; 1366 + struct rtw89_btc_fbtc_tdma_v3 *v3; 1402 1367 u16 len = btc->policy_len; 1403 1368 1404 1369 if (!btc->update_policy_force && ··· 1411 1376 1412 1377 tlv = (struct rtw89_btc_btf_tlv *)&btc->policy[len]; 1413 1378 tlv->type = CXPOLICY_TDMA; 1414 - if (chip->chip_id == RTL8852A) { 1379 + if (ver->fcxtdma == 1) { 1415 1380 v = (struct rtw89_btc_fbtc_tdma *)&tlv->val[0]; 1416 1381 tlv->len = sizeof(*v); 1417 1382 memcpy(v, &dm->tdma, sizeof(*v)); 1418 - btc->policy_len += BTC_TLV_HDR_LEN + sizeof(*v); 1383 + btc->policy_len += BTC_TLV_HDR_LEN + sizeof(*v); 1419 1384 } else { 1420 - tlv->len = sizeof(*v1); 1421 - v1 = (struct rtw89_btc_fbtc_tdma_v1 *)&tlv->val[0]; 1422 - v1->fver = chip->fcxtdma_ver; 1423 - v1->tdma = dm->tdma; 1424 - btc->policy_len += BTC_TLV_HDR_LEN + sizeof(*v1); 1385 + tlv->len = sizeof(*v3); 1386 + v3 = (struct rtw89_btc_fbtc_tdma_v3 *)&tlv->val[0]; 1387 + v3->fver = ver->fcxtdma; 1388 + memcpy(&v3->tdma, &dm->tdma, sizeof(v3->tdma)); 1389 + btc->policy_len += BTC_TLV_HDR_LEN + sizeof(*v3); 1425 1390 } 1426 1391 1427 1392 rtw89_debug(rtwdev, RTW89_DBG_BTC, ··· 1476 1441 __func__, cnt); 1477 1442 } 1478 1443 1444 + static u32 rtw89_btc_fw_rpt_ver(struct rtw89_dev *rtwdev, u32 rpt_map) 1445 + { 1446 + struct rtw89_btc *btc = &rtwdev->btc; 1447 + const struct rtw89_btc_ver *ver = btc->ver; 1448 + u32 bit_map = 0; 1449 + 1450 + switch (rpt_map) { 1451 + case RPT_EN_TDMA: 1452 + bit_map = BIT(0); 1453 + break; 1454 + case RPT_EN_CYCLE: 1455 + bit_map = BIT(1); 1456 + break; 1457 + case RPT_EN_MREG: 1458 + bit_map = BIT(2); 1459 + break; 1460 + case RPT_EN_BT_VER_INFO: 1461 + bit_map = BIT(3); 1462 + break; 1463 + case RPT_EN_BT_SCAN_INFO: 1464 + bit_map = BIT(4); 1465 + break; 1466 + case RPT_EN_BT_DEVICE_INFO: 1467 + switch (ver->frptmap) { 1468 + case 0: 1469 + case 1: 1470 + case 2: 1471 + bit_map = BIT(6); 1472 + break; 1473 + case 3: 1474 + bit_map = BIT(5); 1475 + break; 1476 + default: 1477 + break; 1478 + } 1479 + break; 1480 + case RPT_EN_BT_AFH_MAP: 1481 + switch (ver->frptmap) { 1482 + case 0: 1483 + case 1: 1484 + case 2: 1485 + bit_map = BIT(5); 1486 + break; 1487 + case 3: 1488 + bit_map = BIT(6); 1489 + break; 1490 + default: 1491 + break; 1492 + } 1493 + break; 1494 + case RPT_EN_BT_AFH_MAP_LE: 1495 + switch (ver->frptmap) { 1496 + case 2: 1497 + bit_map = BIT(8); 1498 + break; 1499 + case 3: 1500 + bit_map = BIT(7); 1501 + break; 1502 + default: 1503 + break; 1504 + } 1505 + break; 1506 + case RPT_EN_FW_STEP_INFO: 1507 + switch (ver->frptmap) { 1508 + case 1: 1509 + case 2: 1510 + bit_map = BIT(7); 1511 + break; 1512 + case 3: 1513 + bit_map = BIT(8); 1514 + break; 1515 + default: 1516 + break; 1517 + } 1518 + break; 1519 + case RPT_EN_TEST: 1520 + bit_map = BIT(31); 1521 + break; 1522 + case RPT_EN_WL_ALL: 1523 + switch (ver->frptmap) { 1524 + case 0: 1525 + case 1: 1526 + case 2: 1527 + bit_map = GENMASK(2, 0); 1528 + break; 1529 + case 3: 1530 + bit_map = GENMASK(2, 0) | BIT(8); 1531 + break; 1532 + default: 1533 + break; 1534 + } 1535 + break; 1536 + case RPT_EN_BT_ALL: 1537 + switch (ver->frptmap) { 1538 + case 0: 1539 + case 1: 1540 + bit_map = GENMASK(6, 3); 1541 + break; 1542 + case 2: 1543 + bit_map = GENMASK(6, 3) | BIT(8); 1544 + break; 1545 + case 3: 1546 + bit_map = GENMASK(7, 3); 1547 + break; 1548 + default: 1549 + break; 1550 + } 1551 + break; 1552 + case RPT_EN_ALL: 1553 + switch (ver->frptmap) { 1554 + case 0: 1555 + bit_map = GENMASK(6, 0); 1556 + break; 1557 + case 1: 1558 + bit_map = GENMASK(7, 0); 1559 + break; 1560 + case 2: 1561 + case 3: 1562 + bit_map = GENMASK(8, 0); 1563 + break; 1564 + default: 1565 + break; 1566 + } 1567 + break; 1568 + case RPT_EN_MONITER: 1569 + switch (ver->frptmap) { 1570 + case 0: 1571 + case 1: 1572 + bit_map = GENMASK(6, 2); 1573 + break; 1574 + case 2: 1575 + bit_map = GENMASK(6, 2) | BIT(8); 1576 + break; 1577 + case 3: 1578 + bit_map = GENMASK(8, 2); 1579 + break; 1580 + default: 1581 + break; 1582 + } 1583 + break; 1584 + } 1585 + 1586 + return bit_map; 1587 + } 1588 + 1479 1589 static void rtw89_btc_fw_en_rpt(struct rtw89_dev *rtwdev, 1480 1590 u32 rpt_map, bool rpt_state) 1481 1591 { 1482 1592 struct rtw89_btc *btc = &rtwdev->btc; 1483 1593 struct rtw89_btc_btf_fwinfo *fwinfo = &btc->fwinfo; 1484 1594 struct rtw89_btc_btf_set_report r = {0}; 1485 - u32 val = 0; 1595 + u32 val, bit_map; 1596 + 1597 + bit_map = rtw89_btc_fw_rpt_ver(rtwdev, rpt_map); 1486 1598 1487 1599 rtw89_debug(rtwdev, RTW89_DBG_BTC, 1488 1600 "[BTC], %s(): rpt_map=%x, rpt_state=%x\n", 1489 1601 __func__, rpt_map, rpt_state); 1490 1602 1491 1603 if (rpt_state) 1492 - val = fwinfo->rpt_en_map | rpt_map; 1604 + val = fwinfo->rpt_en_map | bit_map; 1493 1605 else 1494 - val = fwinfo->rpt_en_map & ~rpt_map; 1606 + val = fwinfo->rpt_en_map & ~bit_map; 1495 1607 1496 1608 if (val == fwinfo->rpt_en_map) 1497 1609 return; ··· 1775 1593 1776 1594 static void _fw_set_drv_info(struct rtw89_dev *rtwdev, u8 type) 1777 1595 { 1778 - const struct rtw89_chip_info *chip = rtwdev->chip; 1596 + struct rtw89_btc *btc = &rtwdev->btc; 1597 + const struct rtw89_btc_ver *ver = btc->ver; 1779 1598 1780 1599 switch (type) { 1781 1600 case CXDRVINFO_INIT: 1782 1601 rtw89_fw_h2c_cxdrv_init(rtwdev); 1783 1602 break; 1784 1603 case CXDRVINFO_ROLE: 1785 - if (chip->chip_id == RTL8852A) 1604 + if (ver->fwlrole == 0) 1786 1605 rtw89_fw_h2c_cxdrv_role(rtwdev); 1787 - else 1606 + else if (ver->fwlrole == 1) 1788 1607 rtw89_fw_h2c_cxdrv_role_v1(rtwdev); 1789 1608 break; 1790 1609 case CXDRVINFO_CTRL: ··· 2075 1892 { 2076 1893 const struct rtw89_chip_info *chip = rtwdev->chip; 2077 1894 struct rtw89_btc *btc = &rtwdev->btc; 1895 + const struct rtw89_btc_ver *ver = btc->ver; 2078 1896 struct rtw89_btc_wl_info *wl = &btc->cx.wl; 2079 1897 struct rtw89_btc_bt_info *bt = &btc->cx.bt; 2080 1898 struct rtw89_btc_bt_link_info *b = &bt->link_info; ··· 2089 1905 if (btc->ctrl.manual || wl->status.map.scan) 2090 1906 return; 2091 1907 2092 - if (chip->chip_id == RTL8852A) { 1908 + if (ver->fwlrole == 0) { 2093 1909 mode = wl_rinfo->link_mode; 2094 1910 connect_cnt = wl_rinfo->connect_cnt; 2095 1911 } else { ··· 2108 1924 r = &wl_rinfo->active_role[i]; 2109 1925 r1 = &wl_rinfo_v1->active_role_v1[i]; 2110 1926 2111 - if (chip->chip_id == RTL8852A && 1927 + if (ver->fwlrole == 0 && 2112 1928 (r->role == RTW89_WIFI_ROLE_P2P_GO || 2113 1929 r->role == RTW89_WIFI_ROLE_P2P_CLIENT)) { 2114 1930 ch = r->ch; 2115 1931 bw = r->bw; 2116 1932 break; 2117 - } else if (chip->chip_id != RTL8852A && 1933 + } else if (ver->fwlrole == 1 && 2118 1934 (r1->role == RTW89_WIFI_ROLE_P2P_GO || 2119 1935 r1->role == RTW89_WIFI_ROLE_P2P_CLIENT)) { 2120 1936 ch = r1->ch; ··· 2129 1945 r = &wl_rinfo->active_role[i]; 2130 1946 r1 = &wl_rinfo_v1->active_role_v1[i]; 2131 1947 2132 - if (chip->chip_id == RTL8852A && 1948 + if (ver->fwlrole == 0 && 2133 1949 r->connected && r->band == RTW89_BAND_2G) { 2134 1950 ch = r->ch; 2135 1951 bw = r->bw; 2136 1952 break; 2137 - } else if (chip->chip_id != RTL8852A && 1953 + } else if (ver->fwlrole == 1 && 2138 1954 r1->connected && r1->band == RTW89_BAND_2G) { 2139 1955 ch = r1->ch; 2140 1956 bw = r1->bw; ··· 3582 3398 3583 3399 static void _set_btg_ctrl(struct rtw89_dev *rtwdev) 3584 3400 { 3585 - const struct rtw89_chip_info *chip = rtwdev->chip; 3586 3401 struct rtw89_btc *btc = &rtwdev->btc; 3402 + const struct rtw89_btc_ver *ver = btc->ver; 3587 3403 struct rtw89_btc_wl_info *wl = &btc->cx.wl; 3588 3404 struct rtw89_btc_wl_role_info *wl_rinfo = &wl->role_info; 3589 3405 struct rtw89_btc_wl_role_info_v1 *wl_rinfo_v1 = &wl->role_info_v1; ··· 3594 3410 if (btc->ctrl.manual) 3595 3411 return; 3596 3412 3597 - if (chip->chip_id == RTL8852A) 3413 + if (ver->fwlrole == 0) 3598 3414 mode = wl_rinfo->link_mode; 3599 3415 else 3600 3416 mode = wl_rinfo_v1->link_mode; ··· 3687 3503 3688 3504 static void _set_wl_tx_limit(struct rtw89_dev *rtwdev) 3689 3505 { 3690 - const struct rtw89_chip_info *chip = rtwdev->chip; 3691 3506 struct rtw89_btc *btc = &rtwdev->btc; 3507 + const struct rtw89_btc_ver *ver = btc->ver; 3692 3508 struct rtw89_btc_cx *cx = &btc->cx; 3693 3509 struct rtw89_btc_dm *dm = &btc->dm; 3694 3510 struct rtw89_btc_wl_info *wl = &cx->wl; ··· 3708 3524 if (btc->ctrl.manual) 3709 3525 return; 3710 3526 3711 - if (chip->chip_id == RTL8852A) 3527 + if (ver->fwlrole == 0) 3712 3528 mode = wl_rinfo->link_mode; 3713 3529 else 3714 3530 mode = wl_rinfo_v1->link_mode; ··· 3756 3572 3757 3573 static void _set_bt_rx_agc(struct rtw89_dev *rtwdev) 3758 3574 { 3759 - const struct rtw89_chip_info *chip = rtwdev->chip; 3760 3575 struct rtw89_btc *btc = &rtwdev->btc; 3576 + const struct rtw89_btc_ver *ver = btc->ver; 3761 3577 struct rtw89_btc_wl_info *wl = &btc->cx.wl; 3762 3578 struct rtw89_btc_wl_role_info *wl_rinfo = &wl->role_info; 3763 3579 struct rtw89_btc_wl_role_info_v1 *wl_rinfo_v1 = &wl->role_info_v1; ··· 3765 3581 bool bt_hi_lna_rx = false; 3766 3582 u8 mode; 3767 3583 3768 - if (chip->chip_id == RTL8852A) 3584 + if (ver->fwlrole == 0) 3769 3585 mode = wl_rinfo->link_mode; 3770 3586 else 3771 3587 mode = wl_rinfo_v1->link_mode; ··· 4629 4445 static 4630 4446 void _run_coex(struct rtw89_dev *rtwdev, enum btc_reason_and_action reason) 4631 4447 { 4632 - const struct rtw89_chip_info *chip = rtwdev->chip; 4633 4448 struct rtw89_btc *btc = &rtwdev->btc; 4449 + const struct rtw89_btc_ver *ver = btc->ver; 4634 4450 struct rtw89_btc_dm *dm = &rtwdev->btc.dm; 4635 4451 struct rtw89_btc_cx *cx = &btc->cx; 4636 4452 struct rtw89_btc_wl_info *wl = &btc->cx.wl; ··· 4645 4461 _update_dm_step(rtwdev, reason); 4646 4462 _update_btc_state_map(rtwdev); 4647 4463 4648 - if (chip->chip_id == RTL8852A) 4464 + if (ver->fwlrole == 0) 4649 4465 mode = wl_rinfo->link_mode; 4650 4466 else 4651 4467 mode = wl_rinfo_v1->link_mode; ··· 4767 4583 break; 4768 4584 case BTC_WLINK_2G_SCC: 4769 4585 bt->scan_rx_low_pri = true; 4770 - if (chip->chip_id == RTL8852A) 4586 + if (ver->fwlrole == 0) 4771 4587 _action_wl_2g_scc(rtwdev); 4772 - else if (chip->chip_id == RTL8852C) 4588 + else if (ver->fwlrole == 1) 4773 4589 _action_wl_2g_scc_v1(rtwdev); 4774 4590 break; 4775 4591 case BTC_WLINK_2G_MCC: ··· 4874 4690 _write_scbd(rtwdev, 4875 4691 BTC_WSCB_ACTIVE | BTC_WSCB_ON | BTC_WSCB_BTLOG, true); 4876 4692 _update_bt_scbd(rtwdev, true); 4877 - if (rtw89_mac_get_ctrl_path(rtwdev) && chip->chip_id == RTL8852A) { 4693 + if (rtw89_mac_get_ctrl_path(rtwdev)) { 4878 4694 rtw89_debug(rtwdev, RTW89_DBG_BTC, 4879 4695 "[BTC], %s(): PTA owner warning!!\n", 4880 4696 __func__); ··· 5184 5000 5185 5001 a2dp->sink = btinfo.hb3.a2dp_sink; 5186 5002 5187 - if (b->profile_cnt.now || b->status.map.ble_connect) 5188 - rtw89_btc_fw_en_rpt(rtwdev, RPT_EN_BT_AFH_MAP, 1); 5189 - else 5190 - rtw89_btc_fw_en_rpt(rtwdev, RPT_EN_BT_AFH_MAP, 0); 5191 - 5192 5003 if (!a2dp->exist_last && a2dp->exist) { 5193 5004 a2dp->vendor_id = 0; 5194 5005 a2dp->flush_time = 0; ··· 5192 5013 &rtwdev->coex_bt_devinfo_work, 5193 5014 RTW89_COEX_BT_DEVINFO_WORK_PERIOD); 5194 5015 } 5195 - 5196 - if (a2dp->exist && (a2dp->flush_time == 0 || a2dp->vendor_id == 0 || 5197 - a2dp->play_latency == 1)) 5198 - rtw89_btc_fw_en_rpt(rtwdev, RPT_EN_BT_DEVICE_INFO, 1); 5199 - else 5200 - rtw89_btc_fw_en_rpt(rtwdev, RPT_EN_BT_DEVICE_INFO, 0); 5201 5016 5202 5017 _run_coex(rtwdev, BTC_RSN_UPDATE_BT_INFO); 5203 5018 } ··· 5207 5034 struct rtw89_sta *rtwsta, enum btc_role_state state) 5208 5035 { 5209 5036 const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 5210 - const struct rtw89_chip_info *chip = rtwdev->chip; 5211 5037 struct ieee80211_vif *vif = rtwvif_to_vif(rtwvif); 5212 5038 struct ieee80211_sta *sta = rtwsta_to_sta(rtwsta); 5213 5039 struct rtw89_btc *btc = &rtwdev->btc; 5040 + const struct rtw89_btc_ver *ver = btc->ver; 5214 5041 struct rtw89_btc_wl_info *wl = &btc->cx.wl; 5215 5042 struct rtw89_btc_wl_link_info r = {0}; 5216 5043 struct rtw89_btc_wl_link_info *wlinfo = NULL; ··· 5274 5101 wlinfo = &wl->link_info[r.pid]; 5275 5102 5276 5103 memcpy(wlinfo, &r, sizeof(*wlinfo)); 5277 - if (chip->chip_id == RTL8852A) 5104 + if (ver->fwlrole == 0) 5278 5105 _update_wl_info(rtwdev); 5279 5106 else 5280 5107 _update_wl_info_v1(rtwdev); ··· 5325 5152 5326 5153 if (rf_state == BTC_RFCTRL_WL_ON) { 5327 5154 btc->dm.cnt_dm[BTC_DCNT_BTCNT_FREEZE] = 0; 5328 - rtw89_btc_fw_en_rpt(rtwdev, 5329 - RPT_EN_MREG | RPT_EN_BT_VER_INFO, true); 5155 + rtw89_btc_fw_en_rpt(rtwdev, RPT_EN_MREG, true); 5330 5156 val = BTC_WSCB_ACTIVE | BTC_WSCB_ON | BTC_WSCB_BTLOG; 5331 5157 _write_scbd(rtwdev, val, true); 5332 5158 _update_bt_scbd(rtwdev, true); ··· 5790 5618 5791 5619 static void _show_wl_info(struct rtw89_dev *rtwdev, struct seq_file *m) 5792 5620 { 5793 - const struct rtw89_chip_info *chip = rtwdev->chip; 5794 5621 struct rtw89_btc *btc = &rtwdev->btc; 5622 + const struct rtw89_btc_ver *ver = btc->ver; 5795 5623 struct rtw89_btc_cx *cx = &btc->cx; 5796 5624 struct rtw89_btc_wl_info *wl = &cx->wl; 5797 5625 struct rtw89_btc_wl_role_info *wl_rinfo = &wl->role_info; ··· 5803 5631 5804 5632 seq_puts(m, "========== [WL Status] ==========\n"); 5805 5633 5806 - if (chip->chip_id == RTL8852A) 5634 + if (ver->fwlrole == 0) 5807 5635 mode = wl_rinfo->link_mode; 5808 5636 else 5809 5637 mode = wl_rinfo_v1->link_mode; ··· 5886 5714 static void _show_bt_info(struct rtw89_dev *rtwdev, struct seq_file *m) 5887 5715 { 5888 5716 struct rtw89_btc *btc = &rtwdev->btc; 5717 + const struct rtw89_btc_ver *ver = btc->ver; 5889 5718 struct rtw89_btc_cx *cx = &btc->cx; 5890 5719 struct rtw89_btc_bt_info *bt = &cx->bt; 5891 5720 struct rtw89_btc_wl_info *wl = &cx->wl; 5892 5721 struct rtw89_btc_module *module = &btc->mdinfo; 5893 5722 struct rtw89_btc_bt_link_info *bt_linfo = &bt->link_info; 5894 5723 u8 *afh = bt_linfo->afh_map; 5724 + u8 *afh_le = bt_linfo->afh_map_le; 5895 5725 5896 5726 if (!(btc->dm.coex_info_map & BTC_COEX_INFO_BT)) 5897 5727 return; ··· 5943 5769 afh[0], afh[1], afh[2], afh[3], afh[4], 5944 5770 afh[5], afh[6], afh[7], afh[8], afh[9]); 5945 5771 5772 + if (ver->fcxbtafh == 2 && bt_linfo->status.map.ble_connect) 5773 + seq_printf(m, 5774 + "LE[%02x%02x_%02x_%02x%02x]", 5775 + afh_le[0], afh_le[1], afh_le[2], 5776 + afh_le[3], afh_le[4]); 5777 + 5946 5778 seq_printf(m, "wl_ch_map[en:%d/ch:%d/bw:%d]\n", 5947 5779 wl->afh_info.en, wl->afh_info.ch, wl->afh_info.bw); 5948 5780 ··· 5980 5800 "[trx_req_cnt]", cx->cnt_bt[BTC_BCNT_HIPRI_RX], 5981 5801 cx->cnt_bt[BTC_BCNT_HIPRI_TX], cx->cnt_bt[BTC_BCNT_LOPRI_RX], 5982 5802 cx->cnt_bt[BTC_BCNT_LOPRI_TX], cx->cnt_bt[BTC_BCNT_POLUT]); 5803 + 5804 + if (bt->enable.now && bt->ver_info.fw == 0) 5805 + rtw89_btc_fw_en_rpt(rtwdev, RPT_EN_BT_VER_INFO, true); 5806 + else 5807 + rtw89_btc_fw_en_rpt(rtwdev, RPT_EN_BT_VER_INFO, false); 5808 + 5809 + if (bt_linfo->profile_cnt.now || bt_linfo->status.map.ble_connect) 5810 + rtw89_btc_fw_en_rpt(rtwdev, RPT_EN_BT_AFH_MAP, true); 5811 + else 5812 + rtw89_btc_fw_en_rpt(rtwdev, RPT_EN_BT_AFH_MAP, false); 5813 + 5814 + if (ver->fcxbtafh == 2 && bt_linfo->status.map.ble_connect) 5815 + rtw89_btc_fw_en_rpt(rtwdev, RPT_EN_BT_AFH_MAP_LE, true); 5816 + else 5817 + rtw89_btc_fw_en_rpt(rtwdev, RPT_EN_BT_AFH_MAP_LE, false); 5818 + 5819 + if (bt_linfo->a2dp_desc.exist && 5820 + (bt_linfo->a2dp_desc.flush_time == 0 || 5821 + bt_linfo->a2dp_desc.vendor_id == 0 || 5822 + bt_linfo->a2dp_desc.play_latency == 1)) 5823 + rtw89_btc_fw_en_rpt(rtwdev, RPT_EN_BT_DEVICE_INFO, true); 5824 + else 5825 + rtw89_btc_fw_en_rpt(rtwdev, RPT_EN_BT_DEVICE_INFO, false); 5983 5826 } 5984 5827 5985 5828 #define CASE_BTC_RSN_STR(e) case BTC_RSN_ ## e: return #e ··· 6010 5807 #define CASE_BTC_POLICY_STR(e) \ 6011 5808 case BTC_CXP_ ## e | BTC_POLICY_EXT_BIT: return #e 6012 5809 #define CASE_BTC_SLOT_STR(e) case CXST_ ## e: return #e 5810 + #define CASE_BTC_EVT_STR(e) case CXEVNT_## e: return #e 6013 5811 6014 5812 static const char *steps_to_str(u16 step) 6015 5813 { ··· 6151 5947 } 6152 5948 } 6153 5949 5950 + static const char *id_to_evt(u32 id) 5951 + { 5952 + switch (id) { 5953 + CASE_BTC_EVT_STR(TDMA_ENTRY); 5954 + CASE_BTC_EVT_STR(WL_TMR); 5955 + CASE_BTC_EVT_STR(B1_TMR); 5956 + CASE_BTC_EVT_STR(B2_TMR); 5957 + CASE_BTC_EVT_STR(B3_TMR); 5958 + CASE_BTC_EVT_STR(B4_TMR); 5959 + CASE_BTC_EVT_STR(W2B_TMR); 5960 + CASE_BTC_EVT_STR(B2W_TMR); 5961 + CASE_BTC_EVT_STR(BCN_EARLY); 5962 + CASE_BTC_EVT_STR(A2DP_EMPTY); 5963 + CASE_BTC_EVT_STR(LK_END); 5964 + CASE_BTC_EVT_STR(RX_ISR); 5965 + CASE_BTC_EVT_STR(RX_FC0); 5966 + CASE_BTC_EVT_STR(RX_FC1); 5967 + CASE_BTC_EVT_STR(BT_RELINK); 5968 + CASE_BTC_EVT_STR(BT_RETRY); 5969 + CASE_BTC_EVT_STR(E2G); 5970 + CASE_BTC_EVT_STR(E5G); 5971 + CASE_BTC_EVT_STR(EBT); 5972 + CASE_BTC_EVT_STR(ENULL); 5973 + CASE_BTC_EVT_STR(DRV_WLK); 5974 + CASE_BTC_EVT_STR(BCN_OK); 5975 + CASE_BTC_EVT_STR(BT_CHANGE); 5976 + CASE_BTC_EVT_STR(EBT_EXTEND); 5977 + CASE_BTC_EVT_STR(E2G_NULL1); 5978 + CASE_BTC_EVT_STR(B1FDD_TMR); 5979 + default: 5980 + return "unknown"; 5981 + } 5982 + } 5983 + 6154 5984 static 6155 5985 void seq_print_segment(struct seq_file *m, const char *prefix, u16 *data, 6156 5986 u8 len, u8 seg_len, u8 start_idx, u8 ring_len) ··· 6283 6045 6284 6046 static void _show_error(struct rtw89_dev *rtwdev, struct seq_file *m) 6285 6047 { 6286 - const struct rtw89_chip_info *chip = rtwdev->chip; 6287 6048 struct rtw89_btc *btc = &rtwdev->btc; 6049 + const struct rtw89_btc_ver *ver = btc->ver; 6288 6050 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; 6289 - struct rtw89_btc_fbtc_cysta *pcysta; 6290 - struct rtw89_btc_fbtc_cysta_v1 *pcysta_v1; 6051 + union rtw89_btc_fbtc_cysta_info *pcysta; 6291 6052 u32 except_cnt, exception_map; 6292 6053 6293 - if (chip->chip_id == RTL8852A) { 6294 - pcysta = &pfwinfo->rpt_fbtc_cysta.finfo; 6295 - except_cnt = le32_to_cpu(pcysta->except_cnt); 6296 - exception_map = le32_to_cpu(pcysta->exception); 6054 + pcysta = &pfwinfo->rpt_fbtc_cysta.finfo; 6055 + if (ver->fcxcysta == 2) { 6056 + pcysta->v2 = pfwinfo->rpt_fbtc_cysta.finfo.v2; 6057 + except_cnt = le32_to_cpu(pcysta->v2.except_cnt); 6058 + exception_map = le32_to_cpu(pcysta->v2.exception); 6059 + } else if (ver->fcxcysta == 3) { 6060 + pcysta->v3 = pfwinfo->rpt_fbtc_cysta.finfo.v3; 6061 + except_cnt = le32_to_cpu(pcysta->v3.except_cnt); 6062 + exception_map = le32_to_cpu(pcysta->v3.except_map); 6063 + } else if (ver->fcxcysta == 4) { 6064 + pcysta->v4 = pfwinfo->rpt_fbtc_cysta.finfo.v4; 6065 + except_cnt = pcysta->v4.except_cnt; 6066 + exception_map = le32_to_cpu(pcysta->v4.except_map); 6297 6067 } else { 6298 - pcysta_v1 = &pfwinfo->rpt_fbtc_cysta.finfo_v1; 6299 - except_cnt = le32_to_cpu(pcysta_v1->except_cnt); 6300 - exception_map = le32_to_cpu(pcysta_v1->except_map); 6068 + return; 6301 6069 } 6302 6070 6303 6071 if (pfwinfo->event[BTF_EVNT_BUF_OVERFLOW] == 0 && except_cnt == 0 && ··· 6341 6097 6342 6098 static void _show_fbtc_tdma(struct rtw89_dev *rtwdev, struct seq_file *m) 6343 6099 { 6344 - const struct rtw89_chip_info *chip = rtwdev->chip; 6345 6100 struct rtw89_btc *btc = &rtwdev->btc; 6101 + const struct rtw89_btc_ver *ver = btc->ver; 6346 6102 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; 6347 6103 struct rtw89_btc_rpt_cmn_info *pcinfo = NULL; 6348 6104 struct rtw89_btc_fbtc_tdma *t = NULL; 6349 - struct rtw89_btc_fbtc_slot *s = NULL; 6350 - struct rtw89_btc_dm *dm = &btc->dm; 6351 - u8 i, cnt = 0; 6352 6105 6353 6106 pcinfo = &pfwinfo->rpt_fbtc_tdma.cinfo; 6354 6107 if (!pcinfo->valid) 6355 6108 return; 6356 6109 6357 - if (chip->chip_id == RTL8852A) 6358 - t = &pfwinfo->rpt_fbtc_tdma.finfo; 6110 + if (ver->fcxtdma == 1) 6111 + t = &pfwinfo->rpt_fbtc_tdma.finfo.v1; 6359 6112 else 6360 - t = &pfwinfo->rpt_fbtc_tdma.finfo_v1.tdma; 6113 + t = &pfwinfo->rpt_fbtc_tdma.finfo.v3.tdma; 6361 6114 6362 6115 seq_printf(m, 6363 6116 " %-15s : ", "[tdma_policy]"); ··· 6371 6130 "policy_type:%d", 6372 6131 (u32)btc->policy_type); 6373 6132 6374 - s = pfwinfo->rpt_fbtc_slots.finfo.slot; 6375 - 6376 - for (i = 0; i < CXST_MAX; i++) { 6377 - if (dm->update_slot_map == BIT(CXST_MAX) - 1) 6378 - break; 6379 - 6380 - if (!(dm->update_slot_map & BIT(i))) 6381 - continue; 6382 - 6383 - if (cnt % 6 == 0) 6384 - seq_printf(m, 6385 - " %-15s : %d[%d/0x%x/%d]", 6386 - "[slot_policy]", 6387 - (u32)i, 6388 - s[i].dur, s[i].cxtbl, s[i].cxtype); 6389 - else 6390 - seq_printf(m, 6391 - ", %d[%d/0x%x/%d]", 6392 - (u32)i, 6393 - s[i].dur, s[i].cxtbl, s[i].cxtype); 6394 - if (cnt % 6 == 5) 6395 - seq_puts(m, "\n"); 6396 - cnt++; 6397 - } 6398 6133 seq_puts(m, "\n"); 6399 6134 } 6400 6135 6401 6136 static void _show_fbtc_slots(struct rtw89_dev *rtwdev, struct seq_file *m) 6402 6137 { 6403 6138 struct rtw89_btc *btc = &rtwdev->btc; 6404 - struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; 6405 - struct rtw89_btc_rpt_cmn_info *pcinfo = NULL; 6406 - struct rtw89_btc_fbtc_slots *pslots = NULL; 6407 - struct rtw89_btc_fbtc_slot s; 6139 + struct rtw89_btc_dm *dm = &btc->dm; 6140 + struct rtw89_btc_fbtc_slot *s; 6408 6141 u8 i = 0; 6409 6142 6410 - pcinfo = &pfwinfo->rpt_fbtc_slots.cinfo; 6411 - if (!pcinfo->valid) 6412 - return; 6413 - 6414 - pslots = &pfwinfo->rpt_fbtc_slots.finfo; 6415 - 6416 6143 for (i = 0; i < CXST_MAX; i++) { 6417 - s = pslots->slot[i]; 6144 + s = &dm->slot_now[i]; 6418 6145 if (i % 6 == 0) 6419 6146 seq_printf(m, 6420 6147 " %-15s : %02d[%03d/0x%x/%d]", 6421 6148 "[slot_list]", 6422 6149 (u32)i, 6423 - s.dur, s.cxtbl, s.cxtype); 6150 + s->dur, s->cxtbl, s->cxtype); 6424 6151 else 6425 6152 seq_printf(m, 6426 6153 ", %02d[%03d/0x%x/%d]", 6427 6154 (u32)i, 6428 - s.dur, s.cxtbl, s.cxtype); 6155 + s->dur, s->cxtbl, s->cxtype); 6429 6156 if (i % 6 == 5) 6430 6157 seq_puts(m, "\n"); 6431 6158 } 6432 6159 } 6433 6160 6434 - static void _show_fbtc_cysta(struct rtw89_dev *rtwdev, struct seq_file *m) 6161 + static void _show_fbtc_cysta_v2(struct rtw89_dev *rtwdev, struct seq_file *m) 6435 6162 { 6436 6163 struct rtw89_btc *btc = &rtwdev->btc; 6437 6164 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; 6438 6165 struct rtw89_btc_dm *dm = &btc->dm; 6439 6166 struct rtw89_btc_bt_a2dp_desc *a2dp = &btc->cx.bt.link_info.a2dp_desc; 6440 6167 struct rtw89_btc_rpt_cmn_info *pcinfo = NULL; 6441 - struct rtw89_btc_fbtc_cysta *pcysta_le32 = NULL; 6442 - struct rtw89_btc_fbtc_cysta_cpu pcysta[1]; 6168 + struct rtw89_btc_fbtc_cysta_v2 *pcysta_le32 = NULL; 6443 6169 union rtw89_btc_fbtc_rxflct r; 6444 6170 u8 i, cnt = 0, slot_pair; 6445 6171 u16 cycle, c_begin, c_end, store_index; ··· 6415 6207 if (!pcinfo->valid) 6416 6208 return; 6417 6209 6418 - pcysta_le32 = &pfwinfo->rpt_fbtc_cysta.finfo; 6419 - rtw89_btc_fbtc_cysta_to_cpu(pcysta_le32, pcysta); 6210 + pcysta_le32 = &pfwinfo->rpt_fbtc_cysta.finfo.v2; 6420 6211 seq_printf(m, 6421 6212 " %-15s : cycle:%d, bcn[all:%d/all_ok:%d/bt:%d/bt_ok:%d]", 6422 - "[cycle_cnt]", pcysta->cycles, pcysta->bcn_cnt[CXBCN_ALL], 6423 - pcysta->bcn_cnt[CXBCN_ALL_OK], 6424 - pcysta->bcn_cnt[CXBCN_BT_SLOT], 6425 - pcysta->bcn_cnt[CXBCN_BT_OK]); 6213 + "[cycle_cnt]", 6214 + le16_to_cpu(pcysta_le32->cycles), 6215 + le32_to_cpu(pcysta_le32->bcn_cnt[CXBCN_ALL]), 6216 + le32_to_cpu(pcysta_le32->bcn_cnt[CXBCN_ALL_OK]), 6217 + le32_to_cpu(pcysta_le32->bcn_cnt[CXBCN_BT_SLOT]), 6218 + le32_to_cpu(pcysta_le32->bcn_cnt[CXBCN_BT_OK])); 6426 6219 6427 6220 for (i = 0; i < CXST_MAX; i++) { 6428 - if (!pcysta->slot_cnt[i]) 6221 + if (!le32_to_cpu(pcysta_le32->slot_cnt[i])) 6429 6222 continue; 6430 - seq_printf(m, 6431 - ", %d:%d", (u32)i, pcysta->slot_cnt[i]); 6223 + seq_printf(m, ", %d:%d", (u32)i, 6224 + le32_to_cpu(pcysta_le32->slot_cnt[i])); 6432 6225 } 6433 6226 6434 6227 if (dm->tdma_now.rxflctrl) { 6435 - seq_printf(m, 6436 - ", leak_rx:%d", pcysta->leakrx_cnt); 6228 + seq_printf(m, ", leak_rx:%d", 6229 + le32_to_cpu(pcysta_le32->leakrx_cnt)); 6437 6230 } 6438 6231 6439 - if (pcysta->collision_cnt) { 6440 - seq_printf(m, 6441 - ", collision:%d", pcysta->collision_cnt); 6232 + if (le32_to_cpu(pcysta_le32->collision_cnt)) { 6233 + seq_printf(m, ", collision:%d", 6234 + le32_to_cpu(pcysta_le32->collision_cnt)); 6442 6235 } 6443 6236 6444 - if (pcysta->skip_cnt) { 6445 - seq_printf(m, 6446 - ", skip:%d", pcysta->skip_cnt); 6237 + if (le32_to_cpu(pcysta_le32->skip_cnt)) { 6238 + seq_printf(m, ", skip:%d", 6239 + le32_to_cpu(pcysta_le32->skip_cnt)); 6447 6240 } 6448 6241 seq_puts(m, "\n"); 6449 6242 6450 6243 seq_printf(m, " %-15s : avg_t[wl:%d/bt:%d/lk:%d.%03d]", 6451 6244 "[cycle_time]", 6452 - pcysta->tavg_cycle[CXT_WL], 6453 - pcysta->tavg_cycle[CXT_BT], 6454 - pcysta->tavg_lk / 1000, pcysta->tavg_lk % 1000); 6455 - seq_printf(m, 6456 - ", max_t[wl:%d/bt:%d/lk:%d.%03d]", 6457 - pcysta->tmax_cycle[CXT_WL], 6458 - pcysta->tmax_cycle[CXT_BT], 6459 - pcysta->tmax_lk / 1000, pcysta->tmax_lk % 1000); 6460 - seq_printf(m, 6461 - ", maxdiff_t[wl:%d/bt:%d]\n", 6462 - pcysta->tmaxdiff_cycle[CXT_WL], 6463 - pcysta->tmaxdiff_cycle[CXT_BT]); 6245 + le16_to_cpu(pcysta_le32->tavg_cycle[CXT_WL]), 6246 + le16_to_cpu(pcysta_le32->tavg_cycle[CXT_BT]), 6247 + le16_to_cpu(pcysta_le32->tavg_lk) / 1000, 6248 + le16_to_cpu(pcysta_le32->tavg_lk) % 1000); 6249 + seq_printf(m, ", max_t[wl:%d/bt:%d/lk:%d.%03d]", 6250 + le16_to_cpu(pcysta_le32->tmax_cycle[CXT_WL]), 6251 + le16_to_cpu(pcysta_le32->tmax_cycle[CXT_BT]), 6252 + le16_to_cpu(pcysta_le32->tmax_lk) / 1000, 6253 + le16_to_cpu(pcysta_le32->tmax_lk) % 1000); 6254 + seq_printf(m, ", maxdiff_t[wl:%d/bt:%d]\n", 6255 + le16_to_cpu(pcysta_le32->tmaxdiff_cycle[CXT_WL]), 6256 + le16_to_cpu(pcysta_le32->tmaxdiff_cycle[CXT_BT])); 6464 6257 6465 - if (pcysta->cycles == 0) 6258 + if (le16_to_cpu(pcysta_le32->cycles) == 0) 6466 6259 return; 6467 6260 6468 6261 /* 1 cycle record 1 wl-slot and 1 bt-slot */ 6469 6262 slot_pair = BTC_CYCLE_SLOT_MAX / 2; 6470 6263 6471 - if (pcysta->cycles <= slot_pair) 6264 + if (le16_to_cpu(pcysta_le32->cycles) <= slot_pair) 6472 6265 c_begin = 1; 6473 6266 else 6474 - c_begin = pcysta->cycles - slot_pair + 1; 6267 + c_begin = le16_to_cpu(pcysta_le32->cycles) - slot_pair + 1; 6475 6268 6476 - c_end = pcysta->cycles; 6269 + c_end = le16_to_cpu(pcysta_le32->cycles); 6477 6270 6478 6271 for (cycle = c_begin; cycle <= c_end; cycle++) { 6479 6272 cnt++; ··· 6483 6274 if (cnt % (BTC_CYCLE_SLOT_MAX / 4) == 1) 6484 6275 seq_printf(m, 6485 6276 " %-15s : ->b%02d->w%02d", "[cycle_step]", 6486 - pcysta->tslot_cycle[store_index], 6487 - pcysta->tslot_cycle[store_index + 1]); 6277 + le16_to_cpu(pcysta_le32->tslot_cycle[store_index]), 6278 + le16_to_cpu(pcysta_le32->tslot_cycle[store_index + 1])); 6488 6279 else 6489 6280 seq_printf(m, 6490 6281 "->b%02d->w%02d", 6491 - pcysta->tslot_cycle[store_index], 6492 - pcysta->tslot_cycle[store_index + 1]); 6282 + le16_to_cpu(pcysta_le32->tslot_cycle[store_index]), 6283 + le16_to_cpu(pcysta_le32->tslot_cycle[store_index + 1])); 6493 6284 if (cnt % (BTC_CYCLE_SLOT_MAX / 4) == 0 || cnt == c_end) 6494 6285 seq_puts(m, "\n"); 6495 6286 } ··· 6498 6289 seq_printf(m, 6499 6290 " %-15s : a2dp_ept:%d, a2dp_late:%d", 6500 6291 "[a2dp_t_sta]", 6501 - pcysta->a2dpept, pcysta->a2dpeptto); 6292 + le16_to_cpu(pcysta_le32->a2dpept), 6293 + le16_to_cpu(pcysta_le32->a2dpeptto)); 6502 6294 6503 6295 seq_printf(m, 6504 6296 ", avg_t:%d, max_t:%d", 6505 - pcysta->tavg_a2dpept, pcysta->tmax_a2dpept); 6297 + le16_to_cpu(pcysta_le32->tavg_a2dpept), 6298 + le16_to_cpu(pcysta_le32->tmax_a2dpept)); 6506 6299 r.val = dm->tdma_now.rxflctrl; 6507 6300 6508 6301 if (r.type && r.tgln_n) { 6509 6302 seq_printf(m, 6510 6303 ", cycle[PSTDMA:%d/TDMA:%d], ", 6511 - pcysta->cycles_a2dp[CXT_FLCTRL_ON], 6512 - pcysta->cycles_a2dp[CXT_FLCTRL_OFF]); 6304 + le16_to_cpu(pcysta_le32->cycles_a2dp[CXT_FLCTRL_ON]), 6305 + le16_to_cpu(pcysta_le32->cycles_a2dp[CXT_FLCTRL_OFF])); 6513 6306 6514 6307 seq_printf(m, 6515 6308 "avg_t[PSTDMA:%d/TDMA:%d], ", 6516 - pcysta->tavg_a2dp[CXT_FLCTRL_ON], 6517 - pcysta->tavg_a2dp[CXT_FLCTRL_OFF]); 6309 + le16_to_cpu(pcysta_le32->tavg_a2dp[CXT_FLCTRL_ON]), 6310 + le16_to_cpu(pcysta_le32->tavg_a2dp[CXT_FLCTRL_OFF])); 6518 6311 6519 6312 seq_printf(m, 6520 6313 "max_t[PSTDMA:%d/TDMA:%d]", 6521 - pcysta->tmax_a2dp[CXT_FLCTRL_ON], 6522 - pcysta->tmax_a2dp[CXT_FLCTRL_OFF]); 6314 + le16_to_cpu(pcysta_le32->tmax_a2dp[CXT_FLCTRL_ON]), 6315 + le16_to_cpu(pcysta_le32->tmax_a2dp[CXT_FLCTRL_OFF])); 6523 6316 } 6524 6317 seq_puts(m, "\n"); 6525 6318 } 6526 6319 } 6527 6320 6528 - static void _show_fbtc_cysta_v1(struct rtw89_dev *rtwdev, struct seq_file *m) 6321 + static void _show_fbtc_cysta_v3(struct rtw89_dev *rtwdev, struct seq_file *m) 6529 6322 { 6530 6323 struct rtw89_btc *btc = &rtwdev->btc; 6531 6324 struct rtw89_btc_bt_a2dp_desc *a2dp = &btc->cx.bt.link_info.a2dp_desc; 6532 6325 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; 6533 6326 struct rtw89_btc_dm *dm = &btc->dm; 6534 6327 struct rtw89_btc_fbtc_a2dp_trx_stat *a2dp_trx; 6535 - struct rtw89_btc_fbtc_cysta_v1 *pcysta; 6328 + struct rtw89_btc_fbtc_cysta_v3 *pcysta; 6536 6329 struct rtw89_btc_rpt_cmn_info *pcinfo; 6537 6330 u8 i, cnt = 0, slot_pair, divide_cnt; 6538 6331 u16 cycle, c_begin, c_end, store_index; ··· 6543 6332 if (!pcinfo->valid) 6544 6333 return; 6545 6334 6546 - pcysta = &pfwinfo->rpt_fbtc_cysta.finfo_v1; 6335 + pcysta = &pfwinfo->rpt_fbtc_cysta.finfo.v3; 6547 6336 seq_printf(m, 6548 6337 " %-15s : cycle:%d, bcn[all:%d/all_ok:%d/bt:%d/bt_ok:%d]", 6549 6338 "[cycle_cnt]", ··· 6658 6447 } 6659 6448 } 6660 6449 6450 + static void _show_fbtc_cysta_v4(struct rtw89_dev *rtwdev, struct seq_file *m) 6451 + { 6452 + struct rtw89_btc *btc = &rtwdev->btc; 6453 + struct rtw89_btc_bt_a2dp_desc *a2dp = &btc->cx.bt.link_info.a2dp_desc; 6454 + struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; 6455 + struct rtw89_btc_dm *dm = &btc->dm; 6456 + struct rtw89_btc_fbtc_a2dp_trx_stat_v4 *a2dp_trx; 6457 + struct rtw89_btc_fbtc_cysta_v4 *pcysta; 6458 + struct rtw89_btc_rpt_cmn_info *pcinfo; 6459 + u8 i, cnt = 0, slot_pair, divide_cnt; 6460 + u16 cycle, c_begin, c_end, store_index; 6461 + 6462 + pcinfo = &pfwinfo->rpt_fbtc_cysta.cinfo; 6463 + if (!pcinfo->valid) 6464 + return; 6465 + 6466 + pcysta = &pfwinfo->rpt_fbtc_cysta.finfo.v4; 6467 + seq_printf(m, 6468 + " %-15s : cycle:%d, bcn[all:%d/all_ok:%d/bt:%d/bt_ok:%d]", 6469 + "[cycle_cnt]", 6470 + le16_to_cpu(pcysta->cycles), 6471 + le16_to_cpu(pcysta->bcn_cnt[CXBCN_ALL]), 6472 + le16_to_cpu(pcysta->bcn_cnt[CXBCN_ALL_OK]), 6473 + le16_to_cpu(pcysta->bcn_cnt[CXBCN_BT_SLOT]), 6474 + le16_to_cpu(pcysta->bcn_cnt[CXBCN_BT_OK])); 6475 + 6476 + for (i = 0; i < CXST_MAX; i++) { 6477 + if (!le16_to_cpu(pcysta->slot_cnt[i])) 6478 + continue; 6479 + 6480 + seq_printf(m, ", %s:%d", id_to_slot(i), 6481 + le16_to_cpu(pcysta->slot_cnt[i])); 6482 + } 6483 + 6484 + if (dm->tdma_now.rxflctrl) 6485 + seq_printf(m, ", leak_rx:%d", 6486 + le32_to_cpu(pcysta->leak_slot.cnt_rximr)); 6487 + 6488 + if (pcysta->collision_cnt) 6489 + seq_printf(m, ", collision:%d", pcysta->collision_cnt); 6490 + 6491 + if (le16_to_cpu(pcysta->skip_cnt)) 6492 + seq_printf(m, ", skip:%d", 6493 + le16_to_cpu(pcysta->skip_cnt)); 6494 + 6495 + seq_puts(m, "\n"); 6496 + 6497 + seq_printf(m, " %-15s : avg_t[wl:%d/bt:%d/lk:%d.%03d]", 6498 + "[cycle_time]", 6499 + le16_to_cpu(pcysta->cycle_time.tavg[CXT_WL]), 6500 + le16_to_cpu(pcysta->cycle_time.tavg[CXT_BT]), 6501 + le16_to_cpu(pcysta->leak_slot.tavg) / 1000, 6502 + le16_to_cpu(pcysta->leak_slot.tavg) % 1000); 6503 + seq_printf(m, 6504 + ", max_t[wl:%d/bt:%d/lk:%d.%03d]", 6505 + le16_to_cpu(pcysta->cycle_time.tmax[CXT_WL]), 6506 + le16_to_cpu(pcysta->cycle_time.tmax[CXT_BT]), 6507 + le16_to_cpu(pcysta->leak_slot.tmax) / 1000, 6508 + le16_to_cpu(pcysta->leak_slot.tmax) % 1000); 6509 + seq_printf(m, 6510 + ", maxdiff_t[wl:%d/bt:%d]\n", 6511 + le16_to_cpu(pcysta->cycle_time.tmaxdiff[CXT_WL]), 6512 + le16_to_cpu(pcysta->cycle_time.tmaxdiff[CXT_BT])); 6513 + 6514 + cycle = le16_to_cpu(pcysta->cycles); 6515 + if (cycle == 0) 6516 + return; 6517 + 6518 + /* 1 cycle record 1 wl-slot and 1 bt-slot */ 6519 + slot_pair = BTC_CYCLE_SLOT_MAX / 2; 6520 + 6521 + if (cycle <= slot_pair) 6522 + c_begin = 1; 6523 + else 6524 + c_begin = cycle - slot_pair + 1; 6525 + 6526 + c_end = cycle; 6527 + 6528 + if (a2dp->exist) 6529 + divide_cnt = 3; 6530 + else 6531 + divide_cnt = BTC_CYCLE_SLOT_MAX / 4; 6532 + 6533 + for (cycle = c_begin; cycle <= c_end; cycle++) { 6534 + cnt++; 6535 + store_index = ((cycle - 1) % slot_pair) * 2; 6536 + 6537 + if (cnt % divide_cnt == 1) { 6538 + seq_printf(m, "\n\r %-15s : ", "[cycle_step]"); 6539 + } else { 6540 + seq_printf(m, "->b%02d", 6541 + le16_to_cpu(pcysta->slot_step_time[store_index])); 6542 + if (a2dp->exist) { 6543 + a2dp_trx = &pcysta->a2dp_trx[store_index]; 6544 + seq_printf(m, "(%d/%d/%dM/%d/%d/%d)", 6545 + a2dp_trx->empty_cnt, 6546 + a2dp_trx->retry_cnt, 6547 + a2dp_trx->tx_rate ? 3 : 2, 6548 + a2dp_trx->tx_cnt, 6549 + a2dp_trx->ack_cnt, 6550 + a2dp_trx->nack_cnt); 6551 + } 6552 + seq_printf(m, "->w%02d", 6553 + le16_to_cpu(pcysta->slot_step_time[store_index + 1])); 6554 + if (a2dp->exist) { 6555 + a2dp_trx = &pcysta->a2dp_trx[store_index + 1]; 6556 + seq_printf(m, "(%d/%d/%dM/%d/%d/%d)", 6557 + a2dp_trx->empty_cnt, 6558 + a2dp_trx->retry_cnt, 6559 + a2dp_trx->tx_rate ? 3 : 2, 6560 + a2dp_trx->tx_cnt, 6561 + a2dp_trx->ack_cnt, 6562 + a2dp_trx->nack_cnt); 6563 + } 6564 + } 6565 + if (cnt % (BTC_CYCLE_SLOT_MAX / 4) == 0 || cnt == c_end) 6566 + seq_puts(m, "\n"); 6567 + } 6568 + 6569 + if (a2dp->exist) { 6570 + seq_printf(m, "%-15s : a2dp_ept:%d, a2dp_late:%d", 6571 + "[a2dp_t_sta]", 6572 + le16_to_cpu(pcysta->a2dp_ept.cnt), 6573 + le16_to_cpu(pcysta->a2dp_ept.cnt_timeout)); 6574 + 6575 + seq_printf(m, ", avg_t:%d, max_t:%d", 6576 + le16_to_cpu(pcysta->a2dp_ept.tavg), 6577 + le16_to_cpu(pcysta->a2dp_ept.tmax)); 6578 + 6579 + seq_puts(m, "\n"); 6580 + } 6581 + } 6582 + 6661 6583 static void _show_fbtc_nullsta(struct rtw89_dev *rtwdev, struct seq_file *m) 6662 6584 { 6663 - const struct rtw89_chip_info *chip = rtwdev->chip; 6664 6585 struct rtw89_btc *btc = &rtwdev->btc; 6586 + const struct rtw89_btc_ver *ver = btc->ver; 6665 6587 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; 6666 6588 struct rtw89_btc_rpt_cmn_info *pcinfo; 6667 - struct rtw89_btc_fbtc_cynullsta *ns; 6668 - struct rtw89_btc_fbtc_cynullsta_v1 *ns_v1; 6589 + union rtw89_btc_fbtc_cynullsta_info *ns; 6669 6590 u8 i = 0; 6670 6591 6671 6592 if (!btc->dm.tdma_now.rxflctrl) ··· 6807 6464 if (!pcinfo->valid) 6808 6465 return; 6809 6466 6810 - if (chip->chip_id == RTL8852A) { 6811 - ns = &pfwinfo->rpt_fbtc_nullsta.finfo; 6812 - 6467 + ns = &pfwinfo->rpt_fbtc_nullsta.finfo; 6468 + if (ver->fcxnullsta == 1) { 6813 6469 seq_printf(m, " %-15s : ", "[null_sta]"); 6814 6470 6815 6471 for (i = 0; i < 2; i++) { ··· 6817 6475 else 6818 6476 seq_printf(m, "null-%d", i); 6819 6477 seq_printf(m, "[ok:%d/", 6820 - le32_to_cpu(ns->result[i][1])); 6478 + le32_to_cpu(ns->v1.result[i][1])); 6821 6479 seq_printf(m, "fail:%d/", 6822 - le32_to_cpu(ns->result[i][0])); 6480 + le32_to_cpu(ns->v1.result[i][0])); 6823 6481 seq_printf(m, "on_time:%d/", 6824 - le32_to_cpu(ns->result[i][2])); 6482 + le32_to_cpu(ns->v1.result[i][2])); 6825 6483 seq_printf(m, "retry:%d/", 6826 - le32_to_cpu(ns->result[i][3])); 6484 + le32_to_cpu(ns->v1.result[i][3])); 6827 6485 seq_printf(m, "avg_t:%d.%03d/", 6828 - le32_to_cpu(ns->avg_t[i]) / 1000, 6829 - le32_to_cpu(ns->avg_t[i]) % 1000); 6486 + le32_to_cpu(ns->v1.avg_t[i]) / 1000, 6487 + le32_to_cpu(ns->v1.avg_t[i]) % 1000); 6830 6488 seq_printf(m, "max_t:%d.%03d]", 6831 - le32_to_cpu(ns->max_t[i]) / 1000, 6832 - le32_to_cpu(ns->max_t[i]) % 1000); 6489 + le32_to_cpu(ns->v1.max_t[i]) / 1000, 6490 + le32_to_cpu(ns->v1.max_t[i]) % 1000); 6833 6491 } 6834 6492 } else { 6835 - ns_v1 = &pfwinfo->rpt_fbtc_nullsta.finfo_v1; 6836 - 6837 6493 seq_printf(m, " %-15s : ", "[null_sta]"); 6838 - 6839 6494 for (i = 0; i < 2; i++) { 6840 6495 if (i != 0) 6841 6496 seq_printf(m, ", null-%d", i); 6842 6497 else 6843 6498 seq_printf(m, "null-%d", i); 6844 6499 seq_printf(m, "[Tx:%d/", 6845 - le32_to_cpu(ns_v1->result[i][4])); 6500 + le32_to_cpu(ns->v2.result[i][4])); 6846 6501 seq_printf(m, "[ok:%d/", 6847 - le32_to_cpu(ns_v1->result[i][1])); 6502 + le32_to_cpu(ns->v2.result[i][1])); 6848 6503 seq_printf(m, "fail:%d/", 6849 - le32_to_cpu(ns_v1->result[i][0])); 6504 + le32_to_cpu(ns->v2.result[i][0])); 6850 6505 seq_printf(m, "on_time:%d/", 6851 - le32_to_cpu(ns_v1->result[i][2])); 6506 + le32_to_cpu(ns->v2.result[i][2])); 6852 6507 seq_printf(m, "retry:%d/", 6853 - le32_to_cpu(ns_v1->result[i][3])); 6508 + le32_to_cpu(ns->v2.result[i][3])); 6854 6509 seq_printf(m, "avg_t:%d.%03d/", 6855 - le32_to_cpu(ns_v1->avg_t[i]) / 1000, 6856 - le32_to_cpu(ns_v1->avg_t[i]) % 1000); 6510 + le32_to_cpu(ns->v2.avg_t[i]) / 1000, 6511 + le32_to_cpu(ns->v2.avg_t[i]) % 1000); 6857 6512 seq_printf(m, "max_t:%d.%03d]", 6858 - le32_to_cpu(ns_v1->max_t[i]) / 1000, 6859 - le32_to_cpu(ns_v1->max_t[i]) % 1000); 6513 + le32_to_cpu(ns->v2.max_t[i]) / 1000, 6514 + le32_to_cpu(ns->v2.max_t[i]) % 1000); 6860 6515 } 6861 6516 } 6862 6517 seq_puts(m, "\n"); 6863 6518 } 6864 6519 6865 - static void _show_fbtc_step(struct rtw89_dev *rtwdev, struct seq_file *m) 6520 + static void _show_fbtc_step_v2(struct rtw89_dev *rtwdev, struct seq_file *m) 6866 6521 { 6867 6522 struct rtw89_btc *btc = &rtwdev->btc; 6868 6523 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; 6869 6524 struct rtw89_btc_rpt_cmn_info *pcinfo = NULL; 6870 - struct rtw89_btc_fbtc_steps *pstep = NULL; 6525 + struct rtw89_btc_fbtc_steps_v2 *pstep = NULL; 6871 6526 u8 type, val, cnt = 0, state = 0; 6872 6527 bool outloop = false; 6873 6528 u16 i, diff_t, n_start = 0, n_stop = 0; ··· 6874 6535 if (!pcinfo->valid) 6875 6536 return; 6876 6537 6877 - pstep = &pfwinfo->rpt_fbtc_step.finfo; 6538 + pstep = &pfwinfo->rpt_fbtc_step.finfo.v2; 6878 6539 pos_old = le16_to_cpu(pstep->pos_old); 6879 6540 pos_new = le16_to_cpu(pstep->pos_new); 6880 6541 ··· 6928 6589 } while (!outloop); 6929 6590 } 6930 6591 6592 + static void _show_fbtc_step_v3(struct rtw89_dev *rtwdev, struct seq_file *m) 6593 + { 6594 + struct rtw89_btc *btc = &rtwdev->btc; 6595 + struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; 6596 + struct rtw89_btc_rpt_cmn_info *pcinfo; 6597 + struct rtw89_btc_fbtc_steps_v3 *pstep; 6598 + u32 i, n_begin, n_end, array_idx, cnt = 0; 6599 + u8 type, val; 6600 + u16 diff_t; 6601 + 6602 + if ((pfwinfo->rpt_en_map & 6603 + rtw89_btc_fw_rpt_ver(rtwdev, RPT_EN_FW_STEP_INFO)) == 0) 6604 + return; 6605 + 6606 + pcinfo = &pfwinfo->rpt_fbtc_step.cinfo; 6607 + if (!pcinfo->valid) 6608 + return; 6609 + 6610 + pstep = &pfwinfo->rpt_fbtc_step.finfo.v3; 6611 + if (pcinfo->req_fver != pstep->fver) 6612 + return; 6613 + 6614 + if (le32_to_cpu(pstep->cnt) <= FCXDEF_STEP) 6615 + n_begin = 1; 6616 + else 6617 + n_begin = le32_to_cpu(pstep->cnt) - FCXDEF_STEP + 1; 6618 + 6619 + n_end = le32_to_cpu(pstep->cnt); 6620 + 6621 + if (n_begin > n_end) 6622 + return; 6623 + 6624 + /* restore step info by using ring instead of FIFO */ 6625 + for (i = n_begin; i <= n_end; i++) { 6626 + array_idx = (i - 1) % FCXDEF_STEP; 6627 + type = pstep->step[array_idx].type; 6628 + val = pstep->step[array_idx].val; 6629 + diff_t = le16_to_cpu(pstep->step[array_idx].difft); 6630 + 6631 + if (type == CXSTEP_NONE || type >= CXSTEP_MAX) 6632 + continue; 6633 + 6634 + if (cnt % 10 == 0) 6635 + seq_printf(m, " %-15s : ", "[steps]"); 6636 + 6637 + seq_printf(m, "-> %s(%02d)", 6638 + (type == CXSTEP_SLOT ? 6639 + id_to_slot((u32)val) : 6640 + id_to_evt((u32)val)), diff_t); 6641 + 6642 + if (cnt % 10 == 9) 6643 + seq_puts(m, "\n"); 6644 + 6645 + cnt++; 6646 + } 6647 + } 6648 + 6931 6649 static void _show_fw_dm_msg(struct rtw89_dev *rtwdev, struct seq_file *m) 6932 6650 { 6933 - const struct rtw89_chip_info *chip = rtwdev->chip; 6934 6651 struct rtw89_btc *btc = &rtwdev->btc; 6652 + const struct rtw89_btc_ver *ver = btc->ver; 6935 6653 6936 6654 if (!(btc->dm.coex_info_map & BTC_COEX_INFO_DM)) 6937 6655 return; ··· 6997 6601 _show_fbtc_tdma(rtwdev, m); 6998 6602 _show_fbtc_slots(rtwdev, m); 6999 6603 7000 - if (chip->chip_id == RTL8852A) 7001 - _show_fbtc_cysta(rtwdev, m); 7002 - else 7003 - _show_fbtc_cysta_v1(rtwdev, m); 6604 + if (ver->fcxcysta == 2) 6605 + _show_fbtc_cysta_v2(rtwdev, m); 6606 + else if (ver->fcxcysta == 3) 6607 + _show_fbtc_cysta_v3(rtwdev, m); 6608 + else if (ver->fcxcysta == 4) 6609 + _show_fbtc_cysta_v4(rtwdev, m); 7004 6610 7005 6611 _show_fbtc_nullsta(rtwdev, m); 7006 - _show_fbtc_step(rtwdev, m); 6612 + 6613 + if (ver->fcxstep == 2) 6614 + _show_fbtc_step_v2(rtwdev, m); 6615 + else if (ver->fcxstep == 3) 6616 + _show_fbtc_step_v3(rtwdev, m); 6617 + 7007 6618 } 7008 6619 7009 6620 static void _get_gnt(struct rtw89_dev *rtwdev, struct rtw89_mac_ax_coex_gnt *gnt_cfg) ··· 7083 6680 7084 6681 /* To avoid I/O if WL LPS or power-off */ 7085 6682 if (!wl->status.map.lps && !wl->status.map.rf_off) { 7086 - if (chip->chip_id == RTL8852A) 7087 - btc->dm.pta_owner = rtw89_mac_get_ctrl_path(rtwdev); 7088 - else if (chip->chip_id == RTL8852C) 7089 - btc->dm.pta_owner = 0; 6683 + btc->dm.pta_owner = rtw89_mac_get_ctrl_path(rtwdev); 7090 6684 7091 6685 _get_gnt(rtwdev, &gnt_cfg); 7092 6686 gnt = gnt_cfg.band[0]; ··· 7154 6754 seq_puts(m, "\n"); 7155 6755 } 7156 6756 7157 - static void _show_summary(struct rtw89_dev *rtwdev, struct seq_file *m) 6757 + static void _show_summary_v1(struct rtw89_dev *rtwdev, struct seq_file *m) 7158 6758 { 7159 6759 struct rtw89_btc *btc = &rtwdev->btc; 7160 6760 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; 7161 6761 struct rtw89_btc_rpt_cmn_info *pcinfo = NULL; 7162 - struct rtw89_btc_fbtc_rpt_ctrl *prptctrl = NULL; 6762 + struct rtw89_btc_fbtc_rpt_ctrl_v1 *prptctrl = NULL; 7163 6763 struct rtw89_btc_cx *cx = &btc->cx; 7164 6764 struct rtw89_btc_dm *dm = &btc->dm; 7165 6765 struct rtw89_btc_wl_info *wl = &cx->wl; ··· 7174 6774 7175 6775 pcinfo = &pfwinfo->rpt_ctrl.cinfo; 7176 6776 if (pcinfo->valid && !wl->status.map.lps && !wl->status.map.rf_off) { 7177 - prptctrl = &pfwinfo->rpt_ctrl.finfo; 6777 + prptctrl = &pfwinfo->rpt_ctrl.finfo.v1; 7178 6778 7179 6779 seq_printf(m, 7180 6780 " %-15s : h2c_cnt=%d(fail:%d, fw_recv:%d), c2h_cnt=%d(fw_send:%d), ", ··· 7258 6858 cnt[BTC_NCNT_CUSTOMERIZE]); 7259 6859 } 7260 6860 7261 - static void _show_summary_v1(struct rtw89_dev *rtwdev, struct seq_file *m) 6861 + static void _show_summary_v4(struct rtw89_dev *rtwdev, struct seq_file *m) 7262 6862 { 7263 6863 struct rtw89_btc *btc = &rtwdev->btc; 7264 6864 struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; 7265 - struct rtw89_btc_fbtc_rpt_ctrl_v1 *prptctrl; 6865 + struct rtw89_btc_fbtc_rpt_ctrl_v4 *prptctrl; 7266 6866 struct rtw89_btc_rpt_cmn_info *pcinfo; 7267 6867 struct rtw89_btc_cx *cx = &btc->cx; 7268 6868 struct rtw89_btc_dm *dm = &btc->dm; ··· 7278 6878 7279 6879 pcinfo = &pfwinfo->rpt_ctrl.cinfo; 7280 6880 if (pcinfo->valid && !wl->status.map.lps && !wl->status.map.rf_off) { 7281 - prptctrl = &pfwinfo->rpt_ctrl.finfo_v1; 6881 + prptctrl = &pfwinfo->rpt_ctrl.finfo.v4; 7282 6882 7283 6883 seq_printf(m, 7284 6884 " %-15s : h2c_cnt=%d(fail:%d, fw_recv:%d), c2h_cnt=%d(fw_send:%d), ", ··· 7370 6970 cnt[BTC_NCNT_CUSTOMERIZE]); 7371 6971 } 7372 6972 6973 + static void _show_summary_v5(struct rtw89_dev *rtwdev, struct seq_file *m) 6974 + { 6975 + struct rtw89_btc *btc = &rtwdev->btc; 6976 + struct rtw89_btc_btf_fwinfo *pfwinfo = &btc->fwinfo; 6977 + struct rtw89_btc_fbtc_rpt_ctrl_v5 *prptctrl; 6978 + struct rtw89_btc_rpt_cmn_info *pcinfo; 6979 + struct rtw89_btc_cx *cx = &btc->cx; 6980 + struct rtw89_btc_dm *dm = &btc->dm; 6981 + struct rtw89_btc_wl_info *wl = &cx->wl; 6982 + u32 cnt_sum = 0, *cnt = btc->dm.cnt_notify; 6983 + u8 i; 6984 + 6985 + if (!(dm->coex_info_map & BTC_COEX_INFO_SUMMARY)) 6986 + return; 6987 + 6988 + seq_puts(m, "========== [Statistics] ==========\n"); 6989 + 6990 + pcinfo = &pfwinfo->rpt_ctrl.cinfo; 6991 + if (pcinfo->valid && !wl->status.map.lps && !wl->status.map.rf_off) { 6992 + prptctrl = &pfwinfo->rpt_ctrl.finfo.v5; 6993 + 6994 + seq_printf(m, 6995 + " %-15s : h2c_cnt=%d(fail:%d, fw_recv:%d), c2h_cnt=%d(fw_send:%d, len:%d), ", 6996 + "[summary]", pfwinfo->cnt_h2c, pfwinfo->cnt_h2c_fail, 6997 + le16_to_cpu(prptctrl->rpt_info.cnt_h2c), 6998 + pfwinfo->cnt_c2h, 6999 + le16_to_cpu(prptctrl->rpt_info.cnt_c2h), 7000 + le16_to_cpu(prptctrl->rpt_info.len_c2h)); 7001 + 7002 + seq_printf(m, 7003 + "rpt_cnt=%d(fw_send:%d), rpt_map=0x%x", 7004 + pfwinfo->event[BTF_EVNT_RPT], 7005 + le16_to_cpu(prptctrl->rpt_info.cnt), 7006 + le32_to_cpu(prptctrl->rpt_info.en)); 7007 + 7008 + if (dm->error.map.wl_fw_hang) 7009 + seq_puts(m, " (WL FW Hang!!)"); 7010 + seq_puts(m, "\n"); 7011 + seq_printf(m, 7012 + " %-15s : send_ok:%d, send_fail:%d, recv:%d, ", 7013 + "[mailbox]", 7014 + le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_ok), 7015 + le32_to_cpu(prptctrl->bt_mbx_info.cnt_send_fail), 7016 + le32_to_cpu(prptctrl->bt_mbx_info.cnt_recv)); 7017 + 7018 + seq_printf(m, 7019 + "A2DP_empty:%d(stop:%d, tx:%d, ack:%d, nack:%d)\n", 7020 + le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_empty), 7021 + le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_flowctrl), 7022 + le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_tx), 7023 + le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_ack), 7024 + le32_to_cpu(prptctrl->bt_mbx_info.a2dp.cnt_nack)); 7025 + 7026 + seq_printf(m, 7027 + " %-15s : wl_rfk[req:%d/go:%d/reject:%d/tout:%d]", 7028 + "[RFK/LPS]", cx->cnt_wl[BTC_WCNT_RFK_REQ], 7029 + cx->cnt_wl[BTC_WCNT_RFK_GO], 7030 + cx->cnt_wl[BTC_WCNT_RFK_REJECT], 7031 + cx->cnt_wl[BTC_WCNT_RFK_TIMEOUT]); 7032 + 7033 + seq_printf(m, 7034 + ", bt_rfk[req:%d]", 7035 + le16_to_cpu(prptctrl->bt_cnt[BTC_BCNT_RFK_REQ])); 7036 + 7037 + seq_printf(m, 7038 + ", AOAC[RF_on:%d/RF_off:%d]", 7039 + le16_to_cpu(prptctrl->rpt_info.cnt_aoac_rf_on), 7040 + le16_to_cpu(prptctrl->rpt_info.cnt_aoac_rf_off)); 7041 + } else { 7042 + seq_puts(m, "\n"); 7043 + seq_printf(m, 7044 + " %-15s : h2c_cnt=%d(fail:%d), c2h_cnt=%d", 7045 + "[summary]", pfwinfo->cnt_h2c, 7046 + pfwinfo->cnt_h2c_fail, pfwinfo->cnt_c2h); 7047 + } 7048 + 7049 + if (!pcinfo->valid || pfwinfo->len_mismch || pfwinfo->fver_mismch || 7050 + pfwinfo->err[BTFRE_EXCEPTION]) { 7051 + seq_puts(m, "\n"); 7052 + seq_printf(m, 7053 + " %-15s : WL FW rpt error!![rpt_ctrl_valid:%d/len:" 7054 + "0x%x/ver:0x%x/ex:%d/lps=%d/rf_off=%d]", 7055 + "[ERROR]", pcinfo->valid, pfwinfo->len_mismch, 7056 + pfwinfo->fver_mismch, pfwinfo->err[BTFRE_EXCEPTION], 7057 + wl->status.map.lps, wl->status.map.rf_off); 7058 + } 7059 + 7060 + for (i = 0; i < BTC_NCNT_NUM; i++) 7061 + cnt_sum += dm->cnt_notify[i]; 7062 + 7063 + seq_puts(m, "\n"); 7064 + seq_printf(m, 7065 + " %-15s : total=%d, show_coex_info=%d, power_on=%d, init_coex=%d, ", 7066 + "[notify_cnt]", 7067 + cnt_sum, cnt[BTC_NCNT_SHOW_COEX_INFO], 7068 + cnt[BTC_NCNT_POWER_ON], cnt[BTC_NCNT_INIT_COEX]); 7069 + 7070 + seq_printf(m, 7071 + "power_off=%d, radio_state=%d, role_info=%d, wl_rfk=%d, wl_sta=%d", 7072 + cnt[BTC_NCNT_POWER_OFF], cnt[BTC_NCNT_RADIO_STATE], 7073 + cnt[BTC_NCNT_ROLE_INFO], cnt[BTC_NCNT_WL_RFK], 7074 + cnt[BTC_NCNT_WL_STA]); 7075 + 7076 + seq_puts(m, "\n"); 7077 + seq_printf(m, 7078 + " %-15s : scan_start=%d, scan_finish=%d, switch_band=%d, special_pkt=%d, ", 7079 + "[notify_cnt]", 7080 + cnt[BTC_NCNT_SCAN_START], cnt[BTC_NCNT_SCAN_FINISH], 7081 + cnt[BTC_NCNT_SWITCH_BAND], cnt[BTC_NCNT_SPECIAL_PACKET]); 7082 + 7083 + seq_printf(m, 7084 + "timer=%d, control=%d, customerize=%d", 7085 + cnt[BTC_NCNT_TIMER], cnt[BTC_NCNT_CONTROL], 7086 + cnt[BTC_NCNT_CUSTOMERIZE]); 7087 + } 7088 + 7373 7089 void rtw89_btc_dump_info(struct rtw89_dev *rtwdev, struct seq_file *m) 7374 7090 { 7375 - const struct rtw89_chip_info *chip = rtwdev->chip; 7376 7091 struct rtw89_fw_suit *fw_suit = &rtwdev->fw.normal; 7377 7092 struct rtw89_btc *btc = &rtwdev->btc; 7093 + const struct rtw89_btc_ver *ver = btc->ver; 7378 7094 struct rtw89_btc_cx *cx = &btc->cx; 7379 7095 struct rtw89_btc_bt_info *bt = &cx->bt; 7380 7096 ··· 7519 7003 _show_dm_info(rtwdev, m); 7520 7004 _show_fw_dm_msg(rtwdev, m); 7521 7005 _show_mreg(rtwdev, m); 7522 - if (chip->chip_id == RTL8852A) 7523 - _show_summary(rtwdev, m); 7524 - else 7006 + if (ver->fcxbtcrpt == 1) 7525 7007 _show_summary_v1(rtwdev, m); 7008 + else if (ver->fcxbtcrpt == 4) 7009 + _show_summary_v4(rtwdev, m); 7010 + else if (ver->fcxbtcrpt == 5) 7011 + _show_summary_v5(rtwdev, m); 7012 + } 7013 + 7014 + void rtw89_coex_recognize_ver(struct rtw89_dev *rtwdev) 7015 + { 7016 + const struct rtw89_chip_info *chip = rtwdev->chip; 7017 + struct rtw89_btc *btc = &rtwdev->btc; 7018 + const struct rtw89_btc_ver *btc_ver_def; 7019 + const struct rtw89_fw_suit *fw_suit; 7020 + u32 suit_ver_code; 7021 + int i; 7022 + 7023 + fw_suit = rtw89_fw_suit_get(rtwdev, RTW89_FW_NORMAL); 7024 + suit_ver_code = RTW89_FW_SUIT_VER_CODE(fw_suit); 7025 + 7026 + for (i = 0; i < ARRAY_SIZE(rtw89_btc_ver_defs); i++) { 7027 + btc_ver_def = &rtw89_btc_ver_defs[i]; 7028 + 7029 + if (chip->chip_id != btc_ver_def->chip_id) 7030 + continue; 7031 + 7032 + if (suit_ver_code >= btc_ver_def->fw_ver_code) { 7033 + btc->ver = btc_ver_def; 7034 + goto out; 7035 + } 7036 + } 7037 + 7038 + btc->ver = &rtw89_btc_ver_defs[RTW89_DEFAULT_BTC_VER_IDX]; 7039 + 7040 + out: 7041 + rtw89_debug(rtwdev, RTW89_DBG_BTC, "[BTC] use version def[%d] = 0x%08x\n", 7042 + (int)(btc->ver - rtw89_btc_ver_defs), btc->ver->fw_ver_code); 7526 7043 }
+1
drivers/net/wireless/realtek/rtw89/coex.h
··· 164 164 void rtw89_coex_power_on(struct rtw89_dev *rtwdev); 165 165 void rtw89_btc_set_policy(struct rtw89_dev *rtwdev, u16 policy_type); 166 166 void rtw89_btc_set_policy_v1(struct rtw89_dev *rtwdev, u16 policy_type); 167 + void rtw89_coex_recognize_ver(struct rtw89_dev *rtwdev); 167 168 168 169 static inline u8 rtw89_btc_phymap(struct rtw89_dev *rtwdev, 169 170 enum rtw89_phy_idx phy_idx,
+33 -17
drivers/net/wireless/realtek/rtw89/core.c
··· 498 498 const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 499 499 u16 lowest_rate; 500 500 501 - if (tx_info->flags & IEEE80211_TX_CTL_NO_CCK_RATE || vif->p2p) 501 + if (tx_info->flags & IEEE80211_TX_CTL_NO_CCK_RATE || 502 + (vif && vif->p2p)) 502 503 lowest_rate = RTW89_HW_RATE_OFDM6; 503 504 else if (chan->band_type == RTW89_BAND_2G) 504 505 lowest_rate = RTW89_HW_RATE_CCK1; ··· 510 509 return lowest_rate; 511 510 512 511 return __ffs(vif->bss_conf.basic_rates) + lowest_rate; 512 + } 513 + 514 + static u8 rtw89_core_tx_get_mac_id(struct rtw89_dev *rtwdev, 515 + struct rtw89_core_tx_request *tx_req) 516 + { 517 + struct ieee80211_vif *vif = tx_req->vif; 518 + struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv; 519 + struct ieee80211_sta *sta = tx_req->sta; 520 + struct rtw89_sta *rtwsta; 521 + 522 + if (!sta) 523 + return rtwvif->mac_id; 524 + 525 + rtwsta = (struct rtw89_sta *)sta->drv_priv; 526 + return rtwsta->mac_id; 513 527 } 514 528 515 529 static void ··· 543 527 desc_info->qsel = qsel; 544 528 desc_info->ch_dma = ch_dma; 545 529 desc_info->port = desc_info->hiq ? rtwvif->port : 0; 530 + desc_info->mac_id = rtw89_core_tx_get_mac_id(rtwdev, tx_req); 546 531 desc_info->hw_ssn_sel = RTW89_MGMT_HW_SSN_SEL; 547 532 desc_info->hw_seq_mode = RTW89_MGMT_HW_SEQ_MODE; 548 533 ··· 686 669 desc_info->bk = true; 687 670 } 688 671 689 - static u8 rtw89_core_tx_get_mac_id(struct rtw89_dev *rtwdev, 690 - struct rtw89_core_tx_request *tx_req) 691 - { 692 - struct ieee80211_vif *vif = tx_req->vif; 693 - struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv; 694 - struct ieee80211_sta *sta = tx_req->sta; 695 - struct rtw89_sta *rtwsta; 696 - 697 - if (!sta) 698 - return rtwvif->mac_id; 699 - 700 - rtwsta = (struct rtw89_sta *)sta->drv_priv; 701 - return rtwsta->mac_id; 702 - } 703 - 704 672 static void 705 673 rtw89_core_tx_update_data_info(struct rtw89_dev *rtwdev, 706 674 struct rtw89_core_tx_request *tx_req) 707 675 { 708 676 struct ieee80211_vif *vif = tx_req->vif; 677 + struct ieee80211_sta *sta = tx_req->sta; 709 678 struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv; 679 + struct rtw89_sta *rtwsta = sta_to_rtwsta_safe(sta); 710 680 struct rtw89_phy_rate_pattern *rate_pattern = &rtwvif->rate_pattern; 711 681 const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 712 682 struct rtw89_tx_desc_info *desc_info = &tx_req->desc_info; ··· 711 707 desc_info->qsel = qsel; 712 708 desc_info->mac_id = rtw89_core_tx_get_mac_id(rtwdev, tx_req); 713 709 desc_info->port = desc_info->hiq ? rtwvif->port : 0; 710 + desc_info->er_cap = rtwsta ? rtwsta->er_cap : false; 714 711 715 712 /* enable wd_info for AMPDU */ 716 713 desc_info->en_wd_info = true; ··· 1011 1006 static __le32 rtw89_build_txwd_info0_v1(struct rtw89_tx_desc_info *desc_info) 1012 1007 { 1013 1008 u32 dword = FIELD_PREP(RTW89_TXWD_INFO0_DISDATAFB, desc_info->dis_data_fb) | 1014 - FIELD_PREP(RTW89_TXWD_INFO0_MULTIPORT_ID, desc_info->port); 1009 + FIELD_PREP(RTW89_TXWD_INFO0_MULTIPORT_ID, desc_info->port) | 1010 + FIELD_PREP(RTW89_TXWD_INFO0_DATA_ER, desc_info->er_cap) | 1011 + FIELD_PREP(RTW89_TXWD_INFO0_DATA_BW_ER, 0); 1015 1012 1016 1013 return cpu_to_le32(dword); 1017 1014 } ··· 2592 2585 rtw89_mac_bf_monitor_calc(rtwdev, sta, false); 2593 2586 2594 2587 if (vif->type == NL80211_IFTYPE_STATION && !sta->tdls) { 2588 + struct ieee80211_bss_conf *bss_conf = &vif->bss_conf; 2589 + 2590 + if (bss_conf->he_support && 2591 + !(bss_conf->he_oper.params & IEEE80211_HE_OPERATION_ER_SU_DISABLE)) 2592 + rtwsta->er_cap = true; 2593 + 2595 2594 rtw89_btc_ntfy_role_info(rtwdev, rtwvif, rtwsta, 2596 2595 BTC_ROLE_MSTS_STA_CONN_END); 2597 2596 rtw89_core_get_no_ul_ofdma_htc(rtwdev, &rtwsta->htc_template); ··· 3137 3124 INIT_DELAYED_WORK(&rtwdev->cfo_track_work, rtw89_phy_cfo_track_work); 3138 3125 INIT_DELAYED_WORK(&rtwdev->forbid_ba_work, rtw89_forbid_ba_work); 3139 3126 rtwdev->txq_wq = alloc_workqueue("rtw89_tx_wq", WQ_UNBOUND | WQ_HIGHPRI, 0); 3127 + if (!rtwdev->txq_wq) 3128 + return -ENOMEM; 3140 3129 spin_lock_init(&rtwdev->ba_lock); 3141 3130 spin_lock_init(&rtwdev->rpwm_lock); 3142 3131 mutex_init(&rtwdev->mutex); ··· 3164 3149 ret = rtw89_load_firmware(rtwdev); 3165 3150 if (ret) { 3166 3151 rtw89_warn(rtwdev, "no firmware loaded\n"); 3152 + destroy_workqueue(rtwdev->txq_wq); 3167 3153 return ret; 3168 3154 } 3169 3155 rtw89_ser_init(rtwdev);
+231 -58
drivers/net/wireless/realtek/rtw89/core.h
··· 816 816 #define RTW89_MGMT_HW_SEQ_MODE 1 817 817 bool hiq; 818 818 u8 port; 819 + bool er_cap; 819 820 }; 820 821 821 822 struct rtw89_core_tx_request { ··· 1264 1263 1265 1264 #define BTC_BT_RSSI_THMAX 4 1266 1265 #define BTC_BT_AFH_GROUP 12 1266 + #define BTC_BT_AFH_LE_GROUP 5 1267 1267 1268 1268 struct rtw89_btc_bt_link_info { 1269 1269 struct rtw89_btc_u8_sta_chg profile_cnt; ··· 1280 1278 u8 golden_rx_shift[BTC_PROFILE_MAX]; 1281 1279 u8 rssi_state[BTC_BT_RSSI_THMAX]; 1282 1280 u8 afh_map[BTC_BT_AFH_GROUP]; 1281 + u8 afh_map_le[BTC_BT_AFH_LE_GROUP]; 1283 1282 1284 1283 u32 role_sw: 1; 1285 1284 u32 slave_role: 1; ··· 1440 1437 }; 1441 1438 1442 1439 struct rtw89_btc_fbtc_tdma { 1443 - u8 type; /* chip_info::fcxtdma_ver */ 1440 + u8 type; /* btc_ver::fcxtdma */ 1444 1441 u8 rxflctrl; 1445 1442 u8 txpause; 1446 1443 u8 wtgle_n; ··· 1450 1447 u8 option_ctrl; 1451 1448 } __packed; 1452 1449 1453 - struct rtw89_btc_fbtc_tdma_v1 { 1454 - u8 fver; /* chip_info::fcxtdma_ver */ 1450 + struct rtw89_btc_fbtc_tdma_v3 { 1451 + u8 fver; /* btc_ver::fcxtdma */ 1455 1452 u8 rsvd; 1456 1453 __le16 rsvd1; 1457 1454 struct rtw89_btc_fbtc_tdma tdma; 1458 1455 } __packed; 1456 + 1457 + union rtw89_btc_fbtc_tdma_le32 { 1458 + struct rtw89_btc_fbtc_tdma v1; 1459 + struct rtw89_btc_fbtc_tdma_v3 v3; 1460 + }; 1459 1461 1460 1462 #define CXMREG_MAX 30 1461 1463 #define FCXMAX_STEP 255 /*STEP trace record cnt, Max:65535, default:255*/ ··· 1480 1472 BTC_BCNT_STA_MAX 1481 1473 }; 1482 1474 1483 - struct rtw89_btc_fbtc_rpt_ctrl { 1484 - u16 fver; /* chip_info::fcxbtcrpt_ver */ 1475 + struct rtw89_btc_fbtc_rpt_ctrl_v1 { 1476 + u16 fver; /* btc_ver::fcxbtcrpt */ 1485 1477 u16 rpt_cnt; /* tmr counters */ 1486 1478 u32 wl_fw_coex_ver; /* match which driver's coex version */ 1487 1479 u32 wl_fw_cx_offload; ··· 1512 1504 __le32 cnt_aoac_rf_off; /* rf-off counter for aoac switch notify */ 1513 1505 } __packed; 1514 1506 1507 + struct rtw89_btc_fbtc_rpt_ctrl_info_v5 { 1508 + __le32 cx_ver; /* match which driver's coex version */ 1509 + __le32 fw_ver; 1510 + __le32 en; /* report map */ 1511 + 1512 + __le16 cnt; /* fw report counter */ 1513 + __le16 cnt_c2h; /* fw send c2h counter */ 1514 + __le16 cnt_h2c; /* fw recv h2c counter */ 1515 + __le16 len_c2h; /* The total length of the last C2H */ 1516 + 1517 + __le16 cnt_aoac_rf_on; /* rf-on counter for aoac switch notify */ 1518 + __le16 cnt_aoac_rf_off; /* rf-off counter for aoac switch notify */ 1519 + } __packed; 1520 + 1515 1521 struct rtw89_btc_fbtc_rpt_ctrl_wl_fw_info { 1516 1522 __le32 cx_ver; /* match which driver's coex version */ 1517 1523 __le32 cx_offload; ··· 1547 1525 struct rtw89_btc_fbtc_rpt_ctrl_a2dp_empty a2dp; 1548 1526 } __packed; 1549 1527 1550 - struct rtw89_btc_fbtc_rpt_ctrl_v1 { 1528 + struct rtw89_btc_fbtc_rpt_ctrl_v4 { 1551 1529 u8 fver; 1552 1530 u8 rsvd; 1553 1531 __le16 rsvd1; ··· 1557 1535 __le32 bt_cnt[BTC_BCNT_STA_MAX]; 1558 1536 struct rtw89_mac_ax_gnt gnt_val[RTW89_PHY_MAX]; 1559 1537 } __packed; 1538 + 1539 + struct rtw89_btc_fbtc_rpt_ctrl_v5 { 1540 + u8 fver; 1541 + u8 rsvd; 1542 + __le16 rsvd1; 1543 + 1544 + u8 gnt_val[RTW89_PHY_MAX][4]; 1545 + __le16 bt_cnt[BTC_BCNT_STA_MAX]; 1546 + 1547 + struct rtw89_btc_fbtc_rpt_ctrl_info_v5 rpt_info; 1548 + struct rtw89_btc_fbtc_rpt_ctrl_bt_mailbox bt_mbx_info; 1549 + } __packed; 1550 + 1551 + union rtw89_btc_fbtc_rpt_ctrl_ver_info { 1552 + struct rtw89_btc_fbtc_rpt_ctrl_v1 v1; 1553 + struct rtw89_btc_fbtc_rpt_ctrl_v4 v4; 1554 + struct rtw89_btc_fbtc_rpt_ctrl_v5 v5; 1555 + }; 1560 1556 1561 1557 enum rtw89_fbtc_ext_ctrl_type { 1562 1558 CXECTL_OFF = 0x0, /* tdma off */ ··· 1611 1571 CXST_MAX = 0x12, 1612 1572 }; 1613 1573 1574 + enum rtw89_btc_cxevnt { 1575 + CXEVNT_TDMA_ENTRY = 0x0, 1576 + CXEVNT_WL_TMR, 1577 + CXEVNT_B1_TMR, 1578 + CXEVNT_B2_TMR, 1579 + CXEVNT_B3_TMR, 1580 + CXEVNT_B4_TMR, 1581 + CXEVNT_W2B_TMR, 1582 + CXEVNT_B2W_TMR, 1583 + CXEVNT_BCN_EARLY, 1584 + CXEVNT_A2DP_EMPTY, 1585 + CXEVNT_LK_END, 1586 + CXEVNT_RX_ISR, 1587 + CXEVNT_RX_FC0, 1588 + CXEVNT_RX_FC1, 1589 + CXEVNT_BT_RELINK, 1590 + CXEVNT_BT_RETRY, 1591 + CXEVNT_E2G, 1592 + CXEVNT_E5G, 1593 + CXEVNT_EBT, 1594 + CXEVNT_ENULL, 1595 + CXEVNT_DRV_WLK, 1596 + CXEVNT_BCN_OK, 1597 + CXEVNT_BT_CHANGE, 1598 + CXEVNT_EBT_EXTEND, 1599 + CXEVNT_E2G_NULL1, 1600 + CXEVNT_B1FDD_TMR, 1601 + CXEVNT_MAX 1602 + }; 1603 + 1614 1604 enum { 1615 1605 CXBCN_ALL = 0x0, 1616 1606 CXBCN_ALL_OK, ··· 1674 1604 CXSTEP_MAX, 1675 1605 }; 1676 1606 1607 + enum rtw89_btc_afh_map_type { /*AFH MAP TYPE */ 1608 + RPT_BT_AFH_SEQ_LEGACY = 0x10, 1609 + RPT_BT_AFH_SEQ_LE = 0x20 1610 + }; 1611 + 1677 1612 #define BTC_DBG_MAX1 32 1678 1613 struct rtw89_btc_fbtc_gpio_dbg { 1679 - u8 fver; /* chip_info::fcxgpiodbg_ver */ 1614 + u8 fver; /* btc_ver::fcxgpiodbg */ 1680 1615 u8 rsvd; 1681 1616 u16 rsvd2; 1682 1617 u32 en_map; /* which debug signal (see btc_wl_gpio_debug) is enable */ ··· 1690 1615 } __packed; 1691 1616 1692 1617 struct rtw89_btc_fbtc_mreg_val { 1693 - u8 fver; /* chip_info::fcxmreg_ver */ 1618 + u8 fver; /* btc_ver::fcxmreg */ 1694 1619 u8 reg_num; 1695 1620 __le16 rsvd; 1696 1621 __le32 mreg_val[CXMREG_MAX]; ··· 1713 1638 } __packed; 1714 1639 1715 1640 struct rtw89_btc_fbtc_slots { 1716 - u8 fver; /* chip_info::fcxslots_ver */ 1641 + u8 fver; /* btc_ver::fcxslots */ 1717 1642 u8 tbl_num; 1718 1643 __le16 rsvd; 1719 1644 __le32 update_map; ··· 1726 1651 __le16 difft; 1727 1652 } __packed; 1728 1653 1729 - struct rtw89_btc_fbtc_steps { 1730 - u8 fver; /* chip_info::fcxstep_ver */ 1654 + struct rtw89_btc_fbtc_steps_v2 { 1655 + u8 fver; /* btc_ver::fcxstep */ 1731 1656 u8 rsvd; 1732 1657 __le16 cnt; 1733 1658 __le16 pos_old; ··· 1735 1660 struct rtw89_btc_fbtc_step step[FCXMAX_STEP]; 1736 1661 } __packed; 1737 1662 1738 - struct rtw89_btc_fbtc_steps_v1 { 1663 + struct rtw89_btc_fbtc_steps_v3 { 1739 1664 u8 fver; 1740 1665 u8 en; 1741 1666 __le16 rsvd; ··· 1743 1668 struct rtw89_btc_fbtc_step step[FCXMAX_STEP]; 1744 1669 } __packed; 1745 1670 1746 - struct rtw89_btc_fbtc_cysta { /* statistics for cycles */ 1747 - u8 fver; /* chip_info::fcxcysta_ver */ 1671 + union rtw89_btc_fbtc_steps_info { 1672 + struct rtw89_btc_fbtc_steps_v2 v2; 1673 + struct rtw89_btc_fbtc_steps_v3 v3; 1674 + }; 1675 + 1676 + struct rtw89_btc_fbtc_cysta_v2 { /* statistics for cycles */ 1677 + u8 fver; /* btc_ver::fcxcysta */ 1748 1678 u8 rsvd; 1749 1679 __le16 cycles; /* total cycle number */ 1750 1680 __le16 cycles_a2dp[CXT_FLCTRL_MAX]; ··· 1797 1717 u8 rsvd2; 1798 1718 } __packed; 1799 1719 1720 + struct rtw89_btc_fbtc_a2dp_trx_stat_v4 { 1721 + u8 empty_cnt; 1722 + u8 retry_cnt; 1723 + u8 tx_rate; 1724 + u8 tx_cnt; 1725 + u8 ack_cnt; 1726 + u8 nack_cnt; 1727 + u8 no_empty_cnt; 1728 + u8 rsvd; 1729 + } __packed; 1730 + 1800 1731 struct rtw89_btc_fbtc_cycle_a2dp_empty_info { 1801 1732 __le16 cnt; /* a2dp empty cnt */ 1802 1733 __le16 cnt_timeout; /* a2dp empty timeout cnt*/ ··· 1821 1730 __le16 tmax; /* max leak-slot time */ 1822 1731 } __packed; 1823 1732 1824 - struct rtw89_btc_fbtc_cysta_v1 { /* statistics for cycles */ 1733 + #define RTW89_BTC_FDDT_PHASE_CYCLE GENMASK(9, 0) 1734 + #define RTW89_BTC_FDDT_TRAIN_STEP GENMASK(15, 10) 1735 + 1736 + struct rtw89_btc_fbtc_cycle_fddt_info { 1737 + __le16 train_cycle; 1738 + __le16 tp; 1739 + 1740 + s8 tx_power; /* absolute Tx power (dBm), 0xff-> no BTC control */ 1741 + s8 bt_tx_power; /* decrease Tx power (dB) */ 1742 + s8 bt_rx_gain; /* LNA constrain level */ 1743 + u8 no_empty_cnt; 1744 + 1745 + u8 rssi; /* [7:4] -> bt_rssi_level, [3:0]-> wl_rssi_level */ 1746 + u8 cn; /* condition_num */ 1747 + u8 train_status; /* [7:4]-> train-state, [3:0]-> train-phase */ 1748 + u8 train_result; /* refer to enum btc_fddt_check_map */ 1749 + } __packed; 1750 + 1751 + #define RTW89_BTC_FDDT_CELL_TRAIN_STATE GENMASK(3, 0) 1752 + #define RTW89_BTC_FDDT_CELL_TRAIN_PHASE GENMASK(7, 4) 1753 + 1754 + struct rtw89_btc_fbtc_fddt_cell_status { 1755 + s8 wl_tx_pwr; 1756 + s8 bt_tx_pwr; 1757 + s8 bt_rx_gain; 1758 + u8 state_phase; /* [0:3] train state, [4:7] train phase */ 1759 + } __packed; 1760 + 1761 + struct rtw89_btc_fbtc_cysta_v3 { /* statistics for cycles */ 1825 1762 u8 fver; 1826 1763 u8 rsvd; 1827 1764 __le16 cycles; /* total cycle number */ ··· 1867 1748 __le32 except_map; 1868 1749 } __packed; 1869 1750 1870 - struct rtw89_btc_fbtc_cynullsta { /* cycle null statistics */ 1871 - u8 fver; /* chip_info::fcxnullsta_ver */ 1751 + #define FDD_TRAIN_WL_DIRECTION 2 1752 + #define FDD_TRAIN_WL_RSSI_LEVEL 5 1753 + #define FDD_TRAIN_BT_RSSI_LEVEL 5 1754 + 1755 + struct rtw89_btc_fbtc_cysta_v4 { /* statistics for cycles */ 1756 + u8 fver; 1757 + u8 rsvd; 1758 + u8 collision_cnt; /* counter for event/timer occur at the same time */ 1759 + u8 except_cnt; 1760 + 1761 + __le16 skip_cnt; 1762 + __le16 cycles; /* total cycle number */ 1763 + 1764 + __le16 slot_step_time[BTC_CYCLE_SLOT_MAX]; /* record the wl/bt slot time */ 1765 + __le16 slot_cnt[CXST_MAX]; /* slot count */ 1766 + __le16 bcn_cnt[CXBCN_MAX]; 1767 + struct rtw89_btc_fbtc_cycle_time_info cycle_time; 1768 + struct rtw89_btc_fbtc_cycle_leak_info leak_slot; 1769 + struct rtw89_btc_fbtc_cycle_a2dp_empty_info a2dp_ept; 1770 + struct rtw89_btc_fbtc_a2dp_trx_stat_v4 a2dp_trx[BTC_CYCLE_SLOT_MAX]; 1771 + struct rtw89_btc_fbtc_cycle_fddt_info fddt_trx[BTC_CYCLE_SLOT_MAX]; 1772 + struct rtw89_btc_fbtc_fddt_cell_status fddt_cells[FDD_TRAIN_WL_DIRECTION] 1773 + [FDD_TRAIN_WL_RSSI_LEVEL] 1774 + [FDD_TRAIN_BT_RSSI_LEVEL]; 1775 + __le32 except_map; 1776 + } __packed; 1777 + 1778 + union rtw89_btc_fbtc_cysta_info { 1779 + struct rtw89_btc_fbtc_cysta_v2 v2; 1780 + struct rtw89_btc_fbtc_cysta_v3 v3; 1781 + struct rtw89_btc_fbtc_cysta_v4 v4; 1782 + }; 1783 + 1784 + struct rtw89_btc_fbtc_cynullsta_v1 { /* cycle null statistics */ 1785 + u8 fver; /* btc_ver::fcxnullsta */ 1872 1786 u8 rsvd; 1873 1787 __le16 rsvd2; 1874 1788 __le32 max_t[2]; /* max_t for 0:null0/1:null1 */ ··· 1909 1757 __le32 result[2][4]; /* 0:fail, 1:ok, 2:on_time, 3:retry */ 1910 1758 } __packed; 1911 1759 1912 - struct rtw89_btc_fbtc_cynullsta_v1 { /* cycle null statistics */ 1913 - u8 fver; /* chip_info::fcxnullsta_ver */ 1760 + struct rtw89_btc_fbtc_cynullsta_v2 { /* cycle null statistics */ 1761 + u8 fver; /* btc_ver::fcxnullsta */ 1914 1762 u8 rsvd; 1915 1763 __le16 rsvd2; 1916 1764 __le32 max_t[2]; /* max_t for 0:null0/1:null1 */ ··· 1918 1766 __le32 result[2][5]; /* 0:fail, 1:ok, 2:on_time, 3:retry, 4:tx */ 1919 1767 } __packed; 1920 1768 1769 + union rtw89_btc_fbtc_cynullsta_info { 1770 + struct rtw89_btc_fbtc_cynullsta_v1 v1; /* info from fw */ 1771 + struct rtw89_btc_fbtc_cynullsta_v2 v2; 1772 + }; 1773 + 1921 1774 struct rtw89_btc_fbtc_btver { 1922 - u8 fver; /* chip_info::fcxbtver_ver */ 1775 + u8 fver; /* btc_ver::fcxbtver */ 1923 1776 u8 rsvd; 1924 1777 __le16 rsvd2; 1925 1778 __le32 coex_ver; /*bit[15:8]->shared, bit[7:0]->non-shared */ ··· 1933 1776 } __packed; 1934 1777 1935 1778 struct rtw89_btc_fbtc_btscan { 1936 - u8 fver; /* chip_info::fcxbtscan_ver */ 1779 + u8 fver; /* btc_ver::fcxbtscan */ 1937 1780 u8 rsvd; 1938 1781 __le16 rsvd2; 1939 1782 u8 scan[6]; 1940 1783 } __packed; 1941 1784 1942 1785 struct rtw89_btc_fbtc_btafh { 1943 - u8 fver; /* chip_info::fcxbtafh_ver */ 1786 + u8 fver; /* btc_ver::fcxbtafh */ 1944 1787 u8 rsvd; 1945 1788 __le16 rsvd2; 1946 1789 u8 afh_l[4]; /*bit0:2402, bit1: 2403.... bit31:2433 */ ··· 1948 1791 u8 afh_h[4]; /*bit0:2466, bit1:2467......bit14:2480 */ 1949 1792 } __packed; 1950 1793 1794 + struct rtw89_btc_fbtc_btafh_v2 { 1795 + u8 fver; /* btc_ver::fcxbtafh */ 1796 + u8 rsvd; 1797 + u8 rsvd2; 1798 + u8 map_type; 1799 + u8 afh_l[4]; 1800 + u8 afh_m[4]; 1801 + u8 afh_h[4]; 1802 + u8 afh_le_a[4]; 1803 + u8 afh_le_b[4]; 1804 + } __packed; 1805 + 1951 1806 struct rtw89_btc_fbtc_btdevinfo { 1952 - u8 fver; /* chip_info::fcxbtdevinfo_ver */ 1807 + u8 fver; /* btc_ver::fcxbtdevinfo */ 1953 1808 u8 rsvd; 1954 1809 __le16 vendor_id; 1955 1810 __le32 dev_name; /* only 24 bits valid */ ··· 2080 1911 u8 valid; 2081 1912 } __packed; 2082 1913 1914 + union rtw89_btc_fbtc_btafh_info { 1915 + struct rtw89_btc_fbtc_btafh v1; 1916 + struct rtw89_btc_fbtc_btafh_v2 v2; 1917 + }; 1918 + 2083 1919 struct rtw89_btc_report_ctrl_state { 2084 1920 struct rtw89_btc_rpt_cmn_info cinfo; /* common info, by driver */ 2085 - union { 2086 - struct rtw89_btc_fbtc_rpt_ctrl finfo; /* info from fw for 52A*/ 2087 - struct rtw89_btc_fbtc_rpt_ctrl_v1 finfo_v1; /* info from fw for 52C*/ 2088 - }; 1921 + union rtw89_btc_fbtc_rpt_ctrl_ver_info finfo; 2089 1922 }; 2090 1923 2091 1924 struct rtw89_btc_rpt_fbtc_tdma { 2092 1925 struct rtw89_btc_rpt_cmn_info cinfo; /* common info, by driver */ 2093 - union { 2094 - struct rtw89_btc_fbtc_tdma finfo; /* info from fw */ 2095 - struct rtw89_btc_fbtc_tdma_v1 finfo_v1; /* info from fw for 52C*/ 2096 - }; 1926 + union rtw89_btc_fbtc_tdma_le32 finfo; 2097 1927 }; 2098 1928 2099 1929 struct rtw89_btc_rpt_fbtc_slots { ··· 2102 1934 2103 1935 struct rtw89_btc_rpt_fbtc_cysta { 2104 1936 struct rtw89_btc_rpt_cmn_info cinfo; /* common info, by driver */ 2105 - union { 2106 - struct rtw89_btc_fbtc_cysta finfo; /* info from fw for 52A*/ 2107 - struct rtw89_btc_fbtc_cysta_v1 finfo_v1; /* info from fw for 52C*/ 2108 - }; 1937 + union rtw89_btc_fbtc_cysta_info finfo; 2109 1938 }; 2110 1939 2111 1940 struct rtw89_btc_rpt_fbtc_step { 2112 1941 struct rtw89_btc_rpt_cmn_info cinfo; /* common info, by driver */ 2113 - union { 2114 - struct rtw89_btc_fbtc_steps finfo; /* info from fw */ 2115 - struct rtw89_btc_fbtc_steps_v1 finfo_v1; /* info from fw */ 2116 - }; 1942 + union rtw89_btc_fbtc_steps_info finfo; /* info from fw */ 2117 1943 }; 2118 1944 2119 1945 struct rtw89_btc_rpt_fbtc_nullsta { 2120 1946 struct rtw89_btc_rpt_cmn_info cinfo; /* common info, by driver */ 2121 - union { 2122 - struct rtw89_btc_fbtc_cynullsta finfo; /* info from fw */ 2123 - struct rtw89_btc_fbtc_cynullsta_v1 finfo_v1; /* info from fw */ 2124 - }; 1947 + union rtw89_btc_fbtc_cynullsta_info finfo; 2125 1948 }; 2126 1949 2127 1950 struct rtw89_btc_rpt_fbtc_mreg { ··· 2137 1978 2138 1979 struct rtw89_btc_rpt_fbtc_btafh { 2139 1980 struct rtw89_btc_rpt_cmn_info cinfo; /* common info, by driver */ 2140 - struct rtw89_btc_fbtc_btafh finfo; /* info from fw */ 1981 + union rtw89_btc_fbtc_btafh_info finfo; 2141 1982 }; 2142 1983 2143 1984 struct rtw89_btc_rpt_fbtc_btdev { ··· 2177 2018 struct rtw89_btc_rpt_fbtc_btdev rpt_fbtc_btdev; 2178 2019 }; 2179 2020 2021 + struct rtw89_btc_ver { 2022 + enum rtw89_core_chip_id chip_id; 2023 + u32 fw_ver_code; 2024 + 2025 + u8 fcxbtcrpt; 2026 + u8 fcxtdma; 2027 + u8 fcxslots; 2028 + u8 fcxcysta; 2029 + u8 fcxstep; 2030 + u8 fcxnullsta; 2031 + u8 fcxmreg; 2032 + u8 fcxgpiodbg; 2033 + u8 fcxbtver; 2034 + u8 fcxbtscan; 2035 + u8 fcxbtafh; 2036 + u8 fcxbtdevinfo; 2037 + u8 fwlrole; 2038 + u8 frptmap; 2039 + u8 fcxctrl; 2040 + 2041 + u16 info_buf; 2042 + u8 max_role_num; 2043 + }; 2044 + 2180 2045 #define RTW89_BTC_POLICY_MAXLEN 512 2181 2046 2182 2047 struct rtw89_btc { 2048 + const struct rtw89_btc_ver *ver; 2049 + 2183 2050 struct rtw89_btc_cx cx; 2184 2051 struct rtw89_btc_dm dm; 2185 2052 struct rtw89_btc_ctrl ctrl; ··· 2379 2194 struct rtw89_sta { 2380 2195 u8 mac_id; 2381 2196 bool disassoc; 2197 + bool er_cap; 2382 2198 struct rtw89_dev *rtwdev; 2383 2199 struct rtw89_vif *rtwvif; 2384 2200 struct rtw89_ra_info ra; ··· 2914 2728 u8 btcx_desired; 2915 2729 u8 scbd; 2916 2730 u8 mailbox; 2917 - u16 btc_fwinfo_buf; 2918 - 2919 - u8 fcxbtcrpt_ver; 2920 - u8 fcxtdma_ver; 2921 - u8 fcxslots_ver; 2922 - u8 fcxcysta_ver; 2923 - u8 fcxstep_ver; 2924 - u8 fcxnullsta_ver; 2925 - u8 fcxmreg_ver; 2926 - u8 fcxgpiodbg_ver; 2927 - u8 fcxbtver_ver; 2928 - u8 fcxbtscan_ver; 2929 - u8 fcxbtafh_ver; 2930 - u8 fcxbtdevinfo_ver; 2931 2731 2932 2732 u8 afh_guard_ch; 2933 2733 const u8 *wl_rssi_thres; ··· 2943 2771 u8 dcfo_comp_sft; 2944 2772 const struct rtw89_imr_info *imr_info; 2945 2773 const struct rtw89_rrsr_cfgs *rrsr_cfgs; 2774 + u32 bss_clr_map_reg; 2946 2775 u32 dma_ch_mask; 2947 2776 const struct wiphy_wowlan_support *wowlan_stub; 2948 2777 };
+43 -19
drivers/net/wireless/realtek/rtw89/fw.c
··· 91 91 const u8 *fwdynhdr; 92 92 const u8 *bin; 93 93 u32 base_hdr_len; 94 + u32 mssc_len = 0; 94 95 u32 i; 95 96 96 97 if (!info) ··· 121 120 fw += RTW89_FW_HDR_SIZE; 122 121 section_info = info->section_info; 123 122 for (i = 0; i < info->section_num; i++) { 123 + section_info->type = GET_FWSECTION_HDR_SECTIONTYPE(fw); 124 + if (section_info->type == FWDL_SECURITY_SECTION_TYPE) { 125 + section_info->mssc = GET_FWSECTION_HDR_MSSC(fw); 126 + mssc_len += section_info->mssc * FWDL_SECURITY_SIGLEN; 127 + } else { 128 + section_info->mssc = 0; 129 + } 130 + 124 131 section_info->len = GET_FWSECTION_HDR_SEC_SIZE(fw); 125 132 if (GET_FWSECTION_HDR_CHECKSUM(fw)) 126 133 section_info->len += FWDL_SECTION_CHKSUM_LEN; ··· 141 132 section_info++; 142 133 } 143 134 144 - if (fw_end != bin) { 135 + if (fw_end != bin + mssc_len) { 145 136 rtw89_err(rtwdev, "[ERR]fw bin size\n"); 146 137 return -EINVAL; 147 138 } ··· 351 342 __rtw89_fw_recognize(rtwdev, RTW89_FW_WOWLAN); 352 343 353 344 rtw89_fw_recognize_features(rtwdev); 345 + 346 + rtw89_coex_recognize_ver(rtwdev); 354 347 355 348 return 0; 356 349 } ··· 1818 1807 1819 1808 #define PORT_DATA_OFFSET 4 1820 1809 #define H2C_LEN_CXDRVINFO_ROLE_DBCC_LEN 12 1821 - #define H2C_LEN_CXDRVINFO_ROLE (4 + 12 * RTW89_PORT_NUM + H2C_LEN_CXDRVHDR) 1822 - #define H2C_LEN_CXDRVINFO_ROLE_V1 (4 + 16 * RTW89_PORT_NUM + \ 1823 - H2C_LEN_CXDRVINFO_ROLE_DBCC_LEN + \ 1824 - H2C_LEN_CXDRVHDR) 1810 + #define H2C_LEN_CXDRVINFO_ROLE_SIZE(max_role_num) \ 1811 + (4 + 12 * (max_role_num) + H2C_LEN_CXDRVHDR) 1812 + 1825 1813 int rtw89_fw_h2c_cxdrv_role(struct rtw89_dev *rtwdev) 1826 1814 { 1827 1815 struct rtw89_btc *btc = &rtwdev->btc; 1816 + const struct rtw89_btc_ver *ver = btc->ver; 1828 1817 struct rtw89_btc_wl_info *wl = &btc->cx.wl; 1829 1818 struct rtw89_btc_wl_role_info *role_info = &wl->role_info; 1830 1819 struct rtw89_btc_wl_role_info_bpos *bpos = &role_info->role_map.role; 1831 1820 struct rtw89_btc_wl_active_role *active = role_info->active_role; 1832 1821 struct sk_buff *skb; 1822 + u32 len; 1833 1823 u8 offset = 0; 1834 1824 u8 *cmd; 1835 1825 int ret; 1836 1826 int i; 1837 1827 1838 - skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_LEN_CXDRVINFO_ROLE); 1828 + len = H2C_LEN_CXDRVINFO_ROLE_SIZE(ver->max_role_num); 1829 + 1830 + skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len); 1839 1831 if (!skb) { 1840 1832 rtw89_err(rtwdev, "failed to alloc skb for h2c cxdrv_role\n"); 1841 1833 return -ENOMEM; 1842 1834 } 1843 - skb_put(skb, H2C_LEN_CXDRVINFO_ROLE); 1835 + skb_put(skb, len); 1844 1836 cmd = skb->data; 1845 1837 1846 1838 RTW89_SET_FWCMD_CXHDR_TYPE(cmd, CXDRVINFO_ROLE); 1847 - RTW89_SET_FWCMD_CXHDR_LEN(cmd, H2C_LEN_CXDRVINFO_ROLE - H2C_LEN_CXDRVHDR); 1839 + RTW89_SET_FWCMD_CXHDR_LEN(cmd, len - H2C_LEN_CXDRVHDR); 1848 1840 1849 1841 RTW89_SET_FWCMD_CXROLE_CONNECT_CNT(cmd, role_info->connect_cnt); 1850 1842 RTW89_SET_FWCMD_CXROLE_LINK_MODE(cmd, role_info->link_mode); ··· 1884 1870 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C, 1885 1871 H2C_CAT_OUTSRC, BTFC_SET, 1886 1872 SET_DRV_INFO, 0, 0, 1887 - H2C_LEN_CXDRVINFO_ROLE); 1873 + len); 1888 1874 1889 1875 ret = rtw89_h2c_tx(rtwdev, skb, false); 1890 1876 if (ret) { ··· 1899 1885 return ret; 1900 1886 } 1901 1887 1888 + #define H2C_LEN_CXDRVINFO_ROLE_SIZE_V1(max_role_num) \ 1889 + (4 + 16 * (max_role_num) + H2C_LEN_CXDRVINFO_ROLE_DBCC_LEN + H2C_LEN_CXDRVHDR) 1890 + 1902 1891 int rtw89_fw_h2c_cxdrv_role_v1(struct rtw89_dev *rtwdev) 1903 1892 { 1904 1893 struct rtw89_btc *btc = &rtwdev->btc; 1894 + const struct rtw89_btc_ver *ver = btc->ver; 1905 1895 struct rtw89_btc_wl_info *wl = &btc->cx.wl; 1906 1896 struct rtw89_btc_wl_role_info_v1 *role_info = &wl->role_info_v1; 1907 1897 struct rtw89_btc_wl_role_info_bpos *bpos = &role_info->role_map.role; 1908 1898 struct rtw89_btc_wl_active_role_v1 *active = role_info->active_role_v1; 1909 1899 struct sk_buff *skb; 1900 + u32 len; 1910 1901 u8 *cmd, offset; 1911 1902 int ret; 1912 1903 int i; 1913 1904 1914 - skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, H2C_LEN_CXDRVINFO_ROLE_V1); 1905 + len = H2C_LEN_CXDRVINFO_ROLE_SIZE_V1(ver->max_role_num); 1906 + 1907 + skb = rtw89_fw_h2c_alloc_skb_with_hdr(rtwdev, len); 1915 1908 if (!skb) { 1916 1909 rtw89_err(rtwdev, "failed to alloc skb for h2c cxdrv_role\n"); 1917 1910 return -ENOMEM; 1918 1911 } 1919 - skb_put(skb, H2C_LEN_CXDRVINFO_ROLE_V1); 1912 + skb_put(skb, len); 1920 1913 cmd = skb->data; 1921 1914 1922 1915 RTW89_SET_FWCMD_CXHDR_TYPE(cmd, CXDRVINFO_ROLE); 1923 - RTW89_SET_FWCMD_CXHDR_LEN(cmd, H2C_LEN_CXDRVINFO_ROLE_V1 - H2C_LEN_CXDRVHDR); 1916 + RTW89_SET_FWCMD_CXHDR_LEN(cmd, len - H2C_LEN_CXDRVHDR); 1924 1917 1925 1918 RTW89_SET_FWCMD_CXROLE_CONNECT_CNT(cmd, role_info->connect_cnt); 1926 1919 RTW89_SET_FWCMD_CXROLE_LINK_MODE(cmd, role_info->link_mode); ··· 1963 1942 RTW89_SET_FWCMD_CXROLE_ACT_NOA_DUR(cmd, active->noa_duration, i, offset); 1964 1943 } 1965 1944 1966 - offset = H2C_LEN_CXDRVINFO_ROLE_V1 - H2C_LEN_CXDRVINFO_ROLE_DBCC_LEN; 1945 + offset = len - H2C_LEN_CXDRVINFO_ROLE_DBCC_LEN; 1967 1946 RTW89_SET_FWCMD_CXROLE_MROLE_TYPE(cmd, role_info->mrole_type, offset); 1968 1947 RTW89_SET_FWCMD_CXROLE_MROLE_NOA(cmd, role_info->mrole_noa_duration, offset); 1969 1948 RTW89_SET_FWCMD_CXROLE_DBCC_EN(cmd, role_info->dbcc_en, offset); ··· 1974 1953 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C, 1975 1954 H2C_CAT_OUTSRC, BTFC_SET, 1976 1955 SET_DRV_INFO, 0, 0, 1977 - H2C_LEN_CXDRVINFO_ROLE_V1); 1956 + len); 1978 1957 1979 1958 ret = rtw89_h2c_tx(rtwdev, skb, false); 1980 1959 if (ret) { ··· 1992 1971 #define H2C_LEN_CXDRVINFO_CTRL (4 + H2C_LEN_CXDRVHDR) 1993 1972 int rtw89_fw_h2c_cxdrv_ctrl(struct rtw89_dev *rtwdev) 1994 1973 { 1995 - const struct rtw89_chip_info *chip = rtwdev->chip; 1996 1974 struct rtw89_btc *btc = &rtwdev->btc; 1975 + const struct rtw89_btc_ver *ver = btc->ver; 1997 1976 struct rtw89_btc_ctrl *ctrl = &btc->ctrl; 1998 1977 struct sk_buff *skb; 1999 1978 u8 *cmd; ··· 2013 1992 RTW89_SET_FWCMD_CXCTRL_MANUAL(cmd, ctrl->manual); 2014 1993 RTW89_SET_FWCMD_CXCTRL_IGNORE_BT(cmd, ctrl->igno_bt); 2015 1994 RTW89_SET_FWCMD_CXCTRL_ALWAYS_FREERUN(cmd, ctrl->always_freerun); 2016 - if (chip->chip_id == RTL8852A) 1995 + if (ver->fcxctrl == 0) 2017 1996 RTW89_SET_FWCMD_CXCTRL_TRACE_STEP(cmd, ctrl->trace_step); 2018 1997 2019 1998 rtw89_h2c_pkt_set_hdr(rtwdev, skb, FWCMD_TYPE_H2C, ··· 2686 2665 2687 2666 list_add_tail(&info->list, &scan_info->pkt_list[band]); 2688 2667 ret = rtw89_fw_h2c_add_pkt_offload(rtwdev, &info->id, new); 2689 - if (ret) 2668 + if (ret) { 2669 + kfree_skb(new); 2690 2670 goto out; 2671 + } 2691 2672 2692 2673 kfree_skb(new); 2693 2674 } ··· 2761 2738 if (ssid_num == 1 && req->ssids[0].ssid_len == 0) { 2762 2739 ch_info->tx_pkt = false; 2763 2740 if (!req->duration_mandatory) 2764 - ch_info->period -= RTW89_DWELL_TIME; 2741 + ch_info->period -= RTW89_DWELL_TIME_6G; 2765 2742 } 2766 2743 } 2767 2744 ··· 2814 2791 if (req->duration_mandatory) 2815 2792 ch_info->period = req->duration; 2816 2793 else if (channel->band == NL80211_BAND_6GHZ) 2817 - ch_info->period = RTW89_CHANNEL_TIME_6G + RTW89_DWELL_TIME; 2794 + ch_info->period = RTW89_CHANNEL_TIME_6G + 2795 + RTW89_DWELL_TIME_6G; 2818 2796 else 2819 2797 ch_info->period = RTW89_CHANNEL_TIME; 2820 2798
+12 -2
drivers/net/wireless/realtek/rtw89/fw.h
··· 171 171 const u8 *addr; 172 172 u32 len; 173 173 u32 dladdr; 174 + u32 mssc; 175 + u8 type; 174 176 }; 175 177 176 178 struct rtw89_fw_bin_info { ··· 205 203 #define RTW89_DFS_CHAN_TIME 105 206 204 #define RTW89_OFF_CHAN_TIME 100 207 205 #define RTW89_DWELL_TIME 20 206 + #define RTW89_DWELL_TIME_6G 10 208 207 #define RTW89_SCAN_WIDTH 0 209 208 #define RTW89_SCANOFLD_MAX_SSID 8 210 209 #define RTW89_SCANOFLD_MAX_IE_LEN 512 ··· 483 480 #define FW_EDCA_PARAM_CWMIN_MSK GENMASK(11, 8) 484 481 #define FW_EDCA_PARAM_AIFS_MSK GENMASK(7, 0) 485 482 483 + #define FWDL_SECURITY_SECTION_TYPE 9 484 + #define FWDL_SECURITY_SIGLEN 512 485 + 486 + #define GET_FWSECTION_HDR_DL_ADDR(fwhdr) \ 487 + le32_get_bits(*((const __le32 *)(fwhdr)), GENMASK(31, 0)) 488 + #define GET_FWSECTION_HDR_SECTIONTYPE(fwhdr) \ 489 + le32_get_bits(*((const __le32 *)(fwhdr) + 1), GENMASK(27, 24)) 486 490 #define GET_FWSECTION_HDR_SEC_SIZE(fwhdr) \ 487 491 le32_get_bits(*((const __le32 *)(fwhdr) + 1), GENMASK(23, 0)) 488 492 #define GET_FWSECTION_HDR_CHECKSUM(fwhdr) \ 489 493 le32_get_bits(*((const __le32 *)(fwhdr) + 1), BIT(28)) 490 494 #define GET_FWSECTION_HDR_REDL(fwhdr) \ 491 495 le32_get_bits(*((const __le32 *)(fwhdr) + 1), BIT(29)) 492 - #define GET_FWSECTION_HDR_DL_ADDR(fwhdr) \ 493 - le32_get_bits(*((const __le32 *)(fwhdr)), GENMASK(31, 0)) 496 + #define GET_FWSECTION_HDR_MSSC(fwhdr) \ 497 + le32_get_bits(*((const __le32 *)(fwhdr) + 2), GENMASK(31, 0)) 494 498 495 499 #define GET_FW_HDR_MAJOR_VERSION(fwhdr) \ 496 500 le32_get_bits(*((const __le32 *)(fwhdr) + 1), GENMASK(7, 0))
+9 -2
drivers/net/wireless/realtek/rtw89/mac.c
··· 4865 4865 4866 4866 bool rtw89_mac_get_ctrl_path(struct rtw89_dev *rtwdev) 4867 4867 { 4868 - u8 val = rtw89_read8(rtwdev, R_AX_SYS_SDIO_CTRL + 3); 4868 + const struct rtw89_chip_info *chip = rtwdev->chip; 4869 + u8 val = 0; 4869 4870 4870 - return FIELD_GET(B_AX_LTE_MUX_CTRL_PATH >> 24, val); 4871 + if (chip->chip_id == RTL8852C) 4872 + return false; 4873 + else if (chip->chip_id == RTL8852A || chip->chip_id == RTL8852B) 4874 + val = rtw89_read8_mask(rtwdev, R_AX_SYS_SDIO_CTRL + 3, 4875 + B_AX_LTE_MUX_CTRL_PATH >> 24); 4876 + 4877 + return !!val; 4871 4878 } 4872 4879 4873 4880 u16 rtw89_mac_get_plt_cnt(struct rtw89_dev *rtwdev, u8 band)
+14 -1
drivers/net/wireless/realtek/rtw89/pci.c
··· 1384 1384 return 0; 1385 1385 } 1386 1386 1387 - static const struct rtw89_pci_bd_ram bd_ram_table[RTW89_TXCH_NUM] = { 1387 + const struct rtw89_pci_bd_ram rtw89_bd_ram_table_dual[RTW89_TXCH_NUM] = { 1388 1388 [RTW89_TXCH_ACH0] = {.start_idx = 0, .max_num = 5, .min_num = 2}, 1389 1389 [RTW89_TXCH_ACH1] = {.start_idx = 5, .max_num = 5, .min_num = 2}, 1390 1390 [RTW89_TXCH_ACH2] = {.start_idx = 10, .max_num = 5, .min_num = 2}, ··· 1399 1399 [RTW89_TXCH_CH11] = {.start_idx = 55, .max_num = 5, .min_num = 1}, 1400 1400 [RTW89_TXCH_CH12] = {.start_idx = 60, .max_num = 4, .min_num = 1}, 1401 1401 }; 1402 + EXPORT_SYMBOL(rtw89_bd_ram_table_dual); 1403 + 1404 + const struct rtw89_pci_bd_ram rtw89_bd_ram_table_single[RTW89_TXCH_NUM] = { 1405 + [RTW89_TXCH_ACH0] = {.start_idx = 0, .max_num = 5, .min_num = 2}, 1406 + [RTW89_TXCH_ACH1] = {.start_idx = 5, .max_num = 5, .min_num = 2}, 1407 + [RTW89_TXCH_ACH2] = {.start_idx = 10, .max_num = 5, .min_num = 2}, 1408 + [RTW89_TXCH_ACH3] = {.start_idx = 15, .max_num = 5, .min_num = 2}, 1409 + [RTW89_TXCH_CH8] = {.start_idx = 20, .max_num = 4, .min_num = 1}, 1410 + [RTW89_TXCH_CH9] = {.start_idx = 24, .max_num = 4, .min_num = 1}, 1411 + [RTW89_TXCH_CH12] = {.start_idx = 28, .max_num = 4, .min_num = 1}, 1412 + }; 1413 + EXPORT_SYMBOL(rtw89_bd_ram_table_single); 1402 1414 1403 1415 static void rtw89_pci_reset_trx_rings(struct rtw89_dev *rtwdev) 1404 1416 { 1405 1417 struct rtw89_pci *rtwpci = (struct rtw89_pci *)rtwdev->priv; 1406 1418 const struct rtw89_pci_info *info = rtwdev->pci_info; 1419 + const struct rtw89_pci_bd_ram *bd_ram_table = *info->bd_ram_table; 1407 1420 struct rtw89_pci_tx_ring *tx_ring; 1408 1421 struct rtw89_pci_rx_ring *rx_ring; 1409 1422 struct rtw89_pci_dma_ring *bd_ring;
+9 -6
drivers/net/wireless/realtek/rtw89/pci.h
··· 750 750 struct rtw89_pci_ch_dma_addr rx[RTW89_RXCH_NUM]; 751 751 }; 752 752 753 + struct rtw89_pci_bd_ram { 754 + u8 start_idx; 755 + u8 max_num; 756 + u8 min_num; 757 + }; 758 + 753 759 struct rtw89_pci_info { 754 760 enum mac_ax_bd_trunc_mode txbd_trunc_mode; 755 761 enum mac_ax_bd_trunc_mode rxbd_trunc_mode; ··· 791 785 u32 tx_dma_ch_mask; 792 786 const struct rtw89_pci_bd_idx_addr *bd_idx_addr_low_power; 793 787 const struct rtw89_pci_ch_dma_addr_set *dma_addr_set; 788 + const struct rtw89_pci_bd_ram (*bd_ram_table)[RTW89_TXCH_NUM]; 794 789 795 790 int (*ltr_set)(struct rtw89_dev *rtwdev, bool en); 796 791 u32 (*fill_txaddr_info)(struct rtw89_dev *rtwdev, ··· 803 796 void (*recognize_intrs)(struct rtw89_dev *rtwdev, 804 797 struct rtw89_pci *rtwpci, 805 798 struct rtw89_pci_isrs *isrs); 806 - }; 807 - 808 - struct rtw89_pci_bd_ram { 809 - u8 start_idx; 810 - u8 max_num; 811 - u8 min_num; 812 799 }; 813 800 814 801 struct rtw89_pci_tx_data { ··· 1058 1057 extern const struct dev_pm_ops rtw89_pm_ops; 1059 1058 extern const struct rtw89_pci_ch_dma_addr_set rtw89_pci_ch_dma_addr_set; 1060 1059 extern const struct rtw89_pci_ch_dma_addr_set rtw89_pci_ch_dma_addr_set_v1; 1060 + extern const struct rtw89_pci_bd_ram rtw89_bd_ram_table_dual[RTW89_TXCH_NUM]; 1061 + extern const struct rtw89_pci_bd_ram rtw89_bd_ram_table_single[RTW89_TXCH_NUM]; 1061 1062 1062 1063 struct pci_device_id; 1063 1064
+6 -4
drivers/net/wireless/realtek/rtw89/phy.c
··· 367 367 } 368 368 369 369 ra->bw_cap = bw_mode; 370 + ra->er_cap = rtwsta->er_cap; 370 371 ra->mode_ctrl = mode; 371 372 ra->macid = rtwsta->mac_id; 372 373 ra->stbc_cap = stbc_en; ··· 4117 4116 4118 4117 void rtw89_phy_set_bss_color(struct rtw89_dev *rtwdev, struct ieee80211_vif *vif) 4119 4118 { 4119 + const struct rtw89_chip_info *chip = rtwdev->chip; 4120 4120 enum rtw89_phy_idx phy_idx = RTW89_PHY_0; 4121 4121 u8 bss_color; 4122 4122 ··· 4126 4124 4127 4125 bss_color = vif->bss_conf.he_bss_color.color; 4128 4126 4129 - rtw89_phy_write32_idx(rtwdev, R_BSS_CLR_MAP, B_BSS_CLR_MAP_VLD0, 0x1, 4127 + rtw89_phy_write32_idx(rtwdev, chip->bss_clr_map_reg, B_BSS_CLR_MAP_VLD0, 0x1, 4130 4128 phy_idx); 4131 - rtw89_phy_write32_idx(rtwdev, R_BSS_CLR_MAP, B_BSS_CLR_MAP_TGT, bss_color, 4132 - phy_idx); 4133 - rtw89_phy_write32_idx(rtwdev, R_BSS_CLR_MAP, B_BSS_CLR_MAP_STAID, 4129 + rtw89_phy_write32_idx(rtwdev, chip->bss_clr_map_reg, B_BSS_CLR_MAP_TGT, 4130 + bss_color, phy_idx); 4131 + rtw89_phy_write32_idx(rtwdev, chip->bss_clr_map_reg, B_BSS_CLR_MAP_STAID, 4134 4132 vif->cfg.aid, phy_idx); 4135 4133 } 4136 4134
+20 -2
drivers/net/wireless/realtek/rtw89/reg.h
··· 3559 3559 #define RR_MOD_IQK GENMASK(19, 4) 3560 3560 #define RR_MOD_DPK GENMASK(19, 5) 3561 3561 #define RR_MOD_MASK GENMASK(19, 16) 3562 + #define RR_MOD_DCK GENMASK(14, 10) 3562 3563 #define RR_MOD_RGM GENMASK(13, 4) 3563 3564 #define RR_MOD_V_DOWN 0x0 3564 3565 #define RR_MOD_V_STANDBY 0x1 ··· 3573 3572 #define RR_MOD_NBW GENMASK(15, 14) 3574 3573 #define RR_MOD_M_RXG GENMASK(13, 4) 3575 3574 #define RR_MOD_M_RXBB GENMASK(9, 5) 3575 + #define RR_MOD_LO_SEL BIT(1) 3576 3576 #define RR_MODOPT 0x01 3577 3577 #define RR_MODOPT_M_TXPWR GENMASK(5, 0) 3578 3578 #define RR_WLSEL 0x02 ··· 3640 3638 #define RR_LUTWA_M2 GENMASK(4, 0) 3641 3639 #define RR_LUTWD1 0x3e 3642 3640 #define RR_LUTWD0 0x3f 3641 + #define RR_LUTWD0_MB GENMASK(11, 6) 3643 3642 #define RR_LUTWD0_LB GENMASK(5, 0) 3644 3643 #define RR_TM 0x42 3645 3644 #define RR_TM_TRI BIT(19) ··· 3674 3671 #define RR_TXRSV_GAPK BIT(19) 3675 3672 #define RR_BIAS 0x5e 3676 3673 #define RR_BIAS_GAPK BIT(19) 3674 + #define RR_TXAC 0x5f 3675 + #define RR_TXAC_IQG GENMASK(3, 0) 3677 3676 #define RR_BIASA 0x60 3678 3677 #define RR_BIASA_TXG GENMASK(15, 12) 3679 3678 #define RR_BIASA_TXA GENMASK(19, 16) ··· 3734 3729 #define RR_XALNA2_SW2 GENMASK(9, 8) 3735 3730 #define RR_XALNA2_SW GENMASK(1, 0) 3736 3731 #define RR_DCK 0x92 3732 + #define RR_DCK_S1 GENMASK(19, 16) 3733 + #define RR_DCK_TIA GENMASK(15, 9) 3737 3734 #define RR_DCK_DONE GENMASK(7, 5) 3738 3735 #define RR_DCK_FINE BIT(1) 3739 3736 #define RR_DCK_LV BIT(0) 3740 3737 #define RR_DCK1 0x93 3738 + #define RR_DCK1_S1 GENMASK(19, 16) 3739 + #define RR_DCK1_TIA GENMASK(15, 9) 3741 3740 #define RR_DCK1_DONE BIT(5) 3742 3741 #define RR_DCK1_CLR GENMASK(3, 0) 3743 3742 #define RR_DCK1_SEL BIT(3) ··· 3790 3781 #define RR_LUTDBG 0xdf 3791 3782 #define RR_LUTDBG_TIA BIT(12) 3792 3783 #define RR_LUTDBG_LOK BIT(2) 3784 + #define RR_LUTPLL 0xec 3785 + #define RR_CAL_RW BIT(19) 3793 3786 #define RR_LUTWE2 0xee 3794 3787 #define RR_LUTWE2_RTXBW BIT(2) 3795 3788 #define RR_LUTWE 0xef 3796 3789 #define RR_LUTWE_LOK BIT(2) 3797 3790 #define RR_RFC 0xf0 3791 + #define RR_WCAL BIT(16) 3798 3792 #define RR_RFC_CKEN BIT(1) 3799 3793 3800 3794 #define R_UPD_P0 0x0000 ··· 4102 4090 #define R_MUIC 0x40F8 4103 4091 #define B_MUIC_EN BIT(0) 4104 4092 #define R_DCFO 0x4264 4105 - #define B_DCFO GENMASK(1, 0) 4093 + #define B_DCFO GENMASK(7, 0) 4106 4094 #define R_SEG0CSI 0x42AC 4107 - #define B_SEG0CSI_IDX GENMASK(11, 0) 4095 + #define B_SEG0CSI_IDX GENMASK(10, 0) 4108 4096 #define R_SEG0CSI_EN 0x42C4 4109 4097 #define B_SEG0CSI_EN BIT(23) 4110 4098 #define R_BSS_CLR_MAP 0x43ac 4099 + #define R_BSS_CLR_MAP_V1 0x43B0 4111 4100 #define B_BSS_CLR_MAP_VLD0 BIT(28) 4112 4101 #define B_BSS_CLR_MAP_TGT GENMASK(27, 22) 4113 4102 #define B_BSS_CLR_MAP_STAID GENMASK(21, 11) ··· 4738 4725 #define R_DRCK_FH 0xC094 4739 4726 #define B_DRCK_LAT BIT(9) 4740 4727 #define R_DRCK 0xC0C4 4728 + #define B_DRCK_MUL GENMASK(21, 17) 4741 4729 #define B_DRCK_IDLE BIT(9) 4742 4730 #define B_DRCK_EN BIT(6) 4743 4731 #define B_DRCK_VAL GENMASK(4, 0) ··· 4756 4742 #define B_PATH0_SAMPL_DLY_T_MSK_V1 GENMASK(27, 26) 4757 4743 #define R_P0_CFCH_BW0 0xC0D4 4758 4744 #define B_P0_CFCH_BW0 GENMASK(27, 26) 4745 + #define B_P0_CFCH_EN GENMASK(14, 11) 4746 + #define B_P0_CFCH_CTL GENMASK(10, 7) 4759 4747 #define R_P0_CFCH_BW1 0xC0D8 4760 4748 #define B_P0_CFCH_EX BIT(13) 4761 4749 #define B_P0_CFCH_BW1 GENMASK(8, 5) 4750 + #define R_ADCMOD 0xC0E8 4751 + #define B_ADCMOD_LP GENMASK(31, 16) 4762 4752 #define R_ADDCK0D 0xC0F0 4763 4753 #define B_ADDCK0D_VAL2 GENMASK(31, 26) 4764 4754 #define B_ADDCK0D_VAL GENMASK(25, 16)
+8 -17
drivers/net/wireless/realtek/rtw89/rtw8852a.c
··· 1035 1035 0x210); 1036 1036 rtw89_phy_write32_mask(rtwdev, R_P1_NBIIDX, B_P1_NBIIDX_VAL, 1037 1037 0x210); 1038 - rtw89_phy_write32_mask(rtwdev, R_SEG0CSI, 0xfff, 0x7c0); 1038 + rtw89_phy_write32_mask(rtwdev, R_SEG0CSI, B_SEG0CSI_IDX, 0x7c0); 1039 1039 rtw89_phy_write32_mask(rtwdev, R_P0_NBIIDX, 1040 1040 B_P0_NBIIDX_NOTCH_EN, 0x1); 1041 1041 rtw89_phy_write32_mask(rtwdev, R_P1_NBIIDX, ··· 1047 1047 0x210); 1048 1048 rtw89_phy_write32_mask(rtwdev, R_P1_NBIIDX, B_P1_NBIIDX_VAL, 1049 1049 0x210); 1050 - rtw89_phy_write32_mask(rtwdev, R_SEG0CSI, 0xfff, 0x40); 1050 + rtw89_phy_write32_mask(rtwdev, R_SEG0CSI, B_SEG0CSI_IDX, 0x40); 1051 1051 rtw89_phy_write32_mask(rtwdev, R_P0_NBIIDX, 1052 1052 B_P0_NBIIDX_NOTCH_EN, 0x1); 1053 1053 rtw89_phy_write32_mask(rtwdev, R_P1_NBIIDX, ··· 1059 1059 0x2d0); 1060 1060 rtw89_phy_write32_mask(rtwdev, R_P1_NBIIDX, B_P1_NBIIDX_VAL, 1061 1061 0x2d0); 1062 - rtw89_phy_write32_mask(rtwdev, R_SEG0CSI, 0xfff, 0x740); 1062 + rtw89_phy_write32_mask(rtwdev, R_SEG0CSI, B_SEG0CSI_IDX, 0x740); 1063 1063 rtw89_phy_write32_mask(rtwdev, R_P0_NBIIDX, 1064 1064 B_P0_NBIIDX_NOTCH_EN, 0x1); 1065 1065 rtw89_phy_write32_mask(rtwdev, R_P1_NBIIDX, ··· 1878 1878 void rtw8852a_btc_update_bt_cnt(struct rtw89_dev *rtwdev) 1879 1879 { 1880 1880 struct rtw89_btc *btc = &rtwdev->btc; 1881 + const struct rtw89_btc_ver *ver = btc->ver; 1881 1882 struct rtw89_btc_cx *cx = &btc->cx; 1882 1883 u32 val; 1884 + 1885 + if (ver->fcxbtcrpt != 1) 1886 + return; 1883 1887 1884 1888 val = rtw89_read32(rtwdev, R_AX_BT_STAST_HIGH); 1885 1889 cx->cnt_bt[BTC_BCNT_HIPRI_TX] = FIELD_GET(B_AX_STATIS_BT_HI_TX_MASK, val); ··· 2110 2106 .btcx_desired = 0x7, 2111 2107 .scbd = 0x1, 2112 2108 .mailbox = 0x1, 2113 - .btc_fwinfo_buf = 1024, 2114 - 2115 - .fcxbtcrpt_ver = 1, 2116 - .fcxtdma_ver = 1, 2117 - .fcxslots_ver = 1, 2118 - .fcxcysta_ver = 2, 2119 - .fcxstep_ver = 2, 2120 - .fcxnullsta_ver = 1, 2121 - .fcxmreg_ver = 1, 2122 - .fcxgpiodbg_ver = 1, 2123 - .fcxbtver_ver = 1, 2124 - .fcxbtscan_ver = 1, 2125 - .fcxbtafh_ver = 1, 2126 - .fcxbtdevinfo_ver = 1, 2127 2109 2128 2110 .afh_guard_ch = 6, 2129 2111 .wl_rssi_thres = rtw89_btc_8852a_wl_rssi_thres, ··· 2139 2149 .dcfo_comp_sft = 3, 2140 2150 .imr_info = &rtw8852a_imr_info, 2141 2151 .rrsr_cfgs = &rtw8852a_rrsr_cfgs, 2152 + .bss_clr_map_reg = R_BSS_CLR_MAP, 2142 2153 .dma_ch_mask = 0, 2143 2154 #ifdef CONFIG_PM 2144 2155 .wowlan_stub = &rtw_wowlan_stub_8852a,
+1 -1
drivers/net/wireless/realtek/rtw89/rtw8852a_rfk.c
··· 1643 1643 rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_IQK, BTC_WRFK_ONESHOT_START); 1644 1644 1645 1645 rtw89_debug(rtwdev, RTW89_DBG_RFK, 1646 - "[IQK]==========IQK strat!!!!!==========\n"); 1646 + "[IQK]==========IQK start!!!!!==========\n"); 1647 1647 iqk_info->iqk_times++; 1648 1648 iqk_info->kcount = 0; 1649 1649 iqk_info->version = RTW8852A_IQK_VER;
+1
drivers/net/wireless/realtek/rtw89/rtw8852ae.c
··· 44 44 .tx_dma_ch_mask = 0, 45 45 .bd_idx_addr_low_power = NULL, 46 46 .dma_addr_set = &rtw89_pci_ch_dma_addr_set, 47 + .bd_ram_table = &rtw89_bd_ram_table_dual, 47 48 48 49 .ltr_set = rtw89_pci_ltr_set, 49 50 .fill_txaddr_info = rtw89_pci_fill_txaddr_info,
+4 -14
drivers/net/wireless/realtek/rtw89/rtw8852b.c
··· 2423 2423 .btc_update_bt_cnt = rtw8852b_btc_update_bt_cnt, 2424 2424 .btc_wl_s1_standby = rtw8852b_btc_wl_s1_standby, 2425 2425 .btc_set_wl_rx_gain = rtw8852b_btc_set_wl_rx_gain, 2426 - .btc_set_policy = rtw89_btc_set_policy, 2426 + .btc_set_policy = rtw89_btc_set_policy_v1, 2427 2427 }; 2428 2428 2429 2429 const struct rtw89_chip_info rtw8852b_chip_info = { ··· 2437 2437 .rsvd_ple_ofst = 0x2f800, 2438 2438 .hfc_param_ini = rtw8852b_hfc_param_ini_pcie, 2439 2439 .dle_mem = rtw8852b_dle_mem_pcie, 2440 + .wde_qempty_acq_num = 4, 2441 + .wde_qempty_mgq_sel = 4, 2440 2442 .rf_base_addr = {0xe000, 0xf000}, 2441 2443 .pwr_on_seq = NULL, 2442 2444 .pwr_off_seq = NULL, ··· 2485 2483 .btcx_desired = 0x5, 2486 2484 .scbd = 0x1, 2487 2485 .mailbox = 0x1, 2488 - .btc_fwinfo_buf = 1024, 2489 2486 2490 - .fcxbtcrpt_ver = 1, 2491 - .fcxtdma_ver = 1, 2492 - .fcxslots_ver = 1, 2493 - .fcxcysta_ver = 2, 2494 - .fcxstep_ver = 2, 2495 - .fcxnullsta_ver = 1, 2496 - .fcxmreg_ver = 1, 2497 - .fcxgpiodbg_ver = 1, 2498 - .fcxbtver_ver = 1, 2499 - .fcxbtscan_ver = 1, 2500 - .fcxbtafh_ver = 1, 2501 - .fcxbtdevinfo_ver = 1, 2502 2487 .afh_guard_ch = 6, 2503 2488 .wl_rssi_thres = rtw89_btc_8852b_wl_rssi_thres, 2504 2489 .bt_rssi_thres = rtw89_btc_8852b_bt_rssi_thres, ··· 2514 2525 .dcfo_comp_sft = 3, 2515 2526 .imr_info = &rtw8852b_imr_info, 2516 2527 .rrsr_cfgs = &rtw8852b_rrsr_cfgs, 2528 + .bss_clr_map_reg = R_BSS_CLR_MAP_V1, 2517 2529 .dma_ch_mask = BIT(RTW89_DMA_ACH4) | BIT(RTW89_DMA_ACH5) | 2518 2530 BIT(RTW89_DMA_ACH6) | BIT(RTW89_DMA_ACH7) | 2519 2531 BIT(RTW89_DMA_B1MG) | BIT(RTW89_DMA_B1HI),
+1
drivers/net/wireless/realtek/rtw89/rtw8852be.c
··· 46 46 BIT(RTW89_TXCH_CH10) | BIT(RTW89_TXCH_CH11), 47 47 .bd_idx_addr_low_power = NULL, 48 48 .dma_addr_set = &rtw89_pci_ch_dma_addr_set, 49 + .bd_ram_table = &rtw89_bd_ram_table_single, 49 50 50 51 .ltr_set = rtw89_pci_ltr_set, 51 52 .fill_txaddr_info = rtw89_pci_fill_txaddr_info,
+1 -14
drivers/net/wireless/realtek/rtw89/rtw8852c.c
··· 2915 2915 .btcx_desired = 0x7, 2916 2916 .scbd = 0x1, 2917 2917 .mailbox = 0x1, 2918 - .btc_fwinfo_buf = 1280, 2919 - 2920 - .fcxbtcrpt_ver = 4, 2921 - .fcxtdma_ver = 3, 2922 - .fcxslots_ver = 1, 2923 - .fcxcysta_ver = 3, 2924 - .fcxstep_ver = 3, 2925 - .fcxnullsta_ver = 2, 2926 - .fcxmreg_ver = 1, 2927 - .fcxgpiodbg_ver = 1, 2928 - .fcxbtver_ver = 1, 2929 - .fcxbtscan_ver = 1, 2930 - .fcxbtafh_ver = 1, 2931 - .fcxbtdevinfo_ver = 1, 2932 2918 2933 2919 .afh_guard_ch = 6, 2934 2920 .wl_rssi_thres = rtw89_btc_8852c_wl_rssi_thres, ··· 2945 2959 .dcfo_comp_sft = 5, 2946 2960 .imr_info = &rtw8852c_imr_info, 2947 2961 .rrsr_cfgs = &rtw8852c_rrsr_cfgs, 2962 + .bss_clr_map_reg = R_BSS_CLR_MAP, 2948 2963 .dma_ch_mask = 0, 2949 2964 #ifdef CONFIG_PM 2950 2965 .wowlan_stub = &rtw_wowlan_stub_8852c,
+320 -33
drivers/net/wireless/realtek/rtw89/rtw8852c_rfk.c
··· 11 11 #include "rtw8852c_rfk_table.h" 12 12 #include "rtw8852c_table.h" 13 13 14 + struct rxck_def { 15 + u32 ctl; 16 + u32 en; 17 + u32 bw0; 18 + u32 bw1; 19 + u32 mul; 20 + u32 lp; 21 + }; 22 + 14 23 #define _TSSI_DE_MASK GENMASK(21, 12) 15 24 static const u32 _tssi_de_cck_long[RF_PATH_NUM_8852C] = {0x5858, 0x7858}; 16 25 static const u32 _tssi_de_cck_short[RF_PATH_NUM_8852C] = {0x5860, 0x7860}; ··· 35 26 }; 36 27 37 28 static const u32 rtw8852c_backup_rf_regs[] = { 38 - 0xdf, 0x8f, 0x97, 0xa3, 0x5, 0x10005 29 + 0xdf, 0x5f, 0x8f, 0x97, 0xa3, 0x5, 0x10005 39 30 }; 40 31 41 32 #define BACKUP_BB_REGS_NR ARRAY_SIZE(rtw8852c_backup_bb_regs) ··· 67 58 {0x8190, 0x8194, 0x8198, 0x81a4}, 68 59 {0x81a8, 0x81c4, 0x81c8, 0x81e8}, 69 60 }; 61 + 62 + static const u8 _dck_addr_bs[RF_PATH_NUM_8852C] = {0x0, 0x10}; 63 + static const u8 _dck_addr[RF_PATH_NUM_8852C] = {0xc, 0x1c}; 64 + 65 + static const struct rxck_def _ck480M = {0x8, 0x2, 0x3, 0xf, 0x0, 0x9}; 66 + static const struct rxck_def _ck960M = {0x8, 0x2, 0x2, 0x8, 0x0, 0x9}; 67 + static const struct rxck_def _ck1920M = {0x8, 0x0, 0x2, 0x4, 0x6, 0x9}; 70 68 71 69 static u8 _kpath(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx) 72 70 { ··· 353 337 (dack->dadck_d[path][index] << 14); 354 338 addr = 0xc210 + offset; 355 339 rtw89_phy_write32(rtwdev, addr, val32); 356 - rtw89_phy_write32_set(rtwdev, addr, BIT(1)); 340 + rtw89_phy_write32_set(rtwdev, addr, BIT(0)); 357 341 } 358 342 359 343 static void _dack_reload(struct rtw89_dev *rtwdev, enum rtw89_rf_path path) ··· 453 437 static void rtw8852c_rxck_force(struct rtw89_dev *rtwdev, u8 path, bool force, 454 438 enum adc_ck ck) 455 439 { 440 + const struct rxck_def *def; 441 + 456 442 rtw89_phy_write32_mask(rtwdev, R_P0_RXCK | (path << 13), B_P0_RXCK_ON, 0x0); 457 443 458 444 if (!force) ··· 462 444 463 445 rtw89_phy_write32_mask(rtwdev, R_P0_RXCK | (path << 13), B_P0_RXCK_VAL, ck); 464 446 rtw89_phy_write32_mask(rtwdev, R_P0_RXCK | (path << 13), B_P0_RXCK_ON, 0x1); 447 + 448 + switch (ck) { 449 + case ADC_480M: 450 + def = &_ck480M; 451 + break; 452 + case ADC_960M: 453 + def = &_ck960M; 454 + break; 455 + case ADC_1920M: 456 + default: 457 + def = &_ck1920M; 458 + break; 459 + } 460 + 461 + rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW0 | (path << 8), B_P0_CFCH_CTL, def->ctl); 462 + rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW0 | (path << 8), B_P0_CFCH_EN, def->en); 463 + rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW0 | (path << 8), B_P0_CFCH_BW0, def->bw0); 464 + rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW1 | (path << 8), B_P0_CFCH_BW1, def->bw1); 465 + rtw89_phy_write32_mask(rtwdev, R_DRCK | (path << 8), B_DRCK_MUL, def->mul); 466 + rtw89_phy_write32_mask(rtwdev, R_ADCMOD | (path << 8), B_ADCMOD_LP, def->lp); 465 467 } 466 468 467 469 static bool _check_dack_done(struct rtw89_dev *rtwdev, bool s0) ··· 665 627 rtw89_phy_write32_mask(rtwdev, R_UPD_CLK + (path << 13), B_DPD_GDIS, 0x1); 666 628 rtw8852c_rxck_force(rtwdev, path, true, ADC_480M); 667 629 rtw89_phy_write32_mask(rtwdev, R_UPD_CLK + (path << 13), B_ACK_VAL, 0x0); 668 - rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW0 + (path << 8), B_P0_CFCH_BW0, 0x3); 669 - rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW1 + (path << 8), B_P0_CFCH_BW1, 0xf); 670 630 rtw89_write_rf(rtwdev, path, RR_RXBB2, RR_RXBB2_CKT, 0x1); 671 631 rtw89_phy_write32_mask(rtwdev, R_P0_NRBW + (path << 13), B_P0_NRBW_DBG, 0x1); 672 632 break; ··· 672 636 rtw89_phy_write32_mask(rtwdev, R_UPD_CLK + (path << 13), B_DPD_GDIS, 0x1); 673 637 rtw8852c_rxck_force(rtwdev, path, true, ADC_960M); 674 638 rtw89_phy_write32_mask(rtwdev, R_UPD_CLK + (path << 13), B_ACK_VAL, 0x1); 675 - rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW0 + (path << 8), B_P0_CFCH_BW0, 0x2); 676 - rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW1 + (path << 8), B_P0_CFCH_BW1, 0xd); 677 639 rtw89_write_rf(rtwdev, path, RR_RXBB2, RR_RXBB2_CKT, 0x1); 678 640 rtw89_phy_write32_mask(rtwdev, R_P0_NRBW + (path << 13), B_P0_NRBW_DBG, 0x1); 679 641 break; ··· 679 645 rtw89_phy_write32_mask(rtwdev, R_UPD_CLK + (path << 13), B_DPD_GDIS, 0x1); 680 646 rtw8852c_rxck_force(rtwdev, path, true, ADC_1920M); 681 647 rtw89_phy_write32_mask(rtwdev, R_UPD_CLK + (path << 13), B_ACK_VAL, 0x2); 682 - rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW0 + (path << 8), B_P0_CFCH_BW0, 0x1); 683 - rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW1 + (path << 8), B_P0_CFCH_BW1, 0xb); 684 648 rtw89_write_rf(rtwdev, path, RR_RXBB2, RR_RXBB2_CKT, 0x1); 685 649 rtw89_phy_write32_mask(rtwdev, R_P0_NRBW + (path << 13), B_P0_NRBW_DBG, 0x1); 686 650 break; ··· 1442 1410 rtw8852c_rxck_force(rtwdev, path, true, ADC_1920M); 1443 1411 rtw89_phy_write32_mask(rtwdev, R_UPD_CLK | (path << 13), B_ACK_VAL, 0x2); 1444 1412 1445 - rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW0 | (path << 8), B_P0_CFCH_BW0, 0x1); 1446 - rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW1 | (path << 8), B_P0_CFCH_BW1, 0xb); 1447 1413 rtw89_phy_write32_mask(rtwdev, R_P0_NRBW | (path << 13), B_P0_NRBW_DBG, 0x1); 1448 1414 rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15, 0x1f); 1449 1415 rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, B_ANAPAR_PW15, 0x13); ··· 1566 1536 } 1567 1537 } 1568 1538 1539 + static void _rx_dck_value_rewrite(struct rtw89_dev *rtwdev, u8 path, u8 addr, 1540 + u8 val_i, u8 val_q) 1541 + { 1542 + u32 ofst_val; 1543 + 1544 + rtw89_debug(rtwdev, RTW89_DBG_RFK, 1545 + "[RX_DCK] rewrite val_i = 0x%x, val_q = 0x%x\n", val_i, val_q); 1546 + 1547 + /* val_i and val_q are 7 bits, and target is 6 bits. */ 1548 + ofst_val = u32_encode_bits(val_q >> 1, RR_LUTWD0_MB) | 1549 + u32_encode_bits(val_i >> 1, RR_LUTWD0_LB); 1550 + 1551 + rtw89_write_rf(rtwdev, path, RR_LUTPLL, RR_CAL_RW, 0x1); 1552 + rtw89_write_rf(rtwdev, path, RR_RFC, RR_WCAL, 0x1); 1553 + rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_FINE, 0x1); 1554 + rtw89_write_rf(rtwdev, path, RR_LUTWA, MASKBYTE0, addr); 1555 + rtw89_write_rf(rtwdev, path, RR_LUTWD0, RFREG_MASK, ofst_val); 1556 + rtw89_write_rf(rtwdev, path, RR_LUTWD0, RFREG_MASK, ofst_val); 1557 + rtw89_write_rf(rtwdev, path, RR_DCK, RR_DCK_FINE, 0x0); 1558 + rtw89_write_rf(rtwdev, path, RR_RFC, RR_WCAL, 0x0); 1559 + rtw89_write_rf(rtwdev, path, RR_LUTPLL, RR_CAL_RW, 0x0); 1560 + 1561 + rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RX_DCK] Final val_i = 0x%x, val_q = 0x%x\n", 1562 + u32_get_bits(ofst_val, RR_LUTWD0_LB) << 1, 1563 + u32_get_bits(ofst_val, RR_LUTWD0_MB) << 1); 1564 + } 1565 + 1566 + static bool _rx_dck_rek_check(struct rtw89_dev *rtwdev, u8 path) 1567 + { 1568 + u8 i_even_bs, q_even_bs; 1569 + u8 i_odd_bs, q_odd_bs; 1570 + u8 i_even, q_even; 1571 + u8 i_odd, q_odd; 1572 + const u8 th = 10; 1573 + u8 i; 1574 + 1575 + for (i = 0; i < RF_PATH_NUM_8852C; i++) { 1576 + rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_DCK, _dck_addr_bs[i]); 1577 + i_even_bs = rtw89_read_rf(rtwdev, path, RR_DCK, RR_DCK_TIA); 1578 + q_even_bs = rtw89_read_rf(rtwdev, path, RR_DCK1, RR_DCK1_TIA); 1579 + rtw89_debug(rtwdev, RTW89_DBG_RFK, 1580 + "[RX_DCK] Gain[0x%x] i_even_bs/ q_even_bs = 0x%x/ 0x%x\n", 1581 + _dck_addr_bs[i], i_even_bs, q_even_bs); 1582 + 1583 + rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_DCK, _dck_addr[i]); 1584 + i_even = rtw89_read_rf(rtwdev, path, RR_DCK, RR_DCK_TIA); 1585 + q_even = rtw89_read_rf(rtwdev, path, RR_DCK1, RR_DCK1_TIA); 1586 + rtw89_debug(rtwdev, RTW89_DBG_RFK, 1587 + "[RX_DCK] Gain[0x%x] i_even/ q_even = 0x%x/ 0x%x\n", 1588 + _dck_addr[i], i_even, q_even); 1589 + 1590 + if (abs(i_even_bs - i_even) > th || abs(q_even_bs - q_even) > th) 1591 + return true; 1592 + 1593 + rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_DCK, _dck_addr_bs[i] + 1); 1594 + i_odd_bs = rtw89_read_rf(rtwdev, path, RR_DCK, RR_DCK_TIA); 1595 + q_odd_bs = rtw89_read_rf(rtwdev, path, RR_DCK1, RR_DCK1_TIA); 1596 + rtw89_debug(rtwdev, RTW89_DBG_RFK, 1597 + "[RX_DCK] Gain[0x%x] i_odd_bs/ q_odd_bs = 0x%x/ 0x%x\n", 1598 + _dck_addr_bs[i] + 1, i_odd_bs, q_odd_bs); 1599 + 1600 + rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_DCK, _dck_addr[i] + 1); 1601 + i_odd = rtw89_read_rf(rtwdev, path, RR_DCK, RR_DCK_TIA); 1602 + q_odd = rtw89_read_rf(rtwdev, path, RR_DCK1, RR_DCK1_TIA); 1603 + rtw89_debug(rtwdev, RTW89_DBG_RFK, 1604 + "[RX_DCK] Gain[0x%x] i_odd/ q_odd = 0x%x/ 0x%x\n", 1605 + _dck_addr[i] + 1, i_odd, q_odd); 1606 + 1607 + if (abs(i_odd_bs - i_odd) > th || abs(q_odd_bs - q_odd) > th) 1608 + return true; 1609 + } 1610 + 1611 + return false; 1612 + } 1613 + 1614 + static void _rx_dck_fix_if_need(struct rtw89_dev *rtwdev, u8 path, u8 addr, 1615 + u8 val_i_bs, u8 val_q_bs, u8 val_i, u8 val_q) 1616 + { 1617 + const u8 th = 10; 1618 + 1619 + if ((abs(val_i_bs - val_i) < th) && (abs(val_q_bs - val_q) <= th)) { 1620 + rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RX_DCK] offset check PASS!!\n"); 1621 + return; 1622 + } 1623 + 1624 + if (abs(val_i_bs - val_i) > th) { 1625 + rtw89_debug(rtwdev, RTW89_DBG_RFK, 1626 + "[RX_DCK] val_i over TH (0x%x / 0x%x)\n", val_i_bs, val_i); 1627 + val_i = val_i_bs; 1628 + } 1629 + 1630 + if (abs(val_q_bs - val_q) > th) { 1631 + rtw89_debug(rtwdev, RTW89_DBG_RFK, 1632 + "[RX_DCK] val_q over TH (0x%x / 0x%x)\n", val_q_bs, val_q); 1633 + val_q = val_q_bs; 1634 + } 1635 + 1636 + _rx_dck_value_rewrite(rtwdev, path, addr, val_i, val_q); 1637 + } 1638 + 1639 + static void _rx_dck_recover(struct rtw89_dev *rtwdev, u8 path) 1640 + { 1641 + u8 i_even_bs, q_even_bs; 1642 + u8 i_odd_bs, q_odd_bs; 1643 + u8 i_even, q_even; 1644 + u8 i_odd, q_odd; 1645 + u8 i; 1646 + 1647 + rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RX_DCK] ===> recovery\n"); 1648 + 1649 + for (i = 0; i < RF_PATH_NUM_8852C; i++) { 1650 + rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_DCK, _dck_addr_bs[i]); 1651 + i_even_bs = rtw89_read_rf(rtwdev, path, RR_DCK, RR_DCK_TIA); 1652 + q_even_bs = rtw89_read_rf(rtwdev, path, RR_DCK1, RR_DCK1_TIA); 1653 + 1654 + rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_DCK, _dck_addr_bs[i] + 1); 1655 + i_odd_bs = rtw89_read_rf(rtwdev, path, RR_DCK, RR_DCK_TIA); 1656 + q_odd_bs = rtw89_read_rf(rtwdev, path, RR_DCK1, RR_DCK1_TIA); 1657 + 1658 + rtw89_debug(rtwdev, RTW89_DBG_RFK, 1659 + "[RX_DCK] Gain[0x%x] i_even_bs/ q_even_bs = 0x%x/ 0x%x\n", 1660 + _dck_addr_bs[i], i_even_bs, q_even_bs); 1661 + 1662 + rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_DCK, _dck_addr[i]); 1663 + i_even = rtw89_read_rf(rtwdev, path, RR_DCK, RR_DCK_TIA); 1664 + q_even = rtw89_read_rf(rtwdev, path, RR_DCK1, RR_DCK1_TIA); 1665 + 1666 + rtw89_debug(rtwdev, RTW89_DBG_RFK, 1667 + "[RX_DCK] Gain[0x%x] i_even/ q_even = 0x%x/ 0x%x\n", 1668 + _dck_addr[i], i_even, q_even); 1669 + _rx_dck_fix_if_need(rtwdev, path, _dck_addr[i], 1670 + i_even_bs, q_even_bs, i_even, q_even); 1671 + 1672 + rtw89_debug(rtwdev, RTW89_DBG_RFK, 1673 + "[RX_DCK] Gain[0x%x] i_odd_bs/ q_odd_bs = 0x%x/ 0x%x\n", 1674 + _dck_addr_bs[i] + 1, i_odd_bs, q_odd_bs); 1675 + 1676 + rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_DCK, _dck_addr[i] + 1); 1677 + i_odd = rtw89_read_rf(rtwdev, path, RR_DCK, RR_DCK_TIA); 1678 + q_odd = rtw89_read_rf(rtwdev, path, RR_DCK1, RR_DCK1_TIA); 1679 + 1680 + rtw89_debug(rtwdev, RTW89_DBG_RFK, 1681 + "[RX_DCK] Gain[0x%x] i_odd/ q_odd = 0x%x/ 0x%x\n", 1682 + _dck_addr[i] + 1, i_odd, q_odd); 1683 + _rx_dck_fix_if_need(rtwdev, path, _dck_addr[i] + 1, 1684 + i_odd_bs, q_odd_bs, i_odd, q_odd); 1685 + } 1686 + } 1687 + 1569 1688 static void _rx_dck_toggle(struct rtw89_dev *rtwdev, u8 path) 1570 1689 { 1571 1690 int ret; ··· 1752 1573 } 1753 1574 } 1754 1575 1576 + static 1577 + u8 _rx_dck_channel_calc(struct rtw89_dev *rtwdev, const struct rtw89_chan *chan) 1578 + { 1579 + u8 target_ch = 0; 1580 + 1581 + if (chan->band_type == RTW89_BAND_5G) { 1582 + if (chan->channel >= 36 && chan->channel <= 64) { 1583 + target_ch = 100; 1584 + } else if (chan->channel >= 100 && chan->channel <= 144) { 1585 + target_ch = chan->channel + 32; 1586 + if (target_ch > 144) 1587 + target_ch = chan->channel + 33; 1588 + } else if (chan->channel >= 149 && chan->channel <= 177) { 1589 + target_ch = chan->channel - 33; 1590 + } 1591 + } else if (chan->band_type == RTW89_BAND_6G) { 1592 + if (chan->channel >= 1 && chan->channel <= 125) 1593 + target_ch = chan->channel + 32; 1594 + else 1595 + target_ch = chan->channel - 32; 1596 + } else { 1597 + target_ch = chan->channel; 1598 + } 1599 + 1600 + rtw89_debug(rtwdev, RTW89_DBG_RFK, 1601 + "[RX_DCK] cur_ch / target_ch = %d / %d\n", 1602 + chan->channel, target_ch); 1603 + 1604 + return target_ch; 1605 + } 1606 + 1755 1607 #define RTW8852C_RF_REL_VERSION 34 1756 - #define RTW8852C_DPK_VER 0x10 1608 + #define RTW8852C_DPK_VER 0xf 1757 1609 #define RTW8852C_DPK_TH_AVG_NUM 4 1758 1610 #define RTW8852C_DPK_RF_PATH 2 1759 - #define RTW8852C_DPK_KIP_REG_NUM 5 1611 + #define RTW8852C_DPK_KIP_REG_NUM 7 1760 1612 #define RTW8852C_DPK_RXSRAM_DBG 0 1761 1613 1762 1614 enum rtw8852c_dpk_id { ··· 1822 1612 DPK_AGC_STEP_GL_GT_CRITERION, 1823 1613 DPK_AGC_STEP_GL_LT_CRITERION, 1824 1614 DPK_AGC_STEP_SET_TX_GAIN, 1615 + }; 1616 + 1617 + enum dpk_pas_result { 1618 + DPK_PAS_NOR, 1619 + DPK_PAS_GT, 1620 + DPK_PAS_LT, 1825 1621 }; 1826 1622 1827 1623 static void _rf_direct_cntrl(struct rtw89_dev *rtwdev, ··· 1946 1730 1947 1731 /*4. Set ADC clk*/ 1948 1732 rtw8852c_rxck_force(rtwdev, path, true, ADC_1920M); 1949 - rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW0 + (path << 8), B_P0_CFCH_BW0, 0x1); 1950 - rtw89_phy_write32_mask(rtwdev, R_P0_CFCH_BW1 + (path << 8), B_P0_CFCH_BW1, 0xb); 1951 1733 rtw89_phy_write32_mask(rtwdev, R_P0_NRBW + (path << 13), 1952 1734 B_P0_NRBW_DBG, 0x1); 1953 1735 rtw89_phy_write32_mask(rtwdev, R_ANAPAR_PW15, MASKBYTE3, 0x1f); ··· 2086 1872 0x50101 | BIT(rtwdev->dbcc_en)); 2087 1873 rtw89_write_rf(rtwdev, path, RR_MOD_V1, RR_MOD_MASK, RF_DPK); 2088 1874 2089 - if (dpk->bp[path][kidx].band == RTW89_BAND_6G && dpk->bp[path][kidx].ch >= 161) { 1875 + if (dpk->bp[path][kidx].band == RTW89_BAND_6G && dpk->bp[path][kidx].ch >= 161) 2090 1876 rtw89_write_rf(rtwdev, path, RR_IQGEN, RR_IQGEN_BIAS, 0x8); 2091 - rtw89_write_rf(rtwdev, path, RR_LOGEN, RR_LOGEN_RPT, 0xd); 2092 - } else { 2093 - rtw89_write_rf(rtwdev, path, RR_LOGEN, RR_LOGEN_RPT, 0xd); 2094 - } 1877 + 1878 + rtw89_write_rf(rtwdev, path, RR_LOGEN, RR_LOGEN_RPT, 0xd); 1879 + rtw89_write_rf(rtwdev, path, RR_TXAC, RR_TXAC_IQG, 0x8); 2095 1880 2096 1881 rtw89_write_rf(rtwdev, path, RR_RXA2, RR_RXA2_ATT, 0x0); 2097 1882 rtw89_write_rf(rtwdev, path, RR_TXIQK, RR_TXIQK_ATT2, 0x3); ··· 2237 2024 return _dpk_gainloss_read(rtwdev); 2238 2025 } 2239 2026 2240 - static bool _dpk_pas_read(struct rtw89_dev *rtwdev, bool is_check) 2027 + static enum dpk_pas_result _dpk_pas_read(struct rtw89_dev *rtwdev, bool is_check) 2241 2028 { 2242 2029 u32 val1_i = 0, val1_q = 0, val2_i = 0, val2_q = 0; 2030 + u32 val1_sqrt_sum, val2_sqrt_sum; 2243 2031 u8 i; 2244 2032 2245 2033 rtw89_phy_write32_mask(rtwdev, R_KIP_RPT1, MASKBYTE2, 0x06); ··· 2271 2057 } 2272 2058 } 2273 2059 2274 - if (val1_i * val1_i + val1_q * val1_q >= (val2_i * val2_i + val2_q * val2_q) * 8 / 5) 2275 - return true; 2060 + val1_sqrt_sum = val1_i * val1_i + val1_q * val1_q; 2061 + val2_sqrt_sum = val2_i * val2_i + val2_q * val2_q; 2062 + 2063 + if (val1_sqrt_sum < val2_sqrt_sum) 2064 + return DPK_PAS_LT; 2065 + else if (val1_sqrt_sum >= val2_sqrt_sum * 8 / 5) 2066 + return DPK_PAS_GT; 2276 2067 else 2277 - return false; 2068 + return DPK_PAS_NOR; 2278 2069 } 2279 2070 2280 2071 static bool _dpk_kip_set_rxagc(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 2281 2072 enum rtw89_rf_path path, u8 kidx) 2282 2073 { 2074 + _dpk_kip_control_rfc(rtwdev, path, false); 2075 + rtw89_phy_write32_mask(rtwdev, R_KIP_MOD, B_KIP_MOD, 2076 + rtw89_read_rf(rtwdev, path, RR_MOD, RFREG_MASK)); 2077 + _dpk_kip_control_rfc(rtwdev, path, true); 2078 + 2283 2079 _dpk_one_shot(rtwdev, phy, path, D_RXAGC); 2284 2080 2285 2081 return _dpk_sync_check(rtwdev, path, kidx); ··· 2327 2103 u8 tmp_dbm = init_xdbm, tmp_gl_idx = 0; 2328 2104 u8 tmp_rxbb; 2329 2105 u8 goout = 0, agc_cnt = 0; 2106 + enum dpk_pas_result pas; 2330 2107 u16 dgain = 0; 2331 2108 bool is_fail = false; 2332 2109 int limit = 200; ··· 2363 2138 2364 2139 case DPK_AGC_STEP_GAIN_LOSS_IDX: 2365 2140 tmp_gl_idx = _dpk_gainloss(rtwdev, phy, path, kidx); 2141 + pas = _dpk_pas_read(rtwdev, true); 2366 2142 2367 - if ((tmp_gl_idx == 0 && _dpk_pas_read(rtwdev, true)) || 2368 - tmp_gl_idx >= 7) 2143 + if (pas == DPK_PAS_LT && tmp_gl_idx > 0) 2144 + step = DPK_AGC_STEP_GL_LT_CRITERION; 2145 + else if (pas == DPK_PAS_GT && tmp_gl_idx == 0) 2146 + step = DPK_AGC_STEP_GL_GT_CRITERION; 2147 + else if (tmp_gl_idx >= 7) 2369 2148 step = DPK_AGC_STEP_GL_GT_CRITERION; 2370 2149 else if (tmp_gl_idx == 0) 2371 2150 step = DPK_AGC_STEP_GL_LT_CRITERION; ··· 2696 2467 enum rtw89_phy_idx phy, u8 kpath) 2697 2468 { 2698 2469 struct rtw89_dpk_info *dpk = &rtwdev->dpk; 2699 - static const u32 kip_reg[] = {0x813c, 0x8124, 0x8120, 0xc0d4, 0xc0d8}; 2470 + static const u32 kip_reg[] = {0x813c, 0x8124, 0x8120, 0xc0c4, 0xc0e8, 0xc0d4, 0xc0d8}; 2700 2471 u32 backup_rf_val[RTW8852C_DPK_RF_PATH][BACKUP_RF_REGS_NR]; 2701 2472 u32 kip_bkup[RTW8852C_DPK_RF_PATH][RTW8852C_DPK_KIP_REG_NUM] = {}; 2702 2473 u8 path; 2703 2474 bool is_fail = true, reloaded[RTW8852C_DPK_RF_PATH] = {false}; 2475 + 2476 + static_assert(ARRAY_SIZE(kip_reg) == RTW8852C_DPK_KIP_REG_NUM); 2704 2477 2705 2478 if (dpk->is_dpk_reload_en) { 2706 2479 for (path = 0; path < RTW8852C_DPK_RF_PATH; path++) { ··· 4106 3875 4107 3876 #define RXDCK_VER_8852C 0xe 4108 3877 4109 - void rtw8852c_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool is_afe) 3878 + static void _rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, 3879 + bool is_afe, u8 retry_limit) 4110 3880 { 4111 3881 struct rtw89_rx_dck_info *rx_dck = &rtwdev->rx_dck; 4112 3882 u8 path, kpath; 4113 3883 u32 rf_reg5; 3884 + bool is_fail; 3885 + u8 rek_cnt; 4114 3886 4115 3887 kpath = _kpath(rtwdev, phy); 4116 3888 rtw89_debug(rtwdev, RTW89_DBG_RFK, ··· 4130 3896 B_P0_TSSI_TRK_EN, 0x1); 4131 3897 rtw89_write_rf(rtwdev, path, RR_RSV1, RR_RSV1_RST, 0x0); 4132 3898 rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_MASK, RR_MOD_V_RX); 4133 - _set_rx_dck(rtwdev, phy, path, is_afe); 3899 + rtw89_write_rf(rtwdev, path, RR_MOD, RR_MOD_LO_SEL, rtwdev->dbcc_en); 3900 + 3901 + for (rek_cnt = 0; rek_cnt < retry_limit; rek_cnt++) { 3902 + _set_rx_dck(rtwdev, phy, path, is_afe); 3903 + 3904 + /* To reduce IO of dck_rek_check(), the last try is seen 3905 + * as failure always, and then do recovery procedure. 3906 + */ 3907 + if (rek_cnt == retry_limit - 1) { 3908 + _rx_dck_recover(rtwdev, path); 3909 + break; 3910 + } 3911 + 3912 + is_fail = _rx_dck_rek_check(rtwdev, path); 3913 + if (!is_fail) 3914 + break; 3915 + } 3916 + 3917 + rtw89_debug(rtwdev, RTW89_DBG_RFK, "[RX_DCK] rek_cnt[%d]=%d", 3918 + path, rek_cnt); 3919 + 4134 3920 rx_dck->thermal[path] = ewma_thermal_read(&rtwdev->phystat.avg_thermal[path]); 4135 3921 rtw89_write_rf(rtwdev, path, RR_RSV1, RFREG_MASK, rf_reg5); 4136 3922 ··· 4160 3906 } 4161 3907 } 4162 3908 4163 - #define RTW8852C_RX_DCK_TH 8 3909 + void rtw8852c_rx_dck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy, bool is_afe) 3910 + { 3911 + _rx_dck(rtwdev, phy, is_afe, 1); 3912 + } 3913 + 3914 + #define RTW8852C_RX_DCK_TH 12 4164 3915 4165 3916 void rtw8852c_rx_dck_track(struct rtw89_dev *rtwdev) 4166 3917 { 3918 + const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 4167 3919 struct rtw89_rx_dck_info *rx_dck = &rtwdev->rx_dck; 3920 + enum rtw89_phy_idx phy_idx = RTW89_PHY_0; 3921 + u8 phy_map = rtw89_btc_phymap(rtwdev, phy_idx, 0); 3922 + u8 dck_channel; 4168 3923 u8 cur_thermal; 3924 + u32 tx_en; 4169 3925 int delta; 4170 3926 int path; 3927 + 3928 + if (chan->band_type == RTW89_BAND_2G) 3929 + return; 3930 + 3931 + if (rtwdev->scanning) 3932 + return; 4171 3933 4172 3934 for (path = 0; path < RF_PATH_NUM_8852C; path++) { 4173 3935 cur_thermal = ··· 4194 3924 "[RX_DCK] path=%d current thermal=0x%x delta=0x%x\n", 4195 3925 path, cur_thermal, delta); 4196 3926 4197 - if (delta >= RTW8852C_RX_DCK_TH) { 4198 - rtw8852c_rx_dck(rtwdev, RTW89_PHY_0, false); 4199 - return; 4200 - } 3927 + if (delta >= RTW8852C_RX_DCK_TH) 3928 + goto trigger_rx_dck; 4201 3929 } 3930 + 3931 + return; 3932 + 3933 + trigger_rx_dck: 3934 + rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_START); 3935 + rtw89_chip_stop_sch_tx(rtwdev, phy_idx, &tx_en, RTW89_SCH_TX_SEL_ALL); 3936 + 3937 + for (path = 0; path < RF_PATH_NUM_8852C; path++) { 3938 + dck_channel = _rx_dck_channel_calc(rtwdev, chan); 3939 + _ctrl_ch(rtwdev, RTW89_PHY_0, dck_channel, chan->band_type); 3940 + } 3941 + 3942 + _rx_dck(rtwdev, RTW89_PHY_0, false, 20); 3943 + 3944 + for (path = 0; path < RF_PATH_NUM_8852C; path++) 3945 + _ctrl_ch(rtwdev, RTW89_PHY_0, chan->channel, chan->band_type); 3946 + 3947 + rtw89_chip_resume_sch_tx(rtwdev, phy_idx, tx_en); 3948 + rtw89_btc_ntfy_wl_rfk(rtwdev, phy_map, BTC_WRFKT_RXDCK, BTC_WRFK_STOP); 4202 3949 } 4203 3950 4204 3951 void rtw8852c_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
+1
drivers/net/wireless/realtek/rtw89/rtw8852ce.c
··· 53 53 .tx_dma_ch_mask = 0, 54 54 .bd_idx_addr_low_power = &rtw8852c_bd_idx_addr_low_power, 55 55 .dma_addr_set = &rtw89_pci_ch_dma_addr_set_v1, 56 + .bd_ram_table = &rtw89_bd_ram_table_dual, 56 57 57 58 .ltr_set = rtw89_pci_ltr_set_v1, 58 59 .fill_txaddr_info = rtw89_pci_fill_txaddr_info_v1,
+2
drivers/net/wireless/realtek/rtw89/txrx.h
··· 75 75 #define RTW89_TXWD_INFO0_DATA_BW GENMASK(29, 28) 76 76 #define RTW89_TXWD_INFO0_GI_LTF GENMASK(27, 25) 77 77 #define RTW89_TXWD_INFO0_DATA_RATE GENMASK(24, 16) 78 + #define RTW89_TXWD_INFO0_DATA_ER BIT(15) 78 79 #define RTW89_TXWD_INFO0_DISDATAFB BIT(10) 80 + #define RTW89_TXWD_INFO0_DATA_BW_ER BIT(8) 79 81 #define RTW89_TXWD_INFO0_MULTIPORT_ID GENMASK(6, 4) 80 82 81 83 /* TX WD INFO DWORD 1 */
+1
drivers/net/wireless/rsi/rsi_91x_coex.c
··· 160 160 rsi_coex_scheduler_thread, 161 161 "Coex-Tx-Thread")) { 162 162 rsi_dbg(ERR_ZONE, "%s: Unable to init tx thrd\n", __func__); 163 + kfree(coex_cb); 163 164 return -EINVAL; 164 165 } 165 166 return 0;
+1 -1
drivers/net/wireless/wl3501_cs.c
··· 1328 1328 } else { 1329 1329 ++dev->stats.tx_packets; 1330 1330 dev->stats.tx_bytes += skb->len; 1331 - kfree_skb(skb); 1331 + dev_kfree_skb_irq(skb); 1332 1332 1333 1333 if (this->tx_buffer_cnt < 2) 1334 1334 netif_stop_queue(dev);
+26
include/linux/bitfield.h
··· 115 115 ((typeof(_mask))(_val) << __bf_shf(_mask)) & (_mask); \ 116 116 }) 117 117 118 + #define __BF_CHECK_POW2(n) BUILD_BUG_ON_ZERO(((n) & ((n) - 1)) != 0) 119 + 120 + /** 121 + * FIELD_PREP_CONST() - prepare a constant bitfield element 122 + * @_mask: shifted mask defining the field's length and position 123 + * @_val: value to put in the field 124 + * 125 + * FIELD_PREP_CONST() masks and shifts up the value. The result should 126 + * be combined with other fields of the bitfield using logical OR. 127 + * 128 + * Unlike FIELD_PREP() this is a constant expression and can therefore 129 + * be used in initializers. Error checking is less comfortable for this 130 + * version, and non-constant masks cannot be used. 131 + */ 132 + #define FIELD_PREP_CONST(_mask, _val) \ 133 + ( \ 134 + /* mask must be non-zero */ \ 135 + BUILD_BUG_ON_ZERO((_mask) == 0) + \ 136 + /* check if value fits */ \ 137 + BUILD_BUG_ON_ZERO(~((_mask) >> __bf_shf(_mask)) & (_val)) + \ 138 + /* check if mask is contiguous */ \ 139 + __BF_CHECK_POW2((_mask) + (1ULL << __bf_shf(_mask))) + \ 140 + /* and create the value */ \ 141 + (((typeof(_mask))(_val) << __bf_shf(_mask)) & (_mask)) \ 142 + ) 143 + 118 144 /** 119 145 * FIELD_GET() - extract a bitfield element 120 146 * @_mask: shifted mask defining the field's length and position
-1
include/linux/soc/mediatek/mtk_wed.h
··· 103 103 104 104 struct { 105 105 int size; 106 - struct page_frag_cache rx_page; 107 106 struct mtk_rxbm_desc *desc; 108 107 dma_addr_t desc_phys; 109 108 } rx_buf_ring;
+4 -12
include/net/cfg80211.h
··· 1075 1075 s8 noise; 1076 1076 }; 1077 1077 1078 - #define CFG80211_MAX_WEP_KEYS 4 1079 1078 #define CFG80211_MAX_NUM_AKM_SUITES 10 1080 1079 1081 1080 /** ··· 1098 1099 * port frames over NL80211 instead of the network interface. 1099 1100 * @control_port_no_preauth: disables pre-auth rx over the nl80211 control 1100 1101 * port for mac80211 1101 - * @wep_keys: static WEP keys, if not NULL points to an array of 1102 - * CFG80211_MAX_WEP_KEYS WEP keys 1103 - * @wep_tx_key: key index (0..3) of the default TX static WEP key 1104 1102 * @psk: PSK (for devices supporting 4-way-handshake offload) 1105 1103 * @sae_pwd: password for SAE authentication (for devices supporting SAE 1106 1104 * offload) ··· 1130 1134 bool control_port_no_encrypt; 1131 1135 bool control_port_over_nl80211; 1132 1136 bool control_port_no_preauth; 1133 - struct key_params *wep_keys; 1134 - int wep_tx_key; 1135 1137 const u8 *psk; 1136 1138 const u8 *sae_pwd; 1137 1139 u8 sae_pwd_len; ··· 4677 4683 * @WIPHY_FLAG_SUPPORTS_5_10_MHZ: Device supports 5 MHz and 10 MHz channels. 4678 4684 * @WIPHY_FLAG_HAS_CHANNEL_SWITCH: Device supports channel switch in 4679 4685 * beaconing mode (AP, IBSS, Mesh, ...). 4680 - * @WIPHY_FLAG_HAS_STATIC_WEP: The device supports static WEP key installation 4681 - * before connection. 4682 4686 * @WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK: The device supports bigger kek and kck keys 4683 4687 * @WIPHY_FLAG_SUPPORTS_MLO: This is a temporary flag gating the MLO APIs, 4684 4688 * in order to not have them reachable in normal drivers, until we have 4685 4689 * complete feature/interface combinations/etc. advertisement. No driver 4686 4690 * should set this flag for now. 4691 + * @WIPHY_FLAG_SUPPORTS_EXT_KCK_32: The device supports 32-byte KCK keys. 4687 4692 */ 4688 4693 enum wiphy_flags { 4689 4694 WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK = BIT(0), ··· 4695 4702 WIPHY_FLAG_CONTROL_PORT_PROTOCOL = BIT(7), 4696 4703 WIPHY_FLAG_IBSS_RSN = BIT(8), 4697 4704 WIPHY_FLAG_MESH_AUTH = BIT(10), 4698 - /* use hole at 11 */ 4705 + WIPHY_FLAG_SUPPORTS_EXT_KCK_32 = BIT(11), 4699 4706 /* use hole at 12 */ 4700 4707 WIPHY_FLAG_SUPPORTS_FW_ROAM = BIT(13), 4701 4708 WIPHY_FLAG_AP_UAPSD = BIT(14), ··· 4708 4715 WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL = BIT(21), 4709 4716 WIPHY_FLAG_SUPPORTS_5_10_MHZ = BIT(22), 4710 4717 WIPHY_FLAG_HAS_CHANNEL_SWITCH = BIT(23), 4711 - WIPHY_FLAG_HAS_STATIC_WEP = BIT(24), 4712 4718 }; 4713 4719 4714 4720 /** ··· 7775 7783 /** 7776 7784 * cfg80211_del_sta_sinfo - notify userspace about deletion of a station 7777 7785 * @dev: the netdev 7778 - * @mac_addr: the station's address 7786 + * @mac_addr: the station's address. For MLD station, MLD address is used. 7779 7787 * @sinfo: the station information/statistics 7780 7788 * @gfp: allocation flags 7781 7789 */ ··· 7786 7794 * cfg80211_del_sta - notify userspace about deletion of a station 7787 7795 * 7788 7796 * @dev: the netdev 7789 - * @mac_addr: the station's address 7797 + * @mac_addr: the station's address. For MLD station, MLD address is used. 7790 7798 * @gfp: allocation flags 7791 7799 */ 7792 7800 static inline void cfg80211_del_sta(struct net_device *dev,
+46 -27
include/net/mac80211.h
··· 653 653 * write-protected by sdata_lock and local->mtx so holding either is fine 654 654 * for read access. 655 655 * @color_change_color: the bss color that will be used after the change. 656 + * @vht_su_beamformer: in AP mode, does this BSS support operation as an VHT SU 657 + * beamformer 658 + * @vht_su_beamformee: in AP mode, does this BSS support operation as an VHT SU 659 + * beamformee 660 + * @vht_mu_beamformer: in AP mode, does this BSS support operation as an VHT MU 661 + * beamformer 662 + * @vht_mu_beamformee: in AP mode, does this BSS support operation as an VHT MU 663 + * beamformee 664 + * @he_su_beamformer: in AP-mode, does this BSS support operation as an HE SU 665 + * beamformer 666 + * @he_su_beamformee: in AP-mode, does this BSS support operation as an HE SU 667 + * beamformee 668 + * @he_mu_beamformer: in AP-mode, does this BSS support operation as an HE MU 669 + * beamformer 670 + * @he_full_ul_mumimo: does this BSS support the reception (AP) or transmission 671 + * (non-AP STA) of an HE TB PPDU on an RU that spans the entire PPDU 672 + * bandwidth 656 673 */ 657 674 struct ieee80211_bss_conf { 658 675 const u8 *bssid; ··· 743 726 744 727 bool color_change_active; 745 728 u8 color_change_color; 729 + 730 + bool vht_su_beamformer; 731 + bool vht_su_beamformee; 732 + bool vht_mu_beamformer; 733 + bool vht_mu_beamformee; 734 + bool he_su_beamformer; 735 + bool he_su_beamformee; 736 + bool he_mu_beamformer; 737 + bool he_full_ul_mumimo; 746 738 }; 747 739 748 740 /** ··· 1462 1436 RX_ENC_HT, 1463 1437 RX_ENC_VHT, 1464 1438 RX_ENC_HE, 1439 + RX_ENC_EHT, 1465 1440 }; 1466 1441 1467 1442 /** ··· 1496 1469 * @antenna: antenna used 1497 1470 * @rate_idx: index of data rate into band's supported rates or MCS index if 1498 1471 * HT or VHT is used (%RX_FLAG_HT/%RX_FLAG_VHT) 1499 - * @nss: number of streams (VHT and HE only) 1472 + * @nss: number of streams (VHT, HE and EHT only) 1500 1473 * @flag: %RX_FLAG_\* 1501 1474 * @encoding: &enum mac80211_rx_encoding 1502 1475 * @bw: &enum rate_info_bw ··· 1504 1477 * @he_ru: HE RU, from &enum nl80211_he_ru_alloc 1505 1478 * @he_gi: HE GI, from &enum nl80211_he_gi 1506 1479 * @he_dcm: HE DCM value 1480 + * @eht: EHT specific rate information 1481 + * @eht.ru: EHT RU, from &enum nl80211_eht_ru_alloc 1482 + * @eht.gi: EHT GI, from &enum nl80211_eht_gi 1507 1483 * @rx_flags: internal RX flags for mac80211 1508 1484 * @ampdu_reference: A-MPDU reference number, must be a different value for 1509 1485 * each A-MPDU but the same for each subframe within one A-MPDU ··· 1528 1498 u32 flag; 1529 1499 u16 freq: 13, freq_offset: 1; 1530 1500 u8 enc_flags; 1531 - u8 encoding:2, bw:3, he_ru:3; 1532 - u8 he_gi:2, he_dcm:1; 1501 + u8 encoding:3, bw:4; 1502 + union { 1503 + struct { 1504 + u8 he_ru:3; 1505 + u8 he_gi:2; 1506 + u8 he_dcm:1; 1507 + }; 1508 + struct { 1509 + u8 ru:4; 1510 + u8 gi:2; 1511 + } eht; 1512 + }; 1533 1513 u8 rate_idx; 1534 1514 u8 nss; 1535 1515 u8 rx_flags; ··· 5924 5884 * This function iterates over the interfaces associated with a given 5925 5885 * hardware that are currently active and calls the callback for them. 5926 5886 * This version can only be used while holding the wiphy mutex. 5927 - * The driver must not call this with a lock held that it can also take in 5928 - * response to callbacks from mac80211, and it must not call this within 5929 - * callbacks made by mac80211 - both would result in deadlocks. 5930 5887 * 5931 5888 * @hw: the hardware struct of which the interfaces should be iterated over 5932 5889 * @iter_flags: iteration flags, see &enum ieee80211_interface_iteration_flags ··· 5936 5899 u8 *mac, 5937 5900 struct ieee80211_vif *vif), 5938 5901 void *data); 5939 - 5940 - /** 5941 - * ieee80211_iterate_stations - iterate stations 5942 - * 5943 - * This function iterates over all stations associated with a given 5944 - * hardware that are currently uploaded to the driver and calls the callback 5945 - * function for them. 5946 - * This function allows the iterator function to sleep, when the iterator 5947 - * function is atomic @ieee80211_iterate_stations_atomic can be used. 5948 - * 5949 - * @hw: the hardware struct of which the interfaces should be iterated over 5950 - * @iterator: the iterator function to call, cannot sleep 5951 - * @data: first argument of the iterator function 5952 - */ 5953 - void ieee80211_iterate_stations(struct ieee80211_hw *hw, 5954 - void (*iterator)(void *data, 5955 - struct ieee80211_sta *sta), 5956 - void *data); 5957 5902 5958 5903 /** 5959 5904 * ieee80211_iterate_stations_atomic - iterate stations ··· 7210 7191 struct ieee80211_vif *vif); 7211 7192 7212 7193 /** 7213 - * ieeee80211_obss_color_collision_notify - notify userland about a BSS color 7194 + * ieee80211_obss_color_collision_notify - notify userland about a BSS color 7214 7195 * collision. 7215 7196 * 7216 7197 * @vif: &struct ieee80211_vif pointer from the add_interface callback. ··· 7219 7200 * @gfp: allocation flags 7220 7201 */ 7221 7202 void 7222 - ieeee80211_obss_color_collision_notify(struct ieee80211_vif *vif, 7223 - u64 color_bitmap, gfp_t gfp); 7203 + ieee80211_obss_color_collision_notify(struct ieee80211_vif *vif, 7204 + u64 color_bitmap, gfp_t gfp); 7224 7205 7225 7206 /** 7226 7207 * ieee80211_is_tx_data - check if frame is a data frame
+3 -1
include/uapi/linux/nl80211.h
··· 424 424 * interface identified by %NL80211_ATTR_IFINDEX. 425 425 * @NL80211_CMD_DEL_STATION: Remove a station identified by %NL80211_ATTR_MAC 426 426 * or, if no MAC address given, all stations, on the interface identified 427 - * by %NL80211_ATTR_IFINDEX. %NL80211_ATTR_MGMT_SUBTYPE and 427 + * by %NL80211_ATTR_IFINDEX. For MLD station, MLD address is used in 428 + * %NL80211_ATTR_MAC. %NL80211_ATTR_MGMT_SUBTYPE and 428 429 * %NL80211_ATTR_REASON_CODE can optionally be used to specify which type 429 430 * of disconnection indication should be sent to the station 430 431 * (Deauthentication or Disassociation frame and reason code for that ··· 5870 5869 #define NL80211_KEK_LEN 16 5871 5870 #define NL80211_KCK_EXT_LEN 24 5872 5871 #define NL80211_KEK_EXT_LEN 32 5872 + #define NL80211_KCK_EXT_LEN_32 32 5873 5873 #define NL80211_REPLAY_CTR_LEN 8 5874 5874 5875 5875 /**
+33 -3
net/mac80211/cfg.c
··· 1252 1252 prev_beacon_int = link_conf->beacon_int; 1253 1253 link_conf->beacon_int = params->beacon_interval; 1254 1254 1255 + if (params->vht_cap) { 1256 + link_conf->vht_su_beamformer = 1257 + params->vht_cap->vht_cap_info & 1258 + cpu_to_le32(IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE); 1259 + link_conf->vht_su_beamformee = 1260 + params->vht_cap->vht_cap_info & 1261 + cpu_to_le32(IEEE80211_VHT_CAP_SU_BEAMFORMEE_CAPABLE); 1262 + link_conf->vht_mu_beamformer = 1263 + params->vht_cap->vht_cap_info & 1264 + cpu_to_le32(IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE); 1265 + link_conf->vht_mu_beamformee = 1266 + params->vht_cap->vht_cap_info & 1267 + cpu_to_le32(IEEE80211_VHT_CAP_MU_BEAMFORMEE_CAPABLE); 1268 + } 1269 + 1255 1270 if (params->he_cap && params->he_oper) { 1256 1271 link_conf->he_support = true; 1257 1272 link_conf->htc_trig_based_pkt_ext = ··· 1279 1264 1280 1265 if (params->beacon.he_bss_color.enabled) 1281 1266 changed |= BSS_CHANGED_HE_BSS_COLOR; 1267 + } 1268 + 1269 + if (params->he_cap) { 1270 + link_conf->he_su_beamformer = 1271 + params->he_cap->phy_cap_info[3] & 1272 + IEEE80211_HE_PHY_CAP3_SU_BEAMFORMER; 1273 + link_conf->he_su_beamformee = 1274 + params->he_cap->phy_cap_info[4] & 1275 + IEEE80211_HE_PHY_CAP4_SU_BEAMFORMEE; 1276 + link_conf->he_mu_beamformer = 1277 + params->he_cap->phy_cap_info[4] & 1278 + IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER; 1279 + link_conf->he_full_ul_mumimo = 1280 + params->he_cap->phy_cap_info[2] & 1281 + IEEE80211_HE_PHY_CAP2_UL_MU_FULL_MU_MIMO; 1282 1282 } 1283 1283 1284 1284 if (sdata->vif.type == NL80211_IFTYPE_AP && ··· 2764 2734 * If the scan has been forced (and the driver supports 2765 2735 * forcing), don't care about being beaconing already. 2766 2736 * This will create problems to the attached stations (e.g. all 2767 - * the frames sent while scanning on other channel will be 2737 + * the frames sent while scanning on other channel will be 2768 2738 * lost) 2769 2739 */ 2770 2740 if (sdata->deflink.u.ap.beacon && ··· 4662 4632 EXPORT_SYMBOL_GPL(ieee80211_color_change_finish); 4663 4633 4664 4634 void 4665 - ieeee80211_obss_color_collision_notify(struct ieee80211_vif *vif, 4635 + ieee80211_obss_color_collision_notify(struct ieee80211_vif *vif, 4666 4636 u64 color_bitmap, gfp_t gfp) 4667 4637 { 4668 4638 struct ieee80211_sub_if_data *sdata = vif_to_sdata(vif); ··· 4672 4642 4673 4643 cfg80211_obss_color_collision_notify(sdata->dev, color_bitmap, gfp); 4674 4644 } 4675 - EXPORT_SYMBOL_GPL(ieeee80211_obss_color_collision_notify); 4645 + EXPORT_SYMBOL_GPL(ieee80211_obss_color_collision_notify); 4676 4646 4677 4647 static int 4678 4648 ieee80211_color_change(struct wiphy *wiphy, struct net_device *dev,
+12 -3
net/mac80211/rx.c
··· 3219 3219 color = le32_get_bits(he_oper->he_oper_params, 3220 3220 IEEE80211_HE_OPERATION_BSS_COLOR_MASK); 3221 3221 if (color == bss_conf->he_bss_color.color) 3222 - ieeee80211_obss_color_collision_notify(&rx->sdata->vif, 3223 - BIT_ULL(color), 3224 - GFP_ATOMIC); 3222 + ieee80211_obss_color_collision_notify(&rx->sdata->vif, 3223 + BIT_ULL(color), 3224 + GFP_ATOMIC); 3225 3225 } 3226 3226 } 3227 3227 ··· 5192 5192 status->nss > 8, 5193 5193 "Rate marked as an HE rate but data is invalid: MCS: %d, NSS: %d\n", 5194 5194 status->rate_idx, status->nss)) 5195 + goto drop; 5196 + break; 5197 + case RX_ENC_EHT: 5198 + if (WARN_ONCE(status->rate_idx > 15 || 5199 + !status->nss || 5200 + status->nss > 8 || 5201 + status->eht.gi > NL80211_RATE_INFO_EHT_GI_3_2, 5202 + "Rate marked as an EHT rate but data is invalid: MCS:%d, NSS:%d, GI:%d\n", 5203 + status->rate_idx, status->nss, status->eht.gi)) 5195 5204 goto drop; 5196 5205 break; 5197 5206 default:
+8 -1
net/mac80211/sta_info.c
··· 4 4 * Copyright 2006-2007 Jiri Benc <jbenc@suse.cz> 5 5 * Copyright 2013-2014 Intel Mobile Communications GmbH 6 6 * Copyright (C) 2015 - 2017 Intel Deutschland GmbH 7 - * Copyright (C) 2018-2021 Intel Corporation 7 + * Copyright (C) 2018-2022 Intel Corporation 8 8 */ 9 9 10 10 #include <linux/module.h> ··· 2405 2405 rinfo->he_gi = STA_STATS_GET(HE_GI, rate); 2406 2406 rinfo->he_ru_alloc = STA_STATS_GET(HE_RU, rate); 2407 2407 rinfo->he_dcm = STA_STATS_GET(HE_DCM, rate); 2408 + break; 2409 + case STA_STATS_RATE_TYPE_EHT: 2410 + rinfo->flags = RATE_INFO_FLAGS_EHT_MCS; 2411 + rinfo->mcs = STA_STATS_GET(EHT_MCS, rate); 2412 + rinfo->nss = STA_STATS_GET(EHT_NSS, rate); 2413 + rinfo->eht_gi = STA_STATS_GET(EHT_GI, rate); 2414 + rinfo->eht_ru_alloc = STA_STATS_GET(EHT_RU, rate); 2408 2415 break; 2409 2416 } 2410 2417 }
+18 -6
net/mac80211/sta_info.h
··· 936 936 STA_STATS_RATE_TYPE_VHT, 937 937 STA_STATS_RATE_TYPE_HE, 938 938 STA_STATS_RATE_TYPE_S1G, 939 + STA_STATS_RATE_TYPE_EHT, 939 940 }; 940 941 941 942 #define STA_STATS_FIELD_HT_MCS GENMASK( 7, 0) ··· 946 945 #define STA_STATS_FIELD_VHT_NSS GENMASK( 7, 4) 947 946 #define STA_STATS_FIELD_HE_MCS GENMASK( 3, 0) 948 947 #define STA_STATS_FIELD_HE_NSS GENMASK( 7, 4) 949 - #define STA_STATS_FIELD_BW GENMASK(11, 8) 950 - #define STA_STATS_FIELD_SGI GENMASK(12, 12) 951 - #define STA_STATS_FIELD_TYPE GENMASK(15, 13) 952 - #define STA_STATS_FIELD_HE_RU GENMASK(18, 16) 953 - #define STA_STATS_FIELD_HE_GI GENMASK(20, 19) 954 - #define STA_STATS_FIELD_HE_DCM GENMASK(21, 21) 948 + #define STA_STATS_FIELD_EHT_MCS GENMASK( 3, 0) 949 + #define STA_STATS_FIELD_EHT_NSS GENMASK( 7, 4) 950 + #define STA_STATS_FIELD_BW GENMASK(12, 8) 951 + #define STA_STATS_FIELD_SGI GENMASK(13, 13) 952 + #define STA_STATS_FIELD_TYPE GENMASK(16, 14) 953 + #define STA_STATS_FIELD_HE_RU GENMASK(19, 17) 954 + #define STA_STATS_FIELD_HE_GI GENMASK(21, 20) 955 + #define STA_STATS_FIELD_HE_DCM GENMASK(22, 22) 956 + #define STA_STATS_FIELD_EHT_RU GENMASK(20, 17) 957 + #define STA_STATS_FIELD_EHT_GI GENMASK(22, 21) 955 958 956 959 #define STA_STATS_FIELD(_n, _v) FIELD_PREP(STA_STATS_FIELD_ ## _n, _v) 957 960 #define STA_STATS_GET(_n, _v) FIELD_GET(STA_STATS_FIELD_ ## _n, _v) ··· 993 988 r |= STA_STATS_FIELD(HE_GI, s->he_gi); 994 989 r |= STA_STATS_FIELD(HE_RU, s->he_ru); 995 990 r |= STA_STATS_FIELD(HE_DCM, s->he_dcm); 991 + break; 992 + case RX_ENC_EHT: 993 + r |= STA_STATS_FIELD(TYPE, STA_STATS_RATE_TYPE_EHT); 994 + r |= STA_STATS_FIELD(EHT_NSS, s->nss); 995 + r |= STA_STATS_FIELD(EHT_MCS, s->rate_idx); 996 + r |= STA_STATS_FIELD(EHT_GI, s->eht.gi); 997 + r |= STA_STATS_FIELD(EHT_RU, s->eht.ru); 996 998 break; 997 999 default: 998 1000 WARN_ON(1);
+13 -13
net/mac80211/util.c
··· 832 832 } 833 833 } 834 834 835 - void ieee80211_iterate_stations(struct ieee80211_hw *hw, 836 - void (*iterator)(void *data, 837 - struct ieee80211_sta *sta), 838 - void *data) 839 - { 840 - struct ieee80211_local *local = hw_to_local(hw); 841 - 842 - mutex_lock(&local->sta_mtx); 843 - __iterate_stations(local, iterator, data); 844 - mutex_unlock(&local->sta_mtx); 845 - } 846 - EXPORT_SYMBOL_GPL(ieee80211_iterate_stations); 847 - 848 835 void ieee80211_iterate_stations_atomic(struct ieee80211_hw *hw, 849 836 void (*iterator)(void *data, 850 837 struct ieee80211_sta *sta), ··· 4020 4033 4021 4034 /* Fill cfg80211 rate info */ 4022 4035 switch (status->encoding) { 4036 + case RX_ENC_EHT: 4037 + ri.flags |= RATE_INFO_FLAGS_EHT_MCS; 4038 + ri.mcs = status->rate_idx; 4039 + ri.nss = status->nss; 4040 + ri.eht_ru_alloc = status->eht.ru; 4041 + if (status->enc_flags & RX_ENC_FLAG_SHORT_GI) 4042 + ri.flags |= RATE_INFO_FLAGS_SHORT_GI; 4043 + /* TODO/FIXME: is this right? handle other PPDUs */ 4044 + if (status->flag & RX_FLAG_MACTIME_PLCP_START) { 4045 + mpdu_offset += 2; 4046 + ts += 36; 4047 + } 4048 + break; 4023 4049 case RX_ENC_HE: 4024 4050 ri.flags |= RATE_INFO_FLAGS_HE_MCS; 4025 4051 ri.mcs = status->rate_idx;
+18 -2
net/rfkill/rfkill-gpio.c
··· 75 75 { 76 76 struct rfkill_gpio_data *rfkill; 77 77 struct gpio_desc *gpio; 78 + const char *name_property; 79 + const char *type_property; 78 80 const char *type_name; 79 81 int ret; 80 82 ··· 84 82 if (!rfkill) 85 83 return -ENOMEM; 86 84 87 - device_property_read_string(&pdev->dev, "name", &rfkill->name); 88 - device_property_read_string(&pdev->dev, "type", &type_name); 85 + if (dev_of_node(&pdev->dev)) { 86 + name_property = "label"; 87 + type_property = "radio-type"; 88 + } else { 89 + name_property = "name"; 90 + type_property = "type"; 91 + } 92 + device_property_read_string(&pdev->dev, name_property, &rfkill->name); 93 + device_property_read_string(&pdev->dev, type_property, &type_name); 89 94 90 95 if (!rfkill->name) 91 96 rfkill->name = dev_name(&pdev->dev); ··· 166 157 MODULE_DEVICE_TABLE(acpi, rfkill_acpi_match); 167 158 #endif 168 159 160 + static const struct of_device_id rfkill_of_match[] __maybe_unused = { 161 + { .compatible = "rfkill-gpio", }, 162 + { }, 163 + }; 164 + MODULE_DEVICE_TABLE(of, rfkill_of_match); 165 + 169 166 static struct platform_driver rfkill_gpio_driver = { 170 167 .probe = rfkill_gpio_probe, 171 168 .remove = rfkill_gpio_remove, 172 169 .driver = { 173 170 .name = "rfkill_gpio", 174 171 .acpi_match_table = ACPI_PTR(rfkill_acpi_match), 172 + .of_match_table = of_match_ptr(rfkill_of_match), 175 173 }, 176 174 }; 177 175
+2 -2
net/wireless/core.h
··· 278 278 }; 279 279 280 280 struct cfg80211_cached_keys { 281 - struct key_params params[CFG80211_MAX_WEP_KEYS]; 282 - u8 data[CFG80211_MAX_WEP_KEYS][WLAN_KEY_LEN_WEP104]; 281 + struct key_params params[4]; 282 + u8 data[4][WLAN_KEY_LEN_WEP104]; 283 283 int def; 284 284 }; 285 285
+2 -3
net/wireless/ibss.c
··· 45 45 cfg80211_hold_bss(bss_from_pub(bss)); 46 46 wdev->u.ibss.current_bss = bss_from_pub(bss); 47 47 48 - if (!(wdev->wiphy->flags & WIPHY_FLAG_HAS_STATIC_WEP)) 49 - cfg80211_upload_connect_keys(wdev); 48 + cfg80211_upload_connect_keys(wdev); 50 49 51 50 nl80211_send_ibss_bssid(wiphy_to_rdev(wdev->wiphy), dev, bssid, 52 51 GFP_KERNEL); ··· 293 294 ck = kmemdup(wdev->wext.keys, sizeof(*ck), GFP_KERNEL); 294 295 if (!ck) 295 296 return -ENOMEM; 296 - for (i = 0; i < CFG80211_MAX_WEP_KEYS; i++) 297 + for (i = 0; i < 4; i++) 297 298 ck->params[i].key = ck->data[i]; 298 299 } 299 300 err = __cfg80211_join_ibss(rdev, wdev->netdev,
+4 -2
net/wireless/nl80211.c
··· 883 883 }, 884 884 [NL80211_REKEY_DATA_KCK] = { 885 885 .type = NLA_BINARY, 886 - .len = NL80211_KCK_EXT_LEN 886 + .len = NL80211_KCK_EXT_LEN_32 887 887 }, 888 888 [NL80211_REKEY_DATA_REPLAY_CTR] = NLA_POLICY_EXACT_LEN(NL80211_REPLAY_CTR_LEN), 889 889 [NL80211_REKEY_DATA_AKM] = { .type = NLA_U32 }, ··· 13809 13809 return -ERANGE; 13810 13810 if (nla_len(tb[NL80211_REKEY_DATA_KCK]) != NL80211_KCK_LEN && 13811 13811 !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KEK_KCK && 13812 - nla_len(tb[NL80211_REKEY_DATA_KEK]) == NL80211_KCK_EXT_LEN)) 13812 + nla_len(tb[NL80211_REKEY_DATA_KCK]) == NL80211_KCK_EXT_LEN) && 13813 + !(rdev->wiphy.flags & WIPHY_FLAG_SUPPORTS_EXT_KCK_32 && 13814 + nla_len(tb[NL80211_REKEY_DATA_KCK]) == NL80211_KCK_EXT_LEN_32)) 13813 13815 return -ERANGE; 13814 13816 13815 13817 rekey_data.kek = nla_data(tb[NL80211_REKEY_DATA_KEK]);
+8 -46
net/wireless/reg.c
··· 737 737 } 738 738 739 739 #ifdef CONFIG_CFG80211_REQUIRE_SIGNED_REGDB 740 + #include <keys/asymmetric-type.h> 741 + 740 742 static struct key *builtin_regdb_keys; 741 - 742 - static void __init load_keys_from_buffer(const u8 *p, unsigned int buflen) 743 - { 744 - const u8 *end = p + buflen; 745 - size_t plen; 746 - key_ref_t key; 747 - 748 - while (p < end) { 749 - /* Each cert begins with an ASN.1 SEQUENCE tag and must be more 750 - * than 256 bytes in size. 751 - */ 752 - if (end - p < 4) 753 - goto dodgy_cert; 754 - if (p[0] != 0x30 && 755 - p[1] != 0x82) 756 - goto dodgy_cert; 757 - plen = (p[2] << 8) | p[3]; 758 - plen += 4; 759 - if (plen > end - p) 760 - goto dodgy_cert; 761 - 762 - key = key_create_or_update(make_key_ref(builtin_regdb_keys, 1), 763 - "asymmetric", NULL, p, plen, 764 - ((KEY_POS_ALL & ~KEY_POS_SETATTR) | 765 - KEY_USR_VIEW | KEY_USR_READ), 766 - KEY_ALLOC_NOT_IN_QUOTA | 767 - KEY_ALLOC_BUILT_IN | 768 - KEY_ALLOC_BYPASS_RESTRICTION); 769 - if (IS_ERR(key)) { 770 - pr_err("Problem loading in-kernel X.509 certificate (%ld)\n", 771 - PTR_ERR(key)); 772 - } else { 773 - pr_notice("Loaded X.509 cert '%s'\n", 774 - key_ref_to_ptr(key)->description); 775 - key_ref_put(key); 776 - } 777 - p += plen; 778 - } 779 - 780 - return; 781 - 782 - dodgy_cert: 783 - pr_err("Problem parsing in-kernel X.509 certificate list\n"); 784 - } 785 743 786 744 static int __init load_builtin_regdb_keys(void) 787 745 { ··· 755 797 pr_notice("Loading compiled-in X.509 certificates for regulatory database\n"); 756 798 757 799 #ifdef CONFIG_CFG80211_USE_KERNEL_REGDB_KEYS 758 - load_keys_from_buffer(shipped_regdb_certs, shipped_regdb_certs_len); 800 + x509_load_certificate_list(shipped_regdb_certs, 801 + shipped_regdb_certs_len, 802 + builtin_regdb_keys); 759 803 #endif 760 804 #ifdef CONFIG_CFG80211_EXTRA_REGDB_KEYDIR 761 805 if (CONFIG_CFG80211_EXTRA_REGDB_KEYDIR[0] != '\0') 762 - load_keys_from_buffer(extra_regdb_certs, extra_regdb_certs_len); 806 + x509_load_certificate_list(extra_regdb_certs, 807 + extra_regdb_certs_len, 808 + builtin_regdb_keys); 763 809 #endif 764 810 765 811 return 0;
+1 -5
net/wireless/sme.c
··· 855 855 ETH_ALEN); 856 856 } 857 857 858 - if (!(wdev->wiphy->flags & WIPHY_FLAG_HAS_STATIC_WEP)) 859 - cfg80211_upload_connect_keys(wdev); 858 + cfg80211_upload_connect_keys(wdev); 860 859 861 860 rcu_read_lock(); 862 861 for_each_valid_link(cr, link) { ··· 1461 1462 connect->crypto.ciphers_pairwise[0] = cipher; 1462 1463 } 1463 1464 } 1464 - 1465 - connect->crypto.wep_keys = connkeys->params; 1466 - connect->crypto.wep_tx_key = connkeys->def; 1467 1465 } else { 1468 1466 if (WARN_ON(connkeys)) 1469 1467 return -EINVAL;
+1 -1
net/wireless/util.c
··· 934 934 if (!wdev->connect_keys) 935 935 return; 936 936 937 - for (i = 0; i < CFG80211_MAX_WEP_KEYS; i++) { 937 + for (i = 0; i < 4; i++) { 938 938 if (!wdev->connect_keys->params[i].cipher) 939 939 continue; 940 940 if (rdev_add_key(rdev, dev, -1, i, false, NULL,
+1 -1
net/wireless/wext-compat.c
··· 439 439 GFP_KERNEL); 440 440 if (!wdev->wext.keys) 441 441 return -ENOMEM; 442 - for (i = 0; i < CFG80211_MAX_WEP_KEYS; i++) 442 + for (i = 0; i < 4; i++) 443 443 wdev->wext.keys->params[i].key = 444 444 wdev->wext.keys->data[i]; 445 445 }
+18 -2
net/wireless/wext-core.c
··· 636 636 } 637 637 EXPORT_SYMBOL(wireless_send_event); 638 638 639 + #ifdef CONFIG_CFG80211_WEXT 640 + static void wireless_warn_cfg80211_wext(void) 641 + { 642 + char name[sizeof(current->comm)]; 639 643 644 + pr_warn_ratelimited("warning: `%s' uses wireless extensions that are deprecated for modern drivers; use nl80211\n", 645 + get_task_comm(name, current)); 646 + } 647 + #endif 640 648 641 649 /* IW handlers */ 642 650 ··· 660 652 if (dev->ieee80211_ptr && 661 653 dev->ieee80211_ptr->wiphy && 662 654 dev->ieee80211_ptr->wiphy->wext && 663 - dev->ieee80211_ptr->wiphy->wext->get_wireless_stats) 655 + dev->ieee80211_ptr->wiphy->wext->get_wireless_stats) { 656 + wireless_warn_cfg80211_wext(); 657 + if (dev->ieee80211_ptr->wiphy->flags & WIPHY_FLAG_SUPPORTS_MLO) 658 + return NULL; 664 659 return dev->ieee80211_ptr->wiphy->wext->get_wireless_stats(dev); 660 + } 665 661 #endif 666 662 667 663 /* not found */ ··· 702 690 const struct iw_handler_def *handlers = NULL; 703 691 704 692 #ifdef CONFIG_CFG80211_WEXT 705 - if (dev->ieee80211_ptr && dev->ieee80211_ptr->wiphy) 693 + if (dev->ieee80211_ptr && dev->ieee80211_ptr->wiphy) { 694 + wireless_warn_cfg80211_wext(); 695 + if (dev->ieee80211_ptr->wiphy->flags & WIPHY_FLAG_SUPPORTS_MLO) 696 + return NULL; 706 697 handlers = dev->ieee80211_ptr->wiphy->wext; 698 + } 707 699 #endif 708 700 #ifdef CONFIG_WIRELESS_EXT 709 701 if (dev->wireless_handlers)
+1 -1
net/wireless/wext-sme.c
··· 47 47 ck = kmemdup(wdev->wext.keys, sizeof(*ck), GFP_KERNEL); 48 48 if (!ck) 49 49 return -ENOMEM; 50 - for (i = 0; i < CFG80211_MAX_WEP_KEYS; i++) 50 + for (i = 0; i < 4; i++) 51 51 ck->params[i].key = ck->data[i]; 52 52 } 53 53