if_usb.c 24.8 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
#define DRV_NAME "usb8xxx"

12 13 14 15
#include "host.h"
#include "decl.h"
#include "defs.h"
#include "dev.h"
16
#include "cmd.h"
17 18
#include "if_usb.h"

19 20 21
#define INSANEDEBUG	0
#define lbs_deb_usb2(...) do { if (INSANEDEBUG) lbs_deb_usbd(__VA_ARGS__); } while (0)

22 23
#define MESSAGE_HEADER_LEN	4

24
static char *lbs_fw_name = "usb8388.bin";
25
module_param_named(fw_name, lbs_fw_name, charp, 0644);
26

27 28
static struct usb_device_id if_usb_table[] = {
	/* Enter the device signature inside */
29 30
	{ USB_DEVICE(0x1286, 0x2001) },
	{ USB_DEVICE(0x05a3, 0x8388) },
31 32 33 34 35 36 37
	{}	/* 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);
38 39 40 41
static int if_usb_prog_firmware(struct if_usb_card *cardp);
static int if_usb_host_to_card(struct lbs_private *priv, uint8_t type,
			       uint8_t *payload, uint16_t nb);
static int if_usb_get_int_status(struct lbs_private *priv, uint8_t *);
42
static int if_usb_read_event_cause(struct lbs_private *);
43 44 45 46 47
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);
48 49 50 51 52 53 54 55

/**
 *  @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)
{
56
	struct if_usb_card *cardp = (struct if_usb_card *) urb->context;
57 58 59

	/* handle the transmission complete validations */

60
	if (urb->status == 0) {
61
		struct lbs_private *priv = cardp->priv;
62

63 64 65
		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);
66 67 68 69

		/* Used for both firmware TX and regular TX.  priv isn't
		 * valid at firmware load time.
		 */
70 71
		if (priv)
			lbs_host_to_card_done(priv);
72 73 74
	} else {
		/* print the failure status number for debug */
		lbs_pr_info("URB in failure status: %d\n", urb->status);
75 76 77 78 79 80 81
	}

	return;
}

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

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

99 100
	kfree(cardp->ep_out_buf);
	cardp->ep_out_buf = NULL;
101

102
	lbs_deb_leave(LBS_DEB_USB);
103 104
}

105
static void if_usb_setup_firmware(struct lbs_private *priv)
106 107
{
	struct cmd_ds_set_boot2_ver b2_cmd;
108
	struct cmd_ds_802_11_fw_wake_method wake_method;
109

110
	b2_cmd.hdr.size = cpu_to_le16(sizeof(b2_cmd));
111
	b2_cmd.action = 0;
H
Holger Schurig 已提交
112
	b2_cmd.version = priv->boot2_version;
113

114
	if (lbs_cmd_with_response(priv, CMD_SET_BOOT2_VER, &b2_cmd))
115
		lbs_deb_usb("Setting boot2 version failed\n");
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134

	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");
		}
	}
135 136
}

137
static void if_usb_fw_timeo(unsigned long priv)
138
{
139
	struct if_usb_card *cardp = (void *)priv;
140

141 142 143 144 145 146 147 148
	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);
}
149

