if_usb.c 25.0 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 16 17 18 19
#include "host.h"
#include "decl.h"
#include "defs.h"
#include "dev.h"
#include "if_usb.h"

#define MESSAGE_HEADER_LEN	4

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

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

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

	/* handle the transmission complete validations */

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

60 61 62
		/*
		lbs_deb_usbd(&urb->dev->dev, "URB status is successfull\n");
		lbs_deb_usbd(&urb->dev->dev, "Actual length transmitted %d\n",
63
		       urb->actual_length);
64
		*/
65 66 67 68

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

	return;
}

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

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

101
	lbs_deb_leave(LBS_DEB_USB);
102 103 104 105 106 107 108 109 110 111 112 113 114 115
}

/**
 *  @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;
116
	struct lbs_private *priv;
117
	struct usb_card_rec *cardp;
118 119 120 121
	int i;

	udev = interface_to_usbdev(intf);

122 123
	cardp = kzalloc(sizeof(struct usb_card_rec), GFP_KERNEL);
	if (!cardp) {
124 125 126 127
		lbs_pr_err("Out of memory allocating private data.\n");
		goto error;
	}

128
	cardp->udev = udev;
129 130
	iface_desc = intf->cur_altsetting;

131
	lbs_deb_usbd(&udev->dev, "bcdUSB = 0x%X bDeviceClass = 0x%X"
132
	       " bDeviceSubClass = 0x%X, bDeviceProtocol = 0x%X\n",
133 134 135 136
		     le16_to_cpu(udev->descriptor.bcdUSB),
		     udev->descriptor.bDeviceClass,
		     udev->descriptor.bDeviceSubClass,
		     udev->descriptor.bDeviceProtocol);
137 138 139 140 141 142 143

	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 */
144
			lbs_deb_usbd(&udev->dev, "Bulk in size is %d\n",
145 146
				     le16_to_cpu(endpoint->wMaxPacketSize));
			if (!(cardp->rx_urb = usb_alloc_urb(0, GFP_KERNEL))) {
147
				lbs_deb_usbd(&udev->dev,
148 149 150
				       "Rx URB allocation failed\n");
				goto dealloc;
			}
151
			cardp->rx_urb_recall = 0;
152

153
			cardp->bulk_in_size =
154
				le16_to_cpu(endpoint->wMaxPacketSize);
155
			cardp->bulk_in_endpointAddr =
156 157
			    (endpoint->
			     bEndpointAddress & USB_ENDPOINT_NUMBER_MASK);
158
			lbs_deb_usbd(&udev->dev, "in_endpoint = %d\n",
159 160 161 162 163 164 165 166 167
			       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 */
168
			if (!(cardp->tx_urb = usb_alloc_urb(0, GFP_KERNEL))) {
169
				lbs_deb_usbd(&udev->dev,
170 171 172 173
				       "Tx URB allocation failed\n");
				goto dealloc;
			}

174
			cardp->bulk_out_size =
175
				le16_to_cpu(endpoint->wMaxPacketSize);
176
			lbs_deb_usbd(&udev->dev,
177 178
				     "Bulk out size is %d\n",
				     le16_to_cpu(endpoint->wMaxPacketSize));
179
			cardp->bulk_out_endpointAddr =
180
			    endpoint->bEndpointAddress;
181
			lbs_deb_usbd(&udev->dev, "out_endpoint = %d\n",
182
				    endpoint->bEndpointAddress);
183
			cardp->bulk_out_buffer =
184 185 186
			    kmalloc(MRVDRV_ETH_TX_PACKET_BUFFER_SIZE,
				    GFP_KERNEL);

187
			if (!cardp->bulk_out_buffer) {
188
				lbs_deb_usbd(&udev->dev,
189 190 191 192 193 194
				       "Could not allocate buffer\n");
				goto dealloc;
			}
		}
	}

195 196 197 198 199 200 201
	/* Upload firmware */
	cardp->rinfo.cardp = cardp;
	if (if_usb_prog_firmware(cardp)) {
		lbs_deb_usbd(&udev->dev, "FW upload failed");
		goto err_prog_firmware;
	}

