The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/firewire/firewirereg.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

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

Cache object: ace38c08aeaaf4f7ef8e0d12d42d2222


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.