if_usb.c 26.7 KB
Newer Older
1 2 3 4
/**
  * This file contains functions used in USB interface module.
  */
#include <linux/delay.h>
5
#include <linux/moduleparam.h>
6 7 8 9
#include <linux/firmware.h>
#include <linux/netdevice.h>
#include <linux/usb.h>

10 11 12 13
#ifdef CONFIG_OLPC
#include <asm/olpc.h>
#endif

14 15
#define DRV_NAME "usb8xxx"

16 17 18 19
#include "host.h"
#include "decl.h"
#include "defs.h"
#include "dev.h"
20
#include "cmd.h"
21 22
#include "if_usb.h"

23 24 25
#define INSANEDEBUG	0
#define lbs_deb_usb2(...) do { if (INSANEDEBUG) lbs_deb_usbd(__VA_ARGS__); } while (0)

26 27
#define MESSAGE_HEADER_LEN	4

28
static char *lbs_fw_name = "usb8388.bin";
29
module_param_named(fw_name, lbs_fw_name, charp, 0644);
30

31 32
static struct usb_device_id if_usb_table[] = {
	/* Enter the device signature inside */
33 34
	{ USB_DEVICE(0x1286, 0x2001) },
	{ USB_DEVICE(0x05a3, 0x8388) },
35 36 37 38 39 40 41
	{}	/* 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);
42 43 44 45
static int __if_usb_prog_firmware(struct if_usb_card *cardp,
					const char *fwname, int cmd);
static int if_usb_prog_firmware(struct if_usb_card *cardp,
					const char *fwname, int cmd);
46 47 48 49 50 51 52
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);
53 54 55 56 57 58 59 60

/**
 *  @brief  call back function to handle the status of the URB
 *  @param urb 		pointer to urb structure
 *  @return 	   	N/A
 */
static void if_usb_write_bulk_callback(struct urb *urb)
{
61
	struct if_usb_card *cardp = (struct if_usb_card *) urb->context;
62 63 64

	/* handle the transmission complete validations */

65
	if (urb->status == 0) {
66
		struct lbs_private *priv = cardp->priv;
67

68 69 70
		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);
71

72 73
		/* Boot commands such as UPDATE_FW and UPDATE_BOOT2 are not
		 * passed up to the lbs level.
74
		 */
75
		if (priv && priv->dnld_sent != DNLD_BOOTCMD_SENT)
76
			lbs_host_to_card_done(priv);
77 78 79
	} else {
		/* print the failure status number for debug */
		lbs_pr_info("URB in failure status: %d\n", urb->status);
80 81 82 83 84 85 86
	}

	return;
}

/**
 *  @brief  free tx/rx urb, skb and rx buffer
87
 *  @param cardp	pointer if_usb_card
88 89
 *  @return 	   	N/A
 */
90
static void if_usb_free(struct if_usb_card *cardp)
91
{
92
	lbs_deb_enter(LBS_DEB_USB);
93 94 95 96 97 98 99 100 101 102 103

	/* 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;

104 105
	kfree(cardp->ep_out_buf);
	cardp->ep_out_buf = NULL;
106

107
	lbs_deb_leave(LBS_DEB_USB);
108 109
}

110
static void if_usb_setup_firmware(struct lbs_private *priv)
111
{
112
	struct if_usb_card *cardp = priv->card;
113
	struct cmd_ds_set_boot2_ver b2_cmd;
114
	struct cmd_ds_802_11_fw_wake_method wake_method;
115

116
	b2_cmd.hdr.size = cpu_to_le16(sizeof(b2_cmd));
117
	b2_cmd.action = 0;
118
	b2_cmd.version = cardp->boot2_version;
119

120
	if (lbs_cmd_with_response(priv, CMD_SET_BOOT2_VER, &b2_cmd))
121
		lbs_deb_usb("Setting boot2 version failed\n");
122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140

	priv->wol_gpio = 2; /* Wake via GPIO2... */
	priv->wol_gap = 20; /* ... after 20ms    */
	lbs_host_sleep_cfg(priv, EHS_WAKE_ON_UNICAST_DATA);

	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)) {
		lbs_pr_info("Firmware does not seem to support PS mode\n");
	} 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");
			priv->ps_supported = 1;
		} else {
			/* The versions which boot up this way don't seem to
			   work even if we set it to the command interrupt */
			lbs_pr_info("Firmware doesn't wake via command interrupt; disabling PS mode\n");
		}
	}
