if_usb.c 25.3 KB
Newer Older
1
// SPDX-License-Identifier: GPL-2.0-only
2 3 4
/*
 * This file contains functions used in USB interface module.
 */
5 6 7

#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

8
#include <linux/delay.h>
9
#include <linux/module.h>
10 11
#include <linux/firmware.h>
#include <linux/netdevice.h>
12
#include <linux/slab.h>
13
#include <linux/usb.h>
14
#include <linux/olpc-ec.h>
15

16 17 18 19
#ifdef CONFIG_OLPC
#include <asm/olpc.h>
#endif

20 21
#define DRV_NAME "usb8xxx"

22 23 24 25
#include "host.h"
#include "decl.h"
#include "defs.h"
#include "dev.h"
26
#include "cmd.h"
27 28
#include "if_usb.h"

29 30 31
#define INSANEDEBUG	0
#define lbs_deb_usb2(...) do { if (INSANEDEBUG) lbs_deb_usbd(__VA_ARGS__); } while (0)

32 33
#define MESSAGE_HEADER_LEN	4

34 35 36 37
MODULE_FIRMWARE("libertas/usb8388_v9.bin");
MODULE_FIRMWARE("libertas/usb8388_v5.bin");
MODULE_FIRMWARE("libertas/usb8388.bin");
MODULE_FIRMWARE("libertas/usb8682.bin");
38 39
MODULE_FIRMWARE("usb8388.bin");

40 41 42 43 44 45
enum {
	MODEL_UNKNOWN = 0x0,
	MODEL_8388 = 0x1,
	MODEL_8682 = 0x2
};

46 47 48 49 50 51 52
/* table of firmware file names */
static const struct lbs_fw_table fw_table[] = {
	{ MODEL_8388, "libertas/usb8388_olpc.bin", NULL },
	{ MODEL_8388, "libertas/usb8388_v9.bin", NULL },
	{ MODEL_8388, "libertas/usb8388_v5.bin", NULL },
	{ MODEL_8388, "libertas/usb8388.bin", NULL },
	{ MODEL_8388, "usb8388.bin", NULL },
53 54
	{ MODEL_8682, "libertas/usb8682.bin", NULL },
	{ 0, NULL, NULL }
55 56
};

57
static const struct usb_device_id if_usb_table[] = {
58
	/* Enter the device signature inside */
59 60
	{ USB_DEVICE(0x1286, 0x2001), .driver_info = MODEL_8388 },
	{ USB_DEVICE(0x05a3, 0x8388), .driver_info = MODEL_8388 },
61 62 63 64 65 66 67
	{}	/* Terminating entry */
};

MODULE_DEVICE_TABLE(usb, if_usb_table);

static void if_usb_receive(struct urb *urb);
static void if_usb_receive_fwload(struct urb *urb);
68 69 70
static void if_usb_prog_firmware(struct lbs_private *priv, int ret,
				 const struct firmware *fw,
				 const struct firmware *unused);
71 72 73 74 75 76 77
static int if_usb_host_to_card(struct lbs_private *priv, uint8_t type,
			       uint8_t *payload, uint16_t nb);
static int usb_tx_block(struct if_usb_card *cardp, uint8_t *payload,
			uint16_t nb);
static void if_usb_free(struct if_usb_card *cardp);
static int if_usb_submit_rx_urb(struct if_usb_card *cardp);
static int if_usb_reset_device(struct if_usb_card *cardp);
78 79

/**
80 81 82 83
 * if_usb_write_bulk_callback - callback function to handle the status
 * of the URB
 * @urb:	pointer to &urb structure
 * returns:	N/A
84 85 86
 */
static void if_usb_write_bulk_callback(struct urb *urb)
{
87
	struct if_usb_card *cardp = (struct if_usb_card *) urb->context;
88 89 90

	/* handle the transmission complete validations */

91
	if (urb->status == 0) {
92
		struct lbs_private *priv = cardp->priv;
93

94 95 96
		lbs_deb_usb2(&urb->dev->dev, "URB status is successful\n");
		lbs_deb_usb2(&urb->dev->dev, "Actual length transmitted %d\n",
			     urb->actual_length);
97

98 99
		/* Boot commands such as UPDATE_FW and UPDATE_BOOT2 are not
		 * passed up to the lbs level.
100
		 */
101
		if (priv && priv->dnld_sent != DNLD_BOOTCMD_SENT)
102
			lbs_host_to_card_done(priv);
103 104
	} else {
		/* print the failure status number for debug */
105
		pr_info("URB in failure status: %d\n", urb->status);
106 107 108 109
	}
}

/**
110 111 112
 * if_usb_free - free tx/rx urb, skb and rx buffer
 * @cardp:	pointer to &if_usb_card
 * returns:	N/A
113
 */
114
static void if_usb_free(struct if_usb_card *cardp)
115 116 117 118 119 120 121 122 123 124 125
{
	/* Unlink tx & rx urb */
	usb_kill_urb(cardp->tx_urb);
	usb_kill_urb(cardp->rx_urb);

	usb_free_urb(cardp->tx_urb);
	cardp->tx_urb = NULL;

	usb_free_urb(cardp->rx_urb);
	cardp->rx_urb = NULL;

126 127
	kfree(cardp->ep_out_buf);
	cardp->ep_out_buf = NULL;
128 129
}

