diff --git a/drivers/net/wireless/libertas/cmd.c b/drivers/net/wireless/libertas/cmd.c index 4d06dec6cd46288137355765c63a5f1cad366510..eab020338fde2b345c1c795b88d68ac4c360364a 100644 --- a/drivers/net/wireless/libertas/cmd.c +++ b/drivers/net/wireless/libertas/cmd.c @@ -60,13 +60,24 @@ int lbs_update_hw_spec(struct lbs_private *priv) goto out; priv->fwcapinfo = le32_to_cpu(cmd.fwcapinfo); - memcpy(priv->fwreleasenumber, cmd.fwreleasenumber, 4); - lbs_deb_cmd("GET_HW_SPEC: firmware release %u.%u.%up%u\n", - priv->fwreleasenumber[2], priv->fwreleasenumber[1], - priv->fwreleasenumber[0], priv->fwreleasenumber[3]); - lbs_deb_cmd("GET_HW_SPEC: MAC addr %s\n", - print_mac(mac, cmd.permanentaddr)); + /* The firmware release is in an interesting format: the patch + * level is in the most significant nibble ... so fix that: */ + priv->fwrelease = le32_to_cpu(cmd.fwrelease); + priv->fwrelease = (priv->fwrelease << 8) | + (priv->fwrelease >> 24 & 0xff); + + /* Some firmware capabilities: + * CF card firmware 5.0.16p0: cap 0x00000303 + * USB dongle firmware 5.110.17p2: cap 0x00000303 + */ + printk("libertas: %s, fw %u.%u.%up%u, cap 0x%08x\n", + print_mac(mac, cmd.permanentaddr), + priv->fwrelease >> 24 & 0xff, + priv->fwrelease >> 16 & 0xff, + priv->fwrelease >> 8 & 0xff, + priv->fwrelease & 0xff, + priv->fwcapinfo); lbs_deb_cmd("GET_HW_SPEC: hardware interface 0x%x, hardware spec 0x%04x\n", cmd.hwifversion, cmd.version); diff --git a/drivers/net/wireless/libertas/dev.h b/drivers/net/wireless/libertas/dev.h index c1c9733c5f9e48760a2bcbc50c2a923b056e1a32..58d7ef6b5ff5b127591c65bd9d60ffb731c87e9d 100644 --- a/drivers/net/wireless/libertas/dev.h +++ b/drivers/net/wireless/libertas/dev.h @@ -161,7 +161,7 @@ struct lbs_private { /** Wlan adapter data structure*/ /** STATUS variables */ - u8 fwreleasenumber[4]; + u32 fwrelease; u32 fwcapinfo; /* protected with big lock */ diff --git a/drivers/net/wireless/libertas/hostcmd.h b/drivers/net/wireless/libertas/hostcmd.h index be325eda6a4b22ed6b3ac845cfea1e0b84bc79de..d35b015b66577d80620b1e1bdebfa4cf81d1af51 100644 --- a/drivers/net/wireless/libertas/hostcmd.h +++ b/drivers/net/wireless/libertas/hostcmd.h @@ -136,8 +136,8 @@ struct cmd_ds_get_hw_spec { /* Number of antenna used */ __le16 nr_antenna; - /* FW release number, example 1,2,3,4 = 3.2.1p4 */ - u8 fwreleasenumber[4]; + /* FW release number, example 0x01030304 = 2.3.4p1 */ + __le32 fwrelease; /* Base Address of TxPD queue */ __le32 wcb_base; diff --git a/drivers/net/wireless/libertas/wext.c b/drivers/net/wireless/libertas/wext.c index 3e8d555ba3a97bc0d2de00f4ef47a5c6dafda124..e8bfc26b10a4eb11d647229bc085cea71a00f84c 100644 --- a/drivers/net/wireless/libertas/wext.c +++ b/drivers/net/wireless/libertas/wext.c @@ -2071,17 +2071,11 @@ void lbs_get_fwversion(struct lbs_private *priv, char *fwversion, int maxlen) mutex_lock(&priv->lock); - if (priv->fwreleasenumber[3] == 0) - sprintf(fwver, "%u.%u.%u", - priv->fwreleasenumber[2], - priv->fwreleasenumber[1], - priv->fwreleasenumber[0]); - else - sprintf(fwver, "%u.%u.%u.p%u", - priv->fwreleasenumber[2], - priv->fwreleasenumber[1], - priv->fwreleasenumber[0], - priv->fwreleasenumber[3]); + sprintf(fwver, "%u.%u.%u.p%u", + priv->fwrelease >> 24 & 0xff, + priv->fwrelease >> 16 & 0xff, + priv->fwrelease >> 8 & 0xff, + priv->fwrelease & 0xff); mutex_unlock(&priv->lock); snprintf(fwversion, maxlen, fwver);