if_usb.c 24.5 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 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 if_usb_card *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 140
/**
 *  @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;
141
	struct lbs_private *priv;
142
	struct if_usb_card *cardp;
143 144 145 146
	int i;

	udev = interface_to_usbdev(intf);

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

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

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

	for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
		endpoint = &iface_desc->endpoint[i].desc;
168 169 170
		if (usb_endpoint_is_bulk_in(endpoint)) {
			cardp->ep_in_size = le16_to_cpu(endpoint->wMaxPacketSize);
			cardp->ep_in = usb_endpoint_num(endpoint);
171

172 173
			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);
174

175 176 177 178 179 180
		} 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);
181 182
		}
	}
183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199
	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;
	}
200

201 202
	/* Upload firmware */
	if (if_usb_prog_firmware(cardp)) {
203
		lbs_deb_usbd(&udev->dev, "FW upload failed\n");
204 205 206
		goto err_prog_firmware;
	}

207
	if (!(priv = lbs_add_card(cardp, &udev->dev)))
208
		goto err_prog_firmware;
209

210
	cardp->priv = priv;
211
	cardp->priv->fw_ready = 1;
212

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

218 219
	if_usb_submit_rx_urb(cardp);

220
	if (lbs_start_card(priv))
221
		goto err_start_card;
222

223
	if_usb_set_boot2_ver(priv);
224

225 226 227
	priv->wol_gpio = 2; /* Wake via GPIO2... */
	priv->wol_gap = 20; /* ... after 20ms    */
	lbs_host_sleep_cfg(priv, EHS_WAKE_ON_UNICAST_DATA);
228

229
	usb_get_dev(udev);
230
	usb_set_intfdata(intf, cardp);
231 232 233

	return 0;

234
err_start_card:
235
	lbs_remove_card(priv);
236 237
err_prog_firmware:
	if_usb_reset_device(cardp);
238
dealloc:
239
	if_usb_free(cardp);
240 241 242 243 244 245 246

error:
	return -ENOMEM;
}

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

255
	lbs_deb_enter(LBS_DEB_MAIN);
256

257
	cardp->surprise_removed = 1;
258

259
	if (priv) {
260
		priv->surpriseremoved = 1;
261 262
		lbs_stop_card(priv);
		lbs_remove_card(priv);
263
	}
264 265 266 267 268 269 270

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

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

271
	lbs_deb_leave(LBS_DEB_MAIN);
272 273 274 275
}

/**
 *  @brief  This function download FW
276
 *  @param priv		pointer to struct lbs_private
277 278
 *  @return 	   	0
 */
