]> pilppa.org Git - linux-2.6-omap-h63xx.git/blob - drivers/net/wireless/libertas/if_usb.c
[PATCH] libertas: send reset command directly instead of calling libertas_reset_device
[linux-2.6-omap-h63xx.git] / drivers / net / wireless / libertas / if_usb.c
1 /**
2   * This file contains functions used in USB interface module.
3   */
4 #include <linux/delay.h>
5 #include <linux/moduleparam.h>
6 #include <linux/firmware.h>
7 #include <linux/netdevice.h>
8 #include <linux/list.h>
9 #include <linux/usb.h>
10
11 #define DRV_NAME "usb8xxx"
12
13 #include "host.h"
14 #include "decl.h"
15 #include "defs.h"
16 #include "dev.h"
17 #include "if_usb.h"
18 #include "decl.h"
19
20 #define MESSAGE_HEADER_LEN      4
21
22 static const char usbdriver_name[] = "usb8xxx";
23 static u8 *default_fw_name = "usb8388.bin";
24
25 static char *libertas_fw_name = NULL;
26 module_param_named(fw_name, libertas_fw_name, charp, 0644);
27
28 /*
29  * We need to send a RESET command to all USB devices before
30  * we tear down the USB connection. Otherwise we would not
31  * be able to re-init device the device if the module gets
32  * loaded again. This is a list of all initialized USB devices,
33  * for the reset code see if_usb_reset_device()
34 */
35 static LIST_HEAD(usb_devices);
36
37 static struct usb_device_id if_usb_table[] = {
38         /* Enter the device signature inside */
39         { USB_DEVICE(0x1286, 0x2001) },
40         { USB_DEVICE(0x05a3, 0x8388) },
41         {}      /* Terminating entry */
42 };
43
44 MODULE_DEVICE_TABLE(usb, if_usb_table);
45
46 static void if_usb_receive(struct urb *urb);
47 static void if_usb_receive_fwload(struct urb *urb);
48 static int if_usb_prog_firmware(struct usb_card_rec *cardp);
49 static int if_usb_host_to_card(wlan_private * priv, u8 type, u8 * payload, u16 nb);
50 static int if_usb_get_int_status(wlan_private * priv, u8 *);
51 static int if_usb_read_event_cause(wlan_private *);
52 static int usb_tx_block(struct usb_card_rec *cardp, u8 *payload, u16 nb);
53 static void if_usb_free(struct usb_card_rec *cardp);
54 static int if_usb_submit_rx_urb(struct usb_card_rec *cardp);
55 static int if_usb_reset_device(struct usb_card_rec *cardp);
56
57 /**
58  *  @brief  call back function to handle the status of the URB
59  *  @param urb          pointer to urb structure
60  *  @return             N/A
61  */
62 static void if_usb_write_bulk_callback(struct urb *urb)
63 {
64         struct usb_card_rec *cardp = (struct usb_card_rec *) urb->context;
65
66         /* handle the transmission complete validations */
67
68         if (urb->status == 0) {
69                 wlan_private *priv = cardp->priv;
70
71                 /*
72                 lbs_deb_usbd(&urb->dev->dev, "URB status is successfull\n");
73                 lbs_deb_usbd(&urb->dev->dev, "Actual length transmitted %d\n",
74                        urb->actual_length);
75                 */
76
77                 /* Used for both firmware TX and regular TX.  priv isn't
78                  * valid at firmware load time.
79                  */
80                 if (priv) {
81                         wlan_adapter *adapter = priv->adapter;
82                         struct net_device *dev = priv->dev;
83
84                         priv->dnld_sent = DNLD_RES_RECEIVED;
85
86                         /* Wake main thread if commands are pending */
87                         if (!adapter->cur_cmd)
88                                 wake_up_interruptible(&priv->waitq);
89
90                         if ((adapter->connect_status == LIBERTAS_CONNECTED)) {
91                                 netif_wake_queue(dev);
92                                 netif_wake_queue(priv->mesh_dev);
93                         }
94                 }
95         } else {
96                 /* print the failure status number for debug */
97                 lbs_pr_info("URB in failure status: %d\n", urb->status);
98         }
99
100         return;
101 }
102
103 /**
104  *  @brief  free tx/rx urb, skb and rx buffer
105  *  @param cardp        pointer usb_card_rec
106  *  @return             N/A
107  */
108 static void if_usb_free(struct usb_card_rec *cardp)
109 {
110         lbs_deb_enter(LBS_DEB_USB);
111
112         /* Unlink tx & rx urb */
113         usb_kill_urb(cardp->tx_urb);
114         usb_kill_urb(cardp->rx_urb);
115
116         usb_free_urb(cardp->tx_urb);
117         cardp->tx_urb = NULL;
118
119         usb_free_urb(cardp->rx_urb);
120         cardp->rx_urb = NULL;
121
122         kfree(cardp->bulk_out_buffer);
123         cardp->bulk_out_buffer = NULL;
124
125         lbs_deb_leave(LBS_DEB_USB);
126 }
127
128 /**
129  *  @brief sets the configuration values
130  *  @param ifnum        interface number
131  *  @param id           pointer to usb_device_id
132  *  @return             0 on success, error code on failure
133  */
134 static int if_usb_probe(struct usb_interface *intf,
135                         const struct usb_device_id *id)
136 {
137         struct usb_device *udev;
138         struct usb_host_interface *iface_desc;
139         struct usb_endpoint_descriptor *endpoint;
140         wlan_private *priv;
141         struct usb_card_rec *cardp;
142         int i;
143
144         udev = interface_to_usbdev(intf);
145
146         cardp = kzalloc(sizeof(struct usb_card_rec), GFP_KERNEL);
147         if (!cardp) {
148                 lbs_pr_err("Out of memory allocating private data.\n");
149                 goto error;
150         }
151
152         cardp->udev = udev;
153         iface_desc = intf->cur_altsetting;
154
155         lbs_deb_usbd(&udev->dev, "bcdUSB = 0x%X bDeviceClass = 0x%X"
156                " bDeviceSubClass = 0x%X, bDeviceProtocol = 0x%X\n",
157                      le16_to_cpu(udev->descriptor.bcdUSB),
158                      udev->descriptor.bDeviceClass,
159                      udev->descriptor.bDeviceSubClass,
160                      udev->descriptor.bDeviceProtocol);
161
162         for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
163                 endpoint = &iface_desc->endpoint[i].desc;
164                 if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK)
165                     && ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
166                         USB_ENDPOINT_XFER_BULK)) {
167                         /* we found a bulk in endpoint */
168                         lbs_deb_usbd(&udev->dev, "Bulk in size is %d\n",
169                                      le16_to_cpu(endpoint->wMaxPacketSize));
170                         if (!(cardp->rx_urb = usb_alloc_urb(0, GFP_KERNEL))) {
171                                 lbs_deb_usbd(&udev->dev,
172                                        "Rx URB allocation failed\n");
173                                 goto dealloc;
174                         }
175                         cardp->rx_urb_recall = 0;
176
177                         cardp->bulk_in_size =
178                                 le16_to_cpu(endpoint->wMaxPacketSize);
179                         cardp->bulk_in_endpointAddr =
180                             (endpoint->
181                              bEndpointAddress & USB_ENDPOINT_NUMBER_MASK);
182                         lbs_deb_usbd(&udev->dev, "in_endpoint = %d\n",
183                                endpoint->bEndpointAddress);
184                 }
185
186                 if (((endpoint->
187                       bEndpointAddress & USB_ENDPOINT_DIR_MASK) ==
188                      USB_DIR_OUT)
189                     && ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
190                         USB_ENDPOINT_XFER_BULK)) {
191                         /* We found bulk out endpoint */
192                         if (!(cardp->tx_urb = usb_alloc_urb(0, GFP_KERNEL))) {
193                                 lbs_deb_usbd(&udev->dev,
194                                        "Tx URB allocation failed\n");
195                                 goto dealloc;
196                         }
197
198                         cardp->bulk_out_size =
199                                 le16_to_cpu(endpoint->wMaxPacketSize);
200                         lbs_deb_usbd(&udev->dev,
201                                      "Bulk out size is %d\n",
202                                      le16_to_cpu(endpoint->wMaxPacketSize));
203                         cardp->bulk_out_endpointAddr =
204                             endpoint->bEndpointAddress;
205                         lbs_deb_usbd(&udev->dev, "out_endpoint = %d\n",
206                                     endpoint->bEndpointAddress);
207                         cardp->bulk_out_buffer =
208                             kmalloc(MRVDRV_ETH_TX_PACKET_BUFFER_SIZE,
209                                     GFP_KERNEL);
210
211                         if (!cardp->bulk_out_buffer) {
212                                 lbs_deb_usbd(&udev->dev,
213                                        "Could not allocate buffer\n");
214                                 goto dealloc;
215                         }
216                 }
217         }
218
219         /* Upload firmware */
220         cardp->rinfo.cardp = cardp;
221         if (if_usb_prog_firmware(cardp)) {
222                 lbs_deb_usbd(&udev->dev, "FW upload failed");
223                 goto err_prog_firmware;
224         }
225
226         if (!(priv = libertas_add_card(cardp, &udev->dev)))
227                 goto err_prog_firmware;
228
229         cardp->priv = priv;
230
231         if (libertas_add_mesh(priv, &udev->dev))
232                 goto err_add_mesh;
233
234         cardp->eth_dev = priv->dev;
235
236         priv->hw_host_to_card = if_usb_host_to_card;
237         priv->hw_get_int_status = if_usb_get_int_status;
238         priv->hw_read_event_cause = if_usb_read_event_cause;
239         priv->boot2_version = udev->descriptor.bcdDevice;
240
241         /* Delay 200 ms to waiting for the FW ready */
242         if_usb_submit_rx_urb(cardp);
243         msleep_interruptible(200);
244         priv->adapter->fw_ready = 1;
245
246         if (libertas_start_card(priv))
247                 goto err_start_card;
248
249         list_add_tail(&cardp->list, &usb_devices);
250
251         usb_get_dev(udev);
252         usb_set_intfdata(intf, cardp);
253
254         return 0;
255
256 err_start_card:
257         libertas_remove_mesh(priv);
258 err_add_mesh:
259         libertas_remove_card(priv);
260 err_prog_firmware:
261         if_usb_reset_device(cardp);
262 dealloc:
263         if_usb_free(cardp);
264
265 error:
266         return -ENOMEM;
267 }
268
269 /**
270  *  @brief free resource and cleanup
271  *  @param intf         USB interface structure
272  *  @return             N/A
273  */
274 static void if_usb_disconnect(struct usb_interface *intf)
275 {
276         struct usb_card_rec *cardp = usb_get_intfdata(intf);
277         wlan_private *priv = (wlan_private *) cardp->priv;
278
279         lbs_deb_enter(LBS_DEB_MAIN);
280
281         /* Update Surprise removed to TRUE */
282         cardp->surprise_removed = 1;
283
284         list_del(&cardp->list);
285
286         if (priv) {
287                 wlan_adapter *adapter = priv->adapter;
288
289                 adapter->surpriseremoved = 1;
290                 libertas_stop_card(priv);
291                 libertas_remove_mesh(priv);
292                 libertas_remove_card(priv);
293         }
294
295         /* Unlink and free urb */
296         if_usb_free(cardp);
297
298         usb_set_intfdata(intf, NULL);
299         usb_put_dev(interface_to_usbdev(intf));
300
301         lbs_deb_leave(LBS_DEB_MAIN);
302 }
303
304 /**
305  *  @brief  This function download FW
306  *  @param priv         pointer to wlan_private
307  *  @return             0
308  */
309 static int if_prog_firmware(struct usb_card_rec *cardp)
310 {
311         struct FWData *fwdata;
312         struct fwheader *fwheader;
313         u8 *firmware = cardp->fw->data;
314
315         fwdata = kmalloc(sizeof(struct FWData), GFP_ATOMIC);
316
317         if (!fwdata)
318                 return -1;
319
320         fwheader = &fwdata->fwheader;
321
322         if (!cardp->CRC_OK) {
323                 cardp->totalbytes = cardp->fwlastblksent;
324                 cardp->fwseqnum = cardp->lastseqnum - 1;
325         }
326
327         /*
328         lbs_deb_usbd(&cardp->udev->dev, "totalbytes = %d\n",
329                     cardp->totalbytes);
330         */
331
332         memcpy(fwheader, &firmware[cardp->totalbytes],
333                sizeof(struct fwheader));
334
335         cardp->fwlastblksent = cardp->totalbytes;
336         cardp->totalbytes += sizeof(struct fwheader);
337
338         /* lbs_deb_usbd(&cardp->udev->dev,"Copy Data\n"); */
339         memcpy(fwdata->data, &firmware[cardp->totalbytes],
340                le32_to_cpu(fwdata->fwheader.datalength));
341
342         /*
343         lbs_deb_usbd(&cardp->udev->dev,
344                     "Data length = %d\n", le32_to_cpu(fwdata->fwheader.datalength));
345         */
346
347         cardp->fwseqnum = cardp->fwseqnum + 1;
348
349         fwdata->seqnum = cpu_to_le32(cardp->fwseqnum);
350         cardp->lastseqnum = cardp->fwseqnum;
351         cardp->totalbytes += le32_to_cpu(fwdata->fwheader.datalength);
352
353         if (fwheader->dnldcmd == cpu_to_le32(FW_HAS_DATA_TO_RECV)) {
354                 /*
355                 lbs_deb_usbd(&cardp->udev->dev, "There are data to follow\n");
356                 lbs_deb_usbd(&cardp->udev->dev,
357                             "seqnum = %d totalbytes = %d\n", cardp->fwseqnum,
358                             cardp->totalbytes);
359                 */
360                 memcpy(cardp->bulk_out_buffer, fwheader, FW_DATA_XMIT_SIZE);
361                 usb_tx_block(cardp, cardp->bulk_out_buffer, FW_DATA_XMIT_SIZE);
362
363         } else if (fwdata->fwheader.dnldcmd == cpu_to_le32(FW_HAS_LAST_BLOCK)) {
364                 /*
365                 lbs_deb_usbd(&cardp->udev->dev,
366                             "Host has finished FW downloading\n");
367                 lbs_deb_usbd(&cardp->udev->dev,
368                             "Donwloading FW JUMP BLOCK\n");
369                 */
370                 memcpy(cardp->bulk_out_buffer, fwheader, FW_DATA_XMIT_SIZE);
371                 usb_tx_block(cardp, cardp->bulk_out_buffer, FW_DATA_XMIT_SIZE);
372                 cardp->fwfinalblk = 1;
373         }
374
375         /*
376         lbs_deb_usbd(&cardp->udev->dev,
377                     "The firmware download is done size is %d\n",
378                     cardp->totalbytes);
379         */
380
381         kfree(fwdata);
382
383         return 0;
384 }
385
386 static int if_usb_reset_device(struct usb_card_rec *cardp)
387 {
388         int ret;
389         wlan_private * priv = cardp->priv;
390
391         lbs_deb_enter(LBS_DEB_USB);
392
393         /* Try a USB port reset first, if that fails send the reset
394          * command to the firmware.
395          */
396         ret = usb_reset_device(cardp->udev);
397         if (!ret && priv) {
398                 msleep(10);
399                 ret = libertas_reset_device(priv);
400                 msleep(10);
401         }
402
403         lbs_deb_leave_args(LBS_DEB_USB, "ret %d", ret);
404
405         return ret;
406 }
407
408 /**
409  *  @brief This function transfer the data to the device.
410  *  @param priv         pointer to wlan_private
411  *  @param payload      pointer to payload data
412  *  @param nb           data length
413  *  @return             0 or -1
414  */
415 static int usb_tx_block(struct usb_card_rec *cardp, u8 * payload, u16 nb)
416 {
417         int ret = -1;
418
419         /* check if device is removed */
420         if (cardp->surprise_removed) {
421                 lbs_deb_usbd(&cardp->udev->dev, "Device removed\n");
422                 goto tx_ret;
423         }
424
425         usb_fill_bulk_urb(cardp->tx_urb, cardp->udev,
426                           usb_sndbulkpipe(cardp->udev,
427                                           cardp->bulk_out_endpointAddr),
428                           payload, nb, if_usb_write_bulk_callback, cardp);
429
430         cardp->tx_urb->transfer_flags |= URB_ZERO_PACKET;
431
432         if ((ret = usb_submit_urb(cardp->tx_urb, GFP_ATOMIC))) {
433                 /*  transfer failed */
434                 lbs_deb_usbd(&cardp->udev->dev, "usb_submit_urb failed\n");
435                 ret = -1;
436         } else {
437                 /* lbs_deb_usbd(&cardp->udev->dev, "usb_submit_urb success\n"); */
438                 ret = 0;
439         }
440
441 tx_ret:
442         return ret;
443 }
444
445 static int __if_usb_submit_rx_urb(struct usb_card_rec *cardp,
446                                   void (*callbackfn)(struct urb *urb))
447 {
448         struct sk_buff *skb;
449         struct read_cb_info *rinfo = &cardp->rinfo;
450         int ret = -1;
451
452         if (!(skb = dev_alloc_skb(MRVDRV_ETH_RX_PACKET_BUFFER_SIZE))) {
453                 lbs_pr_err("No free skb\n");
454                 goto rx_ret;
455         }
456
457         rinfo->skb = skb;
458
459         /* Fill the receive configuration URB and initialise the Rx call back */
460         usb_fill_bulk_urb(cardp->rx_urb, cardp->udev,
461                           usb_rcvbulkpipe(cardp->udev,
462                                           cardp->bulk_in_endpointAddr),
463                           (void *) (skb->tail + (size_t) IPFIELD_ALIGN_OFFSET),
464                           MRVDRV_ETH_RX_PACKET_BUFFER_SIZE, callbackfn,
465                           rinfo);
466
467         cardp->rx_urb->transfer_flags |= URB_ZERO_PACKET;
468
469         /* lbs_deb_usbd(&cardp->udev->dev, "Pointer for rx_urb %p\n", cardp->rx_urb); */
470         if ((ret = usb_submit_urb(cardp->rx_urb, GFP_ATOMIC))) {
471                 /* handle failure conditions */
472                 lbs_deb_usbd(&cardp->udev->dev, "Submit Rx URB failed\n");
473                 ret = -1;
474         } else {
475                 /* lbs_deb_usbd(&cardp->udev->dev, "Submit Rx URB success\n"); */
476                 ret = 0;
477         }
478
479 rx_ret:
480         return ret;
481 }
482
483 static int if_usb_submit_rx_urb_fwload(struct usb_card_rec *cardp)
484 {
485         return __if_usb_submit_rx_urb(cardp, &if_usb_receive_fwload);
486 }
487
488 static int if_usb_submit_rx_urb(struct usb_card_rec *cardp)
489 {
490         return __if_usb_submit_rx_urb(cardp, &if_usb_receive);
491 }
492
493 static void if_usb_receive_fwload(struct urb *urb)
494 {
495         struct read_cb_info *rinfo = (struct read_cb_info *)urb->context;
496         struct sk_buff *skb = rinfo->skb;
497         struct usb_card_rec *cardp = (struct usb_card_rec *)rinfo->cardp;
498         struct fwsyncheader *syncfwheader;
499         struct bootcmdrespStr bootcmdresp;
500
501         if (urb->status) {
502                 lbs_deb_usbd(&cardp->udev->dev,
503                             "URB status is failed during fw load\n");
504                 kfree_skb(skb);
505                 return;
506         }
507
508         if (cardp->bootcmdresp == 0) {
509                 memcpy (&bootcmdresp, skb->data + IPFIELD_ALIGN_OFFSET,
510                         sizeof(bootcmdresp));
511                 if (le16_to_cpu(cardp->udev->descriptor.bcdDevice) < 0x3106) {
512                         kfree_skb(skb);
513                         if_usb_submit_rx_urb_fwload(cardp);
514                         cardp->bootcmdresp = 1;
515                         lbs_deb_usbd(&cardp->udev->dev,
516                                     "Received valid boot command response\n");
517                         return;
518                 }
519                 if (bootcmdresp.u32magicnumber != cpu_to_le32(BOOT_CMD_MAGIC_NUMBER)) {
520                         lbs_pr_info(
521                                 "boot cmd response wrong magic number (0x%x)\n",
522                                 le32_to_cpu(bootcmdresp.u32magicnumber));
523                 } else if (bootcmdresp.u8cmd_tag != BOOT_CMD_FW_BY_USB) {
524                         lbs_pr_info(
525                                 "boot cmd response cmd_tag error (%d)\n",
526                                 bootcmdresp.u8cmd_tag);
527                 } else if (bootcmdresp.u8result != BOOT_CMD_RESP_OK) {
528                         lbs_pr_info(
529                                 "boot cmd response result error (%d)\n",
530                                 bootcmdresp.u8result);
531                 } else {
532                         cardp->bootcmdresp = 1;
533                         lbs_deb_usbd(&cardp->udev->dev,
534                                     "Received valid boot command response\n");
535                 }
536                 kfree_skb(skb);
537                 if_usb_submit_rx_urb_fwload(cardp);
538                 return;
539         }
540
541         syncfwheader = kmalloc(sizeof(struct fwsyncheader), GFP_ATOMIC);
542         if (!syncfwheader) {
543                 lbs_deb_usbd(&cardp->udev->dev, "Failure to allocate syncfwheader\n");
544                 kfree_skb(skb);
545                 return;
546         }
547
548         memcpy(syncfwheader, skb->data + IPFIELD_ALIGN_OFFSET,
549                         sizeof(struct fwsyncheader));
550
551         if (!syncfwheader->cmd) {
552                 /*
553                 lbs_deb_usbd(&cardp->udev->dev,
554                             "FW received Blk with correct CRC\n");
555                 lbs_deb_usbd(&cardp->udev->dev,
556                             "FW received Blk seqnum = %d\n",
557                        syncfwheader->seqnum);
558                 */
559                 cardp->CRC_OK = 1;
560         } else {
561                 lbs_deb_usbd(&cardp->udev->dev,
562                             "FW received Blk with CRC error\n");
563                 cardp->CRC_OK = 0;
564         }
565
566         kfree_skb(skb);
567
568         if (cardp->fwfinalblk) {
569                 cardp->fwdnldover = 1;
570                 goto exit;
571         }
572
573         if_prog_firmware(cardp);
574
575         if_usb_submit_rx_urb_fwload(cardp);
576 exit:
577         kfree(syncfwheader);
578
579         return;
580
581 }
582
583 #define MRVDRV_MIN_PKT_LEN      30
584
585 static inline void process_cmdtypedata(int recvlength, struct sk_buff *skb,
586                                        struct usb_card_rec *cardp,
587                                        wlan_private *priv)
588 {
589         if (recvlength > MRVDRV_ETH_RX_PACKET_BUFFER_SIZE +
590             MESSAGE_HEADER_LEN || recvlength < MRVDRV_MIN_PKT_LEN) {
591                 lbs_deb_usbd(&cardp->udev->dev,
592                             "Packet length is Invalid\n");
593                 kfree_skb(skb);
594                 return;
595         }
596
597         skb_reserve(skb, IPFIELD_ALIGN_OFFSET);
598         skb_put(skb, recvlength);
599         skb_pull(skb, MESSAGE_HEADER_LEN);
600         libertas_process_rxed_packet(priv, skb);
601         priv->upld_len = (recvlength - MESSAGE_HEADER_LEN);
602 }
603
604 static inline void process_cmdrequest(int recvlength, u8 *recvbuff,
605                                       struct sk_buff *skb,
606                                       struct usb_card_rec *cardp,
607                                       wlan_private *priv)
608 {
609         u8 *cmdbuf;
610         if (recvlength > MRVDRV_SIZE_OF_CMD_BUFFER) {
611                 lbs_deb_usbd(&cardp->udev->dev,
612                             "The receive buffer is too large\n");
613                 kfree_skb(skb);
614                 return;
615         }
616
617         if (!in_interrupt())
618                 BUG();
619
620         spin_lock(&priv->adapter->driver_lock);
621         /* take care of cur_cmd = NULL case by reading the
622          * data to clear the interrupt */
623         if (!priv->adapter->cur_cmd) {
624                 cmdbuf = priv->upld_buf;
625                 priv->adapter->hisregcpy &= ~MRVDRV_CMD_UPLD_RDY;
626         } else
627                 cmdbuf = priv->adapter->cur_cmd->bufvirtualaddr;
628
629         cardp->usb_int_cause |= MRVDRV_CMD_UPLD_RDY;
630         priv->upld_len = (recvlength - MESSAGE_HEADER_LEN);
631         memcpy(cmdbuf, recvbuff + MESSAGE_HEADER_LEN,
632                priv->upld_len);
633
634         kfree_skb(skb);
635         libertas_interrupt(priv->dev);
636         spin_unlock(&priv->adapter->driver_lock);
637
638         lbs_deb_usbd(&cardp->udev->dev,
639                     "Wake up main thread to handle cmd response\n");
640
641         return;
642 }
643
644 /**
645  *  @brief This function reads of the packet into the upload buff,
646  *  wake up the main thread and initialise the Rx callack.
647  *
648  *  @param urb          pointer to struct urb
649  *  @return             N/A
650  */
651 static void if_usb_receive(struct urb *urb)
652 {
653         struct read_cb_info *rinfo = (struct read_cb_info *)urb->context;
654         struct sk_buff *skb = rinfo->skb;
655         struct usb_card_rec *cardp = (struct usb_card_rec *) rinfo->cardp;
656         wlan_private * priv = cardp->priv;
657
658         int recvlength = urb->actual_length;
659         u8 *recvbuff = NULL;
660         u32 recvtype = 0;
661
662         lbs_deb_enter(LBS_DEB_USB);
663
664         if (recvlength) {
665                 __le32 tmp;
666
667                 if (urb->status) {
668                         lbs_deb_usbd(&cardp->udev->dev,
669                                     "URB status is failed\n");
670                         kfree_skb(skb);
671                         goto setup_for_next;
672                 }
673
674                 recvbuff = skb->data + IPFIELD_ALIGN_OFFSET;
675                 memcpy(&tmp, recvbuff, sizeof(u32));
676                 recvtype = le32_to_cpu(tmp);
677                 lbs_deb_usbd(&cardp->udev->dev,
678                             "Recv length = 0x%x, Recv type = 0x%X\n",
679                             recvlength, recvtype);
680         } else if (urb->status)
681                 goto rx_exit;
682
683         switch (recvtype) {
684         case CMD_TYPE_DATA:
685                 process_cmdtypedata(recvlength, skb, cardp, priv);
686                 break;
687
688         case CMD_TYPE_REQUEST:
689                 process_cmdrequest(recvlength, recvbuff, skb, cardp, priv);
690                 break;
691
692         case CMD_TYPE_INDICATION:
693                 /* Event cause handling */
694                 spin_lock(&priv->adapter->driver_lock);
695                 cardp->usb_event_cause = le32_to_cpu(*(__le32 *) (recvbuff + MESSAGE_HEADER_LEN));
696                 lbs_deb_usbd(&cardp->udev->dev,"**EVENT** 0x%X\n",
697                             cardp->usb_event_cause);
698                 if (cardp->usb_event_cause & 0xffff0000) {
699                         libertas_send_tx_feedback(priv);
700                         spin_unlock(&priv->adapter->driver_lock);
701                         break;
702                 }
703                 cardp->usb_event_cause <<= 3;
704                 cardp->usb_int_cause |= MRVDRV_CARDEVENT;
705                 kfree_skb(skb);
706                 libertas_interrupt(priv->dev);
707                 spin_unlock(&priv->adapter->driver_lock);
708                 goto rx_exit;
709         default:
710                 lbs_deb_usbd(&cardp->udev->dev, "Unknown command type 0x%X\n",
711                              recvtype);
712                 kfree_skb(skb);
713                 break;
714         }
715
716 setup_for_next:
717         if_usb_submit_rx_urb(cardp);
718 rx_exit:
719         lbs_deb_leave(LBS_DEB_USB);
720 }
721
722 /**
723  *  @brief This function downloads data to FW
724  *  @param priv         pointer to wlan_private structure
725  *  @param type         type of data
726  *  @param buf          pointer to data buffer
727  *  @param len          number of bytes
728  *  @return             0 or -1
729  */
730 static int if_usb_host_to_card(wlan_private * priv, u8 type, u8 * payload, u16 nb)
731 {
732         struct usb_card_rec *cardp = (struct usb_card_rec *)priv->card;
733
734         lbs_deb_usbd(&cardp->udev->dev,"*** type = %u\n", type);
735         lbs_deb_usbd(&cardp->udev->dev,"size after = %d\n", nb);
736
737         if (type == MVMS_CMD) {
738                 __le32 tmp = cpu_to_le32(CMD_TYPE_REQUEST);
739                 priv->dnld_sent = DNLD_CMD_SENT;
740                 memcpy(cardp->bulk_out_buffer, (u8 *) & tmp,
741                        MESSAGE_HEADER_LEN);
742
743         } else {
744                 __le32 tmp = cpu_to_le32(CMD_TYPE_DATA);
745                 priv->dnld_sent = DNLD_DATA_SENT;
746                 memcpy(cardp->bulk_out_buffer, (u8 *) & tmp,
747                        MESSAGE_HEADER_LEN);
748         }
749
750         memcpy((cardp->bulk_out_buffer + MESSAGE_HEADER_LEN), payload, nb);
751
752         return usb_tx_block(cardp, cardp->bulk_out_buffer,
753                             nb + MESSAGE_HEADER_LEN);
754 }
755
756 /* called with adapter->driver_lock held */
757 static int if_usb_get_int_status(wlan_private * priv, u8 * ireg)
758 {
759         struct usb_card_rec *cardp = priv->card;
760
761         *ireg = cardp->usb_int_cause;
762         cardp->usb_int_cause = 0;
763
764         lbs_deb_usbd(&cardp->udev->dev,"Int cause is 0x%X\n", *ireg);
765
766         return 0;
767 }
768
769 static int if_usb_read_event_cause(wlan_private * priv)
770 {
771         struct usb_card_rec *cardp = priv->card;
772
773         priv->adapter->eventcause = cardp->usb_event_cause;
774         /* Re-submit rx urb here to avoid event lost issue */
775         if_usb_submit_rx_urb(cardp);
776         return 0;
777 }
778
779 /**
780  *  @brief This function issues Boot command to the Boot2 code
781  *  @param ivalue   1:Boot from FW by USB-Download
782  *                  2:Boot from FW in EEPROM
783  *  @return             0
784  */
785 static int if_usb_issue_boot_command(struct usb_card_rec *cardp, int ivalue)
786 {
787         struct bootcmdstr sbootcmd;
788         int i;
789
790         /* Prepare command */
791         sbootcmd.u32magicnumber = cpu_to_le32(BOOT_CMD_MAGIC_NUMBER);
792         sbootcmd.u8cmd_tag = ivalue;
793         for (i=0; i<11; i++)
794                 sbootcmd.au8dumy[i]=0x00;
795         memcpy(cardp->bulk_out_buffer, &sbootcmd, sizeof(struct bootcmdstr));
796
797         /* Issue command */
798         usb_tx_block(cardp, cardp->bulk_out_buffer, sizeof(struct bootcmdstr));
799
800         return 0;
801 }
802
803
804 /**
805  *  @brief This function checks the validity of Boot2/FW image.
806  *
807  *  @param data              pointer to image
808  *         len               image length
809  *  @return     0 or -1
810  */
811 static int check_fwfile_format(u8 *data, u32 totlen)
812 {
813         u32 bincmd, exit;
814         u32 blksize, offset, len;
815         int ret;
816
817         ret = 1;
818         exit = len = 0;
819
820         do {
821                 struct fwheader *fwh = (void *)data;
822
823                 bincmd = le32_to_cpu(fwh->dnldcmd);
824                 blksize = le32_to_cpu(fwh->datalength);
825                 switch (bincmd) {
826                 case FW_HAS_DATA_TO_RECV:
827                         offset = sizeof(struct fwheader) + blksize;
828                         data += offset;
829                         len += offset;
830                         if (len >= totlen)
831                                 exit = 1;
832                         break;
833                 case FW_HAS_LAST_BLOCK:
834                         exit = 1;
835                         ret = 0;
836                         break;
837                 default:
838                         exit = 1;
839                         break;
840                 }
841         } while (!exit);
842
843         if (ret)
844                 lbs_pr_err("firmware file format check FAIL\n");
845         else
846                 lbs_deb_fw("firmware file format check PASS\n");
847
848         return ret;
849 }
850
851
852 static int if_usb_prog_firmware(struct usb_card_rec *cardp)
853 {
854         int i = 0;
855         static int reset_count = 10;
856         int ret = 0;
857
858         lbs_deb_enter(LBS_DEB_USB);
859
860         if ((ret = request_firmware(&cardp->fw, libertas_fw_name,
861                                     &cardp->udev->dev)) < 0) {
862                 lbs_pr_err("request_firmware() failed with %#x\n", ret);
863                 lbs_pr_err("firmware %s not found\n", libertas_fw_name);
864                 goto done;
865         }
866
867         if (check_fwfile_format(cardp->fw->data, cardp->fw->size))
868                 goto release_fw;
869
870 restart:
871         if (if_usb_submit_rx_urb_fwload(cardp) < 0) {
872                 lbs_deb_usbd(&cardp->udev->dev, "URB submission is failed\n");
873                 ret = -1;
874                 goto release_fw;
875         }
876
877         cardp->bootcmdresp = 0;
878         do {
879                 int j = 0;
880                 i++;
881                 /* Issue Boot command = 1, Boot from Download-FW */
882                 if_usb_issue_boot_command(cardp, BOOT_CMD_FW_BY_USB);
883                 /* wait for command response */
884                 do {
885                         j++;
886                         msleep_interruptible(100);
887                 } while (cardp->bootcmdresp == 0 && j < 10);
888         } while (cardp->bootcmdresp == 0 && i < 5);
889
890         if (cardp->bootcmdresp == 0) {
891                 if (--reset_count >= 0) {
892                         if_usb_reset_device(cardp);
893                         goto restart;
894                 }
895                 return -1;
896         }
897
898         i = 0;
899
900         cardp->totalbytes = 0;
901         cardp->fwlastblksent = 0;
902         cardp->CRC_OK = 1;
903         cardp->fwdnldover = 0;
904         cardp->fwseqnum = -1;
905         cardp->totalbytes = 0;
906         cardp->fwfinalblk = 0;
907
908         if_prog_firmware(cardp);
909
910         do {
911                 lbs_deb_usbd(&cardp->udev->dev,"Wlan sched timeout\n");
912                 i++;
913                 msleep_interruptible(100);
914                 if (cardp->surprise_removed || i >= 20)
915                         break;
916         } while (!cardp->fwdnldover);
917
918         if (!cardp->fwdnldover) {
919                 lbs_pr_info("failed to load fw, resetting device!\n");
920                 if (--reset_count >= 0) {
921                         if_usb_reset_device(cardp);
922                         goto restart;
923                 }
924
925                 lbs_pr_info("FW download failure, time = %d ms\n", i * 100);
926                 ret = -1;
927                 goto release_fw;
928         }
929
930 release_fw:
931         release_firmware(cardp->fw);
932         cardp->fw = NULL;
933
934 done:
935         lbs_deb_leave_args(LBS_DEB_USB, "ret %d", ret);
936         return ret;
937 }
938
939
940 #ifdef CONFIG_PM
941 static int if_usb_suspend(struct usb_interface *intf, pm_message_t message)
942 {
943         struct usb_card_rec *cardp = usb_get_intfdata(intf);
944         wlan_private *priv = cardp->priv;
945
946         lbs_deb_enter(LBS_DEB_USB);
947
948         if (priv->adapter->psstate != PS_STATE_FULL_POWER)
949                 return -1;
950
951         if (priv->mesh_dev && !priv->mesh_autostart_enabled) {
952                 /* Mesh autostart must be activated while sleeping
953                  * On resume it will go back to the current state
954                  */
955                 struct cmd_ds_mesh_access mesh_access;
956                 memset(&mesh_access, 0, sizeof(mesh_access));
957                 mesh_access.data[0] = cpu_to_le32(1);
958                 libertas_prepare_and_send_command(priv,
959                                 CMD_MESH_ACCESS,
960                                 CMD_ACT_MESH_SET_AUTOSTART_ENABLED,
961                                 CMD_OPTION_WAITFORRSP, 0, (void *)&mesh_access);
962         }
963
964         netif_device_detach(cardp->eth_dev);
965         netif_device_detach(priv->mesh_dev);
966
967         /* Unlink tx & rx urb */
968         usb_kill_urb(cardp->tx_urb);
969         usb_kill_urb(cardp->rx_urb);
970
971         cardp->rx_urb_recall = 1;
972
973         lbs_deb_leave(LBS_DEB_USB);
974         return 0;
975 }
976
977 static int if_usb_resume(struct usb_interface *intf)
978 {
979         struct usb_card_rec *cardp = usb_get_intfdata(intf);
980         wlan_private *priv = cardp->priv;
981
982         lbs_deb_enter(LBS_DEB_USB);
983
984         cardp->rx_urb_recall = 0;
985
986         if_usb_submit_rx_urb(cardp->priv);
987
988         netif_device_attach(cardp->eth_dev);
989         netif_device_attach(priv->mesh_dev);
990
991         if (priv->mesh_dev && !priv->mesh_autostart_enabled) {
992                 /* Mesh autostart was activated while sleeping
993                  * Disable it if appropriate
994                  */
995                 struct cmd_ds_mesh_access mesh_access;
996                 memset(&mesh_access, 0, sizeof(mesh_access));
997                 mesh_access.data[0] = cpu_to_le32(0);
998                 libertas_prepare_and_send_command(priv,
999                                 CMD_MESH_ACCESS,
1000                                 CMD_ACT_MESH_SET_AUTOSTART_ENABLED,
1001                                 CMD_OPTION_WAITFORRSP, 0, (void *)&mesh_access);
1002         }
1003
1004         lbs_deb_leave(LBS_DEB_USB);
1005         return 0;
1006 }
1007 #else
1008 #define if_usb_suspend NULL
1009 #define if_usb_resume NULL
1010 #endif
1011
1012 static struct usb_driver if_usb_driver = {
1013         /* driver name */
1014         .name = usbdriver_name,
1015         /* probe function name */
1016         .probe = if_usb_probe,
1017         /* disconnect function  name */
1018         .disconnect = if_usb_disconnect,
1019         /* device signature table */
1020         .id_table = if_usb_table,
1021         .suspend = if_usb_suspend,
1022         .resume = if_usb_resume,
1023 };
1024
1025 static int if_usb_init_module(void)
1026 {
1027         int ret = 0;
1028
1029         lbs_deb_enter(LBS_DEB_MAIN);
1030
1031         if (libertas_fw_name == NULL) {
1032                 libertas_fw_name = default_fw_name;
1033         }
1034
1035         ret = usb_register(&if_usb_driver);
1036
1037         lbs_deb_leave_args(LBS_DEB_MAIN, "ret %d", ret);
1038         return ret;
1039 }
1040
1041 static void if_usb_exit_module(void)
1042 {
1043         struct usb_card_rec *cardp, *cardp_temp;
1044
1045         lbs_deb_enter(LBS_DEB_MAIN);
1046
1047         list_for_each_entry_safe(cardp, cardp_temp, &usb_devices, list) {
1048                 libertas_prepare_and_send_command(cardp->priv, CMD_802_11_RESET,
1049                                                   CMD_ACT_HALT, 0, 0, NULL);
1050         }
1051
1052         /* API unregisters the driver from USB subsystem */
1053         usb_deregister(&if_usb_driver);
1054
1055         lbs_deb_leave(LBS_DEB_MAIN);
1056 }
1057
1058 module_init(if_usb_init_module);
1059 module_exit(if_usb_exit_module);
1060
1061 MODULE_DESCRIPTION("8388 USB WLAN Driver");
1062 MODULE_AUTHOR("Marvell International Ltd.");
1063 MODULE_LICENSE("GPL");