From 7b0afe0c947a294ec6d5fedd8c50845250ef9c9f Mon Sep 17 00:00:00 2001 From: David Woodhouse Date: Tue, 11 Dec 2007 13:15:25 -0500 Subject: [PATCH] --- yaml --- r: 79165 b: refs/heads/master c: c9cd6f9d630c4422d5f7eb8018b28846e25dba20 h: refs/heads/master i: 79163: bb0a2bb3bc7b709a8b52cd73deb859c907eaf431 v: v3 --- [refs] | 2 +- trunk/drivers/net/wireless/libertas/host.h | 1 + trunk/drivers/net/wireless/libertas/if_usb.c | 26 ++++++++++++++++---- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/[refs] b/[refs] index 8b797be26ef8..edd0bb2a8e2d 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 10bca0d5f4829a8acd9a7a51cb7b35e38b23280a +refs/heads/master: c9cd6f9d630c4422d5f7eb8018b28846e25dba20 diff --git a/trunk/drivers/net/wireless/libertas/host.h b/trunk/drivers/net/wireless/libertas/host.h index 4828bbf66390..b23af194b42e 100644 --- a/trunk/drivers/net/wireless/libertas/host.h +++ b/trunk/drivers/net/wireless/libertas/host.h @@ -304,5 +304,6 @@ enum cmd_mesh_access_opts { #define MACREG_INT_CODE_RSSI_HIGH 28 #define MACREG_INT_CODE_SNR_HIGH 29 #define MACREG_INT_CODE_MESH_AUTO_STARTED 35 +#define MACREG_INT_CODE_FIRMWARE_READY 48 #endif diff --git a/trunk/drivers/net/wireless/libertas/if_usb.c b/trunk/drivers/net/wireless/libertas/if_usb.c index 6cd6c962937d..c94b6dfa20f2 100644 --- a/trunk/drivers/net/wireless/libertas/if_usb.c +++ b/trunk/drivers/net/wireless/libertas/if_usb.c @@ -230,6 +230,7 @@ static int if_usb_probe(struct usb_interface *intf, goto err_prog_firmware; cardp->priv = priv; + cardp->priv->fw_ready = 1; if (lbs_add_mesh(priv, &udev->dev)) goto err_add_mesh; @@ -241,10 +242,7 @@ static int if_usb_probe(struct usb_interface *intf, priv->hw_read_event_cause = if_usb_read_event_cause; priv->boot2_version = udev->descriptor.bcdDevice; - /* Delay 200 ms to waiting for the FW ready */ if_usb_submit_rx_urb(cardp); - msleep_interruptible(200); - priv->fw_ready = 1; if (lbs_start_card(priv)) goto err_start_card; @@ -514,6 +512,21 @@ static void if_usb_receive_fwload(struct urb *urb) return; } + 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 { + lbs_deb_usb("Waiting for confirmation; got %x %x\n", le32_to_cpu(tmp[0]), + le32_to_cpu(tmp[1])); + if_usb_submit_rx_urb_fwload(cardp); + } + kfree_skb(skb); + return; + } if (cardp->bootcmdresp <= 0) { memcpy (&bootcmdresp, skb->data + IPFIELD_ALIGN_OFFSET, sizeof(bootcmdresp)); @@ -529,7 +542,8 @@ static void if_usb_receive_fwload(struct urb *urb) if (bootcmdresp.u32magicnumber == cpu_to_le32(CMD_TYPE_REQUEST) || bootcmdresp.u32magicnumber == cpu_to_le32(CMD_TYPE_DATA) || bootcmdresp.u32magicnumber == cpu_to_le32(CMD_TYPE_INDICATION)) { - lbs_pr_info("Firmware already seems alive; resetting\n"); + if (!cardp->bootcmdresp) + lbs_pr_info("Firmware already seems alive; resetting\n"); cardp->bootcmdresp = -1; } else { lbs_pr_info("boot cmd response wrong magic number (0x%x)\n", @@ -590,8 +604,9 @@ static void if_usb_receive_fwload(struct urb *urb) if_usb_send_fw_pkt(cardp); - if_usb_submit_rx_urb_fwload(cardp); exit: + if_usb_submit_rx_urb_fwload(cardp); + kfree(syncfwheader); return; @@ -934,6 +949,7 @@ static int if_usb_prog_firmware(struct usb_card_rec *cardp) wait_event_interruptible(cardp->fw_wq, cardp->surprise_removed || cardp->fwdnldover); del_timer_sync(&cardp->fw_timeout); + usb_kill_urb(cardp->rx_urb); if (!cardp->fwdnldover) { lbs_pr_info("failed to load fw, resetting device!\n");