亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? dm9000end.c

?? 操作系統中的一找你個的相關的淡淡的碼源代碼
?? C
?? 第 1 頁 / 共 4 頁
字號:
    pDrvCtrl->unit = atoi (tok);
#ifdef DM_DEBUG_PRINT
    logMsg("dm9000Parse: unit = %x\n ",pDrvCtrl->unit, 0, 0, 0, 0, 0);
#endif
	
    /* IO Base */
    tok = strtok_r (NULL, ":", &pHolder);
    if (tok == NULL) return ERROR;
    
    address = strtoul (tok, NULL, 16);
    pDrvCtrl->IOBase = (UINT)address;
#ifdef DM_DEBUG_PRINT
    logMsg("dm9000Parse: IOBase = %x\n ",pDrvCtrl->IOBase, 0, 0, 0, 0, 0);
#endif

    /* Interrupt level. */
    tok = strtok_r (NULL, ":", &pHolder);
    if (tok == NULL) return ERROR;
    
    pDrvCtrl->ilevel = (UINT)strtoul (tok,NULL,16);
#ifdef DM_DEBUG_PRINT
    logMsg("dm9000Parse: ilevel = %d\n ",pDrvCtrl->ilevel, 0, 0, 0, 0, 0);
#endif
 
   /*Interrupt vector*/
   pDrvCtrl->ivec = INT_VEC_EINT_0;
#ifdef DM_DEBUG_PRINT
    logMsg("dm9000Parse: ivec = %d\n ",pDrvCtrl->ivec, 0, 0, 0, 0, 0);
#endif   
    return OK;

}

/*******************************************************************************
*
* dm9000MemInit - initialize memory for the chip
*
* This routine is highly specific to the device.
*
* RETURNS: OK or ERROR.
*/

static STATUS dm9000MemInit( END_DEVICE *pDrvCtrl )    /* device to be initialized */
{
    
    if ((pDrvCtrl->end.pNetPool = malloc (sizeof(NET_POOL))) == NULL)
        return (ERROR);

    /* Calculate the total memory for all the M-Blks and CL-Blks. */
    dm9000MclBlkConfig.memSize = (dm9000MclBlkConfig.mBlkNum *
                                 (M_BLK_SZ + sizeof (long))) +
                                 (dm9000MclBlkConfig.clBlkNum *
                                 (CL_BLK_SZ + sizeof(long)));

    if ((dm9000MclBlkConfig.memArea = (char *) memalign (sizeof(long),
                                 dm9000MclBlkConfig.memSize)) == NULL)
        return (ERROR);

    /* Calculate the memory size of all the clusters. */

    dm9000ClDescTbl[0].memSize = (dm9000ClDescTbl[0].clNum * (2048 + 8)) + sizeof(int);

    /* Allocate the memory for the clusters from cache safe memory. */

    dm9000ClDescTbl[0].memArea = (char *) cacheDmaMalloc (dm9000ClDescTbl[0].memSize) ;
    if (dm9000ClDescTbl[0].memArea == NULL)
    {
#ifdef DM_DEBUG_PRINT
        logMsg("dm9000MemInit: system memory unavailable!\n",
                0, 0, 0, 0, 0, 0);
#endif
        return (ERROR);
    }

    /* Initialize the memory pool. */
    if (netPoolInit(pDrvCtrl->end.pNetPool, &dm9000MclBlkConfig,
                    &dm9000ClDescTbl[0], dm9000ClDescTblNumEnt,NULL) == ERROR)
        {
#ifdef DM_DEBUG_PRINT
        logMsg("dm9000MemInit: Could not init buffering!\n",
                0, 0, 0, 0, 0, 0);
#endif
        return (ERROR);
        }

    /*
     * If you need clusters to store received packets into then get them
     * here ahead of time.
     */

    if ((pDrvCtrl->pClPoolId = netClPoolIdGet (pDrvCtrl->end.pNetPool,2048, (BOOL)FALSE))== NULL)
      {
#ifdef DM_DEBUG_PRINT
      	logMsg("dm9000MemInit: Could not memory cluster ID!\n",
      	        0,0,0,0,0,0);
#endif
        return (ERROR);
      }
#ifdef DM_DEBUG_PRINT
   logMsg("dm9000MemInit: Memory setup complete!\n",
       0, 0, 0, 0, 0, 0);
#endif

    return OK;
}

/*******************************************************************************
*
* dm9000Start - start the device
*
* This function calls BSP functions to connect interrupts and start the
* device running in interrupt mode.
*
* RETURNS: OK or ERROR
*
*/

