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