[BACK]Return to sdmmcvar.h CVS log [TXT][DIR] Up to [local] / sys / dev / sdmmc

Annotation of sys/dev/sdmmc/sdmmcvar.h, Revision 1.1

1.1     ! nbrk        1: /*     $OpenBSD: sdmmcvar.h,v 1.9 2007/05/31 10:09:01 uwe Exp $        */
        !             2:
        !             3: /*
        !             4:  * Copyright (c) 2006 Uwe Stuehler <uwe@openbsd.org>
        !             5:  *
        !             6:  * Permission to use, copy, modify, and distribute this software for any
        !             7:  * purpose with or without fee is hereby granted, provided that the above
        !             8:  * copyright notice and this permission notice appear in all copies.
        !             9:  *
        !            10:  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
        !            11:  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
        !            12:  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
        !            13:  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
        !            14:  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
        !            15:  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
        !            16:  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
        !            17:  */
        !            18:
        !            19: #ifndef _SDMMCVAR_H_
        !            20: #define _SDMMCVAR_H_
        !            21:
        !            22: #include <sys/queue.h>
        !            23:
        !            24: #include <scsi/scsi_all.h>
        !            25: #include <scsi/scsiconf.h>
        !            26:
        !            27: #include <dev/sdmmc/sdmmcchip.h>
        !            28: #include <dev/sdmmc/sdmmcreg.h>
        !            29:
        !            30: struct sdmmc_csd {
        !            31:        int     csdver;         /* CSD structure format */
        !            32:        int     mmcver;         /* MMC version (for CID format) */
        !            33:        int     capacity;       /* total number of sectors */
        !            34:        int     sector_size;    /* sector size in bytes */
        !            35:        int     read_bl_len;    /* block length for reads */
        !            36:        /* ... */
        !            37: };
        !            38:
        !            39: struct sdmmc_cid {
        !            40:        int     mid;            /* manufacturer identification number */
        !            41:        int     oid;            /* OEM/product identification number */
        !            42:        char    pnm[8];         /* product name (MMC v1 has the longest) */
        !            43:        int     rev;            /* product revision */
        !            44:        int     psn;            /* product serial number */
        !            45:        int     mdt;            /* manufacturing date */
        !            46: };
        !            47:
        !            48: typedef u_int32_t sdmmc_response[4];
        !            49:
        !            50: struct sdmmc_softc;
        !            51:
        !            52: struct sdmmc_task {
        !            53:        void (*func)(void *arg);
        !            54:        void *arg;
        !            55:        int onqueue;
        !            56:        struct sdmmc_softc *sc;
        !            57:        TAILQ_ENTRY(sdmmc_task) next;
        !            58: };
        !            59:
        !            60: #define        sdmmc_init_task(xtask, xfunc, xarg) do {                        \
        !            61:        (xtask)->func = (xfunc);                                        \
        !            62:        (xtask)->arg = (xarg);                                          \
        !            63:        (xtask)->onqueue = 0;                                           \
        !            64:        (xtask)->sc = NULL;                                             \
        !            65: } while (0)
        !            66:
        !            67: #define sdmmc_task_pending(xtask) ((xtask)->onqueue)
        !            68:
        !            69: struct sdmmc_command {
        !            70:        struct sdmmc_task c_task;       /* task queue entry */
        !            71:        u_int16_t        c_opcode;      /* SD or MMC command index */
        !            72:        u_int32_t        c_arg;         /* SD/MMC command argument */
        !            73:        sdmmc_response   c_resp;        /* response buffer */
        !            74:        void            *c_data;        /* buffer to send or read into */
        !            75:        int              c_datalen;     /* length of data buffer */
        !            76:        int              c_blklen;      /* block length */
        !            77:        int              c_flags;       /* see below */
        !            78: #define SCF_ITSDONE     0x0001         /* command is complete */
        !            79: #define SCF_CMD(flags)  ((flags) & 0x00f0)
        !            80: #define SCF_CMD_AC      0x0000
        !            81: #define SCF_CMD_ADTC    0x0010
        !            82: #define SCF_CMD_BC      0x0020
        !            83: #define SCF_CMD_BCR     0x0030
        !            84: #define SCF_CMD_READ    0x0040         /* read command (data expected) */
        !            85: #define SCF_RSP_BSY     0x0100
        !            86: #define SCF_RSP_136     0x0200
        !            87: #define SCF_RSP_CRC     0x0400
        !            88: #define SCF_RSP_IDX     0x0800
        !            89: #define SCF_RSP_PRESENT         0x1000
        !            90: /* response types */
        !            91: #define SCF_RSP_R0      0 /* none */
        !            92: #define SCF_RSP_R1      (SCF_RSP_PRESENT|SCF_RSP_CRC|SCF_RSP_IDX)
        !            93: #define SCF_RSP_R1B     (SCF_RSP_PRESENT|SCF_RSP_CRC|SCF_RSP_IDX|SCF_RSP_BSY)
        !            94: #define SCF_RSP_R2      (SCF_RSP_PRESENT|SCF_RSP_CRC|SCF_RSP_136)
        !            95: #define SCF_RSP_R3      (SCF_RSP_PRESENT)
        !            96: #define SCF_RSP_R4      (SCF_RSP_PRESENT)
        !            97: #define SCF_RSP_R5      (SCF_RSP_PRESENT|SCF_RSP_CRC|SCF_RSP_IDX)
        !            98: #define SCF_RSP_R5B     (SCF_RSP_PRESENT|SCF_RSP_CRC|SCF_RSP_IDX|SCF_RSP_BSY)
        !            99: #define SCF_RSP_R6      (SCF_RSP_PRESENT|SCF_RSP_CRC|SCF_RSP_IDX)
        !           100:        int              c_error;       /* errno value on completion */
        !           101:
        !           102:        /* Host controller owned fields for data xfer in progress */
        !           103:        int c_resid;                    /* remaining I/O */
        !           104:        u_char *c_buf;                  /* remaining data */
        !           105: };
        !           106:
        !           107: /*
        !           108:  * Decoded PC Card 16 based Card Information Structure (CIS),
        !           109:  * per card (function 0) and per function (1 and greater).
        !           110:  */
        !           111: struct sdmmc_cis {
        !           112:        u_int16_t        manufacturer;
        !           113: #define SDMMC_VENDOR_INVALID   0xffff
        !           114:        u_int16_t        product;
        !           115: #define SDMMC_PRODUCT_INVALID  0xffff
        !           116:        u_int8_t         function;
        !           117: #define SDMMC_FUNCTION_INVALID 0xff
        !           118:        u_char           cis1_major;
        !           119:        u_char           cis1_minor;
        !           120:        char             cis1_info_buf[256];
        !           121:        char            *cis1_info[4];
        !           122: };
        !           123:
        !           124: /*
        !           125:  * Structure describing either an SD card I/O function or a SD/MMC
        !           126:  * memory card from a "stack of cards" that responded to CMD2.  For a
        !           127:  * combo card with one I/O function and one memory card, there will be
        !           128:  * two of these structures allocated.  Each card slot has such a list
        !           129:  * of sdmmc_function structures.
        !           130:  */
        !           131: struct sdmmc_function {
        !           132:        /* common members */
        !           133:        struct sdmmc_softc *sc;         /* card slot softc */
        !           134:        u_int16_t rca;                  /* relative card address */
        !           135:        int flags;
        !           136: #define SFF_ERROR              0x0001  /* function is poo; ignore it */
        !           137:        SIMPLEQ_ENTRY(sdmmc_function) sf_list;
        !           138:        /* SD card I/O function members */
        !           139:        int number;                     /* I/O function number or -1 */
        !           140:        struct device *child;           /* function driver */
        !           141:        struct sdmmc_cis cis;           /* decoded CIS */
        !           142:        /* SD/MMC memory card members */
        !           143:        struct sdmmc_csd csd;           /* decoded CSD value */
        !           144:        struct sdmmc_cid cid;           /* decoded CID value */
        !           145:        sdmmc_response raw_cid;         /* temp. storage for decoding */
        !           146: };
        !           147:
        !           148: /*
        !           149:  * Structure describing a single SD/MMC/SDIO card slot.
        !           150:  */
        !           151: struct sdmmc_softc {
        !           152:        struct device sc_dev;           /* base device */
        !           153: #define SDMMCDEVNAME(sc)       ((sc)->sc_dev.dv_xname)
        !           154:        sdmmc_chipset_tag_t sct;        /* host controller chipset tag */
        !           155:        sdmmc_chipset_handle_t sch;     /* host controller chipset handle */
        !           156:        int sc_flags;
        !           157: #define SMF_SD_MODE            0x0001  /* host in SD mode (MMC otherwise) */
        !           158: #define SMF_IO_MODE            0x0002  /* host in I/O mode (SD mode only) */
        !           159: #define SMF_MEM_MODE           0x0004  /* host in memory mode (SD or MMC) */
        !           160: #define SMF_CARD_PRESENT       0x0010  /* card presence noticed */
        !           161: #define SMF_CARD_ATTACHED      0x0020  /* card driver(s) attached */
        !           162:        int sc_function_count;          /* number of I/O functions (SDIO) */
        !           163:        struct sdmmc_function *sc_card; /* selected card */
        !           164:        struct sdmmc_function *sc_fn0;  /* function 0, the card itself */
        !           165:        SIMPLEQ_HEAD(, sdmmc_function) sf_head; /* list of card functions */
        !           166:        int sc_dying;                   /* bus driver is shutting down */
        !           167:        struct proc *sc_task_thread;    /* asynchronous tasks */
        !           168:        TAILQ_HEAD(, sdmmc_task) sc_tskq;   /* task thread work queue */
        !           169:        struct sdmmc_task sc_discover_task; /* card attach/detach task */
        !           170:        struct sdmmc_task sc_intr_task; /* card interrupt task */
        !           171:        struct lock sc_lock;            /* lock around host controller */
        !           172:        void *sc_scsibus;               /* SCSI bus emulation softc */
        !           173:        TAILQ_HEAD(, sdmmc_intr_handler) sc_intrq; /* interrupt handlers */
        !           174: };
        !           175:
        !           176: /*
        !           177:  * Attach devices at the sdmmc bus.
        !           178:  */
        !           179: struct sdmmc_attach_args {
        !           180:        struct scsi_link scsi_link;     /* XXX */
        !           181:        struct sdmmc_function *sf;
        !           182: };
        !           183:
        !           184: #define IPL_SDMMC      IPL_BIO
        !           185: #define splsdmmc()     splbio()
        !           186:
        !           187: #define SDMMC_LOCK(sc)  lockmgr(&(sc)->sc_lock, LK_EXCLUSIVE, NULL)
        !           188: #define SDMMC_UNLOCK(sc) lockmgr(&(sc)->sc_lock, LK_RELEASE, NULL)
        !           189:
        !           190: void   sdmmc_add_task(struct sdmmc_softc *, struct sdmmc_task *);
        !           191: void   sdmmc_del_task(struct sdmmc_task *);
        !           192:
        !           193: struct sdmmc_function *sdmmc_function_alloc(struct sdmmc_softc *);
        !           194: void   sdmmc_function_free(struct sdmmc_function *);
        !           195: int    sdmmc_set_bus_power(struct sdmmc_softc *, u_int32_t, u_int32_t);
        !           196: int    sdmmc_mmc_command(struct sdmmc_softc *, struct sdmmc_command *);
        !           197: int    sdmmc_app_command(struct sdmmc_softc *, struct sdmmc_command *);
        !           198: void   sdmmc_go_idle_state(struct sdmmc_softc *);
        !           199: int    sdmmc_select_card(struct sdmmc_softc *, struct sdmmc_function *);
        !           200: int    sdmmc_set_relative_addr(struct sdmmc_softc *,
        !           201:            struct sdmmc_function *);
        !           202:
        !           203: void   sdmmc_intr_enable(struct sdmmc_function *);
        !           204: void   sdmmc_intr_disable(struct sdmmc_function *);
        !           205: void   *sdmmc_intr_establish(struct device *, int (*)(void *),
        !           206:            void *, const char *);
        !           207: void   sdmmc_intr_disestablish(void *);
        !           208: void   sdmmc_intr_task(void *);
        !           209:
        !           210: int    sdmmc_io_enable(struct sdmmc_softc *);
        !           211: void   sdmmc_io_scan(struct sdmmc_softc *);
        !           212: int    sdmmc_io_init(struct sdmmc_softc *, struct sdmmc_function *);
        !           213: void   sdmmc_io_attach(struct sdmmc_softc *);
        !           214: void   sdmmc_io_detach(struct sdmmc_softc *);
        !           215: u_int8_t sdmmc_io_read_1(struct sdmmc_function *, int);
        !           216: u_int16_t sdmmc_io_read_2(struct sdmmc_function *, int);
        !           217: u_int32_t sdmmc_io_read_4(struct sdmmc_function *, int);
        !           218: int    sdmmc_io_read_multi_1(struct sdmmc_function *, int, u_char *, int);
        !           219: void   sdmmc_io_write_1(struct sdmmc_function *, int, u_int8_t);
        !           220: void   sdmmc_io_write_2(struct sdmmc_function *, int, u_int16_t);
        !           221: void   sdmmc_io_write_4(struct sdmmc_function *, int, u_int32_t);
        !           222: int    sdmmc_io_write_multi_1(struct sdmmc_function *, int, u_char *, int);
        !           223: int    sdmmc_io_function_ready(struct sdmmc_function *);
        !           224: int    sdmmc_io_function_enable(struct sdmmc_function *);
        !           225: void   sdmmc_io_function_disable(struct sdmmc_function *);
        !           226:
        !           227: int    sdmmc_read_cis(struct sdmmc_function *, struct sdmmc_cis *);
        !           228: void   sdmmc_print_cis(struct sdmmc_function *);
        !           229: void   sdmmc_check_cis_quirks(struct sdmmc_function *);
        !           230:
        !           231: int    sdmmc_mem_enable(struct sdmmc_softc *);
        !           232: void   sdmmc_mem_scan(struct sdmmc_softc *);
        !           233: int    sdmmc_mem_init(struct sdmmc_softc *, struct sdmmc_function *);
        !           234: int    sdmmc_mem_read_block(struct sdmmc_function *, int, u_char *, size_t);
        !           235: int    sdmmc_mem_write_block(struct sdmmc_function *, int, u_char *, size_t);
        !           236:
        !           237: /* ioctls */
        !           238:
        !           239: #include <sys/ioccom.h>
        !           240:
        !           241: struct bio_sdmmc_command {
        !           242:        void *cookie;
        !           243:        struct sdmmc_command cmd;
        !           244: };
        !           245:
        !           246: struct bio_sdmmc_debug {
        !           247:        void *cookie;
        !           248:        int debug;
        !           249: };
        !           250:
        !           251: #define SDIOCEXECMMC   _IOWR('S',0, struct bio_sdmmc_command)
        !           252: #define SDIOCEXECAPP   _IOWR('S',1, struct bio_sdmmc_command)
        !           253: #define SDIOCSETDEBUG  _IOWR('S',2, struct bio_sdmmc_debug)
        !           254:
        !           255: #endif

CVSweb