1 /******************************************************************************
2 *
3 * Copyright(c) 2015 - 2018 Realtek Corporation.
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 *****************************************************************************/
15 #define _RTL8822BS_HALMAC_C_
16
17 #include <drv_types.h> /* struct dvobj_priv and etc. */
18 #include <rtw_sdio.h> /* rtw_sdio_write_cmd53() */
19 #include "../../hal_halmac.h" /* struct halmac_adapter* and etc. */
20 #include "../rtl8822b.h" /* rtl8822b_get_tx_desc_size() */
21 #include "rtl8822bs.h" /* rtl8822bs_write_port() */
22
23
sdio_write_data_rsvd_page(void * d,u8 * pBuf,u32 size)24 static u8 sdio_write_data_rsvd_page(void *d, u8 *pBuf, u32 size)
25 {
26 struct dvobj_priv *drv;
27 struct halmac_adapter *halmac;
28 struct halmac_api *api;
29 u32 desclen, len;
30 u8 *buf;
31 u8 ret;
32
33
34 drv = (struct dvobj_priv *)d;
35 halmac = dvobj_to_halmac(drv);
36 api = HALMAC_GET_API(halmac);
37 desclen = rtl8822b_get_tx_desc_size(dvobj_get_primary_adapter(drv));
38 len = desclen + size;
39 buf = rtw_zmalloc(len);
40 if (!buf)
41 return 0;
42 _rtw_memcpy(buf + desclen, pBuf, size);
43
44 SET_TX_DESC_TXPKTSIZE_8822B(buf, size);
45 SET_TX_DESC_OFFSET_8822B(buf, desclen);
46 SET_TX_DESC_QSEL_8822B(buf, HALMAC_TXDESC_QSEL_BEACON);
47 api->halmac_fill_txdesc_checksum(halmac, buf);
48
49 ret = rtl8822bs_write_port(drv, len, buf);
50 if (_SUCCESS == ret)
51 ret = 1;
52 else
53 ret = 0;
54
55 rtw_mfree(buf, len);
56
57 return ret;
58 }
59
sdio_write_data_h2c(void * d,u8 * pBuf,u32 size)60 static u8 sdio_write_data_h2c(void *d, u8 *pBuf, u32 size)
61 {
62 struct dvobj_priv *drv;
63 struct halmac_adapter *halmac;
64 struct halmac_api *api;
65 u32 addr, desclen, len;
66 u8 *buf;
67 u8 ret;
68
69
70 drv = (struct dvobj_priv *)d;
71 halmac = dvobj_to_halmac(drv);
72 api = HALMAC_GET_API(halmac);
73 desclen = rtl8822b_get_tx_desc_size(dvobj_get_primary_adapter(drv));
74 len = desclen + size;
75 buf = rtw_zmalloc(len);
76 if (!buf)
77 return 0;
78 _rtw_memcpy(buf + desclen, pBuf, size);
79
80 SET_TX_DESC_TXPKTSIZE_8822B(buf, size);
81 SET_TX_DESC_QSEL_8822B(buf, HALMAC_TXDESC_QSEL_H2C_CMD);
82 api->halmac_fill_txdesc_checksum(halmac, buf);
83
84 ret = rtl8822bs_write_port(drv, len, buf);
85 if (_SUCCESS == ret)
86 ret = 1;
87 else
88 ret = 0;
89
90 rtw_mfree(buf, len);
91
92 return ret;
93 }
94
rtl8822bs_halmac_init_adapter(PADAPTER adapter)95 int rtl8822bs_halmac_init_adapter(PADAPTER adapter)
96 {
97 struct dvobj_priv *d;
98 struct halmac_platform_api *api;
99 int err;
100
101
102 d = adapter_to_dvobj(adapter);
103 api = &rtw_halmac_platform_api;
104 api->SEND_RSVD_PAGE = sdio_write_data_rsvd_page;
105 api->SEND_H2C_PKT = sdio_write_data_h2c;
106
107 err = rtw_halmac_init_adapter(d, api);
108
109 return err;
110 }
111