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

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

?? hif.c

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

#include "ar6000_sdio.h"
#include "hif.h"
#include <ndis.h>

struct hif_device {
    SD_DEVICE_HANDLE *handle;
};

#ifdef CEPC
	NDIS_EVENT   hifIRQEvent;
#endif

static BOOL
hifDeviceInserted(SD_DEVICE_HANDLE *device);

static void
hifDeviceRemoved(SD_DEVICE_HANDLE *device);

static void 
hifRWCompletionHandler(SD_DEVICE_HANDLE  hDevice,
					   PSD_BUS_REQUEST   pRequest,
					   PVOID             notUsed,
					   DWORD             dwParam);

static SD_API_STATUS 
hifIRQHandler(SD_DEVICE_HANDLE hDevice, PVOID notUsed);

static HIF_DEVICE *
addHifDevice(SD_DEVICE_HANDLE *handle);

static HIF_DEVICE *
getHifDevice(SD_DEVICE_HANDLE *handle);

static void
delHifDevice(SD_DEVICE_HANDLE *handle);

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

static SD_FUNCTION   sdFunction;
HIF_DEVICE    hifDevice[HIF_MAX_DEVICES];
HTC_CALLBACKS htcCallbacks;
A_UINT16      maxBlocks;
A_UINT16      maxBlockSize;
A_UINT8       funcNo = 0;

/* ------ Functions ------ */
void
HIFRegisterCallbacks(HTC_CALLBACKS *callbacks)
{
    SD_API_STATUS sdStatus;

    /* Store the callback and event handlers */
    htcCallbacks.deviceInsertedHandler = callbacks->deviceInsertedHandler;
    htcCallbacks.deviceRemovedHandler = callbacks->deviceRemovedHandler;
    htcCallbacks.deviceSuspendHandler = callbacks->deviceSuspendHandler;
    htcCallbacks.deviceResumeHandler = callbacks->deviceResumeHandler;
    htcCallbacks.deviceWakeupHandler = callbacks->deviceWakeupHandler;
    htcCallbacks.rwCompletionHandler = callbacks->rwCompletionHandler;
	htcCallbacks.deviceInterruptDisabler = callbacks->deviceInterruptDisabler;
    htcCallbacks.deviceInterruptEnabler = callbacks->deviceInterruptEnabler;
	htcCallbacks.dsrHandler = callbacks->dsrHandler;

    /* Register with bus driver core */
    sdFunction.pName      = "sdio_wlan";
    sdFunction.pProbe     = hifDeviceInserted;
    sdFunction.pRemove    = hifDeviceRemoved;

    sdStatus = SDIORegisterFunction(&sdFunction);
    AR_DEBUG_ASSERT(SD_API_SUCCESS(sdStatus));
}

A_STATUS 
HIFReadWrite(HIF_DEVICE  *device, 
             A_UINT32     address, 
             A_UCHAR     *buffer, 
             A_UINT32     length, 
             HIF_REQUEST *request, 
             void        *context) 
{
    A_UINT8             rw;
    A_UINT8             mode;
    A_UINT8             opcode;
    A_UINT32            blockLen, blockCount, count;
    PSD_BUS_REQUEST     busRequest;
    A_STATUS            status = A_OK;
	SD_TRANSFER_CLASS   transferClass;
	DWORD               dwArg;
	A_UCHAR             command;
	SD_API_STATUS       sdStatus;
	SD_COMMAND_RESPONSE response;
 
    HIF_DEBUG_PRINTF(ATH_LOG_TRC, "HIFReadWrite:Enter\n");
	HIF_DEBUG_PRINTF(ATH_LOG_TRC, "Address 0x%x\n", address);
    
	if (request->dmode == HIF_BLOCK_BASIS && request->type != HIF_EXTENDED_IO) {
		HIF_DEBUG_PRINTF(ATH_LOG_ERR, "Block mode not allowed for this type of command\n");
		return A_ERROR;
	}

    if (request->dmode == HIF_BLOCK_BASIS) {
        mode = SD_IO_BLOCK_MODE;
        blockLen = HIF_MBOX_BLOCK_SIZE;
        blockCount = length / HIF_MBOX_BLOCK_SIZE;
		count = blockCount;
        HIF_DEBUG_PRINTF(ATH_LOG_TRC, 
                        "Block mode (BlockLen: %d, BlockCount: %d)\n",
                        blockLen, blockCount);
    } else if (request->dmode == HIF_BYTE_BASIS) {
        mode = SD_IO_BYTE_MODE;
        blockLen = length;
        blockCount = 1;
		count = blockLen;
        HIF_DEBUG_PRINTF(ATH_LOG_TRC, 
                        "Byte mode (BlockLen: %d, BlockCount: %d)\n",
                        blockLen, blockCount);
    } else {
        HIF_DEBUG_PRINTF(ATH_LOG_ERR, 
                        "Invalid data mode: %d\n", request->dmode);
        return A_ERROR;
	}

    if (request->amode == HIF_FIXED_ADDRESS) {
        opcode = SD_IO_FIXED_ADDRESS;
        HIF_DEBUG_PRINTF(ATH_LOG_TRC, "Fixed       ");
    } else if (request->amode == HIF_INCREMENTAL_ADDRESS) {
        opcode = SD_IO_INCREMENT_ADDRESS;
        HIF_DEBUG_PRINTF(ATH_LOG_TRC, "Incremental ");
    } else {
        HIF_DEBUG_PRINTF(ATH_LOG_ERR, 
                        "Invalid address mode: %d\n", request->amode);
        return A_ERROR;
    }

    if (request->direction == HIF_WRITE) {
        transferClass = SD_WRITE;
		rw = SD_IO_OP_WRITE;
		if ((address >= HIF_MBOX_START_ADDR(0)) && 
            (address <= HIF_MBOX_END_ADDR(3))) {
            /* Mailbox write. Adjust the address so that the last byte 
               falls on the EOM address */
            address = address + HIF_MBOX_WIDTH - length;
        }
        HIF_DEBUG_PRINTF(ATH_LOG_TRC, "[Write]");
	} else {
		transferClass = SD_READ;
		rw = SD_IO_OP_READ;
		HIF_DEBUG_PRINTF(ATH_LOG_TRC, "[Read ]");
	}
        

	if (request->type == HIF_EXTENDED_IO) {
		dwArg = BUILD_IO_RW_EXTENDED_ARG(rw, mode, funcNo, 
			address, opcode, count);
		command = SD_IO_RW_EXTENDED;

    } else if (request->type == HIF_BASIC_IO) {
		dwArg = BUILD_IO_RW_DIRECT_ARG(rw, SD_IO_RW_NORMAL, 
			funcNo, address, 0);
		command = SD_IO_RW_NORMAL;

	} else {
        HIF_DEBUG_PRINTF(ATH_LOG_ERR, 
                        "Invalid command type: %d\n", request->type);
        return A_ERROR;
	}

    if (request->emode == HIF_SYNCHRONOUS) {
        HIF_DEBUG_PRINTF(ATH_LOG_TRC, "Synchronous\n");

		sdStatus = SDSynchronousBusRequest(device->handle, command, dwArg,
					transferClass, ResponseR5, &response, blockCount, 
					blockLen, buffer, 0);
		if (!SD_API_SUCCESS(sdStatus)) {
			HIF_DEBUG_PRINTF(ATH_LOG_ERR, "SDBusRequest failed 0x%x\n", sdStatus);
			status = A_ERROR;
		}
  
	} else {
       	HIF_DEBUG_PRINTF(ATH_LOG_TRC, "Asynchronous\n");
		sdStatus = SDBusRequest(device->handle, command, dwArg, transferClass,
					ResponseR5, blockCount, blockLen, buffer,
					hifRWCompletionHandler, (DWORD) context, &busRequest, 0);
		
        if (!SD_API_SUCCESS(sdStatus)) {
            status = A_ERROR;
        }
  	}

    return status;
}

