10 #define DRV_NAME "lbtf_usb"
12 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
18 #include <linux/module.h>
20 #include <linux/netdevice.h>
21 #include <linux/slab.h>
25 #define lbtf_deb_usb2(...) do { if (INSANEDEBUG) lbtf_deb_usbd(__VA_ARGS__); } while (0)
27 #define MESSAGE_HEADER_LEN 4
29 static char *lbtf_fw_name =
"lbtf_usb.bin";
36 { USB_DEVICE(0x1286, 0x2001) },
37 { USB_DEVICE(0x05a3, 0x8388) },
43 static void if_usb_receive(
struct urb *
urb);
44 static void if_usb_receive_fwload(
struct urb *
urb);
45 static int if_usb_prog_firmware(
struct if_usb_card *cardp);
51 static int if_usb_submit_rx_urb(
struct if_usb_card *cardp);
52 static int if_usb_reset_device(
struct if_usb_card *cardp);
59 static void if_usb_write_bulk_callback(
struct urb *
urb)
61 if (urb->status != 0) {
63 pr_info(
"URB in failure status: %d\n", urb->status);
66 lbtf_deb_usb2(&urb->dev->dev,
"Actual length transmitted %d\n",
107 if_usb_submit_rx_urb(cardp);
118 static void if_usb_fw_timeo(
unsigned long priv)
125 cardp->
priv->surpriseremoved = 1;
126 pr_err(
"Download timed out\n");
128 lbtf_deb_usb(
"Download complete, no event. Assuming success\n");
145 struct usb_device *
udev;
146 struct usb_host_interface *iface_desc;
153 udev = interface_to_usbdev(intf);
163 iface_desc = intf->cur_altsetting;
165 lbtf_deb_usbd(&udev->dev,
"bcdUSB = 0x%X bDeviceClass = 0x%X"
166 " bDeviceSubClass = 0x%X, bDeviceProtocol = 0x%X\n",
168 udev->descriptor.bDeviceClass,
169 udev->descriptor.bDeviceSubClass,
170 udev->descriptor.bDeviceProtocol);
172 for (i = 0; i < iface_desc->desc.bNumEndpoints; ++
i) {
173 endpoint = &iface_desc->endpoint[
i].desc;
174 if (usb_endpoint_is_bulk_in(endpoint)) {
177 cardp->
ep_in = usb_endpoint_num(endpoint);
183 }
else if (usb_endpoint_is_bulk_out(endpoint)) {
186 cardp->
ep_out = usb_endpoint_num(endpoint);
237 usb_set_intfdata(intf, cardp);
255 struct if_usb_card *cardp = usb_get_intfdata(intf);
260 if_usb_reset_device(cardp);
268 usb_set_intfdata(intf,
NULL);
281 static int if_usb_send_fw_pkt(
struct if_usb_card *cardp)
317 usb_tx_block(cardp, cardp->
ep_out_buf,
sizeof(
struct fwdata) +
323 "seqnum = %d totalbytes = %d\n",
327 "Host has finished FW downloading\n");
343 static int if_usb_reset_device(
struct if_usb_card *cardp)
388 if (cardp->
priv->surpriseremoved) {
398 usb_fill_bulk_urb(urb, cardp->
udev,
399 usb_sndbulkpipe(cardp->
udev,
401 payload, nb, if_usb_write_bulk_callback, cardp);
403 urb->transfer_flags |= URB_ZERO_PACKET;
407 "usb_submit_urb failed: %d\n", ret);
420 static int __if_usb_submit_rx_urb(
struct if_usb_card *cardp,
421 void (*callbackfn)(
struct urb *urb))
439 usb_rcvbulkpipe(cardp->
udev, cardp->
ep_in),
440 skb_tail_pointer(skb),
443 cardp->
rx_urb->transfer_flags |= URB_ZERO_PACKET;
450 "Submit Rx URB failed: %d\n", ret);
462 static int if_usb_submit_rx_urb_fwload(
struct if_usb_card *cardp)
464 return __if_usb_submit_rx_urb(cardp, &if_usb_receive_fwload);
467 static int if_usb_submit_rx_urb(
struct if_usb_card *cardp)
469 return __if_usb_submit_rx_urb(cardp, &if_usb_receive);
472 static void if_usb_receive_fwload(
struct urb *urb)
482 "URB status is failed during fw load\n");
494 pr_info(
"Firmware ready event received\n");
499 if_usb_submit_rx_urb_fwload(cardp);
506 memcpy(&bcmdresp, skb->
data,
sizeof(bcmdresp));
510 if_usb_submit_rx_urb_fwload(cardp);
514 "Received valid boot command response\n");
523 pr_info(
"Firmware already seems alive; resetting\n");
526 pr_info(
"boot cmd response wrong magic number (0x%x)\n",
530 pr_info(
"boot cmd response cmd_tag error (%d)\n",
533 pr_info(
"boot cmd response result error (%d)\n",
538 "Received valid boot command response\n");
542 if_usb_submit_rx_urb_fwload(cardp);
551 "Failure to allocate syncfwheader\n");
557 if (!syncfwheader->
cmd) {
559 "FW received Blk with correct CRC\n");
561 "FW received Blk seqnum = %d\n",
566 "FW received Blk with CRC error\n");
580 if_usb_send_fw_pkt(cardp);
583 if_usb_submit_rx_urb_fwload(cardp);
590 #define MRVDRV_MIN_PKT_LEN 30
592 static inline void process_cmdtypedata(
int recvlength,
struct sk_buff *skb,
608 static inline void process_cmdrequest(
int recvlength,
uint8_t *recvbuff,
615 "The receive buffer is too large\n");
635 static void if_usb_receive(
struct urb *urb)
640 int recvlength = urb->actual_length;
655 recvbuff = skb->
data;
658 "Recv length = 0x%x, Recv type = 0x%X\n",
659 recvlength, recvtype);
660 }
else if (urb->status) {
668 process_cmdtypedata(recvlength, skb, cardp, priv);
672 process_cmdrequest(recvlength, recvbuff, skb, cardp, priv);
683 if (event_cause & 0xffff0000) {
688 tmp = event_cause >> 16;
689 retrycnt = tmp & 0x00ff;
690 failure = (tmp & 0xff00) >> 8;
696 "Unsupported notification %d received\n",
703 "libertastf: unknown command type 0x%X\n", recvtype);
709 if_usb_submit_rx_urb(cardp);
752 static int if_usb_issue_boot_command(
struct if_usb_card *cardp,
int ivalue)
758 bootcmd->
cmd = ivalue;
762 usb_tx_block(cardp, cardp->
ep_out_buf,
sizeof(*bootcmd), 0);
776 static int check_fwfile_format(
const u8 *data,
u32 totlen)
786 struct fwheader *fwh = (
void *) data;
792 offset =
sizeof(
struct fwheader) + blksize;
809 pr_err(
"firmware file format check FAIL\n");
817 static int if_usb_prog_firmware(
struct if_usb_card *cardp)
820 static int reset_count = 10;
828 pr_err(
"request_firmware() failed with %#x\n", ret);
829 pr_err(
"firmware %s not found\n", lbtf_fw_name);
835 if (check_fwfile_format(cardp->
fw->data, cardp->
fw->size))
839 if (if_usb_submit_rx_urb_fwload(cardp) < 0) {
859 if (--reset_count >= 0) {
860 if_usb_reset_device(cardp);
877 if_usb_send_fw_pkt(cardp);
887 pr_info(
"failed to load fw, resetting device!\n");
888 if (--reset_count >= 0) {
889 if_usb_reset_device(cardp);
893 pr_info(
"FW download failure, time = %d ms\n", i * 100);
898 cardp->
priv->fw_ready = 1;
904 if_usb_setup_firmware(cardp->
priv);
913 #define if_usb_suspend NULL
914 #define if_usb_resume NULL
916 static struct usb_driver if_usb_driver = {
918 .probe = if_usb_probe,
919 .disconnect = if_usb_disconnect,
920 .id_table = if_usb_table,
923 .disable_hub_initiated_lpm = 1,