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