blob: 6b336ede8867eaf989986eb869cb5b83de8ed19b [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>
Luis R. Rodriguez4bd43f52008-10-27 22:44:22 -070031#include <net/iw_handler.h>
Luis R. Rodriguez4bd43f52008-10-27 22:44:22 -070032
Mithlesh Thukral2bef7a02009-10-26 21:22:55 -070033extern void zfLnxInitUsbTxQ(zdev_t *dev);
34extern void zfLnxInitUsbRxQ(zdev_t *dev);
Luis R. Rodriguez4bd43f52008-10-27 22:44:22 -070035extern u32_t zfLnxSubmitRegInUrb(zdev_t *dev);
Mithlesh Thukral2bef7a02009-10-26 21:22:55 -070036u32_t zfLnxUsbOut(zdev_t *dev, u8_t *hdr, u16_t hdrlen, u8_t *snap,
37 u16_t snapLen, u8_t *tail, u16_t tailLen, zbuf_t *buf,
38 u16_t offset);
39u32_t zfLnxUsbWriteReg(zdev_t *dev, u32_t *cmd, u16_t cmdLen);
Luis R. Rodriguez4bd43f52008-10-27 22:44:22 -070040
Mithlesh Thukral2bef7a02009-10-26 21:22:55 -070041void zfwUsbRegisterCallBack(zdev_t *dev, struct zfCbUsbFuncTbl *zfUsbFunc)
42{
43 struct usbdrv_private *macp = dev->ml_priv;
Luis R. Rodriguez4bd43f52008-10-27 22:44:22 -070044
Mithlesh Thukral2bef7a02009-10-26 21:22:55 -070045 macp->usbCbFunctions.zfcbUsbRecv = zfUsbFunc->zfcbUsbRecv;
46 macp->usbCbFunctions.zfcbUsbRegIn = zfUsbFunc->zfcbUsbRegIn;
47 macp->usbCbFunctions.zfcbUsbOutComplete = zfUsbFunc->zfcbUsbOutComplete;
Luis R. Rodriguez4bd43f52008-10-27 22:44:22 -070048
Mithlesh Thukral2bef7a02009-10-26 21:22:55 -070049 return;
Luis R. Rodriguez4bd43f52008-10-27 22:44:22 -070050}
51
Mithlesh Thukral2bef7a02009-10-26 21:22:55 -070052u32_t zfwUsbGetFreeTxQSize(zdev_t *dev)
Luis R. Rodriguez4bd43f52008-10-27 22:44:22 -070053{
Mithlesh Thukral2bef7a02009-10-26 21:22:55 -070054 struct usbdrv_private *macp = dev->ml_priv;
55 u32_t freeTxQSize;
56 unsigned long irqFlag;
57 /* zmw_declare_for_critical_section(); */
Luis R. Rodriguez4bd43f52008-10-27 22:44:22 -070058
Mithlesh Thukral2bef7a02009-10-26 21:22:55 -070059 /* zmw_enter_critical_section(dev); */
60 spin_lock_irqsave(&macp->cs_lock, irqFlag);
Luis R. Rodriguez4bd43f52008-10-27 22:44:22 -070061
Mithlesh Thukral2bef7a02009-10-26 21:22:55 -070062 freeTxQSize = ZM_MAX_TX_BUF_NUM - macp->TxBufCnt;
Luis R. Rodriguez4bd43f52008-10-27 22:44:22 -070063
Mithlesh Thukral2bef7a02009-10-26 21:22:55 -070064 /* zmw_leave_critical_section(dev); */
65 spin_unlock_irqrestore(&macp->cs_lock, irqFlag);
Luis R. Rodriguez4bd43f52008-10-27 22:44:22 -070066
Mithlesh Thukral2bef7a02009-10-26 21:22:55 -070067 return freeTxQSize;
Luis R. Rodriguez4bd43f52008-10-27 22:44:22 -070068}
69
Mithlesh Thukral2bef7a02009-10-26 21:22:55 -070070u32_t zfwUsbGetMaxTxQSize(zdev_t *dev)
Luis R. Rodriguez4bd43f52008-10-27 22:44:22 -070071{
Mithlesh Thukral2bef7a02009-10-26 21:22:55 -070072 return ZM_MAX_TX_BUF_NUM;
Luis R. Rodriguez4bd43f52008-10-27 22:44:22 -070073}
74
75u32_t zfwUsbEnableIntEpt(zdev_t *dev, u8_t endpt)
76{
Mithlesh Thukral2bef7a02009-10-26 21:22:55 -070077 /* Initialize USB TxQ */
78 zfLnxInitUsbTxQ(dev);
Luis R. Rodriguez4bd43f52008-10-27 22:44:22 -070079
Mithlesh Thukral2bef7a02009-10-26 21:22:55 -070080 /* Initialize USB RxQ */
81 zfLnxInitUsbRxQ(dev);
Luis R. Rodriguez4bd43f52008-10-27 22:44:22 -070082
Mithlesh Thukral2bef7a02009-10-26 21:22:55 -070083 /* Initialize USB Register In URB */
84 /* zfwUsbSubmitRegIn(dev); */
85 /* Initialize USB Register In URB */
86 zfLnxSubmitRegInUrb(dev);
Luis R. Rodriguez4bd43f52008-10-27 22:44:22 -070087
Mithlesh Thukral2bef7a02009-10-26 21:22:55 -070088 return 0;
Luis R. Rodriguez4bd43f52008-10-27 22:44:22 -070089}
90
Mithlesh Thukral2bef7a02009-10-26 21:22:55 -070091int zfwUsbEnableRxEpt(zdev_t *dev, u8_t endpt)
Luis R. Rodriguez4bd43f52008-10-27 22:44:22 -070092{
Mithlesh Thukral2bef7a02009-10-26 21:22:55 -070093 return 0;
Luis R. Rodriguez4bd43f52008-10-27 22:44:22 -070094}
95
Mithlesh Thukral2bef7a02009-10-26 21:22:55 -070096u32_t zfwUsbSubmitControl(zdev_t *dev, u8_t req, u16_t value, u16_t index,
97 void *data, u32_t size)
Luis R. Rodriguez4bd43f52008-10-27 22:44:22 -070098{
Mithlesh Thukral2bef7a02009-10-26 21:22:55 -070099 int result = 0;
100 u32_t ret = 0;
101 struct usbdrv_private *macp = dev->ml_priv;
102 u8_t *buf;
Luis R. Rodriguez4bd43f52008-10-27 22:44:22 -0700103
Mithlesh Thukral2bef7a02009-10-26 21:22:55 -0700104 if (size > 0) {
105 buf = kmalloc(size, GFP_KERNEL);
106 memcpy(buf, (u8_t *)data, size);
107 } else
108 buf = NULL;
Luis R. Rodriguez4bd43f52008-10-27 22:44:22 -0700109
110#if 0
Mithlesh Thukral2bef7a02009-10-26 21:22:55 -0700111 printk(KERN_ERR "req = 0x%02x\n", req);
112 printk(KERN_ERR "value = 0x%04x\n", value);
113 printk(KERN_ERR "index = 0x%04x\n", index);
114 printk(KERN_ERR "data = 0x%lx\n", (u32_t) data);
115 printk(KERN_ERR "size = %ld\n", size);
Luis R. Rodriguez4bd43f52008-10-27 22:44:22 -0700116#endif
117
Mithlesh Thukral2bef7a02009-10-26 21:22:55 -0700118 result = usb_control_msg(macp->udev, usb_sndctrlpipe(macp->udev, 0),
119 req, USB_DIR_OUT | 0x40, value, index, buf, size, HZ);
Luis R. Rodriguez4bd43f52008-10-27 22:44:22 -0700120
Mithlesh Thukral2bef7a02009-10-26 21:22:55 -0700121 if (result < 0) {
122 printk(KERN_ERR "zfwUsbSubmitControl() failed, result = 0x%x\n",
123 result);
124 ret = 1;
125 }
126 kfree(buf);
Luis R. Rodriguez4bd43f52008-10-27 22:44:22 -0700127
Mithlesh Thukral2bef7a02009-10-26 21:22:55 -0700128 return ret;
Luis R. Rodriguez4bd43f52008-10-27 22:44:22 -0700129}
130
Mithlesh Thukral2bef7a02009-10-26 21:22:55 -0700131void zfwUsbCmd(zdev_t *dev, u8_t endpt, u32_t *cmd, u16_t cmdLen)
Luis R. Rodriguez4bd43f52008-10-27 22:44:22 -0700132{
Mithlesh Thukral2bef7a02009-10-26 21:22:55 -0700133 struct usbdrv_private *macp = dev->ml_priv;
134 u32_t ret;
Luis R. Rodriguez4bd43f52008-10-27 22:44:22 -0700135
Mithlesh Thukral2bef7a02009-10-26 21:22:55 -0700136 /* MPUsbCommand(dev, endpt, cmd, cmdLen); */
137 ret = zfLnxUsbWriteReg(dev, cmd, cmdLen);
Luis R. Rodriguez4bd43f52008-10-27 22:44:22 -0700138
Mithlesh Thukral2bef7a02009-10-26 21:22:55 -0700139 /*
140 * if zfLnxUsbWriteReg() return error, free and allocate urb,
141 * resend again
142 */
143 if (ret != 0) {
144 usb_free_urb(macp->RegOutUrb);
145 macp->RegOutUrb = usb_alloc_urb(0, GFP_ATOMIC);
146 ret = zfLnxUsbWriteReg(dev, cmd, cmdLen);
147 }
Luis R. Rodriguez4bd43f52008-10-27 22:44:22 -0700148}
149
Mithlesh Thukral2bef7a02009-10-26 21:22:55 -0700150u32_t zfwUsbSend(zdev_t *dev, u8_t endpt, u8_t *hdr, u16_t hdrlen, u8_t *snap,
151 u16_t snapLen, u8_t *tail, u16_t tailLen,
152 zbuf_t *buf, u16_t offset)
Luis R. Rodriguez4bd43f52008-10-27 22:44:22 -0700153{
Mithlesh Thukral2bef7a02009-10-26 21:22:55 -0700154 u32_t status;
Luis R. Rodriguez4bd43f52008-10-27 22:44:22 -0700155
156#ifdef ZM_CONFIG_BIG_ENDIAN
Mithlesh Thukral2bef7a02009-10-26 21:22:55 -0700157 u32_t ii = 0;
158 u16_t *pc = NULL;
Luis R. Rodriguez4bd43f52008-10-27 22:44:22 -0700159
Mithlesh Thukral2bef7a02009-10-26 21:22:55 -0700160 pc = (u16_t *)hdr;
161 for (ii = 0; ii < (hdrlen >> 1); ii++)
162 pc[ii] = cpu_to_le16(pc[ii]);
Luis R. Rodriguez4bd43f52008-10-27 22:44:22 -0700163
Mithlesh Thukral2bef7a02009-10-26 21:22:55 -0700164 pc = (u16_t *)snap;
165 for (ii = 0; ii < (snapLen >> 1); ii++)
166 pc[ii] = cpu_to_le16(pc[ii]);
Luis R. Rodriguez4bd43f52008-10-27 22:44:22 -0700167
Mithlesh Thukral2bef7a02009-10-26 21:22:55 -0700168 pc = (u16_t *)tail;
169 for (ii = 0; ii < (tailLen>>1); ii++)
170 pc[ii] = cpu_to_le16(pc[ii]);
Luis R. Rodriguez4bd43f52008-10-27 22:44:22 -0700171#endif
172
Mithlesh Thukral2bef7a02009-10-26 21:22:55 -0700173 status = zfLnxUsbOut(dev, hdr, hdrlen, snap, snapLen, tail, tailLen,
174 buf, offset);
175 if (status == 0)
176 return 0;
177 else
178 return 1;
Luis R. Rodriguez4bd43f52008-10-27 22:44:22 -0700179}
180
181/* Leave an empty line below to remove warning message on some compiler */