202
	if (!(priv = lbs_add_card(cardp, &udev->dev)))
203
		goto err_prog_firmware;
204

205
	cardp->priv = priv;
206

207
	if (lbs_add_mesh(priv, &udev->dev))
208
		goto err_add_mesh;
209

210 211
	cardp->eth_dev = priv->dev;

212 213 214
	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;
215
	priv->boot2_version = udev->descriptor.bcdDevice;
216

217 218 219 220 221
	/* Delay 200 ms to waiting for the FW ready */
	if_usb_submit_rx_urb(cardp);
	msleep_interruptible(200);
	priv->adapter->fw_ready = 1;

222
	if (lbs_start_card(priv))
223
		goto err_start_card;
224

225
	usb_get_dev(udev);
226
	usb_set_intfdata(intf, cardp);
227 228 229

	return 0;

230
err_start_card:
231
	lbs_remove_mesh(priv);
232
err_add_mesh:
233
	lbs_remove_card(priv);
234 235
err_prog_firmware:
	if_usb_reset_device(cardp);
236
dealloc:
237
	if_usb_free(cardp);
238 239 240 241 242 243 244

error:
	return -ENOMEM;
}

/**
 *  @brief free resource and cleanup
245
 *  @param intf		USB interface structure
246 247 248 249 250
 *  @return 	   	N/A
 */
static void if_usb_disconnect(struct usb_interface *intf)
{
	struct usb_card_rec *cardp = usb_get_intfdata(intf);
251
	struct lbs_private *priv = (struct lbs_private *) cardp->priv;
252

253
	lbs_deb_enter(LBS_DEB_MAIN);
254

255 256
	/* Update Surprise removed to TRUE */
	cardp->surprise_removed = 1;
257

258
	if (priv) {
259
		struct lbs_adapter *adapter = priv->adapter;
260 261

		adapter->surpriseremoved = 1;
262 263 264
		lbs_stop_card(priv);
		lbs_remove_mesh(priv);
		lbs_remove_card(priv);
265
	}
266

267 268 269 270
	/* 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);

271 272 273 274 275 276
	/* Unlink and free urb */
	if_usb_free(cardp);

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

277
	lbs_deb_leave(LBS_DEB_MAIN);
278 279 280 281
}

/**
 *  @brief  This function download FW
282
 *  @param priv		pointer to struct lbs_private
283 284
 *  @return 	   	0
 */
285
static int if_prog_firmware(struct usb_card_rec *cardp)
286 287 288
{
	struct FWData *fwdata;
	struct fwheader *fwheader;
289
	u8 *firmware = cardp->fw->data;
290 291 292 293 294 295 296 297 298 299 300 301 302

	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;
	}

303 304
	/*
	lbs_deb_usbd(&cardp->udev->dev, "totalbytes = %d\n",
305
		    cardp->totalbytes);
306
	*/
307 308 309 310 311 312 313

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

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

314
	/* lbs_deb_usbd(&cardp->udev->dev,"Copy Data\n"); */
315
	memcpy(fwdata->data, &firmware[cardp->totalbytes],
316
	       le32_to_cpu(fwdata->fwheader.datalength));
317

318 319
	/*
	lbs_deb_usbd(&cardp->udev->dev,
320
		    "Data length = %d\n", le32_to_cpu(fwdata->fwheader.datalength));
321
	*/
322 323 324

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

325 326 327
	fwdata->seqnum = cpu_to_le32(cardp->fwseqnum);
	cardp->lastseqnum = cardp->fwseqnum;
	cardp->totalbytes += le32_to_cpu(fwdata->fwheader.datalength);
328

