if_usb.c 25.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 19 20
#include "if_usb.h"

#define MESSAGE_HEADER_LEN	4

21
static char *lbs_fw_name = "usb8388.bin";
22
module_param_named(fw_name, lbs_fw_name, charp, 0644);
23

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

/**
 *  @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)
{
54
	struct usb_card_rec *cardp = (struct usb_card_rec *) urb->context;
55 56 57

	/* handle the transmission complete validations */

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

61 62 63
		/*
		lbs_deb_usbd(&urb->dev->dev, "URB status is successfull\n");
		lbs_deb_usbd(&urb->dev->dev, "Actual length transmitted %d\n",
64
		       urb->actual_length);
65
		*/
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 82 83 84
	}

	return;
}

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

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

	kfree(cardp->bulk_out_buffer);
	cardp->bulk_out_buffer = NULL;

102
	lbs_deb_leave(LBS_DEB_USB);
103 104
}

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

	b2_cmd.action = 0;
H
Holger Schurig 已提交
110
	b2_cmd.version = priv->boot2_version;
111

112
	if (lbs_cmd(priv, CMD_SET_BOOT2_VER, b2_cmd, NULL, 0))
113 114 115
		lbs_deb_usb("Setting boot2 version failed\n");
}

116
static void if_usb_fw_timeo(unsigned long priv)
117 118
{
	struct usb_card_rec *cardp = (void *)priv;
119

120 121 122 123 124 125 126 127
	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);
}
128 129 130 131 132 133 134 135 136 137 138 139
/**
 *  @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;
140
	struct lbs_private *priv;
141
	struct usb_card_rec *cardp;
142 143 144 145
	int i;

	udev = interface_to_usbdev(intf);

146 147
	cardp = kzalloc(sizeof(struct usb_card_rec), GFP_KERNEL);
	if (!cardp) {
148 149 150 151
		lbs_pr_err("Out of memory allocating private data.\n");
		goto error;
	}

152 153 154
	setup_timer(&cardp->fw_timeout, if_usb_fw_timeo, (unsigned long)cardp);
	init_waitqueue_head(&cardp->fw_wq);
								     
155
	cardp->udev = udev;
156 157
	iface_desc = intf->cur_altsetting;

158
	lbs_deb_usbd(&udev->dev, "bcdUSB = 0x%X bDeviceClass = 0x%X"
159
	       " bDeviceSubClass = 0x%X, bDeviceProtocol = 0x%X\n",
160 161 162 163
		     le16_to_cpu(udev->descriptor.bcdUSB),
		     udev->descriptor.bDeviceClass,
		     udev->descriptor.bDeviceSubClass,
		     udev->descriptor.bDeviceProtocol);
164 165 166 167 168 169 170

	for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
		endpoint = &iface_desc->endpoint[i].desc;
		if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK)
		    && ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
			USB_ENDPOINT_XFER_BULK)) {
			/* we found a bulk in endpoint */
171
			lbs_deb_usbd(&udev->dev, "Bulk in size is %d\n",
172 173
				     le16_to_cpu(endpoint->wMaxPacketSize));
			if (!(cardp->rx_urb = usb_alloc_urb(0, GFP_KERNEL))) {
174
				lbs_deb_usbd(&udev->dev,
175 176 177
				       "Rx URB allocation failed\n");
				goto dealloc;
			}
178
			cardp->bulk_in_size =
179
				le16_to_cpu(endpoint->wMaxPacketSize);
180
			cardp->bulk_in_endpointAddr =
181 182
			    (endpoint->
			     bEndpointAddress & USB_ENDPOINT_NUMBER_MASK);