141 142
}

143
static void if_usb_fw_timeo(unsigned long priv)
144
{
145
	struct if_usb_card *cardp = (void *)priv;
146

147 148 149 150 151 152 153 154
	if (cardp->fwdnldover) {
		lbs_deb_usb("Download complete, no event. Assuming success\n");
	} else {
		lbs_pr_err("Download timed out\n");
		cardp->surprise_removed = 1;
	}
	wake_up(&cardp->fw_wq);
}
155

156 157 158 159 160 161 162 163
#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

164 165 166 167 168 169 170 171 172 173 174 175
/**
 *  @brief sets the configuration values
 *  @param ifnum	interface number
 *  @param id		pointer to usb_device_id
 *  @return 	   	0 on success, error code on failure
 */
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;
176
	struct lbs_private *priv;
177
	struct if_usb_card *cardp;
178 179 180 181
	int i;

	udev = interface_to_usbdev(intf);

182
	cardp = kzalloc(sizeof(struct if_usb_card), GFP_KERNEL);
183
	if (!cardp) {
184 185 186 187
		lbs_pr_err("Out of memory allocating private data.\n");
		goto error;
	}

188 189
	setup_timer(&cardp->fw_timeout, if_usb_fw_timeo, (unsigned long)cardp);
	init_waitqueue_head(&cardp->fw_wq);
190

191
	cardp->udev = udev;
192 193
	iface_desc = intf->cur_altsetting;

194
	lbs_deb_usbd(&udev->dev, "bcdUSB = 0x%X bDeviceClass = 0x%X"
195
		     " bDeviceSubClass = 0x%X, bDeviceProtocol = 0x%X\n",
196 197 198 199
		     le16_to_cpu(udev->descriptor.bcdUSB),
		     udev->descriptor.bDeviceClass,
		     udev->descriptor.bDeviceSubClass,
		     udev->descriptor.bDeviceProtocol);
200 201 202

	for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
		endpoint = &iface_desc->endpoint[i].desc;
203 204 205
		if (usb_endpoint_is_bulk_in(endpoint)) {
			cardp->ep_in_size = le16_to_cpu(endpoint->wMaxPacketSize);
			cardp->ep_in = usb_endpoint_num(endpoint);
206

207 208
			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);
209

210 211 212 213 214 215
		} 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);
216 217
		}
	}
218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234
	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;
	}
235

236
	/* Upload firmware */
237
	if (__if_usb_prog_firmware(cardp, lbs_fw_name, BOOT_CMD_FW_BY_USB)) {
238
		lbs_deb_usbd(&udev->dev, "FW upload failed\n");
239 240 241
		goto err_prog_firmware;
	}

242
	if (!(priv = lbs_add_card(cardp, &udev->dev)))
243
		goto err_prog_firmware;
244

245
	cardp->priv = priv;
246
	cardp->priv->fw_ready = 1;
247

248
	priv->hw_host_to_card = if_usb_host_to_card;
249 250 251 252 253
#ifdef CONFIG_OLPC
	if (machine_is_olpc())
		priv->reset_card = if_usb_reset_olpc_card;
#endif

254
	cardp->boot2_version = udev->descriptor.bcdDevice;
255

256 257
	if_usb_submit_rx_urb(cardp);

258
	if (lbs_start_card(priv))
259
		goto err_start_card;
260

261
	if_usb_setup_firmware(priv);
262

263
	usb_get_dev(udev);
264
	usb_set_intfdata(intf, cardp);
265 266 267

	return 0;

268
err_start_card:
269
	lbs_remove_card(priv);
270 271
err_prog_firmware:
	if_usb_reset_device(cardp);
272
dealloc:
273
	if_usb_free(cardp);
