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

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

?? htc_recv.c

?? WLAN在AR6000程序中的驅動代碼
?? C
字號:
//------------------------------------------------------------------------------
// <copyright file="htc_recv.c" company="Atheros">
//    Copyright (c) 2006 Microsoft Corporation.  All rights reserved.
//    Copyright (c) 2006 Atheros Corporation.  All rights reserved.
//
//    The use and distribution terms for this software are covered by the
//    Microsoft Limited Permissive License (Ms-LPL) 
//    http://www.microsoft.com/resources/sharedsource/licensingbasics/limitedpermissivelicense.mspx 
//    which can be found in the file MS-LPL.txt at the root of this distribution.
//    By using this software in any fashion, you are agreeing to be bound by
//    the terms of this license.
//
//    You must not remove this notice, or any other, from this software.
// </copyright>
// 
// <summary>
//    Windows CE Wifi Driver for AR-6000
// </summary>
//------------------------------------------------------------------------------
//==============================================================================
// This file contains the routines handling the receive path.
//
// Author(s): ="Atheros"
//==============================================================================


#include "htc_internal.h"

/* ------ Global Variable Declarations ------- */
#ifdef DEBUG
extern A_UINT32 debughtc;
#endif

/* ------ Static Variables ------ */


/* ------ Functions ------ */
/* Makes a buffer available to the HTC module */
A_STATUS 
HTCBufferReceive(HTC_TARGET *target, 
                 HTC_ENDPOINT_ID endPointId,
                 A_UCHAR *buffer, 
                 A_UINT32 length,
                 void *cookie)
{
    A_STATUS status;
    HTC_ENDPOINT *endPoint;
    HTC_DATA_REQUEST_QUEUE *recvQueue;

    HTC_DEBUG_PRINTF(ATH_LOG_TRC | ATH_LOG_RECV, 
                    "HTCBufferReceive: Enter (endPointId: %d, buffer: 0x%p, length: %d, cookie: 0x%p)\n", endPointId, buffer, length, cookie);

    AR_DEBUG_ASSERT((endPointId >= ENDPOINT1) && (endPointId <= ENDPOINT4));

    /* Extract the end point instance */
    endPoint = &target->endPoint[endPointId];
    AR_DEBUG_ASSERT(endPoint != NULL);

    recvQueue = &endPoint->recvQueue;
    HTC_DEBUG_PRINTF(ATH_LOG_INF | ATH_LOG_RECV, "recvQueue: %p\n", 
                    recvQueue);

    /* Add this posted buffer to the pending receive queue */
    status = addToMboxQueue(recvQueue, buffer, length, 0, cookie);
    if (status != A_OK) {
        HTC_DEBUG_PRINTF(ATH_LOG_ERR | ATH_LOG_RECV,
                        "Mailbox (%d) Send queue full. Unable to add buffer\n", 
                        GET_ENDPOINT_ID(endPoint));
        return A_ERROR;
    }

    /* 
     * If this API was called as a result of a HTC_DATA_AVAILABLE event to
     * the upper layer, indicating that HTC is out of buffers, then we should
     * receive the frame in the buffer supplied otherwise we simply add the 
     * buffer to the Pending Receive Queue 
     */
    if (endPoint->rxLengthPending) {
        htcReceiveFrame(endPoint);
    }

    HTC_DEBUG_PRINTF(ATH_LOG_TRC | ATH_LOG_RECV, 
                    "HTCBufferReceive: Exit\n");
    return A_OK;
}

