Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  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 /*  Module Name : wwrap.c                                               */
 17 /*  Abstract                                                            */
 18 /*      This module contains wrapper functions.                         */
 19 /*                                                                      */
 20 /*  NOTES                                                               */
 21 /*      Platform dependent.                                             */
 22 /*                                                                      */
 23 
 24 /* Please include your header files here */
 25 #include "oal_dt.h"
 26 #include "usbdrv.h"
 27 
 28 #include <linux/netlink.h>
 29 
 30 #if WIRELESS_EXT > 12
 31 #include <net/iw_handler.h>
 32 #endif
 33 
 34 extern void zfiRecv80211(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* addInfo);
 35 extern void zfCoreRecv(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* addInfo);
 36 extern void zfIdlChkRsp(zdev_t* dev, u32_t* rsp, u16_t rspLen);
 37 extern void zfIdlRsp(zdev_t* dev, u32_t *rsp, u16_t rspLen);
 38 
 39 
 40 
 41 //extern struct zsWdsStruct wds[ZM_WDS_PORT_NUMBER];
 42 extern struct zsVapStruct vap[ZM_VAP_PORT_NUMBER];
 43 
 44 u32_t zfLnxUsbSubmitTxData(zdev_t* dev);
 45 u32_t zfLnxUsbIn(zdev_t* dev, urb_t *urb, zbuf_t *buf);
 46 u32_t zfLnxSubmitRegInUrb(zdev_t *dev);
 47 u32_t zfLnxUsbSubmitBulkUrb(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);
 49 u32_t zfLnxUsbSubmitIntUrb(urb_t *urb, struct usb_device *usb, u16_t epnum, u16_t direction,
 50         void *transfer_buffer, int buffer_length, usb_complete_t complete, void *context,
 51         u32_t interval);
 52 
 53 u16_t zfLnxGetFreeTxUrb(zdev_t *dev)
 54 {
 55     struct usbdrv_private *macp = dev->ml_priv;
 56     u16_t idx;
 57     unsigned long irqFlag;
 58 
 59     spin_lock_irqsave(&macp->cs_lock, irqFlag);
 60 
 61     //idx = ((macp->TxUrbTail + 1) & (ZM_MAX_TX_URB_NUM - 1));
 62 
 63     //if (idx != macp->TxUrbHead)
 64     if (macp->TxUrbCnt != 0)
 65     {
 66         idx = macp->TxUrbTail;
 67         macp->TxUrbTail = ((macp->TxUrbTail + 1) & (ZM_MAX_TX_URB_NUM - 1));
 68         macp->TxUrbCnt--;
 69     }
 70     else
 71     {
 72         //printk(KERN_ERR "macp->TxUrbCnt: %d\n", macp->TxUrbCnt);
 73         idx = 0xffff;
 74     }
 75 
 76     spin_unlock_irqrestore(&macp->cs_lock, irqFlag);
 77     return idx;
 78 }
 79 
 80 void zfLnxPutTxUrb(zdev_t *dev)
 81 {
 82     struct usbdrv_private *macp = dev->ml_priv;
 83     u16_t idx;
 84     unsigned long irqFlag;
 85 
 86     spin_lock_irqsave(&macp->cs_lock, irqFlag);
 87 
 88     idx = ((macp->TxUrbHead + 1) & (ZM_MAX_TX_URB_NUM - 1));
 89 
 90     //if (idx != macp->TxUrbTail)
 91     if (macp->TxUrbCnt < ZM_MAX_TX_URB_NUM)
 92     {
 93         macp->TxUrbHead = idx;
 94         macp->TxUrbCnt++;
 95     }
 96     else
 97     {
 98         printk("UsbTxUrbQ inconsistent: TxUrbHead: %d, TxUrbTail: %d\n",
 99                 macp->TxUrbHead, macp->TxUrbTail);
100     }
101 
102     spin_unlock_irqrestore(&macp->cs_lock, irqFlag);
103 }
104 
105 u16_t zfLnxCheckTxBufferCnt(zdev_t *dev)
106 {
107     struct usbdrv_private *macp = dev->ml_priv;
108     u16_t TxBufCnt;
109     unsigned long irqFlag;
110 
111     spin_lock_irqsave(&macp->cs_lock, irqFlag);
112 
113     TxBufCnt = macp->TxBufCnt;
114 
115     spin_unlock_irqrestore(&macp->cs_lock, irqFlag);
116     return TxBufCnt;
117 }
118 
119 UsbTxQ_t *zfLnxGetUsbTxBuffer(zdev_t *dev)
120 {
121     struct usbdrv_private *macp = dev->ml_priv;
122     u16_t idx;
123     UsbTxQ_t *TxQ;
124     unsigned long irqFlag;
125 
126     spin_lock_irqsave(&macp->cs_lock, irqFlag);
127 
128     idx = ((macp->TxBufHead+1) & (ZM_MAX_TX_BUF_NUM - 1));
129 
130     //if (idx != macp->TxBufTail)
131     if (macp->TxBufCnt > 0)
132     {
133         //printk("CWY - zfwGetUsbTxBuffer ,macp->TxBufCnt = %d\n", macp->TxBufCnt);
134         TxQ = (UsbTxQ_t *)&(macp->UsbTxBufQ[macp->TxBufHead]);
135         macp->TxBufHead = ((macp->TxBufHead+1) & (ZM_MAX_TX_BUF_NUM - 1));
136         macp->TxBufCnt--;
137     }
138     else
139     {
140         if (macp->TxBufHead != macp->TxBufTail)
141         {
142             printk(KERN_ERR "zfwGetUsbTxBuf UsbTxBufQ inconsistent: TxBufHead: %d, TxBufTail: %d\n",
143                     macp->TxBufHead, macp->TxBufTail);
144         }
145 
146         spin_unlock_irqrestore(&macp->cs_lock, irqFlag);
147         return NULL;
148     }
149 
150     spin_unlock_irqrestore(&macp->cs_lock, irqFlag);
151     return TxQ;
152 }
153 
154 u16_t zfLnxPutUsbTxBuffer(zdev_t *dev, u8_t *hdr, u16_t hdrlen,
155         u8_t *snap, u16_t snapLen, u8_t *tail, u16_t tailLen,
156         zbuf_t *buf, u16_t offset)
157 {
158     struct usbdrv_private *macp = dev->ml_priv;
159     u16_t idx;
160     UsbTxQ_t *TxQ;
161     unsigned long irqFlag;
162 
163     spin_lock_irqsave(&macp->cs_lock, irqFlag);
164 
165     idx = ((macp->TxBufTail+1) & (ZM_MAX_TX_BUF_NUM - 1));
166 
167     /* For Tx debug */
168     //zm_assert(macp->TxBufCnt >= 0); // deleted because of always true
169 
170     //if (idx != macp->TxBufHead)
171     if (macp->TxBufCnt < ZM_MAX_TX_BUF_NUM)
172     {
173         //printk("CWY - zfwPutUsbTxBuffer ,macp->TxBufCnt = %d\n", macp->TxBufCnt);
174         TxQ = (UsbTxQ_t *)&(macp->UsbTxBufQ[macp->TxBufTail]);
175         memcpy(TxQ->hdr, hdr, hdrlen);
176         TxQ->hdrlen = hdrlen;
177         memcpy(TxQ->snap, snap, snapLen);
178         TxQ->snapLen = snapLen;
179         memcpy(TxQ->tail, tail, tailLen);
180         TxQ->tailLen = tailLen;
181         TxQ->buf = buf;
182         TxQ->offset = offset;
183 
184         macp->TxBufTail = ((macp->TxBufTail+1) & (ZM_MAX_TX_BUF_NUM - 1));
185         macp->TxBufCnt++;
186     }
187     else
188     {
189         printk(KERN_ERR "zfLnxPutUsbTxBuffer UsbTxBufQ inconsistent: TxBufHead: %d, TxBufTail: %d, TxBufCnt: %d\n",
190             macp->TxBufHead, macp->TxBufTail, macp->TxBufCnt);
191         spin_unlock_irqrestore(&macp->cs_lock, irqFlag);
192         return 0xffff;
193     }
194 
195     spin_unlock_irqrestore(&macp->cs_lock, irqFlag);
196     return 0;
197 }
198 
199 zbuf_t *zfLnxGetUsbRxBuffer(zdev_t *dev)
200 {
201     struct usbdrv_private *macp = dev->ml_priv;
202     //u16_t idx;
203     zbuf_t *buf;
204     unsigned long irqFlag;
205 
206     spin_lock_irqsave(&macp->cs_lock, irqFlag);
207 
208     //idx = ((macp->RxBufHead+1) & (ZM_MAX_RX_URB_NUM - 1));
209 
210     //if (idx != macp->RxBufTail)
211     if (macp->RxBufCnt != 0)
212     {
213         buf = macp->UsbRxBufQ[macp->RxBufHead];
214         macp->RxBufHead = ((macp->RxBufHead+1) & (ZM_MAX_RX_URB_NUM - 1));
215         macp->RxBufCnt--;
216     }
217     else
218     {
219         printk("RxBufQ inconsistent: RxBufHead: %d, RxBufTail: %d\n",
220                 macp->RxBufHead, macp->RxBufTail);
221         spin_unlock_irqrestore(&macp->cs_lock, irqFlag);
222         return NULL;
223     }
224 
225     spin_unlock_irqrestore(&macp->cs_lock, irqFlag);
226     return buf;
227 }
228 
229 u32_t zfLnxPutUsbRxBuffer(zdev_t *dev, zbuf_t *buf)
230 {
231     struct usbdrv_private *macp = dev->ml_priv;
232     u16_t idx;
233     unsigned long irqFlag;
234 
235     spin_lock_irqsave(&macp->cs_lock, irqFlag);
236 
237     idx = ((macp->RxBufTail+1) & (ZM_MAX_RX_URB_NUM - 1));
238 
239     //if (idx != macp->RxBufHead)
240     if (macp->RxBufCnt != ZM_MAX_RX_URB_NUM)
241     {
242         macp->UsbRxBufQ[macp->RxBufTail] = buf;
243         macp->RxBufTail = idx;
244         macp->RxBufCnt++;
245     }
246     else
247     {
248         printk("RxBufQ inconsistent: RxBufHead: %d, RxBufTail: %d\n",
249                 macp->RxBufHead, macp->RxBufTail);
250         spin_unlock_irqrestore(&macp->cs_lock, irqFlag);
251         return 0xffff;
252     }
253 
254     spin_unlock_irqrestore(&macp->cs_lock, irqFlag);
255     return 0;
256 }
257 
258 void zfLnxUsbDataOut_callback(urb_t *urb)
259 {
260     zdev_t* dev = urb->context;
261     //UsbTxQ_t *TxData;
262 
263     /* Give the urb back */
264     zfLnxPutTxUrb(dev);
265 
266     /* Check whether there is any pending buffer needed */
267     /* to be sent */
268     if (zfLnxCheckTxBufferCnt(dev) != 0)
269     {
270         //TxData = zfwGetUsbTxBuffer(dev);
271 
272         //if (TxData == NULL)
273         //{
274         //    printk("Get a NULL buffer from zfwGetUsbTxBuffer\n");
275         //    return;
276         //}
277         //else
278         //{
279             zfLnxUsbSubmitTxData(dev);
280         //}
281     }
282 }
283 
284 void zfLnxUsbDataIn_callback(urb_t *urb)
285 {
286     zdev_t* dev = urb->context;
287     struct usbdrv_private *macp = dev->ml_priv;
288     zbuf_t *buf;
289     zbuf_t *new_buf;
290     int status;
291 
292 #if ZM_USB_STREAM_MODE == 1
293     static int remain_len = 0, check_pad = 0, check_len = 0;
294     int index = 0;
295     int chk_idx;
296     u16_t pkt_len;
297     u16_t pkt_tag;
298     u16_t ii;
299     zbuf_t *rxBufPool[8];
300     u16_t rxBufPoolIndex = 0;
301 #endif
302 
303     /* Check status for URB */
304     if (urb->status != 0){
305         printk("zfLnxUsbDataIn_callback() : status=0x%x\n", urb->status);
306         if ((urb->status != -ENOENT) && (urb->status != -ECONNRESET)
307             && (urb->status != -ESHUTDOWN))
308         {
309                 if (urb->status == -EPIPE){
310                     //printk(KERN_ERR "nonzero read bulk status received: -EPIPE");
311                     status = -1;
312                 }
313 
314                 if (urb->status == -EPROTO){
315                     //printk(KERN_ERR "nonzero read bulk status received: -EPROTO");
316                     status = -1;
317                 }
318         }
319 
320         //printk(KERN_ERR "urb->status: 0x%08x\n", urb->status);
321 
322         /* Dequeue skb buffer */
323         buf = zfLnxGetUsbRxBuffer(dev);
324         dev_kfree_skb_any(buf);
325         #if 0
326         /* Enqueue skb buffer */
327         zfLnxPutUsbRxBuffer(dev, buf);
328 
329         /* Submit a Rx urb */
330         zfLnxUsbIn(dev, urb, buf);
331         #endif
332         return;
333     }
334 
335     if (urb->actual_length == 0)
336     {
337         printk(KERN_ERR "Get an URB whose length is zero");
338         status = -1;
339     }
340 
341     /* Dequeue skb buffer */
342     buf = zfLnxGetUsbRxBuffer(dev);
343 
344     //zfwBufSetSize(dev, buf, urb->actual_length);
345 #ifdef NET_SKBUFF_DATA_USES_OFFSET
346     buf->tail = 0;
347     buf->len = 0;
348 #else
349     buf->tail = buf->data;
350     buf->len = 0;
351 #endif
352 
353     BUG_ON((buf->tail + urb->actual_length) > buf->end);
354 
355     skb_put(buf, urb->actual_length);
356 
357 #if ZM_USB_STREAM_MODE == 1
358     if (remain_len != 0)
359     {
360         zbuf_t *remain_buf = macp->reamin_buf;
361 
362         index = remain_len;
363         remain_len -= check_pad;
364 
365         /*  Copy data */
366         memcpy(&(remain_buf->data[check_len]), buf->data, remain_len);
367         check_len += remain_len;
368         remain_len = 0;
369 
370         rxBufPool[rxBufPoolIndex++] = remain_buf;
371     }
372 
373     while(index < urb->actual_length)
374     {
375         pkt_len = buf->data[index] + (buf->data[index+1] << 8);
376         pkt_tag = buf->data[index+2] + (buf->data[index+3] << 8);
377 
378         if (pkt_tag == 0x4e00)
379         {
380             int pad_len;
381 
382             //printk("Get a packet, index: %d, pkt_len: 0x%04x\n", index, pkt_len);
383             #if 0
384             /* Dump data */
385             for (ii = index; ii < pkt_len+4;)
386             {
387                 printk("%02x ", (buf->data[ii] & 0xff));
388 
389                 if ((++ii % 16) == 0)
390                     printk("\n");
391             }
392 
393             printk("\n");
394             #endif
395 
396             pad_len = 4 - (pkt_len & 0x3);
397 
398             if(pad_len == 4)
399                 pad_len = 0;
400 
401             chk_idx = index;
402             index = index + 4 + pkt_len + pad_len;
403 
404             if (index > ZM_MAX_RX_BUFFER_SIZE)
405             {
406                 remain_len = index - ZM_MAX_RX_BUFFER_SIZE; // - pad_len;
407                 check_len = ZM_MAX_RX_BUFFER_SIZE - chk_idx - 4;
408                 check_pad = pad_len;
409 
410                 /* Allocate a skb buffer */
411                 //new_buf = zfwBufAllocate(dev, ZM_MAX_RX_BUFFER_SIZE);
412                 new_buf = dev_alloc_skb(ZM_MAX_RX_BUFFER_SIZE);
413 
414                 /* Set skb buffer length */
415             #ifdef NET_SKBUFF_DATA_USES_OFFSET
416                 new_buf->tail = 0;
417                 new_buf->len = 0;
418             #else
419                 new_buf->tail = new_buf->data;
420                 new_buf->len = 0;
421             #endif
422 
423                 skb_put(new_buf, pkt_len);
424 
425                 /* Copy the buffer */
426                 memcpy(new_buf->data, &(buf->data[chk_idx+4]), check_len);
427 
428                 /* Record the buffer pointer */
429                 macp->reamin_buf = new_buf;
430             }
431             else
432             {
433         #ifdef ZM_DONT_COPY_RX_BUFFER
434                 if (rxBufPoolIndex == 0)
435                 {
436                     new_buf = skb_clone(buf, GFP_ATOMIC);
437 
438                     new_buf->data = &(buf->data[chk_idx+4]);
439                     new_buf->len = pkt_len;
440                 }
441                 else
442                 {
443         #endif
444                 /* Allocate a skb buffer */
445                 new_buf = dev_alloc_skb(ZM_MAX_RX_BUFFER_SIZE);
446 
447                 /* Set skb buffer length */
448             #ifdef NET_SKBUFF_DATA_USES_OFFSET
449                 new_buf->tail = 0;
450                 new_buf->len = 0;
451             #else
452                 new_buf->tail = new_buf->data;
453                 new_buf->len = 0;
454             #endif
455 
456                 skb_put(new_buf, pkt_len);
457 
458                 /* Copy the buffer */
459                 memcpy(new_buf->data, &(buf->data[chk_idx+4]), pkt_len);
460 
461         #ifdef ZM_DONT_COPY_RX_BUFFER
462                 }
463         #endif
464                 rxBufPool[rxBufPoolIndex++] = new_buf;
465             }
466         }
467         else
468         {
469             printk(KERN_ERR "Can't find tag, pkt_len: 0x%04x, tag: 0x%04x\n", pkt_len, pkt_tag);
470 
471             /* Free buffer */
472             dev_kfree_skb_any(buf);
473 
474             /* Allocate a skb buffer */
475             new_buf = dev_alloc_skb(ZM_MAX_RX_BUFFER_SIZE);
476 
477             /* Enqueue skb buffer */
478             zfLnxPutUsbRxBuffer(dev, new_buf);
479 
480             /* Submit a Rx urb */
481             zfLnxUsbIn(dev, urb, new_buf);
482 
483             return;
484         }
485     }
486 
487     /* Free buffer */
488     dev_kfree_skb_any(buf);
489 #endif
490 
491     /* Allocate a skb buffer */
492     new_buf = dev_alloc_skb(ZM_MAX_RX_BUFFER_SIZE);
493 
494     /* Enqueue skb buffer */
495     zfLnxPutUsbRxBuffer(dev, new_buf);
496 
497     /* Submit a Rx urb */
498     zfLnxUsbIn(dev, urb, new_buf);
499 
500 #if ZM_USB_STREAM_MODE == 1
501     for(ii = 0; ii < rxBufPoolIndex; ii++)
502     {
503         macp->usbCbFunctions.zfcbUsbRecv(dev, rxBufPool[ii]);
504     }
505 #else
506     /* pass data to upper layer */
507     macp->usbCbFunctions.zfcbUsbRecv(dev, buf);
508 #endif
509 }
510 
511 void zfLnxUsbRegOut_callback(urb_t *urb)
512 {
513     //dev_t* dev = urb->context;
514 
515     //printk(KERN_ERR "zfwUsbRegOut_callback\n");
516 }
517 
518 void zfLnxUsbRegIn_callback(urb_t *urb)
519 {
520     zdev_t* dev = urb->context;
521     u32_t rsp[64/4];
522     int status;
523     struct usbdrv_private *macp = dev->ml_priv;
524 
525     /* Check status for URB */
526     if (urb->status != 0){
527         printk("zfLnxUsbRegIn_callback() : status=0x%x\n", urb->status);
528         if ((urb->status != -ENOENT) && (urb->status != -ECONNRESET)
529             && (urb->status != -ESHUTDOWN))
530         {
531                 if (urb->status == -EPIPE){
532                     //printk(KERN_ERR "nonzero read bulk status received: -EPIPE");
533                     status = -1;
534                 }
535 
536                 if (urb->status == -EPROTO){
537                     //printk(KERN_ERR "nonzero read bulk status received: -EPROTO");
538                     status = -1;
539                 }
540         }
541 
542         //printk(KERN_ERR "urb->status: 0x%08x\n", urb->status);
543         return;
544     }
545 
546     if (urb->actual_length == 0)
547     {
548         printk(KERN_ERR "Get an URB whose length is zero");
549         status = -1;
550     }
551 
552     /* Copy data into respone buffer */
553     memcpy(rsp, macp->regUsbReadBuf, urb->actual_length);
554 
555     /* Notify to upper layer */
556     //zfIdlChkRsp(dev, rsp, (u16_t)urb->actual_length);
557     //zfiUsbRegIn(dev, rsp, (u16_t)urb->actual_length);
558     macp->usbCbFunctions.zfcbUsbRegIn(dev, rsp, (u16_t)urb->actual_length);
559 
560     /* Issue another USB IN URB */
561     zfLnxSubmitRegInUrb(dev);
562 }
563 
564 u32_t zfLnxSubmitRegInUrb(zdev_t *dev)
565 {
566     u32_t ret;
567     struct usbdrv_private *macp = dev->ml_priv;
568 
569     /* Submit a rx urb */
570     //ret = zfLnxUsbSubmitBulkUrb(macp->RegInUrb, macp->udev,
571     //        USB_REG_IN_PIPE, USB_DIR_IN, macp->regUsbReadBuf,
572     //        ZM_USB_REG_MAX_BUF_SIZE, zfLnxUsbRegIn_callback, dev);
573     //CWYang(-)
574     //if (ret != 0)
575     //    printk("zfwUsbSubmitBulkUrb fail, status: 0x%08x\n", (int)ret);
576 
577     ret = zfLnxUsbSubmitIntUrb(macp->RegInUrb, macp->udev,
578             USB_REG_IN_PIPE, USB_DIR_IN, macp->regUsbReadBuf,
579             ZM_USB_REG_MAX_BUF_SIZE, zfLnxUsbRegIn_callback, dev, 1);
580 
581     return ret;
582 }
583 
584 u32_t zfLnxUsbSubmitTxData(zdev_t* dev)
585 {
586     u32_t i;
587     u32_t ret;
588     u16_t freeTxUrb;
589     u8_t *puTxBuf = NULL;
590     UsbTxQ_t *TxData;
591     int len = 0;
592     struct usbdrv_private *macp = dev->ml_priv;
593 #if ZM_USB_TX_STREAM_MODE == 1
594     u8_t               ii;
595     u16_t              offset = 0;
596     u16_t              usbTxAggCnt;
597     u16_t              *pUsbTxHdr;
598     UsbTxQ_t           *TxQPool[ZM_MAX_TX_AGGREGATE_NUM];
599 #endif
600 
601     /* First check whether there is a free URB */
602     freeTxUrb = zfLnxGetFreeTxUrb(dev);
603 
604     /* If there is no any free Tx Urb */
605     if (freeTxUrb == 0xffff)
606     {
607         //printk(KERN_ERR "Can't get free Tx Urb\n");
608         //printk("CWY - Can't get free Tx Urb\n");
609         return 0xffff;
610     }
611 
612 #if ZM_USB_TX_STREAM_MODE == 1
613     usbTxAggCnt = zfLnxCheckTxBufferCnt(dev);
614 
615     if (usbTxAggCnt >= ZM_MAX_TX_AGGREGATE_NUM)
616     {
617        usbTxAggCnt = ZM_MAX_TX_AGGREGATE_NUM;
618     }
619     else
620     {
621        usbTxAggCnt = 1;
622     }
623 
624     //printk("usbTxAggCnt: %d\n", usbTxAggCnt);
625 #endif
626 
627 #if ZM_USB_TX_STREAM_MODE == 1
628     for(ii = 0; ii < usbTxAggCnt; ii++)
629     {
630 #endif
631     /* Dequeue the packet from UsbTxBufQ */
632     TxData = zfLnxGetUsbTxBuffer(dev);
633     if (TxData == NULL)
634     {
635         /* Give the urb back */
636         zfLnxPutTxUrb(dev);
637         return 0xffff;
638     }
639 
640     /* Point to the freeTxUrb buffer */
641     puTxBuf = macp->txUsbBuf[freeTxUrb];
642 
643 #if ZM_USB_TX_STREAM_MODE == 1
644     puTxBuf += offset;
645     pUsbTxHdr = (u16_t *)puTxBuf;
646 
647     /* Add the packet length and tag information */
648     *pUsbTxHdr++ = TxData->hdrlen + TxData->snapLen +
649              (TxData->buf->len - TxData->offset) +  TxData->tailLen;
650 
651     *pUsbTxHdr++ = 0x697e;
652 
653     puTxBuf += 4;
654 #endif // #ifdef ZM_USB_TX_STREAM_MODE
655 
656     /* Copy WLAN header and packet buffer into USB buffer */
657     for(i = 0; i < TxData->hdrlen; i++)
658     {
659         *puTxBuf++ = TxData->hdr[i];
660     }
661 
662     /* Copy SNAP header */
663     for(i = 0; i < TxData->snapLen; i++)
664     {
665         *puTxBuf++ = TxData->snap[i];
666     }
667 
668     /* Copy packet buffer */
669     for(i = 0; i < TxData->buf->len - TxData->offset; i++)
670     {
671         //*puTxBuf++ = zmw_rx_buf_readb(dev, TxData->buf, i);
672         *puTxBuf++ = *(u8_t*)((u8_t*)TxData->buf->data+i+TxData->offset);
673     }
674 
675     /* Copy tail */
676     for(i = 0; i < TxData->tailLen; i++)
677     {
678         *puTxBuf++ = TxData->tail[i];
679     }
680 
681     len = TxData->hdrlen+TxData->snapLen+TxData->buf->len+TxData->tailLen-TxData->offset;
682 
683     #if 0
684     if (TxData->hdrlen != 0)
685     {
686         puTxBuf = macp->txUsbBuf[freeTxUrb];
687         for (i = 0; i < len; i++)
688         {
689             printk("%02x ", puTxBuf[i]);
690             if (i % 16 == 15)
691                 printk("\n");
692         }
693         printk("\n");
694     }
695     #endif
696     #if 0
697     /* For debug purpose */
698     if(TxData->hdr[9] & 0x40)
699     {
700         int i;
701         u16_t ctrlLen = TxData->hdr[0] + (TxData->hdr[1] << 8);
702 
703         if (ctrlLen != len + 4)
704         {
705         /* Dump control setting */
706         for(i = 0; i < 8; i++)
707         {
708             printk(KERN_ERR "0x%02x ", TxData->hdr[i]);
709         }
710         printk(KERN_ERR "\n");
711 
712         printk(KERN_ERR "ctrLen: %d, hdrLen: %d, snapLen: %d\n", ctrlLen, TxData->hdrlen, TxData->snapLen);
713         printk(KERN_ERR "bufLen: %d, tailLen: %d, len: %d\n", TxData->buf->len, TxData->tailLen, len);
714         }
715     }
716     #endif
717 
718 #if ZM_USB_TX_STREAM_MODE == 1
719     // Add the Length and Tag
720     len += 4;
721 
722     //printk("%d packet, length: %d\n", ii+1, len);
723 
724     if (ii < (ZM_MAX_TX_AGGREGATE_NUM-1))
725     {
726         /* Pad the buffer to firmware descriptor boundary */
727         offset += (((len-1) / 4) + 1) * 4;
728     }
729 
730     if (ii == (ZM_MAX_TX_AGGREGATE_NUM-1))
731     {
732         len += offset;
733     }
734 
735     TxQPool[ii] = TxData;
736 
737     //DbgPrint("%d packet, offset: %d\n", ii+1, pUsbTxTransfer->offset);
738 
739     /* free packet */
740     //zfBufFree(dev, txData->buf);
741     }
742 #endif
743     //printk("CWY - call zfwUsbSubmitBulkUrb(), len = 0x%d\n", len);
744     /* Submit a tx urb */
745     ret = zfLnxUsbSubmitBulkUrb(macp->WlanTxDataUrb[freeTxUrb], macp->udev,
746             USB_WLAN_TX_PIPE, USB_DIR_OUT, macp->txUsbBuf[freeTxUrb],
747             len, zfLnxUsbDataOut_callback, dev);
748     //CWYang(-)
749     //if (ret != 0)
750     //    printk("zfwUsbSubmitBulkUrb fail, status: 0x%08x\n", (int)ret);
751 
752     /* free packet */
753     //dev_kfree_skb_any(TxData->buf);
754 #if ZM_USB_TX_STREAM_MODE == 1
755     for(ii = 0; ii < usbTxAggCnt; ii++)
756         macp->usbCbFunctions.zfcbUsbOutComplete(dev, TxQPool[ii]->buf, 1, TxQPool[ii]->hdr);
757 #else
758     macp->usbCbFunctions.zfcbUsbOutComplete(dev, TxData->buf, 1, TxData->hdr);
759 #endif
760 
761     return ret;
762 }
763 
764 
765 
766 u32_t zfLnxUsbIn(zdev_t* dev, urb_t *urb, zbuf_t *buf)
767 {
768     u32_t ret;
769     struct usbdrv_private *macp = dev->ml_priv;
770 
771     /* Submit a rx urb */
772     ret = zfLnxUsbSubmitBulkUrb(urb, macp->udev, USB_WLAN_RX_PIPE,
773             USB_DIR_IN, buf->data, ZM_MAX_RX_BUFFER_SIZE,
774             zfLnxUsbDataIn_callback, dev);
775     //CWYang(-)
776     //if (ret != 0)
777     //    printk("zfwUsbSubmitBulkUrb fail, status: 0x%08x\n", (int)ret);
778 
779     return ret;
780 }
781 
782 u32_t zfLnxUsbWriteReg(zdev_t* dev, u32_t* cmd, u16_t cmdLen)
783 {
784     struct usbdrv_private *macp = dev->ml_priv;
785     u32_t ret;
786 
787 #ifdef ZM_CONFIG_BIG_ENDIAN
788     int ii = 0;
789 
790     for(ii=0; ii<(cmdLen>>2); ii++)
791         cmd[ii] = cpu_to_le32(cmd[ii]);
792 #endif
793 
794     memcpy(macp->regUsbWriteBuf, cmd, cmdLen);
795 
796     /* Issue an USB Out transfer */
797     /* Submit a tx urb */
798     ret = zfLnxUsbSubmitIntUrb(macp->RegOutUrb, macp->udev,
799             USB_REG_OUT_PIPE, USB_DIR_OUT, macp->regUsbWriteBuf,
800             cmdLen, zfLnxUsbRegOut_callback, dev, 1);
801 
802     return ret;
803 }
804 
805 
806 u32_t zfLnxUsbOut(zdev_t* dev, u8_t *hdr, u16_t hdrlen, u8_t *snap, u16_t snapLen,
807         u8_t *tail, u16_t tailLen, zbuf_t *buf, u16_t offset)
808 {
809     u32_t ret;
810     struct usbdrv_private *macp = dev->ml_priv;
811 
812     /* Check length of tail buffer */
813     //zm_assert((tailLen <= 16));
814 
815     /* Enqueue the packet into UsbTxBufQ */
816     if (zfLnxPutUsbTxBuffer(dev, hdr, hdrlen, snap, snapLen, tail, tailLen, buf, offset) == 0xffff)
817     {
818         /* free packet */
819         //printk("CWY - zfwPutUsbTxBuffer Error, free packet\n");
820         //dev_kfree_skb_any(buf);
821         macp->usbCbFunctions.zfcbUsbOutComplete(dev, buf, 0, hdr);
822         return 0xffff;
823     }
824 
825     //return 0;
826     //printk("CWY - call zfwUsbSubmitTxData()\n");
827     ret = zfLnxUsbSubmitTxData(dev);
828     return ret;
829 }
830 
831 void zfLnxInitUsbTxQ(zdev_t* dev)
832 {
833     struct usbdrv_private *macp = dev->ml_priv;
834 
835     printk(KERN_ERR "zfwInitUsbTxQ\n");
836 
837     /* Zero memory for UsbTxBufQ */
838     memset(macp->UsbTxBufQ, 0, sizeof(UsbTxQ_t) * ZM_MAX_TX_URB_NUM);
839 
840     macp->TxBufHead = 0;
841     macp->TxBufTail = 0;
842     macp->TxUrbHead = 0;
843     macp->TxUrbTail = 0;
844     macp->TxUrbCnt = ZM_MAX_TX_URB_NUM;
845 }
846 
847 void zfLnxInitUsbRxQ(zdev_t* dev)
848 {
849     u16_t i;
850     zbuf_t *buf;
851     struct usbdrv_private *macp = dev->ml_priv;
852 
853     /* Zero memory for UsbRxBufQ */
854     memset(macp->UsbRxBufQ, 0, sizeof(zbuf_t *) * ZM_MAX_RX_URB_NUM);
855 
856     macp->RxBufHead = 0;
857 
858     for (i = 0; i < ZM_MAX_RX_URB_NUM; i++)
859     {
860         //buf = zfwBufAllocate(dev, ZM_MAX_RX_BUFFER_SIZE);
861         buf = dev_alloc_skb(ZM_MAX_RX_BUFFER_SIZE);
862         macp->UsbRxBufQ[i] = buf;
863     }
864 
865     //macp->RxBufTail = ZM_MAX_RX_URB_NUM - 1;
866     macp->RxBufTail = 0;
867 
868     /* Submit all Rx urbs */
869     for (i = 0; i < ZM_MAX_RX_URB_NUM; i++)
870     {
871         zfLnxPutUsbRxBuffer(dev, macp->UsbRxBufQ[i]);
872         zfLnxUsbIn(dev, macp->WlanRxDataUrb[i], macp->UsbRxBufQ[i]);
873     }
874 }
875 
876 
877 
878 u32_t zfLnxUsbSubmitBulkUrb(urb_t *urb, struct usb_device *usb, u16_t epnum, u16_t direction,
879         void *transfer_buffer, int buffer_length, usb_complete_t complete, void *context)
880 {
881     u32_t ret;
882 
883     if(direction == USB_DIR_OUT)
884     {
885         usb_fill_bulk_urb(urb, usb, usb_sndbulkpipe(usb, epnum),
886                 transfer_buffer, buffer_length, complete, context);
887 
888         urb->transfer_flags |= URB_ZERO_PACKET;
889     }
890     else
891     {
892         usb_fill_bulk_urb(urb, usb, usb_rcvbulkpipe(usb, epnum),
893                 transfer_buffer, buffer_length, complete, context);
894     }
895 
896     if (epnum == 4)
897     {
898         if (urb->hcpriv)
899         {
900             //printk("CWY - urb->hcpriv set by unknown reason, reset it\n");
901             //urb->hcpriv = 0;
902         }
903     }
904 
905     ret = usb_submit_urb(urb, GFP_ATOMIC);
906     if ((epnum == 4) & (ret != 0))
907     {
908         //printk("CWY - ret = %x\n", ret);
909     }
910     return ret;
911 }
912 
913 u32_t zfLnxUsbSubmitIntUrb(urb_t *urb, struct usb_device *usb, u16_t epnum, u16_t direction,
914         void *transfer_buffer, int buffer_length, usb_complete_t complete, void *context,
915         u32_t interval)
916 {
917     u32_t ret;
918 
919     if(direction == USB_DIR_OUT)
920     {
921         usb_fill_int_urb(urb, usb, usb_sndbulkpipe(usb, epnum),
922                 transfer_buffer, buffer_length, complete, context, interval);
923     }
924     else
925     {
926         usb_fill_int_urb(urb, usb, usb_rcvbulkpipe(usb, epnum),
927                 transfer_buffer, buffer_length, complete, context, interval);
928     }
929 
930     ret = usb_submit_urb(urb, GFP_ATOMIC);
931 
932     return ret;
933 }
934 
935 #ifdef ZM_ENABLE_CENC
936 int zfLnxCencSendMsg(struct sock *netlink_sk, u_int8_t *msg, int len)
937 {
938 #define COMMTYPE_GROUP   8
939 #define WAI_K_MSG        0x11
940 
941         int ret = -1;
942         int size;
943         unsigned char *old_tail;
944         struct sk_buff *skb;
945         struct nlmsghdr *nlh;
946         char *pos = NULL;
947 
948         size = NLMSG_SPACE(len);
949         skb = alloc_skb(size, GFP_ATOMIC);
950 
951         if(skb == NULL)
952         {
953                 printk("dev_alloc_skb failure \n");
954                 goto out;
955         }
956         old_tail = skb->tail;
957 
958         /*填写数据报相关信息*/
959         nlh = NLMSG_PUT(skb, 0, 0, WAI_K_MSG, size-sizeof(*nlh));
960         pos = NLMSG_DATA(nlh);
961         memset(pos, 0, len);
962 
963         /*传输到用户空间的数据*/
964         memcpy(pos, msg,  len);
965         /*计算经过字节对其后的数据实际长度*/
966         nlh->nlmsg_len = skb->tail - old_tail;
967         NETLINK_CB(skb).dst_group = COMMTYPE_GROUP;
968         netlink_broadcast(netlink_sk, skb, 0, COMMTYPE_GROUP, GFP_ATOMIC);
969         ret = 0;
970 out:
971         return ret;
972 nlmsg_failure: /*NLMSG_PUT 失败,则撤销套接字缓存*/
973         kfree_skb(skb);
974         goto out;
975 
976 #undef COMMTYPE_GROUP
977 #undef WAI_K_MSG
978 }
979 #endif //ZM_ENABLE_CENC
980 
981 /* Simply return 0xffff if VAP function is not supported */
982 u16_t zfLnxGetVapId(zdev_t* dev)
983 {
984     u16_t i;
985 
986     for (i=0; i<ZM_VAP_PORT_NUMBER; i++)
987     {
988         if (vap[i].dev == dev)
989         {
990             return i;
991         }
992     }
993     return 0xffff;
994 }
995 
996 u32_t zfwReadReg(zdev_t* dev, u32_t offset)
997 {
998     return 0;
999 }
1000 
1001 #ifndef INIT_WORK
1002 #define work_struct tq_struct
1003 
1004 #define schedule_work(a)  schedule_task(a)
1005 
1006 #define flush_scheduled_work  flush_scheduled_tasks
1007 #define INIT_WORK(_wq, _routine, _data)  INIT_TQUEUE(_wq, _routine, _data)
1008 #define PREPARE_WORK(_wq, _routine, _data)  PREPARE_TQUEUE(_wq, _routine, _data)
1009 #endif
1010 
1011 #define KEVENT_WATCHDOG        0x00000001
1012 
1013 u32_t smp_kevent_Lock = 0;
1014 
1015 void kevent(struct work_struct *work)
1016 {
1017     struct usbdrv_private *macp =
1018                container_of(work, struct usbdrv_private, kevent);
1019     zdev_t *dev = macp->device;
1020 
1021     if (macp == NULL)
1022     {
1023         return;
1024     }
1025 
1026     if (test_and_set_bit(0, (void *)&smp_kevent_Lock))
1027     {
1028         //schedule_work(&macp->kevent);
1029         return;
1030     }
1031 
1032     down(&macp->ioctl_sem);
1033 
1034     if (test_and_clear_bit(KEVENT_WATCHDOG, &macp->kevent_flags))
1035     {
1036     extern u16_t zfHpStartRecv(zdev_t *dev);
1037         //zfiHwWatchDogReinit(dev);
1038         printk(("\n ************ Hw watchDog occur!! ************** \n"));
1039         zfiWlanSuspend(dev);
1040         zfiWlanResume(dev,0);
1041         zfHpStartRecv(dev);
1042     }
1043 
1044     clear_bit(0, (void *)&smp_kevent_Lock);
1045     up(&macp->ioctl_sem);
1046 }
1047 
1048 /************************************************************************/
1049 /*                                                                      */
1050 /*    FUNCTION DESCRIPTION                 zfLnxCreateThread            */
1051 /*      Create a Thread                                                 */
1052 /*                                                                      */
1053 /*    INPUTS                                                            */
1054 /*      dev : device pointer                                            */
1055 /*                                                                      */
1056 /*    OUTPUTS                                                           */
1057 /*      always 0                                                        */
1058 /*                                                                      */
1059 /*    AUTHOR                                                            */
1060 /*      Yuan-Gu Wei         Atheros Communications, INC.    2007.3      */
1061 /*                                                                      */
1062 /************************************************************************/
1063 u8_t zfLnxCreateThread(zdev_t *dev)
1064 {
1065     struct usbdrv_private *macp = dev->ml_priv;
1066 
1067     /* Create Mutex and keventd */
1068     INIT_WORK(&macp->kevent, kevent);
1069     init_MUTEX(&macp->ioctl_sem);
1070 
1071     return 0;
1072 }
1073 
1074 /************************************************************************/
1075 /*                                                                      */
1076 /*    FUNCTION DESCRIPTION                 zfLnxSignalThread            */
1077 /*      Signal Thread with Flag                                         */
1078 /*                                                                      */
1079 /*    INPUTS                                                            */
1080 /*      dev : device pointer                                            */
1081 /*      flag : signal thread flag                                       */
1082 /*                                                                      */
1083 /*    OUTPUTS                                                           */
1084 /*      none                                                            */
1085 /*                                                                      */
1086 /*    AUTHOR                                                            */
1087 /*      Yuan-Gu Wei         Atheros Communications, INC.    2007.3      */
1088 /*                                                                      */
1089 /************************************************************************/
1090 void zfLnxSignalThread(zdev_t *dev, int flag)
1091 {
1092     struct usbdrv_private *macp = dev->ml_priv;
1093 
1094     if (macp == NULL)
1095     {
1096         printk("macp is NULL\n");
1097         return;
1098     }
1099 
1100     if (0 && macp->kevent_ready != 1)
1101     {
1102         printk("Kevent not ready\n");
1103         return;
1104     }
1105 
1106     set_bit(flag, &macp->kevent_flags);
1107 
1108     if (!schedule_work(&macp->kevent))
1109     {
1110         //Fails is Normal
1111         //printk(KERN_ERR "schedule_task failed, flag = %x\n", flag);
1112     }
1113 }
1114 
1115 /* Notify wrapper todo redownload firmware and reinit procedure when */
1116 /* hardware watchdog occur : zfiHwWatchDogReinit() */
1117 void zfLnxWatchDogNotify(zdev_t* dev)
1118 {
1119     zfLnxSignalThread(dev, KEVENT_WATCHDOG);
1120 }
1121 
1122 /* Query Durantion of Active Scan */
1123 void zfwGetActiveScanDur(zdev_t* dev, u8_t* Dur)
1124 {
1125     *Dur = 30; // default 30 ms
1126 }
1127 
1128 void zfwGetShowZeroLengthSSID(zdev_t* dev, u8_t* Dur)
1129 {
1130     *Dur = 0;
1131 }
1132 
1133 
  This page was automatically generated by the LXR engine.