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.paracuellos@xxxxxxxxx> --- 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 devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel