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

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

?? interrup.c

?? 使用網(wǎng)絡驅動器接口標準開發(fā)的ne2000網(wǎng)卡的NT驅動.
?? C
?? 第 1 頁 / 共 4 頁
字號:

            if (Status & (ISR_XMIT)) {


                IF_LOG( Ne2000Log('*'); )


                //
                // Update NextBufToXmit
                //
                Len = (Adapter->PacketLens[Adapter->CurBufXmitting] + 255) >> 8;
                NextBufToXmit = Adapter->NextBufToXmit + Len;

//                Adapter->NextBufToXmit += Len;

                if (NextBufToXmit == MAX_XMIT_BUFS) {
                    NextBufToXmit = 0;
                }

                if (Adapter->BufferStatus[NextBufToXmit] == EMPTY &&
                    Adapter->NextBufToFill != NextBufToXmit) {
                    NextBufToXmit = 0;
                }


                //
                // If the next packet is ready to go, start it.
                //
                if (Adapter->BufferStatus[NextBufToXmit] == FULL) {

                    //
                    // Ack the transmit
                    //

                    //
                    // Remove the packet from the packet list.
                    //
                    Adapter->NextBufToXmit = NextBufToXmit;
                    Packet = Adapter->Packets[Adapter->CurBufXmitting];
                    Adapter->Packets[Adapter->CurBufXmitting] = (PNDIS_PACKET)NULL;
                    SyncCardGetXmitStatus((PVOID)Adapter);


                    //
                    // Statistics
                    //
                    if (Adapter->XmitStatus & TSR_XMIT_OK) {

                        Adapter->FramesXmitGood++;
                        NdisStatus = NDIS_STATUS_SUCCESS;

                    } else {

                        Adapter->FramesXmitBad++;
                        NdisStatus = NDIS_STATUS_FAILURE;

                    }

                    for (i = Adapter->CurBufXmitting; i < Adapter->CurBufXmitting + Len; i++) {
                        Adapter->BufferStatus[i] = EMPTY;
                    }
                    Adapter->TransmitInterruptPending = FALSE;
                    NdisRawWritePortUchar(Adapter->IoPAddr+NIC_INTR_STATUS, (ISR_XMIT));
                    Adapter->CurBufXmitting = Adapter->NextBufToXmit;
                    Adapter->TransmitInterruptPending = TRUE;

                    IF_LOG( Ne2000Log('8'); )
                    Adapter->InterruptStatus &= ~(ISR_XMIT);
                    CardStartXmit(Adapter);

                } else {
                    NdisRawWritePortUchar(Adapter->IoPAddr+NIC_INTR_STATUS, (ISR_XMIT));
                    Adapter->InterruptStatus |= (Status);

                }

            }

        }

        return(NDIS_STATUS_SUCCESS);

    }

}


NDIS_STATUS
Ne2000Send(
    IN NDIS_HANDLE MiniportAdapterContext,
    IN PNDIS_PACKET Packet,
    IN UINT Flags
    )

/*++

Routine Description:


    The Ne2000Send request instructs a driver to transmit a packet through
    the adapter onto the medium.

Arguments:

    MiniportAdapterContext - Context registered with the wrapper, really
        a pointer to the adapter.

    Packet - A pointer to a descriptor for the packet that is to be
    transmitted.

    SendFlags - Optional send flags

Notes:

    This miniport driver will always accept a send.  This is because
    the Ne2000 has limited send resources and the driver needs packets
    to copy to the adapter immediately after a transmit completes in
    order to keep the adapter as busy as possible.

    This is not required for other adapters, as they have enough
    resources to keep the transmitter busy until the wrapper submits
    the next packet.

--*/

