sysMotTsecEnd.c
上传用户:dqzhongke1
上传日期:2022-06-26
资源大小:667k
文件大小:20k
源码类别:

VxWorks

开发平台:

C/C++

  1. /* sysMotTsecEnd.c - system configuration module for motTsecEnd driver */
  2. /*
  3.  * Copyright (c) 2006 Wind River Systems, Inc.
  4.  *
  5.  * The right to copy, distribute, modify, or otherwise make use
  6.  * of this software may be licensed only pursuant to the terms
  7.  * of an applicable Wind River license agreement.
  8.  */
  9. /*
  10. modification history
  11. --------------------
  12. 01a,31jan06,kds  Modified PHY ADDRS for wrSbc8548 from cds8548/sysMotTsecEnd.c/01c
  13. */
  14. /*
  15. DESCRIPTION
  16. This is the WRS-supplied configuration module for the VxWorks
  17. motTsecEnd END driver.
  18. INCLUDE FILES:
  19. */
  20. #include <vxWorks.h>
  21. #include <config.h>
  22. #include <vmLib.h>
  23. #include <stdio.h>
  24. #include <sysLib.h>
  25. #include <logLib.h>
  26. #include <stdlib.h>
  27. #include <string.h>
  28. #include <end.h>
  29. #include <cacheLib.h>
  30. #include <intLib.h>
  31. #include <lstLib.h>
  32. #include <miiLib.h>
  33. #ifdef INCLUDE_MOT_ETSEC_HEND
  34. #include <hwif/vxbus/vxBus.h>
  35. #include <hwif/vxbus/vxbPlbLib.h>
  36. #include <hwif/util/hwMemLib.h>
  37. #include <../src/hwif/h/hEnd/etsecHEnd.h>
  38. #include <../src/hwif/h/hEnd/hEnd.h>
  39. #include <../src/hwif/h/hEnd/hEndParamSys.h>
  40. #else
  41. #include <drv/end/motTsecEnd.h>
  42. #endif
  43. #undef TSEC_SUPPORT_EXTRA_DEVICES
  44. /* debug */
  45. #undef PHY_LOOPBACKTEST
  46. /* defines */
  47. #define MOT_TSEC_PHY_ADDRS_DEV_1   1 
  48. #define MOT_TSEC_PHY_ADDRS_DEV_2   2 
  49. #define MOT_TSEC_PHY_ADDRS_DEV_3   3 
  50. #define MOT_TSEC_PHY_ADDRS_DEV_4   4 
  51. /* PHY's default operating mode */
  52. #define MOT_TSEC_DEF_PHY_MODE      MII_PHY_TBL /* use auto-negotiation table */
  53. /* imports */
  54. #ifdef INCLUDE_MOT_ETSEC_HEND
  55. IMPORT END_OBJ * motEtsecHEndLoad (char *, void *);
  56. #define TSEC_DRV_CTRL MOT_ETSEC_DRV_CTRL
  57. #define MOT_TSEC_PHY_PARAMS MOT_ETSEC_PHY_PARAMS
  58. #define MOT_TSEC_INT_CTRL MOT_ETSEC_INT_CTRL
  59. #define MOT_TSEC_FUNC_TABLE MOT_ETSEC_FUNC_TABLE
  60. #define MOT_TSEC_PHY_STATUS MOT_ETSEC_PHY_STATUS
  61. #define MOT_TSEC_USR_MODE_GMII MOT_ETSEC_USR_MODE_GMII
  62. #define MOT_TSEC_USR_STAT_ENABLE MOT_ETSEC_USR_STAT_ENABLE
  63. #define MOT_TSEC_MAX_DEVS MOT_ETSEC_MAX_DEVS
  64. #define MOT_TSEC_DEV_1 MOT_ETSEC_DEV_1
  65. #define MOT_TSEC_DEV_2 MOT_ETSEC_DEV_2
  66. #define MOT_TSEC_DEV_3 MOT_ETSEC_DEV_3
  67. #define MOT_TSEC_DEV_4 MOT_ETSEC_DEV_4
  68. #define MOT_TSEC_PARAMS MOT_ETSEC_PARAMS
  69. #define MOT_TSEC_USR_MODE_RGMII MOT_ETSEC_USR_MODE_RGMII
  70. #define MOT_TSEC_USR_MODE_MASK MOT_ETSEC_USR_MODE_MASK
  71. #define MOT_TSEC_USR_MODE_RGMII_100 MOT_ETSEC_USR_MODE_RGMII_100
  72. #define MOT_TSEC_USR_MODE_TBI MOT_ETSEC_USR_MODE_TBI
  73. #define MOT_TSEC_USR_MODE_RTBI MOT_ETSEC_USR_MODE_RTBI
  74. #define MOT_TSEC_DEV_NAME MOT_ETSEC_DEV_NAME
  75. #define MOT_TSEC_ADRS_OFFSET_1 MOT_ETSEC_ADRS_OFFSET_1
  76. IMPORT void motEtsecHEndParamSend (UINT32);
  77. #else
  78. IMPORT END_OBJ * motTsecEndLoad (char *);
  79. #endif
  80. IMPORT STATUS    sysEnetAddrGet (UINT32, UCHAR *);
  81. IMPORT STATUS    sysL2ExtWriteBufferAlloc(char *adrs,UINT size,BOOL lock);
  82. /* globals */
  83. /* locals */
  84. /* forward declarations */
  85. LOCAL STATUS sysMiiPhyInit(PHY_INFO *);
  86. LOCAL STATUS sysMiiPhyStatusGet (PHY_INFO *,MOT_TSEC_PHY_STATUS *);
  87. STATUS sysMotEtsecEnetAddrGet (int, UCHAR *);
  88. LOCAL STATUS sysMotEtsecEnetAddrSet (int, UCHAR *);
  89. LOCAL STATUS sysMotEtsecEnetEnable (UINT32, UINT32);
  90. LOCAL STATUS sysMotEtsecEnetDisable (UINT32, UINT32);
  91. /*
  92. * this table may be customized by the user to force a
  93. * particular order how different technology abilities may be
  94. * negotiated by the PHY. Entries in this table may be freely combined
  95. * and even OR'd together.
  96.  */
  97. UINT32 sysMotEtsecNumByUnit[MOT_TSEC_MAX_DEVS] =
  98. {MOT_TSEC_DEV_1, MOT_TSEC_DEV_2
  99. #ifdef TSEC_SUPPORT_EXTRA_DEVICES
  100. ,MOT_TSEC_DEV_3, MOT_TSEC_DEV_4
  101. #endif /* TSEC_SUPPORT_EXTRA_DEVICES */
  102. };
  103. LOCAL INT16 sysMotEtsecAnOrderTbl [] =
  104.     {
  105.     MII_TECH_100BASE_TX,    /* 100Base-T */
  106.     MII_TECH_100BASE_T4,    /* 10Base-T */
  107.     MII_TECH_10BASE_T,      /* 100Base-T4 */
  108.     MII_TECH_10BASE_FD,     /* 100Base-T FD*/
  109.     MII_TECH_100BASE_TX_FD, /* 10Base-T FD */
  110.     -1                      /* end of table */
  111.     };
  112. #ifndef INCLUDE_MOT_ETSEC_HEND
  113. /* PhyParms table indexed by unit number */
  114. LOCAL MOT_TSEC_PHY_PARAMS sysMotEtsecPhyParms[MOT_TSEC_MAX_DEVS] =
  115.     {
  116.         {
  117.         MOT_TSEC_PHY_ADDRS_DEV_1,
  118.         MOT_TSEC_DEF_PHY_MODE,
  119.         MII_PHY_DEF_DELAY,
  120.         1,
  121.         (MII_AN_ORDER_TBL *) sysMotEtsecAnOrderTbl,
  122.         },
  123.         {
  124.         MOT_TSEC_PHY_ADDRS_DEV_2,
  125.         MOT_TSEC_DEF_PHY_MODE,
  126.         MII_PHY_DEF_DELAY,
  127.         1,
  128.         (MII_AN_ORDER_TBL *) sysMotEtsecAnOrderTbl,
  129.         }
  130. #ifdef TSEC_SUPPORT_EXTRA_DEVICES
  131.         ,
  132.         {
  133.         MOT_TSEC_PHY_ADDRS_DEV_3,
  134.         MOT_TSEC_DEF_PHY_MODE,
  135.         MII_PHY_DEF_DELAY,
  136.         1,
  137.         (MII_AN_ORDER_TBL *) sysMotEtsecAnOrderTbl,
  138.         },
  139.         {
  140.         MOT_TSEC_PHY_ADDRS_DEV_4,
  141.         MOT_TSEC_DEF_PHY_MODE,
  142.         MII_PHY_DEF_DELAY,
  143.         1,
  144.         (MII_AN_ORDER_TBL *) sysMotEtsecAnOrderTbl
  145.         }
  146. #endif /* TSEC_SUPPORT_EXTRA_DEVICES */
  147.     };
  148. LOCAL MOT_TSEC_INT_CTRL sysMotIntCtrl[MOT_TSEC_MAX_DEVS] =
  149.     {
  150.     {
  151.     EPIC_TSEC1TX_INT_VEC,    /* Transmit Interrupt */
  152.     EPIC_TSEC1RX_INT_VEC,    /* Receive Interrupt */
  153.     EPIC_TSEC1ERR_INT_VEC,    /* Error Interrupt */
  154.     NULL,     /* function to convert INUM to IVEC */
  155.     NULL      /* function to convert IVEC to INUM */
  156.     },
  157.     {
  158.     EPIC_TSEC2TX_INT_VEC,    /* Transmit Interrupt */
  159.     EPIC_TSEC2RX_INT_VEC,    /* Receive Interrupt */
  160.     EPIC_TSEC2ERR_INT_VEC,    /* Error Interrupt */
  161.     NULL,     /* function to convert INUM to IVEC */
  162.     NULL      /* function to convert IVEC to INUM */
  163.     }
  164. #ifdef TSEC_SUPPORT_EXTRA_DEVICES
  165.     ,
  166.     {
  167.     EPIC_TSEC3TX_INT_VEC,    /* Transmit Interrupt */
  168.     EPIC_TSEC3RX_INT_VEC,    /* Receive Interrupt */
  169.     EPIC_TSEC3ERR_INT_VEC,    /* Error Interrupt */
  170.     NULL,     /* function to convert INUM to IVEC */
  171.     NULL      /* function to convert IVEC to INUM */
  172.     },
  173.     {
  174.     EPIC_TSEC4TX_INT_VEC,    /* Transmit Interrupt */
  175.     EPIC_TSEC4RX_INT_VEC,    /* Receive Interrupt */
  176.     EPIC_TSEC4ERR_INT_VEC,    /* Error Interrupt */
  177.     NULL,     /* function to convert INUM to IVEC */
  178.     NULL      /* function to convert IVEC to INUM */
  179.     }
  180. #endif /* TSEC_SUPPORT_EXTRA_DEVICES */
  181.     };
  182. #endif
  183. MOT_TSEC_FUNC_TABLE sysMotEtsecFuncs =
  184.     {
  185.     sysMiiPhyInit,      /* bsp MiiPhy init function */
  186.     NULL,               /* Interrupt End Driver function called by BSP */
  187.     sysMiiPhyStatusGet, /* status call back */
  188.     NULL,               /* BSP BYTE Read function called by BSP */
  189.     NULL,               /* BSP BYTE Write function called by BSP */
  190.     sysMotEtsecEnetAddrGet,    /* Driver call back to get the Ethernet address */
  191.     sysMotEtsecEnetAddrSet,    /* Driver call back to set the Ethernet address */
  192.     sysMotEtsecEnetEnable,     /* Driver call back to enable the ENET interface */
  193.     sysMotEtsecEnetDisable,     /* Driver call back to disable the ENET interface */
  194.     NULL
  195.     };
  196. MOT_TSEC_PARAMS sysMotEtsecParms =
  197.     {
  198.     NULL,  /* Buffer pointer for allocated buffer space */
  199.     0,     /* Buffer pool size */
  200.     NULL,  /* Descriptor Base Address */
  201.     0,     /* Descriptor Size */
  202.     32,    /* Number of Receive Buffer Descriptors  */
  203.     32    /* Number of Transmit Buffer Descriptors */
  204.     };
  205. #ifndef INCLUDE_MOT_ETSEC_HEND
  206. #ifdef TSEC_EXT_PARMS_USED
  207. /* TSEC hardware defaults */
  208. LOCAL MOT_TSEC_EXT_PARAMS sysMotEtsecExtParms =
  209.     {
  210.     0, /* TSEC specific user bit flags */
  211.     0, /* TSEC specific user reg flags */
  212.     0, /* Ethernet Minimum Frame Length */
  213.     0, /* Ethernet Maximum Frame Length */
  214.        /* TSEC Specific Device Parameters */
  215.     0, /* ext + pause time value */
  216.     0, /* Ten Bit Interface physical address */
  217.         /* Tx FIFO Manipulation */
  218.     0,  /* UINT32 fifoTxTheshold; */
  219.     0,  /* UINT32 fifoTxStarve; */
  220.     0,  /* UINT32 fifoTxStarveShutOff; */
  221.         /* MAC specific Parameters */
  222.     {0,0,0,0,0,0,0,0}, /* initial individual addresses [8] */
  223.     {0,0,0,0,0,0,0,0}, /* initial group addresses [8] */
  224.     0,  /* UINT32 macPreambleLength; */
  225.     0,  /* UINT32 macIfMode; */
  226.     0,  /* UINT32 macIpgifgNbbipg1; */
  227.     0,  /* UINT32 macIpgifgNbbipg2; */
  228.     0,  /* UINT32 macIpgifgMifge; */
  229.     0,  /* UINT32 macIpgifgBbipg; */
  230.         /* MAC half duplex specific parameters */
  231.     0,  /* UINT32 macHalfDuplexAltBebTruncation; */
  232.     0,  /* UINT32 macHalfDuplexRetryMaximum; */
  233.     0,  /* UINT32 macHalfDuplexCollisionWindow; */
  234.     0,  /* UINT32 miiMgmtClockSelect; */
  235.     0,  /* UINT32 phyAddress; */
  236.         /* Misc */
  237.     0,  /* UINT32 extL2Cache; */
  238.     0,  /* UINT32 bdL2Cache;  */
  239.     0,  /* UINT32 dmaExtLength; */
  240.     0   /* UINT32 dmaExtIndex; */
  241.     };
  242. #endif
  243. #endif
  244. #ifdef INCLUDE_MOT_ETSEC_HEND
  245. #   ifdef INCLUDE_HEND_PARAM_SYS
  246. #define MAC_ADDR_LEN 6
  247. /******************************************************************************
  248. *
  249. * sysParamsSend
  250. *
  251. */
  252. void sysParamSend
  253.     (
  254.     UINT32 unit
  255.     )
  256.     {
  257.     UINT32 value;
  258.     char * pName;
  259.     int loop=0;
  260.     char* str=NULL;
  261.     HEND_RX_QUEUE_PARAM * pRxParam;
  262.     pName = "motetsecHEnd";
  263.     value = unit;
  264.     str=malloc(0x20);
  265.     for(loop=0;loop< _c_(NUM_RX_QUEUES);loop++)
  266. {
  267. pRxParam = malloc(sizeof (HEND_RX_QUEUE_PARAM));
  268. bzero((char *)pRxParam,(sizeof (HEND_RX_QUEUE_PARAM)));
  269. pRxParam->jobQueId = NULL;
  270. pRxParam->priority = loop;
  271. sysHEndParamAttach(pRxParam,HEND_RX_Q_PARAM,HEND_VOID_PTR,pName,unit);
  272. }
  273.     free(str);
  274.     }
  275. #endif /* HEND_PARAM_SYS */
  276. #endif /* MOT_ETSEC_HEND */
  277. /***********************************************************************
  278. *
  279. * sysMotEtsecHEndLoad - load an instance of the motEtsecHEnd driver
  280. *
  281. * This routine loads the motETsecHEnd driver with proper parameters.
  282. *
  283. * The END device load string formed by this routine is in the following
  284. * format.
  285. * <unit>:<tsecAddrs>:<tsecNum>:<MAC Address>:<MOT_TSEC_FUNC_TABLE>:
  286. * <MOT_TSEC_PARAMS>:<MOT_TSEC_EXT_PARAMS>
  287. *
  288. * .IP <unit>
  289. * The unit number passed by the Mux.
  290. * .IP <CCSBAR>
  291. * The MPC85xx Internal memory base address. eg.0xfe000000
  292. * .IP <tsecNum>
  293. * This Tsec's physical port, 0 or 1. Not the same as the unit number.
  294. * .IP <MAC ADDRESS>
  295. * This TSEC's MAC address eg. 00-0a-1e-12-34-56
  296. * .IP <usrFlags>
  297. * User Init Flags
  298. * .IP <MOT_TSEC_PHY_PARAMS>
  299. * PHY Init parameters
  300. * .IP <MOT_TSEC_FUNC_TABLE>
  301. * Structure Address of external and driver functions
  302. * .IP <MOT_TSEC_PARAMS>
  303. * Structure Address of Buffer Allocation Parameters
  304. * .IP <MOT_TSEC_EXT_PARAMS>
  305. * Structure Address of TSEC specific parameters
  306. *
  307. * This routine only loads and initializes one instance of the device.
  308. * If the user wishes to use more than one motETsecHEnd devices, this routine
  309. * should be changed.
  310. *
  311. * RETURNS: pointer to END object or NULL.
  312. *
  313. * SEE ALSO: motETsecHEndLoad ()
  314. */
  315. #ifdef INCLUDE_MOT_ETSEC_HEND
  316. END_OBJ * sysMotEtsecHEndLoad
  317.     (
  318.     char * pParamStr,   /* ptr to initialization parameter string */
  319.     void * pBusDev       /* unused optional argument */
  320.     )
  321.     {
  322.     END_OBJ * pEnd;
  323.     UINT32 unit;
  324.     char *  tok;             /* an initString token */
  325.     char *  holder = NULL;   /* points to initString fragment beyond tok */
  326. #ifdef INCLUDE_L2_CACHE
  327.     sysMotEtsecFuncs.extWriteL2AllocFunc = sysL2ExtWriteBufferAlloc;
  328. #endif
  329.     if (strlen (pParamStr) == 0)
  330.         {
  331.        /*
  332.         * muxDevLoad() calls us twice.  If the string is
  333.         * zero length, then this is the first time through
  334.         * this routine.
  335.         */
  336.         pEnd = (END_OBJ *) motEtsecHEndLoad  (pParamStr, pBusDev);
  337.         }
  338.     else
  339.         {
  340.         /*
  341.         * On the second pass through here, we actually create
  342.         * the initialization parameter string on the fly.
  343.         * Note that we will be handed our unit number on the
  344.         * second pass and we need to preserve that information.
  345.         * So we use the unit number handed from the input string.
  346.         */
  347.         /* extract the unit number */
  348.         tok = strtok_r (pParamStr, ":", &holder);
  349.         if (tok == NULL)
  350.            return (NULL);
  351.         unit = (int) strtoul (tok, NULL, 16);
  352. motEtsecHEndParamSend (unit);
  353. sysParamSend(unit);
  354.         if ((pEnd = (END_OBJ *) motEtsecHEndLoad  (pParamStr, pBusDev)) == (END_OBJ *)NULL)
  355.             logMsg ("Error: motEtsecHEndLoad  failed to load drivern", 0, 0, 0, 0, 0, 0);
  356.         }
  357.     return pEnd;
  358.     }
  359. #else
  360. END_OBJ * sysMotEtsecEndLoad
  361.     (
  362.     char * pParamStr,   /* ptr to initialization parameter string */
  363.     void * unused       /* unused optional argument */
  364.     )
  365.     {
  366.     END_OBJ * pEnd;
  367.     char   paramStr [300];
  368.     UINT32 unit, usrFlags;
  369.     char *  tok;             /* an initString token */
  370.     char *  holder = NULL;   /* points to initString fragment beyond tok */
  371.     char enetAddr[8];
  372.     /*
  373.     * <CCSBAR>:
  374.     * <tsecNum>:
  375.     * <MAC Address>:
  376.     * <UsrFlags>:
  377.     * <MOT_TSEC_PHY_PARAMS>:
  378.     * <MOT_TSEC_FUNC_TABLE>:
  379.     * <MOT_TSEC_PARAMS>:
  380.     * <MOT_TSEC_EXT_PARAMS>
  381.     * Note that unit string is prepended by the mux, so we
  382.     * don't put it here.
  383.     */
  384. #ifdef INCLUDE_L2_CACHE
  385.     sysMotEtsecFuncs.extWriteL2AllocFunc = sysL2ExtWriteBufferAlloc;
  386. #endif
  387.     if (strlen (pParamStr) == 0)
  388.         {
  389.         /*
  390.         * muxDevLoad() calls us twice.  If the string is
  391.         * zero length, then this is the first time through
  392.         * this routine.
  393.         */
  394.         pEnd = (END_OBJ *) motTsecEndLoad  (pParamStr);
  395.         }
  396.     else
  397.         {
  398.         /*
  399.         * On the second pass through here, we actually create
  400.         * the initialization parameter string on the fly.
  401.         * Note that we will be handed our unit number on the
  402.         * second pass and we need to preserve that information.
  403.         * So we use the unit number handed from the input string.
  404.         */
  405.         /* extract the unit number */
  406.         tok = strtok_r (pParamStr, ":", &holder);
  407.         if (tok == NULL)
  408.            return (NULL);
  409.         unit = (int) strtoul (tok, NULL, 16);
  410. sysMotEtsecEnetAddrGet(unit,enetAddr);
  411.         if (unit > MOT_TSEC_MAX_DEVS )
  412.             return (NULL);
  413. if(unit>1)
  414.     {
  415.     usrFlags = MOT_TSEC_USR_STAT_ENABLE | MOT_TSEC_USR_MODE_RGMII;
  416.     }
  417. else
  418.     {
  419.     /* enable stats and put into GMII mode */
  420.     usrFlags = MOT_TSEC_USR_STAT_ENABLE | MOT_TSEC_USR_MODE_GMII;
  421.     }
  422.         /* finish off the initialization parameter string */
  423.         sprintf (paramStr, "%d:0x%x:0x%x:%02x-%02x-%02x-%02x-%02x-%02x:0x%x:0x%x:0x%x:0x%x:0x%x:0x%x:0x%x",
  424.                  unit,
  425.                  CCSBAR,
  426.                  sysMotEtsecNumByUnit[unit],
  427.                  enetAddr[5],enetAddr[4],enetAddr[3],enetAddr[2],enetAddr[1],enetAddr[0],
  428.                  usrFlags,
  429.                  &sysMotEtsecPhyParms[unit],
  430.                  &sysMotEtsecFuncs,
  431.                  &sysMotEtsecParms,
  432.                  (UINT32)NULL,
  433.  (UINT32)NULL,
  434.  (UINT32)&sysMotIntCtrl[unit]
  435.                  );
  436.         if ((pEnd = (END_OBJ *) motTsecEndLoad  (paramStr)) == (END_OBJ *)NULL)
  437.             logMsg ("Error: motTsecEndLoad  failed to load drivern", 0, 0, 0, 0, 0, 0);
  438. #if 0
  439.         else
  440.             logMsg ("Load successful: 0x%08xn", (int)pEnd, 0, 0, 0, 0, 0);
  441. #endif
  442.         }
  443.     return pEnd;
  444.     }
  445. #endif
  446. /***********************************************************************
  447. *
  448. * sysMiiPhyStatusGet - Return hardware-dependent PHY status
  449. *
  450. * This routine returns the status for all PHY attributes that are
  451. * hardware dependent.
  452. *
  453. * RETURNS: ERROR or OK.
  454. */
  455. LOCAL STATUS sysMiiPhyStatusGet
  456.     (
  457.     PHY_INFO            * pPhyInfo,
  458.     MOT_TSEC_PHY_STATUS * pStatus
  459.     )
  460.     {
  461.     UINT16 miiStat;
  462.     int    retVal = OK;
  463.     if (sysMotEtsecFuncs.miiPhyRead != NULL)
  464.         {
  465.         retVal = sysMotEtsecFuncs.miiPhyRead(pPhyInfo->phyAddr,17,&miiStat);
  466.         if (retVal != OK)
  467.             return ERROR;
  468.         pStatus->duplex = (miiStat&0x2000)?0:1;
  469.         pStatus->speed  = (miiStat&0xc000)>>13;
  470.         }
  471.     return retVal;
  472.     }
  473. #ifdef TSEC_MII_INT_SUPPORT
  474. /***********************************************************************
  475. *
  476. * sysMiiInt - MII interrupt service routine
  477. *
  478. * This routine checks if the link up or down and update a flag
  479. *
  480. * RETURNS: None.
  481. */
  482. LOCAL void sysMiiInt
  483.     (
  484.     PHY_INFO * pPhyInfo
  485.     )
  486.     {
  487.     UINT16 miiIntStatusReg;
  488.     UINT32 event;
  489.     /* Clear MII interrupt by reading Int status reg */
  490.     if (sysMotEtsecFuncs.miiPhyRead != NULL)
  491.         {
  492.         sysMotEtsecFuncs.miiPhyRead (pPhyInfo->phyAddr,20,&miiIntStatusReg);
  493.         event = miiIntStatusReg;
  494.         if (sysMotEtsecFuncs.miiPhyInt != NULL)
  495.             {
  496.             sysMotEtsecFuncs.miiPhyInt (pPhyInfo->pDrvCtrl, event);
  497.             }
  498.         }
  499.     return;
  500.     }
  501. #endif
  502. /***********************************************************************
  503. *
  504. * sysMiiPhyInit - initialize and configure the PHY devices
  505. *
  506. * This routine scans, initializes and configures the PHY device.
  507. *
  508. * RETURNS: OK, or ERROR.
  509. */
  510. LOCAL STATUS sysMiiPhyInit
  511.     (
  512.     PHY_INFO * pPhyInfo
  513.     )
  514.     {
  515. #ifndef INCLUDE_MOT_ETSEC_HEND
  516.     UINT16 modeSet;
  517.     UINT16 miiPhyEnableReg;
  518.     /* Initialisation of Phy performed in driver */
  519.     switch(((TSEC_DRV_CTRL*)pPhyInfo->pDrvCtrl)->userFlags & MOT_TSEC_USR_MODE_MASK)
  520. {
  521. case MOT_TSEC_USR_MODE_GMII:
  522.     modeSet = 0x0000;
  523.     break;
  524. case MOT_TSEC_USR_MODE_RGMII:
  525. case MOT_TSEC_USR_MODE_RGMII_100:
  526.     modeSet = 0x1200;
  527.     break;
  528. case MOT_TSEC_USR_MODE_TBI:
  529.     modeSet = 0x2000;
  530.     break;
  531. case MOT_TSEC_USR_MODE_RTBI:
  532.     modeSet = 0x3000;
  533.     break;
  534. default:
  535.     modeSet = 0x0000;
  536.     break;
  537. }
  538.     /* Reister 23 set the interface RGMII/GMII/TBI/RBTI */
  539.     if (sysMotEtsecFuncs.miiPhyRead != NULL)
  540. {
  541.         sysMotEtsecFuncs.miiPhyRead(pPhyInfo->pDrvCtrl,
  542.    ((TSEC_DRV_CTRL*)pPhyInfo->pDrvCtrl)->phyInit->phyAddr,23,
  543.    &miiPhyEnableReg);
  544. miiPhyEnableReg &= ~0xff00;
  545. miiPhyEnableReg |= modeSet;
  546. sysMotEtsecFuncs.miiPhyWrite(pPhyInfo->pDrvCtrl,
  547.     ((TSEC_DRV_CTRL*)pPhyInfo->pDrvCtrl)->phyInit->phyAddr, 23,
  548.     miiPhyEnableReg);
  549.         sysMotEtsecFuncs.miiPhyRead(pPhyInfo->pDrvCtrl,
  550.                                    ((TSEC_DRV_CTRL*)pPhyInfo->pDrvCtrl)->phyInit->phyAddr,23,
  551.    &miiPhyEnableReg);
  552. #ifdef PHY_LOOPBACKTEST
  553. if(((TSEC_DRV_CTRL*)pPhyInfo->pDrvCtrl)->phyInit->phyAddr == 0)
  554.     {
  555.     sysMotEtsecFuncs.miiPhyRead(pPhyInfo->pDrvCtrl,
  556.        ((TSEC_DRV_CTRL*)pPhyInfo->pDrvCtrl)->phyInit->phyAddr,0,
  557.        &miiPhyEnableReg);
  558.             miiPhyEnableReg |= 0x4000;
  559.             sysMotEtsecFuncs.miiPhyWrite(pPhyInfo->pDrvCtrl,
  560.                                         ((TSEC_DRV_CTRL*)pPhyInfo->pDrvCtrl)->phyInit->phyAddr,0 ,
  561.                                         miiPhyEnableReg);
  562.             }
  563. #endif
  564.         }
  565. #endif
  566.     return OK;
  567.     }
  568. /***********************************************************************
  569. *
  570. * sysMotEtsecEnetEnable - enable the MII interface to the TSEC controller
  571. *
  572. * This routine is expected to perform any target specific functions required
  573. * to enable the Ethernet device and to connect the MII interface to the TSEC.
  574. *
  575. * RETURNS: OK
  576. */
  577. LOCAL STATUS sysMotEtsecEnetEnable
  578.     (
  579.     UINT32  immrVal,    /* base address of the on-chip RAM */
  580.     UINT32  tsecNum     /* TSEC being used */
  581.     )
  582.     {
  583.     int intLevel;
  584.     intLevel = intLock ();
  585.     intUnlock (intLevel);
  586.     return(OK);
  587.     }
  588. /***********************************************************************
  589. *
  590. * sysMotEtsecEnetDisable - disable MII interface to the TSEC controller
  591. *
  592. * This routine is expected to perform any target specific functions required
  593. * to disable the Ethernet device and the MII interface to the TSEC
  594. * controller.  This involves restoring the default values for all the Port
  595. * B and C signals.
  596. *
  597. * RETURNS: OK, always.
  598. */
  599. LOCAL STATUS sysMotEtsecEnetDisable
  600.     (
  601.     UINT32  immrVal,    /* base address of the on-chip RAM */
  602.     UINT32  tsecNum  /* TSEC being used */
  603.     )
  604.     {
  605.     int intLevel;
  606.     intLevel = intLock ();
  607.     /* Disable the interrupt */
  608.     intUnlock (intLevel);
  609.     return(OK);
  610.     }
  611. /***********************************************************************
  612. *
  613. * sysMotEtsecEnetAddrGet - get the hardware Ethernet address
  614. *
  615. * This routine provides the six byte Ethernet hardware address that will be
  616. * used by each individual TSEC device unit.  This routine must copy
  617. * the six byte address to the space provided by <addr>.
  618. *
  619. * RETURNS: OK
  620. */
  621. STATUS sysMotEtsecEnetAddrGet
  622.     (
  623.     int     unit,
  624.     UCHAR * pAddr
  625.     )
  626.     {
  627.     sysNetMacNVRamAddrGet ("mottsec",unit,pAddr,8);
  628.     return(OK);
  629.     }
  630. /***********************************************************************
  631. *
  632. * sysMotEtsecEnetAddrSet - Set the hardware Ethernet address
  633. *
  634. * This routine provides the six byte Ethernet hardware address that will be
  635. * used by each individual TSEC device unit.  This routine must copy
  636. * the six byte address to the space provided by <addr>.
  637. *
  638. * RETURNS: OK
  639. */
  640. LOCAL STATUS sysMotEtsecEnetAddrSet
  641.     (
  642.     int     unit,
  643.     UCHAR * pAddr
  644.     )
  645.     {
  646.     return OK;
  647.     }