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

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

?? ne2000end.c

?? 440bx vxworks bsp
?? C
?? 第 1 頁 / 共 5 頁
字號:
            {
	    /* Disable RX int */
	    pDrvCtrl->imask &= ~IM_PRXE;
	    SYS_OUT_CHAR (pDrvCtrl, ENE_INTMASK, pDrvCtrl->imask);

            pDrvCtrl->flags |= END_RECV_HANDLING_FLAG;
            (void)netJobAdd ((FUNCPTR)ne2000HandleRcvInt, (int)pDrvCtrl,
                              0,0,0,0);
            }
        }

    /* Check for transmit complete */

    if ((intStat & (ISTAT_TXE | ISTAT_PTX)) != 0)
	{
	pDrvCtrl->flags &= ~END_TX_IN_PROGRESS;
	ENDLOGMSG (("ne2000Int: Tx complete, blocked=%d\n",
		    (pDrvCtrl->flags & END_TX_BLOCKED) ? 1 : 0,0,0,0,0,0));
	if (pDrvCtrl->flags & END_TX_BLOCKED)
	    {
	    /* Disable TX ints */
	    pDrvCtrl->imask &= ~(IM_TXEE | IM_PTXE);
	    SYS_OUT_CHAR (pDrvCtrl, ENE_INTMASK, pDrvCtrl->imask);

	    pDrvCtrl->flags &= ~END_TX_BLOCKED;
	    netJobAdd ((FUNCPTR)muxTxRestart, (int)&pDrvCtrl->endObj,
		       0, 0, 0, 0);
	    }
	}

    /* Flush the write pipe */

    CACHE_PIPE_FLUSH ();
    }


/*******************************************************************************
*
* ne2000HandleRcvInt - task level interrupt service for input packets
*
* This routine is called at task level indirectly by the interrupt
* service routine to do any message received processing.
*
* RETURNS: N/A.
*/