329
	if (fwheader->dnldcmd == cpu_to_le32(FW_HAS_DATA_TO_RECV)) {
330
		/*
331
		lbs_deb_usbd(&cardp->udev->dev, "There are data to follow\n");
332
		lbs_deb_usbd(&cardp->udev->dev,
333 334
			    "seqnum = %d totalbytes = %d\n", cardp->fwseqnum,
			    cardp->totalbytes);
335
		*/
336
		memcpy(cardp->bulk_out_buffer, fwheader, FW_DATA_XMIT_SIZE);
337
		usb_tx_block(cardp, cardp->bulk_out_buffer, FW_DATA_XMIT_SIZE);
338

339
	} else if (fwdata->fwheader.dnldcmd == cpu_to_le32(FW_HAS_LAST_BLOCK)) {
340 341
		/*
		lbs_deb_usbd(&cardp->udev->dev,
342
			    "Host has finished FW downloading\n");
343
		lbs_deb_usbd(&cardp->udev->dev,
344
			    "Donwloading FW JUMP BLOCK\n");
345
		*/
346
		memcpy(cardp->bulk_out_buffer, fwheader, FW_DATA_XMIT_SIZE);
347
		usb_tx_block(cardp, cardp->bulk_out_buffer, FW_DATA_XMIT_SIZE);
348 349 350
		cardp->fwfinalblk = 1;
	}

351 352
	/*
	lbs_deb_usbd(&cardp->udev->dev,
353 354
		    "The firmware download is done size is %d\n",
		    cardp->totalbytes);
355
	*/
356 357 358 359 360 361

	kfree(fwdata);

	return 0;
}

362
static int if_usb_reset_device(struct usb_card_rec *cardp)
363 364
{
	int ret;
365
	struct lbs_private *priv = cardp->priv;
366

367 368
	lbs_deb_enter(LBS_DEB_USB);

369 370 371
	/* Try a USB port reset first, if that fails send the reset
	 * command to the firmware.
	 */
372
	ret = usb_reset_device(cardp->udev);
373
	if (!ret && priv) {
374
		msleep(10);
375
		ret = lbs_reset_device(priv);
376 377
		msleep(10);
	}
378 379 380

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

381 382 383 384 385
	return ret;
}

/**
 *  @brief This function transfer the data to the device.
386
 *  @param priv 	pointer to struct lbs_private
387 388 389 390
 *  @param payload	pointer to payload data
 *  @param nb		data length
 *  @return 	   	0 or -1
 */
391
static int usb_tx_block(struct usb_card_rec *cardp, u8 * payload, u16 nb)
392 393 394 395
{
	int ret = -1;

	/* check if device is removed */
396
	if (cardp->surprise_removed) {
397
		lbs_deb_usbd(&cardp->udev->dev, "Device removed\n");
398 399 400 401 402 403
		goto tx_ret;
	}

	usb_fill_bulk_urb(cardp->tx_urb, cardp->udev,
			  usb_sndbulkpipe(cardp->udev,
					  cardp->bulk_out_endpointAddr),
404
			  payload, nb, if_usb_write_bulk_callback, cardp);
405 406 407 408 409

	cardp->tx_urb->transfer_flags |= URB_ZERO_PACKET;

	if ((ret = usb_submit_urb(cardp->tx_urb, GFP_ATOMIC))) {
		/*  transfer failed */
410
		lbs_deb_usbd(&cardp->udev->dev, "usb_submit_urb failed\n");
411 412
		ret = -1;
	} else {
413
		/* lbs_deb_usbd(&cardp->udev->dev, "usb_submit_urb success\n"); */
414 415 416 417 418 419 420
		ret = 0;
	}

tx_ret:
	return ret;
}

421 422
static int __if_usb_submit_rx_urb(struct usb_card_rec *cardp,
				  void (*callbackfn)(struct urb *urb))
423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438
{
	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 已提交
439
			  (void *) (skb->tail + (size_t) IPFIELD_ALIGN_OFFSET),
440 441 442 443 444
			  MRVDRV_ETH_RX_PACKET_BUFFER_SIZE, callbackfn,
			  rinfo);

	cardp->rx_urb->transfer_flags |= URB_ZERO_PACKET;

445
	/* lbs_deb_usbd(&cardp->udev->dev, "Pointer for rx_urb %p\n", cardp->rx_urb); */
446 447
	if ((ret = usb_submit_urb(cardp->rx_urb, GFP_ATOMIC))) {
		/* handle failure conditions */
448
		lbs_deb_usbd(&cardp->udev->dev, "Submit Rx URB failed\n");
449 450
		kfree_skb(skb);
		rinfo->skb = NULL;
451 452
		ret = -1;
	} else {
453
		/* lbs_deb_usbd(&cardp->udev->dev, "Submit Rx URB success\n"); */
454 455 456 457 458 459 460
		ret = 0;
	}

