aboutsummaryrefslogtreecommitdiff
path: root/include/linux/sdio/sdio_busdriver.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux/sdio/sdio_busdriver.h')
-rw-r--r--include/linux/sdio/sdio_busdriver.h1435
1 files changed, 0 insertions, 1435 deletions
diff --git a/include/linux/sdio/sdio_busdriver.h b/include/linux/sdio/sdio_busdriver.h
deleted file mode 100644
index 35e3ebbe928..00000000000
--- a/include/linux/sdio/sdio_busdriver.h
+++ /dev/null
@@ -1,1435 +0,0 @@
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-@file: sdio_busdriver.h
-
-@abstract: include file for registration of SDIO function drivers
- and SDIO host controller bus drivers.
-
-@notice: Copyright (c), 2004-2006 Atheros Communications, Inc.
-
-
- *
- * 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.
- *
- * Portions of this code were developed with information supplied from the
- * SD Card Association Simplified Specifications. The following conditions and disclaimers may apply:
- *
- * The following conditions apply to the release of the SD simplified specification (�Simplified
- * Specification�) by the SD Card Association. The Simplified Specification is a subset of the complete
- * SD Specification which is owned by the SD Card Association. This Simplified Specification is provided
- * on a non-confidential basis subject to the disclaimers below. Any implementation of the Simplified
- * Specification may require a license from the SD Card Association or other third parties.
- * Disclaimers:
- * The information contained in the Simplified Specification is presented only as a standard
- * specification for SD Cards and SD Host/Ancillary products and is provided "AS-IS" without any
- * representations or warranties of any kind. No responsibility is assumed by the SD Card Association for
- * any damages, any infringements of patents or other right of the SD Card Association or any third
- * parties, which may result from its use. No license is granted by implication, estoppel or otherwise
- * under any patent or other rights of the SD Card Association or any third party. Nothing herein shall
- * be construed as an obligation by the SD Card Association to disclose or distribute any technical
- * information, know-how or other confidential information to any third party.
- *
- *
- * The initial developers of the original code are Seung Yi and Paul Lever
- *
- * sdio@atheros.com
- *
- *
-
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
-#ifndef __SDIO_BUSDRIVER_H___
-#define __SDIO_BUSDRIVER_H___
-
-typedef UINT8 CT_VERSION_CODE;
-#define CT_SDIO_STACK_VERSION_CODE ((CT_VERSION_CODE)0x26) /* version code that must be set in various structures */
-#define CT_SDIO_STACK_VERSION_MAJOR(v) (((v) & 0xF0) >> 4)
-#define CT_SDIO_STACK_VERSION_MINOR(v) (((v) & 0x0F))
-#define SET_SDIO_STACK_VERSION(p) (p)->Version = CT_SDIO_STACK_VERSION_CODE
-#define GET_SDIO_STACK_VERSION(p) (p)->Version
-#define GET_SDIO_STACK_VERSION_MAJOR(p) CT_SDIO_STACK_VERSION_MAJOR(GET_SDIO_STACK_VERSION(p))
-#define GET_SDIO_STACK_VERSION_MINOR(p) CT_SDIO_STACK_VERSION_MINOR(GET_SDIO_STACK_VERSION(p))
-#include "sdlist.h"
-
-/* card flags */
-typedef UINT16 CARD_INFO_FLAGS;
-#define CARD_MMC 0x0001 /* Multi-media card */
-#define CARD_SD 0x0002 /* SD-Memory present */
-#define CARD_SDIO 0x0004 /* SDIO present */
-#define CARD_RAW 0x0008 /* Raw card */
-#define CARD_COMBO (CARD_SD | CARD_SDIO) /* SDIO with SD */
-#define CARD_TYPE_MASK 0x000F /* card type mask */
-#define CARD_SD_WP 0x0010 /* SD WP on */
-#define CARD_PSEUDO 0x0020 /* pseudo card (internal use) */
-#define CARD_HIPWR 0x0040 /* card can use more than 200mA (SDIO 1.1 or greater)*/
-#define GET_CARD_TYPE(flags) ((flags) & CARD_TYPE_MASK)
-
-/* bus mode and clock rate */
-typedef UINT32 SD_BUSCLOCK_RATE; /* clock rate in hz */
-typedef UINT16 SD_BUSMODE_FLAGS;
-#define SDCONFIG_BUS_WIDTH_RESERVED 0x00
-#define SDCONFIG_BUS_WIDTH_SPI 0x01
-#define SDCONFIG_BUS_WIDTH_1_BIT 0x02
-#define SDCONFIG_BUS_WIDTH_4_BIT 0x03
-#define SDCONFIG_BUS_WIDTH_MMC8_BIT 0x04
-#define SDCONFIG_BUS_WIDTH_MASK 0x0F
-#define SDCONFIG_SET_BUS_WIDTH(flags,width) \
-{ \
- (flags) &= ~SDCONFIG_BUS_WIDTH_MASK; \
- (flags) |= (width); \
-}
-#define SDCONFIG_GET_BUSWIDTH(flags) ((flags) & SDCONFIG_BUS_WIDTH_MASK)
-#define SDCONFIG_BUS_MODE_SPI_NO_CRC 0x40 /* SPI bus is operating with NO CRC */
-#define SDCONFIG_BUS_MODE_SD_HS 0x80 /* set interface to SD high speed mode */
-#define SDCONFIG_BUS_MODE_MMC_HS 0x20 /* set interface to MMC high speed mode */
-
-typedef UINT16 SD_SLOT_CURRENT; /* slot current in mA */
-
-typedef UINT8 SLOT_VOLTAGE_MASK; /* slot voltage */
-#define SLOT_POWER_3_3V 0x01
-#define SLOT_POWER_3_0V 0x02
-#define SLOT_POWER_2_8V 0x04
-#define SLOT_POWER_2_0V 0x08
-#define SLOT_POWER_1_8V 0x10
-#define SLOT_POWER_1_6V 0x20
-
-#define MAX_CARD_RESPONSE_BYTES 17
-
-/* plug and play information for SD cards */
-typedef struct _SD_PNP_INFO {
- UINT16 SDIO_ManufacturerCode; /* JEDEC Code */
- UINT16 SDIO_ManufacturerID; /* manf-specific ID */
- UINT8 SDIO_FunctionNo; /* function number 1-7 */
- UINT8 SDIO_FunctionClass; /* function class */
- UINT8 SDMMC_ManfacturerID; /* card CID's MANF-ID */
- UINT16 SDMMC_OEMApplicationID; /* card CID's OEMAPP-ID */
- CARD_INFO_FLAGS CardFlags; /* card flags */
-}SD_PNP_INFO, *PSD_PNP_INFO;
-
-#define IS_LAST_SDPNPINFO_ENTRY(id)\
- (((id)->SDIO_ManufacturerCode == 0) &&\
- ((id)->SDIO_ManufacturerID == 0) &&\
- ((id)->SDIO_FunctionNo == 0) &&\
- ((id)->SDIO_FunctionClass == 0) &&\
- ((id)->SDMMC_OEMApplicationID == 0) && \
- ((id)->CardFlags == 0))
-
-/* card properties */
-typedef struct _CARD_PROPERTIES {
- UINT8 IOFnCount; /* number of I/O functions */
- UINT8 SDIORevision; /* SDIO revision */
-#define SDIO_REVISION_1_00 0x00
-#define SDIO_REVISION_1_10 0x01
-#define SDIO_REVISION_1_20 0x02
- UINT8 SD_MMC_Revision; /* SD or MMC revision */
-#define SD_REVISION_1_01 0x00
-#define SD_REVISION_1_10 0x01
-#define MMC_REVISION_1_0_2_2 0x00
-#define MMC_REVISION_3_1 0x01
-#define MMC_REVISION_4_0 0x02
- UINT16 SDIO_ManufacturerCode; /* JEDEC Code */
- UINT16 SDIO_ManufacturerID; /* manf-specific ID */
- UINT32 CommonCISPtr; /* common CIS ptr */
- UINT16 RCA; /* relative card address */
- UINT8 SDIOCaps; /* SDIO card capabilities (refer to SDIO spec for decoding) */
- UINT8 CardCSD[MAX_CARD_RESPONSE_BYTES]; /* for SD/MMC cards */
- CARD_INFO_FLAGS Flags; /* card flags */
- SD_BUSCLOCK_RATE OperBusClock; /* operational bus clock (based on HCD limit)*/
- SD_BUSMODE_FLAGS BusMode; /* current card bus mode */
- UINT16 OperBlockLenLimit; /* operational bytes per block length limit*/
- UINT16 OperBlockCountLimit; /* operational number of blocks per transfer limit */
- UINT8 CardState; /* card state flags */
- SLOT_VOLTAGE_MASK CardVoltage; /* card operational voltage */
-#define CARD_STATE_REMOVED 0x01
-}CARD_PROPERTIES, *PCARD_PROPERTIES;
-
-/* SDREQUEST request flags */
-typedef UINT32 SDREQUEST_FLAGS;
-/* write operation */
-#define SDREQ_FLAGS_DATA_WRITE 0x8000
-/* has data (read or write) */
-#define SDREQ_FLAGS_DATA_TRANS 0x4000
-/* command is an atomic APP command, requiring CMD55 to be issued */
-#define SDREQ_FLAGS_APP_CMD 0x2000
-/* transfer should be handled asynchronously */
-#define SDREQ_FLAGS_TRANS_ASYNC 0x1000
-/* host should skip the SPI response filter for this command */
-#define SDREQ_FLAGS_RESP_SKIP_SPI_FILT 0x0800
-/* host should skip the response check for this data transfer */
-#define SDREQ_FLAGS_DATA_SKIP_RESP_CHK 0x0400
-/* flag requesting a CMD12 be automatically issued by host controller */
-#define SDREQ_FLAGS_AUTO_CMD12 0x0200
-/* flag indicating that the data buffer meets HCD's DMA restrictions */
-#define SDREQ_FLAGS_DATA_DMA 0x0010
-/* indicate to host that this is a short and quick transfer, the HCD may optimize
- * this request to reduce interrupt overhead */
-#define SDREQ_FLAGS_DATA_SHORT_TRANSFER 0x00010000
-/* indicate to the host that this is a raw request */
-#define SDREQ_FLAGS_RAW 0x00020000
-/* auto data transfer status check for MMC and Memory cards */
-#define SDREQ_FLAGS_AUTO_TRANSFER_STATUS 0x00100000
-
-#define SDREQ_FLAGS_UNUSED1 0x00200000
-#define SDREQ_FLAGS_UNUSED2 0x00400000
-#define SDREQ_FLAGS_UNUSED3 0x00800000
-#define SDREQ_FLAGS_UNUSED4 0x01000000
-#define SDREQ_FLAGS_UNUSED5 0x02000000
-
-/* the following flags are internal use only */
-#define SDREQ_FLAGS_FORCE_DEFERRED_COMPLETE 0x0100
-/* flag indicating that response has been converted (internal use) */
-#define SDREQ_FLAGS_RESP_SPI_CONVERTED 0x0040
-/* request was cancelled - internal use only */
-#define SDREQ_FLAGS_CANCELED 0x0020
-/* a barrier operation */
-#define SDREQ_FLAGS_BARRIER 0x00040000
-/* a pseudo bus request */
-#define SDREQ_FLAGS_PSEUDO 0x00080000
-/* queue to the head */
-#define SDREQ_FLAGS_QUEUE_HEAD 0x04000000
-
-#define SDREQ_FLAGS_I_UNUSED1 0x08000000
-#define SDREQ_FLAGS_I_UNUSED2 0x10000000
-#define SDREQ_FLAGS_I_UNUSED3 0x20000000
-#define SDREQ_FLAGS_I_UNUSED4 0x40000000
-#define SDREQ_FLAGS_I_UNUSED5 0x80000000
-
-/* response type mask */
-#define SDREQ_FLAGS_RESP_MASK 0x000F
-#define GET_SDREQ_RESP_TYPE(flags) ((flags) & SDREQ_FLAGS_RESP_MASK)
-#define IS_SDREQ_WRITE_DATA(flags) ((flags) & SDREQ_FLAGS_DATA_WRITE)
-#define IS_SDREQ_DATA_TRANS(flags) ((flags) & SDREQ_FLAGS_DATA_TRANS)
-#define IS_SDREQ_RAW(flags) ((flags) & SDREQ_FLAGS_RAW)
-#define IS_SDREQ_FORCE_DEFERRED_COMPLETE(flags) ((flags) & SDREQ_FLAGS_FORCE_DEFERRED_COMPLETE)
-#define SDREQ_FLAGS_NO_RESP 0x0000
-#define SDREQ_FLAGS_RESP_R1 0x0001
-#define SDREQ_FLAGS_RESP_R1B 0x0002
-#define SDREQ_FLAGS_RESP_R2 0x0003
-#define SDREQ_FLAGS_RESP_R3 0x0004
-#define SDREQ_FLAGS_RESP_MMC_R4 0x0005 /* not supported, for future use */
-#define SDREQ_FLAGS_RESP_MMC_R5 0x0006 /* not supported, for future use */
-#define SDREQ_FLAGS_RESP_R6 0x0007
-#define SDREQ_FLAGS_RESP_SDIO_R4 0x0008
-#define SDREQ_FLAGS_RESP_SDIO_R5 0x0009
-
-struct _SDREQUEST;
-struct _SDFUNCTION;
-
-typedef void (*PSDEQUEST_COMPLETION)(struct _SDREQUEST *);
-
-/* defines SD/MMC and SDIO requests for the RAW-mode API */
-typedef struct _SDREQUEST {
- SDLIST SDList; /* internal use list*/
- UINT32 Argument; /* SD/SDIO/MMC 32 bit argument */
- SDREQUEST_FLAGS Flags; /* request flags */
- ATOMIC_FLAGS InternalFlags; /* internal use flags */
- UINT8 Command; /* SD/SDIO/MMC 8 bit command */
- UINT8 Response[MAX_CARD_RESPONSE_BYTES]; /* buffer for CMD response */
- UINT16 BlockCount; /* number of blocks to send/rcv */
- UINT16 BlockLen; /* length of each block */
- UINT16 DescriptorCount; /* number of DMA descriptor entries in pDataBuffer if DMA */
- PVOID pDataBuffer; /* starting address of buffer (or ptr to PSDDMA_DESCRIPTOR*/
- UINT32 DataRemaining; /* number of bytes remaining in the transfer (internal use) */
- PVOID pHcdContext; /* internal use context */
- PSDEQUEST_COMPLETION pCompletion; /* function driver completion routine */
- PVOID pCompleteContext; /* function driver completion context */
- SDIO_STATUS Status; /* completion status */
- struct _SDFUNCTION* pFunction; /* function driver that generated request (internal use)*/
- INT RetryCount; /* number of times to retry on error, non-data cmds only */
- PVOID pBdRsv1; /* reserved */
- PVOID pBdRsv2;
- PVOID pBdRsv3;
-}SDREQUEST, *PSDREQUEST;
-
- /* a request queue */
-typedef struct _SDREQUESTQUEUE {
- SDLIST Queue; /* the queue of requests */
- BOOL Busy; /* busy flag */
-}SDREQUESTQUEUE, *PSDREQUESTQUEUE;
-
-
-typedef UINT16 SDCONFIG_COMMAND;
-/* SDCONFIG request flags */
-/* get operation */
-#define SDCONFIG_FLAGS_DATA_GET 0x8000
-/* put operation */
-#define SDCONFIG_FLAGS_DATA_PUT 0x4000
-/* host controller */
-#define SDCONFIG_FLAGS_HC_CONFIG 0x2000
-/* both */
-#define SDCONFIG_FLAGS_DATA_BOTH (SDCONFIG_FLAGS_DATA_GET | SDCONFIG_FLAGS_DATA_PUT)
-/* no data */
-#define SDCONFIG_FLAGS_DATA_NONE 0x0000
-
-/* SDCONFIG commands */
-#define SDCONFIG_GET_HCD_DEBUG (SDCONFIG_FLAGS_HC_CONFIG | SDCONFIG_FLAGS_DATA_GET | 275)
-#define SDCONFIG_SET_HCD_DEBUG (SDCONFIG_FLAGS_HC_CONFIG | SDCONFIG_FLAGS_DATA_PUT | 276)
-
-/* custom hcd commands */
-#define SDCONFIG_GET_HOST_CUSTOM (SDCONFIG_FLAGS_HC_CONFIG | SDCONFIG_FLAGS_DATA_GET | 300)
-#define SDCONFIG_PUT_HOST_CUSTOM (SDCONFIG_FLAGS_HC_CONFIG | SDCONFIG_FLAGS_DATA_PUT | 301)
-
-/* function commands */
-#define SDCONFIG_FUNC_ENABLE_DISABLE (SDCONFIG_FLAGS_DATA_PUT | 18)
-#define SDCONFIG_FUNC_UNMASK_IRQ (SDCONFIG_FLAGS_DATA_NONE | 21)
-#define SDCONFIG_FUNC_MASK_IRQ (SDCONFIG_FLAGS_DATA_NONE | 22)
-#define SDCONFIG_FUNC_ACK_IRQ (SDCONFIG_FLAGS_DATA_NONE | 23)
-#define SDCONFIG_FUNC_SPI_MODE_DISABLE_CRC (SDCONFIG_FLAGS_DATA_NONE | 24)
-#define SDCONFIG_FUNC_SPI_MODE_ENABLE_CRC (SDCONFIG_FLAGS_DATA_NONE | 25)
-#define SDCONFIG_FUNC_ALLOC_SLOT_CURRENT (SDCONFIG_FLAGS_DATA_PUT | 26)
-#define SDCONFIG_FUNC_FREE_SLOT_CURRENT (SDCONFIG_FLAGS_DATA_NONE | 27)
-#define SDCONFIG_FUNC_CHANGE_BUS_MODE (SDCONFIG_FLAGS_DATA_BOTH | 28)
-#define SDCONFIG_FUNC_CHANGE_BUS_MODE_ASYNC (SDCONFIG_FLAGS_DATA_BOTH | 29)
-#define SDCONFIG_FUNC_NO_IRQ_PEND_CHECK (SDCONFIG_FLAGS_DATA_NONE | 30)
-
-typedef UINT8 FUNC_ENABLE_DISABLE_FLAGS;
-typedef UINT32 FUNC_ENABLE_TIMEOUT;
-
- /* function enable */
-typedef struct _SDCONFIG_FUNC_ENABLE_DISABLE_DATA {
-#define SDCONFIG_DISABLE_FUNC 0x0000
-#define SDCONFIG_ENABLE_FUNC 0x0001
- FUNC_ENABLE_DISABLE_FLAGS EnableFlags; /* enable flags*/
- FUNC_ENABLE_TIMEOUT TimeOut; /* timeout in milliseconds */
- void (*pOpComplete)(PVOID Context, SDIO_STATUS status); /* reserved */
- PVOID pOpCompleteContext; /* reserved */
-}SDCONFIG_FUNC_ENABLE_DISABLE_DATA, *PSDCONFIG_FUNC_ENABLE_DISABLE_DATA;
-
- /* slot current allocation data */
-typedef struct _SDCONFIG_FUNC_SLOT_CURRENT_DATA {
- SD_SLOT_CURRENT SlotCurrent; /* slot current to request in mA*/
-}SDCONFIG_FUNC_SLOT_CURRENT_DATA, *PSDCONFIG_FUNC_SLOT_CURRENT_DATA;
-
-/* slot bus mode configuration */
-typedef struct _SDCONFIG_BUS_MODE_DATA {
- SD_BUSCLOCK_RATE ClockRate; /* clock rate in Hz */
- SD_BUSMODE_FLAGS BusModeFlags; /* bus mode flags */
- SD_BUSCLOCK_RATE ActualClockRate; /* actual rate in KHz */
-}SDCONFIG_BUS_MODE_DATA, *PSDCONFIG_BUS_MODE_DATA;
-
-/* defines configuration requests for the HCD */
-typedef struct _SDCONFIG {
- SDCONFIG_COMMAND Cmd; /* configuration command */
- PVOID pData; /* configuration data */
- INT DataLength; /* config data length */
-}SDCONFIG, *PSDCONFIG;
-
-#define SET_SDCONFIG_CMD_INFO(pHdr,cmd,pC,len) \
-{ \
- (pHdr)->Cmd = (cmd); \
- (pHdr)->pData = (PVOID)(pC); \
- (pHdr)->DataLength = (len); \
-}
-
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- @function: Get a pointer to the configuration command data.
-
- @function name: GET_SDCONFIG_CMD
- @prototype: UNIT16 GET_SDCONFIG_CMD (PSDCONFIG pCommand)
- @category: HD_Reference
-
- @input: pCommand - config command structure.
-
- @return: command code
-
- @notes: Implemented as a macro. This macro returns the command code for this
- configuration request.
-
- @example: getting the command code:
- cmd = GET_SDCONFIG_CMD(pConfig);
- switch (cmd) {
- case SDCONFIG_GET_WP:
- .. get write protect switch position
- break;
- ...
- }
-
- @see also: GET_SDCONFIG_CMD_LEN, GET_SDCONFIG_CMD_DATA
-
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
-#define GET_SDCONFIG_CMD(pBuffer) ((pBuffer)->Cmd)
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- @function: Get a pointer to the configuration command data.
-
- @function name: GET_SDCONFIG_CMD_LEN
- @prototype: INT GET_SDCONFIG_CMD_LEN (PSDCONFIG pCommand)
- @category: HD_Reference
-
- @input: pCommand - config command structure.
-
- @return: length of config command data
-
- @notes: Implemented as a macro. Host controller drivers can use this macro to extract
- the number of bytes of command specific data. This can be used to validate the
- config data buffer size.
-
- @example: getting the data length:
- length = GET_SDCONFIG_CMD_LEN(pConfig);
- if (length < CUSTOM_COMMAND_XXX_SIZE) {
- ... invalid length
- }
-
- @see also: GET_SDCONFIG_CMD, GET_SDCONFIG_CMD_DATA
-
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
-#define GET_SDCONFIG_CMD_LEN(pBuffer) ((pBuffer)->DataLength)
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- @function: Get a pointer to the configuration command data.
-
- @function name: GET_SDCONFIG_CMD_DATA
- @prototype: (casted ptr) GET_SDCONFIG_CMD_DATA (type, PSDCONFIG pCommand)
- @category: HD_Reference
-
- @input: type - pointer type to cast the returned pointer to.
- pCommand - config command structure.
-
- @return: type-casted pointer to the command's data
-
- @notes: Implemented as a macro. Host controller drivers can use this macro to extract
- a pointer to the command specific data in an HCD configuration request.
-
- @example: getting the pointer:
- // get interrupt control data
- pIntControl = GET_SDCONFIG_CMD_DATA(PSDCONFIG_SDIO_INT_CTRL_DATA,pConfig);
- if (pIntControl->SlotIRQEnable) {
- ... enable slot IRQ detection
- }
-
- @see also: GET_SDCONFIG_CMD, GET_SDCONFIG_CMD_LEN
-
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
-#define GET_SDCONFIG_CMD_DATA(type,pBuffer) ((type)((pBuffer)->pData))
-#define IS_SDCONFIG_CMD_GET(pBuffer) ((pBuffer)->Cmd & SDCONFIG_FLAGS_DATA_GET)
-#define IS_SDCONFIG_CMD_PUT(pBuffer) ((pBuffer)->Cmd & SDCONFIG_FLAGS_DATA_PUT)
-
-struct _SDDEVICE;
-struct _SDHCD;
-
-typedef UINT8 SD_FUNCTION_FLAGS;
-#define SDFUNCTION_FLAG_REMOVING 0x01
-
-/* function driver registration structure */
-typedef struct _SDFUNCTION {
- CT_VERSION_CODE Version; /* version code of the SDIO stack */
- SDLIST SDList; /* internal use list*/
- PTEXT pName; /* name of registering driver */
- UINT MaxDevices; /* maximum number of devices supported by this function */
- UINT NumDevices; /* number of devices supported by this function */
- PSD_PNP_INFO pIds; /* null terminated table of supported devices*/
- BOOL (*pProbe)(struct _SDFUNCTION *pFunction, struct _SDDEVICE *pDevice);/* New device inserted */
- /* Device removed (NULL if not a hot-plug capable driver) */
- void (*pRemove)(struct _SDFUNCTION *pFunction, struct _SDDEVICE *pDevice);
- SDIO_STATUS (*pSuspend)(struct _SDFUNCTION *pFunction, SDPOWER_STATE state); /* Device suspended */
- SDIO_STATUS (*pResume)(struct _SDFUNCTION *pFunction); /* Device woken up */
- /* Enable wake event */
- SDIO_STATUS (*pWake) (struct _SDFUNCTION *pFunction, SDPOWER_STATE state, BOOL enable);
- PVOID pContext; /* function driver use data */
- OS_PNPDRIVER Driver; /* driver registration with base system */
- SDLIST DeviceList; /* the list of devices this driver is using*/
- OS_SIGNAL CleanupReqSig; /* wait for requests completion on cleanup (internal use) */
- SD_FUNCTION_FLAGS Flags; /* internal flags (internal use) */
-}SDFUNCTION, *PSDFUNCTION;
-
-typedef UINT8 HCD_EVENT;
-
- /* device info for SDIO functions */
-typedef struct _SDIO_DEVICE_INFO {
- UINT32 FunctionCISPtr; /* function's CIS ptr */
- UINT32 FunctionCSAPtr; /* function's CSA ptr */
- UINT16 FunctionMaxBlockSize; /* function's reported max block size */
-}SDIO_DEVICE_INFO, *PSDIO_DEVICE_INFO;
-
- /* device info for SD/MMC card functions */
-typedef struct _SDMMC_INFO{
- UINT8 Unused; /* reserved */
-}SDMMC_INFO, *PSDMMC_INFO;
-
- /* union of SDIO function and device info */
-typedef union _SDDEVICE_INFO {
- SDIO_DEVICE_INFO AsSDIOInfo;
- SDMMC_INFO AsSDMMCInfo;
-}SDDEVICE_INFO, *PSDDEVICE_INFO;
-
-
-typedef UINT8 SD_DEVICE_FLAGS;
-#define SDDEVICE_FLAG_REMOVING 0x01
-
-/* inserted device description, describes an inserted card */
-typedef struct _SDDEVICE {
- SDLIST SDList; /* internal use list*/
- SDLIST FuncListLink; /* internal use list */
- /* read/write request function */
- SDIO_STATUS (*pRequest)(struct _SDDEVICE *pDev, PSDREQUEST req);
- /* get/set configuration */
- SDIO_STATUS (*pConfigure)(struct _SDDEVICE *pDev, PSDCONFIG config);
- PSDREQUEST (*AllocRequest)(struct _SDDEVICE *pDev); /* allocate a request */
- void (*FreeRequest)(struct _SDDEVICE *pDev, PSDREQUEST pReq); /* free the request */
- void (*pIrqFunction)(PVOID pContext); /* interrupt routine, synchronous calls allowed */
- void (*pIrqAsyncFunction)(PVOID pContext); /* async IRQ function , asynch only calls */
- PVOID IrqContext; /* irq context */
- PVOID IrqAsyncContext; /* irq async context */
- PSDFUNCTION pFunction; /* function driver supporting this device */
- struct _SDHCD *pHcd; /* host controller this device is on (internal use) */
- SDDEVICE_INFO DeviceInfo; /* device info */
- SD_PNP_INFO pId[1]; /* id of this device */
- OS_PNPDEVICE *Device; /* device registration with base system */
- SD_SLOT_CURRENT SlotCurrentAlloc; /* allocated slot current for this device/function (internal use) */
- SD_DEVICE_FLAGS Flags; /* internal use flags */
- CT_VERSION_CODE Version; /* version code of the bus driver */
-}SDDEVICE, *PSDDEVICE;
-
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- @function: Get SDIO Bus Driver Version Major number
-
- @function name: SDDEVICE_GET_VERSION_MAJOR
- @prototype: INT SDDEVICE_GET_VERSION_MAJOR(PSDDEVICE pDevice)
- @category: PD_Reference
-
- @input: pDevice - the target device for this request
-
- @output: none
-
- @return: integer value for the major version
-
- @notes: Implemented as a macro.
-
- @see also: SDDEVICE_GET_VERSION_MINOR
-
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
-#define SDDEVICE_GET_VERSION_MAJOR(pDev) (GET_SDIO_STACK_VERSION_MAJOR(pDev))
-
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- @function: Get SDIO Bus Driver Version Minor number
-
- @function name: SDDEVICE_GET_VERSION_MINOR
- @prototype: INT SDDEVICE_GET_VERSION_MINOR(PSDDEVICE pDevice)
- @category: PD_Reference
-
- @input: pDevice - the target device for this request
-
- @output: none
-
- @return: integer value for the minor version
-
- @notes: Implemented as a macro.
-
- @see also: SDDEVICE_GET_VERSION_MAJOR
-
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
-#define SDDEVICE_GET_VERSION_MINOR(pDev) (GET_SDIO_STACK_VERSION_MINOR(pDev))
-
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- @function: Test the SDIO revision for greater than or equal to 1.10
-
- @function name: SDDEVICE_IS_SDIO_REV_GTEQ_1_10
- @prototype: BOOL SDDEVICE_IS_SDIO_REV_GTEQ_1_10(PSDDEVICE pDevice)
- @category: PD_Reference
-
- @input: pDevice - the target device for this request
-
- @output: none
-
- @return: TRUE if the revision is greater than or equal to 1.10
-
- @notes: Implemented as a macro.
-
- @see also: SDDEVICE_IS_SD_REV_GTEQ_1_10
- @see also: SDDEVICE_IS_MMC_REV_GTEQ_4_0
-
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
-#define SDDEVICE_IS_SDIO_REV_GTEQ_1_10(pDev) ((pDev)->pHcd->CardProperties.SDIORevision >= SDIO_REVISION_1_10)
-
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- @function: Test the SDIO revision for greater than or equal to 1.20
-
- @function name: SDDEVICE_IS_SDIO_REV_GTEQ_1_20
- @prototype: BOOL SDDEVICE_IS_SDIO_REV_GTEQ_1_20(PSDDEVICE pDevice)
- @category: PD_Reference
-
- @input: pDevice - the target device for this request
-
- @output: none
-
- @return: TRUE if the revision is greater than or equal to 1.20
-
- @notes: Implemented as a macro.
-
- @see also: SDDEVICE_IS_SD_REV_GTEQ_1_10
- @see also: SDDEVICE_IS_SDIO_REV_GTEQ_1_10
-
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
-#define SDDEVICE_IS_SDIO_REV_GTEQ_1_20(pDev) ((pDev)->pHcd->CardProperties.SDIORevision >= SDIO_REVISION_1_20)
-
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- @function: Test the SD revision for greater than or equal to 1.10
-
- @function name: SDDEVICE_IS_SD_REV_GTEQ_1_10
- @prototype: BOOL SDDEVICE_IS_SD_REV_GTEQ_1_10(PSDDEVICE pDevice)
- @category: PD_Reference
-
- @input: pDevice - the target device for this request
-
- @output: none
-
- @return: TRUE if the revision is greater than or equal to 1.10
-
- @notes: Implemented as a macro.
-
- @see also: SDDEVICE_IS_SDIO_REV_GTEQ_1_10
- @see also: SDDEVICE_IS_MMC_REV_GTEQ_4_0
-
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
-#define SDDEVICE_IS_SD_REV_GTEQ_1_10(pDev) ((pDev)->pHcd->CardProperties.SD_MMC_Revision >= SD_REVISION_1_10)
-
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- @function: Test the MMC revision for greater than or equal to 4.0
-
- @function name: SDDEVICE_IS_MMC_REV_GTEQ_4_0
- @prototype: BOOL SDDEVICE_IS_MMC_REV_GTEQ_4_0(PSDDEVICE pDevice)
- @category: PD_Reference
-
- @input: pDevice - the target device for this request
-
- @output: none
-
- @return: TRUE if the revision is greater than or equal to 4.0
-
- @notes: Implemented as a macro.
-
- @see also: SDDEVICE_IS_SDIO_REV_GTEQ_1_10
- @see also: SDDEVICE_IS_SD_REV_GTEQ_1_10
-
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
-#define SDDEVICE_IS_MMC_REV_GTEQ_4_0(pDev) ((pDev)->pHcd->CardProperties.SD_MMC_Revision >= MMC_REVISION_4_0)
-
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- @function: Test for write protect enabled
-
- @function name: SDDEVICE_IS_CARD_WP_ON
- @prototype: BOOL SDDEVICE_IS_CARD_WP_ON(PSDDEVICE pDevice)
- @category: PD_Reference
-
- @input: pDevice - the target device for this request
-
- @output: none
-
- @return: TRUE if device is write protected.
-
- @notes: Implemented as a macro.
-
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
-#define SDDEVICE_IS_CARD_WP_ON(pDev) ((pDev)->pHcd->CardProperties.Flags & CARD_SD_WP)
-
-
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- @function: Get the device's manufacturer specific ID
-
- @function name: SDDEVICE_GET_SDIO_MANFID
- @prototype: UINT16 SDDEVICE_GET_SDIO_MANFID(PSDDEVICE pDevice)
- @category: PD_Reference
-
- @input: pDevice - the target device for this request
-
- @output: none
-
- @return: function number
-
- @notes: Implemented as a macro.
-
- @see also: SDDEVICE_GET_SDIO_MANFCODE
-
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
-#define SDDEVICE_GET_SDIO_MANFID(pDev) (pDev)->pId[0].SDIO_ManufacturerID
-
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- @function: Get the device's manufacturer code
-
- @function name: SDDEVICE_GET_SDIO_MANFCODE
- @prototype: UINT16 SDDEVICE_GET_SDIO_MANFCODE(PSDDEVICE pDevice)
- @category: PD_Reference
-
- @input: pDevice - the target device for this request
-
- @output: none
-
- @return: function number
-
- @notes: Implemented as a macro.
-
- @see also: SDDEVICE_GET_SDIO_MANFID
-
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
-#define SDDEVICE_GET_SDIO_MANFCODE(pDev) (pDev)->pId[0].SDIO_ManufacturerCode
-
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- @function: Get the device's function number
-
- @function name: SDDEVICE_GET_SDIO_FUNCNO
- @prototype: UINT8 SDDEVICE_GET_SDIO_FUNCNO(PSDDEVICE pDevice)
- @category: PD_Reference
-
- @input: pDevice - the target device for this request
-
- @output: none
-
- @return: function number
-
- @notes: Implemented as a macro.
-
- @see also: SDDEVICE_GET_SDIO_FUNC_CLASS
-
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
-#define SDDEVICE_GET_SDIO_FUNCNO(pDev) (pDev)->pId[0].SDIO_FunctionNo
-
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- @function: Get the functions's class
-
- @function name: SDDEVICE_GET_SDIO_FUNC_CLASS
- @prototype: UINT8 SDDEVICE_GET_SDIO_FUNC_CLASS(PSDDEVICE pDevice)
- @category: PD_Reference
-
- @input: pDevice - the target device for this request
-
- @output: none
-
- @return: class number
-
- @notes: Implemented as a macro.
-
- @see also: SDDEVICE_GET_SDIO_FUNCNO
-
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
-#define SDDEVICE_GET_SDIO_FUNC_CLASS(pDev) (pDev)->pId[0].SDIO_FunctionClass
-
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- @function: Get the functions's Card Information Structure pointer
-
- @function name: SDDEVICE_GET_SDIO_FUNC_CISPTR
- @prototype: UINT32 SDDEVICE_GET_SDIO_FUNC_CISPTR(PSDDEVICE pDevice)
- @category: PD_Reference
-
- @input: pDevice - the target device for this request
-
- @output: none
-
- @return: CIS offset
-
- @notes: Implemented as a macro.
-
- @see also: SDDEVICE_GET_SDIO_FUNC_CSAPTR
- @see also: SDDEVICE_GET_SDIO_COMMON_CISPTR
-
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
-#define SDDEVICE_GET_SDIO_FUNC_CISPTR(pDev)(pDev)->DeviceInfo.AsSDIOInfo.FunctionCISPtr
-
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- @function: Get the functions's Code Stoarge Area pointer
-
- @function name: SDDEVICE_GET_SDIO_FUNC_CSAPTR
- @prototype: UINT32 SDDEVICE_GET_SDIO_FUNC_CSAPTR(PSDDEVICE pDevice)
- @category: PD_Reference
-
- @input: pDevice - the target device for this request
-
- @output: none
-
- @return: CSA offset
-
- @notes: Implemented as a macro.
-
- @see also: SDDEVICE_GET_SDIO_FUNC_CISPTR
-
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
-#define SDDEVICE_GET_SDIO_FUNC_CSAPTR(pDev)(pDev)->DeviceInfo.AsSDIOInfo.FunctionCSAPtr
-
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- @function: Get the functions's maximum reported block size
-
- @function name: SDDEVICE_GET_SDIO_FUNC_MAXBLKSIZE
- @prototype: UINT16 SDDEVICE_GET_SDIO_FUNC_MAXBLKSIZE(PSDDEVICE pDevice)
- @category: PD_Reference
-
- @input: pDevice - the target device for this request
-
- @output: none
-
- @return: block size
-
- @notes: Implemented as a macro.
-
- @see also:
-
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
-#define SDDEVICE_GET_SDIO_FUNC_MAXBLKSIZE(pDev) (pDev)->DeviceInfo.AsSDIOInfo.FunctionMaxBlockSize
-
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- @function: Get the common Card Information Structure pointer
-
- @function name: SDDEVICE_GET_SDIO_COMMON_CISPTR
- @prototype: UINT32 SDDEVICE_GET_SDIO_COMMON_CISPTR(PSDDEVICE pDevice)
- @category: PD_Reference
-
- @input: pDevice - the target device for this request
-
- @output: none
-
- @return: Common CIS Address (in SDIO address space)
-
- @notes: Implemented as a macro.
-
- @see also: SDDEVICE_GET_SDIO_FUNC_CSAPTR
-
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
-#define SDDEVICE_GET_SDIO_COMMON_CISPTR(pDev) (pDev)->pHcd->CardProperties.CommonCISPtr
-
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- @function: Get the card capabilities
-
- @function name: SDDEVICE_GET_SDIO_CARD_CAPS
- @prototype: UINT8 SDDEVICE_GET_SDIO_CARD_CAPS(PSDDEVICE pDevice)
- @category: PD_Reference
-
- @input: pDevice - the target device for this request
-
- @output: none
-
- @return: 8-bit card capabilities register
-
- @notes: Implemented as a macro. Refer to SDIO spec for decoding.
-
- @see also: SDDEVICE_GET_CARD_FLAGS
- @see also: SDDEVICE_GET_SDIOCARD_CAPS
-
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
-#define SDDEVICE_GET_SDIO_CARD_CAPS(pDev) (pDev)->pHcd->CardProperties.SDIOCaps
-
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- @function: Get the card flags
-
- @function name: SDDEVICE_GET_CARD_FLAGS
- @prototype: CARD_INFO_FLAGS SDDEVICE_GET_CARD_FLAGS(PSDDEVICE pDevice)
- @category: PD_Reference
-
- @input: pDevice - the target device for this request
-
- @output: none
-
- @return: flags
-
- @notes: Implemented as a macro.
-
- @example: Get card type:
- CARD_INFO_FLAGS flags;
- flags = SDDEVICE_GET_CARD_FLAGS(pDevice);
- switch(GET_CARD_TYPE(flags)) {
- case CARD_MMC: // Multi-media card
- ...
- case CARD_SD: // SD-Memory present
- ...
- case CARD_SDIO: // SDIO card present
- ...
- case CARD_COMBO: //SDIO card with SD
- ...
- }
- if (flags & CARD_SD_WP) {
- ...SD write protect on
- }
-
- @see also: SDDEVICE_GET_SDIO_CARD_CAPS
-
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
-#define SDDEVICE_GET_CARD_FLAGS(pDev) (pDev)->pHcd->CardProperties.Flags
-
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- @function: Get the Relative Card Address register
-
- @function name: SDDEVICE_GET_CARD_RCA
- @prototype: UINT16 SDDEVICE_GET_CARD_RCA(PSDDEVICE pDevice)
- @category: PD_Reference
-
- @input: pDevice - the target device for this request
-
- @output: none
-
- @return: register address
-
- @notes: Implemented as a macro. Refer to SDIO spec for decoding.
-
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
-#define SDDEVICE_GET_CARD_RCA(pDev) (pDev)->pHcd->CardProperties.RCA
-
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- @function: Get operational bus clock
-
- @function name: SDDEVICE_GET_OPER_CLOCK
- @prototype: SD_BUSCLOCK_RATE SDDEVICE_GET_OPER_CLOCK(PSDDEVICE pDevice)
- @category: PD_Reference
-
- @input: pDevice - the target device for this request
-
- @output: none
-
- @return: clock rate
-
- @notes: Implemented as a macro. Returns the current bus clock rate.
- This may be lower than reported by the card due to Host Controller,
- Bus driver, or power management limitations.
-
- @see also: SDDEVICE_GET_MAX_CLOCK
-
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
-#define SDDEVICE_GET_OPER_CLOCK(pDev) (pDev)->pHcd->CardProperties.OperBusClock
-
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- @function: Get maximum bus clock
-
- @function name: SDDEVICE_GET_MAX_CLOCK
- @prototype: SD_BUSCLOCK_RATE SDDEVICE_GET_MAX_CLOCK(PSDDEVICE pDevice)
- @category: PD_Reference
-
- @input: pDevice - the target device for this request
-
- @output: none
-
- @return: clock rate
-
- @notes: To obtain the current maximum clock rate use SDDEVICE_GET_OPER_CLOCK().
- This rate my be lower than the host controllers maximum obtained using
- SDDEVICE_GET_MAX_CLOCK().
-
- @see also: SDDEVICE_GET_OPER_CLOCK
-
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
-#define SDDEVICE_GET_MAX_CLOCK(pDev) (pDev)->pHcd->MaxClockRate
-
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- @function: Get operational maximum block length.
-
- @function name: SDDEVICE_GET_OPER_BLOCK_LEN
- @prototype: UINT16 SDDEVICE_GET_OPER_BLOCK_LEN(PSDDEVICE pDevice)
- @category: PD_Reference
-
- @input: pDevice - the target device for this request
-
- @output: none
-
- @return: block size in bytes
-
- @notes: Implemented as a macro. Returns the maximum current block length.
- This may be lower than reported by the card due to Host Controller,
- Bus driver, or power management limitations.
-
- @see also: SDDEVICE_GET_MAX_BLOCK_LEN
-
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
-#define SDDEVICE_GET_OPER_BLOCK_LEN(pDev) (pDev)->pHcd->CardProperties.OperBlockLenLimit
-
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- @function: Get maximum block length.
-
- @function name: SDDEVICE_GET_MAX_BLOCK_LEN
- @prototype: UINT16 SDDEVICE_GET_MAX_BLOCK_LEN(PSDDEVICE pDevice)
- @category: PD_Reference
-
- @input: pDevice - the target device for this request
-
- @output: none
-
- @return: block size in bytes
-
- @notes: Implemented as a macro. Use SDDEVICE_GET_OPER_BLOCK_LEN to obtain
- the current block length.
-
- @see also: SDDEVICE_GET_OPER_BLOCK_LEN
-
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
-#define SDDEVICE_GET_MAX_BLOCK_LEN(pDev) (pDev)->pHcd->MaxBytesPerBlock
-
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- @function: Get operational maximum block count.
-
- @function name: SDDEVICE_GET_OPER_BLOCKS
- @prototype: UINT16 SDDEVICE_GET_OPER_BLOCKS(PSDDEVICE pDevice)
- @category: PD_Reference
-
- @input: pDevice - the target device for this request
-
- @output: none
-
- @return: maximum number of blocks per transaction.
-
- @notes: Implemented as a macro. Returns the maximum current block count.
- This may be lower than reported by the card due to Host Controller,
- Bus driver, or power management limitations.
-
- @see also: SDDEVICE_GET_MAX_BLOCK_LEN
-
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
-#define SDDEVICE_GET_OPER_BLOCKS(pDev) (pDev)->pHcd->CardProperties.OperBlockCountLimit
-
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- @function: Get maximum block count.
-
- @function name: SDDEVICE_GET_MAX_BLOCKS
- @prototype: UINT16 SDDEVICE_GET_MAX_BLOCKS(PSDDEVICE pDevice)
- @category: PD_Reference
-
- @input: pDevice - the target device for this request
-
- @output: none
-
- @return: maximum number of blocks per transaction.
-
- @notes: Implemented as a macro. Use SDDEVICE_GET_OPER_BLOCKS to obtain
- the current block count.
-
- @see also: SDDEVICE_GET_OPER_BLOCKS
-
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
-#define SDDEVICE_GET_MAX_BLOCKS(pDev) (pDev)->pHcd->MaxBlocksPerTrans
-
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- @function: Get applied slot voltage
-
- @function name: SDDEVICE_GET_SLOT_VOLTAGE_MASK
- @prototype: SLOT_VOLTAGE_MASK SDDEVICE_GET_SLOT_VOLTAGE_MASK(PSDDEVICE pDevice)
- @category: PD_Reference
-
- @input: pDevice - the target device for this request
-
- @output: none
-
- @return: slot voltage mask
-
- @notes: This function returns the applied voltage on the slot. The voltage value is a
- mask having the following values:
- SLOT_POWER_3_3V
- SLOT_POWER_3_0V
- SLOT_POWER_2_8V
- SLOT_POWER_2_0V
- SLOT_POWER_1_8V
- SLOT_POWER_1_6V
-
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
-#define SDDEVICE_GET_SLOT_VOLTAGE_MASK(pDev) (pDev)->pHcd->CardProperties.CardVoltage
-
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- @function: Get the Card Specific Data Register.
-
- @function name: SDDEVICE_GET_CARDCSD
- @prototype: PUINT8 SDDEVICE_GET_CARDCSD(PSDDEVICE pDevice)
- @category: PD_Reference
-
- @input: pDevice - the target device for this request
-
- @output: none
-
- @return: UINT8 CardCSD[MAX_CARD_RESPONSE_BYTES] array of CSD data.
-
- @notes: Implemented as a macro.
-
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
-#define SDDEVICE_GET_CARDCSD(pDev) (pDev)->pHcd->CardProperties.CardCSD
-
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- @function: Get the bus mode flags
-
- @function name: SDDEVICE_GET_BUSMODE_FLAGS
- @prototype: SD_BUSMODE_FLAGS SDDEVICE_GET_BUSMODE_FLAGS(PSDDEVICE pDevice)
- @category: PD_Reference
-
- @input: pDevice - the target device for this request
-
- @output: none
-
- @return:
-
- @notes: Implemented as a macro. This function returns the raw bus mode flags. This
- is useful for function drivers that wish to override the bus clock without
- modifying the current bus mode.
-
- @see also: SDDEVICE_GET_BUSWIDTH
- @see also: SDCONFIG_BUS_MODE_CTRL
-
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
-#define SDDEVICE_GET_BUSMODE_FLAGS(pDev) (pDev)->pHcd->CardProperties.BusMode
-
-
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- @function: Get the bus width.
-
- @function name: SDDEVICE_GET_BUSWIDTH
- @prototype: UINT8 SDDEVICE_GET_BUSWIDTH(PSDDEVICE pDevice)
- @category: PD_Reference
-
- @input: pDevice - the target device for this request
-
- @output: none
-
- @return: bus width: SDCONFIG_BUS_WIDTH_SPI, SDCONFIG_BUS_WIDTH_1_BIT, SDCONFIG_BUS_WIDTH_4_BIT
-
- @notes: Implemented as a macro.
-
- @see also: SDDEVICE_IS_BUSMODE_SPI
-
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
-#define SDDEVICE_GET_BUSWIDTH(pDev) SDCONFIG_GET_BUSWIDTH((pDev)->pHcd->CardProperties.BusMode)
-
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- @function: Is bus in SPI mode.
-
- @function name: SDDEVICE_IS_BUSMODE_SPI
- @prototype: BOOL SDDEVICE_IS_BUSMODE_SPI(PSDDEVICE pDevice)
- @category: PD_Reference
-
- @input: pDevice - the target device for this request
-
- @output: none
-
- @return: TRUE, SPI mode.
-
- @notes: Implemented as a macro.
-
- @see also: SDDEVICE_GET_BUSWIDTH
-
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
-#define SDDEVICE_IS_BUSMODE_SPI(pDev) (SDDEVICE_GET_BUSWIDTH(pDev) == SDCONFIG_BUS_WIDTH_SPI)
-
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- @function: Send a request to a device.
-
- @function name: SDDEVICE_CALL_REQUEST_FUNC
- @prototype: SDIO_STATUS SDDEVICE_CALL_REQUEST_FUNC(PSDDEVICE pDevice, PSDREQUEST pRequest)
- @category: PD_Reference
-
- @input: pDevice - the target device for this request
- @input: pRequest - the request to be sent
-
- @output: none
-
- @return: SDIO_STATUS
-
- @notes: Sends a request to the specified device. If the request is successfully sent, then
- the response flags can be checked to detemine the result of the request.
-
- @example: Example of sending a request to a device:
- PSDREQUEST pReq = NULL;
- //allocate a request
- pReq = SDDeviceAllocRequest(pDevice);
- if (NULL == pReq) {
- return SDIO_STATUS_NO_RESOURCES;
- }
- //initialize the request
- SDLIB_SetupCMD52Request(FuncNo, Address, Write, *pData, pReq);
- //send the request to the target
- status = SDDEVICE_CALL_REQUEST_FUNC(pDevice,pReq);
- if (!SDIO_SUCCESS(status)) {
- break;
- }
- //check the request response (based on the request type)
- if (SD_R5_GET_RESP_FLAGS(pReq->Response) & SD_R5_ERRORS) {
- ...
- }
- if (!Write) {
- // store the byte
- *pData = SD_R5_GET_READ_DATA(pReq->Response);
- }
- //free the request
- SDDeviceFreeRequest(pDevice,pReq);
- ...
-
- @see also: SDDeviceAllocRequest
- @see also: SDDEVICE_CALL_CONFIG_FUNC
-
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
-#define SDDEVICE_CALL_REQUEST_FUNC(pDev,pReq) (pDev)->pRequest((pDev),(pReq))
-
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- @function: Send configuration to a device.
-
- @function name: SDDEVICE_CALL_CONFIG_FUNC
- @prototype: SDIO_STATUS SDDEVICE_CALL_CONFIG_FUNC(PSDDEVICE pDevice, PSDCONFIG pConfigure)
- @category: PD_Reference
-
- @input: pDevice - the target device for this request
- @input: pConfigure - configuration request
-
- @output: none
-
- @return: SDIO_STATUS
-
- @notes: Sends a configuration request to the specified device.
-
- @example: Example of sending a request to a device:
- SDCONFIG configHdr;
- SDCONFIG_FUNC_ENABLE_DISABLE_DATA fData;
- fData.EnableFlags = SDCONFIG_ENABLE_FUNC;
- fData.TimeOut = 500;
- SET_SDCONFIG_CMD_INFO(&configHdr, SDCONFIG_FUNC_ENABLE_DISABLE, fData, sizeof(fData));
- return SDDEVICE_CALL_CONFIG_FUNC(pDevice, &configHdr);
-
- @see also: SDLIB_IssueConfig
-
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
-#define SDDEVICE_CALL_CONFIG_FUNC(pDev,pCfg) (pDev)->pConfigure((pDev),(pCfg))
-
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- @function: Allocate a request structure.
-
- @function name: SDDeviceAllocRequest
- @prototype: PSDREQUEST SDDeviceAllocRequest(PSDDEVICE pDevice)
- @category: PD_Reference
-
- @input: pDevice - the target device for this request
-
- @output: none
-
- @return: request pointer or NULL if not available.
-
- @notes: This function must not be called in a non-schedulable (interrupts off) context.
- Allocating memory on some OSes may block.
-
- @see also: SDDEVICE_CALL_REQUEST_FUNC
- @see also: SDDeviceFreeRequest
-
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
-#define SDDeviceAllocRequest(pDev) (pDev)->AllocRequest((pDev))
-
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- @function: Free a request structure.
-
- @function name: SDDeviceFreeRequest
- @prototype: void SDDeviceFreeRequest(PSDDEVICE pDevice, PSDREQUEST pRequest)
- @category: PD_Reference
-
- @input: pDevice - the target device for this request
- @input: pRequest - request allocated by SDDeviceAllocRequest().
-
- @output: none
-
- @return: none
-
- @notes: This function must not be called in a non-schedulable (interrupts off) context.
- Freeing memory on some OSes may block.
-
- @see also: SDDEVICE_CALL_REQUEST_FUNC
- @see also: SDDeviceAllocRequest
-
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
-#define SDDeviceFreeRequest(pDev,pReq) (pDev)->FreeRequest((pDev),pReq)
-
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- @function: Register an interrupt handler for a device.
-
- @function name: SDDEVICE_SET_IRQ_HANDLER
- @prototype: void SDDEVICE_SET_IRQ_HANDLER(PSDDEVICE pDevice,
- void (*pIrqFunction)(PVOID pContext),
- PVOID pContext)
- @category: PD_Reference
-
- @input: pDevice - the target device for this request
- @input: pIrqFunction - the interrupt function to execute.
- @input: pContext - context value passed into interrupt routine.
-
- @output: none
-
- @return: none
-
- @notes: The registered routine will be called upon each card interrupt.
- The interrupt function should acknowledge the interrupt when it is
- ready to handle more interrupts using:
- SDLIB_IssueConfig(pDevice, SDCONFIG_FUNC_ACK_IRQ, NULL, 0);
- The interrupt handler can perform synchronous request calls.
-
- @see also: SDDEVICE_SET_ASYNC_IRQ_HANDLER
-
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
-#define SDDEVICE_SET_IRQ_HANDLER(pDev,pFn,pContext) \
-{ \
- (pDev)->pIrqFunction = (pFn); \
- (pDev)->IrqContext = (PVOID)(pContext); \
-}
-
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- @function: Register an asynchronous interrupt handler for a device.
-
- @function name: SDDEVICE_SET_ASYNC_IRQ_HANDLER
- @prototype: void SDDEVICE_SET_ASYNC_IRQ_HANDLER(PSDDEVICE pDevice,
- void (*pIrqAsyncFunction)(PVOID pContext),
- PVOID pContext)
- @category: PD_Reference
-
- @input: pDevice - the target device for this request
- @input: pIrqAsyncFunction - the interrupt function to execute.
- @input: pContext - context value passed into interrupt routine.
-
- @output: none
-
- @return: none
-
- @notes: The registered routine will be called upon each card interrupt.
- The interrupt function should acknowledge the interrupt when it is
- ready to handle more interrupts using:
- SDLIB_IssueConfig(pDevice, SDCONFIG_FUNC_ACK_IRQ, NULL, 0);
- The interrupt handler can not perform any synchronous request calls.
- Using this call provides a faster interrupt dispatch, but limits all
- requests to asynchronous mode.
-
- @see also: SDDEVICE_SET_IRQ_HANDLER
-
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
-#define SDDEVICE_SET_ASYNC_IRQ_HANDLER(pDev,pFn,pContext) \
-{ \
- (pDev)->pIrqAsyncFunction = (pFn); \
- (pDev)->IrqAsyncContext = (PVOID)(pContext); \
-}
-
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- @function: Get the SDIO capabilities rgeister.
-
- @function name: SDDEVICE_GET_SDIOCARD_CAPS
- @prototype: UINT8 SDDEVICE_GET_SDIOCARD_CAPS(PSDDEVICE pDevice)
- @category: PD_Reference
-
- @input: pDevice - the target device for this request
-
- @output: none
-
- @return: SD capabilities
-
- @notes: See SD specification for decoding of these capabilities.
-
- @see also: SDDEVICE_GET_SDIO_CARD_CAPS
-
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
-#define SDDEVICE_GET_SDIOCARD_CAPS(pDev) (pDev)->pHcd->CardProperties.SDIOCaps
-
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- @function: Get HCD driver name
-
- @function name: SDDEVICE_GET_HCDNAME
- @prototype: PTEXT SDDEVICE_GET_HCDNAME(PSDDEVICE pDevice)
- @category: PD_Reference
-
- @input: pDevice - the target device for this request
-
- @output: none
-
- @return: pointer to a string containing the name of the underlying HCD
-
- @notes: Implemented as a macro.
-
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
-#define SDDEVICE_GET_HCDNAME(pDev) (pDev)->pHcd->pName
-
-
-#define SDDEVICE_CALL_IRQ_HANDLER(pDev) (pDev)->pIrqFunction((pDev)->IrqContext)
-#define SDDEVICE_CALL_IRQ_ASYNC_HANDLER(pDev) (pDev)->pIrqAsyncFunction((pDev)->IrqAsyncContext)
-
-
-#define SDDEVICE_SET_SDIO_FUNCNO(pDev,Num) (pDev)->pId[0].SDIO_FunctionNo = (Num)
-#define SDDEVICE_IS_CARD_REMOVED(pDev) ((pDev)->pHcd->CardProperties.CardState & \
- CARD_STATE_REMOVED)
-
-
-typedef enum _SDHCD_IRQ_PROC_STATE {
- SDHCD_IDLE = 0,
- SDHCD_IRQ_PENDING = 1,
- SDHCD_IRQ_HELPER = 2
-}SDHCD_IRQ_PROC_STATE, *PSDHCD_IRQ_PROC_STATE;
-
-/* host controller bus driver registration structure */
-typedef struct _SDHCD {
- CT_VERSION_CODE Version; /* version code of the SDIO stack */
- SDLIST SDList; /* internal use list*/
- PTEXT pName; /* name of registering host/slot driver */
- UINT32 Attributes; /* attributes of host controller */
- UINT16 MaxBytesPerBlock; /* max bytes per block */
- UINT16 MaxBlocksPerTrans; /* max blocks per transaction */
- SD_SLOT_CURRENT MaxSlotCurrent; /* max current per slot in milli-amps */
- UINT8 SlotNumber; /* sequential slot number for this HCD, set by bus driver */
- SD_BUSCLOCK_RATE MaxClockRate; /* max clock rate in hz */
- SLOT_VOLTAGE_MASK SlotVoltageCaps; /* slot voltage capabilities */
- SLOT_VOLTAGE_MASK SlotVoltagePreferred; /* preferred slot voltage */
- PVOID pContext; /* host controller driver use data */
- SDIO_STATUS (*pRequest)(struct _SDHCD *pHcd);
- /* get/set configuration */
- SDIO_STATUS (*pConfigure)(struct _SDHCD *pHcd, PSDCONFIG pConfig);
- /* everything below this line is for bus driver use */
- OS_SEMAPHORE ConfigureOpsSem; /* semaphore to make specific configure ops atomic, internal use */
- OS_CRITICALSECTION HcdCritSection; /* critical section to protect hcd data structures (internal use) */
- SDREQUESTQUEUE RequestQueue; /* request queue, internal use */
- PSDREQUEST pCurrentRequest; /* current request we are working on */
- CARD_PROPERTIES CardProperties; /* properties for the currently inserted card*/
- OSKERNEL_HELPER SDIOIrqHelper; /* synch IRQ helper, internal use */
- SDDEVICE *pPseudoDev; /* pseudo device used for initialization (internal use) */
- UINT8 PendingHelperIrqs; /* IRQ helper pending IRQs */
- UINT8 PendingIrqAcks; /* pending IRQ acks from function drivers */
- UINT8 IrqsEnabled; /* current irq enabled mask */
- SDHCD_IRQ_PROC_STATE IrqProcState; /* irq processing state */
- POS_DEVICE pDevice; /* device registration with base system */
- SD_SLOT_CURRENT SlotCurrentAllocated; /* slot current allocated (internal use ) */
- ATOMIC_FLAGS HcdFlags; /* HCD Flags */
-#define HCD_REQUEST_CALL_BIT 0
-#define HCD_IRQ_NO_PEND_CHECK 1 /* HCD flag to bypass interrupt pending register
- check, typically done on single function cards */
- SDREQUESTQUEUE CompletedRequestQueue; /* completed request queue, internal use */
- PSDDMA_DESCRIPTION pDmaDescription; /* description of HCD's DMA capabilities */
- POS_MODULE pModule; /* OS-specific module information */
- INT Recursion; /* recursion level */
- PVOID Reserved1;
- PVOID Reserved2;
-}SDHCD, *PSDHCD;
-
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- @function: Get a pointer to the HCD's DMA description
-
- @function name: SDGET_DMA_DESCRIPTION
- @prototype: PSDDMA_DESCRIPTION SDGET_DMA_DESCRIPTION(PSDDEVICE pDevice)
- @category: PD_Reference
-
- @input: pDevice - device structure
-
- @return: PSDDMA_DESCRIPTION or NULL if no DMA support
-
- @notes: Implemented as a macro.
-
- @example: getting the current request:
- PSDDMA_DESCRIPTION pDmaDescrp = SDGET_DMA_DESCRIPTION(pDevice);
-
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
-#define SDGET_DMA_DESCRIPTION(pDevice) (pDevice)->pHcd->pDmaDescription
-
-
-/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- @function: Get the logical slot number the device is assigned to.
-
- @function name: SDDEVICE_GET_SLOT_NUMBER
- @prototype: UINT8 SDDEVICE_GET_SLOT_NUMBER(PSDDEVICE pDevice)
- @category: PD_Reference
-
- @input: pDevice - device structure
-
- @return: unsigned number representing the slot number
-
- @notes: Implemented as a macro. This value is unique for each physical slot in the system
- and assigned by the bus driver. Devices on a multi-function card will share the same
- slot number.
-
- @example: getting the slot number:
- UINT8 thisSlot = SDDEVICE_GET_SLOT_NUMBER(pDevice);
-
-+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
-#define SDDEVICE_GET_SLOT_NUMBER(pDevice) (pDevice)->pHcd->SlotNumber
-
-/* for function use */
-SDIO_STATUS SDIO_RegisterFunction(PSDFUNCTION pFunction);
-SDIO_STATUS SDIO_UnregisterFunction(PSDFUNCTION pFunction);
-
-#include "sdio_hcd_defs.h"
-#endif /* __SDIO_BUSDRIVER_H___ */