130
static void if_usb_setup_firmware(struct lbs_private *priv)
131
{
132
	struct if_usb_card *cardp = priv->card;
133
	struct cmd_ds_set_boot2_ver b2_cmd;
134
	struct cmd_ds_802_11_fw_wake_method wake_method;
135

136
	b2_cmd.hdr.size = cpu_to_le16(sizeof(b2_cmd));
137
	b2_cmd.action = 0;
138
	b2_cmd.version = cardp->boot2_version;
139

140
	if (lbs_cmd_with_response(priv, CMD_SET_BOOT2_VER, &b2_cmd))
141
		lbs_deb_usb("Setting boot2 version failed\n");
142 143 144

	priv->wol_gpio = 2; /* Wake via GPIO2... */
	priv->wol_gap = 20; /* ... after 20ms    */
145 146
	lbs_host_sleep_cfg(priv, EHS_WAKE_ON_UNICAST_DATA,
			(struct wol_config *) NULL);
147 148 149 150

	wake_method.hdr.size = cpu_to_le16(sizeof(wake_method));
	wake_method.action = cpu_to_le16(CMD_ACT_GET);
	if (lbs_cmd_with_response(priv, CMD_802_11_FW_WAKE_METHOD, &wake_method)) {
151
		netdev_info(priv->dev, "Firmware does not seem to support PS mode\n");
152
		priv->fwcapinfo &= ~FW_CAPINFO_PS;
153 154 155 156 157 158
	} else {
		if (le16_to_cpu(wake_method.method) == CMD_WAKE_METHOD_COMMAND_INT) {
			lbs_deb_usb("Firmware seems to support PS with wake-via-command\n");
		} else {
			/* The versions which boot up this way don't seem to
			   work even if we set it to the command interrupt */
159
			priv->fwcapinfo &= ~FW_CAPINFO_PS;
160 161
			netdev_info(priv->dev,
				    "Firmware doesn't wake via command interrupt; disabling PS mode\n");
162 163
		}
	}
164 165
}

166
static void if_usb_fw_timeo(struct timer_list *t)
167
{
168
	struct if_usb_card *cardp = from_timer(cardp, t, fw_timeout);
169

170 171 172
	if (cardp->fwdnldover) {
		lbs_deb_usb("Download complete, no event. Assuming success\n");
	} else {
173
		pr_err("Download timed out\n");
174 175 176 177
		cardp->surprise_removed = 1;
	}
	wake_up(&cardp->fw_wq);
}
178

179 180 181 182 183 184 185 186
#ifdef CONFIG_OLPC
static void if_usb_reset_olpc_card(struct lbs_private *priv)
{
	printk(KERN_CRIT "Resetting OLPC wireless via EC...\n");
	olpc_ec_cmd(0x25, NULL, 0, NULL, 0);
}
#endif

187
/**
188 189 190 191
 * if_usb_probe - sets the configuration values
 * @intf:	&usb_interface pointer
 * @id:	pointer to usb_device_id
 * returns:	0 on success, error code on failure
192 193 194 195 196 197 198
 */
static int if_usb_probe(struct usb_interface *intf,
			const struct usb_device_id *id)
{
	struct usb_device *udev;
	struct usb_host_interface *iface_desc;
	struct usb_endpoint_descriptor *endpoint;
199
	struct lbs_private *priv;
200
	struct if_usb_card *cardp;
201
	int r = -ENOMEM;
202 203 204 205
	int i;

	udev = interface_to_usbdev(intf);

206
	cardp = kzalloc(sizeof(struct if_usb_card), GFP_KERNEL);
207
	if (!cardp)
208 209
		goto error;

210
	timer_setup(&cardp->fw_timeout, if_usb_fw_timeo, 0);
211
	init_waitqueue_head(&cardp->fw_wq);
212

213
	cardp->udev = udev;
214
	cardp->model = (uint32_t) id->driver_info;
215 216
	iface_desc = intf->cur_altsetting;

217
	lbs_deb_usbd(&udev->dev, "bcdUSB = 0x%X bDeviceClass = 0x%X"
218
		     " bDeviceSubClass = 0x%X, bDeviceProtocol = 0x%X\n",
219 220 221 222
		     le16_to_cpu(udev->descriptor.bcdUSB),
		     udev->descriptor.bDeviceClass,
		     udev->descriptor.bDeviceSubClass,
		     udev->descriptor.bDeviceProtocol);
223 224 225

	for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
		endpoint = &iface_desc->endpoint[i].desc;
226 227 228
		if (usb_endpoint_is_bulk_in(endpoint)) {
			cardp->ep_in_size = le16_to_cpu(endpoint->wMaxPacketSize);
			cardp->ep_in = usb_endpoint_num(endpoint);
229

230 231
			lbs_deb_usbd(&udev->dev, "in_endpoint = %d\n", cardp->ep_in);
			lbs_deb_usbd(&udev->dev, "Bulk in size is %d\n", cardp->ep_in_size);
232

233 234 235 236 237 238
		} else if (usb_endpoint_is_bulk_out(endpoint)) {
			cardp->ep_out_size = le16_to_cpu(endpoint->wMaxPacketSize);
			cardp->ep_out = usb_endpoint_num(endpoint);

			lbs_deb_usbd(&udev->dev, "out_endpoint = %d\n", cardp->ep_out);
			lbs_deb_usbd(&udev->dev, "Bulk out size is %d\n", cardp->ep_out_size);
239 240
		}
	}