279
static int if_usb_send_fw_pkt(struct if_usb_card *cardp)
280
{
281 282
	struct fwdata *fwdata = cardp->ep_out_buf;
	uint8_t *firmware = cardp->fw->data;
283

284 285
	/* If we got a CRC failure on the last block, back
	   up and retry it */
286 287
	if (!cardp->CRC_OK) {
		cardp->totalbytes = cardp->fwlastblksent;
288
		cardp->fwseqnum--;
289 290
	}

291 292
	lbs_deb_usb2(&cardp->udev->dev, "totalbytes = %d\n",
		     cardp->totalbytes);
293

294 295 296 297 298
	/* 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],
299 300 301 302 303 304
	       sizeof(struct fwheader));

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

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

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

310 311
	fwdata->seqnum = cpu_to_le32(++cardp->fwseqnum);
	cardp->totalbytes += le32_to_cpu(fwdata->hdr.datalength);
312

313 314 315 316 317 318 319 320 321 322
	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");
323 324 325 326

		cardp->fwfinalblk = 1;
	}

327 328
	lbs_deb_usb2(&cardp->udev->dev, "Firmware download done; size %d\n",
		     cardp->totalbytes);
329 330 331 332

	return 0;
}

333
static int if_usb_reset_device(struct if_usb_card *cardp)
334
{
335
	struct cmd_ds_command *cmd = cardp->ep_out_buf + 4;
336 337
	int ret;

338 339
	lbs_deb_enter(LBS_DEB_USB);

340
	*(__le32 *)cardp->ep_out_buf = cpu_to_le32(CMD_TYPE_REQUEST);
341 342 343 344 345 346

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

349
	msleep(100);
350
	ret = usb_reset_device(cardp->udev);
351
	msleep(100);
352 353 354

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

355 356 357 358 359
	return ret;
}

/**
 *  @brief This function transfer the data to the device.
360
 *  @param priv 	pointer to struct lbs_private
361 362 363 364
 *  @param payload	pointer to payload data
 *  @param nb		data length
 *  @return 	   	0 or -1
 */
365
static int usb_tx_block(struct if_usb_card *cardp, uint8_t *payload, uint16_t nb)
366 367 368 369
{
	int ret = -1;

	/* check if device is removed */
370
	if (cardp->surprise_removed) {
371
		lbs_deb_usbd(&cardp->udev->dev, "Device removed\n");
372 373 374 375 376
		goto tx_ret;
	}

	usb_fill_bulk_urb(cardp->tx_urb, cardp->udev,
			  usb_sndbulkpipe(cardp->udev,
377
					  cardp->ep_out),
378
			  payload, nb, if_usb_write_bulk_callback, cardp);
379 380 381 382

	cardp->tx_urb->transfer_flags |= URB_ZERO_PACKET;

	if ((ret = usb_submit_urb(cardp->tx_urb, GFP_ATOMIC))) {
383
		lbs_deb_usbd(&cardp->udev->dev, "usb_submit_urb failed: %d\n", ret);
384 385
		ret = -1;
	} else {
386
		lbs_deb_usb2(&cardp->udev->dev, "usb_submit_urb success\n");
387 388 389 390 391 392 393
		ret = 0;
	}

tx_ret:
	return ret;
}

394
static int __if_usb_submit_rx_urb(struct if_usb_card *cardp,
395
				  void (*callbackfn)(struct urb *urb))
396 397 398 399 400 401 402 403 404
{
	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;
	}

405
	cardp->rx_skb = skb;
406 407 408

	/* Fill the receive configuration URB and initialise the Rx call back */
	usb_fill_bulk_urb(cardp->rx_urb, cardp->udev,
409
			  usb_rcvbulkpipe(cardp->udev, cardp->ep_in),
D
Dan Williams 已提交
410
			  (void *) (skb->tail + (size_t) IPFIELD_ALIGN_OFFSET),
411
			  MRVDRV_ETH_RX_PACKET_BUFFER_SIZE, callbackfn,
412
			  cardp);
413 414 415

	cardp->rx_urb->transfer_flags |= URB_ZERO_PACKET;

416
	lbs_deb_usb2(&cardp->udev->dev, "Pointer for rx_urb %p\n", cardp->rx_urb);
417
	if ((ret = usb_submit_urb(cardp->rx_urb, GFP_ATOMIC))) {
418
		lbs_deb_usbd(&cardp->udev->dev, "Submit Rx URB failed: %d\n", ret);
419
		kfree_skb(skb);
420
		cardp->rx_skb = NULL;
421 422
		ret = -1;
	} else {
423
		lbs_deb_usb2(&cardp->udev->dev, "Submit Rx URB success\n");
424 425 426 427 428 429 430
		ret = 0;
	}

rx_ret:
	return ret;
}

431
static int if_usb_submit_rx_urb_fwload(struct if_usb_card *cardp)
432
{
433
	return __if_usb_submit_rx_urb(cardp, &if_usb_receive_fwload);
434 435
}

436
static int if_usb_submit_rx_urb(struct if_usb_card *cardp)
437
{
438
	return __if_usb_submit_rx_urb(cardp, &if_usb_receive);
439 440 441 442
}

static void if_usb_receive_fwload(struct urb *urb)
{
443 444
	struct if_usb_card *cardp = urb->context;
	struct sk_buff *skb = cardp->rx_skb;
445
	struct fwsyncheader *syncfwheader;
446
	struct bootcmdresp bootcmdresp;
447 448

	if (urb->status) {
449
		lbs_deb_usbd(&cardp->udev->dev,
450
			     "URB status is failed during fw load\n");
451 452 453 454
		kfree_skb(skb);
		return;
	}

455 456 457 458 459 460 461 462
	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 {
463 464
			lbs_deb_usb("Waiting for confirmation; got %x %x\n",
				    le32_to_cpu(tmp[0]), le32_to_cpu(tmp[1]));
465 466 467 468 469
			if_usb_submit_rx_urb_fwload(cardp);
		}
		kfree_skb(skb);
		return;
	}
