ARM: wilc_netdev.c: Added firmware reload retries:
authorJosep Orga <jorga@somdevices.com>
Sun, 22 Mar 2020 18:06:42 +0000 (19:06 +0100)
committerJosep Orga <jorga@somdevices.com>
Sun, 22 Mar 2020 18:06:42 +0000 (19:06 +0100)
·Based on the function wl12xx_init_fw in ./drivers/net/wireless/ti/wlcore/main.c.

Signed-off-by: Josep Orga <jorga@somdevices.com>
drivers/net/wireless/mchp/wilc_netdev.c

index 9c95f2c..a3e0128 100644 (file)
@@ -18,6 +18,7 @@
 #include "wilc_wfi_cfgoperations.h"
 
 #define WILC_MULTICAST_TABLE_SIZE      8
+#define WILC_BOOT_RETRIES 5
 
 static int wilc_mac_open(struct net_device *ndev);
 static int wilc_mac_close(struct net_device *ndev);
@@ -558,24 +559,32 @@ static int wilc_start_firmware(struct net_device *dev)
        struct wilc_vif *vif = netdev_priv(dev);
        struct wilc *wilc = vif->wilc;
        int ret = 0;
+       int retries = WILC_BOOT_RETRIES;
+       while (retries) {
+               retries--;
+               PRINT_INFO(vif->ndev, INIT_DBG, "Starting Firmware ...\n");
 
-       PRINT_INFO(vif->ndev, INIT_DBG, "Starting Firmware ...\n");
-
-       ret = wilc_wlan_start(wilc);
-       if (ret < 0) {
-               PRINT_ER(dev, "Failed to start Firmware\n");
-               return ret;
-       }
-       PRINT_INFO(vif->ndev, INIT_DBG, "Waiting for FW to get ready ...\n");
+               ret = wilc_wlan_start(wilc);
+               if (ret < 0) {
+                       PRINT_ER(dev, "Failed to start Firmware\n");
+                       return ret;
+               }
+               PRINT_INFO(vif->ndev, INIT_DBG, "Waiting for FW to get ready ...\n");
 
-       if (!wait_for_completion_timeout(&wilc->sync_event,
-                                        msecs_to_jiffies(500))) {
-               PRINT_INFO(vif->ndev, INIT_DBG, "Firmware start timed out\n");
-               return -ETIME;
+               if (!wait_for_completion_timeout(&wilc->sync_event,
+                                                msecs_to_jiffies(500))) {
+                       PRINT_INFO(vif->ndev, INIT_DBG, "Firmware start timed out\n");
+                       ret = -ETIME;
+               }
+               else {
+                       PRINT_INFO(vif->ndev, INIT_DBG, "Firmware successfully started\n");
+                       ret = 0;
+                       goto out;
+               }
+               PRINT_INFO(vif->ndev, INIT_DBG, "Reload Firmware ...\n");
        }
-       PRINT_INFO(vif->ndev, INIT_DBG, "Firmware successfully started\n");
-
-       return 0;
+out:
+       return ret;
 }
 
 static int wilc_firmware_download(struct net_device *dev)