241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257
	if (!cardp->ep_out_size || !cardp->ep_in_size) {
		lbs_deb_usbd(&udev->dev, "Endpoints not found\n");
		goto dealloc;
	}
	if (!(cardp->rx_urb = usb_alloc_urb(0, GFP_KERNEL))) {
		lbs_deb_usbd(&udev->dev, "Rx URB allocation failed\n");
		goto dealloc;
	}
	if (!(cardp->tx_urb = usb_alloc_urb(0, GFP_KERNEL))) {
		lbs_deb_usbd(&udev->dev, "Tx URB allocation failed\n");
		goto dealloc;
	}
	cardp->ep_out_buf = kmalloc(MRVDRV_ETH_TX_PACKET_BUFFER_SIZE, GFP_KERNEL);
	if (!cardp->ep_out_buf) {
		lbs_deb_usbd(&udev->dev, "Could not allocate buffer\n");
		goto dealloc;
	}
258

259 260 261
	priv = lbs_add_card(cardp, &intf->dev);
	if (IS_ERR(priv)) {
		r = PTR_ERR(priv);
262
		goto err_add_card;
263
	}
264

265
	cardp->priv = priv;
266

267
	priv->hw_host_to_card = if_usb_host_to_card;
268 269 270
	priv->enter_deep_sleep = NULL;
	priv->exit_deep_sleep = NULL;
	priv->reset_deep_sleep_wakeup = NULL;
271
	priv->is_polling = false;
272 273 274 275 276
#ifdef CONFIG_OLPC
	if (machine_is_olpc())
		priv->reset_card = if_usb_reset_olpc_card;
#endif

277
	cardp->boot2_version = udev->descriptor.bcdDevice;
278

279
	usb_get_dev(udev);
280
	usb_set_intfdata(intf, cardp);
281

282 283 284 285
	r = lbs_get_firmware_async(priv, &udev->dev, cardp->model,
				   fw_table, if_usb_prog_firmware);
	if (r)
		goto err_get_fw;
286

287 288
	return 0;

289
err_get_fw:
290
	usb_put_dev(udev);
291
	lbs_remove_card(priv);
292
err_add_card:
293
	if_usb_reset_device(cardp);
294
dealloc:
295
	if_usb_free(cardp);
296
	kfree(cardp);
297 298

error:
299
	return r;
300 301 302
}

/**
303 304 305
 * if_usb_disconnect - free resource and cleanup
 * @intf:	USB interface structure
 * returns:	N/A
306 307 308
 */
static void if_usb_disconnect(struct usb_interface *intf)
{
309
	struct if_usb_card *cardp = usb_get_intfdata(intf);
310
	struct lbs_private *priv = cardp->priv;
311

312
	cardp->surprise_removed = 1;
313

314
	if (priv) {
315 316
		lbs_stop_card(priv);
		lbs_remove_card(priv);
317
	}
318 319 320

	/* Unlink and free urb */
	if_usb_free(cardp);
321
	kfree(cardp);
322 323 324 325 326 327

	usb_set_intfdata(intf, NULL);
	usb_put_dev(interface_to_usbdev(intf));
}

/**
328 329 330
 * if_usb_send_fw_pkt - download FW
 * @cardp:	pointer to &struct if_usb_card
 * returns:	0
331
 */
332
static int if_usb_send_fw_pkt(struct if_usb_card *cardp)
333
{
334
	struct fwdata *fwdata = cardp->ep_out_buf;
335
	const uint8_t *firmware = cardp->fw->data;
336

337 338
	/* If we got a CRC failure on the last block, back
	   up and retry it */
339 340
	if (!cardp->CRC_OK) {
		cardp->totalbytes = cardp->fwlastblksent;
341
		cardp->fwseqnum--;
342 343
	}

344 345
	lbs_deb_usb2(&cardp->udev->dev, "totalbytes = %d\n",
		     cardp->totalbytes);
346

347 348 349 350 351
	/* struct fwdata (which we sent to the card) has an
	   extra __le32 field in between the header and the data,
	   which is not in the struct fwheader in the actual
	   firmware binary. Insert the seqnum in the middle... */
	memcpy(&fwdata->hdr, &firmware[cardp->totalbytes],
352 353 354 355 356 357
	       sizeof(struct fwheader));

	cardp->fwlastblksent = cardp->totalbytes;
	cardp->totalbytes += sizeof(struct fwheader);

	memcpy(fwdata->data, &firmware[cardp->totalbytes],
358
	       le32_to_cpu(fwdata->hdr.datalength));
359

360 361
	lbs_deb_usb2(&cardp->udev->dev, "Data length = %d\n",
		     le32_to_cpu(fwdata->hdr.datalength));
362

363 364
	fwdata->seqnum = cpu_to_le32(++cardp->fwseqnum);
	cardp->totalbytes += le32_to_cpu(fwdata->hdr.datalength);
365

366 367 368 369 370 371 372 373 374
	usb_tx_block(cardp, cardp->ep_out_buf, sizeof(struct fwdata) +
		     le32_to_cpu(fwdata->hdr.datalength));

	if (fwdata->hdr.dnldcmd == cpu_to_le32(FW_HAS_DATA_TO_RECV)) {
		lbs_deb_usb2(&cardp->udev->dev, "There are data to follow\n");
		lbs_deb_usb2(&cardp->udev->dev, "seqnum = %d totalbytes = %d\n",
			     cardp->fwseqnum, cardp->totalbytes);
	} else if (fwdata->hdr.dnldcmd == cpu_to_le32(FW_HAS_LAST_BLOCK)) {
		lbs_deb_usb2(&cardp->udev->dev, "Host has finished FW downloading\n");
375
		lbs_deb_usb2(&cardp->udev->dev, "Downloading FW JUMP BLOCK\n");
376 377 378 379

		cardp->fwfinalblk = 1;
	}

380 381
	lbs_deb_usb2(&cardp->udev->dev, "Firmware download done; size %d\n",
		     cardp->totalbytes);
382 383 384 385

	return 0;
}

