92bc8c5f1ca216e337f4897a9b1cdbd44ec3a289
[linux-2.6.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 #ifdef CONFIG_OLPC
11 #include <asm/olpc.h>
12 #endif
13
14 #define DRV_NAME "usb8xxx"
15
16 #include "host.h"
17 #include "decl.h"
18 #include "defs.h"
19 #include "dev.h"
20 #include "cmd.h"
21 #include "if_usb.h"
22
23 #define INSANEDEBUG     0
24 #define lbs_deb_usb2(...) do { if (INSANEDEBUG) lbs_deb_usbd(__VA_ARGS__); } while (0)
25
26 #define MESSAGE_HEADER_LEN      4
27
28 static char *lbs_fw_name = "usb8388.bin";
29 module_param_named(fw_name, lbs_fw_name, charp, 0644);
30
31 static struct usb_device_id if_usb_table[] = {
32         /* Enter the device signature inside */
33         { USB_DEVICE(0x1286, 0x2001) },
34         { USB_DEVICE(0x05a3, 0x8388) },
35         {}      /* Terminating entry */
36 };
37
38 MODULE_DEVICE_TABLE(usb, if_usb_table);
39
40 static void if_usb_receive(struct urb *urb);
41 static void if_usb_receive_fwload(struct urb *urb);
42 static int __if_usb_prog_firmware(struct if_usb_card *cardp,
43                                         const char *fwname, int cmd);
44 static int if_usb_prog_firmware(struct if_usb_card *cardp,
45                                         const char *fwname, int cmd);
46 static int if_usb_host_to_card(struct lbs_private *priv, uint8_t type,
47                                uint8_t *payload, uint16_t nb);
48 static int usb_tx_block(struct if_usb_card *cardp, uint8_t *payload,
49                         uint16_t nb);
50 static void if_usb_free(struct if_usb_card *cardp);
51 static int if_usb_submit_rx_urb(struct if_usb_card *cardp);
52 static int if_usb_reset_device(struct if_usb_card *cardp);
53
54 /* sysfs hooks */
55
56 /**
57  *  Set function to write firmware to device's persistent memory
58  */
59 static ssize_t if_usb_firmware_set(struct device *dev,
60                 struct device_attribute *attr, const char *buf, size_t count)
61 {
62         struct lbs_private *priv = to_net_dev(dev)->ml_priv;
63         struct if_usb_card *cardp = priv->card;
64         int ret;
65
66         ret = if_usb_prog_firmware(cardp, buf, BOOT_CMD_UPDATE_FW);
67         if (ret == 0)
68                 return count;
69
70         return ret;
71 }
72
73 /**
74  * lbs_flash_fw attribute to be exported per ethX interface through sysfs
75  * (/sys/class/net/ethX/lbs_flash_fw).  Use this like so to write firmware to
76  * the device's persistent memory:
77  * echo usb8388-5.126.0.p5.bin > /sys/class/net/ethX/lbs_flash_fw
78  */
79 static DEVICE_ATTR(lbs_flash_fw, 0200, NULL, if_usb_firmware_set);
80
81 /**
82  *  Set function to write firmware to device's persistent memory
83  */
84 static ssize_t if_usb_boot2_set(struct device *dev,
85                 struct device_attribute *attr, const char *buf, size_t count)
86 {
87         struct lbs_private *priv = to_net_dev(dev)->ml_priv;
88         struct if_usb_card *cardp = priv->card;
89         int ret;
90
91         ret = if_usb_prog_firmware(cardp, buf, BOOT_CMD_UPDATE_BOOT2);
92         if (ret == 0)
93                 return count;
94
95         return ret;
96 }
97
98 /**
99  * lbs_flash_boot2 attribute to be exported per ethX interface through sysfs
100  * (/sys/class/net/ethX/lbs_flash_boot2).  Use this like so to write firmware
101  * to the device's persistent memory:
102  * echo usb8388-5.126.0.p5.bin > /sys/class/net/ethX/lbs_flash_boot2
103  */
104 static DEVICE_ATTR(lbs_flash_boot2, 0200, NULL, if_usb_boot2_set);
105
106 /**
107  *  @brief  call back function to handle the status of the URB
108  *  @param urb          pointer to urb structure
109  *  @return             N/A
110  */
111 static void if_usb_write_bulk_callback(struct urb *urb)
112 {
113         struct if_usb_card *cardp = (struct if_usb_card *) urb->context;
114
115         /* handle the transmission complete validations */
116
117         if (urb->status == 0) {
118                 struct lbs_private *priv = cardp->priv;
119
120                 lbs_deb_usb2(&urb->dev->dev, "URB status is successful\n");
121                 lbs_deb_usb2(&urb->dev->dev, "Actual length transmitted %d\n",
122                              urb->actual_length);
123
124                 /* Boot commands such as UPDATE_FW and UPDATE_BOOT2 are not
125                  * passed up to the lbs level.
126                  */
127                 if (priv && priv->dnld_sent != DNLD_BOOTCMD_SENT)
128                         lbs_host_to_card_done(priv);
129         } else {
130                 /* print the failure status number for debug */
131                 lbs_pr_info("URB in failure status: %d\n", urb->status);
132         }
133
134         return;
135 }
136
137 /**
138  *  @brief  free tx/rx urb, skb and rx buffer
139  *  @param cardp        pointer if_usb_card
140  *  @return             N/A
141  */
142 static void if_usb_free(struct if_usb_card *cardp)
143 {
144         lbs_deb_enter(LBS_DEB_USB);
145
146         /* Unlink tx & rx urb */
147         usb_kill_urb(cardp->tx_urb);
148         usb_kill_urb(cardp->rx_urb);
149
150         usb_free_urb(cardp->tx_urb);
151         cardp->tx_urb = NULL;
152
153         usb_free_urb(cardp->rx_urb);
154         cardp->rx_urb = NULL;
155
156         kfree(cardp->ep_out_buf);
157         cardp->ep_out_buf = NULL;
158
159         lbs_deb_leave(LBS_DEB_USB);
160 }
161
162 static void if_usb_setup_firmware(struct lbs_private *priv)
163 {
164         struct if_usb_card *cardp = priv->card;
165         struct cmd_ds_set_boot2_ver b2_cmd;
166         struct cmd_ds_802_11_fw_wake_method wake_method;
167
168         b2_cmd.hdr.size = cpu_to_le16(sizeof(b2_cmd));
169         b2_cmd.action = 0;
170         b2_cmd.version = cardp->boot2_version;
171
172         if (lbs_cmd_with_response(priv, CMD_SET_BOOT2_VER, &b2_cmd))
173                 lbs_deb_usb("Setting boot2 version failed\n");
174
175         priv->wol_gpio = 2; /* Wake via GPIO2... */
176         priv->wol_gap = 20; /* ... after 20ms    */
177         lbs_host_sleep_cfg(priv, EHS_WAKE_ON_UNICAST_DATA,
178                         (struct wol_config *) NULL);
179
180         wake_method.hdr.size = cpu_to_le16(sizeof(wake_method));
181         wake_method.action = cpu_to_le16(CMD_ACT_GET);
182         if (lbs_cmd_with_response(priv, CMD_802_11_FW_WAKE_METHOD, &wake_method)) {
183                 lbs_pr_info("Firmware does not seem to support PS mode\n");
184                 priv->fwcapinfo &= ~FW_CAPINFO_PS;
185         } else {
186                 if (le16_to_cpu(wake_method.method) == CMD_WAKE_METHOD_COMMAND_INT) {
187                         lbs_deb_usb("Firmware seems to support PS with wake-via-command\n");
188                 } else {
189                         /* The versions which boot up this way don't seem to
190                            work even if we set it to the command interrupt */
191                         priv->fwcapinfo &= ~FW_CAPINFO_PS;
192                         lbs_pr_info("Firmware doesn't wake via command interrupt; disabling PS mode\n");
193                 }
194         }
195 }
196
197 static void if_usb_fw_timeo(unsigned long priv)
198 {
199         struct if_usb_card *cardp = (void *)priv;
200
201         if (cardp->fwdnldover) {
202                 lbs_deb_usb("Download complete, no event. Assuming success\n");
203         } else {
204                 lbs_pr_err("Download timed out\n");
205                 cardp->surprise_removed = 1;
206         }
207         wake_up(&cardp->fw_wq);
208 }
209
210 #ifdef CONFIG_OLPC
211 static void if_usb_reset_olpc_card(struct lbs_private *priv)
212 {
213         printk(KERN_CRIT "Resetting OLPC wireless via EC...\n");
214         olpc_ec_cmd(0x25, NULL, 0, NULL, 0);
215 }
216 #endif
217
218 /**
219  *  @brief sets the configuration values
220  *  @param ifnum        interface number
221  *  @param id           pointer to usb_device_id
222  *  @return             0 on success, error code on failure
223  */
224 static int if_usb_probe(struct usb_interface *intf,
225                         const struct usb_device_id *id)
226 {
227         struct usb_device *udev;
228         struct usb_host_interface *iface_desc;
229         struct usb_endpoint_descriptor *endpoint;
230         struct lbs_private *priv;
231         struct if_usb_card *cardp;
232         int i;
233
234         udev = interface_to_usbdev(intf);
235
236         cardp = kzalloc(sizeof(struct if_usb_card), GFP_KERNEL);
237         if (!cardp) {
238                 lbs_pr_err("Out of memory allocating private data.\n");
239                 goto error;
240         }
241
242         setup_timer(&cardp->fw_timeout, if_usb_fw_timeo, (unsigned long)cardp);
243         init_waitqueue_head(&cardp->fw_wq);
244
245         cardp->udev = udev;
246         iface_desc = intf->cur_altsetting;
247
248         lbs_deb_usbd(&udev->dev, "bcdUSB = 0x%X bDeviceClass = 0x%X"
249                      " bDeviceSubClass = 0x%X, bDeviceProtocol = 0x%X\n",
250                      le16_to_cpu(udev->descriptor.bcdUSB),
251                      udev->descriptor.bDeviceClass,
252                      udev->descriptor.bDeviceSubClass,
253                      udev->descriptor.bDeviceProtocol);
254
255         for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
256                 endpoint = &iface_desc->endpoint[i].desc;
257                 if (usb_endpoint_is_bulk_in(endpoint)) {
258                         cardp->ep_in_size = le16_to_cpu(endpoint->wMaxPacketSize);
259                         cardp->ep_in = usb_endpoint_num(endpoint);
260
261                         lbs_deb_usbd(&udev->dev, "in_endpoint = %d\n", cardp->ep_in);
262                         lbs_deb_usbd(&udev->dev, "Bulk in size is %d\n", cardp->ep_in_size);
263
264                 } else if (usb_endpoint_is_bulk_out(endpoint)) {
265                         cardp->ep_out_size = le16_to_cpu(endpoint->wMaxPacketSize);
266                         cardp->ep_out = usb_endpoint_num(endpoint);
267
268                         lbs_deb_usbd(&udev->dev, "out_endpoint = %d\n", cardp->ep_out);
269                         lbs_deb_usbd(&udev->dev, "Bulk out size is %d\n", cardp->ep_out_size);
270                 }
271         }
272         if (!cardp->ep_out_size || !cardp->ep_in_size) {
273                 lbs_deb_usbd(&udev->dev, "Endpoints not found\n");
274                 goto dealloc;
275         }
276         if (!(cardp->rx_urb = usb_alloc_urb(0, GFP_KERNEL))) {
277                 lbs_deb_usbd(&udev->dev, "Rx URB allocation failed\n");
278                 goto dealloc;
279         }
280         if (!(cardp->tx_urb = usb_alloc_urb(0, GFP_KERNEL))) {
281                 lbs_deb_usbd(&udev->dev, "Tx URB allocation failed\n");
282                 goto dealloc;
283         }
284         cardp->ep_out_buf = kmalloc(MRVDRV_ETH_TX_PACKET_BUFFER_SIZE, GFP_KERNEL);
285         if (!cardp->ep_out_buf) {
286                 lbs_deb_usbd(&udev->dev, "Could not allocate buffer\n");
287                 goto dealloc;
288         }
289
290         /* Upload firmware */
291         if (__if_usb_prog_firmware(cardp, lbs_fw_name, BOOT_CMD_FW_BY_USB)) {
292                 lbs_deb_usbd(&udev->dev, "FW upload failed\n");
293                 goto err_prog_firmware;
294         }
295
296         if (!(priv = lbs_add_card(cardp, &udev->dev)))
297                 goto err_prog_firmware;
298
299         cardp->priv = priv;
300         cardp->priv->fw_ready = 1;
301
302         priv->hw_host_to_card = if_usb_host_to_card;
303 #ifdef CONFIG_OLPC
304         if (machine_is_olpc())
305                 priv->reset_card = if_usb_reset_olpc_card;
306 #endif
307
308         cardp->boot2_version = udev->descriptor.bcdDevice;
309
310         if_usb_submit_rx_urb(cardp);
311
312         if (lbs_start_card(priv))
313                 goto err_start_card;
314
315         if_usb_setup_firmware(priv);
316
317         usb_get_dev(udev);
318         usb_set_intfdata(intf, cardp);
319
320         if (device_create_file(&priv->dev->dev, &dev_attr_lbs_flash_fw))
321                 lbs_pr_err("cannot register lbs_flash_fw attribute\n");
322
323         if (device_create_file(&priv->dev->dev, &dev_attr_lbs_flash_boot2))
324                 lbs_pr_err("cannot register lbs_flash_boot2 attribute\n");
325
326         return 0;
327
328 err_start_card:
329         lbs_remove_card(priv);
330 err_prog_firmware:
331         if_usb_reset_device(cardp);
332 dealloc:
333         if_usb_free(cardp);
334
335 error:
336         return -ENOMEM;
337 }
338
339 /**
340  *  @brief free resource and cleanup
341  *  @param intf         USB interface structure
342  *  @return             N/A
343  */
344 static void if_usb_disconnect(struct usb_interface *intf)
345 {
346         struct if_usb_card *cardp = usb_get_intfdata(intf);
347         struct lbs_private *priv = (struct lbs_private *) cardp->priv;
348
349         lbs_deb_enter(LBS_DEB_MAIN);
350
351         device_remove_file(&priv->dev->dev, &dev_attr_lbs_flash_boot2);
352         device_remove_file(&priv->dev->dev, &dev_attr_lbs_flash_fw);
353
354         cardp->surprise_removed = 1;
355
356         if (priv) {
357                 priv->surpriseremoved = 1;
358                 lbs_stop_card(priv);
359                 lbs_remove_card(priv);
360         }
361
362         /* Unlink and free urb */
363         if_usb_free(cardp);
364
365         usb_set_intfdata(intf, NULL);
366         usb_put_dev(interface_to_usbdev(intf));
367
368         lbs_deb_leave(LBS_DEB_MAIN);
369 }
370
371 /**
372  *  @brief  This function download FW
373  *  @param priv         pointer to struct lbs_private
374  *  @return             0
375  */
376 static int if_usb_send_fw_pkt(struct if_usb_card *cardp)
377 {
378         struct fwdata *fwdata = cardp->ep_out_buf;
379         const uint8_t *firmware = cardp->fw->data;
380
381         /* If we got a CRC failure on the last block, back
382            up and retry it */
383         if (!cardp->CRC_OK) {
384                 cardp->totalbytes = cardp->fwlastblksent;
385                 cardp->fwseqnum--;
386         }
387
388         lbs_deb_usb2(&cardp->udev->dev, "totalbytes = %d\n",
389                      cardp->totalbytes);
390
391         /* struct fwdata (which we sent to the card) has an
392            extra __le32 field in between the header and the data,
393            which is not in the struct fwheader in the actual
394            firmware binary. Insert the seqnum in the middle... */
395         memcpy(&fwdata->hdr, &firmware[cardp->totalbytes],
396                sizeof(struct fwheader));
397
398         cardp->fwlastblksent = cardp->totalbytes;
399         cardp->totalbytes += sizeof(struct fwheader);
400
401         memcpy(fwdata->data, &firmware[cardp->totalbytes],
402                le32_to_cpu(fwdata->hdr.datalength));
403
404         lbs_deb_usb2(&cardp->udev->dev, "Data length = %d\n",
405                      le32_to_cpu(fwdata->hdr.datalength));
406
407         fwdata->seqnum = cpu_to_le32(++cardp->fwseqnum);
408         cardp->totalbytes += le32_to_cpu(fwdata->hdr.datalength);
409
410         usb_tx_block(cardp, cardp->ep_out_buf, sizeof(struct fwdata) +
411                      le32_to_cpu(fwdata->hdr.datalength));
412
413         if (fwdata->hdr.dnldcmd == cpu_to_le32(FW_HAS_DATA_TO_RECV)) {
414                 lbs_deb_usb2(&cardp->udev->dev, "There are data to follow\n");
415                 lbs_deb_usb2(&cardp->udev->dev, "seqnum = %d totalbytes = %d\n",
416                              cardp->fwseqnum, cardp->totalbytes);
417         } else if (fwdata->hdr.dnldcmd == cpu_to_le32(FW_HAS_LAST_BLOCK)) {
418                 lbs_deb_usb2(&cardp->udev->dev, "Host has finished FW downloading\n");
419                 lbs_deb_usb2(&cardp->udev->dev, "Donwloading FW JUMP BLOCK\n");
420
421                 cardp->fwfinalblk = 1;
422         }
423
424         lbs_deb_usb2(&cardp->udev->dev, "Firmware download done; size %d\n",
425                      cardp->totalbytes);
426
427         return 0;
428 }
429
430 static int if_usb_reset_device(struct if_usb_card *cardp)
431 {
432         struct cmd_ds_command *cmd = cardp->ep_out_buf + 4;
433         int ret;
434
435         lbs_deb_enter(LBS_DEB_USB);
436
437         *(__le32 *)cardp->ep_out_buf = cpu_to_le32(CMD_TYPE_REQUEST);
438
439         cmd->command = cpu_to_le16(CMD_802_11_RESET);
440         cmd->size = cpu_to_le16(sizeof(struct cmd_header));
441         cmd->result = cpu_to_le16(0);
442         cmd->seqnum = cpu_to_le16(0x5a5a);
443         usb_tx_block(cardp, cardp->ep_out_buf, 4 + sizeof(struct cmd_header));
444
445         msleep(100);
446         ret = usb_reset_device(cardp->udev);
447         msleep(100);
448
449 #ifdef CONFIG_OLPC
450         if (ret && machine_is_olpc())
451                 if_usb_reset_olpc_card(NULL);
452 #endif
453
454         lbs_deb_leave_args(LBS_DEB_USB, "ret %d", ret);
455
456         return ret;
457 }
458
459 /**
460  *  @brief This function transfer the data to the device.
461  *  @param priv         pointer to struct lbs_private
462  *  @param payload      pointer to payload data
463  *  @param nb           data length
464  *  @return             0 or -1
465  */
466 static int usb_tx_block(struct if_usb_card *cardp, uint8_t *payload, uint16_t nb)
467 {
468         int ret = -1;
469
470         /* check if device is removed */
471         if (cardp->surprise_removed) {
472                 lbs_deb_usbd(&cardp->udev->dev, "Device removed\n");
473                 goto tx_ret;
474         }
475
476         usb_fill_bulk_urb(cardp->tx_urb, cardp->udev,
477                           usb_sndbulkpipe(cardp->udev,
478                                           cardp->ep_out),
479                           payload, nb, if_usb_write_bulk_callback, cardp);
480
481         cardp->tx_urb->transfer_flags |= URB_ZERO_PACKET;
482
483         if ((ret = usb_submit_urb(cardp->tx_urb, GFP_ATOMIC))) {
484                 lbs_deb_usbd(&cardp->udev->dev, "usb_submit_urb failed: %d\n", ret);
485                 ret = -1;
486         } else {
487                 lbs_deb_usb2(&cardp->udev->dev, "usb_submit_urb success\n");
488                 ret = 0;
489         }
490
491 tx_ret:
492         return ret;
493 }
494
495 static int __if_usb_submit_rx_urb(struct if_usb_card *cardp,
496                                   void (*callbackfn)(struct urb *urb))
497 {
498         struct sk_buff *skb;
499         int ret = -1;
500
501         if (!(skb = dev_alloc_skb(MRVDRV_ETH_RX_PACKET_BUFFER_SIZE))) {
502                 lbs_pr_err("No free skb\n");
503                 goto rx_ret;
504         }
505
506         cardp->rx_skb = skb;
507
508         /* Fill the receive configuration URB and initialise the Rx call back */
509         usb_fill_bulk_urb(cardp->rx_urb, cardp->udev,
510                           usb_rcvbulkpipe(cardp->udev, cardp->ep_in),
511                           (void *) (skb->tail + (size_t) IPFIELD_ALIGN_OFFSET),
512                           MRVDRV_ETH_RX_PACKET_BUFFER_SIZE, callbackfn,
513                           cardp);
514
515         cardp->rx_urb->transfer_flags |= URB_ZERO_PACKET;
516
517         lbs_deb_usb2(&cardp->udev->dev, "Pointer for rx_urb %p\n", cardp->rx_urb);
518         if ((ret = usb_submit_urb(cardp->rx_urb, GFP_ATOMIC))) {
519                 lbs_deb_usbd(&cardp->udev->dev, "Submit Rx URB failed: %d\n", ret);
520                 kfree_skb(skb);
521                 cardp->rx_skb = NULL;
522                 ret = -1;
523         } else {
524                 lbs_deb_usb2(&cardp->udev->dev, "Submit Rx URB success\n");
525                 ret = 0;
526         }
527
528 rx_ret:
529         return ret;
530 }
531
532 static int if_usb_submit_rx_urb_fwload(struct if_usb_card *cardp)
533 {
534         return __if_usb_submit_rx_urb(cardp, &if_usb_receive_fwload);
535 }
536
537 static int if_usb_submit_rx_urb(struct if_usb_card *cardp)
538 {
539         return __if_usb_submit_rx_urb(cardp, &if_usb_receive);
540 }
541
542 static void if_usb_receive_fwload(struct urb *urb)
543 {
544         struct if_usb_card *cardp = urb->context;
545         struct sk_buff *skb = cardp->rx_skb;
546         struct fwsyncheader *syncfwheader;
547         struct bootcmdresp bootcmdresp;
548
549         if (urb->status) {
550                 lbs_deb_usbd(&cardp->udev->dev,
551                              "URB status is failed during fw load\n");
552                 kfree_skb(skb);
553                 return;
554         }
555
556         if (cardp->fwdnldover) {
557                 __le32 *tmp = (__le32 *)(skb->data + IPFIELD_ALIGN_OFFSET);
558
559                 if (tmp[0] == cpu_to_le32(CMD_TYPE_INDICATION) &&
560                     tmp[1] == cpu_to_le32(MACREG_INT_CODE_FIRMWARE_READY)) {
561                         lbs_pr_info("Firmware ready event received\n");
562                         wake_up(&cardp->fw_wq);
563                 } else {
564                         lbs_deb_usb("Waiting for confirmation; got %x %x\n",
565                                     le32_to_cpu(tmp[0]), le32_to_cpu(tmp[1]));
566                         if_usb_submit_rx_urb_fwload(cardp);
567                 }
568                 kfree_skb(skb);
569                 return;
570         }
571         if (cardp->bootcmdresp <= 0) {
572                 memcpy (&bootcmdresp, skb->data + IPFIELD_ALIGN_OFFSET,
573                         sizeof(bootcmdresp));
574
575                 if (le16_to_cpu(cardp->udev->descriptor.bcdDevice) < 0x3106) {
576                         kfree_skb(skb);
577                         if_usb_submit_rx_urb_fwload(cardp);
578                         cardp->bootcmdresp = BOOT_CMD_RESP_OK;
579                         lbs_deb_usbd(&cardp->udev->dev,
580                                      "Received valid boot command response\n");
581                         return;
582                 }
583                 if (bootcmdresp.magic != cpu_to_le32(BOOT_CMD_MAGIC_NUMBER)) {
584                         if (bootcmdresp.magic == cpu_to_le32(CMD_TYPE_REQUEST) ||
585                             bootcmdresp.magic == cpu_to_le32(CMD_TYPE_DATA) ||
586                             bootcmdresp.magic == cpu_to_le32(CMD_TYPE_INDICATION)) {
587                                 if (!cardp->bootcmdresp)
588                                         lbs_pr_info("Firmware already seems alive; resetting\n");
589                                 cardp->bootcmdresp = -1;
590                         } else {
591                                 lbs_pr_info("boot cmd response wrong magic number (0x%x)\n",
592                                             le32_to_cpu(bootcmdresp.magic));
593                         }
594                 } else if ((bootcmdresp.cmd != BOOT_CMD_FW_BY_USB) &&
595                            (bootcmdresp.cmd != BOOT_CMD_UPDATE_FW) &&
596                            (bootcmdresp.cmd != BOOT_CMD_UPDATE_BOOT2)) {
597                         lbs_pr_info("boot cmd response cmd_tag error (%d)\n",
598                                     bootcmdresp.cmd);
599                 } else if (bootcmdresp.result != BOOT_CMD_RESP_OK) {
600                         lbs_pr_info("boot cmd response result error (%d)\n",
601                                     bootcmdresp.result);
602                 } else {
603                         cardp->bootcmdresp = 1;
604                         lbs_deb_usbd(&cardp->udev->dev,
605                                      "Received valid boot command response\n");
606                 }
607                 kfree_skb(skb);
608                 if_usb_submit_rx_urb_fwload(cardp);
609                 return;
610         }
611
612         syncfwheader = kmalloc(sizeof(struct fwsyncheader), GFP_ATOMIC);
613         if (!syncfwheader) {
614                 lbs_deb_usbd(&cardp->udev->dev, "Failure to allocate syncfwheader\n");
615                 kfree_skb(skb);
616                 return;
617         }
618
619         memcpy(syncfwheader, skb->data + IPFIELD_ALIGN_OFFSET,
620                sizeof(struct fwsyncheader));
621
622         if (!syncfwheader->cmd) {
623                 lbs_deb_usb2(&cardp->udev->dev, "FW received Blk with correct CRC\n");
624                 lbs_deb_usb2(&cardp->udev->dev, "FW received Blk seqnum = %d\n",
625                              le32_to_cpu(syncfwheader->seqnum));
626                 cardp->CRC_OK = 1;
627         } else {
628                 lbs_deb_usbd(&cardp->udev->dev, "FW received Blk with CRC error\n");
629                 cardp->CRC_OK = 0;
630         }
631
632         kfree_skb(skb);
633
634         /* Give device 5s to either write firmware to its RAM or eeprom */
635         mod_timer(&cardp->fw_timeout, jiffies + (HZ*5));
636
637         if (cardp->fwfinalblk) {
638                 cardp->fwdnldover = 1;
639                 goto exit;
640         }
641
642         if_usb_send_fw_pkt(cardp);
643
644  exit:
645         if_usb_submit_rx_urb_fwload(cardp);
646
647         kfree(syncfwheader);
648
649         return;
650 }
651
652 #define MRVDRV_MIN_PKT_LEN      30
653
654 static inline void process_cmdtypedata(int recvlength, struct sk_buff *skb,
655                                        struct if_usb_card *cardp,
656                                        struct lbs_private *priv)
657 {
658         if (recvlength > MRVDRV_ETH_RX_PACKET_BUFFER_SIZE + MESSAGE_HEADER_LEN
659             || recvlength < MRVDRV_MIN_PKT_LEN) {
660                 lbs_deb_usbd(&cardp->udev->dev, "Packet length is Invalid\n");
661                 kfree_skb(skb);
662                 return;
663         }
664
665         skb_reserve(skb, IPFIELD_ALIGN_OFFSET);
666         skb_put(skb, recvlength);
667         skb_pull(skb, MESSAGE_HEADER_LEN);
668
669         lbs_process_rxed_packet(priv, skb);
670 }
671
672 static inline void process_cmdrequest(int recvlength, uint8_t *recvbuff,
673                                       struct sk_buff *skb,
674                                       struct if_usb_card *cardp,
675                                       struct lbs_private *priv)
676 {
677         u8 i;
678
679         if (recvlength > LBS_CMD_BUFFER_SIZE) {
680                 lbs_deb_usbd(&cardp->udev->dev,
681                              "The receive buffer is too large\n");
682                 kfree_skb(skb);
683                 return;
684         }
685
686         BUG_ON(!in_interrupt());
687
688         spin_lock(&priv->driver_lock);
689
690         i = (priv->resp_idx == 0) ? 1 : 0;
691         BUG_ON(priv->resp_len[i]);
692         priv->resp_len[i] = (recvlength - MESSAGE_HEADER_LEN);
693         memcpy(priv->resp_buf[i], recvbuff + MESSAGE_HEADER_LEN,
694                 priv->resp_len[i]);
695         kfree_skb(skb);
696         lbs_notify_command_response(priv, i);
697
698         spin_unlock(&priv->driver_lock);
699
700         lbs_deb_usbd(&cardp->udev->dev,
701                     "Wake up main thread to handle cmd response\n");
702 }
703
704 /**
705  *  @brief This function reads of the packet into the upload buff,
706  *  wake up the main thread and initialise the Rx callack.
707  *
708  *  @param urb          pointer to struct urb
709  *  @return             N/A
710  */
711 static void if_usb_receive(struct urb *urb)
712 {
713         struct if_usb_card *cardp = urb->context;
714         struct sk_buff *skb = cardp->rx_skb;
715         struct lbs_private *priv = cardp->priv;
716         int recvlength = urb->actual_length;
717         uint8_t *recvbuff = NULL;
718         uint32_t recvtype = 0;
719         __le32 *pkt = (__le32 *)(skb->data + IPFIELD_ALIGN_OFFSET);
720         uint32_t event;
721
722         lbs_deb_enter(LBS_DEB_USB);
723
724         if (recvlength) {
725                 if (urb->status) {
726                         lbs_deb_usbd(&cardp->udev->dev, "RX URB failed: %d\n",
727                                      urb->status);
728                         kfree_skb(skb);
729                         goto setup_for_next;
730                 }
731
732                 recvbuff = skb->data + IPFIELD_ALIGN_OFFSET;
733                 recvtype = le32_to_cpu(pkt[0]);
734                 lbs_deb_usbd(&cardp->udev->dev,
735                             "Recv length = 0x%x, Recv type = 0x%X\n",
736                             recvlength, recvtype);
737         } else if (urb->status) {
738                 kfree_skb(skb);
739                 goto rx_exit;
740         }
741
742         switch (recvtype) {
743         case CMD_TYPE_DATA:
744                 process_cmdtypedata(recvlength, skb, cardp, priv);
745                 break;
746
747         case CMD_TYPE_REQUEST:
748                 process_cmdrequest(recvlength, recvbuff, skb, cardp, priv);
749                 break;
750
751         case CMD_TYPE_INDICATION:
752                 /* Event handling */
753                 event = le32_to_cpu(pkt[1]);
754                 lbs_deb_usbd(&cardp->udev->dev, "**EVENT** 0x%X\n", event);
755                 kfree_skb(skb);
756
757                 /* Icky undocumented magic special case */
758                 if (event & 0xffff0000) {
759                         u32 trycount = (event & 0xffff0000) >> 16;
760
761                         lbs_send_tx_feedback(priv, trycount);
762                 } else
763                         lbs_queue_event(priv, event & 0xFF);
764                 break;
765
766         default:
767                 lbs_deb_usbd(&cardp->udev->dev, "Unknown command type 0x%X\n",
768                              recvtype);
769                 kfree_skb(skb);
770                 break;
771         }
772
773 setup_for_next:
774         if_usb_submit_rx_urb(cardp);
775 rx_exit:
776         lbs_deb_leave(LBS_DEB_USB);
777 }
778
779 /**
780  *  @brief This function downloads data to FW
781  *  @param priv         pointer to struct lbs_private structure
782  *  @param type         type of data
783  *  @param buf          pointer to data buffer
784  *  @param len          number of bytes
785  *  @return             0 or -1
786  */
787 static int if_usb_host_to_card(struct lbs_private *priv, uint8_t type,
788                                uint8_t *payload, uint16_t nb)
789 {
790         struct if_usb_card *cardp = priv->card;
791
792         lbs_deb_usbd(&cardp->udev->dev,"*** type = %u\n", type);
793         lbs_deb_usbd(&cardp->udev->dev,"size after = %d\n", nb);
794
795         if (type == MVMS_CMD) {
796                 *(__le32 *)cardp->ep_out_buf = cpu_to_le32(CMD_TYPE_REQUEST);
797                 priv->dnld_sent = DNLD_CMD_SENT;
798         } else {
799                 *(__le32 *)cardp->ep_out_buf = cpu_to_le32(CMD_TYPE_DATA);
800                 priv->dnld_sent = DNLD_DATA_SENT;
801         }
802
803         memcpy((cardp->ep_out_buf + MESSAGE_HEADER_LEN), payload, nb);
804
805         return usb_tx_block(cardp, cardp->ep_out_buf, nb + MESSAGE_HEADER_LEN);
806 }
807
808 /**
809  *  @brief This function issues Boot command to the Boot2 code
810  *  @param ivalue   1:Boot from FW by USB-Download
811  *                  2:Boot from FW in EEPROM
812  *  @return             0
813  */
814 static int if_usb_issue_boot_command(struct if_usb_card *cardp, int ivalue)
815 {
816         struct bootcmd *bootcmd = cardp->ep_out_buf;
817
818         /* Prepare command */
819         bootcmd->magic = cpu_to_le32(BOOT_CMD_MAGIC_NUMBER);
820         bootcmd->cmd = ivalue;
821         memset(bootcmd->pad, 0, sizeof(bootcmd->pad));
822
823         /* Issue command */
824         usb_tx_block(cardp, cardp->ep_out_buf, sizeof(*bootcmd));
825
826         return 0;
827 }
828
829
830 /**
831  *  @brief This function checks the validity of Boot2/FW image.
832  *
833  *  @param data              pointer to image
834  *         len               image length
835  *  @return     0 or -1
836  */
837 static int check_fwfile_format(const uint8_t *data, uint32_t totlen)
838 {
839         uint32_t bincmd, exit;
840         uint32_t blksize, offset, len;
841         int ret;
842
843         ret = 1;
844         exit = len = 0;
845
846         do {
847                 struct fwheader *fwh = (void *)data;
848
849                 bincmd = le32_to_cpu(fwh->dnldcmd);
850                 blksize = le32_to_cpu(fwh->datalength);
851                 switch (bincmd) {
852                 case FW_HAS_DATA_TO_RECV:
853                         offset = sizeof(struct fwheader) + blksize;
854                         data += offset;
855                         len += offset;
856                         if (len >= totlen)
857                                 exit = 1;
858                         break;
859                 case FW_HAS_LAST_BLOCK:
860                         exit = 1;
861                         ret = 0;
862                         break;
863                 default:
864                         exit = 1;
865                         break;
866                 }
867         } while (!exit);
868
869         if (ret)
870                 lbs_pr_err("firmware file format check FAIL\n");
871         else
872                 lbs_deb_fw("firmware file format check PASS\n");
873
874         return ret;
875 }
876
877
878 /**
879 *  @brief This function programs the firmware subject to cmd
880 *
881 *  @param cardp             the if_usb_card descriptor
882 *         fwname            firmware or boot2 image file name
883 *         cmd               either BOOT_CMD_FW_BY_USB, BOOT_CMD_UPDATE_FW,
884 *                           or BOOT_CMD_UPDATE_BOOT2.
885 *  @return     0 or error code
886 */
887 static int if_usb_prog_firmware(struct if_usb_card *cardp,
888                                 const char *fwname, int cmd)
889 {
890         struct lbs_private *priv = cardp->priv;
891         unsigned long flags, caps;
892         int ret;
893
894         caps = priv->fwcapinfo;
895         if (((cmd == BOOT_CMD_UPDATE_FW) && !(caps & FW_CAPINFO_FIRMWARE_UPGRADE)) ||
896             ((cmd == BOOT_CMD_UPDATE_BOOT2) && !(caps & FW_CAPINFO_BOOT2_UPGRADE)))
897                 return -EOPNOTSUPP;
898
899         /* Ensure main thread is idle. */
900         spin_lock_irqsave(&priv->driver_lock, flags);
901         while (priv->cur_cmd != NULL || priv->dnld_sent != DNLD_RES_RECEIVED) {
902                 spin_unlock_irqrestore(&priv->driver_lock, flags);
903                 if (wait_event_interruptible(priv->waitq,
904                                 (priv->cur_cmd == NULL &&
905                                 priv->dnld_sent == DNLD_RES_RECEIVED))) {
906                         return -ERESTARTSYS;
907                 }
908                 spin_lock_irqsave(&priv->driver_lock, flags);
909         }
910         priv->dnld_sent = DNLD_BOOTCMD_SENT;
911         spin_unlock_irqrestore(&priv->driver_lock, flags);
912
913         ret = __if_usb_prog_firmware(cardp, fwname, cmd);
914
915         spin_lock_irqsave(&priv->driver_lock, flags);
916         priv->dnld_sent = DNLD_RES_RECEIVED;
917         spin_unlock_irqrestore(&priv->driver_lock, flags);
918
919         wake_up_interruptible(&priv->waitq);
920
921         return ret;
922 }
923
924 static int __if_usb_prog_firmware(struct if_usb_card *cardp,
925                                         const char *fwname, int cmd)
926 {
927         int i = 0;
928         static int reset_count = 10;
929         int ret = 0;
930
931         lbs_deb_enter(LBS_DEB_USB);
932
933         ret = request_firmware(&cardp->fw, fwname, &cardp->udev->dev);
934         if (ret < 0) {
935                 lbs_pr_err("request_firmware() failed with %#x\n", ret);
936                 lbs_pr_err("firmware %s not found\n", fwname);
937                 goto done;
938         }
939
940         if (check_fwfile_format(cardp->fw->data, cardp->fw->size)) {
941                 ret = -EINVAL;
942                 goto release_fw;
943         }
944
945         /* Cancel any pending usb business */
946         usb_kill_urb(cardp->rx_urb);
947         usb_kill_urb(cardp->tx_urb);
948
949         cardp->fwlastblksent = 0;
950         cardp->fwdnldover = 0;
951         cardp->totalbytes = 0;
952         cardp->fwfinalblk = 0;
953         cardp->bootcmdresp = 0;
954
955 restart:
956         if (if_usb_submit_rx_urb_fwload(cardp) < 0) {
957                 lbs_deb_usbd(&cardp->udev->dev, "URB submission is failed\n");
958                 ret = -EIO;
959                 goto release_fw;
960         }
961
962         cardp->bootcmdresp = 0;
963         do {
964                 int j = 0;
965                 i++;
966                 if_usb_issue_boot_command(cardp, cmd);
967                 /* wait for command response */
968                 do {
969                         j++;
970                         msleep_interruptible(100);
971                 } while (cardp->bootcmdresp == 0 && j < 10);
972         } while (cardp->bootcmdresp == 0 && i < 5);
973
974         if (cardp->bootcmdresp == BOOT_CMD_RESP_NOT_SUPPORTED) {
975                 /* Return to normal operation */
976                 ret = -EOPNOTSUPP;
977                 usb_kill_urb(cardp->rx_urb);
978                 usb_kill_urb(cardp->tx_urb);
979                 if (if_usb_submit_rx_urb(cardp) < 0)
980                         ret = -EIO;
981                 goto release_fw;
982         } else if (cardp->bootcmdresp <= 0) {
983                 if (--reset_count >= 0) {
984                         if_usb_reset_device(cardp);
985                         goto restart;
986                 }
987                 ret = -EIO;
988                 goto release_fw;
989         }
990
991         i = 0;
992
993         cardp->totalbytes = 0;
994         cardp->fwlastblksent = 0;
995         cardp->CRC_OK = 1;
996         cardp->fwdnldover = 0;
997         cardp->fwseqnum = -1;
998         cardp->totalbytes = 0;
999         cardp->fwfinalblk = 0;
1000
1001         /* Send the first firmware packet... */
1002         if_usb_send_fw_pkt(cardp);
1003
1004         /* ... and wait for the process to complete */
1005         wait_event_interruptible(cardp->fw_wq, cardp->surprise_removed || cardp->fwdnldover);
1006
1007         del_timer_sync(&cardp->fw_timeout);
1008         usb_kill_urb(cardp->rx_urb);
1009
1010         if (!cardp->fwdnldover) {
1011                 lbs_pr_info("failed to load fw, resetting device!\n");
1012                 if (--reset_count >= 0) {
1013                         if_usb_reset_device(cardp);
1014                         goto restart;
1015                 }
1016
1017                 lbs_pr_info("FW download failure, time = %d ms\n", i * 100);
1018                 ret = -EIO;
1019                 goto release_fw;
1020         }
1021
1022  release_fw:
1023         release_firmware(cardp->fw);
1024         cardp->fw = NULL;
1025
1026  done:
1027         lbs_deb_leave_args(LBS_DEB_USB, "ret %d", ret);
1028         return ret;
1029 }
1030
1031
1032 #ifdef CONFIG_PM
1033 static int if_usb_suspend(struct usb_interface *intf, pm_message_t message)
1034 {
1035         struct if_usb_card *cardp = usb_get_intfdata(intf);
1036         struct lbs_private *priv = cardp->priv;
1037         int ret;
1038
1039         lbs_deb_enter(LBS_DEB_USB);
1040
1041         if (priv->psstate != PS_STATE_FULL_POWER)
1042                 return -1;
1043
1044         ret = lbs_suspend(priv);
1045         if (ret)
1046                 goto out;
1047
1048         /* Unlink tx & rx urb */
1049         usb_kill_urb(cardp->tx_urb);
1050         usb_kill_urb(cardp->rx_urb);
1051
1052  out:
1053         lbs_deb_leave(LBS_DEB_USB);
1054         return ret;
1055 }
1056
1057 static int if_usb_resume(struct usb_interface *intf)
1058 {
1059         struct if_usb_card *cardp = usb_get_intfdata(intf);
1060         struct lbs_private *priv = cardp->priv;
1061
1062         lbs_deb_enter(LBS_DEB_USB);
1063
1064         if_usb_submit_rx_urb(cardp);
1065
1066         lbs_resume(priv);
1067
1068         lbs_deb_leave(LBS_DEB_USB);
1069         return 0;
1070 }
1071 #else
1072 #define if_usb_suspend NULL
1073 #define if_usb_resume NULL
1074 #endif
1075
1076 static struct usb_driver if_usb_driver = {
1077         .name = DRV_NAME,
1078         .probe = if_usb_probe,
1079         .disconnect = if_usb_disconnect,
1080         .id_table = if_usb_table,
1081         .suspend = if_usb_suspend,
1082         .resume = if_usb_resume,
1083         .reset_resume = if_usb_resume,
1084 };
1085
1086 static int __init if_usb_init_module(void)
1087 {
1088         int ret = 0;
1089
1090         lbs_deb_enter(LBS_DEB_MAIN);
1091
1092         ret = usb_register(&if_usb_driver);
1093
1094         lbs_deb_leave_args(LBS_DEB_MAIN, "ret %d", ret);
1095         return ret;
1096 }
1097
1098 static void __exit if_usb_exit_module(void)
1099 {
1100         lbs_deb_enter(LBS_DEB_MAIN);
1101
1102         usb_deregister(&if_usb_driver);
1103
1104         lbs_deb_leave(LBS_DEB_MAIN);
1105 }
1106
1107 module_init(if_usb_init_module);
1108 module_exit(if_usb_exit_module);
1109
1110 MODULE_DESCRIPTION("8388 USB WLAN Driver");
1111 MODULE_AUTHOR("Marvell International Ltd. and Red Hat, Inc.");
1112 MODULE_LICENSE("GPL");