0001
0002
0003
0004
0005
0006 #define DRV_NAME "lbtf_usb"
0007
0008 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
0009
0010 #include "libertas_tf.h"
0011 #include "if_usb.h"
0012
0013 #include <linux/delay.h>
0014 #include <linux/module.h>
0015 #include <linux/firmware.h>
0016 #include <linux/netdevice.h>
0017 #include <linux/slab.h>
0018 #include <linux/usb.h>
0019
0020 #define INSANEDEBUG 0
0021 #define lbtf_deb_usb2(...) do { if (INSANEDEBUG) lbtf_deb_usbd(__VA_ARGS__); } while (0)
0022
0023 #define MESSAGE_HEADER_LEN 4
0024
0025 static char *lbtf_fw_name = "lbtf_usb.bin";
0026 module_param_named(fw_name, lbtf_fw_name, charp, 0644);
0027
0028 MODULE_FIRMWARE("lbtf_usb.bin");
0029
0030 static const struct usb_device_id if_usb_table[] = {
0031
0032 { USB_DEVICE(0x1286, 0x2001) },
0033 { USB_DEVICE(0x05a3, 0x8388) },
0034 {}
0035 };
0036
0037 MODULE_DEVICE_TABLE(usb, if_usb_table);
0038
0039 static void if_usb_receive(struct urb *urb);
0040 static void if_usb_receive_fwload(struct urb *urb);
0041 static int if_usb_prog_firmware(struct lbtf_private *priv);
0042 static int if_usb_host_to_card(struct lbtf_private *priv, uint8_t type,
0043 uint8_t *payload, uint16_t nb);
0044 static int usb_tx_block(struct if_usb_card *cardp, uint8_t *payload,
0045 uint16_t nb, u8 data);
0046 static void if_usb_free(struct if_usb_card *cardp);
0047 static int if_usb_submit_rx_urb(struct if_usb_card *cardp);
0048 static int if_usb_reset_device(struct lbtf_private *priv);
0049
0050
0051
0052
0053
0054
0055 static void if_usb_write_bulk_callback(struct urb *urb)
0056 {
0057 if (urb->status != 0) {
0058
0059 pr_info("URB in failure status: %d\n", urb->status);
0060 } else {
0061 lbtf_deb_usb2(&urb->dev->dev, "URB status is successful\n");
0062 lbtf_deb_usb2(&urb->dev->dev, "Actual length transmitted %d\n",
0063 urb->actual_length);
0064 }
0065 }
0066
0067
0068
0069
0070
0071
0072 static void if_usb_free(struct if_usb_card *cardp)
0073 {
0074 lbtf_deb_enter(LBTF_DEB_USB);
0075
0076
0077 usb_kill_urb(cardp->tx_urb);
0078 usb_kill_urb(cardp->rx_urb);
0079 usb_kill_urb(cardp->cmd_urb);
0080
0081 usb_free_urb(cardp->tx_urb);
0082 cardp->tx_urb = NULL;
0083
0084 usb_free_urb(cardp->rx_urb);
0085 cardp->rx_urb = NULL;
0086
0087 usb_free_urb(cardp->cmd_urb);
0088 cardp->cmd_urb = NULL;
0089
0090 kfree(cardp->ep_out_buf);
0091 cardp->ep_out_buf = NULL;
0092
0093 lbtf_deb_leave(LBTF_DEB_USB);
0094 }
0095
0096 static void if_usb_setup_firmware(struct lbtf_private *priv)
0097 {
0098 struct if_usb_card *cardp = priv->card;
0099 struct cmd_ds_set_boot2_ver b2_cmd;
0100
0101 lbtf_deb_enter(LBTF_DEB_USB);
0102
0103 if_usb_submit_rx_urb(cardp);
0104 b2_cmd.hdr.size = cpu_to_le16(sizeof(b2_cmd));
0105 b2_cmd.action = 0;
0106 b2_cmd.version = cardp->boot2_version;
0107
0108 if (lbtf_cmd_with_response(priv, CMD_SET_BOOT2_VER, &b2_cmd))
0109 lbtf_deb_usb("Setting boot2 version failed\n");
0110
0111 lbtf_deb_leave(LBTF_DEB_USB);
0112 }
0113
0114 static void if_usb_fw_timeo(struct timer_list *t)
0115 {
0116 struct if_usb_card *cardp = from_timer(cardp, t, fw_timeout);
0117
0118 lbtf_deb_enter(LBTF_DEB_USB);
0119 if (!cardp->fwdnldover) {
0120
0121 cardp->priv->surpriseremoved = 1;
0122 pr_err("Download timed out\n");
0123 } else {
0124 lbtf_deb_usb("Download complete, no event. Assuming success\n");
0125 }
0126 wake_up(&cardp->fw_wq);
0127 lbtf_deb_leave(LBTF_DEB_USB);
0128 }
0129
0130 static const struct lbtf_ops if_usb_ops = {
0131 .hw_host_to_card = if_usb_host_to_card,
0132 .hw_prog_firmware = if_usb_prog_firmware,
0133 .hw_reset_device = if_usb_reset_device,
0134 };
0135
0136
0137
0138
0139
0140
0141
0142
0143
0144 static int if_usb_probe(struct usb_interface *intf,
0145 const struct usb_device_id *id)
0146 {
0147 struct usb_device *udev;
0148 struct usb_host_interface *iface_desc;
0149 struct usb_endpoint_descriptor *endpoint;
0150 struct lbtf_private *priv;
0151 struct if_usb_card *cardp;
0152 int i;
0153
0154 lbtf_deb_enter(LBTF_DEB_USB);
0155 udev = interface_to_usbdev(intf);
0156
0157 cardp = kzalloc(sizeof(struct if_usb_card), GFP_KERNEL);
0158 if (!cardp)
0159 goto error;
0160
0161 timer_setup(&cardp->fw_timeout, if_usb_fw_timeo, 0);
0162 init_waitqueue_head(&cardp->fw_wq);
0163
0164 cardp->udev = udev;
0165 iface_desc = intf->cur_altsetting;
0166
0167 lbtf_deb_usbd(&udev->dev, "bcdUSB = 0x%X bDeviceClass = 0x%X"
0168 " bDeviceSubClass = 0x%X, bDeviceProtocol = 0x%X\n",
0169 le16_to_cpu(udev->descriptor.bcdUSB),
0170 udev->descriptor.bDeviceClass,
0171 udev->descriptor.bDeviceSubClass,
0172 udev->descriptor.bDeviceProtocol);
0173
0174 for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) {
0175 endpoint = &iface_desc->endpoint[i].desc;
0176 if (usb_endpoint_is_bulk_in(endpoint)) {
0177 cardp->ep_in_size =
0178 le16_to_cpu(endpoint->wMaxPacketSize);
0179 cardp->ep_in = usb_endpoint_num(endpoint);
0180
0181 lbtf_deb_usbd(&udev->dev, "in_endpoint = %d\n",
0182 cardp->ep_in);
0183 lbtf_deb_usbd(&udev->dev, "Bulk in size is %d\n",
0184 cardp->ep_in_size);
0185 } else if (usb_endpoint_is_bulk_out(endpoint)) {
0186 cardp->ep_out_size =
0187 le16_to_cpu(endpoint->wMaxPacketSize);
0188 cardp->ep_out = usb_endpoint_num(endpoint);
0189
0190 lbtf_deb_usbd(&udev->dev, "out_endpoint = %d\n",
0191 cardp->ep_out);
0192 lbtf_deb_usbd(&udev->dev, "Bulk out size is %d\n",
0193 cardp->ep_out_size);
0194 }
0195 }
0196 if (!cardp->ep_out_size || !cardp->ep_in_size) {
0197 lbtf_deb_usbd(&udev->dev, "Endpoints not found\n");
0198
0199 goto dealloc;
0200 }
0201
0202 cardp->rx_urb = usb_alloc_urb(0, GFP_KERNEL);
0203 if (!cardp->rx_urb)
0204 goto dealloc;
0205
0206 cardp->tx_urb = usb_alloc_urb(0, GFP_KERNEL);
0207 if (!cardp->tx_urb)
0208 goto dealloc;
0209
0210 cardp->cmd_urb = usb_alloc_urb(0, GFP_KERNEL);
0211 if (!cardp->cmd_urb)
0212 goto dealloc;
0213
0214 cardp->ep_out_buf = kmalloc(MRVDRV_ETH_TX_PACKET_BUFFER_SIZE,
0215 GFP_KERNEL);
0216 if (!cardp->ep_out_buf) {
0217 lbtf_deb_usbd(&udev->dev, "Could not allocate buffer\n");
0218 goto dealloc;
0219 }
0220
0221 cardp->boot2_version = udev->descriptor.bcdDevice;
0222 priv = lbtf_add_card(cardp, &udev->dev, &if_usb_ops);
0223 if (!priv)
0224 goto dealloc;
0225
0226 usb_get_dev(udev);
0227 usb_set_intfdata(intf, cardp);
0228
0229 return 0;
0230
0231 dealloc:
0232 if_usb_free(cardp);
0233 kfree(cardp);
0234 error:
0235 lbtf_deb_leave(LBTF_DEB_MAIN);
0236 return -ENOMEM;
0237 }
0238
0239
0240
0241
0242
0243
0244 static void if_usb_disconnect(struct usb_interface *intf)
0245 {
0246 struct if_usb_card *cardp = usb_get_intfdata(intf);
0247 struct lbtf_private *priv = cardp->priv;
0248
0249 lbtf_deb_enter(LBTF_DEB_MAIN);
0250
0251 if (priv) {
0252 if_usb_reset_device(priv);
0253 lbtf_remove_card(priv);
0254 }
0255
0256
0257 if_usb_free(cardp);
0258 kfree(cardp);
0259
0260 usb_set_intfdata(intf, NULL);
0261 usb_put_dev(interface_to_usbdev(intf));
0262
0263 lbtf_deb_leave(LBTF_DEB_MAIN);
0264 }
0265
0266
0267
0268
0269
0270
0271
0272
0273 static int if_usb_send_fw_pkt(struct if_usb_card *cardp)
0274 {
0275 struct fwdata *fwdata = cardp->ep_out_buf;
0276 u8 *firmware = (u8 *) cardp->fw->data;
0277
0278 lbtf_deb_enter(LBTF_DEB_FW);
0279
0280
0281
0282 if (!cardp->CRC_OK) {
0283 cardp->totalbytes = cardp->fwlastblksent;
0284 cardp->fwseqnum--;
0285 }
0286
0287 lbtf_deb_usb2(&cardp->udev->dev, "totalbytes = %d\n",
0288 cardp->totalbytes);
0289
0290
0291
0292
0293
0294 memcpy(&fwdata->hdr, &firmware[cardp->totalbytes],
0295 sizeof(struct fwheader));
0296
0297 cardp->fwlastblksent = cardp->totalbytes;
0298 cardp->totalbytes += sizeof(struct fwheader);
0299
0300 memcpy(fwdata->data, &firmware[cardp->totalbytes],
0301 le32_to_cpu(fwdata->hdr.datalength));
0302
0303 lbtf_deb_usb2(&cardp->udev->dev, "Data length = %d\n",
0304 le32_to_cpu(fwdata->hdr.datalength));
0305
0306 fwdata->seqnum = cpu_to_le32(++cardp->fwseqnum);
0307 cardp->totalbytes += le32_to_cpu(fwdata->hdr.datalength);
0308
0309 usb_tx_block(cardp, cardp->ep_out_buf, sizeof(struct fwdata) +
0310 le32_to_cpu(fwdata->hdr.datalength), 0);
0311
0312 if (fwdata->hdr.dnldcmd == cpu_to_le32(FW_HAS_DATA_TO_RECV)) {
0313 lbtf_deb_usb2(&cardp->udev->dev, "There are data to follow\n");
0314 lbtf_deb_usb2(&cardp->udev->dev,
0315 "seqnum = %d totalbytes = %d\n",
0316 cardp->fwseqnum, cardp->totalbytes);
0317 } else if (fwdata->hdr.dnldcmd == cpu_to_le32(FW_HAS_LAST_BLOCK)) {
0318 lbtf_deb_usb2(&cardp->udev->dev,
0319 "Host has finished FW downloading\n");
0320 lbtf_deb_usb2(&cardp->udev->dev, "Downloading FW JUMP BLOCK\n");
0321
0322
0323
0324
0325 cardp->fwfinalblk = 1;
0326 }
0327
0328 lbtf_deb_usb2(&cardp->udev->dev, "Firmware download done; size %d\n",
0329 cardp->totalbytes);
0330
0331 lbtf_deb_leave(LBTF_DEB_FW);
0332 return 0;
0333 }
0334
0335 static int if_usb_reset_device(struct lbtf_private *priv)
0336 {
0337 struct if_usb_card *cardp = priv->card;
0338 struct cmd_ds_802_11_reset *cmd = cardp->ep_out_buf + 4;
0339 int ret;
0340
0341 lbtf_deb_enter(LBTF_DEB_USB);
0342
0343 *(__le32 *)cardp->ep_out_buf = cpu_to_le32(CMD_TYPE_REQUEST);
0344
0345 cmd->hdr.command = cpu_to_le16(CMD_802_11_RESET);
0346 cmd->hdr.size = cpu_to_le16(sizeof(struct cmd_ds_802_11_reset));
0347 cmd->hdr.result = cpu_to_le16(0);
0348 cmd->hdr.seqnum = cpu_to_le16(0x5a5a);
0349 cmd->action = cpu_to_le16(CMD_ACT_HALT);
0350 usb_tx_block(cardp, cardp->ep_out_buf,
0351 4 + sizeof(struct cmd_ds_802_11_reset), 0);
0352
0353 msleep(100);
0354 ret = usb_reset_device(cardp->udev);
0355 msleep(100);
0356
0357 lbtf_deb_leave_args(LBTF_DEB_USB, "ret %d", ret);
0358
0359 return ret;
0360 }
0361
0362
0363
0364
0365
0366
0367
0368
0369
0370
0371
0372 static int usb_tx_block(struct if_usb_card *cardp, uint8_t *payload,
0373 uint16_t nb, u8 data)
0374 {
0375 int ret = -1;
0376 struct urb *urb;
0377
0378 lbtf_deb_enter(LBTF_DEB_USB);
0379
0380 if (cardp->priv->surpriseremoved) {
0381 lbtf_deb_usbd(&cardp->udev->dev, "Device removed\n");
0382 goto tx_ret;
0383 }
0384
0385 if (data)
0386 urb = cardp->tx_urb;
0387 else
0388 urb = cardp->cmd_urb;
0389
0390 usb_fill_bulk_urb(urb, cardp->udev,
0391 usb_sndbulkpipe(cardp->udev,
0392 cardp->ep_out),
0393 payload, nb, if_usb_write_bulk_callback, cardp);
0394
0395 urb->transfer_flags |= URB_ZERO_PACKET;
0396
0397 if (usb_submit_urb(urb, GFP_ATOMIC)) {
0398 lbtf_deb_usbd(&cardp->udev->dev,
0399 "usb_submit_urb failed: %d\n", ret);
0400 goto tx_ret;
0401 }
0402
0403 lbtf_deb_usb2(&cardp->udev->dev, "usb_submit_urb success\n");
0404
0405 ret = 0;
0406
0407 tx_ret:
0408 lbtf_deb_leave(LBTF_DEB_USB);
0409 return ret;
0410 }
0411
0412 static int __if_usb_submit_rx_urb(struct if_usb_card *cardp,
0413 void (*callbackfn)(struct urb *urb))
0414 {
0415 struct sk_buff *skb;
0416 int ret = -1;
0417
0418 lbtf_deb_enter(LBTF_DEB_USB);
0419
0420 skb = dev_alloc_skb(MRVDRV_ETH_RX_PACKET_BUFFER_SIZE);
0421 if (!skb) {
0422 pr_err("No free skb\n");
0423 lbtf_deb_leave(LBTF_DEB_USB);
0424 return -1;
0425 }
0426
0427 cardp->rx_skb = skb;
0428
0429
0430 usb_fill_bulk_urb(cardp->rx_urb, cardp->udev,
0431 usb_rcvbulkpipe(cardp->udev, cardp->ep_in),
0432 skb_tail_pointer(skb),
0433 MRVDRV_ETH_RX_PACKET_BUFFER_SIZE, callbackfn, cardp);
0434
0435 lbtf_deb_usb2(&cardp->udev->dev, "Pointer for rx_urb %p\n",
0436 cardp->rx_urb);
0437 ret = usb_submit_urb(cardp->rx_urb, GFP_ATOMIC);
0438 if (ret) {
0439 lbtf_deb_usbd(&cardp->udev->dev,
0440 "Submit Rx URB failed: %d\n", ret);
0441 kfree_skb(skb);
0442 cardp->rx_skb = NULL;
0443 lbtf_deb_leave(LBTF_DEB_USB);
0444 return -1;
0445 } else {
0446 lbtf_deb_usb2(&cardp->udev->dev, "Submit Rx URB success\n");
0447 lbtf_deb_leave(LBTF_DEB_USB);
0448 return 0;
0449 }
0450 }
0451
0452 static int if_usb_submit_rx_urb_fwload(struct if_usb_card *cardp)
0453 {
0454 return __if_usb_submit_rx_urb(cardp, &if_usb_receive_fwload);
0455 }
0456
0457 static int if_usb_submit_rx_urb(struct if_usb_card *cardp)
0458 {
0459 return __if_usb_submit_rx_urb(cardp, &if_usb_receive);
0460 }
0461
0462 static void if_usb_receive_fwload(struct urb *urb)
0463 {
0464 struct if_usb_card *cardp = urb->context;
0465 struct sk_buff *skb = cardp->rx_skb;
0466 struct fwsyncheader *syncfwheader;
0467 struct bootcmdresp bcmdresp;
0468
0469 lbtf_deb_enter(LBTF_DEB_USB);
0470 if (urb->status) {
0471 lbtf_deb_usbd(&cardp->udev->dev,
0472 "URB status is failed during fw load\n");
0473 kfree_skb(skb);
0474 lbtf_deb_leave(LBTF_DEB_USB);
0475 return;
0476 }
0477
0478 if (cardp->fwdnldover) {
0479 __le32 *tmp = (__le32 *)(skb->data);
0480
0481 if (tmp[0] == cpu_to_le32(CMD_TYPE_INDICATION) &&
0482 tmp[1] == cpu_to_le32(MACREG_INT_CODE_FIRMWARE_READY)) {
0483
0484 pr_info("Firmware ready event received\n");
0485 wake_up(&cardp->fw_wq);
0486 } else {
0487 lbtf_deb_usb("Waiting for confirmation; got %x %x\n",
0488 le32_to_cpu(tmp[0]), le32_to_cpu(tmp[1]));
0489 if_usb_submit_rx_urb_fwload(cardp);
0490 }
0491 kfree_skb(skb);
0492 lbtf_deb_leave(LBTF_DEB_USB);
0493 return;
0494 }
0495 if (cardp->bootcmdresp <= 0) {
0496 memcpy(&bcmdresp, skb->data, sizeof(bcmdresp));
0497
0498 if (le16_to_cpu(cardp->udev->descriptor.bcdDevice) < 0x3106) {
0499 kfree_skb(skb);
0500 if_usb_submit_rx_urb_fwload(cardp);
0501 cardp->bootcmdresp = 1;
0502
0503 lbtf_deb_usbd(&cardp->udev->dev,
0504 "Received valid boot command response\n");
0505 lbtf_deb_leave(LBTF_DEB_USB);
0506 return;
0507 }
0508 if (bcmdresp.magic != cpu_to_le32(BOOT_CMD_MAGIC_NUMBER)) {
0509 if (bcmdresp.magic == cpu_to_le32(CMD_TYPE_REQUEST) ||
0510 bcmdresp.magic == cpu_to_le32(CMD_TYPE_DATA) ||
0511 bcmdresp.magic == cpu_to_le32(CMD_TYPE_INDICATION)) {
0512 if (!cardp->bootcmdresp)
0513 pr_info("Firmware already seems alive; resetting\n");
0514 cardp->bootcmdresp = -1;
0515 } else {
0516 pr_info("boot cmd response wrong magic number (0x%x)\n",
0517 le32_to_cpu(bcmdresp.magic));
0518 }
0519 } else if (bcmdresp.cmd != BOOT_CMD_FW_BY_USB) {
0520 pr_info("boot cmd response cmd_tag error (%d)\n",
0521 bcmdresp.cmd);
0522 } else if (bcmdresp.result != BOOT_CMD_RESP_OK) {
0523 pr_info("boot cmd response result error (%d)\n",
0524 bcmdresp.result);
0525 } else {
0526 cardp->bootcmdresp = 1;
0527 lbtf_deb_usbd(&cardp->udev->dev,
0528 "Received valid boot command response\n");
0529 }
0530
0531 kfree_skb(skb);
0532 if_usb_submit_rx_urb_fwload(cardp);
0533 lbtf_deb_leave(LBTF_DEB_USB);
0534 return;
0535 }
0536
0537 syncfwheader = kmemdup(skb->data, sizeof(struct fwsyncheader),
0538 GFP_ATOMIC);
0539 if (!syncfwheader) {
0540 lbtf_deb_usbd(&cardp->udev->dev,
0541 "Failure to allocate syncfwheader\n");
0542 kfree_skb(skb);
0543 lbtf_deb_leave(LBTF_DEB_USB);
0544 return;
0545 }
0546
0547 if (!syncfwheader->cmd) {
0548 lbtf_deb_usb2(&cardp->udev->dev,
0549 "FW received Blk with correct CRC\n");
0550 lbtf_deb_usb2(&cardp->udev->dev,
0551 "FW received Blk seqnum = %d\n",
0552 le32_to_cpu(syncfwheader->seqnum));
0553 cardp->CRC_OK = 1;
0554 } else {
0555 lbtf_deb_usbd(&cardp->udev->dev,
0556 "FW received Blk with CRC error\n");
0557 cardp->CRC_OK = 0;
0558 }
0559
0560 kfree_skb(skb);
0561
0562
0563 mod_timer(&cardp->fw_timeout, jiffies + (HZ/5));
0564
0565 if (cardp->fwfinalblk) {
0566 cardp->fwdnldover = 1;
0567 goto exit;
0568 }
0569
0570 if_usb_send_fw_pkt(cardp);
0571
0572 exit:
0573 if_usb_submit_rx_urb_fwload(cardp);
0574
0575 kfree(syncfwheader);
0576
0577 lbtf_deb_leave(LBTF_DEB_USB);
0578 }
0579
0580 #define MRVDRV_MIN_PKT_LEN 30
0581
0582 static inline void process_cmdtypedata(int recvlength, struct sk_buff *skb,
0583 struct if_usb_card *cardp,
0584 struct lbtf_private *priv)
0585 {
0586 if (recvlength > MRVDRV_ETH_RX_PACKET_BUFFER_SIZE + MESSAGE_HEADER_LEN
0587 || recvlength < MRVDRV_MIN_PKT_LEN) {
0588 lbtf_deb_usbd(&cardp->udev->dev, "Packet length is Invalid\n");
0589 kfree_skb(skb);
0590 return;
0591 }
0592
0593 skb_put(skb, recvlength);
0594 skb_pull(skb, MESSAGE_HEADER_LEN);
0595 lbtf_rx(priv, skb);
0596 }
0597
0598 static inline void process_cmdrequest(int recvlength, uint8_t *recvbuff,
0599 struct sk_buff *skb,
0600 struct if_usb_card *cardp,
0601 struct lbtf_private *priv)
0602 {
0603 unsigned long flags;
0604
0605 if (recvlength < MESSAGE_HEADER_LEN ||
0606 recvlength > LBS_CMD_BUFFER_SIZE) {
0607 lbtf_deb_usbd(&cardp->udev->dev,
0608 "The receive buffer is invalid: %d\n", recvlength);
0609 kfree_skb(skb);
0610 return;
0611 }
0612
0613 spin_lock_irqsave(&priv->driver_lock, flags);
0614 memcpy(priv->cmd_resp_buff, recvbuff + MESSAGE_HEADER_LEN,
0615 recvlength - MESSAGE_HEADER_LEN);
0616 kfree_skb(skb);
0617 lbtf_cmd_response_rx(priv);
0618 spin_unlock_irqrestore(&priv->driver_lock, flags);
0619 }
0620
0621
0622
0623
0624
0625
0626 static void if_usb_receive(struct urb *urb)
0627 {
0628 struct if_usb_card *cardp = urb->context;
0629 struct sk_buff *skb = cardp->rx_skb;
0630 struct lbtf_private *priv = cardp->priv;
0631 int recvlength = urb->actual_length;
0632 uint8_t *recvbuff = NULL;
0633 uint32_t recvtype = 0;
0634 __le32 *pkt = (__le32 *) skb->data;
0635
0636 lbtf_deb_enter(LBTF_DEB_USB);
0637
0638 if (recvlength) {
0639 if (urb->status) {
0640 lbtf_deb_usbd(&cardp->udev->dev, "RX URB failed: %d\n",
0641 urb->status);
0642 kfree_skb(skb);
0643 goto setup_for_next;
0644 }
0645
0646 recvbuff = skb->data;
0647 recvtype = le32_to_cpu(pkt[0]);
0648 lbtf_deb_usbd(&cardp->udev->dev,
0649 "Recv length = 0x%x, Recv type = 0x%X\n",
0650 recvlength, recvtype);
0651 } else if (urb->status) {
0652 kfree_skb(skb);
0653 lbtf_deb_leave(LBTF_DEB_USB);
0654 return;
0655 }
0656
0657 switch (recvtype) {
0658 case CMD_TYPE_DATA:
0659 process_cmdtypedata(recvlength, skb, cardp, priv);
0660 break;
0661
0662 case CMD_TYPE_REQUEST:
0663 process_cmdrequest(recvlength, recvbuff, skb, cardp, priv);
0664 break;
0665
0666 case CMD_TYPE_INDICATION:
0667 {
0668
0669 u32 event_cause = le32_to_cpu(pkt[1]);
0670 lbtf_deb_usbd(&cardp->udev->dev, "**EVENT** 0x%X\n",
0671 event_cause);
0672
0673
0674 if (event_cause & 0xffff0000) {
0675 u16 tmp;
0676 u8 retrycnt;
0677 u8 failure;
0678
0679 tmp = event_cause >> 16;
0680 retrycnt = tmp & 0x00ff;
0681 failure = (tmp & 0xff00) >> 8;
0682 lbtf_send_tx_feedback(priv, retrycnt, failure);
0683 } else if (event_cause == LBTF_EVENT_BCN_SENT)
0684 lbtf_bcn_sent(priv);
0685 else
0686 lbtf_deb_usbd(&cardp->udev->dev,
0687 "Unsupported notification %d received\n",
0688 event_cause);
0689 kfree_skb(skb);
0690 break;
0691 }
0692 default:
0693 lbtf_deb_usbd(&cardp->udev->dev,
0694 "libertastf: unknown command type 0x%X\n", recvtype);
0695 kfree_skb(skb);
0696 break;
0697 }
0698
0699 setup_for_next:
0700 if_usb_submit_rx_urb(cardp);
0701 lbtf_deb_leave(LBTF_DEB_USB);
0702 }
0703
0704
0705
0706
0707
0708
0709
0710
0711
0712
0713
0714 static int if_usb_host_to_card(struct lbtf_private *priv, uint8_t type,
0715 uint8_t *payload, uint16_t nb)
0716 {
0717 struct if_usb_card *cardp = priv->card;
0718 u8 data = 0;
0719
0720 lbtf_deb_usbd(&cardp->udev->dev, "*** type = %u\n", type);
0721 lbtf_deb_usbd(&cardp->udev->dev, "size after = %d\n", nb);
0722
0723 if (type == MVMS_CMD) {
0724 *(__le32 *)cardp->ep_out_buf = cpu_to_le32(CMD_TYPE_REQUEST);
0725 } else {
0726 *(__le32 *)cardp->ep_out_buf = cpu_to_le32(CMD_TYPE_DATA);
0727 data = 1;
0728 }
0729
0730 memcpy((cardp->ep_out_buf + MESSAGE_HEADER_LEN), payload, nb);
0731
0732 return usb_tx_block(cardp, cardp->ep_out_buf, nb + MESSAGE_HEADER_LEN,
0733 data);
0734 }
0735
0736
0737
0738
0739
0740
0741
0742
0743
0744 static int if_usb_issue_boot_command(struct if_usb_card *cardp, int ivalue)
0745 {
0746 struct bootcmd *bootcmd = cardp->ep_out_buf;
0747
0748
0749 bootcmd->magic = cpu_to_le32(BOOT_CMD_MAGIC_NUMBER);
0750 bootcmd->cmd = ivalue;
0751 memset(bootcmd->pad, 0, sizeof(bootcmd->pad));
0752
0753
0754 usb_tx_block(cardp, cardp->ep_out_buf, sizeof(*bootcmd), 0);
0755
0756 return 0;
0757 }
0758
0759
0760
0761
0762
0763
0764
0765
0766
0767
0768 static int check_fwfile_format(const u8 *data, u32 totlen)
0769 {
0770 u32 bincmd, exit;
0771 u32 blksize, offset, len;
0772 int ret;
0773
0774 ret = 1;
0775 exit = len = 0;
0776
0777 do {
0778 struct fwheader *fwh = (void *) data;
0779
0780 bincmd = le32_to_cpu(fwh->dnldcmd);
0781 blksize = le32_to_cpu(fwh->datalength);
0782 switch (bincmd) {
0783 case FW_HAS_DATA_TO_RECV:
0784 offset = sizeof(struct fwheader) + blksize;
0785 data += offset;
0786 len += offset;
0787 if (len >= totlen)
0788 exit = 1;
0789 break;
0790 case FW_HAS_LAST_BLOCK:
0791 exit = 1;
0792 ret = 0;
0793 break;
0794 default:
0795 exit = 1;
0796 break;
0797 }
0798 } while (!exit);
0799
0800 if (ret)
0801 pr_err("firmware file format check FAIL\n");
0802 else
0803 lbtf_deb_fw("firmware file format check PASS\n");
0804
0805 return ret;
0806 }
0807
0808
0809 static int if_usb_prog_firmware(struct lbtf_private *priv)
0810 {
0811 struct if_usb_card *cardp = priv->card;
0812 int i = 0;
0813 static int reset_count = 10;
0814 int ret = 0;
0815
0816 lbtf_deb_enter(LBTF_DEB_USB);
0817
0818 cardp->priv = priv;
0819
0820 kernel_param_lock(THIS_MODULE);
0821 ret = request_firmware(&cardp->fw, lbtf_fw_name, &cardp->udev->dev);
0822 if (ret < 0) {
0823 pr_err("request_firmware() failed with %#x\n", ret);
0824 pr_err("firmware %s not found\n", lbtf_fw_name);
0825 kernel_param_unlock(THIS_MODULE);
0826 goto done;
0827 }
0828 kernel_param_unlock(THIS_MODULE);
0829
0830 if (check_fwfile_format(cardp->fw->data, cardp->fw->size))
0831 goto release_fw;
0832
0833 restart:
0834 if (if_usb_submit_rx_urb_fwload(cardp) < 0) {
0835 lbtf_deb_usbd(&cardp->udev->dev, "URB submission is failed\n");
0836 ret = -1;
0837 goto release_fw;
0838 }
0839
0840 cardp->bootcmdresp = 0;
0841 do {
0842 int j = 0;
0843 i++;
0844
0845 if_usb_issue_boot_command(cardp, BOOT_CMD_FW_BY_USB);
0846
0847 do {
0848 j++;
0849 msleep_interruptible(100);
0850 } while (cardp->bootcmdresp == 0 && j < 10);
0851 } while (cardp->bootcmdresp == 0 && i < 5);
0852
0853 if (cardp->bootcmdresp <= 0) {
0854 if (--reset_count >= 0) {
0855 if_usb_reset_device(priv);
0856 goto restart;
0857 }
0858 return -1;
0859 }
0860
0861 i = 0;
0862
0863 cardp->totalbytes = 0;
0864 cardp->fwlastblksent = 0;
0865 cardp->CRC_OK = 1;
0866 cardp->fwdnldover = 0;
0867 cardp->fwseqnum = -1;
0868 cardp->totalbytes = 0;
0869 cardp->fwfinalblk = 0;
0870
0871
0872 if_usb_send_fw_pkt(cardp);
0873
0874
0875 wait_event_interruptible(cardp->fw_wq, cardp->priv->surpriseremoved ||
0876 cardp->fwdnldover);
0877
0878 del_timer_sync(&cardp->fw_timeout);
0879 usb_kill_urb(cardp->rx_urb);
0880
0881 if (!cardp->fwdnldover) {
0882 pr_info("failed to load fw, resetting device!\n");
0883 if (--reset_count >= 0) {
0884 if_usb_reset_device(priv);
0885 goto restart;
0886 }
0887
0888 pr_info("FW download failure, time = %d ms\n", i * 100);
0889 ret = -1;
0890 goto release_fw;
0891 }
0892
0893 release_fw:
0894 release_firmware(cardp->fw);
0895 cardp->fw = NULL;
0896
0897 if_usb_setup_firmware(cardp->priv);
0898
0899 done:
0900 lbtf_deb_leave_args(LBTF_DEB_USB, "ret %d", ret);
0901 return ret;
0902 }
0903
0904
0905 #define if_usb_suspend NULL
0906 #define if_usb_resume NULL
0907
0908 static struct usb_driver if_usb_driver = {
0909 .name = DRV_NAME,
0910 .probe = if_usb_probe,
0911 .disconnect = if_usb_disconnect,
0912 .id_table = if_usb_table,
0913 .suspend = if_usb_suspend,
0914 .resume = if_usb_resume,
0915 .disable_hub_initiated_lpm = 1,
0916 };
0917
0918 module_usb_driver(if_usb_driver);
0919
0920 MODULE_DESCRIPTION("8388 USB WLAN Thinfirm Driver");
0921 MODULE_AUTHOR("Cozybit Inc.");
0922 MODULE_LICENSE("GPL");