rtw88: update Realtek's rtw88 driver
This version is based on git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git e5f0a698b34ed76002dc5cff3804a61c80233a7a ( tag: v6.17 ).
This commit is contained in:
@@ -1501,28 +1501,28 @@ static u8 rtw_coex_algorithm(struct rtw_dev *rtwdev)
|
||||
algorithm = COEX_ALGO_HFP;
|
||||
break;
|
||||
case BPM_HID:
|
||||
case BPM_HFP + BPM_HID:
|
||||
case BPM_HFP | BPM_HID:
|
||||
algorithm = COEX_ALGO_HID;
|
||||
break;
|
||||
case BPM_HFP + BPM_A2DP:
|
||||
case BPM_HID + BPM_A2DP:
|
||||
case BPM_HFP + BPM_HID + BPM_A2DP:
|
||||
case BPM_HFP | BPM_A2DP:
|
||||
case BPM_HID | BPM_A2DP:
|
||||
case BPM_HFP | BPM_HID | BPM_A2DP:
|
||||
algorithm = COEX_ALGO_A2DP_HID;
|
||||
break;
|
||||
case BPM_HFP + BPM_PAN:
|
||||
case BPM_HID + BPM_PAN:
|
||||
case BPM_HFP + BPM_HID + BPM_PAN:
|
||||
case BPM_HFP | BPM_PAN:
|
||||
case BPM_HID | BPM_PAN:
|
||||
case BPM_HFP | BPM_HID | BPM_PAN:
|
||||
algorithm = COEX_ALGO_PAN_HID;
|
||||
break;
|
||||
case BPM_HFP + BPM_A2DP + BPM_PAN:
|
||||
case BPM_HID + BPM_A2DP + BPM_PAN:
|
||||
case BPM_HFP + BPM_HID + BPM_A2DP + BPM_PAN:
|
||||
case BPM_HFP | BPM_A2DP | BPM_PAN:
|
||||
case BPM_HID | BPM_A2DP | BPM_PAN:
|
||||
case BPM_HFP | BPM_HID | BPM_A2DP | BPM_PAN:
|
||||
algorithm = COEX_ALGO_A2DP_PAN_HID;
|
||||
break;
|
||||
case BPM_PAN:
|
||||
algorithm = COEX_ALGO_PAN;
|
||||
break;
|
||||
case BPM_A2DP + BPM_PAN:
|
||||
case BPM_A2DP | BPM_PAN:
|
||||
algorithm = COEX_ALGO_A2DP_PAN;
|
||||
break;
|
||||
case BPM_A2DP:
|
||||
|
||||
@@ -521,7 +521,7 @@ rtw_fw_send_general_info(struct rtw_dev *rtwdev)
|
||||
u8 h2c_pkt[H2C_PKT_SIZE] = {0};
|
||||
u16 total_size = H2C_PKT_HDR_SIZE + 4;
|
||||
|
||||
if (rtw_chip_wcpu_11n(rtwdev))
|
||||
if (rtw_chip_wcpu_8051(rtwdev))
|
||||
return;
|
||||
|
||||
rtw_h2c_pkt_set_header(h2c_pkt, H2C_PKT_GENERAL_INFO);
|
||||
@@ -544,7 +544,7 @@ rtw_fw_send_phydm_info(struct rtw_dev *rtwdev)
|
||||
u16 total_size = H2C_PKT_HDR_SIZE + 8;
|
||||
u8 fw_rf_type = 0;
|
||||
|
||||
if (rtw_chip_wcpu_11n(rtwdev))
|
||||
if (rtw_chip_wcpu_8051(rtwdev))
|
||||
return;
|
||||
|
||||
if (hal->rf_type == RF_1T1R)
|
||||
@@ -1480,7 +1480,7 @@ int rtw_fw_write_data_rsvd_page(struct rtw_dev *rtwdev, u16 pg_addr,
|
||||
|
||||
bckp[2] = rtw_read8(rtwdev, REG_BCN_CTRL);
|
||||
|
||||
if (rtw_chip_wcpu_11n(rtwdev)) {
|
||||
if (rtw_chip_wcpu_8051(rtwdev)) {
|
||||
rtw_write32_set(rtwdev, REG_DWBCN0_CTRL, BIT_BCN_VALID);
|
||||
} else {
|
||||
pg_addr &= BIT_MASK_BCN_HEAD_1_V1;
|
||||
@@ -1509,7 +1509,7 @@ int rtw_fw_write_data_rsvd_page(struct rtw_dev *rtwdev, u16 pg_addr,
|
||||
goto restore;
|
||||
}
|
||||
|
||||
if (rtw_chip_wcpu_11n(rtwdev)) {
|
||||
if (rtw_chip_wcpu_8051(rtwdev)) {
|
||||
bcn_valid_addr = REG_DWBCN0_CTRL;
|
||||
bcn_valid_mask = BIT_BCN_VALID;
|
||||
} else {
|
||||
|
||||
@@ -41,7 +41,7 @@ void rtw_set_channel_mac(struct rtw_dev *rtwdev, u8 channel, u8 bw,
|
||||
}
|
||||
rtw_write32(rtwdev, REG_WMAC_TRXPTCL_CTL, value32);
|
||||
|
||||
if (rtw_chip_wcpu_11n(rtwdev))
|
||||
if (rtw_chip_wcpu_8051(rtwdev))
|
||||
return;
|
||||
|
||||
value32 = rtw_read32(rtwdev, REG_AFE_CTRL1) & ~(BIT_MAC_CLK_SEL);
|
||||
@@ -67,7 +67,7 @@ static int rtw_mac_pre_system_cfg(struct rtw_dev *rtwdev)
|
||||
|
||||
rtw_write8(rtwdev, REG_RSV_CTRL, 0);
|
||||
|
||||
if (rtw_chip_wcpu_11n(rtwdev)) {
|
||||
if (rtw_chip_wcpu_8051(rtwdev)) {
|
||||
if (rtw_read32(rtwdev, REG_SYS_CFG1) & BIT_LDO)
|
||||
rtw_write8(rtwdev, REG_LDO_SWR_CTRL, LDO_SEL);
|
||||
else
|
||||
@@ -278,7 +278,7 @@ static int rtw_mac_power_switch(struct rtw_dev *rtwdev, bool pwr_on)
|
||||
bool cur_pwr;
|
||||
int ret;
|
||||
|
||||
if (rtw_chip_wcpu_11ac(rtwdev)) {
|
||||
if (rtw_chip_wcpu_3081(rtwdev)) {
|
||||
rpwm = rtw_read8(rtwdev, rtwdev->hci.rpwm_addr);
|
||||
|
||||
/* Check FW still exist or not */
|
||||
@@ -369,7 +369,7 @@ static int __rtw_mac_init_system_cfg_legacy(struct rtw_dev *rtwdev)
|
||||
|
||||
static int rtw_mac_init_system_cfg(struct rtw_dev *rtwdev)
|
||||
{
|
||||
if (rtw_chip_wcpu_11n(rtwdev))
|
||||
if (rtw_chip_wcpu_8051(rtwdev))
|
||||
return __rtw_mac_init_system_cfg_legacy(rtwdev);
|
||||
|
||||
return __rtw_mac_init_system_cfg(rtwdev);
|
||||
@@ -981,7 +981,7 @@ static int __rtw_download_firmware_legacy(struct rtw_dev *rtwdev,
|
||||
static
|
||||
int _rtw_download_firmware(struct rtw_dev *rtwdev, struct rtw_fw_state *fw)
|
||||
{
|
||||
if (rtw_chip_wcpu_11n(rtwdev))
|
||||
if (rtw_chip_wcpu_8051(rtwdev))
|
||||
return __rtw_download_firmware_legacy(rtwdev, fw);
|
||||
|
||||
return __rtw_download_firmware(rtwdev, fw);
|
||||
@@ -1122,7 +1122,7 @@ static int txdma_queue_mapping(struct rtw_dev *rtwdev)
|
||||
|
||||
rtw_write8(rtwdev, REG_CR, 0);
|
||||
rtw_write8(rtwdev, REG_CR, MAC_TRX_ENABLE);
|
||||
if (rtw_chip_wcpu_11ac(rtwdev))
|
||||
if (rtw_chip_wcpu_3081(rtwdev))
|
||||
rtw_write32(rtwdev, REG_H2CQ_CSR, BIT_H2CQ_FULL);
|
||||
|
||||
if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_SDIO) {
|
||||
@@ -1145,7 +1145,7 @@ int rtw_set_trx_fifo_info(struct rtw_dev *rtwdev)
|
||||
/* config rsvd page num */
|
||||
fifo->rsvd_drv_pg_num = chip->rsvd_drv_pg_num;
|
||||
fifo->txff_pg_num = chip->txff_size / chip->page_size;
|
||||
if (rtw_chip_wcpu_11n(rtwdev))
|
||||
if (rtw_chip_wcpu_8051(rtwdev))
|
||||
fifo->rsvd_pg_num = fifo->rsvd_drv_pg_num;
|
||||
else
|
||||
fifo->rsvd_pg_num = fifo->rsvd_drv_pg_num +
|
||||
@@ -1163,7 +1163,7 @@ int rtw_set_trx_fifo_info(struct rtw_dev *rtwdev)
|
||||
fifo->rsvd_boundary = fifo->txff_pg_num - fifo->rsvd_pg_num;
|
||||
|
||||
cur_pg_addr = fifo->txff_pg_num;
|
||||
if (rtw_chip_wcpu_11ac(rtwdev)) {
|
||||
if (rtw_chip_wcpu_3081(rtwdev)) {
|
||||
cur_pg_addr -= csi_buf_pg_num;
|
||||
fifo->rsvd_csibuf_addr = cur_pg_addr;
|
||||
cur_pg_addr -= RSVD_PG_FW_TXBUF_NUM;
|
||||
@@ -1292,7 +1292,7 @@ static int priority_queue_cfg(struct rtw_dev *rtwdev)
|
||||
|
||||
pubq_num = fifo->acq_pg_num - pg_tbl->hq_num - pg_tbl->lq_num -
|
||||
pg_tbl->nq_num - pg_tbl->exq_num - pg_tbl->gapq_num;
|
||||
if (rtw_chip_wcpu_11n(rtwdev))
|
||||
if (rtw_chip_wcpu_8051(rtwdev))
|
||||
return __priority_queue_cfg_legacy(rtwdev, pg_tbl, pubq_num);
|
||||
else
|
||||
return __priority_queue_cfg(rtwdev, pg_tbl, pubq_num);
|
||||
@@ -1308,7 +1308,7 @@ static int init_h2c(struct rtw_dev *rtwdev)
|
||||
u32 h2cq_free;
|
||||
u32 wp, rp;
|
||||
|
||||
if (rtw_chip_wcpu_11n(rtwdev))
|
||||
if (rtw_chip_wcpu_8051(rtwdev))
|
||||
return 0;
|
||||
|
||||
h2cq_addr = fifo->rsvd_h2cq_addr << TX_PAGE_SIZE_SHIFT;
|
||||
@@ -1375,7 +1375,7 @@ static int rtw_drv_info_cfg(struct rtw_dev *rtwdev)
|
||||
u8 value8;
|
||||
|
||||
rtw_write8(rtwdev, REG_RX_DRVINFO_SZ, PHY_STATUS_SIZE);
|
||||
if (rtw_chip_wcpu_11ac(rtwdev)) {
|
||||
if (rtw_chip_wcpu_3081(rtwdev)) {
|
||||
value8 = rtw_read8(rtwdev, REG_TRXFF_BNDY + 1);
|
||||
value8 &= 0xF0;
|
||||
/* For rxdesc len = 0 issue */
|
||||
@@ -1409,3 +1409,13 @@ int rtw_mac_init(struct rtw_dev *rtwdev)
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int rtw_mac_postinit(struct rtw_dev *rtwdev)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
|
||||
if (!chip->ops->mac_postinit)
|
||||
return 0;
|
||||
|
||||
return chip->ops->mac_postinit(rtwdev);
|
||||
}
|
||||
|
||||
@@ -38,6 +38,7 @@ void rtw_write_firmware_page(struct rtw_dev *rtwdev, u32 page,
|
||||
const u8 *data, u32 size);
|
||||
int rtw_download_firmware(struct rtw_dev *rtwdev, struct rtw_fw_state *fw);
|
||||
int rtw_mac_init(struct rtw_dev *rtwdev);
|
||||
int rtw_mac_postinit(struct rtw_dev *rtwdev);
|
||||
void rtw_mac_flush_queues(struct rtw_dev *rtwdev, u32 queues, bool drop);
|
||||
int rtw_set_trx_fifo_info(struct rtw_dev *rtwdev);
|
||||
int rtw_ddma_to_fw_fifo(struct rtw_dev *rtwdev, u32 ocp_src, u32 size);
|
||||
|
||||
+6
-3
@@ -71,7 +71,7 @@ static void rtw_ops_stop(struct ieee80211_hw *hw, bool suspend)
|
||||
mutex_unlock(&rtwdev->mutex);
|
||||
}
|
||||
|
||||
static int rtw_ops_config(struct ieee80211_hw *hw, u32 changed)
|
||||
static int rtw_ops_config(struct ieee80211_hw *hw, int radio_idx, u32 changed)
|
||||
{
|
||||
struct rtw_dev *rtwdev = hw->priv;
|
||||
int ret = 0;
|
||||
@@ -708,7 +708,8 @@ static void rtw_ops_mgd_prepare_tx(struct ieee80211_hw *hw,
|
||||
mutex_unlock(&rtwdev->mutex);
|
||||
}
|
||||
|
||||
static int rtw_ops_set_rts_threshold(struct ieee80211_hw *hw, u32 value)
|
||||
static int rtw_ops_set_rts_threshold(struct ieee80211_hw *hw, int radio_idx,
|
||||
u32 value)
|
||||
{
|
||||
struct rtw_dev *rtwdev = hw->priv;
|
||||
|
||||
@@ -797,6 +798,7 @@ static int rtw_ops_set_bitrate_mask(struct ieee80211_hw *hw,
|
||||
}
|
||||
|
||||
static int rtw_ops_set_antenna(struct ieee80211_hw *hw,
|
||||
int radio_idx,
|
||||
u32 tx_antenna,
|
||||
u32 rx_antenna)
|
||||
{
|
||||
@@ -808,13 +810,14 @@ static int rtw_ops_set_antenna(struct ieee80211_hw *hw,
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
mutex_lock(&rtwdev->mutex);
|
||||
ret = chip->ops->set_antenna(rtwdev, tx_antenna, rx_antenna);
|
||||
ret = chip->ops->set_antenna(rtwdev, -1, tx_antenna, rx_antenna);
|
||||
mutex_unlock(&rtwdev->mutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int rtw_ops_get_antenna(struct ieee80211_hw *hw,
|
||||
int radio_idx,
|
||||
u32 *tx_antenna,
|
||||
u32 *rx_antenna)
|
||||
{
|
||||
|
||||
@@ -349,7 +349,7 @@ int rtw_sta_add(struct rtw_dev *rtwdev, struct ieee80211_sta *sta,
|
||||
struct rtw_vif *rtwvif = (struct rtw_vif *)vif->drv_priv;
|
||||
int i;
|
||||
|
||||
if (vif->type == NL80211_IFTYPE_STATION) {
|
||||
if (vif->type == NL80211_IFTYPE_STATION && !sta->tdls) {
|
||||
si->mac_id = rtwvif->mac_id;
|
||||
} else {
|
||||
si->mac_id = rtw_acquire_macid(rtwdev);
|
||||
@@ -386,7 +386,7 @@ void rtw_sta_remove(struct rtw_dev *rtwdev, struct ieee80211_sta *sta,
|
||||
|
||||
cancel_work_sync(&si->rc_work);
|
||||
|
||||
if (vif->type != NL80211_IFTYPE_STATION)
|
||||
if (vif->type != NL80211_IFTYPE_STATION || sta->tdls)
|
||||
rtw_release_macid(rtwdev, si->mac_id);
|
||||
if (fw_exist)
|
||||
rtw_fw_media_status_report(rtwdev, si->mac_id, false);
|
||||
@@ -636,6 +636,7 @@ void rtw_fw_recovery(struct rtw_dev *rtwdev)
|
||||
if (!test_bit(RTW_FLAG_RESTARTING, rtwdev->flags))
|
||||
ieee80211_queue_work(rtwdev->hw, &rtwdev->fw_recovery_work);
|
||||
}
|
||||
EXPORT_SYMBOL(rtw_fw_recovery);
|
||||
|
||||
static void __fw_recovery_work(struct rtw_dev *rtwdev)
|
||||
{
|
||||
@@ -1411,6 +1412,12 @@ int rtw_power_on(struct rtw_dev *rtwdev)
|
||||
|
||||
chip->ops->phy_set_param(rtwdev);
|
||||
|
||||
ret = rtw_mac_postinit(rtwdev);
|
||||
if (ret) {
|
||||
rtw_err(rtwdev, "failed to configure mac in postinit\n");
|
||||
goto err_off;
|
||||
}
|
||||
|
||||
ret = rtw_hci_start(rtwdev);
|
||||
if (ret) {
|
||||
rtw_err(rtwdev, "failed to start hci\n");
|
||||
@@ -1765,7 +1772,7 @@ static void __update_firmware_info_legacy(struct rtw_dev *rtwdev,
|
||||
static void update_firmware_info(struct rtw_dev *rtwdev,
|
||||
struct rtw_fw_state *fw)
|
||||
{
|
||||
if (rtw_chip_wcpu_11n(rtwdev))
|
||||
if (rtw_chip_wcpu_8051(rtwdev))
|
||||
__update_firmware_info_legacy(rtwdev, fw);
|
||||
else
|
||||
__update_firmware_info(rtwdev, fw);
|
||||
@@ -2218,7 +2225,6 @@ EXPORT_SYMBOL(rtw_core_deinit);
|
||||
|
||||
int rtw_register_hw(struct rtw_dev *rtwdev, struct ieee80211_hw *hw)
|
||||
{
|
||||
bool sta_mode_only = rtwdev->hci.type == RTW_HCI_TYPE_SDIO;
|
||||
struct rtw_hal *hal = &rtwdev->hal;
|
||||
int max_tx_headroom = 0;
|
||||
int ret;
|
||||
@@ -2248,12 +2254,9 @@ int rtw_register_hw(struct rtw_dev *rtwdev, struct ieee80211_hw *hw)
|
||||
ieee80211_hw_set(hw, TX_AMSDU);
|
||||
ieee80211_hw_set(hw, SINGLE_SCAN_ON_ALL_BANDS);
|
||||
|
||||
if (sta_mode_only)
|
||||
hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION);
|
||||
else
|
||||
hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
|
||||
BIT(NL80211_IFTYPE_AP) |
|
||||
BIT(NL80211_IFTYPE_ADHOC);
|
||||
hw->wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
|
||||
BIT(NL80211_IFTYPE_AP) |
|
||||
BIT(NL80211_IFTYPE_ADHOC);
|
||||
hw->wiphy->available_antennas_tx = hal->antenna_tx;
|
||||
hw->wiphy->available_antennas_rx = hal->antenna_rx;
|
||||
|
||||
@@ -2264,7 +2267,7 @@ int rtw_register_hw(struct rtw_dev *rtwdev, struct ieee80211_hw *hw)
|
||||
hw->wiphy->max_scan_ssids = RTW_SCAN_MAX_SSIDS;
|
||||
hw->wiphy->max_scan_ie_len = rtw_get_max_scan_ie_len(rtwdev);
|
||||
|
||||
if (!sta_mode_only && rtwdev->chip->id == RTW_CHIP_TYPE_8822C) {
|
||||
if (rtwdev->chip->id == RTW_CHIP_TYPE_8822C) {
|
||||
hw->wiphy->iface_combinations = rtw_iface_combs;
|
||||
hw->wiphy->n_iface_combinations = ARRAY_SIZE(rtw_iface_combs);
|
||||
}
|
||||
|
||||
@@ -858,6 +858,7 @@ struct rtw_chip_ops {
|
||||
int (*power_on)(struct rtw_dev *rtwdev);
|
||||
void (*power_off)(struct rtw_dev *rtwdev);
|
||||
int (*mac_init)(struct rtw_dev *rtwdev);
|
||||
int (*mac_postinit)(struct rtw_dev *rtwdev);
|
||||
int (*dump_fw_crash)(struct rtw_dev *rtwdev);
|
||||
void (*shutdown)(struct rtw_dev *rtwdev);
|
||||
int (*read_efuse)(struct rtw_dev *rtwdev, u8 *map);
|
||||
@@ -873,7 +874,7 @@ struct rtw_chip_ops {
|
||||
void (*set_tx_power_index)(struct rtw_dev *rtwdev);
|
||||
int (*rsvd_page_dump)(struct rtw_dev *rtwdev, u8 *buf, u32 offset,
|
||||
u32 size);
|
||||
int (*set_antenna)(struct rtw_dev *rtwdev,
|
||||
int (*set_antenna)(struct rtw_dev *rtwdev, int radio_idx,
|
||||
u32 antenna_tx,
|
||||
u32 antenna_rx);
|
||||
void (*cfg_ldo25)(struct rtw_dev *rtwdev, bool enable);
|
||||
@@ -1173,8 +1174,8 @@ struct rtw_pwr_track_tbl {
|
||||
};
|
||||
|
||||
enum rtw_wlan_cpu {
|
||||
RTW_WCPU_11AC,
|
||||
RTW_WCPU_11N,
|
||||
RTW_WCPU_3081,
|
||||
RTW_WCPU_8051,
|
||||
};
|
||||
|
||||
enum rtw_fw_fifo_sel {
|
||||
@@ -2166,14 +2167,14 @@ static inline void rtw_chip_efuse_grant_off(struct rtw_dev *rtwdev)
|
||||
rtwdev->chip->ops->efuse_grant(rtwdev, false);
|
||||
}
|
||||
|
||||
static inline bool rtw_chip_wcpu_11n(struct rtw_dev *rtwdev)
|
||||
static inline bool rtw_chip_wcpu_8051(struct rtw_dev *rtwdev)
|
||||
{
|
||||
return rtwdev->chip->wlan_cpu == RTW_WCPU_11N;
|
||||
return rtwdev->chip->wlan_cpu == RTW_WCPU_8051;
|
||||
}
|
||||
|
||||
static inline bool rtw_chip_wcpu_11ac(struct rtw_dev *rtwdev)
|
||||
static inline bool rtw_chip_wcpu_3081(struct rtw_dev *rtwdev)
|
||||
{
|
||||
return rtwdev->chip->wlan_cpu == RTW_WCPU_11AC;
|
||||
return rtwdev->chip->wlan_cpu == RTW_WCPU_3081;
|
||||
}
|
||||
|
||||
static inline bool rtw_chip_has_rx_ldpc(struct rtw_dev *rtwdev)
|
||||
|
||||
@@ -405,7 +405,7 @@ static void rtw_pci_reset_buf_desc(struct rtw_dev *rtwdev)
|
||||
dma = rtwpci->tx_rings[RTW_TX_QUEUE_BCN].r.dma;
|
||||
rtw_write32(rtwdev, RTK_PCI_TXBD_DESA_BCNQ, dma);
|
||||
|
||||
if (!rtw_chip_wcpu_11n(rtwdev)) {
|
||||
if (!rtw_chip_wcpu_8051(rtwdev)) {
|
||||
len = rtwpci->tx_rings[RTW_TX_QUEUE_H2C].r.len;
|
||||
dma = rtwpci->tx_rings[RTW_TX_QUEUE_H2C].r.dma;
|
||||
rtwpci->tx_rings[RTW_TX_QUEUE_H2C].r.rp = 0;
|
||||
@@ -467,7 +467,7 @@ static void rtw_pci_reset_buf_desc(struct rtw_dev *rtwdev)
|
||||
rtw_write32(rtwdev, RTK_PCI_TXBD_RWPTR_CLR, 0xffffffff);
|
||||
|
||||
/* reset H2C Queue index in a single write */
|
||||
if (rtw_chip_wcpu_11ac(rtwdev))
|
||||
if (rtw_chip_wcpu_3081(rtwdev))
|
||||
rtw_write32_set(rtwdev, RTK_PCI_TXBD_H2CQ_CSR,
|
||||
BIT_CLR_H2CQ_HOST_IDX | BIT_CLR_H2CQ_HW_IDX);
|
||||
}
|
||||
@@ -487,7 +487,7 @@ static void rtw_pci_enable_interrupt(struct rtw_dev *rtwdev,
|
||||
|
||||
rtw_write32(rtwdev, RTK_PCI_HIMR0, rtwpci->irq_mask[0] & ~imr0_unmask);
|
||||
rtw_write32(rtwdev, RTK_PCI_HIMR1, rtwpci->irq_mask[1]);
|
||||
if (rtw_chip_wcpu_11ac(rtwdev))
|
||||
if (rtw_chip_wcpu_3081(rtwdev))
|
||||
rtw_write32(rtwdev, RTK_PCI_HIMR3, rtwpci->irq_mask[3]);
|
||||
|
||||
rtwpci->irq_enabled = true;
|
||||
@@ -507,7 +507,7 @@ static void rtw_pci_disable_interrupt(struct rtw_dev *rtwdev,
|
||||
|
||||
rtw_write32(rtwdev, RTK_PCI_HIMR0, 0);
|
||||
rtw_write32(rtwdev, RTK_PCI_HIMR1, 0);
|
||||
if (rtw_chip_wcpu_11ac(rtwdev))
|
||||
if (rtw_chip_wcpu_3081(rtwdev))
|
||||
rtw_write32(rtwdev, RTK_PCI_HIMR3, 0);
|
||||
|
||||
rtwpci->irq_enabled = false;
|
||||
@@ -1125,7 +1125,7 @@ static void rtw_pci_irq_recognized(struct rtw_dev *rtwdev,
|
||||
|
||||
irq_status[0] = rtw_read32(rtwdev, RTK_PCI_HISR0);
|
||||
irq_status[1] = rtw_read32(rtwdev, RTK_PCI_HISR1);
|
||||
if (rtw_chip_wcpu_11ac(rtwdev))
|
||||
if (rtw_chip_wcpu_3081(rtwdev))
|
||||
irq_status[3] = rtw_read32(rtwdev, RTK_PCI_HISR3);
|
||||
else
|
||||
irq_status[3] = 0;
|
||||
@@ -1134,7 +1134,7 @@ static void rtw_pci_irq_recognized(struct rtw_dev *rtwdev,
|
||||
irq_status[3] &= rtwpci->irq_mask[3];
|
||||
rtw_write32(rtwdev, RTK_PCI_HISR0, irq_status[0]);
|
||||
rtw_write32(rtwdev, RTK_PCI_HISR1, irq_status[1]);
|
||||
if (rtw_chip_wcpu_11ac(rtwdev))
|
||||
if (rtw_chip_wcpu_3081(rtwdev))
|
||||
rtw_write32(rtwdev, RTK_PCI_HISR3, irq_status[3]);
|
||||
|
||||
spin_unlock_irqrestore(&rtwpci->hwirq_lock, flags);
|
||||
@@ -1707,6 +1707,43 @@ static void rtw_pci_napi_deinit(struct rtw_dev *rtwdev)
|
||||
free_netdev(rtwpci->netdev);
|
||||
}
|
||||
|
||||
static pci_ers_result_t rtw_pci_io_err_detected(struct pci_dev *pdev,
|
||||
pci_channel_state_t state)
|
||||
{
|
||||
struct net_device *netdev = pci_get_drvdata(pdev);
|
||||
|
||||
netif_device_detach(netdev);
|
||||
|
||||
return PCI_ERS_RESULT_NEED_RESET;
|
||||
}
|
||||
|
||||
static pci_ers_result_t rtw_pci_io_slot_reset(struct pci_dev *pdev)
|
||||
{
|
||||
struct ieee80211_hw *hw = pci_get_drvdata(pdev);
|
||||
struct rtw_dev *rtwdev = hw->priv;
|
||||
|
||||
rtw_fw_recovery(rtwdev);
|
||||
|
||||
return PCI_ERS_RESULT_RECOVERED;
|
||||
}
|
||||
|
||||
static void rtw_pci_io_resume(struct pci_dev *pdev)
|
||||
{
|
||||
struct net_device *netdev = pci_get_drvdata(pdev);
|
||||
|
||||
/* ack any pending wake events, disable PME */
|
||||
pci_enable_wake(pdev, PCI_D0, 0);
|
||||
|
||||
netif_device_attach(netdev);
|
||||
}
|
||||
|
||||
const struct pci_error_handlers rtw_pci_err_handler = {
|
||||
.error_detected = rtw_pci_io_err_detected,
|
||||
.slot_reset = rtw_pci_io_slot_reset,
|
||||
.resume = rtw_pci_io_resume,
|
||||
};
|
||||
EXPORT_SYMBOL(rtw_pci_err_handler);
|
||||
|
||||
int rtw_pci_probe(struct pci_dev *pdev,
|
||||
const struct pci_device_id *id)
|
||||
{
|
||||
|
||||
@@ -231,6 +231,7 @@ struct rtw_pci {
|
||||
};
|
||||
|
||||
extern const struct dev_pm_ops rtw_pm_ops;
|
||||
extern const struct pci_error_handlers rtw_pci_err_handler;
|
||||
|
||||
int rtw_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id);
|
||||
void rtw_pci_remove(struct pci_dev *pdev);
|
||||
|
||||
+2
-1
@@ -1832,6 +1832,7 @@ static const struct rtw_chip_ops rtw8703b_ops = {
|
||||
.power_on = rtw_power_on,
|
||||
.power_off = rtw_power_off,
|
||||
.mac_init = rtw8723x_mac_init,
|
||||
.mac_postinit = rtw8723x_mac_postinit,
|
||||
.dump_fw_crash = NULL,
|
||||
.shutdown = NULL,
|
||||
.read_efuse = rtw8703b_read_efuse,
|
||||
@@ -1882,7 +1883,7 @@ const struct rtw_chip_info rtw8703b_hw_spec = {
|
||||
.id = RTW_CHIP_TYPE_8703B,
|
||||
|
||||
.fw_name = "rtw88/rtw8703b_fw.bin",
|
||||
.wlan_cpu = RTW_WCPU_11N,
|
||||
.wlan_cpu = RTW_WCPU_8051,
|
||||
.tx_pkt_desc_sz = 40,
|
||||
.tx_buf_desc_sz = 16,
|
||||
.rx_pkt_desc_sz = 24,
|
||||
|
||||
+2
-1
@@ -1397,6 +1397,7 @@ static const struct rtw_chip_ops rtw8723d_ops = {
|
||||
.query_phy_status = query_phy_status,
|
||||
.set_channel = rtw8723d_set_channel,
|
||||
.mac_init = rtw8723x_mac_init,
|
||||
.mac_postinit = rtw8723x_mac_postinit,
|
||||
.shutdown = rtw8723d_shutdown,
|
||||
.read_rf = rtw_phy_read_rf_sipi,
|
||||
.write_rf = rtw_phy_write_rf_reg_sipi,
|
||||
@@ -2116,7 +2117,7 @@ const struct rtw_chip_info rtw8723d_hw_spec = {
|
||||
.ops = &rtw8723d_ops,
|
||||
.id = RTW_CHIP_TYPE_8723D,
|
||||
.fw_name = "rtw88/rtw8723d_fw.bin",
|
||||
.wlan_cpu = RTW_WCPU_11N,
|
||||
.wlan_cpu = RTW_WCPU_8051,
|
||||
.tx_pkt_desc_sz = 40,
|
||||
.tx_buf_desc_sz = 16,
|
||||
.rx_pkt_desc_sz = 24,
|
||||
|
||||
@@ -23,6 +23,7 @@ static struct pci_driver rtw_8723de_driver = {
|
||||
.remove = rtw_pci_remove,
|
||||
.driver.pm = &rtw_pm_ops,
|
||||
.shutdown = rtw_pci_shutdown,
|
||||
.err_handler = &rtw_pci_err_handler,
|
||||
};
|
||||
module_pci_driver(rtw_8723de_driver);
|
||||
|
||||
|
||||
+8
-1
@@ -353,7 +353,6 @@ static int __rtw8723x_read_efuse(struct rtw_dev *rtwdev, u8 *log_map)
|
||||
|
||||
static int __rtw8723x_mac_init(struct rtw_dev *rtwdev)
|
||||
{
|
||||
rtw_write8(rtwdev, REG_FWHW_TXQ_CTRL + 1, WLAN_TXQ_RPT_EN);
|
||||
rtw_write32(rtwdev, REG_TCR, BIT_TCR_CFG);
|
||||
|
||||
rtw_write16(rtwdev, REG_RXFLTMAP0, WLAN_RX_FILTER0);
|
||||
@@ -370,6 +369,13 @@ static int __rtw8723x_mac_init(struct rtw_dev *rtwdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __rtw8723x_mac_postinit(struct rtw_dev *rtwdev)
|
||||
{
|
||||
rtw_write8(rtwdev, REG_FWHW_TXQ_CTRL + 1, WLAN_TXQ_RPT_EN);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __rtw8723x_cfg_ldo25(struct rtw_dev *rtwdev, bool enable)
|
||||
{
|
||||
u8 ldo_pwr;
|
||||
@@ -760,6 +766,7 @@ const struct rtw8723x_common rtw8723x_common = {
|
||||
.lck = __rtw8723x_lck,
|
||||
.read_efuse = __rtw8723x_read_efuse,
|
||||
.mac_init = __rtw8723x_mac_init,
|
||||
.mac_postinit = __rtw8723x_mac_postinit,
|
||||
.cfg_ldo25 = __rtw8723x_cfg_ldo25,
|
||||
.set_tx_power_index = __rtw8723x_set_tx_power_index,
|
||||
.efuse_grant = __rtw8723x_efuse_grant,
|
||||
|
||||
@@ -137,6 +137,7 @@ struct rtw8723x_common {
|
||||
void (*lck)(struct rtw_dev *rtwdev);
|
||||
int (*read_efuse)(struct rtw_dev *rtwdev, u8 *log_map);
|
||||
int (*mac_init)(struct rtw_dev *rtwdev);
|
||||
int (*mac_postinit)(struct rtw_dev *rtwdev);
|
||||
void (*cfg_ldo25)(struct rtw_dev *rtwdev, bool enable);
|
||||
void (*set_tx_power_index)(struct rtw_dev *rtwdev);
|
||||
void (*efuse_grant)(struct rtw_dev *rtwdev, bool on);
|
||||
@@ -383,6 +384,11 @@ static inline int rtw8723x_mac_init(struct rtw_dev *rtwdev)
|
||||
return rtw8723x_common.mac_init(rtwdev);
|
||||
}
|
||||
|
||||
static inline int rtw8723x_mac_postinit(struct rtw_dev *rtwdev)
|
||||
{
|
||||
return rtw8723x_common.mac_postinit(rtwdev);
|
||||
}
|
||||
|
||||
static inline void rtw8723x_cfg_ldo25(struct rtw_dev *rtwdev, bool enable)
|
||||
{
|
||||
rtw8723x_common.cfg_ldo25(rtwdev, enable);
|
||||
|
||||
+2
-1
@@ -919,6 +919,7 @@ static const struct rtw_chip_ops rtw8812a_ops = {
|
||||
.query_phy_status = rtw8812a_query_phy_status,
|
||||
.set_channel = rtw88xxa_set_channel,
|
||||
.mac_init = NULL,
|
||||
.mac_postinit = NULL,
|
||||
.read_rf = rtw88xxa_phy_read_rf,
|
||||
.write_rf = rtw_phy_write_rf_reg_sipi,
|
||||
.set_antenna = NULL,
|
||||
@@ -1038,7 +1039,7 @@ const struct rtw_chip_info rtw8812a_hw_spec = {
|
||||
.ops = &rtw8812a_ops,
|
||||
.id = RTW_CHIP_TYPE_8812A,
|
||||
.fw_name = "rtw88/rtw8812a_fw.bin",
|
||||
.wlan_cpu = RTW_WCPU_11N,
|
||||
.wlan_cpu = RTW_WCPU_8051,
|
||||
.tx_pkt_desc_sz = 40,
|
||||
.tx_buf_desc_sz = 16,
|
||||
.rx_pkt_desc_sz = 24,
|
||||
|
||||
+2
-1
@@ -2055,6 +2055,7 @@ static const struct rtw_chip_ops rtw8814a_ops = {
|
||||
.query_phy_status = rtw8814a_query_phy_status,
|
||||
.set_channel = rtw8814a_set_channel,
|
||||
.mac_init = rtw8814a_mac_init,
|
||||
.mac_postinit = NULL,
|
||||
.read_rf = rtw_phy_read_rf,
|
||||
.write_rf = rtw_phy_write_rf_reg_sipi,
|
||||
.set_tx_power_index = rtw8814a_set_tx_power_index,
|
||||
@@ -2180,7 +2181,7 @@ const struct rtw_chip_info rtw8814a_hw_spec = {
|
||||
.ops = &rtw8814a_ops,
|
||||
.id = RTW_CHIP_TYPE_8814A,
|
||||
.fw_name = "rtw88/rtw8814a_fw.bin",
|
||||
.wlan_cpu = RTW_WCPU_11AC,
|
||||
.wlan_cpu = RTW_WCPU_3081,
|
||||
.tx_pkt_desc_sz = 40,
|
||||
.tx_buf_desc_sz = 16,
|
||||
.rx_pkt_desc_sz = 24,
|
||||
|
||||
+2
-1
@@ -865,6 +865,7 @@ static const struct rtw_chip_ops rtw8821a_ops = {
|
||||
.query_phy_status = rtw8821a_query_phy_status,
|
||||
.set_channel = rtw88xxa_set_channel,
|
||||
.mac_init = NULL,
|
||||
.mac_postinit = NULL,
|
||||
.read_rf = rtw88xxa_phy_read_rf,
|
||||
.write_rf = rtw_phy_write_rf_reg_sipi,
|
||||
.set_antenna = NULL,
|
||||
@@ -1138,7 +1139,7 @@ const struct rtw_chip_info rtw8821a_hw_spec = {
|
||||
.ops = &rtw8821a_ops,
|
||||
.id = RTW_CHIP_TYPE_8821A,
|
||||
.fw_name = "rtw88/rtw8821a_fw.bin",
|
||||
.wlan_cpu = RTW_WCPU_11N,
|
||||
.wlan_cpu = RTW_WCPU_8051,
|
||||
.tx_pkt_desc_sz = 40,
|
||||
.tx_buf_desc_sz = 16,
|
||||
.rx_pkt_desc_sz = 24,
|
||||
|
||||
+2
-1
@@ -1663,6 +1663,7 @@ static const struct rtw_chip_ops rtw8821c_ops = {
|
||||
.query_phy_status = query_phy_status,
|
||||
.set_channel = rtw8821c_set_channel,
|
||||
.mac_init = rtw8821c_mac_init,
|
||||
.mac_postinit = NULL,
|
||||
.read_rf = rtw_phy_read_rf,
|
||||
.write_rf = rtw_phy_write_rf_reg_sipi,
|
||||
.set_antenna = NULL,
|
||||
@@ -1973,7 +1974,7 @@ const struct rtw_chip_info rtw8821c_hw_spec = {
|
||||
.ops = &rtw8821c_ops,
|
||||
.id = RTW_CHIP_TYPE_8821C,
|
||||
.fw_name = "rtw88/rtw8821c_fw.bin",
|
||||
.wlan_cpu = RTW_WCPU_11AC,
|
||||
.wlan_cpu = RTW_WCPU_3081,
|
||||
.tx_pkt_desc_sz = 48,
|
||||
.tx_buf_desc_sz = 16,
|
||||
.rx_pkt_desc_sz = 24,
|
||||
|
||||
@@ -27,6 +27,7 @@ static struct pci_driver rtw_8821ce_driver = {
|
||||
.remove = rtw_pci_remove,
|
||||
.driver.pm = &rtw_pm_ops,
|
||||
.shutdown = rtw_pci_shutdown,
|
||||
.err_handler = &rtw_pci_err_handler,
|
||||
};
|
||||
module_pci_driver(rtw_8821ce_driver);
|
||||
|
||||
|
||||
+3
-1
@@ -983,6 +983,7 @@ static bool rtw8822b_check_rf_path(u8 antenna)
|
||||
}
|
||||
|
||||
static int rtw8822b_set_antenna(struct rtw_dev *rtwdev,
|
||||
int radio_idx,
|
||||
u32 antenna_tx,
|
||||
u32 antenna_rx)
|
||||
{
|
||||
@@ -2153,6 +2154,7 @@ static const struct rtw_chip_ops rtw8822b_ops = {
|
||||
.query_phy_status = query_phy_status,
|
||||
.set_channel = rtw8822b_set_channel,
|
||||
.mac_init = rtw8822b_mac_init,
|
||||
.mac_postinit = NULL,
|
||||
.read_rf = rtw_phy_read_rf,
|
||||
.write_rf = rtw_phy_write_rf_reg_sipi,
|
||||
.set_tx_power_index = rtw8822b_set_tx_power_index,
|
||||
@@ -2513,7 +2515,7 @@ const struct rtw_chip_info rtw8822b_hw_spec = {
|
||||
.ops = &rtw8822b_ops,
|
||||
.id = RTW_CHIP_TYPE_8822B,
|
||||
.fw_name = "rtw88/rtw8822b_fw.bin",
|
||||
.wlan_cpu = RTW_WCPU_11AC,
|
||||
.wlan_cpu = RTW_WCPU_3081,
|
||||
.tx_pkt_desc_sz = 48,
|
||||
.tx_buf_desc_sz = 16,
|
||||
.rx_pkt_desc_sz = 24,
|
||||
|
||||
@@ -23,6 +23,7 @@ static struct pci_driver rtw_8822be_driver = {
|
||||
.remove = rtw_pci_remove,
|
||||
.driver.pm = &rtw_pm_ops,
|
||||
.shutdown = rtw_pci_shutdown,
|
||||
.err_handler = &rtw_pci_err_handler,
|
||||
};
|
||||
module_pci_driver(rtw_8822be_driver);
|
||||
|
||||
|
||||
+3
-1
@@ -2767,6 +2767,7 @@ static void rtw8822c_set_tx_power_index(struct rtw_dev *rtwdev)
|
||||
}
|
||||
|
||||
static int rtw8822c_set_antenna(struct rtw_dev *rtwdev,
|
||||
int radio_idx,
|
||||
u32 antenna_tx,
|
||||
u32 antenna_rx)
|
||||
{
|
||||
@@ -4963,6 +4964,7 @@ static const struct rtw_chip_ops rtw8822c_ops = {
|
||||
.query_phy_status = query_phy_status,
|
||||
.set_channel = rtw8822c_set_channel,
|
||||
.mac_init = rtw8822c_mac_init,
|
||||
.mac_postinit = NULL,
|
||||
.dump_fw_crash = rtw8822c_dump_fw_crash,
|
||||
.read_rf = rtw_phy_read_rf,
|
||||
.write_rf = rtw_phy_write_rf_reg_mix,
|
||||
@@ -5332,7 +5334,7 @@ const struct rtw_chip_info rtw8822c_hw_spec = {
|
||||
.ops = &rtw8822c_ops,
|
||||
.id = RTW_CHIP_TYPE_8822C,
|
||||
.fw_name = "rtw88/rtw8822c_fw.bin",
|
||||
.wlan_cpu = RTW_WCPU_11AC,
|
||||
.wlan_cpu = RTW_WCPU_3081,
|
||||
.tx_pkt_desc_sz = 48,
|
||||
.tx_buf_desc_sz = 16,
|
||||
.rx_pkt_desc_sz = 24,
|
||||
|
||||
@@ -27,6 +27,7 @@ static struct pci_driver rtw_8822ce_driver = {
|
||||
.remove = rtw_pci_remove,
|
||||
.driver.pm = &rtw_pm_ops,
|
||||
.shutdown = rtw_pci_shutdown,
|
||||
.err_handler = &rtw_pci_err_handler,
|
||||
};
|
||||
module_pci_driver(rtw_8822ce_driver);
|
||||
|
||||
|
||||
@@ -547,7 +547,7 @@ static int rtw_sdio_check_free_txpg(struct rtw_dev *rtwdev, u8 queue,
|
||||
{
|
||||
unsigned int pages_free, pages_needed;
|
||||
|
||||
if (rtw_chip_wcpu_11n(rtwdev)) {
|
||||
if (rtw_chip_wcpu_8051(rtwdev)) {
|
||||
u32 free_txpg;
|
||||
|
||||
free_txpg = rtw_sdio_read32(rtwdev, REG_SDIO_FREE_TXPG);
|
||||
@@ -1030,7 +1030,7 @@ static void rtw_sdio_rx_isr(struct rtw_dev *rtwdev)
|
||||
u32 rx_len, hisr, total_rx_bytes = 0;
|
||||
|
||||
do {
|
||||
if (rtw_chip_wcpu_11n(rtwdev))
|
||||
if (rtw_chip_wcpu_8051(rtwdev))
|
||||
rx_len = rtw_read16(rtwdev, REG_SDIO_RX0_REQ_LEN);
|
||||
else
|
||||
rx_len = rtw_read32(rtwdev, REG_SDIO_RX0_REQ_LEN);
|
||||
@@ -1042,7 +1042,7 @@ static void rtw_sdio_rx_isr(struct rtw_dev *rtwdev)
|
||||
|
||||
total_rx_bytes += rx_len;
|
||||
|
||||
if (rtw_chip_wcpu_11n(rtwdev)) {
|
||||
if (rtw_chip_wcpu_8051(rtwdev)) {
|
||||
/* Stop if no more RX requests are pending, even if
|
||||
* rx_len could be greater than zero in the next
|
||||
* iteration. This is needed because the RX buffer may
|
||||
@@ -1054,7 +1054,7 @@ static void rtw_sdio_rx_isr(struct rtw_dev *rtwdev)
|
||||
*/
|
||||
hisr = rtw_read32(rtwdev, REG_SDIO_HISR);
|
||||
} else {
|
||||
/* RTW_WCPU_11AC chips have improved hardware or
|
||||
/* RTW_WCPU_3081 chips have improved hardware or
|
||||
* firmware and can use rx_len unconditionally.
|
||||
*/
|
||||
hisr = REG_SDIO_HISR_RX_REQUEST;
|
||||
|
||||
Reference in New Issue
Block a user