libertas: convert GET_HW_SPEC to a direct command
authorDan Williams <dcbw@redhat.com>
Tue, 11 Dec 2007 17:42:16 +0000 (12:42 -0500)
committerDavid S. Miller <davem@davemloft.net>
Mon, 28 Jan 2008 23:06:42 +0000 (15:06 -0800)
Signed-off-by: Dan Williams <dcbw@redhat.com>
Signed-off-by: David Woodhouse <dwmw2@infradead.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/libertas/cmd.c
drivers/net/wireless/libertas/cmd.h
drivers/net/wireless/libertas/cmdresp.c
drivers/net/wireless/libertas/hostcmd.h
drivers/net/wireless/libertas/main.c

index c4b32a05de107239ce7b096e71d85d2516c47db3..bb940cce3a7372752fd253fa9514c02e18b8fe1e 100644 (file)
@@ -11,6 +11,7 @@
 #include "dev.h"
 #include "join.h"
 #include "wext.h"
+#include "cmd.h"
 
 static void cleanup_cmdnode(struct cmd_ctrl_node *ptempnode);
 struct cmd_ctrl_node *lbs_get_cmd_ctrl_node(struct lbs_private *priv);
@@ -36,18 +37,78 @@ static u8 is_command_allowed_in_ps(u16 cmd)
        return 0;
 }
 
-static int lbs_cmd_hw_spec(struct lbs_private *priv, struct cmd_ds_command *cmd)
+/**
+ *  @brief Updates the hardware details like MAC address and regulatory region
+ *
+ *  @param priv        A pointer to struct lbs_private structure
+ *
+ *  @return            0 on success, error on failure
+ */
+int lbs_update_hw_spec(struct lbs_private *priv)
 {
-       struct cmd_ds_get_hw_spec *hwspec = &cmd->params.hwspec;
+       struct cmd_ds_get_hw_spec cmd;
+       int ret = -1;
+       u32 i;
+       DECLARE_MAC_BUF(mac);
 
        lbs_deb_enter(LBS_DEB_CMD);
 
-       cmd->command = cpu_to_le16(CMD_GET_HW_SPEC);
-       cmd->size = cpu_to_le16(sizeof(struct cmd_ds_get_hw_spec) + S_DS_GEN);
-       memcpy(hwspec->permanentaddr, priv->current_addr, ETH_ALEN);
+       memset(&cmd, 0, sizeof(cmd));
+       cmd.hdr.size = cpu_to_le16(sizeof(cmd));
+       memcpy(cmd.permanentaddr, priv->current_addr, ETH_ALEN);
+       ret = lbs_cmd_with_response(priv, CMD_GET_HW_SPEC, cmd);
+       if (ret)
+               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));
+       lbs_deb_cmd("GET_HW_SPEC: hardware interface 0x%x, hardware spec 0x%04x\n",
+                   cmd.hwifversion, cmd.version);
+
+       /* Clamp region code to 8-bit since FW spec indicates that it should
+        * only ever be 8-bit, even though the field size is 16-bit.  Some firmware
+        * returns non-zero high 8 bits here.
+        */
+       priv->regioncode = le16_to_cpu(cmd.regioncode) & 0xFF;
+
+       for (i = 0; i < MRVDRV_MAX_REGION_CODE; i++) {
+               /* use the region code to search for the index */
+               if (priv->regioncode == lbs_region_code_to_index[i])
+                       break;
+       }
 
+       /* if it's unidentified region code, use the default (USA) */
+       if (i >= MRVDRV_MAX_REGION_CODE) {
+               priv->regioncode = 0x10;
+               lbs_pr_info("unidentified region code; using the default (USA)\n");
+       }
+
+       if (priv->current_addr[0] == 0xff)
+               memmove(priv->current_addr, cmd.permanentaddr, ETH_ALEN);
+
+       memcpy(priv->dev->dev_addr, priv->current_addr, ETH_ALEN);
+       if (priv->mesh_dev)
+               memcpy(priv->mesh_dev->dev_addr, priv->current_addr, ETH_ALEN);
+
+       if (lbs_set_regiontable(priv, priv->regioncode, 0)) {
+               ret = -1;
+               goto out;
+       }
+
+       if (lbs_set_universaltable(priv, 0)) {
+               ret = -1;
+               goto out;
+       }
+
+out:
        lbs_deb_leave(LBS_DEB_CMD);