183
			lbs_deb_usbd(&udev->dev, "in_endpoint = %d\n",
184 185 186 187 188 189 190 191 192
			       endpoint->bEndpointAddress);
		}

		if (((endpoint->
		      bEndpointAddress & USB_ENDPOINT_DIR_MASK) ==
		     USB_DIR_OUT)
		    && ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
			USB_ENDPOINT_XFER_BULK)) {
			/* We found bulk out endpoint */
193
			if (!(cardp->tx_urb = usb_alloc_urb(0, GFP_KERNEL))) {
194
				lbs_deb_usbd(&udev->dev,
195 196 197 198
				       "Tx URB allocation failed\n");
				goto dealloc;
			}

199
			cardp->bulk_out_size =
200
				le16_to_cpu(endpoint->wMaxPacketSize);
201
			lbs_deb_usbd(&udev->dev,
202 203
				     "Bulk out size is %d\n",
				     le16_to_cpu(endpoint->wMaxPacketSize));
204
			cardp->bulk_out_endpointAddr =
205
			    endpoint->bEndpointAddress;
206
			lbs_deb_usbd(&udev->dev, "out_endpoint = %d\n",
207
				    endpoint->bEndpointAddress);
208
			cardp->bulk_out_buffer =
209 210 211
			    kmalloc(MRVDRV_ETH_TX_PACKET_BUFFER_SIZE,
				    GFP_KERNEL);

212
			if (!cardp->bulk_out_buffer) {
213
				lbs_deb_usbd(&udev->dev,
214 215 216 217 218 219
				       "Could not allocate buffer\n");
				goto dealloc;
			}
		}
	}

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

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

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

233 234 235
	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 已提交
236
	priv->boot2_version = udev->descriptor.bcdDevice;
237

238 239
	if_usb_submit_rx_urb(cardp);

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

243
	if_usb_set_boot2_ver(priv);
244

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

	return 0;

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

error:
	return -ENOMEM;
}

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

271
	lbs_deb_enter(LBS_DEB_MAIN);
272

273 274
	/* Update Surprise removed to TRUE */
	cardp->surprise_removed = 1;
275

276 277
	if (priv) {

278
		priv->surpriseremoved = 1;
279 280
		lbs_stop_card(priv);
		lbs_remove_card(priv);
281
	}
282

283 284 285 286
	/* this is (apparently?) necessary for future usage of the device */
	lbs_prepare_and_send_command(priv, CMD_802_11_RESET, CMD_ACT_HALT,
			0, 0, NULL);

287 288 289 290 291 292
	/* Unlink and free urb */
	if_usb_free(cardp);

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

293
	lbs_deb_leave(LBS_DEB_MAIN);
294 295 296 297
}

/**
 *  @brief  This function download FW
298
 *  @param priv		pointer to struct lbs_private
299 300
 *  @return 	   	0
 */