470
	if (cardp->bootcmdresp <= 0) {
471 472
		memcpy (&bootcmdresp, skb->data + IPFIELD_ALIGN_OFFSET,
			sizeof(bootcmdresp));
473

474
		if (le16_to_cpu(cardp->udev->descriptor.bcdDevice) < 0x3106) {
475
			kfree_skb(skb);
476
			if_usb_submit_rx_urb_fwload(cardp);
477
			cardp->bootcmdresp = 1;
478
			lbs_deb_usbd(&cardp->udev->dev,
479
				     "Received valid boot command response\n");
480 481
			return;
		}
482 483 484 485
		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)) {
486 487
				if (!cardp->bootcmdresp)
					lbs_pr_info("Firmware already seems alive; resetting\n");
488 489 490
				cardp->bootcmdresp = -1;
			} else {
				lbs_pr_info("boot cmd response wrong magic number (0x%x)\n",
491
					    le32_to_cpu(bootcmdresp.magic));
492
			}
493 494 495 496 497 498
		} 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);
499 500
		} else {
			cardp->bootcmdresp = 1;
501
			lbs_deb_usbd(&cardp->udev->dev,
502
				     "Received valid boot command response\n");
503 504
		}
		kfree_skb(skb);
505
		if_usb_submit_rx_urb_fwload(cardp);
506 507 508 509 510
		return;
	}

	syncfwheader = kmalloc(sizeof(struct fwsyncheader), GFP_ATOMIC);
	if (!syncfwheader) {
511
		lbs_deb_usbd(&cardp->udev->dev, "Failure to allocate syncfwheader\n");
512 513 514 515 516
		kfree_skb(skb);
		return;
	}

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

	if (!syncfwheader->cmd) {
520 521 522
		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));
523 524
		cardp->CRC_OK = 1;
	} else {
525
		lbs_deb_usbd(&cardp->udev->dev, "FW received Blk with CRC error\n");
526 527 528 529 530
		cardp->CRC_OK = 0;
	}

	kfree_skb(skb);

531 532 533
	/* reschedule timer for 200ms hence */
	mod_timer(&cardp->fw_timeout, jiffies + (HZ/5));

534 535 536 537 538
	if (cardp->fwfinalblk) {
		cardp->fwdnldover = 1;
		goto exit;
	}

539
	if_usb_send_fw_pkt(cardp);
540

541
 exit:
542 543
	if_usb_submit_rx_urb_fwload(cardp);

544 545 546 547 548 549 550 551
	kfree(syncfwheader);

	return;
}

#define MRVDRV_MIN_PKT_LEN	30

static inline void process_cmdtypedata(int recvlength, struct sk_buff *skb,
552
				       struct if_usb_card *cardp,
553
				       struct lbs_private *priv)
554
{
555 556 557
	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");
558 559 560 561 562 563 564
		kfree_skb(skb);
		return;
	}

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

566
	lbs_process_rxed_packet(priv, skb);
567
	priv->upld_len = (recvlength - MESSAGE_HEADER_LEN);
568 569
}

570
static inline void process_cmdrequest(int recvlength, uint8_t *recvbuff,
571
				      struct sk_buff *skb,
572
				      struct if_usb_card *cardp,
573
				      struct lbs_private *priv)
