bool FirmwareDownload92S(struct net_device *dev) { struct r8192_priv *priv = rtllib_priv(dev); bool rtStatus = true; u8 *pucMappedFile = NULL; u32 ulFileLength = 0; u8 FwHdrSize = RT_8192S_FIRMWARE_HDR_SIZE; rt_firmware *pFirmware = priv->pFirmware; u8 FwStatus = FW_STATUS_INIT; PRT_8192S_FIRMWARE_HDR pFwHdr = NULL; PRT_8192S_FIRMWARE_PRIV pFwPriv = NULL; pFirmware->FWStatus = FW_STATUS_INIT; RT_TRACE(COMP_FIRMWARE, " --->FirmwareDownload92S()\n"); #if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0) && defined(USE_FW_SOURCE_IMG_FILE) priv->firmware_source = FW_SOURCE_IMG_FILE; #else priv->firmware_source = FW_SOURCE_HEADER_FILE; #endif switch( priv->firmware_source ) { case FW_SOURCE_IMG_FILE: #if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0) && defined(USE_FW_SOURCE_IMG_FILE) if(pFirmware->szFwTmpBufferLen == 0) { #ifdef _RTL8192_EXT_PATCH_ const char *pFwImageFileName[1] = {"RTL8191SE_MESH/rtl8192sfw.bin"}; #else const char *pFwImageFileName[1] = {"RTL8192SE/rtl8192sfw.bin"}; #endif const struct firmware *fw_entry = NULL; u32 ulInitStep = 0; int rc = 0; u32 file_length = 0; rc = request_firmware(&fw_entry, pFwImageFileName[ulInitStep],&priv->pdev->dev); if(rc < 0 ) { RT_TRACE(COMP_ERR, "request firmware fail!\n"); goto DownloadFirmware_Fail; } if(fw_entry->size > sizeof(pFirmware->szFwTmpBuffer)) { RT_TRACE(COMP_ERR, "img file size exceed the container buffer fail!\n"); release_firmware(fw_entry); goto DownloadFirmware_Fail; } memcpy(pFirmware->szFwTmpBuffer,fw_entry->data,fw_entry->size); pFirmware->szFwTmpBufferLen = fw_entry->size; release_firmware(fw_entry); pucMappedFile = pFirmware->szFwTmpBuffer; file_length = pFirmware->szFwTmpBufferLen; pFirmware->pFwHeader = (PRT_8192S_FIRMWARE_HDR) pucMappedFile; pFwHdr = pFirmware->pFwHeader; RT_TRACE(COMP_FIRMWARE,"signature:%x, version:%x, size:%x, imemsize:%x, sram size:%x\n", \ pFwHdr->Signature, pFwHdr->Version, pFwHdr->DMEMSize, \ pFwHdr->IMG_IMEM_SIZE, pFwHdr->IMG_SRAM_SIZE); pFirmware->FirmwareVersion = byte(pFwHdr->Version ,0); if ((pFwHdr->IMG_IMEM_SIZE==0) || (pFwHdr->IMG_IMEM_SIZE > sizeof(pFirmware->FwIMEM))) { RT_TRACE(COMP_ERR, "%s: memory for data image is less than IMEM required\n",\ __FUNCTION__); goto DownloadFirmware_Fail; } else { pucMappedFile+=FwHdrSize; memcpy(pFirmware->FwIMEM, pucMappedFile, pFwHdr->IMG_IMEM_SIZE); pFirmware->FwIMEMLen = pFwHdr->IMG_IMEM_SIZE; } if (pFwHdr->IMG_SRAM_SIZE > sizeof(pFirmware->FwEMEM)) { RT_TRACE(COMP_ERR, "%s: memory for data image is less than EMEM required\n",\ __FUNCTION__); goto DownloadFirmware_Fail; } else { pucMappedFile += pFirmware->FwIMEMLen; memcpy(pFirmware->FwEMEM, pucMappedFile, pFwHdr->IMG_SRAM_SIZE); pFirmware->FwEMEMLen = pFwHdr->IMG_SRAM_SIZE; } } #endif break; case FW_SOURCE_HEADER_FILE: #if 1 #define Rtl819XFwImageArray Rtl8192SEFwImgArray pucMappedFile = Rtl819XFwImageArray; ulFileLength = ImgArrayLength; RT_TRACE(COMP_INIT,"Fw download from header.\n"); pFirmware->pFwHeader = (PRT_8192S_FIRMWARE_HDR) pucMappedFile; pFwHdr = pFirmware->pFwHeader; RT_TRACE(COMP_FIRMWARE,"signature:%x, version:%x, size:%x, imemsize:%x, sram size:%x\n", \ pFwHdr->Signature, pFwHdr->Version, pFwHdr->DMEMSize, \ pFwHdr->IMG_IMEM_SIZE, pFwHdr->IMG_SRAM_SIZE); pFirmware->FirmwareVersion = byte(pFwHdr->Version ,0); if ((pFwHdr->IMG_IMEM_SIZE==0) || (pFwHdr->IMG_IMEM_SIZE > sizeof(pFirmware->FwIMEM))) { printk("FirmwareDownload92S(): memory for data image is less than IMEM required\n"); goto DownloadFirmware_Fail; } else { pucMappedFile+=FwHdrSize; memcpy(pFirmware->FwIMEM, pucMappedFile, pFwHdr->IMG_IMEM_SIZE); pFirmware->FwIMEMLen = pFwHdr->IMG_IMEM_SIZE; } if (pFwHdr->IMG_SRAM_SIZE > sizeof(pFirmware->FwEMEM)) { printk(" FirmwareDownload92S(): memory for data image is less than EMEM required\n"); goto DownloadFirmware_Fail; } else { pucMappedFile+= pFirmware->FwIMEMLen; memcpy(pFirmware->FwEMEM, pucMappedFile, pFwHdr->IMG_SRAM_SIZE); pFirmware->FwEMEMLen = pFwHdr->IMG_SRAM_SIZE; } #endif break; default: break; } FwStatus = FirmwareGetNextStatus(pFirmware->FWStatus); while(FwStatus!= FW_STATUS_READY) { switch(FwStatus) { case FW_STATUS_LOAD_IMEM: pucMappedFile = pFirmware->FwIMEM; ulFileLength = pFirmware->FwIMEMLen; break; case FW_STATUS_LOAD_EMEM: pucMappedFile = pFirmware->FwEMEM; ulFileLength = pFirmware->FwEMEMLen; break; case FW_STATUS_LOAD_DMEM: pFwHdr = pFirmware->pFwHeader; pFwPriv = (PRT_8192S_FIRMWARE_PRIV)&pFwHdr->FWPriv; FirmwareHeaderPriveUpdate(dev, pFwPriv); pucMappedFile = (u8*)(pFirmware->pFwHeader)+RT_8192S_FIRMWARE_HDR_EXCLUDE_PRI_SIZE; ulFileLength = FwHdrSize-RT_8192S_FIRMWARE_HDR_EXCLUDE_PRI_SIZE; break; default: RT_TRACE(COMP_ERR, "Unexpected Download step!!\n"); goto DownloadFirmware_Fail; break; } rtStatus = FirmwareDownloadCode(dev, pucMappedFile, ulFileLength); if(rtStatus != true) { RT_TRACE(COMP_ERR, "FirmwareDownloadCode() fail ! \n" ); goto DownloadFirmware_Fail; } rtStatus = FirmwareCheckReady(dev, FwStatus); if(rtStatus != true) { RT_TRACE(COMP_ERR, "FirmwareDownloadCode() fail ! \n"); goto DownloadFirmware_Fail; } FwStatus = FirmwareGetNextStatus(pFirmware->FWStatus); } RT_TRACE(COMP_FIRMWARE, "Firmware Download Success!!\n"); return rtStatus; DownloadFirmware_Fail: RT_TRACE(COMP_ERR, "Firmware Download Fail!!%x\n",read_nic_word(dev, TCR)); rtStatus = false; return rtStatus; }
bool FirmwareDownload92S(struct net_device *dev) { struct r8192_priv *priv = ieee80211_priv(dev); bool rtStatus = true; const char *pFwImageFileName[1] = {"RTL8192SU/rtl8192sfw.bin"}; u8 *pucMappedFile = NULL; u32 ulFileLength, ulInitStep = 0; u8 FwHdrSize = RT_8192S_FIRMWARE_HDR_SIZE; rt_firmware *pFirmware = priv->pFirmware; u8 FwStatus = FW_STATUS_INIT; PRT_8192S_FIRMWARE_HDR pFwHdr = NULL; PRT_8192S_FIRMWARE_PRIV pFwPriv = NULL; int rc; const struct firmware *fw_entry; u32 file_length = 0; pFirmware->FWStatus = FW_STATUS_INIT; RT_TRACE(COMP_FIRMWARE, " --->FirmwareDownload92S()\n"); //3// //3 //<1> Open Image file, and map file to contineous memory if open file success. //3 // or read image file from array. Default load from BIN file //3// priv->firmware_source = FW_SOURCE_IMG_FILE;// We should decided by Reg. switch( priv->firmware_source ) { case FW_SOURCE_IMG_FILE: if(pFirmware->szFwTmpBufferLen == 0) { rc = request_firmware(&fw_entry, pFwImageFileName[ulInitStep],&priv->udev->dev);//===>1 if(rc < 0 ) { RT_TRACE(COMP_ERR, "request firmware fail!\n"); goto DownloadFirmware_Fail; } if(fw_entry->size > sizeof(pFirmware->szFwTmpBuffer)) { RT_TRACE(COMP_ERR, "img file size exceed the container buffer fail!\n"); release_firmware(fw_entry); goto DownloadFirmware_Fail; } memcpy(pFirmware->szFwTmpBuffer,fw_entry->data,fw_entry->size); pFirmware->szFwTmpBufferLen = fw_entry->size; release_firmware(fw_entry); pucMappedFile = pFirmware->szFwTmpBuffer; file_length = pFirmware->szFwTmpBufferLen; //Retrieve FW header. pFirmware->pFwHeader = (PRT_8192S_FIRMWARE_HDR) pucMappedFile; pFwHdr = pFirmware->pFwHeader; RT_TRACE(COMP_FIRMWARE,"signature:%x, version:%x, size:%x, imemsize:%x, sram size:%x\n", \ pFwHdr->Signature, pFwHdr->Version, pFwHdr->DMEMSize, \ pFwHdr->IMG_IMEM_SIZE, pFwHdr->IMG_SRAM_SIZE); pFirmware->FirmwareVersion = byte(pFwHdr->Version ,0); if ((pFwHdr->IMG_IMEM_SIZE==0) || (pFwHdr->IMG_IMEM_SIZE > sizeof(pFirmware->FwIMEM))) { RT_TRACE(COMP_ERR, "%s: memory for data image is less than IMEM required\n",\ __FUNCTION__); goto DownloadFirmware_Fail; } else { pucMappedFile+=FwHdrSize; //Retrieve IMEM image. memcpy(pFirmware->FwIMEM, pucMappedFile, pFwHdr->IMG_IMEM_SIZE); pFirmware->FwIMEMLen = pFwHdr->IMG_IMEM_SIZE; } if (pFwHdr->IMG_SRAM_SIZE > sizeof(pFirmware->FwEMEM)) { RT_TRACE(COMP_ERR, "%s: memory for data image is less than EMEM required\n",\ __FUNCTION__); goto DownloadFirmware_Fail; } else { pucMappedFile += pFirmware->FwIMEMLen; /* Retriecve EMEM image */ memcpy(pFirmware->FwEMEM, pucMappedFile, pFwHdr->IMG_SRAM_SIZE);//===>6 pFirmware->FwEMEMLen = pFwHdr->IMG_SRAM_SIZE; } } break; case FW_SOURCE_HEADER_FILE: #if 1 #define Rtl819XFwImageArray Rtl8192SUFwImgArray //2008.11.10 Add by tynli. pucMappedFile = Rtl819XFwImageArray; ulFileLength = ImgArrayLength; RT_TRACE(COMP_INIT,"Fw download from header.\n"); /* Retrieve FW header*/ pFirmware->pFwHeader = (PRT_8192S_FIRMWARE_HDR) pucMappedFile; pFwHdr = pFirmware->pFwHeader; RT_TRACE(COMP_FIRMWARE,"signature:%x, version:%x, size:%x, imemsize:%x, sram size:%x\n", \ pFwHdr->Signature, pFwHdr->Version, pFwHdr->DMEMSize, \ pFwHdr->IMG_IMEM_SIZE, pFwHdr->IMG_SRAM_SIZE); pFirmware->FirmwareVersion = byte(pFwHdr->Version ,0); if ((pFwHdr->IMG_IMEM_SIZE==0) || (pFwHdr->IMG_IMEM_SIZE > sizeof(pFirmware->FwIMEM))) { printk("FirmwareDownload92S(): memory for data image is less than IMEM required\n"); goto DownloadFirmware_Fail; } else { pucMappedFile+=FwHdrSize; //Retrieve IMEM image. memcpy(pFirmware->FwIMEM, pucMappedFile, pFwHdr->IMG_IMEM_SIZE); pFirmware->FwIMEMLen = pFwHdr->IMG_IMEM_SIZE; } if (pFwHdr->IMG_SRAM_SIZE > sizeof(pFirmware->FwEMEM)) { printk(" FirmwareDownload92S(): memory for data image is less than EMEM required\n"); goto DownloadFirmware_Fail; } else { pucMappedFile+= pFirmware->FwIMEMLen; //Retriecve EMEM image. memcpy(pFirmware->FwEMEM, pucMappedFile, pFwHdr->IMG_SRAM_SIZE); pFirmware->FwEMEMLen = pFwHdr->IMG_SRAM_SIZE; } #endif break; default: break; } FwStatus = FirmwareGetNextStatus(pFirmware->FWStatus); while(FwStatus!= FW_STATUS_READY) { // Image buffer redirection. switch(FwStatus) { case FW_STATUS_LOAD_IMEM: pucMappedFile = pFirmware->FwIMEM; ulFileLength = pFirmware->FwIMEMLen; break; case FW_STATUS_LOAD_EMEM: pucMappedFile = pFirmware->FwEMEM; ulFileLength = pFirmware->FwEMEMLen; break; case FW_STATUS_LOAD_DMEM: /* <Roger_Notes> Partial update the content of header private. 2008.12.18 */ pFwHdr = pFirmware->pFwHeader; pFwPriv = (PRT_8192S_FIRMWARE_PRIV)&pFwHdr->FWPriv; FirmwareHeaderPriveUpdate(dev, pFwPriv); pucMappedFile = (u8*)(pFirmware->pFwHeader)+RT_8192S_FIRMWARE_HDR_EXCLUDE_PRI_SIZE; ulFileLength = FwHdrSize-RT_8192S_FIRMWARE_HDR_EXCLUDE_PRI_SIZE; break; default: RT_TRACE(COMP_ERR, "Unexpected Download step!!\n"); goto DownloadFirmware_Fail; break; } //3// //3// <2> Download image file //3 // rtStatus = FirmwareDownloadCode(dev, pucMappedFile, ulFileLength); if(rtStatus != true) { RT_TRACE(COMP_ERR, "FirmwareDownloadCode() fail ! \n" ); goto DownloadFirmware_Fail; } //3// //3// <3> Check whether load FW process is ready //3 // rtStatus = FirmwareCheckReady(dev, FwStatus); if(rtStatus != true) { RT_TRACE(COMP_ERR, "FirmwareDownloadCode() fail ! \n"); goto DownloadFirmware_Fail; } FwStatus = FirmwareGetNextStatus(pFirmware->FWStatus); } RT_TRACE(COMP_FIRMWARE, "Firmware Download Success!!\n"); return rtStatus; DownloadFirmware_Fail: RT_TRACE(COMP_ERR, "Firmware Download Fail!!%x\n",read_nic_word(dev, TCR)); rtStatus = false; return rtStatus; }
bool FirmwareDownload92S(struct net_device *dev) { struct r8192_priv *priv = ieee80211_priv(dev); bool rtStatus = true; u8 *pucMappedFile = NULL; u32 ulFileLength; u8 FwHdrSize = RT_8192S_FIRMWARE_HDR_SIZE; rt_firmware *pFirmware = priv->pFirmware; u8 FwStatus = FW_STATUS_INIT; PRT_8192S_FIRMWARE_HDR pFwHdr = NULL; PRT_8192S_FIRMWARE_PRIV pFwPriv = NULL; pFirmware->FWStatus = FW_STATUS_INIT; /* * Load the firmware from RTL8192SU/rtl8192sfw.bin if necessary */ if (pFirmware->szFwTmpBufferLen == 0) { if (FirmwareRequest92S(dev, pFirmware) != true) goto DownloadFirmware_Fail; } FwStatus = FirmwareGetNextStatus(pFirmware->FWStatus); while (FwStatus != FW_STATUS_READY) { /* Image buffer redirection. */ switch (FwStatus) { case FW_STATUS_LOAD_IMEM: pucMappedFile = pFirmware->FwIMEM; ulFileLength = pFirmware->FwIMEMLen; break; case FW_STATUS_LOAD_EMEM: pucMappedFile = pFirmware->FwEMEM; ulFileLength = pFirmware->FwEMEMLen; break; case FW_STATUS_LOAD_DMEM: /* Partial update the content of private header */ pFwHdr = pFirmware->pFwHeader; pFwPriv = (PRT_8192S_FIRMWARE_PRIV)&pFwHdr->FWPriv; FirmwareHeaderPriveUpdate(dev, pFwPriv); pucMappedFile = (u8 *)(pFirmware->pFwHeader) + RT_8192S_FIRMWARE_HDR_EXCLUDE_PRI_SIZE; ulFileLength = FwHdrSize - RT_8192S_FIRMWARE_HDR_EXCLUDE_PRI_SIZE; break; default: RT_TRACE(COMP_ERR, "Unexpected Download step!!\n"); goto DownloadFirmware_Fail; break; } /* <2> Download image file */ rtStatus = FirmwareDownloadCode(dev, pucMappedFile, ulFileLength); if(rtStatus != true) goto DownloadFirmware_Fail; /* <3> Check whether load FW process is ready */ rtStatus = FirmwareCheckReady(dev, FwStatus); if(rtStatus != true) goto DownloadFirmware_Fail; FwStatus = FirmwareGetNextStatus(pFirmware->FWStatus); } RT_TRACE(COMP_FIRMWARE, "%s(): Firmware Download Success", __func__); return rtStatus; DownloadFirmware_Fail: RT_TRACE(COMP_ERR, "%s(): failed with TCR-Status: %x\n", __func__, read_nic_word(dev, TCR)); rtStatus = false; return rtStatus; }