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

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

?? htc_send.c

?? WLAN在AR6000程序中的驅動代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
//------------------------------------------------------------------------------
// <copyright file="htc_send.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 transmit path.
//
// Author(s): ="Atheros"
//==============================================================================


#include "htc_internal.h"

/* ------ Global Variable Declarations ------- */
extern A_MUTEX_T creditCS,txCS;

#ifdef DEBUG
extern A_UINT32 debughtc;
extern A_UINT32 txcreditsavailable[HTC_MAILBOX_NUM_MAX];
extern A_UINT32 txcreditsconsumed[HTC_MAILBOX_NUM_MAX];
#ifdef HTC_SYNC
extern A_UINT32 txcreditintrenable[HTC_MAILBOX_NUM_MAX];
extern A_UINT32 txcreditintrenableaggregate[HTC_MAILBOX_NUM_MAX];
#endif
#endif

extern A_UINT32 tx_attempt[HTC_MAILBOX_NUM_MAX];  /* Num of attempts to add */
extern A_UINT32 tx_post[HTC_MAILBOX_NUM_MAX];     /* Num of attemps succeded */
extern A_UINT32 tx_complete[HTC_MAILBOX_NUM_MAX]; /* Num of tx complete */

void htcSendFrameLocked(HTC_ENDPOINT *endPoint);

/* ------ Functions ------ */
A_STATUS 
HTCBufferSend(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 *sendQueue;

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

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

    /* Extract the end point instance */
    endPoint = &target->endPoint[endPointId];
    AR_DEBUG_ASSERT(endPoint != NULL);
    sendQueue = &endPoint->sendQueue;
    AR_DEBUG_ASSERT(sendQueue != NULL);
    HTC_DEBUG_PRINTF(ATH_LOG_INF | ATH_LOG_SEND, 
                    "mboxQueue: %p\n", sendQueue);

    /* 
     * Add this posted buffer to the pending send queue. We need to allocate 
     * a bufferElement to store the packet information and we borrow that 
     * buffer from the pending send queue. If circumstances allow us to 
     * transmit it right away then we dequeue it otherwise we let it remain 
     * to be picked in the interrupt handler context.
     */
    tx_attempt[endPointId] += 1;

    if (!endPoint->enabled) {
        HTC_DEBUG_PRINTF(ATH_LOG_ERR | ATH_LOG_SEND, "Endpoint not enabled: %d\n", 
                                        GET_ENDPOINT_ID(endPoint));
        HTC_DEBUG_PRINTF(ATH_LOG_ERR | ATH_LOG_SEND, 
                        "tx_attempt[%d] = %d, tx_post[%d] = %d, tx_complete[%d] = %d\n", endPointId, tx_attempt[endPointId], endPointId, tx_post[endPointId], endPointId, tx_complete[endPointId]);
        return A_ERROR;
    }

    status = addToMboxQueue(sendQueue, buffer, length, 0, cookie);
    if (status != A_OK) {
        HTC_DEBUG_PRINTF(ATH_LOG_ERR | ATH_LOG_SEND,
                        "Mailbox (%d) PSQ full. Unable to add buffer\n", 
                         endPointId);
        HTC_DEBUG_PRINTF(ATH_LOG_ERR | ATH_LOG_SEND, 
                        "tx_attempt[%d] = %d, tx_post[%d] = %d, tx_complete[%d] = %d\n", endPointId, tx_attempt[endPointId], endPointId, tx_post[endPointId], endPointId, tx_complete[endPointId]);
        return A_ERROR;
    }

    tx_post[endPointId] += 1;

    /* 
     * The frame shall be dequeued and sent if there are any credits 
     * available. 
     */
    htcSendFrame(endPoint);

    HTC_DEBUG_PRINTF(ATH_LOG_TRC | ATH_LOG_SEND, "HTCBufferSend: Exit\n");
    return A_OK;
}

void
htcSendFrame(HTC_ENDPOINT *endPoint) 
{
	A_MUTEX_LOCK(&txCS);	
	htcSendFrameLocked(endPoint);
	A_MUTEX_UNLOCK(&txCS);
}