150 151 152 153 154 155 156 157 158 159 160 161
/**
 *  @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;
162
	struct lbs_private *priv;
163
	struct if_usb_card *cardp;
164 165 166 167
	int i;

	udev = interface_to_usbdev(intf);

168
	cardp = kzalloc(sizeof(struct if_usb_card), GFP_KERNEL);
169
	if (!cardp) {
170 171 172 173
		lbs_pr_err("Out of memory allocating private data.\n");
		goto error;
	}

174 175
	setup_timer(&cardp->fw_timeout, if_usb_fw_timeo, (unsigned long)cardp);
	init_waitqueue_head(&cardp->fw_wq);
176

177
	cardp->udev = udev;
178 179
	iface_desc = intf->cur_altsetting;

180
	lbs_deb_usbd(&udev->dev, "bcdUSB = 0x%X bDeviceClass = 0x%X"
181
		     " bDeviceSubClass = 0x%X, bDeviceProtocol = 0x%X\n",
182 183 184 185
		     le16_to_cpu(udev->descriptor.bcdUSB),
		     udev->descriptor.bDeviceClass,
		     udev->descriptor.bDeviceSubClass,
		     udev->descriptor.bDeviceProtocol);
186 187 188

	for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
		endpoint = &iface_desc->endpoint[i].desc;
189 190 191
		if (usb_endpoint_is_bulk_in(endpoint)) {
			cardp->ep_in_size = le16_to_cpu(endpoint->wMaxPacketSize);
			cardp->ep_in = usb_endpoint_num(endpoint);
192

193 194
			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);
195

196 197 198 199 200 201
		} 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);
202 203
		}
	}
204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220
	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;
	}
221

222 223
	/* Upload firmware */
	if (if_usb_prog_firmware(cardp)) {
224
		lbs_deb_usbd(&udev->dev, "FW upload failed\n");
225 226 227
		goto err_prog_firmware;
	}

228
	if (!(priv = lbs_add_card(cardp, &udev->dev)))
229
		goto err_prog_firmware;
230

231
	cardp->priv = priv;
232
	cardp->priv->fw_ready = 1;
233

234 235 236
	priv->hw_host_to_card = if_usb_host_to_card;
	priv->hw_get_int_status = if_usb_get_int_status;
	priv->hw_read_event_cause = if_usb_read_event_cause;
H
Holger Schurig 已提交
237
	priv->boot2_version = udev->descriptor.bcdDevice;
238

239 240
	if_usb_submit_rx_urb(cardp);

241
	if (lbs_start_card(priv))
242
		goto err_start_card;
243

244
	if_usb_setup_firmware(priv);
245

246
	usb_get_dev(udev);
247
	usb_set_intfdata(intf, cardp);
248 249 250

	return 0;

251
err_start_card:
252
	lbs_remove_card(priv);
253 254
err_prog_firmware:
	if_usb_reset_device(cardp);
255
dealloc:
256
	if_usb_free(cardp);
257 258 259 260 261 262 263

error:
	return -ENOMEM;
}

/**
 *  @brief free resource and cleanup
264
 *  @param intf		USB interface structure
265 266 267 268
 *  @return 	   	N/A
 */
static void if_usb_disconnect(struct usb_interface *intf)
{
269
	struct if_usb_card *cardp = usb_get_intfdata(intf);
270
	struct lbs_private *priv = (struct lbs_private *) cardp->priv;
271

272
	lbs_deb_enter(LBS_DEB_MAIN);
273

274
	cardp->surprise_removed = 1;
275

276
	if (priv) {
277
		priv->surpriseremoved = 1;
278 279
		lbs_stop_card(priv);
		lbs_remove_card(priv);
280
	}
281 282 283 284 285 286 287

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

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

288
	lbs_deb_leave(LBS_DEB_MAIN);
289 290 291 292
}

/**
 *  @brief  This function download FW
293
 *  @param priv		pointer to struct lbs_private
294 295
 *  @return 	   	0
 */
