core_helper.c

来自「6440linuxDriver的源代码」· C语言 代码 · 共 2,385 行 · 第 1/5 页

C
2,385
字号
		pSATASB->Scratch_DMA.parts.low,		pSATASB->Scratch_DMA.parts.high,		0x20);	/* Send this internal request */	Core_ModuleSendRequest(pCore, pReq);}void Device_MakeInquiryTaskRequest(	PDomain_Device pDevice 	){	PCore_Driver_Extension pCore = pDevice->pPort->Core_Extension;	PMV_Request pReq = GetInternalReqFromPool(pCore);	PSATA_Scratch_Buffer pSATASB;	PMV_SG_Table pSGTable;	if( pReq == NULL ) 	{		// no internal requests available - wait for now 		pDevice->Is_Waiting = MV_TRUE; 		return;	}	pSATASB = GetSATAScratchFromPool(pCore);	if( pSATASB == NULL )	{		FreeInternalReqToPool(pCore, pReq);		MV_DPRINT(("ERROR: No more free SATA scratch buffer. Request aborted.\n"));		return;	}	pSGTable = &pReq->SG_Table;	/* Prepare read capacity */	pReq->Cdb[0] = SCSI_CMD_INQUIRY;	pReq->Cdb[4] = 0x60;	pReq->Tag = 0xab;	pReq->Device_Id = pDevice->Id;	//pReq->Req_Flag;	pReq->Cmd_Initiator = pCore;	pReq->Data_Transfer_Length = 0x60;	pReq->Cmd_Flag = CMD_FLAG_DATA_IN;	pReq->Data_Buffer = pSATASB->Scratch_Vir;	pReq->Scratch_Buffer = pSATASB;	pReq->Completion = (void(*)(MV_PVOID,PMV_Request))SAS_InternalReqCallback;	/* Make the SG table. */	SGTable_Init(pSGTable, 0);	SGTable_Append(		pSGTable, 		pSATASB->Scratch_DMA.parts.low,		pSATASB->Scratch_DMA.parts.high,		0x60);	/* Send this internal request */	Core_ModuleSendRequest(pCore, pReq);}void Device_MakeRequestSenseRequest(	IN PCore_Driver_Extension pCore,	IN PDomain_Device pDevice,	IN PMV_Request pNewReq,	IN PMV_Request pOrgReq	){	PMV_SG_Table pSGTable = &pNewReq->SG_Table;	PSATA_Scratch_Buffer pSATASB = GetSATAScratchFromPool(pCore);	/* MV_U8 senseSize = SATA_SCRATCH_BUFFER_SIZE; */	MV_U8 senseSize = 18;	if( pSATASB == NULL )	{		MV_DPRINT(("ERROR: No more free SATA scratch buffer. Request aborted.\n"));		return;	}	pNewReq->Device_Id = pDevice->Id;	pNewReq->Scsi_Status = REQ_STATUS_PENDING;	pNewReq->Cmd_Initiator = pCore;	pNewReq->Data_Transfer_Length = senseSize;	pNewReq->Data_Buffer = pSATASB->Scratch_Vir;	pNewReq->Scratch_Buffer = pSATASB;		pNewReq->Org_Req = pOrgReq;	pNewReq->Cmd_Flag = CMD_FLAG_DATA_IN;#ifdef USE_DMA_FOR_ALL_PACKET_COMMAND		pNewReq->Cmd_Flag |=CMD_FLAG_DMA;#endif	pNewReq->Completion = NULL;	/* Make the SG table. */	SGTable_Init(pSGTable, 0);	SGTable_Append(		pSGTable, 		pSATASB->Scratch_DMA.parts.low,		pSATASB->Scratch_DMA.parts.high,		senseSize		);	MV_DASSERT( senseSize%2==0 );	/* Request Sense request */	pNewReq->Cdb[0]=SCSI_CMD_REQUEST_SENSE;	pNewReq->Cdb[4]=senseSize;	/* Fixed sense data format is 18 bytes. */	MV_ZeroMemory(pNewReq->Data_Buffer, senseSize);}#ifdef CORE_SAS_SUPPORT_ATA_COMMANDvoid Device_MakeModeSenseRequest(	PDomain_Device pDevice 	){	PCore_Driver_Extension pCore = pDevice->pPort->Core_Extension;	PMV_Request pReq = GetInternalReqFromPool(pCore);	PSATA_Scratch_Buffer pSATASB;	PMV_SG_Table pSGTable;	MV_U16 bufferLength = SATA_SCRATCH_BUFFER_SIZE;	if( pReq == NULL ) 	{		// no internal requests available - wait for now 		pDevice->Is_Waiting = MV_TRUE; 		return;	}	pSATASB = GetSATAScratchFromPool(pCore);	if( pSATASB == NULL )	{		FreeInternalReqToPool(pCore, pReq);		MV_DPRINT(("ERROR: No more free SATA scratch buffer. Request aborted.\n"));		return;	}	bufferLength = bufferLength>=0xFF?0xFF:bufferLength;	pReq->Cdb[0] = SCSI_CMD_MODE_SENSE_6;	pReq->Cdb[1] = 0x08;				/* Disable block descriptors */	pReq->Cdb[2] = 0x08;				/* PC=00b(Current values) Page Code=0x08(caching) */	pReq->Cdb[3] = 0;					/* Subpage Code */	pReq->Cdb[4] = (MV_U8)bufferLength;	/* Allocate Length */	pReq->Cdb[5] = 0;					/* Control */	pReq->Tag = 0xab;	pReq->Device_Id = pDevice->Id;	pReq->Cmd_Initiator = pCore;	pReq->Data_Transfer_Length = bufferLength;	pReq->Cmd_Flag = CMD_FLAG_DATA_IN;			/* Data Out */	pReq->Data_Buffer = pSATASB->Scratch_Vir;	pReq->Sense_Info_Buffer =(MV_PVOID)( (MV_PTR_INTEGER)pReq->Data_Buffer+pReq->Data_Transfer_Length);	pReq->Sense_Info_Buffer_Length = 0x24;	pReq->Scratch_Buffer = pSATASB;	pReq->Completion = (void(*)(MV_PVOID,PMV_Request))SAS_InternalReqCallback;	/* Make the SG table. */	pSGTable = &pReq->SG_Table;	SGTable_Init(pSGTable, 0);	SGTable_Append(		pSGTable, 		pSATASB->Scratch_DMA.parts.low,		pSATASB->Scratch_DMA.parts.high,		bufferLength);	/* Send this internal request */	Core_ModuleSendRequest(pCore, pReq);}void Device_MakeModeSelectRequest(	PDomain_Device pDevice 	){	PCore_Driver_Extension pCore = pDevice->pPort->Core_Extension;	PMV_Request pReq = GetInternalReqFromPool(pCore);	if( pReq == NULL ) 	{		// no internal requests available - wait for now 		pDevice->Is_Waiting = MV_TRUE; 		return;	}	pReq->Cdb[0] = SCSI_CMD_MODE_SELECT_6;	pReq->Tag = 0xab;	pReq->Device_Id = pDevice->Id;	pReq->Cmd_Initiator = pCore;	if ( !SCSI_MakeCacheCommand(pCore, pReq, MV_TRUE, MV_TRUE) ) {		/* Lack of resource */		FreeInternalReqToPool(pCore, pReq);		pDevice->Is_Waiting = MV_TRUE;		return;	}	pReq->Completion = (void(*)(MV_PVOID,PMV_Request))SAS_InternalReqCallback;	/* Send this internal request */	Core_ModuleSendRequest(pCore, pReq);}#endif /* CORE_SAS_SUPPORT_ATA_COMMAND */#endif /* _OS_BIOS *//* tell core driver to get port sas address and root expander sas address from a dedicated port */MV_VOID CORE_GetPortAddress(	IN MV_PVOID PortExtension,	OUT MV_U8 *SasAddr	){	PDomain_Port pPort=(PDomain_Port)PortExtension;	PCore_Driver_Extension pCore = (PCore_Driver_Extension)pPort->Core_Extension;	int i;	MV_U64 Val64;	i=0;	while( (pPort->MemberPhyMap&(0x1L<<i))==0 )	{		i++;	}	U64_ASSIGN(Val64, MV_CPU_TO_BE64(pCore->Phy[i].DevSASAddr));	MV_CopyMemory(SasAddr, &Val64, 8);}MV_U32 SMPRespLength(MV_U8 Function){	MV_U32 RespLen;	RespLen=4;	switch(Function)	{	case REPORT_GENERAL:		RespLen+= sizeof(struct SMPResponseReportGeneral)-sizeof(MV_U32);		break;	case REPORT_MANUFACTURER_INFORMATION:		RespLen+= sizeof(struct SMPResponseReportManufacturerInformation)-sizeof(MV_U32);		break;//	case READ_GPIO_REGISTER://		break;	case REPORT_SELF_CONFGRIGRUATION_STATUS:		RespLen+= sizeof(struct SMPResponseReportSelfConfigurationStatus)-sizeof(MV_U32);		break;	case DISCOVER:		RespLen+= sizeof(struct SMPResponseDiscover)-sizeof(MV_U32);		break;	case REPORT_PHY_ERROR_LOG:		RespLen+= sizeof(struct SMPResponseReportPhyErrorLog)-sizeof(MV_U32);		break;	case REPORT_PHY_SATA:		RespLen+= sizeof(struct SMPResponseReportPhySATA)-sizeof(MV_U32);		break;	case REPORT_ROUTE_INFORMATION:		RespLen+= sizeof(struct SMPResponseReportRouteInformation)-sizeof(MV_U32);		break;	case REPORT_PHY_EVENT_INFORMATION:		RespLen+= sizeof(struct SMPResponseReportPhyEventInformation)-sizeof(MV_U32);		break;	case REPORT_PHY_BROADCAST_COUNTS:		RespLen+= sizeof(struct SMPResponseReportBroadcastCounts)-sizeof(MV_U32);		break;	case DISCOVER_LIST:		RespLen+= sizeof(struct SMPResponseDiscoverList)-sizeof(MV_U32);		break;	case REPORT_EXPANDER_ROUTE_TABLE:		RespLen+= sizeof(struct SMPResponseReportExpanderTable)-sizeof(MV_U32);		break;	case CONFIGURE_GENERAL:	case ENABLE_DISABLE_ZONING://	case WRITE_GPIO_REGISTER://		break;	case ZONED_BROADCAST:	case CONFIGURE_ROUTE_INFORMATION:	case PHY_CONTROL:	case PHY_TEST:	case CONFIGURE_PHY_EVENT_INFORMATION:		RespLen+= sizeof(struct SMPResponseConfigureFunction)-sizeof(MV_U32);		break;	}	return RespLen;}extern void SATA_HandleDevicePlugin (PCore_Driver_Extension pCore, PDomain_Port pPort);#ifdef HOT_PLUG_WITH_TIMERvoid SATA_WaitForSignature( MV_PVOID This, MV_PVOID temp ){	PDomain_Port pPort = (PDomain_Port)This;	PCore_Driver_Extension pCore = pPort->Core_Extension;	MV_U8 i;	MV_PU8 timer = (MV_PU8)temp;	MV_DPRINT(("timer is %d\n", *timer));	for(i=0;i<pCore->Phy_Num;i++)	{		if(pPort->MemberPhyMap&MV_BIT(i))			break;	}	if (mv_is_sig_fis_received(pCore->Mmio_Base, i)) 	{		MV_DPRINT(("hot plug: got signature FIS\n"));		SATA_HandleDevicePlugin(pCore, pPort);	}	else if( *timer >= 40 )	{		// we have waited 20 secs for the signature FIS and it still didn't come back		// trying soft reset		MV_DPRINT(("no signature FIS is returned, trying soft reset\n"));		SATA_PortReset(pPort, MV_FALSE);		return;	}	else	{		(*timer)++;		Timer_AddRequest( pCore, 1, SATA_WaitForSignature, pPort, timer );	}}#endif /* HOT_PLUG_WITH_TIMER */#ifdef USE_DYN_REGISTER_SETvoid FreeRegisterSet(MV_PVOID This, PDomain_Device pDevice){	PCore_Driver_Extension pCore = (PCore_Driver_Extension)This;//  not true for hot plug//	if(pDevice->Outstanding_Req) return;	mv_disable_register_set(pCore->Mmio_Base, 					  pDevice->Register_Set);	pDevice->Register_Set=ID_NOT_MAPPED;}voidAssignRegisterSet(MV_PVOID This, PDomain_Device pDevice){	PCore_Driver_Extension pCore = (PCore_Driver_Extension)This;	MV_U32 tmp;	MV_U8 i;	if( IS_SSP(pDevice) ) return;/* if device is in use, can not change its register set */	if(pDevice->Register_Set!=ID_NOT_MAPPED)return;	tmp=MV_REG_READ_DWORD(pCore->Mmio_Base, COMMON_CONTROL);	for( i=0; i<pCore->MaxRegisterSet; i++ )	{		if(i==16) tmp=MV_REG_READ_DWORD(pCore->Mmio_Base, COMMON_CONFIG);		if( !(tmp & MV_BIT(((i&0x0f)+16))) )		{			pDevice->Register_Set = i;			if(i<16)				MV_REG_WRITE_DWORD( pCore->Mmio_Base, COMMON_CONTROL, tmp | MV_BIT((i+16)) );			else				MV_REG_WRITE_DWORD( pCore->Mmio_Base, COMMON_CONFIG, tmp | MV_BIT(((i&0x0f)+16)) );			break;		}	}}#ifdef SUPPORT_PMvoid PM_FreeRegisterSet(MV_PVOID This, PDomain_PM pPM){	PCore_Driver_Extension pCore = (PCore_Driver_Extension)This;	mv_disable_register_set(pCore->Mmio_Base, pPM->Register_Set);	pPM->Register_Set = ID_NOT_MAPPED;}MV_U8PM_AssignRegisterSet(MV_PVOID This, PDomain_PM pPM){	PCore_Driver_Extension pCore = (PCore_Driver_Extension)This;	MV_U32 tmp;	MV_U8 i;	if (pPM->Register_Set != ID_NOT_MAPPED)		return (pPM->Register_Set);	tmp = MV_REG_READ_DWORD(pCore->Mmio_Base, COMMON_CONTROL);	for( i=0; i<pCore->MaxRegisterSet; i++ )	{		if(i==16) tmp=MV_REG_READ_DWORD(pCore->Mmio_Base, COMMON_CONFIG);		if( !(tmp & MV_BIT(((i&0x0f)+16))) )		{			pPM->Register_Set = i;			pPM->Last_Register_Set = i;			if(i<16)				MV_REG_WRITE_DWORD( pCore->Mmio_Base, COMMON_CONTROL, tmp | MV_BIT((i+16)) );			else				MV_REG_WRITE_DWORD( pCore->Mmio_Base, COMMON_CONFIG, tmp | MV_BIT(((i&0x0f)+16)) );			break;		}	}	return (pPM->Register_Set);}#endif#endifvoid Port_Monitor(PDomain_Port pPort){#ifndef _OS_BIOS	PCore_Driver_Extension pCore = pPort->Core_Extension;		MV_U16 i;	MV_PRINT("Port_Monitor: Running_Slot[0]=0x%x.\n", pCore->Running_Slot[0]);	for ( i=0; i<pCore->Slot_Count_Supported; i++ )	{		if ( pCore->Running_Req[i]!=NULL )		{			if( MapPortId(pCore, pCore->Running_Req[i]->Device_Id) == pPort->Id )			{				MV_DumpRequest(pCore->Running_Req[i], MV_FALSE);				MV_PRINT("pReq(0x%p) tag=0x%x\n",pCore->Running_Req[i],pCore->Running_Req[i]->Tag);			}		}	}#endif}#if defined(SUPPORT_CSMI)static void Core_CSMI_SMPReq_Callback(	 IN PCore_Driver_Extension pCore,	 IN PMV_Request pReq	 ){	MV_U8 portId, expanderId;	PDomain_Expander pExpander;	struct SMPResponse *pSMPResp;	PDomain_Port pPort; 	PMV_Request pUpperReq;	portId = MapPortId(pCore, pReq->Device_Id);	pPort = &pCore->Ports[MapPortEntry(pCore,portId)];	expanderId = (MV_U8)pReq->Device_Id;	pExpander = &pCore->Expanders[MapDeviceId(pCore, pReq->Device_Id)];	pSMPResp= (struct SMPResponse *)pReq->Data_Buffer;	pUpperReq = (PMV_Request)pReq->Org_Req;	if(	(pSMPResp->Function == REPORT_GENERAL)&&		(pSMPResp->Function == DISCOVER)	){		pUpperReq->Data_Transfer_Length = pReq->Data_Transfer_Length;		MV_CopyMemory(pUpperReq->Context[MODULE_CORE], pReq->Data_Buffer, pReq->Data_Transfer_Length);	}	MV_DPRINT(("SMP Function 0x%x Done For Port[0x%x].Target[0x%x] "		 "Result 0x%x\n", 		 pSMPResp->Function, 		 portId, 		 expanderId,		 pSMPResp->FunctionResult));	switch(pSMPResp->Function)	{	case REPORT_GENERAL:		MV_DPRINT((" Number of Phy 0x%x\n", 			pSMPResp->Response.ReportGeneral.NumberOfPhys));		MV_DPRINT((" Virtual Phy Id 0x%02x%02x%02x%02x%02x%02x%02x%02x\n", 			pSMPResp->Response.ReportGeneral.EnclosureLogicalIdentifier[0],			pSMPResp->Response.ReportGeneral.EnclosureLogicalIdentifier[1],			pSMPResp->Response.ReportGeneral.EnclosureLogicalIdentifier[2],			pSMPResp->Response.ReportGeneral.EnclosureLogicalIdentifier[3],			pSMPResp->Response.ReportGeneral.EnclosureLogicalIdentifier[4],			pSMPResp->Response.ReportGeneral.EnclosureLogicalIdentifier[5],			pSMPResp->Response.ReportGeneral.EnclosureLogicalIdentifier[6],			pSMPResp->Response.ReportGeneral.EnclosureLogicalIdentifier[7]));		MV_DPRINT((" Need Configured 0x%x\n", 

⌨️ 快捷键说明

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