rx_ret:
	return ret;
}

461
static int if_usb_submit_rx_urb_fwload(struct usb_card_rec *cardp)
462
{
463
	return __if_usb_submit_rx_urb(cardp, &if_usb_receive_fwload);
464 465
}

466
static int if_usb_submit_rx_urb(struct usb_card_rec *cardp)
467
{
468
	return __if_usb_submit_rx_urb(cardp, &if_usb_receive);
469 470 471 472 473 474
}

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;
475
	struct usb_card_rec *cardp = (struct usb_card_rec *)rinfo->cardp;
476 477 478 479
	struct fwsyncheader *syncfwheader;
	struct bootcmdrespStr bootcmdresp;

	if (urb->status) {
480
		lbs_deb_usbd(&cardp->udev->dev,
481 482 483 484 485 486 487 488
			    "URB status is failed during fw load\n");
		kfree_skb(skb);
		return;
	}

	if (cardp->bootcmdresp == 0) {
		memcpy (&bootcmdresp, skb->data + IPFIELD_ALIGN_OFFSET,
			sizeof(bootcmdresp));
489
		if (le16_to_cpu(cardp->udev->descriptor.bcdDevice) < 0x3106) {
490
			kfree_skb(skb);
491
			if_usb_submit_rx_urb_fwload(cardp);
492
			cardp->bootcmdresp = 1;
493
			lbs_deb_usbd(&cardp->udev->dev,
494 495 496
				    "Received valid boot command response\n");
			return;
		}
497
		if (bootcmdresp.u32magicnumber != cpu_to_le32(BOOT_CMD_MAGIC_NUMBER)) {
498 499
			lbs_pr_info(
				"boot cmd response wrong magic number (0x%x)\n",
500
				le32_to_cpu(bootcmdresp.u32magicnumber));
501 502 503 504 505 506 507 508 509 510
		} 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;
511
			lbs_deb_usbd(&cardp->udev->dev,
512 513 514
				    "Received valid boot command response\n");
		}
		kfree_skb(skb);
515
		if_usb_submit_rx_urb_fwload(cardp);
516 517 518 519 520
		return;
	}

	syncfwheader = kmalloc(sizeof(struct fwsyncheader), GFP_ATOMIC);
	if (!syncfwheader) {
521
		lbs_deb_usbd(&cardp->udev->dev, "Failure to allocate syncfwheader\n");
522 523 524 525 526 527 528 529
		kfree_skb(skb);
		return;
	}

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

	if (!syncfwheader->cmd) {
530 531
		/*
		lbs_deb_usbd(&cardp->udev->dev,
532
			    "FW received Blk with correct CRC\n");
533
		lbs_deb_usbd(&cardp->udev->dev,
534 535
			    "FW received Blk seqnum = %d\n",
		       syncfwheader->seqnum);
536
		*/
537 538
		cardp->CRC_OK = 1;
	} else {
539
		lbs_deb_usbd(&cardp->udev->dev,
540 541 542 543 544 545 546 547 548 549 550
			    "FW received Blk with CRC error\n");
		cardp->CRC_OK = 0;
	}

	kfree_skb(skb);

	if (cardp->fwfinalblk) {
		cardp->fwdnldover = 1;
		goto exit;
	}

551
	if_prog_firmware(cardp);
552

553
	if_usb_submit_rx_urb_fwload(cardp);
554 555 556 557 558 559 560 561 562 563 564
exit:
	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,
565
				       struct lbs_private *priv)