LOCAL void ne2000HandleRcvInt
    (
    NE2000END_DEVICE *pDrvCtrl
    )
    {
    int oldLevel;
    char *pBuf;

    /* END_RECV_HANDLING_FLAG set by ISR */

    ENDLOGMSG (("ne2000HandleRcvInt(%x): enter (flags=%x)\n",
		pDrvCtrl,pDrvCtrl->flags,0,0,0,0));
    pBuf = NULL;
    while (pDrvCtrl->flags & END_RECV_HANDLING_FLAG)
	{
	int	len;
	CL_BLK_ID	pClBlk;
	M_BLK_ID	pMblk;      /* MBLK to send upstream */

	ENDLOGMSG (("ne2000HandleRcvInt: flags=%x imask=%x cur=%d next=%d\n",
		    pDrvCtrl->flags, pDrvCtrl->imask,
		    pDrvCtrl->current, pDrvCtrl->nextPacket,
		    0, 0));
	/* check if all packets removed */
	if (pDrvCtrl->nextPacket == pDrvCtrl->current)
	    break;

	/* Break out if we get an overwrite condition */
	if (pDrvCtrl->flags & END_OVERWRITE)
	    break;

	/* Allocate an MBLK, and a replacement buffer */
	if (!pBuf)
	    {
	    pBuf = netClusterGet (pDrvCtrl->endObj.pNetPool,
				  pDrvCtrl->clPoolId);
	    if (!pBuf)
		{
		ENDLOGMSG (("ne2000HandleRcvInt: Out of clusters!\n",
			    0, 0, 0, 0, 0, 0));
		break;
		}
	    }
	/* Read packet in offset so IP header is long-aligned */
	len = ne2000PacketGet (pDrvCtrl, pBuf + pDrvCtrl->offset);
	if (len <= 0)
	    {
	    ENDLOGMSG (("ne2000HandleRcvInt: bad packet! (len=%d)\n",
			len, 0, 0, 0, 0, 0));
	    END_ERR_ADD (&pDrvCtrl->endObj, MIB2_IN_ERRS, +1);
	    break;
	    }
	pMblk = mBlkGet (pDrvCtrl->endObj.pNetPool,
			 M_DONTWAIT, MT_DATA);
	if (!pMblk)
	    {
	    ENDLOGMSG (("ne2000HandleRcvInt: Out of M Blocks!\n",
			0, 0, 0, 0, 0, 0));
	    END_ERR_ADD (&pDrvCtrl->endObj, MIB2_IN_ERRS, +1);
	    break;
	    }
	pClBlk = netClBlkGet (pDrvCtrl->endObj.pNetPool, M_DONTWAIT);
	if (!pClBlk)
	    {
	    ENDLOGMSG (("ne2000HandleRcvInt: Out of CL Blocks!\n",
			0, 0, 0, 0, 0, 0));
	    netMblkFree (pDrvCtrl->endObj.pNetPool, (M_BLK_ID)pMblk);
	    break;
	    }
	/* Associate the data pointer with the MBLK */
	netClBlkJoin (pClBlk, pBuf, NE2000_BUFSIZ, NULL, 0, 0, 0);

	/* Associate the data pointer with the MBLK */
	netMblkClJoin (pMblk, pClBlk);

	pMblk->mBlkHdr.mFlags |= M_PKTHDR;
	pMblk->mBlkHdr.mLen    = len;
	pMblk->mBlkPktHdr.len  = len;
	/* Adjust mData to match n23000PacketGet() above */
	pMblk->mBlkHdr.mData   += pDrvCtrl->offset;

	/* record received packet */
	END_ERR_ADD (&pDrvCtrl->endObj, MIB2_IN_UCAST, +1);


	/* Call the upper layer's receive routine. */
	END_RCV_RTN_CALL (&pDrvCtrl->endObj, pMblk);

	/* buffer was used, will need another next time around */
	pBuf = NULL;
	}

    /* If we still have an unused buffer, free it */
    if (pBuf)
	netClFree (pDrvCtrl->endObj.pNetPool, (UCHAR *) pBuf);

    /* Re-enable the receive interrupt */
    oldLevel = intLock ();
    pDrvCtrl->flags &= ~END_RECV_HANDLING_FLAG;
    pDrvCtrl->imask |= IM_PRXE;
    SYS_OUT_CHAR (pDrvCtrl, ENE_INTMASK, pDrvCtrl->imask);

    ENDLOGMSG (("ne2000HandleRcvInt: done (flags=%x, imask=%x)\n",
		pDrvCtrl->flags,pDrvCtrl->imask,0,0,0,0));

    intUnlock (oldLevel);
    }

/*******************************************************************************
*
* ne2000DataIn - input bytes from NE2000 memory
*
* NOMANUAL
*/

LOCAL void ne2000DataIn
    (
    NE2000END_DEVICE *	pDrvCtrl,
    int			eneAddress,
    int			len,
    char *		pData
    )
    {
    if (len == 0)
	return;

    SYS_OUT_CHAR (pDrvCtrl, ENE_INTMASK, 0);
    SYS_OUT_CHAR (pDrvCtrl, ENE_CMD, CMD_NODMA | CMD_PAGE0 | CMD_START);
    SYS_OUT_CHAR (pDrvCtrl, ENE_RSAR0, eneAddress & 0xff);
    SYS_OUT_CHAR (pDrvCtrl, ENE_RSAR1, eneAddress >> 8);
    SYS_OUT_CHAR (pDrvCtrl, ENE_RBCR0, len & 0xff);
    SYS_OUT_CHAR (pDrvCtrl, ENE_RBCR1, len >> 8);
    SYS_OUT_CHAR (pDrvCtrl, ENE_CMD, CMD_RREAD | CMD_START);

    SYS_IN_WORD_STRING (pDrvCtrl, ENE_DATA, pData, len/2);
    if (len & 1)
	SYS_IN_CHAR (pDrvCtrl, ENE_DATA, (pData + (len - 1)));
    SYS_OUT_CHAR (pDrvCtrl, ENE_INTMASK, pDrvCtrl->imask);
    }

/*******************************************************************************
*
* ne2000DataOut - output bytes to NE2000 memory
*
* NOMANUAL
*/

