linux/drivers/staging/rtlwifi/halmac/halmac_88xx/halmac_8822b/halmac_api_8822b_sdio.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/******************************************************************************
   3 *
   4 * Copyright(c) 2016  Realtek Corporation.
   5 *
   6 * Contact Information:
   7 * wlanfae <wlanfae@realtek.com>
   8 * Realtek Corporation, No. 2, Innovation Road II, Hsinchu Science Park,
   9 * Hsinchu 300, Taiwan.
  10 *
  11 * Larry Finger <Larry.Finger@lwfinger.net>
  12 *
  13 *****************************************************************************/
  14#include "halmac_8822b_cfg.h"
  15
  16/**
  17 * halmac_mac_power_switch_8822b_sdio() - switch mac power
  18 * @halmac_adapter : the adapter of halmac
  19 * @halmac_power : power state
  20 * Author : KaiYuan Chang/Ivan Lin
  21 * Return : enum halmac_ret_status
  22 * More details of status code can be found in prototype document
  23 */
  24enum halmac_ret_status
  25halmac_mac_power_switch_8822b_sdio(struct halmac_adapter *halmac_adapter,
  26                                   enum halmac_mac_power halmac_power)
  27{
  28        u8 interface_mask;
  29        u8 value8;
  30        u8 rpwm;
  31        u32 imr_backup;
  32        void *driver_adapter = NULL;
  33        struct halmac_api *halmac_api;
  34
  35        if (halmac_adapter_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
  36                return HALMAC_RET_ADAPTER_INVALID;
  37
  38        if (halmac_api_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
  39                return HALMAC_RET_API_INVALID;
  40
  41        driver_adapter = halmac_adapter->driver_adapter;
  42        halmac_api = (struct halmac_api *)halmac_adapter->halmac_api;
  43
  44        HALMAC_RT_TRACE(
  45                driver_adapter, HALMAC_MSG_PWR, DBG_DMESG,
  46                "[TRACE]halmac_mac_power_switch_88xx_sdio==========>\n");
  47        HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_PWR, DBG_DMESG,
  48                        "[TRACE]halmac_power = %x ==========>\n", halmac_power);
  49        HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_PWR, DBG_DMESG,
  50                        "[TRACE]8822B pwr seq ver = %s\n",
  51                        HALMAC_8822B_PWR_SEQ_VER);
  52
  53        interface_mask = HALMAC_PWR_INTF_SDIO_MSK;
  54
  55        halmac_adapter->rpwm_record =
  56                HALMAC_REG_READ_8(halmac_adapter, REG_SDIO_HRPWM1);
  57
  58        /* Check FW still exist or not */
  59        if (HALMAC_REG_READ_16(halmac_adapter, REG_MCUFW_CTRL) == 0xC078) {
  60                /* Leave 32K */
  61                rpwm = (u8)((halmac_adapter->rpwm_record ^ BIT(7)) & 0x80);
  62                HALMAC_REG_WRITE_8(halmac_adapter, REG_SDIO_HRPWM1, rpwm);
  63        }
  64
  65        value8 = HALMAC_REG_READ_8(halmac_adapter, REG_CR);
  66        if (value8 == 0xEA)
  67                halmac_adapter->halmac_state.mac_power = HALMAC_MAC_POWER_OFF;
  68        else
  69                halmac_adapter->halmac_state.mac_power = HALMAC_MAC_POWER_ON;
  70
  71        /*Check if power switch is needed*/
  72        if (halmac_power == HALMAC_MAC_POWER_ON &&
  73            halmac_adapter->halmac_state.mac_power == HALMAC_MAC_POWER_ON) {
  74                HALMAC_RT_TRACE(
  75                        driver_adapter, HALMAC_MSG_PWR, DBG_WARNING,
  76                        "[WARN]halmac_mac_power_switch power state unchange!\n");
  77                return HALMAC_RET_PWR_UNCHANGE;
  78        }
  79
  80        imr_backup = HALMAC_REG_READ_32(halmac_adapter, REG_SDIO_HIMR);
  81        HALMAC_REG_WRITE_32(halmac_adapter, REG_SDIO_HIMR, 0);
  82
  83        if (halmac_power == HALMAC_MAC_POWER_OFF) {
  84                if (halmac_pwr_seq_parser_88xx(
  85                            halmac_adapter, HALMAC_PWR_CUT_ALL_MSK,
  86                            HALMAC_PWR_FAB_TSMC_MSK, interface_mask,
  87                            halmac_8822b_card_disable_flow) !=
  88                    HALMAC_RET_SUCCESS) {
  89                        pr_err("[ERR]Handle power off cmd error\n");
  90                        HALMAC_REG_WRITE_32(halmac_adapter, REG_SDIO_HIMR,
  91                                            imr_backup);
  92                        return HALMAC_RET_POWER_OFF_FAIL;
  93                }
  94
  95                halmac_adapter->halmac_state.mac_power = HALMAC_MAC_POWER_OFF;
  96                halmac_adapter->halmac_state.ps_state =
  97                        HALMAC_PS_STATE_UNDEFINE;
  98                halmac_adapter->halmac_state.dlfw_state = HALMAC_DLFW_NONE;
  99                halmac_init_adapter_dynamic_para_88xx(halmac_adapter);
 100        } else {
 101                if (halmac_pwr_seq_parser_88xx(
 102                            halmac_adapter, HALMAC_PWR_CUT_ALL_MSK,
 103                            HALMAC_PWR_FAB_TSMC_MSK, interface_mask,
 104                            halmac_8822b_card_enable_flow) !=
 105                    HALMAC_RET_SUCCESS) {
 106                        pr_err("[ERR]Handle power on cmd error\n");
 107                        HALMAC_REG_WRITE_32(halmac_adapter, REG_SDIO_HIMR,
 108                                            imr_backup);
 109                        return HALMAC_RET_POWER_ON_FAIL;
 110                }
 111
 112                halmac_adapter->halmac_state.mac_power = HALMAC_MAC_POWER_ON;
 113                halmac_adapter->halmac_state.ps_state = HALMAC_PS_STATE_ACT;
 114        }
 115
 116        HALMAC_REG_WRITE_32(halmac_adapter, REG_SDIO_HIMR, imr_backup);
 117
 118        HALMAC_RT_TRACE(
 119                driver_adapter, HALMAC_MSG_PWR, DBG_DMESG,
 120                "[TRACE]halmac_mac_power_switch_88xx_sdio <==========\n");
 121
 122        return HALMAC_RET_SUCCESS;
 123}
 124
 125/**
 126 * halmac_phy_cfg_8822b_sdio() - phy config
 127 * @halmac_adapter : the adapter of halmac
 128 * Author : KaiYuan Chang
 129 * Return : enum halmac_ret_status
 130 * More details of status code can be found in prototype document
 131 */
 132enum halmac_ret_status
 133halmac_phy_cfg_8822b_sdio(struct halmac_adapter *halmac_adapter,
 134                          enum halmac_intf_phy_platform platform)
 135{
 136        void *driver_adapter = NULL;
 137        struct halmac_api *halmac_api;
 138
 139        if (halmac_adapter_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
 140                return HALMAC_RET_ADAPTER_INVALID;
 141
 142        if (halmac_api_validate(halmac_adapter) != HALMAC_RET_SUCCESS)
 143                return HALMAC_RET_API_INVALID;
 144
 145        halmac_api_record_id_88xx(halmac_adapter, HALMAC_API_PHY_CFG);
 146
 147        driver_adapter = halmac_adapter->driver_adapter;
 148        halmac_api = (struct halmac_api *)halmac_adapter->halmac_api;
 149
 150        HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_PWR, DBG_DMESG,
 151                        "halmac_phy_cfg ==========>\n");
 152
 153        HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_PWR, DBG_DMESG,
 154                        "sdio no phy\n");
 155
 156        HALMAC_RT_TRACE(driver_adapter, HALMAC_MSG_PWR, DBG_DMESG,
 157                        "halmac_phy_cfg <==========\n");
 158
 159        return HALMAC_RET_SUCCESS;
 160}
 161
 162/**
 163 * halmac_interface_integration_tuning_8822b_sdio() - sdio interface fine tuning
 164 * @halmac_adapter : the adapter of halmac
 165 * Author : Ivan
 166 * Return : enum halmac_ret_status
 167 * More details of status code can be found in prototype document
 168 */
 169enum halmac_ret_status halmac_interface_integration_tuning_8822b_sdio(
 170        struct halmac_adapter *halmac_adapter)
 171{
 172        return HALMAC_RET_SUCCESS;
 173}
 174