📄 skgeasf.c
字号:
#else if (spi_flash_manage( pAC->AsfData.FlashBuffer, ASF_FLASH_OFFS, ASF_FLASH_SIZE, SPI_WRITE ) == 0 ) { /* read buffer back */ if( spi_flash_manage( pAC->AsfData.FlashBuffer, ASF_FLASH_OFFS, ASF_FLASH_SIZE, SPI_READ ) == 0 ) { /* compare buffer with content of flash image file */ for( i=0,FlashOk=1; i<ASF_FLASH_SIZE; i++ ) { if( pAC->AsfData.FlashBuffer[i] != *(pAsfFwS1 + FlashOffset + i) ) FlashOk = 0; }#endif if( FlashOk ) { /* read the GUID from flash */#ifdef USE_ASF_DASH_FW printk("%s: Flash Part 1 succeeded\n", SK_DRV_NAME);#endif SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,(" Flash successfully updated (Sector1)\n")); } else {#ifdef USE_ASF_DASH_FW printk("%s: Flash Part 1 did not succeed\n", SK_DRV_NAME);#endif RetCode = SK_ASF_PNMI_ERR_GENERAL; SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,(" *** Error: compare flash content (Sector1)\n")); SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_ASF_E007, SKERR_ASF_E007MSG); } } else { RetCode = SK_ASF_PNMI_ERR_GENERAL; SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,(" *** Error: Flash reread (Sector1)\n")); SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_ASF_E006, SKERR_ASF_E006MSG); } } else { RetCode = SK_ASF_PNMI_ERR_GENERAL; SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,(" *** Error: Flash write (Sector1)\n")); SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_ASF_E004, SKERR_ASF_E004MSG); } /* * Handle sector 2 * (second flash file) */ FlashOk = 1;#ifdef USE_ASF_DASH_FW for( i=0; i<ASF_DASH_FLASH_SIZE_2; i++ ) pAC->AsfData.FlashBuffer[i] = *(pAsfFwS2 + i);#else for( i=0; i<ASF_FLASH_SIZE; i++ ) pAC->AsfData.FlashBuffer[i] = *(pAsfFwS2 + FlashOffset + i);#endif#ifdef USE_ASF_DASH_FW /* write sector 2 buffer to flash and check the buffer */ if (spi_flash_manage( pAC->AsfData.FlashBuffer, FlashOffset + ASF_DASH_FLASH_SIZE_1, ASF_DASH_FLASH_SIZE_2, SPI_WRITE ) == 0 ) { /* read buffer back */ if( spi_flash_manage( pAC->AsfData.FlashBuffer, FlashOffset + ASF_DASH_FLASH_SIZE_1, ASF_DASH_FLASH_SIZE_2, SPI_READ ) == 0 ) { /* compare buffer with content of flash image file */ for( i=0,FlashOk=1; i<ASF_DASH_FLASH_SIZE_2; i++ ) { if( pAC->AsfData.FlashBuffer[i] != *(pAsfFwS2 + i) ) FlashOk = 0; }#else /* write sector 2 buffer to flash and check the buffer */ if (spi_flash_manage( pAC->AsfData.FlashBuffer, ASF_FLASH_OFFS + 65536, ASF_FLASH_SIZE, SPI_WRITE ) == 0 ) { /* read buffer back */ if( spi_flash_manage( pAC->AsfData.FlashBuffer, ASF_FLASH_OFFS + 65536, ASF_FLASH_SIZE, SPI_READ ) == 0 ) { /* compare buffer with content of flash image file */ for( i=0,FlashOk=1; i<ASF_FLASH_SIZE; i++ ) { if( pAC->AsfData.FlashBuffer[i] != *(pAsfFwS2 +FlashOffset + i) ) FlashOk = 0; }#endif if( FlashOk ) {#ifdef USE_ASF_DASH_FW printk("%s: Flash Part 2 succeeded\n", SK_DRV_NAME);#endif /* read the GUID from flash */ for( i=0; i<16; i++ ) pAC->AsfData.Mib.Guid[i] = pAC->AsfData.FlashBuffer[ASF_FLASH_OFFS_GUID - 65536 +i]; /* check if new GUID */ for( i=0; i<16; i++) { if(OldGuid[i] != pAC->AsfData.Mib.Guid[i]) { SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,(" *** NEW GUID (%x)***\n", pAC->AsfData.Mib.Guid[i])); pAC->AsfData.NewGuid = 1; break; } } SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,(" Flash successfully updated (Sector2)\n")); } else {#ifdef USE_ASF_DASH_FW printk("%s: Flash Part 2 did not succeed\n", SK_DRV_NAME);#endif RetCode = SK_ASF_PNMI_ERR_GENERAL; SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,(" *** Error: compare flash content (Sector2)\n")); SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_ASF_E007, SKERR_ASF_E007MSG); } } else { RetCode = SK_ASF_PNMI_ERR_GENERAL; SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,(" *** Error: Flash reread (Sector2)\n")); SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_ASF_E006, SKERR_ASF_E006MSG); } } else { RetCode = SK_ASF_PNMI_ERR_GENERAL; SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,(" *** Error: Flash write (Sector2)\n")); SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_ASF_E004, SKERR_ASF_E004MSG); } } else { RetCode = SK_ASF_PNMI_ERR_GENERAL; SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,(" *** Error: Flash erase\n")); SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_ASF_E003, SKERR_ASF_E003MSG); } /* write pattern etc. */ if (pAC->AsfData.OpMode == SK_GEASF_MODE_IPMI) { /* ipmi on yukon2 */ AsfSetUpPattern(pAC, IoC, 0); if (pAC->AsfData.DualMode == SK_GEASF_Y2_DUALPORT) { AsfSetUpPattern(pAC, IoC, 1); } } /* run cpu */#ifdef USE_ASF_DASH_FW if (!pAC->ReturningFromSuspend)#endif AsfRunCpu( pAC, IoC ); } /* if DoUpdate */ } 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; } } /* Clear the buffer */ if (pAsfFwS1 != NULL) kfree(pAsfFwS1); if (pAsfFwS2 != NULL) kfree(pAsfFwS2); }#ifdef USE_ASF_DASH_FW // Reset WOL_MCTRL Register SK_OUT16(IoC, WOL_MCTRL, 0); // Reset WOL_PME_MEN Register SK_OUT16(IoC, WOL_PME_MEN, 0); // Reset WOL_ASF_MEN Register SK_OUT16(IoC, WOL_ASF_MEN, 0);#endif#ifndef USE_ASF_DASH_FW YlciDisablePattern(pAC, IoC, 0, 5); // Disable ARP pattern, OS is now responsible for ARP handling if (pAC->AsfData.DualMode == SK_GEASF_Y2_DUALPORT) { YlciDisablePattern(pAC, IoC, 1, 5); // Disable ARP pattern, OS is now responsible for ARP handling }#endif /* write pattern etc. */ if (pAC->AsfData.OpMode == SK_GEASF_MODE_IPMI) { // ipmi on yukon2 AsfSetUpPattern(pAC, IoC, 0); if (pAC->AsfData.DualMode == SK_GEASF_Y2_DUALPORT) { AsfSetUpPattern(pAC, IoC, 1); } } if( !pAC->AsfData.CpuAlive ) {#ifdef USE_ASF_DASH_FW if (!pAC->ReturningFromSuspend)#endif AsfRunCpu( pAC, IoC ); } /* ASF MIB parameter to default values */ pAC->AsfData.Mib.WdTimeMax = ASF_DEF_WATCHDOG_TIME_MAX; pAC->AsfData.Mib.WdTimeMin = ASF_DEF_WATCHDOG_TIME_MIN; pAC->AsfData.Mib.RetransCountMin = ASF_DEF_RETRANS_COUNT_MIN; pAC->AsfData.Mib.RetransCountMax = ASF_DEF_RETRANS_COUNT_MAX; pAC->AsfData.Mib.RetransIntMin = ASF_DEF_RETRANS_INT_MIN; pAC->AsfData.Mib.RetransIntMax = ASF_DEF_RETRANS_INT_MAX; pAC->AsfData.Mib.HbIntMin = ASF_DEF_HB_INT_MIN; pAC->AsfData.Mib.HbIntMax = ASF_DEF_HB_INT_MAX; pAC->AsfData.Mib.Ena = ASF_DEF_ASF_ENA; pAC->AsfData.Mib.RspEnable = 0; pAC->AsfData.Mib.Retrans = ASF_DEF_RETRANS; pAC->AsfData.Mib.RetransInt = ASF_DEF_RETRANS_INT; pAC->AsfData.Mib.HbEna = ASF_DEF_HB_ENA; pAC->AsfData.Mib.HbInt = ASF_DEF_HB_INT; pAC->AsfData.Mib.WdEna = ASF_DEF_WATCHDOG_ENA; pAC->AsfData.Mib.WdTime = ASF_DEF_WATCHDOG_TIME; pAC->AsfData.Mib.CommunityName[0] = 0x00; pAC->AsfData.Mib.RlmtMode = 0xff; // only for IPMI op mode pAC->AsfData.Mib.PattUpReq = 0; // update pattern request flag /* Start ASF timer */ SK_MEMSET((char *)&EventParam, 0, sizeof(EventParam)); SkTimerStart(pAC, IoC, &pAC->AsfData.AsfTimer, 5000000, SKGE_ASF, SK_ASF_EVT_TIMER_EXPIRED, EventParam); // initialize the FW WD functionality pAC->AsfData.FwWdIntervall = 120; if( pAC->AsfData.ChipMode == SK_GEASF_CHIP_EX ) { pAC->AsfData.FwRamSize = 0; } else { if( RetCode == SK_ASF_PNMI_ERR_OK ) { SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,(" *** Check FW Ramsize\n")); lRetCode = AsfHciSendCommand(pAC, IoC, YASF_HOSTCMD_CFG_GET_ASF_RAMSIZE, 0, 0, 1, ASF_HCI_WAIT, 2 ); if( lRetCode == HCI_EN_CMD_READY ) { // Fetch received data from HCI interface AsfHciGetData( pAC, &pHciRecBuf ); pAC->AsfData.FwRamSize = ((SK_U16)*(pHciRecBuf+2)) << 8; pAC->AsfData.FwRamSize |= ((SK_U16)*(pHciRecBuf+3)) << 0; SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,(" *** FW RamSize: %dkB \n", pAC->AsfData.FwRamSize)); } // if( lRetCode == HCI_EN_CMD_READY ) if( lRetCode == HCI_EN_CMD_ERROR ) { SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,(" *** error\n")); RetCode = SK_ASF_PNMI_ERR_GENERAL; } } } if( RetCode == SK_ASF_PNMI_ERR_OK ) { SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,(" *** ASF Init O.K. *** (%d)\n", pAC->GIni.GIRamSize)); pAC->AsfData.InitState = ASF_INIT_OK; pAC->GIni.GIRamSize -= pAC->AsfData.FwRamSize; // shorten RAM buffer by FwRamSize SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,(" *** New RAM value (%dk)\n", pAC->GIni.GIRamSize));#ifdef CHIP_ID_YUKON_EX switch(pAC->AsfData.OpMode) { case SK_GEASF_MODE_DASH: pAC->GIni.GINumOfPattern -= 6; break; default: pAC->GIni.GINumOfPattern -= 3; break; } SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_INIT,(" *** New # of pattern (%d)\n", pAC->GIni.GINumOfPattern));#endif // CHIP_ID_YUKON_EX } else { SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,(" *** ASF Init failed ***\n")); AsfSmartResetCpu( pAC, IoC, ASF_RESET_HOT ); pAC->AsfData.InitState = ASF_INIT_ERROR; // disable ASF functionality // after reset the cpu clean up some important registers AsfSetSMBusRegister(IoC); } /* fetch the home MAC address from adapter */ for (i = 0; i < 6; i++) { SK_IN8(IoC, (B2_MAC_1 + i), &pAC->AsfData.Mib.MacSource[i] ); }#ifdef USE_ASF_DASH_FW /* Write patterns to pattern RAM on the Yukon board*/ AsfSetUpPattern(pAC, IoC, 0);#endif#ifdef USE_ASF_DASH_FW /* Set OS Present Flag in ASF Status and Command Register */ AsfSetOsPresentBit( pAC, IoC ); /* Disable ARP pattern, host system takes over the ARP handling */ YlciDisablePattern(pAC, IoC, 0, ASF_DASH_PATTERN_NUM_MAC ); YlciDisablePattern(pAC, IoC, 0, ASF_DASH_PATTERN_NUM_MUL); YlciDisablePattern(pAC, IoC, 0, ASF_DASH_PATTERN_NUM_BDC); YlciDisablePattern(pAC, IoC, 0, ASF_DASH_PATTERN_NUM_ICMPV6);#endif#ifdef USE_ASF_DASH_FW if( AsfHciSendCommand( pAC, IoC, YASF_HOSTCMD_CHECK_ALIVE, 0, 0, 0, ASF_HCI_WAIT, 3 ) != HCI_EN_CMD_READY ) { printk("%s: Communication Driver <-> FW is failing\n", SK_DRV_NAME); } else { printk("%s: Communication Driver <-> FW is working properly\n", SK_DRV_NAME); }#ifdef USE_ALT_TIMING printk("%s: Alternative timing system activated (TSC)\n", SK_DRV_NAME); if (cpu_khz < 100000) printk("%s: WARNING: cpu_khz is calibrated wrong!\n", SK_DRV_NAME); printk("%s: Timing system assumes a machine with %d mhz\n", SK_DRV_NAME, cpu_khz/1000);#endif#endif break; default: break; /* Nothing todo */ } return( RetCode );}/******************************************************************************* AsfSetSMBusRegister - cleaning up register for SMBus** Description: If the ASF FW goes into smart reset, this function is* cleaning up the SMBus register.** Returns:*/void AsfSetSMBusRegister( SK_IOC IoC) /* IO context handle */{ SK_U32 TmpVal32; SK_U32 mask; // get register SK_IN32(IoC, REG_ASF_SMBUS_CFG, &TmpVal32); // delete bit 4: SMBC_IE // delete bit 5: SMBC_EA // delete bit 6: SMBC_GCE // delete bit 7: SMBC_DAE // delete bit 8: SMBC_SAE mask = 0x000001f0; TmpVal32 &= (~mask); // set register SK_OUT32(IoC, REG_ASF_SMBUS_CFG, TmpVal32); SK_DBG_MSG(pAC, SK_DBGMOD_ASF, SK_DBGCAT_CTRL,(" *** ASF cleaning up SMBusRegister 0x%x with 0x%x ***\n", REG_ASF_SMBUS_CFG, TmpVal32));}/******************************************************************************* SkAsfSuspend - Called when card suspends** Description:** Returns:* Always 0*/int SkAsfSuspend(SK_AC *pAC, /* Pointer to adapter context */SK_IOC IoC ) { /* IO context handle */ SK_U8 lRetCode; lRetCode = AsfHciSendCommand(pAC, IoC, YASF_HOSTCMD_TRIGGER_ARP_QUERY, 0, 0, 0, ASF_HCI_WAIT, 1 ); if( lRetCode == HCI_EN_CMD_ERROR ) { printk("sk98lin: Could not trigger LLC frame in FW\n"); } else { printk("sk98lin: LLC frame triggered in FW (%u)\n", lRetCode); } AsfSetUpPattern(pAC, IoC, 0); /* Enable ARP pattern, host system takes over the ARP handling */ YlciEnablePattern(pAC, IoC, 0, ASF_DASH_PATTERN_NUM_MAC ); YlciEnablePattern(pAC, IoC, 0, ASF_DASH_PATTERN_NUM_MUL);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -