This commit extracts firmware copy process into a new function
ks7010_copy_firmware. Because rom_buf is only needed for this
process, memory request for it has been also moved to this new
function so the error handling label release_host_and_free has
been renamed to release_host into ks7010_upload_firmware original
function.

Signed-off-by: Sergio Paracuellos <sergio.paracuel...@gmail.com>
---
 drivers/staging/ks7010/ks7010_sdio.c | 71 ++++++++++++++++++++++--------------
 1 file changed, 43 insertions(+), 28 deletions(-)

diff --git a/drivers/staging/ks7010/ks7010_sdio.c 
b/drivers/staging/ks7010/ks7010_sdio.c
index 11d5be1..f30dba8 100644
--- a/drivers/staging/ks7010/ks7010_sdio.c
+++ b/drivers/staging/ks7010/ks7010_sdio.c
@@ -648,34 +648,21 @@ static inline bool ks7010_is_firmware_running(struct 
ks_wlan_private *priv,
        return (byte == GCR_A_RUN);
 }
 
-static int ks7010_upload_firmware(struct ks_sdio_card *card)
+static int ks7010_copy_firmware(struct ks_wlan_private *priv,
+                               const struct firmware *fw_entry)
 {
-       struct ks_wlan_private *priv = card->priv;
-       unsigned int size, offset, n = 0;
-       unsigned char *rom_buf;
        int ret;
        unsigned int length;
-       const struct firmware *fw_entry = NULL;
+       unsigned int size;
+       unsigned int offset;
+       unsigned int n = 0;
+       unsigned char *rom_buf;
 
        rom_buf = kmalloc(ROM_BUFF_SIZE, GFP_KERNEL);
        if (!rom_buf)
                return -ENOMEM;
 
-       sdio_claim_host(card->func);
-
-       if (ks7010_is_firmware_running(priv, &ret)) {
-               netdev_dbg(priv->net_dev, "MAC firmware running ...\n");
-               goto release_host_and_free;
-       }
-
-       ret = request_firmware(&fw_entry, ROM_FILE,
-                              &priv->ks_sdio_card->func->dev);
-       if (ret)
-               goto release_host_and_free;
-
        length = fw_entry->size;
-
-       n = 0;
        do {
                if (length >= ROM_BUFF_SIZE) {
                        size = ROM_BUFF_SIZE;
@@ -686,32 +673,61 @@ static int ks7010_upload_firmware(struct ks_sdio_card 
*card)
                }
                if (size == 0)
                        break;
+
                memcpy(rom_buf, fw_entry->data + n, size);
 
                offset = n;
-               ret = ks7010_sdio_update_index(priv, KS7010_IRAM_ADDRESS + 
offset);
+               ret = ks7010_sdio_update_index(priv,
+                                              KS7010_IRAM_ADDRESS + offset);
                if (ret)
-                       goto release_firmware;
+                       goto copy_error;
 
                ret = ks7010_sdio_write(priv, DATA_WINDOW, rom_buf, size);
                if (ret)
-                       goto release_firmware;
+                       goto copy_error;
 
-               ret = ks7010_sdio_data_compare(priv, DATA_WINDOW, rom_buf, 
size);
+               ret = ks7010_sdio_data_compare(priv,
+                                              DATA_WINDOW, rom_buf, size);
                if (ret)
-                       goto release_firmware;
+                       goto copy_error;
 
                n += size;
 
        } while (size);
 
-       ret = ks7010_sdio_writeb(priv, GCR_A, GCR_A_REMAP);
+       return ks7010_sdio_writeb(priv, GCR_A, GCR_A_REMAP);
+
+copy_error:
+       kfree(rom_buf);
+       return ret;
+}
+
+static int ks7010_upload_firmware(struct ks_sdio_card *card)
+{
+       struct ks_wlan_private *priv = card->priv;
+       unsigned int n;
+       int ret;
+       const struct firmware *fw_entry = NULL;
+
+       sdio_claim_host(card->func);
+
+       if (ks7010_is_firmware_running(priv, &ret)) {
+               netdev_dbg(priv->net_dev, "MAC firmware running ...\n");
+               goto release_host;
+       }
+
+       ret = request_firmware(&fw_entry, ROM_FILE,
+                              &priv->ks_sdio_card->func->dev);
+       if (ret)
+               goto release_host;
+
+       ret = ks7010_copy_firmware(priv, fw_entry);
        if (ret)
                goto release_firmware;
 
        /* Firmware running check */
        for (n = 0; n < 50; ++n) {
-               mdelay(10);     /* wait_ms(10); */
+               mdelay(10);
                if (ks7010_is_firmware_running(priv, &ret))
                        break;
        }
@@ -723,9 +739,8 @@ static int ks7010_upload_firmware(struct ks_sdio_card *card)
 
  release_firmware:
        release_firmware(fw_entry);
- release_host_and_free:
+ release_host:
        sdio_release_host(card->func);
-       kfree(rom_buf);
 
        return ret;
 }
-- 
2.7.4

_______________________________________________
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

Reply via email to