566 567 568
{
	if (recvlength > MRVDRV_ETH_RX_PACKET_BUFFER_SIZE +
	    MESSAGE_HEADER_LEN || recvlength < MRVDRV_MIN_PKT_LEN) {
569
		lbs_deb_usbd(&cardp->udev->dev,
570 571 572 573 574 575 576 577
			    "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);
578
	lbs_process_rxed_packet(priv, skb);
579
	priv->upld_len = (recvlength - MESSAGE_HEADER_LEN);
580 581 582 583 584
}

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

	if (!in_interrupt())
		BUG();

	spin_lock(&priv->adapter->driver_lock);
	/* take care of cur_cmd = NULL case by reading the
	 * data to clear the interrupt */
	if (!priv->adapter->cur_cmd) {
602
		cmdbuf = priv->upld_buf;
603
		priv->adapter->hisregcpy &= ~MRVDRV_CMD_UPLD_RDY;
604 605 606
	} else
		cmdbuf = priv->adapter->cur_cmd->bufvirtualaddr;

607
	cardp->usb_int_cause |= MRVDRV_CMD_UPLD_RDY;
608
	priv->upld_len = (recvlength - MESSAGE_HEADER_LEN);
609
	memcpy(cmdbuf, recvbuff + MESSAGE_HEADER_LEN,
610
	       priv->upld_len);
611 612

	kfree_skb(skb);
613
	lbs_interrupt(priv->dev);
614 615
	spin_unlock(&priv->adapter->driver_lock);

616
	lbs_deb_usbd(&cardp->udev->dev,
617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632
		    "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;
633
	struct usb_card_rec *cardp = (struct usb_card_rec *) rinfo->cardp;
634
	struct lbs_private *priv = cardp->priv;
635 636 637

	int recvlength = urb->actual_length;
	u8 *recvbuff = NULL;
638
	u32 recvtype = 0;
639

640
	lbs_deb_enter(LBS_DEB_USB);
641 642

	if (recvlength) {
643 644
		__le32 tmp;

645
		if (urb->status) {
646
			lbs_deb_usbd(&cardp->udev->dev,
647 648 649 650 651 652
				    "URB status is failed\n");
			kfree_skb(skb);
			goto setup_for_next;
		}

		recvbuff = skb->data + IPFIELD_ALIGN_OFFSET;
653 654
		memcpy(&tmp, recvbuff, sizeof(u32));
		recvtype = le32_to_cpu(tmp);
655
		lbs_deb_usbd(&cardp->udev->dev,
656 657
			    "Recv length = 0x%x, Recv type = 0x%X\n",
			    recvlength, recvtype);
658 659
	} else if (urb->status) {
		kfree_skb(skb);
660
		goto rx_exit;
661
	}
662 663 664 665 666 667 668 669 670 671 672 673 674

	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 */
		spin_lock(&priv->adapter->driver_lock);
675
		cardp->usb_event_cause = le32_to_cpu(*(__le32 *) (recvbuff + MESSAGE_HEADER_LEN));
676
		lbs_deb_usbd(&cardp->udev->dev,"**EVENT** 0x%X\n",
677 678
			    cardp->usb_event_cause);
		if (cardp->usb_event_cause & 0xffff0000) {
679
			lbs_send_tx_feedback(priv);
680
			spin_unlock(&priv->adapter->driver_lock);
681 682
			break;
		}
683
		cardp->usb_event_cause <<= 3;
684
		cardp->usb_int_cause |= MRVDRV_CARDEVENT;
685
		kfree_skb(skb);
686
		lbs_interrupt(priv->dev);
687 688 689
		spin_unlock(&priv->adapter->driver_lock);
		goto rx_exit;
	default:
690 691
		lbs_deb_usbd(&cardp->udev->dev, "Unknown command type 0x%X\n",
		             recvtype);
692 693 694 695 696
		kfree_skb(skb);
		break;
	}

setup_for_next:
697
	if_usb_submit_rx_urb(cardp);
698
rx_exit:
699
	lbs_deb_leave(LBS_DEB_USB);
700 701 702 703
}

/**
 *  @brief This function downloads data to FW
704
 *  @param priv		pointer to struct lbs_private structure
705 706 707 708 709
 *  @param type		type of data
 *  @param buf		pointer to data buffer
 *  @param len		number of bytes
 *  @return 	   	0 or -1
 */
710 711 712 713
static int if_usb_host_to_card(struct lbs_private *priv,
	u8 type,
	u8 *payload,
	u16 nb)
714
{
715
	struct usb_card_rec *cardp = (struct usb_card_rec *)priv->card;
716

717 718
	lbs_deb_usbd(&cardp->udev->dev,"*** type = %u\n", type);
	lbs_deb_usbd(&cardp->udev->dev,"size after = %d\n", nb);
719 720

	if (type == MVMS_CMD) {
721
		__le32 tmp = cpu_to_le32(CMD_TYPE_REQUEST);
722
		priv->dnld_sent = DNLD_CMD_SENT;
723 724 725 726
		memcpy(cardp->bulk_out_buffer, (u8 *) & tmp,
		       MESSAGE_HEADER_LEN);

	} else {
727
		__le32 tmp = cpu_to_le32(CMD_TYPE_DATA);
728
		priv->dnld_sent = DNLD_DATA_SENT;
729 730 731 732 733 734
		memcpy(cardp->bulk_out_buffer, (u8 *) & tmp,
		       MESSAGE_HEADER_LEN);
	}

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

735
	return usb_tx_block(cardp, cardp->bulk_out_buffer,
736
	                    nb + MESSAGE_HEADER_LEN);
737 738 739
}

/* called with adapter->driver_lock held */
740
static int if_usb_get_int_status(struct lbs_private *priv, u8 *ireg)
741
{
742
	struct usb_card_rec *cardp = priv->card;
743 744 745 746

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

747
	lbs_deb_usbd(&cardp->udev->dev,"Int cause is 0x%X\n", *ireg);
748 749 750 751

	return 0;
}

752
static int if_usb_read_event_cause(struct lbs_private *priv)
753
{
754
	struct usb_card_rec *cardp = priv->card;
755

756 757
	priv->adapter->eventcause = cardp->usb_event_cause;
	/* Re-submit rx urb here to avoid event lost issue */
758
	if_usb_submit_rx_urb(cardp);
759 760 761
	return 0;
}

762 763 764 765 766 767
/**
 *  @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
 */
768
static int if_usb_issue_boot_command(struct usb_card_rec *cardp, int ivalue)
769
{
770
	struct bootcmdstr sbootcmd;
771 772 773 774 775 776 777 778 779 780
	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 */
781
	usb_tx_block(cardp, cardp->bulk_out_buffer, sizeof(struct bootcmdstr));
782 783 784

	return 0;
}
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 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835
/**
 *  @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)
836 837 838
{
	int i = 0;
	static int reset_count = 10;
839
	int ret = 0;
840

841
	lbs_deb_enter(LBS_DEB_USB);
842

843
	if ((ret = request_firmware(&cardp->fw, lbs_fw_name,
844 845
				    &cardp->udev->dev)) < 0) {
		lbs_pr_err("request_firmware() failed with %#x\n", ret);
846
		lbs_pr_err("firmware %s not found\n", lbs_fw_name);
847 848 849 850 851
		goto done;
	}

	if (check_fwfile_format(cardp->fw->data, cardp->fw->size))
		goto release_fw;
852 853

restart:
854
	if (if_usb_submit_rx_urb_fwload(cardp) < 0) {
855 856
		lbs_deb_usbd(&cardp->udev->dev, "URB submission is failed\n");
		ret = -1;
857
		goto release_fw;
858 859 860 861 862 863 864
	}

	cardp->bootcmdresp = 0;
	do {
		int j = 0;
		i++;
		/* Issue Boot command = 1, Boot from Download-FW */
865
		if_usb_issue_boot_command(cardp, BOOT_CMD_FW_BY_USB);
866 867 868 869 870 871 872 873 874
		/* wait for command response */
		do {
			j++;
			msleep_interruptible(100);
		} while (cardp->bootcmdresp == 0 && j < 10);
	} while (cardp->bootcmdresp == 0 && i < 5);

	if (cardp->bootcmdresp == 0) {
		if (--reset_count >= 0) {
875
			if_usb_reset_device(cardp);
876 877 878 879 880 881 882 883 884 885 886 887 888 889 890
			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;

891
	if_prog_firmware(cardp);
892 893

	do {
894
		lbs_deb_usbd(&cardp->udev->dev,"Wlan sched timeout\n");
895 896
		i++;
		msleep_interruptible(100);
897
		if (cardp->surprise_removed || i >= 20)
898 899 900 901 902 903
			break;
	} while (!cardp->fwdnldover);

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

		lbs_pr_info("FW download failure, time = %d ms\n", i * 100);
909
		ret = -1;
910
		goto release_fw;
911 912
	}

913 914 915
release_fw:
	release_firmware(cardp->fw);
	cardp->fw = NULL;
916

917 918 919
done:
	lbs_deb_leave_args(LBS_DEB_USB, "ret %d", ret);
	return ret;
920 921
}