274 275 276 277 278 279 280

error:
	return -ENOMEM;
}

/**
 *  @brief free resource and cleanup
281
 *  @param intf		USB interface structure
282 283 284 285
 *  @return 	   	N/A
 */
static void if_usb_disconnect(struct usb_interface *intf)
{
286
	struct if_usb_card *cardp = usb_get_intfdata(intf);
287
	struct lbs_private *priv = (struct lbs_private *) cardp->priv;
288

289
	lbs_deb_enter(LBS_DEB_MAIN);
290

291
	cardp->surprise_removed = 1;
292

293
	if (priv) {
294
		priv->surpriseremoved = 1;
295 296
		lbs_stop_card(priv);
		lbs_remove_card(priv);
297
	}
298 299 300 301 302 303 304

	/* Unlink and free urb */
	if_usb_free(cardp);

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

305
	lbs_deb_leave(LBS_DEB_MAIN);
306 307 308 309
}

/**
 *  @brief  This function download FW
310
 *  @param priv		pointer to struct lbs_private
311 312
 *  @return 	   	0
 */
313
static int if_usb_send_fw_pkt(struct if_usb_card *cardp)
314
{
315
	struct fwdata *fwdata = cardp->ep_out_buf;
316
	const uint8_t *firmware = cardp->fw->data;
317

318 319
	/* If we got a CRC failure on the last block, back
	   up and retry it */
320 321
	if (!cardp->CRC_OK) {
		cardp->totalbytes = cardp->fwlastblksent;
322
		cardp->fwseqnum--;
323 324
	}

325 326
	lbs_deb_usb2(&cardp->udev->dev, "totalbytes = %d\n",
		     cardp->totalbytes);
327

328 329 330 331 332
	/* 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],
333 334 335 336 337 338
	       sizeof(struct fwheader));

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

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

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

344 345
	fwdata->seqnum = cpu_to_le32(++cardp->fwseqnum);
	cardp->totalbytes += le32_to_cpu(fwdata->hdr.datalength);
346

347 348 349 350 351 352 353 354 355 356
	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");
		lbs_deb_usb2(&cardp->udev->dev, "Donwloading FW JUMP BLOCK\n");
357 358 359 360

		cardp->fwfinalblk = 1;
	}

361 362
	lbs_deb_usb2(&cardp->udev->dev, "Firmware download done; size %d\n",
		     cardp->totalbytes);
363 364 365 366

	return 0;
}

367
static int if_usb_reset_device(struct if_usb_card *cardp)
368
{
369
	struct cmd_ds_command *cmd = cardp->ep_out_buf + 4;
370 371
	int ret;

372 373
	lbs_deb_enter(LBS_DEB_USB);

374
	*(__le32 *)cardp->ep_out_buf = cpu_to_le32(CMD_TYPE_REQUEST);
375 376 377 378 379 380

	cmd->command = cpu_to_le16(CMD_802_11_RESET);
	cmd->size = cpu_to_le16(sizeof(struct cmd_ds_802_11_reset) + S_DS_GEN);
	cmd->result = cpu_to_le16(0);
	cmd->seqnum = cpu_to_le16(0x5a5a);
	cmd->params.reset.action = cpu_to_le16(CMD_ACT_HALT);
381
	usb_tx_block(cardp, cardp->ep_out_buf, 4 + S_DS_GEN + sizeof(struct cmd_ds_802_11_reset));
382

383
	msleep(100);
384
	ret = usb_reset_device(cardp->udev);
385
	msleep(100);
386

387 388 389 390 391
#ifdef CONFIG_OLPC
	if (ret && machine_is_olpc())
		if_usb_reset_olpc_card(NULL);
#endif

392 393
	lbs_deb_leave_args(LBS_DEB_USB, "ret %d", ret);

394 395 396 397 398
	return ret;
}

/**
 *  @brief This function transfer the data to the device.
399
 *  @param priv 	pointer to struct lbs_private
400 401 402 403
 *  @param payload	pointer to payload data
 *  @param nb		data length
 *  @return 	   	0 or -1
 */
404
static int usb_tx_block(struct if_usb_card *cardp, uint8_t *payload, uint16_t nb)
405 406 407 408
{
	int ret = -1;

	/* check if device is removed */
409
	if (cardp->surprise_removed) {
410
		lbs_deb_usbd(&cardp->udev->dev, "Device removed\n");
411 412 413 414 415
		goto tx_ret;
	}

	usb_fill_bulk_urb(cardp->tx_urb, cardp->udev,
			  usb_sndbulkpipe(cardp->udev,
416
					  cardp->ep_out),
417
			  payload, nb, if_usb_write_bulk_callback, cardp);
418 419 420 421

	cardp->tx_urb->transfer_flags |= URB_ZERO_PACKET;

	if ((ret = usb_submit_urb(cardp->tx_urb, GFP_ATOMIC))) {
422
		lbs_deb_usbd(&cardp->udev->dev, "usb_submit_urb failed: %d\n", ret);
423 424
		ret = -1;
	} else {
425
		lbs_deb_usb2(&cardp->udev->dev, "usb_submit_urb success\n");
426 427 428 429 430 431 432
		ret = 0;
	}

tx_ret:
	return ret;
}

433
static int __if_usb_submit_rx_urb(struct if_usb_card *cardp,
434
				  void (*callbackfn)(struct urb *urb))
435 436 437 438 439 440 441 442 443
{
	struct sk_buff *skb;
	int ret = -1;

	if (!(skb = dev_alloc_skb(MRVDRV_ETH_RX_PACKET_BUFFER_SIZE))) {
		lbs_pr_err("No free skb\n");
		goto rx_ret;
	}

444
	cardp->rx_skb = skb;
445 446 447

	/* Fill the receive configuration URB and initialise the Rx call back */
	usb_fill_bulk_urb(cardp->rx_urb, cardp->udev,
448
			  usb_rcvbulkpipe(cardp->udev, cardp->ep_in),
D
Dan Williams 已提交
449
			  (void *) (skb->tail + (size_t) IPFIELD_ALIGN_OFFSET),
450
			  MRVDRV_ETH_RX_PACKET_BUFFER_SIZE, callbackfn,
451
			  cardp);
452 453 454

	cardp->rx_urb->transfer_flags |= URB_ZERO_PACKET;

455
	lbs_deb_usb2(&cardp->udev->dev, "Pointer for rx_urb %p\n", cardp->rx_urb);
456
	if ((ret = usb_submit_urb(cardp->rx_urb, GFP_ATOMIC))) {
457
		lbs_deb_usbd(&cardp->udev->dev, "Submit Rx URB failed: %d\n", ret);
458
		kfree_skb(skb);
459
		cardp->rx_skb = NULL;
460 461
		ret = -1;
	} else {
462
		lbs_deb_usb2(&cardp->udev->dev, "Submit Rx URB success\n");
463 464 465 466 467 468 469
		ret = 0;
	}

rx_ret:
	return ret;
}

470
static int if_usb_submit_rx_urb_fwload(struct if_usb_card *cardp)
471
{
472
	return __if_usb_submit_rx_urb(cardp, &if_usb_receive_fwload);
473 474
}

475
static int if_usb_submit_rx_urb(struct if_usb_card *cardp)
476
{
477
	return __if_usb_submit_rx_urb(cardp, &if_usb_receive);
478 479 480 481
}

static void if_usb_receive_fwload(struct urb *urb)
{
482 483
	struct if_usb_card *cardp = urb->context;
	struct sk_buff *skb = cardp->rx_skb;
484
	struct fwsyncheader *syncfwheader;
485
	struct bootcmdresp bootcmdresp;
486 487

	if (urb->status) {
488
		lbs_deb_usbd(&cardp->udev->dev,
489
			     "URB status is failed during fw load\n");
490 491 492 493
		kfree_skb(skb);
		return;
	}

494 495 496 497 498 499 500 501
	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)) {
			lbs_pr_info("Firmware ready event received\n");
			wake_up(&cardp->fw_wq);
		} else {
502 503
			lbs_deb_usb("Waiting for confirmation; got %x %x\n",
				    le32_to_cpu(tmp[0]), le32_to_cpu(tmp[1]));
504 505 506 507 508
			if_usb_submit_rx_urb_fwload(cardp);
		}
		kfree_skb(skb);
		return;
	}
