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

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

?? htc_events.c

?? WLAN在AR6000程序中的驅動代碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
                        "Pulling %d tx credits from the target\n", 
                        txCreditsAvailable);

#ifdef DEBUG
        txcreditsavailable[endPointId] = txCreditsAvailable;
        txcreditsconsumed[endPointId] = txCreditsConsumed;
#endif /* DEBUG */

        if (txCreditsAvailable) {
            htcSendFrame(endPoint);
        } else {
            /* 
             * Enable the Tx credit counter interrupt so that we can get the
             * credits posted by the target.
             */

            htcEnableCreditCounterInterrupt(target, endPointId);

#ifdef DEBUG
            txcreditintrenable[endPointId] += 1;
            txcreditintrenableaggregate[endPointId] += 1;
#endif /* DEBUG */
        }
        break;

    case TX_CREDIT_COUNTER_RESET_REG:
        HTC_DEBUG_PRINTF(ATH_LOG_INF, "TX_CREDIT_COUNTER_RESET_REG\n");
        endPointId = regBuffer->offset;

        /* 
         * Enable the Tx credit counter interrupt so that we can get the
         * credits posted by the target.
         */
        htcEnableCreditCounterInterrupt(target, endPointId);

#ifdef DEBUG
        txcreditintrenable[endPointId] += 1;
        txcreditintrenableaggregate[endPointId] += 1;
#endif /* DEBUG */
        break;

    case COUNTER_INT_STATUS_ENABLE_REG:
        HTC_DEBUG_PRINTF(ATH_LOG_INF, "COUNTER_INT_STATUS_ENABLE: 0x%x\n",
                        target->table.counter_int_status_enable);
        break;

    case COUNTER_INT_STATUS_DISABLE_REG:
        HTC_DEBUG_PRINTF(ATH_LOG_INF, "COUNTER_INT_STATUS_DISABLE:0x%x\n",
                        target->table.counter_int_status_enable);
		
        HIFAckInterrupt(target->device);
        HTC_DEBUG_PRINTF(ATH_LOG_TRC, "htcDSRHandler - ACK\n");
        break;


    case INT_WLAN_REG:
        HTC_DEBUG_PRINTF(ATH_LOG_INF, "INT_WLAN: 0x%x\n",
                        target->table.int_wlan);
        target->table.int_wlan = 0;

        /* Mark the target state as ready and signal the waiting sem */
        target->ready = TRUE;
        A_WAKE_UP(&htcEvent);
        break;

	case INT_STATUS_ENABLE_REG:
        HTC_DEBUG_PRINTF(ATH_LOG_INF, "INT_STATUS_ENABLE: 0x%x\n",
                        target->table.int_status_enable);
        break;


    default:
        HTC_DEBUG_PRINTF(ATH_LOG_ERR, 
                        "Invalid register address: %d\n", regBuffer->base);
    }

    /* Free the register request structure */
    freeRegRequestElement(element);

    HTC_DEBUG_PRINTF(ATH_LOG_TRC, "htcRegCompletion - Exit\n");

    return ret;
}


