xref: /OK3568_Linux_fs/kernel/drivers/net/wireless/rockchip_wlan/rtl8822be/hal/rtl8822b/pci/rtl8822be_halmac.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1 /******************************************************************************
2  *
3  * Copyright(c) 2015 - 2016 Realtek Corporation. All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or modify it
6  * under the terms of version 2 of the GNU General Public License as
7  * published by the Free Software Foundation.
8  *
9  * This program is distributed in the hope that it will be useful, but WITHOUT
10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12  * more details.
13  *
14  * You should have received a copy of the GNU General Public License along with
15  * this program; if not, write to the Free Software Foundation, Inc.,
16  * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
17  *
18  *
19  ******************************************************************************/
20 #define _RTL8822BE_HALMAC_C_
21 #include <drv_types.h>		/* struct dvobj_priv and etc. */
22 #include "../../hal_halmac.h"
23 
pci_write_data_rsvd_page(void * d,u8 * pBuf,u32 size)24 static u8 pci_write_data_rsvd_page(void *d, u8 *pBuf, u32 size)
25 {
26 	struct dvobj_priv *pobj = (struct dvobj_priv *)d;
27 	PADAPTER padapter = pobj->padapters[IFACE_ID0];
28 	PHALMAC_ADAPTER halmac = dvobj_to_halmac((struct dvobj_priv *)d);
29 	struct xmit_priv        *pxmitpriv = &padapter->xmitpriv;
30 	struct xmit_frame       *pcmdframe = NULL;
31 	struct pkt_attrib       *pattrib = NULL;
32 	PHALMAC_API api = HALMAC_GET_API(halmac);
33 	u8 desclen = 0;
34 	u8 *txdesc = NULL;
35 
36 
37         if (size + TXDESC_OFFSET > MAX_CMDBUF_SZ) {
38                 RTW_INFO("%s: total buffer size(%d) > MAX_CMDBUF_SZ(%d)\n"
39                          , __func__, size + TXDESC_OFFSET, MAX_CMDBUF_SZ);
40                 return _FALSE;
41         }
42 
43         pcmdframe = rtw_alloc_cmdxmitframe(pxmitpriv);
44 
45 	if (pcmdframe == NULL) {
46 		RTW_INFO("%s: alloc ReservedPagePacket fail!\n", __func__);
47 		return _FALSE;
48 	}
49 
50 	desclen = HALMAC_TX_DESC_SIZE_8822B;
51 	txdesc = pcmdframe->buf_addr;
52 
53 	_rtw_memcpy((txdesc + desclen), pBuf, size); /* shift desclen */
54 
55 	/* update attribute */
56 	pattrib = &pcmdframe->attrib;
57 	update_mgntframe_attrib(padapter, pattrib);
58 	pattrib->qsel = QSLT_BEACON;
59 	pattrib->pktlen = size;
60 	pattrib->last_txcmdsz = size;
61 
62 	dump_mgntframe(padapter, pcmdframe);
63 
64 	return _TRUE;
65 }
66 
pci_write_data_h2c(void * d,u8 * pBuf,u32 size)67 static u8 pci_write_data_h2c(void *d, u8 *pBuf, u32 size)
68 {
69 	struct dvobj_priv *pobj = (struct dvobj_priv *)d;
70 	PADAPTER padapter = pobj->padapters[IFACE_ID0];
71 	PHALMAC_ADAPTER halmac = dvobj_to_halmac((struct dvobj_priv *)d);
72 	struct xmit_priv        *pxmitpriv = &padapter->xmitpriv;
73 	struct xmit_frame       *pcmdframe = NULL;
74 	struct pkt_attrib       *pattrib = NULL;
75 	PHALMAC_API api;
76 	u32 desclen;
77 	u8 *buf;
78 
79         if (size + TXDESC_OFFSET > MAX_XMIT_EXTBUF_SZ) {
80                 RTW_INFO("%s: total buffer size(%d) > MAX_XMIT_EXTBUF_SZ(%d)\n"
81                          , __func__, size + TXDESC_OFFSET, MAX_XMIT_EXTBUF_SZ);
82                 return _FALSE;
83         }
84 
85 	pcmdframe = alloc_mgtxmitframe(pxmitpriv);
86 
87 	if (pcmdframe == NULL) {
88 		RTW_INFO("%s: alloc ReservedPagePacket fail!\n", __func__);
89 		return _FALSE;
90 	}
91 
92 	api = HALMAC_GET_API(halmac);
93 
94 	desclen = HALMAC_TX_DESC_SIZE_8822B;
95 	buf = pcmdframe->buf_addr;
96 	_rtw_memset(buf, 0, TXDESC_SIZE);
97 	_rtw_memcpy(buf + desclen, pBuf, size); /* shift desclen */
98 
99 	SET_TX_DESC_TXPKTSIZE_8822B(buf, size);
100 	SET_TX_DESC_OFFSET_8822B(buf, 0);
101 	SET_TX_DESC_QSEL_8822B(buf, HALMAC_QUEUE_SELECT_CMD);
102 	SET_TX_DESC_TXDESC_CHECKSUM_8822B(buf, 0);
103 	api->halmac_fill_txdesc_checksum(halmac, buf);
104 
105 	/* update attribute */
106 	pattrib = &pcmdframe->attrib;
107 	update_mgntframe_attrib(padapter, pattrib);
108 	pattrib->qsel = QSLT_CMD;
109 	pattrib->pktlen = size;
110 	pattrib->last_txcmdsz = size;
111 
112 	/* fill tx desc in dump_mgntframe */
113 	dump_mgntframe(padapter, pcmdframe);
114 
115 	return _TRUE;
116 }
117 
rtl8822be_halmac_init_adapter(PADAPTER padapter)118 int rtl8822be_halmac_init_adapter(PADAPTER padapter)
119 {
120 	struct dvobj_priv *d;
121 	PHALMAC_PLATFORM_API api;
122 	int err;
123 
124 	d = adapter_to_dvobj(padapter);
125 	api = &rtw_halmac_platform_api;
126 	api->SEND_RSVD_PAGE = pci_write_data_rsvd_page;
127 	api->SEND_H2C_PKT = pci_write_data_h2c;
128 
129 	err = rtw_halmac_init_adapter(d, api);
130 
131 	return err;
132 }
133