296
static int if_usb_send_fw_pkt(struct if_usb_card *cardp)
297
{
298 299
	struct fwdata *fwdata = cardp->ep_out_buf;
	uint8_t *firmware = cardp->fw->data;
300

301 302
	/* If we got a CRC failure on the last block, back
	   up and retry it */
303 304
	if (!cardp->CRC_OK) {
		cardp->totalbytes = cardp->fwlastblksent;
305
		cardp->fwseqnum--;
306 307
	}

308 309
	lbs_deb_usb2(&cardp->udev->dev, "totalbytes = %d\n",
		     cardp->totalbytes);
310

311 312 313 314 315
	/* 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],
316 317 318 319 320 321
	       sizeof(struct fwheader));

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

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

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

327 328
	fwdata->seqnum = cpu_to_le32(++cardp->fwseqnum);
	cardp->totalbytes += le32_to_cpu(fwdata->hdr.datalength);
329

330 331 332 333 334 335 336 337 338 339
	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");
340 341 342 343

		cardp->fwfinalblk = 1;
	}

344 345
	lbs_deb_usb2(&cardp->udev->dev, "Firmware download done; size %d\n",
		     cardp->totalbytes);
346 347 348 349

	return 0;
}

350
static int if_usb_reset_device(struct if_usb_card *cardp)
351
{
352
	struct cmd_ds_command *cmd = cardp->ep_out_buf + 4;
353 354
	int ret;

355 356
	lbs_deb_enter(LBS_DEB_USB);

357
	*(__le32 *)cardp->ep_out_buf = cpu_to_le32(CMD_TYPE_REQUEST);
358 359 360 361 362 363

	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);
364
	usb_tx_block(cardp, cardp->ep_out_buf, 4 + S_DS_GEN + sizeof(struct cmd_ds_802_11_reset));
365

366
	msleep(100);
367
	ret = usb_reset_device(cardp->udev);
368
	msleep(100);
369 370 371

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

372 373 374 375 376
	return ret;
}

/**
 *  @brief This function transfer the data to the device.
377
 *  @param priv 	pointer to struct lbs_private
378 379 380 381
 *  @param payload	pointer to payload data
 *  @param nb		data length
 *  @return 	   	0 or -1
 */
382
static int usb_tx_block(struct if_usb_card *cardp, uint8_t *payload, uint16_t nb)
383 384 385 386
{
	int ret = -1;

	/* check if device is removed */
387
	if (cardp->surprise_removed) {
388
		lbs_deb_usbd(&cardp->udev->dev, "Device removed\n");
389 390 391 392 393
		goto tx_ret;
	}

	usb_fill_bulk_urb(cardp->tx_urb, cardp->udev,
			  usb_sndbulkpipe(cardp->udev,
394
					  cardp->ep_out),
395
			  payload, nb, if_usb_write_bulk_callback, cardp);
396 397 398 399

	cardp->tx_urb->transfer_flags |= URB_ZERO_PACKET;

	if ((ret = usb_submit_urb(cardp->tx_urb, GFP_ATOMIC))) {
400
		lbs_deb_usbd(&cardp->udev->dev, "usb_submit_urb failed: %d\n", ret);
401 402
		ret = -1;
	} else {
403
		lbs_deb_usb2(&cardp->udev->dev, "usb_submit_urb success\n");
404 405 406 407 408 409 410
		ret = 0;
	}

tx_ret:
	return ret;
}

411
static int __if_usb_submit_rx_urb(struct if_usb_card *cardp,
412
				  void (*callbackfn)(struct urb *urb))
413 414 415 416 417 418 419 420 421
{
	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;
	}

422
	cardp->rx_skb = skb;
423 424 425

	/* Fill the receive configuration URB and initialise the Rx call back */
	usb_fill_bulk_urb(cardp->rx_urb, cardp->udev,
426
			  usb_rcvbulkpipe(cardp->udev, cardp->ep_in),
D
Dan Williams 已提交
427
			  (void *) (skb->tail + (size_t) IPFIELD_ALIGN_OFFSET),
428
			  MRVDRV_ETH_RX_PACKET_BUFFER_SIZE, callbackfn,
429
			  cardp);
430 431 432

	cardp->rx_urb->transfer_flags |= URB_ZERO_PACKET;

433
	lbs_deb_usb2(&cardp->udev->dev, "Pointer for rx_urb %p\n", cardp->rx_urb);
434
	if ((ret = usb_submit_urb(cardp->rx_urb, GFP_ATOMIC))) {
435
		lbs_deb_usbd(&cardp->udev->dev, "Submit Rx URB failed: %d\n", ret);
436
		kfree_skb(skb);
437
		cardp->rx_skb = NULL;
438 439
		ret = -1;
	} else {
440
		lbs_deb_usb2(&cardp->udev->dev, "Submit Rx URB success\n");
441 442 443 444 445 446 447
		ret = 0;
	}

rx_ret:
	return ret;
}

448
static int if_usb_submit_rx_urb_fwload(struct if_usb_card *cardp)
449
{
450
	return __if_usb_submit_rx_urb(cardp, &if_usb_receive_fwload);
451 452
}