void
htcReceiveFrame(HTC_ENDPOINT *endPoint)
{
    A_STATUS status;
    A_UINT32 address;
    A_UINT32 paddedLength;
    A_UINT32 frameLength;
    HIF_REQUEST request;
    HTC_ENDPOINT_ID endPointId;
    HTC_QUEUE_ELEMENT *element;
    HTC_MBOX_BUFFER *mboxBuffer;
    HTC_DATA_REQUEST_QUEUE *recvQueue;
    HTC_TARGET *target;
    HTC_EVENT_INFO eventInfo;
    HIF_DATAMODE dmode;

    HTC_DEBUG_PRINTF(ATH_LOG_TRC | ATH_LOG_RECV, 
                    "htcReceiveFrame - Enter\n");

    /* Get the context */
    AR_DEBUG_ASSERT(endPoint != NULL);
    endPointId = GET_ENDPOINT_ID(endPoint);
    target = endPoint->target;
    AR_DEBUG_ASSERT(target != NULL);
    recvQueue = &endPoint->recvQueue;
    AR_DEBUG_ASSERT(recvQueue != NULL);

    /* 
     * Receive the frame if we have any pending frames and a buffer to
     * receive it into.
     */
     if (IS_DATA_QUEUE_EMPTY(recvQueue)) {
         HTC_DEBUG_PRINTF(ATH_LOG_WARN | ATH_LOG_RECV,
                         "Mailbox (%d) recv queue empty. Unable to remove buffer\n", endPointId);

         /* 
          * Communicate this situation to the host via the HTC_DATA_AVAILABLE
          * event to request some buffers in the queue.
          */
         endPoint->rxLengthPending = htcGetFrameLength(endPoint);
         AR_DEBUG_ASSERT(endPoint->rxLengthPending);
         FRAME_EVENT(eventInfo, NULL, endPoint->rxLengthPending, 
                     0, A_OK, NULL);
         dispatchEvent(target, endPointId, HTC_DATA_AVAILABLE, &eventInfo);
         return;
     }

     /* 
      * Get the length from the lookahead register if there is nothing 
      * pending.
      */
     if (endPoint->rxLengthPending) {
         frameLength = endPoint->rxLengthPending;
         endPoint->rxLengthPending = 0;
     } else {
         frameLength = htcGetFrameLength(endPoint);
     }
     
     if (frameLength > HTC_MESSAGE_SIZE_MAX) {
	     return;
     }
     
     HTC_DEBUG_PRINTF(ATH_LOG_INF | ATH_LOG_RECV, "Frame Length: %d\n", 
                     frameLength);

     /* Adjust the length to be a multiple of block size if appropriate */
     paddedLength = (frameLength + (endPoint->blockSize - 1)) &
                    (~(endPoint->blockSize - 1));

     /* 
      * Receive the frame(s). Pull an empty buffer from the head of the 
      * Pending Receive Queue.
      */
     element = removeFromMboxQueue(recvQueue);
     mboxBuffer = GET_MBOX_BUFFER(element);
     mboxBuffer->actualLength = paddedLength;
     dmode = (endPoint->blockSize > 1) ? HIF_BLOCK_BASIS : HIF_BYTE_BASIS;
     HIF_FRAME_REQUEST(&request, HIF_READ, HIF_EXTENDED_IO, 
                       HIF_ASYNCHRONOUS, dmode, HIF_FIXED_ADDRESS);
     address = HIF_MBOX_END_ADDR(endPointId);
     status = HIFReadWrite(target->device, address, mboxBuffer->buffer, 
                           mboxBuffer->actualLength, &request, element);
#ifndef HTC_SYNC
     if (status != A_OK) {
#else
     if (status != A_OK && status != A_PENDING) {
#endif
         HTC_DEBUG_PRINTF(ATH_LOG_ERR | ATH_LOG_RECV, 
                         "Frame reception failed\n");
         if (!IS_ELEMENT_FREE(element)) {
             mboxBuffer->actualLength = 0;
             FRAME_EVENT(eventInfo, mboxBuffer->buffer, 
                         mboxBuffer->bufferLength, mboxBuffer->actualLength, 
                         A_ERROR, mboxBuffer->cookie);
             RECYCLE_DATA_REQUEST_ELEMENT(element);
             dispatchEvent(target, endPointId, HTC_BUFFER_RECEIVED, 
                           &eventInfo);
             HTC_DEBUG_PRINTF(ATH_LOG_TRC | ATH_LOG_RECV, 
                             "htcReceiveFrame - Exit\n");
             return;
         }
     }
#ifdef HTC_SYNC
	else if (status == A_OK) {
		element->completionCB(element, status);
	}
#endif

    HTC_DEBUG_PRINTF(ATH_LOG_TRC | ATH_LOG_RECV, 
                    "htcReceiveFrame - Exit\n");
}

A_UINT32
htcGetFrameLength(HTC_ENDPOINT *endPoint)
{
    HTC_TARGET *target;
    A_UINT32 frameLength;
    HTC_ENDPOINT_ID endPointId;

    /* Get the context */
    AR_DEBUG_ASSERT(endPoint != NULL);
    target = endPoint->target;
    AR_DEBUG_ASSERT(target != NULL);
    endPointId = GET_ENDPOINT_ID(endPoint);

    AR_DEBUG_ASSERT(target->table.rx_lookahead_valid & (1 << endPointId));

    /* The length is contained in the first two bytes - HTC_HEADER_LEN */
    frameLength = (target->table.rx_lookahead[endPointId] & 0xFFFF) +
                  HTC_HEADER_LEN;
    AR_DEBUG_ASSERT(frameLength);

    return frameLength;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲日本在线天堂| 欧美男人的天堂一二区| 日韩午夜激情视频| 国产精品丝袜黑色高跟| 国产伦精品一区二区三区免费迷 | 最新热久久免费视频| 极品销魂美女一区二区三区| 色综合久久综合中文综合网| 国产日韩三级在线| 95精品视频在线| 538在线一区二区精品国产| 亚洲精品日产精品乱码不卡| 久久91精品久久久久久秒播| 欧美一区二区黄| 日韩精品电影在线观看| 在线视频一区二区三区| 曰韩精品一区二区| 色屁屁一区二区| 久久久激情视频| 国产精品亚洲人在线观看| 精品国产一区二区国模嫣然| 亚洲制服丝袜av| 在线观看国产日韩| 日韩国产在线一| 日韩欧美成人午夜| 国产精品中文有码| 国产精品夫妻自拍| 色婷婷av一区| 日韩国产精品久久久| 5月丁香婷婷综合| 裸体歌舞表演一区二区| 久久综合九色综合97婷婷| 国产激情视频一区二区三区欧美| 国产调教视频一区| 一本大道久久a久久综合| 亚洲一区影音先锋| 日韩天堂在线观看| 国产乱码精品一区二区三区av| 国产午夜精品一区二区三区嫩草| heyzo一本久久综合| 欧美精品黑人性xxxx| 欧美日韩国产首页在线观看| 免费美女久久99| 欧美成人三级电影在线| 成人成人成人在线视频| 亚洲精品伦理在线| 日本电影欧美片| 日本大胆欧美人术艺术动态| 制服.丝袜.亚洲.中文.综合| 国产乱国产乱300精品| 最新久久zyz资源站| 91麻豆国产自产在线观看| 亚洲宅男天堂在线观看无病毒| va亚洲va日韩不卡在线观看| 美女在线一区二区| 亚洲综合一区二区精品导航| 国产色产综合色产在线视频| 欧美日韩亚洲高清一区二区| 99re8在线精品视频免费播放| 美女视频一区二区三区| 一区二区三区成人| 国产精品天天看| 久久久99精品免费观看| 日韩一级片网址| 欧美精品乱码久久久久久按摩| 91香蕉国产在线观看软件| 国产成人aaa| 国产一区久久久| 免费黄网站欧美| 亚洲午夜久久久久| 亚洲男同1069视频| 国产精品久久午夜| 国产精品网友自拍| 国产精品日韩成人| 日本一区二区三级电影在线观看 | 国产99一区视频免费| 男女视频一区二区| 丝袜美腿亚洲色图| 日韩国产精品久久久| 午夜精品福利在线| 亚洲一本大道在线| 亚洲国产精品久久久久婷婷884| 亚洲三级在线免费观看| 中文字幕在线不卡国产视频| 国产精品久久久久影视| 136国产福利精品导航| 国产精品九色蝌蚪自拍| 国产精品电影一区二区三区| 国产精品久久久久久久岛一牛影视| 国产亚洲制服色| 国产精品欧美久久久久一区二区| 久久精品人人爽人人爽| 国产精品无码永久免费888| 国产精品国产馆在线真实露脸| 国产精品三级久久久久三级| 国产精品久久久久9999吃药| 亚洲美女少妇撒尿| 亚洲超碰97人人做人人爱| 午夜影院在线观看欧美| 蜜臀久久99精品久久久久久9| 蜜桃视频第一区免费观看| 狠狠色综合日日| 成人一道本在线| 色综合久久天天| 欧美肥大bbwbbw高潮| 日韩欧美国产午夜精品| 久久久久97国产精华液好用吗| 国产精品久久综合| 性欧美大战久久久久久久久| 奇米影视一区二区三区小说| 国产激情一区二区三区桃花岛亚洲| 国产成人av一区二区| 色婷婷av久久久久久久| 91精品国产综合久久久久| 久久久久久久免费视频了| 亚洲日本在线观看| 老司机精品视频线观看86| 国产精品一区一区| 色悠久久久久综合欧美99| 日韩一区二区三区在线观看| 亚洲国产精品成人综合| 亚洲国产一区视频| 欧美亚洲高清一区二区三区不卡| 欧美日韩亚洲不卡| 国产视频一区在线观看| 亚洲午夜成aⅴ人片| 国产精品影音先锋| 精品视频1区2区| 久久久国际精品| 午夜久久久久久电影| 丁香婷婷综合激情五月色| 欧美日韩久久久| 国产精品视频线看| 麻豆精品在线播放| 欧美日韩一区二区三区高清| 日本一区二区在线不卡| 日韩av网站在线观看| 色婷婷久久久亚洲一区二区三区| 精品国产伦一区二区三区免费 | 国产精品一级在线| 日本高清不卡aⅴ免费网站| 久久午夜免费电影| 日韩中文字幕一区二区三区| av电影一区二区| 久久色在线视频| 日本伊人色综合网| 91成人在线免费观看| 国产精品福利影院| 国产自产高清不卡| 日韩一区二区三区高清免费看看| 亚洲免费观看高清完整版在线观看| 国产真实乱对白精彩久久| 欧美一级夜夜爽| 亚洲一区二区三区三| 一本色道综合亚洲| 中文字幕一区二区在线观看 | 亚洲日本青草视频在线怡红院| 国内国产精品久久| 欧美一区二区国产| 日韩av电影一区| 欧美日韩亚洲国产综合| 亚洲一区二区综合| 99v久久综合狠狠综合久久| 国产日韩欧美精品在线| 国模少妇一区二区三区| 精品欧美乱码久久久久久 | 免费在线看一区| 欧美综合一区二区三区| 亚洲一级二级三级在线免费观看| 不卡的电影网站| 日韩中文字幕不卡| 欧美伊人精品成人久久综合97| 一区二区三区成人在线视频| 91蝌蚪国产九色| 亚洲精品免费在线观看| 在线一区二区三区四区| 亚洲成人一区在线| 欧美日韩一区二区在线视频| 性做久久久久久免费观看欧美| 欧美视频一区二区| 午夜国产精品一区| 91精品国产综合久久久久久久久久 | 色丁香久综合在线久综合在线观看| 亚洲视频一区在线| 欧美在线视频你懂得| 亚洲福利视频一区二区| 欧美精品乱码久久久久久| 日韩综合在线视频| 337p粉嫩大胆色噜噜噜噜亚洲| 国产一区啦啦啦在线观看| 日本一区二区成人在线| 99久久伊人精品| 亚洲影视在线播放| 日韩三级免费观看| 国产一区二区三区视频在线播放| 亚洲国产高清在线观看视频| 91浏览器入口在线观看| 午夜免费久久看| 精品国产乱码久久久久久影片| 大美女一区二区三区|