Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / drivers / staging / otus / wrap_usb.c
CommitLineData
4bd43f50
LR
1/*
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>
5a0e3ad6 31#include <linux/slab.h>
4bd43f50 32#include <net/iw_handler.h>
4bd43f50 33
2bef7a0f
MT
34extern void zfLnxInitUsbTxQ(zdev_t *dev);
35extern void zfLnxInitUsbRxQ(zdev_t *dev);
4bd43f50 36extern u32_t zfLnxSubmitRegInUrb(zdev_t *dev);
2bef7a0f
MT
37u32_t zfLnxUsbOut(zdev_t *dev, u8_t *hdr, u16_t hdrlen, u8_t *snap,
38 u16_t snapLen, u8_t *tail, u16_t tailLen, zbuf_t *buf,
39 u16_t offset);
40u32_t zfLnxUsbWriteReg(zdev_t *dev, u32_t *cmd, u16_t cmdLen);
4bd43f50 41
2bef7a0f
MT
42void zfwUsbRegisterCallBack(zdev_t *dev, struct zfCbUsbFuncTbl *zfUsbFunc)
43{
44 struct usbdrv_private *macp = dev->ml_priv;
4bd43f50 45
2bef7a0f
MT
46 macp->usbCbFunctions.zfcbUsbRecv = zfUsbFunc->zfcbUsbRecv;
47 macp->usbCbFunctions.zfcbUsbRegIn = zfUsbFunc->zfcbUsbRegIn;
48 macp->usbCbFunctions.zfcbUsbOutComplete = zfUsbFunc->zfcbUsbOutComplete;
4bd43f50 49
2bef7a0f 50 return;
4bd43f50
LR
51}
52
2bef7a0f 53u32_t zfwUsbGetFreeTxQSize(zdev_t *dev)
4bd43f50 54{
2bef7a0f
MT
55 struct usbdrv_private *macp = dev->ml_priv;
56 u32_t freeTxQSize;
57 unsigned long irqFlag;
58 /* zmw_declare_for_critical_section(); */
4bd43f50 59
2bef7a0f
MT
60 /* zmw_enter_critical_section(dev); */
61 spin_lock_irqsave(&macp->cs_lock, irqFlag);
4bd43f50 62
2bef7a0f 63 freeTxQSize = ZM_MAX_TX_BUF_NUM - macp->TxBufCnt;
4bd43f50 64
2bef7a0f
MT
65 /* zmw_leave_critical_section(dev); */
66 spin_unlock_irqrestore(&macp->cs_lock, irqFlag);
4bd43f50 67
2bef7a0f 68 return freeTxQSize;
4bd43f50
LR
69}
70
2bef7a0f 71u32_t zfwUsbGetMaxTxQSize(zdev_t *dev)
4bd43f50 72{
2bef7a0f 73 return ZM_MAX_TX_BUF_NUM;
4bd43f50
LR
74}
75
76u32_t zfwUsbEnableIntEpt(zdev_t *dev, u8_t endpt)
77{
2bef7a0f
MT
78 /* Initialize USB TxQ */
79 zfLnxInitUsbTxQ(dev);
4bd43f50 80
2bef7a0f
MT
81 /* Initialize USB RxQ */
82 zfLnxInitUsbRxQ(dev);
4bd43f50 83
2bef7a0f
MT
84 /* Initialize USB Register In URB */
85 /* zfwUsbSubmitRegIn(dev); */
86 /* Initialize USB Register In URB */
87 zfLnxSubmitRegInUrb(dev);
4bd43f50 88
2bef7a0f 89 return 0;
4bd43f50
LR
90}
91
2bef7a0f 92int zfwUsbEnableRxEpt(zdev_t *dev, u8_t endpt)
4bd43f50 93{
2bef7a0f 94 return 0;
4bd43f50
LR
95}
96
2bef7a0f
MT
97u32_t zfwUsbSubmitControl(zdev_t *dev, u8_t req, u16_t value, u16_t index,
98 void *data, u32_t size)
4bd43f50 99{
2bef7a0f
MT
100 int result = 0;
101 u32_t ret = 0;
102 struct usbdrv_private *macp = dev->ml_priv;
103 u8_t *buf;
104
105 if (size > 0) {
106 buf = kmalloc(size, GFP_KERNEL);
d49d0e39
KV
107 if (buf == NULL) {
108 pr_err("zfwUsbSubmitControl() failed, "
109 "kmalloc() returned NULL\n");
110 return 1;
111 }
2bef7a0f
MT
112 memcpy(buf, (u8_t *)data, size);
113 } else
114 buf = NULL;
4bd43f50
LR
115
116#if 0
2bef7a0f
MT
117 printk(KERN_ERR "req = 0x%02x\n", req);
118 printk(KERN_ERR "value = 0x%04x\n", value);
119 printk(KERN_ERR "index = 0x%04x\n", index);
120 printk(KERN_ERR "data = 0x%lx\n", (u32_t) data);
121 printk(KERN_ERR "size = %ld\n", size);
4bd43f50
LR
122#endif
123
2bef7a0f
MT
124 result = usb_control_msg(macp->udev, usb_sndctrlpipe(macp->udev, 0),
125 req, USB_DIR_OUT | 0x40, value, index, buf, size, HZ);
4bd43f50 126
2bef7a0f
MT
127 if (result < 0) {
128 printk(KERN_ERR "zfwUsbSubmitControl() failed, result = 0x%x\n",
129 result);
130 ret = 1;
131 }
132 kfree(buf);
4bd43f50 133
2bef7a0f 134 return ret;
4bd43f50
LR
135}
136
2bef7a0f 137void zfwUsbCmd(zdev_t *dev, u8_t endpt, u32_t *cmd, u16_t cmdLen)
4bd43f50 138{
2bef7a0f
MT
139 struct usbdrv_private *macp = dev->ml_priv;
140 u32_t ret;
141
142 /* MPUsbCommand(dev, endpt, cmd, cmdLen); */
143 ret = zfLnxUsbWriteReg(dev, cmd, cmdLen);
144
145 /*
146 * if zfLnxUsbWriteReg() return error, free and allocate urb,
147 * resend again
148 */
149 if (ret != 0) {
150 usb_free_urb(macp->RegOutUrb);
151 macp->RegOutUrb = usb_alloc_urb(0, GFP_ATOMIC);
152 ret = zfLnxUsbWriteReg(dev, cmd, cmdLen);
153 }
4bd43f50
LR
154}
155
2bef7a0f
MT
156u32_t zfwUsbSend(zdev_t *dev, u8_t endpt, u8_t *hdr, u16_t hdrlen, u8_t *snap,
157 u16_t snapLen, u8_t *tail, u16_t tailLen,
158 zbuf_t *buf, u16_t offset)
4bd43f50 159{
2bef7a0f 160 u32_t status;
4bd43f50
LR
161
162#ifdef ZM_CONFIG_BIG_ENDIAN
2bef7a0f
MT
163 u32_t ii = 0;
164 u16_t *pc = NULL;
165
166 pc = (u16_t *)hdr;
167 for (ii = 0; ii < (hdrlen >> 1); ii++)
168 pc[ii] = cpu_to_le16(pc[ii]);
169
170 pc = (u16_t *)snap;
171 for (ii = 0; ii < (snapLen >> 1); ii++)
172 pc[ii] = cpu_to_le16(pc[ii]);
173
174 pc = (u16_t *)tail;
175 for (ii = 0; ii < (tailLen>>1); ii++)
176 pc[ii] = cpu_to_le16(pc[ii]);
4bd43f50
LR
177#endif
178
2bef7a0f
MT
179 status = zfLnxUsbOut(dev, hdr, hdrlen, snap, snapLen, tail, tailLen,
180 buf, offset);
181 if (status == 0)
182 return 0;
183 else
184 return 1;
4bd43f50
LR
185}
186
187/* Leave an empty line below to remove warning message on some compiler */