]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/net/wireless/rtlwifi/rtl8192c/fw_common.c
rtlwifi: Convert to asynchronous firmware load
[mv-sheeva.git] / drivers / net / wireless / rtlwifi / rtl8192c / fw_common.c
index 931d97979b04e3bcd26dbdfa1fdfa390be48db6e..c20b3c30f62ed7bfdeef57cebef888228ec07d9f 100644 (file)
@@ -1,6 +1,6 @@
 /******************************************************************************
  *
- * Copyright(c) 2009-2010  Realtek Corporation.
+ * Copyright(c) 2009-2012  Realtek Corporation.
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of version 2 of the GNU General Public License as
  *
  *****************************************************************************/
 
-#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
-
-#include <linux/firmware.h>
-#include <linux/export.h>
 #include "../wifi.h"
 #include "../pci.h"
 #include "../base.h"
 #include "../rtl8192ce/reg.h"
 #include "../rtl8192ce/def.h"
 #include "fw_common.h"
+#include <linux/export.h>
 
 static void _rtl92c_enable_fw_download(struct ieee80211_hw *hw, bool enable)
 {
@@ -172,7 +169,7 @@ static void _rtl92c_write_fw(struct ieee80211_hw *hw,
        struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
        u8 *bufferPtr = (u8 *) buffer;
 
-       RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE, ("FW size is %d bytes,\n", size));
+       RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE, "FW size is %d bytes\n", size);
 
        if (IS_CHIP_VER_B(version)) {
                u32 pageNums, remainSize;
@@ -186,7 +183,7 @@ static void _rtl92c_write_fw(struct ieee80211_hw *hw,
 
                if (pageNums > 4) {
                        RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                                ("Page numbers should not greater then 4\n"));
+                                "Page numbers should not greater then 4\n");
                }
 
                for (page = 0; page < pageNums; page++) {
@@ -219,13 +216,12 @@ static int _rtl92c_fw_free_to_go(struct ieee80211_hw *hw)
 
        if (counter >= FW_8192C_POLLING_TIMEOUT_COUNT) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("chksum report faill ! REG_MCUFWDL:0x%08x .\n",
-                         value32));
+                        "chksum report faill ! REG_MCUFWDL:0x%08x\n", value32);
                return -EIO;
        }
 
        RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
-                ("Checksum report OK ! REG_MCUFWDL:0x%08x .\n", value32));
+                "Checksum report OK ! REG_MCUFWDL:0x%08x\n", value32);
 
        value32 = rtl_read_dword(rtlpriv, REG_MCUFWDL);
        value32 |= MCUFWDL_RDY;
@@ -238,9 +234,8 @@ static int _rtl92c_fw_free_to_go(struct ieee80211_hw *hw)
                value32 = rtl_read_dword(rtlpriv, REG_MCUFWDL);
                if (value32 & WINTINI_RDY) {
                        RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
-                                ("Polling FW ready success!!"
-                                " REG_MCUFWDL:0x%08x .\n",
-                                value32));
+                                "Polling FW ready success!! REG_MCUFWDL:0x%08x\n",
+                                value32);
                        return 0;
                }
 
@@ -249,7 +244,7 @@ static int _rtl92c_fw_free_to_go(struct ieee80211_hw *hw)
        } while (counter++ < FW_8192C_POLLING_TIMEOUT_COUNT);
 
        RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                ("Polling FW ready fail!! REG_MCUFWDL:0x%08x .\n", value32));
+                "Polling FW ready fail!! REG_MCUFWDL:0x%08x\n", value32);
        return -EIO;
 }
 
@@ -262,20 +257,19 @@ int rtl92c_download_fw(struct ieee80211_hw *hw)
        u32 fwsize;
        enum version_8192c version = rtlhal->version;
 
-       if (!rtlhal->pfirmware)
+       if (rtlpriv->max_fw_size == 0 || !rtlhal->pfirmware)
                return 1;
 
-       pr_info("Loading firmware file %s\n", rtlpriv->cfg->fw_name);
        pfwheader = (struct rtl92c_firmware_header *)rtlhal->pfirmware;
        pfwdata = (u8 *) rtlhal->pfirmware;
        fwsize = rtlhal->fwsize;
 
        if (IS_FW_HEADER_EXIST(pfwheader)) {
                RT_TRACE(rtlpriv, COMP_FW, DBG_DMESG,
-                        ("Firmware Version(%d), Signature(%#x),Size(%d)\n",
+                        "Firmware Version(%d), Signature(%#x),Size(%d)\n",
                         le16_to_cpu(pfwheader->version),
                         le16_to_cpu(pfwheader->signature),
-                        (uint)sizeof(struct rtl92c_firmware_header)));
+                        (uint)sizeof(struct rtl92c_firmware_header));
 
                pfwdata = pfwdata + sizeof(struct rtl92c_firmware_header);
                fwsize = fwsize - sizeof(struct rtl92c_firmware_header);