H
Holger Schurig 已提交
922

923 924 925 926
#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);
927
	struct lbs_private *priv = cardp->priv;
928

929
	lbs_deb_enter(LBS_DEB_USB);
930 931 932 933

	if (priv->adapter->psstate != PS_STATE_FULL_POWER)
		return -1;

934 935 936 937 938 939 940
	if (priv->mesh_dev && !priv->mesh_autostart_enabled) {
		/* Mesh autostart must be activated while sleeping
		 * On resume it will go back to the current state
		 */
		struct cmd_ds_mesh_access mesh_access;
		memset(&mesh_access, 0, sizeof(mesh_access));
		mesh_access.data[0] = cpu_to_le32(1);
941
		lbs_prepare_and_send_command(priv,
942 943 944 945 946
				CMD_MESH_ACCESS,
				CMD_ACT_MESH_SET_AUTOSTART_ENABLED,
				CMD_OPTION_WAITFORRSP, 0, (void *)&mesh_access);
	}

947
	netif_device_detach(cardp->eth_dev);
948
	netif_device_detach(priv->mesh_dev);
949 950 951 952 953 954 955

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

	cardp->rx_urb_recall = 1;

956
	lbs_deb_leave(LBS_DEB_USB);
957 958 959 960 961 962
	return 0;
}

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