void 
htcSendFrameLocked(HTC_ENDPOINT *endPoint) 
{
    A_STATUS status;
    A_UINT32 address;
    HIF_DATAMODE dmode;
    HTC_TARGET *target;
    HIF_REQUEST request;
    A_UINT32 frameLength;
    A_UINT32 paddedLength;
    HTC_EVENT_INFO eventInfo;
#ifdef ONLY_16BIT
    A_UINT16 txCreditsConsumed;
    A_UINT16 txCreditsAvailable;
#else
    A_UINT8 txCreditsConsumed;
    A_UINT8 txCreditsAvailable;
#endif
    HTC_ENDPOINT_ID endPointId;
    HTC_QUEUE_ELEMENT *element;
    HTC_MBOX_BUFFER *mboxBuffer;
    HTC_REG_REQUEST_LIST *regList;
    HTC_DATA_REQUEST_QUEUE *sendQueue;
#ifdef HTC_SYNC
    HTC_REG_BUFFER *regBuffer;
#endif

    HTC_DEBUG_PRINTF(ATH_LOG_TRC | ATH_LOG_SEND, "htcSendFrame - Enter\n");

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

    /* 
     * Transmit the frames as long as we have the credits available and
     * the queue is not out of them 
     */
    HTC_DEBUG_PRINTF(ATH_LOG_SYNC,
                    "Critical Section (credit): LOCK at line %d in file %s\n", __LINE__, __FILE__);
    A_MUTEX_LOCK(&creditCS);
    txCreditsAvailable = GET_TX_CREDITS_AVAILABLE(endPoint);
    txCreditsConsumed = GET_TX_CREDITS_CONSUMED(endPoint);
    SET_TX_CREDITS_AVAILABLE(endPoint, 0);
    SET_TX_CREDITS_CONSUMED(endPoint, txCreditsConsumed + txCreditsAvailable);
    HTC_DEBUG_PRINTF(ATH_LOG_SYNC,
                    "Critical Section (credit): UNLOCK at line %d in file %s\n", __LINE__, __FILE__);
    A_MUTEX_UNLOCK(&creditCS);

    if (!txCreditsAvailable) {
        return;
    }

    /* 
     * Send the packet only when there are packets to be sent and there
     * are positive number of credits available.
     */
    while((!IS_DATA_QUEUE_EMPTY(sendQueue)) && txCreditsAvailable)
    {
        /* Get the request buffer from the Pending Send Queue */
        element = removeFromMboxQueue(sendQueue);
        mboxBuffer = GET_MBOX_BUFFER(element);

        /* 
         * Prepend the actual length in the first 2 bytes of the outgoing 
         * packet.
         */
        mboxBuffer->buffer -= HTC_HEADER_LEN;
        A_MEMCPY(mboxBuffer->buffer, &mboxBuffer->bufferLength, HTC_HEADER_LEN);

        /* 
         * Adjust the length in the block mode only when its not an integral 
         * multiple of the block size. Assumption is that the block size is
         * a power of 2.
         */
        frameLength = mboxBuffer->bufferLength + HTC_HEADER_LEN;
        paddedLength = (frameLength + (endPoint->blockSize - 1)) & 
                       (~(endPoint->blockSize - 1));
        mboxBuffer->actualLength = paddedLength;
        HTC_DEBUG_PRINTF(ATH_LOG_INF | ATH_LOG_SEND,  
                        "Original frame length: %d, Padded frame length: %d\n", frameLength, paddedLength);

        HTC_DEBUG_PRINTBUF(mboxBuffer->buffer, (A_UINT16)mboxBuffer->actualLength);
        HTC_DEBUG_PRINTF(ATH_LOG_INF | ATH_LOG_SEND,  
                        "Available Tx credits: %d\n", txCreditsAvailable);

        /* Frame the interface request */
        dmode = (endPoint->blockSize > 1) ? HIF_BLOCK_BASIS : HIF_BYTE_BASIS;
        HIF_FRAME_REQUEST(&request, HIF_WRITE, HIF_EXTENDED_IO, 
                          HIF_ASYNCHRONOUS, dmode, HIF_INCREMENTAL_ADDRESS);
        address = HIF_MBOX_START_ADDR(endPointId);

        /* Send the data to the bus driver */
        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) {

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产一区二区三区在线观看精品| 91麻豆精品国产91久久久资源速度 | 精品欧美久久久| 亚洲精品videosex极品| 国产精品自在欧美一区| 7878成人国产在线观看| 亚洲国产精品自拍| 一本一本久久a久久精品综合麻豆| 久久精品无码一区二区三区| 日本不卡高清视频| www.激情成人| 中文文精品字幕一区二区| 国产一区激情在线| 欧美国产精品久久| 国产成人免费在线视频| 国产精品污网站| 成人性视频免费网站| 国产欧美视频在线观看| 成人性色生活片| 夜夜揉揉日日人人青青一国产精品| 99综合电影在线视频| 综合精品久久久| 3atv在线一区二区三区| 亚洲成人免费av| 久久一留热品黄| 99国产欧美久久久精品| 亚洲一区在线观看视频| 日韩亚洲欧美高清| 国产电影一区二区三区| 亚洲欧美一区二区三区孕妇| 在线不卡a资源高清| 国产91精品一区二区麻豆网站 | 欧美一区二区三区在| 国产成人午夜精品5599 | 69p69国产精品| 国产在线麻豆精品观看| 亚洲精品日产精品乱码不卡| 蜜臀精品一区二区三区在线观看| 日韩一区二区不卡| 成人性视频网站| 日韩影院免费视频| 久久久精品国产99久久精品芒果| 日韩成人伦理电影在线观看| 精品第一国产综合精品aⅴ| 成人国产精品免费| 亚洲福利国产精品| 亚洲图片你懂的| 欧美一区二区三区视频免费播放| 日韩av不卡在线观看| 久久精品人人做人人综合| 色婷婷av一区二区三区大白胸| 国产精品欧美久久久久无广告| 色先锋aa成人| 成人小视频在线| 国内成人精品2018免费看| 亚洲少妇30p| 久久精品夜夜夜夜久久| 欧美一区二区在线看| www.日韩在线| 国产不卡免费视频| 亚洲午夜激情网页| 亚洲私人黄色宅男| 亚洲国产高清在线观看视频| 91精品国产综合久久香蕉的特点| 色综合久久久久综合99| 丁香激情综合五月| 国产91综合一区在线观看| 亚洲电影激情视频网站| 亚洲免费资源在线播放| 亚洲乱码中文字幕综合| 亚洲精品免费在线| 一区二区三区四区激情| 亚洲激情校园春色| 亚洲成av人综合在线观看| 天堂va蜜桃一区二区三区漫画版| 亚洲欧美日韩中文字幕一区二区三区 | 99久久亚洲一区二区三区青草| 国产+成+人+亚洲欧洲自线| 国产精品亚洲专一区二区三区| 免费一级片91| 国产69精品一区二区亚洲孕妇| 男人操女人的视频在线观看欧美| 亚洲欧美另类小说| 亚洲a一区二区| 国产91高潮流白浆在线麻豆| 色婷婷久久一区二区三区麻豆| 99视频精品在线| 欧美色窝79yyyycom| 91国模大尺度私拍在线视频| 日韩一区二区三区三四区视频在线观看 | 欧美做爰猛烈大尺度电影无法无天| 欧美在线一区二区| 麻豆免费看一区二区三区| 亚洲伊人伊色伊影伊综合网| 久久久久国色av免费看影院| 亚洲国产日韩一级| av在线不卡电影| 精品国产一区二区国模嫣然| 伊人性伊人情综合网| 激情欧美日韩一区二区| 欧美男人的天堂一二区| 亚洲久草在线视频| 国产精品99久久久久| 91精品国产综合久久精品性色 | 久久亚洲精精品中文字幕早川悠里| 亚洲免费观看高清完整版在线观看熊| 国产一区二区免费在线| 日韩视频一区二区三区 | 成人欧美一区二区三区视频网页| 激情综合网天天干| 91精品国产日韩91久久久久久| 亚洲亚洲人成综合网络| 色婷婷国产精品| 亚洲三级久久久| www.欧美日韩国产在线| 国产精品国产三级国产普通话99 | 国产一区三区三区| 欧美xxxxx裸体时装秀| 日本不卡的三区四区五区| 欧美日韩一级视频| 午夜精品久久久久| 欧美巨大另类极品videosbest | 欧美日韩成人一区二区| 亚洲伦理在线免费看| 色屁屁一区二区| 一区二区三区精品视频| 在线视频综合导航| 一区二区三区小说| 精品1区2区3区| 日韩国产欧美三级| 91精品欧美久久久久久动漫 | 亚洲一区成人在线| 欧美中文字幕久久| 亚洲电影在线播放| 欧美狂野另类xxxxoooo| 日韩精品电影一区亚洲| 日韩美女在线视频| 国产在线播放一区二区三区| 久久久久久久久久电影| 成人性生交大片免费看视频在线| 国产精品久久久久久福利一牛影视 | 亚洲成人福利片| 欧美精品 国产精品| 日韩不卡手机在线v区| 欧美xxxxx裸体时装秀| 久久99国产乱子伦精品免费| 欧美电影一区二区三区| 蜜臀av性久久久久蜜臀aⅴ| 久久色在线视频| 成人高清视频在线| 亚洲午夜精品一区二区三区他趣| 欧美日韩免费视频| 六月丁香婷婷久久| 国产精品萝li| 欧美三级蜜桃2在线观看| 日本欧美一区二区| 久久影音资源网| 色综合久久久久综合| 日韩成人精品在线| 国产精品毛片久久久久久| 欧美日韩中文字幕一区| 久久机这里只有精品| 国产精品视频yy9299一区| 欧美日韩免费视频| 国产精品一二三四区| 亚洲愉拍自拍另类高清精品| 欧美一区二区三区免费观看视频| 国产一区视频网站| 亚洲高清免费视频| 久久精品在这里| 成人18精品视频| 午夜久久福利影院| 亚洲国产成人一区二区三区| 欧美影视一区二区三区| 国产一区二区三区| 综合久久久久综合| 精品日本一线二线三线不卡| 91免费看视频| 国产综合色在线视频区| 尤物av一区二区| 国产日韩欧美精品一区| 欧美日韩激情在线| 色国产综合视频| 午夜久久久影院| 欧美一区二区啪啪| 日本精品裸体写真集在线观看| 蓝色福利精品导航| 亚洲成a人v欧美综合天堂下载 | 91精品国产综合久久蜜臀| 色综合天天综合| 国产成人精品亚洲777人妖| 日本人妖一区二区| 午夜欧美一区二区三区在线播放| 亚洲天堂av一区| 中文字幕中文字幕一区二区| 久久久精品免费免费| 精品国产123| 欧美zozozo| 精品欧美一区二区三区精品久久| 精品污污网站免费看|