386
static int if_usb_reset_device(struct if_usb_card *cardp)
387
{
388
	struct cmd_header *cmd = cardp->ep_out_buf + 4;
389 390
	int ret;

391
	*(__le32 *)cardp->ep_out_buf = cpu_to_le32(CMD_TYPE_REQUEST);
392 393

	cmd->command = cpu_to_le16(CMD_802_11_RESET);
394
	cmd->size = cpu_to_le16(sizeof(cmd));
395 396
	cmd->result = cpu_to_le16(0);
	cmd->seqnum = cpu_to_le16(0x5a5a);
397
	usb_tx_block(cardp, cardp->ep_out_buf, 4 + sizeof(struct cmd_header));
398

399
	msleep(100);
400
	ret = usb_reset_device(cardp->udev);
401
	msleep(100);
402

403 404 405 406 407
#ifdef CONFIG_OLPC
	if (ret && machine_is_olpc())
		if_usb_reset_olpc_card(NULL);
#endif

408 409 410 411
	return ret;
}

/**
412 413 414 415 416
 *  usb_tx_block - transfer the data to the device
 *  @cardp: 	pointer to &struct if_usb_card
 *  @payload:	pointer to payload data
 *  @nb:	data length
 *  returns:	0 for success or negative error code
417
 */
418
static int usb_tx_block(struct if_usb_card *cardp, uint8_t *payload, uint16_t nb)
419
{
420
	int ret;
421 422

	/* check if device is removed */
423
	if (cardp->surprise_removed) {
424
		lbs_deb_usbd(&cardp->udev->dev, "Device removed\n");
425
		ret = -ENODEV;
426 427 428 429 430
		goto tx_ret;
	}

	usb_fill_bulk_urb(cardp->tx_urb, cardp->udev,
			  usb_sndbulkpipe(cardp->udev,
431
					  cardp->ep_out),
432
			  payload, nb, if_usb_write_bulk_callback, cardp);
433 434 435 436

	cardp->tx_urb->transfer_flags |= URB_ZERO_PACKET;

	if ((ret = usb_submit_urb(cardp->tx_urb, GFP_ATOMIC))) {
437
		lbs_deb_usbd(&cardp->udev->dev, "usb_submit_urb failed: %d\n", ret);
438
	} else {
439
		lbs_deb_usb2(&cardp->udev->dev, "usb_submit_urb success\n");
440 441 442 443 444 445 446
		ret = 0;
	}

tx_ret:
	return ret;
}

447
static int __if_usb_submit_rx_urb(struct if_usb_card *cardp,
448
				  void (*callbackfn)(struct urb *urb))
449 450 451 452 453
{
	struct sk_buff *skb;
	int ret = -1;

	if (!(skb = dev_alloc_skb(MRVDRV_ETH_RX_PACKET_BUFFER_SIZE))) {
454
		pr_err("No free skb\n");
455 456 457
		goto rx_ret;
	}

458
	cardp->rx_skb = skb;
459 460 461

	/* Fill the receive configuration URB and initialise the Rx call back */
	usb_fill_bulk_urb(cardp->rx_urb, cardp->udev,
462
			  usb_rcvbulkpipe(cardp->udev, cardp->ep_in),
463
			  skb->data + IPFIELD_ALIGN_OFFSET,
464
			  MRVDRV_ETH_RX_PACKET_BUFFER_SIZE, callbackfn,
465
			  cardp);
466

467
	lbs_deb_usb2(&cardp->udev->dev, "Pointer for rx_urb %p\n", cardp->rx_urb);
468
	if ((ret = usb_submit_urb(cardp->rx_urb, GFP_ATOMIC))) {
469
		lbs_deb_usbd(&cardp->udev->dev, "Submit Rx URB failed: %d\n", ret);
470
		kfree_skb(skb);
471
		cardp->rx_skb = NULL;
472 473
		ret = -1;
	} else {
474
		lbs_deb_usb2(&cardp->udev->dev, "Submit Rx URB success\n");
475 476 477 478 479 480 481
		ret = 0;
	}

rx_ret:
	return ret;
}