453
static int if_usb_submit_rx_urb(struct if_usb_card *cardp)
454
{
455
	return __if_usb_submit_rx_urb(cardp, &if_usb_receive);
456 457 458 459
}

static void if_usb_receive_fwload(struct urb *urb)
{
460 461
	struct if_usb_card *cardp = urb->context;
	struct sk_buff *skb = cardp->rx_skb;
462
	struct fwsyncheader *syncfwheader;
463
	struct bootcmdresp bootcmdresp;
464 465

	if (urb->status) {
466
		lbs_deb_usbd(&cardp->udev->dev,
467
			     "URB status is failed during fw load\n");
468 469 470 471
		kfree_skb(skb);
		return;
	}

472 473 474 475 476 477 478 479
	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 {
480 481
			lbs_deb_usb("Waiting for confirmation; got %x %x\n",
				    le32_to_cpu(tmp[0]), le32_to_cpu(tmp[1]));
482 483 484 485 486
			if_usb_submit_rx_urb_fwload(cardp);
		}
		kfree_skb(skb);
		return;
	}
487
	if (cardp->bootcmdresp <= 0) {
488 489
		memcpy (&bootcmdresp, skb->data + IPFIELD_ALIGN_OFFSET,
			sizeof(bootcmdresp));
490

491
		if (le16_to_cpu(cardp->udev->descriptor.bcdDevice) < 0x3106) {
492
			kfree_skb(skb);
493
			if_usb_submit_rx_urb_fwload(cardp);
494
			cardp->bootcmdresp = 1;
495
			lbs_deb_usbd(&cardp->udev->dev,
496
				     "Received valid boot command response\n");
497 498
			return;
		}
499 500 501 502
		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)) {
503 504
				if (!cardp->bootcmdresp)
					lbs_pr_info("Firmware already seems alive; resetting\n");
505 506 507
				cardp->bootcmdresp = -1;
			} else {
				lbs_pr_info("boot cmd response wrong magic number (0x%x)\n",
508
					    le32_to_cpu(bootcmdresp.magic));
509
			}
510 511 512 513 514 515
		} else if (bootcmdresp.cmd != BOOT_CMD_FW_BY_USB) {
			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);
516 517
		} else {
			cardp->bootcmdresp = 1;
518
			lbs_deb_usbd(&cardp->udev->dev,
519
				     "Received valid boot command response\n");
520 521
		}
		kfree_skb(skb);
522
		if_usb_submit_rx_urb_fwload(cardp);
523 524 525 526 527
		return;
	}

	syncfwheader = kmalloc(sizeof(struct fwsyncheader), GFP_ATOMIC);
	if (!syncfwheader) {
528
		lbs_deb_usbd(&cardp->udev->dev, "Failure to allocate syncfwheader\n");
529 530 531 532 533
		kfree_skb(skb);
		return;
	}

	memcpy(syncfwheader, skb->data + IPFIELD_ALIGN_OFFSET,
534
	       sizeof(struct fwsyncheader));
535 536

	if (!syncfwheader->cmd) {
537 538 539
		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));
540 541
		cardp->CRC_OK = 1;
	} else {
542
		lbs_deb_usbd(&cardp->udev->dev, "FW received Blk with CRC error\n");
543 544 545 546 547
		cardp->CRC_OK = 0;
	}

	kfree_skb(skb);

548 549 550
	/* reschedule timer for 200ms hence */
	mod_timer(&cardp->fw_timeout, jiffies + (HZ/5));

551 552 553 554 555
	if (cardp->fwfinalblk) {
		cardp->fwdnldover = 1;
		goto exit;
	}

556
	if_usb_send_fw_pkt(cardp);
557

558
 exit:
559 560
	if_usb_submit_rx_urb_fwload(cardp);

561 562 563 564 565 566 567 568
	kfree(syncfwheader);

	return;
}

#define MRVDRV_MIN_PKT_LEN	30

