Home | History | Annotate | Line # | Download | only in ieee1394
      1  1.20  riastrad /*	$NetBSD: firewirereg.h,v 1.20 2016/11/20 22:47:39 riastradh 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.11  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.11  kiyohara #ifndef _FIREWIREREG_H_
     39  1.11  kiyohara #define _FIREWIREREG_H_
     40   1.1  kiyohara 
     41  1.15  uebayasi #include <sys/selinfo.h>
     42   1.1  kiyohara #include <sys/uio.h>
     43   1.1  kiyohara 
     44  1.11  kiyohara #define PROJECT_STR		"The NetBSD Project"
     45  1.11  kiyohara 
     46   1.1  kiyohara STAILQ_HEAD(fw_xferlist, fw_xfer);
     47   1.1  kiyohara 
     48  1.11  kiyohara struct fw_device {
     49   1.1  kiyohara 	uint16_t dst;
     50   1.1  kiyohara 	struct fw_eui64 eui;
     51   1.1  kiyohara 	uint8_t speed;
     52   1.1  kiyohara 	uint8_t maxrec;
     53   1.1  kiyohara 	uint8_t nport;
     54   1.1  kiyohara 	uint8_t power;
     55   1.1  kiyohara #define CSRROMOFF 0x400
     56   1.1  kiyohara #define CSRROMSIZE 0x400
     57   1.1  kiyohara 	int rommax;	/* offset from 0xffff f000 0000 */
     58   1.1  kiyohara 	uint32_t csrrom[CSRROMSIZE/4];
     59   1.1  kiyohara 	int rcnt;
     60   1.1  kiyohara 	struct firewire_comm *fc;
     61   1.1  kiyohara 	uint32_t status;
     62   1.1  kiyohara #define FWDEVNEW	0
     63   1.1  kiyohara #define FWDEVINIT	1
     64   1.1  kiyohara #define FWDEVATTACHED	2
     65   1.1  kiyohara #define FWDEVINVAL	3
     66   1.1  kiyohara 	STAILQ_ENTRY(fw_device) link;
     67  1.14    cegger 	device_t dev;
     68   1.1  kiyohara };
     69   1.1  kiyohara 
     70   1.1  kiyohara struct firewire_softc {
     71   1.8  kiyohara 	device_t dev;
     72   1.1  kiyohara 	SLIST_HEAD(, firewire_dev_list) devlist;
     73   1.1  kiyohara 	void *si_drv1;
     74   1.1  kiyohara 	struct firewire_comm *fc;
     75   1.1  kiyohara };
     76  1.11  kiyohara 
     77   1.1  kiyohara struct firewire_dev_list {
     78   1.1  kiyohara 	SLIST_ENTRY(firewire_dev_list) link;
     79   1.8  kiyohara 	device_t dev;
     80   1.1  kiyohara 	struct fw_device *fwdev;
     81   1.1  kiyohara };
     82   1.1  kiyohara 
     83   1.1  kiyohara #define FW_MAX_DMACH 0x20
     84   1.1  kiyohara #define FW_MAX_DEVCH FW_MAX_DMACH
     85   1.1  kiyohara #define FW_XFERTIMEOUT 1
     86   1.1  kiyohara 
     87   1.1  kiyohara struct firewire_dev_comm {
     88   1.1  kiyohara 	device_t dev;
     89   1.1  kiyohara 	struct firewire_comm *fc;
     90   1.1  kiyohara 	void (*post_busreset) (void *);
     91   1.1  kiyohara 	void (*post_explore) (void *);
     92   1.1  kiyohara };
     93   1.1  kiyohara 
     94   1.1  kiyohara struct tcode_info {
     95   1.1  kiyohara 	u_char hdr_len;	/* IEEE1394 header length */
     96   1.1  kiyohara 	u_char flag;
     97   1.1  kiyohara #define FWTI_REQ	(1 << 0)
     98   1.1  kiyohara #define FWTI_RES	(1 << 1)
     99   1.1  kiyohara #define FWTI_TLABEL	(1 << 2)
    100   1.1  kiyohara #define FWTI_BLOCK_STR	(1 << 3)
    101   1.1  kiyohara #define FWTI_BLOCK_ASY	(1 << 4)
    102   1.7  kiyohara 	u_char valid_res;
    103   1.1  kiyohara };
    104   1.1  kiyohara 
    105  1.11  kiyohara struct firewire_comm {
    106   1.1  kiyohara 	device_t dev;
    107   1.1  kiyohara 	device_t bdev;
    108   1.1  kiyohara 	uint16_t busid:10,
    109   1.1  kiyohara 		  nodeid:6;
    110   1.1  kiyohara 	u_int mode;
    111   1.1  kiyohara 	u_int nport;
    112   1.1  kiyohara 	u_int speed;
    113   1.1  kiyohara 	u_int maxrec;
    114   1.1  kiyohara 	u_int irm;
    115   1.1  kiyohara 	u_int max_node;
    116   1.1  kiyohara 	u_int max_hop;
    117   1.1  kiyohara #define FWPHYASYST (1 << 0)
    118   1.1  kiyohara 	uint32_t status;
    119  1.11  kiyohara #define	FWBUSDETACHOK	(-3)
    120   1.1  kiyohara #define	FWBUSDETACH	(-2)
    121   1.1  kiyohara #define	FWBUSNOTREADY	(-1)
    122   1.1  kiyohara #define	FWBUSRESET	0
    123   1.1  kiyohara #define	FWBUSINIT	1
    124   1.1  kiyohara #define	FWBUSCYMELECT	2
    125   1.1  kiyohara #define	FWBUSMGRELECT	3
    126   1.1  kiyohara #define	FWBUSMGRDONE	4
    127   1.1  kiyohara #define	FWBUSEXPLORE	5
    128   1.1  kiyohara #define	FWBUSPHYCONF	6
    129   1.1  kiyohara #define	FWBUSEXPDONE	7
    130   1.1  kiyohara #define	FWBUSCOMPLETION	10
    131   1.1  kiyohara 	int nisodma;
    132   1.1  kiyohara 	struct fw_eui64 eui;
    133   1.1  kiyohara 	struct fw_xferq
    134   1.1  kiyohara 		*arq, *atq, *ars, *ats, *it[FW_MAX_DMACH],*ir[FW_MAX_DMACH];
    135   1.1  kiyohara 	struct fw_xferlist tlabels[0x40];
    136   1.7  kiyohara 	u_char last_tlabel[0x40];
    137  1.11  kiyohara 	kmutex_t tlabel_lock;
    138   1.1  kiyohara 	STAILQ_HEAD(, fw_bind) binds;
    139   1.1  kiyohara 	STAILQ_HEAD(, fw_device) devices;
    140   1.1  kiyohara 	u_int  sid_cnt;
    141   1.1  kiyohara #define CSRSIZE 0x4000
    142   1.1  kiyohara 	uint32_t csr_arc[CSRSIZE/4];
    143   1.1  kiyohara #define CROMSIZE 0x400
    144   1.1  kiyohara 	uint32_t *config_rom;
    145   1.1  kiyohara 	struct crom_src_buf *crom_src_buf;
    146   1.1  kiyohara 	struct crom_src *crom_src;
    147   1.1  kiyohara 	struct crom_chunk *crom_root;
    148   1.1  kiyohara 	struct fw_topology_map *topology_map;
    149   1.1  kiyohara 	struct fw_speed_map *speed_map;
    150   1.1  kiyohara 	struct callout busprobe_callout;
    151   1.1  kiyohara 	struct callout bmr_callout;
    152   1.1  kiyohara 	struct callout timeout_callout;
    153   1.1  kiyohara 	uint32_t (*cyctimer) (struct  firewire_comm *);
    154   1.1  kiyohara 	void (*ibr) (struct firewire_comm *);
    155   1.1  kiyohara 	uint32_t (*set_bmr) (struct firewire_comm *, uint32_t);
    156  1.11  kiyohara 	int (*ioctl) (dev_t, u_long, void *, int, struct lwp *);
    157   1.1  kiyohara 	int (*irx_enable) (struct firewire_comm *, int);
    158   1.1  kiyohara 	int (*irx_disable) (struct firewire_comm *, int);
    159   1.1  kiyohara 	int (*itx_enable) (struct firewire_comm *, int);
    160   1.1  kiyohara 	int (*itx_disable) (struct firewire_comm *, int);
    161  1.11  kiyohara 	void (*timeout) (struct firewire_comm *);
    162   1.1  kiyohara 	void (*set_intr) (struct firewire_comm *, int);
    163   1.1  kiyohara 	void (*irx_post) (struct firewire_comm *, uint32_t *);
    164   1.1  kiyohara 	void (*itx_post) (struct firewire_comm *, uint32_t *);
    165   1.2  drochner 	const struct tcode_info *tcode;
    166   1.1  kiyohara 	bus_dma_tag_t dmat;
    167  1.11  kiyohara 	kmutex_t fc_mtx;
    168  1.11  kiyohara 	kmutex_t wait_lock;
    169  1.11  kiyohara 	kcondvar_t fc_cv;
    170  1.11  kiyohara 	struct lwp *probe_thread;
    171   1.1  kiyohara };
    172   1.1  kiyohara #define CSRARC(sc, offset) ((sc)->csr_arc[(offset)/4])
    173   1.1  kiyohara 
    174   1.7  kiyohara 
    175   1.1  kiyohara struct fw_xferq {
    176   1.1  kiyohara 	int flag;
    177   1.1  kiyohara #define FWXFERQ_CHTAGMASK 0xff
    178   1.1  kiyohara #define FWXFERQ_RUNNING (1 << 8)
    179   1.1  kiyohara #define FWXFERQ_STREAM (1 << 9)
    180   1.1  kiyohara 
    181   1.1  kiyohara #define FWXFERQ_BULK (1 << 11)
    182   1.1  kiyohara #define FWXFERQ_MODEMASK (7 << 10)
    183   1.1  kiyohara 
    184   1.1  kiyohara #define FWXFERQ_EXTBUF (1 << 13)
    185   1.1  kiyohara #define FWXFERQ_OPEN (1 << 14)
    186   1.1  kiyohara 
    187   1.1  kiyohara #define FWXFERQ_HANDLER (1 << 16)
    188   1.1  kiyohara #define FWXFERQ_WAKEUP (1 << 17)
    189   1.1  kiyohara 	void (*start) (struct firewire_comm*);
    190   1.1  kiyohara 	int dmach;
    191   1.1  kiyohara 	struct fw_xferlist q;
    192   1.1  kiyohara 	u_int queued;
    193   1.1  kiyohara 	u_int maxq;
    194   1.1  kiyohara 	u_int psize;
    195   1.1  kiyohara 	struct fwdma_alloc_multi *buf;
    196   1.1  kiyohara 	u_int bnchunk;
    197   1.1  kiyohara 	u_int bnpacket;
    198   1.1  kiyohara 	struct fw_bulkxfer *bulkxfer;
    199   1.1  kiyohara 	STAILQ_HEAD(, fw_bulkxfer) stvalid;
    200   1.1  kiyohara 	STAILQ_HEAD(, fw_bulkxfer) stfree;
    201   1.1  kiyohara 	STAILQ_HEAD(, fw_bulkxfer) stdma;
    202   1.1  kiyohara 	struct fw_bulkxfer *stproc;
    203  1.20  riastrad 	kcondvar_t cv;
    204   1.1  kiyohara 	struct selinfo rsel;
    205   1.4  christos 	void *sc;
    206   1.1  kiyohara 	void (*hand) (struct fw_xferq *);
    207  1.11  kiyohara 	kmutex_t q_mtx;
    208   1.1  kiyohara };
    209   1.1  kiyohara 
    210  1.11  kiyohara #define FW_GMTX(fc)             (&(fc)->fc_mtx)
    211  1.11  kiyohara #define FW_GLOCK(fc)            fw_mtx_lock(FW_GMTX(fc))
    212  1.11  kiyohara #define FW_GUNLOCK(fc)          fw_mtx_unlock(FW_GMTX(fc))
    213  1.11  kiyohara #define FW_GLOCK_ASSERT(fc)     fw_mtx_assert(FW_GMTX(fc), MA_OWNED)
    214  1.11  kiyohara 
    215  1.11  kiyohara struct fw_bulkxfer {
    216   1.1  kiyohara 	int poffset;
    217   1.1  kiyohara 	struct mbuf *mbuf;
    218   1.1  kiyohara 	STAILQ_ENTRY(fw_bulkxfer) link;
    219   1.4  christos 	void *start;
    220   1.4  christos 	void *end;
    221   1.1  kiyohara 	int resp;
    222   1.1  kiyohara };
    223   1.1  kiyohara 
    224  1.11  kiyohara struct fw_bind {
    225   1.1  kiyohara 	u_int64_t start;
    226   1.1  kiyohara 	u_int64_t end;
    227   1.1  kiyohara 	struct fw_xferlist xferlist;
    228   1.1  kiyohara 	STAILQ_ENTRY(fw_bind) fclist;
    229   1.1  kiyohara 	STAILQ_ENTRY(fw_bind) chlist;
    230   1.1  kiyohara 	void *sc;
    231  1.11  kiyohara 	kmutex_t fwb_mtx;
    232   1.1  kiyohara };
    233   1.1  kiyohara 
    234  1.11  kiyohara struct fw_xfer {
    235   1.4  christos 	void *sc;
    236   1.1  kiyohara 	struct firewire_comm *fc;
    237   1.1  kiyohara 	struct fw_xferq *q;
    238   1.1  kiyohara 	struct timeval tv;
    239   1.1  kiyohara 	int8_t resp;
    240   1.7  kiyohara #define FWXF_INIT	0x00
    241   1.7  kiyohara #define FWXF_INQ	0x01
    242   1.7  kiyohara #define FWXF_START	0x02
    243   1.7  kiyohara #define FWXF_SENT	0x04
    244   1.7  kiyohara #define FWXF_SENTERR	0x08
    245   1.7  kiyohara #define FWXF_BUSY	0x10
    246   1.7  kiyohara #define FWXF_RCVD	0x20
    247   1.7  kiyohara 
    248   1.7  kiyohara #define FWXF_WAKE	0x80
    249   1.7  kiyohara 	uint8_t flag;
    250   1.1  kiyohara 	int8_t tl;
    251   1.1  kiyohara 	void (*hand) (struct fw_xfer *);
    252   1.1  kiyohara 	struct {
    253   1.1  kiyohara 		struct fw_pkt hdr;
    254   1.1  kiyohara 		uint32_t *payload;
    255   1.1  kiyohara 		uint16_t pay_len;
    256   1.1  kiyohara 		uint8_t spd;
    257   1.1  kiyohara 	} send, recv;
    258   1.1  kiyohara 	struct mbuf *mbuf;
    259   1.1  kiyohara 	STAILQ_ENTRY(fw_xfer) link;
    260   1.1  kiyohara 	STAILQ_ENTRY(fw_xfer) tlabel;
    261   1.1  kiyohara 	struct malloc_type *malloc;
    262  1.11  kiyohara 	kcondvar_t cv;
    263   1.1  kiyohara };
    264   1.1  kiyohara 
    265   1.1  kiyohara struct fw_rcv_buf {
    266   1.1  kiyohara 	struct firewire_comm *fc;
    267   1.1  kiyohara 	struct fw_xfer *xfer;
    268   1.1  kiyohara 	struct iovec *vec;
    269   1.1  kiyohara 	u_int nvec;
    270   1.1  kiyohara 	uint8_t spd;
    271   1.1  kiyohara };
    272   1.1  kiyohara 
    273   1.1  kiyohara int fw_tbuf_update (struct firewire_comm *, int, int);
    274   1.1  kiyohara int fw_rbuf_update (struct firewire_comm *, int, int);
    275   1.1  kiyohara int fwdev_makedev (struct firewire_softc *);
    276   1.1  kiyohara int fwdev_destroydev (struct firewire_softc *);
    277  1.11  kiyohara 
    278  1.11  kiyohara struct fw_device *fw_noderesolve_nodeid(struct firewire_comm *, int);
    279  1.11  kiyohara struct fw_device *fw_noderesolve_eui64(struct firewire_comm *,
    280  1.11  kiyohara 				       struct fw_eui64 *);
    281  1.11  kiyohara int fw_asyreq(struct firewire_comm *, int, struct fw_xfer*);
    282  1.11  kiyohara void fw_xferwake(struct fw_xfer *);
    283  1.11  kiyohara int fw_xferwait(struct fw_xfer *);
    284  1.11  kiyohara void fw_drain_txq(struct firewire_comm *);
    285  1.11  kiyohara void fw_busreset(struct firewire_comm *, uint32_t);
    286  1.11  kiyohara void fw_init(struct firewire_comm *);
    287  1.19  riastrad void fw_init_isodma(struct firewire_comm *);
    288  1.20  riastrad void fw_destroy_isodma(struct firewire_comm *);
    289  1.18  riastrad void fw_destroy(struct firewire_comm *);
    290  1.11  kiyohara struct fw_bind *fw_bindlookup(struct firewire_comm *, uint16_t, uint32_t);
    291  1.11  kiyohara int fw_bindadd(struct firewire_comm *, struct fw_bind *);
    292  1.11  kiyohara int fw_bindremove(struct firewire_comm *, struct fw_bind *);
    293  1.11  kiyohara int fw_xferlist_add(struct fw_xferlist *, struct malloc_type *, int, int, int,
    294  1.11  kiyohara 		    struct firewire_comm *, void *, void (*)(struct fw_xfer *));
    295  1.11  kiyohara void fw_xferlist_remove(struct fw_xferlist *);
    296  1.11  kiyohara struct fw_xfer *fw_xfer_alloc(struct malloc_type *);
    297  1.11  kiyohara struct fw_xfer *fw_xfer_alloc_buf(struct malloc_type *, int, int);
    298  1.11  kiyohara void fw_xfer_done(struct fw_xfer *);
    299  1.11  kiyohara void fw_xfer_unload(struct fw_xfer*);
    300  1.11  kiyohara void fw_xfer_free(struct fw_xfer*);
    301  1.11  kiyohara void fw_xfer_free_buf(struct fw_xfer*);
    302  1.11  kiyohara void fw_asy_callback_free(struct fw_xfer *);
    303  1.11  kiyohara void fw_sidrcv(struct firewire_comm *, uint32_t *, u_int);
    304  1.11  kiyohara void fw_rcv(struct fw_rcv_buf *);
    305  1.11  kiyohara uint16_t fw_crc16(uint32_t *, uint32_t);
    306   1.7  kiyohara int fw_open_isodma(struct firewire_comm *, int);
    307   1.1  kiyohara 
    308   1.1  kiyohara extern int firewire_debug;
    309   1.7  kiyohara extern int firewire_phydma_enable;
    310   1.1  kiyohara 
    311   1.1  kiyohara #define		FWPRI		((PZERO+8)|PCATCH)
    312   1.1  kiyohara 
    313   1.1  kiyohara /* compatibility shim for 4.X */
    314   1.1  kiyohara #define bio buf
    315   1.1  kiyohara #define bio_bcount b_bcount
    316   1.1  kiyohara #define bio_cmd b_flags
    317   1.1  kiyohara #define bio_count b_count
    318   1.1  kiyohara #define bio_data b_data
    319   1.1  kiyohara #define bio_dev b_dev
    320   1.1  kiyohara #define bio_error b_error
    321   1.1  kiyohara #define bio_flags b_flags
    322   1.1  kiyohara #define bio_offset b_blkno
    323   1.1  kiyohara #define bio_resid b_resid
    324   1.1  kiyohara #define BIO_READ B_READ
    325   1.1  kiyohara #define BIO_WRITE B_WRITE
    326   1.1  kiyohara 
    327  1.16     rmind #include <sys/mallocvar.h>
    328  1.16     rmind 
    329   1.1  kiyohara MALLOC_DECLARE(M_FW);
    330  1.11  kiyohara 
    331  1.11  kiyohara #endif	/* _FIREWIREREG_H_ */
    332