⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 skgeasf.c

📁 这是Marvell Technology Group Ltd. 4355 (rev 12)网卡在linux下的驱动程序源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
			  FwCs += *pTmp32;			  pTmp32++;			}			pTmp32 = (SK_U32 *) pAsfFwS2;			for( i=0; i<ASF_DASH_FLASH_SIZE_2; i+=4 )  {			  FwCs += *pTmp32;			  pTmp32++;			}#else			/*  calculate CS of the FW image */			pTmp32 = (SK_U32 *) pAsfFwS1;			for( i=0, FwCs=0; i<ASF_FLASH_SIZE; i+=4 )  {				FwCs += *pTmp32;				pTmp32++;			}			pTmp32 = (SK_U32 *) pAsfFwS2;			for( i=0; i<ASF_FLASH_SIZE; i+=4 )  {				FwCs += *pTmp32;				pTmp32++;			}#endif			if( FwCs == 0  )  {  //  CS == 0 => O.K.				FwImageCsOk = 1;				FwImageCs = *(pTmp32 - 1);				SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,("    FW Image Checksum O.K. \n"));			} else  {				printk("%s: File FW Checksum not OK\n", SK_DRV_NAME);				FwImageCsOk = 0;				SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,("    *** Error: FW Image Checksum:0x%x\n", FwCs));			}#ifdef USE_ASF_DASH_FW			pAC->AsfData.DriverVersion[0] = 'v';			pAC->AsfData.DriverVersion[1] = '1';			pAC->AsfData.DriverVersion[2] = '.';			pAC->AsfData.DriverVersion[3] = '0';			pAC->AsfData.DriverVersion[4] = '0';			for( i=0; i<5; i++ )				pAC->AsfData.FileFwVersion[i] = *(pAsfFwS2 + ASF_FLASH_EX_OFFS_VER - 65536 + i);			pAC->AsfData.FileFwRev = *(pAsfFwS2 + ASF_FLASH_EX_OFFS_REV - 65536);#else			pAC->AsfData.DriverVersion[0] = 'v';			pAC->AsfData.DriverVersion[1] = '1';			pAC->AsfData.DriverVersion[2] = '.';			pAC->AsfData.DriverVersion[3] = '1';			pAC->AsfData.DriverVersion[4] = '0';			for( i=0; i<5; i++ )				pAC->AsfData.FileFwVersion[i] = *(pAsfFwS2 + ASF_FLASH_OFFS_VER - 65536 + i);			pAC->AsfData.FileFwRev = *(pAsfFwS2 + ASF_FLASH_OFFS_REV - 65536);#endif				SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,("    FW Image:%c%c%c%c %c Driver:%c%c%c%c\n",					pAC->AsfData.FileFwVersion[1], pAC->AsfData.FileFwVersion[2],					pAC->AsfData.FileFwVersion[3], pAC->AsfData.FileFwVersion[4],					pAC->AsfData.FileFwRev,					pAC->AsfData.DriverVersion[1], pAC->AsfData.DriverVersion[2],					pAC->AsfData.DriverVersion[3], pAC->AsfData.DriverVersion[4] ));			/* check, whether the FW file version suits the driver version */			if( (pAC->AsfData.FileFwVersion[1] == pAC->AsfData.DriverVersion[1]) &&				(pAC->AsfData.FileFwVersion[3] == pAC->AsfData.DriverVersion[3]) &&				(pAC->AsfData.FileFwVersion[4] == pAC->AsfData.DriverVersion[4]) &&				(FwImageCsOk == 1) ) {				/* read the flash  (upper 128k) */				SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,("    FW suits the driver version\n"));				if( pAC->AsfData.ChipMode == SK_GEASF_CHIP_EX )  {				  SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,("    *** Extreme -> Do not reset !!\n"));				}				else if (YukonEcA1)  {  // was if (pAC->GIni.GIChipRev == CHIP_REV_YU_EC_A1) before				  SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,("    *** Chip Rev. A1 -> Do reset !!\n"));				  				  				  AsfResetCpu(pAC, IoC);				  // AsfSmartResetCpu( pAC, IoC, ASF_RESET_HOT );  // fixed in A2				} else  {					/*					 * just in case the FW is not running !!					 * (shouldn磘 happen with A2 and later versions)					 */					if( !pAC->AsfData.CpuAlive )  {						SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,("  *** FW is not running !!  *** \n"));						AsfResetCpu(pAC, IoC);						// AsfSmartResetCpu( pAC, IoC, ASF_RESET_HOT );						// AsfRunCpu( IoC );					}				}				if (!YukonEcA1) {#ifdef USE_ASF_DASH_FW				  AsfLockSpi( pAC, IoC );#else				  SK_OUT8(IoC, GPHY_CTRL + 2, 1);  //  Lock the SPI access#endif				}				spi_init_pac( pAC );				if (!flash_check_spi( &FlashSize )) {#ifdef USE_ASF_DASH_FW				  printk("%s: SPI not present!\n", SK_DRV_NAME);#endif				}				else {				  SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,("    Flash found with size of %d KBytes\n", FlashSize/1024));				}				/* Read flash low pages */				#ifdef USE_ASF_DASH_FW				FwCs = 0;				SpiRetVal = spi_flash_manage( pAC->AsfData.FlashBuffer, ASF_FLASH_EX_OFFS, ASF_DASH_FLASH_SIZE_1, SPI_READ );				pTmp32 = (SK_U32 *) pAC->AsfData.FlashBuffer;				for( i=0; i< ASF_DASH_FLASH_SIZE_1; i+=4 )  {				  FwCs += *pTmp32;				  pTmp32++;				}#else				SpiRetVal = spi_flash_manage( pAC->AsfData.FlashBuffer, ASF_FLASH_OFFS, ASF_FLASH_SIZE, SPI_READ );				if( SpiRetVal == 0 )  {				/* calculate CS of the FW flash */					SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,("    *** Flash low pages loaded. Calculate the CS of the FW flash.\n"));					pTmp32 = (SK_U32 *) pAC->AsfData.FlashBuffer;					for( i=0, FwCs=0; i<ASF_FLASH_SIZE; i+=4 )  {						FwCs += *pTmp32;						pTmp32++;					}				} else {					SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,("    *** Error: SPI read\n"));					SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_ASF_E002, SKERR_ASF_E002MSG);					RetCode = SK_ASF_PNMI_ERR_GENERAL;				}#endif#ifdef USE_ASF_DASH_FW				if( SpiRetVal == 0 )  {				} else {				  RetCode = SK_ASF_PNMI_ERR_GENERAL;				}#endif				/* Read flash high pages */#ifdef USE_ASF_DASH_FW				SpiRetVal = spi_flash_manage( pAC->AsfData.FlashBuffer, ASF_FLASH_EX_OFFS + 65536, ASF_DASH_FLASH_SIZE_2, SPI_READ );#else				SpiRetVal = spi_flash_manage( pAC->AsfData.FlashBuffer, ASF_FLASH_OFFS + 65536, ASF_FLASH_SIZE, SPI_READ );#endif#ifdef USE_ASF_DASH_FW				if( SpiRetVal == 0 )  {				} else {				  RetCode = SK_ASF_PNMI_ERR_GENERAL;				}#endif				if (!YukonEcA1) {#ifdef USE_ASF_DASH_FW				  AsfUnlockSpi( pAC, IoC );#else				  SK_OUT8(IoC, GPHY_CTRL + 2, 0);  //  Unlock the SPI access#endif				}#ifdef USE_ASF_DASH_FW				if( pAC->AsfData.ChipMode == SK_GEASF_CHIP_EX )  {				  if (!pAC->ReturningFromSuspend)				    AsfRunCpu( pAC, IoC );				}#endif				if (( SpiRetVal == 0 ) && (!RetCode)) {				/* calculate CS of the FW flash */					SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,("    *** Flash high pages loaded. Calculate the CS of the FW flash.\n"));					pTmp32 = (SK_U32 *) pAC->AsfData.FlashBuffer;#ifdef USE_ASF_DASH_FW					for( i=0; i< ASF_DASH_FLASH_SIZE_2; i+=4 )  {#else					for( i=0; i<ASF_FLASH_SIZE; i+=4 )  {#endif											FwCs += *pTmp32;						pTmp32++;					}					if( FwCs == 0  )  {  //  CS == 0 => O.K.						FwFlashCsOk = 1;						FwFlashCs = *(pTmp32 - 1);						SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,("    FW Flash Checksum O.K. \n"));					} else  {						FwFlashCsOk = 0;#ifdef USE_ASF_DASH_FW						printk("%s: Chip FW Checksum not OK\n", SK_DRV_NAME);#endif												SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,("    *** Error: FW Flash Checksum:0x%x\n", FwCs));					}#ifdef USE_ASF_DASH_FW					/* read the FW flash version/rev */					for( i=0; i<5; i++ ) {						pAC->AsfData.FlashFwVersion[i] =  pAC->AsfData.FlashBuffer[ASF_FLASH_EX_OFFS_VER - 65536 + i];					}					pAC->AsfData.FlashFwRev = pAC->AsfData.FlashBuffer[ASF_FLASH_EX_OFFS_REV - 65536 ];					/* read the GUID from flash */					SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,("   *** GUID ***\n"));					SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,("    "));					for( i=0; i<16; i++ ) {						pAC->AsfData.Mib.Guid[i] =  pAC->AsfData.FlashBuffer[ASF_FLASH_EX_OFFS_GUID - 65536 +i];						SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,("%x ", pAC->AsfData.Mib.Guid[i]));						OldGuid[i] = pAC->AsfData.FlashBuffer[ASF_FLASH_EX_OFFS_GUID - 65536 +i];					}					SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,("\n"));					SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,("    FW Flash:>>%c%c%c%c %c<<\n",						pAC->AsfData.FlashFwVersion[1], pAC->AsfData.FlashFwVersion[2],						pAC->AsfData.FlashFwVersion[3], pAC->AsfData.FlashFwVersion[4],						pAC->AsfData.FlashFwRev ));#else					/* read the FW flash version/rev */					for( i=0; i<5; i++ ) {						pAC->AsfData.FlashFwVersion[i] =  pAC->AsfData.FlashBuffer[ASF_FLASH_OFFS_VER - 65536 + i];					}					pAC->AsfData.FlashFwRev = pAC->AsfData.FlashBuffer[ASF_FLASH_OFFS_REV - 65536 ];					/* read the GUID from flash */					SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,("   *** GUID ***\n"));					SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,("    "));					for( i=0; i<16; i++ ) {						pAC->AsfData.Mib.Guid[i] =  pAC->AsfData.FlashBuffer[ASF_FLASH_OFFS_GUID - 65536 +i];						SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,("%x ", pAC->AsfData.Mib.Guid[i]));						OldGuid[i] = pAC->AsfData.FlashBuffer[ASF_FLASH_OFFS_GUID - 65536 +i];					}					SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,("\n"));					SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,("    FW Flash:>>%c%c%c%c %c<<\n",						pAC->AsfData.FlashFwVersion[1], pAC->AsfData.FlashFwVersion[2], 						pAC->AsfData.FlashFwVersion[3], pAC->AsfData.FlashFwVersion[4],						pAC->AsfData.FlashFwRev ));#endif#ifdef USE_ASF_DASH_FW#ifdef FORCE_FW_FLASH					// Flash though Flash Version already the Chip and Flash Version of Driver are the same					if (!pAC->ReturningFromSuspend)					  pAC->AsfData.FileFwRev = 'x';					pAC->ReturningFromSuspend = 0;#endif#endif					printk("%s: Flash FW Version %c%c%c%c Rev.%c, File FW Version: %c%c%c%c Rev.%c\n",						   SK_DRV_NAME,					       pAC->AsfData.FlashFwVersion[1], pAC->AsfData.FlashFwVersion[2],					       pAC->AsfData.FlashFwVersion[3], pAC->AsfData.FlashFwVersion[4],					       pAC->AsfData.FlashFwRev,					       pAC->AsfData.FileFwVersion[1], pAC->AsfData.FileFwVersion[2],					       pAC->AsfData.FileFwVersion[3], pAC->AsfData.FileFwVersion[4],					       pAC->AsfData.FileFwRev);					/* check the FW version/rev and update the flash if necessary */					if( ( (pAC->AsfData.FlashFwVersion[1] != pAC->AsfData.DriverVersion[1]) ||						(pAC->AsfData.FlashFwVersion[3] != pAC->AsfData.DriverVersion[3]) ||						(pAC->AsfData.FlashFwVersion[4] != pAC->AsfData.DriverVersion[4]) ||						(pAC->AsfData.FlashFwRev != pAC->AsfData.FileFwRev)               ||						(pAC->AsfData.FileFwRev == 'x')                                   ||   // Rev == 'x' means: do always a flash update ! (for test purposes)#ifdef USE_ASF_DASH_FW						(FwFlashCsOk != 1) ) && (!pAC->ReturningFromSuspend) )           // Checksum error in flash#else						(FwFlashCsOk != 1) ))           // Checksum error in flash#endif					{						SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,("    Updating flash\n"));						// AsfResetCpu( pAC, IoC );						for( i=0; i<ASF_FLASH_SIZE; i++ )							pAC->AsfData.FlashBuffer[i] = *(pAsfFwS1 + FlashOffset + i);						/* flash erase, determine flash size and select area to be erased */						switch (FlashSize) {							case ASF_FLASH_SIZE * 4:	/* 256 kB */#ifdef USE_ASF_DASH_FW							      FlashOffset = ASF_FLASH_EX_OFFS; 								EraseOff = ASF_FLASH_EX_OFFS;#else								EraseOff = ASF_FLASH_OFFS;#endif								break;							case ASF_FLASH_SIZE * 2:	/* 128 kB */#ifdef USE_ASF_DASH_FW							      FlashOffset = 0;#endif								EraseOff = 0;								break;						case 2097152:							      FlashOffset = ASF_FLASH_EX_OFFS; 								EraseOff = ASF_FLASH_EX_OFFS;								printk("%s: Huge FlashSize (%lu) activated\n", SK_DRV_NAME, FlashSize);								break;							default:			/* unsupported */								SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,("    Unsupported Flash Size: %lu\n", FlashSize ));								RetCode = SK_ASF_PNMI_ERR_GENERAL;							#ifdef USE_ASF_DASH_FW								printk("%s: Flash Size (%lu) not supported\n", SK_DRV_NAME, FlashSize);#endif								break;						}						if (!RetCode)							DoUpdate = SK_TRUE;					} else  {						SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,("    Flash is up to date\n"));#ifdef USE_ASF_DASH_FW						printk("%s: Flash is up to date\n", SK_DRV_NAME);#endif											}					if (DoUpdate) {					        /* This hangs the CPU in case we do NOT flash */					        /* So we defer it to this point where we are */  					        /* sure we will flash. */#ifdef USE_ASF_DASH_FW					        AsfSmartResetCpu( pAC, IoC, ASF_RESET_COLD );#endif#ifdef USE_ASF_DASH_FW					        printk("%s: Starting the flash process\n", SK_DRV_NAME);#endif													if (spi_flash_erase( EraseOff, ASF_FLASH_SIZE * 2) == 0 ) {							/*							 * Handle sector 1							 * (first flash file)							 */							/*  write sector 1 buffer to flash and check the buffer */#ifdef USE_ASF_DASH_FW							if (spi_flash_manage( pAC->AsfData.FlashBuffer, FlashOffset, ASF_DASH_FLASH_SIZE_1, SPI_WRITE ) == 0 ) {								/*  read buffer back */								if( spi_flash_manage( pAC->AsfData.FlashBuffer, FlashOffset, ASF_DASH_FLASH_SIZE_1, SPI_READ ) == 0 )  {								  /*  compare buffer with content of flash image file  */								  for( i=0,FlashOk=1; i<ASF_DASH_FLASH_SIZE_1; i++ )  {								    if( pAC->AsfData.FlashBuffer[i] != *(pAsfFwS1 + i) ) {								      FlashOk = 0;								    }								  }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -