hc
2024-03-22 a0752693d998599af469473b8dc239ef973a012f
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
106
107
108
109
110
111
112
113
114
115
116
/******************************************************************************
 *
 * Copyright(c) 2019 Realtek Corporation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of version 2 of the GNU General Public License as
 * published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
 * more details.
 *
 ******************************************************************************/
 
#include "phy_misc.h"
 
u32 mac_fast_ch_sw(struct mac_ax_adapter *adapter, struct mac_ax_fast_ch_sw_param *fast_ch_sw_param)
{
   u8 *buf;
   u32 ret = MACSUCCESS;
   struct fwcmd_fcs *pkt;
   #if MAC_AX_PHL_H2C
   struct rtw_h2c_pkt *h2cbuf;
   #else
   struct h2c_buf *h2cbuf;
   #endif
 
   h2cbuf = h2cb_alloc(adapter, H2CB_CLASS_DATA);
   if (!h2cbuf)
       return MACNPTR;
 
   buf = h2cb_put(h2cbuf, sizeof(struct fwcmd_fcs));
   if (!buf) {
       PLTFM_MSG_ERR("[HM][H2C][FCS] ret = %d\n", MACNOBUF);
       return MACNOBUF;
   }
   pkt = (struct fwcmd_fcs *)buf;
   pkt->dword0 = cpu_to_le32(SET_WORD(fast_ch_sw_param->ap_port_id,
                      FWCMD_H2C_FCS_AP_PORT_ID) |
                 SET_WORD(fast_ch_sw_param->ch_idx,
                      FWCMD_H2C_FCS_CH_IDX) |
                 SET_WORD(fast_ch_sw_param->thermal_idx,
                      FWCMD_H2C_FCS_THERMAL_IDX) |
                 SET_WORD(fast_ch_sw_param->pause_rel_mode,
                      FWCMD_H2C_FCS_PAUSE_REL_MODE) |
                 SET_WORD(fast_ch_sw_param->con_sta_num,
                      FWCMD_H2C_FCS_CON_STA_NUM) |
                 (fast_ch_sw_param->band ? FWCMD_H2C_FCS_BAND : 0) |
                 SET_WORD(fast_ch_sw_param->bandwidth,
                      FWCMD_H2C_FCS_BANDWIDTH));
   pkt->dword1 = cpu_to_le32(SET_WORD(fast_ch_sw_param->pri_ch,
                      FWCMD_H2C_FCS_PRI_CH) |
                 SET_WORD(fast_ch_sw_param->central_ch,
                      FWCMD_H2C_FCS_CENTRAL_CH));
   pkt->dword2 = cpu_to_le32(fast_ch_sw_param->rel_pause_tsfl);
   pkt->dword3 = cpu_to_le32(fast_ch_sw_param->rel_pause_tsfh);
   pkt->dword4 = cpu_to_le32(fast_ch_sw_param->rel_pause_delay_time);
   pkt->dword5 = cpu_to_le32(SET_WORD(fast_ch_sw_param->csa_pkt_id[0],
                      FWCMD_H2C_FCS_CSA_PKT_ID0) |
                 SET_WORD(fast_ch_sw_param->csa_pkt_id[1],
                      FWCMD_H2C_FCS_CSA_PKT_ID1) |
                 SET_WORD(fast_ch_sw_param->csa_pkt_id[2],
                      FWCMD_H2C_FCS_CSA_PKT_ID2) |
                 SET_WORD(fast_ch_sw_param->csa_pkt_id[3],
                      FWCMD_H2C_FCS_CSA_PKT_ID3));
   ret = h2c_pkt_set_hdr(adapter, h2cbuf,
                 FWCMD_TYPE_H2C, FWCMD_H2C_CAT_MAC,
                 FWCMD_H2C_CL_FCS, FWCMD_H2C_FUNC_FCS, 1, 1);
   if (ret) {
       PLTFM_MSG_ERR("[HM][H2C][FCS] error when set hdr\n");
       return ret;
   }
 
   ret = h2c_pkt_build_txd(adapter, h2cbuf);
 
   if (ret) {
       PLTFM_MSG_ERR("[HM][H2C][FCS] error when build txd\n");
       return ret;
   }
 
   #if MAC_AX_PHL_H2C
   ret = PLTFM_TX(h2cbuf);
   #else
   ret = PLTFM_TX(h2cbuf->data, h2cbuf->len);
   #endif
 
   h2cb_free(adapter, h2cbuf);
 
   if (ret) {
       PLTFM_MSG_ERR("[HM][H2C][FCS] error when h2cb free\n");
       return ret;
   }
   h2c_end_flow(adapter);
   adapter->fast_ch_sw_info.busy = 1;
   if (ret) {
       PLTFM_MSG_ERR("[HM][H2C][FCS] error when h2c_end_flow\n");
       return ret;
   }
   PLTFM_MSG_TRACE("[HM][H2C][FCS] ret = %d\n", ret);
   return ret;
}
 
u32 mac_fast_ch_sw_done(struct mac_ax_adapter *adapter)
{
   if (adapter->fast_ch_sw_info.busy)
       return MACPROCBUSY;
   else
       return MACSUCCESS;
}
 
u32 mac_get_fast_ch_sw_rpt(struct mac_ax_adapter *adapter, u32 *fast_ch_sw_status_code)
{
   *fast_ch_sw_status_code = adapter->fast_ch_sw_info.status;
   return MACSUCCESS;
}