482
static int if_usb_submit_rx_urb_fwload(struct if_usb_card *cardp)
483
{
484
	return __if_usb_submit_rx_urb(cardp, &if_usb_receive_fwload);
485 486
}

487
static int if_usb_submit_rx_urb(struct if_usb_card *cardp)
488
{
489
	return __if_usb_submit_rx_urb(cardp, &if_usb_receive);
490 491 492 493
}

static void if_usb_receive_fwload(struct urb *urb)
{
494 495
	struct if_usb_card *cardp = urb->context;
	struct sk_buff *skb = cardp->rx_skb;
496
	struct fwsyncheader *syncfwheader;
497
	struct bootcmdresp bootcmdresp;
498 499

	if (urb->status) {
500
		lbs_deb_usbd(&cardp->udev->dev,
501
			     "URB status is failed during fw load\n");
502 503 504 505
		kfree_skb(skb);
		return;
	}

506 507 508 509 510
	if (cardp->fwdnldover) {
		__le32 *tmp = (__le32 *)(skb->data + IPFIELD_ALIGN_OFFSET);

		if (tmp[0] == cpu_to_le32(CMD_TYPE_INDICATION) &&
		    tmp[1] == cpu_to_le32(MACREG_INT_CODE_FIRMWARE_READY)) {
511
			pr_info("Firmware ready event received\n");
512 513
			wake_up(&cardp->fw_wq);
		} else {
514 515
			lbs_deb_usb("Waiting for confirmation; got %x %x\n",
				    le32_to_cpu(tmp[0]), le32_to_cpu(tmp[1]));
516 517 518 519 520
			if_usb_submit_rx_urb_fwload(cardp);
		}
		kfree_skb(skb);
		return;
	}
521
	if (cardp->bootcmdresp <= 0) {
522 523
		memcpy (&bootcmdresp, skb->data + IPFIELD_ALIGN_OFFSET,
			sizeof(bootcmdresp));
524

525
		if (le16_to_cpu(cardp->udev->descriptor.bcdDevice) < 0x3106) {
526
			kfree_skb(skb);
527
			if_usb_submit_rx_urb_fwload(cardp);
528
			cardp->bootcmdresp = BOOT_CMD_RESP_OK;
529
			lbs_deb_usbd(&cardp->udev->dev,
530
				     "Received valid boot command response\n");
531 532
			return;
		}
533 534 535 536
		if (bootcmdresp.magic != cpu_to_le32(BOOT_CMD_MAGIC_NUMBER)) {
			if (bootcmdresp.magic == cpu_to_le32(CMD_TYPE_REQUEST) ||
			    bootcmdresp.magic == cpu_to_le32(CMD_TYPE_DATA) ||
			    bootcmdresp.magic == cpu_to_le32(CMD_TYPE_INDICATION)) {
537
				if (!cardp->bootcmdresp)
538
					pr_info("Firmware already seems alive; resetting\n");
539 540
				cardp->bootcmdresp = -1;
			} else {
541
				pr_info("boot cmd response wrong magic number (0x%x)\n",
542
					    le32_to_cpu(bootcmdresp.magic));
543
			}
544 545 546
		} else if ((bootcmdresp.cmd != BOOT_CMD_FW_BY_USB) &&
			   (bootcmdresp.cmd != BOOT_CMD_UPDATE_FW) &&
			   (bootcmdresp.cmd != BOOT_CMD_UPDATE_BOOT2)) {
547 548
			pr_info("boot cmd response cmd_tag error (%d)\n",
				bootcmdresp.cmd);
549
		} else if (bootcmdresp.result != BOOT_CMD_RESP_OK) {
550 551
			pr_info("boot cmd response result error (%d)\n",
				bootcmdresp.result);
552 553
		} else {
			cardp->bootcmdresp = 1;
554
			lbs_deb_usbd(&cardp->udev->dev,
555
				     "Received valid boot command response\n");
556 557
		}
		kfree_skb(skb);
558
		if_usb_submit_rx_urb_fwload(cardp);
559 560 561
		return;
	}

562 563
	syncfwheader = kmemdup(skb->data + IPFIELD_ALIGN_OFFSET,
			       sizeof(struct fwsyncheader), GFP_ATOMIC);
564
	if (!syncfwheader) {
565
		lbs_deb_usbd(&cardp->udev->dev, "Failure to allocate syncfwheader\n");
566 567 568 569 570
		kfree_skb(skb);
		return;
	}

	if (!syncfwheader->cmd) {
571 572 573
		lbs_deb_usb2(&cardp->udev->dev, "FW received Blk with correct CRC\n");
		lbs_deb_usb2(&cardp->udev->dev, "FW received Blk seqnum = %d\n",
			     le32_to_cpu(syncfwheader->seqnum));
574 575
		cardp->CRC_OK = 1;
	} else {
576
		lbs_deb_usbd(&cardp->udev->dev, "FW received Blk with CRC error\n");
577 578 579 580 581
		cardp->CRC_OK = 0;
	}

	kfree_skb(skb);

582 583
	/* Give device 5s to either write firmware to its RAM or eeprom */
	mod_timer(&cardp->fw_timeout, jiffies + (HZ*5));
584

585 586 587 588 589
	if (cardp->fwfinalblk) {
		cardp->fwdnldover = 1;
		goto exit;
	}

590
	if_usb_send_fw_pkt(cardp);
591

592
 exit:
593 594
	if_usb_submit_rx_urb_fwload(cardp);

595 596 597 598 599 600
	kfree(syncfwheader);
}

