libertas_tf: get the MAC address before registering the device
authorLubomir Rintel <lkundrak@v3.sk>
Wed, 20 Feb 2019 10:58:40 +0000 (11:58 +0100)
committerKalle Valo <kvalo@codeaurora.org>
Wed, 20 Feb 2019 17:55:54 +0000 (19:55 +0200)
The start() callback is too late for this: NetworkManager would already
have seen the hardware, thinking 00:00:00:00:00:00 is its permanent
address.

Signed-off-by: Lubomir Rintel <lkundrak@v3.sk>
Reviewed-by: Steve deRosier <derosier@cal-sierra.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/marvell/libertas_tf/main.c

index d8bf0a4071da8a4d1ae0da93b37d0af4d53b1c01..5799e9886d836ee50172072aa23baf334e299d0c 100644 (file)
@@ -125,37 +125,6 @@ static void lbtf_cmd_work(struct work_struct *work)
        lbtf_deb_leave(LBTF_DEB_CMD);
 }
 
-/**
- *  lbtf_setup_firmware: initialize firmware.
- *
- *  @priv    A pointer to struct lbtf_private structure
- *
- *  Returns: 0 on success.
- */
-static int lbtf_setup_firmware(struct lbtf_private *priv)
-{
-       int ret = -1;
-
-       lbtf_deb_enter(LBTF_DEB_FW);
-       /*
-        * Read priv address from HW
-        */
-       eth_broadcast_addr(priv->current_addr);
-       ret = lbtf_update_hw_spec(priv);
-       if (ret) {
-               ret = -1;
-               goto done;
-       }
-
-       lbtf_set_mac_control(priv);
-       lbtf_set_radio_control(priv);
-
-       ret = 0;
-done:
-       lbtf_deb_leave_args(LBTF_DEB_FW, "ret: %d", ret);
-       return ret;
-}
-
 /**
  *  This function handles the timeout of command sending.
  *  It will re-send the same command again.
@@ -289,30 +258,17 @@ static void lbtf_tx_work(struct work_struct *work)
 static int lbtf_op_start(struct ieee80211_hw *hw)
 {
        struct lbtf_private *priv = hw->priv;
-       int ret = -1;
 
        lbtf_deb_enter(LBTF_DEB_MACOPS);
 
-       /* poke the firmware */
        priv->capability = WLAN_CAPABILITY_SHORT_PREAMBLE;
        priv->radioon = RADIO_ON;
        priv->mac_control = CMD_ACT_MAC_RX_ON | CMD_ACT_MAC_TX_ON;
-       ret = lbtf_setup_firmware(priv);
-       if (ret)
-               goto err_setup_firmware;
-
-       if ((priv->fwrelease < LBTF_FW_VER_MIN) ||
-           (priv->fwrelease > LBTF_FW_VER_MAX)) {
-               ret = -1;
-               goto err_setup_firmware;
-       }
+       lbtf_set_mac_control(priv);
+       lbtf_set_radio_control(priv);
 
        lbtf_deb_leave(LBTF_DEB_MACOPS);
        return 0;
-
-err_setup_firmware:
-       lbtf_deb_leave_args(LBTF_DEB_MACOPS, "fw setup error; ret=%d", ret);
-       return ret;
 }
 
 static void lbtf_op_stop(struct ieee80211_hw *hw)
@@ -648,6 +604,15 @@ struct lbtf_private *lbtf_add_card(void *card, struct device *dmdev,
                goto err_init_adapter;
        }
 
+       eth_broadcast_addr(priv->current_addr);
+       if (lbtf_update_hw_spec(priv))
+               goto err_init_adapter;
+
+       if (priv->fwrelease < LBTF_FW_VER_MIN ||
+           priv->fwrelease > LBTF_FW_VER_MAX) {
+               goto err_init_adapter;
+       }
+
        /* The firmware seems to start with the radio enabled. Turn it
         * off before an actual mac80211 start callback is invoked.
         */