301
static int if_usb_send_fw_pkt(struct usb_card_rec *cardp)
302 303 304
{
	struct FWData *fwdata;
	struct fwheader *fwheader;
305
	u8 *firmware = cardp->fw->data;
306 307 308 309 310 311 312 313 314 315 316 317 318

	fwdata = kmalloc(sizeof(struct FWData), GFP_ATOMIC);

	if (!fwdata)
		return -1;

	fwheader = &fwdata->fwheader;

	if (!cardp->CRC_OK) {
		cardp->totalbytes = cardp->fwlastblksent;
		cardp->fwseqnum = cardp->lastseqnum - 1;
	}

319 320
	/*
	lbs_deb_usbd(&cardp->udev->dev, "totalbytes = %d\n",
321
		    cardp->totalbytes);
322
	*/
323 324 325 326 327 328 329

	memcpy(fwheader, &firmware[cardp->totalbytes],
	       sizeof(struct fwheader));

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

330
	/* lbs_deb_usbd(&cardp->udev->dev,"Copy Data\n"); */
331
	memcpy(fwdata->data, &firmware[cardp->totalbytes],
332
	       le32_to_cpu(fwdata->fwheader.datalength));
333

334 335
	/*
	lbs_deb_usbd(&cardp->udev->dev,
336
		    "Data length = %d\n", le32_to_cpu(fwdata->fwheader.datalength));
337
	*/
338 339 340

	cardp->fwseqnum = cardp->fwseqnum + 1;

341 342 343
	fwdata->seqnum = cpu_to_le32(cardp->fwseqnum);
	cardp->lastseqnum = cardp->fwseqnum;
	cardp->totalbytes += le32_to_cpu(fwdata->fwheader.datalength);
344

345
	if (fwheader->dnldcmd == cpu_to_le32(FW_HAS_DATA_TO_RECV)) {
346
		/*
347
		lbs_deb_usbd(&cardp->udev->dev, "There are data to follow\n");
348
		lbs_deb_usbd(&cardp->udev->dev,
349 350
			    "seqnum = %d totalbytes = %d\n", cardp->fwseqnum,
			    cardp->totalbytes);
351
		*/
352
		memcpy(cardp->bulk_out_buffer, fwheader, FW_DATA_XMIT_SIZE);
353
		usb_tx_block(cardp, cardp->bulk_out_buffer, FW_DATA_XMIT_SIZE);
354

355
	} else if (fwdata->fwheader.dnldcmd == cpu_to_le32(FW_HAS_LAST_BLOCK)) {
356 357
		/*
		lbs_deb_usbd(&cardp->udev->dev,
358
			    "Host has finished FW downloading\n");
359
		lbs_deb_usbd(&cardp->udev->dev,
360
			    "Donwloading FW JUMP BLOCK\n");
361
		*/
362
		memcpy(cardp->bulk_out_buffer, fwheader, FW_DATA_XMIT_SIZE);
363
		usb_tx_block(cardp, cardp->bulk_out_buffer, FW_DATA_XMIT_SIZE);
364 365 366
		cardp->fwfinalblk = 1;
	}

367 368
	/*
	lbs_deb_usbd(&cardp->udev->dev,
369 370
		    "The firmware download is done size is %d\n",
		    cardp->totalbytes);
371
	*/
372 373 374 375 376 377

	kfree(fwdata);

	return 0;
}

378
static int if_usb_reset_device(struct usb_card_rec *cardp)
379
{
380
	struct cmd_ds_command *cmd = (void *)&cardp->bulk_out_buffer[4];
381 382
	int ret;

383 384
	lbs_deb_enter(LBS_DEB_USB);

385 386 387 388 389 390 391 392 393
	*(__le32 *)cardp->bulk_out_buffer = cpu_to_le32(CMD_TYPE_REQUEST);

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

394
	msleep(100);
395
	ret = usb_reset_device(cardp->udev);
396
	msleep(100);
397 398 399

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

400 401 402 403 404
	return ret;
}

/**
 *  @brief This function transfer the data to the device.
405
 *  @param priv 	pointer to struct lbs_private
406 407 408 409
 *  @param payload	pointer to payload data
 *  @param nb		data length
 *  @return 	   	0 or -1
 */
410
static int usb_tx_block(struct usb_card_rec *cardp, u8 * payload, u16 nb)
411 412 413 414
{
	int ret = -1;

	/* check if device is removed */
415
	if (cardp->surprise_removed) {
416
		lbs_deb_usbd(&cardp->udev->dev, "Device removed\n");
417 418 419 420 421 422
		goto tx_ret;
	}

	usb_fill_bulk_urb(cardp->tx_urb, cardp->udev,
			  usb_sndbulkpipe(cardp->udev,
					  cardp->bulk_out_endpointAddr),
423
			  payload, nb, if_usb_write_bulk_callback, cardp);
424 425 426 427 428

	cardp->tx_urb->transfer_flags |= URB_ZERO_PACKET;

	if ((ret = usb_submit_urb(cardp->tx_urb, GFP_ATOMIC))) {
		/*  transfer failed */
429
		lbs_deb_usbd(&cardp->udev->dev, "usb_submit_urb failed: %d\n", ret);
430 431
		ret = -1;
	} else {
432
		/* lbs_deb_usbd(&cardp->udev->dev, "usb_submit_urb success\n"); */
433 434 435 436 437 438 439
		ret = 0;
	}

tx_ret:
	return ret;
}

440 441
static int __if_usb_submit_rx_urb(struct usb_card_rec *cardp,
				  void (*callbackfn)(struct urb *urb))
442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457
{
	struct sk_buff *skb;
	struct read_cb_info *rinfo = &cardp->rinfo;
	int ret = -1;

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

	rinfo->skb = skb;

	/* Fill the receive configuration URB and initialise the Rx call back */
	usb_fill_bulk_urb(cardp->rx_urb, cardp->udev,
			  usb_rcvbulkpipe(cardp->udev,
					  cardp->bulk_in_endpointAddr),
D
Dan Williams 已提交
458
			  (void *) (skb->tail + (size_t) IPFIELD_ALIGN_OFFSET),
459 460 461 462 463
			  MRVDRV_ETH_RX_PACKET_BUFFER_SIZE, callbackfn,
			  rinfo);

	cardp->rx_urb->transfer_flags |= URB_ZERO_PACKET;

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

rx_ret:
	return ret;
}

480
static int if_usb_submit_rx_urb_fwload(struct usb_card_rec *cardp)
481
{
482
	return __if_usb_submit_rx_urb(cardp, &if_usb_receive_fwload);
483 484
}

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

static void if_usb_receive_fwload(struct urb *urb)
{
	struct read_cb_info *rinfo = (struct read_cb_info *)urb->context;
	struct sk_buff *skb = rinfo->skb;
494
	struct usb_card_rec *cardp = (struct usb_card_rec *)rinfo->cardp;
495 496 497 498
	struct fwsyncheader *syncfwheader;
	struct bootcmdrespStr bootcmdresp;

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

505 506 507 508 509 510 511 512 513 514 515 516 517 518 519
	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 {
			lbs_deb_usb("Waiting for confirmation; got %x %x\n", le32_to_cpu(tmp[0]),
				    le32_to_cpu(tmp[1]));
			if_usb_submit_rx_urb_fwload(cardp);
		}
		kfree_skb(skb);
		return;
	}
520
	if (cardp->bootcmdresp <= 0) {
521 522
		memcpy (&bootcmdresp, skb->data + IPFIELD_ALIGN_OFFSET,
			sizeof(bootcmdresp));
523
		if (le16_to_cpu(cardp->udev->descriptor.bcdDevice) < 0x3106) {
524
			kfree_skb(skb);
525
			if_usb_submit_rx_urb_fwload(cardp);
526
			cardp->bootcmdresp = 1;
527
			lbs_deb_usbd(&cardp->udev->dev,
528 529 530
				    "Received valid boot command response\n");
			return;
		}
531
		if (bootcmdresp.u32magicnumber != cpu_to_le32(BOOT_CMD_MAGIC_NUMBER)) {
532 533 534
			if (bootcmdresp.u32magicnumber == cpu_to_le32(CMD_TYPE_REQUEST) ||
			    bootcmdresp.u32magicnumber == cpu_to_le32(CMD_TYPE_DATA) ||
			    bootcmdresp.u32magicnumber == cpu_to_le32(CMD_TYPE_INDICATION)) {
535 536
				if (!cardp->bootcmdresp)
					lbs_pr_info("Firmware already seems alive; resetting\n");
537 538 539 540 541
				cardp->bootcmdresp = -1;
			} else {
				lbs_pr_info("boot cmd response wrong magic number (0x%x)\n",
					    le32_to_cpu(bootcmdresp.u32magicnumber));
			}
542 543 544 545 546 547 548 549 550 551
		} else if (bootcmdresp.u8cmd_tag != BOOT_CMD_FW_BY_USB) {
			lbs_pr_info(
				"boot cmd response cmd_tag error (%d)\n",
				bootcmdresp.u8cmd_tag);
		} else if (bootcmdresp.u8result != BOOT_CMD_RESP_OK) {
			lbs_pr_info(
				"boot cmd response result error (%d)\n",
				bootcmdresp.u8result);
		} else {
			cardp->bootcmdresp = 1;
552
			lbs_deb_usbd(&cardp->udev->dev,
553 554 555
				    "Received valid boot command response\n");
		}
		kfree_skb(skb);
556
		if_usb_submit_rx_urb_fwload(cardp);
557 558 559 560 561
		return;
	}

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

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

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

	kfree_skb(skb);

587 588 589
	/* reschedule timer for 200ms hence */
	mod_timer(&cardp->fw_timeout, jiffies + (HZ/5));

590 591 592 593 594
	if (cardp->fwfinalblk) {
		cardp->fwdnldover = 1;
		goto exit;
	}

595
	if_usb_send_fw_pkt(cardp);
596

597
 exit:
598 599
	if_usb_submit_rx_urb_fwload(cardp);

600 601 602 603 604 605 606 607 608
	kfree(syncfwheader);

	return;
}

#define MRVDRV_MIN_PKT_LEN	30

static inline void process_cmdtypedata(int recvlength, struct sk_buff *skb,
				       struct usb_card_rec *cardp,
609
				       struct lbs_private *priv)
610 611 612
{
	if (recvlength > MRVDRV_ETH_RX_PACKET_BUFFER_SIZE +
	    MESSAGE_HEADER_LEN || recvlength < MRVDRV_MIN_PKT_LEN) {
613
		lbs_deb_usbd(&cardp->udev->dev,
614 615 616 617 618 619 620 621
			    "Packet length is Invalid\n");
		kfree_skb(skb);
		return;
	}

	skb_reserve(skb, IPFIELD_ALIGN_OFFSET);
	skb_put(skb, recvlength);
	skb_pull(skb, MESSAGE_HEADER_LEN);
622
	lbs_process_rxed_packet(priv, skb);
623
	priv->upld_len = (recvlength - MESSAGE_HEADER_LEN);
624 625 626 627 628
}

static inline void process_cmdrequest(int recvlength, u8 *recvbuff,
				      struct sk_buff *skb,
				      struct usb_card_rec *cardp,
629
				      struct lbs_private *priv)
630 631
{
	u8 *cmdbuf;
632
	if (recvlength > LBS_CMD_BUFFER_SIZE) {
633
		lbs_deb_usbd(&cardp->udev->dev,
634 635 636 637 638 639 640 641
			    "The receive buffer is too large\n");
		kfree_skb(skb);
		return;
	}

	if (!in_interrupt())
		BUG();

642
	spin_lock(&priv->driver_lock);
643 644
	/* take care of cur_cmd = NULL case by reading the
	 * data to clear the interrupt */
645
	if (!priv->cur_cmd) {
646
		lbs_deb_hex(LBS_DEB_HOST, "Unsolicited CMD_RESP", (void *) recvbuff + MESSAGE_HEADER_LEN, priv->upld_len);
647
		cmdbuf = priv->upld_buf;
648
		priv->hisregcpy &= ~MRVDRV_CMD_UPLD_RDY;
649
	} else
650
		cmdbuf = (u8 *) priv->cur_cmd->cmdbuf;
651

652
	cardp->usb_int_cause |= MRVDRV_CMD_UPLD_RDY;
653
	priv->upld_len = (recvlength - MESSAGE_HEADER_LEN);
654
	memcpy(cmdbuf, recvbuff + MESSAGE_HEADER_LEN,
655
	       priv->upld_len);
656 657

	kfree_skb(skb);
658
	lbs_interrupt(priv);
659
	spin_unlock(&priv->driver_lock);
660

661
	lbs_deb_usbd(&cardp->udev->dev,
662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677
		    "Wake up main thread to handle cmd response\n");

	return;
}

