Home | History | Annotate | Line # | Download | only in ieee1394
firewirereg.h revision 1.7
      1  1.7  kiyohara /*	$NetBSD: firewirereg.h,v 1.7 2007/11/05 19:08:56 kiyohara Exp $	*/
      2  1.1  kiyohara /*-
      3  1.1  kiyohara  * Copyright (c) 2003 Hidetoshi Shimokawa
      4  1.1  kiyohara  * Copyright (c) 1998-2002 Katsushi Kobayashi and Hidetoshi Shimokawa
      5  1.1  kiyohara  * All rights reserved.
      6  1.1  kiyohara  *
      7  1.1  kiyohara  * Redistribution and use in source and binary forms, with or without
      8  1.1  kiyohara  * modification, are permitted provided that the following conditions
      9  1.1  kiyohara  * are met:
     10  1.1  kiyohara  * 1. Redistributions of source code must retain the above copyright
     11  1.1  kiyohara  *    notice, this list of conditions and the following disclaimer.
     12  1.1  kiyohara  * 2. Redistributions in binary form must reproduce the above copyright
     13  1.1  kiyohara  *    notice, this list of conditions and the following disclaimer in the
     14  1.1  kiyohara  *    documentation and/or other materials provided with the distribution.
     15  1.1  kiyohara  * 3. All advertising materials mentioning features or use of this software
     16  1.1  kiyohara  *    must display the acknowledgement as bellow:
     17  1.1  kiyohara  *
     18  1.1  kiyohara  *    This product includes software developed by K. Kobayashi and H. Shimokawa
     19  1.1  kiyohara  *
     20  1.1  kiyohara  * 4. The name of the author may not be used to endorse or promote products
     21  1.1  kiyohara  *    derived from this software without specific prior written permission.
     22  1.1  kiyohara  *
     23  1.1  kiyohara  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     24  1.1  kiyohara  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
     25  1.1  kiyohara  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
     26  1.1  kiyohara  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
     27  1.1  kiyohara  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
     28  1.1  kiyohara  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
     29  1.1  kiyohara  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     30  1.1  kiyohara  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
     31  1.1  kiyohara  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
     32  1.1  kiyohara  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
     33  1.1  kiyohara  * POSSIBILITY OF SUCH DAMAGE.
     34  1.1  kiyohara  *
     35  1.7  kiyohara  * $FreeBSD: src/sys/dev/firewire/firewirereg.h,v 1.50 2007/07/20 03:42:57 simokawa Exp $
     36  1.1  kiyohara  *
     37  1.1  kiyohara  */
     38  1.1  kiyohara 
     39  1.1  kiyohara #include <sys/uio.h>
     40  1.1  kiyohara 
     41  1.1  kiyohara STAILQ_HEAD(fw_xferlist, fw_xfer);
     42  1.1  kiyohara 
     43  1.1  kiyohara struct fw_device{
     44  1.1  kiyohara 	uint16_t dst;
     45  1.1  kiyohara 	struct fw_eui64 eui;
     46  1.1  kiyohara 	uint8_t speed;
     47  1.1  kiyohara 	uint8_t maxrec;
     48  1.1  kiyohara 	uint8_t nport;
     49  1.1  kiyohara 	uint8_t power;
     50  1.1  kiyohara #define CSRROMOFF 0x400
     51  1.1  kiyohara #define CSRROMSIZE 0x400
     52  1.1  kiyohara 	int rommax;	/* offset from 0xffff f000 0000 */
     53  1.1  kiyohara 	uint32_t csrrom[CSRROMSIZE/4];
     54  1.1  kiyohara 	int rcnt;
     55  1.1  kiyohara 	struct firewire_comm *fc;
     56  1.1  kiyohara 	uint32_t status;
     57  1.1  kiyohara #define FWDEVNEW	0
     58  1.1  kiyohara #define FWDEVINIT	1
     59  1.1  kiyohara #define FWDEVATTACHED	2
     60  1.1  kiyohara #define FWDEVINVAL	3
     61  1.1  kiyohara 	STAILQ_ENTRY(fw_device) link;
     62  1.1  kiyohara 	device_t sbp;
     63  1.1  kiyohara };
     64  1.1  kiyohara 
     65  1.1  kiyohara struct firewire_softc {
     66  1.1  kiyohara #if defined(__FreeBSD__) && __FreeBSD_version >= 500000
     67  1.7  kiyohara 	fw_dev_t dev;
     68  1.1  kiyohara 	device_t sbp_dev;
     69  1.1  kiyohara #elif defined(__NetBSD__)
     70  1.1  kiyohara 	struct device _dev;
     71  1.1  kiyohara 	struct device *dev;
     72  1.1  kiyohara 	SLIST_HEAD(, firewire_dev_list) devlist;
     73  1.1  kiyohara 	void *si_drv1;
     74  1.1  kiyohara 	int si_iosize_max;
     75  1.1  kiyohara #endif
     76  1.1  kiyohara 	struct firewire_comm *fc;
     77  1.1  kiyohara };
     78  1.1  kiyohara #if defined(__NetBSD__)
     79  1.1  kiyohara struct firewire_dev_list {
     80  1.1  kiyohara 	SLIST_ENTRY(firewire_dev_list) link;
     81  1.1  kiyohara 	struct device *dev;
     82  1.1  kiyohara 	struct fw_device *fwdev;
     83  1.1  kiyohara };
     84  1.1  kiyohara #endif
     85  1.1  kiyohara 
     86  1.1  kiyohara #define FW_MAX_DMACH 0x20
     87  1.1  kiyohara #define FW_MAX_DEVCH FW_MAX_DMACH
     88  1.1  kiyohara #define FW_XFERTIMEOUT 1
     89  1.1  kiyohara 
     90  1.1  kiyohara struct firewire_dev_comm {
     91  1.1  kiyohara #if defined(__NetBSD__)
     92  1.1  kiyohara 	struct device _dev;
     93  1.1  kiyohara #endif
     94  1.1  kiyohara 	device_t dev;
     95  1.1  kiyohara 	struct firewire_comm *fc;
     96  1.1  kiyohara 	void (*post_busreset) (void *);
     97  1.1  kiyohara 	void (*post_explore) (void *);
     98  1.1  kiyohara };
     99  1.1  kiyohara 
    100  1.1  kiyohara struct tcode_info {
    101  1.1  kiyohara 	u_char hdr_len;	/* IEEE1394 header length */
    102  1.1  kiyohara 	u_char flag;
    103  1.1  kiyohara #define FWTI_REQ	(1 << 0)
    104  1.1  kiyohara #define FWTI_RES	(1 << 1)
    105  1.1  kiyohara #define FWTI_TLABEL	(1 << 2)
    106  1.1  kiyohara #define FWTI_BLOCK_STR	(1 << 3)
    107  1.1  kiyohara #define FWTI_BLOCK_ASY	(1 << 4)
    108  1.7  kiyohara 	u_char valid_res;
    109  1.1  kiyohara };
    110  1.1  kiyohara 
    111  1.1  kiyohara struct firewire_comm{
    112  1.1  kiyohara #if defined(__NetBSD__)
    113  1.1  kiyohara 	struct device _dev;
    114  1.1  kiyohara #endif
    115  1.1  kiyohara 	device_t dev;
    116  1.1  kiyohara 	device_t bdev;
    117  1.1  kiyohara 	uint16_t busid:10,
    118  1.1  kiyohara 		  nodeid:6;
    119  1.1  kiyohara 	u_int mode;
    120  1.1  kiyohara 	u_int nport;
    121  1.1  kiyohara 	u_int speed;
    122  1.1  kiyohara 	u_int maxrec;
    123  1.1  kiyohara 	u_int irm;
    124  1.1  kiyohara 	u_int max_node;
    125  1.1  kiyohara 	u_int max_hop;
    126  1.1  kiyohara #define FWPHYASYST (1 << 0)
    127  1.1  kiyohara 	uint32_t status;
    128  1.1  kiyohara #define	FWBUSDETACH	(-2)
    129  1.1  kiyohara #define	FWBUSNOTREADY	(-1)
    130  1.1  kiyohara #define	FWBUSRESET	0
    131  1.1  kiyohara #define	FWBUSINIT	1
    132  1.1  kiyohara #define	FWBUSCYMELECT	2
    133  1.1  kiyohara #define	FWBUSMGRELECT	3
    134  1.1  kiyohara #define	FWBUSMGRDONE	4
    135  1.1  kiyohara #define	FWBUSEXPLORE	5
    136  1.1  kiyohara #define	FWBUSPHYCONF	6
    137  1.1  kiyohara #define	FWBUSEXPDONE	7
    138  1.1  kiyohara #define	FWBUSCOMPLETION	10
    139  1.1  kiyohara 	int nisodma;
    140  1.1  kiyohara 	struct fw_eui64 eui;
    141  1.1  kiyohara 	struct fw_xferq
    142  1.1  kiyohara 		*arq, *atq, *ars, *ats, *it[FW_MAX_DMACH],*ir[FW_MAX_DMACH];
    143  1.1  kiyohara 	struct fw_xferlist tlabels[0x40];
    144  1.7  kiyohara 	u_char last_tlabel[0x40];
    145  1.7  kiyohara 	fw_mtx_t tlabel_lock;
    146  1.1  kiyohara 	STAILQ_HEAD(, fw_bind) binds;
    147  1.1  kiyohara 	STAILQ_HEAD(, fw_device) devices;
    148  1.1  kiyohara 	u_int  sid_cnt;
    149  1.1  kiyohara #define CSRSIZE 0x4000
    150  1.1  kiyohara 	uint32_t csr_arc[CSRSIZE/4];
    151  1.1  kiyohara #define CROMSIZE 0x400
    152  1.1  kiyohara 	uint32_t *config_rom;
    153  1.1  kiyohara 	struct crom_src_buf *crom_src_buf;
    154  1.1  kiyohara 	struct crom_src *crom_src;
    155  1.1  kiyohara 	struct crom_chunk *crom_root;
    156  1.1  kiyohara 	struct fw_topology_map *topology_map;
    157  1.1  kiyohara 	struct fw_speed_map *speed_map;
    158  1.1  kiyohara 	struct callout busprobe_callout;
    159  1.1  kiyohara 	struct callout bmr_callout;
    160  1.1  kiyohara 	struct callout timeout_callout;
    161  1.7  kiyohara 	fw_task_t task_timeout;
    162  1.1  kiyohara 	uint32_t (*cyctimer) (struct  firewire_comm *);
    163  1.1  kiyohara 	void (*ibr) (struct firewire_comm *);
    164  1.1  kiyohara 	uint32_t (*set_bmr) (struct firewire_comm *, uint32_t);
    165  1.7  kiyohara 	int (*ioctl) (fw_dev_t, u_long, void *, int, fw_proc_t);
    166  1.1  kiyohara 	int (*irx_enable) (struct firewire_comm *, int);
    167  1.1  kiyohara 	int (*irx_disable) (struct firewire_comm *, int);
    168  1.1  kiyohara 	int (*itx_enable) (struct firewire_comm *, int);
    169  1.1  kiyohara 	int (*itx_disable) (struct firewire_comm *, int);
    170  1.1  kiyohara 	void (*timeout) (void *);
    171  1.1  kiyohara 	void (*poll) (struct firewire_comm *, int, int);
    172  1.1  kiyohara 	void (*set_intr) (struct firewire_comm *, int);
    173  1.1  kiyohara 	void (*irx_post) (struct firewire_comm *, uint32_t *);
    174  1.1  kiyohara 	void (*itx_post) (struct firewire_comm *, uint32_t *);
    175  1.2  drochner 	const struct tcode_info *tcode;
    176  1.1  kiyohara 	bus_dma_tag_t dmat;
    177  1.7  kiyohara 	fw_mtx_t mtx;
    178  1.7  kiyohara 	fw_mtx_t wait_lock;
    179  1.7  kiyohara 	struct taskqueue *taskqueue;
    180  1.7  kiyohara 	fw_proc_t probe_thread;
    181  1.1  kiyohara };
    182  1.1  kiyohara #define CSRARC(sc, offset) ((sc)->csr_arc[(offset)/4])
    183  1.1  kiyohara 
    184  1.7  kiyohara #define FW_GMTX(fc)		(&(fc)->mtx)
    185  1.7  kiyohara #define FW_GLOCK(fc)		fw_mtx_lock(FW_GMTX(fc))
    186  1.7  kiyohara #define FW_GUNLOCK(fc)		fw_mtx_unlock(FW_GMTX(fc))
    187  1.7  kiyohara #define FW_GLOCK_ASSERT(fc)	fw_mtx_assert(FW_GMTX(fc), MA_OWNED)
    188  1.7  kiyohara 
    189  1.1  kiyohara struct fw_xferq {
    190  1.1  kiyohara 	int flag;
    191  1.1  kiyohara #define FWXFERQ_CHTAGMASK 0xff
    192  1.1  kiyohara #define FWXFERQ_RUNNING (1 << 8)
    193  1.1  kiyohara #define FWXFERQ_STREAM (1 << 9)
    194  1.1  kiyohara 
    195  1.1  kiyohara #define FWXFERQ_BULK (1 << 11)
    196  1.1  kiyohara #define FWXFERQ_MODEMASK (7 << 10)
    197  1.1  kiyohara 
    198  1.1  kiyohara #define FWXFERQ_EXTBUF (1 << 13)
    199  1.1  kiyohara #define FWXFERQ_OPEN (1 << 14)
    200  1.1  kiyohara 
    201  1.1  kiyohara #define FWXFERQ_HANDLER (1 << 16)
    202  1.1  kiyohara #define FWXFERQ_WAKEUP (1 << 17)
    203  1.1  kiyohara 	void (*start) (struct firewire_comm*);
    204  1.1  kiyohara 	int dmach;
    205  1.1  kiyohara 	struct fw_xferlist q;
    206  1.1  kiyohara 	u_int queued;
    207  1.1  kiyohara 	u_int maxq;
    208  1.1  kiyohara 	u_int psize;
    209  1.1  kiyohara 	struct fwdma_alloc_multi *buf;
    210  1.1  kiyohara 	u_int bnchunk;
    211  1.1  kiyohara 	u_int bnpacket;
    212  1.1  kiyohara 	struct fw_bulkxfer *bulkxfer;
    213  1.1  kiyohara 	STAILQ_HEAD(, fw_bulkxfer) stvalid;
    214  1.1  kiyohara 	STAILQ_HEAD(, fw_bulkxfer) stfree;
    215  1.1  kiyohara 	STAILQ_HEAD(, fw_bulkxfer) stdma;
    216  1.1  kiyohara 	struct fw_bulkxfer *stproc;
    217  1.1  kiyohara 	struct selinfo rsel;
    218  1.4  christos 	void *sc;
    219  1.1  kiyohara 	void (*hand) (struct fw_xferq *);
    220  1.1  kiyohara };
    221  1.1  kiyohara 
    222  1.1  kiyohara struct fw_bulkxfer{
    223  1.1  kiyohara 	int poffset;
    224  1.1  kiyohara 	struct mbuf *mbuf;
    225  1.1  kiyohara 	STAILQ_ENTRY(fw_bulkxfer) link;
    226  1.4  christos 	void *start;
    227  1.4  christos 	void *end;
    228  1.1  kiyohara 	int resp;
    229  1.1  kiyohara };
    230  1.1  kiyohara 
    231  1.1  kiyohara struct fw_bind{
    232  1.1  kiyohara 	u_int64_t start;
    233  1.1  kiyohara 	u_int64_t end;
    234  1.1  kiyohara 	struct fw_xferlist xferlist;
    235  1.1  kiyohara 	STAILQ_ENTRY(fw_bind) fclist;
    236  1.1  kiyohara 	STAILQ_ENTRY(fw_bind) chlist;
    237  1.1  kiyohara 	void *sc;
    238  1.1  kiyohara };
    239  1.1  kiyohara 
    240  1.1  kiyohara struct fw_xfer{
    241  1.4  christos 	void *sc;
    242  1.1  kiyohara 	struct firewire_comm *fc;
    243  1.1  kiyohara 	struct fw_xferq *q;
    244  1.1  kiyohara 	struct timeval tv;
    245  1.1  kiyohara 	int8_t resp;
    246  1.7  kiyohara #define FWXF_INIT	0x00
    247  1.7  kiyohara #define FWXF_INQ	0x01
    248  1.7  kiyohara #define FWXF_START	0x02
    249  1.7  kiyohara #define FWXF_SENT	0x04
    250  1.7  kiyohara #define FWXF_SENTERR	0x08
    251  1.7  kiyohara #define FWXF_BUSY	0x10
    252  1.7  kiyohara #define FWXF_RCVD	0x20
    253  1.7  kiyohara 
    254  1.7  kiyohara #define FWXF_WAKE	0x80
    255  1.7  kiyohara 	uint8_t flag;
    256  1.1  kiyohara 	int8_t tl;
    257  1.1  kiyohara 	void (*hand) (struct fw_xfer *);
    258  1.1  kiyohara 	struct {
    259  1.1  kiyohara 		struct fw_pkt hdr;
    260  1.1  kiyohara 		uint32_t *payload;
    261  1.1  kiyohara 		uint16_t pay_len;
    262  1.1  kiyohara 		uint8_t spd;
    263  1.1  kiyohara 	} send, recv;
    264  1.1  kiyohara 	struct mbuf *mbuf;
    265  1.1  kiyohara 	STAILQ_ENTRY(fw_xfer) link;
    266  1.1  kiyohara 	STAILQ_ENTRY(fw_xfer) tlabel;
    267  1.1  kiyohara 	struct malloc_type *malloc;
    268  1.1  kiyohara };
    269  1.1  kiyohara 
    270  1.1  kiyohara struct fw_rcv_buf {
    271  1.1  kiyohara 	struct firewire_comm *fc;
    272  1.1  kiyohara 	struct fw_xfer *xfer;
    273  1.1  kiyohara 	struct iovec *vec;
    274  1.1  kiyohara 	u_int nvec;
    275  1.1  kiyohara 	uint8_t spd;
    276  1.1  kiyohara };
    277  1.1  kiyohara 
    278  1.1  kiyohara void fw_sidrcv (struct firewire_comm *, uint32_t *, u_int);
    279  1.1  kiyohara void fw_rcv (struct fw_rcv_buf *);
    280  1.1  kiyohara void fw_xfer_unload ( struct fw_xfer*);
    281  1.1  kiyohara void fw_xfer_free_buf ( struct fw_xfer*);
    282  1.1  kiyohara void fw_xfer_free ( struct fw_xfer*);
    283  1.1  kiyohara struct fw_xfer *fw_xfer_alloc (struct malloc_type *);
    284  1.1  kiyohara struct fw_xfer *fw_xfer_alloc_buf (struct malloc_type *, int, int);
    285  1.1  kiyohara void fw_init (struct firewire_comm *);
    286  1.1  kiyohara int fw_tbuf_update (struct firewire_comm *, int, int);
    287  1.1  kiyohara int fw_rbuf_update (struct firewire_comm *, int, int);
    288  1.1  kiyohara int fw_bindadd (struct firewire_comm *, struct fw_bind *);
    289  1.1  kiyohara int fw_bindremove (struct firewire_comm *, struct fw_bind *);
    290  1.1  kiyohara int fw_xferlist_add (struct fw_xferlist *, struct malloc_type *, int, int, int,
    291  1.1  kiyohara     struct firewire_comm *, void *, void (*)(struct fw_xfer *));
    292  1.1  kiyohara void fw_xferlist_remove (struct fw_xferlist *);
    293  1.1  kiyohara int fw_asyreq (struct firewire_comm *, int, struct fw_xfer*);
    294  1.7  kiyohara void fw_busreset (struct firewire_comm *, uint32_t);
    295  1.1  kiyohara uint16_t fw_crc16 (uint32_t *, uint32_t);
    296  1.1  kiyohara void fw_xfer_timeout (void *);
    297  1.1  kiyohara void fw_xfer_done (struct fw_xfer *);
    298  1.7  kiyohara void fw_xferwake  (struct fw_xfer *);
    299  1.7  kiyohara int fw_xferwait (struct fw_xfer *);
    300  1.1  kiyohara void fw_asy_callback_free (struct fw_xfer *);
    301  1.1  kiyohara struct fw_device *fw_noderesolve_nodeid (struct firewire_comm *, int);
    302  1.1  kiyohara struct fw_device *fw_noderesolve_eui64 (struct firewire_comm *, struct fw_eui64 *);
    303  1.1  kiyohara struct fw_bind *fw_bindlookup (struct firewire_comm *, uint16_t, uint32_t);
    304  1.1  kiyohara void fw_drain_txq (struct firewire_comm *);
    305  1.1  kiyohara int fwdev_makedev (struct firewire_softc *);
    306  1.1  kiyohara int fwdev_destroydev (struct firewire_softc *);
    307  1.5  kiyohara #if defined(__FreeBSD__) && __FreeBSD_version >= 500000
    308  1.7  kiyohara void fwdev_clone (void *, struct ucred *, char *, int, fw_dev_t *);
    309  1.5  kiyohara #endif
    310  1.7  kiyohara int fw_open_isodma(struct firewire_comm *, int);
    311  1.1  kiyohara 
    312  1.1  kiyohara extern int firewire_debug;
    313  1.1  kiyohara #if defined(__FreeBSD__)
    314  1.1  kiyohara extern devclass_t firewire_devclass;
    315  1.1  kiyohara #elif defined(__NetBSD__)
    316  1.1  kiyohara extern struct cfdriver ieee1394if_cd;
    317  1.1  kiyohara #endif
    318  1.7  kiyohara extern int firewire_phydma_enable;
    319  1.1  kiyohara 
    320  1.1  kiyohara #ifdef __DragonFly__
    321  1.1  kiyohara #define		FWPRI		PCATCH
    322  1.1  kiyohara #else
    323  1.1  kiyohara #define		FWPRI		((PZERO+8)|PCATCH)
    324  1.1  kiyohara #endif
    325  1.1  kiyohara 
    326  1.1  kiyohara #if defined(__DragonFly__) || __FreeBSD_version < 500000 || defined(__NetBSD__)
    327  1.1  kiyohara /* compatibility shim for 4.X */
    328  1.1  kiyohara #define bio buf
    329  1.1  kiyohara #define bio_bcount b_bcount
    330  1.1  kiyohara #define bio_cmd b_flags
    331  1.1  kiyohara #define bio_count b_count
    332  1.1  kiyohara #define bio_data b_data
    333  1.1  kiyohara #define bio_dev b_dev
    334  1.1  kiyohara #define bio_error b_error
    335  1.1  kiyohara #define bio_flags b_flags
    336  1.1  kiyohara #if defined(__FreeBSD__)
    337  1.1  kiyohara #define bio_offset b_offset
    338  1.1  kiyohara #elif defined(__NetBSD__)
    339  1.1  kiyohara #define bio_offset b_blkno
    340  1.1  kiyohara #endif
    341  1.1  kiyohara #define bio_resid b_resid
    342  1.1  kiyohara #define BIO_READ B_READ
    343  1.1  kiyohara #define BIO_WRITE B_WRITE
    344  1.1  kiyohara #define MIN(a,b) (((a)<(b))?(a):(b))
    345  1.1  kiyohara #define MAX(a,b) (((a)>(b))?(a):(b))
    346  1.1  kiyohara #endif
    347  1.1  kiyohara 
    348  1.1  kiyohara MALLOC_DECLARE(M_FW);
    349  1.1  kiyohara MALLOC_DECLARE(M_FWXFER);
    350