core_helper.c

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

C
2,385
字号
	pPM->Last_Register_Set=ID_NOT_MAPPED;#endif	MV_LIST_HEAD_INIT(&pPM->Sent_Req_List);}PDomain_PM GetPMFromPool( PCore_Driver_Extension pCore ){	MV_U16 index;	MV_U8 i=0;	if( Tag_IsEmpty(&pCore->PM_Pool) )	{		MV_DPRINT(("PM pool empty!\n"));		return NULL;	}	index = Tag_GetOne(&pCore->PM_Pool);// for consistant binding, we will try to find the first available ID		/* this ID is already taken - we need to find another */		/* should only happen after a lot of hot plugs, so that the 		   IDs looped around */	for (i=MIN_PM_ID; i<MAX_PM_ID; i++)	{		if( pCore->Device_Map[i] == ID_NOT_MAPPED )		{                        /* update the last ID into Current_Device_Id */			if (pCore->Current_PM_Id < i) 				pCore->Current_PM_Id = i;				break;		}	}	if (i == MAX_PM_ID)	{		MV_DPRINT(("Ran out of PM IDs!\n"));			return NULL;	}	pCore->Device_Map[i] = (MV_U8) index;	PreEmptyPM(&pCore->PMs[index]);	pCore->PMs[index].Id = i;	/*	It means after driver started, it happen PM hotplug event	We need to notify all PM devices	*/	if (pCore->State == CORE_STATE_STARTED)		pCore->PMs[index].PluginNotify = 0xFFFF;	pCore->PMs[index].State = PM_STATE_IDLE;	pCore->PMs[index].Status = PM_STATUS_IDLE;	return &pCore->PMs[index];}#endifvoid FreePortToPool( PCore_Driver_Extension pCore, PDomain_Port pPort ){	MV_U16 index;	index=pCore->Port_Map[pPort->Id];	pCore->Port_Map[pPort->Id] = ID_NOT_MAPPED;		Tag_ReleaseOne(&pCore->Port_Pool, index);}void PreEmptyDevice(PDomain_Device pDevice){	MV_ZeroMemory((MV_U8 *)pDevice,sizeof(Domain_Device));#ifdef SUPPORT_TIMER	pDevice->Timer_ID=NO_CURRENT_TIMER;#endif#ifdef USE_DYN_REGISTER_SET	pDevice->Register_Set=ID_NOT_MAPPED;#endif	pDevice->Queue_Depth=255;	MV_LIST_HEAD_INIT(&pDevice->Sent_Req_List);}PDomain_Device GetDeviceFromPool( PCore_Driver_Extension pCore ){	MV_U16 index;	MV_U8 i=0;	if( Tag_IsEmpty(&pCore->Device_Pool) )	{		MV_DPRINT(("Device pool empty!\n"));		return NULL;	}	index = Tag_GetOne(&pCore->Device_Pool);        /* for consistant binding, we will try to find the first available	 * ID this ID is already taken - we need to find another	 * should only happen after a lot of hot plugs, so that the 	 * IDs looped around 	 */	for (i = 0; i < MAX_DEVICE_ID; i++)	{		if( pCore->Device_Map[i] == ID_NOT_MAPPED )		{                        /* update the last ID into Current_Device_Id */			if (pCore->Current_Device_Id < i) 				pCore->Current_Device_Id = i;			break;		}	}	if (i == MAX_DEVICE_ID)	{		MV_DPRINT(("Ran out of device IDs!\n"));		return NULL;	}	pCore->Device_Map[i] = (MV_U8) index;	PreEmptyDevice(&pCore->Devices[index]);	pCore->Devices[index].Id = i;	pCore->Devices[index].State = DEVICE_STATE_IDLE;		/* Set some default value. */	pCore->Devices[index].MDMA_Mode	= 0xFF;	pCore->Devices[index].PIO_Mode	= 0xFF;	pCore->Devices[index].UDMA_Mode	= 0xFF;	pCore->Devices[index].Current_MDMA	= 0xFF;	pCore->Devices[index].Current_PIO	= 0xFF;	pCore->Devices[index].Current_UDMA	= 0xFF;	pCore->Devices[index].NegotiatedLinkRate = 0;	if (pCore->State == CORE_STATE_STARTED)		pCore->Devices[index].Need_Notify = MV_TRUE;		return &pCore->Devices[index];}PDomain_Expander GetExpanderFromPool( PCore_Driver_Extension pCore ){	MV_U16 index;	MV_U8 i=0;	if( Tag_IsEmpty(&pCore->Expander_Pool) )	{		MV_DPRINT(("Expander pool empty!\n"));		return NULL;	}	index = Tag_GetOne( &pCore->Expander_Pool );// for consistant binding, we will try to find the first available ID		/* this ID is already taken - we need to find another */		/* should only happen after a lot of hot plugs, so that the 		   IDs looped around */	for( i=MIN_EXPANDER_ID; i<MAX_EXPANDER_ID; i++ )	{		if( pCore->Device_Map[i] == ID_NOT_MAPPED )		{// update Current_Expander_Id to the last  			if(pCore->Current_Expander_Id < i) pCore->Current_Expander_Id = i;				break;		}	}	if( i == MAX_EXPANDER_ID )	{		MV_DPRINT(("Ran out of Expander IDs!\n"));			return NULL;	}	pCore->Device_Map[i] = (MV_U8)index;	MV_ZeroMemory((MV_U8 *)&pCore->Expanders[index], sizeof(Domain_Expander));	MV_LIST_HEAD_INIT(&pCore->Expanders[index].pChild);	MV_LIST_HEAD_INIT(&pCore->Expanders[index].pSibling);	MV_LIST_HEAD_INIT(&pCore->Expanders[index].Device_List);	pCore->Expanders[index].ExpId = i;		return &pCore->Expanders[index];}PDomain_Port GetPortFromPool( PCore_Driver_Extension pCore ){	MV_U16 index;	MV_U8 i=0;	if( Tag_IsEmpty(&pCore->Port_Pool) )	{		MV_DPRINT(("Port pool empty!\n"));		return NULL;	}	index = Tag_GetOne( &pCore->Port_Pool );// for consistant binding, we will try to get the first available ID.		/* this ID is already taken - we need to find another */		/* should only happen after a lot of hot plugs, so that the */		/* IDs looped around */	for( i=0; i<MAX_PORT_ID; i++ )	{		if( pCore->Port_Map[i] == ID_NOT_MAPPED )		{// update Port_Num to the last  			if(pCore->Port_Num < i) pCore->Port_Num = i;				break;		}	}	if( i == MAX_PORT_ID )	{		MV_DPRINT(("Ran out of Port IDs!\n"));		return NULL;	}	pCore->Port_Map[i] = (MV_U8)index;	MV_ZeroMemory((MV_U8 *)&pCore->Ports[index], sizeof(Domain_Port));	MV_LIST_HEAD_INIT(&pCore->Ports[index].pExpTreeRoot);	MV_LIST_HEAD_INIT(&pCore->Ports[index].Expander_List);	MV_LIST_HEAD_INIT(&pCore->Ports[index].Device_List);	pCore->Ports[index].Id = i;		return &pCore->Ports[index];}#ifdef _OS_WINDOWSPMV_Request GetInternalReqFromPool( PCore_Driver_Extension pCore ){	PMV_Request pReq;	if (List_Empty(&pCore->Internal_Req_List)) 		return NULL;	pReq = ((PMV_Request)List_GetFirstEntry(&pCore->Internal_Req_List, MV_Request, Queue_Pointer));	MV_ZeroMvRequest(pReq);#ifdef CORE_SAS_SUPPORT_ATA_COMMAND	pReq->Context[MODULE_CORE] = GetCoreContextFromPool(pCore);#endif /* CORE_SAS_SUPPORT_ATA_COMMAND */	return pReq;}void FreeInternalReqToPool( PCore_Driver_Extension pCore, PMV_Request pReq){	// TBD: reset requests - what values need to be reset?	List_AddTail( &pReq->Queue_Pointer, &pCore->Internal_Req_List );	#ifdef CORE_SAS_SUPPORT_ATA_COMMAND	if ( pReq->Context[MODULE_CORE] )		FreeCoreContextToPool(pCore, (PCORE_CONTEXT *) &pReq->Context[MODULE_CORE]);#endif /* CORE_SAS_SUPPORT_ATA_COMMAND */}#else /* _OS_WINDOWS */PMV_Request GetInternalReqFromPool( PCore_Driver_Extension pCore ){	PMV_Request pReq;	pReq = res_get_req_from_pool(pCore->req_pool);	if (NULL == pReq) {		return NULL;	}#ifdef CORE_SAS_SUPPORT_ATA_COMMAND	pReq->Context[MODULE_CORE] = GetCoreContextFromPool(pCore);#endif /* CORE_SAS_SUPPORT_ATA_COMMAND */	return pReq;}void FreeInternalReqToPool( PCore_Driver_Extension pCore, PMV_Request pReq){	res_free_req_to_pool(pCore->req_pool, pReq);#ifdef CORE_SAS_SUPPORT_ATA_COMMAND	if ( pReq->Context[MODULE_CORE] )		FreeCoreContextToPool(pCore, (PCORE_CONTEXT *) &pReq->Context[MODULE_CORE]);#endif /* CORE_SAS_SUPPORT_ATA_COMMAND */}#endif /* _OS_WINDOWS */#ifdef CORE_SAS_SUPPORT_ATA_COMMANDPCORE_CONTEXT GetCoreContextFromPool( PCore_Driver_Extension pCore ){	PCORE_CONTEXT pContext;    if ( List_Empty(&pCore->Context_List) ) return NULL;	pContext = ((PCORE_CONTEXT)List_GetFirstEntry(&pCore->Context_List, CORE_CONTEXT, Queue_Pointer));	/* Reset some variables. */	pContext->Context_Type = CORE_CONTEXT_TYPE_NONE;	return pContext;}void FreeCoreContextToPool( PCore_Driver_Extension pCore, PCORE_CONTEXT *ppContext){	MV_DASSERT( *ppContext!=NULL );	List_AddTail( &(*ppContext)->Queue_Pointer, &pCore->Context_List );	*ppContext = NULL;}#endif#ifdef SUPPORT_LARGE_REQUESTPMV_Request GetSubReqFromPool( PCore_Driver_Extension pCore ){	PMV_Request pReq;	if (List_Empty(&pCore->Sub_Req_List)) 		return NULL;	pCore->Sub_Req_Count--;	pReq = ((PMV_Request)List_GetFirstEntry(&pCore->Sub_Req_List, MV_Request, Queue_Pointer));	/* Don't zero the whole sub request. */	MV_ZeroMemory(pReq->Context, sizeof(MV_PVOID)* MAX_POSSIBLE_MODULE_NUMBER);	/* So far I don't use context for sub request. */#ifdef CORE_SAS_SUPPORT_ATA_COMMAND	pReq->Context[MODULE_CORE] = GetCoreContextFromPool(pCore);#endif /* CORE_SAS_SUPPORT_ATA_COMMAND */	return pReq;}void FreeSubReqToPool( PCore_Driver_Extension pCore, PMV_Request pReq){	List_AddTail( &pReq->Queue_Pointer, &pCore->Sub_Req_List );		pCore->Sub_Req_Count++;	/* Needn't release SG table and sense buffer. They are fixed to the request. */#ifdef CORE_SAS_SUPPORT_ATA_COMMAND	if ( pReq->Context[MODULE_CORE] )		FreeCoreContextToPool(pCore, (PCORE_CONTEXT *) &pReq->Context[MODULE_CORE]);#endif /* CORE_SAS_SUPPORT_ATA_COMMAND */}#endif#ifdef RAID6_HARDWARE_XORPCORE_XOR_CONTEXT GetCoreXORContextFromPool( PCore_Driver_Extension pCore ){	PCORE_XOR_CONTEXT pContext;	if ( List_Empty(&pCore->XOR_Context_List) ) return NULL;	pContext = (PCORE_XOR_CONTEXT)		List_GetFirstEntry(&pCore->XOR_Context_List, CORE_XOR_CONTEXT, Queue_Pointer);	/* Reset some variables. */	pContext->Context_Type = CORE_XOR_CONTEXT_TYPE_NONE;	pContext->Table_Wrapper = NULL;	return pContext;}void FreeCoreXORContextToPool( PCore_Driver_Extension pCore, PCORE_XOR_CONTEXT *ppContext){	MV_DASSERT( *ppContext!=NULL );	List_AddTail( &(*ppContext)->Queue_Pointer, &pCore->XOR_Context_List );	*ppContext = NULL;}PXOR_Table_Wrapper GetXORTableWrapperFromPool( PCore_Driver_Extension pCore ){	PXOR_Table_Wrapper pResult;	if ( List_Empty(&pCore->XOR_Table_List) ) return NULL;	pResult = (PXOR_Table_Wrapper)		List_GetFirstEntry(&pCore->XOR_Table_List, XOR_Table_Wrapper, Queue_Pointer);	pResult->NextBuffer = NULL;	return pResult;}void FreeXORTableWrapperToPool( PCore_Driver_Extension pCore, PXOR_Table_Wrapper* ppXORTableWrapper){	MV_DASSERT( *ppXORTableWrapper!=NULL );	List_AddTail( &(*ppXORTableWrapper)->Queue_Pointer, &pCore->XOR_Table_List );	/* To avoid multiple release. */	*ppXORTableWrapper = NULL;}#endifPSATA_Scratch_Buffer GetSATAScratchFromPool( PCore_Driver_Extension pCore ){	if( !List_Empty(&pCore->SATA_Scratch_List) )		return ((PSATA_Scratch_Buffer)List_GetFirstEntry(&pCore->SATA_Scratch_List, SATA_Scratch_Buffer, Queue_Pointer));	else		return NULL;}/* Release the buffer and set the pointer to NULL. */void FreeSATAScratchToPool( PCore_Driver_Extension pCore, PSATA_Scratch_Buffer* ppSATASB){		MV_DASSERT( *ppSATASB!=NULL );	List_AddTail( &(*ppSATASB)->Queue_Pointer, &pCore->SATA_Scratch_List );		/* To avoid multiple release. */	*ppSATASB = NULL;}PSMP_Scratch_Buffer GetSMPScratchFromPool( PCore_Driver_Extension pCore ){	if( !List_Empty(&pCore->SMP_Scratch_List) )		return ((PSMP_Scratch_Buffer)List_GetFirstEntry(&pCore->SMP_Scratch_List, SMP_Scratch_Buffer, Queue_Pointer));	else		return NULL;}void FreeSMPScratchToPool( PCore_Driver_Extension pCore, PSMP_Scratch_Buffer pSMPSB){							// TBD: reset SMP Request - what values need resetting? 	List_AddTail( &pSMPSB->Queue_Pointer, &pCore->SMP_Scratch_List );	}PSG_Buffer GetSGBufferFromPool( PCore_Driver_Extension pCore ){	PSG_Buffer pResult;	if ( List_Empty(&pCore->SG_Buffer_List) ) return NULL;	pResult = (PSG_Buffer)List_GetFirstEntry(&pCore->SG_Buffer_List, SG_Buffer, Queue_Pointer);	pResult->NextBuffer = NULL;	return pResult;}/* Release the buffer and set the pointer to NULL. */void FreeSGBufferToPool( PCore_Driver_Extension pCore, PSG_Buffer* ppSGBuf){		MV_DASSERT( *ppSGBuf!=NULL );	List_AddTail( &(*ppSGBuf)->Queue_Pointer, &pCore->SG_Buffer_List );		/* To avoid multiple release. */	*ppSGBuf = NULL;}void Expander_SMPReq_Callback(	 IN PCore_Driver_Extension pCore,	 IN PMV_Request pReq	 ){	MV_U8 portId, TgtId;	struct _Domain_Expander *pTgt;	struct SMPResponse *pSMPResp;	PDomain_Port pPort; 	portId = MapPortId(pCore, pReq->Device_Id);	pPort = &pCore->Ports[MapPortEntry(pCore,portId)];	TgtId = (MV_U8)pReq->Device_Id;	pTgt= &pCore->Expanders[MapDeviceId(pCore, pReq->Device_Id)];	pSMPResp= (struct SMPResponse *)pReq->Data_Buffer;	MV_DPRINT(("SMP Function 0x%x Done For Port[0x%x].Target[0x%x] "		 "Result 0x%x\n", 		 pSMPResp->Function, 		 portId, 		 TgtId,		 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", 			pSMPResp->Response.ReportGeneral.ConfigurableRouteTable));		MV_DPRINT((" Max Route Entry 0x%02x%02x\n", 			pSMPResp->Response.ReportGeneral.MaxNumRoutedSASAddr[0],			pSMPResp->Response.ReportGeneral.MaxNumRoutedSASAddr[1]));		break;	case REPORT_MANUFACTURER_INFORMATION:		MV_DPRINT((" Manufacturer ID %s\n", 			pSMPResp->Response.ReportManufacturerInformation.ProductIdentification));		break;//	case READ_GPIO_REGISTER://						break;	case REPORT_SELF_CONFGRIGRUATION_STATUS:		break;	case DISCOVER:		MV_DPRINT(("Phy ID 0x%x\n", 			pSMPResp->Response.Discover.PhyIdentifier));		MV_DPRINT(("  SAS Address 0x%02x%02x%02x%02x%02x%02x%02x%02x\n", 			pSMPResp->Response.Discover.AttachedSASAddress[0],			pSMPResp->Response.Discover.AttachedSASAddress[1],			pSMPResp->Response.Discover.AttachedSASAddress[2],			pSMPResp->Response.Discover.AttachedSASAddress[3],			pSMPResp->Response.Discover.AttachedSASAddress[4],			pSMPResp->Response.Discover.AttachedSASAddress[5],

⌨️ 快捷键说明

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