/**
 *  @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)
{
	struct read_cb_info *rinfo = (struct read_cb_info *)urb->context;
	struct sk_buff *skb = rinfo->skb;
678
	struct usb_card_rec *cardp = (struct usb_card_rec *) rinfo->cardp;
679
	struct lbs_private *priv = cardp->priv;
680 681 682

	int recvlength = urb->actual_length;
	u8 *recvbuff = NULL;
683
	u32 recvtype = 0;
684

685
	lbs_deb_enter(LBS_DEB_USB);
686 687

	if (recvlength) {
688 689
		__le32 tmp;

690
		if (urb->status) {
691
			lbs_deb_usbd(&cardp->udev->dev,
692 693 694 695 696 697
				    "URB status is failed\n");
			kfree_skb(skb);
			goto setup_for_next;
		}

		recvbuff = skb->data + IPFIELD_ALIGN_OFFSET;
698 699
		memcpy(&tmp, recvbuff, sizeof(u32));
		recvtype = le32_to_cpu(tmp);
700
		lbs_deb_usbd(&cardp->udev->dev,
701 702
			    "Recv length = 0x%x, Recv type = 0x%X\n",
			    recvlength, recvtype);
703 704
	} else if (urb->status) {
		kfree_skb(skb);
705
		goto rx_exit;
706
	}
707 708 709 710 711 712 713 714 715 716 717 718

	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 */
719
		spin_lock(&priv->driver_lock);
720
		cardp->usb_event_cause = le32_to_cpu(*(__le32 *) (recvbuff + MESSAGE_HEADER_LEN));
721
		lbs_deb_usbd(&cardp->udev->dev,"**EVENT** 0x%X\n",
722 723
			    cardp->usb_event_cause);
		if (cardp->usb_event_cause & 0xffff0000) {
724
			lbs_send_tx_feedback(priv);
725
			spin_unlock(&priv->driver_lock);
726 727
			break;
		}
728
		cardp->usb_event_cause <<= 3;
729
		cardp->usb_int_cause |= MRVDRV_CARDEVENT;
730
		kfree_skb(skb);
731
		lbs_interrupt(priv);
732
		spin_unlock(&priv->driver_lock);
733 734
		goto rx_exit;
	default:
735 736
		lbs_deb_usbd(&cardp->udev->dev, "Unknown command type 0x%X\n",
		             recvtype);
737 738 739 740 741
		kfree_skb(skb);
		break;
	}

setup_for_next:
742
	if_usb_submit_rx_urb(cardp);
743
rx_exit:
744
	lbs_deb_leave(LBS_DEB_USB);
745 746 747 748
}

/**
 *  @brief This function downloads data to FW
749
 *  @param priv		pointer to struct lbs_private structure
750 751 752 753 754
 *  @param type		type of data
 *  @param buf		pointer to data buffer
 *  @param len		number of bytes
 *  @return 	   	0 or -1
 */
755 756 757 758
static int if_usb_host_to_card(struct lbs_private *priv,
	u8 type,
	u8 *payload,
	u16 nb)
759
{
760
	struct usb_card_rec *cardp = (struct usb_card_rec *)priv->card;
761

762 763
	lbs_deb_usbd(&cardp->udev->dev,"*** type = %u\n", type);
	lbs_deb_usbd(&cardp->udev->dev,"size after = %d\n", nb);
764 765

	if (type == MVMS_CMD) {
766
		__le32 tmp = cpu_to_le32(CMD_TYPE_REQUEST);
767
		priv->dnld_sent = DNLD_CMD_SENT;
768 769 770 771
		memcpy(cardp->bulk_out_buffer, (u8 *) & tmp,
		       MESSAGE_HEADER_LEN);

	} else {
772
		__le32 tmp = cpu_to_le32(CMD_TYPE_DATA);
773
		priv->dnld_sent = DNLD_DATA_SENT;
774 775 776 777 778 779
		memcpy(cardp->bulk_out_buffer, (u8 *) & tmp,
		       MESSAGE_HEADER_LEN);
	}

	memcpy((cardp->bulk_out_buffer + MESSAGE_HEADER_LEN), payload, nb);

780
	return usb_tx_block(cardp, cardp->bulk_out_buffer,
781
	                    nb + MESSAGE_HEADER_LEN);
782 783
}

