firewirereg.h revision 114069
1238438Sdteske/* 2238438Sdteske * Copyright (c) 2003 Hidetoshi Shimokawa 3247280Sdteske * Copyright (c) 1998-2002 Katsushi Kobayashi and Hidetoshi Shimokawa 4252980Sdteske * All rights reserved. 5238438Sdteske * 6238438Sdteske * Redistribution and use in source and binary forms, with or without 7238438Sdteske * modification, are permitted provided that the following conditions 8238438Sdteske * are met: 9238438Sdteske * 1. Redistributions of source code must retain the above copyright 10238438Sdteske * notice, this list of conditions and the following disclaimer. 11238438Sdteske * 2. Redistributions in binary form must reproduce the above copyright 12238438Sdteske * notice, this list of conditions and the following disclaimer in the 13238438Sdteske * documentation and/or other materials provided with the distribution. 14238438Sdteske * 3. All advertising materials mentioning features or use of this software 15238438Sdteske * must display the acknowledgement as bellow: 16238438Sdteske * 17238438Sdteske * This product includes software developed by K. Kobayashi and H. Shimokawa 18238438Sdteske * 19238438Sdteske * 4. The name of the author may not be used to endorse or promote products 20238438Sdteske * derived from this software without specific prior written permission. 21238438Sdteske * 22238438Sdteske * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 23238438Sdteske * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 24238438Sdteske * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 25238438Sdteske * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 26238438Sdteske * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 27238438Sdteske * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 28238438Sdteske * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29238438Sdteske * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 30238438Sdteske * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 31240684Sdteske * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 32240684Sdteske * POSSIBILITY OF SUCH DAMAGE. 33244675Sdteske * 34240684Sdteske * $FreeBSD: head/sys/dev/firewire/firewirereg.h 114069 2003-04-26 16:45:40Z simokawa $ 35252077Sdteske * 36240684Sdteske */ 37238438Sdteske 38240684Sdteske#if __FreeBSD_version >= 500000 39238438Sdtesketypedef struct thread fw_proc; 40238438Sdteske#include <sys/selinfo.h> 41238438Sdteske#else 42238438Sdtesketypedef struct proc fw_proc; 43243504Sdteske#include <sys/select.h> 44243504Sdteske#endif 45243504Sdteske 46247280Sdteske#include <sys/uio.h> 47243504Sdteske 48243504Sdteske#define splfw splimp 49243504Sdteske 50243504Sdteskestruct fw_device{ 51238438Sdteske u_int16_t dst; 52243504Sdteske struct fw_eui64 eui; 53243504Sdteske u_int8_t speed; 54243504Sdteske u_int8_t maxrec; 55252178Sdteske u_int8_t nport; 56252178Sdteske u_int8_t power; 57252178Sdteske#define CSRROMOFF 0x400 58252178Sdteske#define CSRROMSIZE 0x400 59238438Sdteske int rommax; /* offset from 0xffff f000 0000 */ 60243504Sdteske u_int32_t csrrom[CSRROMSIZE/4]; 61238438Sdteske int rcnt; 62243504Sdteske struct firewire_comm *fc; 63243504Sdteske u_int32_t status; 64243504Sdteske#define FWDEVINIT 1 65243504Sdteske#define FWDEVATTACHED 2 66243504Sdteske#define FWDEVINVAL 3 67243504Sdteske STAILQ_ENTRY(fw_device) link; 68243504Sdteske}; 69243504Sdteske 70243504Sdteskestruct firewire_softc { 71243504Sdteske#if __FreeBSD_version >= 500000 72243504Sdteske dev_t dev; 73243504Sdteske#else 74243504Sdteske dev_t dev[FWMAXNDMA+1]; 75243504Sdteske#endif 76243504Sdteske struct firewire_comm *fc; 77243504Sdteske}; 78243504Sdteske 79238438Sdteske#define FW_MAX_DMACH 0x20 80238438Sdteske#define FW_MAX_DEVCH FW_MAX_DMACH 81238438Sdteske#define FW_XFERTIMEOUT 1 82243504Sdteske 83243504Sdteskestruct firewire_dev_comm { 84243504Sdteske device_t dev; 85243634Sdteske struct firewire_comm *fc; 86243504Sdteske void (*post_busreset) __P((void *)); 87243504Sdteske void (*post_explore) __P((void *)); 88243504Sdteske}; 89243504Sdteske 90243504Sdteskestruct tcode_info { 91243504Sdteske u_char hdr_len; /* IEEE1394 header length */ 92243504Sdteske u_char flag; 93243504Sdteske#define FWTI_REQ (1 << 0) 94252178Sdteske#define FWTI_RES (1 << 1) 95252178Sdteske#define FWTI_TLABEL (1 << 2) 96252178Sdteske#define FWTI_BLOCK_STR (1 << 3) 97252178Sdteske#define FWTI_BLOCK_ASY (1 << 4) 98243504Sdteske}; 99243504Sdteske 100243504Sdteskestruct firewire_comm{ 101243504Sdteske device_t dev; 102243504Sdteske device_t bdev; 103243475Sdteske u_int16_t busid:10, 104243504Sdteske nodeid:6; 105243475Sdteske u_int mode; 106243504Sdteske u_int nport; 107243504Sdteske u_int speed; 108243504Sdteske u_int maxrec; 109243504Sdteske u_int irm; 110243504Sdteske u_int max_node; 111243504Sdteske u_int max_hop; 112243504Sdteske u_int max_asyretry; 113243504Sdteske#define FWPHYASYST (1 << 0) 114243504Sdteske u_int retry_count; 115243504Sdteske u_int32_t ongobus:10, 116243504Sdteske ongonode:6, 117243504Sdteske ongoaddr:16; 118243504Sdteske struct fw_device *ongodev; 119243504Sdteske struct fw_eui64 ongoeui; 120243504Sdteske#define FWMAXCSRDIR 16 121243504Sdteske SLIST_HEAD(, csrdir) ongocsr; 122243504Sdteske SLIST_HEAD(, csrdir) csrfree; 123243475Sdteske u_int32_t status; 124243475Sdteske#define FWBUSRESET 0 125243475Sdteske#define FWBUSINIT 1 126238438Sdteske#define FWBUSCYMELECT 2 127238438Sdteske#define FWBUSMGRELECT 3 128238438Sdteske#define FWBUSMGRDONE 4 129238438Sdteske#define FWBUSEXPLORE 5 130238438Sdteske#define FWBUSPHYCONF 6 131238438Sdteske#define FWBUSEXPDONE 7 132238438Sdteske#define FWBUSCOMPLETION 10 133238438Sdteske int nisodma; 134238438Sdteske struct fw_eui64 eui; 135238438Sdteske struct fw_xferq 136238438Sdteske *arq, *atq, *ars, *ats, *it[FW_MAX_DMACH],*ir[FW_MAX_DMACH]; 137238438Sdteske STAILQ_HEAD(, tlabel) tlabels[0x40]; 138238438Sdteske STAILQ_HEAD(, fw_bind) binds; 139238438Sdteske STAILQ_HEAD(, fw_device) devices; 140238438Sdteske STAILQ_HEAD(, fw_xfer) pending; 141238438Sdteske u_int sid_cnt; 142238438Sdteske#define CSRSIZE 0x4000 143238438Sdteske u_int32_t csr_arc[CSRSIZE/4]; 144238438Sdteske#define CROMSIZE 0x400 145238438Sdteske u_int32_t *config_rom; 146238438Sdteske struct fw_topology_map *topology_map; 147238438Sdteske struct fw_speed_map *speed_map; 148238438Sdteske struct callout busprobe_callout; 149252853Sdteske struct callout bmr_callout; 150252853Sdteske struct callout timeout_callout; 151238438Sdteske struct callout retry_probe_callout; 152238438Sdteske u_int32_t (*cyctimer) __P((struct firewire_comm *)); 153238438Sdteske void (*ibr) __P((struct firewire_comm *)); 154238438Sdteske u_int32_t (*set_bmr) __P((struct firewire_comm *, u_int32_t)); 155238438Sdteske int (*ioctl) __P((dev_t, u_long, caddr_t, int, fw_proc *)); 156238438Sdteske int (*irx_enable) __P((struct firewire_comm *, int)); 157238438Sdteske int (*irx_disable) __P((struct firewire_comm *, int)); 158244548Sdteske int (*itx_enable) __P((struct firewire_comm *, int)); 159238438Sdteske int (*itx_disable) __P((struct firewire_comm *, int)); 160238438Sdteske void (*timeout) __P((void *)); 161238438Sdteske void (*poll) __P((struct firewire_comm *, int, int)); 162244548Sdteske void (*set_intr) __P((struct firewire_comm *, int)); 163238438Sdteske void (*irx_post) __P((struct firewire_comm *, u_int32_t *)); 164238438Sdteske void (*itx_post) __P((struct firewire_comm *, u_int32_t *)); 165251242Sdteske struct tcode_info *tcode; 166251242Sdteske bus_dma_tag_t dmat; 167238438Sdteske}; 168238438Sdteske#define CSRARC(sc, offset) ((sc)->csr_arc[(offset)/4]) 169238438Sdteske 170238438Sdteskestruct csrdir{ 171238438Sdteske u_int32_t ongoaddr; 172238438Sdteske u_int32_t off; 173238438Sdteske SLIST_ENTRY(csrdir) link; 174238438Sdteske}; 175238438Sdteske 176238438Sdteskestruct fw_xferq { 177238438Sdteske int flag; 178238438Sdteske#define FWXFERQ_CHTAGMASK 0xff 179238438Sdteske#define FWXFERQ_RUNNING (1 << 8) 180238438Sdteske#define FWXFERQ_STREAM (1 << 9) 181238438Sdteske 182238438Sdteske#define FWXFERQ_BULK (1 << 11) 183238438Sdteske#define FWXFERQ_MODEMASK (7 << 10) 184238438Sdteske 185238438Sdteske#define FWXFERQ_EXTBUF (1 << 13) 186238438Sdteske#define FWXFERQ_OPEN (1 << 14) 187238438Sdteske 188238438Sdteske#define FWXFERQ_HANDLER (1 << 16) 189238438Sdteske#define FWXFERQ_WAKEUP (1 << 17) 190238438Sdteske 191238438Sdteske void (*start) __P((struct firewire_comm*)); 192238438Sdteske STAILQ_HEAD(, fw_xfer) q; 193238438Sdteske u_int queued; 194238438Sdteske u_int maxq; 195238438Sdteske u_int psize; 196238438Sdteske STAILQ_HEAD(, fw_bind) binds; 197238438Sdteske struct fwdma_alloc_multi *buf; 198238438Sdteske u_int bnchunk; 199238438Sdteske u_int bnpacket; 200238438Sdteske struct fw_bulkxfer *bulkxfer; 201238438Sdteske STAILQ_HEAD(, fw_bulkxfer) stvalid; 202238438Sdteske STAILQ_HEAD(, fw_bulkxfer) stfree; 203238438Sdteske STAILQ_HEAD(, fw_bulkxfer) stdma; 204238438Sdteske struct fw_bulkxfer *stproc; 205238438Sdteske struct selinfo rsel; 206238438Sdteske caddr_t sc; 207238438Sdteske void (*hand) __P((struct fw_xferq *)); 208238438Sdteske}; 209238438Sdteske 210238438Sdteskestruct fw_bulkxfer{ 211238438Sdteske int poffset; 212238438Sdteske struct mbuf *mbuf; 213238438Sdteske STAILQ_ENTRY(fw_bulkxfer) link; 214244675Sdteske caddr_t start; 215244675Sdteske caddr_t end; 216244675Sdteske int resp; 217244675Sdteske}; 218238438Sdteske 219struct tlabel{ 220 struct fw_xfer *xfer; 221 STAILQ_ENTRY(tlabel) link; 222}; 223 224struct fw_bind{ 225 u_int32_t start_hi, start_lo, addrlen; 226 STAILQ_HEAD(, fw_xfer) xferlist; 227 STAILQ_ENTRY(fw_bind) fclist; 228 STAILQ_ENTRY(fw_bind) chlist; 229#define FWACT_NULL 0 230#define FWACT_XFER 2 231#define FWACT_CH 3 232 u_int8_t act_type; 233 u_int8_t sub; 234}; 235 236struct fw_xfer{ 237 caddr_t sc; 238 struct firewire_comm *fc; 239 struct fw_xferq *q; 240 struct timeval tv; 241 /* XXX should be removed */ 242 u_int32_t dst; /* XXX for if_fwe */ 243 u_int8_t spd; 244 int8_t resp; 245#define FWXF_INIT 0 246#define FWXF_INQ 1 247#define FWXF_START 2 248#define FWXF_SENT 3 249#define FWXF_SENTERR 4 250#define FWXF_BUSY 8 251#define FWXF_RCVD 10 252 u_int8_t state; 253 u_int8_t retry; 254 u_int8_t tl; 255 void (*retry_req) __P((struct fw_xfer *)); 256 union{ 257 void (*hand) __P((struct fw_xfer *)); 258 } act; 259 struct { 260 int len; 261 caddr_t buf; 262 } send, recv; 263 struct mbuf *mbuf; 264 STAILQ_ENTRY(fw_xfer) link; 265 struct malloc_type *malloc; 266}; 267void fw_sidrcv __P((struct firewire_comm *, u_int32_t *, u_int)); 268void fw_rcv __P((struct firewire_comm *, struct iovec *, int, u_int, u_int)); 269void fw_xfer_unload __P(( struct fw_xfer*)); 270void fw_xfer_free __P(( struct fw_xfer*)); 271struct fw_xfer *fw_xfer_alloc __P((struct malloc_type *)); 272struct fw_xfer *fw_xfer_alloc_buf __P((struct malloc_type *, int, int)); 273void fw_init __P((struct firewire_comm *)); 274int fw_tbuf_update __P((struct firewire_comm *, int, int)); 275int fw_rbuf_update __P((struct firewire_comm *, int, int)); 276void fw_asybusy __P((struct fw_xfer *)); 277int fw_bindadd __P((struct firewire_comm *, struct fw_bind *)); 278int fw_bindremove __P((struct firewire_comm *, struct fw_bind *)); 279int fw_asyreq __P((struct firewire_comm *, int, struct fw_xfer*)); 280void fw_busreset __P((struct firewire_comm *)); 281u_int16_t fw_crc16 __P((u_int32_t *, u_int32_t)); 282void fw_xfer_timeout __P((void *)); 283void fw_xfer_done __P((struct fw_xfer *)); 284void fw_asy_callback __P((struct fw_xfer *)); 285struct fw_device *fw_noderesolve_nodeid __P((struct firewire_comm *, int)); 286struct fw_device *fw_noderesolve_eui64 __P((struct firewire_comm *, struct fw_eui64 *)); 287struct fw_bind *fw_bindlookup __P((struct firewire_comm *, u_int32_t, u_int32_t)); 288void fw_drain_txq __P((struct firewire_comm *)); 289 290 291extern int firewire_debug; 292extern devclass_t firewire_devclass; 293 294#define DV_BROADCAST_ON (1<<30) 295#define IP_CHANNELS 0x0234 296 297#define STATE_CLEAR 0x0000 298#define STATE_SET 0x0004 299#define NODE_IDS 0x0008 300#define RESET_START 0x000c 301#define SPLIT_TIMEOUT_HI 0x0018 302#define SPLIT_TIMEOUT_LO 0x001c 303#define CYCLE_TIME 0x0200 304#define BUS_TIME 0x0204 305#define BUSY_TIMEOUT 0x0210 306#define BUS_MGR_ID 0x021c 307#define BANDWIDTH_AV 0x0220 308#define CHANNELS_AV_HI 0x0224 309#define CHANNELS_AV_LO 0x0228 310 311#define CONF_ROM 0x0400 312 313#define TOPO_MAP 0x1000 314#define SPED_MAP 0x2000 315 316#define oMPR 0x900 317#define oPCR 0x904 318 319#define iMPR 0x980 320#define iPCR 0x984 321 322#define FWPRI ((PZERO+8)|PCATCH) 323 324#if __FreeBSD_version >= 500000 325#define CALLOUT_INIT(x) callout_init(x, 0 /* mpsafe */) 326#else 327#define CALLOUT_INIT(x) callout_init(x) 328#endif 329 330MALLOC_DECLARE(M_FW); 331MALLOC_DECLARE(M_FWXFER); 332