• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/components/opensource/linux/linux-2.6.36/drivers/staging/otus/
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>
31#include <linux/slab.h>
32#include <net/iw_handler.h>
33
34extern void zfLnxInitUsbTxQ(zdev_t *dev);
35extern void zfLnxInitUsbRxQ(zdev_t *dev);
36extern u32_t zfLnxSubmitRegInUrb(zdev_t *dev);
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);
41
42void zfwUsbRegisterCallBack(zdev_t *dev, struct zfCbUsbFuncTbl *zfUsbFunc)
43{
44	struct usbdrv_private *macp = dev->ml_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 = dev->ml_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(&macp->cs_lock, irqFlag);
62
63	freeTxQSize = ZM_MAX_TX_BUF_NUM - macp->TxBufCnt;
64
65	/* zmw_leave_critical_section(dev);	*/
66	spin_unlock_irqrestore(&macp->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,
98			 void *data, u32_t size)
99{
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);
107		if (buf == NULL) {
108			pr_err("zfwUsbSubmitControl() failed, "
109				  "kmalloc() returned NULL\n");
110			return 1;
111		}
112		memcpy(buf, (u8_t *)data, size);
113	} else
114		buf = NULL;
115
116
117	result = usb_control_msg(macp->udev, usb_sndctrlpipe(macp->udev, 0),
118			req, USB_DIR_OUT | 0x40, value, index, buf, size, HZ);
119
120	if (result < 0) {
121		printk(KERN_ERR "zfwUsbSubmitControl() failed, result = 0x%x\n",
122			result);
123		ret = 1;
124	}
125	kfree(buf);
126
127	return ret;
128}
129
130void zfwUsbCmd(zdev_t *dev, u8_t endpt, u32_t *cmd, u16_t cmdLen)
131{
132	struct usbdrv_private *macp = dev->ml_priv;
133	u32_t ret;
134
135	/* MPUsbCommand(dev, endpt, cmd, cmdLen);	*/
136	ret = zfLnxUsbWriteReg(dev, cmd, cmdLen);
137
138	/*
139	 * if zfLnxUsbWriteReg() return error, free and allocate urb,
140	 * resend again
141	 */
142	if (ret != 0) {
143		usb_free_urb(macp->RegOutUrb);
144		macp->RegOutUrb = usb_alloc_urb(0, GFP_ATOMIC);
145		ret = zfLnxUsbWriteReg(dev, cmd, cmdLen);
146	}
147}
148
149u32_t zfwUsbSend(zdev_t *dev, u8_t endpt, u8_t *hdr, u16_t hdrlen, u8_t *snap,
150			u16_t snapLen,	u8_t *tail, u16_t tailLen,
151			zbuf_t *buf, u16_t offset)
152{
153	u32_t status;
154
155#ifdef ZM_CONFIG_BIG_ENDIAN
156	u32_t ii = 0;
157	u16_t *pc = NULL;
158
159	pc = (u16_t *)hdr;
160	for (ii = 0; ii < (hdrlen >> 1); ii++)
161		pc[ii] = cpu_to_le16(pc[ii]);
162
163	pc = (u16_t *)snap;
164	for (ii = 0; ii < (snapLen >> 1); ii++)
165		pc[ii] = cpu_to_le16(pc[ii]);
166
167	pc = (u16_t *)tail;
168	for (ii = 0; ii < (tailLen>>1); ii++)
169		pc[ii] = cpu_to_le16(pc[ii]);
170#endif
171
172	status = zfLnxUsbOut(dev, hdr, hdrlen, snap, snapLen, tail, tailLen,
173				buf, offset);
174	if (status == 0)
175		return 0;
176	else
177		return 1;
178}
179
180/* Leave an empty line below to remove warning message on some compiler */
181