static int rtw_mac_pre_system_cfg(struct rtw_dev *rtwdev)
 {
+       unsigned int retry;
        u32 value32;
        u8 value8;
 
        case RTW_HCI_TYPE_PCIE:
                rtw_write32_set(rtwdev, REG_HCI_OPT_CTRL, BIT_USB_SUS_DIS);
                break;
+       case RTW_HCI_TYPE_SDIO:
+               rtw_write8_clr(rtwdev, REG_SDIO_HSUS_CTRL, BIT_HCI_SUS_REQ);
+
+               for (retry = 0; retry < RTW_PWR_POLLING_CNT; retry++) {
+                       if (rtw_read8(rtwdev, REG_SDIO_HSUS_CTRL) & BIT_HCI_RESUME_RDY)
+                               break;
+
+                       usleep_range(10, 50);
+               }
+
+               if (retry == RTW_PWR_POLLING_CNT) {
+                       rtw_err(rtwdev, "failed to poll REG_SDIO_HSUS_CTRL[1]");
+                       return -ETIMEDOUT;
+               }
+
+               if (rtw_sdio_is_sdio30_supported(rtwdev))
+                       rtw_write8_set(rtwdev, REG_HCI_OPT_CTRL + 2,
+                                      BIT_SDIO_PAD_E5 >> 16);
+               else
+                       rtw_write8_clr(rtwdev, REG_HCI_OPT_CTRL + 2,
+                                      BIT_SDIO_PAD_E5 >> 16);
+               break;
        case RTW_HCI_TYPE_USB:
                break;
        default:
 {
        const struct rtw_chip_info *chip = rtwdev->chip;
        const struct rtw_pwr_seq_cmd **pwr_seq;
+       u32 imr = 0;
        u8 rpwm;
        bool cur_pwr;
        int ret;
        if (pwr_on == cur_pwr)
                return -EALREADY;
 
+       if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_SDIO) {
+               imr = rtw_read32(rtwdev, REG_SDIO_HIMR);
+               rtw_write32(rtwdev, REG_SDIO_HIMR, 0);
+       }
+
        if (!pwr_on)
                clear_bit(RTW_FLAG_POWERON, rtwdev->flags);
 
        pwr_seq = pwr_on ? chip->pwr_on_seq : chip->pwr_off_seq;
        ret = rtw_pwr_seq_parser(rtwdev, pwr_seq);
-       if (ret)
-               return ret;
 
-       if (pwr_on)
+       if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_SDIO)
+               rtw_write32(rtwdev, REG_SDIO_HIMR, imr);
+
+       if (!ret && pwr_on)
                set_bit(RTW_FLAG_POWERON, rtwdev->flags);
 
-       return 0;
+       return ret;
 }
 
 static int __rtw_mac_init_system_cfg(struct rtw_dev *rtwdev)
        rtw_write16(rtwdev, REG_FIFOPAGE_INFO_1, 0x200);
        rtw_write32(rtwdev, REG_RQPN_CTRL_2, bckp[bckp_idx - 1].val);
 
+       if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_SDIO)
+               rtw_read32(rtwdev, REG_SDIO_FREE_TXPG);
+
        /* Disable beacon related functions */
        tmp = rtw_read8(rtwdev, REG_BCN_CTRL);
        bckp[bckp_idx].len = 1;
        if (rtw_chip_wcpu_11ac(rtwdev))
                rtw_write32(rtwdev, REG_H2CQ_CSR, BIT_H2CQ_FULL);
 
-       if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_USB)
+       if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_SDIO) {
+               rtw_read32(rtwdev, REG_SDIO_FREE_TXPG);
+               rtw_write32(rtwdev, REG_SDIO_TX_CTRL, 0);
+       } else if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_USB) {
                rtw_write8_set(rtwdev, REG_TXDMA_PQ_MAP, BIT_RXDMA_ARBBW_EN);
+       }
 
        return 0;
 }