if_usb.c 25.9 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
#include <linux/firmware.h>
#include <linux/netdevice.h>
8
#include <linux/list.h>
9 10
#include <linux/usb.h>

11 12
#define DRV_NAME "usb8xxx"

13 14 15 16 17 18 19 20 21
#include "host.h"
#include "decl.h"
#include "defs.h"
#include "dev.h"
#include "if_usb.h"

#define MESSAGE_HEADER_LEN	4

static const char usbdriver_name[] = "usb8xxx";
22 23
static u8 *default_fw_name = "usb8388.bin";

24 25
static char *lbs_fw_name;
module_param_named(fw_name, lbs_fw_name, charp, 0644);
26

27 28 29 30 31 32 33 34
/*
 * We need to send a RESET command to all USB devices before
 * we tear down the USB connection. Otherwise we would not
 * be able to re-init device the device if the module gets
 * loaded again. This is a list of all initialized USB devices,
 * for the reset code see if_usb_reset_device()
*/
static LIST_HEAD(usb_devices);
35

36 37
static struct usb_device_id if_usb_table[] = {
	/* Enter the device signature inside */
38 39
	{ USB_DEVICE(0x1286, 0x2001) },
	{ USB_DEVICE(0x05a3, 0x8388) },
40 41 42 43 44 45 46
	{}	/* 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);
47
static int if_usb_prog_firmware(struct usb_card_rec *cardp);
48 49 50
static int if_usb_host_to_card(lbs_private *priv, u8 type, u8 *payload, u16 nb);
static int if_usb_get_int_status(lbs_private *priv, u8 *);
static int if_usb_read_event_cause(lbs_private *);
51
static int usb_tx_block(struct usb_card_rec *cardp, u8 *payload, u16 nb);
52
static void if_usb_free(struct usb_card_rec *cardp);
53 54
static int if_usb_submit_rx_urb(struct usb_card_rec *cardp);
static int if_usb_reset_device(struct usb_card_rec *cardp);
55 56 57 58 59 60 61 62

/**
 *  @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)
{
63
	struct usb_card_rec *cardp = (struct usb_card_rec *) urb->context;
64 65 66

	/* handle the transmission complete validations */

67
	if (urb->status == 0) {
68
		lbs_private *priv = cardp->priv;
69

70 71 72
		/*
		lbs_deb_usbd(&urb->dev->dev, "URB status is successfull\n");
		lbs_deb_usbd(&urb->dev->dev, "Actual length transmitted %d\n",
73
		       urb->actual_length);
74
		*/
75 76 77 78 79

		/* Used for both firmware TX and regular TX.  priv isn't
		 * valid at firmware load time.
		 */
		if (priv) {
80
			lbs_adapter *adapter = priv->adapter;
81 82 83 84 85 86 87 88
			struct net_device *dev = priv->dev;

			priv->dnld_sent = DNLD_RES_RECEIVED;

			/* Wake main thread if commands are pending */
			if (!adapter->cur_cmd)
				wake_up_interruptible(&priv->waitq);

89
			if ((adapter->connect_status == LBS_CONNECTED)) {
90 91 92
				netif_wake_queue(dev);
				netif_wake_queue(priv->mesh_dev);
			}
93
		}
94 95 96
	} else {
		/* print the failure status number for debug */
		lbs_pr_info("URB in failure status: %d\n", urb->status);
97 98 99 100 101 102 103 104 105 106
	}

	return;
}

/**
 *  @brief  free tx/rx urb, skb and rx buffer
 *  @param cardp	pointer usb_card_rec
 *  @return 	   	N/A
 */
107
static void if_usb_free(struct usb_card_rec *cardp)
108
{
109
	lbs_deb_enter(LBS_DEB_USB);
110 111 112 113 114 115 116 117 118 119 120 121 122 123

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

124
	lbs_deb_leave(LBS_DEB_USB);
125 126 127 128 129 130 131 132 133 134 135 136 137 138
}

