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