509
	if (cardp->bootcmdresp <= 0) {
510 511
		memcpy (&bootcmdresp, skb->data + IPFIELD_ALIGN_OFFSET,
			sizeof(bootcmdresp));
512

513
		if (le16_to_cpu(cardp->udev->descriptor.bcdDevice) < 0x3106) {
514
			kfree_skb(skb);
515
			if_usb_submit_rx_urb_fwload(cardp);
516
			cardp->bootcmdresp = BOOT_CMD_RESP_OK;
517
			lbs_deb_usbd(&cardp->udev->dev,
518
				     "Received valid boot command response\n");
519 520
			return;
		}
521 522 523 524
		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)) {
525 526
				if (!cardp->bootcmdresp)
					lbs_pr_info("Firmware already seems alive; resetting\n");
527 528 529
				cardp->bootcmdresp = -1;
			} else {
				lbs_pr_info("boot cmd response wrong magic number (0x%x)\n",
530
					    le32_to_cpu(bootcmdresp.magic));
531
			}
532 533 534
		} else if ((bootcmdresp.cmd != BOOT_CMD_FW_BY_USB) &&
			   (bootcmdresp.cmd != BOOT_CMD_UPDATE_FW) &&
			   (bootcmdresp.cmd != BOOT_CMD_UPDATE_BOOT2)) {
535 536 537 538 539
			lbs_pr_info("boot cmd response cmd_tag error (%d)\n",
				    bootcmdresp.cmd);
		} else if (bootcmdresp.result != BOOT_CMD_RESP_OK) {
			lbs_pr_info("boot cmd response result error (%d)\n",
				    bootcmdresp.result);
540 541
		} else {
			cardp->bootcmdresp = 1;
542
			lbs_deb_usbd(&cardp->udev->dev,
543
				     "Received valid boot command response\n");
544 545
		}
		kfree_skb(skb);