@@ -287,10 +281,10 @@ int rtl92c_download_fw(struct ieee80211_hw *hw)
 
        if (_rtl92c_fw_free_to_go(hw)) {
                RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                        ("Firmware is not ready to run!\n"));
+                        "Firmware is not ready to run!\n");
        } else {
                RT_TRACE(rtlpriv, COMP_FW, DBG_TRACE,
-                        ("Firmware is ready to run!\n"));
+                        "Firmware is ready to run!\n");
        }
 
        return 0;
@@ -328,22 +322,22 @@ static void _rtl92c_fill_h2c_command(struct ieee80211_hw *hw,
        unsigned long flag;
        u8 idx;
 
-       RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, ("come in\n"));
+       RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "come in\n");
 
        while (true) {
                spin_lock_irqsave(&rtlpriv->locks.h2c_lock, flag);
                if (rtlhal->h2c_setinprogress) {
                        RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
-                                ("H2C set in progress! Wait to set.."
-                                 "element_id(%d).\n", element_id));
+                                "H2C set in progress! Wait to set..element_id(%d)\n",
+                                element_id);
 
                        while (rtlhal->h2c_setinprogress) {
                                spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock,
                                                       flag);
                                h2c_waitcounter++;
                                RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
-                                        ("Wait 100 us (%d times)...\n",
-                                         h2c_waitcounter));
+                                        "Wait 100 us (%d times)...\n",
+                                        h2c_waitcounter);
                                udelay(100);
 
                                if (h2c_waitcounter > 1000)
@@ -363,8 +357,7 @@ static void _rtl92c_fill_h2c_command(struct ieee80211_hw *hw,
                wait_writeh2c_limmit--;
                if (wait_writeh2c_limmit == 0) {
                        RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                                ("Write H2C fail because no trigger "
-                                 "for FW INT!\n"));
+                                "Write H2C fail because no trigger for FW INT!\n");
                        break;
                }
 
@@ -388,7 +381,7 @@ static void _rtl92c_fill_h2c_command(struct ieee80211_hw *hw,
                        break;
                default:
                        RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                                ("switch case not process\n"));
+                                "switch case not processed\n");
                        break;
                }
 
@@ -398,8 +391,8 @@ static void _rtl92c_fill_h2c_command(struct ieee80211_hw *hw,
                        wait_h2c_limmit--;
                        if (wait_h2c_limmit == 0) {
                                RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
-                                        ("Wating too long for FW read "
-                                         "clear HMEBox(%d)!\n", boxnum));
+                                        "Waiting too long for FW read clear HMEBox(%d)!\n",
+                                        boxnum);
                                break;
                        }
 
@@ -408,14 +401,14 @@ static void _rtl92c_fill_h2c_command(struct ieee80211_hw *hw,
                        isfw_read = _rtl92c_check_fw_read_last_h2c(hw, boxnum);
                        u1b_tmp = rtl_read_byte(rtlpriv, 0x1BF);
                        RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
-                                ("Wating for FW read clear HMEBox(%d)!!! "
-                                 "0x1BF = %2x\n", boxnum, u1b_tmp));
+                                "Waiting for FW read clear HMEBox(%d)!!! 0x1BF = %2x\n",
+                                boxnum, u1b_tmp);
                }
 
                if (!isfw_read) {
                        RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
-                                ("Write H2C register BOX[%d] fail!!!!! "
-                                 "Fw do not read.\n", boxnum));
+                                "Write H2C register BOX[%d] fail!!!!! Fw do not read\n",
+                                boxnum);
                        break;
                }
 
@@ -423,8 +416,8 @@ static void _rtl92c_fill_h2c_command(struct ieee80211_hw *hw,
                memset(boxextcontent, 0, sizeof(boxextcontent));
                boxcontent[0] = element_id;
                RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
-                        ("Write element_id box_reg(%4x) = %2x\n",
-                         box_reg, element_id));
+                        "Write element_id box_reg(%4x) = %2x\n",
+                        box_reg, element_id);
 
                switch (cmd_len) {
                case 1:
@@ -493,7 +486,7 @@ static void _rtl92c_fill_h2c_command(struct ieee80211_hw *hw,
                        break;
                default:
                        RT_TRACE(rtlpriv, COMP_ERR, DBG_EMERG,
-                                ("switch case not process\n"));
+                                "switch case not processed\n");
                        break;
                }
 
@@ -504,29 +497,22 @@ static void _rtl92c_fill_h2c_command(struct ieee80211_hw *hw,
                        rtlhal->last_hmeboxnum = 0;
 
                RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD,
-                        ("pHalData->last_hmeboxnum  = %d\n",
-                         rtlhal->last_hmeboxnum));
+                        "pHalData->last_hmeboxnum  = %d\n",
+                        rtlhal->last_hmeboxnum);
        }
 
        spin_lock_irqsave(&rtlpriv->locks.h2c_lock, flag);
        rtlhal->h2c_setinprogress = false;
        spin_unlock_irqrestore(&rtlpriv->locks.h2c_lock, flag);
 
