core_ibcd.c

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

C
1,050
字号
#include "core_header.h"#include "core_ibcd.h"/*  Core Driver will provide the following functions to call:*//* tell core driver to issue a SMP command from a dedicated port/expander */extern MV_VOID CORE_IssueSMPRequest(IN MV_PVOID PortExtension, IN MV_U8 *SasAddr, IN MV_PVOID pSMPReq, IN void (*pCallBack)(MV_PVOID pDISC_Extension, MV_PVOID PortExtension, IN MV_U8 *SasAddr, MV_PVOID pSMPReq), MV_PVOID Context);		/* tell core driver to get port sas address and root expander sas address from a dedicated port */extern MV_VOID CORE_GetPortAddress(IN MV_PVOID PortExtension, OUT MV_U8 *SasAddr);struct _Discover_Extension;typedef struct _Discover_Extension Discover_Extension, *PDiscover_Extension;struct _SMPBuffer_Context;typedef struct _SMPBuffer_Context SMPBuffer_Context, *PSMPBuffer_Context;struct _SMPBuffer_Context{  PDiscover_Extension pDiscExt;  struct SMPRequest SMPBuffer;  MV_U8  nTgt;  MV_U8  phyId;  MV_U8  BufferIndex;  MV_U8  isBufferFree;};typedef struct _Discover_PortInfo{  MV_PVOID    PortExtension;  MV_U8       DiscoveryReturn;}Discover_PortInfo, *pDiscover_PortInfo;typedef struct _Discover_Target{  Target_Info       Info;  MV_U8			        DiscoveryState;  MV_U8			        NeedConfigured;  MV_PVOID		      pParent;  MV_PVOID		      PCallBack;  MV_PVOID          PortExtension;  Target_Dev	      TgtDev[MAXIMUM_DEVICE_PER_EXPANDER];}Discover_Target, *pDiscover_Target;struct _Discover_Extension{  MV_U32            ExtensionSize;  MV_U8			        NumberOfMaxTarget;  MV_U8			        TargetNumber;  MV_U8			        numOfOutstandingReq;  MV_U8             ExpandersTBD[MAX_EXPANDER_SUPPORTED_PERFORMANCE];  MV_PVOID          PortExtensionsTBD[MAX_EXPANDER_SUPPORTED_PERFORMANCE];  Discover_PortInfo PortInfo[MAX_PHYSICAL_PORT_NUMBER];  SMPBuffer_Context	SMPContext[MAXIMUM_DISCOVER_REQUESTS];  Discover_Target	  Target[0];};/*  Discover Engine will provide the following functions to call:*//* Get cached memory quota of discover engine for internal use */MV_VOID DISC_GetResource(OUT MV_U32 *Size, IN MV_U8 MaxTgt, IN MV_U16 MaxDev){  *Size = sizeof(Discover_Extension) + MaxTgt*sizeof(Discover_Target);}/* Give assigned memory pointer and size for discover engine */MV_VOID DISC_SetResource(IN MV_PVOID pDISC_Extension, IN MV_U32 Size){  MV_U8 i;  PDiscover_Extension pDisc=(PDiscover_Extension)pDISC_Extension;  MV_ZeroMemory ( pDISC_Extension, Size );  pDisc->ExtensionSize=Size;  pDisc->NumberOfMaxTarget=(MV_U8)( (Size-sizeof(Discover_Extension))/sizeof(Discover_Target) );  for ( i=0; i< pDisc->NumberOfMaxTarget; i++)  {    pDisc->ExpandersTBD[i] = 0xff;    pDisc->Target[i].DiscoveryState = 0xfd;  }  pDisc->numOfOutstandingReq = 0;  pDisc->TargetNumber = 0;  for ( i=0; i < MAXIMUM_DISCOVER_REQUESTS; i++ )  {    pDisc->SMPContext[i].isBufferFree = 1;    pDisc->SMPContext[i].BufferIndex = i;  }}MV_U8	FindTgtNo(	IN MV_PVOID pDISC_Extension,	IN MV_U8 *SasAddr){  PDiscover_Extension pDisc=(PDiscover_Extension)pDISC_Extension;  MV_U8 i;  for ( i=0; i<pDisc->NumberOfMaxTarget; i++ )  {    if ( (pDisc->Target[i].DiscoveryState!=0xfd)&&		 (MV_Equals ( pDisc->Target[i].Info.SASAddr, SasAddr, 8 )) )      return i;  }  return 0xff;}MV_VOID DiscoverySM(MV_PVOID pDISC_Extension, MV_PVOID PortExtension, MV_U8 nTgt, MV_U8 CurrentState, MV_U8 context,                     MV_PVOID pResp);static void SMP_Callback(	IN MV_PVOID pDISC_Extension, 	IN MV_PVOID PortExtension, 	IN MV_U8 *SasAddr, 	IN MV_PVOID pSMPReq	 	){  PDiscover_Extension pDisc;  MV_U8 nTgt;  MV_U8 i;  struct SMPResponse *pSMPResp;  pSMPResp= (struct SMPResponse *)pSMPReq;  if ( pSMPResp->Function == CONFIGURE_ROUTE_INFORMATION )  {    pDisc = ((PSMPBuffer_Context)pDISC_Extension)->pDiscExt;  }  else  {    pDisc=(PDiscover_Extension)pDISC_Extension;  }    /* Might be a callback from a previous discovery cycle */  if ( pDisc->numOfOutstandingReq == 0 )    return;  nTgt=FindTgtNo ( pDisc, SasAddr );  if ( nTgt==0xff )    return;  MV_DPRINT (( "DISC: SMP Function 0x%x Done For Port(0x%p).Target 0x%02x%02x%02x%02x%02x%02x%02x%02x Result 0x%x\n",               pSMPResp->Function,               PortExtension,               SasAddr[7],              SasAddr[6],              SasAddr[5],              SasAddr[4],              SasAddr[3],              SasAddr[2],              SasAddr[1],              SasAddr[0],              pSMPResp->FunctionResult ));  switch ( pSMPResp->Function )  {    case REPORT_GENERAL:      if ( pDisc->SMPContext[0].isBufferFree == 0 )      {        pDisc->SMPContext[0].isBufferFree = 1;        pDisc->numOfOutstandingReq--;        MV_DPRINT (( "DISC: Number of Phy 0x%x\n",           pSMPResp->Response.ReportGeneral.NumberOfPhys ));        MV_DPRINT (( "DISC: 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 (( "DISC: Need Configured 0x%x\n",           pSMPResp->Response.ReportGeneral.ConfigurableRouteTable ));        MV_DPRINT (( "DISC: Max Route Entry 0x%02x%02x\n",           pSMPResp->Response.ReportGeneral.MaxNumRoutedSASAddr[0],          pSMPResp->Response.ReportGeneral.MaxNumRoutedSASAddr[1] ));        DiscoverySM ( pDISC_Extension,PortExtension,nTgt,REPORT_GENERAL, 0, NULL );      }      else      {        /* Might be a callback from a previous discovery cycle */        return;        }      break;    case REPORT_MANUFACTURER_INFORMATION:      if ( pDisc->SMPContext[0].isBufferFree == 0 )      {        pDisc->SMPContext[0].isBufferFree = 1;        pDisc->numOfOutstandingReq--;        MV_DPRINT (( "DISC: Manufacturer Vendor ID 0x%02x%02x%02x%02x%02x%02x%02x%02x\n",           pSMPResp->Response.ReportManufacturerInformation.VendorIdentification[0],          pSMPResp->Response.ReportManufacturerInformation.VendorIdentification[1],          pSMPResp->Response.ReportManufacturerInformation.VendorIdentification[2],          pSMPResp->Response.ReportManufacturerInformation.VendorIdentification[3],          pSMPResp->Response.ReportManufacturerInformation.VendorIdentification[4],          pSMPResp->Response.ReportManufacturerInformation.VendorIdentification[5],          pSMPResp->Response.ReportManufacturerInformation.VendorIdentification[6],          pSMPResp->Response.ReportManufacturerInformation.VendorIdentification[7] ));        MV_DPRINT (( "DISC: Manufacturer Product ID %s\n",           pSMPResp->Response.ReportManufacturerInformation.ProductIdentification ));        DiscoverySM ( pDISC_Extension,PortExtension,nTgt,REPORT_MANUFACTURER_INFORMATION, 0, NULL );      }      else      {        /* Might be a callback from a previous discovery cycle */        return;        }      break;    //	case READ_GPIO_REGISTER:    //						break;    case REPORT_SELF_CONFGRIGRUATION_STATUS:      break;    case DISCOVER:      for ( i = 1; i<MAXIMUM_DISCOVER_REQUESTS; i++ )      {        if ( (pDisc->SMPContext[i].nTgt == nTgt) &&             (pDisc->SMPContext[i].phyId == pSMPResp->Response.Discover.PhyIdentifier) )        {          break;        }      }      pDisc->numOfOutstandingReq--;      MV_DPRINT (( "DISC: Discover Response for Tgt 0x%x in Buffer 0x%x\n", nTgt, i));      MV_DPRINT (( "DISC: Phy ID 0x%x\n",         pSMPResp->Response.Discover.PhyIdentifier ));      MV_DPRINT (( "DISC: 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],        pSMPResp->Response.Discover.AttachedSASAddress[6],        pSMPResp->Response.Discover.AttachedSASAddress[7] ));      MV_DPRINT (( "DISC: Device Type 0x%x\n",         pSMPResp->Response.Discover.AttachedDeviceType ));      MV_DPRINT (( "DISC: Target %s%s%s\n",         (pSMPResp->Response.Discover.TargetBits & FRAME_ATT_DEV_TYPE_SSP)?"SSP ":"",        (pSMPResp->Response.Discover.TargetBits & FRAME_ATT_DEV_TYPE_SMP)?"SMP ":"",        (pSMPResp->Response.Discover.TargetBits & FRAME_ATT_DEV_TYPE_STP)?"STP ":"" ));      DiscoverySM ( pDISC_Extension,PortExtension,nTgt,DISCOVER,pSMPResp->Response.Discover.PhyIdentifier, pSMPResp );      break;    case REPORT_PHY_ERROR_LOG:      break;    case REPORT_PHY_SATA:      break;    case REPORT_ROUTE_INFORMATION:      break;    case REPORT_PHY_EVENT_INFORMATION:      break;    case REPORT_PHY_BROADCAST_COUNTS:      break;    case DISCOVER_LIST:      break;    case REPORT_EXPANDER_ROUTE_TABLE:      break;    case CONFIGURE_GENERAL:      break;    case ENABLE_DISABLE_ZONING:      break;    //	case WRITE_GPIO_REGISTER:    //						break;    case ZONED_BROADCAST:      break;    case CONFIGURE_ROUTE_INFORMATION:    {      SMPBuffer_Context* pSMPBuff;      pSMPBuff = (SMPBuffer_Context *)pDISC_Extension;            pDisc->SMPContext[pSMPBuff->BufferIndex].isBufferFree = 1;      pDisc->numOfOutstandingReq--;      DiscoverySM ( (MV_PVOID)pDisc,PortExtension,nTgt,CONFIGURE_ROUTE_INFORMATION,0, 0 );            }      break;    case PHY_CONTROL:      break;    case PHY_TEST:      break;    case CONFIGURE_PHY_EVENT_INFORMATION:      break;  }}void Issue_ReportGeneral(	IN MV_PVOID pDISC_Extension, 	IN MV_PVOID PortExtension, 	IN MV_U8 nTgt		){  PDiscover_Extension pDisc=(PDiscover_Extension)pDISC_Extension;  /* Report General always uses Buffer index 0 */  struct SMPRequest *pReq= (struct SMPRequest*)&pDisc->SMPContext[0].SMPBuffer;  pDisc->SMPContext[0].isBufferFree = 0;  MV_ZeroMemory ( pReq, sizeof(struct SMPRequest) );  pReq->Function=REPORT_GENERAL;  pReq->SMPFrameType=SMP_REQUEST_FRAME;  CORE_IssueSMPRequest ( PortExtension,                         pDisc->Target[nTgt].Info.SASAddr,                         (MV_PVOID)pReq,                         (void (*)(MV_PVOID DiscExtension,                                    MV_PVOID PortExtension,                                    MV_U8 *SasAddr,                                    MV_PVOID pSMPReq))SMP_Callback,                          pDISC_Extension );}void Issue_ReportManufacturerInformation(	IN MV_PVOID pDISC_Extension, 	IN MV_PVOID PortExtension, 	IN MV_U8 nTgt		){  PDiscover_Extension pDisc=(PDiscover_Extension)pDISC_Extension;  /* Report Manufacturer Info always uses Buffer index 0 */  struct SMPRequest *pReq= (struct SMPRequest*)&pDisc->SMPContext[0].SMPBuffer;  pDisc->SMPContext[0].isBufferFree = 0;  MV_ZeroMemory ( pReq, sizeof(struct SMPRequest) );  pReq->Function=REPORT_MANUFACTURER_INFORMATION;  pReq->SMPFrameType=SMP_REQUEST_FRAME;  CORE_IssueSMPRequest ( PortExtension,                         pDisc->Target[nTgt].Info.SASAddr,                         (MV_PVOID)pReq,                         (void (*)(MV_PVOID DiscExtension,                                    MV_PVOID PortExtension,                                    MV_U8 *SasAddr,                                    MV_PVOID pSMPReq))SMP_Callback,                          pDISC_Extension );}void Issue_Discover(	IN MV_PVOID pDISC_Extension, 	IN MV_PVOID PortExtension, 	IN MV_U8 nTgt,	IN MV_U8 PhyId	)

⌨️ 快捷键说明

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