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

📄 fei82557end.c

📁 INTEL IXP425的VXWORKS BSP
💻 C
📖 第 1 页 / 共 5 页
字号:
    char *      initString              /* parameter string */    )    {    char *  tok;                /* an initString token */    char *  holder = NULL;      /* points to initString fragment beyond tok */    tok = strtok_r (initString, ":", &holder);    if (tok == NULL)        return ERROR;    pDrvCtrl->unit = atoi (tok);    tok = strtok_r (NULL, ":", &holder);    if (tok == NULL)        return ERROR;    pDrvCtrl->pClusterBase = (char *)strtoul (tok, NULL, 16);    tok = strtok_r (NULL, ":", &holder);    if (tok == NULL)        return ERROR;    pDrvCtrl->clMemSize = strtoul (tok, NULL, 16);    /* passing nCFDs is optional. The default is 64 */         pDrvCtrl->nCFDs = 64;    tok = strtok_r (NULL, ":", &holder);    if ((tok != NULL) && (tok != (char *)-1))        pDrvCtrl->nCFDs = strtoul (tok, NULL, 16);    /* passing nRFDs is optional. The default is 128 */         pDrvCtrl->nRFDs = 128;    tok = strtok_r (NULL, ":", &holder);    if ((tok != NULL) && (tok != (char *)-1))        pDrvCtrl->nRFDs = strtoul (tok, NULL, 16);    pDrvCtrl->nRBDs = pDrvCtrl->nRFDs;    tok = strtok_r (NULL, ":", &holder);    if (tok == NULL)        return ERROR;    pDrvCtrl->flags = atoi (tok);    /* offset value is optional, default is zero */    pDrvCtrl->offset = 0;    tok = strtok_r (NULL, ":", &holder);    if (tok != NULL)        pDrvCtrl->offset = atoi (tok);    /* device ID is optional, default is zero */    pDrvCtrl->deviceId = 0;    tok = strtok_r (NULL, ":", &holder);    if (tok != NULL)        pDrvCtrl->deviceId = atoi (tok);    /* passing maxRxFrames is optional. The default is 128  */    pDrvCtrl->maxRxFrames = pDrvCtrl->nRFDs * 2;       tok = strtok_r (NULL, ":", &holder);    if ((tok != NULL) && (tok != (char *)-1))        pDrvCtrl->maxRxFrames = strtoul (tok, NULL, 16);    /* passing clToRfdRatio is optional. The default is 5  */    pDrvCtrl->clToRfdRatio = 5;    tok = strtok_r (NULL, ":", &holder);    if ((tok != NULL) && (tok != (char *)-1))        pDrvCtrl->clToRfdRatio = strtoul (tok, NULL, 16);    if (pDrvCtrl->clToRfdRatio < 2 )        pDrvCtrl->clToRfdRatio = 2;    /* passing nClusters is optional. The default is  nRFDs * clToRfdRatio */    pDrvCtrl->nClusters = pDrvCtrl->nRFDs * pDrvCtrl->clToRfdRatio;    tok = strtok_r (NULL, ":", &holder);    if ((tok != NULL) && (tok != (char *)-1))        pDrvCtrl->nClusters = strtoul (tok, NULL, 16);    if (!pDrvCtrl->nCFDs || pDrvCtrl->nCFDs <= 2)        {        FEI_FLAG_SET (FEI_INV_NCFD);        pDrvCtrl->nCFDs = DEF_NUM_CFDS;        }    if (!pDrvCtrl->nRFDs || pDrvCtrl->nRFDs <= 2)        {        FEI_FLAG_SET (FEI_INV_NRFD);        pDrvCtrl->nRFDs = DEF_NUM_RFDS;        }    if (pDrvCtrl->nClusters < (pDrvCtrl->nRFDs * 2))        pDrvCtrl->nClusters = pDrvCtrl->nRFDs * 2;    DRV_LOG (DRV_DEBUG_LOAD,            "fei82557EndLoad: unit=%d pClusterBase=0x%x memSize=0x%x\n",            pDrvCtrl->unit, (int) pDrvCtrl->pClusterBase,            (int) pDrvCtrl->clMemSize, 0,0,0);    DRV_LOG (DRV_DEBUG_LOAD,            "fei82557EndLoad: nCFDs=%d nRFDs=%d flags=%d offset=%d\n",            pDrvCtrl->nCFDs, pDrvCtrl->nRFDs, pDrvCtrl->flags,            pDrvCtrl->offset, 0, 0);    return (OK);    }/********************************************************************************* fei82557InitMem - initialize memory** RETURNS: OK or ERROR*/LOCAL STATUS fei82557InitMem    (    DRV_CTRL *  pDrvCtrl       /* pointer to DRV_CTRL structure */    )    {    CFD_ID              pCFD;           /* pointer to CFDs */    RFD_ID              pRFD;           /* pointer to RFDs */    RFD_TAG *           pRfdTag;    RBD_ID              pRBD;           /* pointer to RFDs */    RBD_TAG *           pRbdTag;    UINT32              clSize;         /* size of allocation for clusters */    UINT32              clusterSize;    /* size of allocation for clusters */    UINT32              memSize;        /* size of allocation passed by BSP */    UINT32              nSubtract = 1;  /* number of RFDs to subtract */    UINT32              rfdSize;        /* size of allocation for RFDs */    UINT32              rbdSize;        /* size of allocation for RBDs */    UINT32              cfdSize;        /* size of allocation for CFDs */    int                 ix;             /* index counter */    BOOL                firstCFD = TRUE;/* the first CFD? */    int                 firstOrLast;         M_CL_CONFIG  fei82557MclBlkConfig =    {        /*         *  mBlkNum     clBlkNum        memArea     memSize         *  -----------         ----            -------     -------         */            0,          0,              NULL,       0    };    CL_DESC      fei82557ClDescTbl [] =    {        /*         *  clusterSize                 num     memArea     memSize         *  -----------                 ----    -------     -------         */        {CLUSTER_SIZE,                  0,      NULL,       0}        };    int fei82557ClDescTblNumEnt = (NELEMENTS (fei82557ClDescTbl));    /* initialize the netPool */    if ((pDrvCtrl->endObj.pNetPool = malloc (sizeof (NET_POOL))) == NULL)        return (ERROR);   /* this driver can't handle write incoherent caches */    if (!CACHE_DMA_IS_WRITE_COHERENT ())         {        DRV_LOG (DRV_DEBUG_LOAD, ("fei82557EndLoad: shared                                   memory not cache coherent\n"),                                  1, 2, 3, 4, 5, 6);        return (ERROR);        }    switch ((int) pDrvCtrl->pClusterBase)        {        case NONE :                          /* we must obtain it */            clSize = (pDrvCtrl->nClusters * CLUSTER_SIZE);            /* Add one to rfdSize, rbdSize, & cfdSize to accomodate alignment */            rfdSize = ((pDrvCtrl->nRFDs + 1) * RFD_DESC_SIZE);            rbdSize = ((pDrvCtrl->nRBDs + 1) * RBD_SIZE);            cfdSize = ((pDrvCtrl->nCFDs + 1) * CFD_SIZE);            /* Align on 32 byte boundries */            if ((pDrvCtrl->pRfdBase = cacheDmaMalloc (rfdSize + rbdSize +                                                       cfdSize)) == NULL)                {                return (ERROR);                }            memset (pDrvCtrl->pRfdBase, 0, (rfdSize + rbdSize + cfdSize));            pDrvCtrl->pRfdBase = (char *)ROUND_UP((UINT32) pDrvCtrl->pRfdBase,                                                   32);            pDrvCtrl->rfdTags = (RFD_TAG *)pDrvCtrl->pRfdBase;            pDrvCtrl->pRFD = (RFD_ID)pDrvCtrl->pRfdBase;            pDrvCtrl->pRbdBase = (char *)((int)pDrvCtrl->pRfdBase + rfdSize);            pDrvCtrl->rbdTags = (RBD_TAG *)pDrvCtrl->pRbdBase;            pDrvCtrl->pCfdBase = (char *)((int)pDrvCtrl->pRbdBase + rbdSize);            pDrvCtrl->pClusterBase = memalign (_CACHE_ALIGN_SIZE, clSize);             if (pDrvCtrl->pClusterBase == NULL)      /* no memory available */                {                DRV_LOG (DRV_DEBUG_LOAD, ("fei82557EndLoad: could not                                             obtain memory\n"),                                            1, 2, 3, 4, 5, 6);                return (ERROR);                }            /* zero the shared memory */            memset(pDrvCtrl->pClusterBase,0,clSize);            pDrvCtrl->clMemSize = clSize;            FEI_FLAG_SET (FEI_OWN_MEM);            pDrvCtrl->cacheDmaFuncs = cacheDmaFuncs;            pDrvCtrl->cacheFuncs = cacheUserFuncs;            pDrvCtrl->pSendRtn = (FUNCPTR)fei82557GatherSend;             break;        default :                              /* the user provided an area */            if (pDrvCtrl->clMemSize == 0)                 {                DRV_LOG (DRV_DEBUG_LOAD, ("fei82557EndLoad: not enough                                            memory\n"),                                           1, 2, 3, 4, 5, 6);                return (ERROR);                }            /*              * check the user provided enough memory with reference             * to the given number of receive/transmit frames, if any.             */           while ((pDrvCtrl->nRBDs * RBD_SIZE) > (nSubtract * CLUSTER_SIZE))               {               nSubtract++;               }            rfdSize = ((pDrvCtrl->nRFDs + 1) * RFD_DESC_SIZE);            rbdSize = ((pDrvCtrl->nRBDs + 1) * RBD_SIZE);            cfdSize = (pDrvCtrl->nCFDs * (CFD_SIZE + CLUSTER_SIZE));             clusterSize = (((pDrvCtrl->nRFDs + 1) * 2) * CLUSTER_SIZE);             memSize = rfdSize + rbdSize + cfdSize + clusterSize;            if (pDrvCtrl->clMemSize < memSize)                 {                DRV_LOG (DRV_DEBUG_LOAD, ("fei82557EndLoad: not enough                                           memory\n"), 1, 2, 3, 4, 5, 6);                return (ERROR);                }            /* zero the shared memory */            memset(pDrvCtrl->pClusterBase,0,pDrvCtrl->clMemSize);            memSize = pDrvCtrl->clMemSize - (rfdSize + rbdSize + cfdSize);            pDrvCtrl->nClusters = ((memSize / CLUSTER_SIZE) - nSubtract);             pDrvCtrl->pRfdBase = pDrvCtrl->pClusterBase;            pDrvCtrl->rfdTags = (RFD_TAG *)pDrvCtrl->pRfdBase;             pDrvCtrl->pRFD = (RFD_ID)pDrvCtrl->pRfdBase;            pDrvCtrl->pRbdBase = (char *)((int)pDrvCtrl->pRfdBase + rfdSize);            pDrvCtrl->rbdTags = (RBD_TAG *)pDrvCtrl->pRbdBase;             pDrvCtrl->pClusterBase = (char *)((int)pDrvCtrl->pRbdBase +                                                    rbdSize);            pDrvCtrl->pCfdBase = (char *)((int)pDrvCtrl->pClusterBase +                                 (pDrvCtrl->nClusters * CLUSTER_SIZE));              FEI_FLAG_CLEAR (FEI_OWN_MEM);            pDrvCtrl->cacheDmaFuncs = cacheNullFuncs;             pDrvCtrl->cacheFuncs = cacheDmaFuncs;            pDrvCtrl->pSendRtn = (FUNCPTR)fei82557CopySend;             break;        }    /* pool of mblks */    if (fei82557MclBlkConfig.mBlkNum == 0)        fei82557MclBlkConfig.mBlkNum = pDrvCtrl->nClusters * 10;    /* pool of clusters */    if (fei82557ClDescTbl[0].clNum == 0)        {        fei82557ClDescTbl[0].clNum = pDrvCtrl->nClusters;        fei82557ClDescTbl[0].clSize = CLUSTER_SIZE;        }    fei82557ClDescTbl[0].memSize = pDrvCtrl->clMemSize;      fei82557ClDescTbl[0].memArea = pDrvCtrl->pClusterBase;    DRV_LOG (DRV_DEBUG_LOAD, ("fei82557EndLoad: pClusterBase %p nClusters %d                               cluster size %x\n"),                              (int)pDrvCtrl->pClusterBase,pDrvCtrl->nClusters,                              CLUSTER_SIZE,0,0,0);     /* pool of cluster blocks */    if (fei82557MclBlkConfig.clBlkNum == 0)        fei82557MclBlkConfig.clBlkNum = (fei82557ClDescTbl[0].clNum * 2);    /* get memory for mblks */

⌨️ 快捷键说明

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