#define MRVDRV_MIN_PKT_LEN	30

static inline void process_cmdtypedata(int recvlength, struct sk_buff *skb,
601
				       struct if_usb_card *cardp,
602
				       struct lbs_private *priv)
603
{
604 605 606
	if (recvlength > MRVDRV_ETH_RX_PACKET_BUFFER_SIZE + MESSAGE_HEADER_LEN
	    || recvlength < MRVDRV_MIN_PKT_LEN) {
		lbs_deb_usbd(&cardp->udev->dev, "Packet length is Invalid\n");
607 608 609 610 611 612 613
		kfree_skb(skb);
		return;
	}

	skb_reserve(skb, IPFIELD_ALIGN_OFFSET);
	skb_put(skb, recvlength);
	skb_pull(skb, MESSAGE_HEADER_LEN);
614

615
	lbs_process_rxed_packet(priv, skb);
616 617
}

618
static inline void process_cmdrequest(int recvlength, uint8_t *recvbuff,
619
				      struct sk_buff *skb,
620
				      struct if_usb_card *cardp,
621
				      struct lbs_private *priv)
622
{
623
	unsigned long flags;
624 625
	u8 i;

626
	if (recvlength > LBS_CMD_BUFFER_SIZE) {
627
		lbs_deb_usbd(&cardp->udev->dev,
628
			     "The receive buffer is too large\n");
629 630 631 632
		kfree_skb(skb);
		return;
	}

633
	spin_lock_irqsave(&priv->driver_lock, flags);
634

635 636 637 638 639
	i = (priv->resp_idx == 0) ? 1 : 0;
	BUG_ON(priv->resp_len[i]);
	priv->resp_len[i] = (recvlength - MESSAGE_HEADER_LEN);
	memcpy(priv->resp_buf[i], recvbuff + MESSAGE_HEADER_LEN,
		priv->resp_len[i]);
640
	kfree_skb(skb);
641 642
	lbs_notify_command_response(priv, i);

643
	spin_unlock_irqrestore(&priv->driver_lock, flags);
644

645
	lbs_deb_usbd(&cardp->udev->dev,
646 647 648 649
		    "Wake up main thread to handle cmd response\n");
}

/**
650 651
 *  if_usb_receive - read the packet into the upload buffer,
 *  wake up the main thread and initialise the Rx callack
652
 *
653 654
 *  @urb:	pointer to &struct urb
 *  returns:	N/A
655 656 657
 */
static void if_usb_receive(struct urb *urb)
{
658 659
	struct if_usb_card *cardp = urb->context;
	struct sk_buff *skb = cardp->rx_skb;
660
	struct lbs_private *priv = cardp->priv;
661
	int recvlength = urb->actual_length;
662 663 664
	uint8_t *recvbuff = NULL;
	uint32_t recvtype = 0;
	__le32 *pkt = (__le32 *)(skb->data + IPFIELD_ALIGN_OFFSET);
665
	uint32_t event;
666 667 668

	if (recvlength) {
		if (urb->status) {
669 670
			lbs_deb_usbd(&cardp->udev->dev, "RX URB failed: %d\n",
				     urb->status);
671 672 673 674 675
			kfree_skb(skb);
			goto setup_for_next;
		}

		recvbuff = skb->data + IPFIELD_ALIGN_OFFSET;
676
		recvtype = le32_to_cpu(pkt[0]);
677
		lbs_deb_usbd(&cardp->udev->dev,
678 679
			    "Recv length = 0x%x, Recv type = 0x%X\n",
			    recvlength, recvtype);
680 681
	} else if (urb->status) {
		kfree_skb(skb);
682
		return;
683
	}
684 685 686 687 688 689 690 691 692 693 694

	switch (recvtype) {
	case CMD_TYPE_DATA:
		process_cmdtypedata(recvlength, skb, cardp, priv);
		break;

	case CMD_TYPE_REQUEST:
		process_cmdrequest(recvlength, recvbuff, skb, cardp, priv);
		break;

	case CMD_TYPE_INDICATION:
695 696 697 698
		/* Event handling */
		event = le32_to_cpu(pkt[1]);
		lbs_deb_usbd(&cardp->udev->dev, "**EVENT** 0x%X\n", event);
		kfree_skb(skb);
699

700 701 702
		/* Icky undocumented magic special case */
		if (event & 0xffff0000) {
			u32 trycount = (event & 0xffff0000) >> 16;
703

704 705 706 707
			lbs_send_tx_feedback(priv, trycount);
		} else
			lbs_queue_event(priv, event & 0xFF);
		break;
708

709
	default:
710
		lbs_deb_usbd(&cardp->udev->dev, "Unknown command type 0x%X\n",
711
			     recvtype);
712 713 714 715 716
		kfree_skb(skb);
		break;
	}

setup_for_next:
717
	if_usb_submit_rx_urb(cardp);
718 719 720
}