784
/* called with priv->driver_lock held */
785
static int if_usb_get_int_status(struct lbs_private *priv, u8 *ireg)
786
{
787
	struct usb_card_rec *cardp = priv->card;
788 789 790 791

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

792
	lbs_deb_usbd(&cardp->udev->dev,"Int cause is 0x%X\n", *ireg);
793 794 795 796

	return 0;
}

797
static int if_usb_read_event_cause(struct lbs_private *priv)
798
{
799
	struct usb_card_rec *cardp = priv->card;
800

801
	priv->eventcause = cardp->usb_event_cause;
802
	/* Re-submit rx urb here to avoid event lost issue */
803
	if_usb_submit_rx_urb(cardp);
804 805 806
	return 0;
}

807 808 809 810 811 812
/**
 *  @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
 */
813
static int if_usb_issue_boot_command(struct usb_card_rec *cardp, int ivalue)
814
{
815
	struct bootcmdstr sbootcmd;
816 817 818 819 820 821 822 823 824 825
	int i;

	/* Prepare command */
	sbootcmd.u32magicnumber = cpu_to_le32(BOOT_CMD_MAGIC_NUMBER);
	sbootcmd.u8cmd_tag = ivalue;
	for (i=0; i<11; i++)
		sbootcmd.au8dumy[i]=0x00;
	memcpy(cardp->bulk_out_buffer, &sbootcmd, sizeof(struct bootcmdstr));

	/* Issue command */
826
	usb_tx_block(cardp, cardp->bulk_out_buffer, sizeof(struct bootcmdstr));
827 828 829

	return 0;
}
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 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880
/**
 *  @brief This function checks the validity of Boot2/FW image.
 *
 *  @param data              pointer to image
 *         len               image length
 *  @return     0 or -1
 */
static int check_fwfile_format(u8 *data, u32 totlen)
{
	u32 bincmd, exit;
	u32 blksize, offset, len;
	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;
}