/**
 *  @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;
139
	lbs_private *priv;
140
	struct usb_card_rec *cardp;
141 142 143 144
	int i;

	udev = interface_to_usbdev(intf);

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

151
	cardp->udev = udev;
152 153
	iface_desc = intf->cur_altsetting;

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

	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 */
167
			lbs_deb_usbd(&udev->dev, "Bulk in size is %d\n",
168 169
				     le16_to_cpu(endpoint->wMaxPacketSize));
			if (!(cardp->rx_urb = usb_alloc_urb(0, GFP_KERNEL))) {
170
				lbs_deb_usbd(&udev->dev,
171 172 173
				       "Rx URB allocation failed\n");
				goto dealloc;
			}
174
			cardp->rx_urb_recall = 0;
175

176
			cardp->bulk_in_size =
177
				le16_to_cpu(endpoint->wMaxPacketSize);
178
			cardp->bulk_in_endpointAddr =
179 180
			    (endpoint->
			     bEndpointAddress & USB_ENDPOINT_NUMBER_MASK);
181
			lbs_deb_usbd(&udev->dev, "in_endpoint = %d\n",
182 183 184 185 186 187 188 189 190
			       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 */
191
			if (!(cardp->tx_urb = usb_alloc_urb(0, GFP_KERNEL))) {
192
				lbs_deb_usbd(&udev->dev,
193 194 195 196
				       "Tx URB allocation failed\n");
				goto dealloc;
			}

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

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

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

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

228
	cardp->priv = priv;
229

230
	if (lbs_add_mesh(priv, &udev->dev))
231
		goto err_add_mesh;
232

233 234
	cardp->eth_dev = priv->dev;

235 236 237
	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;
238
	priv->boot2_version = udev->descriptor.bcdDevice;
239

240 241 242 243 244
	/* Delay 200 ms to waiting for the FW ready */
	if_usb_submit_rx_urb(cardp);
	msleep_interruptible(200);
	priv->adapter->fw_ready = 1;

245
	if (lbs_start_card(priv))
246
		goto err_start_card;
247

248
	list_add_tail(&cardp->list, &usb_devices);
249

250
	usb_get_dev(udev);
251
	usb_set_intfdata(intf, cardp);
252 253 254

	return 0;

255
err_start_card:
256
	lbs_remove_mesh(priv);
257
err_add_mesh:
258
	lbs_remove_card(priv);
259 260
err_prog_firmware:
	if_usb_reset_device(cardp);
261
dealloc:
262
	if_usb_free(cardp);
263 264 265 266 267 268 269

error:
	return -ENOMEM;
}

/**
 *  @brief free resource and cleanup
270
 *  @param intf		USB interface structure
271 272 273 274 275
 *  @return 	   	N/A
 */
static void if_usb_disconnect(struct usb_interface *intf)
{
	struct usb_card_rec *cardp = usb_get_intfdata(intf);
276
	lbs_private *priv = (lbs_private *) cardp->priv;
277

278
	lbs_deb_enter(LBS_DEB_MAIN);
279

280 281
	/* Update Surprise removed to TRUE */
	cardp->surprise_removed = 1;
282

283
	list_del(&cardp->list);
284

285
	if (priv) {
286
		lbs_adapter *adapter = priv->adapter;
287 288

		adapter->surpriseremoved = 1;
289 290 291
		lbs_stop_card(priv);
		lbs_remove_mesh(priv);
		lbs_remove_card(priv);
292
	}
293 294 295 296 297 298 299

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

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

300
	lbs_deb_leave(LBS_DEB_MAIN);
301 302 303 304
}

/**
 *  @brief  This function download FW
305
 *  @param priv		pointer to lbs_private
306 307
 *  @return 	   	0
 */