546
		if_usb_submit_rx_urb_fwload(cardp);
547 548 549 550 551
		return;
	}

	syncfwheader = kmalloc(sizeof(struct fwsyncheader), GFP_ATOMIC);
	if (!syncfwheader) {
552
		lbs_deb_usbd(&cardp->udev->dev, "Failure to allocate syncfwheader\n");
553 554 555 556 557
		kfree_skb(skb);
		return;
	}

	memcpy(syncfwheader, skb->data + IPFIELD_ALIGN_OFFSET,
558
	       sizeof(struct fwsyncheader));
559 560

	if (!syncfwheader->cmd) {
561 562 563
		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));
564 565
		cardp->CRC_OK = 1;
	} else {
566
		lbs_deb_usbd(&cardp->udev->dev, "FW received Blk with CRC error\n");
567 568 569 570 571
		cardp->CRC_OK = 0;
	}

	kfree_skb(skb);

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

575 576 577 578 579
	if (cardp->fwfinalblk) {
		cardp->fwdnldover = 1;
		goto exit;
	}

580
	if_usb_send_fw_pkt(cardp);
581

582
 exit:
583 584
	if_usb_submit_rx_urb_fwload(cardp);

585 586 587 588 589 590 591 592
	kfree(syncfwheader);

	return;
}

#define MRVDRV_MIN_PKT_LEN	30

static inline void process_cmdtypedata(int recvlength, struct sk_buff *skb,
593
				       struct if_usb_card *cardp,
594
				       struct lbs_private *priv)
595
{
596 597 598
	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");
599 600 601 602 603 604 605
		kfree_skb(skb);
		return;
	}

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

607
	lbs_process_rxed_packet(priv, skb);
608 609
}

610
static inline void process_cmdrequest(int recvlength, uint8_t *recvbuff,
611
				      struct sk_buff *skb,
612
				      struct if_usb_card *cardp,
613
				      struct lbs_private *priv)
