hc
2023-02-13 e440ec23c5a540cdd3f7464e8779219be6fd3d95
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
// SPDX-License-Identifier: GPL-2.0
/******************************************************************************
 *
 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
 *
 ******************************************************************************/
 
#include <pwrseqcmd.h>
#include <usb_ops_linux.h>
 
/* This routine deals with the Power Configuration CMDs parsing
 * for RTL8723/RTL8188E Series IC.
 */
u8 rtl88eu_pwrseqcmdparsing(struct adapter *padapter, u8 cut_vers,
               struct wl_pwr_cfg pwrseqcmd[])
{
   struct wl_pwr_cfg pwrcfgcmd;
   u8 poll_bit = false;
   u32 aryidx = 0;
   u8 value = 0;
   u32 offset = 0;
   u32 poll_count = 0; /*  polling autoload done. */
   u32 max_poll_count = 5000;
 
   do {
       pwrcfgcmd = pwrseqcmd[aryidx];
 
       RT_TRACE(_module_hal_init_c_, _drv_info_,
            ("rtl88eu_pwrseqcmdparsing: offset(%#x) cut_msk(%#x)"
             " cmd(%#x)"
             "msk(%#x) value(%#x)\n",
            GET_PWR_CFG_OFFSET(pwrcfgcmd),
            GET_PWR_CFG_CUT_MASK(pwrcfgcmd),
            GET_PWR_CFG_CMD(pwrcfgcmd),
            GET_PWR_CFG_MASK(pwrcfgcmd),
            GET_PWR_CFG_VALUE(pwrcfgcmd)));
 
       /* Only Handle the command whose CUT is matched */
       if (GET_PWR_CFG_CUT_MASK(pwrcfgcmd) & cut_vers) {
           switch (GET_PWR_CFG_CMD(pwrcfgcmd)) {
           case PWR_CMD_READ:
               RT_TRACE(_module_hal_init_c_, _drv_info_,
                    ("rtl88eu_pwrseqcmdparsing: PWR_CMD_READ\n"));
               break;
           case PWR_CMD_WRITE:
               RT_TRACE(_module_hal_init_c_, _drv_info_,
                    ("rtl88eu_pwrseqcmdparsing: PWR_CMD_WRITE\n"));
               offset = GET_PWR_CFG_OFFSET(pwrcfgcmd);
 
               /*  Read the value from system register */
               value = usb_read8(padapter, offset);
 
               value &= ~(GET_PWR_CFG_MASK(pwrcfgcmd));
               value |= (GET_PWR_CFG_VALUE(pwrcfgcmd) &
                     GET_PWR_CFG_MASK(pwrcfgcmd));
 
               /*  Write the value back to system register */
               usb_write8(padapter, offset, value);
               break;
           case PWR_CMD_POLLING:
               RT_TRACE(_module_hal_init_c_, _drv_info_,
                    ("rtl88eu_pwrseqcmdparsing: PWR_CMD_POLLING\n"));
 
               poll_bit = false;
               offset = GET_PWR_CFG_OFFSET(pwrcfgcmd);
               do {
                   value = usb_read8(padapter, offset);
                   value &= GET_PWR_CFG_MASK(pwrcfgcmd);
 
                   if (value == (GET_PWR_CFG_VALUE(pwrcfgcmd) &
                             GET_PWR_CFG_MASK(pwrcfgcmd)))
                       poll_bit = true;
                   else
                       udelay(10);
 
                   if (poll_count++ > max_poll_count) {
                       DBG_88E("Fail to polling Offset[%#x]\n", offset);
                       return false;
                   }
               } while (!poll_bit);
               break;
           case PWR_CMD_DELAY:
               RT_TRACE(_module_hal_init_c_, _drv_info_,
                    ("rtl88eu_pwrseqcmdparsing: PWR_CMD_DELAY\n"));
               if (GET_PWR_CFG_VALUE(pwrcfgcmd) == PWRSEQ_DELAY_US)
                   udelay(GET_PWR_CFG_OFFSET(pwrcfgcmd));
               else
                   udelay(GET_PWR_CFG_OFFSET(pwrcfgcmd)*1000);
               break;
           case PWR_CMD_END:
               /* When this command is parsed, end the process */
               RT_TRACE(_module_hal_init_c_, _drv_info_,
                    ("rtl88eu_pwrseqcmdparsing: PWR_CMD_END\n"));
               return true;
           default:
               RT_TRACE(_module_hal_init_c_, _drv_err_,
                    ("rtl88eu_pwrseqcmdparsing: Unknown CMD!!\n"));
               break;
           }
       }
 
       aryidx++;/* Add Array Index */
   } while (1);
   return true;
}