xref: /onnv-gate/usr/src/uts/common/sys/sdcard/sda.h (revision 12426:cdff5d2ea989)
17302Sgdamore@opensolaris.org /*
27302Sgdamore@opensolaris.org  * CDDL HEADER START
37302Sgdamore@opensolaris.org  *
47302Sgdamore@opensolaris.org  * The contents of this file are subject to the terms of the
57302Sgdamore@opensolaris.org  * Common Development and Distribution License (the "License").
67302Sgdamore@opensolaris.org  * You may not use this file except in compliance with the License.
77302Sgdamore@opensolaris.org  *
87302Sgdamore@opensolaris.org  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97302Sgdamore@opensolaris.org  * or http://www.opensolaris.org/os/licensing.
107302Sgdamore@opensolaris.org  * See the License for the specific language governing permissions
117302Sgdamore@opensolaris.org  * and limitations under the License.
127302Sgdamore@opensolaris.org  *
137302Sgdamore@opensolaris.org  * When distributing Covered Code, include this CDDL HEADER in each
147302Sgdamore@opensolaris.org  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157302Sgdamore@opensolaris.org  * If applicable, add the following below this CDDL HEADER, with the
167302Sgdamore@opensolaris.org  * fields enclosed by brackets "[]" replaced with your own identifying
177302Sgdamore@opensolaris.org  * information: Portions Copyright [yyyy] [name of copyright owner]
187302Sgdamore@opensolaris.org  *
197302Sgdamore@opensolaris.org  * CDDL HEADER END
207302Sgdamore@opensolaris.org  */
217302Sgdamore@opensolaris.org /*
22*12426Sgdamore@opensolaris.org  * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
237302Sgdamore@opensolaris.org  */
247302Sgdamore@opensolaris.org 
257302Sgdamore@opensolaris.org #ifndef	_SYS_SDCARD_SDA_H
267302Sgdamore@opensolaris.org #define	_SYS_SDCARD_SDA_H
277302Sgdamore@opensolaris.org 
287302Sgdamore@opensolaris.org #include <sys/types.h>
297302Sgdamore@opensolaris.org #include <sys/note.h>
307302Sgdamore@opensolaris.org 
317302Sgdamore@opensolaris.org #ifdef	__cplusplus
327302Sgdamore@opensolaris.org extern "C" {
337302Sgdamore@opensolaris.org #endif
347302Sgdamore@opensolaris.org 
357302Sgdamore@opensolaris.org /*
367302Sgdamore@opensolaris.org  * SD card common framework.  This module provides most of the common
377302Sgdamore@opensolaris.org  * functionality so that SecureDigital host adapters and client devices
387302Sgdamore@opensolaris.org  * (such as the sdmem driver) can share common code.
397302Sgdamore@opensolaris.org  */
407302Sgdamore@opensolaris.org 
417302Sgdamore@opensolaris.org /*
427302Sgdamore@opensolaris.org  * SD Commands.  Commmand format is 48-bits as follows:
437302Sgdamore@opensolaris.org  *
447302Sgdamore@opensolaris.org  * bits		value		desc
457302Sgdamore@opensolaris.org  * -------------------------------------------
467302Sgdamore@opensolaris.org  * 47		0		start bit
477302Sgdamore@opensolaris.org  * 46		1		transmission bit
487302Sgdamore@opensolaris.org  * 45:40	cmd		command index (see values listed below)
497302Sgdamore@opensolaris.org  * 39:8		arg		32-bit command argument
507302Sgdamore@opensolaris.org  * 7:1		crc7		crc7 check value
517302Sgdamore@opensolaris.org  * 0		1		end bit
527302Sgdamore@opensolaris.org  * -------------------------------------------
537302Sgdamore@opensolaris.org  */
547302Sgdamore@opensolaris.org typedef enum {
557302Sgdamore@opensolaris.org 	CMD_GO_IDLE = 0,
567302Sgdamore@opensolaris.org 	CMD_SEND_OCR = 1,		/* MMC only */
577302Sgdamore@opensolaris.org 	CMD_BCAST_CID = 2,
587302Sgdamore@opensolaris.org 	CMD_SEND_RCA = 3,
597302Sgdamore@opensolaris.org 	CMD_SET_DSR = 4,
607302Sgdamore@opensolaris.org 	CMD_IO_SEND_OCR = 5,		/* SDIO only */
617302Sgdamore@opensolaris.org 	CMD_SWITCH_FUNC = 6,
627302Sgdamore@opensolaris.org 	CMD_SELECT_CARD = 7,
637302Sgdamore@opensolaris.org 	CMD_SEND_IF_COND = 8,
647302Sgdamore@opensolaris.org 	CMD_SEND_CSD = 9,
657302Sgdamore@opensolaris.org 	CMD_SEND_CID = 10,
667302Sgdamore@opensolaris.org 	CMD_STOP_TRANSMIT = 12,
677302Sgdamore@opensolaris.org 	CMD_SEND_STATUS = 13,
687302Sgdamore@opensolaris.org 	CMD_GO_INACTIVE = 15,
697302Sgdamore@opensolaris.org 	CMD_SET_BLOCKLEN = 16,
707302Sgdamore@opensolaris.org 	CMD_READ_SINGLE = 17,
717302Sgdamore@opensolaris.org 	CMD_READ_MULTI = 18,
727302Sgdamore@opensolaris.org 	CMD_WRITE_SINGLE = 24,
737302Sgdamore@opensolaris.org 	CMD_WRITE_MULTI = 25,
747302Sgdamore@opensolaris.org 	CMD_PROGRAM_CSD = 27,
757302Sgdamore@opensolaris.org 	CMD_SET_WRITE_PROT = 28,
767302Sgdamore@opensolaris.org 	CMD_CLR_WRITE_PROT = 29,
777302Sgdamore@opensolaris.org 	CMD_SEND_WRITE_PROT = 30,
787302Sgdamore@opensolaris.org 	CMD_ERASE_START = 32,
797302Sgdamore@opensolaris.org 	CMD_ERASE_END = 33,
807302Sgdamore@opensolaris.org 	CMD_ERASE = 38,
817302Sgdamore@opensolaris.org 	CMD_LOCK = 42,
827302Sgdamore@opensolaris.org 	CMD_IO_RW_DIRECT = 52,
837302Sgdamore@opensolaris.org 	CMD_IO_RW_EXTENDED = 53,
847302Sgdamore@opensolaris.org 	CMD_APP_CMD = 55,
857302Sgdamore@opensolaris.org 	CMD_GEN_CMD = 56,
867302Sgdamore@opensolaris.org 	/* APP CMD values, send ACMD first */
877302Sgdamore@opensolaris.org 	ACMD_SET_BUS_WIDTH = 6,
887302Sgdamore@opensolaris.org 	ACMD_SD_STATUS = 13,
897302Sgdamore@opensolaris.org 	ACMD_SEND_NUM_WR_BLKS = 22,
907302Sgdamore@opensolaris.org 	ACMD_SET_WR_BLK_ERASE_COUNT = 23,
917302Sgdamore@opensolaris.org 	ACMD_SD_SEND_OCR = 41,
927302Sgdamore@opensolaris.org 	ACMD_SET_CLR_CARD_DETECT = 42,
937302Sgdamore@opensolaris.org 	ACMD_SEND_SCR = 51
947302Sgdamore@opensolaris.org } sda_index_t;
957302Sgdamore@opensolaris.org 
967302Sgdamore@opensolaris.org /*
977302Sgdamore@opensolaris.org  * Classes of response type.  Note that we encode the "busy bit" as
987302Sgdamore@opensolaris.org  * value 0x10.
997302Sgdamore@opensolaris.org  */
1007302Sgdamore@opensolaris.org typedef enum {
1017302Sgdamore@opensolaris.org 	R0 = 0,
1027302Sgdamore@opensolaris.org 	R1 = 1,
1037302Sgdamore@opensolaris.org 	R2 = 2,
1047302Sgdamore@opensolaris.org 	R3 = 3,
1057302Sgdamore@opensolaris.org 	R4 = 4,
1067302Sgdamore@opensolaris.org 	R5 = 5,
1077302Sgdamore@opensolaris.org 	R6 = 6,
1087302Sgdamore@opensolaris.org 	R7 = 7,
1097302Sgdamore@opensolaris.org 	Rb = 0x10,
1107302Sgdamore@opensolaris.org 	R1b = 0x11,
1117302Sgdamore@opensolaris.org 	R5b = 0x15
1127302Sgdamore@opensolaris.org } sda_rtype_t;
1137302Sgdamore@opensolaris.org 
1147302Sgdamore@opensolaris.org /*
1157302Sgdamore@opensolaris.org  * R1 status bits.
1167302Sgdamore@opensolaris.org  */
1177302Sgdamore@opensolaris.org #define	R1_OUT_OF_RANGE		(1U << 31)
1187302Sgdamore@opensolaris.org #define	R1_ADDRESS_ERROR	(1U << 30)
1197302Sgdamore@opensolaris.org #define	R1_BLOCK_LEN_ERROR	(1U << 29)
1207302Sgdamore@opensolaris.org #define	R1_ERASE_SEQ_ERROR	(1U << 28)
1217302Sgdamore@opensolaris.org #define	R1_ERASE_PARAM		(1U << 27)
1227302Sgdamore@opensolaris.org #define	R1_WP_VIOLATION		(1U << 26)
1237302Sgdamore@opensolaris.org #define	R1_CARD_IS_LOCKED	(1U << 25)
1247302Sgdamore@opensolaris.org #define	R1_LOCK_FAILED		(1U << 24)
1257302Sgdamore@opensolaris.org #define	R1_COM_CRC_ERROR	(1U << 23)
1267302Sgdamore@opensolaris.org #define	R1_ILLEGAL_COMMAND	(1U << 22)
1277302Sgdamore@opensolaris.org #define	R1_CARD_ECC_FAILED	(1U << 21)
1287302Sgdamore@opensolaris.org #define	R1_CC_ERROR		(1U << 20)
1297302Sgdamore@opensolaris.org #define	R1_ERROR		(1U << 19)
1307302Sgdamore@opensolaris.org #define	R1_CSD_OVERWRITE	(1U << 16)
1317302Sgdamore@opensolaris.org #define	R1_WP_ERASE_SKIP	(1U << 15)
1327302Sgdamore@opensolaris.org #define	R1_CARD_ECC_DIS		(1U << 14)
1337302Sgdamore@opensolaris.org #define	R1_ERASE_RESET		(1U << 13)
1347302Sgdamore@opensolaris.org #define	R1_READY_FOR_DATA	(1U << 8)
1357302Sgdamore@opensolaris.org #define	R1_APP_CMD		(1U << 5)
1367302Sgdamore@opensolaris.org #define	R1_AKE_SEQ_ERROR	(1U << 3)
1377302Sgdamore@opensolaris.org 
1387302Sgdamore@opensolaris.org /*
1397302Sgdamore@opensolaris.org  * Note that R1_COM_CRC_ERR, R1_ILLEGAL_COMMAND, R1_ERASE_SEQ_ERROR, and
1407302Sgdamore@opensolaris.org  * R1_AKE_SEQ_ERROR errors are delayed error bits reported on the next
1417302Sgdamore@opensolaris.org  * command.  So we don't list them here.
1427302Sgdamore@opensolaris.org  */
1437302Sgdamore@opensolaris.org #define	R1_ERRS	(\
1447302Sgdamore@opensolaris.org 	R1_ERROR | R1_OUT_OF_RANGE | R1_ADDRESS_ERROR | R1_BLOCK_LEN_ERROR | \
1457302Sgdamore@opensolaris.org 	R1_ERASE_PARAM | R1_WP_VIOLATION | R1_LOCK_FAILED | \
1467302Sgdamore@opensolaris.org 	R1_CARD_ECC_FAILED | R1_CC_ERROR | R1_CSD_OVERWRITE | \
1477302Sgdamore@opensolaris.org 	R1_WP_ERASE_SKIP)
1487302Sgdamore@opensolaris.org 
1497302Sgdamore@opensolaris.org #define	R1_STATE(x)	(((x) & 0xf) >> 9)
1507302Sgdamore@opensolaris.org 
1517302Sgdamore@opensolaris.org /*
1527302Sgdamore@opensolaris.org  * R5 status bits.
1537302Sgdamore@opensolaris.org  */
1547302Sgdamore@opensolaris.org #define	R5_COM_CRC_ERROR	(1U << 7)
1557302Sgdamore@opensolaris.org #define	R5_ILLEGAL_COMMAND	(1U << 6)
1567302Sgdamore@opensolaris.org #define	R5_ERROR		(1U << 3)
1577302Sgdamore@opensolaris.org #define	R5_RFU			(1U << 2)
1587302Sgdamore@opensolaris.org #define	R5_FUNCTION_NUMBER	(1U << 1)
1597302Sgdamore@opensolaris.org #define	R5_OUT_OF_RANGE		(1U << 0)
1607302Sgdamore@opensolaris.org 
1617302Sgdamore@opensolaris.org #define	R5_ERRS	(R5_ERROR | R5_FUNCTION_NUMBER | R5_OUT_OF_RANGE)
1627302Sgdamore@opensolaris.org 
1637302Sgdamore@opensolaris.org #define	R5_IO_STATE(x)	(((x) & 0x3) >> 4)
1647302Sgdamore@opensolaris.org 
1657302Sgdamore@opensolaris.org /*
1667302Sgdamore@opensolaris.org  * R7 bits (CMD8).
1677302Sgdamore@opensolaris.org  */
1687302Sgdamore@opensolaris.org #define	R7_VHS_27_36V		(1U << 8)
1697302Sgdamore@opensolaris.org #define	R7_PATTERN		(0xAA)
1707302Sgdamore@opensolaris.org 
1717302Sgdamore@opensolaris.org /*
1727302Sgdamore@opensolaris.org  * OCR bits.
1737302Sgdamore@opensolaris.org  */
1747302Sgdamore@opensolaris.org #define	OCR_POWER_UP		(1U << 31)
1757302Sgdamore@opensolaris.org #define	OCR_CCS			(1U << 30)
1767302Sgdamore@opensolaris.org #define	OCR_FUNCS(x)		(((x) & 7) >> 28)	/* SDIO only */
1777302Sgdamore@opensolaris.org #define	OCR_MEM_PRESENT		(1U << 27)		/* SDIO only */
1787302Sgdamore@opensolaris.org #define	OCR_VOLTAGE_MASK	(0xffffffU)		/* (bits 0-23 */
1797302Sgdamore@opensolaris.org #define	OCR_HI_MASK		(0xff8000U)		/* 2.7-3.6V */
1807302Sgdamore@opensolaris.org #define	OCR_35_36V		(1U << 23)
1817302Sgdamore@opensolaris.org #define	OCR_34_35V		(1U << 22)
1827302Sgdamore@opensolaris.org #define	OCR_33_34V		(1U << 21)
1837302Sgdamore@opensolaris.org #define	OCR_32_33V		(1U << 20)
1847302Sgdamore@opensolaris.org #define	OCR_31_32V		(1U << 19)
1857302Sgdamore@opensolaris.org #define	OCR_30_31V		(1U << 18)
1867302Sgdamore@opensolaris.org #define	OCR_29_30V		(1U << 17)
1877302Sgdamore@opensolaris.org #define	OCR_28_29V		(1U << 16)
1887302Sgdamore@opensolaris.org #define	OCR_27_28V		(1U << 15)
1897302Sgdamore@opensolaris.org #define	OCR_26_27V		(1U << 14)
1907302Sgdamore@opensolaris.org #define	OCR_25_26V		(1U << 14)
1917302Sgdamore@opensolaris.org #define	OCR_24_25V		(1U << 13)
1927302Sgdamore@opensolaris.org #define	OCR_23_24V		(1U << 12)
1937302Sgdamore@opensolaris.org #define	OCR_22_23V		(1U << 11)
1947302Sgdamore@opensolaris.org #define	OCR_21_22V		(1U << 10)
1957302Sgdamore@opensolaris.org #define	OCR_20_21V		(1U << 9)
1967302Sgdamore@opensolaris.org #define	OCR_19_20V		(1U << 8)
1977302Sgdamore@opensolaris.org #define	OCR_18_19V		(1U << 7)
1987302Sgdamore@opensolaris.org #define	OCR_17_18V		(1U << 6)
1997302Sgdamore@opensolaris.org 
2007302Sgdamore@opensolaris.org 
2017302Sgdamore@opensolaris.org /*
2027302Sgdamore@opensolaris.org  * Command structure.  Used internally by the framework, and by host
2037302Sgdamore@opensolaris.org  * drivers.  Note that it is forbidden to depend on the size of this
2047302Sgdamore@opensolaris.org  * structure.
2057302Sgdamore@opensolaris.org  */
2067302Sgdamore@opensolaris.org typedef struct sda_cmd sda_cmd_t;
2077302Sgdamore@opensolaris.org 
2087302Sgdamore@opensolaris.org struct sda_cmd {
2097302Sgdamore@opensolaris.org 	/*
2107302Sgdamore@opensolaris.org 	 * The ordering of these is done to maximize packing.
2117302Sgdamore@opensolaris.org 	 */
2127302Sgdamore@opensolaris.org 	sda_index_t		sc_index;	/* command name */
2137302Sgdamore@opensolaris.org 	sda_rtype_t		sc_rtype;	/* response type expected */
2147302Sgdamore@opensolaris.org 	uint16_t		sc_flags;
2157302Sgdamore@opensolaris.org 	uint32_t		sc_argument;	/* command argument */
2167302Sgdamore@opensolaris.org 
2177302Sgdamore@opensolaris.org 	uint32_t		sc_response[4];
2187302Sgdamore@opensolaris.org 
2197302Sgdamore@opensolaris.org 	uint16_t		sc_nblks;
2207302Sgdamore@opensolaris.org 	uint16_t		sc_blksz;
2217302Sgdamore@opensolaris.org 
2227302Sgdamore@opensolaris.org 	uint32_t		sc_resid;
2237302Sgdamore@opensolaris.org 
224*12426Sgdamore@opensolaris.org 	ddi_dma_handle_t	sc_dmah;
2257302Sgdamore@opensolaris.org 	uint_t			sc_ndmac;	/* # DMA cookies */
226*12426Sgdamore@opensolaris.org 	ddi_dma_cookie_t	sc_dmac;	/* actual DMA cookies */
2277302Sgdamore@opensolaris.org 	caddr_t			sc_kvaddr;	/* kernel virtual address */
2287302Sgdamore@opensolaris.org 
2297302Sgdamore@opensolaris.org #define	SDA_CMDF_READ		0x0001		/* transfer direction */
2307302Sgdamore@opensolaris.org #define	SDA_CMDF_WRITE		0x0002		/* transfer direction */
2317302Sgdamore@opensolaris.org #define	SDA_CMDF_AUTO_CMD12	0x0004		/* cmd12 requested */
2327302Sgdamore@opensolaris.org /* private flags .. not for driver consumption */
2337302Sgdamore@opensolaris.org #define	SDA_CMDF_DAT		0x0100		/* data phase pending */
2347302Sgdamore@opensolaris.org #define	SDA_CMDF_BUSY		0x0200		/* cmd in-flight or queued */
2357302Sgdamore@opensolaris.org #define	SDA_CMDF_INIT		0x0400		/* initialization command */
2367302Sgdamore@opensolaris.org #define	SDA_CMDF_MEM		0x0800		/* memory target command */
2377302Sgdamore@opensolaris.org };
2387302Sgdamore@opensolaris.org 
2397302Sgdamore@opensolaris.org /*
2407302Sgdamore@opensolaris.org  * The framework has two APIs.  The first API is for host controllers,
2417302Sgdamore@opensolaris.org  * and is referred to as SDHOST.  The second API is for target devices,
2427302Sgdamore@opensolaris.org  * and is referred to as SDCLIENT.  Please don't mix and match usage outside
2437302Sgdamore@opensolaris.org  * of the framework implementation itself!
2447302Sgdamore@opensolaris.org  */
2457302Sgdamore@opensolaris.org 
2467302Sgdamore@opensolaris.org typedef struct sda_host sda_host_t;
2477302Sgdamore@opensolaris.org 
2487302Sgdamore@opensolaris.org typedef enum {
2497302Sgdamore@opensolaris.org 	SDA_PROP_INSERTED = 	1,	/* R: is card inserted? */
2507302Sgdamore@opensolaris.org 	SDA_PROP_WPROTECT =	2,	/* R: is card write protected */
2517302Sgdamore@opensolaris.org 	SDA_PROP_LED =		3,	/* W: LED */
2527302Sgdamore@opensolaris.org 	SDA_PROP_CLOCK =	4,	/* R: frequency, Hz */
2537302Sgdamore@opensolaris.org 	SDA_PROP_BUSWIDTH =	5,	/* W: bus width */
2547302Sgdamore@opensolaris.org 	SDA_PROP_OCR =		6,	/* RW: ocr R: supported, W: set curr */
2557302Sgdamore@opensolaris.org 	SDA_PROP_CAP_4BITS =	7,	/* R: 4 bit data bus? */
2567302Sgdamore@opensolaris.org 	SDA_PROP_CAP_8BITS =	8,	/* R: MMC future expansion */
2577302Sgdamore@opensolaris.org 	SDA_PROP_CAP_HISPEED =	9,	/* R: fast bus rates (> 25MHz) */
2587302Sgdamore@opensolaris.org 	SDA_PROP_CAP_INTR =	10,	/* R: SDIO interrupt support */
2597302Sgdamore@opensolaris.org 	SDA_PROP_CAP_NOPIO =	11,	/* R: Never needs bp_mapin */
2607302Sgdamore@opensolaris.org 	SDA_PROP_HISPEED =	12	/* W: high speed (>25MHz) */
2617302Sgdamore@opensolaris.org } sda_prop_t;
2627302Sgdamore@opensolaris.org 
2637302Sgdamore@opensolaris.org typedef enum {
2647302Sgdamore@opensolaris.org 	SDA_FAULT_NONE =	0,	/* No failure */
2657302Sgdamore@opensolaris.org 	SDA_FAULT_ACMD12 =	1,	/* Auto CMD12 failure */
2667302Sgdamore@opensolaris.org 	SDA_FAULT_CRC7 =	2,	/* CRC7 failure on CMD/DAT line */
2677302Sgdamore@opensolaris.org 	SDA_FAULT_PROTO =	3,	/* SD/MMC protocol error */
2687302Sgdamore@opensolaris.org 	SDA_FAULT_CURRENT =	4,	/* Current overlimit detected */
2697302Sgdamore@opensolaris.org 	SDA_FAULT_INIT =	5,	/* Card initialization failure */
2707302Sgdamore@opensolaris.org 	SDA_FAULT_TIMEOUT =	6,	/* Unexpected timeout failure */
2717302Sgdamore@opensolaris.org 	SDA_FAULT_HOST =	7,	/* Internal host or slot failure */
2727302Sgdamore@opensolaris.org 	SDA_FAULT_RESET =	8,	/* Slot failed to reset */
2737302Sgdamore@opensolaris.org } sda_fault_t;
2747302Sgdamore@opensolaris.org 
2757302Sgdamore@opensolaris.org typedef enum {
2767302Sgdamore@opensolaris.org 	SDA_EOK =		0,	/* Success */
2777302Sgdamore@opensolaris.org 	SDA_ECRC7 =		1,	/* CRC7 failure */
2787302Sgdamore@opensolaris.org 	SDA_EPROTO =		2,	/* SD/MMC protocol error */
2797302Sgdamore@opensolaris.org 	SDA_EINVAL =		3,	/* Invalid argument */
2807302Sgdamore@opensolaris.org 	SDA_ETIME =		4,	/* Timeout */
2817302Sgdamore@opensolaris.org 	SDA_ECMD12 =		5,	/* Failed during stop cmd */
2827302Sgdamore@opensolaris.org 	SDA_ENOTSUP =		6,	/* Setting/property not supported */
2837302Sgdamore@opensolaris.org 	SDA_ERESID =		7,	/* Incomplete transfer */
2847302Sgdamore@opensolaris.org 	SDA_EFAULT =		8,	/* Previous fault condition present */
2857302Sgdamore@opensolaris.org 	SDA_ENOMEM =		9,	/* Memory exhausted */
2867302Sgdamore@opensolaris.org 	SDA_EWPROTECT =		10,	/* Media is write protected */
2877302Sgdamore@opensolaris.org 	SDA_ENODEV =		11,	/* Card removed */
2887302Sgdamore@opensolaris.org 	SDA_ERESET =		12,	/* Memory card reset */
2897302Sgdamore@opensolaris.org 	SDA_EABORT =		13,	/* Memory command aborted */
2907302Sgdamore@opensolaris.org 	SDA_EIO =		14,	/* Other generic error */
2917302Sgdamore@opensolaris.org 	SDA_ESUSPENDED =	15,	/* Slot has been suspended */
2927302Sgdamore@opensolaris.org } sda_err_t;
2937302Sgdamore@opensolaris.org 
2947302Sgdamore@opensolaris.org typedef struct sda_ops {
2957302Sgdamore@opensolaris.org 	int	so_version;
2967302Sgdamore@opensolaris.org #define	SDA_OPS_VERSION	1
2977302Sgdamore@opensolaris.org 	sda_err_t	(*so_cmd)(void *, sda_cmd_t *);
2987302Sgdamore@opensolaris.org 	sda_err_t	(*so_getprop)(void *, sda_prop_t, uint32_t *);
2997302Sgdamore@opensolaris.org 	sda_err_t	(*so_setprop)(void *, sda_prop_t, uint32_t);
3007302Sgdamore@opensolaris.org 	sda_err_t	(*so_poll)(void *);
3017302Sgdamore@opensolaris.org 	sda_err_t	(*so_reset)(void *);
3027302Sgdamore@opensolaris.org 	sda_err_t	(*so_halt)(void *);
3037302Sgdamore@opensolaris.org } sda_ops_t;
3047302Sgdamore@opensolaris.org 
3057302Sgdamore@opensolaris.org /*
3067302Sgdamore@opensolaris.org  * Host operations.
3077302Sgdamore@opensolaris.org  */
3087302Sgdamore@opensolaris.org void sda_host_init_ops(struct dev_ops *);
3097302Sgdamore@opensolaris.org void sda_host_fini_ops(struct dev_ops *);
3107302Sgdamore@opensolaris.org sda_host_t *sda_host_alloc(dev_info_t *, int, sda_ops_t *, ddi_dma_attr_t *);
3117302Sgdamore@opensolaris.org void sda_host_free(sda_host_t *);
3127302Sgdamore@opensolaris.org void sda_host_set_private(sda_host_t *, int, void *);
3137302Sgdamore@opensolaris.org int sda_host_attach(sda_host_t *);
3147302Sgdamore@opensolaris.org void sda_host_detach(sda_host_t *);
3158289Sgdamore@opensolaris.org void sda_host_suspend(sda_host_t *);
3168289Sgdamore@opensolaris.org void sda_host_resume(sda_host_t *);
3177302Sgdamore@opensolaris.org void sda_host_detect(sda_host_t *, int);
3187302Sgdamore@opensolaris.org void sda_host_fault(sda_host_t *, int, sda_fault_t);
3197302Sgdamore@opensolaris.org void sda_host_transfer(sda_host_t *, int, sda_err_t);
3207302Sgdamore@opensolaris.org /*PRINTFLIKE3*/
3217302Sgdamore@opensolaris.org void sda_host_log(sda_host_t *, int, const char *, ...);
3227302Sgdamore@opensolaris.org 
3237302Sgdamore@opensolaris.org #ifdef	__cplusplus
3247302Sgdamore@opensolaris.org }
3257302Sgdamore@opensolaris.org #endif
3267302Sgdamore@opensolaris.org 
3277302Sgdamore@opensolaris.org #endif	/* _SYS_SDCARD_SDA_H */
328