LOCAL void ne2000DataOut
    (
    NE2000END_DEVICE *	pDrvCtrl,
    char *		pData,
    int			len,
    int			eneAddress
    )
    {
    if (len == 0)
        return;

    SYS_OUT_CHAR (pDrvCtrl, ENE_RBCR0, (char)0xff);
    SYS_OUT_CHAR (pDrvCtrl, ENE_CMD, CMD_NODMA | CMD_PAGE0 | CMD_START);
    SYS_OUT_CHAR (pDrvCtrl, ENE_RSAR0, eneAddress & 0xff);
    SYS_OUT_CHAR (pDrvCtrl, ENE_RSAR1, eneAddress >> 8);
    SYS_OUT_CHAR (pDrvCtrl, ENE_RBCR0, len & 0xff);
    SYS_OUT_CHAR (pDrvCtrl, ENE_RBCR1, len >> 8);
    SYS_OUT_CHAR (pDrvCtrl, ENE_CMD, CMD_RWRITE | CMD_START);

    SYS_OUT_WORD_STRING (pDrvCtrl, ENE_DATA, pData, len/2);
    if (len & 1)
        SYS_OUT_CHAR (pDrvCtrl, ENE_DATA, *(pData + (len - 1)));
    }

/*******************************************************************************
*
* ne2000Send - 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 or ERROR.
*/

LOCAL STATUS ne2000Send
    (
    void*	pCookie,	/* device ptr */
    M_BLK_ID	pMblk		/* data to send */
    )
    {
    int		len;
    UCHAR	cmdStat;
    NE2000END_DEVICE* pDrvCtrl = (NE2000END_DEVICE *) pCookie;
    
    /*
     * Obtain exclusive access to transmitter.  This is necessary because
     * we might have more than one stack transmitting at once.
     */


    if (pDrvCtrl->flags & (END_OVERWRITE | END_OVERWRITE2))
	{
	return (END_ERR_BLOCK);
	}

    ENDLOGMSG (("ne2000Send: enter: (flags=%x, imask=%x)\n",
		pDrvCtrl->flags, pDrvCtrl->imask, 0, 0, 0, 0));

    /* Note device receive interrupts may still be enabled */

    END_TX_SEM_TAKE (&pDrvCtrl->endObj, WAIT_FOREVER);
    pDrvCtrl->flags |= END_TX_BLOCKED;

    if (pDrvCtrl->flags & END_TX_IN_PROGRESS)
	{
	int cnt;

	ENDLOGMSG (("ne2000Send: waiting for TX_IN_PROGRESS\n",
		    0,0,0,0,0,0));

	/* Wait up to 1 second */
	cnt = sysClkRateGet ();
	while ((pDrvCtrl->flags & END_TX_IN_PROGRESS) && (cnt-- > 0))
	    taskDelay (1);
	}

    /* Disable device interrupts and check for overwrite detected */
    SYS_OUT_CHAR (pDrvCtrl, ENE_INTMASK, 0);
    if (pDrvCtrl->flags & (END_OVERWRITE | END_OVERWRITE2))
	{
	ENDLOGMSG (("ne2000Send: overwrite detected (timeout)\n",
		    0, 0, 0, 0, 0, 0));
	pDrvCtrl->flags &= ~END_TX_BLOCKED;
	END_TX_SEM_GIVE (&pDrvCtrl->endObj);
	return (END_ERR_BLOCK);
	}

    /* If TX still in progress, re-configure chip */
    if (pDrvCtrl->flags & END_TX_IN_PROGRESS)
	{
	UCHAR tstat;

	SYS_IN_CHAR (pDrvCtrl, ENE_TSTAT, &tstat);
	SYS_IN_CHAR (pDrvCtrl, ENE_CMD, &cmdStat);
	ENDLOGMSG (("ne2000Send: timeout: flags=%x cmd=%02x stat=%02x\n",
		    pDrvCtrl->flags, cmdStat, tstat, 0, 0, 0));
	ne2000Config (pDrvCtrl, FALSE);
	}

    /* Copy and free the MBLK */

    len = netMblkToBufCopy (pMblk, pDrvCtrl->packetBuf, NULL);
    netMblkClChainFree (pMblk);
    len = max (len, ETHERSMALL);

    /* Transfer to the device */

    SYS_OUT_CHAR (pDrvCtrl, ENE_INTMASK, 0x00);
    ne2000DataOut (pDrvCtrl, pDrvCtrl->packetBuf, len, (NE2000_TSTART << 8));

    /* Flush the write pipe */
    
    CACHE_PIPE_FLUSH ();
    
    /* kick Transmitter */

    SYS_OUT_CHAR (pDrvCtrl, ENE_TSTART, NE2000_TSTART);
    SYS_OUT_CHAR (pDrvCtrl, ENE_TCNTH, len >> 8);
    SYS_OUT_CHAR (pDrvCtrl, ENE_TCNTL, len & 0xff);
    SYS_OUT_CHAR (pDrvCtrl, ENE_CMD, CMD_TXP | CMD_START);

    /* mark tx as in progress */

    pDrvCtrl->flags |= END_TX_IN_PROGRESS;

    /* Re-enable device TX interrupts */

    pDrvCtrl->imask |= (IM_TXEE | IM_PTXE);
    SYS_OUT_CHAR (pDrvCtrl, ENE_INTMASK, pDrvCtrl->imask);

    END_TX_SEM_GIVE (&pDrvCtrl->endObj);

    /* update statistics */
    END_ERR_ADD (&pDrvCtrl->endObj, MIB2_OUT_UCAST, +1);


    ENDLOGMSG (("ne2000Send: done: imask=%02x\n",
		pDrvCtrl->imask, 0, 0, 0, 0, 0));
    return (OK);
    }

