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

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

?? htc_utils.c

?? Atheros Communications AR6001 WLAN Driver for SDIO installation Read Me March 26,2007 (based on
?? C
字號:
//------------------------------------------------------------------------------
// <copyright file="htc_utils.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 utility routines used across the entire HTC module.
//
// Author(s): ="Atheros"
//==============================================================================


#include "htc_internal.h"

/* ------ Global Variable Declarations ------- */
extern HTC_TARGET *AtherosTargetList[HIF_MAX_DEVICES];
extern HTC_GLOBAL_EVENT_TABLE AtherosEventTable;
extern A_MUTEX_T instanceCS;

#ifdef DEBUG
extern A_UINT32 debughtc;
#endif

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

/* ------ Functions ------ */
void
dispatchEvent(HTC_TARGET     *target, 
              HTC_ENDPOINT_ID endPointId,
              HTC_EVENT_ID    eventId, 
              HTC_EVENT_INFO *eventInfo)
{
    EVENT_TABLE_ELEMENT *eventElement;

    if (eventId == HTC_TARGET_AVAILABLE) {
        eventElement = &AtherosEventTable.element[0];
    } else if (eventId == HTC_TARGET_UNAVAILABLE) {
        eventElement = &AtherosEventTable.element[1];
    } else {
        eventElement = 
            &target->endPoint[endPointId].eventTable.element[eventId]; 
    }
    AR_DEBUG_ASSERT(eventElement != NULL);

    HTC_DEBUG_PRINTF(ATH_LOG_INF, 
                    "dispatchEvent(endpoint: %d, eventId: 0x%d, handler: 0x%p)\n", endPointId, eventElement->id, eventElement->handler);
    if (eventElement->handler) {
        eventElement->handler(target, endPointId, eventId, eventInfo,
                              eventElement->param);
    }
}


A_STATUS 
addToEventTable(HTC_TARGET       *target,
                HTC_ENDPOINT_ID   endPointId,
                HTC_EVENT_ID      eventId,
                HTC_EVENT_HANDLER handler, 
                void             *param)
{
    EVENT_TABLE_ELEMENT *new;

    if (eventId == HTC_TARGET_AVAILABLE) {
        new = &AtherosEventTable.element[0];
    } else if (eventId == HTC_TARGET_UNAVAILABLE) {
        new = &AtherosEventTable.element[1];
    } else {
        new = &target->endPoint[endPointId].eventTable.element[eventId]; 
    }

    /* Store the event id, the corresponding handler and the param passed */
    new->id = eventId;
    new->handler = handler;
    new->param = param;

    HTC_DEBUG_PRINTF(ATH_LOG_INF, 
                    "addToEventTable(endpoint: %d, eventId: 0x%d, handler: 0x%p)\n", endPointId, new->id, new->handler);

    return A_OK;
}


A_STATUS 
removeFromEventTable(HTC_TARGET *target,
                     HTC_ENDPOINT_ID endPointId,
                     HTC_EVENT_ID  eventId)
{
    EVENT_TABLE_ELEMENT *remove;

    if (eventId == HTC_TARGET_AVAILABLE) {
        remove = &AtherosEventTable.element[0];
    } else if (eventId == HTC_TARGET_UNAVAILABLE) {
        remove = &AtherosEventTable.element[1];
    } else {
        remove = &target->endPoint[endPointId].eventTable.element[eventId]; 
    }

    /* Remove the event handler */
    A_MEMZERO(remove, sizeof(EVENT_TABLE_ELEMENT));

    return A_OK;
}

A_STATUS
addToMboxQueue(HTC_DATA_REQUEST_QUEUE *queue,
               A_UCHAR        *buffer,
               A_UINT32        bufferLength,
               A_UINT32        actualLength,
               void           *cookie)
{
    A_STATUS status;
    HTC_DATA_REQUEST_ELEMENT *element;

    AR_DEBUG_ASSERT(queue != NULL);
    AR_DEBUG_ASSERT(bufferLength);

    HTC_DEBUG_PRINTF(ATH_LOG_SYNC, 
                    "Critical Section (queue): LOCK at line %d in file %s\n", __LINE__, __FILE__);
    A_MUTEX_LOCK(&instanceCS);
    element = GET_QUEUE_TAIL(queue);
    if (!(IS_DATA_QUEUE_FULL(queue)) && IS_ELEMENT_FREE(element)) {
        element->buffer.free = FALSE;
        FILL_MBOX_BUFFER(element, buffer, bufferLength, actualLength, cookie);
        queue->size += 1;

        HTC_DEBUG_PRINTF(ATH_LOG_INF, 
                        "addToMboxQueue (index: %d, size: %d, bufferElement: 0x%p, bufferElement->buffer: 0x%p, bufferElement->cookie: 0x%p)\n", (queue->head + queue->size - 1) % HTC_DATA_REQUEST_RING_BUFFER_SIZE, queue->size, element, (GET_MBOX_BUFFER(element))->buffer, (GET_MBOX_BUFFER(element))->cookie);
        status = A_OK;
    } else {
        HTC_DEBUG_PRINTF(ATH_LOG_ERR, "Queue size: %d\n", queue->size);
        status = A_ERROR;
    }
    HTC_DEBUG_PRINTF(ATH_LOG_SYNC, 
                    "Critical Section (queue): UNLOCK at line %d in file %s\n", __LINE__, __FILE__);
    A_MUTEX_UNLOCK(&instanceCS);

    return status;
}

HTC_DATA_REQUEST_ELEMENT *
removeFromMboxQueue(HTC_DATA_REQUEST_QUEUE *queue) {
    HTC_DATA_REQUEST_ELEMENT *element;
    AR_DEBUG_ASSERT(queue != NULL);

    HTC_DEBUG_PRINTF(ATH_LOG_SYNC, 
                    "Critical Section (queue): LOCK at line %d in file %s\n", __LINE__, __FILE__);
    A_MUTEX_LOCK(&instanceCS);
    if (!(IS_DATA_QUEUE_EMPTY(queue))) {
        element = GET_QUEUE_HEAD(queue);
        queue->head = (queue->head + 1) % HTC_DATA_REQUEST_RING_BUFFER_SIZE;
        queue->size -= 1;

        HTC_DEBUG_PRINTF(ATH_LOG_INF, 
                        "removeFromMboxQueue (index: %d, size: %d, bufferElement: 0x%p, bufferElement->buffer: 0x%p, bufferElement->cookie: 0x%p)\n", queue->head, queue->size, element, (GET_MBOX_BUFFER(element))->buffer, (GET_MBOX_BUFFER(element))->cookie);
    } else {
        element = NULL;
    }
    HTC_DEBUG_PRINTF(ATH_LOG_SYNC, 
                    "Critical Section (queue): UNLOCK at line %d in file %s\n", __LINE__, __FILE__);
    A_MUTEX_UNLOCK(&instanceCS);

    return element;
}

void
flushMboxQueue(HTC_ENDPOINT *endPoint,
               HTC_DATA_REQUEST_QUEUE *queue, 
               HTC_EVENT_ID eventId)
{
    HTC_DATA_REQUEST_ELEMENT *curr;
    HTC_EVENT_INFO eventInfo;
    HTC_ENDPOINT_EVENT_TABLE *eventTable;
    HTC_ENDPOINT_ID endPointId;
    EVENT_TABLE_ELEMENT *eventElement;
    HTC_MBOX_BUFFER *mboxBuffer;

    eventTable = &endPoint->eventTable;
    endPointId = GET_ENDPOINT_ID(endPoint);

    /* 
     * Release the buffer to WMI using the registered event handler. If WMI 
     * has not registered any callbacks for a particular endpoint then it 
     * means that its queues will not have any buffers so we skip that 
     * endpoint.
     */
    if ((eventElement = &eventTable->element[eventId]) != NULL) {
        while ((curr = removeFromMboxQueue(queue)) != NULL) {
            /* Frame the event and dispatch it */
            mboxBuffer = GET_MBOX_BUFFER(curr);
            FRAME_EVENT(eventInfo, mboxBuffer->buffer, 
                        mboxBuffer->bufferLength, mboxBuffer->actualLength, 
                        A_ECANCELED, mboxBuffer->cookie);
            if (eventElement->handler) {
                eventElement->handler(endPoint->target, endPointId, eventId, 
                                      &eventInfo, eventElement->param);
            }
            RECYCLE_DATA_REQUEST_ELEMENT(curr);
        }
    }

    /* Initialize the head and tail pointer */
    queue->head = 0;
    queue->size = 0;
}

HTC_REG_REQUEST_ELEMENT *
allocateRegRequestElement(HTC_TARGET *target) {
    A_UINT32 count;
    HTC_REG_REQUEST_ELEMENT *element;

    A_MUTEX_LOCK(&instanceCS);
    element = NULL;
    for (count = 0; count < HTC_REG_REQUEST_LIST_SIZE; count ++) {
        element = &target->regList.element[count];
        if (IS_ELEMENT_FREE(element)) {
            element->buffer.free = FALSE;
            break;
        }
    }
    A_MUTEX_UNLOCK(&instanceCS);

    return element;
}

void
freeRegRequestElement(HTC_REG_REQUEST_ELEMENT *element) {
    A_MUTEX_LOCK(&instanceCS);
    FILL_REG_BUFFER(element, NULL, 0, 0, 0);
    element->buffer.free = TRUE;
    A_MUTEX_UNLOCK(&instanceCS);
}

HTC_TARGET *
getTargetInstance(void *device)
{
    return AtherosTargetList[0];
}

void
addTargetInstance(HTC_TARGET *target)
{
    AtherosTargetList[0] = target;
}

void
delTargetInstance(HTC_TARGET *target)
{
    AtherosTargetList[0] = NULL;
}

A_UINT32 
getRegAddr(TARGET_REGISTERS base, 
           HTC_ENDPOINT_ID endPointId) 
{
    A_UINT32 address;

    switch(base) {
    case TX_CREDIT_COUNTER_RESET_REG:
        address = COUNT_DEC_ADDRESS + endPointId * 4;
        break;

    case TX_CREDIT_COUNTER_DECREMENT_REG:
        address = COUNT_DEC_ADDRESS + (HTC_MAILBOX_NUM_MAX + endPointId) * 4;
        break;

    case TX_CREDIT_COUNTER_REG:
        address = COUNT_ADDRESS + (HTC_MAILBOX_NUM_MAX + endPointId) * 4;
        break;

    case INT_STATUS_ENABLE_REG:
        address = INT_STATUS_ENABLE_ADDRESS;
        break;

    case ERROR_STATUS_ENABLE_REG:
		address = ERROR_STATUS_ENABLE_ADDRESS;
		break;

    case COUNTER_INT_STATUS_ENABLE_REG:
    case COUNTER_INT_STATUS_DISABLE_REG:
        address = COUNTER_INT_STATUS_ENABLE_ADDRESS;
        break;

    case INT_STATUS_REG:
        address = HOST_INT_STATUS_ADDRESS;
        break;

    case CPU_INT_STATUS_REG:
        address = CPU_INT_STATUS_ADDRESS;
        break;

    case ERROR_INT_STATUS_REG:
        address = ERROR_INT_STATUS_ADDRESS;
        break;

    case INT_WLAN_REG:
        address = INT_WLAN_ADDRESS;
        break;

    case WINDOW_DATA_REG:
        address = WINDOW_DATA_ADDRESS;
        break;

    case WINDOW_WRITE_ADDR_REG:
        address = WINDOW_WRITE_ADDR_ADDRESS;
        break;

    case WINDOW_READ_ADDR_REG:
        address = WINDOW_READ_ADDR_ADDRESS;
        break;

    default:
        HTC_DEBUG_PRINTF(ATH_LOG_ERR, "Invalid register: %d\n", base);
        AR_DEBUG_ASSERT(0);
        address = 0;
        break;
    }

    return address;
}

void
dumpBytes(A_UCHAR *buffer, A_UINT16 length)
{
    A_CHAR stream[60];
    A_UINT32 i;
    A_UINT16 offset, count;

    HTC_DEBUG_PRINTF(ATH_LOG_DUMP, "Dumping %d Bytes : ------>\n", length);

    count = 0;
    offset = 0;
    for(i = 0; i < length; i++) {
        sprintf(stream + offset, "%2x ", buffer[i]);
	count ++;
	offset += 3;

	if(count == 16) {
	    count = 0;
	    offset = 0;
	    HTC_DEBUG_PRINTF(ATH_LOG_DUMP, "[H]: %s\n", stream);
	    A_MEMZERO(stream, 60);
	}
    }

    if(offset != 0) {
	HTC_DEBUG_PRINTF(ATH_LOG_DUMP, "[H]: %s\n", stream);
    }
}

void
dumpRegisters(HTC_TARGET *target)
{
    HTC_REGISTER_TABLE *reg;

    reg = &target->table;
    HTC_DEBUG_PRINTF(ATH_LOG_DUMP, "\n<------- Register Table -------->\n");
	HTC_DEBUG_PRINTF(ATH_LOG_DUMP, "Int Status:                0x%x\n", reg->host_int_status);
	HTC_DEBUG_PRINTF(ATH_LOG_DUMP, "CPU Int Status:            0x%x\n", reg->cpu_int_status);
	HTC_DEBUG_PRINTF(ATH_LOG_DUMP, "Error Int Status:          0x%x\n", reg->error_int_status);
	HTC_DEBUG_PRINTF(ATH_LOG_DUMP, "Counter Int Status:        0x%x\n", reg->counter_int_status);
	HTC_DEBUG_PRINTF(ATH_LOG_DUMP, "Mbox Frame:                0x%x\n", reg->mbox_frame);
	HTC_DEBUG_PRINTF(ATH_LOG_DUMP, "Rx Lookahead Valid:        0x%x\n", reg->rx_lookahead_valid);
	HTC_DEBUG_PRINTF(ATH_LOG_DUMP, "Rx Lookahead 0:            0x%x\n", reg->rx_lookahead[ENDPOINT1]);
	HTC_DEBUG_PRINTF(ATH_LOG_DUMP, "Rx Lookahead 1:            0x%x\n", reg->rx_lookahead[ENDPOINT2]);
	HTC_DEBUG_PRINTF(ATH_LOG_DUMP, "Rx Lookahead 2:            0x%x\n", reg->rx_lookahead[ENDPOINT3]);
	HTC_DEBUG_PRINTF(ATH_LOG_DUMP, "Rx Lookahead 3:            0x%x\n", reg->rx_lookahead[ENDPOINT4]);
	HTC_DEBUG_PRINTF(ATH_LOG_DUMP, "Int Status Enable:         0x%x\n", reg->int_status_enable);
	HTC_DEBUG_PRINTF(ATH_LOG_DUMP, "Counter Int Status Enable: 0x%x\n", reg->counter_int_status_enable);
	HTC_DEBUG_PRINTF(ATH_LOG_DUMP, "<------------------------------->\n");
}

A_UINT8
htcGetBitNumSet(A_UINT32 data)
{
    A_UINT8 count;

    if (0 == data) {
        return 0;
    }
    count = 0;
    while(!(data % 2)) {
        count += 1;
        data >>= 1;
    }

    return count;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品国产伦理网| 国产精品亚洲一区二区三区妖精| 豆国产96在线|亚洲| 国产三级精品三级在线专区| 国产电影精品久久禁18| 亚洲免费在线看| 欧美日韩视频在线第一区| 日韩av一二三| 中文文精品字幕一区二区| 国产精品综合久久| 国产黄色91视频| 成人久久久精品乱码一区二区三区| 一区二区在线观看不卡| 精品成人一区二区三区| 精品国产91亚洲一区二区三区婷婷| 欧美理论电影在线| www.性欧美| 精品一区二区三区免费| 亚洲最新视频在线观看| 欧美激情一区三区| 亚洲乱码国产乱码精品精小说 | 全部av―极品视觉盛宴亚洲| 国产片一区二区三区| 亚洲视频一区在线| 国产日韩欧美高清| 亚洲自拍偷拍麻豆| 亚洲丝袜美腿综合| 日韩电影在线一区二区| 成人午夜在线视频| 欧美精品亚洲二区| 中文字幕av一区二区三区免费看| 一级日本不卡的影视| 国产一区久久久| 国产精品综合一区二区| 在线观看av不卡| 在线观看亚洲专区| 久久综合丝袜日本网| 精品国产sm最大网站免费看| 亚洲免费在线视频| 国产乱国产乱300精品| 91官网在线观看| 欧洲一区二区三区在线| 亚洲精品一区二区三区精华液 | 亚洲成a人片综合在线| 一区二区三区在线不卡| 久99久精品视频免费观看| 在线一区二区观看| 欧美国产1区2区| 免费在线观看视频一区| 欧美专区日韩专区| 亚洲美女偷拍久久| 成人免费的视频| 2020国产精品久久精品美国| 亚洲国产视频在线| 精品一区二区三区免费播放| 欧美吻胸吃奶大尺度电影| 欧美一区二区三区免费在线看| 制服丝袜av成人在线看| 精品日本一线二线三线不卡| 欧美成人伊人久久综合网| 一区二区三区四区在线| 波多野结衣中文一区| 欧美在线小视频| 亚洲欧美欧美一区二区三区| 不卡的av网站| 国产精品久久久一区麻豆最新章节| 亚洲美女偷拍久久| 99精品黄色片免费大全| 9191精品国产综合久久久久久 | 麻豆国产欧美日韩综合精品二区| 久久国内精品视频| kk眼镜猥琐国模调教系列一区二区| 久久品道一品道久久精品| 亚洲美女视频在线观看| 成人深夜在线观看| 国产精品久久久久久久久快鸭| 国产成人av电影在线观看| 久久久噜噜噜久久人人看| 国产在线播精品第三| 精品国产成人系列| 成人av中文字幕| 亚洲精品乱码久久久久久黑人| 97se狠狠狠综合亚洲狠狠| 亚洲黄色片在线观看| 欧日韩精品视频| 日韩中文字幕区一区有砖一区| 成人午夜大片免费观看| 国产精品美女久久久久久2018| av亚洲精华国产精华精华| 亚洲你懂的在线视频| 欧美精品日韩一本| 免费成人小视频| 国产嫩草影院久久久久| 色香蕉久久蜜桃| 国产精品全国免费观看高清| 91亚洲永久精品| 日本一区二区视频在线| 91蜜桃在线观看| 麻豆91小视频| 日韩一区在线看| 国产成a人无v码亚洲福利| 亚洲免费在线播放| 日韩视频中午一区| 青青国产91久久久久久| 久久精品欧美一区二区三区麻豆| 日本色综合中文字幕| 久久人人爽人人爽| 色综合天天综合在线视频| 久久久精品2019中文字幕之3| 北条麻妃国产九九精品视频| 午夜国产不卡在线观看视频| 色94色欧美sute亚洲线路二| 国产在线观看一区二区| 亚洲精品综合在线| 久久综合久久鬼色| 欧美三级日韩三级| 丁香婷婷综合网| 日本美女一区二区| 亚洲女与黑人做爰| 国产午夜精品福利| 日韩一区二区免费在线电影 | 亚洲精品videosex极品| 日韩一级完整毛片| 欧美主播一区二区三区美女| 成人永久免费视频| 国产在线一区观看| 亚洲国产精品av| 91精品在线麻豆| 欧美综合天天夜夜久久| 99精品国产99久久久久久白柏| 美女网站一区二区| 香蕉影视欧美成人| 亚洲激情校园春色| 亚洲欧洲国产专区| 国产欧美久久久精品影院| 日韩女优制服丝袜电影| 国产成人自拍网| 看电影不卡的网站| 天堂精品中文字幕在线| 午夜婷婷国产麻豆精品| 亚洲另类春色国产| 一级女性全黄久久生活片免费| 国产精品久久久久久久久果冻传媒| 亚洲精品一区在线观看| 精品入口麻豆88视频| 日韩精品中文字幕在线不卡尤物| 欧美酷刑日本凌虐凌虐| 欧美日韩免费视频| 欧美精品v国产精品v日韩精品 | 日韩欧美中文字幕制服| 欧美日韩精品一区二区三区| 精品一区二区三区免费播放| 日本不卡一区二区| 久久成人综合网| 久久国产日韩欧美精品| 国产一区二区精品在线观看| 国产在线视频精品一区| 国产激情精品久久久第一区二区| 国产精品18久久久久久久久 | 暴力调教一区二区三区| 成人97人人超碰人人99| 色婷婷一区二区三区四区| 欧亚一区二区三区| 欧美肥妇bbw| 久久先锋资源网| 国产精品久久久久一区二区三区 | 中文字幕在线视频一区| 中文字幕日韩一区二区| 亚洲精品久久7777| 日韩综合一区二区| 国产精品香蕉一区二区三区| 99久久久久免费精品国产| 欧美性xxxxxxxx| 日韩欧美成人一区| 中文字幕+乱码+中文字幕一区| 亚洲综合一区在线| 精品一区二区三区久久| 91麻豆国产香蕉久久精品| 欧美日韩夫妻久久| 国产日韩av一区| 婷婷六月综合网| 福利视频网站一区二区三区| 一本大道久久a久久综合婷婷| 欧美另类久久久品| 日本一区二区视频在线观看| 午夜在线电影亚洲一区| 国产91色综合久久免费分享| 在线观看精品一区| 国产欧美日产一区| 日韩电影网1区2区| 成人高清av在线| 精品国精品自拍自在线| 一区二区三区中文字幕在线观看| 美女国产一区二区三区| 色狠狠色噜噜噜综合网| 精品国产一区二区三区av性色 | 欧美欧美欧美欧美| 国产精品人妖ts系列视频| 日本美女一区二区三区视频| 色综合一个色综合|