614
{
615 616
	u8 i;

617
	if (recvlength > LBS_CMD_BUFFER_SIZE) {
618
		lbs_deb_usbd(&cardp->udev->dev,
619
			     "The receive buffer is too large\n");
620 621 622 623 624 625 626
		kfree_skb(skb);
		return;
	}

	if (!in_interrupt())
		BUG();

627
	spin_lock(&priv->driver_lock);
628

629 630 631 632 633
	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]);
634
	kfree_skb(skb);
635 636
	lbs_notify_command_response(priv, i);

637
	spin_unlock(&priv->driver_lock);
638

639
	lbs_deb_usbd(&cardp->udev->dev,
640 641 642 643 644 645 646 647 648 649 650 651
		    "Wake up main thread to handle cmd response\n");
}

/**
 *  @brief This function reads of the packet into the upload buff,
 *  wake up the main thread and initialise the Rx callack.
 *
 *  @param urb		pointer to struct urb
 *  @return 	   	N/A
 */
static void if_usb_receive(struct urb *urb)
{
652 653
	struct if_usb_card *cardp = urb->context;
	struct sk_buff *skb = cardp->rx_skb;
654
	struct lbs_private *priv = cardp->priv;
655
	int recvlength = urb->actual_length;
656 657 658
	uint8_t *recvbuff = NULL;
	uint32_t recvtype = 0;
	__le32 *pkt = (__le32 *)(skb->data + IPFIELD_ALIGN_OFFSET);
659
	uint32_t event;
660

661
	lbs_deb_enter(LBS_DEB_USB);
662 663 664

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

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

	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:
691 692 693 694
		/* Event handling */
		event = le32_to_cpu(pkt[1]);
		lbs_deb_usbd(&cardp->udev->dev, "**EVENT** 0x%X\n", event);
		kfree_skb(skb);
695

696 697 698
		/* Icky undocumented magic special case */
		if (event & 0xffff0000) {
			u32 trycount = (event & 0xffff0000) >> 16;
699

700 701 702 703
			lbs_send_tx_feedback(priv, trycount);
		} else
			lbs_queue_event(priv, event & 0xFF);
		break;
704

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

setup_for_next:
713
	if_usb_submit_rx_urb(cardp);
714
rx_exit:
715
	lbs_deb_leave(LBS_DEB_USB);
716 717 718 719
}

/**
 *  @brief This function downloads data to FW
720
 *  @param priv		pointer to struct lbs_private structure
721 722 723 724 725
 *  @param type		type of data
 *  @param buf		pointer to data buffer
 *  @param len		number of bytes
 *  @return 	   	0 or -1
 */
726 727
static int if_usb_host_to_card(struct lbs_private *priv, uint8_t type,
			       uint8_t *payload, uint16_t nb)
728
{
729
	struct if_usb_card *cardp = priv->card;
730

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

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

742
	memcpy((cardp->ep_out_buf + MESSAGE_HEADER_LEN), payload, nb);
743

744
	return usb_tx_block(cardp, cardp->ep_out_buf, nb + MESSAGE_HEADER_LEN);
745 746
}

747 748 749 750 751 752
/**
 *  @brief This function issues Boot command to the Boot2 code
 *  @param ivalue   1:Boot from FW by USB-Download
 *                  2:Boot from FW in EEPROM
 *  @return 	   	0
 */
753
static int if_usb_issue_boot_command(struct if_usb_card *cardp, int ivalue)
754
{
755
	struct bootcmd *bootcmd = cardp->ep_out_buf;
756 757

	/* Prepare command */
758 759 760
	bootcmd->magic = cpu_to_le32(BOOT_CMD_MAGIC_NUMBER);
	bootcmd->cmd = ivalue;
	memset(bootcmd->pad, 0, sizeof(bootcmd->pad));
761 762

	/* Issue command */
763
	usb_tx_block(cardp, cardp->ep_out_buf, sizeof(*bootcmd));
764 765 766

	return 0;
}
767 768