308
static int if_prog_firmware(struct usb_card_rec *cardp)
309 310 311
{
	struct FWData *fwdata;
	struct fwheader *fwheader;
312
	u8 *firmware = cardp->fw->data;
313 314 315 316 317 318 319 320 321 322 323 324 325

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

326 327
	/*
	lbs_deb_usbd(&cardp->udev->dev, "totalbytes = %d\n",
328
		    cardp->totalbytes);
329
	*/
330 331 332 333 334 335 336

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

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

337
	/* lbs_deb_usbd(&cardp->udev->dev,"Copy Data\n"); */
338
	memcpy(fwdata->data, &firmware[cardp->totalbytes],
339
	       le32_to_cpu(fwdata->fwheader.datalength));
340

341 342
	/*
	lbs_deb_usbd(&cardp->udev->dev,
343
		    "Data length = %d\n", le32_to_cpu(fwdata->fwheader.datalength));
344
	*/
345 346 347

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

348 349 350
	fwdata->seqnum = cpu_to_le32(cardp->fwseqnum);
	cardp->lastseqnum = cardp->fwseqnum;
	cardp->totalbytes += le32_to_cpu(fwdata->fwheader.datalength);
351

352
	if (fwheader->dnldcmd == cpu_to_le32(FW_HAS_DATA_TO_RECV)) {
353
		/*
354
		lbs_deb_usbd(&cardp->udev->dev, "There are data to follow\n");
355
		lbs_deb_usbd(&cardp->udev->dev,
356 357
			    "seqnum = %d totalbytes = %d\n", cardp->fwseqnum,
			    cardp->totalbytes);
358
		*/
359
		memcpy(cardp->bulk_out_buffer, fwheader, FW_DATA_XMIT_SIZE);
360
		usb_tx_block(cardp, cardp->bulk_out_buffer, FW_DATA_XMIT_SIZE);
361

362
	} else if (fwdata->fwheader.dnldcmd == cpu_to_le32(FW_HAS_LAST_BLOCK)) {
363 364
		/*
		lbs_deb_usbd(&cardp->udev->dev,
365
			    "Host has finished FW downloading\n");
366
		lbs_deb_usbd(&cardp->udev->dev,
367
			    "Donwloading FW JUMP BLOCK\n");
368
		*/
369
		memcpy(cardp->bulk_out_buffer, fwheader, FW_DATA_XMIT_SIZE);
370
		usb_tx_block(cardp, cardp->bulk_out_buffer, FW_DATA_XMIT_SIZE);
371 372 373
		cardp->fwfinalblk = 1;
	}

374 375
	/*
	lbs_deb_usbd(&cardp->udev->dev,
376 377
		    "The firmware download is done size is %d\n",
		    cardp->totalbytes);
378
	*/
379 380 381 382 383 384

	kfree(fwdata);

	return 0;
}

385
static int if_usb_reset_device(struct usb_card_rec *cardp)
386 387
{
	int ret;
388
	lbs_private * priv = cardp->priv;
389

390 391
	lbs_deb_enter(LBS_DEB_USB);

392 393 394
	/* Try a USB port reset first, if that fails send the reset
	 * command to the firmware.
	 */
395
	ret = usb_reset_device(cardp->udev);
396
	if (!ret && priv) {
397
		msleep(10);
398
		ret = lbs_reset_device(priv);
399 400
		msleep(10);
	}
401 402 403

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

404 405 406 407 408
	return ret;
}

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

	/* check if device is removed */
419
	if (cardp->surprise_removed) {
420
		lbs_deb_usbd(&cardp->udev->dev, "Device removed\n");
421 422 423 424 425 426
		goto tx_ret;
	}

	usb_fill_bulk_urb(cardp->tx_urb, cardp->udev,
			  usb_sndbulkpipe(cardp->udev,
					  cardp->bulk_out_endpointAddr),
427
			  payload, nb, if_usb_write_bulk_callback, cardp);