{
    PNE2000_ADAPTER Adapter = (PNE2000_ADAPTER)(MiniportAdapterContext);

    //
    // Put the packet on the send queue.
    //
    if (Adapter->FirstPacket == NULL) {
        Adapter->FirstPacket = Packet;
    } else {
        RESERVED(Adapter->LastPacket)->Next = Packet;
    }

    RESERVED(Packet)->Next = NULL;

    Adapter->LastPacket = Packet;

    //
    // Process the next send
    //
    Ne2000DoNextSend(Adapter);
    return(NDIS_STATUS_PENDING);

}

VOID
Ne2000DoNextSend(
    PNE2000_ADAPTER Adapter
    )

/*++

Routine Description:

    This routine examines if the packet at the head of the packet
    list can be copied to the adapter, and does so.

Arguments:

    Adapter - Pointer to the adapter block.

Return Value:

    None

--*/

{
    //
    // The packet to process.
    //
    PNDIS_PACKET Packet;

    //
    // The current destination transmit buffer.
    //
    XMIT_BUF TmpBuf1;

    //
    // Length of the packet
    //
    ULONG Len;

    //
    // Temporary looping variable
    //
    ULONG i;

    IF_LOG( Ne2000Log('s'); )

    //
    // Check if we have enough resources and a packet to process
    //
    while((Adapter->FirstPacket != NULL) &&
          (Adapter->BufferStatus[Adapter->NextBufToFill] == EMPTY)) {

        //
        // Get the length of the packet.
        //
        NdisQueryPacket(
            Adapter->FirstPacket,
            NULL,
            NULL,
            NULL,
            &Len
            );

        //
        // Convert length to the number of transmit buffers needed.
        //
        Len = (Len + 255) >> 8;

        //
        // If not transmitting
        //
        if (Adapter->CurBufXmitting == -1) {

            //
            // Then check from the next free buffer if the packet will
            // fit.
            //
            if (Adapter->BufferStatus[Adapter->NextBufToXmit] == EMPTY) {

                //
                // It won't fit at the end, so put it at the first buffer
                //
                if (Adapter->NextBufToFill + Len > MAX_XMIT_BUFS) {

                    Adapter->NextBufToFill = 0;

                }

            } else {

                //
                // Check if this packet will fit before the packet on the
                // adapter.
                //
                if (Adapter->NextBufToXmit > Adapter->NextBufToFill) {

                    if (Adapter->NextBufToFill + Len > Adapter->NextBufToXmit) {

                        IF_LOG( Ne2000Log('^'); )
                        IF_LOG( Ne2000Log('S'); )

                        break;

                    }

                } else {

                    //
                    // Check if it will fit after the packet already on the
                    // adapter.
                    //
                    if (Adapter->NextBufToFill + Len > MAX_XMIT_BUFS) {

                        Adapter->NextBufToFill = 0;

                        if (Adapter->NextBufToFill + Len > Adapter->NextBufToXmit){

                            IF_LOG( Ne2000Log('%'); )
                            IF_LOG( Ne2000Log('S'); )

                            break;

                        }

                    }

                }

            }

        } else {

            //
            // Check if the packet will fit before the packet currently
            // transmitting
            //

            if (Adapter->CurBufXmitting > Adapter->NextBufToFill) {

                if (Adapter->NextBufToFill + Len > Adapter->CurBufXmitting) {

                    IF_LOG( Ne2000Log('$'); )
                    IF_LOG( Ne2000Log('S'); )

                    break;
                }

            } else {

                //
                // Check if it will fit after the packet currently transmitting
                //
                if (Adapter->NextBufToFill + Len > MAX_XMIT_BUFS) {

                    Adapter->NextBufToFill = 0;

                    if (Adapter->NextBufToFill + Len > Adapter->CurBufXmitting){

                        IF_LOG( Ne2000Log('!'); )
                        IF_LOG( Ne2000Log('S'); )
                        break;

                    }

                }

            }

        }

        //
        // Set starting location
        //
        TmpBuf1 = Adapter->NextBufToFill;

        //
        // Remove the packet from the queue.
        //
        Packet = Adapter->FirstPacket;
        Adapter->FirstPacket = RESERVED(Packet)->Next;

        if (Packet == Adapter->LastPacket) {
            Adapter->LastPacket = NULL;
        }

        //
        // Store the packet in the list
        //
        Adapter->Packets[TmpBuf1] = Packet;

        //
        // Copy down the packet.
        //
        if (CardCopyDownPacket(Adapter, Packet,
                        &Adapter->PacketLens[TmpBuf1]) == FALSE) {

            for (i = TmpBuf1; i < TmpBuf1 + Len; i++) {
                Adapter->BufferStatus[i] = EMPTY;
            }
            Adapter->Packets[TmpBuf1] = NULL;
            IF_LOG( Ne2000Log('F'); )
            IF_LOG( Ne2000Log('S'); )

            NdisMSendComplete(
                Adapter->MiniportAdapterHandle,
                Packet,
                NDIS_STATUS_FAILURE
                );

            continue;

        }

        //
        // Pad short packets with blanks.
        //
        if (Adapter->PacketLens[TmpBuf1] < 60) {

            (VOID)CardCopyDown(
                    Adapter,
                    ((PUCHAR)Adapter->XmitStart +
                    TmpBuf1*TX_BUF_SIZE +
                    Adapter->PacketLens[TmpBuf1]),
                    BlankBuffer,
                    60-Adapter->PacketLens[TmpBuf1]
                    );

        }

        //
        // Set the buffer status
        //
        for (i = TmpBuf1; i < (TmpBuf1 + Len); i++) {
                Adapter->BufferStatus[i] = FULL;
        }

        //
        // Update next free buffer
        //
        Adapter->NextBufToFill += Len;

        if (Adapter->NextBufToFill == MAX_XMIT_BUFS) {
            Adapter->NextBufToFill = 0;
        }

        //
        // See whether to start the transmission.
        //
        if (Adapter->CurBufXmitting == -1) {

            //
            // OK to start transmission.
            //
            if (Adapter->BufferStatus[Adapter->NextBufToXmit] == EMPTY &&
                Adapter->NextBufToFill != Adapter->NextBufToXmit) {

                Adapter->NextBufToXmit = 0;

            }

            Adapter->CurBufXmitting = Adapter->NextBufToXmit;


            IF_LOG( Ne2000Log('4');)

            //
            // If we are currently handling an overflow, then we need to let
            // the overflow handler send this packet...
            //

            if (Adapter->BufferOverflow) {

                Adapter->OverflowRestartXmitDpc = TRUE;

                IF_LOG( Ne2000Log('O');)
                IF_LOUD( DbgPrint ("Adapter->OverflowRestartXmitDpc set:copy and send");)

            } else {

                //
                // This is used to check if stopping the chip prevented
                // a transmit complete interrupt from coming through (it
                // is cleared in the ISR if a transmit DPC is queued).
                //

                Adapter->TransmitInterruptPending = TRUE;

                IF_LOG( Ne2000Log('9'); )
                CardStartXmit(Adapter);

            }

        }

        //
        // Ack the send immediately.  If for some reason it
        // should fail, the protocol should be able to handle
        // the retransmit.
        //

        IF_LOG( Ne2000Log('S'); )

        NdisMSendComplete(
                Adapter->MiniportAdapterHandle,
                Packet,
                NDIS_STATUS_SUCCESS
                );
    }

}

