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

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

?? htc_utils.c

?? Linux下SDIO設備的驅動程序
?? C
字號:
/* * Copyright (c) 2004-2006 Atheros Communications Inc. * *  Wireless Network driver for Atheros AR6001 * *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License version 2 as *  published by the Free Software Foundation; * *  Software distributed under the License is distributed on an "AS *  IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or *  implied. See the License for the specific language governing *  rights and limitations under the License. * * * This file contains the utility routines used across the entire HTC module. */#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 DEBUGextern A_UINT32 debughtc;#endif/* ------ Static Variables ------ *//* ------ Functions ------ */voiddispatchEvent(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);    AR_DEBUG_PRINTF(ATH_DEBUG_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_STATUSaddToEventTable(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;    AR_DEBUG_PRINTF(ATH_DEBUG_INF,                    ("addToEventTable(endpoint: %d, eventId: 0x%d, handler: 0x%p)\n", endPointId, new->id, new->handler));    return A_OK;}A_STATUSremoveFromEventTable(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_STATUSaddToMboxQueue(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);    AR_DEBUG_PRINTF(ATH_DEBUG_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;        AR_DEBUG_PRINTF(ATH_DEBUG_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 {        AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Queue size: %d\n", queue->size));        status = A_ERROR;    }    AR_DEBUG_PRINTF(ATH_DEBUG_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);    AR_DEBUG_PRINTF(ATH_DEBUG_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;        AR_DEBUG_PRINTF(ATH_DEBUG_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;    }    AR_DEBUG_PRINTF(ATH_DEBUG_SYNC,                    ("Critical Section (queue): UNLOCK at line %d in file %s\n", __LINE__, __FILE__));    A_MUTEX_UNLOCK(&instanceCS);    return element;}voidflushMboxQueue(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;}voidfreeRegRequestElement(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];}voidaddTargetInstance(HTC_TARGET *target){    AtherosTargetList[0] = target;}voiddelTargetInstance(HTC_TARGET *target){    AtherosTargetList[0] = NULL;}A_UINT32getRegAddr(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 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:        AR_DEBUG_PRINTF(ATH_DEBUG_ERR, ("Invalid register: %d\n", base));        AR_DEBUG_ASSERT(0);        address = 0;        break;    }    return address;}voiddumpBytes(A_UCHAR *buffer, A_UINT16 length){    A_CHAR stream[60];    A_UINT32 i;    A_UINT16 offset, count;    AR_DEBUG_PRINTF(ATH_DEBUG_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;	    AR_DEBUG_PRINTF(ATH_DEBUG_DUMP, ("[H]: %s\n", stream));	    A_MEMZERO(stream, 60);	}    }    if(offset != 0) {	AR_DEBUG_PRINTF(ATH_DEBUG_DUMP, ("[H]: %s\n", stream));    }}voiddumpRegisters(HTC_TARGET *target){    HTC_REGISTER_TABLE *reg;    reg = &target->table;    AR_DEBUG_PRINTF(ATH_DEBUG_DUMP, ("\n<------- Register Table -------->\nInt Status:                0x%x\nCPU Int Status:            0x%x\nError Int Status:          0x%x\nCounter Int Status:        0x%x\nMbox Frame:                0x%x\nRx Lookahead Valid:        0x%x\nRx Lookahead 0:            0x%x\nRx Lookahead 1:            0x%x\nRx Lookahead 2:            0x%x\nRx Lookahead 3:            0x%x\nInt Status Enable:         0x%x\nCounter Int Status Enable: 0x%x\n<------------------------------->\n", reg->host_int_status, reg->cpu_int_status, reg->error_int_status, reg->counter_int_status, reg->mbox_frame, reg->rx_lookahead_valid, reg->rx_lookahead[ENDPOINT1], reg->rx_lookahead[ENDPOINT2], reg->rx_lookahead[ENDPOINT3], reg->rx_lookahead[ENDPOINT4], reg->int_status_enable, reg->counter_int_status_enable));}A_UINT8htcGetBitNumSet(A_UINT32 data){    A_UINT8 count;    count = 0;    while(!(data & 0x1)) {        count += 1;        data >>= 1;    }    return count;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
天天色综合成人网| 成人精品鲁一区一区二区| 成人动漫av在线| 日韩亚洲欧美成人一区| 最新成人av在线| 国内精品不卡在线| 欧美日韩亚洲综合在线| 国产精品视频一二三区| 毛片av一区二区| 精品婷婷伊人一区三区三| 国产精品不卡在线观看| 国内精品伊人久久久久av一坑 | 看片的网站亚洲| 日本乱码高清不卡字幕| 国产欧美日韩精品a在线观看| 五月开心婷婷久久| 色屁屁一区二区| 中文字幕中文字幕中文字幕亚洲无线| 激情深爱一区二区| 欧美一级片免费看| 午夜精品aaa| 欧美主播一区二区三区美女| 自拍偷拍亚洲综合| 日本韩国欧美一区| 波多野结衣中文字幕一区| 久久这里只有精品视频网| 欧美a级一区二区| 欧美美女直播网站| 一区二区激情小说| 日本精品裸体写真集在线观看| 国产精品久久久久久妇女6080 | 亚洲午夜电影在线| 色综合久久88色综合天天6| 国产精品无圣光一区二区| 国产精品自产自拍| 久久影院视频免费| 国产精品资源在线| 久久久不卡网国产精品一区| 蜜桃一区二区三区四区| 欧美一区二视频| 日本aⅴ精品一区二区三区| 777久久久精品| 日韩电影免费一区| 日韩片之四级片| 久久99精品国产| 久久影院视频免费| 成人综合婷婷国产精品久久| 中文字幕av一区二区三区高 | 国产一区二区美女诱惑| 2023国产精品| 国产99久久久久久免费看农村| 欧美精品一区二区三区很污很色的| 精品一区二区三区在线观看 | 3atv一区二区三区| 麻豆精品一区二区综合av| 精品日韩一区二区三区| 国产乱理伦片在线观看夜一区| 国产午夜亚洲精品午夜鲁丝片| 成人一级黄色片| 国产精品福利一区二区| 91社区在线播放| 亚洲一二三专区| 欧美一区二区精品久久911| 久久国产视频网| 国产丝袜在线精品| 91麻豆自制传媒国产之光| 亚洲激情男女视频| 555www色欧美视频| 韩国视频一区二区| 国产精品高清亚洲| 欧美性生交片4| 麻豆国产一区二区| 亚洲国产视频网站| 99视频国产精品| 亚洲成av人影院| 精品国产伦一区二区三区观看体验| 国产一区999| 日韩美女啊v在线免费观看| 欧美丝袜丝交足nylons| 视频在线观看一区二区三区| 日韩欧美黄色影院| www.日韩精品| 午夜视频一区二区| 久久久久免费观看| 在线亚洲高清视频| 精品一区二区在线免费观看| 国产精品美女久久久久aⅴ国产馆| 日本高清不卡aⅴ免费网站| 日日摸夜夜添夜夜添精品视频| 久久久久久久久蜜桃| 色婷婷综合久色| 久久超碰97人人做人人爱| 国产精品电影一区二区| 欧美日韩一区不卡| 国产精品18久久久久久久久| 一区二区三区毛片| 久久蜜桃一区二区| 欧美在线观看视频一区二区 | 18欧美乱大交hd1984| 91老师片黄在线观看| 亚洲成人资源网| 欧美成人国产一区二区| 99久久久国产精品免费蜜臀| 日韩精品一二区| 国产精品免费视频网站| 日韩一级片网址| 91在线无精精品入口| 麻豆国产精品官网| 亚洲精品老司机| 国产亚洲精品中文字幕| 6080yy午夜一二三区久久| www.日韩大片| 国产麻豆精品久久一二三| 亚洲第四色夜色| 国产精品国产三级国产aⅴ无密码| 精品国产一区二区三区忘忧草| 色94色欧美sute亚洲线路一ni | 国产精品一区二区三区网站| 午夜精品福利一区二区蜜股av| 中文字幕人成不卡一区| 日韩免费观看2025年上映的电影| 日本韩国一区二区| 成人精品免费看| 韩国一区二区在线观看| 丝袜国产日韩另类美女| 亚洲久草在线视频| 久久精品男人的天堂| 337p亚洲精品色噜噜噜| 国产亚洲一区二区三区四区| 日韩黄色在线观看| 一区二区三区免费| 中文字幕一区二区三区不卡| 国产性做久久久久久| 精品国产亚洲在线| 91精品国产91久久久久久最新毛片 | 国产精品网站在线| 精品国产91九色蝌蚪| 欧美一区二区福利在线| 精品视频一区二区不卡| 日本二三区不卡| 99精品视频免费在线观看| 成人在线视频一区二区| 国产乱人伦精品一区二区在线观看| 美女脱光内衣内裤视频久久网站| 午夜精品一区二区三区电影天堂 | 亚洲.国产.中文慕字在线| 亚洲麻豆国产自偷在线| 一区免费观看视频| 中文字幕在线观看一区| 国产免费久久精品| 久久精品视频在线看| 精品国精品自拍自在线| 精品三级在线观看| 精品国产一区二区三区四区四| 日韩免费观看高清完整版| 欧美大白屁股肥臀xxxxxx| 日韩视频免费观看高清完整版| 538在线一区二区精品国产| 制服丝袜中文字幕亚洲| 在线播放日韩导航| 欧美一区午夜视频在线观看| 67194成人在线观看| 日韩视频在线永久播放| 日韩一区二区三| 日韩欧美一区电影| 精品国产精品网麻豆系列| 精品福利一区二区三区免费视频| 欧美不卡激情三级在线观看| 欧美电视剧在线看免费| 欧美精品一区二区高清在线观看 | 91免费看视频| 在线观看欧美黄色| 欧美美女激情18p| 日韩一区二区电影在线| 精品久久免费看| 国产日产欧美一区二区三区| 国产精品人成在线观看免费| 中文字幕日韩av资源站| 亚洲电影一级片| 日韩激情视频网站| 国产精品一二三四五| 成人99免费视频| 91高清视频免费看| 宅男噜噜噜66一区二区66| 精品国产乱码久久久久久闺蜜| 久久精品人人做| 亚洲精品一二三区| 国产成人aaaa| 久久国产视频网| 白白色 亚洲乱淫| 欧美电影一区二区| 久久久激情视频| 亚洲精品高清在线观看| 日韩福利视频网| 国产精品亚洲一区二区三区妖精 | 色综合婷婷久久| 制服丝袜国产精品| 欧美激情在线一区二区三区| 一区二区三区国产精华| 久久电影网站中文字幕|