/*******************************************************************************
*
* ne2000PacketGet - get next received message
*
* Get next received message.  Returns NULL if none are
* ready.
*
* RETURNS: ptr to next packet, or NULL if none ready.
*/

LOCAL int ne2000PacketGet
    (
    NE2000END_DEVICE	*pDrvCtrl,
    char		*pData
    )
    {
    UINT        packetSize;
    UCHAR	uppByteCnt;
    UINT8       tempPage;               /* used in buffer validation */
    UINT8       pageCount;              /* used in buffer validation */
    UINT        packetLen = 0;
    NE2000_HEADER  h;

    if (pDrvCtrl->nextPacket == pDrvCtrl->current)
	return (0);

    ne2000DataIn (pDrvCtrl,
		  (((UINT)pDrvCtrl->nextPacket << 8) & 0x0000ffff),
		  sizeof (NE2000_HEADER), (char *) &h);

    /*
     * Calculate upper byte count in case it's corrupted,
     * though this supposedly happens only in StarLAN applications
     * with bus clock frequence greater than 4 mHz.
     */
    if (h.next > pDrvCtrl->nextPacket)
	uppByteCnt = (UCHAR) (h.next - pDrvCtrl->nextPacket);
    else
	uppByteCnt = (UCHAR) ((NE2000_PSTOP - pDrvCtrl->nextPacket)
			      + (h.next - NE2000_PSTART));
    if (h.lowByteCnt > 0xfc)
	uppByteCnt -= 2;
    else
	uppByteCnt -= 1;
    h.uppByteCnt = uppByteCnt;

    /* compute packet size excluding Ethernet checksum bytes */

    packetSize = (((UINT)h.uppByteCnt << 8) + h.lowByteCnt) - 4;

    /* Check for packet (and header) shifted in memory (by heavy load).
     * The method and solution are recommended by 3Com in their
     * EtherLink II Adapter Technical Manual, with the addition of
     * a reasonableness check on the next-page link.
     */
    pageCount = (UCHAR) ((packetSize + 4 + sizeof (NE2000_HEADER)
			  + (ENE_PAGESIZE - 1)) / ENE_PAGESIZE);
    tempPage = (UCHAR) (pDrvCtrl->nextPacket + pageCount);
    if (tempPage >= NE2000_PSTOP)
	tempPage -= (NE2000_PSTOP - NE2000_PSTART);
    if ((h.next != tempPage) ||
	(h.next < NE2000_PSTART) || (h.next >= NE2000_PSTOP))
	{
	/* can't trust anything now */
	pDrvCtrl->stats.badPacket++;
	pDrvCtrl->stats.rerror++;
	/* stop and restart the interface */
	if (!(pDrvCtrl->flags & (END_OVERWRITE|END_OVERWRITE2)))
	    ne2000Config (pDrvCtrl, TRUE);
	return (-1);
	}

    /* reject runts, although we are configured to reject them */
    if (packetSize < 60)
	{
	pDrvCtrl->stats.shortPacket++;
	goto doneGet;
	}

    /* reject packets larger than our scratch buffer */
    if (packetSize > NE2000_BUFSIZ)
	goto doneGet;

    if (h.rstat & RSTAT_PRX)
	{
	/* 3Com says this status marks a packet bit-shifted in memory;
	 * the data cannot be trusted but the NIC header is OK.
	 */
	if (h.rstat & (RSTAT_DFR | RSTAT_DIS))
	    {
	    pDrvCtrl->stats.badPacket++;
	    pDrvCtrl->stats.rerror++;
	    goto doneGet;
	    }
	pDrvCtrl->stats.rnoerror++;
	}
    else
	{
	if (h.rstat & RSTAT_DFR)
	    pDrvCtrl->stats.jabber++;
	pDrvCtrl->stats.rerror++;
	goto doneGet;
	}

    /* Signal that we received a good packet */

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美精品日日鲁夜夜添| 国产清纯美女被跳蛋高潮一区二区久久w | 91麻豆精东视频| 久久se这里有精品| 亚洲二区视频在线| 亚洲色图.com| 亚洲欧美激情一区二区| 国产精品不卡一区二区三区| 国产日韩成人精品| 国产精品理伦片| 国产精品人人做人人爽人人添 | 国产嫩草影院久久久久| 精品精品国产高清一毛片一天堂| 欧美男同性恋视频网站| 在线电影国产精品| 欧美高清www午色夜在线视频| 欧美日韩大陆在线| 日韩午夜中文字幕| 久久中文字幕电影| 亚洲丝袜另类动漫二区| 亚洲国产综合人成综合网站| 日韩—二三区免费观看av| 麻豆国产精品一区二区三区| 激情综合网激情| 福利一区福利二区| 色妞www精品视频| 欧美理论片在线| 精品国产亚洲在线| 成人欧美一区二区三区白人| 亚洲欧美日韩国产综合在线| 一区二区三区四区国产精品| 秋霞午夜鲁丝一区二区老狼| 国产一区二区三区黄视频| 91在线视频播放地址| 欧美男男青年gay1069videost| 欧美一区二区在线免费观看| 欧美国产精品中文字幕| 亚洲午夜日本在线观看| 久久国产精品第一页| 91视频在线看| 欧美一级二级三级乱码| 久久久青草青青国产亚洲免观| 国产精品剧情在线亚洲| 天堂在线亚洲视频| 不卡的av在线| 日韩视频一区二区三区在线播放| 国产人妖乱国产精品人妖| 午夜视频一区在线观看| 国产麻豆9l精品三级站| 欧美午夜片在线看| 国产视频一区二区三区在线观看| 艳妇臀荡乳欲伦亚洲一区| 久久国内精品视频| 99国产精品视频免费观看| 欧美一级二级三级乱码| 亚洲色欲色欲www在线观看| 日本美女一区二区| 色香色香欲天天天影视综合网| 精品国产乱码91久久久久久网站| 一区二区三区在线免费播放| 精品一区二区三区在线播放| 欧美视频在线一区| 中文字幕亚洲在| 国产一区二区三区国产| 日韩一区二区免费电影| 一区二区三区中文字幕精品精品| 国产99精品在线观看| 欧美mv和日韩mv的网站| 日韩高清不卡一区二区三区| 色噜噜狠狠成人网p站| 成人欧美一区二区三区视频网页| 成人黄色av电影| 欧美激情一区二区三区四区| 成人aa视频在线观看| 伊人开心综合网| 成人午夜视频在线| 在线免费观看视频一区| 国产精品二三区| av激情亚洲男人天堂| 国产精品毛片久久久久久| 国产成人av电影在线| 日本一区二区三区免费乱视频| 国产高清精品久久久久| 久久久久久久久久看片| 国产曰批免费观看久久久| www精品美女久久久tv| 精品一区二区三区视频| 久久在线观看免费| 国产91丝袜在线18| 亚洲乱码一区二区三区在线观看| 91理论电影在线观看| 亚洲永久免费视频| 在线亚洲人成电影网站色www| 中文字幕中文字幕一区二区| 国产成人三级在线观看| 自拍偷拍欧美激情| 欧美性欧美巨大黑白大战| 亚洲成av人**亚洲成av**| 777a∨成人精品桃花网| 麻豆成人免费电影| 国产色91在线| 91黄色小视频| 日本sm残虐另类| 国产日韩欧美精品电影三级在线| 成人黄色777网| 亚洲国产日韩一区二区| 精品少妇一区二区三区| www.日韩在线| 天天色天天操综合| 久久精品无码一区二区三区| 91亚洲精品乱码久久久久久蜜桃| 日韩专区中文字幕一区二区| 久久久精品蜜桃| 欧美一a一片一级一片| 午夜精品久久久| 亚洲国产精华液网站w| 欧美日韩一本到| 国产精品一区二区三区99| 亚洲精品久久7777| 精品99999| 欧美视频中文字幕| 国产精品羞羞答答xxdd| 亚洲成人1区2区| 久久一二三国产| 欧美日韩亚洲综合在线 欧美亚洲特黄一级 | 亚洲图片欧美色图| 精品日韩在线观看| 色视频成人在线观看免| 麻豆中文一区二区| 亚洲综合一区二区精品导航| 久久婷婷综合激情| 欧美久久久久久久久中文字幕| 国产91精品在线观看| 日本成人在线视频网站| 亚洲免费av观看| 精品成人a区在线观看| 欧美人狂配大交3d怪物一区| av中文字幕在线不卡| 国产一区二区三区精品欧美日韩一区二区三区 | 精品国产91洋老外米糕| 91国模大尺度私拍在线视频| 972aa.com艺术欧美| 亚洲国产精品精华液网站| 中文字幕不卡在线播放| 欧美大片日本大片免费观看| 精品视频全国免费看| 成人免费视频一区| 成人免费的视频| 久久精品99国产精品| 婷婷开心激情综合| 日韩激情视频网站| 蜜桃视频在线观看一区| 天堂av在线一区| 日本成人在线电影网| 美女看a上一区| 久久精品99国产精品日本| 国产伦精品一区二区三区在线观看| 国产综合久久久久影院| 国产一二三精品| 成人美女视频在线观看18| 成人av资源站| 在线一区二区三区| 欧美高清视频在线高清观看mv色露露十八 | 日韩亚洲电影在线| 欧美伊人久久大香线蕉综合69| 国产成人综合亚洲网站| 欧美一区三区四区| 日韩精品一区二区三区swag| 在线日韩国产精品| 久久69国产一区二区蜜臀| 亚洲主播在线播放| 国产精品你懂的在线欣赏| 成人免费的视频| 99久免费精品视频在线观看| 不卡影院免费观看| 亚洲成人自拍网| 午夜影院在线观看欧美| 久久国产精品99久久人人澡| 日韩av二区在线播放| 亚洲bt欧美bt精品| 欧美videos中文字幕| 国产98色在线|日韩| 专区另类欧美日韩| 亚洲永久精品大片| 亚洲国产成人av好男人在线观看| 一区二区三区久久| 狠狠色丁香久久婷婷综| 日韩精品成人一区二区三区| 亚洲3atv精品一区二区三区| 美女一区二区在线观看| 蜜臀99久久精品久久久久久软件| 午夜精品影院在线观看| 亚洲已满18点击进入久久| 激情五月播播久久久精品| 美腿丝袜亚洲三区| 国内成人免费视频| 麻豆精品视频在线| 欧美日韩一区二区在线观看| 欧美一区永久视频免费观看| 久久久久久久久伊人|