574
{
575 576
	uint8_t *cmdbuf;

577
	if (recvlength > LBS_CMD_BUFFER_SIZE) {
578
		lbs_deb_usbd(&cardp->udev->dev,
579
			     "The receive buffer is too large\n");
580 581 582 583 584 585 586
		kfree_skb(skb);
		return;
	}

	if (!in_interrupt())
		BUG();

587
	spin_lock(&priv->driver_lock);
588 589
	/* take care of cur_cmd = NULL case by reading the
	 * data to clear the interrupt */
590
	if (!priv->cur_cmd) {
591 592
		lbs_deb_hex(LBS_DEB_HOST, "Unsolicited CMD_RESP",
			    (void *) recvbuff + MESSAGE_HEADER_LEN, priv->upld_len);
593
		cmdbuf = priv->upld_buf;
594
		priv->hisregcpy &= ~MRVDRV_CMD_UPLD_RDY;
595
	} else
596
		cmdbuf = (uint8_t *) priv->cur_cmd->cmdbuf;
597

598
	cardp->usb_int_cause |= MRVDRV_CMD_UPLD_RDY;
599
	priv->upld_len = (recvlength - MESSAGE_HEADER_LEN);
600
	memcpy(cmdbuf, recvbuff + MESSAGE_HEADER_LEN, priv->upld_len);
601 602

	kfree_skb(skb);
603
	lbs_interrupt(priv);
604
	spin_unlock(&priv->driver_lock);
605

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

627
	lbs_deb_enter(LBS_DEB_USB);
628 629 630

	if (recvlength) {
		if (urb->status) {
631 632
			lbs_deb_usbd(&cardp->udev->dev, "RX URB failed: %d\n",
				     urb->status);
633 634 635 636 637
			kfree_skb(skb);
			goto setup_for_next;
		}

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

	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 */
658
		spin_lock(&priv->driver_lock);
659 660 661

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

662
		lbs_deb_usbd(&cardp->udev->dev,"**EVENT** 0x%X\n",
663 664 665
			     cardp->usb_event_cause);

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

setup_for_next:
685
	if_usb_submit_rx_urb(cardp);
686
rx_exit:
687
	lbs_deb_leave(LBS_DEB_USB);
688 689 690 691
}

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

703 704
	lbs_deb_usbd(&cardp->udev->dev,"*** type = %u\n", type);
	lbs_deb_usbd(&cardp->udev->dev,"size after = %d\n", nb);
705 706

	if (type == MVMS_CMD) {
707
		*(__le32 *)cardp->ep_out_buf = cpu_to_le32(CMD_TYPE_REQUEST);
708
		priv->dnld_sent = DNLD_CMD_SENT;
709
	} else {
710
		*(__le32 *)cardp->ep_out_buf = cpu_to_le32(CMD_TYPE_DATA);
711
		priv->dnld_sent = DNLD_DATA_SENT;
712 713
	}

714
	memcpy((cardp->ep_out_buf + MESSAGE_HEADER_LEN), payload, nb);
715

716
	return usb_tx_block(cardp, cardp->ep_out_buf, nb + MESSAGE_HEADER_LEN);
717 718
}

719
/* called with priv->driver_lock held */
720
static int if_usb_get_int_status(struct lbs_private *priv, uint8_t *ireg)
721
{
722
	struct if_usb_card *cardp = priv->card;
723 724 725 726

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

727
	lbs_deb_usbd(&cardp->udev->dev, "Int cause is 0x%X\n", *ireg);
728 729 730 731

	return 0;
}

732
static int if_usb_read_event_cause(struct lbs_private *priv)
733
{
734
	struct if_usb_card *cardp = priv->card;
735

736
	priv->eventcause = cardp->usb_event_cause;
737
	/* Re-submit rx urb here to avoid event lost issue */
738
	if_usb_submit_rx_urb(cardp);
739

740 741 742
	return 0;
}

743 744 745 746 747 748
/**
 *  @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
 */
749
static int if_usb_issue_boot_command(struct if_usb_card *cardp, int ivalue)
750
{
751
	struct bootcmd *bootcmd = cardp->ep_out_buf;
752 753

	/* Prepare command */
754 755 756
	bootcmd->magic = cpu_to_le32(BOOT_CMD_MAGIC_NUMBER);
	bootcmd->cmd = ivalue;
	memset(bootcmd->pad, 0, sizeof(bootcmd->pad));
757 758

	/* Issue command */
759
	usb_tx_block(cardp, cardp->ep_out_buf, sizeof(*bootcmd));
760 761 762

	return 0;
}
763 764


765 766 767 768 769 770 771
/**
 *  @brief This function checks the validity of Boot2/FW image.
 *
 *  @param data              pointer to image
 *         len               image length
 *  @return     0 or -1
 */
772
static int check_fwfile_format(uint8_t *data, uint32_t totlen)
773
{
774 775
	uint32_t bincmd, exit;
	uint32_t blksize, offset, len;
776 777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812
	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;
}