static STATUS dm9000Start( END_DEVICE *pV )  /* device ID */
{ 
     END_DEVICE *pDrvCtrl;
     pDrvCtrl=(END_DEVICE *)pV;
   
     s3cExtIntPinEnable ();  

    /*Setup the interrupt handler and IDT table entry*/
    if(intConnect(INUM_TO_IVEC(pDrvCtrl->ivec), dm9000Int, (int)pDrvCtrl) == ERROR)
	  { 
#ifdef DM_DEBUG_PRINT
		logMsg("dm9000Start:Can not connect interrupt!\n",
		    0, 0, 0, 0, 0, 0);
#endif
		return ERROR;
	  }
	
  /*Enable DM9000 interrupt at the systerm lecel*/
  if(intEnable(pDrvCtrl->ilevel)==ERROR)
		{
#ifdef DM_DEBUG_PRINT
			logMsg("dm9000Start: Can not enable interrupt!\n ",
			        0, 0, 0, 0, 0, 0);
#endif
		  return ERROR;
		}
		 

    /*Mark the interface as up and running*/
	  END_FLAGS_SET (&pDrvCtrl->end, (IFF_UP | IFF_RUNNING));
	
    /* Activate DM9000 */
    DM9000_OUT_REG( 0x05, DM9000_REG05 );          /* RX enable */
    DM9000_OUT_REG( 0xff, DM9000_REGFF );          /* Enable TX/RX interrupt mask */

    return (OK);
}

/*******************************************************************************
*
* dm9000Int - handle controller interrupt
*
* This routine is called at interrupt level in response to an interrupt from
* the controller.
*
* RETURNS: N/A.
*/

static void dm9000Int( END_DEVICE  *pDrvCtrl  )  /* interrupting device */
{ 
    UCHAR stat, reg_save,isr_status,TX_comple_status,tx_status; 

    /*clear s3c2410 external intpand reg */ 
    intDisable (pDrvCtrl->ilevel); 
    rpINTMSK |= 1;
    rpINTPND |= 1;
    rpSRCPND |= 1;
    /*save previous register address */
    DM9000_IN_ADDR( reg_save );
    DM9000_OUT_REG( 0xff, DM9000_REGFF_OFF );

    /* Read and Clear ISR status */
    DM9000_IN_REG( 0xfe, isr_status );
    DM9000_OUT_REG( 0xfe, isr_status );
	
#ifdef DM_DEBUG_PRINT
     logMsg("dm9000Int: got interrupt!\n", 0, 0, 0, 0, 0, 0);
#endif

    /*
     * enable interrupts, clear receive and/or transmit interrupts, and clear
     * any errors that may be set.
     */
    if( isr_status & 0x02 )
    {

         /*Clear Tx Packet Complete Status*/
         DM9000_IN_REG(0x01, TX_comple_status);
       
         if (TX_comple_status & 0xc)
         { 
             if (TX_comple_status & 0x4) pDrvCtrl->tx_pkt_cnt--;
        	   if (TX_comple_status & 0x8) pDrvCtrl->tx_pkt_cnt--;
         }
         else
         {
             DM9000_IN_REG( 0x02, tx_status );
			       while(tx_status & 0x1){DM9000_IN_REG( 0x02, tx_status );}
         }
        		
        /*if not complete tranmission*/	
		    if(pDrvCtrl->tx_pkt_cnt>0)
		    {	    
		      /* Set TX length to DM9000 */
          DM9000_OUT_REG( 0xfc, pDrvCtrl->queue_pkt_len & 0xff );
          DM9000_OUT_REG( 0xfd, (pDrvCtrl->queue_pkt_len >> 8) & 0xff );

          /* Issue TX polling command */
          DM9000_OUT_REG( 0x2, 0x01 );        /* Cleared after TX complete */
			}
    }

    /* Have netTask handle any input packets */
    if (isr_status & 0x01 )
    {

	
        if ( pDrvCtrl->rxHandling != TRUE )
        {
            pDrvCtrl->rxHandling = TRUE;
          
            netJobAdd ((FUNCPTR)dm9000Recv, (int)pDrvCtrl, 0, 0, 0, 0);
        }
    }

    /* Re-enable interrupt mask */
    DM9000_OUT_REG( 0xff, DM9000_REGFF );
    DM9000_OUT_REG( 0x05, 0x11 );
    
    /* Restore previous register address */
    DM9000_OUT_ADDR( reg_save );

    rpINTMSK &= ~1;
    intEnable (pDrvCtrl->ilevel);
}

/*******************************************************************************
*
* dm9000Recv - process the next incoming packet
*
* Handle one incoming packet.  The packet is checked for errors.
*
* RETURNS: N/A.
*/

static STATUS dm9000Recv( END_DEVICE *pDrvCtrl )   
{
    char*       pNewCluster = NULL;
    M_BLK_ID    pMblk;
    CL_BLK_ID   pClBlk;
    int DataLen; 
    UCHAR  status;
    
 while((status=dmfe_Get_NextPacket()) != 0)
 {
    /*
     * We implicitly are loaning here, if copying is necessary this
     * step may be skipped, but the data must be copied before being
     * passed up to the protocols.
     */
     /* Get a receive frame buffer */  
   pNewCluster = netClusterGet (pDrvCtrl->end.pNetPool, pDrvCtrl->pClPoolId);
   
   /* Grab a cluster block to marry to the cluster we received. */
   pClBlk = netClBlkGet (pDrvCtrl->end.pNetPool, M_DONTWAIT);
   
   /* OK we've got a spare, let's get an M_BLK_ID and marry it to the one in the ring.*/
   pMblk = mBlkGet (pDrvCtrl->end.pNetPool, M_DONTWAIT, MT_DATA);
   
   if(pNewCluster == NULL || pClBlk == NULL || pMblk == NULL)
   {
   	 if(pNewCluster){
   	 	netClFree(pDrvCtrl->end.pNetPool,pNewCluster);
   	  }
   	 if(pClBlk){
   	 	netClBlkFree (pDrvCtrl->end.pNetPool, pClBlk);
   	 	}
   	 if(pMblk){
   	 	netMblkFree(pDrvCtrl->end.pNetPool,pMblk);
   	 	}
   	 /* Increment the input error count */
   	 END_ERR_ADD (&pDrvCtrl->end, MIB2_IN_ERRS, +1);
   	
     return;
   }
   	
    END_ERR_ADD (&pDrvCtrl->end, MIB2_IN_UCAST, +1);

    DataLen = dmfe_Copy_RxFrame(pDrvCtrl, pNewCluster+2, status);
    
    /* Join the cluster to the MBlock */
    netClBlkJoin (pClBlk, pNewCluster, DataLen, NULL, 0, 0, 0);
    netMblkClJoin (pMblk, pClBlk);

    /*pMblk->mBlkHdr.mData += pDrvCtrl->offset;*/
    pMblk->mBlkHdr.mData += 2;
    pMblk->mBlkHdr.mLen = DataLen;
    pMblk->mBlkHdr.mFlags |= M_PKTHDR;
    pMblk->mBlkPktHdr.len = DataLen;


    /* Call the upper layer's receive routine. */
    END_RCV_RTN_CALL(&pDrvCtrl->end, pMblk);
    
    pNewCluster = NULL;
  if(pNewCluster) netClFree(pDrvCtrl->end.pNetPool,pNewCluster);
}  
    pDrvCtrl->rxHandling = FALSE;
    
    return (OK); 
       
cleanRXD:
    pDrvCtrl->rxHandling = FALSE;
    return (ERROR);
}

/*******************************************************************************
*
* dm9000Send - the driver send routine
*
* This routine takes a M_BLK_ID sends off the data in the M_BLK_ID.
* The buffer must already have the addressing information properly installed
* in it.  This is done by a higher layer.  The last arguments are a free
* routine to be called when the device is done with the buffer and a pointer
* to the argument to pass to the free routine.
*
* RETURNS: OK, ERROR, or END_ERR_BLOCK.
*/

static STATUS dm9000Send( END_DEVICE *pV,  /* device ptr */
                          M_BLK_ID    pMblk )    /* data to send */
{
	  static UCHAR txBuf[DM9000_FRAME_BUFSIZE];
    int         oldLevel = 0;
    int         length = 0;
    int        TxStatus = 0;
  
  END_DEVICE *pDrvCtrl;
     pDrvCtrl=(END_DEVICE *)pV;
      
    /*
     * Obtain exclusive access to transmitter.  This is necessary because
     * we might have more than one stack transmitting at once.
     */

    if (!(pDrvCtrl->flags & DM9000_POLLING))
    {
        END_TX_SEM_TAKE (&pDrvCtrl->end, WAIT_FOREVER);
    }

    /* Get data from Mblk to tx buffer. */
    length = netMblkToBufCopy (pMblk, (char *)txBuf, NULL);
    
	
    if (!(pDrvCtrl->flags & DM9000_POLLING))
  	{ 
	   oldLevel = intLock ();  /* protect dm9000Int */
	  }
	  
	  /*transmit packet*/
	  TxStatus=dmfe_Copy_TxFrame(pDrvCtrl, txBuf, length);
	  
    /* unlock interrupt*/
    if (!((pDrvCtrl->flags) & DM9000_POLLING))
        intUnlock (oldLevel);

    /* Advance our management index */
   if (!((pDrvCtrl->flags) & DM9000_POLLING))
        END_TX_SEM_GIVE (&pDrvCtrl->end);

   /*transmit packet error handle*/
   if(TxStatus == ERROR)
	 {
	 	logMsg("dm9000Send: Transmit packet is failed!\n", 0, 0, 0, 0, 0, 0);
		netMblkClChainFree (pMblk);
		END_ERR_ADD (&pDrvCtrl->end, MIB2_OUT_ERRS, +1);
		return(END_ERR_BLOCK);
	 }

    /* Bump the statistics counters. */
    END_ERR_ADD (&pDrvCtrl->end, MIB2_OUT_UCAST, +1);

    /*
     * Cleanup.  The driver must either free the packet now or
     * set up a structure so it can be freed later after a transmit
     * interrupt occurs.
     */
     netMblkClChainFree (pMblk);
     return (OK);
        
}

