]>
git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blob - drivers/staging/otus/wwrap.c
2 * Copyright (c) 2007-2008 Atheros Communications Inc.
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.
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.
16 /* Module Name : wwrap.c */
18 /* This module contains wrapper functions. */
21 /* Platform dependent. */
24 /* Please include your header files here */
28 #include <linux/netlink.h>
29 #include <linux/slab.h>
30 #include <net/iw_handler.h>
32 extern void zfiRecv80211(zdev_t
* dev
, zbuf_t
* buf
, struct zsAdditionInfo
* addInfo
);
33 extern void zfCoreRecv(zdev_t
* dev
, zbuf_t
* buf
, struct zsAdditionInfo
* addInfo
);
34 extern void zfIdlChkRsp(zdev_t
* dev
, u32_t
* rsp
, u16_t rspLen
);
35 extern void zfIdlRsp(zdev_t
* dev
, u32_t
*rsp
, u16_t rspLen
);
39 //extern struct zsWdsStruct wds[ZM_WDS_PORT_NUMBER];
40 extern struct zsVapStruct vap
[ZM_VAP_PORT_NUMBER
];
42 u32_t
zfLnxUsbSubmitTxData(zdev_t
* dev
);
43 u32_t
zfLnxUsbIn(zdev_t
* dev
, urb_t
*urb
, zbuf_t
*buf
);
44 u32_t
zfLnxSubmitRegInUrb(zdev_t
*dev
);
45 u32_t
zfLnxUsbSubmitBulkUrb(urb_t
*urb
, struct usb_device
*usb
, u16_t epnum
, u16_t direction
,
46 void *transfer_buffer
, int buffer_length
, usb_complete_t complete
, void *context
);
47 u32_t
zfLnxUsbSubmitIntUrb(urb_t
*urb
, struct usb_device
*usb
, u16_t epnum
, u16_t direction
,
48 void *transfer_buffer
, int buffer_length
, usb_complete_t complete
, void *context
,
51 u16_t
zfLnxGetFreeTxUrb(zdev_t
*dev
)
53 struct usbdrv_private
*macp
= dev
->ml_priv
;
55 unsigned long irqFlag
;
57 spin_lock_irqsave(&macp
->cs_lock
, irqFlag
);
59 //idx = ((macp->TxUrbTail + 1) & (ZM_MAX_TX_URB_NUM - 1));
61 //if (idx != macp->TxUrbHead)
62 if (macp
->TxUrbCnt
!= 0)
64 idx
= macp
->TxUrbTail
;
65 macp
->TxUrbTail
= ((macp
->TxUrbTail
+ 1) & (ZM_MAX_TX_URB_NUM
- 1));
70 //printk(KERN_ERR "macp->TxUrbCnt: %d\n", macp->TxUrbCnt);
74 spin_unlock_irqrestore(&macp
->cs_lock
, irqFlag
);
78 void zfLnxPutTxUrb(zdev_t
*dev
)
80 struct usbdrv_private
*macp
= dev
->ml_priv
;
82 unsigned long irqFlag
;
84 spin_lock_irqsave(&macp
->cs_lock
, irqFlag
);
86 idx
= ((macp
->TxUrbHead
+ 1) & (ZM_MAX_TX_URB_NUM
- 1));
88 //if (idx != macp->TxUrbTail)
89 if (macp
->TxUrbCnt
< ZM_MAX_TX_URB_NUM
)
91 macp
->TxUrbHead
= idx
;
96 printk("UsbTxUrbQ inconsistent: TxUrbHead: %d, TxUrbTail: %d\n",
97 macp
->TxUrbHead
, macp
->TxUrbTail
);
100 spin_unlock_irqrestore(&macp
->cs_lock
, irqFlag
);
103 u16_t
zfLnxCheckTxBufferCnt(zdev_t
*dev
)
105 struct usbdrv_private
*macp
= dev
->ml_priv
;
107 unsigned long irqFlag
;
109 spin_lock_irqsave(&macp
->cs_lock
, irqFlag
);
111 TxBufCnt
= macp
->TxBufCnt
;
113 spin_unlock_irqrestore(&macp
->cs_lock
, irqFlag
);
117 UsbTxQ_t
*zfLnxGetUsbTxBuffer(zdev_t
*dev
)
119 struct usbdrv_private
*macp
= dev
->ml_priv
;
122 unsigned long irqFlag
;
124 spin_lock_irqsave(&macp
->cs_lock
, irqFlag
);
126 idx
= ((macp
->TxBufHead
+1) & (ZM_MAX_TX_BUF_NUM
- 1));
128 //if (idx != macp->TxBufTail)
129 if (macp
->TxBufCnt
> 0)
131 //printk("CWY - zfwGetUsbTxBuffer ,macp->TxBufCnt = %d\n", macp->TxBufCnt);
132 TxQ
= (UsbTxQ_t
*)&(macp
->UsbTxBufQ
[macp
->TxBufHead
]);
133 macp
->TxBufHead
= ((macp
->TxBufHead
+1) & (ZM_MAX_TX_BUF_NUM
- 1));
138 if (macp
->TxBufHead
!= macp
->TxBufTail
)
140 printk(KERN_ERR
"zfwGetUsbTxBuf UsbTxBufQ inconsistent: TxBufHead: %d, TxBufTail: %d\n",
141 macp
->TxBufHead
, macp
->TxBufTail
);
144 spin_unlock_irqrestore(&macp
->cs_lock
, irqFlag
);
148 spin_unlock_irqrestore(&macp
->cs_lock
, irqFlag
);
152 u16_t
zfLnxPutUsbTxBuffer(zdev_t
*dev
, u8_t
*hdr
, u16_t hdrlen
,
153 u8_t
*snap
, u16_t snapLen
, u8_t
*tail
, u16_t tailLen
,
154 zbuf_t
*buf
, u16_t offset
)
156 struct usbdrv_private
*macp
= dev
->ml_priv
;
159 unsigned long irqFlag
;
161 spin_lock_irqsave(&macp
->cs_lock
, irqFlag
);
163 idx
= ((macp
->TxBufTail
+1) & (ZM_MAX_TX_BUF_NUM
- 1));
166 //zm_assert(macp->TxBufCnt >= 0); // deleted because of always true
168 //if (idx != macp->TxBufHead)
169 if (macp
->TxBufCnt
< ZM_MAX_TX_BUF_NUM
)
171 //printk("CWY - zfwPutUsbTxBuffer ,macp->TxBufCnt = %d\n", macp->TxBufCnt);
172 TxQ
= (UsbTxQ_t
*)&(macp
->UsbTxBufQ
[macp
->TxBufTail
]);
173 memcpy(TxQ
->hdr
, hdr
, hdrlen
);
174 TxQ
->hdrlen
= hdrlen
;
175 memcpy(TxQ
->snap
, snap
, snapLen
);
176 TxQ
->snapLen
= snapLen
;
177 memcpy(TxQ
->tail
, tail
, tailLen
);
178 TxQ
->tailLen
= tailLen
;
180 TxQ
->offset
= offset
;
182 macp
->TxBufTail
= ((macp
->TxBufTail
+1) & (ZM_MAX_TX_BUF_NUM
- 1));
187 printk(KERN_ERR
"zfLnxPutUsbTxBuffer UsbTxBufQ inconsistent: TxBufHead: %d, TxBufTail: %d, TxBufCnt: %d\n",
188 macp
->TxBufHead
, macp
->TxBufTail
, macp
->TxBufCnt
);
189 spin_unlock_irqrestore(&macp
->cs_lock
, irqFlag
);
193 spin_unlock_irqrestore(&macp
->cs_lock
, irqFlag
);
197 zbuf_t
*zfLnxGetUsbRxBuffer(zdev_t
*dev
)
199 struct usbdrv_private
*macp
= dev
->ml_priv
;
202 unsigned long irqFlag
;
204 spin_lock_irqsave(&macp
->cs_lock
, irqFlag
);
206 //idx = ((macp->RxBufHead+1) & (ZM_MAX_RX_URB_NUM - 1));
208 //if (idx != macp->RxBufTail)
209 if (macp
->RxBufCnt
!= 0)
211 buf
= macp
->UsbRxBufQ
[macp
->RxBufHead
];
212 macp
->RxBufHead
= ((macp
->RxBufHead
+1) & (ZM_MAX_RX_URB_NUM
- 1));
217 printk("RxBufQ inconsistent: RxBufHead: %d, RxBufTail: %d\n",
218 macp
->RxBufHead
, macp
->RxBufTail
);
219 spin_unlock_irqrestore(&macp
->cs_lock
, irqFlag
);
223 spin_unlock_irqrestore(&macp
->cs_lock
, irqFlag
);
227 u32_t
zfLnxPutUsbRxBuffer(zdev_t
*dev
, zbuf_t
*buf
)
229 struct usbdrv_private
*macp
= dev
->ml_priv
;
231 unsigned long irqFlag
;
233 spin_lock_irqsave(&macp
->cs_lock
, irqFlag
);
235 idx
= ((macp
->RxBufTail
+1) & (ZM_MAX_RX_URB_NUM
- 1));
237 //if (idx != macp->RxBufHead)
238 if (macp
->RxBufCnt
!= ZM_MAX_RX_URB_NUM
)
240 macp
->UsbRxBufQ
[macp
->RxBufTail
] = buf
;
241 macp
->RxBufTail
= idx
;
246 printk("RxBufQ inconsistent: RxBufHead: %d, RxBufTail: %d\n",
247 macp
->RxBufHead
, macp
->RxBufTail
);
248 spin_unlock_irqrestore(&macp
->cs_lock
, irqFlag
);
252 spin_unlock_irqrestore(&macp
->cs_lock
, irqFlag
);
256 void zfLnxUsbDataOut_callback(urb_t
*urb
)
258 zdev_t
* dev
= urb
->context
;
261 /* Give the urb back */
264 /* Check whether there is any pending buffer needed */
266 if (zfLnxCheckTxBufferCnt(dev
) != 0)
268 //TxData = zfwGetUsbTxBuffer(dev);
270 //if (TxData == NULL)
272 // printk("Get a NULL buffer from zfwGetUsbTxBuffer\n");
277 zfLnxUsbSubmitTxData(dev
);
282 void zfLnxUsbDataIn_callback(urb_t
*urb
)
284 zdev_t
* dev
= urb
->context
;
285 struct usbdrv_private
*macp
= dev
->ml_priv
;
290 #if ZM_USB_STREAM_MODE == 1
291 static int remain_len
= 0, check_pad
= 0, check_len
= 0;
297 zbuf_t
*rxBufPool
[8];
298 u16_t rxBufPoolIndex
= 0;
301 /* Check status for URB */
302 if (urb
->status
!= 0){
303 printk("zfLnxUsbDataIn_callback() : status=0x%x\n", urb
->status
);
304 if ((urb
->status
!= -ENOENT
) && (urb
->status
!= -ECONNRESET
)
305 && (urb
->status
!= -ESHUTDOWN
))
307 if (urb
->status
== -EPIPE
){
308 //printk(KERN_ERR "nonzero read bulk status received: -EPIPE");
312 if (urb
->status
== -EPROTO
){
313 //printk(KERN_ERR "nonzero read bulk status received: -EPROTO");
318 //printk(KERN_ERR "urb->status: 0x%08x\n", urb->status);
320 /* Dequeue skb buffer */
321 buf
= zfLnxGetUsbRxBuffer(dev
);
322 dev_kfree_skb_any(buf
);
324 /* Enqueue skb buffer */
325 zfLnxPutUsbRxBuffer(dev
, buf
);
327 /* Submit a Rx urb */
328 zfLnxUsbIn(dev
, urb
, buf
);
333 if (urb
->actual_length
== 0)
335 printk(KERN_ERR
"Get an URB whose length is zero");
339 /* Dequeue skb buffer */
340 buf
= zfLnxGetUsbRxBuffer(dev
);
342 //zfwBufSetSize(dev, buf, urb->actual_length);
343 #ifdef NET_SKBUFF_DATA_USES_OFFSET
347 buf
->tail
= buf
->data
;
351 BUG_ON((buf
->tail
+ urb
->actual_length
) > buf
->end
);
353 skb_put(buf
, urb
->actual_length
);
355 #if ZM_USB_STREAM_MODE == 1
358 zbuf_t
*remain_buf
= macp
->reamin_buf
;
361 remain_len
-= check_pad
;
364 memcpy(&(remain_buf
->data
[check_len
]), buf
->data
, remain_len
);
365 check_len
+= remain_len
;
368 rxBufPool
[rxBufPoolIndex
++] = remain_buf
;
371 while(index
< urb
->actual_length
)
373 pkt_len
= buf
->data
[index
] + (buf
->data
[index
+1] << 8);
374 pkt_tag
= buf
->data
[index
+2] + (buf
->data
[index
+3] << 8);
376 if (pkt_tag
== 0x4e00)
380 //printk("Get a packet, index: %d, pkt_len: 0x%04x\n", index, pkt_len);
383 for (ii
= index
; ii
< pkt_len
+4;)
385 printk("%02x ", (buf
->data
[ii
] & 0xff));
387 if ((++ii
% 16) == 0)
394 pad_len
= 4 - (pkt_len
& 0x3);
400 index
= index
+ 4 + pkt_len
+ pad_len
;
402 if (index
> ZM_MAX_RX_BUFFER_SIZE
)
404 remain_len
= index
- ZM_MAX_RX_BUFFER_SIZE
; // - pad_len;
405 check_len
= ZM_MAX_RX_BUFFER_SIZE
- chk_idx
- 4;
408 /* Allocate a skb buffer */
409 //new_buf = zfwBufAllocate(dev, ZM_MAX_RX_BUFFER_SIZE);
410 new_buf
= dev_alloc_skb(ZM_MAX_RX_BUFFER_SIZE
);
412 /* Set skb buffer length */
413 #ifdef NET_SKBUFF_DATA_USES_OFFSET
417 new_buf
->tail
= new_buf
->data
;
421 skb_put(new_buf
, pkt_len
);
423 /* Copy the buffer */
424 memcpy(new_buf
->data
, &(buf
->data
[chk_idx
+4]), check_len
);
426 /* Record the buffer pointer */
427 macp
->reamin_buf
= new_buf
;
431 #ifdef ZM_DONT_COPY_RX_BUFFER
432 if (rxBufPoolIndex
== 0)
434 new_buf
= skb_clone(buf
, GFP_ATOMIC
);
436 new_buf
->data
= &(buf
->data
[chk_idx
+4]);
437 new_buf
->len
= pkt_len
;
442 /* Allocate a skb buffer */
443 new_buf
= dev_alloc_skb(ZM_MAX_RX_BUFFER_SIZE
);
445 /* Set skb buffer length */
446 #ifdef NET_SKBUFF_DATA_USES_OFFSET
450 new_buf
->tail
= new_buf
->data
;
454 skb_put(new_buf
, pkt_len
);
456 /* Copy the buffer */
457 memcpy(new_buf
->data
, &(buf
->data
[chk_idx
+4]), pkt_len
);
459 #ifdef ZM_DONT_COPY_RX_BUFFER
462 rxBufPool
[rxBufPoolIndex
++] = new_buf
;
467 printk(KERN_ERR
"Can't find tag, pkt_len: 0x%04x, tag: 0x%04x\n", pkt_len
, pkt_tag
);
470 dev_kfree_skb_any(buf
);
472 /* Allocate a skb buffer */
473 new_buf
= dev_alloc_skb(ZM_MAX_RX_BUFFER_SIZE
);
475 /* Enqueue skb buffer */
476 zfLnxPutUsbRxBuffer(dev
, new_buf
);
478 /* Submit a Rx urb */
479 zfLnxUsbIn(dev
, urb
, new_buf
);
486 dev_kfree_skb_any(buf
);
489 /* Allocate a skb buffer */
490 new_buf
= dev_alloc_skb(ZM_MAX_RX_BUFFER_SIZE
);
492 /* Enqueue skb buffer */
493 zfLnxPutUsbRxBuffer(dev
, new_buf
);
495 /* Submit a Rx urb */
496 zfLnxUsbIn(dev
, urb
, new_buf
);
498 #if ZM_USB_STREAM_MODE == 1
499 for(ii
= 0; ii
< rxBufPoolIndex
; ii
++)
501 macp
->usbCbFunctions
.zfcbUsbRecv(dev
, rxBufPool
[ii
]);
504 /* pass data to upper layer */
505 macp
->usbCbFunctions
.zfcbUsbRecv(dev
, buf
);
509 void zfLnxUsbRegOut_callback(urb_t
*urb
)
511 //dev_t* dev = urb->context;
513 //printk(KERN_ERR "zfwUsbRegOut_callback\n");
516 void zfLnxUsbRegIn_callback(urb_t
*urb
)
518 zdev_t
* dev
= urb
->context
;
521 struct usbdrv_private
*macp
= dev
->ml_priv
;
523 /* Check status for URB */
524 if (urb
->status
!= 0){
525 printk("zfLnxUsbRegIn_callback() : status=0x%x\n", urb
->status
);
526 if ((urb
->status
!= -ENOENT
) && (urb
->status
!= -ECONNRESET
)
527 && (urb
->status
!= -ESHUTDOWN
))
529 if (urb
->status
== -EPIPE
){
530 //printk(KERN_ERR "nonzero read bulk status received: -EPIPE");
534 if (urb
->status
== -EPROTO
){
535 //printk(KERN_ERR "nonzero read bulk status received: -EPROTO");
540 //printk(KERN_ERR "urb->status: 0x%08x\n", urb->status);
544 if (urb
->actual_length
== 0)
546 printk(KERN_ERR
"Get an URB whose length is zero");
550 /* Copy data into respone buffer */
551 memcpy(rsp
, macp
->regUsbReadBuf
, urb
->actual_length
);
553 /* Notify to upper layer */
554 //zfIdlChkRsp(dev, rsp, (u16_t)urb->actual_length);
555 //zfiUsbRegIn(dev, rsp, (u16_t)urb->actual_length);
556 macp
->usbCbFunctions
.zfcbUsbRegIn(dev
, rsp
, (u16_t
)urb
->actual_length
);
558 /* Issue another USB IN URB */
559 zfLnxSubmitRegInUrb(dev
);
562 u32_t
zfLnxSubmitRegInUrb(zdev_t
*dev
)
565 struct usbdrv_private
*macp
= dev
->ml_priv
;
567 /* Submit a rx urb */
568 //ret = zfLnxUsbSubmitBulkUrb(macp->RegInUrb, macp->udev,
569 // USB_REG_IN_PIPE, USB_DIR_IN, macp->regUsbReadBuf,
570 // ZM_USB_REG_MAX_BUF_SIZE, zfLnxUsbRegIn_callback, dev);
573 // printk("zfwUsbSubmitBulkUrb fail, status: 0x%08x\n", (int)ret);
575 ret
= zfLnxUsbSubmitIntUrb(macp
->RegInUrb
, macp
->udev
,
576 USB_REG_IN_PIPE
, USB_DIR_IN
, macp
->regUsbReadBuf
,
577 ZM_USB_REG_MAX_BUF_SIZE
, zfLnxUsbRegIn_callback
, dev
, 1);
582 u32_t
zfLnxUsbSubmitTxData(zdev_t
* dev
)
587 u8_t
*puTxBuf
= NULL
;
590 struct usbdrv_private
*macp
= dev
->ml_priv
;
591 #if ZM_USB_TX_STREAM_MODE == 1
596 UsbTxQ_t
*TxQPool
[ZM_MAX_TX_AGGREGATE_NUM
];
599 /* First check whether there is a free URB */
600 freeTxUrb
= zfLnxGetFreeTxUrb(dev
);
602 /* If there is no any free Tx Urb */
603 if (freeTxUrb
== 0xffff)
605 //printk(KERN_ERR "Can't get free Tx Urb\n");
606 //printk("CWY - Can't get free Tx Urb\n");
610 #if ZM_USB_TX_STREAM_MODE == 1
611 usbTxAggCnt
= zfLnxCheckTxBufferCnt(dev
);
613 if (usbTxAggCnt
>= ZM_MAX_TX_AGGREGATE_NUM
)
615 usbTxAggCnt
= ZM_MAX_TX_AGGREGATE_NUM
;
622 //printk("usbTxAggCnt: %d\n", usbTxAggCnt);
625 #if ZM_USB_TX_STREAM_MODE == 1
626 for(ii
= 0; ii
< usbTxAggCnt
; ii
++)
629 /* Dequeue the packet from UsbTxBufQ */
630 TxData
= zfLnxGetUsbTxBuffer(dev
);
633 /* Give the urb back */
638 /* Point to the freeTxUrb buffer */
639 puTxBuf
= macp
->txUsbBuf
[freeTxUrb
];
641 #if ZM_USB_TX_STREAM_MODE == 1
643 pUsbTxHdr
= (u16_t
*)puTxBuf
;
645 /* Add the packet length and tag information */
646 *pUsbTxHdr
++ = TxData
->hdrlen
+ TxData
->snapLen
+
647 (TxData
->buf
->len
- TxData
->offset
) + TxData
->tailLen
;
649 *pUsbTxHdr
++ = 0x697e;
652 #endif // #ifdef ZM_USB_TX_STREAM_MODE
654 /* Copy WLAN header and packet buffer into USB buffer */
655 for(i
= 0; i
< TxData
->hdrlen
; i
++)
657 *puTxBuf
++ = TxData
->hdr
[i
];
660 /* Copy SNAP header */
661 for(i
= 0; i
< TxData
->snapLen
; i
++)
663 *puTxBuf
++ = TxData
->snap
[i
];
666 /* Copy packet buffer */
667 for(i
= 0; i
< TxData
->buf
->len
- TxData
->offset
; i
++)
669 //*puTxBuf++ = zmw_rx_buf_readb(dev, TxData->buf, i);
670 *puTxBuf
++ = *(u8_t
*)((u8_t
*)TxData
->buf
->data
+i
+TxData
->offset
);
674 for(i
= 0; i
< TxData
->tailLen
; i
++)
676 *puTxBuf
++ = TxData
->tail
[i
];
679 len
= TxData
->hdrlen
+TxData
->snapLen
+TxData
->buf
->len
+TxData
->tailLen
-TxData
->offset
;
682 if (TxData
->hdrlen
!= 0)
684 puTxBuf
= macp
->txUsbBuf
[freeTxUrb
];
685 for (i
= 0; i
< len
; i
++)
687 printk("%02x ", puTxBuf
[i
]);
695 /* For debug purpose */
696 if(TxData
->hdr
[9] & 0x40)
699 u16_t ctrlLen
= TxData
->hdr
[0] + (TxData
->hdr
[1] << 8);
701 if (ctrlLen
!= len
+ 4)
703 /* Dump control setting */
704 for(i
= 0; i
< 8; i
++)
706 printk(KERN_ERR
"0x%02x ", TxData
->hdr
[i
]);
708 printk(KERN_ERR
"\n");
710 printk(KERN_ERR
"ctrLen: %d, hdrLen: %d, snapLen: %d\n", ctrlLen
, TxData
->hdrlen
, TxData
->snapLen
);
711 printk(KERN_ERR
"bufLen: %d, tailLen: %d, len: %d\n", TxData
->buf
->len
, TxData
->tailLen
, len
);
716 #if ZM_USB_TX_STREAM_MODE == 1
717 // Add the Length and Tag
720 //printk("%d packet, length: %d\n", ii+1, len);
722 if (ii
< (ZM_MAX_TX_AGGREGATE_NUM
-1))
724 /* Pad the buffer to firmware descriptor boundary */
725 offset
+= (((len
-1) / 4) + 1) * 4;
728 if (ii
== (ZM_MAX_TX_AGGREGATE_NUM
-1))
733 TxQPool
[ii
] = TxData
;
735 //DbgPrint("%d packet, offset: %d\n", ii+1, pUsbTxTransfer->offset);
738 //zfBufFree(dev, txData->buf);
741 //printk("CWY - call zfwUsbSubmitBulkUrb(), len = 0x%d\n", len);
742 /* Submit a tx urb */
743 ret
= zfLnxUsbSubmitBulkUrb(macp
->WlanTxDataUrb
[freeTxUrb
], macp
->udev
,
744 USB_WLAN_TX_PIPE
, USB_DIR_OUT
, macp
->txUsbBuf
[freeTxUrb
],
745 len
, zfLnxUsbDataOut_callback
, dev
);
748 // printk("zfwUsbSubmitBulkUrb fail, status: 0x%08x\n", (int)ret);
751 //dev_kfree_skb_any(TxData->buf);
752 #if ZM_USB_TX_STREAM_MODE == 1
753 for(ii
= 0; ii
< usbTxAggCnt
; ii
++)
754 macp
->usbCbFunctions
.zfcbUsbOutComplete(dev
, TxQPool
[ii
]->buf
, 1, TxQPool
[ii
]->hdr
);
756 macp
->usbCbFunctions
.zfcbUsbOutComplete(dev
, TxData
->buf
, 1, TxData
->hdr
);
764 u32_t
zfLnxUsbIn(zdev_t
* dev
, urb_t
*urb
, zbuf_t
*buf
)
767 struct usbdrv_private
*macp
= dev
->ml_priv
;
769 /* Submit a rx urb */
770 ret
= zfLnxUsbSubmitBulkUrb(urb
, macp
->udev
, USB_WLAN_RX_PIPE
,
771 USB_DIR_IN
, buf
->data
, ZM_MAX_RX_BUFFER_SIZE
,
772 zfLnxUsbDataIn_callback
, dev
);
775 // printk("zfwUsbSubmitBulkUrb fail, status: 0x%08x\n", (int)ret);
780 u32_t
zfLnxUsbWriteReg(zdev_t
* dev
, u32_t
* cmd
, u16_t cmdLen
)
782 struct usbdrv_private
*macp
= dev
->ml_priv
;
785 #ifdef ZM_CONFIG_BIG_ENDIAN
788 for(ii
=0; ii
<(cmdLen
>>2); ii
++)
789 cmd
[ii
] = cpu_to_le32(cmd
[ii
]);
792 memcpy(macp
->regUsbWriteBuf
, cmd
, cmdLen
);
794 /* Issue an USB Out transfer */
795 /* Submit a tx urb */
796 ret
= zfLnxUsbSubmitIntUrb(macp
->RegOutUrb
, macp
->udev
,
797 USB_REG_OUT_PIPE
, USB_DIR_OUT
, macp
->regUsbWriteBuf
,
798 cmdLen
, zfLnxUsbRegOut_callback
, dev
, 1);
804 u32_t
zfLnxUsbOut(zdev_t
* dev
, u8_t
*hdr
, u16_t hdrlen
, u8_t
*snap
, u16_t snapLen
,
805 u8_t
*tail
, u16_t tailLen
, zbuf_t
*buf
, u16_t offset
)
808 struct usbdrv_private
*macp
= dev
->ml_priv
;
810 /* Check length of tail buffer */
811 //zm_assert((tailLen <= 16));
813 /* Enqueue the packet into UsbTxBufQ */
814 if (zfLnxPutUsbTxBuffer(dev
, hdr
, hdrlen
, snap
, snapLen
, tail
, tailLen
, buf
, offset
) == 0xffff)
817 //printk("CWY - zfwPutUsbTxBuffer Error, free packet\n");
818 //dev_kfree_skb_any(buf);
819 macp
->usbCbFunctions
.zfcbUsbOutComplete(dev
, buf
, 0, hdr
);
824 //printk("CWY - call zfwUsbSubmitTxData()\n");
825 ret
= zfLnxUsbSubmitTxData(dev
);
829 void zfLnxInitUsbTxQ(zdev_t
* dev
)
831 struct usbdrv_private
*macp
= dev
->ml_priv
;
833 printk(KERN_ERR
"zfwInitUsbTxQ\n");
835 /* Zero memory for UsbTxBufQ */
836 memset(macp
->UsbTxBufQ
, 0, sizeof(UsbTxQ_t
) * ZM_MAX_TX_URB_NUM
);
842 macp
->TxUrbCnt
= ZM_MAX_TX_URB_NUM
;
845 void zfLnxInitUsbRxQ(zdev_t
* dev
)
849 struct usbdrv_private
*macp
= dev
->ml_priv
;
851 /* Zero memory for UsbRxBufQ */
852 memset(macp
->UsbRxBufQ
, 0, sizeof(zbuf_t
*) * ZM_MAX_RX_URB_NUM
);
856 for (i
= 0; i
< ZM_MAX_RX_URB_NUM
; i
++)
858 //buf = zfwBufAllocate(dev, ZM_MAX_RX_BUFFER_SIZE);
859 buf
= dev_alloc_skb(ZM_MAX_RX_BUFFER_SIZE
);
860 macp
->UsbRxBufQ
[i
] = buf
;
863 //macp->RxBufTail = ZM_MAX_RX_URB_NUM - 1;
866 /* Submit all Rx urbs */
867 for (i
= 0; i
< ZM_MAX_RX_URB_NUM
; i
++)
869 zfLnxPutUsbRxBuffer(dev
, macp
->UsbRxBufQ
[i
]);
870 zfLnxUsbIn(dev
, macp
->WlanRxDataUrb
[i
], macp
->UsbRxBufQ
[i
]);
876 u32_t
zfLnxUsbSubmitBulkUrb(urb_t
*urb
, struct usb_device
*usb
, u16_t epnum
, u16_t direction
,
877 void *transfer_buffer
, int buffer_length
, usb_complete_t complete
, void *context
)
881 if(direction
== USB_DIR_OUT
)
883 usb_fill_bulk_urb(urb
, usb
, usb_sndbulkpipe(usb
, epnum
),
884 transfer_buffer
, buffer_length
, complete
, context
);
886 urb
->transfer_flags
|= URB_ZERO_PACKET
;
890 usb_fill_bulk_urb(urb
, usb
, usb_rcvbulkpipe(usb
, epnum
),
891 transfer_buffer
, buffer_length
, complete
, context
);
898 //printk("CWY - urb->hcpriv set by unknown reason, reset it\n");
903 ret
= usb_submit_urb(urb
, GFP_ATOMIC
);
904 if ((epnum
== 4) & (ret
!= 0))
906 //printk("CWY - ret = %x\n", ret);
911 u32_t
zfLnxUsbSubmitIntUrb(urb_t
*urb
, struct usb_device
*usb
, u16_t epnum
, u16_t direction
,
912 void *transfer_buffer
, int buffer_length
, usb_complete_t complete
, void *context
,
917 if(direction
== USB_DIR_OUT
)
919 usb_fill_int_urb(urb
, usb
, usb_sndbulkpipe(usb
, epnum
),
920 transfer_buffer
, buffer_length
, complete
, context
, interval
);
924 usb_fill_int_urb(urb
, usb
, usb_rcvbulkpipe(usb
, epnum
),
925 transfer_buffer
, buffer_length
, complete
, context
, interval
);
928 ret
= usb_submit_urb(urb
, GFP_ATOMIC
);
933 #ifdef ZM_ENABLE_CENC
934 int zfLnxCencSendMsg(struct sock
*netlink_sk
, u_int8_t
*msg
, int len
)
936 #define COMMTYPE_GROUP 8
937 #define WAI_K_MSG 0x11
941 unsigned char *old_tail
;
943 struct nlmsghdr
*nlh
;
946 size
= NLMSG_SPACE(len
);
947 skb
= alloc_skb(size
, GFP_ATOMIC
);
951 printk("dev_alloc_skb failure \n");
954 old_tail
= skb
->tail
;
956 /*ÌîдÊý¾Ý±¨Ïà¹ØÐÅÏ¢*/
957 nlh
= NLMSG_PUT(skb
, 0, 0, WAI_K_MSG
, size
-sizeof(*nlh
));
958 pos
= NLMSG_DATA(nlh
);
961 /*´«Êäµ½Óû§¿Õ¼äµÄÊý¾Ý*/
962 memcpy(pos
, msg
, len
);
963 /*¼ÆËã¾¹ý×Ö½Ú¶ÔÆäºóµÄÊý¾Ýʵ¼Ê³¤¶È*/
964 nlh
->nlmsg_len
= skb
->tail
- old_tail
;
965 NETLINK_CB(skb
).dst_group
= COMMTYPE_GROUP
;
966 netlink_broadcast(netlink_sk
, skb
, 0, COMMTYPE_GROUP
, GFP_ATOMIC
);
970 nlmsg_failure
: /*NLMSG_PUT ʧ°Ü£¬Ôò³·ÏúÌ×½Ó×Ö»º´æ*/
974 #undef COMMTYPE_GROUP
977 #endif //ZM_ENABLE_CENC
979 /* Simply return 0xffff if VAP function is not supported */
980 u16_t
zfLnxGetVapId(zdev_t
* dev
)
984 for (i
=0; i
<ZM_VAP_PORT_NUMBER
; i
++)
986 if (vap
[i
].dev
== dev
)
994 u32_t
zfwReadReg(zdev_t
* dev
, u32_t offset
)
1000 #define work_struct tq_struct
1002 #define schedule_work(a) schedule_task(a)
1004 #define flush_scheduled_work flush_scheduled_tasks
1005 #define INIT_WORK(_wq, _routine, _data) INIT_TQUEUE(_wq, _routine, _data)
1006 #define PREPARE_WORK(_wq, _routine, _data) PREPARE_TQUEUE(_wq, _routine, _data)
1009 #define KEVENT_WATCHDOG 0x00000001
1011 u32_t smp_kevent_Lock
= 0;
1013 void kevent(struct work_struct
*work
)
1015 struct usbdrv_private
*macp
=
1016 container_of(work
, struct usbdrv_private
, kevent
);
1017 zdev_t
*dev
= macp
->device
;
1019 if (test_and_set_bit(0, (void *)&smp_kevent_Lock
))
1021 //schedule_work(&macp->kevent);
1025 down(&macp
->ioctl_sem
);
1027 if (test_and_clear_bit(KEVENT_WATCHDOG
, &macp
->kevent_flags
))
1029 extern u16_t
zfHpStartRecv(zdev_t
*dev
);
1030 //zfiHwWatchDogReinit(dev);
1031 printk(("\n ************ Hw watchDog occur!! ************** \n"));
1032 zfiWlanSuspend(dev
);
1033 zfiWlanResume(dev
,0);
1037 clear_bit(0, (void *)&smp_kevent_Lock
);
1038 up(&macp
->ioctl_sem
);
1041 /************************************************************************/
1043 /* FUNCTION DESCRIPTION zfLnxCreateThread */
1044 /* Create a Thread */
1047 /* dev : device pointer */
1053 /* Yuan-Gu Wei Atheros Communications, INC. 2007.3 */
1055 /************************************************************************/
1056 u8_t
zfLnxCreateThread(zdev_t
*dev
)
1058 struct usbdrv_private
*macp
= dev
->ml_priv
;
1060 /* Create Mutex and keventd */
1061 INIT_WORK(&macp
->kevent
, kevent
);
1062 init_MUTEX(&macp
->ioctl_sem
);
1067 /************************************************************************/
1069 /* FUNCTION DESCRIPTION zfLnxSignalThread */
1070 /* Signal Thread with Flag */
1073 /* dev : device pointer */
1074 /* flag : signal thread flag */
1080 /* Yuan-Gu Wei Atheros Communications, INC. 2007.3 */
1082 /************************************************************************/
1083 void zfLnxSignalThread(zdev_t
*dev
, int flag
)
1085 struct usbdrv_private
*macp
= dev
->ml_priv
;
1089 printk("macp is NULL\n");
1093 if (0 && macp
->kevent_ready
!= 1)
1095 printk("Kevent not ready\n");
1099 set_bit(flag
, &macp
->kevent_flags
);
1101 if (!schedule_work(&macp
->kevent
))
1104 //printk(KERN_ERR "schedule_task failed, flag = %x\n", flag);
1108 /* Notify wrapper todo redownload firmware and reinit procedure when */
1109 /* hardware watchdog occur : zfiHwWatchDogReinit() */
1110 void zfLnxWatchDogNotify(zdev_t
* dev
)
1112 zfLnxSignalThread(dev
, KEVENT_WATCHDOG
);
1115 /* Query Durantion of Active Scan */
1116 void zfwGetActiveScanDur(zdev_t
* dev
, u8_t
* Dur
)
1118 *Dur
= 30; // default 30 ms
1121 void zfwGetShowZeroLengthSSID(zdev_t
* dev
, u8_t
* Dur
)