/**
721 722 723 724 725 726
 *  if_usb_host_to_card - downloads data to FW
 *  @priv:	pointer to &struct lbs_private structure
 *  @type:	type of data
 *  @payload:	pointer to data buffer
 *  @nb:	number of bytes
 *  returns:	0 for success or negative error code
727
 */
728 729
static int if_usb_host_to_card(struct lbs_private *priv, uint8_t type,
			       uint8_t *payload, uint16_t nb)
730
{
731
	struct if_usb_card *cardp = priv->card;
732

733 734
	lbs_deb_usbd(&cardp->udev->dev,"*** type = %u\n", type);
	lbs_deb_usbd(&cardp->udev->dev,"size after = %d\n", nb);
735 736

	if (type == MVMS_CMD) {
737
		*(__le32 *)cardp->ep_out_buf = cpu_to_le32(CMD_TYPE_REQUEST);
738
		priv->dnld_sent = DNLD_CMD_SENT;
739
	} else {
740
		*(__le32 *)cardp->ep_out_buf = cpu_to_le32(CMD_TYPE_DATA);
741
		priv->dnld_sent = DNLD_DATA_SENT;
742 743
	}

744
	memcpy((cardp->ep_out_buf + MESSAGE_HEADER_LEN), payload, nb);
745

746
	return usb_tx_block(cardp, cardp->ep_out_buf, nb + MESSAGE_HEADER_LEN);
747 748
}

749
/**
750 751 752 753 754
 *  if_usb_issue_boot_command - issues Boot command to the Boot2 code
 *  @cardp:	pointer to &if_usb_card
 *  @ivalue:	1:Boot from FW by USB-Download
 *		2:Boot from FW in EEPROM
 *  returns:	0 for success or negative error code
755
 */
756
static int if_usb_issue_boot_command(struct if_usb_card *cardp, int ivalue)
757
{
758
	struct bootcmd *bootcmd = cardp->ep_out_buf;
759 760

	/* Prepare command */
761 762 763
	bootcmd->magic = cpu_to_le32(BOOT_CMD_MAGIC_NUMBER);
	bootcmd->cmd = ivalue;
	memset(bootcmd->pad, 0, sizeof(bootcmd->pad));
764 765

	/* Issue command */
766
	usb_tx_block(cardp, cardp->ep_out_buf, sizeof(*bootcmd));
767 768 769

	return 0;
}
770 771


772
/**
773
 *  check_fwfile_format - check the validity of Boot2/FW image
774
 *
775 776 777
 *  @data:	pointer to image
 *  @totlen:	image length
 *  returns:     0 (good) or 1 (failure)
778
 */
779
static int check_fwfile_format(const uint8_t *data, uint32_t totlen)
780
{
781 782
	uint32_t bincmd, exit;
	uint32_t blksize, offset, len;
783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811
	int ret;

	ret = 1;
	exit = len = 0;

	do {
		struct fwheader *fwh = (void *)data;

		bincmd = le32_to_cpu(fwh->dnldcmd);
		blksize = le32_to_cpu(fwh->datalength);
		switch (bincmd) {
		case FW_HAS_DATA_TO_RECV:
			offset = sizeof(struct fwheader) + blksize;
			data += offset;
			len += offset;
			if (len >= totlen)
				exit = 1;
			break;
		case FW_HAS_LAST_BLOCK:
			exit = 1;
			ret = 0;
			break;
		default:
			exit = 1;
			break;
		}
	} while (!exit);

	if (ret)
812
		pr_err("firmware file format check FAIL\n");
813 814 815 816 817 818
	else
		lbs_deb_fw("firmware file format check PASS\n");

	return ret;
}

819 820 821
static void if_usb_prog_firmware(struct lbs_private *priv, int ret,
				 const struct firmware *fw,
				 const struct firmware *unused)