965
	lbs_deb_enter(LBS_DEB_USB);
966 967 968 969 970 971

	cardp->rx_urb_recall = 0;

	if_usb_submit_rx_urb(cardp->priv);

	netif_device_attach(cardp->eth_dev);
972
	netif_device_attach(priv->mesh_dev);
973

974 975 976 977 978 979 980
	if (priv->mesh_dev && !priv->mesh_autostart_enabled) {
		/* Mesh autostart was activated while sleeping
		 * Disable it if appropriate
		 */
		struct cmd_ds_mesh_access mesh_access;
		memset(&mesh_access, 0, sizeof(mesh_access));
		mesh_access.data[0] = cpu_to_le32(0);
981
		lbs_prepare_and_send_command(priv,
982 983 984 985 986
				CMD_MESH_ACCESS,
				CMD_ACT_MESH_SET_AUTOSTART_ENABLED,
				CMD_OPTION_WAITFORRSP, 0, (void *)&mesh_access);
	}

987
	lbs_deb_leave(LBS_DEB_USB);
988 989 990 991 992 993 994 995
	return 0;
}
#else
#define if_usb_suspend NULL
#define if_usb_resume NULL
#endif

static struct usb_driver if_usb_driver = {
996
	.name = DRV_NAME,
997 998 999 1000 1001 1002 1003
	.probe = if_usb_probe,
	.disconnect = if_usb_disconnect,
	.id_table = if_usb_table,
	.suspend = if_usb_suspend,
	.resume = if_usb_resume,
};

1004
static int __init if_usb_init_module(void)
1005
{
1006
	int ret = 0;
1007

1008 1009 1010 1011 1012 1013
	lbs_deb_enter(LBS_DEB_MAIN);

	ret = usb_register(&if_usb_driver);

	lbs_deb_leave_args(LBS_DEB_MAIN, "ret %d", ret);
	return ret;
1014 1015
}

1016
static void __exit if_usb_exit_module(void)
1017
{
1018 1019
	lbs_deb_enter(LBS_DEB_MAIN);

1020
	usb_deregister(&if_usb_driver);
1021 1022

	lbs_deb_leave(LBS_DEB_MAIN);
1023
}
1024 1025 1026 1027 1028 1029 1030

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");