769 770 771 772 773 774 775
/**
 *  @brief This function checks the validity of Boot2/FW image.
 *
 *  @param data              pointer to image
 *         len               image length
 *  @return     0 or -1
 */
776
static int check_fwfile_format(const uint8_t *data, uint32_t totlen)
777
{
778 779
	uint32_t bincmd, exit;
	uint32_t blksize, offset, len;
780 781 782 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 812 813 814 815 816
	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)
		lbs_pr_err("firmware file format check FAIL\n");
	else
		lbs_deb_fw("firmware file format check PASS\n");

	return ret;
}


817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 855 856 857 858 859 860 861 862 863 864
/**
*  @brief This function programs the firmware subject to cmd
*
*  @param cardp             the if_usb_card descriptor
*         fwname            firmware or boot2 image file name
*         cmd               either BOOT_CMD_FW_BY_USB, BOOT_CMD_UPDATE_FW,
*                           or BOOT_CMD_UPDATE_BOOT2.
*  @return     0 or error code
*/
static int if_usb_prog_firmware(struct if_usb_card *cardp,
				const char *fwname, int cmd)
{
	struct lbs_private *priv = cardp->priv;
	unsigned long flags, caps;
	int ret;

	caps = priv->fwcapinfo;
	if (((cmd == BOOT_CMD_UPDATE_FW) && !(caps & FW_CAPINFO_FIRMWARE_UPGRADE)) ||
	    ((cmd == BOOT_CMD_UPDATE_BOOT2) && !(caps & FW_CAPINFO_BOOT2_UPGRADE)))
		return -EOPNOTSUPP;

	/* Ensure main thread is idle. */
	spin_lock_irqsave(&priv->driver_lock, flags);
	while (priv->cur_cmd != NULL || priv->dnld_sent != DNLD_RES_RECEIVED) {
		spin_unlock_irqrestore(&priv->driver_lock, flags);
		if (wait_event_interruptible(priv->waitq,
				(priv->cur_cmd == NULL &&
				priv->dnld_sent == DNLD_RES_RECEIVED))) {
			return -ERESTARTSYS;
		}
		spin_lock_irqsave(&priv->driver_lock, flags);
	}
	priv->dnld_sent = DNLD_BOOTCMD_SENT;
	spin_unlock_irqrestore(&priv->driver_lock, flags);

	ret = __if_usb_prog_firmware(cardp, fwname, cmd);

	spin_lock_irqsave(&priv->driver_lock, flags);
	priv->dnld_sent = DNLD_RES_RECEIVED;
	spin_unlock_irqrestore(&priv->driver_lock, flags);

	wake_up_interruptible(&priv->waitq);

	return ret;
}

static int __if_usb_prog_firmware(struct if_usb_card *cardp,
					const char *fwname, int cmd)
865 866 867
{
	int i = 0;
	static int reset_count = 10;
868
	int ret = 0;
869

870
	lbs_deb_enter(LBS_DEB_USB);
871

872 873
	ret = request_firmware(&cardp->fw, fwname, &cardp->udev->dev);
	if (ret < 0) {
874
		lbs_pr_err("request_firmware() failed with %#x\n", ret);
875
		lbs_pr_err("firmware %s not found\n", fwname);
876 877 878
		goto done;
	}

879 880
	if (check_fwfile_format(cardp->fw->data, cardp->fw->size)) {
		ret = -EINVAL;
881
		goto release_fw;
882 883 884 885 886 887 888 889 890 891 892
	}

	/* 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;
893 894

restart:
895
	if (if_usb_submit_rx_urb_fwload(cardp) < 0) {
896
		lbs_deb_usbd(&cardp->udev->dev, "URB submission is failed\n");
897
		ret = -EIO;
898
		goto release_fw;
899 900 901 902 903 904
	}

	cardp->bootcmdresp = 0;
	do {
		int j = 0;
		i++;
905
		if_usb_issue_boot_command(cardp, cmd);
906 907 908 909 910 911 912
		/* wait for command response */
		do {
			j++;
			msleep_interruptible(100);
		} while (cardp->bootcmdresp == 0 && j < 10);
	} while (cardp->bootcmdresp == 0 && i < 5);

