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

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

?? htc_events.c

?? Linux下SDIO設備的驅動程序
?? C
?? 第 1 頁 / 共 3 頁
字號:
/* * 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 routines handling the different events and callbacks * from the hardware interface layer. */#include "htc_internal.h"/* ------ Global Variable Declarations ------- */extern A_MUTEX_T instanceCS, counterCS, creditCS;extern A_WAITQUEUE_HEAD htcEvent;#ifdef DEBUGextern A_UINT32 debughtc;extern A_UINT32 txcreditsavailable[HTC_MAILBOX_NUM_MAX];extern A_UINT32 txcreditsconsumed[HTC_MAILBOX_NUM_MAX];extern A_UINT32 txcreditintrenable[HTC_MAILBOX_NUM_MAX];extern A_UINT32 txcreditintrenableaggregate[HTC_MAILBOX_NUM_MAX];#endifextern A_UINT32 tx_complete[HTC_MAILBOX_NUM_MAX]; /* Num of tx complete *//* ------ Static Variables ------ *//* ------ Functions ------ */#ifdef CFA_STATUS htcInterruptEnabler(HIF_DEVICE *device) {    A_STATUS status;    A_UINT32 address;    HIF_REQUEST request;    HTC_TARGET *target;    target = getTargetInstance(device);    AR_DEBUG_ASSERT(target != NULL);    AR_DEBUG_PRINTF(ATH_DEBUG_TRC,                    ("htcInterruptEnabler Enter target: 0x%p\n", target));    target->table.int_status_enable = INT_STATUS_ENABLE_ERROR_SET(0x01) |                                      INT_STATUS_ENABLE_CPU_SET(0x01) |                                      INT_STATUS_ENABLE_COUNTER_SET(0x01) |                                      INT_STATUS_ENABLE_MBOX_DATA_SET(0x0F);    /* Reenable Dragon Interrupts */    HIF_FRAME_REQUEST(&request, HIF_WRITE, HIF_EXTENDED_IO, HIF_SYNCHRONOUS,                      HIF_BYTE_BASIS, HIF_FIXED_ADDRESS);    address = getRegAddr(INT_STATUS_ENABLE_REG, ENDPOINT_UNUSED);    status = HIFReadWrite(target->device, address,                          &target->table.int_status_enable, 1,                          &request, NULL);	AR_DEBUG_ASSERT(status == A_OK);    AR_DEBUG_PRINTF(ATH_DEBUG_TRC,("htcInterruptEnabler Exit\n"));        return A_OK;}#endif /* CF */A_STATUShtcRWCompletionHandler(void *context,                       A_STATUS status){    HTC_QUEUE_ELEMENT *element;    element = (HTC_QUEUE_ELEMENT *)context;    AR_DEBUG_ASSERT(element != NULL);    return(element->completionCB(element, status));}A_STATUShtcTxCompletionCB(HTC_DATA_REQUEST_ELEMENT *element,                  A_STATUS status){    HTC_TARGET *target;    HTC_ENDPOINT_ID endPointId;    HTC_ENDPOINT *endPoint;    HTC_EVENT_INFO eventInfo;    HTC_MBOX_BUFFER *mboxBuffer;    AR_DEBUG_PRINTF(ATH_DEBUG_TRC | ATH_DEBUG_SEND,                    ("htcTxCompletionCB - Enter\n"));    /* Get the context */    mboxBuffer = GET_MBOX_BUFFER(element);    AR_DEBUG_ASSERT(mboxBuffer != NULL);    endPoint = mboxBuffer->endPoint;    AR_DEBUG_ASSERT(endPoint != NULL);    target = endPoint->target;    AR_DEBUG_ASSERT(target != NULL);    endPointId = GET_ENDPOINT_ID(endPoint);    AR_DEBUG_PRINTF(ATH_DEBUG_INF | ATH_DEBUG_SEND,                    ("mboxBuffer: 0x%p, buffer: 0x%p, endPoint(%d): 0x%p, target: 0x%p\n", mboxBuffer, mboxBuffer->buffer, endPointId, endPoint, target));    /* Return the buffer to the user if the transmission was not successful */    if (status != A_OK) {        AR_DEBUG_PRINTF(ATH_DEBUG_ERR | ATH_DEBUG_SEND,                        ("Frame transmission failed\n"));        AR_DEBUG_PRINTF(ATH_DEBUG_ERR | ATH_DEBUG_SEND,                        ("EndPoint: %d, Tx credits available: %d\n",                         endPointId, GET_TX_CREDITS_AVAILABLE(endPoint)));        /*         * In the failure case it is possible that while queueing of the         * request itself it returned an error status in which case we         * would have dispatched an event and freed the element there         * itself. Ideally if it failed to queue the request then it         * should not generate a callback but we are being a little         * conservative.         */        if (!(IS_ELEMENT_FREE(element))) {            mboxBuffer->buffer += HTC_HEADER_LEN;            FRAME_EVENT(eventInfo, mboxBuffer->buffer,                        mboxBuffer->bufferLength, mboxBuffer->actualLength,                        A_ECANCELED, mboxBuffer->cookie);            RECYCLE_DATA_REQUEST_ELEMENT(element);            dispatchEvent(target, endPointId, HTC_BUFFER_SENT, &eventInfo);            AR_DEBUG_PRINTF(ATH_DEBUG_TRC | ATH_DEBUG_SEND,                            ("htcTxCompletionCB - Exit\n"));        }        return A_OK;    }    AR_DEBUG_PRINTF(ATH_DEBUG_INF | ATH_DEBUG_SEND,                    ("Frame transmission complete\n"));    /*     * The user should see the actual length and buffer length     * to be the same. In case of block mode, we use the actual length     * parameter to reflect the total number of bytes transmitted after     * padding.     */    mboxBuffer->actualLength = mboxBuffer->bufferLength;    mboxBuffer->buffer += HTC_HEADER_LEN;    /*     * Return the transmit buffer to the user through the HTC_BUFFER_SENT     * event indicating that the frame was transmitted successfully.     */    FRAME_EVENT(eventInfo, mboxBuffer->buffer, mboxBuffer->bufferLength,                mboxBuffer->actualLength, A_OK, mboxBuffer->cookie);    RECYCLE_DATA_REQUEST_ELEMENT(element);    tx_complete[endPointId] += 1;    dispatchEvent(target, endPointId, HTC_BUFFER_SENT, &eventInfo);    AR_DEBUG_PRINTF(ATH_DEBUG_TRC | ATH_DEBUG_SEND,                    ("htcTxCompletionCB - Exit\n"));    return A_OK;}A_STATUShtcBlkSzNegCompletionCB(HTC_DATA_REQUEST_ELEMENT *element,                        A_STATUS status){    HTC_TARGET *target;    HTC_ENDPOINT *endPoint;    HIF_REQUEST request;    HTC_MBOX_BUFFER *mboxBuffer;    HTC_REG_REQUEST_ELEMENT *regElement;    A_UINT32 address;    /* Get the context */    mboxBuffer = GET_MBOX_BUFFER(element);    AR_DEBUG_ASSERT(mboxBuffer != NULL);    endPoint = mboxBuffer->endPoint;    AR_DEBUG_ASSERT(endPoint != NULL);    target = endPoint->target;    AR_DEBUG_ASSERT(target != NULL);    /* Recycle the request element */    RECYCLE_DATA_REQUEST_ELEMENT(element);    element->completionCB = htcTxCompletionCB;    if (status == A_OK) {        /* Mark the state to be ready */        endPoint->enabled = TRUE;        /* Set the state of the target as ready */        if (target->endPoint[ENDPOINT1].enabled &&            target->endPoint[ENDPOINT2].enabled &&            target->endPoint[ENDPOINT3].enabled &&            target->endPoint[ENDPOINT4].enabled )        {            /* Send the INT_WLAN interrupt to the target */            target->table.int_wlan = 1;            HIF_FRAME_REQUEST(&request, HIF_WRITE, HIF_EXTENDED_IO,                              HIF_ASYNCHRONOUS, HIF_BYTE_BASIS,                              HIF_FIXED_ADDRESS);            address = getRegAddr(INT_WLAN_REG, ENDPOINT_UNUSED);            regElement = allocateRegRequestElement(target);            AR_DEBUG_ASSERT(regElement != NULL);            FILL_REG_BUFFER(regElement, &target->table.int_wlan, 1,                            INT_WLAN_REG, ENDPOINT_UNUSED);            status = HIFReadWrite(target->device, address,                                  &target->table.int_wlan,                                  1, &request, regElement);#ifndef HTC_SYNC            AR_DEBUG_ASSERT(status == A_OK);#else			AR_DEBUG_ASSERT(status == A_OK || status == A_PENDING);			if(status == A_OK) {				regElement->completionCB(regElement, status);			}#endif        }    }    return A_OK;}A_STATUShtcRxCompletionCB(HTC_DATA_REQUEST_ELEMENT *element,                  A_STATUS status){    HTC_TARGET *target;    HTC_ENDPOINT *endPoint;    HTC_EVENT_INFO eventInfo;    HTC_ENDPOINT_ID endPointId;    HTC_MBOX_BUFFER *mboxBuffer;    AR_DEBUG_PRINTF(ATH_DEBUG_TRC | ATH_DEBUG_SEND,                    ("htcRxCompletionCB - Enter\n"));    /* Get the context */    mboxBuffer = GET_MBOX_BUFFER(element);    AR_DEBUG_ASSERT(mboxBuffer != NULL);    endPoint = mboxBuffer->endPoint;    AR_DEBUG_ASSERT(endPoint != NULL);    target = endPoint->target;    AR_DEBUG_ASSERT(target != NULL);    endPointId = GET_ENDPOINT_ID(endPoint);    AR_DEBUG_PRINTF(ATH_DEBUG_INF | ATH_DEBUG_RECV,                    ("mboxBuffer: 0x%p, buffer: 0x%p, endPoint(%d): 0x%p, target: 0x%p\n", mboxBuffer, mboxBuffer->buffer, endPointId, endPoint, target));    /* Return the buffer to the user if the reception was not successful */    if (status != A_OK) {        AR_DEBUG_PRINTF(ATH_DEBUG_ERR | ATH_DEBUG_RECV,                        ("Frame reception failed\n"));        /*         * In the failure case it is possible that while queueing of the         * request itself it returned an error status in which case we         * would have dispatched an event and freed the element there         * itself. Ideally if it failed to queue the request then it         * should not generate a callback but we are being a little         * conservative.         */        if (!(IS_ELEMENT_FREE(element))) {            mboxBuffer->actualLength = 0;            mboxBuffer->buffer += HTC_HEADER_LEN;            FRAME_EVENT(eventInfo, mboxBuffer->buffer,                        mboxBuffer->bufferLength, mboxBuffer->actualLength,                        A_ECANCELED, mboxBuffer->cookie);            RECYCLE_DATA_REQUEST_ELEMENT(element);            dispatchEvent(target, endPointId, HTC_BUFFER_RECEIVED, &eventInfo);            AR_DEBUG_PRINTF(ATH_DEBUG_TRC | ATH_DEBUG_RECV,                            ("htcRxCompletionCB - Exit\n"));        }        return A_OK;    }    AR_DEBUG_PRINTF(ATH_DEBUG_INF | ATH_DEBUG_RECV,                    ("Frame reception complete\n"));    AR_DEBUG_PRINTBUF(mboxBuffer->buffer, mboxBuffer->actualLength);    /*     * Advance the pointer by the size of HTC header and pass the payload     * pointer to the upper layer.     */    mboxBuffer->actualLength = ((mboxBuffer->buffer[0] << 0) |                                (mboxBuffer->buffer[1] << 8));    mboxBuffer->buffer += HTC_HEADER_LEN;    /*     * Frame the HTC_BUFFER_RECEIVED to the upper layer indicating that the     * packet has been succesfully received.     */    FRAME_EVENT(eventInfo, mboxBuffer->buffer, mboxBuffer->bufferLength,                mboxBuffer->actualLength, A_OK, mboxBuffer->cookie);    /* Recycle the bufferElement structure */    RECYCLE_DATA_REQUEST_ELEMENT(element);    /* Dispatch the event */    dispatchEvent(target, endPointId, HTC_BUFFER_RECEIVED, &eventInfo);    AR_DEBUG_PRINTF(ATH_DEBUG_TRC | ATH_DEBUG_RECV,                    ("htcRxCompletion - Exit\n"));    return A_OK;}A_STATUShtcRegCompletionCB(HTC_REG_REQUEST_ELEMENT *element,                   A_STATUS status){    A_STATUS ret;    HTC_TARGET *target;    HTC_ENDPOINT *endPoint;    HTC_REG_BUFFER *regBuffer;    A_UINT8 txCreditsConsumed;    A_UINT8 txCreditsAvailable;    HTC_ENDPOINT_ID endPointId;    AR_DEBUG_PRINTF(ATH_DEBUG_TRC | ATH_DEBUG_RECV | ATH_DEBUG_SEND,                    ("htcRegCompletion - Enter\n"));    AR_DEBUG_ASSERT(status == A_OK);    /* Get the context */    AR_DEBUG_ASSERT(element != NULL);    regBuffer = GET_REG_BUFFER(element);    AR_DEBUG_ASSERT(regBuffer != NULL);    target = regBuffer->target;    AR_DEBUG_ASSERT(target != NULL);    /* Identify the register and the operation responsible for the callback */    ret = A_OK;    switch(regBuffer->base) {    case TX_CREDIT_COUNTER_DECREMENT_REG:        AR_DEBUG_PRINTF(ATH_DEBUG_INF, ("TX_CREDIT_COUNTER_DECREMENT_REG\n"));        endPointId = regBuffer->offset;        endPoint = &target->endPoint[endPointId];        AR_DEBUG_PRINTF(ATH_DEBUG_SYNC,                        ("Critical Section (credit): LOCK at line %d in file %s\n", __LINE__, __FILE__));        A_MUTEX_LOCK(&creditCS);        /* Calculate the number of credits available */        AR_DEBUG_ASSERT(GET_TX_CREDITS_CONSUMED(endPoint) == regBuffer->length);        AR_DEBUG_ASSERT(regBuffer->buffer[0] >=                        GET_TX_CREDITS_CONSUMED(endPoint));        SET_TX_CREDITS_AVAILABLE(endPoint, regBuffer->buffer[0] -                                 GET_TX_CREDITS_CONSUMED(endPoint));        SET_TX_CREDITS_CONSUMED(endPoint, 0);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
www久久精品| 欧美一区国产二区| 国产精品免费视频网站| 欧美一区二区三区免费视频| 色综合色狠狠综合色| 91久久奴性调教| 欧美日韩视频专区在线播放| 亚洲男人的天堂网| 欧美一级理论性理论a| 欧美日韩一区三区四区| 精品国精品自拍自在线| 亚洲一区二区三区视频在线| 国产成a人无v码亚洲福利| 欧美精品一区二区三区在线播放 | 精品视频在线免费观看| 日本一区二区三区视频视频| 欧美吞精做爰啪啪高潮| 97国产一区二区| 亚洲一区二区综合| 色婷婷久久综合| 有坂深雪av一区二区精品| 欧美日韩国产电影| 国产精品国产精品国产专区不片 | 91超碰这里只有精品国产| 夜夜嗨av一区二区三区| 国产日产欧美一区| 欧美日韩一区在线观看| 国产亚洲精品免费| 国产一区二区不卡| 最新热久久免费视频| 亚洲精品视频在线观看免费| 91麻豆精品在线观看| 久久综合综合久久综合| 3d动漫精品啪啪| 国产一二三精品| 日韩欧美亚洲国产另类| 成人深夜在线观看| 韩国中文字幕2020精品| 欧美日本一区二区| 国产成人精品综合在线观看| 日本午夜一区二区| 日本一区二区久久| 欧美喷水一区二区| 在线精品观看国产| 色综合久久六月婷婷中文字幕| 久久精品国产秦先生| 26uuu成人网一区二区三区| 91视频国产资源| 国产成人精品免费一区二区| 国产69精品一区二区亚洲孕妇| 成人黄色一级视频| 国产精品免费久久| 欧美绝品在线观看成人午夜影视| 99久久精品国产毛片| 国产乱子轮精品视频| 免费成人结看片| 狠狠色伊人亚洲综合成人| 国产亚洲一本大道中文在线| 综合久久久久久| 欧美精品一区二区三区蜜臀| 欧美在线观看禁18| 欧美亚州韩日在线看免费版国语版| 国产欧美一区二区精品婷婷| 欧美精品vⅰdeose4hd| 91美女精品福利| 欧美日韩高清不卡| 国产mv日韩mv欧美| 色综合久久久久| 久久机这里只有精品| 久久久噜噜噜久久人人看| 26uuu国产日韩综合| 国产欧美一区二区三区在线老狼| 国产亚洲精品7777| 国产午夜精品理论片a级大结局| 中文久久乱码一区二区| 欧美一区午夜视频在线观看| 亚洲色图在线播放| 奇米精品一区二区三区在线观看| 精品无人码麻豆乱码1区2区 | 亚洲一区二区三区国产| 亚洲人成电影网站色mp4| 亚洲电影第三页| 从欧美一区二区三区| 色欧美片视频在线观看在线视频| 丁香桃色午夜亚洲一区二区三区| 99re成人精品视频| 久久久综合九色合综国产精品| 成人网页在线观看| 欧美日韩一级片在线观看| 亚洲精品伦理在线| 亚洲一区二区三区美女| 99热在这里有精品免费| 精品久久99ma| 欧美一级欧美一级在线播放| 亚洲成人av一区二区三区| 99久久国产综合精品麻豆| 国产天堂亚洲国产碰碰| 亚洲午夜精品网| 色视频欧美一区二区三区| 亚洲老妇xxxxxx| 91国偷自产一区二区开放时间 | 国模少妇一区二区三区| 色综合久久综合| 亚洲人成在线观看一区二区| 91免费看视频| 欧美日韩精品欧美日韩精品一| 亚洲精品视频在线观看网站| 国产激情偷乱视频一区二区三区 | 在线观看欧美日本| 全部av―极品视觉盛宴亚洲| 久久久久久黄色| 91在线观看成人| 国产精品久久综合| 成人av电影在线播放| 亚洲欧洲综合另类在线| 五月天亚洲婷婷| 中文字幕亚洲综合久久菠萝蜜| av动漫一区二区| 图片区日韩欧美亚洲| av在线不卡免费看| 国产精品拍天天在线| 一区二区三区高清不卡| 欧美日本在线播放| 在线观看日韩av先锋影音电影院| 国产麻豆精品在线| 一区二区三区不卡在线观看 | 亚洲欧美色图小说| 精品捆绑美女sm三区| 亚洲视频免费在线观看| 91麻豆精品一区二区三区| 日韩毛片一二三区| 日韩欧美第一区| 666欧美在线视频| 色综合av在线| 日本欧美一区二区| 一级做a爱片久久| 欧美一区二区三区在线电影| 美女国产一区二区| 亚洲自拍欧美精品| 亚洲欧美日韩一区二区| 国产精品女主播av| 亚洲三级在线免费| 亚洲欧美激情视频在线观看一区二区三区 | 久久综合久久综合亚洲| 91极品美女在线| 91麻豆自制传媒国产之光| 美腿丝袜亚洲三区| 亚洲青青青在线视频| 精品中文av资源站在线观看| 久久精品国产一区二区| 国产精品一品二品| 成人激情开心网| 欧美日韩精品高清| 91久久精品国产91性色tv | 亚洲精品精品亚洲| 亚洲男女一区二区三区| 亚洲444eee在线观看| 国产伦精一区二区三区| 欧美日韩午夜在线视频| 在线播放国产精品二区一二区四区| 成人性生交大片免费看在线播放 | 日本高清不卡在线观看| 国产精品一级黄| 在线观看一区二区精品视频| 在线免费观看不卡av| 欧美一三区三区四区免费在线看 | 97成人超碰视| 欧美日韩黄色一区二区| 精品国产乱码久久久久久闺蜜| 欧美成人在线直播| 亚洲国产一区二区视频| 555www色欧美视频| 国产精品久久久久久久午夜片| 亚州成人在线电影| 欧美探花视频资源| 久久久综合精品| 亚洲人成网站影音先锋播放| 日韩国产在线观看| 国产视频一区二区三区在线观看| 亚洲美女偷拍久久| 99国产精品久久久久| 亚洲欧美在线观看| 一本到不卡免费一区二区| wwwwxxxxx欧美| 亚洲第一综合色| 国产经典欧美精品| 久久女同精品一区二区| 激情综合色综合久久综合| 日韩午夜av电影| 国产精品中文字幕日韩精品| 国产精品国产自产拍在线| 在线欧美一区二区| 国产一区999| 日韩精品一区二区三区视频在线观看 | 一本在线高清不卡dvd| 亚洲一区二区欧美| 国产传媒日韩欧美成人| 在线电影国产精品| 亚洲少妇中出一区| 成人午夜视频在线|