• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 _RTL8822CS_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 "../rtl8822c.h"	/* rtl8822c_get_tx_desc_size() */
21 #include "rtl8822cs.h"		/* rtl8822cs_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 = rtl8822c_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_8822C(buf, size);
45 	SET_TX_DESC_OFFSET_8822C(buf, desclen);
46 	SET_TX_DESC_QSEL_8822C(buf, HALMAC_TXDESC_QSEL_BEACON);
47 	api->halmac_fill_txdesc_checksum(halmac, buf);
48 
49 	ret = rtl8822cs_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 = rtl8822c_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_8822C(buf, size);
81 	SET_TX_DESC_QSEL_8822C(buf, HALMAC_TXDESC_QSEL_H2C_CMD);
82 	api->halmac_fill_txdesc_checksum(halmac, buf);
83 
84 	ret = rtl8822cs_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 
rtl8822cs_halmac_init_adapter(PADAPTER adapter)95 int rtl8822cs_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 #ifdef CONFIG_SDIO_TX_FORMAT_DUMMY_AUTO
110 	{
111 		int ret = 0;
112 		enum halmac_sdio_tx_format format;
113 		const char *const sdio_tx_format_str[] = {
114 			"SDIO_TX_FORMAT_UNKNOWN",
115 			"SDIO_TX_FORMAT_AGG",
116 			"SDIO_TX_FORMAT_DUMMY_BLOCK",
117 			"SDIO_TX_FORMAT_DUMMY_AUTO"
118 		};
119 
120 		if (MAX_XMITBUF_SZ > 32764)
121 			format = HALMAC_SDIO_DUMMY_AUTO_MODE;
122 		else
123 			format = HALMAC_SDIO_AGG_MODE;
124 
125 		RTW_INFO("MAX_XMITBUF_SZ = %d, switch to %s \n", MAX_XMITBUF_SZ, sdio_tx_format_str[format]);
126 
127 		ret = rtw_halmac_sdio_set_tx_format(d, format);
128 		if (ret == 0)
129 			RTW_INFO("Switch to %s ok !\n", sdio_tx_format_str[format]);
130 		else {
131 			RTW_INFO("Switch to %s fail !\n", sdio_tx_format_str[format]);
132 			rtw_warn_on(1);
133 		}
134 	}
135 #endif
136 
137 	return err;
138 }
139