Lines Matching refs:rtwdev
11 void rtw_set_channel_mac(struct rtw_dev *rtwdev, u8 channel, u8 bw, in rtw_set_channel_mac() argument
25 rtw_write8(rtwdev, REG_DATA_SC, in rtw_set_channel_mac()
28 value32 = rtw_read32(rtwdev, REG_WMAC_TRXPTCL_CTL); in rtw_set_channel_mac()
41 rtw_write32(rtwdev, REG_WMAC_TRXPTCL_CTL, value32); in rtw_set_channel_mac()
43 if (rtw_chip_wcpu_11n(rtwdev)) in rtw_set_channel_mac()
46 value32 = rtw_read32(rtwdev, REG_AFE_CTRL1) & ~(BIT_MAC_CLK_SEL); in rtw_set_channel_mac()
48 rtw_write32(rtwdev, REG_AFE_CTRL1, value32); in rtw_set_channel_mac()
50 rtw_write8(rtwdev, REG_USTIME_TSF, MAC_CLK_SPEED); in rtw_set_channel_mac()
51 rtw_write8(rtwdev, REG_USTIME_EDCA, MAC_CLK_SPEED); in rtw_set_channel_mac()
53 value8 = rtw_read8(rtwdev, REG_CCK_CHECK); in rtw_set_channel_mac()
57 rtw_write8(rtwdev, REG_CCK_CHECK, value8); in rtw_set_channel_mac()
61 static int rtw_mac_pre_system_cfg(struct rtw_dev *rtwdev) in rtw_mac_pre_system_cfg() argument
66 rtw_write8(rtwdev, REG_RSV_CTRL, 0); in rtw_mac_pre_system_cfg()
68 if (rtw_chip_wcpu_11n(rtwdev)) { in rtw_mac_pre_system_cfg()
69 if (rtw_read32(rtwdev, REG_SYS_CFG1) & BIT_LDO) in rtw_mac_pre_system_cfg()
70 rtw_write8(rtwdev, REG_LDO_SWR_CTRL, LDO_SEL); in rtw_mac_pre_system_cfg()
72 rtw_write8(rtwdev, REG_LDO_SWR_CTRL, SPS_SEL); in rtw_mac_pre_system_cfg()
76 switch (rtw_hci_type(rtwdev)) { in rtw_mac_pre_system_cfg()
78 rtw_write32_set(rtwdev, REG_HCI_OPT_CTRL, BIT_BT_DIG_CLK_EN); in rtw_mac_pre_system_cfg()
87 value32 = rtw_read32(rtwdev, REG_PAD_CTRL1); in rtw_mac_pre_system_cfg()
89 rtw_write32(rtwdev, REG_PAD_CTRL1, value32); in rtw_mac_pre_system_cfg()
91 value32 = rtw_read32(rtwdev, REG_LED_CFG); in rtw_mac_pre_system_cfg()
93 rtw_write32(rtwdev, REG_LED_CFG, value32); in rtw_mac_pre_system_cfg()
95 value32 = rtw_read32(rtwdev, REG_GPIO_MUXCFG); in rtw_mac_pre_system_cfg()
97 rtw_write32(rtwdev, REG_GPIO_MUXCFG, value32); in rtw_mac_pre_system_cfg()
100 value8 = rtw_read8(rtwdev, REG_SYS_FUNC_EN); in rtw_mac_pre_system_cfg()
102 rtw_write8(rtwdev, REG_SYS_FUNC_EN, value8); in rtw_mac_pre_system_cfg()
104 value8 = rtw_read8(rtwdev, REG_RF_CTRL); in rtw_mac_pre_system_cfg()
106 rtw_write8(rtwdev, REG_RF_CTRL, value8); in rtw_mac_pre_system_cfg()
108 value32 = rtw_read32(rtwdev, REG_WLRF1); in rtw_mac_pre_system_cfg()
110 rtw_write32(rtwdev, REG_WLRF1, value32); in rtw_mac_pre_system_cfg()
115 static bool do_pwr_poll_cmd(struct rtw_dev *rtwdev, u32 addr, u32 mask, u32 target) in do_pwr_poll_cmd() argument
123 rtwdev, addr) == 0; in do_pwr_poll_cmd()
126 static int rtw_pwr_cmd_polling(struct rtw_dev *rtwdev, in rtw_pwr_cmd_polling() argument
137 if (do_pwr_poll_cmd(rtwdev, offset, cmd->mask, cmd->value)) in rtw_pwr_cmd_polling()
140 if (rtw_hci_type(rtwdev) != RTW_HCI_TYPE_PCIE) in rtw_pwr_cmd_polling()
144 value = rtw_read8(rtwdev, REG_SYS_PW_CTRL); in rtw_pwr_cmd_polling()
145 if (rtwdev->chip->id == RTW_CHIP_TYPE_8723D) in rtw_pwr_cmd_polling()
146 rtw_write8(rtwdev, REG_SYS_PW_CTRL, value & ~BIT_PFM_WOWL); in rtw_pwr_cmd_polling()
147 rtw_write8(rtwdev, REG_SYS_PW_CTRL, value | BIT_PFM_WOWL); in rtw_pwr_cmd_polling()
148 rtw_write8(rtwdev, REG_SYS_PW_CTRL, value & ~BIT_PFM_WOWL); in rtw_pwr_cmd_polling()
149 if (rtwdev->chip->id == RTW_CHIP_TYPE_8723D) in rtw_pwr_cmd_polling()
150 rtw_write8(rtwdev, REG_SYS_PW_CTRL, value | BIT_PFM_WOWL); in rtw_pwr_cmd_polling()
152 if (do_pwr_poll_cmd(rtwdev, offset, cmd->mask, cmd->value)) in rtw_pwr_cmd_polling()
156 rtw_err(rtwdev, "failed to poll offset=0x%x mask=0x%x value=0x%x\n", in rtw_pwr_cmd_polling()
161 static int rtw_sub_pwr_seq_parser(struct rtw_dev *rtwdev, u8 intf_mask, in rtw_sub_pwr_seq_parser() argument
181 value = rtw_read8(rtwdev, offset); in rtw_sub_pwr_seq_parser()
184 rtw_write8(rtwdev, offset, value); in rtw_sub_pwr_seq_parser()
187 if (rtw_pwr_cmd_polling(rtwdev, cur_cmd)) in rtw_sub_pwr_seq_parser()
206 static int rtw_pwr_seq_parser(struct rtw_dev *rtwdev, in rtw_pwr_seq_parser() argument
216 cut = rtwdev->hal.cut_version; in rtw_pwr_seq_parser()
218 switch (rtw_hci_type(rtwdev)) { in rtw_pwr_seq_parser()
234 ret = rtw_sub_pwr_seq_parser(rtwdev, intf_mask, cut_mask, cmd); in rtw_pwr_seq_parser()
244 static int rtw_mac_power_switch(struct rtw_dev *rtwdev, bool pwr_on) in rtw_mac_power_switch() argument
246 struct rtw_chip_info *chip = rtwdev->chip; in rtw_mac_power_switch()
251 if (rtw_chip_wcpu_11ac(rtwdev)) { in rtw_mac_power_switch()
252 rpwm = rtw_read8(rtwdev, rtwdev->hci.rpwm_addr); in rtw_mac_power_switch()
255 if (rtw_read16(rtwdev, REG_MCUFW_CTRL) == 0xC078) { in rtw_mac_power_switch()
257 rtw_write8(rtwdev, rtwdev->hci.rpwm_addr, rpwm); in rtw_mac_power_switch()
261 if (rtw_read8(rtwdev, REG_CR) == 0xea) in rtw_mac_power_switch()
263 else if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_USB && in rtw_mac_power_switch()
264 (rtw_read8(rtwdev, REG_SYS_STATUS1 + 1) & BIT(0))) in rtw_mac_power_switch()
273 if (rtw_pwr_seq_parser(rtwdev, pwr_seq)) in rtw_mac_power_switch()
279 static int __rtw_mac_init_system_cfg(struct rtw_dev *rtwdev) in __rtw_mac_init_system_cfg() argument
281 u8 sys_func_en = rtwdev->chip->sys_func_en; in __rtw_mac_init_system_cfg()
285 value = rtw_read32(rtwdev, REG_CPU_DMEM_CON); in __rtw_mac_init_system_cfg()
287 rtw_write32(rtwdev, REG_CPU_DMEM_CON, value); in __rtw_mac_init_system_cfg()
289 rtw_write8_set(rtwdev, REG_SYS_FUNC_EN + 1, sys_func_en); in __rtw_mac_init_system_cfg()
290 value8 = (rtw_read8(rtwdev, REG_CR_EXT + 3) & 0xF0) | 0x0C; in __rtw_mac_init_system_cfg()
291 rtw_write8(rtwdev, REG_CR_EXT + 3, value8); in __rtw_mac_init_system_cfg()
294 tmp = rtw_read32(rtwdev, REG_MCUFW_CTRL); in __rtw_mac_init_system_cfg()
296 rtw_write32(rtwdev, REG_MCUFW_CTRL, tmp & (~BIT_BOOT_FSPI_EN)); in __rtw_mac_init_system_cfg()
297 value = rtw_read32(rtwdev, REG_GPIO_MUXCFG) & (~BIT_FSPI_EN); in __rtw_mac_init_system_cfg()
298 rtw_write32(rtwdev, REG_GPIO_MUXCFG, value); in __rtw_mac_init_system_cfg()
304 static int __rtw_mac_init_system_cfg_legacy(struct rtw_dev *rtwdev) in __rtw_mac_init_system_cfg_legacy() argument
306 rtw_write8(rtwdev, REG_CR, 0xff); in __rtw_mac_init_system_cfg_legacy()
308 rtw_write8(rtwdev, REG_HWSEQ_CTRL, 0x7f); in __rtw_mac_init_system_cfg_legacy()
311 rtw_write8_set(rtwdev, REG_SYS_CLKR, BIT_WAKEPAD_EN); in __rtw_mac_init_system_cfg_legacy()
312 rtw_write16_clr(rtwdev, REG_GPIO_MUXCFG, BIT_EN_SIC); in __rtw_mac_init_system_cfg_legacy()
314 rtw_write16(rtwdev, REG_CR, 0x2ff); in __rtw_mac_init_system_cfg_legacy()
319 static int rtw_mac_init_system_cfg(struct rtw_dev *rtwdev) in rtw_mac_init_system_cfg() argument
321 if (rtw_chip_wcpu_11n(rtwdev)) in rtw_mac_init_system_cfg()
322 return __rtw_mac_init_system_cfg_legacy(rtwdev); in rtw_mac_init_system_cfg()
324 return __rtw_mac_init_system_cfg(rtwdev); in rtw_mac_init_system_cfg()
327 int rtw_mac_power_on(struct rtw_dev *rtwdev) in rtw_mac_power_on() argument
331 ret = rtw_mac_pre_system_cfg(rtwdev); in rtw_mac_power_on()
335 ret = rtw_mac_power_switch(rtwdev, true); in rtw_mac_power_on()
337 rtw_mac_power_switch(rtwdev, false); in rtw_mac_power_on()
338 ret = rtw_mac_power_switch(rtwdev, true); in rtw_mac_power_on()
345 ret = rtw_mac_init_system_cfg(rtwdev); in rtw_mac_power_on()
352 rtw_err(rtwdev, "mac power on failed"); in rtw_mac_power_on()
356 void rtw_mac_power_off(struct rtw_dev *rtwdev) in rtw_mac_power_off() argument
358 rtw_mac_power_switch(rtwdev, false); in rtw_mac_power_off()
384 static void wlan_cpu_enable(struct rtw_dev *rtwdev, bool enable) in wlan_cpu_enable() argument
388 rtw_write8_set(rtwdev, REG_RSV_CTRL + 1, BIT_WLMCU_IOIF); in wlan_cpu_enable()
391 rtw_write8_set(rtwdev, REG_SYS_FUNC_EN + 1, BIT_FEN_CPUEN); in wlan_cpu_enable()
394 rtw_write8_clr(rtwdev, REG_SYS_FUNC_EN + 1, BIT_FEN_CPUEN); in wlan_cpu_enable()
397 rtw_write8_clr(rtwdev, REG_RSV_CTRL + 1, BIT_WLMCU_IOIF); in wlan_cpu_enable()
403 static void download_firmware_reg_backup(struct rtw_dev *rtwdev, in download_firmware_reg_backup() argument
412 bckp[bckp_idx].val = rtw_read8(rtwdev, REG_TXDMA_PQ_MAP + 1); in download_firmware_reg_backup()
415 rtw_write8(rtwdev, REG_TXDMA_PQ_MAP + 1, tmp); in download_firmware_reg_backup()
420 bckp[bckp_idx].val = rtw_read8(rtwdev, REG_CR); in download_firmware_reg_backup()
427 rtw_write8(rtwdev, REG_CR, tmp); in download_firmware_reg_backup()
428 rtw_write32(rtwdev, REG_H2CQ_CSR, BIT_H2CQ_FULL); in download_firmware_reg_backup()
433 bckp[bckp_idx].val = rtw_read16(rtwdev, REG_FIFOPAGE_INFO_1); in download_firmware_reg_backup()
437 bckp[bckp_idx].val = rtw_read32(rtwdev, REG_RQPN_CTRL_2) | BIT_LD_RQPN; in download_firmware_reg_backup()
439 rtw_write16(rtwdev, REG_FIFOPAGE_INFO_1, 0x200); in download_firmware_reg_backup()
440 rtw_write32(rtwdev, REG_RQPN_CTRL_2, bckp[bckp_idx - 1].val); in download_firmware_reg_backup()
443 tmp = rtw_read8(rtwdev, REG_BCN_CTRL); in download_firmware_reg_backup()
449 rtw_write8(rtwdev, REG_BCN_CTRL, tmp); in download_firmware_reg_backup()
454 static void download_firmware_reset_platform(struct rtw_dev *rtwdev) in download_firmware_reset_platform() argument
456 rtw_write8_clr(rtwdev, REG_CPU_DMEM_CON + 2, BIT_WL_PLATFORM_RST >> 16); in download_firmware_reset_platform()
457 rtw_write8_clr(rtwdev, REG_SYS_CLK_CTRL + 1, BIT_CPU_CLK_EN >> 8); in download_firmware_reset_platform()
458 rtw_write8_set(rtwdev, REG_CPU_DMEM_CON + 2, BIT_WL_PLATFORM_RST >> 16); in download_firmware_reset_platform()
459 rtw_write8_set(rtwdev, REG_SYS_CLK_CTRL + 1, BIT_CPU_CLK_EN >> 8); in download_firmware_reset_platform()
462 static void download_firmware_reg_restore(struct rtw_dev *rtwdev, in download_firmware_reg_restore() argument
466 rtw_restore_reg(rtwdev, bckp, bckp_num); in download_firmware_reg_restore()
471 static int send_firmware_pkt_rsvd_page(struct rtw_dev *rtwdev, u16 pg_addr, in send_firmware_pkt_rsvd_page() argument
481 ret = rtw_fw_write_data_rsvd_page(rtwdev, pg_addr, buf, size); in send_firmware_pkt_rsvd_page()
487 send_firmware_pkt(struct rtw_dev *rtwdev, u16 pg_addr, const u8 *data, u32 size) in send_firmware_pkt() argument
491 if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_USB && in send_firmware_pkt()
495 ret = send_firmware_pkt_rsvd_page(rtwdev, pg_addr, data, size); in send_firmware_pkt()
497 rtw_err(rtwdev, "failed to download rsvd page\n"); in send_firmware_pkt()
503 iddma_enable(struct rtw_dev *rtwdev, u32 src, u32 dst, u32 ctrl) in iddma_enable() argument
505 rtw_write32(rtwdev, REG_DDMA_CH0SA, src); in iddma_enable()
506 rtw_write32(rtwdev, REG_DDMA_CH0DA, dst); in iddma_enable()
507 rtw_write32(rtwdev, REG_DDMA_CH0CTRL, ctrl); in iddma_enable()
509 if (!check_hw_ready(rtwdev, REG_DDMA_CH0CTRL, BIT_DDMACH0_OWN, 0)) in iddma_enable()
515 static int iddma_download_firmware(struct rtw_dev *rtwdev, u32 src, u32 dst, in iddma_download_firmware() argument
520 if (!check_hw_ready(rtwdev, REG_DDMA_CH0CTRL, BIT_DDMACH0_OWN, 0)) in iddma_download_firmware()
527 if (iddma_enable(rtwdev, src, dst, ch0_ctrl)) in iddma_download_firmware()
533 int rtw_ddma_to_fw_fifo(struct rtw_dev *rtwdev, u32 ocp_src, u32 size) in rtw_ddma_to_fw_fifo() argument
537 if (!check_hw_ready(rtwdev, REG_DDMA_CH0CTRL, BIT_DDMACH0_OWN, 0)) { in rtw_ddma_to_fw_fifo()
538 rtw_dbg(rtwdev, RTW_DBG_FW, "busy to start ddma\n"); in rtw_ddma_to_fw_fifo()
544 if (iddma_enable(rtwdev, ocp_src, OCPBASE_RXBUF_FW_88XX, ch0_ctrl)) { in rtw_ddma_to_fw_fifo()
545 rtw_dbg(rtwdev, RTW_DBG_FW, "busy to complete ddma\n"); in rtw_ddma_to_fw_fifo()
553 check_fw_checksum(struct rtw_dev *rtwdev, u32 addr) in check_fw_checksum() argument
557 fw_ctrl = rtw_read8(rtwdev, REG_MCUFW_CTRL); in check_fw_checksum()
559 if (rtw_read32(rtwdev, REG_DDMA_CH0CTRL) & BIT_DDMACH0_CHKSUM_STS) { in check_fw_checksum()
563 rtw_write8(rtwdev, REG_MCUFW_CTRL, fw_ctrl); in check_fw_checksum()
567 rtw_write8(rtwdev, REG_MCUFW_CTRL, fw_ctrl); in check_fw_checksum()
570 rtw_err(rtwdev, "invalid fw checksum\n"); in check_fw_checksum()
577 rtw_write8(rtwdev, REG_MCUFW_CTRL, fw_ctrl); in check_fw_checksum()
580 rtw_write8(rtwdev, REG_MCUFW_CTRL, fw_ctrl); in check_fw_checksum()
587 download_firmware_to_mem(struct rtw_dev *rtwdev, const u8 *data, in download_firmware_to_mem() argument
590 struct rtw_chip_info *chip = rtwdev->chip; in download_firmware_to_mem()
604 val = rtw_read32(rtwdev, REG_DDMA_CH0CTRL); in download_firmware_to_mem()
606 rtw_write32(rtwdev, REG_DDMA_CH0CTRL, val); in download_firmware_to_mem()
614 ret = send_firmware_pkt(rtwdev, (u16)(src >> 7), in download_firmware_to_mem()
619 ret = iddma_download_firmware(rtwdev, OCPBASE_TXBUF_88XX + in download_firmware_to_mem()
631 if (!check_fw_checksum(rtwdev, dst)) in download_firmware_to_mem()
638 start_download_firmware(struct rtw_dev *rtwdev, const u8 *data, u32 size) in start_download_firmware() argument
657 val = (u16)(rtw_read16(rtwdev, REG_MCUFW_CTRL) & 0x3800); in start_download_firmware()
659 rtw_write16(rtwdev, REG_MCUFW_CTRL, val); in start_download_firmware()
664 ret = download_firmware_to_mem(rtwdev, cur_fw, 0, addr, dmem_size); in start_download_firmware()
671 ret = download_firmware_to_mem(rtwdev, cur_fw, 0, addr, imem_size); in start_download_firmware()
679 ret = download_firmware_to_mem(rtwdev, cur_fw, 0, addr, in start_download_firmware()
688 static int download_firmware_validate(struct rtw_dev *rtwdev) in download_firmware_validate() argument
692 if (!check_hw_ready(rtwdev, REG_MCUFW_CTRL, FW_READY_MASK, FW_READY)) { in download_firmware_validate()
693 fw_key = rtw_read32(rtwdev, REG_FW_DBG7) & FW_KEY_MASK; in download_firmware_validate()
695 rtw_err(rtwdev, "invalid fw key\n"); in download_firmware_validate()
702 static void download_firmware_end_flow(struct rtw_dev *rtwdev) in download_firmware_end_flow() argument
706 rtw_write32(rtwdev, REG_TXDMA_STATUS, BTI_PAGE_OVF); in download_firmware_end_flow()
709 fw_ctrl = rtw_read16(rtwdev, REG_MCUFW_CTRL); in download_firmware_end_flow()
714 rtw_write16(rtwdev, REG_MCUFW_CTRL, fw_ctrl); in download_firmware_end_flow()
717 static int __rtw_download_firmware(struct rtw_dev *rtwdev, in __rtw_download_firmware() argument
729 if (!ltecoex_read_reg(rtwdev, 0x38, <ecoex_bckp)) in __rtw_download_firmware()
732 wlan_cpu_enable(rtwdev, false); in __rtw_download_firmware()
734 download_firmware_reg_backup(rtwdev, bckp); in __rtw_download_firmware()
735 download_firmware_reset_platform(rtwdev); in __rtw_download_firmware()
737 ret = start_download_firmware(rtwdev, data, size); in __rtw_download_firmware()
741 download_firmware_reg_restore(rtwdev, bckp, DLFW_RESTORE_REG_NUM); in __rtw_download_firmware()
743 download_firmware_end_flow(rtwdev); in __rtw_download_firmware()
745 wlan_cpu_enable(rtwdev, true); in __rtw_download_firmware()
747 if (!ltecoex_reg_write(rtwdev, 0x38, ltecoex_bckp)) in __rtw_download_firmware()
750 ret = download_firmware_validate(rtwdev); in __rtw_download_firmware()
755 rtw_hci_setup(rtwdev); in __rtw_download_firmware()
757 rtwdev->h2c.last_box_num = 0; in __rtw_download_firmware()
758 rtwdev->h2c.seq = 0; in __rtw_download_firmware()
760 set_bit(RTW_FLAG_FW_RUNNING, rtwdev->flags); in __rtw_download_firmware()
766 rtw_write8_clr(rtwdev, REG_MCUFW_CTRL, BIT_MCUFWDL_EN); in __rtw_download_firmware()
767 rtw_write8_set(rtwdev, REG_SYS_FUNC_EN + 1, BIT_FEN_CPUEN); in __rtw_download_firmware()
772 static void en_download_firmware_legacy(struct rtw_dev *rtwdev, bool en) in en_download_firmware_legacy() argument
777 wlan_cpu_enable(rtwdev, false); in en_download_firmware_legacy()
778 wlan_cpu_enable(rtwdev, true); in en_download_firmware_legacy()
780 rtw_write8_set(rtwdev, REG_MCUFW_CTRL, BIT_MCUFWDL_EN); in en_download_firmware_legacy()
783 if (rtw_read8(rtwdev, REG_MCUFW_CTRL) & BIT_MCUFWDL_EN) in en_download_firmware_legacy()
785 rtw_write8_set(rtwdev, REG_MCUFW_CTRL, BIT_MCUFWDL_EN); in en_download_firmware_legacy()
788 rtw_err(rtwdev, "failed to check fw download ready\n"); in en_download_firmware_legacy()
790 rtw_write32_clr(rtwdev, REG_MCUFW_CTRL, BIT_ROM_DLEN); in en_download_firmware_legacy()
792 rtw_write8_clr(rtwdev, REG_MCUFW_CTRL, BIT_MCUFWDL_EN); in en_download_firmware_legacy()
797 write_firmware_page(struct rtw_dev *rtwdev, u32 page, const u8 *data, u32 size) in write_firmware_page() argument
810 val32 = rtw_read32(rtwdev, REG_MCUFW_CTRL); in write_firmware_page()
813 rtw_write32(rtwdev, REG_MCUFW_CTRL, val32); in write_firmware_page()
816 rtw_write32(rtwdev, write_addr, le32_to_cpu(*ptr)); in write_firmware_page()
824 rtw_write32(rtwdev, write_addr, le32_to_cpu(remain_data)); in write_firmware_page()
829 download_firmware_legacy(struct rtw_dev *rtwdev, const u8 *data, u32 size) in download_firmware_legacy() argument
841 rtw_write8_set(rtwdev, REG_MCUFW_CTRL, BIT_FWDL_CHK_RPT); in download_firmware_legacy()
844 write_firmware_page(rtwdev, page, data, DLFW_PAGE_SIZE_LEGACY); in download_firmware_legacy()
848 write_firmware_page(rtwdev, page, data, last_page_size); in download_firmware_legacy()
850 if (!check_hw_ready(rtwdev, REG_MCUFW_CTRL, BIT_FWDL_CHK_RPT, 1)) { in download_firmware_legacy()
851 rtw_err(rtwdev, "failed to check download firmware report\n"); in download_firmware_legacy()
858 static int download_firmware_validate_legacy(struct rtw_dev *rtwdev) in download_firmware_validate_legacy() argument
863 val32 = rtw_read32(rtwdev, REG_MCUFW_CTRL); in download_firmware_validate_legacy()
866 rtw_write32(rtwdev, REG_MCUFW_CTRL, val32); in download_firmware_validate_legacy()
868 wlan_cpu_enable(rtwdev, false); in download_firmware_validate_legacy()
869 wlan_cpu_enable(rtwdev, true); in download_firmware_validate_legacy()
872 val32 = rtw_read32(rtwdev, REG_MCUFW_CTRL); in download_firmware_validate_legacy()
878 rtw_err(rtwdev, "failed to validate firmware\n"); in download_firmware_validate_legacy()
882 static int __rtw_download_firmware_legacy(struct rtw_dev *rtwdev, in __rtw_download_firmware_legacy() argument
887 en_download_firmware_legacy(rtwdev, true); in __rtw_download_firmware_legacy()
888 ret = download_firmware_legacy(rtwdev, fw->firmware->data, fw->firmware->size); in __rtw_download_firmware_legacy()
889 en_download_firmware_legacy(rtwdev, false); in __rtw_download_firmware_legacy()
893 ret = download_firmware_validate_legacy(rtwdev); in __rtw_download_firmware_legacy()
898 rtw_hci_setup(rtwdev); in __rtw_download_firmware_legacy()
900 rtwdev->h2c.last_box_num = 0; in __rtw_download_firmware_legacy()
901 rtwdev->h2c.seq = 0; in __rtw_download_firmware_legacy()
903 set_bit(RTW_FLAG_FW_RUNNING, rtwdev->flags); in __rtw_download_firmware_legacy()
909 int rtw_download_firmware(struct rtw_dev *rtwdev, struct rtw_fw_state *fw) in rtw_download_firmware() argument
911 if (rtw_chip_wcpu_11n(rtwdev)) in rtw_download_firmware()
912 return __rtw_download_firmware_legacy(rtwdev, fw); in rtw_download_firmware()
914 return __rtw_download_firmware(rtwdev, fw); in rtw_download_firmware()
917 static u32 get_priority_queues(struct rtw_dev *rtwdev, u32 queues) in get_priority_queues() argument
919 const struct rtw_rqpn *rqpn = rtwdev->fifo.rqpn; in get_priority_queues()
934 static void __rtw_mac_flush_prio_queue(struct rtw_dev *rtwdev, in __rtw_mac_flush_prio_queue() argument
937 struct rtw_chip_info *chip = rtwdev->chip; in __rtw_mac_flush_prio_queue()
951 rsvd_page = wsize ? rtw_read16(rtwdev, addr->rsvd) : in __rtw_mac_flush_prio_queue()
952 rtw_read8(rtwdev, addr->rsvd); in __rtw_mac_flush_prio_queue()
953 avail_page = wsize ? rtw_read16(rtwdev, addr->avail) : in __rtw_mac_flush_prio_queue()
954 rtw_read8(rtwdev, addr->avail); in __rtw_mac_flush_prio_queue()
968 rtw_warn(rtwdev, "timed out to flush queue %d\n", prio_queue); in __rtw_mac_flush_prio_queue()
971 static void rtw_mac_flush_prio_queues(struct rtw_dev *rtwdev, in rtw_mac_flush_prio_queues() argument
978 __rtw_mac_flush_prio_queue(rtwdev, q, drop); in rtw_mac_flush_prio_queues()
981 void rtw_mac_flush_queues(struct rtw_dev *rtwdev, u32 queues, bool drop) in rtw_mac_flush_queues() argument
989 if (queues == BIT(rtwdev->hw->queues) - 1 || !rtwdev->fifo.rqpn) in rtw_mac_flush_queues()
992 prio_queues = get_priority_queues(rtwdev, queues); in rtw_mac_flush_queues()
994 rtw_mac_flush_prio_queues(rtwdev, prio_queues, drop); in rtw_mac_flush_queues()
997 static int txdma_queue_mapping(struct rtw_dev *rtwdev) in txdma_queue_mapping() argument
999 struct rtw_chip_info *chip = rtwdev->chip; in txdma_queue_mapping()
1003 switch (rtw_hci_type(rtwdev)) { in txdma_queue_mapping()
1008 if (rtwdev->hci.bulkout_num == 2) in txdma_queue_mapping()
1010 else if (rtwdev->hci.bulkout_num == 3) in txdma_queue_mapping()
1012 else if (rtwdev->hci.bulkout_num == 4) in txdma_queue_mapping()
1021 rtwdev->fifo.rqpn = rqpn; in txdma_queue_mapping()
1028 rtw_write16(rtwdev, REG_TXDMA_PQ_MAP, txdma_pq_map); in txdma_queue_mapping()
1030 rtw_write8(rtwdev, REG_CR, 0); in txdma_queue_mapping()
1031 rtw_write8(rtwdev, REG_CR, MAC_TRX_ENABLE); in txdma_queue_mapping()
1032 if (rtw_chip_wcpu_11ac(rtwdev)) in txdma_queue_mapping()
1033 rtw_write32(rtwdev, REG_H2CQ_CSR, BIT_H2CQ_FULL); in txdma_queue_mapping()
1038 static int set_trx_fifo_info(struct rtw_dev *rtwdev) in set_trx_fifo_info() argument
1040 struct rtw_fifo_conf *fifo = &rtwdev->fifo; in set_trx_fifo_info()
1041 struct rtw_chip_info *chip = rtwdev->chip; in set_trx_fifo_info()
1048 if (rtw_chip_wcpu_11n(rtwdev)) in set_trx_fifo_info()
1066 if (rtw_chip_wcpu_11ac(rtwdev)) { in set_trx_fifo_info()
1084 rtw_err(rtwdev, "wrong rsvd driver address\n"); in set_trx_fifo_info()
1091 static int __priority_queue_cfg(struct rtw_dev *rtwdev, in __priority_queue_cfg() argument
1095 struct rtw_fifo_conf *fifo = &rtwdev->fifo; in __priority_queue_cfg()
1096 struct rtw_chip_info *chip = rtwdev->chip; in __priority_queue_cfg()
1098 rtw_write16(rtwdev, REG_FIFOPAGE_INFO_1, pg_tbl->hq_num); in __priority_queue_cfg()
1099 rtw_write16(rtwdev, REG_FIFOPAGE_INFO_2, pg_tbl->lq_num); in __priority_queue_cfg()
1100 rtw_write16(rtwdev, REG_FIFOPAGE_INFO_3, pg_tbl->nq_num); in __priority_queue_cfg()
1101 rtw_write16(rtwdev, REG_FIFOPAGE_INFO_4, pg_tbl->exq_num); in __priority_queue_cfg()
1102 rtw_write16(rtwdev, REG_FIFOPAGE_INFO_5, pubq_num); in __priority_queue_cfg()
1103 rtw_write32_set(rtwdev, REG_RQPN_CTRL_2, BIT_LD_RQPN); in __priority_queue_cfg()
1105 rtw_write16(rtwdev, REG_FIFOPAGE_CTRL_2, fifo->rsvd_boundary); in __priority_queue_cfg()
1106 rtw_write8_set(rtwdev, REG_FWHW_TXQ_CTRL + 2, BIT_EN_WR_FREE_TAIL >> 16); in __priority_queue_cfg()
1108 rtw_write16(rtwdev, REG_BCNQ_BDNY_V1, fifo->rsvd_boundary); in __priority_queue_cfg()
1109 rtw_write16(rtwdev, REG_FIFOPAGE_CTRL_2 + 2, fifo->rsvd_boundary); in __priority_queue_cfg()
1110 rtw_write16(rtwdev, REG_BCNQ1_BDNY_V1, fifo->rsvd_boundary); in __priority_queue_cfg()
1111 rtw_write32(rtwdev, REG_RXFF_BNDY, chip->rxff_size - C2H_PKT_BUF - 1); in __priority_queue_cfg()
1112 rtw_write8_set(rtwdev, REG_AUTO_LLT_V1, BIT_AUTO_INIT_LLT_V1); in __priority_queue_cfg()
1114 if (!check_hw_ready(rtwdev, REG_AUTO_LLT_V1, BIT_AUTO_INIT_LLT_V1, 0)) in __priority_queue_cfg()
1117 rtw_write8(rtwdev, REG_CR + 3, 0); in __priority_queue_cfg()
1122 static int __priority_queue_cfg_legacy(struct rtw_dev *rtwdev, in __priority_queue_cfg_legacy() argument
1126 struct rtw_fifo_conf *fifo = &rtwdev->fifo; in __priority_queue_cfg_legacy()
1127 struct rtw_chip_info *chip = rtwdev->chip; in __priority_queue_cfg_legacy()
1131 rtw_write32(rtwdev, REG_RQPN_NPQ, val32); in __priority_queue_cfg_legacy()
1133 rtw_write32(rtwdev, REG_RQPN, val32); in __priority_queue_cfg_legacy()
1135 rtw_write8(rtwdev, REG_TRXFF_BNDY, fifo->rsvd_boundary); in __priority_queue_cfg_legacy()
1136 rtw_write16(rtwdev, REG_TRXFF_BNDY + 2, chip->rxff_size - REPORT_BUF - 1); in __priority_queue_cfg_legacy()
1137 rtw_write8(rtwdev, REG_DWBCN0_CTRL + 1, fifo->rsvd_boundary); in __priority_queue_cfg_legacy()
1138 rtw_write8(rtwdev, REG_BCNQ_BDNY, fifo->rsvd_boundary); in __priority_queue_cfg_legacy()
1139 rtw_write8(rtwdev, REG_MGQ_BDNY, fifo->rsvd_boundary); in __priority_queue_cfg_legacy()
1140 rtw_write8(rtwdev, REG_WMAC_LBK_BF_HD, fifo->rsvd_boundary); in __priority_queue_cfg_legacy()
1142 rtw_write32_set(rtwdev, REG_AUTO_LLT, BIT_AUTO_INIT_LLT); in __priority_queue_cfg_legacy()
1144 if (!check_hw_ready(rtwdev, REG_AUTO_LLT, BIT_AUTO_INIT_LLT, 0)) in __priority_queue_cfg_legacy()
1150 static int priority_queue_cfg(struct rtw_dev *rtwdev) in priority_queue_cfg() argument
1152 struct rtw_fifo_conf *fifo = &rtwdev->fifo; in priority_queue_cfg()
1153 struct rtw_chip_info *chip = rtwdev->chip; in priority_queue_cfg()
1158 ret = set_trx_fifo_info(rtwdev); in priority_queue_cfg()
1162 switch (rtw_hci_type(rtwdev)) { in priority_queue_cfg()
1167 if (rtwdev->hci.bulkout_num == 2) in priority_queue_cfg()
1169 else if (rtwdev->hci.bulkout_num == 3) in priority_queue_cfg()
1171 else if (rtwdev->hci.bulkout_num == 4) in priority_queue_cfg()
1182 if (rtw_chip_wcpu_11n(rtwdev)) in priority_queue_cfg()
1183 return __priority_queue_cfg_legacy(rtwdev, pg_tbl, pubq_num); in priority_queue_cfg()
1185 return __priority_queue_cfg(rtwdev, pg_tbl, pubq_num); in priority_queue_cfg()
1188 static int init_h2c(struct rtw_dev *rtwdev) in init_h2c() argument
1190 struct rtw_fifo_conf *fifo = &rtwdev->fifo; in init_h2c()
1198 if (rtw_chip_wcpu_11n(rtwdev)) in init_h2c()
1204 value32 = rtw_read32(rtwdev, REG_H2C_HEAD); in init_h2c()
1206 rtw_write32(rtwdev, REG_H2C_HEAD, value32); in init_h2c()
1208 value32 = rtw_read32(rtwdev, REG_H2C_READ_ADDR); in init_h2c()
1210 rtw_write32(rtwdev, REG_H2C_READ_ADDR, value32); in init_h2c()
1212 value32 = rtw_read32(rtwdev, REG_H2C_TAIL); in init_h2c()
1215 rtw_write32(rtwdev, REG_H2C_TAIL, value32); in init_h2c()
1217 value8 = rtw_read8(rtwdev, REG_H2C_INFO); in init_h2c()
1219 rtw_write8(rtwdev, REG_H2C_INFO, value8); in init_h2c()
1221 value8 = rtw_read8(rtwdev, REG_H2C_INFO); in init_h2c()
1223 rtw_write8(rtwdev, REG_H2C_INFO, value8); in init_h2c()
1225 value8 = rtw_read8(rtwdev, REG_TXDMA_OFFSET_CHK + 1); in init_h2c()
1227 rtw_write8(rtwdev, REG_TXDMA_OFFSET_CHK + 1, value8); in init_h2c()
1229 wp = rtw_read32(rtwdev, REG_H2C_PKT_WRITEADDR) & 0x3FFFF; in init_h2c()
1230 rp = rtw_read32(rtwdev, REG_H2C_PKT_READADDR) & 0x3FFFF; in init_h2c()
1234 rtw_err(rtwdev, "H2C queue mismatch\n"); in init_h2c()
1241 static int rtw_init_trx_cfg(struct rtw_dev *rtwdev) in rtw_init_trx_cfg() argument
1245 ret = txdma_queue_mapping(rtwdev); in rtw_init_trx_cfg()
1249 ret = priority_queue_cfg(rtwdev); in rtw_init_trx_cfg()
1253 ret = init_h2c(rtwdev); in rtw_init_trx_cfg()
1260 static int rtw_drv_info_cfg(struct rtw_dev *rtwdev) in rtw_drv_info_cfg() argument
1264 rtw_write8(rtwdev, REG_RX_DRVINFO_SZ, PHY_STATUS_SIZE); in rtw_drv_info_cfg()
1265 if (rtw_chip_wcpu_11ac(rtwdev)) { in rtw_drv_info_cfg()
1266 value8 = rtw_read8(rtwdev, REG_TRXFF_BNDY + 1); in rtw_drv_info_cfg()
1270 rtw_write8(rtwdev, REG_TRXFF_BNDY + 1, value8); in rtw_drv_info_cfg()
1272 rtw_write32_set(rtwdev, REG_RCR, BIT_APP_PHYSTS); in rtw_drv_info_cfg()
1273 rtw_write32_clr(rtwdev, REG_WMAC_OPTION_FUNCTION + 4, BIT(8) | BIT(9)); in rtw_drv_info_cfg()
1278 int rtw_mac_init(struct rtw_dev *rtwdev) in rtw_mac_init() argument
1280 struct rtw_chip_info *chip = rtwdev->chip; in rtw_mac_init()
1283 ret = rtw_init_trx_cfg(rtwdev); in rtw_mac_init()
1287 ret = chip->ops->mac_init(rtwdev); in rtw_mac_init()
1291 ret = rtw_drv_info_cfg(rtwdev); in rtw_mac_init()
1295 rtw_hci_interface_cfg(rtwdev); in rtw_mac_init()