813
static int if_usb_prog_firmware(struct if_usb_card *cardp)
814 815 816
{
	int i = 0;
	static int reset_count = 10;
817
	int ret = 0;
818

819
	lbs_deb_enter(LBS_DEB_USB);
820

821
	if ((ret = request_firmware(&cardp->fw, lbs_fw_name,
822 823
				    &cardp->udev->dev)) < 0) {
		lbs_pr_err("request_firmware() failed with %#x\n", ret);
824
		lbs_pr_err("firmware %s not found\n", lbs_fw_name);
825 826 827 828 829
		goto done;
	}

	if (check_fwfile_format(cardp->fw->data, cardp->fw->size))
		goto release_fw;
830 831

restart:
832
	if (if_usb_submit_rx_urb_fwload(cardp) < 0) {
833 834
		lbs_deb_usbd(&cardp->udev->dev, "URB submission is failed\n");
		ret = -1;
835
		goto release_fw;
836 837 838 839 840 841 842
	}

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

851
	if (cardp->bootcmdresp <= 0) {
852
		if (--reset_count >= 0) {
853
			if_usb_reset_device(cardp);
854 855 856 857 858 859 860 861 862 863 864 865 866 867 868
			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;

869 870
	/* Send the first firmware packet... */
	if_usb_send_fw_pkt(cardp);
871

872 873 874 875
	/* ... and wait for the process to complete */
	wait_event_interruptible(cardp->fw_wq, cardp->surprise_removed || cardp->fwdnldover);
	
	del_timer_sync(&cardp->fw_timeout);
876
	usb_kill_urb(cardp->rx_urb);
877 878 879 880

	if (!cardp->fwdnldover) {
		lbs_pr_info("failed to load fw, resetting device!\n");
		if (--reset_count >= 0) {
881
			if_usb_reset_device(cardp);
882 883 884 885
			goto restart;
		}

		lbs_pr_info("FW download failure, time = %d ms\n", i * 100);
886
		ret = -1;
887
		goto release_fw;
888 889
	}

890
 release_fw:
891 892
	release_firmware(cardp->fw);
	cardp->fw = NULL;
893

894
 done:
895 896
	lbs_deb_leave_args(LBS_DEB_USB, "ret %d", ret);
	return ret;
897 898
}

H
Holger Schurig 已提交
899

900 901 902
#ifdef CONFIG_PM
static int if_usb_suspend(struct usb_interface *intf, pm_message_t message)
{
903
	struct if_usb_card *cardp = usb_get_intfdata(intf);
904
	struct lbs_private *priv = cardp->priv;
905
	int ret;
906

907
	lbs_deb_enter(LBS_DEB_USB);
908

909
	if (priv->psstate != PS_STATE_FULL_POWER)
910 911
		return -1;

912 913 914
	ret = lbs_suspend(priv);
	if (ret)
		goto out;
915 916 917 918 919

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

920
 out:
921
	lbs_deb_leave(LBS_DEB_USB);
922
	return ret;
923 924 925 926
}

static int if_usb_resume(struct usb_interface *intf)
{
927
	struct if_usb_card *cardp = usb_get_intfdata(intf);
928
	struct lbs_private *priv = cardp->priv;
929

930
	lbs_deb_enter(LBS_DEB_USB);
931

932
	if_usb_submit_rx_urb(cardp);
933

934
	lbs_resume(priv);
935

936
	lbs_deb_leave(LBS_DEB_USB);
937 938 939 940 941 942 943 944
	return 0;
}
#else
#define if_usb_suspend NULL
#define if_usb_resume NULL
#endif

static struct usb_driver if_usb_driver = {
945
	.name = DRV_NAME,
946 947 948 949 950 951 952
	.probe = if_usb_probe,
	.disconnect = if_usb_disconnect,
	.id_table = if_usb_table,
	.suspend = if_usb_suspend,
	.resume = if_usb_resume,
};

953
static int __init if_usb_init_module(void)
954
{
955
	int ret = 0;
956

957 958 959 960 961 962
	lbs_deb_enter(LBS_DEB_MAIN);

	ret = usb_register(&if_usb_driver);

	lbs_deb_leave_args(LBS_DEB_MAIN, "ret %d", ret);
	return ret;
963 964
}

965
static void __exit if_usb_exit_module(void)
966
{
967 968
	lbs_deb_enter(LBS_DEB_MAIN);

969
	usb_deregister(&if_usb_driver);
970 971

	lbs_deb_leave(LBS_DEB_MAIN);
972
}
973 974 975 976 977

module_init(if_usb_init_module);
module_exit(if_usb_exit_module);

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