From 09b1893831d23bac5d6a0a84ac578fdec7099b7d Mon Sep 17 00:00:00 2001 From: Mateusz Kulikowski Date: Mon, 19 Oct 2015 22:00:26 +0200 Subject: staging: rtl8192e: Add _rtl92e_fw_prepare Add function to request and prepare firmware image. Signed-off-by: Mateusz Kulikowski Signed-off-by: Greg Kroah-Hartman --- .../staging/rtl8192e/rtl8192e/r8192E_firmware.c | 71 ++++++++++++---------- 1 file changed, 39 insertions(+), 32 deletions(-) (limited to 'drivers/staging/rtl8192e') diff --git a/drivers/staging/rtl8192e/rtl8192e/r8192E_firmware.c b/drivers/staging/rtl8192e/rtl8192e/r8192E_firmware.c index 2ac74843c130..b1ee65dfaf57 100644 --- a/drivers/staging/rtl8192e/rtl8192e/r8192E_firmware.c +++ b/drivers/staging/rtl8192e/rtl8192e/r8192E_firmware.c @@ -167,6 +167,36 @@ static bool _rtl92e_fw_check_ready(struct net_device *dev, return rt_status; } +static bool _rtl92e_fw_prepare(struct net_device *dev, struct rt_fw_blob *blob, + const char *name, u8 padding) +{ + const struct firmware *fw; + int rc, i; + bool ret = true; + + rc = request_firmware(&fw, name, &dev->dev); + if (rc < 0) + return false; + + if (round_up(fw->size, 4) > MAX_FW_SIZE - padding) { + netdev_err(dev, "Firmware image %s too big for the device.\n", + name); + ret = false; + goto out; + } + + if (padding) + memset(blob->data, 0, padding); + if (fw->size % 4) + memset(blob->data + padding + fw->size, 0, 4); + memcpy(blob->data + padding, fw->data, fw->size); + + blob->size = round_up(fw->size, 4) + padding; +out: + release_firmware(fw); + return ret; +} + bool rtl92e_init_fw(struct net_device *dev) { struct r8192_priv *priv = rtllib_priv(dev); @@ -202,39 +232,16 @@ bool rtl92e_init_fw(struct net_device *dev) RTL8192E_MAIN_IMG_FW, RTL8192E_DATA_IMG_FW }; - const struct firmware *fw_entry; - int rc; - - rc = request_firmware(&fw_entry, - fw_name[i], - &priv->pdev->dev); - if (rc < 0) { - RT_TRACE(COMP_FIRMWARE, - "request firmware fail!\n"); - goto download_firmware_fail; - } - if (fw_entry->size > MAX_FW_SIZE) { - RT_TRACE(COMP_FIRMWARE, - "img file size exceed the container struct buffer fail!\n"); - release_firmware(fw_entry); + int pad = 0; + + if (i == FW_INIT_STEP1_MAIN) + pad = 128; + + if (!_rtl92e_fw_prepare(dev, + &pfirmware->blobs[i], + fw_name[i], + pad)) goto download_firmware_fail; - } - - if (i != FW_INIT_STEP1_MAIN) { - memcpy(pfirmware->blobs[i].data, - fw_entry->data, fw_entry->size); - pfirmware->blobs[i].size = - fw_entry->size; - - } else { - memset(pfirmware->blobs[i].data, - 0, 128); - memcpy(&pfirmware->blobs[i].data[128], - fw_entry->data, fw_entry->size); - pfirmware->blobs[i].size = - fw_entry->size + 128; - } - release_firmware(fw_entry); } } -- cgit v1.2.3-59-g8ed1b