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

📄 skgeasf.c

📁 这是Marvell Technology Group Ltd. 4355 (rev 12)网卡在linux下的驱动程序源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
#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 + -