A_STATUS
htcTargetInsertedHandler(HIF_DEVICE *device)
{
    HTC_TARGET *target;
    HTC_ENDPOINT *endPoint;
    A_UINT8 count1, count2;
    HTC_EVENT_INFO eventInfo;
    HTC_REG_BUFFER *regBuffer;
    HTC_QUEUE_ELEMENT *element;
    HTC_MBOX_BUFFER *mboxBuffer;
    HTC_REG_REQUEST_LIST *regList;
    HTC_DATA_REQUEST_QUEUE *sendQueue, *recvQueue;
	HIF_REQUEST request;
	A_STATUS status;
    A_UINT32 address;

    HTC_DEBUG_PRINTF(ATH_LOG_TRC, "htcTargetInserted - Enter\n");

    /* Initialize the locks */
    A_MUTEX_INIT(&instanceCS);
    A_MUTEX_INIT(&creditCS);
    A_MUTEX_INIT(&counterCS);
    A_MUTEX_INIT(&txCS);

    /* Allocate target memory */
    if ((target = (HTC_TARGET *)A_MALLOC(sizeof(HTC_TARGET))) == NULL) {
        HTC_DEBUG_PRINTF(ATH_LOG_ERR, "Unable to allocate memory\n");
        return A_ERROR;
    }
    A_MEMZERO(target, sizeof(HTC_TARGET));
    target->device = device;
    target->ready = FALSE;

    /* Initialize the endpoints, mbox queues, event table */
    for (count1 = ENDPOINT1; count1 <= ENDPOINT4; count1 ++) {
        endPoint = &target->endPoint[count1];
        HTC_DEBUG_PRINTF(ATH_LOG_INF, 
                        "endPoint[%d]: %p\n", count1, endPoint);
        A_MEMZERO(endPoint->txCreditsAvailable, HTC_TX_CREDITS_NUM_MAX);
        endPoint->txCreditsConsumed = 0;
        endPoint->txCreditsIntrEnable = FALSE;
        endPoint->rxLengthPending = 0;
        endPoint->target = target;
        endPoint->enabled = FALSE;
        for (count2 = 0; count2<HTC_DATA_REQUEST_RING_BUFFER_SIZE; count2 ++) {
            /* Send Queue */
            sendQueue = &endPoint->sendQueue;
            sendQueue->head = sendQueue->size = 0;
            element = &sendQueue->element[count2];
            A_MEMZERO(element, sizeof(HTC_DATA_REQUEST_ELEMENT));
            element->buffer.free = TRUE;
            element->completionCB = htcTxCompletionCB;
            mboxBuffer = GET_MBOX_BUFFER(element);
            mboxBuffer->endPoint = endPoint;

            /* Receive Queue */
            recvQueue = &endPoint->recvQueue;
            recvQueue->head = recvQueue->size = 0;
            element = &recvQueue->element[count2];
            A_MEMZERO(element, sizeof(HTC_DATA_REQUEST_ELEMENT));
            element->buffer.free = TRUE;
            element->completionCB = htcRxCompletionCB;
            mboxBuffer = GET_MBOX_BUFFER(element);
            mboxBuffer->endPoint = endPoint;
        }
        A_MEMZERO(&target->endPoint[count1].eventTable, 
                  sizeof(HTC_ENDPOINT_EVENT_TABLE));
    }

    /* Populate the block size for each of the end points */
    endPoint = &target->endPoint[ENDPOINT1];
    endPoint->blockSize = HIF_MBOX0_BLOCK_SIZE;
    endPoint = &target->endPoint[ENDPOINT2];
    endPoint->blockSize = HIF_MBOX1_BLOCK_SIZE;
    endPoint = &target->endPoint[ENDPOINT3];
    endPoint->blockSize = HIF_MBOX2_BLOCK_SIZE;
    endPoint = &target->endPoint[ENDPOINT4];
    endPoint->blockSize = HIF_MBOX3_BLOCK_SIZE;

    /* Initialize the shadow copy of the target register table */
    A_MEMZERO(&target->table, sizeof(HTC_REGISTER_TABLE));

    /* Initialize the register request list */
    regList = &target->regList;
    for (count1 = 0; count1 < HTC_REG_REQUEST_LIST_SIZE; count1 ++) {
        element = &regList->element[count1];
        A_MEMZERO(element, sizeof(HTC_REG_REQUEST_ELEMENT));
        element->buffer.free = TRUE;
        element->completionCB = htcRegCompletionCB;
        regBuffer = GET_REG_BUFFER(element);
        regBuffer->target = target;
    }

    /* Add the target instance to the global list */
    addTargetInstance(target);

    /* Disable all the dragon interrupts */
    target->table.int_status_enable = 0;
    target->table.cpu_int_status_enable = 0;
    target->table.error_status_enable = 0;
    target->table.counter_int_status_enable = 0;
    HIF_FRAME_REQUEST(&request, HIF_WRITE, HIF_EXTENDED_IO, HIF_SYNCHRONOUS,
                      HIF_BYTE_BASIS, HIF_INCREMENTAL_ADDRESS);
    address = getRegAddr(INT_STATUS_ENABLE_REG, ENDPOINT_UNUSED);
    status = HIFReadWrite(target->device, address, 
                          &target->table.int_status_enable, 4, &request, NULL);
    AR_DEBUG_ASSERT(status == A_OK);

    /* 
     * Frame a TARGET_AVAILABLE event and send it to the host. Return the
     * HIF_DEVICE handle as a parameter with the event.
     */
    FRAME_EVENT(eventInfo, (A_UCHAR *)device, sizeof(HIF_DEVICE *), 
                sizeof(HIF_DEVICE *), A_OK, NULL);
    dispatchEvent(target, ENDPOINT_UNUSED, HTC_TARGET_AVAILABLE, &eventInfo);

    HTC_DEBUG_PRINTF(ATH_LOG_TRC, "htcTargetInserted - Exit\n");

    return A_OK;
}