428 429 430 431 432

	cardp->tx_urb->transfer_flags |= URB_ZERO_PACKET;

	if ((ret = usb_submit_urb(cardp->tx_urb, GFP_ATOMIC))) {
		/*  transfer failed */
433
		lbs_deb_usbd(&cardp->udev->dev, "usb_submit_urb failed\n");
434 435
		ret = -1;
	} else {
436
		/* lbs_deb_usbd(&cardp->udev->dev, "usb_submit_urb success\n"); */
437 438 439 440 441 442 443
		ret = 0;
	}

tx_ret:
	return ret;
}

444 445
static int __if_usb_submit_rx_urb(struct usb_card_rec *cardp,
				  void (*callbackfn)(struct urb *urb))
446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461
{
	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 已提交
462
			  (void *) (skb->tail + (size_t) IPFIELD_ALIGN_OFFSET),
463 464 465 466 467
			  MRVDRV_ETH_RX_PACKET_BUFFER_SIZE, callbackfn,
			  rinfo);

	cardp->rx_urb->transfer_flags |= URB_ZERO_PACKET;

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

rx_ret:
	return ret;
}

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

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

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;
496
	struct usb_card_rec *cardp = (struct usb_card_rec *)rinfo->cardp;
497 498 499 500
	struct fwsyncheader *syncfwheader;
	struct bootcmdrespStr bootcmdresp;

	if (urb->status) {
501
		lbs_deb_usbd(&cardp->udev->dev,
502 503 504 505 506 507 508 509
			    "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));
510
		if (le16_to_cpu(cardp->udev->descriptor.bcdDevice) < 0x3106) {
511
			kfree_skb(skb);
512
			if_usb_submit_rx_urb_fwload(cardp);
513
			cardp->bootcmdresp = 1;
514
			lbs_deb_usbd(&cardp->udev->dev,
515 516 517
				    "Received valid boot command response\n");
			return;
		}
518
		if (bootcmdresp.u32magicnumber != cpu_to_le32(BOOT_CMD_MAGIC_NUMBER)) {
519 520
			lbs_pr_info(
				"boot cmd response wrong magic number (0x%x)\n",
521
				le32_to_cpu(bootcmdresp.u32magicnumber));
522 523 524 525 526 527 528 529 530 531
		} 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;
532
			lbs_deb_usbd(&cardp->udev->dev,
533 534 535
				    "Received valid boot command response\n");
		}
		kfree_skb(skb);
536
		if_usb_submit_rx_urb_fwload(cardp);
537 538 539 540 541
		return;
	}

	syncfwheader = kmalloc(sizeof(struct fwsyncheader), GFP_ATOMIC);
	if (!syncfwheader) {
542
		lbs_deb_usbd(&cardp->udev->dev, "Failure to allocate syncfwheader\n");
543 544 545 546 547 548 549 550
		kfree_skb(skb);
		return;
	}

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

	if (!syncfwheader->cmd) {
551 552
		/*
		lbs_deb_usbd(&cardp->udev->dev,
553
			    "FW received Blk with correct CRC\n");
554
		lbs_deb_usbd(&cardp->udev->dev,
555 556
			    "FW received Blk seqnum = %d\n",
		       syncfwheader->seqnum);
557
		*/
558 559
		cardp->CRC_OK = 1;
	} else {
560
		lbs_deb_usbd(&cardp->udev->dev,
561 562 563 564 565 566 567 568 569 570 571
			    "FW received Blk with CRC error\n");
		cardp->CRC_OK = 0;
	}

	kfree_skb(skb);

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

572
	if_prog_firmware(cardp);
573

574
	if_usb_submit_rx_urb_fwload(cardp);
575 576 577 578 579 580 581 582 583 584 585
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,
586
				       lbs_private *priv)
