diff options
Diffstat (limited to 'sys/contrib/dev/rtw88/fw.c')
| -rw-r--r-- | sys/contrib/dev/rtw88/fw.c | 31 | 
1 files changed, 26 insertions, 5 deletions
| diff --git a/sys/contrib/dev/rtw88/fw.c b/sys/contrib/dev/rtw88/fw.c index ae5af6bc3e92..5ce4a6bcffb6 100644 --- a/sys/contrib/dev/rtw88/fw.c +++ b/sys/contrib/dev/rtw88/fw.c @@ -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) @@ -735,6 +735,7 @@ void rtw_fw_send_ra_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si,  {  	u8 h2c_pkt[H2C_PKT_SIZE] = {0};  	bool disable_pt = true; +	u32 mask_hi;  	SET_H2C_CMD_ID_CLASS(h2c_pkt, H2C_CMD_RA_INFO); @@ -755,6 +756,20 @@ void rtw_fw_send_ra_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si,  	si->init_ra_lv = 0;  	rtw_fw_send_h2c_command(rtwdev, h2c_pkt); + +	if (rtwdev->chip->id != RTW_CHIP_TYPE_8814A) +		return; + +	SET_H2C_CMD_ID_CLASS(h2c_pkt, H2C_CMD_RA_INFO_HI); + +	mask_hi = si->ra_mask >> 32; + +	SET_RA_INFO_RA_MASK0(h2c_pkt, (mask_hi & 0xff)); +	SET_RA_INFO_RA_MASK1(h2c_pkt, (mask_hi & 0xff00) >> 8); +	SET_RA_INFO_RA_MASK2(h2c_pkt, (mask_hi & 0xff0000) >> 16); +	SET_RA_INFO_RA_MASK3(h2c_pkt, (mask_hi & 0xff000000) >> 24); + +	rtw_fw_send_h2c_command(rtwdev, h2c_pkt);  }  void rtw_fw_media_status_report(struct rtw_dev *rtwdev, u8 mac_id, bool connect) @@ -1451,7 +1466,7 @@ void rtw_add_rsvd_page_sta(struct rtw_dev *rtwdev,  int rtw_fw_write_data_rsvd_page(struct rtw_dev *rtwdev, u16 pg_addr,  				u8 *buf, u32 size)  { -	u8 bckp[2]; +	u8 bckp[3];  	u8 val;  	u16 rsvd_pg_head;  	u32 bcn_valid_addr; @@ -1463,7 +1478,9 @@ int rtw_fw_write_data_rsvd_page(struct rtw_dev *rtwdev, u16 pg_addr,  	if (!size)  		return -EINVAL; -	if (rtw_chip_wcpu_11n(rtwdev)) { +	bckp[2] = rtw_read8(rtwdev, REG_BCN_CTRL); + +	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; @@ -1476,6 +1493,9 @@ int rtw_fw_write_data_rsvd_page(struct rtw_dev *rtwdev, u16 pg_addr,  	val |= BIT_ENSWBCN >> 8;  	rtw_write8(rtwdev, REG_CR + 1, val); +	rtw_write8(rtwdev, REG_BCN_CTRL, +		   (bckp[2] & ~BIT_EN_BCN_FUNCTION) | BIT_DIS_TSF_UDT); +  	if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_PCIE) {  		val = rtw_read8(rtwdev, REG_FWHW_TXQ_CTRL + 2);  		bckp[1] = val; @@ -1489,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 { @@ -1506,6 +1526,7 @@ restore:  	rsvd_pg_head = rtwdev->fifo.rsvd_boundary;  	rtw_write16(rtwdev, REG_FIFOPAGE_CTRL_2,  		    rsvd_pg_head | BIT_BCN_VALID_V1); +	rtw_write8(rtwdev, REG_BCN_CTRL, bckp[2]);  	if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_PCIE)  		rtw_write8(rtwdev, REG_FWHW_TXQ_CTRL + 2, bckp[1]);  	rtw_write8(rtwdev, REG_CR + 1, bckp[0]); | 
