libertas: Move SET_BOOT2_VER command to if_usb where it belongs
[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 char *lbs_fw_name = "usb8388.bin";
21 module_param_named(fw_name, lbs_fw_name, charp, 0644);
22
23 static struct usb_device_id if_usb_table[] = {
24         /* Enter the device signature inside */
25         { USB_DEVICE(0x1286, 0x2001) },
26         { USB_DEVICE(0x05a3, 0x8388) },
27         {}      /* Terminating entry */
28 };
29
30 MODULE_DEVICE_TABLE(usb, if_usb_table);
31
32 static void if_usb_receive(struct urb *urb);
33 static void if_usb_receive_fwload(struct urb *urb);
34 static int if_usb_prog_firmware(struct usb_card_rec *cardp);
35 static int if_usb_host_to_card(struct lbs_private *priv,
36         u8 type,
37         u8 *payload,
38         u16 nb);
39 static int if_usb_get_int_status(struct lbs_private *priv, u8 *);
40 static int if_usb_read_event_cause(struct lbs_private *);
41 static int usb_tx_block(struct usb_card_rec *cardp, u8 *payload, u16 nb);
42 static void if_usb_free(struct usb_card_rec *cardp);
43 static int if_usb_submit_rx_urb(struct usb_card_rec *cardp);
44 static int if_usb_reset_device(struct usb_card_rec *cardp);
45
46 /**
47  *  @brief  call back function to handle the status of the URB
48  *  @param urb          pointer to urb structure
49  *  @return             N/A
50  */
51 static void if_usb_write_bulk_callback(struct urb *urb)
52 {
53         struct usb_card_rec *cardp = (struct usb_card_rec *) urb->context;
54
55         /* handle the transmission complete validations */
56
57         if (urb->status == 0) {
58                 struct lbs_private *priv = cardp->priv;
59
60                 /*
61                 lbs_deb_usbd(&urb->dev->dev, "URB status is successfull\n");
62                 lbs_deb_usbd(&urb->dev->dev, "Actual length transmitted %d\n",
63                        urb->actual_length);
64                 */
65
66                 /* Used for both firmware TX and regular TX.  priv isn't
67                  * valid at firmware load time.
68                  */
69                 if (priv)
70                         lbs_host_to_card_done(priv);
71         } else {
72                 /* print the failure status number for debug */
73                 lbs_pr_info("URB in failure status: %d\n", urb->status);
74         }
75
76         return;
77 }
78
79 /**
80  *  @brief  free tx/rx urb, skb and rx buffer
81  *  @param cardp        pointer usb_card_rec
82  *  @return             N/A
83  */
84 static void if_usb_free(struct usb_card_rec *cardp)
85 {
86         lbs_deb_enter(LBS_DEB_USB);
87
88         /* Unlink tx & rx urb */
89         usb_kill_urb(cardp->tx_urb);
90         usb_kill_urb(cardp->rx_urb);
91
92         usb_free_urb(cardp->tx_urb);
93         cardp->tx_urb = NULL;
94
95         usb_free_urb(cardp->rx_urb);
96         cardp->rx_urb = NULL;
97
98         kfree(cardp->bulk_out_buffer);
99         cardp->bulk_out_buffer = NULL;
100
101         lbs_deb_leave(LBS_DEB_USB);
102 }
103
104 /**
105  *  @brief sets the configuration values
106  *  @param ifnum        interface number
107  *  @param id           pointer to usb_device_id
108  *  @return             0 on success, error code on failure
109  */
110 static int if_usb_probe(struct usb_interface *intf,
111                         const struct usb_device_id *id)
112 {
113         struct usb_device *udev;
114         struct usb_host_interface *iface_desc;
115         struct usb_endpoint_descriptor *endpoint;
116         struct lbs_private *priv;
117         struct usb_card_rec *cardp;
118         int i;
119
120         udev = interface_to_usbdev(intf);
121
122         cardp = kzalloc(sizeof(struct usb_card_rec), GFP_KERNEL);
123         if (!cardp) {
124                 lbs_pr_err("Out of memory allocating private data.\n");
125                 goto error;
126         }
127
128         cardp->udev = udev;
129         iface_desc = intf->cur_altsetting;
130
131         lbs_deb_usbd(&udev->dev, "bcdUSB = 0x%X bDeviceClass = 0x%X"
132                " bDeviceSubClass = 0x%X, bDeviceProtocol = 0x%X\n",
133                      le16_to_cpu(udev->descriptor.bcdUSB),
134                      udev->descriptor.bDeviceClass,
135                      udev->descriptor.bDeviceSubClass,
136                      udev->descriptor.bDeviceProtocol);
137
138         for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
139                 endpoint = &iface_desc->endpoint[i].desc;
140                 if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK)
141                     && ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
142                         USB_ENDPOINT_XFER_BULK)) {
143                         /* we found a bulk in endpoint */
144                         lbs_deb_usbd(&udev->dev, "Bulk in size is %d\n",
145                                      le16_to_cpu(endpoint->wMaxPacketSize));
146                         if (!(cardp->rx_urb = usb_alloc_urb(0, GFP_KERNEL))) {
147                                 lbs_deb_usbd(&udev->dev,
148                                        "Rx URB allocation failed\n");
149                                 goto dealloc;
150                         }
151                         cardp->rx_urb_recall = 0;
152
153                         cardp->bulk_in_size =
154                                 le16_to_cpu(endpoint->wMaxPacketSize);
155                         cardp->bulk_in_endpointAddr =
156                             (endpoint->
157                              bEndpointAddress & USB_ENDPOINT_NUMBER_MASK);
158                         lbs_deb_usbd(&udev->dev, "in_endpoint = %d\n",
159                                endpoint->bEndpointAddress);
160                 }
161
162                 if (((endpoint->
163                       bEndpointAddress & USB_ENDPOINT_DIR_MASK) ==
164                      USB_DIR_OUT)
165                     && ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
166                         USB_ENDPOINT_XFER_BULK)) {
167                         /* We found bulk out endpoint */
168                         if (!(cardp->tx_urb = usb_alloc_urb(0, GFP_KERNEL))) {
169                                 lbs_deb_usbd(&udev->dev,
170                                        "Tx URB allocation failed\n");
171                                 goto dealloc;
172                         }
173
174                         cardp->bulk_out_size =
175                                 le16_to_cpu(endpoint->wMaxPacketSize);
176                         lbs_deb_usbd(&udev->dev,
177                                      "Bulk out size is %d\n",
178                                      le16_to_cpu(endpoint->wMaxPacketSize));
179                         cardp->bulk_out_endpointAddr =
180                             endpoint->bEndpointAddress;
181                         lbs_deb_usbd(&udev->dev, "out_endpoint = %d\n",
182                                     endpoint->bEndpointAddress);
183                         cardp->bulk_out_buffer =
184                             kmalloc(MRVDRV_ETH_TX_PACKET_BUFFER_SIZE,
185                                     GFP_KERNEL);
186
187                         if (!cardp->bulk_out_buffer) {
188                                 lbs_deb_usbd(&udev->dev,
189                                        "Could not allocate buffer\n");
190                                 goto dealloc;
191                         }
192                 }
193         }
194
195         /* Upload firmware */
196         cardp->rinfo.cardp = cardp;
197         if (if_usb_prog_firmware(cardp)) {
198                 lbs_deb_usbd(&udev->dev, "FW upload failed");
199                 goto err_prog_firmware;
200         }
201
202         if (!(priv = lbs_add_card(cardp, &udev->dev)))
203                 goto err_prog_firmware;
204
205         cardp->priv = priv;
206
207         if (lbs_add_mesh(priv, &udev->dev))
208                 goto err_add_mesh;
209
210         cardp->eth_dev = priv->dev;
211
212         priv->hw_host_to_card = if_usb_host_to_card;
213         priv->hw_get_int_status = if_usb_get_int_status;
214         priv->hw_read_event_cause = if_usb_read_event_cause;
215         priv->boot2_version = udev->descriptor.bcdDevice;
216
217         /* Delay 200 ms to waiting for the FW ready */
218         if_usb_submit_rx_urb(cardp);
219         msleep_interruptible(200);
220         priv->adapter->fw_ready = 1;
221
222         if (lbs_start_card(priv))
223                 goto err_start_card;
224
225         /* Set the boot2 version in firmware, ignoring errors. */
226         (void)lbs_prepare_and_send_command(priv, CMD_SET_BOOT2_VER,
227                                            0, CMD_OPTION_WAITFORRSP, 0, NULL);
228
229
230         usb_get_dev(udev);
231         usb_set_intfdata(intf, cardp);
232
233         return 0;
234
235 err_start_card:
236         lbs_remove_mesh(priv);
237 err_add_mesh:
238         lbs_remove_card(priv);
239 err_prog_firmware:
240         if_usb_reset_device(cardp);
241 dealloc:
242         if_usb_free(cardp);
243
244 error:
245         return -ENOMEM;
246 }
247
248 /**
249  *  @brief free resource and cleanup
250  *  @param intf         USB interface structure
251  *  @return             N/A
252  */
253 static void if_usb_disconnect(struct usb_interface *intf)
254 {
255         struct usb_card_rec *cardp = usb_get_intfdata(intf);
256         struct lbs_private *priv = (struct lbs_private *) cardp->priv;
257
258         lbs_deb_enter(LBS_DEB_MAIN);
259
260         /* Update Surprise removed to TRUE */
261         cardp->surprise_removed = 1;
262
263         if (priv) {
264                 struct lbs_adapter *adapter = priv->adapter;
265
266                 adapter->surpriseremoved = 1;
267                 lbs_stop_card(priv);
268                 lbs_remove_mesh(priv);
269                 lbs_remove_card(priv);
270         }
271
272         /* this is (apparently?) necessary for future usage of the device */
273         lbs_prepare_and_send_command(priv, CMD_802_11_RESET, CMD_ACT_HALT,
274                         0, 0, NULL);
275
276         /* Unlink and free urb */
277         if_usb_free(cardp);
278
279         usb_set_intfdata(intf, NULL);
280         usb_put_dev(interface_to_usbdev(intf));
281
282         lbs_deb_leave(LBS_DEB_MAIN);
283 }
284
285 /**
286  *  @brief  This function download FW
287  *  @param priv         pointer to struct lbs_private
288  *  @return             0
289  */
290 static int if_prog_firmware(struct usb_card_rec *cardp)
291 {
292         struct FWData *fwdata;
293         struct fwheader *fwheader;
294         u8 *firmware = cardp->fw->data;
295
296         fwdata = kmalloc(sizeof(struct FWData), GFP_ATOMIC);
297
298         if (!fwdata)
299                 return -1;
300
301         fwheader = &fwdata->fwheader;
302
303         if (!cardp->CRC_OK) {
304                 cardp->totalbytes = cardp->fwlastblksent;
305                 cardp->fwseqnum = cardp->lastseqnum - 1;
306         }
307
308         /*
309         lbs_deb_usbd(&cardp->udev->dev, "totalbytes = %d\n",
310                     cardp->totalbytes);
311         */
312
313         memcpy(fwheader, &firmware[cardp->totalbytes],
314                sizeof(struct fwheader));
315
316         cardp->fwlastblksent = cardp->totalbytes;
317         cardp->totalbytes += sizeof(struct fwheader);
318
319         /* lbs_deb_usbd(&cardp->udev->dev,"Copy Data\n"); */
320         memcpy(fwdata->data, &firmware[cardp->totalbytes],
321                le32_to_cpu(fwdata->fwheader.datalength));
322
323         /*
324         lbs_deb_usbd(&cardp->udev->dev,
325                     "Data length = %d\n", le32_to_cpu(fwdata->fwheader.datalength));
326         */
327
328         cardp->fwseqnum = cardp->fwseqnum + 1;
329
330         fwdata->seqnum = cpu_to_le32(cardp->fwseqnum);
331         cardp->lastseqnum = cardp->fwseqnum;
332         cardp->totalbytes += le32_to_cpu(fwdata->fwheader.datalength);
333
334         if (fwheader->dnldcmd == cpu_to_le32(FW_HAS_DATA_TO_RECV)) {
335                 /*
336                 lbs_deb_usbd(&cardp->udev->dev, "There are data to follow\n");
337                 lbs_deb_usbd(&cardp->udev->dev,
338                             "seqnum = %d totalbytes = %d\n", cardp->fwseqnum,
339                             cardp->totalbytes);
340                 */
341                 memcpy(cardp->bulk_out_buffer, fwheader, FW_DATA_XMIT_SIZE);
342                 usb_tx_block(cardp, cardp->bulk_out_buffer, FW_DATA_XMIT_SIZE);
343
344         } else if (fwdata->fwheader.dnldcmd == cpu_to_le32(FW_HAS_LAST_BLOCK)) {
345                 /*
346                 lbs_deb_usbd(&cardp->udev->dev,
347                             "Host has finished FW downloading\n");
348                 lbs_deb_usbd(&cardp->udev->dev,
349                             "Donwloading FW JUMP BLOCK\n");
350                 */
351                 memcpy(cardp->bulk_out_buffer, fwheader, FW_DATA_XMIT_SIZE);
352                 usb_tx_block(cardp, cardp->bulk_out_buffer, FW_DATA_XMIT_SIZE);
353                 cardp->fwfinalblk = 1;
354         }
355
356         /*
357         lbs_deb_usbd(&cardp->udev->dev,
358                     "The firmware download is done size is %d\n",
359                     cardp->totalbytes);
360         */
361
362         kfree(fwdata);
363
364         return 0;
365 }
366
367 static int if_usb_reset_device(struct usb_card_rec *cardp)
368 {
369         int ret;
370         struct lbs_private *priv = cardp->priv;
371
372         lbs_deb_enter(LBS_DEB_USB);
373
374         /* Try a USB port reset first, if that fails send the reset
375          * command to the firmware.
376          */
377         ret = usb_reset_device(cardp->udev);
378         if (!ret && priv) {
379                 msleep(10);
380                 ret = lbs_reset_device(priv);
381                 msleep(10);
382         }
383
384         lbs_deb_leave_args(LBS_DEB_USB, "ret %d", ret);
385
386         return ret;
387 }
388
389 /**
390  *  @brief This function transfer the data to the device.
391  *  @param priv         pointer to struct lbs_private
392  *  @param payload      pointer to payload data
393  *  @param nb           data length
394  *  @return             0 or -1
395  */
396 static int usb_tx_block(struct usb_card_rec *cardp, u8 * payload, u16 nb)
397 {
398         int ret = -1;
399
400         /* check if device is removed */
401         if (cardp->surprise_removed) {
402                 lbs_deb_usbd(&cardp->udev->dev, "Device removed\n");
403                 goto tx_ret;
404         }
405
406         usb_fill_bulk_urb(cardp->tx_urb, cardp->udev,
407                           usb_sndbulkpipe(cardp->udev,
408                                           cardp->bulk_out_endpointAddr),
409                           payload, nb, if_usb_write_bulk_callback, cardp);
410
411         cardp->tx_urb->transfer_flags |= URB_ZERO_PACKET;
412
413         if ((ret = usb_submit_urb(cardp->tx_urb, GFP_ATOMIC))) {
414                 /*  transfer failed */
415                 lbs_deb_usbd(&cardp->udev->dev, "usb_submit_urb failed\n");
416                 ret = -1;
417         } else {
418                 /* lbs_deb_usbd(&cardp->udev->dev, "usb_submit_urb success\n"); */
419                 ret = 0;
420         }
421
422 tx_ret:
423         return ret;
424 }
425
426 static int __if_usb_submit_rx_urb(struct usb_card_rec *cardp,
427                                   void (*callbackfn)(struct urb *urb))
428 {
429         struct sk_buff *skb;
430         struct read_cb_info *rinfo = &cardp->rinfo;
431         int ret = -1;
432
433         if (!(skb = dev_alloc_skb(MRVDRV_ETH_RX_PACKET_BUFFER_SIZE))) {
434                 lbs_pr_err("No free skb\n");
435                 goto rx_ret;
436         }
437
438         rinfo->skb = skb;
439
440         /* Fill the receive configuration URB and initialise the Rx call back */
441         usb_fill_bulk_urb(cardp->rx_urb, cardp->udev,
442                           usb_rcvbulkpipe(cardp->udev,
443                                           cardp->bulk_in_endpointAddr),
444                           (void *) (skb->tail + (size_t) IPFIELD_ALIGN_OFFSET),
445                           MRVDRV_ETH_RX_PACKET_BUFFER_SIZE, callbackfn,
446                           rinfo);
447
448         cardp->rx_urb->transfer_flags |= URB_ZERO_PACKET;
449
450         /* lbs_deb_usbd(&cardp->udev->dev, "Pointer for rx_urb %p\n", cardp->rx_urb); */
451         if ((ret = usb_submit_urb(cardp->rx_urb, GFP_ATOMIC))) {
452                 /* handle failure conditions */
453                 lbs_deb_usbd(&cardp->udev->dev, "Submit Rx URB failed\n");
454                 kfree_skb(skb);
455                 rinfo->skb = NULL;
456                 ret = -1;
457         } else {
458                 /* lbs_deb_usbd(&cardp->udev->dev, "Submit Rx URB success\n"); */
459                 ret = 0;
460         }
461
462 rx_ret:
463         return ret;
464 }
465
466 static int if_usb_submit_rx_urb_fwload(struct usb_card_rec *cardp)
467 {
468         return __if_usb_submit_rx_urb(cardp, &if_usb_receive_fwload);
469 }
470
471 static int if_usb_submit_rx_urb(struct usb_card_rec *cardp)
472 {
473         return __if_usb_submit_rx_urb(cardp, &if_usb_receive);
474 }
475
476 static void if_usb_receive_fwload(struct urb *urb)
477 {
478         struct read_cb_info *rinfo = (struct read_cb_info *)urb->context;
479         struct sk_buff *skb = rinfo->skb;
480         struct usb_card_rec *cardp = (struct usb_card_rec *)rinfo->cardp;
481         struct fwsyncheader *syncfwheader;
482         struct bootcmdrespStr bootcmdresp;
483
484         if (urb->status) {
485                 lbs_deb_usbd(&cardp->udev->dev,
486                             "URB status is failed during fw load\n");
487                 kfree_skb(skb);
488                 return;
489         }
490
491         if (cardp->bootcmdresp == 0) {
492                 memcpy (&bootcmdresp, skb->data + IPFIELD_ALIGN_OFFSET,
493                         sizeof(bootcmdresp));
494                 if (le16_to_cpu(cardp->udev->descriptor.bcdDevice) < 0x3106) {
495                         kfree_skb(skb);
496                         if_usb_submit_rx_urb_fwload(cardp);
497                         cardp->bootcmdresp = 1;
498                         lbs_deb_usbd(&cardp->udev->dev,
499                                     "Received valid boot command response\n");
500                         return;
501                 }
502                 if (bootcmdresp.u32magicnumber != cpu_to_le32(BOOT_CMD_MAGIC_NUMBER)) {
503                         lbs_pr_info(
504                                 "boot cmd response wrong magic number (0x%x)\n",
505                                 le32_to_cpu(bootcmdresp.u32magicnumber));
506                 } else if (bootcmdresp.u8cmd_tag != BOOT_CMD_FW_BY_USB) {
507                         lbs_pr_info(
508                                 "boot cmd response cmd_tag error (%d)\n",
509                                 bootcmdresp.u8cmd_tag);
510                 } else if (bootcmdresp.u8result != BOOT_CMD_RESP_OK) {
511                         lbs_pr_info(
512                                 "boot cmd response result error (%d)\n",
513                                 bootcmdresp.u8result);
514                 } else {
515                         cardp->bootcmdresp = 1;
516                         lbs_deb_usbd(&cardp->udev->dev,
517                                     "Received valid boot command response\n");
518                 }
519                 kfree_skb(skb);
520                 if_usb_submit_rx_urb_fwload(cardp);
521                 return;
522         }
523
524         syncfwheader = kmalloc(sizeof(struct fwsyncheader), GFP_ATOMIC);
525         if (!syncfwheader) {
526                 lbs_deb_usbd(&cardp->udev->dev, "Failure to allocate syncfwheader\n");
527                 kfree_skb(skb);
528                 return;
529         }
530
531         memcpy(syncfwheader, skb->data + IPFIELD_ALIGN_OFFSET,
532                         sizeof(struct fwsyncheader));
533
534         if (!syncfwheader->cmd) {
535                 /*
536                 lbs_deb_usbd(&cardp->udev->dev,
537                             "FW received Blk with correct CRC\n");
538                 lbs_deb_usbd(&cardp->udev->dev,
539                             "FW received Blk seqnum = %d\n",
540                        syncfwheader->seqnum);
541                 */
542                 cardp->CRC_OK = 1;
543         } else {
544                 lbs_deb_usbd(&cardp->udev->dev,
545                             "FW received Blk with CRC error\n");
546                 cardp->CRC_OK = 0;
547         }
548
549         kfree_skb(skb);
550
551         if (cardp->fwfinalblk) {
552                 cardp->fwdnldover = 1;
553                 goto exit;
554         }
555
556         if_prog_firmware(cardp);
557
558         if_usb_submit_rx_urb_fwload(cardp);
559 exit:
560         kfree(syncfwheader);
561
562         return;
563
564 }
565
566 #define MRVDRV_MIN_PKT_LEN      30
567
568 static inline void process_cmdtypedata(int recvlength, struct sk_buff *skb,
569                                        struct usb_card_rec *cardp,
570                                        struct lbs_private *priv)
571 {
572         if (recvlength > MRVDRV_ETH_RX_PACKET_BUFFER_SIZE +
573             MESSAGE_HEADER_LEN || recvlength < MRVDRV_MIN_PKT_LEN) {
574                 lbs_deb_usbd(&cardp->udev->dev,
575                             "Packet length is Invalid\n");
576                 kfree_skb(skb);
577                 return;
578         }
579
580         skb_reserve(skb, IPFIELD_ALIGN_OFFSET);
581         skb_put(skb, recvlength);
582         skb_pull(skb, MESSAGE_HEADER_LEN);
583         lbs_process_rxed_packet(priv, skb);
584         priv->upld_len = (recvlength - MESSAGE_HEADER_LEN);
585 }
586
587 static inline void process_cmdrequest(int recvlength, u8 *recvbuff,
588                                       struct sk_buff *skb,
589                                       struct usb_card_rec *cardp,
590                                       struct lbs_private *priv)
591 {
592         u8 *cmdbuf;
593         if (recvlength > MRVDRV_SIZE_OF_CMD_BUFFER) {
594                 lbs_deb_usbd(&cardp->udev->dev,
595                             "The receive buffer is too large\n");
596                 kfree_skb(skb);
597                 return;
598         }
599
600         if (!in_interrupt())
601                 BUG();
602
603         spin_lock(&priv->adapter->driver_lock);
604         /* take care of cur_cmd = NULL case by reading the
605          * data to clear the interrupt */
606         if (!priv->adapter->cur_cmd) {
607                 cmdbuf = priv->upld_buf;
608                 priv->adapter->hisregcpy &= ~MRVDRV_CMD_UPLD_RDY;
609         } else
610                 cmdbuf = priv->adapter->cur_cmd->bufvirtualaddr;
611
612         cardp->usb_int_cause |= MRVDRV_CMD_UPLD_RDY;
613         priv->upld_len = (recvlength - MESSAGE_HEADER_LEN);
614         memcpy(cmdbuf, recvbuff + MESSAGE_HEADER_LEN,
615                priv->upld_len);
616
617         kfree_skb(skb);
618         lbs_interrupt(priv->dev);
619         spin_unlock(&priv->adapter->driver_lock);
620
621         lbs_deb_usbd(&cardp->udev->dev,
622                     "Wake up main thread to handle cmd response\n");
623
624         return;
625 }
626
627 /**
628  *  @brief This function reads of the packet into the upload buff,
629  *  wake up the main thread and initialise the Rx callack.
630  *
631  *  @param urb          pointer to struct urb
632  *  @return             N/A
633  */
634 static void if_usb_receive(struct urb *urb)
635 {
636         struct read_cb_info *rinfo = (struct read_cb_info *)urb->context;
637         struct sk_buff *skb = rinfo->skb;
638         struct usb_card_rec *cardp = (struct usb_card_rec *) rinfo->cardp;
639         struct lbs_private *priv = cardp->priv;
640
641         int recvlength = urb->actual_length;
642         u8 *recvbuff = NULL;
643         u32 recvtype = 0;
644
645         lbs_deb_enter(LBS_DEB_USB);
646
647         if (recvlength) {
648                 __le32 tmp;
649
650                 if (urb->status) {
651                         lbs_deb_usbd(&cardp->udev->dev,
652                                     "URB status is failed\n");
653                         kfree_skb(skb);
654                         goto setup_for_next;
655                 }
656
657                 recvbuff = skb->data + IPFIELD_ALIGN_OFFSET;
658                 memcpy(&tmp, recvbuff, sizeof(u32));
659                 recvtype = le32_to_cpu(tmp);
660                 lbs_deb_usbd(&cardp->udev->dev,
661                             "Recv length = 0x%x, Recv type = 0x%X\n",
662                             recvlength, recvtype);
663         } else if (urb->status) {
664                 kfree_skb(skb);
665                 goto rx_exit;
666         }
667
668         switch (recvtype) {
669         case CMD_TYPE_DATA:
670                 process_cmdtypedata(recvlength, skb, cardp, priv);
671                 break;
672
673         case CMD_TYPE_REQUEST:
674                 process_cmdrequest(recvlength, recvbuff, skb, cardp, priv);
675                 break;
676
677         case CMD_TYPE_INDICATION:
678                 /* Event cause handling */
679                 spin_lock(&priv->adapter->driver_lock);
680                 cardp->usb_event_cause = le32_to_cpu(*(__le32 *) (recvbuff + MESSAGE_HEADER_LEN));
681                 lbs_deb_usbd(&cardp->udev->dev,"**EVENT** 0x%X\n",
682                             cardp->usb_event_cause);
683                 if (cardp->usb_event_cause & 0xffff0000) {
684                         lbs_send_tx_feedback(priv);
685                         spin_unlock(&priv->adapter->driver_lock);
686                         break;
687                 }
688                 cardp->usb_event_cause <<= 3;
689                 cardp->usb_int_cause |= MRVDRV_CARDEVENT;
690                 kfree_skb(skb);
691                 lbs_interrupt(priv->dev);
692                 spin_unlock(&priv->adapter->driver_lock);
693                 goto rx_exit;
694         default:
695                 lbs_deb_usbd(&cardp->udev->dev, "Unknown command type 0x%X\n",
696                              recvtype);
697                 kfree_skb(skb);
698                 break;
699         }
700
701 setup_for_next:
702         if_usb_submit_rx_urb(cardp);
703 rx_exit:
704         lbs_deb_leave(LBS_DEB_USB);
705 }
706
707 /**
708  *  @brief This function downloads data to FW
709  *  @param priv         pointer to struct lbs_private structure
710  *  @param type         type of data
711  *  @param buf          pointer to data buffer
712  *  @param len          number of bytes
713  *  @return             0 or -1
714  */
715 static int if_usb_host_to_card(struct lbs_private *priv,
716         u8 type,
717         u8 *payload,
718         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(struct 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(struct 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         struct 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         struct 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         .name = DRV_NAME,
1002         .probe = if_usb_probe,
1003         .disconnect = if_usb_disconnect,
1004         .id_table = if_usb_table,
1005         .suspend = if_usb_suspend,
1006         .resume = if_usb_resume,
1007 };
1008
1009 static int __init if_usb_init_module(void)
1010 {
1011         int ret = 0;
1012
1013         lbs_deb_enter(LBS_DEB_MAIN);
1014
1015         ret = usb_register(&if_usb_driver);
1016
1017         lbs_deb_leave_args(LBS_DEB_MAIN, "ret %d", ret);
1018         return ret;
1019 }
1020
1021 static void __exit if_usb_exit_module(void)
1022 {
1023         lbs_deb_enter(LBS_DEB_MAIN);
1024
1025         usb_deregister(&if_usb_driver);
1026
1027         lbs_deb_leave(LBS_DEB_MAIN);
1028 }
1029
1030 module_init(if_usb_init_module);
1031 module_exit(if_usb_exit_module);
1032
1033 MODULE_DESCRIPTION("8388 USB WLAN Driver");
1034 MODULE_AUTHOR("Marvell International Ltd.");
1035 MODULE_LICENSE("GPL");