void
HIFShutDownDevice(HIF_DEVICE *device)
{
    SD_API_STATUS sdStatus;
    //SDCONFIG_BUS_MODE_DATA busSettings;
	UCHAR         buffer;

	if (device == NULL) {
		HIF_DEBUG_PRINTF(ATH_LOG_ERR, "Invalid Handle passed\n");
		return;
	}
    /* Remove the allocated current if any */
	/*
	 * There is no equivalent for this one in WINCE
    status = SDLIB_IssueConfig(device->handle, SDCONFIG_FUNC_FREE_SLOT_CURRENT, 
                               NULL, 0);
    DBG_ASSERT(SDIO_SUCCESS(status));
	*/

    /* Disable the card */
	SDIODisconnectInterrupt(device->handle);
    sdStatus = SDSetCardFeature(device->handle, SD_IO_FUNCTION_DISABLE,
			                      NULL, 0);
    AR_DEBUG_ASSERT(SD_API_SUCCESS(sdStatus));

    /* Perform a soft I/O reset */
	sdStatus = SDReadWriteRegistersDirect(device->handle, SD_IO_WRITE, 0, 
					SD_IO_REG_IO_ABORT, 1, &buffer, 0);
    AR_DEBUG_ASSERT(SD_API_SUCCESS(sdStatus));

    /* 
     * WAR - Codetelligence driver does not seem to shutdown correctly in 1
     * bit mode. By default it configures the HC in the 4 bit. Its later in
     * our driver that we switch to 1 bit mode. If we try to shutdown, the
     * driver hangs so we revert to 4 bit mode, to be transparent to the 
     * underlying bus driver.
     */
	/*
	 * Not sure whether this is required for WINCE hence commenting
	 */
	/*
    if (sdio1bitmode) {
        ZERO_OBJECT(busSettings);
        busSettings.BusModeFlags = device->handle->pHcd->CardProperties.BusMode;
        SDCONFIG_SET_BUS_WIDTH(busSettings.BusModeFlags, 
                               SDCONFIG_BUS_WIDTH_4_BIT);

        // Issue config request to change the bus width to 4 bit
        status = SDLIB_IssueConfig(device->handle, SDCONFIG_BUS_MODE_CTRL,
                                   &busSettings, 
                                   sizeof(SDCONFIG_BUS_MODE_DATA));
        DBG_ASSERT(SDIO_SUCCESS(status));
    }
	*/

    /* Unregister with bus driver core */
    sdStatus = SDIOUnregisterFunction(&sdFunction);
    AR_DEBUG_ASSERT(SD_API_SUCCESS(sdStatus));
	return;
}

