1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright(c) 2007 - 2011 Realtek Corporation. */
4 #include "../include/rtw_iol.h"
6 struct xmit_frame *rtw_IOL_accquire_xmit_frame(struct adapter *adapter)
8 struct xmit_frame *xmit_frame;
9 struct xmit_buf *xmitbuf;
10 struct pkt_attrib *pattrib;
11 struct xmit_priv *pxmitpriv = &adapter->xmitpriv;
13 xmit_frame = rtw_alloc_xmitframe(pxmitpriv);
17 xmitbuf = rtw_alloc_xmitbuf(pxmitpriv);
19 rtw_free_xmitframe(pxmitpriv, xmit_frame);
23 xmit_frame->frame_tag = MGNT_FRAMETAG;
24 xmit_frame->pxmitbuf = xmitbuf;
25 xmit_frame->buf_addr = xmitbuf->pbuf;
26 xmitbuf->priv_data = xmit_frame;
28 pattrib = &xmit_frame->attrib;
29 update_mgntframe_attrib(adapter, pattrib);
30 pattrib->qsel = 0x10;/* Beacon */
31 pattrib->subtype = WIFI_BEACON;
33 pattrib->last_txcmdsz = 0;
38 int rtw_IOL_append_cmds(struct xmit_frame *xmit_frame, u8 *IOL_cmds, u32 cmd_len)
40 struct pkt_attrib *pattrib = &xmit_frame->attrib;
44 buf_offset = TXDESC_OFFSET;
45 ori_len = buf_offset + pattrib->pktlen;
47 /* check if the io_buf can accommodate new cmds */
48 if (ori_len + cmd_len + 8 > MAX_XMITBUF_SZ)
51 memcpy(xmit_frame->buf_addr + buf_offset + pattrib->pktlen, IOL_cmds, cmd_len);
52 pattrib->pktlen += cmd_len;
53 pattrib->last_txcmdsz += cmd_len;
58 bool rtw_IOL_applied(struct adapter *adapter)
60 if (1 == adapter->registrypriv.fw_iol)
63 if ((2 == adapter->registrypriv.fw_iol) &&
64 (adapter_to_dvobj(adapter)->pusbdev->speed != USB_SPEED_HIGH))
70 int _rtw_IOL_append_WB_cmd(struct xmit_frame *xmit_frame, u16 addr, u8 value, u8 mask)
72 struct ioreg_cfg cmd = {8, IOREG_CMD_WB_REG, 0x0, 0x0, 0x0};
74 cmd.address = cpu_to_le16(addr);
75 cmd.data = cpu_to_le32(value);
79 cmd.mask = cpu_to_le32(mask);
81 return rtw_IOL_append_cmds(xmit_frame, (u8 *)&cmd, cmd.length);
84 int _rtw_IOL_append_WW_cmd(struct xmit_frame *xmit_frame, u16 addr, u16 value, u16 mask)
86 struct ioreg_cfg cmd = {8, IOREG_CMD_WW_REG, 0x0, 0x0, 0x0};
88 cmd.address = cpu_to_le16(addr);
89 cmd.data = cpu_to_le32(value);
93 cmd.mask = cpu_to_le32(mask);
95 return rtw_IOL_append_cmds(xmit_frame, (u8 *)&cmd, cmd.length);
98 int _rtw_IOL_append_WD_cmd(struct xmit_frame *xmit_frame, u16 addr, u32 value, u32 mask)
100 struct ioreg_cfg cmd = {8, IOREG_CMD_WD_REG, 0x0, 0x0, 0x0};
102 cmd.address = cpu_to_le16(addr);
103 cmd.data = cpu_to_le32(value);
105 if (mask != 0xFFFFFFFF) {
107 cmd.mask = cpu_to_le32(mask);
109 return rtw_IOL_append_cmds(xmit_frame, (u8 *)&cmd, cmd.length);
112 int _rtw_IOL_append_WRF_cmd(struct xmit_frame *xmit_frame, u8 rf_path, u16 addr, u32 value, u32 mask)
114 struct ioreg_cfg cmd = {8, IOREG_CMD_W_RF, 0x0, 0x0, 0x0};
116 cmd.address = cpu_to_le16((rf_path << 8) | ((addr) & 0xFF));
117 cmd.data = cpu_to_le32(value);
119 if (mask != 0x000FFFFF) {
121 cmd.mask = cpu_to_le32(mask);
123 return rtw_IOL_append_cmds(xmit_frame, (u8 *)&cmd, cmd.length);
126 int rtw_IOL_append_DELAY_US_cmd(struct xmit_frame *xmit_frame, u16 us)
128 struct ioreg_cfg cmd = {4, IOREG_CMD_DELAY_US, 0x0, 0x0, 0x0};
129 cmd.address = cpu_to_le16(us);
131 return rtw_IOL_append_cmds(xmit_frame, (u8 *)&cmd, 4);
134 int rtw_IOL_append_DELAY_MS_cmd(struct xmit_frame *xmit_frame, u16 ms)
136 struct ioreg_cfg cmd = {4, IOREG_CMD_DELAY_US, 0x0, 0x0, 0x0};
138 cmd.address = cpu_to_le16(ms);
139 return rtw_IOL_append_cmds(xmit_frame, (u8 *)&cmd, 4);
142 int rtw_IOL_append_END_cmd(struct xmit_frame *xmit_frame)
144 struct ioreg_cfg cmd = {4, IOREG_CMD_END, cpu_to_le16(0xFFFF), cpu_to_le32(0xFF), 0x0};
146 return rtw_IOL_append_cmds(xmit_frame, (u8 *)&cmd, 4);
149 u8 rtw_IOL_cmd_boundary_handle(struct xmit_frame *pxmit_frame)
151 u8 is_cmd_bndy = false;
152 if (((pxmit_frame->attrib.pktlen + 32) % 256) + 8 >= 256) {
153 rtw_IOL_append_END_cmd(pxmit_frame);
154 pxmit_frame->attrib.pktlen = ((((pxmit_frame->attrib.pktlen + 32) / 256) + 1) * 256);
156 pxmit_frame->attrib.last_txcmdsz = pxmit_frame->attrib.pktlen;