mirror of
https://github.com/lwfinger/rtl8188eu.git
synced 2024-11-14 00:59:37 +00:00
make firmware buffer persistent to not request firmware on every access
This commit is contained in:
parent
c2741d0bec
commit
499e15d791
4 changed files with 48 additions and 38 deletions
|
@ -583,29 +583,11 @@ static s32 _FWFreeToGo(struct adapter *padapter)
|
||||||
|
|
||||||
#define IS_FW_81xxC(padapter) (((GET_HAL_DATA(padapter))->FirmwareSignature & 0xFFF0) == 0x88C0)
|
#define IS_FW_81xxC(padapter) (((GET_HAL_DATA(padapter))->FirmwareSignature & 0xFFF0) == 0x88C0)
|
||||||
|
|
||||||
s32 rtl8188e_FirmwareDownload(struct adapter *padapter)
|
static int load_firmware(struct rt_firmware *pFirmware, struct device *device)
|
||||||
{
|
{
|
||||||
s32 rtStatus = _SUCCESS;
|
s32 rtStatus = _SUCCESS;
|
||||||
u8 writeFW_retry = 0;
|
|
||||||
u32 fwdl_start_time;
|
|
||||||
struct hal_data_8188e *pHalData = GET_HAL_DATA(padapter);
|
|
||||||
struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
|
|
||||||
struct device *device = dvobj_to_dev(dvobj);
|
|
||||||
struct rt_firmware *pFirmware = NULL;
|
|
||||||
const struct firmware *fw;
|
const struct firmware *fw;
|
||||||
struct rt_firmware_hdr *pFwHdr = NULL;
|
const char *fw_name = "rtlwifi/rtl8188eufw.bin";
|
||||||
u8 *pFirmwareBuf;
|
|
||||||
u32 FirmwareLen;
|
|
||||||
char fw_name[] = "rtlwifi/rtl8188eufw.bin";
|
|
||||||
static int log_version;
|
|
||||||
|
|
||||||
RT_TRACE(_module_hal_init_c_, _drv_info_, ("+%s\n", __func__));
|
|
||||||
pFirmware = (struct rt_firmware *)rtw_zmalloc(sizeof(struct rt_firmware));
|
|
||||||
if (!pFirmware) {
|
|
||||||
rtStatus = _FAIL;
|
|
||||||
goto Exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (request_firmware(&fw, fw_name, device)) {
|
if (request_firmware(&fw, fw_name, device)) {
|
||||||
rtStatus = _FAIL;
|
rtStatus = _FAIL;
|
||||||
goto Exit;
|
goto Exit;
|
||||||
|
@ -628,14 +610,38 @@ s32 rtl8188e_FirmwareDownload(struct adapter *padapter)
|
||||||
}
|
}
|
||||||
memcpy(pFirmware->szFwBuffer, fw->data, fw->size);
|
memcpy(pFirmware->szFwBuffer, fw->data, fw->size);
|
||||||
pFirmware->ulFwLength = fw->size;
|
pFirmware->ulFwLength = fw->size;
|
||||||
pFirmwareBuf = pFirmware->szFwBuffer;
|
|
||||||
FirmwareLen = pFirmware->ulFwLength;
|
|
||||||
release_firmware(fw);
|
release_firmware(fw);
|
||||||
|
DBG_88E_LEVEL(_drv_info_, "+%s: !bUsedWoWLANFw, FmrmwareLen:%d+\n", __func__, pFirmware->ulFwLength);
|
||||||
|
|
||||||
DBG_88E_LEVEL(_drv_info_, "+%s: !bUsedWoWLANFw, FmrmwareLen:%d+\n", __func__, FirmwareLen);
|
Exit:
|
||||||
|
return rtStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
s32 rtl8188e_FirmwareDownload(struct adapter *padapter)
|
||||||
|
{
|
||||||
|
s32 rtStatus = _SUCCESS;
|
||||||
|
u8 writeFW_retry = 0;
|
||||||
|
u32 fwdl_start_time;
|
||||||
|
struct hal_data_8188e *pHalData = GET_HAL_DATA(padapter);
|
||||||
|
struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
|
||||||
|
struct device *device = dvobj_to_dev(dvobj);
|
||||||
|
struct rt_firmware_hdr *pFwHdr = NULL;
|
||||||
|
u8 *pFirmwareBuf;
|
||||||
|
u32 FirmwareLen;
|
||||||
|
static int log_version;
|
||||||
|
|
||||||
|
RT_TRACE(_module_hal_init_c_, _drv_info_, ("+%s\n", __func__));
|
||||||
|
if (!dvobj->firmware.szFwBuffer)
|
||||||
|
rtStatus = load_firmware(&dvobj->firmware, device);
|
||||||
|
if (rtStatus == _FAIL) {
|
||||||
|
dvobj->firmware.szFwBuffer = NULL;
|
||||||
|
goto Exit;
|
||||||
|
}
|
||||||
|
pFirmwareBuf = dvobj->firmware.szFwBuffer;
|
||||||
|
FirmwareLen = dvobj->firmware.ulFwLength;
|
||||||
|
|
||||||
/* To Check Fw header. Added by tynli. 2009.12.04. */
|
/* To Check Fw header. Added by tynli. 2009.12.04. */
|
||||||
pFwHdr = (struct rt_firmware_hdr *)pFirmware->szFwBuffer;
|
pFwHdr = (struct rt_firmware_hdr *)dvobj->firmware.szFwBuffer;
|
||||||
|
|
||||||
pHalData->FirmwareVersion = le16_to_cpu(pFwHdr->Version);
|
pHalData->FirmwareVersion = le16_to_cpu(pFwHdr->Version);
|
||||||
pHalData->FirmwareSubVersion = pFwHdr->Subversion;
|
pHalData->FirmwareSubVersion = pFwHdr->Subversion;
|
||||||
|
@ -687,10 +693,8 @@ s32 rtl8188e_FirmwareDownload(struct adapter *padapter)
|
||||||
goto Exit;
|
goto Exit;
|
||||||
}
|
}
|
||||||
RT_TRACE(_module_hal_init_c_, _drv_info_, ("Firmware is ready to run!\n"));
|
RT_TRACE(_module_hal_init_c_, _drv_info_, ("Firmware is ready to run!\n"));
|
||||||
kfree(pFirmware->szFwBuffer);
|
|
||||||
Exit:
|
|
||||||
|
|
||||||
kfree(pFirmware);
|
Exit:
|
||||||
return rtStatus;
|
return rtStatus;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -161,6 +161,17 @@ struct registry_priv {
|
||||||
|
|
||||||
#define MAX_CONTINUAL_URB_ERR 4
|
#define MAX_CONTINUAL_URB_ERR 4
|
||||||
|
|
||||||
|
enum firmware_source {
|
||||||
|
FW_SOURCE_IMG_FILE = 0,
|
||||||
|
FW_SOURCE_HEADER_FILE = 1, /* from header file */
|
||||||
|
};
|
||||||
|
|
||||||
|
struct rt_firmware {
|
||||||
|
enum firmware_source eFWSource;
|
||||||
|
u8 *szFwBuffer;
|
||||||
|
u32 ulFwLength;
|
||||||
|
};
|
||||||
|
|
||||||
struct dvobj_priv {
|
struct dvobj_priv {
|
||||||
struct adapter *if1;
|
struct adapter *if1;
|
||||||
struct adapter *if2;
|
struct adapter *if2;
|
||||||
|
@ -176,6 +187,8 @@ struct dvobj_priv {
|
||||||
|
|
||||||
u8 irq_alloc;
|
u8 irq_alloc;
|
||||||
|
|
||||||
|
struct rt_firmware firmware;
|
||||||
|
|
||||||
/*-------- below is for USB INTERFACE --------*/
|
/*-------- below is for USB INTERFACE --------*/
|
||||||
|
|
||||||
u8 nr_endpoint;
|
u8 nr_endpoint;
|
||||||
|
|
|
@ -76,17 +76,6 @@
|
||||||
(le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x2300 || \
|
(le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x2300 || \
|
||||||
(le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x88E0)
|
(le16_to_cpu(_pFwHdr->Signature)&0xFFF0) == 0x88E0)
|
||||||
|
|
||||||
enum firmware_source {
|
|
||||||
FW_SOURCE_IMG_FILE = 0,
|
|
||||||
FW_SOURCE_HEADER_FILE = 1, /* from header file */
|
|
||||||
};
|
|
||||||
|
|
||||||
struct rt_firmware {
|
|
||||||
enum firmware_source eFWSource;
|
|
||||||
u8 *szFwBuffer;
|
|
||||||
u32 ulFwLength;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* This structure must be careful with byte-ordering */
|
/* This structure must be careful with byte-ordering */
|
||||||
|
|
||||||
struct rt_firmware_hdr {
|
struct rt_firmware_hdr {
|
||||||
|
|
|
@ -1222,6 +1222,7 @@ int pm_netdev_open(struct net_device *pnetdev, u8 bnormal)
|
||||||
int netdev_close(struct net_device *pnetdev)
|
int netdev_close(struct net_device *pnetdev)
|
||||||
{
|
{
|
||||||
struct adapter *padapter = (struct adapter *)rtw_netdev_priv(pnetdev);
|
struct adapter *padapter = (struct adapter *)rtw_netdev_priv(pnetdev);
|
||||||
|
struct dvobj_priv *dvobj = adapter_to_dvobj(padapter);
|
||||||
|
|
||||||
RT_TRACE(_module_os_intfs_c_, _drv_info_, ("+88eu_drv - drv_close\n"));
|
RT_TRACE(_module_os_intfs_c_, _drv_info_, ("+88eu_drv - drv_close\n"));
|
||||||
|
|
||||||
|
@ -1260,6 +1261,9 @@ int netdev_close(struct net_device *pnetdev)
|
||||||
rtw_p2p_enable(padapter, P2P_ROLE_DISABLE);
|
rtw_p2p_enable(padapter, P2P_ROLE_DISABLE);
|
||||||
#endif /* CONFIG_88EU_P2P */
|
#endif /* CONFIG_88EU_P2P */
|
||||||
|
|
||||||
|
kfree(dvobj->firmware.szFwBuffer);
|
||||||
|
dvobj->firmware.szFwBuffer = NULL;
|
||||||
|
|
||||||
RT_TRACE(_module_os_intfs_c_, _drv_info_, ("-88eu_drv - drv_close\n"));
|
RT_TRACE(_module_os_intfs_c_, _drv_info_, ("-88eu_drv - drv_close\n"));
|
||||||
DBG_88E("-88eu_drv - drv_close, bup =%d\n", padapter->bup);
|
DBG_88E("-88eu_drv - drv_close, bup =%d\n", padapter->bup);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
Loading…
Reference in a new issue