void 
hifRWCompletionHandler(SD_DEVICE_HANDLE  hDevice,
					   PSD_BUS_REQUEST   pRequest,
					   PVOID             notUsed,
					   DWORD             dwParam) 
{
    A_STATUS status;
    PVOID    htcContext;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久综合久久综合久久综合| 蜜桃一区二区三区四区| 国产欧美一区二区在线观看| 日韩美女主播在线视频一区二区三区| 精品视频在线免费看| 一本久久综合亚洲鲁鲁五月天| 不卡av在线免费观看| 粉嫩av一区二区三区在线播放| 懂色av一区二区三区免费观看| 国产iv一区二区三区| 国产高清在线精品| 99热精品国产| 色综合久久中文综合久久牛| 91黄色在线观看| 日本精品一区二区三区四区的功能| 在线观看免费视频综合| 91传媒视频在线播放| 欧美日韩免费高清一区色橹橹| 欧美精品丝袜久久久中文字幕| 日韩一区二区三区精品视频| 日韩欧美一区中文| 久久伊人蜜桃av一区二区| 国产午夜久久久久| 最新国产精品久久精品| 亚洲裸体xxx| 香蕉成人伊视频在线观看| 日韩黄色免费网站| 久久99精品国产麻豆不卡| 国产一区高清在线| 99在线精品一区二区三区| 欧美在线三级电影| 精品伦理精品一区| 国产亚洲一区二区在线观看| 亚洲欧美欧美一区二区三区| 亚洲成人三级小说| 国产精品自拍网站| 91偷拍与自偷拍精品| 欧美精品视频www在线观看| 26uuu国产日韩综合| 一区在线中文字幕| 日本欧美在线观看| 懂色中文一区二区在线播放| 欧美一级欧美三级| 国产日韩成人精品| 性久久久久久久久| 国产精品一区二区久久精品爱涩| 99免费精品视频| 日韩欧美www| 亚洲视频你懂的| 男人的天堂久久精品| 成人免费高清视频在线观看| 欧美人与性动xxxx| 国产精品网曝门| 日韩精品乱码免费| eeuss影院一区二区三区| 欧美一区三区四区| 中文字幕精品在线不卡| 日韩有码一区二区三区| 成人av网址在线| 欧美一级xxx| 亚洲色图欧美偷拍| 国产一区二区看久久| 欧美日韩亚洲综合一区二区三区| 久久久久久**毛片大全| 午夜a成v人精品| 成人国产视频在线观看| 精品国产乱码久久久久久免费| 伊人一区二区三区| 国产91丝袜在线播放| 91精品国产一区二区| 亚洲人快播电影网| 成人一级视频在线观看| 欧美一区二区三区爱爱| 一区二区三区四区不卡在线| 国产精品综合二区| 日韩一级成人av| 亚洲综合图片区| 成人一区二区三区视频在线观看 | 国产亚洲一区二区三区| 天天操天天干天天综合网| hitomi一区二区三区精品| 26uuu亚洲综合色| 免费高清在线一区| 欧美日韩一区 二区 三区 久久精品| 中文字幕一区av| 国产成人精品www牛牛影视| 日韩视频一区二区三区 | 国产在线精品一区在线观看麻豆| 欧美日韩在线免费视频| 最好看的中文字幕久久| 成人午夜av电影| 国产午夜精品一区二区| 国产精品一区在线观看乱码| 日韩欧美国产午夜精品| 奇米综合一区二区三区精品视频| 欧美日韩国产123区| 久久福利视频一区二区| 7777精品伊人久久久大香线蕉超级流畅 | 欧美日韩日日摸| 亚洲黄色免费电影| 91尤物视频在线观看| 中文字幕成人网| 成人在线视频首页| 国产精品天美传媒| 成人动漫一区二区在线| 国产精品免费aⅴ片在线观看| 国产福利一区二区| 国产欧美一区二区精品久导航| 国产精品一区二区三区乱码| 久久久不卡影院| 成人福利在线看| 中文字幕一区二区三区在线观看| 不卡一区中文字幕| 亚洲欧洲日本在线| 91免费国产视频网站| 亚洲精品中文字幕乱码三区| 一本高清dvd不卡在线观看| 亚洲精选一二三| 欧美系列亚洲系列| 亚洲成人综合在线| 欧美一级久久久久久久大片| 久久国产精品一区二区| 久久久久久久一区| 波波电影院一区二区三区| 亚洲日本在线看| 欧美日韩精品一区二区天天拍小说| 婷婷久久综合九色综合绿巨人| 日韩三级视频在线看| 国产一区二区成人久久免费影院| 亚洲国产精品二十页| 99re免费视频精品全部| 亚洲综合999| 欧美zozozo| eeuss鲁片一区二区三区在线看| 亚洲愉拍自拍另类高清精品| 日韩午夜激情av| 国产成人免费在线| 亚洲女人****多毛耸耸8| 91麻豆精品国产91久久久久| 精品一区二区日韩| 最好看的中文字幕久久| 欧美高清视频一二三区 | 国产高清久久久| 一区二区三区中文字幕精品精品 | av高清不卡在线| 亚洲综合色在线| 日韩美一区二区三区| 97se亚洲国产综合自在线观| 首页国产欧美日韩丝袜| 久久久亚洲午夜电影| 91九色最新地址| 国产一区 二区| 亚洲自拍另类综合| 久久尤物电影视频在线观看| 日本精品一区二区三区四区的功能| 久久不见久久见中文字幕免费| 国产精品无人区| 欧美精品 日韩| av在线不卡免费看| 裸体健美xxxx欧美裸体表演| 中文字幕一区二区三区在线播放 | 国产精品久久久久久久久免费丝袜 | 国产精品午夜在线观看| 欧美视频一区二区三区| 国产美女视频一区| 亚洲3atv精品一区二区三区| 久久精品亚洲乱码伦伦中文| 欧美日韩精品综合在线| 成人精品免费网站| 男人的天堂亚洲一区| 一区二区三区精品视频在线| 一区二区三区中文字幕精品精品| 欧美精品一区二区久久婷婷| 欧美中文字幕一区| 高清在线观看日韩| 精品制服美女久久| 亚洲福利国产精品| 最新日韩av在线| 欧美国产成人精品| 欧美电影免费提供在线观看| 91福利国产精品| 99九九99九九九视频精品| 国产一区二三区好的| 美女网站视频久久| 亚洲小少妇裸体bbw| 中文字幕乱码久久午夜不卡| 日韩免费看网站| 欧美三级在线看| 91亚洲精品久久久蜜桃| 成人久久18免费网站麻豆 | 国产美女在线精品| 美洲天堂一区二卡三卡四卡视频| 亚洲第一搞黄网站| 一个色在线综合| 综合久久一区二区三区| 中文字幕五月欧美| 中文字幕一区二区在线观看| 欧美经典三级视频一区二区三区| 精品国一区二区三区| 精品国产伦一区二区三区观看方式|