-       return 0;
+       return ret;
 }
 
 static int lbs_cmd_802_11_ps_mode(struct lbs_private *priv,
@@ -1223,9 +1284,6 @@ int lbs_prepare_and_send_command(struct lbs_private *priv,
        cmdptr->result = 0;
 
        switch (cmd_no) {
-       case CMD_GET_HW_SPEC:
-               ret = lbs_cmd_hw_spec(priv, cmdptr);
-               break;
        case CMD_802_11_PS_MODE:
                ret = lbs_cmd_802_11_ps_mode(priv, cmdptr, cmd_action);
                break;
index 72857a1a2482e299e9eba551aba45ea4528c6f7e..b8e5d21329a37070b4e28dc234afab1f5bdaa719 100644 (file)
@@ -22,4 +22,6 @@ int __lbs_cmd(struct lbs_private *priv, uint16_t command,
 int lbs_cmd_copyback(struct lbs_private *priv, unsigned long extra,
                     struct cmd_header *resp);
 
+int lbs_update_hw_spec(struct lbs_private *priv);
+
 #endif /* _LBS_CMD_H */
index 91136697f697deed0fee1bde1a97454c591487a1..671e323764c8d788e57548b9747a350026e166e5 100644 (file)
@@ -145,69 +145,6 @@ static int lbs_ret_reg_access(struct lbs_private *priv,
        return ret;
 }
 
-static int lbs_ret_get_hw_spec(struct lbs_private *priv,
-                               struct cmd_ds_command *resp)
-{
-       u32 i;
-       struct cmd_ds_get_hw_spec *hwspec = &resp->params.hwspec;
-       int ret = 0;
-       DECLARE_MAC_BUF(mac);
-
-       lbs_deb_enter(LBS_DEB_CMD);
-
-       priv->fwcapinfo = le32_to_cpu(hwspec->fwcapinfo);
-
-       memcpy(priv->fwreleasenumber, hwspec->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, hwspec->permanentaddr));
-       lbs_deb_cmd("GET_HW_SPEC: hardware interface 0x%x, hardware spec 0x%04x\n",
-              hwspec->hwifversion, hwspec->version);
-
-       /* Clamp region code to 8-bit since FW spec indicates that it should
-        * only ever be 8-bit, even though the field size is 16-bit.  Some firmware
-        * returns non-zero high 8 bits here.
-        */
-       priv->regioncode = le16_to_cpu(hwspec->regioncode) & 0xFF;
-
-       for (i = 0; i < MRVDRV_MAX_REGION_CODE; i++) {
-               /* use the region code to search for the index */
-               if (priv->regioncode == lbs_region_code_to_index[i]) {
-                       break;
-               }
-       }
-
-       /* if it's unidentified region code, use the default (USA) */
-       if (i >= MRVDRV_MAX_REGION_CODE) {
-               priv->regioncode = 0x10;
-               lbs_pr_info("unidentified region code; using the default (USA)\n");
-       }
-
-       if (priv->current_addr[0] == 0xff)
-               memmove(priv->current_addr, hwspec->permanentaddr, ETH_ALEN);
-
-       memcpy(priv->dev->dev_addr, priv->current_addr, ETH_ALEN);
-       if (priv->mesh_dev)
-               memcpy(priv->mesh_dev->dev_addr, priv->current_addr, ETH_ALEN);
-
-       if (lbs_set_regiontable(priv, priv->regioncode, 0)) {
-               ret = -1;
-               goto done;
-       }
-
-       if (lbs_set_universaltable(priv, 0)) {
-               ret = -1;
-               goto done;
-       }
-
-done:
-       lbs_deb_enter_args(LBS_DEB_CMD, "ret %d", ret);
-       return ret;
-}
-
 static int lbs_ret_802_11_sleep_params(struct lbs_private *priv,
                                        struct cmd_ds_command *resp)
 {
@@ -569,10 +506,6 @@ static inline int handle_cmd_response(struct lbs_private *priv,
                ret = lbs_ret_reg_access(priv, respcmd, resp);
                break;
 
-       case CMD_RET(CMD_GET_HW_SPEC):
-               ret = lbs_ret_get_hw_spec(priv, resp);
-               break;
-
        case CMD_RET(CMD_802_11_SCAN):
                ret = lbs_ret_80211_scan(priv, resp);
                break;
index 93ac46a05c54db724e5a5e3330823cacf35eac45..a87c2174bbf3c277514614f6ea9dddea29fa7bed 100644 (file)
@@ -119,6 +119,8 @@ struct cmd_ds_gen {
  * This structure defines the response for the GET_HW_SPEC command
  */
 struct cmd_ds_get_hw_spec {
+       struct cmd_header hdr;
+
        /* HW Interface version number */
        __le16 hwifversion;
        /* HW version number */
@@ -637,7 +639,6 @@ struct cmd_ds_command {
 
        /* command Body */
        union {
-               struct cmd_ds_get_hw_spec hwspec;
                struct cmd_ds_802_11_ps_mode psmode;
                struct cmd_ds_802_11_scan scan;
                struct cmd_ds_802_11_scan_rsp scanresp;
index 9a231099212f8a9e734de31a2dea8b8c96e47094..9f6c119c2d1bc7614aacf118014d6398d2ee1d4c 100644 (file)
@@ -22,6 +22,7 @@
 #include "debugfs.h"
 #include "assoc.h"
 #include "join.h"
+#include "cmd.h"
 
 #define DRIVER_RELEASE_VERSION "323.p0"
 const char lbs_driver_version[] = "COMM-USB8388-" DRIVER_RELEASE_VERSION
@@ -843,10 +844,7 @@ static int lbs_setup_firmware(struct lbs_private *priv)
         * Read MAC address from HW
         */
        memset(priv->current_addr, 0xff, ETH_ALEN);
-
-       ret = lbs_prepare_and_send_command(priv, CMD_GET_HW_SPEC,
-                                   0, CMD_OPTION_WAITFORRSP, 0, NULL);
-
+       ret = lbs_update_hw_spec(priv);
        if (ret) {
                ret = -1;
                goto done;