static int if_usb_prog_firmware(struct usb_card_rec *cardp)
881 882 883
{
	int i = 0;
	static int reset_count = 10;
884
	int ret = 0;
885

886
	lbs_deb_enter(LBS_DEB_USB);
887

888
	if ((ret = request_firmware(&cardp->fw, lbs_fw_name,
889 890
				    &cardp->udev->dev)) < 0) {
		lbs_pr_err("request_firmware() failed with %#x\n", ret);
891
		lbs_pr_err("firmware %s not found\n", lbs_fw_name);
892 893 894 895 896
		goto done;
	}

	if (check_fwfile_format(cardp->fw->data, cardp->fw->size))
		goto release_fw;
897 898

restart:
899
	if (if_usb_submit_rx_urb_fwload(cardp) < 0) {
900 901
		lbs_deb_usbd(&cardp->udev->dev, "URB submission is failed\n");
		ret = -1;
902
		goto release_fw;
903 904 905 906 907 908 909
	}

	cardp->bootcmdresp = 0;
	do {
		int j = 0;
		i++;
		/* Issue Boot command = 1, Boot from Download-FW */
910
		if_usb_issue_boot_command(cardp, BOOT_CMD_FW_BY_USB);
911 912 913 914 915 916 917
		/* wait for command response */
		do {
			j++;
			msleep_interruptible(100);
		} while (cardp->bootcmdresp == 0 && j < 10);
	} while (cardp->bootcmdresp == 0 && i < 5);

918
	if (cardp->bootcmdresp <= 0) {
919
		if (--reset_count >= 0) {
920
			if_usb_reset_device(cardp);
921 922 923 924 925 926 927 928 929 930 931 932 933 934 935
			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;

936 937
	/* Send the first firmware packet... */
	if_usb_send_fw_pkt(cardp);
938

939 940 941 942
	/* ... and wait for the process to complete */
	wait_event_interruptible(cardp->fw_wq, cardp->surprise_removed || cardp->fwdnldover);
	
	del_timer_sync(&cardp->fw_timeout);
943
	usb_kill_urb(cardp->rx_urb);
944 945 946 947

	if (!cardp->fwdnldover) {
		lbs_pr_info("failed to load fw, resetting device!\n");
		if (--reset_count >= 0) {
948
			if_usb_reset_device(cardp);
949 950 951 952
			goto restart;
		}

		lbs_pr_info("FW download failure, time = %d ms\n", i * 100);
953
		ret = -1;
954
		goto release_fw;
955 956
	}

957 958 959
release_fw:
	release_firmware(cardp->fw);
	cardp->fw = NULL;
960

961 962 963
done:
	lbs_deb_leave_args(LBS_DEB_USB, "ret %d", ret);
	return ret;
964 965
}

H
Holger Schurig 已提交
966

967 968 969 970
#ifdef CONFIG_PM
static int if_usb_suspend(struct usb_interface *intf, pm_message_t message)
{
	struct usb_card_rec *cardp = usb_get_intfdata(intf);
971
	struct lbs_private *priv = cardp->priv;
972

973
	lbs_deb_enter(LBS_DEB_USB);
974

975
	if (priv->psstate != PS_STATE_FULL_POWER)
976 977
		return -1;

978
	netif_device_detach(priv->dev);
979
	netif_device_detach(priv->mesh_dev);
980 981 982 983 984

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

985
	lbs_deb_leave(LBS_DEB_USB);
986 987 988 989 990 991
	return 0;
}

static int if_usb_resume(struct usb_interface *intf)
{
	struct usb_card_rec *cardp = usb_get_intfdata(intf);
992
	struct lbs_private *priv = cardp->priv;
993

994
	lbs_deb_enter(LBS_DEB_USB);
995

996
	if_usb_submit_rx_urb(cardp);
997

998
	netif_device_attach(priv->dev);
999
	netif_device_attach(priv->mesh_dev);
1000

1001
	lbs_deb_leave(LBS_DEB_USB);
1002 1003 1004 1005 1006 1007 1008 1009
	return 0;
}
#else
#define if_usb_suspend NULL
#define if_usb_resume NULL
#endif

static struct usb_driver if_usb_driver = {
1010
	.name = DRV_NAME,
1011 1012 1013 1014 1015 1016 1017
	.probe = if_usb_probe,
	.disconnect = if_usb_disconnect,
	.id_table = if_usb_table,
	.suspend = if_usb_suspend,
	.resume = if_usb_resume,
};

1018
static int __init if_usb_init_module(void)
1019
{
1020
	int ret = 0;
1021

1022 1023 1024 1025 1026 1027
	lbs_deb_enter(LBS_DEB_MAIN);

	ret = usb_register(&if_usb_driver);

	lbs_deb_leave_args(LBS_DEB_MAIN, "ret %d", ret);
	return ret;
1028 1029
}

1030
static void __exit if_usb_exit_module(void)
1031
{
1032 1033
	lbs_deb_enter(LBS_DEB_MAIN);

1034
	usb_deregister(&if_usb_driver);
1035 1036

	lbs_deb_leave(LBS_DEB_MAIN);
1037
}
1038 1039 1040 1041 1042 1043 1044

module_init(if_usb_init_module);
module_exit(if_usb_exit_module);

MODULE_DESCRIPTION("8388 USB WLAN Driver");
MODULE_AUTHOR("Marvell International Ltd.");
MODULE_LICENSE("GPL");