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