822
{
823
	struct if_usb_card *cardp = priv->card;
824 825 826
	int i = 0;
	static int reset_count = 10;

827
	if (ret) {
828
		pr_err("failed to find firmware (%d)\n", ret);
829 830 831
		goto done;
	}

832
	cardp->fw = fw;
833 834
	if (check_fwfile_format(cardp->fw->data, cardp->fw->size)) {
		ret = -EINVAL;
835
		goto done;
836 837 838 839 840 841 842 843 844 845 846
	}

	/* Cancel any pending usb business */
	usb_kill_urb(cardp->rx_urb);
	usb_kill_urb(cardp->tx_urb);

	cardp->fwlastblksent = 0;
	cardp->fwdnldover = 0;
	cardp->totalbytes = 0;
	cardp->fwfinalblk = 0;
	cardp->bootcmdresp = 0;
847 848

restart:
849
	if (if_usb_submit_rx_urb_fwload(cardp) < 0) {
850
		lbs_deb_usbd(&cardp->udev->dev, "URB submission is failed\n");
851
		ret = -EIO;
852
		goto done;
853 854 855 856 857 858
	}

	cardp->bootcmdresp = 0;
	do {
		int j = 0;
		i++;
859
		if_usb_issue_boot_command(cardp, BOOT_CMD_FW_BY_USB);
860 861 862 863 864 865 866
		/* wait for command response */
		do {
			j++;
			msleep_interruptible(100);
		} while (cardp->bootcmdresp == 0 && j < 10);
	} while (cardp->bootcmdresp == 0 && i < 5);

867 868 869 870 871 872 873
	if (cardp->bootcmdresp == BOOT_CMD_RESP_NOT_SUPPORTED) {
		/* Return to normal operation */
		ret = -EOPNOTSUPP;
		usb_kill_urb(cardp->rx_urb);
		usb_kill_urb(cardp->tx_urb);
		if (if_usb_submit_rx_urb(cardp) < 0)
			ret = -EIO;
874
		goto done;
875
	} else if (cardp->bootcmdresp <= 0) {
876
		if (--reset_count >= 0) {
877
			if_usb_reset_device(cardp);
878 879
			goto restart;
		}
880
		ret = -EIO;
881
		goto done;
882 883 884 885 886 887 888 889 890 891 892 893
	}

	i = 0;

	cardp->totalbytes = 0;
	cardp->fwlastblksent = 0;
	cardp->CRC_OK = 1;
	cardp->fwdnldover = 0;
	cardp->fwseqnum = -1;
	cardp->totalbytes = 0;
	cardp->fwfinalblk = 0;

894 895
	/* Send the first firmware packet... */
	if_usb_send_fw_pkt(cardp);
896

897 898
	/* ... and wait for the process to complete */
	wait_event_interruptible(cardp->fw_wq, cardp->surprise_removed || cardp->fwdnldover);
899

900
	del_timer_sync(&cardp->fw_timeout);
901
	usb_kill_urb(cardp->rx_urb);
902 903

	if (!cardp->fwdnldover) {
904
		pr_info("failed to load fw, resetting device!\n");
905
		if (--reset_count >= 0) {
906
			if_usb_reset_device(cardp);
907 908 909
			goto restart;
		}

910
		pr_info("FW download failure, time = %d ms\n", i * 100);
911
		ret = -EIO;
912
		goto done;
913 914
	}

915 916 917 918
	cardp->priv->fw_ready = 1;
	if_usb_submit_rx_urb(cardp);

	if (lbs_start_card(priv))
919
		goto done;
920 921 922 923 924 925 926 927 928 929

	if_usb_setup_firmware(priv);

	/*
	 * EHS_REMOVE_WAKEUP is not supported on all versions of the firmware.
	 */
	priv->wol_criteria = EHS_REMOVE_WAKEUP;
	if (lbs_host_sleep_cfg(priv, priv->wol_criteria, NULL))
		priv->ehs_remove_supported = false;

930
 done:
931
	cardp->fw = NULL;
932 933
}

934

935 936 937
#ifdef CONFIG_PM
static int if_usb_suspend(struct usb_interface *intf, pm_message_t message)
{
938
	struct if_usb_card *cardp = usb_get_intfdata(intf);
939
	struct lbs_private *priv = cardp->priv;
940
	int ret;
941

942 943 944 945
	if (priv->psstate != PS_STATE_FULL_POWER) {
		ret = -1;
		goto out;
	}
946

947 948 949 950 951 952 953 954 955
#ifdef CONFIG_OLPC
	if (machine_is_olpc()) {
		if (priv->wol_criteria == EHS_REMOVE_WAKEUP)
			olpc_ec_wakeup_clear(EC_SCI_SRC_WLAN);
		else
			olpc_ec_wakeup_set(EC_SCI_SRC_WLAN);
	}
#endif

956 957 958
	ret = lbs_suspend(priv);
	if (ret)
		goto out;
959 960 961 962 963

	/* Unlink tx & rx urb */
	usb_kill_urb(cardp->tx_urb);
	usb_kill_urb(cardp->rx_urb);

964 965
 out:
	return ret;
966 967 968 969
}

static int if_usb_resume(struct usb_interface *intf)
{
970
	struct if_usb_card *cardp = usb_get_intfdata(intf);
971
	struct lbs_private *priv = cardp->priv;
972

973
	if_usb_submit_rx_urb(cardp);
974

975
	lbs_resume(priv);
976 977 978 979 980 981 982 983 984

	return 0;
}
#else
#define if_usb_suspend NULL
#define if_usb_resume NULL
#endif

static struct usb_driver if_usb_driver = {
985
	.name = DRV_NAME,
986 987 988 989 990
	.probe = if_usb_probe,
	.disconnect = if_usb_disconnect,
	.id_table = if_usb_table,
	.suspend = if_usb_suspend,
	.resume = if_usb_resume,
991
	.reset_resume = if_usb_resume,
992
	.disable_hub_initiated_lpm = 1,
993 994
};

995
module_usb_driver(if_usb_driver);
996 997

MODULE_DESCRIPTION("8388 USB WLAN Driver");
998
MODULE_AUTHOR("Marvell International Ltd. and Red Hat, Inc.");
999
MODULE_LICENSE("GPL");