A_STATUS
htcTargetRemovedHandler(HIF_DEVICE *device)
{
    HTC_TARGET *target;
    HTC_EVENT_INFO eventInfo;

    /* Get the target instance bound to this device */
    target = getTargetInstance(device);

    if (target != NULL) {
        /* Frame a TARGET_UNAVAILABLE event and send it to the host */
        FRAME_EVENT(eventInfo, NULL, 0, 0, A_OK, NULL);
        dispatchEvent(target, ENDPOINT_UNUSED, HTC_TARGET_UNAVAILABLE, 
                      &eventInfo);
    }

    A_MUTEX_DESTROY(&txCS);
    A_MUTEX_DESTROY(&counterCS);
    A_MUTEX_DESTROY(&creditCS);
    A_MUTEX_DESTROY(&instanceCS);
       
    return A_OK;
}

/* For shared interrupts, it is unsafe to update the shadow copies of the int_status and int_status_enable values 
 * since, the ar6kisrhandler can be called at any time while the DSR is running due to shared nature of interrupts.
 * Hence modified to simply read the values off the hardware directly 
 */

A_STATUS
htcInterruptPending(HIF_DEVICE *device, A_BOOL *intPending)
{
    A_STATUS status;
    A_UINT32 address;
    HTC_TARGET *target;
    HIF_REQUEST request;
    A_UCHAR      intStatus[2] = {0,0};
    A_UCHAR      intMask[2] = {0,0};

    target = getTargetInstance(device);
    AR_DEBUG_ASSERT(target != NULL);
    HTC_DEBUG_PRINTF(ATH_LOG_TRC, 
                    "htcInterruptPending Enter target: 0x%p\n", target);

    // get the current interrupt status register
    HIF_FRAME_REQUEST(&request, HIF_READ, HIF_EXTENDED_IO, HIF_SYNCHRONOUS,
                      HIF_BYTE_BASIS, HIF_FIXED_ADDRESS);
    address = getRegAddr(INT_STATUS_REG, ENDPOINT_UNUSED);

#ifdef ONLY_16BIT
    status = HIFReadWrite(target->device, address, 
                          intStatus, 2, &request, NULL);
#else
    status = HIFReadWrite(target->device, address, 
                          intStatus, 1, &request, NULL);
#endif
    AR_DEBUG_ASSERT(status == A_OK);

    // get the interrupt enable register value 
    HIF_FRAME_REQUEST(&request, HIF_READ, HIF_EXTENDED_IO, HIF_SYNCHRONOUS,
                      HIF_BYTE_BASIS, HIF_FIXED_ADDRESS);

    address = getRegAddr(INT_STATUS_ENABLE_REG, ENDPOINT_UNUSED);

#ifdef ONLY_16BIT
    status = HIFReadWrite(target->device, address, 
                          intMask, 2, &request, NULL);
#else
    status = HIFReadWrite(target->device, address, 
                          intMask, 1, &request, NULL);
#endif
    AR_DEBUG_ASSERT(status == A_OK);
    if (!((intMask[0] & intStatus[0]) == 0)) {
	    *intPending = TRUE;
    } else {
	    *intPending = FALSE;
    }
    return A_OK;
}


A_STATUS
htcInterruptDisabler(HIF_DEVICE *device,A_BOOL *callDsr)
{
    A_STATUS status;
    A_UINT32 address;
    HTC_TARGET *target;
    HIF_REQUEST request;
    A_BOOL interruptPending;

    target = getTargetInstance(device);
    AR_DEBUG_ASSERT(target != NULL);
	
    HTC_DEBUG_PRINTF(ATH_LOG_TRC, 
	                    "htcInterruptDisabler Enter target: 0x%p\n", target);
    
    // Check for spurious interrupt
    status = htcInterruptPending (device, &interruptPending);
		
    if (!interruptPending){
        *callDsr=FALSE; 
    } else {
	    /* 
         * Disable the interrupts from Dragon.
         *  We do the interrupt servicing in the bottom half and reenable the
         *  Dragon interrupts at the end of the bottom-half
	     */
   
        target->table.int_status_enable = 0;
        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);
#ifdef ONLY_16BIT
        status = HIFReadWrite(target->device, address, 
                          &target->table.int_status_enable, 2, &request, NULL);
#else
        status = HIFReadWrite(target->device, address, 
                          &target->table.int_status_enable, 1, &request, NULL);
#endif
        AR_DEBUG_ASSERT(status == A_OK);
        *callDsr=TRUE;
    }

    HTC_DEBUG_PRINTF(ATH_LOG_TRC, "htcInterruptDisabler: Exit\n");
    return A_OK;
}

A_STATUS
htcDSRHandler(HIF_DEVICE *device)
{
    A_STATUS status;
    A_UINT32 address;
    HTC_TARGET *target;
    HIF_REQUEST request;
    A_UCHAR host_int_status;

    target = getTargetInstance(device);
    AR_DEBUG_ASSERT(target != NULL);
    HTC_DEBUG_PRINTF(ATH_LOG_TRC, 
                    "htcDsrHandler: Enter (target: 0x%p\n", target);

    /* 
     * Read the first 28 bytes of the HTC register table. This will yield us
     * the value of different int status registers and the lookahead 
     * registers.
     *    length = sizeof(int_status) + sizeof(cpu_int_status) + 
     *             sizeof(error_int_status) + sizeof(counter_int_status) + 
     *             sizeof(mbox_frame) + sizeof(rx_lookahead_valid) + 
     *             sizeof(hole) +  sizeof(rx_lookahead) +
     *             sizeof(int_status_enable) + sizeof(cpu_int_status_enable) +
     *             sizeof(error_status_enable) + 
     *             sizeof(counter_int_status_enable);
     */
    HIF_FRAME_REQUEST(&request, HIF_READ, HIF_EXTENDED_IO, HIF_SYNCHRONOUS, 
                      HIF_BYTE_BASIS, HIF_INCREMENTAL_ADDRESS);
    address = getRegAddr(INT_STATUS_REG, ENDPOINT_UNUSED);
    status = HIFReadWrite(target->device, address, 
                          &target->table.host_int_status, 28, 
                          &request, NULL);
    AR_DEBUG_ASSERT(status == A_OK);

#ifdef DEBUG
    dumpRegisters(target);
#endif /* DEBUG */
    
    /* Update only those registers that are enabled */
	/* This is not required as we have Already checked for 
	 * spuriours interrupt in htcInterruptDisabler
	 */
    host_int_status = target->table.host_int_status;// &
                      //target->table.int_status_enable;
		
    HTC_DEBUG_PRINTF(ATH_LOG_INF, 
                    "Valid interrupt source(s) in INT_STATUS: 0x%x\n", 
                    host_int_status);

    if (HOST_INT_STATUS_CPU_GET(host_int_status)) {
        /* CPU Interrupt */
        htcServiceCPUInterrupt(target);
    }
 
    if (HOST_INT_STATUS_ERROR_GET(host_int_status)) {
        /* Error Interrupt */
        htcServiceErrorInterrupt(target);
    }

    if (HOST_INT_STATUS_MBOX_DATA_GET(host_int_status)) {
        /* Mailbox Interrupt */
        htcServiceMailboxInterrupt(target);
    }


    if (HOST_INT_STATUS_COUNTER_GET(host_int_status)) {
        /* Counter Interrupt */
        htcServiceCounterInterrupt(target);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲一级二级三级| 美女精品自拍一二三四| 欧美一级高清片| 成人性生交大片免费| 日韩中文欧美在线| 久久精品在这里| 69堂国产成人免费视频| 不卡欧美aaaaa| 激情久久五月天| 亚洲va中文字幕| 国产精品对白交换视频| 精品美女在线播放| 欧美色精品天天在线观看视频| 国产酒店精品激情| 三级一区在线视频先锋| 亚洲已满18点击进入久久| 中文字幕国产精品一区二区| 欧美大白屁股肥臀xxxxxx| 欧美私人免费视频| 一本一本大道香蕉久在线精品| 国产剧情一区二区| 狠狠色丁香久久婷婷综合_中 | av在线不卡免费看| 精品一区二区精品| 日韩有码一区二区三区| 一区二区三区在线看| 国产精品女主播av| 国产婷婷一区二区| 国产亚洲欧洲一区高清在线观看| 日韩三级在线观看| 69堂成人精品免费视频| 欧美色爱综合网| 欧美色区777第一页| 一本大道久久精品懂色aⅴ| 国产91清纯白嫩初高中在线观看| 国产一区二区不卡在线| 极品美女销魂一区二区三区免费| 蜜桃视频第一区免费观看| 日本不卡不码高清免费观看| 午夜伦欧美伦电影理论片| 亚洲成人动漫一区| 午夜电影一区二区| 午夜影院在线观看欧美| 性久久久久久久久| 香蕉av福利精品导航 | 成人黄色综合网站| 成人爱爱电影网址| 色综合久久久久综合| 色噜噜偷拍精品综合在线| 欧美最新大片在线看| 欧洲人成人精品| 欧美日韩在线不卡| 欧美一二区视频| 亚洲精品一区二区三区精华液| 久久久久久久久久久久久夜| 久久精品人人做人人综合 | 风流少妇一区二区| 成人福利视频在线| 一本久道久久综合中文字幕| 一本大道久久a久久综合| 欧美写真视频网站| 欧美一区二区免费观在线| 久久综合色鬼综合色| 国产丝袜美腿一区二区三区| 日韩美女视频一区二区 | 激情欧美一区二区三区在线观看| 国精产品一区一区三区mba视频| 国产福利一区在线| 日韩精品中文字幕在线不卡尤物| 日韩欧美的一区| 国产精品不卡一区二区三区| 亚洲一区二区av在线| 裸体健美xxxx欧美裸体表演| 成人综合婷婷国产精品久久| 欧美性色欧美a在线播放| 日韩视频在线观看一区二区| 中文一区一区三区高中清不卡| 亚洲精品美国一| 麻豆精品视频在线| 成人短视频下载| 欧美精品日韩一本| 久久久久久久av麻豆果冻| 亚洲综合一区二区| 另类人妖一区二区av| aaa欧美色吧激情视频| 欧美日韩精品欧美日韩精品| 2020国产精品| 亚洲高清在线精品| 国产成人在线视频网站| 精品视频资源站| 国产日韩欧美高清| 天堂在线亚洲视频| 99久久免费精品| 久久久不卡影院| 日本va欧美va瓶| 色婷婷激情综合| 国产欧美一区二区三区在线看蜜臀 | 久久久www免费人成精品| 亚洲精品成人天堂一二三| 国内精品在线播放| 欧美精品精品一区| 中文字幕字幕中文在线中不卡视频| 久久成人久久爱| 欧美性大战久久| 国产精品久久久久久久久快鸭| 免费av成人在线| 欧美中文字幕一区| 亚洲欧洲日本在线| 国产高清在线精品| 欧美成人video| 舔着乳尖日韩一区| 日本福利一区二区| 国产精品美女一区二区| 国产一区二区网址| 欧美一级片免费看| 五月婷婷久久综合| 欧美怡红院视频| **欧美大码日韩| 国产一区二区三区在线看麻豆| 91麻豆精品91久久久久久清纯| 亚洲美女少妇撒尿| 99re成人精品视频| 国产精品入口麻豆原神| 国内偷窥港台综合视频在线播放| 日韩一区二区免费在线观看| 石原莉奈在线亚洲三区| 欧美视频你懂的| 亚洲成人三级小说| 欧美日韩小视频| 亚洲午夜影视影院在线观看| 91国产免费观看| 一区二区三区免费在线观看| 色婷婷综合久色| 一区二区三区在线高清| 99热在这里有精品免费| 亚洲图片欧美激情| 91女人视频在线观看| 亚洲人成7777| 欧美在线色视频| 亚洲午夜久久久久久久久电影院| 欧美色电影在线| 首页综合国产亚洲丝袜| 欧美一二三在线| 激情小说亚洲一区| 久久久久久电影| 成人看片黄a免费看在线| 中文字幕日韩av资源站| 91国在线观看| 天天操天天综合网| 日韩免费观看高清完整版| 国产毛片精品国产一区二区三区| 国产亚洲精品7777| av欧美精品.com| 一区二区三区精品在线| 欧美福利电影网| 国产综合色精品一区二区三区| 中文字幕国产精品一区二区| 色婷婷综合久久久中文一区二区| 亚洲成人动漫一区| 久久这里只有精品6| 成人禁用看黄a在线| 亚洲欧美日韩综合aⅴ视频| 欧美伊人久久久久久午夜久久久久| 亚洲高清免费在线| 日韩精品一区二区在线观看| 高清国产一区二区| 一区二区不卡在线播放| 91精品啪在线观看国产60岁| 国产在线国偷精品产拍免费yy| 中文一区二区在线观看| 欧美三级在线看| 国产一区二区在线免费观看| 亚洲色图欧美在线| 91精品国产91久久久久久最新毛片| 国产中文字幕精品| 亚洲视频1区2区| 日韩精品在线看片z| eeuss鲁片一区二区三区在线观看| 亚洲成人1区2区| 中文字幕乱码日本亚洲一区二区| 欧美少妇性性性| 成人性生交大片免费看中文| 三级在线观看一区二区| 国产精品嫩草99a| 欧美精品 日韩| 99久久99久久免费精品蜜臀| 久久精品免费看| 一区二区三区四区在线免费观看 | 午夜一区二区三区视频| 欧美精品一区二区在线观看| 欧美自拍丝袜亚洲| 国产成人一区二区精品非洲| 亚洲福利电影网| 国产欧美日韩另类视频免费观看| 欧美亚洲一区二区在线| 成人黄色777网| 国产综合色产在线精品| 日日噜噜夜夜狠狠视频欧美人| 中文字幕不卡在线播放| 欧美一卡二卡在线|