gei82543End.c
上传用户:luoyougen
上传日期:2008-05-12
资源大小:23136k
文件大小:174k
源码类别:

VxWorks

开发平台:

C/C++

  1.             }
  2.         if (frameAccept != TRUE)
  3.             {
  4.             DRV_LOG (DRV_DEBUG_POLL_RX, "Packet Error 0x%xn", rxdErr, 
  5.                                     2, 3, 4, 5, 6);
  6.             LOGMSG("Packet error 0x%x n",rxdErr, 2, 3, 4, 5, 6);
  7.             goto errorExit;
  8.             }
  9.         }
  10.     }
  11. #endif /* INCLUDE_TBI_COMPATIBLE */
  12.     len -= RX_CRC_LEN;
  13.     len &= ~0xc000;
  14.     if (len > (pDrvCtrl->mtu + GEI_DEFAULT_ETHERHEADER) || 
  15.         len < MIN_ETHER_PACKET_SIZE)
  16.        {        
  17.         DRV_LOG (DRV_DEBUG_POLL_RX, "invalid packet length=0x%x!n", 
  18.                                      len, 0, 0, 0, 0, 0);
  19.         retVal = EAGAIN; 
  20.         goto errorExit;
  21.         }
  22.     /* upper layer must provide a valid buffer. */
  23.     if (pMblk->mBlkHdr.mLen < len)
  24.         {        
  25.         DRV_LOG (DRV_DEBUG_POLL_RX, "invalid mbuf length=0x%x!n", 
  26.                                      pMblk->mBlkHdr.mLen, 0, 0, 0, 0, 0);
  27.         retVal = EAGAIN;
  28.         goto errorExit;
  29.         }
  30.     /* get the packet address */
  31.     GEI_READ_DESC_LONG(pRxDesc, RXDESC_BUFADRLOW_OFFSET, bufAddr);
  32.     pCluster = GEI_BUS_TO_VIRT(bufAddr);
  33.     if ((*pCluster ) & (UINT8) 0x01)
  34.         pDrvCtrl->end.mib2Tbl.ifInNUcastPkts += 1;
  35.     else
  36.         END_ERR_ADD (&pDrvCtrl->end, MIB2_IN_UCAST, +1);
  37.        
  38.     /* cache coherence */
  39.     END_CACHE_INVALIDATE ((UINT32)pCluster, len);     
  40.     /* process device packet into net buffer */
  41.     bcopy (pCluster, pMblk->m_data, len);
  42.     pMblk->mBlkHdr.mFlags |= M_PKTHDR;    /* set the packet header */
  43.     pMblk->mBlkHdr.mLen = len;            /* set the data len */
  44.     pMblk->mBlkPktHdr.len = len;          /* set the total len */
  45.   
  46.     DRV_LOG (DRV_DEBUG_POLL_RX, "gei82543EndPollRcv...Donen",  1, 2, 3, 
  47.                                  4, 5, 6);
  48. errorExit:
  49.     gei82543RxDesUpdate(pDrvCtrl, NULL);
  50.     return (retVal);
  51.     }
  52. /*************************************************************************
  53. *
  54. * gei82543EndPollSend - routine to send a packet in polling mode.
  55. *
  56. * This routine send a packet in polling mode
  57. *
  58. * RETURNS: OK or ERROR
  59. */
  60. LOCAL STATUS gei82543EndPollSend
  61.     (
  62.     END_DEVICE*     pDrvCtrl,    /* device to be polled */
  63.     M_BLK_ID        pMblk        /* packet to send */
  64.     )
  65.     {
  66.     int             len;         /* packet length */
  67.     volatile UINT16 txHead;      /* TX descriptor head index */
  68.     volatile UINT16 txTail;      /* TX descriptor tail index */
  69.     UINT32          tmp;         /* temparary variable for register */
  70.     char *          pDesc;       /* descriptor pointer */
  71.     int             tempTail;    /* temp variable for tail */
  72.     BOOL            complete = FALSE; 
  73.     DRV_LOG (DRV_DEBUG_POLL_TX, "gei82543EndPollSend...n", 1, 2, 3, 4, 5, 6);
  74.     
  75.     /* check if the transmitter idle */ 
  76.     GEI_READ_REG(INTEL_82543GC_TDH, tmp);
  77.     txHead = (UINT16) tmp;
  78.     GEI_READ_REG(INTEL_82543GC_TDT, tmp);
  79.     txTail = (UINT16) tmp;
  80.     if (txHead != txTail)
  81.            {
  82.            DRV_LOG (DRV_DEBUG_POLL_TX, "gei82543EndPollSend: TX Activen", 
  83.                                         1, 2, 3, 4, 5, 6);
  84.            return (EAGAIN);
  85.            }    
  86.    /* check if any TX descriptor available */
  87.     GEI_GET_TX_DESC_TAIL_UPDATE(tempTail, 1);
  88.     pDesc = GEI_GET_TX_DESC_ADDR(tempTail);   
  89.     if (!(GEI_READ_DESC_BYTE(pDesc, TXDESC_STATUS_OFFSET) & TXD_STAT_DD))
  90.         {
  91.         DRV_LOG (DRV_DEBUG_POLL_TX, ("gei82543EndPollSend...no TX descriptor 
  92.                                       availablen"), 1, 2, 3, 4, 5, 6);
  93.         return (EAGAIN);    
  94.         }
  95.     /* Ok, we have TX descriptor */
  96.     pDesc = GEI_GET_TX_DESC_ADDR(pDrvCtrl->txDescTail);       
  97.     tmp = ((UINT32)(pDrvCtrl->pTxPollBufAdr) + (GEI_DESC_ALIGN_BYTE - 1)) & 
  98.                             ~(GEI_DESC_ALIGN_BYTE - 1);
  99.     GEI_WRITE_DESC_LONG(pDesc, TXDESC_BUFADRLOW_OFFSET, 
  100.                                     (UINT32)GEI_VIRT_TO_BUS((char *)tmp));
  101.     len = netMblkToBufCopy(pMblk, (char *)tmp, NULL);
  102.     len = max (ETHERSMALL, len);
  103.  
  104.     /* set up the length field */
  105.     GEI_WRITE_DESC_WORD(pDesc, TXDESC_LENGTH_OFFSET, (UINT16)len);
  106.      
  107.     /* zero the status field in Tx Desc */
  108.     GEI_WRITE_DESC_LONG(pDesc, TXDESC_STATUS_OFFSET, 0);
  109.     /* set up the command field */
  110.     GEI_WRITE_DESC_BYTE(pDesc, TXDESC_CMD_OFFSET, 
  111.                                (TXD_CMD_EOP | TXD_CMD_IFCS | 
  112.                                 TXD_CMD_IDE | TXD_CMD_RS));
  113.     CACHE_PIPE_FLUSH(); 
  114.     /* update the tail pointer in TDT register */
  115.     GEI_WRITE_REG(INTEL_82543GC_TDT, tempTail);
  116.     /* bump the statistic counter. */
  117.     if (pMblk->mBlkHdr.mData[0] & (UINT8) 0x01)
  118.         pDrvCtrl->end.mib2Tbl.ifOutNUcastPkts += 1;       
  119.     else
  120.         END_ERR_ADD (&pDrvCtrl->end, MIB2_OUT_UCAST, +1);
  121.     /* wait for packet send out */
  122.     while(!complete)
  123.          {
  124.          if ((UINT8)GEI_READ_DESC_BYTE(pDesc, TXDESC_STATUS_OFFSET) & 
  125.                                                               TXD_STAT_DD)
  126.              complete = TRUE;  
  127.          }
  128.     complete = FALSE;
  129.     /* wait for transmitter idle */     
  130.     while (!complete)
  131.          { 
  132.          GEI_READ_REG(INTEL_82543GC_TDH, tmp);
  133.          txHead = (UINT16) tmp;
  134.          GEI_READ_REG(INTEL_82543GC_TDT, tmp);
  135.          txTail = (UINT16) tmp;
  136.                
  137.          if (txHead == txTail)
  138.              complete = TRUE;
  139.          }
  140.     pDrvCtrl->txDescTail = tempTail;
  141.     DRV_LOG (DRV_DEBUG_POLL_TX, "gei82543EndPollSend...donen",
  142.                                  1, 2, 3, 4, 5, 6);
  143.     return (OK);
  144.     }
  145. /*************************************************************************
  146. *
  147. * gei82543EndPollStart - start polling mode operations
  148. *
  149. * This routine starts the polling mode operation
  150. *
  151. * RETURNS: OK or ERROR.
  152. */
  153. LOCAL STATUS gei82543EndPollStart
  154.     (
  155.     END_DEVICE * pDrvCtrl    /* device to be polled */
  156.     )
  157.     {
  158.     int         oldLevel;
  159.  
  160.     oldLevel = intLock (); 
  161.     /* disable chip interrupt */
  162.     gei82543DisableChipInt(pDrvCtrl);
  163.     /* turn off system interrupts */
  164.     SYS_INT_DISABLE(pDrvCtrl);
  165.     /* set the polling flag */
  166.     pDrvCtrl->flags |= FLAG_POLLING_MODE;
  167.     intUnlock (oldLevel);   
  168.     taskDelay(sysClkRateGet() / 5);
  169.     DRV_LOG (DRV_DEBUG_POLL, "Polling Start...n", 1, 2, 3, 4, 5, 6);
  170.     return (OK);
  171.     }
  172. /*************************************************************************
  173. *
  174. * gei82543EndPollStop - stop polling mode operations
  175. *
  176. * This function terminates polled mode operation.  The device returns to
  177. * interrupt mode. The device interrupts are enabled, the current mode flag is 
  178. * switched to indicate interrupt mode and the device is then reconfigured for
  179. * interrupt operation.
  180. *
  181. * RETURNS: OK or ERROR.
  182. */
  183. LOCAL STATUS gei82543EndPollStop
  184.     (
  185.     END_DEVICE * pDrvCtrl    /* device to be polled */
  186.     )
  187.     {
  188.     int         oldLevel;
  189.     oldLevel = intLock ();
  190.     pDrvCtrl->txDescFreeNum = 0;
  191.     gei82543TxDesCleanGet (pDrvCtrl, FREE_ALL_FORCE);
  192.     /* update the txDescLastCheck */
  193.     pDrvCtrl->txDescLastCheck = (pDrvCtrl->txDescTail + 
  194.                              pDrvCtrl->txDescNum - 1) % (pDrvCtrl->txDescNum);
  195.     pDrvCtrl->flags &= ~FLAG_POLLING_MODE;
  196.     /* clean pending interrupts */
  197.     gei82543DisableChipInt (pDrvCtrl);
  198.     /* turn on system interrupts */
  199.     SYS_INT_ENABLE(pDrvCtrl);
  200.     /* enable chip interrupt */
  201.     gei82543EnableChipInt (pDrvCtrl);
  202.  
  203.     intUnlock (oldLevel);
  204.     taskDelay (sysClkRateGet() / 5);
  205.     DRV_LOG (DRV_DEBUG_POLL, "Polling stop ...donen", 1, 2, 3, 4, 5, 6);
  206.     return (OK);
  207.     }
  208. /*************************************************************************
  209. *
  210. * gei82543TxMblkWaitClean - return borrowed mBlk/clDesc
  211. *
  212. * This function returns borrowed mBlk(s) when transmitting can be done 
  213. * in 5 seconds. Otherwise, it will forcefully return those mBlk(s).  
  214. *
  215. * RETURNS: N/A
  216. */
  217. LOCAL void gei82543TxMblkWaitClean
  218.     (
  219.     END_DEVICE * pDrvCtrl          /* device to return mBlk(s) */
  220.     )
  221.     {
  222.     int ix;
  223.     /* wait until rx done */
  224.     for (ix = 50; ix; ix--)
  225.            {
  226.            /* clean up all loaned mbuf */
  227.            if (pDrvCtrl->txDescFreeNum < (pDrvCtrl->txDescNum - 1))
  228.                gei82543TxMblkFree (pDrvCtrl, FREE_ALL_AUTO);
  229.            if (pDrvCtrl->rxtxHandling != TRUE && 
  230.                         pDrvCtrl->txDescFreeNum == (pDrvCtrl->txDescNum - 1))
  231.                break;
  232.       
  233.            taskDelay (sysClkRateGet () / 10);
  234.            }
  235.     if (pDrvCtrl->rxtxHandling)
  236.         {
  237.         DRV_LOG (DRV_DEBUG_LOAD, "pDrvCtrl->rxtxHandling= TRUE%d, n", 1,
  238.                                   2, 3, 4, 5, 6);
  239.         }
  240.     /* force free all loaned mBlk */
  241.     if (pDrvCtrl->txDescFreeNum < (pDrvCtrl->txDescNum -1)) 
  242.         gei82543TxMblkFree (pDrvCtrl, FREE_ALL_FORCE);
  243.     }
  244. /*************************************************************************
  245. *
  246. * gei82543EndStop - stop the device
  247. *
  248. * This function calls BSP functions to disconnect interrupts and stop
  249. * the device from operating in interrupt mode.
  250. *
  251. * RETURNS: OK or ERROR.
  252. */
  253. LOCAL STATUS gei82543EndStop
  254.     (
  255.     END_DEVICE *pDrvCtrl    /* device to be stopped */
  256.     )
  257.     {
  258.     STATUS result = OK;
  259.     if (pDrvCtrl->attach != TRUE)
  260.         return ERROR;
  261.     /* mark interface down */
  262.     END_FLAGS_CLR (&pDrvCtrl->end, (IFF_UP | IFF_RUNNING));    
  263.     /* turn off system interrupts */
  264.     SYS_INT_DISABLE(pDrvCtrl);
  265.     /* disable TX/RX operation */
  266.     gei82543TxRxDisable (pDrvCtrl);
  267.     gei82543DisableChipInt (pDrvCtrl);
  268.     /* cancel the timer if needed */
  269.     if (pDrvCtrl->timerId)
  270.         wdCancel (pDrvCtrl->timerId);
  271.     /* check device start flag */
  272.     if (pDrvCtrl->devStartFlag != TRUE)
  273.         return OK;
  274.     if (INT_CONTEXT())
  275.         {
  276.         netJobAdd ((FUNCPTR) gei82543TxMblkWaitClean, (int)pDrvCtrl,
  277.                    0, 0, 0, 0);
  278.         }
  279.     else 
  280.         {
  281.         gei82543TxMblkWaitClean (pDrvCtrl);
  282.         }
  283.     if (pDrvCtrl->pPhyInfo != NULL && pDrvCtrl->cableType == GEI_COPPER_MEDIA)
  284.         {
  285.         if (INT_CONTEXT())
  286.             {
  287.             netJobAdd ((FUNCPTR) miiPhyUnInit, (int)(pDrvCtrl->pPhyInfo),
  288.                        0, 0, 0, 0);
  289.             netJobAdd ((FUNCPTR) cfree, (int)(pDrvCtrl->pPhyInfo),
  290.                        0, 0, 0, 0);
  291.             }
  292.          else
  293.             { 
  294.             if (miiPhyUnInit (pDrvCtrl->pPhyInfo) != OK)
  295.                 {
  296.                 LOGMSG("miiPhyUnInit failsn", 0,0,0,0,0,0);
  297.                 }
  298.              cfree ((char *)pDrvCtrl->pPhyInfo);
  299.             }
  300.         }
  301.     /* disconnect interrupt handler */
  302.     SYS_INT_DISCONNECT(pDrvCtrl, gei82543EndInt, (int)pDrvCtrl, &result);
  303.     if (result == ERROR)
  304.         {
  305.         DRV_LOG (DRV_DEBUG_LOAD, "Could not disconnect interrupt!n", 1, 2, 
  306.                                   3, 4, 5, 6);
  307.         }
  308.     pDrvCtrl->devStartFlag = FALSE;
  309.     return (result);
  310.     }
  311. /*************************************************************************
  312. *
  313. * gei82543EndUnload - unload a driver from the system
  314. *
  315. * This function first brings down the device, and then frees any
  316. * stuff that was allocated by the driver in the load function.
  317. *
  318. * RETURNS: OK or ERROR.
  319. */
  320. LOCAL STATUS gei82543EndUnload
  321.     (
  322.     END_DEVICE* pDrvCtrl    /* device to be unloaded */
  323.     )
  324.     {
  325.     /* delay a while in case device tries to stop */
  326.     taskDelay (sysClkRateGet () * 2);
  327.     END_OBJECT_UNLOAD (&pDrvCtrl->end);
  328.     /* free allocated memory */
  329.     gei82543MemAllFree (pDrvCtrl);    
  330.     if (pDrvCtrl->timerId)
  331.         wdDelete (pDrvCtrl->timerId);
  332.     pDrvCtrl->attach = FALSE;
  333.     return (OK);
  334.     }
  335. /**************************************************************************
  336. *
  337. * gei82543TxSetup - configure and setup TX for running
  338. * This routine sets up the data structure for TX and configures transmitter
  339. *
  340. * RETURNS: N/A
  341. */
  342. LOCAL void gei82543TxSetup
  343.     (
  344.     END_DEVICE * pDrvCtrl    /* device to set up TX descriptors */
  345.     )
  346.     {
  347.     UINT32 tctlVal;          /* transmit register value */
  348.     int ix;
  349.    /* initialization for TX operation*/
  350.     pDrvCtrl->txDescTail  = 0;
  351.     pDrvCtrl->txStall    = FALSE;
  352.     pDrvCtrl->txDescFreeNum = pDrvCtrl->txDescNum - 1;
  353.     pDrvCtrl->txDescLastCheck = pDrvCtrl->txDescNum - 1;
  354.     /* carve the transmit buffer memory */
  355.     for (ix = 0; ix < pDrvCtrl->txDescNum; ix++)
  356.         {
  357.         P_TX_DESCTL pDescCtl;
  358.         pDescCtl = pDrvCtrl->pTxDesCtlBase + ix;     
  359.         pDescCtl->mBlk = NULL;
  360.         }
  361.     /* pre-init the transmit buffer memory */
  362.     for (ix = 0; ix < pDrvCtrl->txDescNum; ix++)
  363.         {
  364.         char *    pTxDesc;
  365.         pTxDesc = GEI_GET_TX_DESC_ADDR(ix);
  366.         /* set up the command field */
  367.         GEI_WRITE_DESC_BYTE(pTxDesc, TXDESC_CMD_OFFSET, 
  368.                               (TXD_CMD_EOP | TXD_CMD_IFCS | 
  369.                                TXD_CMD_IDE | TXD_CMD_RS));
  370.         /* set DD bits in STATUS field */
  371.         GEI_WRITE_DESC_BYTE(pTxDesc, TXDESC_STATUS_OFFSET, TXD_STAT_DD);
  372.         }
  373.     /* set the TX descriptor BASE register */
  374.     GEI_WRITE_REG(INTEL_82543GC_TDBAL, 
  375.                   (UINT32) GEI_VIRT_TO_BUS((void *)(pDrvCtrl->pTxDescBase)));
  376.     GEI_WRITE_REG(INTEL_82543GC_TDBAH, 0);    
  377.     /* set the length field */
  378.     GEI_WRITE_REG(INTEL_82543GC_TDLEN, (TXDESC_SIZE * pDrvCtrl->txDescNum));
  379.     /* initialize tail and head registers */
  380.     GEI_WRITE_REG(INTEL_82543GC_TDH, 0);
  381.     GEI_WRITE_REG(INTEL_82543GC_TDT, 0);
  382.     /* Set up the interrupt delay for Transmit*/
  383.     GEI_WRITE_REG(INTEL_82543GC_TIDV, pDrvCtrl->txIntDelay);
  384.     /* Set up LWTHRESH */
  385.     if (pDrvCtrl->adaptor.boardType == PRO1000_546_BOARD)
  386. {
  387.         UINT32 txdctlVal;    /* TXDCTL register value */
  388.         UINT32 count;        /* temp var */
  389.         GEI_READ_REG(INTEL_82543GC_TXDCTL, txdctlVal); 
  390.     
  391.         count = pDrvCtrl->txDescNum / 8 - 1;
  392.          
  393.         txdctlVal = ((txdctlVal & 0x1ffffff) | (count << 25)); 
  394.          
  395.         GEI_WRITE_REG(INTEL_82543GC_TXDCTL, txdctlVal);
  396.         }
  397.     /* set up the IPG register */
  398.     if (pDrvCtrl->cableType ==  GEI_FIBER_MEDIA)
  399.            {
  400.            GEI_WRITE_REG(INTEL_82543GC_TIPG, DEFAULT_TIPG_IPGT_F 
  401.                       | (DEFAULT_TIPG_IPGR1 << TIPG_IPGR1_SHIFT) 
  402.                       | (DEFAULT_TIPG_IPGR2 << TIPG_IPGR2_SHIFT));
  403.            if (pDrvCtrl->duplex == FULL_DUPLEX_MODE)
  404.               GEI_WRITE_REG(INTEL_82543GC_TCTL, (TCTL_PSP_BIT 
  405.                           | (TX_COLLISION_THRESHOLD  << TCLT_CT_SHIFT) 
  406.                           | (FDX_COLLISION_DISTANCE  << TCTL_COLD_SHIFT)));
  407.            else
  408.               GEI_WRITE_REG(INTEL_82543GC_TCTL, (TCTL_PSP_BIT 
  409.                           | (TX_COLLISION_THRESHOLD  << TCLT_CT_SHIFT) 
  410.                           | (HDX_COLLISION_DISTANCE  << TCTL_COLD_SHIFT)));
  411.            }
  412.     else if (pDrvCtrl->cableType ==  GEI_COPPER_MEDIA)
  413.            {
  414.            GEI_WRITE_REG(INTEL_82543GC_TIPG, DEFAULT_TIPG_IPGT_T 
  415.                       | (DEFAULT_TIPG_IPGR1 << TIPG_IPGR1_SHIFT) 
  416.                       | (DEFAULT_TIPG_IPGR2 << TIPG_IPGR2_SHIFT));
  417.            GEI_READ_REG(INTEL_82543GC_TCTL, tctlVal);
  418.            GEI_WRITE_REG(INTEL_82543GC_TCTL, tctlVal | (TCTL_PSP_BIT 
  419.                       | (TX_COLLISION_THRESHOLD  << TCLT_CT_SHIFT)));
  420.            }
  421.     CACHE_PIPE_FLUSH();
  422.     return;
  423.     }
  424. /*************************************************************************
  425. *
  426. * gei82543RxSetup - configure and setup RX for running
  427. * This routine sets up the data structure for RX and configures transmitter
  428. *
  429. * RETURNS: N/A
  430. */
  431. LOCAL void gei82543RxSetup
  432.     (
  433.     END_DEVICE * pDrvCtrl      /* device to do RX descriptor setting */
  434.     )
  435.     {
  436.     int         ix;            /* index */
  437.     UINT32      rctl = 0;      /* rctl register value */
  438.     /* initialize the SW/HW for RX */
  439.     DRV_LOG (DRV_DEBUG_LOAD, "gei82543EndStart: set up RX structuren", 
  440.                               1, 2, 3, 4, 5, 6);
  441.     pDrvCtrl->rxDescTail = 0;
  442.     pDrvCtrl->rxtxHandling = FALSE;
  443.     /* hook up receive buffers to clusters in netpool */
  444.     for (ix = 0; ix < pDrvCtrl->rxDescNum; ix++)
  445.         {
  446.         char * pTempBuf;
  447.         char * pTempRxDesc;
  448.         if ((pTempBuf = (char *)netClusterGet(pDrvCtrl->end.pNetPool,
  449.                                               pDrvCtrl->pClPoolId)) == NULL)
  450.             {
  451.             DRV_LOG (DRV_DEBUG_LOAD, "gei82543EndMemInit: Could not get a 
  452.                                       buffern", 1, 2, 3, 4, 5, 6);
  453.             return;
  454.             }
  455.         pTempBuf += pDrvCtrl->offset;
  456.         pTempRxDesc = GEI_GET_RX_DESC_ADDR(ix);
  457.         GEI_WRITE_DESC_LONG(pTempRxDesc, RXDESC_BUFADRLOW_OFFSET, 
  458.                            (UINT32)GEI_VIRT_TO_BUS(pTempBuf)); 
  459.         GEI_WRITE_DESC_LONG(pTempRxDesc, RXDESC_BUFADRHIGH_OFFSET, 0);      
  460.        /* set up STATUS field */
  461.         GEI_WRITE_DESC_BYTE(pTempRxDesc,RXDESC_STATUS_OFFSET, 0);
  462.         }
  463.     GEI_WRITE_REG(INTEL_82543GC_RDTR, (pDrvCtrl->rxIntDelay | RDTR_FPD_BIT)); 
  464.     /* set up BASE register */
  465.     GEI_WRITE_REG(INTEL_82543GC_RDBAL, 
  466.                   (UINT32) GEI_VIRT_TO_BUS((void *)(pDrvCtrl->pRxDescBase)));
  467.     GEI_WRITE_REG(INTEL_82543GC_RDBAH, 0);    
  468.     /* set up the LENGTH register*/
  469.     GEI_WRITE_REG(INTEL_82543GC_RDLEN, RXDESC_SIZE * (pDrvCtrl->rxDescNum));
  470.     /* set up head/tail registers */
  471.     GEI_WRITE_REG(INTEL_82543GC_RDH, 0);
  472.     GEI_WRITE_REG(INTEL_82543GC_RDT, (pDrvCtrl->rxDescNum - 1)); 
  473.     /* set up rctl register */
  474.     rctl = (pDrvCtrl->multiCastFilterType << RCTL_MO_SHIFT);
  475.     if (pDrvCtrl->usrFlags & GEI_END_JUMBO_FRAME_SUPPORT)
  476.         {
  477.         rctl |= RCTL_LPE_BIT;
  478. /* equal transmit and receive storage in FIFO for jumbo frames */
  479.   
  480.         if (pDrvCtrl->mtu > ETHERMTU)
  481.             {
  482.             GEI_WRITE_REG(INTEL_82543GC_PBA, 0x20); /* 24KB for RX/TX buf */
  483.             }
  484.          }
  485.     if (pDrvCtrl->rxBufSize == 2048)
  486.         rctl |= RCTL_BSIZE_2048;           
  487.     else if (pDrvCtrl->rxBufSize == 4096)
  488.         rctl |= (RCTL_BSIZE_4096 | RCTL_BSEX_BIT);
  489.     else if (pDrvCtrl->rxBufSize == 8192)
  490.         rctl |= (RCTL_BSIZE_8192 | RCTL_BSEX_BIT);
  491.     else if (pDrvCtrl->rxBufSize == 16384)
  492.         rctl |= (RCTL_BSIZE_16384 | RCTL_BSEX_BIT);
  493.     else
  494.         {
  495.         LOGMSG ("Error: gei82543End.c : invalid rxBufSize =%dn",
  496.                  pDrvCtrl->rxBufSize, 2, 3, 4, 5, 6);
  497.         /* in case */
  498.         rctl |= RCTL_BSIZE_2048;
  499.         }
  500. #ifdef INCLUDE_TBI_COMPATIBLE
  501.     if (pDrvCtrl->tbiCompatibility)
  502.         rctl |= RCTL_SBP_BIT;
  503. #endif /* INCLUDE_TBI_COMPATIBLE */
  504.     GEI_WRITE_REG(INTEL_82543GC_RCTL, rctl);
  505.     CACHE_PIPE_FLUSH();
  506.     return;
  507.     }
  508. /*************************************************************************
  509. *
  510. * gei82543HwInit - Initialize 82543 MAC chip
  511. *
  512. * This routine initializes MAC and set up link   
  513. *
  514. * RETURN: OK if success
  515. */
  516. LOCAL STATUS gei82543HwInit
  517.     (
  518.     END_DEVICE * pDrvCtrl
  519.     )
  520.     {
  521.     /* clean up all receive address */
  522.     gei82543AllRxAdrClean (pDrvCtrl);
  523.     /* clean up all MTA registers */
  524.     gei82543AllMtaAdrClean (pDrvCtrl);
  525.     /* clean up VLAN stuff */
  526.     gei82543AllVlanClean (pDrvCtrl);
  527.     /* set up the IA for receive */
  528.     gei82543EtherRxAdrSet (pDrvCtrl, pDrvCtrl->adaptor.enetAddr, 0);
  529.     return (gei82543linkInit (pDrvCtrl));
  530.     }
  531. /*************************************************************************
  532. *
  533. * gei82543linkInit - set up link for device operation 
  534. * This routine gets the configuration parameters from eeprom and configure 
  535. * device for linking 
  536. *
  537. * RETURNS: OK if setup success
  538. */
  539. LOCAL STATUS gei82543linkInit
  540.     (
  541.     END_DEVICE *pDrvCtrl
  542.     )
  543.     {
  544.     STATUS status = OK;
  545.     UINT32 tmp;
  546.     UINT32 tclRegVal;
  547.     UINT32 eepromWord = 0;
  548.     UINT32 extDevCtrlRegVal;
  549.     UINT32 staReg;
  550.     /* check copper or fiber based adapter */
  551.     GEI_READ_REG(INTEL_82543GC_STATUS, staReg);
  552.     if (staReg & STATUS_TBIMODE_BIT)
  553.         {
  554.         pDrvCtrl->cableType = GEI_FIBER_MEDIA;
  555.         }
  556.     else
  557.         {
  558.         pDrvCtrl->cableType = GEI_COPPER_MEDIA;
  559.         }
  560.     pDrvCtrl->devCtrlRegVal = 0;
  561.     /* compose control register value based on EEPROM config value */
  562.     if (pDrvCtrl->adaptor.boardType == PRO1000_543_BOARD)
  563.         {
  564.         eepromWord = (UINT32) pDrvCtrl->adaptor.eeprom_icw1;
  565.         tmp = (eepromWord & EEPROM_ICW1_SWDPIO_BITS) >> EEPROM_ICW1_SWDPIO_SHIFT;
  566.         pDrvCtrl->devCtrlRegVal = tmp << CTRL_SWDPIOLO_SHIFT;
  567.         }
  568.     tmp = (eepromWord & EEPROM_ICW1_ILOS_BIT) >> EEPROM_ICW1_ILOS_SHIFT; 
  569.     pDrvCtrl->devCtrlRegVal |= (tmp << CTRL_ILOS_SHIFT);
  570.     /* get the duplex configuration in EEPROM */
  571.     if (pDrvCtrl->duplex == DUPLEX_HW)
  572.         {    
  573.         if (eepromWord & EEPROM_ICW1_FRCSPD_BIT)
  574.             pDrvCtrl->duplex = FULL_DUPLEX_MODE;
  575.         else
  576.             pDrvCtrl->duplex = HALF_DUPLEX_MODE;
  577.         }
  578.     /* get the flow control value in EEPROM */
  579.     eepromWord = (UINT32) pDrvCtrl->adaptor.eeprom_icw2;
  580.     if (pDrvCtrl->flowCtrl == FLOW_CONTRL_HW)
  581.         {
  582.         if ((eepromWord & EEPROM_ICW2_PAUSE_BITS) == 0)
  583.             pDrvCtrl->flowCtrl = FLOW_CONTRL_NONE;
  584.         else if ((eepromWord & EEPROM_ICW2_PAUSE_BITS) == EEPROM_ICW2_ASM_DIR)
  585.             pDrvCtrl->flowCtrl = FLOW_CONTRL_TRANSMIT;
  586.         else
  587.             pDrvCtrl->flowCtrl = FLOW_CONTRL_ALL;
  588.         }
  589.     DRV_LOG (DRV_DEBUG_LOAD, "gei82543SetLinkFlowCtrl: pDrvCtrl->flowCtrl=
  590.                               %dn", pDrvCtrl->flowCtrl, 2, 3, 4, 5, 6);
  591.    /* program the extend control register */
  592.     if (pDrvCtrl->adaptor.boardType == PRO1000_543_BOARD)
  593.         {
  594.         tmp = (eepromWord & EEPROM_ICW2_SWDPIO_EXE_BITS) >> 
  595.                               EEPROM_ICW2_SWDPIO_EXE_SHIFT;
  596.         extDevCtrlRegVal = tmp << CTRL_EXT_SWDPIOHI_SHIFT;
  597.   
  598.         GEI_WRITE_REG(INTEL_82543GC_CTRL_EXT, extDevCtrlRegVal);
  599.         }
  600.     /* program the transmit control register */
  601.     GEI_READ_REG(INTEL_82543GC_TCTL, tclRegVal);
  602.     tclRegVal |= (FDX_COLLISION_DISTANCE << TCTL_COLD_SHIFT);
  603.     GEI_WRITE_REG(INTEL_82543GC_TCTL, tclRegVal);
  604.     /* set user's preference of DMA configuration */
  605.     if (pDrvCtrl->adaptor.boardType == PRO1000_543_BOARD)
  606.         {
  607.         if (pDrvCtrl->dmaPriority == DMA_RX_PRIORITY)
  608.             {
  609.             pDrvCtrl->devCtrlRegVal &= ~CTRL_PRIOR_BIT;
  610.             }
  611.         else if (pDrvCtrl->dmaPriority == DMA_FAIR_RX_TX)
  612.             {
  613.             pDrvCtrl->devCtrlRegVal |= CTRL_PRIOR_BIT;
  614.             }
  615.         }
  616.     else
  617.         {
  618.         pDrvCtrl->devCtrlRegVal &= ~CTRL_PRIOR_BIT;
  619.         }
  620.     /* establish a link */
  621.     if (pDrvCtrl->cableType == GEI_FIBER_MEDIA)
  622.         status = gei82543linkTBISetup (pDrvCtrl, TRUE);
  623.     else if (pDrvCtrl->cableType == GEI_COPPER_MEDIA)
  624.         status = gei82543linkGMIISetup (pDrvCtrl);
  625.     else
  626.         {
  627.         DRV_LOG (DRV_DEBUG_LOAD, "Do not recognize media typen", 
  628.                                   1, 2, 3, 4, 5, 6);
  629.         return ERROR;
  630.         }
  631.      pDrvCtrl->linkInitStatus = status;
  632.      
  633.      if (pDrvCtrl->linkInitStatus != OK)
  634.         {
  635.          DRV_LOG (DRV_DEBUG_LOAD, ("gei82543EndStart: link setup failsn"), 
  636.                                    1, 2, 3, 4, 5, 6);
  637.          LOGMSG("link failsn", 1, 2, 3, 4, 5, 6);
  638.         }
  639.     return status;
  640.     }
  641. /*************************************************************************
  642. *
  643. * gei82543linkTBISetup - set up link to partner in TBI mode
  644. *
  645. * This routine set the link with partner in TBI mode
  646. *
  647. * RETURNS: OK if link success
  648. */
  649. LOCAL STATUS gei82543linkTBISetup
  650.     (
  651.     END_DEVICE *     pDrvCtrl,
  652.     BOOL             firstTime  /* TRUE for the first time calling */
  653.     )
  654.     {
  655.     UINT32 devStatus =0;    
  656.     UINT32 intSet;
  657.     STATUS status = ERROR;
  658.     /* only TBI mode used*/
  659.     GEI_READ_REG(INTEL_82543GC_STATUS, devStatus);
  660.      
  661.     if (!(devStatus & STATUS_TBIMODE_BIT))
  662.         {
  663.         LOGMSG("The adaptor is not configured in TBI moden",  1,2,3,4,5,6);
  664.         return ERROR;
  665.         }
  666.     
  667.     /* disable chip interrupts */
  668.     intSet = gei82543DisableChipInt (pDrvCtrl);
  669.     /* set up txConfigure Word */
  670.     if (pDrvCtrl->flowCtrl == FLOW_CONTRL_NONE)
  671.         pDrvCtrl->txConfigureWord = (TXCW_ANE_BIT | TXCW_FD_BIT);    
  672.     else if (pDrvCtrl->flowCtrl == FLOW_CONTRL_TRANSMIT)
  673.         pDrvCtrl->txConfigureWord = (TXCW_ANE_BIT | TXCW_FD_BIT | 
  674.                                      TXCW_ASM_DIR);       
  675.     else if (pDrvCtrl->flowCtrl == FLOW_CONTRL_ALL  ||
  676.              pDrvCtrl->flowCtrl == FLOW_CONTRL_RECEIVE)
  677.         pDrvCtrl->txConfigureWord = (TXCW_ANE_BIT | TXCW_FD_BIT | 
  678.                                      TXCW_PAUSE_BITS);
  679.     else 
  680.         {
  681.         LOGMSG("Flow control parameter invalidn", 1, 2, 3, 4, 5, 6);
  682.         return ERROR;
  683.         }
  684.     status = gei82543TBIHwAutoNegotiate (pDrvCtrl, TRUE, firstTime);  
  685.     if (status == ERROR &&  
  686.           gei82543TBIlinkForce (pDrvCtrl, TRUE, FALSE) == OK)
  687.         {
  688.         UINT32 rxcwRegVal;
  689.         UINT32 ctrlRegVal;   
  690.         status = OK;
  691.         GEI_READ_REG(INTEL_82543GC_CTRL, ctrlRegVal);
  692.         GEI_READ_REG(INTEL_82543GC_RXCW, rxcwRegVal);      
  693.  
  694.         if ((ctrlRegVal & CTRL_SLU_BIT) && (rxcwRegVal & RXCW_C_BIT)) 
  695.             {
  696.             status = gei82543TBIHwAutoNegotiate (pDrvCtrl, TRUE, FALSE);       
  697.     
  698.             if (status != OK)
  699.                 {
  700.                 DRV_LOG (DRV_DEBUG_LOAD, "Force link OK and receive RXCW; 
  701.                                    But HW auto Failn",1, 2, 3, 4, 5, 6);
  702.                 /* force link again */
  703.                 status = gei82543TBIlinkForce (pDrvCtrl, TRUE, FALSE);
  704.                 }
  705.              }
  706.         }
  707.     /* one more try */
  708.     if (status == ERROR)    
  709.         status = gei82543TBIHwAutoNegotiate (pDrvCtrl, TRUE, FALSE);
  710.        
  711.     pDrvCtrl->linkStatus = (status == OK)? LINK_STATUS_OK : LINK_STATUS_ERROR;
  712.     if (status == OK)
  713.         {    
  714.         gei82543DuplexGet (pDrvCtrl);
  715.         gei82543SpeedGet (pDrvCtrl);
  716.         gei82543FlowCtrlRegsSet(pDrvCtrl);   
  717.         LOGMSG("Link Establish OK. n", 1, 2, 3, 4, 5, 6);
  718.         }
  719.     else
  720.         {
  721.         DRV_LOG (DRV_DEBUG_LOAD, "Link setup fail", 1, 2, 3, 4, 5, 6);
  722.         }
  723.     if (firstTime != TRUE)
  724.         GEI_WRITE_REG(INTEL_82543GC_IMS, intSet);
  725.  
  726.     return status;    
  727.     }
  728. /*************************************************************************
  729. *
  730. * gei82543TBIHwAutoNegotiate - link with hardware auto-negotiation
  731. *
  732. * This routine starts hardware auto-negotiation process
  733. *
  734. * RETURN: OK, or ERROR if link fail
  735. */
  736. LOCAL STATUS gei82543TBIHwAutoNegotiate
  737.     (
  738.     END_DEVICE * pDrvCtrl,
  739.     BOOL         waitStatus,
  740.     BOOL         firstTime
  741.     )
  742.     {
  743.     UINT32 regVal;
  744.     int ix = LINK_TIMEOUT_IN_QUAR_SEC;
  745.     /* ack all interrupts again */
  746.     GEI_READ_REG(INTEL_82543GC_ICR, regVal); 
  747.     pDrvCtrl->linkStatus = LINK_STATUS_UNKNOWN;
  748.     /* disable RXCFG interrupt */
  749.     if (pDrvCtrl->linkMethod == GEI82543_HW_AUTO)
  750.            GEI_WRITE_REG(INTEL_82543GC_IMC, IMC_RXCFG_BIT);
  751.     /* set up TXCW, start negotiation process */
  752.     GEI_WRITE_REG(INTEL_82543GC_TXCW, pDrvCtrl->txConfigureWord);
  753.  
  754.     if (firstTime)
  755.         GEI_WRITE_REG(INTEL_82543GC_CTRL, pDrvCtrl->devCtrlRegVal); 
  756.     else
  757.         {
  758.         GEI_READ_REG(INTEL_82543GC_CTRL, regVal);
  759.         GEI_WRITE_REG(INTEL_82543GC_CTRL, (regVal & ~CTRL_SLU_BIT));
  760.         }
  761.     pDrvCtrl->linkMethod = GEI82543_HW_AUTO;
  762.     if (waitStatus == FALSE)
  763.         return OK;
  764.     do {
  765.     /* wait... */
  766.        taskDelay(sysClkRateGet() / 4);
  767.        if (gei82543linkStatusCheck (pDrvCtrl) == OK)
  768.            return OK;
  769.        } while (ix--);
  770.     return ERROR;
  771.     }
  772. /****************************************************************************
  773. *
  774. * gei82543TBIlinkForce - proceed force link
  775. *
  776. * This routine tries to link partner manually
  777. *
  778. * RETURNS: OK, or ERROR if fail
  779. */
  780. LOCAL STATUS gei82543TBIlinkForce
  781.     (
  782.     END_DEVICE * pDrvCtrl,       /* device to force link */
  783.     BOOL         waitStatus,     /* indicator to wait status */
  784.     BOOL         rxcfgEnable     /* indicator to enable RXCFG interrupt */
  785.     )
  786.     {
  787.     int ix = LINK_TIMEOUT_IN_QUAR_SEC;
  788.     UINT32 statusRegVal;         /* status register value */
  789.     UINT32 rxcwRegVal;           /* RXCW register value */
  790.     UINT32 ctrlRegVal;           /* control register value */
  791.     UINT32 regVal;
  792.     /* ack all interrupts again */
  793.     GEI_READ_REG(INTEL_82543GC_ICR, regVal); 
  794.     pDrvCtrl->linkStatus = LINK_STATUS_UNKNOWN;
  795.     /* read status register */
  796.     GEI_READ_REG(INTEL_82543GC_STATUS, statusRegVal);      
  797.     /* read receive control register */
  798.     GEI_READ_REG(INTEL_82543GC_RXCW, rxcwRegVal);      
  799.  
  800.     if ((statusRegVal & STATUS_LU_BIT) || (rxcwRegVal & RXCW_C_BIT))
  801.          return ERROR;
  802.       
  803.     DRV_LOG (DRV_DEBUG_LOAD, "Force Link... n", 1, 2, 3, 4, 5, 6);
  804.     GEI_READ_REG(INTEL_82543GC_CTRL, ctrlRegVal);      
  805.     /* full duplex is assumed */
  806.     ctrlRegVal |= (CTRL_SLU_BIT | CTRL_FD_BIT);
  807.     /* disable HW auto-negotiation */
  808.     GEI_WRITE_REG(INTEL_82543GC_TXCW, pDrvCtrl->txConfigureWord & 
  809.                   ~TXCW_ANE_BIT);
  810.     /* enable RXCFG interrupt if needed*/
  811.     if (rxcfgEnable == TRUE)
  812.         GEI_WRITE_REG(INTEL_82543GC_IMS, IMS_RXCFG_BIT);
  813.     GEI_WRITE_REG(INTEL_82543GC_CTRL, ctrlRegVal);
  814.     pDrvCtrl->linkMethod = GEI82543_FORCE_LINK;
  815.     /* read control register for later use */
  816.     GEI_READ_REG(INTEL_82543GC_CTRL, ctrlRegVal);    
  817.     if (pDrvCtrl->flowCtrl == FLOW_CONTRL_NONE)
  818.         ctrlRegVal &= ~(CTRL_TFCE_BIT | CTRL_RFCE_BIT);
  819.     else if (pDrvCtrl->flowCtrl == FLOW_CONTRL_TRANSMIT)
  820.         {
  821.         ctrlRegVal &= ~CTRL_RFCE_BIT;
  822.         ctrlRegVal |=  CTRL_TFCE_BIT;
  823.         }
  824.     else if (pDrvCtrl->flowCtrl == FLOW_CONTRL_RECEIVE)
  825.         {
  826.         ctrlRegVal &= ~CTRL_TFCE_BIT;
  827.         ctrlRegVal |=  CTRL_RFCE_BIT;
  828.         }
  829.     else if (pDrvCtrl->flowCtrl == FLOW_CONTRL_ALL )
  830.         ctrlRegVal |= (CTRL_TFCE_BIT | CTRL_RFCE_BIT);
  831.     else 
  832.         {
  833.         LOGMSG("invalid flow control parametersn", 1, 2, 3, 4, 5, 6);
  834.         return ERROR;
  835.         }
  836.     /* force link ... */
  837.     GEI_WRITE_REG(INTEL_82543GC_CTRL, ctrlRegVal);
  838.     if (waitStatus == FALSE)
  839.         return OK;
  840.     /* check status */
  841.     do {
  842.        /* wait... */
  843.        taskDelay(sysClkRateGet() / 4);
  844.        if (gei82543linkStatusCheck (pDrvCtrl) == OK)
  845.            return OK;
  846.        } while (ix--);
  847.     return ERROR; 
  848.     }
  849. /*************************************************************************
  850. *
  851. * gei82543linkGMIISetup - link set up with PHY device
  852. *
  853. * This routine sets up link with PHY device
  854. *
  855. * RETURN: OK if link succeed
  856. */
  857. LOCAL STATUS gei82543linkGMIISetup
  858.     (
  859.     END_DEVICE * pDrvCtrl       /* driver structure */
  860.     )
  861.     {
  862.     STATUS     status = ERROR; 
  863.     /* pre-init for PHY's GMII */
  864.  
  865.     if ((status = gei82543linkGMIIPreInit(pDrvCtrl)) != OK )
  866.         {
  867.     DRV_LOG (DRV_DEBUG_LOAD, ("Failed to pre-initialize PHYn"),
  868.                        0, 0, 0, 0, 0, 0);
  869.         return ERROR;
  870.         }     
  871.     pDrvCtrl->pPhyInfo->phyFlags = pDrvCtrl->phyInitFlags;
  872.     /* call miiLib's functions */
  873.     if (miiPhyInit (pDrvCtrl->pPhyInfo) != OK)
  874.     {
  875.         DRV_LOG (DRV_DEBUG_LOAD, "fail to initialize PHYn", 0,0,0,0,0,0);
  876.     return (ERROR);
  877.     }
  878.     /* perform vendor specific register initialization */
  879.     pDrvCtrl->adaptor.phySpecInit (pDrvCtrl->pPhyInfo, 
  880.                                    pDrvCtrl->pPhyInfo->phyAddr);
  881.     /* configure device after establishing a link */
  882.    
  883.     gei82543GMIIphyConfig (pDrvCtrl);
  884.    
  885.     return OK;
  886.     }
  887. /*************************************************************************
  888. *
  889. * gei82543GMIIphyConfig - set up registers after PHY link done
  890. *
  891. * This routine configures chip after link is established. It gets the link
  892. * results from PHY, and configure the device based on that.
  893. *
  894. * RETURNS: N/A
  895. */
  896. LOCAL void gei82543GMIIphyConfig
  897.     (
  898.     END_DEVICE *    pDrvCtrl   /* device to config GMII */
  899.     )
  900.     {
  901.     UINT32 ctrlRegVal;         /* control register value */
  902.     UINT32 tctlRegVal;         /* transmit ctrl reg value */
  903.     UINT32 speed;              /* link speed */
  904.     UINT32 duplex;             /* link duplex mode */
  905.     /* get the speed setting from PHY */
  906.     speed = pDrvCtrl->pPhyInfo->phySpeed;
  907.     /* get the duplex setting from PHY */
  908.     if (pDrvCtrl->pPhyInfo->phyFlags & MII_PHY_FD)
  909.         duplex = FULL_DUPLEX_MODE;
  910.     else 
  911.         duplex = HALF_DUPLEX_MODE;
  912.     /* get the flow control setting from PHY */
  913.   
  914.     if ((pDrvCtrl->pPhyInfo->phyFlags & MII_PHY_TX_FLOW_CTRL) && 
  915.         (pDrvCtrl->pPhyInfo->phyFlags & MII_PHY_RX_FLOW_CTRL))
  916.          pDrvCtrl->flowCtrl = FLOW_CONTRL_ALL;
  917.     else if (!(pDrvCtrl->pPhyInfo->phyFlags & MII_PHY_TX_FLOW_CTRL) && 
  918.               (pDrvCtrl->pPhyInfo->phyFlags & MII_PHY_RX_FLOW_CTRL))
  919.         pDrvCtrl->flowCtrl = FLOW_CONTRL_RECEIVE;
  920.     
  921.     else if ((pDrvCtrl->pPhyInfo->phyFlags & MII_PHY_TX_FLOW_CTRL) && 
  922.               !(pDrvCtrl->pPhyInfo->phyFlags & MII_PHY_RX_FLOW_CTRL))
  923.         pDrvCtrl->flowCtrl = FLOW_CONTRL_TRANSMIT;
  924.     else
  925.         pDrvCtrl->flowCtrl = FLOW_CONTRL_NONE;
  926.     /* prepare re-configure general/transmit control register */
  927.     GEI_READ_REG(INTEL_82543GC_CTRL, ctrlRegVal);
  928.     ctrlRegVal |= (CTRL_FRCSPD_BIT | CTRL_FRCDPX_BIT);
  929.     ctrlRegVal &= ~(CTRL_SPEED_MASK | CTRL_ILOS_BIT );
  930.     GEI_READ_REG(INTEL_82543GC_TCTL, tctlRegVal);
  931.     tctlRegVal &= ~TCTL_COLD_BIT;
  932.     /* configure duplex information */
  933.     if (duplex == FULL_DUPLEX_MODE) 
  934.         {
  935.         ctrlRegVal |= CTRL_FD_BIT;
  936.         tctlRegVal |= (FDX_COLLISION_DISTANCE << TCTL_COLD_SHIFT);
  937.         }
  938.     else /* half duplex mode */
  939.         {
  940.         ctrlRegVal &= ~CTRL_FD_BIT;
  941.         if (speed == MII_1000MBS)
  942.             tctlRegVal |= (BIG_HDX_COLLISION_DISTANCE << TCTL_COLD_SHIFT) | 
  943.                            TCTL_PBE_BIT;
  944.         else
  945.             tctlRegVal |= (HDX_COLLISION_DISTANCE << TCTL_COLD_SHIFT);
  946.         }
  947.     /* configure speed info */
  948.     if (speed == MII_1000MBS)
  949.         ctrlRegVal |= CTRL_SPD_1000_BIT;   
  950.     else if (speed == MII_100MBS)
  951.         ctrlRegVal |= CTRL_SPD_100_BIT; 
  952.     else
  953.         {
  954.         ctrlRegVal &= ~(CTRL_SPD_1000_BIT | CTRL_SPD_100_BIT);  
  955.         }
  956.     /* no flow control with half duplex mode */
  957.     if (duplex == HALF_DUPLEX_MODE) 
  958.         pDrvCtrl->flowCtrl = FLOW_CONTRL_NONE;
  959.     /* configure flow control */ 
  960.     if (pDrvCtrl->flowCtrl == FLOW_CONTRL_NONE)
  961.         ctrlRegVal &= ~(CTRL_TFCE_BIT | CTRL_RFCE_BIT);
  962.         
  963.     else if (pDrvCtrl->flowCtrl == FLOW_CONTRL_TRANSMIT)
  964.         {
  965.         ctrlRegVal &= ~CTRL_RFCE_BIT;
  966.         ctrlRegVal |=  CTRL_TFCE_BIT;
  967.         }
  968.     else if (pDrvCtrl->flowCtrl == FLOW_CONTRL_RECEIVE)
  969.         {
  970.         ctrlRegVal &= ~CTRL_TFCE_BIT;
  971.         ctrlRegVal |=  CTRL_RFCE_BIT;
  972.         }
  973.     else if (pDrvCtrl->flowCtrl == FLOW_CONTRL_ALL)
  974.         ctrlRegVal |= (CTRL_TFCE_BIT | CTRL_RFCE_BIT);
  975.     /* re-program general/transmit control registers */
  976.     GEI_WRITE_REG(INTEL_82543GC_TCTL, tctlRegVal);
  977.     GEI_WRITE_REG(INTEL_82543GC_CTRL, ctrlRegVal);
  978.     /* program flow control accordingly */
  979.     gei82543FlowCtrlRegsSet(pDrvCtrl);   
  980. #ifdef INCLUDE_TBI_COMPATIBLE
  981.     {
  982.     UINT32 rctlVal;
  983.     /* 
  984.      * TBI compatibility bug occurred only in :
  985.      * 82543 based silicon, and 
  986.      * copper-based media, and 
  987.      * link parnter is advertised only 1000Base-T capability.
  988.      * we currently can not determine whether the link partner also
  989.      * supports other capabilities except 1000Base-T, thus we will
  990.      * enable workaround as the link partner has the 1000Base-T capability.
  991.      */
  992.     GEI_READ_REG(INTEL_82543GC_RCTL, rctlVal);
  993.     if ((pDrvCtrl->usrFlags & GEI_END_TBI_COMPATIBILITY) && 
  994.         (pDrvCtrl->adaptor.boardType == PRO1000_543_BOARD) && 
  995.         (speed == MII_1000MBS))
  996.         {
  997.         pDrvCtrl->tbiCompatibility = TRUE;
  998.         GEI_WRITE_REG(INTEL_82543GC_RCTL, (rctlVal | RCTL_SBP_BIT));
  999.         }
  1000.     else
  1001.         {
  1002.         pDrvCtrl->tbiCompatibility = FALSE;
  1003.         GEI_WRITE_REG(INTEL_82543GC_RCTL, (rctlVal & ~RCTL_SBP_BIT));
  1004.         }
  1005.     }
  1006.     CACHE_PIPE_FLUSH ();
  1007. #endif /* INCLUDE_TBI_COMPATIBLE */
  1008.     /* set the speed/duplex in the END_DEVICE structure */
  1009.     gei82543DuplexGet (pDrvCtrl);
  1010.     gei82543SpeedGet (pDrvCtrl);
  1011.     return;
  1012.     }
  1013. /*************************************************************************
  1014. *
  1015. * gei82543GMIIphyReConfig - re-configure 82543 chip after link is restarted
  1016. *
  1017. * This routine re-configures PHY chip after link is restarted and established. 
  1018. * It gets the link results from PHY, and configure the device based on that.
  1019. *
  1020. * NOTE: *pPhyInfo should have a valid PHY bus number (phyAddr); Its phyFlags
  1021. *       should be the one we configured the PHY for Auto-negotiaton last time. 
  1022. *
  1023. * RETURNS: N/A
  1024. */
  1025. LOCAL void gei82543GMIIphyReConfig
  1026.     (
  1027.     END_DEVICE *    pDrvCtrl    /* device to do PHY checking */
  1028.     )
  1029.     {
  1030.     /* in case that the first time initialization fails */
  1031.     if (pDrvCtrl->linkInitStatus != OK)
  1032.     {
  1033.     pDrvCtrl->linkInitStatus = gei82543linkGMIISetup (pDrvCtrl);
  1034.         return;
  1035.     }
  1036.     /* we don't support force link case */
  1037.     if (pDrvCtrl->pPhyInfo->phyLinkMethod != MII_PHY_LINK_AUTO)
  1038.         return;
  1039.     /* restore phyFlags with the flags for Auto-Negotiation */
  1040.    
  1041.     pDrvCtrl->pPhyInfo->phyFlags = pDrvCtrl->pPhyInfo->phyAutoNegotiateFlags;
  1042.     /* check/update MII auto-negotiation results */
  1043.     
  1044.     miiAnCheck (pDrvCtrl->pPhyInfo, pDrvCtrl->pPhyInfo->phyAddr);
  1045.     
  1046.     /* configure 82543 chip again */
  1047.     gei82543GMIIphyConfig (pDrvCtrl);
  1048.     }
  1049. /*************************************************************************
  1050. *
  1051. * gei82543linkGMIIPreInit - pre-init PHY for GMII link setup
  1052. *
  1053. * This routine resets PHY devices through 82543 chip, set up PHY_INFO 
  1054. * structure
  1055. *
  1056. * RETURN: OK or ERROR
  1057. */
  1058. LOCAL STATUS gei82543linkGMIIPreInit
  1059.     (
  1060.     END_DEVICE * pDrvCtrl   /* device to do GMII pre-init */
  1061.     )
  1062.     {
  1063.     UINT32 extCtrlRegVal;   /* extended control reg value */
  1064.     /*
  1065.      * We will establish a link through PHY, and then manually 
  1066.      * configure the 82543 chip based on PHY's negotiation results
  1067.      */
  1068.     pDrvCtrl->devCtrlRegVal |= (CTRL_FRCSPD_BIT | CTRL_FRCDPX_BIT | 
  1069.                                 CTRL_SLU_BIT);
  1070.     GEI_WRITE_REG(INTEL_82543GC_CTRL, (pDrvCtrl->devCtrlRegVal));
  1071.     if (pDrvCtrl->adaptor.boardType == PRO1000_543_BOARD)
  1072.         {
  1073.         /* 
  1074.          * SDP_4 pin is also wired to PHY_RST, assert SDP_4(low)
  1075.          * could reset PHY device
  1076.          */ 
  1077.         /*  reset the PHY device from 82543 chip */
  1078.         GEI_READ_REG(INTEL_82543GC_CTRL_EXT, extCtrlRegVal);
  1079.         extCtrlRegVal |= CTRL_PHY_RESET_DIR4_BIT;
  1080.         GEI_WRITE_REG(INTEL_82543GC_CTRL_EXT, extCtrlRegVal);
  1081.         taskDelay(sysClkRateGet() / 10);
  1082.         GEI_READ_REG(INTEL_82543GC_CTRL_EXT, extCtrlRegVal);
  1083.         extCtrlRegVal &= ~CTRL_PHY_RESET4_BIT;
  1084.         GEI_WRITE_REG(INTEL_82543GC_CTRL_EXT, extCtrlRegVal);
  1085.         taskDelay(sysClkRateGet() / 10);
  1086.         GEI_READ_REG(INTEL_82543GC_CTRL_EXT, extCtrlRegVal);
  1087.         extCtrlRegVal |= CTRL_PHY_RESET4_BIT;
  1088.         GEI_WRITE_REG(INTEL_82543GC_CTRL_EXT, extCtrlRegVal);
  1089.         taskDelay(sysClkRateGet() / 10);
  1090.         }
  1091.     else if (pDrvCtrl->adaptor.boardType == PRO1000_544_BOARD ||
  1092.              pDrvCtrl->adaptor.boardType == PRO1000_546_BOARD)
  1093.         {
  1094.         GEI_WRITE_REG(INTEL_82543GC_CTRL, 
  1095.                      (pDrvCtrl->devCtrlRegVal) | CTRL_PHY_RST_BIT);
  1096.         /* wait PHY settle down */
  1097.         taskDelay (sysClkRateGet () / 10);
  1098.         GEI_WRITE_REG(INTEL_82543GC_CTRL, (pDrvCtrl->devCtrlRegVal));
  1099.         taskDelay (sysClkRateGet () / 10);
  1100.         }
  1101.     /* allocate memory for PHY_INFO structure */
  1102.  
  1103.     if ((pDrvCtrl->pPhyInfo = calloc (sizeof (PHY_INFO), 1)) == NULL)
  1104.         return (ERROR);
  1105.     /* clean up PHY_INFO structure */
  1106.     memset (pDrvCtrl->pPhyInfo, 0, sizeof (PHY_INFO));
  1107.     /* set up phyInfo structure */
  1108.     pDrvCtrl->pPhyInfo->pDrvCtrl = (void *) pDrvCtrl;  
  1109. pDrvCtrl->pPhyInfo->phyAddr = MII_PHY_DEF_ADDR;
  1110.     /* PHY's read/write operation routine */
  1111.     if (pDrvCtrl->adaptor.boardType == PRO1000_543_BOARD)
  1112.         {
  1113.         pDrvCtrl->pPhyInfo->phyWriteRtn = (FUNCPTR) gei82543PhyWrite;
  1114.         pDrvCtrl->pPhyInfo->phyReadRtn = (FUNCPTR) gei82543PhyRead;
  1115.         }
  1116.     else if (pDrvCtrl->adaptor.boardType == PRO1000_544_BOARD || 
  1117.              pDrvCtrl->adaptor.boardType == PRO1000_546_BOARD)
  1118.         {
  1119.         pDrvCtrl->pPhyInfo->phyWriteRtn = (FUNCPTR) gei82544PhyWrite;
  1120.         pDrvCtrl->pPhyInfo->phyReadRtn = (FUNCPTR) gei82544PhyRead;
  1121.         }
  1122.    if (pDrvCtrl->adaptor.phyAddr > 0 && 
  1123.                   pDrvCtrl->adaptor.phyAddr < MII_MAX_PHY_NUM) 
  1124.         pDrvCtrl->pPhyInfo->phyAddr = pDrvCtrl->adaptor.phyAddr;
  1125.     else
  1126.         pDrvCtrl->pPhyInfo->phyAddr = 0; 
  1127.     if (pDrvCtrl->adaptor.phyDelayRtn != (FUNCPTR) NULL)
  1128.         {
  1129.         pDrvCtrl->pPhyInfo->phyDelayRtn = 
  1130.                            (FUNCPTR) (pDrvCtrl->adaptor.phyDelayRtn);
  1131.         pDrvCtrl->pPhyInfo->phyMaxDelay = 
  1132.                            pDrvCtrl->adaptor.phyMaxDelay; 
  1133.         pDrvCtrl->pPhyInfo->phyDelayParm = 
  1134.                            pDrvCtrl->adaptor.phyDelayParm;
  1135.         }
  1136.     else
  1137.        { 
  1138.        pDrvCtrl->pPhyInfo->phyDelayRtn = (FUNCPTR) taskDelay;
  1139.        pDrvCtrl->pPhyInfo->phyMaxDelay = MII_PHY_DEF_DELAY;
  1140.        pDrvCtrl->pPhyInfo->phyDelayParm = 5;
  1141.        }
  1142.  
  1143.     pDrvCtrl->pPhyInfo->phyAnOrderTbl = NULL;
  1144.     pDrvCtrl->pPhyInfo->phyLinkDownRtn = (FUNCPTR) NULL;
  1145.     /* 
  1146.      * All hardware capabilities will be advertised, and let auto-negotiation
  1147.      * process figures out the max common ability; half duplex 1000T mode is NOT 
  1148.      * supported in the 82543-based adapter(Intel 82543 spec update Rev 0.5)
  1149.      */  
  1150.     if (pDrvCtrl->adaptor.boardType == PRO1000_543_BOARD)
  1151.         {
  1152.         pDrvCtrl->pPhyInfo->phyFlags = GEI_MII_PHY_CAP_FLAGS; /* ability flags */
  1153.         }
  1154.     else if (pDrvCtrl->adaptor.boardType == PRO1000_544_BOARD || 
  1155.              pDrvCtrl->adaptor.boardType == PRO1000_546_BOARD)
  1156.         {
  1157.         pDrvCtrl->pPhyInfo->phyFlags = GEI_MII_PHY_CAP_FLAGS | MII_PHY_1000T_HD;
  1158.         }
  1159.     if (pDrvCtrl->adaptor.phyType == GEI_PHY_GMII_TYPE)
  1160.         pDrvCtrl->pPhyInfo->phyFlags |= MII_PHY_GMII_TYPE; /* GMII type */
  1161.     else
  1162.         pDrvCtrl->pPhyInfo->phyFlags &= ~MII_PHY_GMII_TYPE; 
  1163.     pDrvCtrl->pPhyInfo->phyFlags |= MII_PHY_AUTO; /* allow auto-negotiation */
  1164.     /* set the flow control bits in phyFlags */
  1165.     if (pDrvCtrl->flowCtrl == FLOW_CONTRL_NONE ) 
  1166.         pDrvCtrl->pPhyInfo->phyFlags &= ~(MII_PHY_TX_FLOW_CTRL | 
  1167.                                           MII_PHY_RX_FLOW_CTRL);
  1168.     else if (pDrvCtrl->flowCtrl == FLOW_CONTRL_TRANSMIT)
  1169.         {       
  1170.         pDrvCtrl->pPhyInfo->phyFlags |= MII_PHY_TX_FLOW_CTRL;
  1171.         pDrvCtrl->pPhyInfo->phyFlags &= ~MII_PHY_RX_FLOW_CTRL;
  1172.         }
  1173.     else if (pDrvCtrl->flowCtrl == FLOW_CONTRL_ALL || 
  1174.                     pDrvCtrl->flowCtrl == FLOW_CONTRL_RECEIVE)
  1175.         pDrvCtrl->pPhyInfo->phyFlags |= (MII_PHY_TX_FLOW_CTRL | 
  1176.                                          MII_PHY_RX_FLOW_CTRL);
  1177.     else
  1178.         {
  1179.         LOGMSG(" invalid flow control parametern",1,2,3,4,5,6);
  1180.         }
  1181.     /* mark phyflags to indicated pre-initialization */
  1182.     pDrvCtrl->pPhyInfo->phyFlags |= MII_PHY_PRE_INIT; 
  1183.     /* save flags for later reference */
  1184.     pDrvCtrl->phyInitFlags = pDrvCtrl->pPhyInfo->phyFlags;
  1185.     return OK;
  1186.     }
  1187. /***************************************************************************
  1188. *
  1189. * gei82543EtherRxAdrSet - set up the first entry on Receive Address Table
  1190. *
  1191. * This routine sets up the MAC address
  1192. *
  1193. * RETURNS: N/A
  1194. */
  1195. LOCAL void gei82543EtherRxAdrSet
  1196.     (
  1197.     END_DEVICE * pDrvCtrl,
  1198.     UINT8        adr[],
  1199.     int          index
  1200.     )
  1201.     {
  1202.     UINT32       ral = 0;
  1203.     UINT32       rah = 0;
  1204.     UINT32       reg;
  1205.     /* split the address to RAH/RAL */
  1206.     ral = (adr[0] | (adr[1] << 8) | (adr[2] << 16) | (adr[3] << 24) );
  1207.     rah = (adr[4] | (adr[5] << 8) | (RAH_AV_BIT));
  1208.     reg = INTEL_82543GC_RAL + index * 8;
  1209.     GEI_WRITE_REG(reg, ral);
  1210.     reg = INTEL_82543GC_RAH + index * 8;           
  1211.     GEI_WRITE_REG(reg, rah);
  1212.     return; 
  1213.     }
  1214. /*************************************************************************
  1215. *
  1216. * gei82543Delay - delay function to be used for PHY read/write operation
  1217. *
  1218. * This routine delays for a specified time in the unit of ns
  1219. * RETURN: N/A
  1220. */
  1221. LOCAL void gei82543Delay
  1222.     (
  1223.     END_DEVICE *     pDrvCtrl,
  1224.     UINT32           timeDelay  /* in unit of ns */
  1225.     )
  1226.     {
  1227.     int count;    
  1228.     /* 
  1229.      * we hope BSP can provide a delay routine with higher time resolution.
  1230.      * if using taskDelay(), it probably results in a slower initialization
  1231.      * process for hardware, such as MII/GMII read/write operations
  1232.      */
  1233.     if (pDrvCtrl->adaptor.delayFunc == NULL || 
  1234.         pDrvCtrl->adaptor.delayUnit == 0)
  1235.         {
  1236.         /* convert to ticks */
  1237.         count = (sysClkRateGet () * timeDelay / 1000000) / 1000 + 1; 
  1238.         taskDelay (count);         
  1239.         return;
  1240.         }
  1241.     count = (timeDelay / (pDrvCtrl->adaptor.delayUnit)) + 1;
  1242.     for ( ; count > 0; count--)            
  1243.         {
  1244.         (FUNCPTR) pDrvCtrl->adaptor.delayFunc ();
  1245.         }
  1246.     return; 
  1247.     }
  1248. /**************************************************************************
  1249. *
  1250. * gei82543Reset - reset 82543/4/5/6 chips  
  1251. *
  1252. * This routine resets 82543/4/5/6 chips
  1253. *
  1254. * RETURNS: N/A
  1255. */
  1256. LOCAL void gei82543Reset
  1257.     (
  1258.     END_DEVICE * pDrvCtrl
  1259.     )
  1260.     {
  1261.     /* disable all interrupt */
  1262.     gei82543DisableChipInt (pDrvCtrl);     
  1263.     /* disable/clean RX CTL */
  1264.     GEI_WRITE_REG(INTEL_82543GC_RCTL, 0);
  1265.   
  1266.     /* disable/clean TX CTL */
  1267.     GEI_WRITE_REG(INTEL_82543GC_TCTL, 0);
  1268.  
  1269.     /* reset the chip */
  1270.     GEI_WRITE_REG(INTEL_82543GC_CTRL, CTRL_RST_BIT);
  1271.    
  1272.     /* wait hardware ready */
  1273.     taskDelay (sysClkRateGet() / 6);
  1274.     /* clean up CTRL_EXT for 82543/82544 MACs */
  1275.     if (pDrvCtrl->adaptor.boardType == PRO1000_543_BOARD ||
  1276.         pDrvCtrl->adaptor.boardType == PRO1000_544_BOARD)
  1277.         {
  1278.         GEI_WRITE_REG(INTEL_82543GC_CTRL_EXT, 0);
  1279.         }
  1280.     /* clean all pending interrupts */
  1281.     gei82543DisableChipInt (pDrvCtrl);     
  1282.     return;
  1283.     }
  1284. /****************************************************************************
  1285. *
  1286. * gei82543AllVlanClean - cleans up all VLAN table entry
  1287. *
  1288. * This routine cleans up all entries in the VLAN table
  1289. *
  1290. * RETURNS: N/A
  1291. */
  1292. LOCAL void gei82543AllVlanClean
  1293.     (
  1294.     END_DEVICE *    pDrvCtrl
  1295.     )
  1296.     {
  1297.     UINT32     ix;
  1298.     UINT32     reg;
  1299.     GEI_WRITE_REG(INTEL_82543GC_VET, 0x0); 
  1300.     for (ix = 0; ix < NUM_VLAN; ix++)
  1301.         {
  1302.         reg = INTEL_82543GC_VLAN + ix * 4;
  1303.  
  1304.         GEI_WRITE_REG(reg, 0);
  1305.         }
  1306.  
  1307.        return;
  1308.     }
  1309. /****************************************************************************
  1310. *
  1311. * gei82543McastAdrClean - clean up all Multicasting address
  1312. *
  1313. * This routine cleans up all entries in MTA table and Multicasting Address in 
  1314. * RTA table
  1315. *
  1316. * RETURNS: N/A
  1317. */
  1318. LOCAL void gei82543McastAdrClean
  1319.     (
  1320.     END_DEVICE * pDrvCtrl
  1321.     )
  1322.     {
  1323.     UINT32      ix;
  1324.     UINT32      regVal;
  1325.     for (ix = 1; ix < NUM_RAR; ix++)
  1326.          {
  1327.          GEI_READ_REG((INTEL_82543GC_RAL + ix * 8), regVal);       
  1328.   
  1329.          /* check multicast address */
  1330.          if (regVal & 0x1)
  1331.              {    
  1332.              GEI_WRITE_REG((INTEL_82543GC_RAL + ix * 8), 0); 
  1333.              GEI_WRITE_REG((INTEL_82543GC_RAH + ix * 8), 0);        
  1334.              }
  1335.          }
  1336.     /* clean up MTA entries */
  1337.     gei82543AllMtaAdrClean (pDrvCtrl);
  1338.     return;
  1339.     } 
  1340. /****************************************************************************
  1341. *
  1342. * gei82543AllMtaAdrClean - clean up all MTA table entries
  1343. *
  1344. * This routine cleans up all entries in MTA table.
  1345. *
  1346. * RETURNS: N/A
  1347. */
  1348. LOCAL void gei82543AllMtaAdrClean
  1349.     (
  1350.     END_DEVICE * pDrvCtrl            /* device to clean up MTA table */
  1351.     )
  1352.     {
  1353.     UINT32      ix;                     /* index */
  1354.     UINT32      reg;                    /* register offset */
  1355.     /* clean up MTA */
  1356.     for (ix = 0; ix < NUM_MTA; ix++)
  1357.         {
  1358.         reg = INTEL_82543GC_MTA + ix * 4;
  1359.  
  1360.         GEI_WRITE_REG(reg, 0);
  1361.         }
  1362.     return;
  1363.     }
  1364. /****************************************************************************
  1365. *
  1366. * gei82543AllRxAdrClean - clean up all entry in receive address table
  1367. *
  1368. * This routine clean up receive address table (RTA)
  1369. *
  1370. * RETURNS: N/A
  1371. */
  1372. LOCAL void gei82543AllRxAdrClean
  1373.     (
  1374.     END_DEVICE * pDrvCtrl   /* device to clean up RAT */
  1375.     )
  1376.     {
  1377.     int ix;
  1378.     UINT32 regAdr;         /* register offset */
  1379.     /* clean up RTA */
  1380.     for (ix = 0; ix < NUM_RAR; ix ++)
  1381.         {
  1382.         regAdr = INTEL_82543GC_RAL + ix * 8;       
  1383.         GEI_WRITE_REG(regAdr, 0);
  1384.         regAdr = INTEL_82543GC_RAH + ix * 8;       
  1385.         GEI_WRITE_REG(regAdr, 0);        
  1386.         }
  1387.     return;
  1388.     }
  1389. /****************************************************************************
  1390. *
  1391. * gei82543FlowCtrlRegsSet - set up the flow control registers
  1392. *
  1393. * This routine set up the flow control registers
  1394. *
  1395. * RETURNS: N/A
  1396. */
  1397. LOCAL void gei82543FlowCtrlRegsSet
  1398.     (
  1399.     END_DEVICE *   pDrvCtrl    /* device to set flow control register */
  1400.     )
  1401.     {
  1402.     /* set up flow control registers */
  1403.     GEI_WRITE_REG(INTEL_82543GC_FCAL, FLOW_CONTROL_LOW_ADR);    
  1404.     GEI_WRITE_REG(INTEL_82543GC_FCAH, FLOW_CONTROL_HIGH_ADR);    
  1405.     GEI_WRITE_REG(INTEL_82543GC_FCT, FLOW_CONTROL_TYPE);    
  1406.     GEI_WRITE_REG(INTEL_82543GC_FCTTV, FLOW_CONTROL_TIMER_VALUE);    
  1407.     
  1408.     if ((pDrvCtrl->flowCtrl == FLOW_CONTRL_RECEIVE) ||         
  1409.          (pDrvCtrl->flowCtrl == FLOW_CONTRL_ALL) )
  1410.         {
  1411.         GEI_WRITE_REG(INTEL_82543GC_FCRTL, 
  1412.                       FCRTL_XONE_BIT | FLOW_CONTROL_LOW_THRESH );    
  1413.         GEI_WRITE_REG(INTEL_82543GC_FCRTH, FLOW_CONTROL_HIGH_THRESH);    
  1414.         }
  1415.     else
  1416.         {
  1417.         GEI_WRITE_REG(INTEL_82543GC_FCRTL, 0);    
  1418.         GEI_WRITE_REG(INTEL_82543GC_FCRTH, 0);    
  1419.         }
  1420.     return;
  1421.     }
  1422. /*************************************************************************
  1423. *
  1424. * gei82543SpeedGet - get the speed from device
  1425. *
  1426. * This routine get the speed from device control register 
  1427. * RETURN: N/A
  1428. */
  1429. LOCAL void gei82543SpeedGet
  1430.     (
  1431.     END_DEVICE * pDrvCtrl      /* device to get speed */
  1432.     )
  1433.     {
  1434.     UINT32 val;                /* register value */
  1435.     
  1436.     if (pDrvCtrl->cableType == GEI_FIBER_MEDIA)
  1437.         {
  1438.         /* only 1000Mbs supported */
  1439.         pDrvCtrl->speed = END_SPEED_1000M;
  1440.         return;
  1441.         }
  1442.     else if (pDrvCtrl->cableType == GEI_COPPER_MEDIA)
  1443.         {
  1444.         /* get status register */
  1445.         GEI_READ_REG(INTEL_82543GC_STATUS, val);
  1446.         if (val & STATUS_SPEED_1000_BIT)
  1447.             pDrvCtrl->speed = END_SPEED_1000M;
  1448.         else if (val & STATUS_SPEED_100_BIT)
  1449.             pDrvCtrl->speed = END_SPEED_100M;    
  1450.         else
  1451.             pDrvCtrl->speed = END_SPEED_10M;  
  1452.         }
  1453.     else
  1454.         pDrvCtrl->speed = UNKNOWN;
  1455.     return;          
  1456.     }
  1457. /*************************************************************************
  1458. *
  1459. * gei82543DuplexGet - get the duplex mode 
  1460. *
  1461. * This routine gets duplex mode from device status register 
  1462. * RETURN: N/A
  1463. */
  1464. LOCAL void gei82543DuplexGet
  1465.     (
  1466.     END_DEVICE * pDrvCtrl       /* device to get duplex */
  1467.     )
  1468.     {
  1469.     UINT32 val;                 /* register value */
  1470.     
  1471.     GEI_READ_REG(INTEL_82543GC_STATUS, val);
  1472.     
  1473.     if (val & STATUS_FD_BIT)
  1474.         pDrvCtrl->duplex = FULL_DUPLEX_MODE;
  1475.     else
  1476.         {
  1477.         DRV_LOG (DRV_DEBUG_LOAD, "Half duplex moden...",  1, 2, 3, 4, 5, 6);
  1478.         pDrvCtrl->duplex = HALF_DUPLEX_MODE;
  1479.         }
  1480.     return;
  1481.     }    
  1482. /*************************************************************************
  1483. *
  1484. * gei82543linkStatusCheck - check link status
  1485. *
  1486. * This routine checks link status 
  1487. *
  1488. * RETURN: OK or ERROR
  1489. */
  1490. LOCAL STATUS gei82543linkStatusCheck
  1491.     (
  1492.     END_DEVICE * pDrvCtrl        /* device to check link status */
  1493.     )
  1494.     {
  1495.     register UINT32 ctrlVal;     /* control register value */
  1496.     register UINT32 statusVal;   /* status register value */
  1497.     GEI_READ_REG(INTEL_82543GC_CTRL, ctrlVal);
  1498.     GEI_READ_REG(INTEL_82543GC_STATUS, statusVal);
  1499.     if (pDrvCtrl->cableType == GEI_COPPER_MEDIA || 
  1500.         pDrvCtrl->adaptor.boardType == PRO1000_544_BOARD || 
  1501.         pDrvCtrl->adaptor.boardType == PRO1000_546_BOARD)
  1502.         {
  1503.         if (statusVal & STATUS_LU_BIT)
  1504.             return OK;
  1505.         }  
  1506.     else /* FIBER media and 82543 based adaptor */
  1507.         {
  1508.         if (!(ctrlVal & CTRL_SWDPIN1_BIT) && (statusVal & STATUS_LU_BIT))
  1509.             return OK;
  1510.         }
  1511.     return ERROR;
  1512.     }
  1513. /*************************************************************************
  1514. *
  1515. * gei82543TxRxDisable - disable TX/RX of MAC
  1516. *
  1517. * This routine disable TX/RX 
  1518. *
  1519. * RETURN: N/A
  1520. */
  1521. LOCAL void gei82543TxRxDisable
  1522.     (
  1523.     END_DEVICE *pDrvCtrl        /* driver to disable TX/RX */
  1524.     )
  1525.     {
  1526.     UINT32 regVal;              /* register value */
  1527.     /* disable chip RX/TX */
  1528.     GEI_READ_REG(INTEL_82543GC_RCTL, regVal);
  1529.     GEI_WRITE_REG(INTEL_82543GC_RCTL, (regVal & ~RCTL_EN_BIT));
  1530.     GEI_READ_REG(INTEL_82543GC_TCTL,regVal);
  1531.     GEI_WRITE_REG(INTEL_82543GC_TCTL, (regVal & ~TCTL_EN_BIT));
  1532.     }
  1533. /*************************************************************************
  1534. *
  1535. * gei82543TxRxEnable - Enable TX/RX operation
  1536. *
  1537. * This routine enable TX/RX operation
  1538. *
  1539. * RETURN: N/A
  1540. */
  1541. LOCAL void gei82543TxRxEnable
  1542.     (
  1543.     END_DEVICE * pDrvCtrl      /* driver to enable TX/RX */
  1544.     )
  1545.     {
  1546.     UINT32 regVal;             /* register value */
  1547.     /* enable chip RX/TX */
  1548.     GEI_READ_REG(INTEL_82543GC_RCTL, regVal);
  1549.     GEI_WRITE_REG(INTEL_82543GC_RCTL, (regVal | RCTL_EN_BIT));
  1550.     GEI_READ_REG(INTEL_82543GC_TCTL, regVal);
  1551.     GEI_WRITE_REG(INTEL_82543GC_TCTL, (regVal | TCTL_EN_BIT));
  1552.     return;
  1553.     }
  1554. /*************************************************************************
  1555. *
  1556. * gei82543EnableChipInt - enable 82543 chip interrupt
  1557. * This routine enables 82543 chip interrupt
  1558. *
  1559. * RETURNS: N/A
  1560. */
  1561. LOCAL void gei82543EnableChipInt
  1562.     (
  1563.     END_DEVICE * pDrvCtrl            /* enable chip interrupt */
  1564.     )
  1565.     {
  1566.     UINT32 intSet;                   /* interrupt setting */
  1567.     if (pDrvCtrl->linkMethod == GEI82543_FORCE_LINK)
  1568.         intSet = (AVAIL_RX_TX_INT | AVAIL_LINK_INT | INT_RXCFG_BIT);
  1569.     else
  1570.         intSet = (AVAIL_RX_TX_INT | AVAIL_LINK_INT );
  1571.     GEI_WRITE_REG(INTEL_82543GC_IMS, intSet);
  1572.     return;
  1573.     }
  1574. /*************************************************************************
  1575. *
  1576. * gei82543DisableChipInt - disable 82543 chip interrupt
  1577. * This routine disables 82543 chip interrupts
  1578. *
  1579. * RETURNS: Interrupt setting before disable
  1580. */
  1581. LOCAL UINT32 gei82543DisableChipInt
  1582.     (
  1583.     END_DEVICE * pDrvCtrl        /* driver structure */
  1584.     )
  1585.     {
  1586.     volatile UINT32 intSet;      /* interrupt setting before */
  1587.     GEI_READ_REG(INTEL_82543GC_IMS, intSet);
  1588.     GEI_WRITE_REG(INTEL_82543GC_IMC, IMC_ALL_BITS);
  1589.     /* read back icr to clean up all pending interruots */
  1590.     GEI_READ_REG(INTEL_82543GC_ICR, intSet);
  1591.     return intSet;
  1592.     }
  1593. /*************************************************************************
  1594. *
  1595. * gei82543miiReadData - shift data in from MDIO pin
  1596. *
  1597. * This routine shifts data in from MDIO pin. 
  1598. *
  1599. * RETURN: data from MDIO
  1600. */
  1601. LOCAL UINT16 gei82543miiReadData 
  1602.     (
  1603.     END_DEVICE * pDrvCtrl       /* driver structure */
  1604.     )
  1605.     {
  1606.     volatile UINT32 ctrlRegVal; /* control register value */
  1607.     UINT16 data = 0;            /* read-back data */
  1608.     UINT8 i;                    /* index */
  1609.     /* clean up */
  1610.     GEI_READ_REG(INTEL_82543GC_CTRL, ctrlRegVal);
  1611.     ctrlRegVal &= ~(CTRL_MDIO_DIR_BIT | CTRL_MDIO_BIT);
  1612.     GEI_WRITE_REG(INTEL_82543GC_CTRL, ctrlRegVal);
  1613.     /* raise clk */
  1614.     GEI_WRITE_REG(INTEL_82543GC_CTRL, (ctrlRegVal | CTRL_MDC_BIT));
  1615.     gei82543Delay (pDrvCtrl, 1000);
  1616.     /* lower clk */
  1617.     GEI_WRITE_REG(INTEL_82543GC_CTRL, (ctrlRegVal & ~CTRL_MDC_BIT));
  1618.     gei82543Delay (pDrvCtrl, 1000);
  1619.     /* read data which is always 16 bits */ 
  1620.     for (i = 0; i < 16; i++) 
  1621.         {
  1622.         /* raise clk */
  1623.         GEI_WRITE_REG(INTEL_82543GC_CTRL, (ctrlRegVal | CTRL_MDC_BIT));
  1624.         gei82543Delay (pDrvCtrl, 1000);
  1625.         GEI_READ_REG(INTEL_82543GC_CTRL, ctrlRegVal);
  1626.         data = (data << 1) | ((ctrlRegVal & CTRL_MDIO_BIT) ? 1 : 0);
  1627.         /* lower clk */
  1628.         GEI_WRITE_REG(INTEL_82543GC_CTRL, (ctrlRegVal & ~CTRL_MDC_BIT));
  1629.         gei82543Delay (pDrvCtrl, 1000);
  1630.         }
  1631.     /* raise clk */
  1632.     GEI_WRITE_REG(INTEL_82543GC_CTRL, (ctrlRegVal | CTRL_MDC_BIT));
  1633.     gei82543Delay (pDrvCtrl, 1000);
  1634.     /* lower clk */
  1635.     GEI_WRITE_REG(INTEL_82543GC_CTRL, (ctrlRegVal & ~CTRL_MDC_BIT));
  1636.     gei82543Delay (pDrvCtrl, 1000);
  1637.     return (data);
  1638.     }
  1639. /****************************************************************************
  1640. *
  1641. * gei82543miiWriteData - shift the data out to MDIO pin
  1642. *
  1643. * This routine shifts data out to MDIO pin.
  1644. * RETURN: N/A
  1645. */
  1646. LOCAL void gei82543miiWriteData 
  1647.     (
  1648.     END_DEVICE * pDrvCtrl,            /* driver structure */
  1649.     UINT32       data,                /* data to shift */
  1650.     UINT32       numBits              /* number of bits to shift */
  1651.     )
  1652.     {
  1653.     volatile UINT32 ctrlRegVal;       /* control register value */
  1654.     UINT32 mask;                      /* mask bits */
  1655.     int    ix;                        /* index */
  1656.     GEI_READ_REG(INTEL_82543GC_CTRL, ctrlRegVal);
  1657.     ctrlRegVal |= (CTRL_MDIO_DIR_BIT | CTRL_MDC_DIR_BIT);
  1658.     for (ix = numBits - 1 ; ix >= 0; ix--)
  1659.         {
  1660.         mask = 1 << ix;
  1661.         
  1662.         ctrlRegVal = (data & mask) ? (ctrlRegVal | CTRL_MDIO_BIT) : 
  1663.                                      (ctrlRegVal & ~CTRL_MDIO_BIT); 
  1664.         GEI_WRITE_REG(INTEL_82543GC_CTRL, ctrlRegVal);
  1665.         gei82543Delay (pDrvCtrl, 1000);            
  1666.         GEI_WRITE_REG(INTEL_82543GC_CTRL, (ctrlRegVal | CTRL_MDC_BIT));
  1667.         gei82543Delay (pDrvCtrl, 1000);
  1668.         GEI_WRITE_REG(INTEL_82543GC_CTRL, (ctrlRegVal & ~CTRL_MDC_BIT));
  1669.         gei82543Delay (pDrvCtrl, 1000);
  1670.         }
  1671.     return;
  1672.     }
  1673. /*************************************************************************
  1674. *
  1675. * gei82543PhyRead - read MII register
  1676. * This routine performs reading of MII registers in PHY devices
  1677. *
  1678. * RETURN: OK if read correct
  1679. */
  1680. LOCAL STATUS gei82543PhyRead
  1681.     (
  1682.     END_DEVICE * pDrvCtrl,        /* device structure */
  1683.     UINT8        phyAddr,         /* PHY device bus number  */
  1684.     UINT8        phyReg,          /* register offset to read */
  1685.     UINT16     * data             /* return data address */
  1686.     )
  1687.     {
  1688.     UINT32     cmd;               /* command data */
  1689.     UINT32     val;               /* read-back data */
  1690.     /* 
  1691.      * compose cmd in the reverse order because the most significant 
  1692.      * bits of phyAddr and phyReg should be shifted out first 
  1693.      */
  1694.     cmd = (phyReg | (phyAddr << 5) | (PHY_RD_OP << 10) | (PHY_MARK) << 12);
  1695.     /* shift the PREMABLE bits out first */
  1696.     gei82543miiWriteData (pDrvCtrl, PHY_PREAMBLE, PHY_PREAMBLE_SIZE);
  1697.     /* shift the command out */ 
  1698.     gei82543miiWriteData (pDrvCtrl, cmd, 14);
  1699.     /* read return register value */
  1700.     val = gei82543miiReadData(pDrvCtrl);
  1701.     if (val & MDI_ERR_BIT)
  1702.         return ERROR;
  1703.     *data = (UINT16)val;    
  1704.     return OK;    
  1705.     }
  1706. /*************************************************************************
  1707. *
  1708. * gei82543PhyWrite - write MII registers in PHY
  1709. * This routine performs write operation to MII registers in a PHY device
  1710. *
  1711. * RETURN: OK
  1712. */
  1713. LOCAL STATUS gei82543PhyWrite
  1714.     (
  1715.     END_DEVICE * pDrvCtrl,  /* driver structure */
  1716.     UINT8        phyAddr,   /* PHY bus number */
  1717.     UINT8        phyReg,    /* PHY's register to write */
  1718.     UINT16       data       /* data to write */
  1719.     )
  1720.     {
  1721.     UINT32 cmd;     /* command */
  1722.     cmd = (data | (PHY_TURNAR << 16) | (phyReg << 18 ) |
  1723.            (phyAddr << 23) | (PHY_WR_OP << 28) | (PHY_MARK) << 30) ;
  1724.     gei82543miiWriteData (pDrvCtrl, PHY_PREAMBLE, PHY_PREAMBLE_SIZE);
  1725.     gei82543miiWriteData (pDrvCtrl, cmd, 32);
  1726.     return OK;    
  1727.     }
  1728. /*************************************************************************
  1729. *
  1730. * gei82544PhyRead - read MII register of 82544 chip
  1731. * This routine performs reading of MII registers in the internal PHY 
  1732. *
  1733. * RETURN: OK if read correct
  1734. */
  1735. LOCAL STATUS gei82544PhyRead
  1736.     (
  1737.     END_DEVICE * pDrvCtrl,        /* device structure */
  1738.     UINT8        phyAddr,         /* PHY device bus number  */
  1739.     UINT8        phyReg,          /* register offset to read */
  1740.     UINT16     * data             /* return data address */
  1741.     )
  1742.     {
  1743.     int             count = 6;    /* counter */
  1744.     volatile UINT32 mdicRegVal;
  1745.     mdicRegVal = (MDI_READ_BIT | phyAddr << MDI_PHY_SHIFT | 
  1746.                   phyReg << MDI_REG_SHIFT);
  1747.  
  1748.     GEI_WRITE_REG(INTEL_82543GC_MDI, mdicRegVal);
  1749.     gei82543Delay (pDrvCtrl, 32000); /* wait 32 microseconds */
  1750.     while (count--)                  /* wait max 96 microseconds */
  1751.         {
  1752.         GEI_READ_REG(INTEL_82543GC_MDI, mdicRegVal);
  1753.         if (mdicRegVal & MDI_READY_BIT)
  1754.             break;
  1755.         
  1756.         gei82543Delay (pDrvCtrl, 16000);
  1757.         }
  1758.      
  1759.     if ((mdicRegVal & (MDI_READY_BIT | MDI_ERR_BIT)) != MDI_READY_BIT)
  1760.         {
  1761.         DRV_LOG (DRV_DEBUG_LOAD, "Error: MII read PhyAddr=%d, phyReg=%dn...",
  1762.                phyAddr, phyReg, 3, 4, 5, 6);
  1763.         }
  1764.     *data = (UINT16) mdicRegVal;
  1765.         
  1766.     return OK;    
  1767.     }
  1768. /*************************************************************************
  1769. *
  1770. * gei82544PhyWrite - write MII registers in the internal PHY of 82544
  1771. * This routine performs write operation to MII registers in the internal 
  1772. * PHY device
  1773. *
  1774. * RETURN: OK if success
  1775. */
  1776. LOCAL STATUS gei82544PhyWrite
  1777.     (
  1778.     END_DEVICE * pDrvCtrl,  /* driver structure */
  1779.     UINT8        phyAddr,   /* PHY bus number */
  1780.     UINT8        phyReg,    /* PHY's register to write */
  1781.     UINT16       data       /* data to write */
  1782.     )
  1783.     {
  1784.     int    count = 6;       /* counter */
  1785.     volatile UINT32 mdicRegVal;
  1786.     mdicRegVal = (MDI_WRITE_BIT | phyAddr << MDI_PHY_SHIFT | 
  1787.                   phyReg << MDI_REG_SHIFT | data);
  1788.     GEI_WRITE_REG(INTEL_82543GC_MDI, mdicRegVal);
  1789.     gei82543Delay (pDrvCtrl, 32000); /* wait 32 microseconds */
  1790.     while (count--)                  /* wait max 96 microseconds */
  1791.         {
  1792.         GEI_READ_REG(INTEL_82543GC_MDI, mdicRegVal);
  1793.         if (mdicRegVal & MDI_READY_BIT)
  1794.             break;
  1795.         
  1796.         gei82543Delay (pDrvCtrl, 16000);
  1797.         }
  1798.      
  1799.     if ((mdicRegVal & (MDI_READY_BIT | MDI_ERR_BIT)) != MDI_READY_BIT)
  1800.        {
  1801.        DRV_LOG (DRV_DEBUG_LOAD, "Error: MII write PhyAddr=%d, phyReg=%dn...",
  1802.                phyAddr, phyReg, 3, 4, 5, 6);
  1803.        }
  1804.     return OK;
  1805.     }
  1806. /**************************************************************************
  1807. *
  1808. * gei82543HwStatusDump - get and clean up statistic registers
  1809. *
  1810. * This routine gets/cleans up all statistic registers
  1811. *
  1812. * RETURNS: N/A
  1813. */
  1814. LOCAL void gei82543HwStatusDump
  1815.     (
  1816.     END_DEVICE * pDrvCtrl      /* device to dump statistic registers */
  1817.     )
  1818.     {
  1819.     GEI_READ_REG(INTEL_82543GC_CRCERRS, pDrvCtrl->staRegs.crcerrs);
  1820.     GEI_READ_REG(INTEL_82543GC_ALGNERRC, pDrvCtrl->staRegs.algnerrc);
  1821.     GEI_READ_REG(INTEL_82543GC_SYMERRS,  pDrvCtrl->staRegs.symerrs);
  1822.     GEI_READ_REG(INTEL_82543GC_RXERRC,   pDrvCtrl->staRegs.rxerrc);
  1823.     GEI_READ_REG(INTEL_82543GC_MPC, pDrvCtrl->staRegs.mpc);
  1824.     GEI_READ_REG(INTEL_82543GC_SCC, pDrvCtrl->staRegs.scc);
  1825.     GEI_READ_REG(INTEL_82543GC_ECOL,pDrvCtrl->staRegs.ecol);
  1826.     GEI_READ_REG(INTEL_82543GC_MCC, pDrvCtrl->staRegs.mcc);
  1827.     GEI_READ_REG(INTEL_82543GC_LATECOL, pDrvCtrl->staRegs.latecol);
  1828.     GEI_READ_REG(INTEL_82543GC_COLC, pDrvCtrl->staRegs.colc);
  1829.     GEI_READ_REG(INTEL_82543GC_TUC,  pDrvCtrl->staRegs.tuc);
  1830.     GEI_READ_REG(INTEL_82543GC_DC,   pDrvCtrl->staRegs.dc);
  1831.     GEI_READ_REG(INTEL_82543GC_TNCRS,pDrvCtrl->staRegs.tncrs);
  1832.     GEI_READ_REG(INTEL_82543GC_SEC,  pDrvCtrl->staRegs.sec);
  1833.     GEI_READ_REG(INTEL_82543GC_CEXTEER, pDrvCtrl->staRegs.cexteer);
  1834.     GEI_READ_REG(INTEL_82543GC_RLEC,   pDrvCtrl->staRegs.rlec);
  1835.     GEI_READ_REG(INTEL_82543GC_XONRXC, pDrvCtrl->staRegs.xonrxc);
  1836.     GEI_READ_REG(INTEL_82543GC_XONTXC, pDrvCtrl->staRegs.xontxc);
  1837.     GEI_READ_REG(INTEL_82543GC_XOFFRXC, pDrvCtrl->staRegs.xoffrxc);
  1838.     GEI_READ_REG(INTEL_82543GC_XOFFTXC, pDrvCtrl->staRegs.xofftxc);
  1839.     GEI_READ_REG(INTEL_82543GC_FCRUC, pDrvCtrl->staRegs.fcruc);
  1840.     GEI_READ_REG(INTEL_82543GC_PRC64, pDrvCtrl->staRegs.prc64);
  1841.     GEI_READ_REG(INTEL_82543GC_PRC127, pDrvCtrl->staRegs.prc127);
  1842.     GEI_READ_REG(INTEL_82543GC_PRC255, pDrvCtrl->staRegs.prc255);
  1843.     GEI_READ_REG(INTEL_82543GC_PRC511, pDrvCtrl->staRegs.prc511);
  1844.     GEI_READ_REG(INTEL_82543GC_PRC1023, pDrvCtrl->staRegs.prc1023);
  1845.     GEI_READ_REG(INTEL_82543GC_PRC1522, pDrvCtrl->staRegs.prc1522);
  1846.     GEI_READ_REG(INTEL_82543GC_GPRC, pDrvCtrl->staRegs.gprc);
  1847.     GEI_READ_REG(INTEL_82543GC_BPRC, pDrvCtrl->staRegs.bprc);
  1848.     GEI_READ_REG(INTEL_82543GC_MPRC, pDrvCtrl->staRegs.mprc);
  1849.     GEI_READ_REG(INTEL_82543GC_GPTC, pDrvCtrl->staRegs.gptc);
  1850.     GEI_READ_REG(INTEL_82543GC_GORL, pDrvCtrl->staRegs.gorl);
  1851.     GEI_READ_REG(INTEL_82543GC_GORH, pDrvCtrl->staRegs.gorh);
  1852.     GEI_READ_REG(INTEL_82543GC_GOTL, pDrvCtrl->staRegs.gotl);
  1853.     GEI_READ_REG(INTEL_82543GC_GOTH, pDrvCtrl->staRegs.goth);
  1854.     GEI_READ_REG(INTEL_82543GC_RNBC, pDrvCtrl->staRegs.rnbc);
  1855.     GEI_READ_REG(INTEL_82543GC_RUC, pDrvCtrl->staRegs.ruc);
  1856.     GEI_READ_REG(INTEL_82543GC_RFC, pDrvCtrl->staRegs.rfc);
  1857.     GEI_READ_REG(INTEL_82543GC_ROC, pDrvCtrl->staRegs.roc);
  1858.     GEI_READ_REG(INTEL_82543GC_RJC, pDrvCtrl->staRegs.rjc);
  1859.     GEI_READ_REG(INTEL_82543GC_TORL, pDrvCtrl->staRegs.torl);
  1860.     GEI_READ_REG(INTEL_82543GC_TORH, pDrvCtrl->staRegs.torh);
  1861.     GEI_READ_REG(INTEL_82543GC_TOTL, pDrvCtrl->staRegs.totl);
  1862.     GEI_READ_REG(INTEL_82543GC_TOTH, pDrvCtrl->staRegs.toth);
  1863.     GEI_READ_REG(INTEL_82543GC_TPR, pDrvCtrl->staRegs.tpr);
  1864.     GEI_READ_REG(INTEL_82543GC_TPT, pDrvCtrl->staRegs.tpt);
  1865.     GEI_READ_REG(INTEL_82543GC_PTC64, pDrvCtrl->staRegs.ptc64);
  1866.     GEI_READ_REG(INTEL_82543GC_PTC127, pDrvCtrl->staRegs.ptc127);
  1867.     GEI_READ_REG(INTEL_82543GC_PTC255, pDrvCtrl->staRegs.ptc255);
  1868.     GEI_READ_REG(INTEL_82543GC_PTC511, pDrvCtrl->staRegs.ptc511);
  1869.     GEI_READ_REG(INTEL_82543GC_PTC1023, pDrvCtrl->staRegs.ptc1023);
  1870.     GEI_READ_REG(INTEL_82543GC_PTC1522, pDrvCtrl->staRegs.ptc1522);
  1871.     GEI_READ_REG(INTEL_82543GC_MPTC, pDrvCtrl->staRegs.mptc);
  1872.     GEI_READ_REG(INTEL_82543GC_BPTC, pDrvCtrl->staRegs.bptc);
  1873.     GEI_READ_REG(INTEL_82543GC_TSCTC, pDrvCtrl->staRegs.tsctc);
  1874.     GEI_READ_REG(INTEL_82543GC_TSCTFC, pDrvCtrl->staRegs.tsctfc);
  1875.     GEI_READ_REG(INTEL_82543GC_RDFH, pDrvCtrl->staRegs.rdfh);
  1876.     GEI_READ_REG(INTEL_82543GC_RDFT, pDrvCtrl->staRegs.rdft);
  1877.     GEI_READ_REG(INTEL_82543GC_RDFHS, pDrvCtrl->staRegs.rdfhs);
  1878.     GEI_READ_REG(INTEL_82543GC_RDFTS, pDrvCtrl->staRegs.rdfts);
  1879.     GEI_READ_REG(INTEL_82543GC_RDFPC, pDrvCtrl->staRegs.rdfpc);
  1880.     GEI_READ_REG(INTEL_82543GC_TDFH, pDrvCtrl->staRegs.tdfh);
  1881.     GEI_READ_REG(INTEL_82543GC_TDFT,  pDrvCtrl->staRegs.tdft);
  1882.     GEI_READ_REG(INTEL_82543GC_TDFHS, pDrvCtrl->staRegs.tdfhs);
  1883.     GEI_READ_REG(INTEL_82543GC_TDFTS, pDrvCtrl->staRegs.tdfts);
  1884.     GEI_READ_REG(INTEL_82543GC_TDFPC, pDrvCtrl->staRegs.tdfpc);
  1885.     return;
  1886.     }
  1887. #ifdef INCLUDE_GEI82543_DEBUG_ROUTINE
  1888. /***************************************************************************
  1889. *
  1890. * gei82543StatusShow - show statistic registers 
  1891. *
  1892. * This routine dumps and shows statistic registers 
  1893. *
  1894. * RETURNS: N/A
  1895. */
  1896. LOCAL void gei82543StatusShow
  1897.     (
  1898.     int unit            /* device unit */
  1899.     )
  1900.     {
  1901.     END_DEVICE * pDrvCtrl;
  1902.     /* sanity check */
  1903.     if (unit >= GEI543_MAX_DEV_UNIT)
  1904.         {
  1905.         printf ("Invalid unit numbern");
  1906.         return;
  1907.         }
  1908.     pDrvCtrl = (END_DEVICE *) endFindByName (DEVICE_NAME, unit); 
  1909.     printf ("n");
  1910.     printf ("*****************************************************n");
  1911.     printf ("********** Intel 82543 status show ******************n");
  1912.     printf ("*****************************************************n");    
  1913.     printf ("n");    
  1914.     /* get speed info */
  1915.     gei82543SpeedGet (pDrvCtrl);
  1916.     printf (" Device speed: ttt%dn", pDrvCtrl->speed);
  1917.     
  1918.     /* get duplex info */
  1919.     gei82543DuplexGet (pDrvCtrl);
  1920.     printf (" Device duplex mode: tt%sn", 
  1921.              (pDrvCtrl->duplex == FULL_DUPLEX_MODE) ? 
  1922.              "Full duplex": "Half duplex mode");
  1923.     /* get flow control info */
  1924.     if (pDrvCtrl->flowCtrl == FLOW_CONTRL_TRANSMIT)       
  1925.         printf (" Flow control mode: tt%sn", "Transmit flow control");
  1926.     else if (pDrvCtrl->flowCtrl == FLOW_CONTRL_RECEIVE)       
  1927.         printf (" Flow control mode: tt%sn", "RECEIVE flow control");   
  1928.     else if (pDrvCtrl->flowCtrl == FLOW_CONTRL_ALL)       
  1929.         printf (" Flow control mode: tt%sn", 
  1930.                                       "RECEIVE/TRANSMIT flow control");
  1931.     else
  1932.         printf (" Flow control mode: tt%sn", "No flow control");
  1933.  
  1934.     printf ("n");
  1935.     printf (" Tx descriptor tail index:t%dn", pDrvCtrl->txDescTail);
  1936.     printf (" Rx descriptor tail index:t%dn", pDrvCtrl->rxDescTail);
  1937.     printf (" Tx descriptor last check index:%dn", 
  1938.              pDrvCtrl->txDescLastCheck);
  1939.     printf (" Tx descriptor available number:%dn", 
  1940.              pDrvCtrl->txDescFreeNum);
  1941.     /* dump statistic registers */
  1942.     gei82543HwStatusDump (pDrvCtrl); 
  1943.     
  1944.     /* print out statistic register */
  1945.     printf ("n");
  1946.     printf (" CRC error count: tt0x%xn", pDrvCtrl->staRegs.crcerrs);
  1947.     printf (" Alignment error count: t0x%xn", pDrvCtrl->staRegs.algnerrc);
  1948.     printf (" Symbol error count: tt0x%xn", pDrvCtrl->staRegs.symerrs);
  1949.     printf (" RX error count: tt0x%xn", pDrvCtrl->staRegs.rxerrc);
  1950.     printf (" Missed packet count: tt0x%xn", pDrvCtrl->staRegs.mpc);
  1951.     printf (" Single collision count: t0x%xn", pDrvCtrl->staRegs.scc);
  1952.     printf (" Excessive collision count: t0x%xn", pDrvCtrl->staRegs.ecol);
  1953.     printf (" Multiple collision count: t0x%xn", pDrvCtrl->staRegs.mcc);
  1954.     printf (" late collision count: tt0x%xn", pDrvCtrl->staRegs.latecol);
  1955.     printf (" Collision count: tt0x%xn", pDrvCtrl->staRegs.colc);
  1956.     printf (" Transmit underrun count: t0x%xn", pDrvCtrl->staRegs.tuc);
  1957.     printf (" Defer count: ttt0x%xn", pDrvCtrl->staRegs.dc);
  1958.     printf (" Transmit no CRS count: t0x%xn", pDrvCtrl->staRegs.tncrs);
  1959.     printf (" Sequence error count: tt0x%xn", pDrvCtrl->staRegs.sec);
  1960.     printf (" Carrier extension err count:t0x%xn",
  1961.               pDrvCtrl->staRegs.cexteer);
  1962.     printf (" Receive length error count: t0x%xn", pDrvCtrl->staRegs.rlec);
  1963.     printf (" Xon receive count: tt0x%xn", pDrvCtrl->staRegs.xonrxc);
  1964.     printf (" Xon transmit count: tt0x%xn", pDrvCtrl->staRegs.xontxc);
  1965.     printf (" Xoff receive count: tt0x%xn", pDrvCtrl->staRegs.xoffrxc);
  1966.     printf (" Xoff transmit count: tt0x%xn",  pDrvCtrl->staRegs.xofftxc);
  1967.     printf (" FC received unsupported count:t0x%xn", 
  1968.               pDrvCtrl->staRegs.fcruc);
  1969.     printf ("n");
  1970.     printf (" Packet received 64 byte count:tt0x%xn", 
  1971.               pDrvCtrl->staRegs.prc64);
  1972.     printf (" Packet received 65-127 byte count:t0x%xn", 
  1973.               pDrvCtrl->staRegs.prc127);
  1974.     printf (" Packet received 128-255 byte count:t0x%xn", 
  1975.               pDrvCtrl->staRegs.prc255);
  1976.     printf (" Packet received 256-511 byte count:t0x%xn", 
  1977.               pDrvCtrl->staRegs.prc511); 
  1978.     printf (" Packet received 512-1023 byte count:t0x%xn", 
  1979.               pDrvCtrl->staRegs.prc1023); 
  1980.     printf (" Packet received 1024-1522 byte count:t0x%xn", 
  1981.               pDrvCtrl->staRegs.prc1522);   
  1982.     printf (" Good packet received count: tt0x%xn", pDrvCtrl->staRegs.gprc);
  1983.     printf (" Broadcast packet received count:t0x%xn",pDrvCtrl->staRegs.bprc);
  1984.     printf (" Multicast packet received count:t0x%xn",pDrvCtrl->staRegs.mprc);
  1985.     printf ("n");
  1986.     printf (" Good packet transmit count: tt0x%xn", pDrvCtrl->staRegs.gptc);
  1987.     printf (" Good octets received count (lo):t0x%xn",pDrvCtrl->staRegs.gorl);
  1988.     printf (" Good octets received count (hi):t0x%xn",pDrvCtrl->staRegs.gorh);
  1989.     printf (" Good octets transmit count (lo):t0x%xn",pDrvCtrl->staRegs.gotl);
  1990.     printf (" Good octets transmit count (hi):t0x%xn",pDrvCtrl->staRegs.goth);
  1991.     printf (" Receive no buffer count: tt0x%xn", pDrvCtrl->staRegs.rnbc);
  1992.     printf (" Receive under size count: tt0x%xn",  pDrvCtrl->staRegs.ruc);  
  1993.     printf (" Receive fragment count: tt0x%xn", pDrvCtrl->staRegs.rfc);
  1994.     printf (" Receive oversize count: tt0x%xn", pDrvCtrl->staRegs.roc);
  1995.     printf (" Receive jabber count: ttt0x%xn", pDrvCtrl->staRegs.rjc);
  1996.     printf (" Total octets receive(lo): tt0x%xn",pDrvCtrl->staRegs.torl);
  1997.     printf (" Total octets receive(hi): tt0x%xn",pDrvCtrl->staRegs.torh);
  1998.     printf (" Total octets transmit(lo):tt0x%xn",pDrvCtrl->staRegs.totl);
  1999.     printf (" Total octets transmit(hi): tt0x%xn",pDrvCtrl->staRegs.toth);
  2000.     printf (" Total packet receive: ttt0x%xn", pDrvCtrl->staRegs.tpr);
  2001.     printf (" Total packet transmit: tt0x%xn", pDrvCtrl->staRegs.tpt); 
  2002.     printf ("n");
  2003.     printf (" Packet transmit 64 byte count:tt0x%xn", 
  2004.               pDrvCtrl->staRegs.ptc64);
  2005.     printf (" Packet transmit 65-127 byte count:t0x%xn", 
  2006.               pDrvCtrl->staRegs.ptc127);
  2007.     printf (" Packet transmit 128-255 byte count:t0x%xn", 
  2008.               pDrvCtrl->staRegs.ptc255);
  2009.     printf (" Packet transmit 256-511 byte count:t0x%xn", 
  2010.               pDrvCtrl->staRegs.ptc511); 
  2011.     printf (" Packet transmit 512-1023 byte count:t0x%xn", 
  2012.               pDrvCtrl->staRegs.ptc1023); 
  2013.     printf (" Packet transmit 1024-1522 byte count:t0x%xn", 
  2014.               pDrvCtrl->staRegs.ptc1522);
  2015.     printf (" Multicast packet transmit count:t0x%xn",
  2016.               pDrvCtrl->staRegs.mptc);
  2017.     printf (" Broadcast packet transmit count:t0x%xn",
  2018.               pDrvCtrl->staRegs.bptc);
  2019.     printf ("n");
  2020.     printf (" TCP segmentation context transmit count:t0x%xn", 
  2021.               pDrvCtrl->staRegs.tsctc);
  2022.     printf (" TCP segmentation context transmit fail count:t0x%xn", 
  2023.               pDrvCtrl->staRegs.tsctfc);
  2024.     printf (" receive data FIFO head: ttt0x%xn", pDrvCtrl->staRegs.rdfh);
  2025.     printf (" receive data FIFO tail: ttt0x%xn", pDrvCtrl->staRegs.rdft);
  2026.     printf (" receive data FIFO head save register: tt0x%xn", 
  2027.               pDrvCtrl->staRegs.rdfhs);
  2028.     printf (" receive data FIFO tail save register: tt0x%xn",
  2029.               pDrvCtrl->staRegs.rdfts);
  2030.     printf (" receive data FIFO packet count:tt0x%xn", 
  2031.               pDrvCtrl->staRegs.rdfpc);
  2032.     printf (" transmit data FIFO head: ttt0x%xn", pDrvCtrl->staRegs.tdfh);
  2033.     printf (" transmit data FIFO tail: ttt0x%xn", pDrvCtrl->staRegs.tdft);
  2034.     printf (" transmit data FIFO head save register: t0x%xn", 
  2035.               pDrvCtrl->staRegs.tdfhs);
  2036.     printf (" transmit data FIFO tail save register: t0x%xn", 
  2037.               pDrvCtrl->staRegs.tdfts);
  2038.     printf (" transmit data FIFO packet count:tt0x%xn", 
  2039.               pDrvCtrl->staRegs.tdfpc);
  2040.     printf ("*************************************************************n");
  2041.     return;
  2042.     }
  2043. /****************************************************************************
  2044. *
  2045. * gei82543RegGet - get the specified register value in 82543 chip
  2046. *
  2047. * This routine gets and shows the specified register value in 82543 chip
  2048. *
  2049. * RETURNS: Register value
  2050. */
  2051. LOCAL UINT32 gei82543RegGet
  2052.     (
  2053.     int     unit,       /* device unit */
  2054.     UINT32  offset      /* register offset */
  2055.     )
  2056.     {
  2057.     UINT32  regVal;
  2058.     END_DEVICE * pDrvCtrl;
  2059.     if (unit >= GEI543_MAX_DEV_UNIT)
  2060.         {
  2061.         printf ("Invalid unit numbern");
  2062.         return 0;
  2063.         }
  2064.     if (offset % 4 != 0)
  2065.         {
  2066.         printf ("Invalid register indexn"); 
  2067.         return 0;
  2068.         }
  2069.     pDrvCtrl = (END_DEVICE *) endFindByName (DEVICE_NAME, unit); 
  2070.     GEI_READ_REG(offset, regVal);
  2071.     printf ("unit: %d, register: 0x%x, value:0x%xn", unit, offset, regVal);
  2072.     return regVal;
  2073.     }
  2074. /****************************************************************************
  2075. *
  2076. * gei82543RegSet - set the specified register value
  2077. *
  2078. * This routine sets the specified register value
  2079. *
  2080. * RETURNS: N/A
  2081. */
  2082. LOCAL void gei82543RegSet
  2083.     (
  2084.     int     unit,       /* device unit */
  2085.     UINT32  offset,     /* register offset */
  2086.     UINT32  regVal      /* value to write */
  2087.     )
  2088.     {
  2089.     END_DEVICE * pDrvCtrl; /* driver structure */
  2090.     if (unit >= GEI543_MAX_DEV_UNIT)
  2091.         {
  2092.         printf ("Invalid unit numbern");
  2093.         return;
  2094.         }
  2095.  
  2096.     if (offset % 4 != 0)
  2097.         {
  2098.         printf ("Invalid register indexn"); 
  2099.         return;
  2100.         }
  2101.     pDrvCtrl = (END_DEVICE *) endFindByName (DEVICE_NAME, unit); 
  2102.     GEI_WRITE_REG(offset, regVal);
  2103.     return;
  2104.     }
  2105. /****************************************************************************
  2106. *
  2107. * gei82543LedOn - turn on LED
  2108. *
  2109. * This routine turns LED on
  2110. *
  2111. * RETURNS: N/A
  2112. */
  2113. LOCAL void gei82543LedOn
  2114.     (
  2115.     int unit        /* device unit */
  2116.     )
  2117.     {
  2118.     UINT32 ctrlRegVal;      /* control register value */
  2119.     END_DEVICE * pDrvCtrl;  /* driver structure */
  2120.     pDrvCtrl = (END_DEVICE *) endFindByName (DEVICE_NAME, unit); 
  2121.    
  2122.     GEI_READ_REG(INTEL_82543GC_CTRL, ctrlRegVal);
  2123.     ctrlRegVal |= (CTRL_SWDPIO0_BIT | CTRL_SWDPIN0_BIT);
  2124.     GEI_WRITE_REG(INTEL_82543GC_CTRL, ctrlRegVal);
  2125.     return;
  2126.     }
  2127. /***************************************************************************
  2128. *
  2129. * gei82543LedOff - turn off LED
  2130. *
  2131. * This routine turns LED off
  2132. *
  2133. * RETURNS: N/A
  2134. */
  2135. LOCAL void gei82543LedOff
  2136.     (
  2137.     int unit        /* device unit */
  2138.     )
  2139.     {
  2140.     END_DEVICE * pDrvCtrl;  /* driver structure */
  2141.     UINT32 ctrlRegVal;      /* control register value */
  2142.     pDrvCtrl = (END_DEVICE *) endFindByName (DEVICE_NAME, unit); 
  2143.     GEI_READ_REG(INTEL_82543GC_CTRL, ctrlRegVal);
  2144.     ctrlRegVal |= CTRL_SWDPIO0_BIT;
  2145.     ctrlRegVal &= ~CTRL_SWDPIN0_BIT;
  2146.     GEI_WRITE_REG(INTEL_82543GC_CTRL, ctrlRegVal);
  2147.     return;
  2148.     }
  2149. /***************************************************************************
  2150. *
  2151. * gei82543PhyRegGet - get the register value in PHY
  2152. *
  2153. * This routine returns the PHY's register value
  2154. *
  2155. * RETURNS: PHY's register value
  2156. */
  2157. LOCAL UINT16 gei82543PhyRegGet
  2158.     (
  2159.     int unit,       /* device unit */
  2160.     int reg         /* PHY's register */
  2161.     )
  2162.     {
  2163.     END_DEVICE * pDrvCtrl; /* driver structure */
  2164.     UINT16       tmp;
  2165.     pDrvCtrl = (END_DEVICE *) endFindByName (DEVICE_NAME, unit);  
  2166.    
  2167.     if (pDrvCtrl->adaptor.boardType == PRO1000_543_BOARD)
  2168.         {
  2169.         gei82543PhyRead (pDrvCtrl, pDrvCtrl->pPhyInfo->phyAddr, reg, &tmp);
  2170.         }
  2171.     else if (pDrvCtrl->adaptor.boardType == PRO1000_544_BOARD ||
  2172.              pDrvCtrl->adaptor.boardType == PRO1000_546_BOARD)
  2173.         {
  2174.         gei82544PhyRead (pDrvCtrl, pDrvCtrl->pPhyInfo->phyAddr, reg, &tmp);
  2175.         }        
  2176.     printf ("PHY Device, Reg:%d, value:0x%xn", reg, tmp);
  2177.     return tmp;
  2178.     }
  2179. /***************************************************************************
  2180. *
  2181. * gei82543PhyRegSet - set the register value in PHY
  2182. *
  2183. * This routine returns the PHY's register value
  2184. *
  2185. * RETURNS: PHY's register value
  2186. */
  2187. LOCAL UINT16 gei82543PhyRegSet
  2188.     (
  2189.     int unit,       /* device unit */
  2190.     int reg,         /* PHY's register */
  2191.     UINT16 tmp
  2192.     )
  2193.     {
  2194.     END_DEVICE * pDrvCtrl; /* driver structure */
  2195.     pDrvCtrl = (END_DEVICE *) endFindByName (DEVICE_NAME, unit);  
  2196.    
  2197.     if (pDrvCtrl->adaptor.boardType == PRO1000_543_BOARD)
  2198.         {
  2199.         gei82543PhyWrite (pDrvCtrl, pDrvCtrl->pPhyInfo->phyAddr, reg, tmp);
  2200.         }
  2201.     else if (pDrvCtrl->adaptor.boardType == PRO1000_544_BOARD ||
  2202.              pDrvCtrl->adaptor.boardType == PRO1000_546_BOARD)
  2203.         {
  2204.         gei82544PhyWrite (pDrvCtrl, pDrvCtrl->pPhyInfo->phyAddr, reg, tmp);
  2205.         }        
  2206.     printf ("PHY Device, Reg:%d, value:0x%xn", reg, tmp);
  2207.     return tmp;
  2208.     }
  2209. #ifdef INCLUDE_TBI_COMPATIBLE
  2210. /***************************************************************************
  2211. *
  2212. * gei82543TbiCompWr - enable/disable the TBI compatibility workaround
  2213. *
  2214. * This routine enables/disables TBI compatibility workaround if needed
  2215. * Input: unit - unit number of the gei device
  2216. *        flag - 0 to turn off TBI compatibility, others to turn on
  2217. *
  2218. * RETURNS: N/A
  2219. */
  2220. LOCAL void gei82543TbiCompWr
  2221.     (
  2222.     int unit,       /* device unit */
  2223.     int flag        /* 0 - off, and others on */
  2224.     )
  2225.     {
  2226.     END_DEVICE * pDrvCtrl; /* driver structure */
  2227.     UINT32 rctlVal;
  2228.     pDrvCtrl = (END_DEVICE *) endFindByName (DEVICE_NAME, unit);  
  2229.     GEI_READ_REG(INTEL_82543GC_RCTL, rctlVal);
  2230.     gei82543SpeedGet (pDrvCtrl);
  2231.     /* check conditions again */
  2232.     if (flag)
  2233.         {
  2234.         pDrvCtrl->usrFlags |= GEI_END_TBI_COMPATIBILITY;
  2235.         if (pDrvCtrl->adaptor.boardType == PRO1000_543_BOARD &&
  2236.             pDrvCtrl->cableType == GEI_COPPER_MEDIA &&
  2237.             pDrvCtrl->speed == MII_1000MBS)
  2238.             {
  2239.             pDrvCtrl->tbiCompatibility = TRUE;
  2240.             GEI_WRITE_REG(INTEL_82543GC_RCTL, (rctlVal | RCTL_SBP_BIT));
  2241.             CACHE_PIPE_FLUSH ();
  2242.             printf ("TBI compatibility workaround is enabled for gei%dn", unit);
  2243.             return;  
  2244.             }
  2245.         }
  2246.     else
  2247.         {
  2248.         pDrvCtrl->usrFlags &= ~GEI_END_TBI_COMPATIBILITY;
  2249.         }
  2250.     pDrvCtrl->tbiCompatibility = FALSE;
  2251.     GEI_WRITE_REG(INTEL_82543GC_RCTL, (rctlVal & ~RCTL_SBP_BIT));
  2252.     printf ("TBI compatibility workaround is not enabled for gei%dn", unit);
  2253.     CACHE_PIPE_FLUSH ();
  2254.     return;
  2255.     }
  2256. #endif /* INCLUDE_TBI_COMPATIBLE */
  2257. #endif /* INCLUDE_GEI82543_DEBUG_ROUTINE */
  2258.