static inline void process_cmdtypedata(int recvlength, struct sk_buff *skb,
569
				       struct if_usb_card *cardp,
570
				       struct lbs_private *priv)
571
{
572 573 574
	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");
575 576 577 578 579 580 581
		kfree_skb(skb);
		return;
	}

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

583
	lbs_process_rxed_packet(priv, skb);
584
	priv->upld_len = (recvlength - MESSAGE_HEADER_LEN);
585 586
}

587
static inline void process_cmdrequest(int recvlength, uint8_t *recvbuff,
588
				      struct sk_buff *skb,
589
				      struct if_usb_card *cardp,
590
				      struct lbs_private *priv)
591
{
592
	if (recvlength > LBS_CMD_BUFFER_SIZE) {
593
		lbs_deb_usbd(&cardp->udev->dev,
594
			     "The receive buffer is too large\n");
595 596 597 598 599 600 601
		kfree_skb(skb);
		return;
	}

	if (!in_interrupt())
		BUG();

602
	spin_lock(&priv->driver_lock);
603
	cardp->usb_int_cause |= MRVDRV_CMD_UPLD_RDY;
604
	priv->upld_len = (recvlength - MESSAGE_HEADER_LEN);
605
	memcpy(priv->upld_buf, recvbuff + MESSAGE_HEADER_LEN, priv->upld_len);
606 607

	kfree_skb(skb);
608
	lbs_interrupt(priv);
609
	spin_unlock(&priv->driver_lock);
610

611
	lbs_deb_usbd(&cardp->udev->dev,
612 613 614 615 616 617 618 619 620 621 622 623
		    "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)
{
624 625
	struct if_usb_card *cardp = urb->context;
	struct sk_buff *skb = cardp->rx_skb;
626
	struct lbs_private *priv = cardp->priv;
627
	int recvlength = urb->actual_length;
628 629 630
	uint8_t *recvbuff = NULL;
	uint32_t recvtype = 0;
	__le32 *pkt = (__le32 *)(skb->data + IPFIELD_ALIGN_OFFSET);
631

632
	lbs_deb_enter(LBS_DEB_USB);
633 634 635

	if (recvlength) {
		if (urb->status) {
636 637
			lbs_deb_usbd(&cardp->udev->dev, "RX URB failed: %d\n",
				     urb->status);
638 639 640 641 642
			kfree_skb(skb);
			goto setup_for_next;
		}

		recvbuff = skb->data + IPFIELD_ALIGN_OFFSET;
643
		recvtype = le32_to_cpu(pkt[0]);
644
		lbs_deb_usbd(&cardp->udev->dev,
645 646
			    "Recv length = 0x%x, Recv type = 0x%X\n",
			    recvlength, recvtype);
647 648
	} else if (urb->status) {
		kfree_skb(skb);
649
		goto rx_exit;
650
	}
651 652 653 654 655 656 657 658 659 660 661 662

	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:
		/* Event cause handling */
663
		spin_lock(&priv->driver_lock);
664 665 666

		cardp->usb_event_cause = le32_to_cpu(pkt[1]);

667
		lbs_deb_usbd(&cardp->udev->dev,"**EVENT** 0x%X\n",
668 669 670
			     cardp->usb_event_cause);

		/* Icky undocumented magic special case */
671
		if (cardp->usb_event_cause & 0xffff0000) {
672
			lbs_send_tx_feedback(priv);
673
			spin_unlock(&priv->driver_lock);
674 675
			break;
		}
676
		cardp->usb_event_cause <<= 3;
677
		cardp->usb_int_cause |= MRVDRV_CARDEVENT;
678
		kfree_skb(skb);
679
		lbs_interrupt(priv);
680
		spin_unlock(&priv->driver_lock);
681 682
		goto rx_exit;
	default:
683
		lbs_deb_usbd(&cardp->udev->dev, "Unknown command type 0x%X\n",
684
			     recvtype);
685 686 687 688 689
		kfree_skb(skb);
		break;
	}

setup_for_next:
690
	if_usb_submit_rx_urb(cardp);
691
rx_exit:
692
	lbs_deb_leave(LBS_DEB_USB);
693 694 695 696
}

/**
 *  @brief This function downloads data to FW
697
 *  @param priv		pointer to struct lbs_private structure
698 699 700 701 702
 *  @param type		type of data
 *  @param buf		pointer to data buffer
 *  @param len		number of bytes
 *  @return 	   	0 or -1
 */
703 704
static int if_usb_host_to_card(struct lbs_private *priv, uint8_t type,
			       uint8_t *payload, uint16_t nb)
705
{
706
	struct if_usb_card *cardp = priv->card;
707

708 709
	lbs_deb_usbd(&cardp->udev->dev,"*** type = %u\n", type);
	lbs_deb_usbd(&cardp->udev->dev,"size after = %d\n", nb);
710 711

	if (type == MVMS_CMD) {
712
		*(__le32 *)cardp->ep_out_buf = cpu_to_le32(CMD_TYPE_REQUEST);
713
		priv->dnld_sent = DNLD_CMD_SENT;
714
	} else {
715
		*(__le32 *)cardp->ep_out_buf = cpu_to_le32(CMD_TYPE_DATA);
716
		priv->dnld_sent = DNLD_DATA_SENT;
717 718
	}

719
	memcpy((cardp->ep_out_buf + MESSAGE_HEADER_LEN), payload, nb);
720

721
	return usb_tx_block(cardp, cardp->ep_out_buf, nb + MESSAGE_HEADER_LEN);
722 723
}

724
/* called with priv->driver_lock held */
725
static int if_usb_get_int_status(struct lbs_private *priv, uint8_t *ireg)
726
{
727
	struct if_usb_card *cardp = priv->card;
728 729 730 731

	*ireg = cardp->usb_int_cause;
	cardp->usb_int_cause = 0;

732
	lbs_deb_usbd(&cardp->udev->dev, "Int cause is 0x%X\n", *ireg);
733 734 735 736

	return 0;
}

737
static int if_usb_read_event_cause(struct lbs_private *priv)
738
{
739
	struct if_usb_card *cardp = priv->card;
740

741
	priv->eventcause = cardp->usb_event_cause;
742
	/* Re-submit rx urb here to avoid event lost issue */
743
	if_usb_submit_rx_urb(cardp);
744

745 746 747
	return 0;
}

748 749 750 751 752 753
/**
 *  @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
 */
754
static int if_usb_issue_boot_command(struct if_usb_card *cardp, int ivalue)
755
{
756
	struct bootcmd *bootcmd = cardp->ep_out_buf;
757 758

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

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

	return 0;
}
768 769


770 771 772 773 774 775 776
/**
 *  @brief This function checks the validity of Boot2/FW image.
 *
 *  @param data              pointer to image
 *         len               image length
 *  @return     0 or -1
 */
777
static int check_fwfile_format(uint8_t *data, uint32_t totlen)
778
{
779 780
	uint32_t bincmd, exit;
	uint32_t blksize, offset, len;
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 817
	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;
}


818
static int if_usb_prog_firmware(struct if_usb_card *cardp)
819 820 821
{
	int i = 0;
	static int reset_count = 10;
822
	int ret = 0;
823

824
	lbs_deb_enter(LBS_DEB_USB);
825

826
	if ((ret = request_firmware(&cardp->fw, lbs_fw_name,
827 828
				    &cardp->udev->dev)) < 0) {
		lbs_pr_err("request_firmware() failed with %#x\n", ret);
829
		lbs_pr_err("firmware %s not found\n", lbs_fw_name);
830 831 832 833 834
		goto done;
	}

	if (check_fwfile_format(cardp->fw->data, cardp->fw->size))
		goto release_fw;
835 836

restart:
837
	if (if_usb_submit_rx_urb_fwload(cardp) < 0) {
838 839
		lbs_deb_usbd(&cardp->udev->dev, "URB submission is failed\n");
		ret = -1;
840
		goto release_fw;
841 842 843 844 845 846 847
	}

	cardp->bootcmdresp = 0;
	do {
		int j = 0;
		i++;
		/* Issue Boot command = 1, Boot from Download-FW */
848
		if_usb_issue_boot_command(cardp, BOOT_CMD_FW_BY_USB);
849 850 851 852 853 854 855
		/* wait for command response */
		do {
			j++;
			msleep_interruptible(100);
		} while (cardp->bootcmdresp == 0 && j < 10);
	} while (cardp->bootcmdresp == 0 && i < 5);

856
	if (cardp->bootcmdresp <= 0) {
857
		if (--reset_count >= 0) {
858
			if_usb_reset_device(cardp);
859 860 861 862 863 864 865 866 867 868 869 870 871 872 873
			goto restart;
		}
		return -1;
	}

	i = 0;

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

874 875
	/* Send the first firmware packet... */
	if_usb_send_fw_pkt(cardp);
876

877 878
	/* ... and wait for the process to complete */
	wait_event_interruptible(cardp->fw_wq, cardp->surprise_removed || cardp->fwdnldover);
879

880
	del_timer_sync(&cardp->fw_timeout);
881
	usb_kill_urb(cardp->rx_urb);
882 883 884 885

	if (!cardp->fwdnldover) {
		lbs_pr_info("failed to load fw, resetting device!\n");
		if (--reset_count >= 0) {
886
			if_usb_reset_device(cardp);
887 888 889 890
			goto restart;
		}

		lbs_pr_info("FW download failure, time = %d ms\n", i * 100);
891
		ret = -1;
892
		goto release_fw;
893 894
	}

895
 release_fw:
896 897
	release_firmware(cardp->fw);
	cardp->fw = NULL;
898

899
 done:
900 901
	lbs_deb_leave_args(LBS_DEB_USB, "ret %d", ret);
	return ret;
902 903
}

H
Holger Schurig 已提交
904

905 906 907
#ifdef CONFIG_PM
static int if_usb_suspend(struct usb_interface *intf, pm_message_t message)
{
908
	struct if_usb_card *cardp = usb_get_intfdata(intf);
909
	struct lbs_private *priv = cardp->priv;
910
	int ret;
911

912
	lbs_deb_enter(LBS_DEB_USB);
913

914
	if (priv->psstate != PS_STATE_FULL_POWER)
915 916
		return -1;

917 918 919
	ret = lbs_suspend(priv);
	if (ret)
		goto out;
920 921 922 923 924

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

925
 out:
926
	lbs_deb_leave(LBS_DEB_USB);
927
	return ret;
928 929 930 931
}

static int if_usb_resume(struct usb_interface *intf)
{
932
	struct if_usb_card *cardp = usb_get_intfdata(intf);
933
	struct lbs_private *priv = cardp->priv;
934

935
	lbs_deb_enter(LBS_DEB_USB);
936

937
	if_usb_submit_rx_urb(cardp);
938

939
	lbs_resume(priv);
940

941
	lbs_deb_leave(LBS_DEB_USB);
942 943 944 945 946 947 948 949
	return 0;
}
#else
#define if_usb_suspend NULL
#define if_usb_resume NULL
#endif

static struct usb_driver if_usb_driver = {
950
	.name = DRV_NAME,
951 952 953 954 955 956 957
	.probe = if_usb_probe,
	.disconnect = if_usb_disconnect,
	.id_table = if_usb_table,
	.suspend = if_usb_suspend,
	.resume = if_usb_resume,
};

958
static int __init if_usb_init_module(void)
959
{
960
	int ret = 0;
961

962 963 964 965 966 967
	lbs_deb_enter(LBS_DEB_MAIN);

	ret = usb_register(&if_usb_driver);

	lbs_deb_leave_args(LBS_DEB_MAIN, "ret %d", ret);
	return ret;
968 969
}

970
static void __exit if_usb_exit_module(void)
971
{
972 973
	lbs_deb_enter(LBS_DEB_MAIN);

974
	usb_deregister(&if_usb_driver);
975 976

	lbs_deb_leave(LBS_DEB_MAIN);
977
}
978 979 980 981 982

module_init(if_usb_init_module);
module_exit(if_usb_exit_module);

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