-       RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, ("go out\n"));
+       RT_TRACE(rtlpriv, COMP_CMD, DBG_LOUD, "go out\n");
 }
 
 void rtl92c_fill_h2c_cmd(struct ieee80211_hw *hw,
                         u8 element_id, u32 cmd_len, u8 *p_cmdbuffer)
 {
-       struct rtl_hal *rtlhal = rtl_hal(rtl_priv(hw));
        u32 tmp_cmdbuf[2];
 
-       if (rtlhal->fw_ready == false) {
-               RT_ASSERT(false, ("return H2C cmd because of Fw "
-                                 "download fail!!!\n"));
-               return;
-       }
-
        memset(tmp_cmdbuf, 0, 8);
        memcpy(tmp_cmdbuf, p_cmdbuffer, cmd_len);
        _rtl92c_fill_h2c_command(hw, element_id, cmd_len, (u8 *)&tmp_cmdbuf);
@@ -547,7 +533,7 @@ void rtl92c_firmware_selfreset(struct ieee80211_hw *hw)
        while (u1b_tmp & BIT(2)) {
                delay--;
                if (delay == 0) {
-                       RT_ASSERT(false, ("8051 reset fail.\n"));
+                       RT_ASSERT(false, "8051 reset fail\n");
                        break;
                }
                udelay(50);
@@ -562,7 +548,7 @@ void rtl92c_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode)
        u8 u1_h2c_set_pwrmode[3] = {0};
        struct rtl_ps_ctl *ppsc = rtl_psc(rtl_priv(hw));
 
-       RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, ("FW LPS mode = %d\n", mode));
+       RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD, "FW LPS mode = %d\n", mode);
 
        SET_H2CCMD_PWRMODE_PARM_MODE(u1_h2c_set_pwrmode, mode);
        SET_H2CCMD_PWRMODE_PARM_SMART_PS(u1_h2c_set_pwrmode, 1);
@@ -570,7 +556,7 @@ void rtl92c_set_fw_pwrmode_cmd(struct ieee80211_hw *hw, u8 mode)
                                              ppsc->reg_max_lps_awakeintvl);
 
        RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
-                     "rtl92c_set_fw_rsvdpagepkt(): u1_h2c_set_pwrmode\n",
+                     "rtl92c_set_fw_rsvdpagepkt(): u1_h2c_set_pwrmode",
                      u1_h2c_set_pwrmode, 3);
        rtl92c_fill_h2c_cmd(hw, H2C_SETPWRMODE, 3, u1_h2c_set_pwrmode);
 
@@ -780,14 +766,16 @@ void rtl92c_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool dl_finished)
        totalpacketlen = TOTAL_RESERVED_PKT_LEN;
 
        RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_LOUD,
-                     "rtl92c_set_fw_rsvdpagepkt(): HW_VAR_SET_TX_CMD: ALL\n",
+                     "rtl92c_set_fw_rsvdpagepkt(): HW_VAR_SET_TX_CMD: ALL",
                      &reserved_page_packet[0], totalpacketlen);
        RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
-                     "rtl92c_set_fw_rsvdpagepkt(): HW_VAR_SET_TX_CMD: ALL\n",
+                     "rtl92c_set_fw_rsvdpagepkt(): HW_VAR_SET_TX_CMD: ALL",
                      u1RsvdPageLoc, 3);
 
 
        skb = dev_alloc_skb(totalpacketlen);
+       if (!skb)
+               return;
        memcpy((u8 *) skb_put(skb, totalpacketlen),
               &reserved_page_packet, totalpacketlen);
 
@@ -798,15 +786,14 @@ void rtl92c_set_fw_rsvdpagepkt(struct ieee80211_hw *hw, bool dl_finished)
 
        if (dlok) {
                RT_TRACE(rtlpriv, COMP_POWER, DBG_LOUD,
-                        ("Set RSVD page location to Fw.\n"));
+                        "Set RSVD page location to Fw\n");
                RT_PRINT_DATA(rtlpriv, COMP_CMD, DBG_DMESG,
-                               "H2C_RSVDPAGE:\n",
-                               u1RsvdPageLoc, 3);
+                             "H2C_RSVDPAGE", u1RsvdPageLoc, 3);
                rtl92c_fill_h2c_cmd(hw, H2C_RSVDPAGE,
                                    sizeof(u1RsvdPageLoc), u1RsvdPageLoc);
        } else
                RT_TRACE(rtlpriv, COMP_ERR, DBG_WARNING,
-                        ("Set RSVD page location to Fw FAIL!!!!!!.\n"));
+                        "Set RSVD page location to Fw FAIL!!!!!!\n");
 }
 EXPORT_SYMBOL(rtl92c_set_fw_rsvdpagepkt);