if_usb.c 24.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 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 if_usb_card *cardp = priv->card;
108
	struct cmd_ds_set_boot2_ver b2_cmd;
109
	struct cmd_ds_802_11_fw_wake_method wake_method;
110

111
	b2_cmd.hdr.size = cpu_to_le16(sizeof(b2_cmd));
112
	b2_cmd.action = 0;
113
	b2_cmd.version = cardp->boot2_version;
114

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

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

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

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

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

	udev = interface_to_usbdev(intf);

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

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

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

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

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

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

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

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

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

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

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
	cardp->boot2_version = udev->descriptor.bcdDevice;
239

240 241
	if_usb_submit_rx_urb(cardp);

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

245
	if_usb_setup_firmware(priv);
246

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

	return 0;

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

error:
	return -ENOMEM;
}

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

273
	lbs_deb_enter(LBS_DEB_MAIN);
274

275
	cardp->surprise_removed = 1;
276

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

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

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

289
	lbs_deb_leave(LBS_DEB_MAIN);
290 291 292 293
}

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

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

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

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

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

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

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

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

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

		cardp->fwfinalblk = 1;
	}

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

	return 0;
}

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

356 357
	lbs_deb_enter(LBS_DEB_USB);

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

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

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

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

373 374 375 376 377
	return ret;
}

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

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

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

	cardp->tx_urb->transfer_flags |= URB_ZERO_PACKET;

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

tx_ret:
	return ret;
}

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

423
	cardp->rx_skb = skb;
424 425 426

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

	cardp->rx_urb->transfer_flags |= URB_ZERO_PACKET;

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

rx_ret:
	return ret;
}

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

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

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

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

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

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

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

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

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

	kfree_skb(skb);

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

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

557
	if_usb_send_fw_pkt(cardp);
558

559
 exit:
560 561
	if_usb_submit_rx_urb_fwload(cardp);

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

	return;
}

#define MRVDRV_MIN_PKT_LEN	30

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

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

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

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

	if (!in_interrupt())
		BUG();

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

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

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

633
	lbs_deb_enter(LBS_DEB_USB);
634 635 636

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

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

	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 */
664
		spin_lock(&priv->driver_lock);
665 666 667

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

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

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

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

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

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

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

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

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

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

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

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

	return 0;
}

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

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

746 747 748
	return 0;
}

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

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

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

	return 0;
}
769 770


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


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

825
	lbs_deb_enter(LBS_DEB_USB);
826

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

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

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

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

857
	if (cardp->bootcmdresp <= 0) {
858
		if (--reset_count >= 0) {
859
			if_usb_reset_device(cardp);
860 861 862 863 864 865 866 867 868 869 870 871 872 873 874
			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;

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

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

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

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

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

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

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

H
Holger Schurig 已提交
905

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

913
	lbs_deb_enter(LBS_DEB_USB);
914

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

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

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

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

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

936
	lbs_deb_enter(LBS_DEB_USB);
937

938
	if_usb_submit_rx_urb(cardp);
939

940
	lbs_resume(priv);
941

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

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

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

963 964 965 966 967 968
	lbs_deb_enter(LBS_DEB_MAIN);

	ret = usb_register(&if_usb_driver);

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

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

975
	usb_deregister(&if_usb_driver);
976 977

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

module_init(if_usb_init_module);
module_exit(if_usb_exit_module);

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