1 /******************************************************************************
3 * Copyright(c) 2007 - 2011 Realtek Corporation. All rights reserved.
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.
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
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
19 ******************************************************************************/
21 #include <drv_types.h>
24 struct xmit_frame *rtw_IOL_accquire_xmit_frame(ADAPTER *adapter)
26 struct xmit_frame *xmit_frame;
27 struct xmit_buf *xmitbuf;
28 struct pkt_attrib *pattrib;
29 struct xmit_priv *pxmitpriv = &(adapter->xmitpriv);
32 if ((xmit_frame = rtw_alloc_xmitframe(pxmitpriv)) == NULL)
34 DBG_871X("%s rtw_alloc_xmitframe return null\n", __FUNCTION__);
38 if ((xmitbuf = rtw_alloc_xmitbuf(pxmitpriv)) == NULL)
40 DBG_871X("%s rtw_alloc_xmitbuf return null\n", __FUNCTION__);
41 rtw_free_xmitframe(pxmitpriv, xmit_frame);
46 xmit_frame->frame_tag = MGNT_FRAMETAG;
47 xmit_frame->pxmitbuf = xmitbuf;
48 xmit_frame->buf_addr = xmitbuf->pbuf;
49 xmitbuf->priv_data = xmit_frame;
51 pattrib = &xmit_frame->attrib;
52 update_mgntframe_attrib(adapter, pattrib);
53 pattrib->qsel = QSLT_BEACON;//Beacon
54 pattrib->subtype = WIFI_BEACON;
55 pattrib->pktlen = pattrib->last_txcmdsz = 0;
58 if ((xmit_frame = alloc_mgtxmitframe(pxmitpriv)) == NULL)
60 DBG_871X("%s alloc_mgtxmitframe return null\n", __FUNCTION__);
63 pattrib = &xmit_frame->attrib;
64 update_mgntframe_attrib(adapter, pattrib);
65 pattrib->qsel = QSLT_BEACON;
66 pattrib->pktlen = pattrib->last_txcmdsz = 0;
75 int rtw_IOL_append_cmds(struct xmit_frame *xmit_frame, u8 *IOL_cmds, u32 cmd_len)
77 struct pkt_attrib *pattrib = &xmit_frame->attrib;
81 buf_offset = TXDESC_OFFSET;
82 ori_len = buf_offset+pattrib->pktlen;
84 //check if the io_buf can accommodate new cmds
85 if(ori_len + cmd_len + 8 > MAX_XMITBUF_SZ) {
86 DBG_871X("%s %u is large than MAX_XMITBUF_SZ:%u, can't accommodate new cmds\n", __FUNCTION__
87 , ori_len + cmd_len + 8, MAX_XMITBUF_SZ);
91 _rtw_memcpy(xmit_frame->buf_addr + buf_offset + pattrib->pktlen, IOL_cmds, cmd_len);
92 pattrib->pktlen += cmd_len;
93 pattrib->last_txcmdsz += cmd_len;
95 //DBG_871X("%s ori:%u + cmd_len:%u = %u\n", __FUNCTION__, ori_len, cmd_len, buf_offset+pattrib->pktlen);
100 bool rtw_IOL_applied(ADAPTER *adapter)
102 if(1 == adapter->registrypriv.fw_iol)
105 #ifdef CONFIG_USB_HCI
106 if((2 == adapter->registrypriv.fw_iol) && (IS_FULL_SPEED_USB(adapter)))
113 int rtw_IOL_exec_cmds_sync(ADAPTER *adapter, struct xmit_frame *xmit_frame, u32 max_wating_ms, u32 bndy_cnt)
115 return rtw_hal_iol_cmd(adapter, xmit_frame, max_wating_ms,bndy_cnt);
118 #ifdef CONFIG_IOL_NEW_GENERATION
119 int rtw_IOL_append_LLT_cmd(struct xmit_frame *xmit_frame, u8 page_boundary)
123 int _rtw_IOL_append_WB_cmd(struct xmit_frame *xmit_frame, u16 addr, u8 value, u8 mask)
125 struct ioreg_cfg cmd = {8,IOREG_CMD_WB_REG,0x0, 0x0,0x0};
127 //RTW_PUT_LE16((u8*)&cmd.address, addr);
128 //RTW_PUT_LE32((u8*)&cmd.value, (u32)value);
129 cmd.address = cpu_to_le16(addr);
130 cmd.data = cpu_to_le32(value);
135 //RTW_PUT_LE32((u8*)&cmd.mask, (u32)mask);
136 cmd.mask = cpu_to_le32(mask);
139 //DBG_871X("%s addr:0x%04x,value:0x%08x,mask:0x%08x\n", __FUNCTION__, addr,value,mask);
141 return rtw_IOL_append_cmds(xmit_frame, (u8*)&cmd, cmd.length);
144 int _rtw_IOL_append_WW_cmd(struct xmit_frame *xmit_frame, u16 addr, u16 value, u16 mask)
146 struct ioreg_cfg cmd = {8,IOREG_CMD_WW_REG,0x0, 0x0,0x0};
148 //RTW_PUT_LE16((u8*)&cmd.address, addr);
149 //RTW_PUT_LE32((u8*)&cmd.value, (u32)value);
150 cmd.address = cpu_to_le16(addr);
151 cmd.data = cpu_to_le32(value);
156 //RTW_PUT_LE32((u8*)&cmd.mask, (u32)mask);
157 cmd.mask = cpu_to_le32(mask);
160 //DBG_871X("%s addr:0x%04x,value:0x%08x,mask:0x%08x\n", __FUNCTION__, addr,value,mask);
162 return rtw_IOL_append_cmds(xmit_frame, (u8*)&cmd, cmd.length);
165 int _rtw_IOL_append_WD_cmd(struct xmit_frame *xmit_frame, u16 addr, u32 value, u32 mask)
167 struct ioreg_cfg cmd = {8,IOREG_CMD_WD_REG,0x0, 0x0,0x0};
169 //RTW_PUT_LE16((u8*)&cmd.address, addr);
170 //RTW_PUT_LE32((u8*)&cmd.value, (u32)value);
171 cmd.address = cpu_to_le16(addr);
172 cmd.data = cpu_to_le32(value);
177 //RTW_PUT_LE32((u8*)&cmd.mask, (u32)mask);
178 cmd.mask = cpu_to_le32(mask);
181 //DBG_871X("%s addr:0x%04x,value:0x%08x,mask:0x%08x\n", __FU2NCTION__, addr,value,mask);
183 return rtw_IOL_append_cmds(xmit_frame, (u8*)&cmd, cmd.length);
187 int _rtw_IOL_append_WRF_cmd(struct xmit_frame *xmit_frame, u8 rf_path, u16 addr, u32 value, u32 mask)
189 struct ioreg_cfg cmd = {8,IOREG_CMD_W_RF,0x0, 0x0,0x0};
191 //RTW_PUT_LE16((u8*)&cmd.address, addr);
192 //RTW_PUT_LE32((u8*)&cmd.value, (u32)value);
193 cmd.address = (rf_path<<8) |((addr) &0xFF);
194 cmd.data = cpu_to_le32(value);
199 //RTW_PUT_LE32((u8*)&cmd.mask, (u32)mask);
200 cmd.mask = cpu_to_le32(mask);
203 //DBG_871X("%s rf_path:0x%02x addr:0x%04x,value:0x%08x,mask:0x%08x\n", __FU2NCTION__,rf_path, addr,value,mask);
205 return rtw_IOL_append_cmds(xmit_frame, (u8*)&cmd, cmd.length);
211 int rtw_IOL_append_DELAY_US_cmd(struct xmit_frame *xmit_frame, u16 us)
213 struct ioreg_cfg cmd = {4,IOREG_CMD_DELAY_US,0x0, 0x0,0x0};
214 //RTW_PUT_LE16((u8*)&cmd.address, us);
215 cmd.address = cpu_to_le16(us);
217 //DBG_871X("%s %u\n", __FUNCTION__, us);
218 return rtw_IOL_append_cmds(xmit_frame, (u8*)&cmd, 4);
221 int rtw_IOL_append_DELAY_MS_cmd(struct xmit_frame *xmit_frame, u16 ms)
223 struct ioreg_cfg cmd = {4,IOREG_CMD_DELAY_US,0x0, 0x0,0x0};
225 //RTW_PUT_LE16((u8*)&cmd.address, ms);
226 cmd.address = cpu_to_le16(ms);
228 //DBG_871X("%s %u\n", __FUNCTION__, ms);
229 return rtw_IOL_append_cmds(xmit_frame, (u8*)&cmd, 4);
231 int rtw_IOL_append_END_cmd(struct xmit_frame *xmit_frame)
233 struct ioreg_cfg cmd = {4,IOREG_CMD_END,0xFFFF, 0xFF,0x0};
234 return rtw_IOL_append_cmds(xmit_frame, (u8*)&cmd, 4);
238 u8 rtw_IOL_cmd_boundary_handle(struct xmit_frame *pxmit_frame)
240 u8 is_cmd_bndy = _FALSE;
241 if(((pxmit_frame->attrib.pktlen+32)%256) + 8 >= 256){
242 rtw_IOL_append_END_cmd(pxmit_frame);
243 pxmit_frame->attrib.pktlen = ((((pxmit_frame->attrib.pktlen+32)/256)+1)*256 );
245 //printk("==> %s, pktlen(%d)\n",__FUNCTION__,pxmit_frame->attrib.pktlen);
246 pxmit_frame->attrib.last_txcmdsz = pxmit_frame->attrib.pktlen;
252 void rtw_IOL_cmd_buf_dump(ADAPTER *Adapter,int buf_len,u8 *pbuf)
257 printk("###### %s ######\n",__FUNCTION__);
258 for(i=0;i< buf_len;i++){
259 printk("%02x-",*(pbuf+i));
261 if(j%32 ==0) printk("\n");j++;
264 printk("============= ioreg_cmd len = %d =============== \n",buf_len);
268 #else //CONFIG_IOL_NEW_GENERATION
269 int rtw_IOL_append_LLT_cmd(struct xmit_frame *xmit_frame, u8 page_boundary)
271 IOL_CMD cmd = {0x0, IOL_CMD_LLT, 0x0, 0x0};
273 RTW_PUT_BE32((u8*)&cmd.value, (u32)page_boundary);
275 return rtw_IOL_append_cmds(xmit_frame, (u8*)&cmd, 8);
278 int _rtw_IOL_append_WB_cmd(struct xmit_frame *xmit_frame, u16 addr, u8 value)
280 IOL_CMD cmd = {0x0, IOL_CMD_WB_REG, 0x0, 0x0};
282 RTW_PUT_BE16((u8*)&cmd.address, (u16)addr);
283 RTW_PUT_BE32((u8*)&cmd.value, (u32)value);
285 return rtw_IOL_append_cmds(xmit_frame, (u8*)&cmd, 8);
288 int _rtw_IOL_append_WW_cmd(struct xmit_frame *xmit_frame, u16 addr, u16 value)
290 IOL_CMD cmd = {0x0, IOL_CMD_WW_REG, 0x0, 0x0};
292 RTW_PUT_BE16((u8*)&cmd.address, (u16)addr);
293 RTW_PUT_BE32((u8*)&cmd.value, (u32)value);
295 return rtw_IOL_append_cmds(xmit_frame, (u8*)&cmd, 8);
298 int _rtw_IOL_append_WD_cmd(struct xmit_frame *xmit_frame, u16 addr, u32 value)
300 IOL_CMD cmd = {0x0, IOL_CMD_WD_REG, 0x0, 0x0};
301 u8* pos = (u8 *)&cmd;
303 RTW_PUT_BE16((u8*)&cmd.address, (u16)addr);
304 RTW_PUT_BE32((u8*)&cmd.value, (u32)value);
306 return rtw_IOL_append_cmds(xmit_frame, (u8*)&cmd, 8);
310 int dbg_rtw_IOL_append_WB_cmd(struct xmit_frame *xmit_frame, u16 addr, u8 value, const char *caller, const int line)
312 if (match_write_sniff_ranges(addr, 1))
313 DBG_871X("DBG_IO %s:%d IOL_WB(0x%04x, 0x%02x)\n", caller, line, addr, value);
315 return _rtw_IOL_append_WB_cmd(xmit_frame, addr, value);
318 int dbg_rtw_IOL_append_WW_cmd(struct xmit_frame *xmit_frame, u16 addr, u16 value, const char *caller, const int line)
320 if (match_write_sniff_ranges(addr, 2))
321 DBG_871X("DBG_IO %s:%d IOL_WW(0x%04x, 0x%04x)\n", caller, line, addr, value);
323 return _rtw_IOL_append_WW_cmd(xmit_frame, addr, value);
326 int dbg_rtw_IOL_append_WD_cmd(struct xmit_frame *xmit_frame, u16 addr, u32 value, const char *caller, const int line)
328 if (match_write_sniff_ranges(addr, 4))
329 DBG_871X("DBG_IO %s:%d IOL_WD(0x%04x, 0x%08x)\n", caller, line, addr, value);
331 return _rtw_IOL_append_WD_cmd(xmit_frame, addr, value);
335 int rtw_IOL_append_DELAY_US_cmd(struct xmit_frame *xmit_frame, u16 us)
337 IOL_CMD cmd = {0x0, IOL_CMD_DELAY_US, 0x0, 0x0};
339 RTW_PUT_BE32((u8*)&cmd.value, (u32)us);
341 //DBG_871X("%s %u\n", __FUNCTION__, us);
343 return rtw_IOL_append_cmds(xmit_frame, (u8*)&cmd, 8);
346 int rtw_IOL_append_DELAY_MS_cmd(struct xmit_frame *xmit_frame, u16 ms)
348 IOL_CMD cmd = {0x0, IOL_CMD_DELAY_MS, 0x0, 0x0};
350 RTW_PUT_BE32((u8*)&cmd.value, (u32)ms);
352 //DBG_871X("%s %u\n", __FUNCTION__, ms);
354 return rtw_IOL_append_cmds(xmit_frame, (u8*)&cmd, 8);
357 int rtw_IOL_append_END_cmd(struct xmit_frame *xmit_frame)
359 IOL_CMD end_cmd = {0x0, IOL_CMD_END, 0x0, 0x0};
362 return rtw_IOL_append_cmds(xmit_frame, (u8*)&end_cmd, 8);
366 int rtw_IOL_exec_cmd_array_sync(PADAPTER adapter, u8 *IOL_cmds, u32 cmd_num, u32 max_wating_ms)
368 struct xmit_frame *xmit_frame;
370 if((xmit_frame=rtw_IOL_accquire_xmit_frame(adapter)) == NULL)
373 if(rtw_IOL_append_cmds(xmit_frame, IOL_cmds, cmd_num<<3) == _FAIL)
376 return rtw_IOL_exec_cmds_sync(adapter, xmit_frame, max_wating_ms,0);
379 int rtw_IOL_exec_empty_cmds_sync(ADAPTER *adapter, u32 max_wating_ms)
381 IOL_CMD end_cmd = {0x0, IOL_CMD_END, 0x0, 0x0};
382 return rtw_IOL_exec_cmd_array_sync(adapter, (u8*)&end_cmd, 1, max_wating_ms);
384 #endif //CONFIG_IOL_NEW_GENERATION