913 914 915 916 917 918 919 920 921
	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;
		goto release_fw;
	} else if (cardp->bootcmdresp <= 0) {
922
		if (--reset_count >= 0) {
923
			if_usb_reset_device(cardp);
924 925
			goto restart;
		}
926 927
		ret = -EIO;
		goto release_fw;
928 929 930 931 932 933 934 935 936 937 938 939
	}

	i = 0;

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

940 941
	/* Send the first firmware packet... */
	if_usb_send_fw_pkt(cardp);
942

943 944
	/* ... and wait for the process to complete */
	wait_event_interruptible(cardp->fw_wq, cardp->surprise_removed || cardp->fwdnldover);
945

946
	del_timer_sync(&cardp->fw_timeout);
947
	usb_kill_urb(cardp->rx_urb);
948 949 950 951

	if (!cardp->fwdnldover) {
		lbs_pr_info("failed to load fw, resetting device!\n");
		if (--reset_count >= 0) {
952
			if_usb_reset_device(cardp);
953 954 955 956
			goto restart;
		}

		lbs_pr_info("FW download failure, time = %d ms\n", i * 100);
957
		ret = -EIO;
958
		goto release_fw;
959 960
	}

961
 release_fw:
962 963
	release_firmware(cardp->fw);
	cardp->fw = NULL;
964

965
 done:
966 967
	lbs_deb_leave_args(LBS_DEB_USB, "ret %d", ret);
	return ret;
968 969
}

H
Holger Schurig 已提交
970

971 972 973
#ifdef CONFIG_PM
static int if_usb_suspend(struct usb_interface *intf, pm_message_t message)
{
974
	struct if_usb_card *cardp = usb_get_intfdata(intf);
975
	struct lbs_private *priv = cardp->priv;
976
	int ret;
977

978
	lbs_deb_enter(LBS_DEB_USB);
979

980
	if (priv->psstate != PS_STATE_FULL_POWER)
981 982
		return -1;

983 984 985
	ret = lbs_suspend(priv);
	if (ret)
		goto out;
986 987 988 989 990

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

991
 out:
992
	lbs_deb_leave(LBS_DEB_USB);
993
	return ret;
994 995 996 997
}

static int if_usb_resume(struct usb_interface *intf)
{
998
	struct if_usb_card *cardp = usb_get_intfdata(intf);
999
	struct lbs_private *priv = cardp->priv;
1000

1001
	lbs_deb_enter(LBS_DEB_USB);
1002

1003
	if_usb_submit_rx_urb(cardp);
1004

1005
	lbs_resume(priv);
1006

1007
	lbs_deb_leave(LBS_DEB_USB);
1008 1009 1010 1011 1012 1013 1014 1015
	return 0;
}
#else
#define if_usb_suspend NULL
#define if_usb_resume NULL
#endif

static struct usb_driver if_usb_driver = {
1016
	.name = DRV_NAME,
1017 1018 1019 1020 1021
	.probe = if_usb_probe,
	.disconnect = if_usb_disconnect,
	.id_table = if_usb_table,
	.suspend = if_usb_suspend,
	.resume = if_usb_resume,
1022
	.reset_resume = if_usb_resume,
1023 1024
};

1025
static int __init if_usb_init_module(void)
1026
{
1027
	int ret = 0;
1028

1029 1030 1031 1032 1033 1034
	lbs_deb_enter(LBS_DEB_MAIN);

	ret = usb_register(&if_usb_driver);

	lbs_deb_leave_args(LBS_DEB_MAIN, "ret %d", ret);
	return ret;
1035 1036
}

1037
static void __exit if_usb_exit_module(void)
1038
{
1039 1040
	lbs_deb_enter(LBS_DEB_MAIN);

1041
	usb_deregister(&if_usb_driver);
1042 1043

	lbs_deb_leave(LBS_DEB_MAIN);
1044
}
1045 1046 1047 1048 1049

module_init(if_usb_init_module);
module_exit(if_usb_exit_module);

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