VOID
OctogmetusceratorRevisited(
    IN PNE2000_ADAPTER Adapter
    )

/*++

Routine Description:

    Recovers the card from a transmit error.

Arguments:

    Adapter - pointer to the adapter block

Return Value:

    None.

--*/

{

    IF_LOUD( DbgPrint("Octogmetuscerator called!"); )

	IF_LOG( Ne2000Log('y'); )

    //
    // Ack the interrupt, if needed
    //
    NdisRawWritePortUchar(Adapter->IoPAddr+NIC_INTR_STATUS, ISR_XMIT_ERR);

    //
    // Stop the card
    //
    SyncCardStop(Adapter);

    //
    // Wait up to 1.6 milliseconds for any receives to finish
    //
    NdisStallExecution(2000);

    //
    // Place the card in Loopback
    //
    NdisRawWritePortUchar(Adapter->IoPAddr+NIC_XMIT_CONFIG, TCR_LOOPBACK);

    //
    // Start the card in Loopback
    //
    NdisRawWritePortUchar(Adapter->IoPAddr+NIC_COMMAND, CR_START | CR_NO_DMA);

    //
    // Get out of loopback and start the card
    //
    CardStart(Adapter);

    //
    // If there was a packet waiting to get sent, send it.
    //
    if (Adapter->CurBufXmitting != -1) {

        Adapter->TransmitInterruptPending = TRUE;
        CardStartXmit(Adapter);

    }
	IF_LOG( Ne2000Log('Y'); )
}


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
香蕉av福利精品导航| 欧美日韩免费高清一区色橹橹 | 91精品福利在线一区二区三区| 欧美一卡二卡在线| 亚洲欧美色一区| 婷婷国产在线综合| 91最新地址在线播放| 精品国产一区二区三区av性色 | 国产精品久久久久7777按摩| 日韩精品一二三| eeuss影院一区二区三区| 日韩一区二区三区三四区视频在线观看| 国产精品污网站| 久久国产精品色婷婷| 欧美日韩一区国产| 亚洲黄一区二区三区| 国产69精品久久久久毛片| 日韩一区二区在线看| 亚洲电影中文字幕在线观看| 91视频一区二区三区| 国产精品家庭影院| 高清在线成人网| 久久精品亚洲国产奇米99| 久久丁香综合五月国产三级网站| 欧美浪妇xxxx高跟鞋交| 天天综合日日夜夜精品| 欧美视频在线一区| 亚洲裸体xxx| 在线视频中文字幕一区二区| 亚洲乱码国产乱码精品精98午夜| jizzjizzjizz欧美| 一区二区日韩电影| 欧美日韩中文精品| 日韩电影在线观看网站| 91精品国产色综合久久ai换脸| 午夜伦欧美伦电影理论片| 日韩午夜精品视频| 久久超碰97人人做人人爱| 精品美女在线播放| 国产福利91精品一区| 国产精品日韩成人| 97se亚洲国产综合自在线观| 亚洲综合在线五月| 3atv一区二区三区| 国产一区在线观看视频| 中文字幕免费一区| 色94色欧美sute亚洲13| 天堂影院一区二区| 精品少妇一区二区三区视频免付费 | 美脚の诱脚舐め脚责91 | 日本欧美加勒比视频| 欧美电视剧免费观看| 国产精品亚洲人在线观看| 国产清纯在线一区二区www| www.久久久久久久久| 无吗不卡中文字幕| 2020国产精品自拍| 91麻豆123| 美女脱光内衣内裤视频久久网站 | 国产精品一区专区| 亚洲欧美日韩国产中文在线| 欧美日韩中文字幕一区| 国产精品18久久久久久久久| 亚洲色欲色欲www| 91精品麻豆日日躁夜夜躁| 国产精品系列在线播放| 亚洲午夜三级在线| 欧美精品一区二区三区很污很色的| www.亚洲免费av| 免费在线看一区| 1024亚洲合集| 欧美v日韩v国产v| 91色综合久久久久婷婷| 久久成人av少妇免费| 亚洲一区在线观看网站| 久久综合久久综合久久综合| 欧洲亚洲精品在线| 国产成人在线影院| 日韩av高清在线观看| 亚洲人亚洲人成电影网站色| 日韩欧美国产小视频| 色综合久久综合网欧美综合网| 免费三级欧美电影| 一区二区不卡在线播放| 国产三级一区二区| 日韩一区二区三区四区五区六区| 一本色道久久综合精品竹菊| 国产精品99精品久久免费| 视频一区二区不卡| 亚洲黄色在线视频| 中文字幕中文字幕一区二区| 精品久久久久久久久久久久久久久久久 | 日韩精品中文字幕一区二区三区 | 亚洲午夜精品网| 国产精品久久久久久久久动漫 | 日本电影欧美片| 成人av在线播放网站| 韩国中文字幕2020精品| 亚洲国产精品一区二区尤物区| 国产精品九色蝌蚪自拍| 欧美激情一区不卡| 337p粉嫩大胆噜噜噜噜噜91av| 欧美伦理电影网| 欧美亚洲愉拍一区二区| 91麻豆国产福利精品| 93久久精品日日躁夜夜躁欧美| 成人免费三级在线| 国产成+人+日韩+欧美+亚洲| 国内外成人在线| 久久av资源站| 久久成人免费日本黄色| 99久久er热在这里只有精品15| 国产精品正在播放| 精品一区二区三区在线观看国产 | 欧美成人激情免费网| 91麻豆精品国产91久久久久久 | 日韩精品免费专区| 日韩在线一二三区| 视频一区在线视频| 蜜桃视频一区二区三区| 免费高清在线视频一区·| 麻豆91精品91久久久的内涵| 看电视剧不卡顿的网站| 久久国产夜色精品鲁鲁99| 久草热8精品视频在线观看| 精品一区二区三区欧美| 国产成人午夜99999| 国产999精品久久久久久绿帽| 成人永久看片免费视频天堂| fc2成人免费人成在线观看播放| 99久久99久久综合| 欧美狂野另类xxxxoooo| 久久伊人中文字幕| 欧美激情一区二区三区蜜桃视频| 国产精品天干天干在线综合| 自拍偷拍国产亚洲| 亚洲二区在线观看| 久久99国产精品免费| 丰满少妇久久久久久久| 欧美专区亚洲专区| 555www色欧美视频| 久久久久久久精| 一区二区在线观看视频| 丝袜美腿亚洲色图| 国产二区国产一区在线观看| 99久久er热在这里只有精品66| 欧美日韩在线观看一区二区 | 一区二区三区在线观看网站| 日本人妖一区二区| 97精品久久久午夜一区二区三区 | 亚洲免费观看高清完整版在线观看熊| 亚洲国产精品影院| 国产高清在线精品| 欧美视频在线观看一区| 精品国产免费人成在线观看| 国产精品二区一区二区aⅴ污介绍| 亚洲大片一区二区三区| 国产乱码精品一区二区三区五月婷| 99久久婷婷国产综合精品电影 | 亚洲人成在线观看一区二区| 男人的j进女人的j一区| proumb性欧美在线观看| 日韩小视频在线观看专区| 亚洲免费资源在线播放| 麻豆91在线播放免费| 欧美性淫爽ww久久久久无| 久久免费看少妇高潮| 亚洲电影一区二区三区| 大陆成人av片| 精品裸体舞一区二区三区| 亚洲国产另类精品专区| av在线这里只有精品| 欧美videossexotv100| 一区二区三区日韩欧美精品| 国产精品一区二区无线| 欧美一级精品在线| 亚洲一区二区三区四区的| 国产精华液一区二区三区| 欧美一区二区三区免费视频 | 国产欧美视频在线观看| 蜜芽一区二区三区| 欧美性受xxxx| 亚洲欧美日韩在线播放| 成人精品电影在线观看| 久久影院午夜片一区| 免费看日韩a级影片| 欧美日韩精品是欧美日韩精品| 亚洲欧美日韩电影| 不卡电影一区二区三区| 久久久国际精品| 国内成人精品2018免费看| 在线成人午夜影院| 日韩不卡一区二区| 91麻豆精品国产自产在线 | 日韩精品一区二区三区四区视频| 亚洲精品伦理在线| 一本色道**综合亚洲精品蜜桃冫| 欧美激情一区三区| 成人美女视频在线看| 国产精品视频yy9299一区|