587 588 589
{
	if (recvlength > MRVDRV_ETH_RX_PACKET_BUFFER_SIZE +
	    MESSAGE_HEADER_LEN || recvlength < MRVDRV_MIN_PKT_LEN) {
590
		lbs_deb_usbd(&cardp->udev->dev,
591 592 593 594 595 596 597 598
			    "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);
599
	lbs_process_rxed_packet(priv, skb);
600
	priv->upld_len = (recvlength - MESSAGE_HEADER_LEN);
601 602 603 604 605
}

static inline void process_cmdrequest(int recvlength, u8 *recvbuff,
				      struct sk_buff *skb,
				      struct usb_card_rec *cardp,
606
				      lbs_private *priv)
607 608 609
{
	u8 *cmdbuf;
	if (recvlength > MRVDRV_SIZE_OF_CMD_BUFFER) {
610
		lbs_deb_usbd(&cardp->udev->dev,
611 612 613 614 615 616 617 618 619 620 621 622
			    "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) {
623
		cmdbuf = priv->upld_buf;
624
		priv->adapter->hisregcpy &= ~MRVDRV_CMD_UPLD_RDY;
625 626 627
	} else
		cmdbuf = priv->adapter->cur_cmd->bufvirtualaddr;

628
	cardp->usb_int_cause |= MRVDRV_CMD_UPLD_RDY;
629
	priv->upld_len = (recvlength - MESSAGE_HEADER_LEN);
630
	memcpy(cmdbuf, recvbuff + MESSAGE_HEADER_LEN,
631
	       priv->upld_len);
632 633

	kfree_skb(skb);
634
	lbs_interrupt(priv->dev);
635 636
	spin_unlock(&priv->adapter->driver_lock);

637
	lbs_deb_usbd(&cardp->udev->dev,
638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653
		    "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;
654
	struct usb_card_rec *cardp = (struct usb_card_rec *) rinfo->cardp;
655
	lbs_private * priv = cardp->priv;
656 657 658

	int recvlength = urb->actual_length;
	u8 *recvbuff = NULL;
659
	u32 recvtype = 0;
660

661
	lbs_deb_enter(LBS_DEB_USB);
662 663

	if (recvlength) {
664 665
		__le32 tmp;

666
		if (urb->status) {
667
			lbs_deb_usbd(&cardp->udev->dev,
668 669 670 671 672 673
				    "URB status is failed\n");
			kfree_skb(skb);
			goto setup_for_next;
		}

		recvbuff = skb->data + IPFIELD_ALIGN_OFFSET;
674 675
		memcpy(&tmp, recvbuff, sizeof(u32));
		recvtype = le32_to_cpu(tmp);
676
		lbs_deb_usbd(&cardp->udev->dev,
677 678
			    "Recv length = 0x%x, Recv type = 0x%X\n",
			    recvlength, recvtype);
679 680 681 682 683 684 685 686 687 688 689 690 691 692 693
	} else if (urb->status)
		goto rx_exit;

	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);
694
		cardp->usb_event_cause = le32_to_cpu(*(__le32 *) (recvbuff + MESSAGE_HEADER_LEN));
695
		lbs_deb_usbd(&cardp->udev->dev,"**EVENT** 0x%X\n",
696 697
			    cardp->usb_event_cause);
		if (cardp->usb_event_cause & 0xffff0000) {
698
			lbs_send_tx_feedback(priv);
699
			spin_unlock(&priv->adapter->driver_lock);
700 701
			break;
		}
702
		cardp->usb_event_cause <<= 3;
703
		cardp->usb_int_cause |= MRVDRV_CARDEVENT;
704
		kfree_skb(skb);
705
		lbs_interrupt(priv->dev);
706 707 708
		spin_unlock(&priv->adapter->driver_lock);
		goto rx_exit;
	default:
709 710
		lbs_deb_usbd(&cardp->udev->dev, "Unknown command type 0x%X\n",
		             recvtype);
711 712 713 714 715
		kfree_skb(skb);
		break;
	}

setup_for_next:
716
	if_usb_submit_rx_urb(cardp);
717
rx_exit:
718
	lbs_deb_leave(LBS_DEB_USB);
719 720 721 722
}

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

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

	if (type == MVMS_CMD) {
737
		__le32 tmp = cpu_to_le32(CMD_TYPE_REQUEST);
738
		priv->dnld_sent = DNLD_CMD_SENT;
739 740 741 742
		memcpy(cardp->bulk_out_buffer, (u8 *) & tmp,
		       MESSAGE_HEADER_LEN);

	} else {
743
		__le32 tmp = cpu_to_le32(CMD_TYPE_DATA);
744
		priv->dnld_sent = DNLD_DATA_SENT;
745 746 747 748 749 750
		memcpy(cardp->bulk_out_buffer, (u8 *) & tmp,
		       MESSAGE_HEADER_LEN);
	}

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

751
	return usb_tx_block(cardp, cardp->bulk_out_buffer,
752
	                    nb + MESSAGE_HEADER_LEN);
753 754 755
}

/* called with adapter->driver_lock held */
756
static int if_usb_get_int_status(lbs_private *priv, u8 *ireg)
757
{
758
	struct usb_card_rec *cardp = priv->card;
759 760 761 762

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

763
	lbs_deb_usbd(&cardp->udev->dev,"Int cause is 0x%X\n", *ireg);
764 765 766 767

	return 0;
}

768
static int if_usb_read_event_cause(lbs_private * priv)
769
{
770
	struct usb_card_rec *cardp = priv->card;
771

772 773
	priv->adapter->eventcause = cardp->usb_event_cause;
	/* Re-submit rx urb here to avoid event lost issue */
774
	if_usb_submit_rx_urb(cardp);
775 776 777
	return 0;
}

778 779 780 781 782 783
/**
 *  @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
 */
784
static int if_usb_issue_boot_command(struct usb_card_rec *cardp, int ivalue)
785
{
786
	struct bootcmdstr sbootcmd;
787 788 789 790 791 792 793 794 795 796
	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 */
797
	usb_tx_block(cardp, cardp->bulk_out_buffer, sizeof(struct bootcmdstr));
798 799 800

	return 0;
}
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 836 837 838 839 840 841 842 843 844 845 846 847 848 849 850 851
/**
 *  @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)
852 853 854
{
	int i = 0;
	static int reset_count = 10;
855
	int ret = 0;
856

857
	lbs_deb_enter(LBS_DEB_USB);
858

859
	if ((ret = request_firmware(&cardp->fw, lbs_fw_name,
860 861
				    &cardp->udev->dev)) < 0) {
		lbs_pr_err("request_firmware() failed with %#x\n", ret);
862
		lbs_pr_err("firmware %s not found\n", lbs_fw_name);
863 864 865 866 867
		goto done;
	}

	if (check_fwfile_format(cardp->fw->data, cardp->fw->size))
		goto release_fw;
868 869

restart:
870
	if (if_usb_submit_rx_urb_fwload(cardp) < 0) {
871 872
		lbs_deb_usbd(&cardp->udev->dev, "URB submission is failed\n");
		ret = -1;
873
		goto release_fw;
874 875 876 877 878 879 880
	}

	cardp->bootcmdresp = 0;
	do {
		int j = 0;
		i++;
		/* Issue Boot command = 1, Boot from Download-FW */
881
		if_usb_issue_boot_command(cardp, BOOT_CMD_FW_BY_USB);
882 883 884 885 886 887 888 889 890
		/* 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) {
891
			if_usb_reset_device(cardp);
892 893 894 895 896 897 898 899 900 901 902 903 904 905 906
			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;

907
	if_prog_firmware(cardp);
908 909

	do {
910
		lbs_deb_usbd(&cardp->udev->dev,"Wlan sched timeout\n");
911 912
		i++;
		msleep_interruptible(100);
913
		if (cardp->surprise_removed || i >= 20)
914 915 916 917 918 919
			break;
	} while (!cardp->fwdnldover);

	if (!cardp->fwdnldover) {
		lbs_pr_info("failed to load fw, resetting device!\n");
		if (--reset_count >= 0) {
920
			if_usb_reset_device(cardp);
921 922 923 924
			goto restart;
		}

		lbs_pr_info("FW download failure, time = %d ms\n", i * 100);
925
		ret = -1;
926
		goto release_fw;
927 928
	}

929 930 931
release_fw:
	release_firmware(cardp->fw);
	cardp->fw = NULL;
932

933 934 935
done:
	lbs_deb_leave_args(LBS_DEB_USB, "ret %d", ret);
	return ret;
936 937
}

H
Holger Schurig 已提交
938

939 940 941 942
#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);
943
	lbs_private *priv = cardp->priv;
944

945
	lbs_deb_enter(LBS_DEB_USB);
946 947 948 949

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

950 951 952 953 954 955 956
	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);
957
		lbs_prepare_and_send_command(priv,
958 959 960 961 962
				CMD_MESH_ACCESS,
				CMD_ACT_MESH_SET_AUTOSTART_ENABLED,
				CMD_OPTION_WAITFORRSP, 0, (void *)&mesh_access);
	}

963
	netif_device_detach(cardp->eth_dev);
964
	netif_device_detach(priv->mesh_dev);
965 966 967 968 969 970 971

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

	cardp->rx_urb_recall = 1;

972
	lbs_deb_leave(LBS_DEB_USB);
973 974 975 976 977 978
	return 0;
}

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

981
	lbs_deb_enter(LBS_DEB_USB);
982 983 984 985 986 987

	cardp->rx_urb_recall = 0;

	if_usb_submit_rx_urb(cardp->priv);

	netif_device_attach(cardp->eth_dev);
988
	netif_device_attach(priv->mesh_dev);
989

990 991 992 993 994 995 996
	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);
997
		lbs_prepare_and_send_command(priv,
998 999 1000 1001 1002
				CMD_MESH_ACCESS,
				CMD_ACT_MESH_SET_AUTOSTART_ENABLED,
				CMD_OPTION_WAITFORRSP, 0, (void *)&mesh_access);
	}

1003
	lbs_deb_leave(LBS_DEB_USB);
1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023
	return 0;
}
#else
#define if_usb_suspend NULL
#define if_usb_resume NULL
#endif

static struct usb_driver if_usb_driver = {
	/* driver name */
	.name = usbdriver_name,
	/* probe function name */
	.probe = if_usb_probe,
	/* disconnect function  name */
	.disconnect = if_usb_disconnect,
	/* device signature table */
	.id_table = if_usb_table,
	.suspend = if_usb_suspend,
	.resume = if_usb_resume,
};

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

1028 1029
	lbs_deb_enter(LBS_DEB_MAIN);

1030 1031
	if (lbs_fw_name == NULL) {
		lbs_fw_name = default_fw_name;
1032 1033 1034 1035 1036 1037
	}

	ret = usb_register(&if_usb_driver);

	lbs_deb_leave_args(LBS_DEB_MAIN, "ret %d", ret);
	return ret;
1038 1039
}

1040
static void if_usb_exit_module(void)
1041
{
1042
	struct usb_card_rec *cardp, *cardp_temp;
1043

1044 1045
	lbs_deb_enter(LBS_DEB_MAIN);

1046
	list_for_each_entry_safe(cardp, cardp_temp, &usb_devices, list) {
1047
		lbs_prepare_and_send_command(cardp->priv, CMD_802_11_RESET,
1048 1049
		                                  CMD_ACT_HALT, 0, 0, NULL);
	}
1050

1051 1052
	/* API unregisters the driver from USB subsystem */
	usb_deregister(&if_usb_driver);
1053 1054

	lbs_deb_leave(LBS_DEB_MAIN);
1055
}
1056 1057 1058 1059 1060 1061 1062

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