/*******************************************************************************
*
* dm9000Ioctl - the driver I/O control routine
*
* Process an ioctl request.
*
* RETURNS: A command specific response, usually OK or ERROR.
*/

static int dm9000Ioctl( END_DEVICE *pV,          /* device receiving command */
                        int cmd,              /* ioctl command code */
                        caddr_t data )        /* command argument */
{
    int status = 0;
    long value;

 END_DEVICE *pDrvCtrl;
     pDrvCtrl=(END_DEVICE *)pV;

    switch (cmd)
    {
        case EIOCSADDR:
            if (data == NULL)
                return (EINVAL);
            bcopy ((char *)data, (char *)END_HADDR(&pDrvCtrl->end),
                END_HADDR_LEN(&pDrvCtrl->end));
            break;
			
        case EIOCGADDR:
            if (data == NULL)
                return (EINVAL);
            bcopy ((char *)END_HADDR(&pDrvCtrl->end), (char *)data,
                END_HADDR_LEN(&pDrvCtrl->end));
            break;
			
        case EIOCSFLAGS:
            value = (long)data;
            if (value < 0)
            {
                value = -(--value);
                END_FLAGS_CLR (&pDrvCtrl->end, value);
            }
            else
            {
                END_FLAGS_SET (&pDrvCtrl->end, value);
            }
            dm9000Config (pDrvCtrl);
            break;
        case EIOCGFLAGS:

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲美女偷拍久久| 91麻豆精品国产91久久久| 精品亚洲成a人在线观看| 福利一区在线观看| 青青草97国产精品免费观看无弹窗版| 日韩精品成人一区二区在线| 久久精品国产精品亚洲红杏| 成人免费在线播放视频| 精品播放一区二区| 欧美猛男超大videosgay| 东方aⅴ免费观看久久av| 美女视频黄频大全不卡视频在线播放| 中文字幕日韩一区二区| 337p亚洲精品色噜噜噜| 亚洲午夜久久久久久久久久久| 国产精品一区2区| 国产天堂亚洲国产碰碰| 国产综合色精品一区二区三区| 久久久久综合网| 国产精品原创巨作av| 精品国产乱码久久久久久图片 | 日韩国产高清影视| 在线中文字幕不卡| 天堂蜜桃一区二区三区| 91精品国产一区二区人妖| 水蜜桃久久夜色精品一区的特点| 日韩视频免费直播| 国产精品伊人色| 日韩理论片一区二区| 69av一区二区三区| 成人毛片视频在线观看| 一区二区三区日韩精品| 日韩欧美一级二级三级久久久| 99re这里只有精品视频首页| 亚洲成av人片在线| 国产精品无遮挡| 日韩av不卡在线观看| 欧美精品一区二区精品网| 国产一区二区三区免费| 欧美日韩一区在线| 亚洲午夜久久久久久久久久久 | 国产精品视频第一区| 精品国产在天天线2019| 精品国产123| 久久久久国产免费免费| 久久久久国产精品厨房| 欧美激情在线一区二区三区| 国产三级精品三级| 色综合天天性综合| 蜜臀av一区二区在线免费观看| 欧美国产丝袜视频| 日韩视频一区二区三区| 精品视频全国免费看| 不卡av在线网| 国产真实乱子伦精品视频| 免费欧美高清视频| 五月激情丁香一区二区三区| 亚洲欧洲三级电影| 国产精品天美传媒沈樵| 日韩免费电影网站| 欧美一区在线视频| 一本在线高清不卡dvd| 成人看片黄a免费看在线| 卡一卡二国产精品| 美女爽到高潮91| 亚洲一区二区三区四区的| 亚洲在线中文字幕| 一区二区三区四区五区视频在线观看 | 91日韩在线专区| 99久久精品国产导航| av一本久道久久综合久久鬼色| 成人免费看片app下载| 国产91露脸合集magnet | 91视频在线看| www.性欧美| 日韩精品中文字幕一区 | 日本道色综合久久| 欧美精品aⅴ在线视频| 一区二区三区成人在线视频| 国产一区三区三区| 精品一区在线看| 99视频国产精品| 欧美区一区二区三区| 国产色一区二区| 亚洲成人免费看| 国产精品一卡二卡| 欧美日韩亚洲综合一区二区三区| 精品999久久久| 亚洲一区二区免费视频| 国产一区二区三区日韩| 欧美日韩一区在线观看| 国产蜜臀av在线一区二区三区| 亚洲va国产天堂va久久en| 成人黄色777网| 欧美成人综合网站| 一区二区三区日韩欧美精品| 九色综合狠狠综合久久| 91国偷自产一区二区使用方法| 精品日韩欧美一区二区| 亚洲一区二区三区视频在线播放 | 国产在线国偷精品产拍免费yy| 一本到不卡免费一区二区| 国产亚洲女人久久久久毛片| 天堂久久久久va久久久久| av电影在线不卡| 国产午夜精品一区二区三区视频 | 粉嫩蜜臀av国产精品网站| 69p69国产精品| 亚洲精品免费电影| www.在线成人| 国产三级三级三级精品8ⅰ区| 麻豆精品一二三| 91精品久久久久久久久99蜜臂| 一区二区免费在线| 成人国产一区二区三区精品| 欧美大度的电影原声| 午夜欧美电影在线观看| 91国产丝袜在线播放| 中文字幕亚洲视频| 成人理论电影网| 中文字幕av资源一区| 国产精品亚洲视频| 久久美女艺术照精彩视频福利播放| 日韩1区2区3区| 6080国产精品一区二区| 亚洲国产精品一区二区久久| 一本一本久久a久久精品综合麻豆| 国产精品天美传媒沈樵| 成人免费看的视频| 中文字幕在线不卡| www.欧美色图| 一区在线观看免费| 不卡av在线免费观看| 亚洲天堂成人在线观看| 国产精品久久精品日日| 99精品欧美一区二区蜜桃免费 | av一区二区三区黑人| 久久久蜜桃精品| 欧美日韩和欧美的一区二区| 精品制服美女丁香| 中文字幕在线观看不卡| 欧美丝袜自拍制服另类| 麻豆国产精品一区二区三区 | 日本最新不卡在线| 日本国产一区二区| 亚洲黄一区二区三区| 99久久精品国产导航| 中文字幕欧美一区| 在线观看日韩一区| 天天色 色综合| 欧美va亚洲va香蕉在线| 激情综合色综合久久| 久久久久综合网| a在线欧美一区| 一区二区三区在线播| 欧美日韩国产高清一区二区| 免费的成人av| 国产精品久久久久永久免费观看 | 美女免费视频一区| 亚洲精品一区二区三区影院| 国产一区视频在线看| 亚洲视频网在线直播| 欧美日韩国产综合一区二区 | 成人一区二区三区中文字幕| 日韩理论电影院| 欧美精品一二三四| 国产乱人伦精品一区二区在线观看 | 欧美老肥妇做.爰bbww| 精久久久久久久久久久| 一区二区中文视频| 91精品一区二区三区久久久久久 | 日韩欧美在线1卡| 国产成人鲁色资源国产91色综| 国产精品欧美精品| 欧美久久久久免费| 懂色av一区二区三区免费看| 亚洲国产一区二区在线播放| 欧美一区二区在线视频| 波多野结衣中文字幕一区二区三区| 一区二区免费看| 久久久久久久电影| 欧美视频在线观看一区二区| 精品午夜久久福利影院| 一区二区三区在线免费| 久久亚洲一区二区三区四区| 一本久久a久久免费精品不卡| 蜜臀久久99精品久久久久宅男 | 韩国欧美一区二区| 国产亚洲精品aa| 亚洲午夜一区二区三区| 在线一区二区三区| 精品视频在线免费看| 日韩欧美亚洲国产精品字幕久久久 | 日韩一级精品视频在线观看| 精品国产伦理网| 中文字幕亚洲不卡| 国产精品1024| 亚洲欧洲99久久| 97se亚洲国产综合在线| 久久99精品国产|