blob: 93c0ece21bacaaec6de44dc7feebebe1a9e81807 [file] [log] [blame]
Luis R. Rodriguez4bd43f52008-10-27 22:44:22 -07001/*
2 * Copyright (c) 2007-2008 Atheros Communications Inc.
3 *
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16/* */
17/* Module Name : wrap_usb.c */
18/* */
19/* Abstract */
20/* This module contains wrapper functions for USB management */
21/* */
22/* NOTES */
23/* Platform dependent. */
24/* */
25/************************************************************************/
26
27#include "oal_dt.h"
28#include "usbdrv.h"
29
30#include <linux/netlink.h>
31
32#if WIRELESS_EXT > 12
33#include <net/iw_handler.h>
34#endif
35
36extern void zfLnxInitUsbTxQ(zdev_t* dev);
37extern void zfLnxInitUsbRxQ(zdev_t* dev);
38extern u32_t zfLnxSubmitRegInUrb(zdev_t *dev);
39u32_t zfLnxUsbOut(zdev_t* dev, u8_t *hdr, u16_t hdrlen, u8_t *snap, u16_t snapLen,
40 u8_t *tail, u16_t tailLen, zbuf_t *buf, u16_t offset);
41u32_t zfLnxUsbWriteReg(zdev_t* dev, u32_t* cmd, u16_t cmdLen);
42
43void zfwUsbRegisterCallBack(zdev_t* dev, struct zfCbUsbFuncTbl *zfUsbFunc) {
44 struct usbdrv_private *macp = (struct usbdrv_private *)dev->priv;
45
46 macp->usbCbFunctions.zfcbUsbRecv = zfUsbFunc->zfcbUsbRecv;
47 macp->usbCbFunctions.zfcbUsbRegIn = zfUsbFunc->zfcbUsbRegIn;
48 macp->usbCbFunctions.zfcbUsbOutComplete = zfUsbFunc->zfcbUsbOutComplete;
49
50 return;
51}
52
53u32_t zfwUsbGetFreeTxQSize(zdev_t* dev)
54{
55 struct usbdrv_private *macp = (struct usbdrv_private *)dev->priv;
56 u32_t freeTxQSize;
57 unsigned long irqFlag;
58 //zmw_declare_for_critical_section();
59
60 //zmw_enter_critical_section(dev);
61 spin_lock_irqsave(&(((struct usbdrv_private *)(dev->priv))->cs_lock), irqFlag);
62
63 freeTxQSize = ZM_MAX_TX_BUF_NUM - macp->TxBufCnt;
64
65 //zmw_leave_critical_section(dev);
66 spin_unlock_irqrestore(&(((struct usbdrv_private *)(dev->priv))->cs_lock), irqFlag);
67
68 return freeTxQSize;
69}
70
71u32_t zfwUsbGetMaxTxQSize(zdev_t* dev)
72{
73 return ZM_MAX_TX_BUF_NUM;
74}
75
76u32_t zfwUsbEnableIntEpt(zdev_t *dev, u8_t endpt)
77{
78 /* Initialize USB TxQ */
79 zfLnxInitUsbTxQ(dev);
80
81 /* Initialize USB RxQ */
82 zfLnxInitUsbRxQ(dev);
83
84 /* Initialize USB Register In URB */
85 //zfwUsbSubmitRegIn(dev);
86 /* Initialize USB Register In URB */
87 zfLnxSubmitRegInUrb(dev);
88
89 return 0;
90}
91
92int zfwUsbEnableRxEpt(zdev_t* dev, u8_t endpt)
93{
94 return 0;
95}
96
97u32_t zfwUsbSubmitControl(zdev_t* dev, u8_t req, u16_t value, u16_t index, void *data, u32_t size)
98{
99 int result = 0;
100 u32_t ret = 0;
101 struct usbdrv_private *macp = (struct usbdrv_private *)dev->priv;
102 u8_t* buf;
103
104 if (size > 0)
105 {
106 buf = kmalloc(size, GFP_KERNEL);
107 memcpy(buf, (u8_t*)data, size);
108 }
109 else
110 {
111 buf = NULL;
112 }
113
114#if 0
115 printk(KERN_ERR "req = 0x%02x\n", req);
116 printk(KERN_ERR "value = 0x%04x\n", value);
117 printk(KERN_ERR "index = 0x%04x\n", index);
118 printk(KERN_ERR "data = 0x%lx\n", (u32_t) data);
119 printk(KERN_ERR "size = %ld\n", size);
120#endif
121
122 result = usb_control_msg(macp->udev, usb_sndctrlpipe(macp->udev, 0),
123 req, USB_DIR_OUT | 0x40, value, index, buf, size, HZ);
124
125 if (result < 0)
126 {
127 printk("zfwUsbSubmitControl() failed, result=0x%x\n", result);
128 ret = 1;
129 }
130 kfree(buf);
131
132 return ret;
133}
134
135void zfwUsbCmd(zdev_t* dev, u8_t endpt, u32_t* cmd, u16_t cmdLen)
136{
137 struct usbdrv_private *macp = (struct usbdrv_private *)dev->priv;
138 u32_t ret;
139
140 //MPUsbCommand(dev, endpt, cmd, cmdLen);
141 ret = zfLnxUsbWriteReg(dev, cmd, cmdLen);
142
143 /* if zfLnxUsbWriteReg() return error, free and allocate urb, resend again */
144 if (ret != 0)
145 {
146 usb_free_urb(macp->RegOutUrb);
147#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0) /* tune me! */
148 macp->RegOutUrb = usb_alloc_urb(0, GFP_ATOMIC);
149#else
150 macp->RegOutUrb = usb_alloc_urb(0);
151#endif
152 ret = zfLnxUsbWriteReg(dev, cmd, cmdLen);
153 }
154}
155
156u32_t zfwUsbSend(zdev_t* dev, u8_t endpt, u8_t *hdr, u16_t hdrlen, u8_t *snap, u16_t snapLen,
157 u8_t *tail, u16_t tailLen, zbuf_t *buf, u16_t offset)
158{
159 u32_t status;
160
161#ifdef ZM_CONFIG_BIG_ENDIAN
162 u32_t ii = 0;
163 u16_t *pc = NULL;
164
165 pc = (u16_t *)hdr;
166 for(ii=0; ii<(hdrlen>>1); ii++)
167 {
168 pc[ii] = cpu_to_le16(pc[ii]);
169 }
170
171 pc = (u16_t *)snap;
172 for(ii=0; ii<(snapLen>>1); ii++)
173 {
174 pc[ii] = cpu_to_le16(pc[ii]);
175 }
176
177 pc = (u16_t *)tail;
178 for(ii=0; ii<(tailLen>>1); ii++)
179 {
180 pc[ii] = cpu_to_le16(pc[ii]);
181 }
182#endif
183
184 status = zfLnxUsbOut(dev, hdr, hdrlen, snap, snapLen, tail, tailLen, buf, offset);
185 if ( status == 0 )
186 {
187 return 0;
188 }
189 else
190 {
191 return 1;
192 }
193}
194
195/* Leave an empty line below to remove warning message on some compiler */