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 (!priv->copied_hwaddr) {
+               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);
+               priv->copied_hwaddr = 1;
+       }
 
 out:
        lbs_deb_leave(LBS_DEB_CMD);
 
        return 0;
 }
 
+/**
+ * @brief This function gets the HW spec from the firmware and sets
+ *        some basic parameters.
+ *
+ *  @param priv    A pointer to struct lbs_private structure
+ *  @return        0 or -1
+ */
+static int lbs_setup_firmware(struct lbs_private *priv)
+{
+       int ret = -1;
+       s16 curlevel = 0, minlevel = 0, maxlevel = 0;
+
+       lbs_deb_enter(LBS_DEB_FW);
+
+       /* Read MAC address from firmware */
+       memset(priv->current_addr, 0xff, ETH_ALEN);
+       ret = lbs_update_hw_spec(priv);
+       if (ret)
+               goto done;
+
+       /* Read power levels if available */
+       ret = lbs_get_tx_power(priv, &curlevel, &minlevel, &maxlevel);
+       if (ret == 0) {
+               priv->txpower_cur = curlevel;
+               priv->txpower_min = minlevel;
+               priv->txpower_max = maxlevel;
+       }
+
+       /* Send cmd to FW to enable 11D function */
+       ret = lbs_set_snmp_mib(priv, SNMP_MIB_OID_11D_ENABLE, 1);
+
+       lbs_set_mac_control(priv);
+done:
+       lbs_deb_leave_args(LBS_DEB_FW, "ret %d", ret);
+       return ret;
+}
+
 int lbs_suspend(struct lbs_private *priv)
 {
        int ret;
                        lbs_pr_err("deep sleep activation failed: %d\n", ret);
        }
 
-       lbs_deb_leave_args(LBS_DEB_FW, "ret %d", ret);
-       return ret;
-}
-EXPORT_SYMBOL_GPL(lbs_resume);
-
-/**
- * @brief This function gets the HW spec from the firmware and sets
- *        some basic parameters.
- *
- *  @param priv    A pointer to struct lbs_private structure
- *  @return       0 or -1
- */
-static int lbs_setup_firmware(struct lbs_private *priv)
-{
-       int ret = -1;
-       s16 curlevel = 0, minlevel = 0, maxlevel = 0;
-
-       lbs_deb_enter(LBS_DEB_FW);
-
-       /* Read MAC address from firmware */
-       memset(priv->current_addr, 0xff, ETH_ALEN);
-       ret = lbs_update_hw_spec(priv);
-       if (ret)
-               goto done;
-
-       /* Read power levels if available */
-       ret = lbs_get_tx_power(priv, &curlevel, &minlevel, &maxlevel);
-       if (ret == 0) {
-               priv->txpower_cur = curlevel;
-               priv->txpower_min = minlevel;
-               priv->txpower_max = maxlevel;
-       }
+       if (priv->setup_fw_on_resume)
+               ret = lbs_setup_firmware(priv);
 
-       /* Send cmd to FW to enable 11D function */
-       ret = lbs_set_snmp_mib(priv, SNMP_MIB_OID_11D_ENABLE, 1);
-
-       lbs_set_mac_control(priv);
-done:
        lbs_deb_leave_args(LBS_DEB_FW, "ret %d", ret);
        return ret;
 }
+EXPORT_SYMBOL_GPL(lbs_resume);
 
 /**
  *  This function handles the timeout of command sending.