summaryrefslogtreecommitdiffstats
path: root/drivers/staging/otus/wwrap.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/staging/otus/wwrap.c')
-rw-r--r--drivers/staging/otus/wwrap.c1048
1 files changed, 0 insertions, 1048 deletions
diff --git a/drivers/staging/otus/wwrap.c b/drivers/staging/otus/wwrap.c
deleted file mode 100644
index fcd3da0..0000000
--- a/drivers/staging/otus/wwrap.c
+++ /dev/null
@@ -1,1048 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Atheros Communications Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-/* Module Name : wwrap.c */
-/* Abstract */
-/* This module contains wrapper functions. */
-/* */
-/* NOTES */
-/* Platform dependent. */
-/* */
-
-/* Please include your header files here */
-#include "oal_dt.h"
-#include "usbdrv.h"
-
-#include <linux/netlink.h>
-#include <linux/slab.h>
-#include <net/iw_handler.h>
-
-extern void zfiRecv80211(zdev_t *dev, zbuf_t *buf, struct zsAdditionInfo *addInfo);
-extern void zfCoreRecv(zdev_t *dev, zbuf_t *buf, struct zsAdditionInfo *addInfo);
-extern void zfIdlChkRsp(zdev_t *dev, u32_t *rsp, u16_t rspLen);
-extern void zfIdlRsp(zdev_t *dev, u32_t *rsp, u16_t rspLen);
-
-
-
-/*extern struct zsWdsStruct wds[ZM_WDS_PORT_NUMBER];*/
-extern struct zsVapStruct vap[ZM_VAP_PORT_NUMBER];
-
-u32_t zfLnxUsbSubmitTxData(zdev_t *dev);
-u32_t zfLnxUsbIn(zdev_t *dev, urb_t *urb, zbuf_t *buf);
-u32_t zfLnxSubmitRegInUrb(zdev_t *dev);
-u32_t zfLnxUsbSubmitBulkUrb(urb_t *urb, struct usb_device *usb, u16_t epnum, u16_t direction,
- void *transfer_buffer, int buffer_length, usb_complete_t complete, void *context);
-u32_t zfLnxUsbSubmitIntUrb(urb_t *urb, struct usb_device *usb, u16_t epnum, u16_t direction,
- void *transfer_buffer, int buffer_length, usb_complete_t complete, void *context,
- u32_t interval);
-
-u16_t zfLnxGetFreeTxUrb(zdev_t *dev)
-{
- struct usbdrv_private *macp = dev->ml_priv;
- u16_t idx;
- unsigned long irqFlag;
-
- spin_lock_irqsave(&macp->cs_lock, irqFlag);
-
- /*idx = ((macp->TxUrbTail + 1) & (ZM_MAX_TX_URB_NUM - 1));*/
-
- /*if (idx != macp->TxUrbHead)*/
- if (macp->TxUrbCnt != 0) {
- idx = macp->TxUrbTail;
- macp->TxUrbTail = ((macp->TxUrbTail + 1) & (ZM_MAX_TX_URB_NUM - 1));
- macp->TxUrbCnt--;
- } else {
- /*printk(KERN_ERR "macp->TxUrbCnt: %d\n", macp->TxUrbCnt);*/
- idx = 0xffff;
- }
-
- spin_unlock_irqrestore(&macp->cs_lock, irqFlag);
- return idx;
-}
-
-void zfLnxPutTxUrb(zdev_t *dev)
-{
- struct usbdrv_private *macp = dev->ml_priv;
- u16_t idx;
- unsigned long irqFlag;
-
- spin_lock_irqsave(&macp->cs_lock, irqFlag);
-
- idx = ((macp->TxUrbHead + 1) & (ZM_MAX_TX_URB_NUM - 1));
-
- /*if (idx != macp->TxUrbTail)*/
- if (macp->TxUrbCnt < ZM_MAX_TX_URB_NUM) {
- macp->TxUrbHead = idx;
- macp->TxUrbCnt++;
- } else {
- printk("UsbTxUrbQ inconsistent: TxUrbHead: %d, TxUrbTail: %d\n",
- macp->TxUrbHead, macp->TxUrbTail);
- }
-
- spin_unlock_irqrestore(&macp->cs_lock, irqFlag);
-}
-
-u16_t zfLnxCheckTxBufferCnt(zdev_t *dev)
-{
- struct usbdrv_private *macp = dev->ml_priv;
- u16_t TxBufCnt;
- unsigned long irqFlag;
-
- spin_lock_irqsave(&macp->cs_lock, irqFlag);
-
- TxBufCnt = macp->TxBufCnt;
-
- spin_unlock_irqrestore(&macp->cs_lock, irqFlag);
- return TxBufCnt;
-}
-
-UsbTxQ_t *zfLnxGetUsbTxBuffer(zdev_t *dev)
-{
- struct usbdrv_private *macp = dev->ml_priv;
- u16_t idx;
- UsbTxQ_t *TxQ;
- unsigned long irqFlag;
-
- spin_lock_irqsave(&macp->cs_lock, irqFlag);
-
- idx = ((macp->TxBufHead+1) & (ZM_MAX_TX_BUF_NUM - 1));
-
- /*if (idx != macp->TxBufTail)*/
- if (macp->TxBufCnt > 0) {
- /*printk("CWY - zfwGetUsbTxBuffer ,macp->TxBufCnt = %d\n", macp->TxBufCnt);*/
- TxQ = (UsbTxQ_t *)&(macp->UsbTxBufQ[macp->TxBufHead]);
- macp->TxBufHead = ((macp->TxBufHead+1) & (ZM_MAX_TX_BUF_NUM - 1));
- macp->TxBufCnt--;
- } else {
- if (macp->TxBufHead != macp->TxBufTail) {
- printk(KERN_ERR "zfwGetUsbTxBuf UsbTxBufQ inconsistent: TxBufHead: %d, TxBufTail: %d\n",
- macp->TxBufHead, macp->TxBufTail);
- }
-
- spin_unlock_irqrestore(&macp->cs_lock, irqFlag);
- return NULL;
- }
-
- spin_unlock_irqrestore(&macp->cs_lock, irqFlag);
- return TxQ;
-}
-
-u16_t zfLnxPutUsbTxBuffer(zdev_t *dev, u8_t *hdr, u16_t hdrlen,
- u8_t *snap, u16_t snapLen, u8_t *tail, u16_t tailLen,
- zbuf_t *buf, u16_t offset)
-{
- struct usbdrv_private *macp = dev->ml_priv;
- u16_t idx;
- UsbTxQ_t *TxQ;
- unsigned long irqFlag;
-
- spin_lock_irqsave(&macp->cs_lock, irqFlag);
-
- idx = ((macp->TxBufTail+1) & (ZM_MAX_TX_BUF_NUM - 1));
-
- /* For Tx debug */
- /*zm_assert(macp->TxBufCnt >= 0); // deleted because of always true*/
-
- /*if (idx != macp->TxBufHead)*/
- if (macp->TxBufCnt < ZM_MAX_TX_BUF_NUM) {
- /*printk("CWY - zfwPutUsbTxBuffer ,macp->TxBufCnt = %d\n", macp->TxBufCnt);*/
- TxQ = (UsbTxQ_t *)&(macp->UsbTxBufQ[macp->TxBufTail]);
- memcpy(TxQ->hdr, hdr, hdrlen);
- TxQ->hdrlen = hdrlen;
- memcpy(TxQ->snap, snap, snapLen);
- TxQ->snapLen = snapLen;
- memcpy(TxQ->tail, tail, tailLen);
- TxQ->tailLen = tailLen;
- TxQ->buf = buf;
- TxQ->offset = offset;
-
- macp->TxBufTail = ((macp->TxBufTail+1) & (ZM_MAX_TX_BUF_NUM - 1));
- macp->TxBufCnt++;
- } else {
- printk(KERN_ERR "zfLnxPutUsbTxBuffer UsbTxBufQ inconsistent: TxBufHead: %d, TxBufTail: %d, TxBufCnt: %d\n",
- macp->TxBufHead, macp->TxBufTail, macp->TxBufCnt);
- spin_unlock_irqrestore(&macp->cs_lock, irqFlag);
- return 0xffff;
- }
-
- spin_unlock_irqrestore(&macp->cs_lock, irqFlag);
- return 0;
-}
-
-zbuf_t *zfLnxGetUsbRxBuffer(zdev_t *dev)
-{
- struct usbdrv_private *macp = dev->ml_priv;
- /*u16_t idx;*/
- zbuf_t *buf;
- unsigned long irqFlag;
-
- spin_lock_irqsave(&macp->cs_lock, irqFlag);
-
- /*idx = ((macp->RxBufHead+1) & (ZM_MAX_RX_URB_NUM - 1));*/
-
- /*if (idx != macp->RxBufTail)*/
- if (macp->RxBufCnt != 0) {
- buf = macp->UsbRxBufQ[macp->RxBufHead];
- macp->RxBufHead = ((macp->RxBufHead+1) & (ZM_MAX_RX_URB_NUM - 1));
- macp->RxBufCnt--;
- } else {
- printk("RxBufQ inconsistent: RxBufHead: %d, RxBufTail: %d\n",
- macp->RxBufHead, macp->RxBufTail);
- spin_unlock_irqrestore(&macp->cs_lock, irqFlag);
- return NULL;
- }
-
- spin_unlock_irqrestore(&macp->cs_lock, irqFlag);
- return buf;
-}
-
-u32_t zfLnxPutUsbRxBuffer(zdev_t *dev, zbuf_t *buf)
-{
- struct usbdrv_private *macp = dev->ml_priv;
- u16_t idx;
- unsigned long irqFlag;
-
- spin_lock_irqsave(&macp->cs_lock, irqFlag);
-
- idx = ((macp->RxBufTail+1) & (ZM_MAX_RX_URB_NUM - 1));
-
- /*if (idx != macp->RxBufHead)*/
- if (macp->RxBufCnt != ZM_MAX_RX_URB_NUM) {
- macp->UsbRxBufQ[macp->RxBufTail] = buf;
- macp->RxBufTail = idx;
- macp->RxBufCnt++;
- } else {
- printk("RxBufQ inconsistent: RxBufHead: %d, RxBufTail: %d\n",
- macp->RxBufHead, macp->RxBufTail);
- spin_unlock_irqrestore(&macp->cs_lock, irqFlag);
- return 0xffff;
- }
-
- spin_unlock_irqrestore(&macp->cs_lock, irqFlag);
- return 0;
-}
-
-void zfLnxUsbDataOut_callback(urb_t *urb)
-{
- zdev_t *dev = urb->context;
- /*UsbTxQ_t *TxData;*/
-
- /* Give the urb back */
- zfLnxPutTxUrb(dev);
-
- /* Check whether there is any pending buffer needed */
- /* to be sent */
- if (zfLnxCheckTxBufferCnt(dev) != 0) {
- /*TxData = zfwGetUsbTxBuffer(dev);
- //if (TxData == NULL)
- //{
- // printk("Get a NULL buffer from zfwGetUsbTxBuffer\n");
- // return;
- //}
- //else
- //{
- zfLnxUsbSubmitTxData(dev);
- //}*/
- }
-}
-
-void zfLnxUsbDataIn_callback(urb_t *urb)
-{
- zdev_t *dev = urb->context;
- struct usbdrv_private *macp = dev->ml_priv;
- zbuf_t *buf;
- zbuf_t *new_buf;
- int status;
-
-#if ZM_USB_STREAM_MODE == 1
- static int remain_len, check_pad, check_len;
- int index = 0;
- int chk_idx;
- u16_t pkt_len;
- u16_t pkt_tag;
- u16_t ii;
- zbuf_t *rxBufPool[8];
- u16_t rxBufPoolIndex = 0;
-#endif
-
- /* Check status for URB */
- if (urb->status != 0) {
- printk("zfLnxUsbDataIn_callback() : status=0x%x\n", urb->status);
- if ((urb->status != -ENOENT) && (urb->status != -ECONNRESET)
- && (urb->status != -ESHUTDOWN)) {
- if (urb->status == -EPIPE) {
- /*printk(KERN_ERR "nonzero read bulk status received: -EPIPE");*/
- status = -1;
- }
-
- if (urb->status == -EPROTO) {
- /*printk(KERN_ERR "nonzero read bulk status received: -EPROTO");*/
- status = -1;
- }
- }
-
- /*printk(KERN_ERR "urb->status: 0x%08x\n", urb->status);*/
-
- /* Dequeue skb buffer */
- buf = zfLnxGetUsbRxBuffer(dev);
- dev_kfree_skb_any(buf);
- #if 0
- /* Enqueue skb buffer */
- zfLnxPutUsbRxBuffer(dev, buf);
-
- /* Submit a Rx urb */
- zfLnxUsbIn(dev, urb, buf);
- #endif
- return;
- }
-
- if (urb->actual_length == 0) {
- printk(KERN_ERR "Get an URB whose length is zero");
- status = -1;
- }
-
- /* Dequeue skb buffer */
- buf = zfLnxGetUsbRxBuffer(dev);
-
- /*zfwBufSetSize(dev, buf, urb->actual_length);*/
-#ifdef NET_SKBUFF_DATA_USES_OFFSET
- buf->tail = 0;
- buf->len = 0;
-#else
- buf->tail = buf->data;
- buf->len = 0;
-#endif
-
- BUG_ON((buf->tail + urb->actual_length) > buf->end);
-
- skb_put(buf, urb->actual_length);
-
-#if ZM_USB_STREAM_MODE == 1
- if (remain_len != 0) {
- zbuf_t *remain_buf = macp->reamin_buf;
-
- index = remain_len;
- remain_len -= check_pad;
-
- /* Copy data */
- memcpy(&(remain_buf->data[check_len]), buf->data, remain_len);
- check_len += remain_len;
- remain_len = 0;
-
- rxBufPool[rxBufPoolIndex++] = remain_buf;
- }
-
- while (index < urb->actual_length) {
- pkt_len = buf->data[index] + (buf->data[index+1] << 8);
- pkt_tag = buf->data[index+2] + (buf->data[index+3] << 8);
-
- if (pkt_tag == 0x4e00) {
- int pad_len;
-
- /*printk("Get a packet, index: %d, pkt_len: 0x%04x\n", index, pkt_len);*/
- #if 0
- /* Dump data */
- for (ii = index; ii < pkt_len+4;) {
- printk("%02x ", (buf->data[ii] & 0xff));
-
- if ((++ii % 16) == 0)
- printk("\n");
- }
-
- printk("\n");
- #endif
-
- pad_len = 4 - (pkt_len & 0x3);
-
- if (pad_len == 4)
- pad_len = 0;
-
- chk_idx = index;
- index = index + 4 + pkt_len + pad_len;
-
- if (index > ZM_MAX_RX_BUFFER_SIZE) {
- remain_len = index - ZM_MAX_RX_BUFFER_SIZE; /* - pad_len;*/
- check_len = ZM_MAX_RX_BUFFER_SIZE - chk_idx - 4;
- check_pad = pad_len;
-
- /* Allocate a skb buffer */
- /*new_buf = zfwBufAllocate(dev, ZM_MAX_RX_BUFFER_SIZE);*/
- new_buf = dev_alloc_skb(ZM_MAX_RX_BUFFER_SIZE);
-
- /* Set skb buffer length */
- #ifdef NET_SKBUFF_DATA_USES_OFFSET
- new_buf->tail = 0;
- new_buf->len = 0;
- #else
- new_buf->tail = new_buf->data;
- new_buf->len = 0;
- #endif
-
- skb_put(new_buf, pkt_len);
-
- /* Copy the buffer */
- memcpy(new_buf->data, &(buf->data[chk_idx+4]), check_len);
-
- /* Record the buffer pointer */
- macp->reamin_buf = new_buf;
- } else {
- #ifdef ZM_DONT_COPY_RX_BUFFER
- if (rxBufPoolIndex == 0) {
- new_buf = skb_clone(buf, GFP_ATOMIC);
-
- new_buf->data = &(buf->data[chk_idx+4]);
- new_buf->len = pkt_len;
- } else {
- #endif
- /* Allocate a skb buffer */
- new_buf = dev_alloc_skb(ZM_MAX_RX_BUFFER_SIZE);
-
- /* Set skb buffer length */
- #ifdef NET_SKBUFF_DATA_USES_OFFSET
- new_buf->tail = 0;
- new_buf->len = 0;
- #else
- new_buf->tail = new_buf->data;
- new_buf->len = 0;
- #endif
-
- skb_put(new_buf, pkt_len);
-
- /* Copy the buffer */
- memcpy(new_buf->data, &(buf->data[chk_idx+4]), pkt_len);
-
- #ifdef ZM_DONT_COPY_RX_BUFFER
- }
- #endif
- rxBufPool[rxBufPoolIndex++] = new_buf;
- }
- } else {
- printk(KERN_ERR "Can't find tag, pkt_len: 0x%04x, tag: 0x%04x\n", pkt_len, pkt_tag);
-
- /* Free buffer */
- dev_kfree_skb_any(buf);
-
- /* Allocate a skb buffer */
- new_buf = dev_alloc_skb(ZM_MAX_RX_BUFFER_SIZE);
-
- /* Enqueue skb buffer */
- zfLnxPutUsbRxBuffer(dev, new_buf);
-
- /* Submit a Rx urb */
- zfLnxUsbIn(dev, urb, new_buf);
-
- return;
- }
- }
-
- /* Free buffer */
- dev_kfree_skb_any(buf);
-#endif
-
- /* Allocate a skb buffer */
- new_buf = dev_alloc_skb(ZM_MAX_RX_BUFFER_SIZE);
-
- /* Enqueue skb buffer */
- zfLnxPutUsbRxBuffer(dev, new_buf);
-
- /* Submit a Rx urb */
- zfLnxUsbIn(dev, urb, new_buf);
-
-#if ZM_USB_STREAM_MODE == 1
- for (ii = 0; ii < rxBufPoolIndex; ii++) {
- macp->usbCbFunctions.zfcbUsbRecv(dev, rxBufPool[ii]);
- }
-#else
- /* pass data to upper layer */
- macp->usbCbFunctions.zfcbUsbRecv(dev, buf);
-#endif
-}
-
-void zfLnxUsbRegOut_callback(urb_t *urb)
-{
- /*dev_t* dev = urb->context;*/
-
- /*printk(KERN_ERR "zfwUsbRegOut_callback\n");*/
-}
-
-void zfLnxUsbRegIn_callback(urb_t *urb)
-{
- zdev_t *dev = urb->context;
- u32_t rsp[64/4];
- int status;
- struct usbdrv_private *macp = dev->ml_priv;
-
- /* Check status for URB */
- if (urb->status != 0) {
- printk("zfLnxUsbRegIn_callback() : status=0x%x\n", urb->status);
- if ((urb->status != -ENOENT) && (urb->status != -ECONNRESET) && (urb->status != -ESHUTDOWN)) {
- if (urb->status == -EPIPE) {
- /*printk(KERN_ERR "nonzero read bulk status received: -EPIPE");*/
- status = -1;
- }
-
- if (urb->status == -EPROTO) {
- /*printk(KERN_ERR "nonzero read bulk status received: -EPROTO");*/
- status = -1;
- }
- }
-
- /*printk(KERN_ERR "urb->status: 0x%08x\n", urb->status);*/
- return;
- }
-
- if (urb->actual_length == 0) {
- printk(KERN_ERR "Get an URB whose length is zero");
- status = -1;
- }
-
- /* Copy data into respone buffer */
- memcpy(rsp, macp->regUsbReadBuf, urb->actual_length);
-
- /* Notify to upper layer */
- /*zfIdlChkRsp(dev, rsp, (u16_t)urb->actual_length);*/
- /*zfiUsbRegIn(dev, rsp, (u16_t)urb->actual_length);*/
- macp->usbCbFunctions.zfcbUsbRegIn(dev, rsp, (u16_t)urb->actual_length);
-
- /* Issue another USB IN URB */
- zfLnxSubmitRegInUrb(dev);
-}
-
-u32_t zfLnxSubmitRegInUrb(zdev_t *dev)
-{
- u32_t ret;
- struct usbdrv_private *macp = dev->ml_priv;
-
- /* Submit a rx urb
- //ret = zfLnxUsbSubmitBulkUrb(macp->RegInUrb, macp->udev,
- // USB_REG_IN_PIPE, USB_DIR_IN, macp->regUsbReadBuf,
- // ZM_USB_REG_MAX_BUF_SIZE, zfLnxUsbRegIn_callback, dev);
- //CWYang(-)
- //if (ret != 0)
- // printk("zfwUsbSubmitBulkUrb fail, status: 0x%08x\n", (int)ret);*/
-
- ret = zfLnxUsbSubmitIntUrb(macp->RegInUrb, macp->udev,
- USB_REG_IN_PIPE, USB_DIR_IN, macp->regUsbReadBuf,
- ZM_USB_REG_MAX_BUF_SIZE, zfLnxUsbRegIn_callback, dev, 1);
-
- return ret;
-}
-
-u32_t zfLnxUsbSubmitTxData(zdev_t *dev)
-{
- u32_t i;
- u32_t ret;
- u16_t freeTxUrb;
- u8_t *puTxBuf = NULL;
- UsbTxQ_t *TxData;
- int len = 0;
- struct usbdrv_private *macp = dev->ml_priv;
-#if ZM_USB_TX_STREAM_MODE == 1
- u8_t ii;
- u16_t offset = 0;
- u16_t usbTxAggCnt;
- u16_t *pUsbTxHdr;
- UsbTxQ_t *TxQPool[ZM_MAX_TX_AGGREGATE_NUM];
-#endif
-
- /* First check whether there is a free URB */
- freeTxUrb = zfLnxGetFreeTxUrb(dev);
-
- /* If there is no any free Tx Urb */
- if (freeTxUrb == 0xffff) {
- /*printk(KERN_ERR "Can't get free Tx Urb\n");
- //printk("CWY - Can't get free Tx Urb\n");*/
- return 0xffff;
- }
-
-#if ZM_USB_TX_STREAM_MODE == 1
- usbTxAggCnt = zfLnxCheckTxBufferCnt(dev);
-
- if (usbTxAggCnt >= ZM_MAX_TX_AGGREGATE_NUM) {
- usbTxAggCnt = ZM_MAX_TX_AGGREGATE_NUM;
- } else {
- usbTxAggCnt = 1;
- }
-
- /*printk("usbTxAggCnt: %d\n", usbTxAggCnt);*/
-#endif
-
-#if ZM_USB_TX_STREAM_MODE == 1
- for (ii = 0; ii < usbTxAggCnt; ii++) {
-#endif
- /* Dequeue the packet from UsbTxBufQ */
- TxData = zfLnxGetUsbTxBuffer(dev);
- if (TxData == NULL) {
- /* Give the urb back */
- zfLnxPutTxUrb(dev);
- return 0xffff;
- }
-
- /* Point to the freeTxUrb buffer */
- puTxBuf = macp->txUsbBuf[freeTxUrb];
-
-#if ZM_USB_TX_STREAM_MODE == 1
- puTxBuf += offset;
- pUsbTxHdr = (u16_t *)puTxBuf;
-
- /* Add the packet length and tag information */
- *pUsbTxHdr++ = TxData->hdrlen + TxData->snapLen +
- (TxData->buf->len - TxData->offset) + TxData->tailLen;
-
- *pUsbTxHdr++ = 0x697e;
-
- puTxBuf += 4;
-#endif /* #ifdef ZM_USB_TX_STREAM_MODE*/
-
- /* Copy WLAN header and packet buffer into USB buffer */
- for (i = 0; i < TxData->hdrlen; i++) {
- *puTxBuf++ = TxData->hdr[i];
- }
-
- /* Copy SNAP header */
- for (i = 0; i < TxData->snapLen; i++) {
- *puTxBuf++ = TxData->snap[i];
- }
-
- /* Copy packet buffer */
- for (i = 0; i < TxData->buf->len - TxData->offset; i++) {
- /*puTxBuf++ = zmw_rx_buf_readb(dev, TxData->buf, i);*/
- *puTxBuf++ = *(u8_t *)((u8_t *)TxData->buf->data+i+TxData->offset);
- }
-
- /* Copy tail */
- for (i = 0; i < TxData->tailLen; i++) {
- *puTxBuf++ = TxData->tail[i];
- }
-
- len = TxData->hdrlen+TxData->snapLen+TxData->buf->len+TxData->tailLen-TxData->offset;
-
- #if 0
- if (TxData->hdrlen != 0) {
- puTxBuf = macp->txUsbBuf[freeTxUrb];
- for (i = 0; i < len; i++) {
- printk("%02x ", puTxBuf[i]);
- if (i % 16 == 15)
- printk("\n");
- }
- printk("\n");
- }
- #endif
- #if 0
- /* For debug purpose */
- if (TxData->hdr[9] & 0x40) {
- int i;
- u16_t ctrlLen = TxData->hdr[0] + (TxData->hdr[1] << 8);
-
- if (ctrlLen != len + 4) {
- /* Dump control setting */
- for (i = 0; i < 8; i++) {
- printk(KERN_ERR "0x%02x ", TxData->hdr[i]);
- }
- printk(KERN_ERR "\n");
-
- printk(KERN_ERR "ctrLen: %d, hdrLen: %d, snapLen: %d\n", ctrlLen, TxData->hdrlen, TxData->snapLen);
- printk(KERN_ERR "bufLen: %d, tailLen: %d, len: %d\n", TxData->buf->len, TxData->tailLen, len);
- }
- }
- #endif
-
-#if ZM_USB_TX_STREAM_MODE == 1
- /* Add the Length and Tag*/
- len += 4;
-
- /*printk("%d packet, length: %d\n", ii+1, len);*/
-
- if (ii < (ZM_MAX_TX_AGGREGATE_NUM-1)) {
- /* Pad the buffer to firmware descriptor boundary */
- offset += (((len-1) / 4) + 1) * 4;
- }
-
- if (ii == (ZM_MAX_TX_AGGREGATE_NUM-1)) {
- len += offset;
- }
-
- TxQPool[ii] = TxData;
-
- /*DbgPrint("%d packet, offset: %d\n", ii+1, pUsbTxTransfer->offset);*/
-
- /* free packet */
- /*zfBufFree(dev, txData->buf);*/
- }
-#endif
- /*printk("CWY - call zfwUsbSubmitBulkUrb(), len = 0x%d\n", len);*/
- /* Submit a tx urb */
- ret = zfLnxUsbSubmitBulkUrb(macp->WlanTxDataUrb[freeTxUrb], macp->udev,
- USB_WLAN_TX_PIPE, USB_DIR_OUT, macp->txUsbBuf[freeTxUrb],
- len, zfLnxUsbDataOut_callback, dev);
- /*CWYang(-)
- //if (ret != 0)
- // printk("zfwUsbSubmitBulkUrb fail, status: 0x%08x\n", (int)ret);*/
-
- /* free packet */
- /*dev_kfree_skb_any(TxData->buf);*/
-#if ZM_USB_TX_STREAM_MODE == 1
- for (ii = 0; ii < usbTxAggCnt; ii++)
- macp->usbCbFunctions.zfcbUsbOutComplete(dev, TxQPool[ii]->buf, 1, TxQPool[ii]->hdr);
-#else
- macp->usbCbFunctions.zfcbUsbOutComplete(dev, TxData->buf, 1, TxData->hdr);
-#endif
-
- return ret;
-}
-
-
-
-u32_t zfLnxUsbIn(zdev_t *dev, urb_t *urb, zbuf_t *buf)
-{
- u32_t ret;
- struct usbdrv_private *macp = dev->ml_priv;
-
- /* Submit a rx urb */
- ret = zfLnxUsbSubmitBulkUrb(urb, macp->udev, USB_WLAN_RX_PIPE,
- USB_DIR_IN, buf->data, ZM_MAX_RX_BUFFER_SIZE,
- zfLnxUsbDataIn_callback, dev);
- /*CWYang(-)
- //if (ret != 0)
- // printk("zfwUsbSubmitBulkUrb fail, status: 0x%08x\n", (int)ret);*/
-
- return ret;
-}
-
-u32_t zfLnxUsbWriteReg(zdev_t *dev, u32_t *cmd, u16_t cmdLen)
-{
- struct usbdrv_private *macp = dev->ml_priv;
- u32_t ret;
-
-#ifdef ZM_CONFIG_BIG_ENDIAN
- int ii = 0;
-
- for (ii = 0; ii < (cmdLen>>2); ii++)
- cmd[ii] = cpu_to_le32(cmd[ii]);
-#endif
-
- memcpy(macp->regUsbWriteBuf, cmd, cmdLen);
-
- /* Issue an USB Out transfer */
- /* Submit a tx urb */
- ret = zfLnxUsbSubmitIntUrb(macp->RegOutUrb, macp->udev,
- USB_REG_OUT_PIPE, USB_DIR_OUT, macp->regUsbWriteBuf,
- cmdLen, zfLnxUsbRegOut_callback, dev, 1);
-
- return ret;
-}
-
-
-u32_t zfLnxUsbOut(zdev_t *dev, u8_t *hdr, u16_t hdrlen, u8_t *snap, u16_t snapLen,
- u8_t *tail, u16_t tailLen, zbuf_t *buf, u16_t offset)
-{
- u32_t ret;
- struct usbdrv_private *macp = dev->ml_priv;
-
- /* Check length of tail buffer */
- /*zm_assert((tailLen <= 16));*/
-
- /* Enqueue the packet into UsbTxBufQ */
- if (zfLnxPutUsbTxBuffer(dev, hdr, hdrlen, snap, snapLen, tail, tailLen, buf, offset) == 0xffff) {
- /* free packet */
- /*printk("CWY - zfwPutUsbTxBuffer Error, free packet\n");
- //dev_kfree_skb_any(buf);*/
- macp->usbCbFunctions.zfcbUsbOutComplete(dev, buf, 0, hdr);
- return 0xffff;
- }
-
- /*return 0;
- //printk("CWY - call zfwUsbSubmitTxData()\n");*/
- ret = zfLnxUsbSubmitTxData(dev);
- return ret;
-}
-
-void zfLnxInitUsbTxQ(zdev_t *dev)
-{
- struct usbdrv_private *macp = dev->ml_priv;
-
- printk(KERN_ERR "zfwInitUsbTxQ\n");
-
- /* Zero memory for UsbTxBufQ */
- memset(macp->UsbTxBufQ, 0, sizeof(UsbTxQ_t) * ZM_MAX_TX_URB_NUM);
-
- macp->TxBufHead = 0;
- macp->TxBufTail = 0;
- macp->TxUrbHead = 0;
- macp->TxUrbTail = 0;
- macp->TxUrbCnt = ZM_MAX_TX_URB_NUM;
-}
-
-void zfLnxInitUsbRxQ(zdev_t *dev)
-{
- u16_t i;
- zbuf_t *buf;
- struct usbdrv_private *macp = dev->ml_priv;
-
- /* Zero memory for UsbRxBufQ */
- memset(macp->UsbRxBufQ, 0, sizeof(zbuf_t *) * ZM_MAX_RX_URB_NUM);
-
- macp->RxBufHead = 0;
-
- for (i = 0; i < ZM_MAX_RX_URB_NUM; i++) {
- /*buf = zfwBufAllocate(dev, ZM_MAX_RX_BUFFER_SIZE);*/
- buf = dev_alloc_skb(ZM_MAX_RX_BUFFER_SIZE);
- macp->UsbRxBufQ[i] = buf;
- }
-
- /*macp->RxBufTail = ZM_MAX_RX_URB_NUM - 1;*/
- macp->RxBufTail = 0;
-
- /* Submit all Rx urbs */
- for (i = 0; i < ZM_MAX_RX_URB_NUM; i++) {
- zfLnxPutUsbRxBuffer(dev, macp->UsbRxBufQ[i]);
- zfLnxUsbIn(dev, macp->WlanRxDataUrb[i], macp->UsbRxBufQ[i]);
- }
-}
-
-
-
-u32_t zfLnxUsbSubmitBulkUrb(urb_t *urb, struct usb_device *usb, u16_t epnum, u16_t direction,
- void *transfer_buffer, int buffer_length, usb_complete_t complete, void *context)
-{
- u32_t ret;
-
- if (direction == USB_DIR_OUT) {
- usb_fill_bulk_urb(urb, usb, usb_sndbulkpipe(usb, epnum),
- transfer_buffer, buffer_length, complete, context);
-
- urb->transfer_flags |= URB_ZERO_PACKET;
- } else {
- usb_fill_bulk_urb(urb, usb, usb_rcvbulkpipe(usb, epnum),
- transfer_buffer, buffer_length, complete, context);
- }
-
- if (epnum == 4) {
- if (urb->hcpriv) {
- /*printk("CWY - urb->hcpriv set by unknown reason, reset it\n");
- //urb->hcpriv = 0;*/
- }
- }
-
- ret = usb_submit_urb(urb, GFP_ATOMIC);
- if ((epnum == 4) & (ret != 0)) {
- /*printk("CWY - ret = %x\n", ret);*/
- }
- return ret;
-}
-
-u32_t zfLnxUsbSubmitIntUrb(urb_t *urb, struct usb_device *usb, u16_t epnum, u16_t direction,
- void *transfer_buffer, int buffer_length, usb_complete_t complete, void *context,
- u32_t interval)
-{
- u32_t ret;
-
- if (direction == USB_DIR_OUT) {
- usb_fill_int_urb(urb, usb, usb_sndbulkpipe(usb, epnum),
- transfer_buffer, buffer_length, complete, context, interval);
- } else {
- usb_fill_int_urb(urb, usb, usb_rcvbulkpipe(usb, epnum),
- transfer_buffer, buffer_length, complete, context, interval);
- }
-
- ret = usb_submit_urb(urb, GFP_ATOMIC);
-
- return ret;
-}
-
-#ifdef ZM_ENABLE_CENC
-int zfLnxCencSendMsg(struct sock *netlink_sk, u_int8_t *msg, int len)
-{
-#define COMMTYPE_GROUP 8
-#define WAI_K_MSG 0x11
-
- int ret = -1;
- int size;
- unsigned char *old_tail;
- struct sk_buff *skb;
- struct nlmsghdr *nlh;
- char *pos = NULL;
-
- size = NLMSG_SPACE(len);
- skb = alloc_skb(size, GFP_ATOMIC);
-
- if (skb == NULL) {
- printk("dev_alloc_skb failure \n");
- goto out;
- }
- old_tail = skb->tail;
-
- /* */
- nlh = NLMSG_PUT(skb, 0, 0, WAI_K_MSG, size-sizeof(*nlh));
- pos = NLMSG_DATA(nlh);
-
- /* */
- memcpy(pos, msg, len);
- /* */
- nlh->nlmsg_len = skb->tail - old_tail;
- NETLINK_CB(skb).dst_group = COMMTYPE_GROUP;
- netlink_broadcast(netlink_sk, skb, 0, COMMTYPE_GROUP, GFP_ATOMIC);
- ret = 0;
-out:
- return ret;
-nlmsg_failure: /* */
- kfree_skb(skb);
- goto out;
-
-#undef COMMTYPE_GROUP
-#undef WAI_K_MSG
-}
-#endif /*ZM_ENABLE_CENC*/
-
-/* Simply return 0xffff if VAP function is not supported */
-u16_t zfLnxGetVapId(zdev_t *dev)
-{
- u16_t i;
-
- for (i = 0; i < ZM_VAP_PORT_NUMBER; i++) {
- if (vap[i].dev == dev) {
- return i;
- }
- }
- return 0xffff;
-}
-
-u32_t zfwReadReg(zdev_t *dev, u32_t offset)
-{
- return 0;
-}
-
-#ifndef INIT_WORK
-#define work_struct tq_struct
-
-#define schedule_work(a) schedule_task(a)
-
-#define flush_scheduled_work flush_scheduled_tasks
-#define INIT_WORK(_wq, _routine, _data) INIT_TQUEUE(_wq, _routine, _data)
-#define PREPARE_WORK(_wq, _routine, _data) PREPARE_TQUEUE(_wq, _routine, _data)
-#endif
-
-#define KEVENT_WATCHDOG 0x00000001
-
-u32_t smp_kevent_Lock = 0;
-
-void kevent(struct work_struct *work)
-{
- struct usbdrv_private *macp =
- container_of(work, struct usbdrv_private, kevent);
- zdev_t *dev = macp->device;
-
- if (test_and_set_bit(0, (void *)&smp_kevent_Lock)) {
- /*schedule_work(&macp->kevent);*/
- return;
- }
-
- down(&macp->ioctl_sem);
-
- if (test_and_clear_bit(KEVENT_WATCHDOG, &macp->kevent_flags)) {
- extern u16_t zfHpStartRecv(zdev_t *dev);
- /*zfiHwWatchDogReinit(dev);*/
- printk(("\n ************ Hw watchDog occur!! ************** \n"));
- zfiWlanSuspend(dev);
- zfiWlanResume(dev , 0);
- zfHpStartRecv(dev);
- }
-
- clear_bit(0, (void *)&smp_kevent_Lock);
- up(&macp->ioctl_sem);
-}
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfLnxCreateThread */
-/* Create a Thread */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* */
-/* OUTPUTS */
-/* always 0 */
-/* */
-/* AUTHOR */
-/* Yuan-Gu Wei Atheros Communications, INC. 2007.3 */
-/* */
-/************************************************************************/
-u8_t zfLnxCreateThread(zdev_t *dev)
-{
- struct usbdrv_private *macp = dev->ml_priv;
-
- /* Create Mutex and keventd */
- INIT_WORK(&macp->kevent, kevent);
- init_MUTEX(&macp->ioctl_sem);
-
- return 0;
-}
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfLnxSignalThread */
-/* Signal Thread with Flag */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* flag : signal thread flag */
-/* */
-/* OUTPUTS */
-/* none */
-/* */
-/* AUTHOR */
-/* Yuan-Gu Wei Atheros Communications, INC. 2007.3 */
-/* */
-/************************************************************************/
-void zfLnxSignalThread(zdev_t *dev, int flag)
-{
- struct usbdrv_private *macp = dev->ml_priv;
-
- if (macp == NULL) {
- printk("macp is NULL\n");
- return;
- }
-
- if (0 && macp->kevent_ready != 1) {
- printk("Kevent not ready\n");
- return;
- }
-
- set_bit(flag, &macp->kevent_flags);
-
- if (!schedule_work(&macp->kevent)) {
- /*Fails is Normal
- //printk(KERN_ERR "schedule_task failed, flag = %x\n", flag);*/
- }
-}
-
-/* Notify wrapper todo redownload firmware and reinit procedure when */
-/* hardware watchdog occur : zfiHwWatchDogReinit() */
-void zfLnxWatchDogNotify(zdev_t *dev)
-{
- zfLnxSignalThread(dev, KEVENT_WATCHDOG);
-}
-
-/* Query Durantion of Active Scan */
-void zfwGetActiveScanDur(zdev_t *dev, u8_t *Dur)
-{
- *Dur = 30; /* default 30 ms*/
-}
-
-void zfwGetShowZeroLengthSSID(zdev_t *dev, u8_t *Dur)
-{
- *Dur = 0;
-}
-
OpenPOWER on IntegriCloud