xref: /OK3568_Linux_fs/external/rkwifibt/drivers/rtl8852be/phl/phl_api_drv.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /******************************************************************************
2*4882a593Smuzhiyun  *
3*4882a593Smuzhiyun  * Copyright(c) 2019 Realtek Corporation.
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * This program is free software; you can redistribute it and/or modify it
6*4882a593Smuzhiyun  * under the terms of version 2 of the GNU General Public License as
7*4882a593Smuzhiyun  * published by the Free Software Foundation.
8*4882a593Smuzhiyun  *
9*4882a593Smuzhiyun  * This program is distributed in the hope that it will be useful, but WITHOUT
10*4882a593Smuzhiyun  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11*4882a593Smuzhiyun  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12*4882a593Smuzhiyun  * more details.
13*4882a593Smuzhiyun  *
14*4882a593Smuzhiyun  *****************************************************************************/
15*4882a593Smuzhiyun #define _PHL_API_DRV_C_
16*4882a593Smuzhiyun #include "phl_headers.h"
17*4882a593Smuzhiyun 
rtw_phl_get_txbd_buf(struct rtw_phl_com_t * phl_com)18*4882a593Smuzhiyun void *rtw_phl_get_txbd_buf(struct rtw_phl_com_t *phl_com)
19*4882a593Smuzhiyun {
20*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)phl_com->phl_priv;
21*4882a593Smuzhiyun 
22*4882a593Smuzhiyun 	return phl_info->hci_trx_ops->get_txbd_buf(phl_info);
23*4882a593Smuzhiyun }
24*4882a593Smuzhiyun 
rtw_phl_get_rxbd_buf(struct rtw_phl_com_t * phl_com)25*4882a593Smuzhiyun void *rtw_phl_get_rxbd_buf(struct rtw_phl_com_t *phl_com)
26*4882a593Smuzhiyun {
27*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)phl_com->phl_priv;
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun 	return phl_info->hci_trx_ops->get_rxbd_buf(phl_info);
30*4882a593Smuzhiyun }
31*4882a593Smuzhiyun 
rtw_phl_query_h2c_pkt(struct rtw_phl_com_t * phl_com,enum rtw_h2c_pkt_type type)32*4882a593Smuzhiyun struct rtw_h2c_pkt *rtw_phl_query_h2c_pkt(struct rtw_phl_com_t *phl_com,
33*4882a593Smuzhiyun 											enum rtw_h2c_pkt_type type)
34*4882a593Smuzhiyun {
35*4882a593Smuzhiyun 	struct rtw_h2c_pkt *h2c_pkt = NULL;
36*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)phl_com->phl_priv;
37*4882a593Smuzhiyun 
38*4882a593Smuzhiyun 	h2c_pkt = (struct rtw_h2c_pkt *)phl_query_idle_h2c_pkt(phl_info, type);
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun 	if (!h2c_pkt)
41*4882a593Smuzhiyun 		phl_dump_h2c_pool_stats(phl_info->h2c_pool);
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun 	return h2c_pkt;
44*4882a593Smuzhiyun }
45*4882a593Smuzhiyun 
rtw_phl_pltfm_tx(struct rtw_phl_com_t * phl_com,struct rtw_h2c_pkt * pkt)46*4882a593Smuzhiyun enum rtw_phl_status rtw_phl_pltfm_tx(struct rtw_phl_com_t *phl_com,
47*4882a593Smuzhiyun 										struct rtw_h2c_pkt *pkt)
48*4882a593Smuzhiyun {
49*4882a593Smuzhiyun 	enum rtw_phl_status pstatus = RTW_PHL_STATUS_FAILURE;
50*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)phl_com->phl_priv;
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun 	#ifdef CONFIG_PCI_HCI
53*4882a593Smuzhiyun 	struct phl_hci_trx_ops *hci_trx_ops = phl_info->hci_trx_ops;
54*4882a593Smuzhiyun 	hci_trx_ops->recycle_busy_h2c(phl_info);
55*4882a593Smuzhiyun 	#endif
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun 	pstatus = phl_info->hci_trx_ops->pltfm_tx(phl_info, pkt);
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun 	return pstatus;
60*4882a593Smuzhiyun }
61*4882a593Smuzhiyun 
rtw_phl_proc_cmd(void * phl,char proc_cmd,struct rtw_proc_cmd * incmd,char * output,u32 out_len)62*4882a593Smuzhiyun void rtw_phl_proc_cmd(void *phl, char proc_cmd,
63*4882a593Smuzhiyun 		      struct rtw_proc_cmd *incmd,
64*4882a593Smuzhiyun 		      char *output, u32 out_len)
65*4882a593Smuzhiyun {
66*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)phl;
67*4882a593Smuzhiyun 	struct hal_info_t *hal_info = (struct hal_info_t *)phl_info->hal;
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun 	if (RTW_PROC_CMD_PHL == proc_cmd)
70*4882a593Smuzhiyun 		rtw_phl_dbg_proc_cmd(phl_info, incmd, output, out_len);
71*4882a593Smuzhiyun 	else if (RTW_PROC_CMD_CORE == proc_cmd)
72*4882a593Smuzhiyun 		rtw_phl_dbg_core_cmd(phl_info, incmd, output, out_len);
73*4882a593Smuzhiyun 	else
74*4882a593Smuzhiyun 		rtw_hal_proc_cmd(hal_info, proc_cmd, incmd, output, out_len);
75*4882a593Smuzhiyun }
76*4882a593Smuzhiyun 
rtw_phl_get_fw_ver(void * phl,char * ver_str,u16 len)77*4882a593Smuzhiyun void rtw_phl_get_fw_ver(void *phl, char *ver_str, u16 len)
78*4882a593Smuzhiyun {
79*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)phl;
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun 	rtw_hal_get_fw_ver(phl_info->hal, ver_str, len);
82*4882a593Smuzhiyun }
83*4882a593Smuzhiyun 
rtw_phl_get_fw_status(void * phl)84*4882a593Smuzhiyun enum rtw_fw_status rtw_phl_get_fw_status(void *phl)
85*4882a593Smuzhiyun {
86*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)phl;
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun 	return rtw_hal_get_fw_status(phl_info->hal);
89*4882a593Smuzhiyun }
90*4882a593Smuzhiyun 
rtw_phl_msg_hub_hal_send(struct rtw_phl_com_t * phl_com,struct phl_msg_attribute * attr,struct phl_msg * msg)91*4882a593Smuzhiyun enum rtw_phl_status rtw_phl_msg_hub_hal_send(struct rtw_phl_com_t *phl_com,
92*4882a593Smuzhiyun 							struct phl_msg_attribute* attr, struct phl_msg* msg)
93*4882a593Smuzhiyun {
94*4882a593Smuzhiyun 	return phl_msg_hub_send((struct phl_info_t*)phl_com->phl_priv, attr, msg);
95*4882a593Smuzhiyun }
rtw_phl_test_txtb_cfg(struct rtw_phl_com_t * phl_com,void * buf,u32 buf_len,u8 * cfg_bssid,u16 cfg_aid,u8 cfg_bsscolor)96*4882a593Smuzhiyun void rtw_phl_test_txtb_cfg(struct rtw_phl_com_t* phl_com,
97*4882a593Smuzhiyun 	void *buf, u32 buf_len, u8 *cfg_bssid, u16 cfg_aid, u8 cfg_bsscolor)
98*4882a593Smuzhiyun {
99*4882a593Smuzhiyun 	/* Get parameters from MP UL */
100*4882a593Smuzhiyun 	u8 ui_bssid[6]={0x00, 0x09, 0x08, 0x07, 0x06, 0x05};
101*4882a593Smuzhiyun 	u16 ui_aid = 2;
102*4882a593Smuzhiyun 	u8 ui_bsscolor = 1;
103*4882a593Smuzhiyun 	u8 cfg;
104*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)phl_com->phl_priv;
105*4882a593Smuzhiyun 	struct rtw_wifi_role_t *role = &phl_com->wifi_roles[0];
106*4882a593Smuzhiyun 	struct rtw_phl_stainfo_t *sta = rtw_phl_get_stainfo_self(
107*4882a593Smuzhiyun 		phl_com->phl_priv, role);
108*4882a593Smuzhiyun 
109*4882a593Smuzhiyun 	cfg = (u8)*((u8 *)buf);
110*4882a593Smuzhiyun 	switch (cfg) {
111*4882a593Smuzhiyun 		case 0:
112*4882a593Smuzhiyun 			/* disable */
113*4882a593Smuzhiyun 			role->mstate = MLME_NO_LINK;
114*4882a593Smuzhiyun 			_os_mem_cpy(phlcom_to_drvpriv(phl_com), sta->mac_addr,
115*4882a593Smuzhiyun 				role->mac_addr, MAC_ALEN);
116*4882a593Smuzhiyun 			rtw_hal_update_sta_entry(phl_info->hal, sta, false);
117*4882a593Smuzhiyun 			rtw_hal_role_cfg(phl_info->hal, role);
118*4882a593Smuzhiyun 		break;
119*4882a593Smuzhiyun 
120*4882a593Smuzhiyun 		case 1:
121*4882a593Smuzhiyun 			role->mstate = MLME_LINKED;
122*4882a593Smuzhiyun 			_os_mem_cpy(phlcom_to_drvpriv(phl_com), sta->mac_addr,
123*4882a593Smuzhiyun 				cfg_bssid, MAC_ALEN);
124*4882a593Smuzhiyun 			sta->wmode = WLAN_MD_MAX;
125*4882a593Smuzhiyun 			sta->aid = cfg_aid;
126*4882a593Smuzhiyun 			sta->asoc_cap.bsscolor = cfg_bsscolor;
127*4882a593Smuzhiyun 			sta->asoc_cap.pkt_padding = 2;
128*4882a593Smuzhiyun 			rtw_hal_update_sta_entry(phl_info->hal, sta, false);
129*4882a593Smuzhiyun 			rtw_hal_role_cfg(phl_info->hal, role);
130*4882a593Smuzhiyun 		break;
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun 		case 2:
133*4882a593Smuzhiyun 			role->mstate = MLME_LINKED;
134*4882a593Smuzhiyun 			_os_mem_cpy(phlcom_to_drvpriv(phl_com), sta->mac_addr,
135*4882a593Smuzhiyun 				ui_bssid, MAC_ALEN);
136*4882a593Smuzhiyun 			sta->wmode = WLAN_MD_MAX;
137*4882a593Smuzhiyun 			sta->aid = ui_aid;
138*4882a593Smuzhiyun 			sta->asoc_cap.bsscolor = ui_bsscolor;
139*4882a593Smuzhiyun 			sta->asoc_cap.pkt_padding = 2;
140*4882a593Smuzhiyun 			rtw_hal_update_sta_entry(phl_info->hal, sta, false);
141*4882a593Smuzhiyun 			rtw_hal_role_cfg(phl_info->hal, role);
142*4882a593Smuzhiyun 		break;		default:
143*4882a593Smuzhiyun 		break;
144*4882a593Smuzhiyun 	}
145*4882a593Smuzhiyun }
146*4882a593Smuzhiyun 
rtw_phl_pkt_ofld_reset_all_entry(struct rtw_phl_com_t * phl_com)147*4882a593Smuzhiyun void rtw_phl_pkt_ofld_reset_all_entry(struct rtw_phl_com_t* phl_com)
148*4882a593Smuzhiyun {
149*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)phl_com->phl_priv;
150*4882a593Smuzhiyun 
151*4882a593Smuzhiyun 	phl_pkt_ofld_reset_all_entry(phl_info);
152*4882a593Smuzhiyun }
153*4882a593Smuzhiyun 
rtw_phl_dbg_dump_rx(void * phl,struct rtw_wifi_role_t * wrole)154*4882a593Smuzhiyun void rtw_phl_dbg_dump_rx(void *phl, struct rtw_wifi_role_t *wrole)
155*4882a593Smuzhiyun {
156*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)phl;
157*4882a593Smuzhiyun 
158*4882a593Smuzhiyun 	phl_rx_dbg_dump(phl_info, wrole->hw_band);
159*4882a593Smuzhiyun }
160*4882a593Smuzhiyun 
rtw_phl_get_phy_stat_info(void * phl,enum phl_band_idx hw_band,enum phl_stat_info_query phy_stat)161*4882a593Smuzhiyun u32 rtw_phl_get_phy_stat_info(void *phl, enum phl_band_idx hw_band,
162*4882a593Smuzhiyun 			      enum phl_stat_info_query phy_stat)
163*4882a593Smuzhiyun {
164*4882a593Smuzhiyun 	struct phl_info_t *phl_info = (struct phl_info_t *)phl;
165*4882a593Smuzhiyun 
166*4882a593Smuzhiyun 	return rtw_hal_get_phy_stat_info(phl_info->hal, hw_band, phy_stat);
167*4882a593Smuzhiyun }