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/ieee1394/fw_port.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 /*      $NetBSD: fw_port.h,v 1.20 2006/11/16 01:32:59 christos Exp $    */
    2 /*
    3  * Copyright (c) 2004 KIYOHARA Takashi
    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  *
   15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
   16  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
   17  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   18  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
   19  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
   20  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
   21  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   22  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
   23  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
   24  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
   25  * POSSIBILITY OF SUCH DAMAGE.
   26  * 
   27  */
   28 
   29 #ifndef _FW_PORT_H
   30 #define _FW_PORT_H
   31 
   32 #ifdef _KERNEL
   33 
   34 #if defined(__FreeBSD__)
   35 #ifdef __DragonFly__
   36 #define OS_STR                  "DragonFly"
   37 #define OS_VER                  __DragonFly_cc_version
   38 #define OS_VER_STR              "DragonFly-1"
   39 #define PROJECT_STR             "DragonFly Project"
   40 #else
   41 #define OS_STR                  "FreeBSD"
   42 #define OS_VER                  __FreeBSD_version
   43 #define OS_VER_STR              "FreeBSD-5"
   44 #define PROJECT_STR             "FreeBSD Project"
   45 #endif
   46 
   47 #if defined(__DragonFly__) || __FreeBSD_version < 500000
   48 #define dev2unit(x)     ((minor(x) & 0xff) | (minor(x) >> 8))
   49 #define unit2minor(x)   (((x) & 0xff) | (((x) << 8) & ~0xffff))
   50 #endif
   51 
   52 #ifdef __DragonFly__
   53 typedef d_thread_t fw_proc;
   54 typedef d_thread_t fw_thread;
   55 #include <sys/select.h>
   56 #define M_DONTWAIT MB_DONTWAIT
   57 #elif __FreeBSD_version >= 500000
   58 typedef struct thread fw_proc;
   59 typedef struct thread fw_thread;
   60 #include <sys/selinfo.h>
   61 #else
   62 typedef struct proc fw_thread;
   63 typedef struct proc fw_proc;
   64 #include <sys/select.h>
   65 #endif
   66 
   67 
   68 #if defined(__DragonFly__) || __FreeBSD_version < 500000
   69 #define CALLOUT_INIT(x) callout_init(x)
   70 #define DEV_T dev_t
   71 #define FW_LOCK
   72 #define FW_UNLOCK
   73 #define THREAD_CREATE(f, sc, p, name, arg) \
   74      kthread_create(f, (void *)sc, p, name, arg)
   75 #define THREAD_EXIT(x)  kthread_exit()
   76 #else
   77 #define CALLOUT_INIT(x) callout_init(x, 0 /* mpsafe */)
   78 #define DEV_T struct cdev *
   79 #define FW_LOCK         mtx_lock(&Giant)
   80 #define FW_UNLOCK       mtx_unlock(&Giant)
   81 #define THREAD_CREATE(f, sc, p, name, arg) \
   82      kthread_create(f, (void *)sc, p, 0, 0, name, arg)
   83 #define THREAD_EXIT(x)  kthread_exit(x)
   84 #endif
   85 #define fw_kthread_create(func, arg) \
   86                                 func((arg))
   87 
   88 /*
   89  * fw attach macro for FreeBSD
   90  */
   91 #define FW_ATTACH(dname)        \
   92         static int              \
   93         __CONCAT(dname,_attach)(device_t dev)
   94 #define FW_ATTACH_START(dname, sc, fwa)                                 \
   95         struct __CONCAT(dname,_softc) *sc =                             \
   96             ((struct __CONCAT(dname,_softc) *)device_get_softc(dev));   \
   97         __attribute__((__unused__))struct fw_attach_args *fwa =         \
   98             device_get_ivars(dev)
   99 #define FW_ATTACH_RETURN(r)     return (r)
  100 
  101 /*
  102  * fw detach macro for FreeBSD
  103  */
  104 #define FW_DETACH(dname)        \
  105         static int              \
  106         __CONCAT(dname,_detach)(device_t dev)
  107 #define FW_DETACH_START(dname, sc)                                      \
  108         struct __CONCAT(dname,_softc) *sc =                             \
  109             ((struct __CONCAT(dname,_softc) *)device_get_softc(dev))
  110 
  111 /*
  112  * fw intr macro for FreeBSD
  113  */
  114 #define FW_INTR(fwohci) \
  115         void            \
  116         fwohci_intr(void *arg)
  117 #define FW_INTR_RETURN(r)       return
  118 
  119 /*
  120  * fw open macro for FreeBSD
  121  */
  122 #define FW_OPEN(dname)  \
  123         int             \
  124         __CONCAT(dname,_open)(DEV_T dev, int flags, int fmt, fw_proc *td)
  125 #define FW_OPEN_START                   \
  126         int unit = DEV2UNIT(dev);       \
  127         __attribute__((__unused__))struct firewire_softc *sc = \
  128             devclass_get_softc(firewire_devclass, unit)
  129 
  130 /*
  131  * fw close macro for FreeBSD
  132  */
  133 #define FW_CLOSE(dname)         \
  134         int                     \
  135         __CONCAT(dname,_close)(DEV_T dev, int flags, \
  136         int fmt, fw_proc *td)
  137 #define FW_CLOSE_START
  138 
  139 /*
  140  * fw read macro for FreeBSD
  141  */
  142 #define FW_READ(dname)  \
  143         int             \
  144         __CONCAT(dname,_read)(DEV_T dev, struct uio *uio, int ioflag) 
  145 #define FW_READ_START
  146 
  147 /*
  148  * fw write macro for FreeBSD
  149  */
  150 #define FW_WRITE(dname) \
  151         int             \
  152         __CONCAT(dname,_write)(DEV_T dev, struct uio *uio, int ioflag)
  153 #define FW_WRITE_START
  154 
  155 /*
  156  * fw ioctl macro for FreeBSD
  157  */
  158 #define FW_IOCTL(dname)                                 \
  159         int                                             \
  160         __CONCAT(dname,_ioctl)                          \
  161             (DEV_T dev, u_long cmd, caddr_t data, int flag, fw_proc *td)
  162 #define FW_IOCTL_START                  \
  163         int unit = DEV2UNIT(dev);       \
  164         __attribute__((__unused__))struct firewire_softc *sc = \
  165             devclass_get_softc(firewire_devclass, unit)
  166 
  167 
  168 /*
  169  * fw poll macro for FreeBSD
  170  */
  171 #define FW_POLL(dname)  \
  172         int             \
  173         __CONCAT(dname,_poll)(DEV_T dev, int events, fw_proc *td)
  174 #define FW_POLL_START
  175 
  176 /*
  177  * fw mmap macro for FreeBSD
  178  */
  179 #if defined(__DragonFly__) || __FreeBSD_version < 500102
  180 #define FW_MMAP(dname)  \
  181         int             \
  182         __CONCAT(dname,_mmap)(DEV_T dev, vm_offset_t offset, int nproto)
  183 #else
  184 #define FW_MMAP(dname)          \
  185         int                     \
  186         __CONCAT(dname,_mmap)   \
  187            (DEV_T dev, vm_offset_t offset, vm_paddr_t *paddr, int nproto)
  188 #endif
  189 #define FW_MMAP_START
  190 
  191 /*
  192  * fw strategy macro for FreeBSD
  193  */
  194 #define FW_STRATEGY_START               \
  195         DEV_T dev = bp->bio_dev;        \
  196         int unit = DEV2UNIT(dev);       \
  197         __attribute__((__unused__))struct firewire_softc *sc = \
  198             devclass_get_softc(firewire_devclass, unit)
  199 
  200 /*
  201  * if macro for FreeBSD
  202  */
  203 #define IF_STOP(dname)  \
  204         static void     \
  205         __CONCAT(dname,_stop)(struct __CONCAT(dname,_softc) *fwip)
  206 #define IF_STOP_START(dname, ifp, sc) \
  207         struct ifnet *ifp = &(sc)->fwip_if
  208 #define IF_DETACH_START(dname, sc)              \
  209         struct __CONCAT(dname,_softc) *sc =     \
  210             (struct __CONCAT(dname,_softc) *)device_get_softc(dev)
  211 #define IF_INIT(dname)  \
  212         static void     \
  213         __CONCAT(dname,_init)(void *arg)
  214 #define IF_INIT_START(dname, sc, ifp)                   \
  215         struct __CONCAT(dname,_softc) *sc =             \
  216             ((struct fwip_eth_softc *)arg)->fwip;       \
  217         struct ifnet *ifp = &(sc)->fwip_if
  218 #define IF_INIT_RETURN(r)       return
  219 #define IF_IOCTL_START(dname, sc)               \
  220         struct __CONCAT(dname,_softc) *sc =     \
  221             ((struct fwip_eth_softc *)ifp->if_softc)->fwip
  222 
  223 /*
  224  * fwohci macro for FreeBSD
  225  */
  226 #define FWOHCI_INIT_END
  227 #define FWOHCI_DETACH() \
  228         int             \
  229         fwohci_detach(struct fwohci_softc *sc, device_t dev)
  230 #define FWOHCI_DETACH_START
  231 #define FWOHCI_DETACH_END
  232 #define FWOHCI_STOP()   \
  233         int             \
  234         fwohci_stop(struct fwohci_softc *sc, device_t dev)
  235 #define FWOHCI_STOP_START
  236 #define FWOHCI_STOP_RETURN(r)   return (r) 
  237 
  238 /*
  239  * firewire macro for FreeBSD
  240  */
  241 #define FIREWIRE_ATTACH_START                   \
  242         device_t pa = device_get_parent(dev);   \
  243         struct firewire_comm *fc = (struct firewire_comm *)device_get_softc(pa)
  244 #define FWDEV_DESTROYDEV(sc)                                    \
  245         do {                                                    \
  246                 int err;                                        \
  247                 if ((err = fwdev_destroydev((sc))) != 0)        \
  248                         return err;                             \
  249         } while (/*CONSTCOND*/0)
  250 #define FIREWIRE_GENERIC_ATTACH                                 \
  251         do {                                                    \
  252                 /* Locate our children */                       \
  253                 bus_generic_probe(dev);                         \
  254                                                                 \
  255                 /* launch attachement of the added children */  \
  256                 bus_generic_attach(dev);                        \
  257         } while (/*CONSTCOND*/0)
  258 #define FIREWIRE_GENERIC_DETACH                                 \
  259         do {                                                    \
  260                 int err;                                        \
  261                 if ((err = bus_generic_detach(dev)) != 0)       \
  262                         return err;                             \
  263         } while (/*CONSTCOND*/0)
  264 #define FIREWIRE_SBP_ATTACH                                             \
  265         do {                                                            \
  266                 fwa.fwdev = fwdev;                                      \
  267                 fwdev->sbp = device_add_child(fc->bdev, fwa.name, -1);  \
  268                 if (fwdev->sbp) {                                       \
  269                         device_set_ivars(fwdev->sbp, &fwa);             \
  270                         device_probe_and_attach(fwdev->sbp);            \
  271                 }                                                       \
  272         } while (/*CONSTCOND*/0)
  273 #define FIREWIRE_SBP_DETACH                             \
  274         do {                                            \
  275                 if (device_detach(fwdev->sbp) != 0)     \
  276                         return;                         \
  277         } while (/*CONSTCOND*/0)
  278 #define FIREWIRE_CHILDREN_FOREACH_FUNC(func, fdc)                             \
  279         do {                                                                  \
  280                 device_t *devlistp;                                           \
  281                 int i, devcnt;                                                \
  282                                                                               \
  283                 if (device_get_children(fc->bdev, &devlistp, &devcnt) == 0) { \
  284                         for( i = 0 ; i < devcnt ; i++)                        \
  285                                 if (device_get_state(devlistp[i]) >=          \
  286                                     DS_ATTACHED)  {                           \
  287                                         (fdc) = device_get_softc(devlistp[i]);\
  288                                         if ((fdc)->func != NULL)              \
  289                                                 (fdc)->func((fdc));           \
  290                                 }                                             \
  291                         free(devlistp, M_TEMP);                               \
  292                 }                                                             \
  293         } while (/*CONSTCOND*/0)
  294 
  295 /*
  296  * sbp macro for FreeBSD
  297  */
  298 #define SBP_ATTACH_START                        \
  299         struct cam_devq *devq;                  \
  300                                                 \
  301         bzero(sbp, sizeof(struct sbp_softc));   \
  302         sbp->fd.dev = dev
  303 #define SBP_SCSIBUS_ATTACH                                                  \
  304         do {                                                                \
  305                 sbp->sim = cam_sim_alloc(sbp_action, sbp_poll, "sbp", sbp,  \
  306                                  device_get_unit(dev),                      \
  307                                  /*untagged*/ 1,                            \
  308                                  /*tagged*/ SBP_QUEUE_LEN - 1,              \
  309                                  devq);                                     \
  310                                                                             \
  311                 if (sbp->sim == NULL) {                                     \
  312                         cam_simq_free(devq);                                \
  313                         return ENXIO;                                       \
  314                 }                                                           \
  315                                                                             \
  316                 if (xpt_bus_register(sbp->sim, /*bus*/0) != CAM_SUCCESS)    \
  317                         goto fail;                                          \
  318                                                                             \
  319                 if (xpt_create_path(                                        \
  320                     &sbp->path, xpt_periph, cam_sim_path(sbp->sim),         \
  321                     CAM_TARGET_WILDCARD, CAM_LUN_WILDCARD) != CAM_REQ_CMP) {\
  322                         xpt_bus_deregister(cam_sim_path(sbp->sim));         \
  323                         goto fail;                                          \
  324                 }                                                           \
  325                 xpt_async(AC_BUS_RESET, sbp->path, /*arg*/ NULL);           \
  326         } while (/*CONSTCOND*/0)
  327 #define SBP_DEVICE(d)           ((d)->path)
  328 #define SBP_DEVICE_FREEZE(d, x) xpt_freeze_devq((d)->path, (x))
  329 #define SBP_DEVICE_THAW(d, x)   xpt_release_devq((d)->path, (x), TRUE)
  330 #define SBP_BUS_FREEZE(b)                                       \
  331         do {                                                    \
  332                 if (((b)->sim->flags & SIMQ_FREEZED) == 0) {    \
  333                         xpt_freeze_simq((b)->sim, /*count*/1);  \
  334                         (b)->sim->flags |= SIMQ_FREEZED;        \
  335                 }                                               \
  336         } while (/*CONSTCOND*/0)
  337 #define SBP_BUS_THAW(b)                                         \
  338         do {                                                    \
  339                 xpt_release_simq((b)->sim, /*run queue*/TRUE);  \
  340                 (b)->sim->flags &= ~SIMQ_FREEZED;               \
  341         } while (/*CONSTCOND*/0)
  342 #define SBP_DEVICE_PREATTACH()
  343 
  344 /*
  345  * fwip macro for FreeBSD
  346  */
  347 #define FWIP_ATTACH_START                                               \
  348         int unit = device_get_unit(dev);                                \
  349         struct fw_hwaddr *hwaddr = &fwip->fw_softc.fwcom.fc_hwaddr
  350 #define FWIP_ATTACH_SETUP       bzero(fwip, sizeof(struct fwip_softc))
  351 
  352 #define FWDEV_MAKEDEV(sc)       fwdev_makedev(sc)
  353 
  354 #define FIREWIRE_IFATTACH(ifp, ha) \
  355                                 firewire_ifattach((ifp), (ha))
  356 #define FIREWIRE_IFDETACH(ifp)  firewire_ifdetach((ifp));
  357 #define FIREWIRE_BUSRESET(ifp)  firewire_busreset((ifp))
  358 #define FIREWIRE_INPUT(ifp, m, src) \
  359                                 firewire_input((ifp), (m), (src))
  360 #define FWIP_INIT(sc)           fwip_init(&(sc)->fw_softc)
  361 #define FWIP_STOP(sc)           fwip_stop((sc))
  362 #define FIREWIRE_IOCTL(ifp, cmd, data) \
  363                                 firewire_ioctl((ifp), (cmd), (data))
  364 #define IF_INITNAME(ifp, dev, unit)     \
  365         if_initname((ifp), device_get_name((dev)), (unit));
  366 #define SET_IFFUNC(ifp, start, ioctl, init, stop)       \
  367         do {                                            \
  368                 (ifp)->if_start = (start);              \
  369                 (ifp)->if_ioctl = (ioctl);              \
  370                 (ifp)->if_init = (init);                \
  371         } while (/*CONSTCOND*/0)
  372 
  373 /*
  374  * fwdev macro for FreeBSD
  375  */
  376 #define FWDEV_OPEN_START        \
  377         if (DEV_FWMEM(dev))     \
  378                 return fwmem_open(dev, flags, fmt, td)
  379 #define FWDEV_CLOSE_START       \
  380         if (DEV_FWMEM(dev))     \
  381                 return fwmem_close(dev, flags, fmt, td)
  382 #define FWDEV_READ_START        \
  383         if (DEV_FWMEM(dev))     \
  384                 return physio(dev, uio, ioflag)
  385 #define FWDEV_WRITE_START       \
  386         if (DEV_FWMEM(dev))     \
  387                 return physio(dev, uio, ioflag)
  388 #define FWDEV_IOCTL_START       \
  389         if (DEV_FWMEM(dev))     \
  390                 return fwmem_ioctl(dev, cmd, data, flag, td)
  391 #define FWDEV_IOCTL_REDIRECT    fc->ioctl (dev, cmd, data, flag, td)
  392 #define FWDEV_POLL_START        \
  393         if (DEV_FWMEM(dev))     \
  394                 return fwmem_poll(dev, events, td)
  395 #if defined(__DragonFly__) || __FreeBSD_version < 500102
  396 #define FWDEV_MMAP_START        \
  397         if (DEV_FWMEM(dev))     \
  398                 return fwmem_mmap(dev, offset, nproto)
  399 #else
  400 #define FWDEV_MMAP_START        \
  401         if (DEV_FWMEM(dev))     \
  402                 return fwmem_mmap(dev, offset, paddr, nproto)
  403 #endif
  404 #define FWDEV_STRATEGY_START            \
  405         if (DEV_FWMEM(dev)) {           \
  406                 fwmem_strategy(bp);     \
  407                 return;                 \
  408         }
  409 
  410 #define XS_REQ_INVALID          CAM_REQ_INVALID
  411 #define XS_SCSI_BUS_RESET       CAM_SCSI_BUS_RESET
  412 #define XS_BDR_SENT             CAM_BDR_SENT
  413 #define XS_DEV_NOT_THERE        CAM_DEV_NOT_THERE
  414 #define XS_CMD_TIMEOUT          CAM_CMD_TIMEOUT
  415 #define XS_REQUEUE_REQ          CAM_REQUEUE_REQ
  416 #define XS_REQ_CMP              CAM_REQ_CMP
  417 #define XS_REQ_CMP_ERR          CAM_REQ_CMP_ERR
  418 #define XS_UA_ABORT             CAM_UA_ABORT
  419 #define XS_SENSE                (CAM_SCSI_STATUS_ERROR | CAM_AUTOSNS_VALID)
  420 
  421 typedef union ccb sbp_scsi_xfer;
  422 typedef struct scsi_inquiry_data sbp_scsi_inquiry_data;
  423 
  424 #define SCSI_XFER_TARGET(x)     ((x)->ccb_h.target_id)
  425 #define SCSI_XFER_LUN(x)        ((x)->ccb_h.target_lun)
  426 #define SCSI_XFER_ERROR(x)      ((x)->ccb_h.status)
  427 #define SCSI_XFER_DIR(x)        ((x)->ccb_h.flags & CAM_DIR_MASK)
  428 #define     SCSI_XFER_DATA_IN   CAM_DIR_IN
  429 #define SCSI_XFER_CALLOUT(x)    ((x)->ccb_h.timeout_ch)
  430 #define SCSI_XFER_TIMEOUT(x)    ((x)->ccb_h.timeout)
  431 #define SCSI_XFER_OPECODE(x)    ((x)->csio.cdb_io.cdb_bytes[0])
  432 #define SCSI_XFER_STATUS(x)     ((x)->csio.scsi_status)
  433 #define SCSI_XFER_EVPD(x)       ((x)->csio.cdb_io.cdb_bytes[1] & SI_EVPD)
  434 #define SCSI_XFER_CMDLEN(x)     ((x)->csio.cdb_len)
  435 #define SCSI_XFER_CMD(x)                        \
  436         (((x)->csio.ccb_h.flags & CAM_CDB_POINTER) ?\
  437             (void *)(x)->csio.cdb_io.cdb_ptr : \
  438             (void *)&(x)->csio.cdb_io.cdb_bytes)
  439 #define SCSI_XFER_DATALEN(x)    ((x)->csio.dxfer_len)
  440 #define SCSI_XFER_DATA(x)       ((x)->csio.data_ptr)
  441 #define SCSI_XFER_SENSELEN(x)   ((x)->csio.sense_len)
  442 #define SCSI_SENSE_DATA(x)      (&(x)->csio.sense_data)
  443 #define SCSI_INQUIRY_DATA(x)    ((x)->csio.data_ptr)
  444 #define SCSI_XFER_FUNCCODE(x)   ((x)->ccb_h.func_code)
  445 #define SCSI_XFER_10BCMD_DUMP(x) \
  446         ((x)->csio.cdb_io.cdb_bytes[0]),        \
  447         ((x)->csio.cdb_io.cdb_bytes[1]),        \
  448         ((x)->csio.cdb_io.cdb_bytes[2]),        \
  449         ((x)->csio.cdb_io.cdb_bytes[3]),        \
  450         ((x)->csio.cdb_io.cdb_bytes[4]),        \
  451         ((x)->csio.cdb_io.cdb_bytes[5]),        \
  452         ((x)->csio.cdb_io.cdb_bytes[6]),        \
  453         ((x)->csio.cdb_io.cdb_bytes[7]),        \
  454         ((x)->csio.cdb_io.cdb_bytes[8]),        \
  455         ((x)->csio.cdb_io.cdb_bytes[9])
  456 #define SCSI_XFER_REQUEST_COMPLETE(x)
  457 #define SCSI_TRANSFER_DONE(x)   xpt_done((x))
  458 #ifdef SID_TYPE
  459 #undef SID_TYPE
  460 #define SID_TYPE 0x1f
  461 #endif
  462 
  463 #define NOT_LUN_WILDCARD(l)     ((l) != CAM_LUN_WILDCARD)
  464 #define CAM_XFER_FLAGS(x)       ((x)->csio.ccb_h.flags)
  465 
  466 #define mstohz(ms) \
  467         (__predict_false((ms) >= 0x20000) ? \
  468             (((ms) + 0u) / 1000u) * hz : \
  469             (((ms) + 0u) * hz) / 1000u)
  470 
  471 #define config_pending_incr()
  472 #define config_pending_decr()
  473 
  474 /*
  475  * bus_dma macros for FreeBSD
  476  */
  477 typedef bus_dma_tag_t fw_bus_dma_tag_t;
  478 
  479 #if defined(__FreeBSD__) && __FreeBSD_version >= 501102
  480 #define fw_bus_dma_tag_create(t,                                             \
  481             a, b, laddr, haddr, ffunc, farg, s, ns, mxss, f, lfunc, larg, tp)\
  482         bus_dma_tag_create((t), (a), (b), (laddr), (haddr),                  \
  483             (ffunc), (farg), (s), (ns), (mxss), (f), (lfunc), (larg), (tp))
  484 #else
  485 #define fw_bus_dma_tag_create(t, a, b,                                  \
  486             laddr, haddr, ffunc, farg, s, ns, mxss, f, lfunc, larg, tp) \
  487         bus_dma_tag_create((t), (a), (b), (laddr), (haddr),             \
  488             (ffunc), (farg), (s), (ns), (mxss), (f), (tp))
  489 #endif
  490 #define fw_bus_dma_tag_destroy(t) \
  491         bus_dma_tag_destroy((t))
  492 #define fw_bus_dmamap_create(t, f, mp) \
  493         bus_dmamap_create((t), 0, (mp))
  494 #define fw_bus_dmamap_destroy((t), (m)) \
  495         bus_dmamap_destroy((t), (m))
  496 #define fw_bus_dmamap_load(t, m, b, l, func, a, f) \
  497         bus_dmamap_load((t), (m), (b), (l), (func), (a), 0)
  498 #define fw_bus_dmamap_load_mbuf(t, m, b, func, a, f) \
  499         bus_dmamap_load((t), (m), (b), (func), (a), 0)
  500 #define fw_bus_dmamap_unload(t, m) \
  501         bus_dmamap_unload((t), (m))
  502 #if __FreeBSD_version < 500000
  503 #define fw_bus_dmamap_sync(t, m, op)                                    \
  504         do {                                                            \
  505                 switch ((op)) {                                         \
  506                 (BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE):           \
  507                         bus_dmamap_sync((t), (m), BUS_DMASYNC_PREWRITE);\
  508                         bus_dmamap_sync((t), (m), BUS_DMASYNC_PREREAD); \
  509                         break;                                          \
  510                 (BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE):         \
  511                         /* BUS_DMASYNC_POSTWRITE is probably a no-op. */\
  512                         bus_dmamap_sync((t), (m), BUS_DMASYNC_POSTREAD);\
  513                         break;                                          \
  514                 default:                                                \
  515                         bus_dmamap_sync((t), (m), (op));                \
  516                 }                                                       \
  517         } while (/*CONSTCOND*/0)
  518 #else
  519 #define fw_bus_dmamap_sync(t, m, op) \
  520         bus_dmamap_sync((t), (m), (op))
  521 #endif
  522 #define fw_bus_dmamem_alloc(t, vp, f, mp) \
  523         bus_dmamem_alloc((t), (vp), (f), (mp))
  524 #define fw_bus_dmamem_free(t, v, m) \
  525         bus_dmamem_free((t), (v), (m))
  526 
  527 #define splfw()         splimp()
  528 #define splfwnet()      splimp()
  529 #define splfwsbp()      splcam()
  530 
  531 
  532 #elif defined(__NetBSD__)
  533 #define OS_STR                  "NetBSD"
  534 #define OS_VER                  __NetBSD_Version__
  535 #define OS_VER_STR              "NetBSD-2"
  536 #define PROJECT_STR             "NetBSD Project"
  537 
  538 #define SSD_CURRENT_ERROR       0x70
  539 #define SSD_DEFERRED_ERROR      0x71
  540 
  541 #define T_RBC                           T_SIMPLE_DIRECT
  542 
  543 #define SCSI_STATUS_CHECK_COND          SCSI_CHECK
  544 #define SCSI_STATUS_BUSY                SCSI_BUSY
  545 #define SCSI_STATUS_CMD_TERMINATED      SCSI_TERMINATED
  546 
  547 #define GIANT_REQUIRED
  548 #define IFF_NEEDSGIANT  0
  549 
  550 #define MTAG_FIREWIRE                   1394
  551 #define MTAG_FIREWIRE_HWADDR            0
  552 #define MTAG_FIREWIRE_SENDER_EUID       1
  553 
  554 #define BUS_SPACE_MAXSIZE_32BIT         0xFFFFFFFF
  555 
  556 #define DFLTPHYS                        (64 * 1024)     /* fake */
  557 
  558 #define dev2unit        minor
  559 #define unit2minor(x)   (((x) & 0xff) | (((x) << 12) & ~0xfffff)) /* XXX */
  560 
  561 typedef struct lwp fw_proc;
  562 typedef struct proc fw_thread;
  563 #include <sys/select.h>
  564 
  565 #define CALLOUT_INIT(x) callout_init(x)
  566 #define DEV_T dev_t
  567 #define FW_LOCK
  568 #define FW_UNLOCK
  569 #define THREAD_CREATE(f, sc, p, name, arg) \
  570      kthread_create1(f, (void *)sc, p, name, arg)
  571 #define THREAD_EXIT(x)  kthread_exit(x)
  572 #define fw_kthread_create(func, arg) \
  573                                 kthread_create((func), (arg))
  574 
  575 struct fwbus_attach_args {
  576         const char *name;
  577 };
  578 
  579 
  580 /*
  581  * fw attach macro for NetBSD
  582  */
  583 #define FW_ATTACH(dname)        \
  584         void                    \
  585         __CONCAT(dname,attach)  \
  586             (struct device *parent, struct device *self, void *aux)
  587 #define FW_ATTACH_START(dname, sc, fwa)                                 \
  588         struct __CONCAT(dname,_softc) *sc =                             \
  589             (struct __CONCAT(dname,_softc) *)self;                      \
  590         __attribute__((__unused__))struct fw_attach_args *fwa =         \
  591             (struct fw_attach_args *)aux
  592 #define FW_ATTACH_RETURN(r)     return
  593 
  594 /*
  595  * fw detach macro for NetBSD
  596  */
  597 #define FW_DETACH(dname)        \
  598         int                     \
  599         __CONCAT(dname,detach)(struct device *self, int flags)
  600 #define FW_DETACH_START(dname, sc)                                      \
  601         struct __CONCAT(dname,_softc) *sc =                             \
  602             (struct __CONCAT(dname,_softc) *)self
  603 
  604 /*
  605  * fw intr macro for NetBSD
  606  */
  607 #define FW_INTR(fwohci) \
  608         int             \
  609         fwohci_intr(void *arg)
  610 #define FW_INTR_RETURN(r)       return (r)
  611 
  612 /*
  613  * fw open macro for NetBSD
  614  */
  615 #define FW_OPEN(dname)  \
  616         int             \
  617         __CONCAT(dname,_open)(dev_t _dev, int flags, int fmt,  \
  618         fw_proc *td)
  619 #define FW_OPEN_START                                                   \
  620         struct firewire_softc *sc, *dev;                                \
  621                                                                         \
  622         sc = dev = device_lookup(&ieee1394if_cd, DEV2UNIT(_dev));       \
  623         if (dev == NULL)                                                \
  624                 return ENXIO
  625 
  626 /*
  627  * fw close macro for NetBSD
  628  */
  629 #define FW_CLOSE(dname)         \
  630         int                     \
  631         __CONCAT(dname,_close)(dev_t _dev, int flags, \
  632         int fmt, fw_proc *td)
  633 #define FW_CLOSE_START                                                    \
  634         int unit = DEV2UNIT(_dev);                                        \
  635         struct firewire_softc *dev = device_lookup(&ieee1394if_cd, unit); \
  636                                                                           \
  637         if (dev == NULL)                                                  \
  638                 return ENXIO
  639 
  640 /*
  641  * fw read macro for NetBSD
  642  */
  643 #define FW_READ(dname)  \
  644         int             \
  645         __CONCAT(dname,_read)(dev_t _dev, struct uio *uio, int ioflag) 
  646 #define FW_READ_START                                   \
  647         int unit = DEV2UNIT(_dev);                      \
  648         struct firewire_softc *dev;                     \
  649                                                         \
  650         dev = device_lookup(&ieee1394if_cd, unit);      \
  651         if (dev == NULL)                                \
  652                 return ENXIO
  653 
  654 /*
  655  * fw write macro for NetBSD
  656  */
  657 #define FW_WRITE(dname) \
  658         int             \
  659         __CONCAT(dname,_write)(dev_t _dev, struct uio *uio, int ioflag)
  660 #define FW_WRITE_START                                  \
  661         int unit = DEV2UNIT(_dev);                      \
  662         struct firewire_softc *dev;                     \
  663                                                         \
  664         dev = device_lookup(&ieee1394if_cd, unit);      \
  665         if (dev == NULL)                                \
  666                 return ENXIO
  667 
  668 /*
  669  * fw ioctl macro for NetBSD
  670  */
  671 #define FW_IOCTL(dname)                                 \
  672         int                                             \
  673         __CONCAT(dname,_ioctl)                          \
  674             (dev_t _dev, u_long cmd, caddr_t data,      \
  675             int flag, fw_proc *td)
  676 #define FW_IOCTL_START                                  \
  677         int unit = DEV2UNIT(_dev);                      \
  678         struct firewire_softc *sc, *dev;                \
  679                                                         \
  680         sc = dev = device_lookup(&ieee1394if_cd, unit); \
  681         if (dev == NULL)                                \
  682                 return ENXIO
  683 
  684 /*
  685  * fw poll macro for NetBSD
  686  */
  687 #define FW_POLL(dname)  \
  688         int             \
  689         __CONCAT(dname,_poll)(dev_t _dev, int events, \
  690         fw_proc *td)
  691 #define FW_POLL_START                                   \
  692         int unit = DEV2UNIT(_dev);                      \
  693         struct firewire_softc *dev;                     \
  694                                                         \
  695         dev = device_lookup(&ieee1394if_cd, unit);      \
  696         if (dev == NULL)                                \
  697                 return ENXIO
  698 
  699 /*
  700  * fw mmap macro for NetBSD
  701  */
  702 #define FW_MMAP(dname)  \
  703         paddr_t         \
  704         __CONCAT(dname,_mmap)(dev_t _dev, off_t offset, \
  705         int nproto)
  706 #define FW_MMAP_START                                   \
  707         int unit = DEV2UNIT(_dev);                      \
  708         struct firewire_softc *dev;                     \
  709                                                         \
  710         dev = device_lookup(&ieee1394if_cd, unit);      \
  711         if (dev == NULL)                                \
  712                 return ENXIO
  713 
  714 /*
  715  * fw strategy macro for NetBSD
  716  */
  717 #define FW_STRATEGY_START                               \
  718         dev_t _dev = bp->bio_dev;                       \
  719         int unit = DEV2UNIT(_dev);                      \
  720         struct firewire_softc *sc, *dev;                \
  721                                                         \
  722         sc = dev = device_lookup(&ieee1394if_cd, unit); \
  723         if (dev == NULL)                                \
  724                 return
  725 
  726 /*
  727  * if macro for NetBSD
  728  */
  729 #define IF_STOP(dname)  \
  730         void            \
  731         __CONCAT(dname,_stop)(struct ifnet *ifp, int disable)
  732 #define IF_STOP_START(dname, ifp, sc)           \
  733         struct __CONCAT(dname,_softc) *sc =     \
  734             ((struct fwip_eth_softc *)(ifp)->if_softc)->fwip
  735 #define IF_DETACH_START(dname, sc)              \
  736         struct __CONCAT(dname,_softc) *sc =     \
  737             (struct __CONCAT(dname,_softc) *)self
  738 #define IF_INIT(dname)  \
  739         int             \
  740         __CONCAT(dname,_init)(struct ifnet *ifp)
  741 #define IF_INIT_START(dname, sc, ifp)   \
  742         struct __CONCAT(dname,_softc) *sc =     \
  743             ((struct fwip_eth_softc *)ifp->if_softc)->fwip
  744 #define IF_INIT_RETURN(r)       return (r)
  745 #define IF_IOCTL_START(dname, sc)               \
  746         struct __CONCAT(dname,_softc) *sc =     \
  747             ((struct fwip_eth_softc *)ifp->if_softc)->fwip
  748 
  749 /*
  750  * fwohci macro for NetBSD
  751  */
  752 #define FWOHCI_INIT_END                                                       \
  753         do {                                                                  \
  754                 struct fwbus_attach_args faa;                                 \
  755                 faa.name = "ieee1394if";                                      \
  756                 sc->sc_shutdownhook = shutdownhook_establish(fwohci_stop, sc);\
  757                 sc->sc_powerhook = powerhook_establish(sc->fc._dev.dv_xname,  \
  758                     fwohci_power, sc);                                        \
  759                 sc->fc.bdev = config_found(sc->fc.dev, &faa, fwohci_print);   \
  760         } while (/*CONSTCOND*/0)
  761 #define FWOHCI_DETACH() \
  762         int             \
  763         fwohci_detach(struct fwohci_softc *sc, int flags)
  764 #define FWOHCI_DETACH_START             \
  765         if (sc->fc.bdev != NULL)        \
  766                 config_detach(sc->fc.bdev, flags) 
  767 #define FWOHCI_DETACH_END                                       \
  768         if (sc->sc_powerhook != NULL)                           \
  769                 powerhook_disestablish(sc->sc_powerhook);       \
  770         if (sc->sc_shutdownhook != NULL)                        \
  771                 shutdownhook_disestablish(sc->sc_shutdownhook)
  772 #define FWOHCI_STOP()   \
  773         void    \
  774         fwohci_stop(void *arg)
  775 #define FWOHCI_STOP_START       struct fwohci_softc *sc = arg
  776 #define FWOHCI_STOP_RETURN(r)   return
  777 
  778 /*
  779  * firewire macro for NetBSD
  780  */
  781 #define FIREWIRE_ATTACH_START                                           \
  782         struct firewire_comm *fc = (struct firewire_comm *)parent;      \
  783                                                                         \
  784         aprint_normal(": IEEE1394 bus\n");                              \
  785                                                                         \
  786         fc->bdev = (struct device *)sc;                                 \
  787         sc->dev = &sc->_dev;                                            \
  788         SLIST_INIT(&sc->devlist)
  789 #define FWDEV_DESTROYDEV(sc)
  790 #define FIREWIRE_GENERIC_ATTACH                                             \
  791         do {                                                                \
  792                 struct fw_attach_args faa;                                  \
  793                 struct firewire_dev_list *devlist, *elm;                    \
  794                                                                             \
  795                 devlist = malloc(                                           \
  796                     sizeof (struct firewire_dev_list), M_DEVBUF, M_NOWAIT); \
  797                 if (devlist == NULL)                                        \
  798                         break;                                              \
  799                                                                             \
  800                 faa.name = "fwip";                                          \
  801                 faa.fc = fc;                                                \
  802                 faa.fwdev = NULL;                                           \
  803                 devlist->dev = config_found(sc->dev, &faa, firewire_print); \
  804                 if (devlist->dev == NULL) {                                 \
  805                         free(devlist, M_DEVBUF);                            \
  806                         break;                                              \
  807                 }                                                           \
  808                                                                             \
  809                 if (SLIST_EMPTY(&sc->devlist))                              \
  810                         SLIST_INSERT_HEAD(&sc->devlist, devlist, link);     \
  811                 else {                                                      \
  812                         for (elm = SLIST_FIRST(&sc->devlist);               \
  813                             SLIST_NEXT(elm, link) != NULL;                  \
  814                             elm = SLIST_NEXT(elm, link));                   \
  815                         SLIST_INSERT_AFTER(elm, devlist, link);             \
  816                 }                                                           \
  817         } while (/*CONSTCOND*/0)
  818 #define FIREWIRE_GENERIC_DETACH                                               \
  819         do {                                                                  \
  820                 struct firewire_dev_list *devlist;                            \
  821                 int err;                                                      \
  822                                                                               \
  823                 while ((devlist = SLIST_FIRST(&sc->devlist)) != NULL) {       \
  824                         if ((err = config_detach(devlist->dev, flags)) != 0)  \
  825                                 return err;                                   \
  826                         SLIST_REMOVE(                                         \
  827                             &sc->devlist, devlist, firewire_dev_list, link);  \
  828                         free(devlist, M_DEVBUF);                              \
  829                 }                                                             \
  830         } while (/*CONSTCOND*/0)
  831 #define FIREWIRE_SBP_ATTACH                                                   \
  832         do {                                                                  \
  833                 struct firewire_softc *sc = (struct firewire_softc *)fc->bdev;\
  834                 struct firewire_dev_list *devlist, *elm;                      \
  835                 int locs[IEEE1394IFCF_NLOCS];                                 \
  836                                                                               \
  837                 devlist = malloc(                                             \
  838                     sizeof (struct firewire_dev_list), M_DEVBUF, M_NOWAIT);   \
  839                 if (devlist == NULL) {                                        \
  840                         printf("memory allocation failed\n");                 \
  841                         break;                                                \
  842                 }                                                             \
  843                                                                               \
  844                 locs[IEEE1394IFCF_EUIHI] = fwdev->eui.hi;                     \
  845                 locs[IEEE1394IFCF_EUILO] = fwdev->eui.lo;                     \
  846                                                                               \
  847                 fwa.fwdev = fwdev;                                            \
  848                 fwdev->sbp = config_found_sm_loc(sc->dev, "ieee1394if",       \
  849                     locs, &fwa, firewire_print, config_stdsubmatch);          \
  850                 if (fwdev->sbp == NULL) {                                     \
  851                         free(devlist, M_DEVBUF);                              \
  852                         break;                                                \
  853                 }                                                             \
  854                                                                               \
  855                 devlist->fwdev = fwdev;                                       \
  856                 devlist->dev = fwdev->sbp;                                    \
  857                                                                               \
  858                 if (SLIST_EMPTY(&sc->devlist))                                \
  859                         SLIST_INSERT_HEAD(&sc->devlist, devlist, link);       \
  860                 else {                                                        \
  861                         for (elm = SLIST_FIRST(&sc->devlist);                 \
  862                             SLIST_NEXT(elm, link) != NULL;                    \
  863                             elm = SLIST_NEXT(elm, link));                     \
  864                         SLIST_INSERT_AFTER(elm, devlist, link);               \
  865                 }                                                             \
  866         } while (/*CONSTCOND*/0)
  867 #define FIREWIRE_SBP_DETACH                                                   \
  868         do {                                                                  \
  869                 struct firewire_softc *sc = (struct firewire_softc *)fc->bdev;\
  870                 struct firewire_dev_list *devlist;                            \
  871                                                                               \
  872                 SLIST_FOREACH(devlist, &sc->devlist, link) {                  \
  873                         if (devlist->fwdev != fwdev)                          \
  874                                 continue;                                     \
  875                         SLIST_REMOVE(                                         \
  876                             &sc->devlist, devlist, firewire_dev_list, link);  \
  877                         free(devlist, M_DEVBUF);                              \
  878                                                                               \
  879                         if (config_detach(fwdev->sbp, DETACH_FORCE) != 0)     \
  880                                 return;                                       \
  881                 }                                                             \
  882         } while (/*CONSTCOND*/0)
  883 #define FIREWIRE_CHILDREN_FOREACH_FUNC(func, fdc)                             \
  884         do {                                                                  \
  885                 struct firewire_dev_list *devlist;                            \
  886                 struct firewire_softc *sc = (struct firewire_softc *)fc->bdev;\
  887                                                                               \
  888                 if (!SLIST_EMPTY(&sc->devlist)) {                             \
  889                         SLIST_FOREACH(devlist, &sc->devlist, link) {          \
  890                                 (fdc) =                                       \
  891                                     (struct firewire_dev_comm *)devlist->dev; \
  892                                 if ((fdc)->func != NULL)                      \
  893                                         (fdc)->func((fdc));                   \
  894                         }                                                     \
  895                 }                                                             \
  896         } while (/*CONSTCOND*/0)
  897 
  898 /*
  899  * sbp macro for NetBSD
  900  */
  901 #define SBP_ATTACH_START                                        \
  902         do {                                                    \
  903                 aprint_normal(": SBP-2/SCSI over IEEE1394\n");  \
  904                                                                 \
  905                 sbp->fd.dev = &sbp->fd._dev;                    \
  906         } while (/*CONSTCOND*/0)
  907 #define SBP_SCSIBUS_ATTACH                                                  \
  908         do {                                                                \
  909                 struct scsipi_adapter *sc_adapter = &sbp->sc_adapter;       \
  910                 struct scsipi_channel *sc_channel = &sbp->sc_channel;       \
  911                 struct sbp_target *target = &sbp->target;                   \
  912                                                                             \
  913                 sc_adapter->adapt_dev = sbp->fd.dev;                        \
  914                 sc_adapter->adapt_nchannels = 1;                            \
  915                 sc_adapter->adapt_max_periph = 1;                           \
  916                 sc_adapter->adapt_request = sbp_scsipi_request;             \
  917                 sc_adapter->adapt_minphys = sbp_minphys;                    \
  918                 sc_adapter->adapt_openings = 8;                             \
  919                                         /*Start with some. Grow as needed.*/\
  920                                                                             \
  921                 sc_channel->chan_adapter = sc_adapter;                      \
  922                 sc_channel->chan_bustype = &scsi_bustype;                   \
  923                 sc_channel->chan_defquirks = PQUIRK_ONLYBIG;                \
  924                 sc_channel->chan_channel = 0;                               \
  925                 sc_channel->chan_flags =                                    \
  926                     SCSIPI_CHAN_CANGROW | SCSIPI_CHAN_NOSETTLE;             \
  927                                                                             \
  928                 /* We set nluns 0 now */                                    \
  929                 sc_channel->chan_ntargets = 1;                              \
  930                 sc_channel->chan_nluns = target->num_lun;                   \
  931                 sc_channel->chan_id = 1;                                    \
  932                                                                             \
  933                 if ((sbp->sc_bus =                                          \
  934                     config_found(sbp->fd.dev, sc_channel, scsiprint)) ==    \
  935                     NULL) {                                                 \
  936                         device_printf(sbp->fd.dev, "attach failed\n");      \
  937                         return;                                             \
  938                 }                                                           \
  939         } while (/*CONSTCOND*/0)
  940 #define SBP_DEVICE(d)           ((d)->periph)
  941 #define SBP_DEVICE_FREEZE(d, x) scsipi_periph_freeze((d)->periph, (x));
  942 #define SBP_DEVICE_THAW(d, x)                                           \
  943         do {                                                            \
  944                 if ((d)->periph)                                        \
  945                         scsipi_periph_thaw((d)->periph, (x));           \
  946                 /* XXXX */                                              \
  947                 scsipi_channel_thaw(&(d)->target->sbp->sc_channel, 0);  \
  948         } while (/*CONSTCOND*/0)
  949 #define SBP_BUS_FREEZE(b)       scsipi_channel_freeze(&(b)->sc_channel, 1)
  950 #define SBP_BUS_THAW(b)         scsipi_channel_thaw(&(b)->sc_channel, 1)
  951 #define SBP_DEVICE_PREATTACH()  \
  952         if (!sbp->proc)         \
  953                 fw_kthread_create(fw_kthread_create0, sbp)
  954 
  955 /*
  956  * fwip macro for NetBSD
  957  */
  958 #define FWIP_ATTACH_START                                               \
  959         device_t dev = &fwip->fd._dev;                                  \
  960         struct fw_hwaddr *hwaddr =                                      \
  961             (struct fw_hwaddr *)&fwip->fw_softc.fwcom.ic_hwaddr
  962 #define FWIP_ATTACH_SETUP       aprint_normal(": IP over IEEE1394\n")
  963 
  964 #define FWDEV_MAKEDEV(sc)
  965 #define FIREWIRE_IFATTACH(ifp, ha)                                             \
  966         do {                                                                   \
  967                 if_attach((ifp));                                              \
  968                 ieee1394_ifattach((ifp), (const struct ieee1394_hwaddr *)(ha));\
  969         } while (/*CONSTCOND*/0)
  970 #define FIREWIRE_IFDETACH(ifp)                  \
  971         do {                                    \
  972                 ieee1394_ifdetach((ifp));       \
  973                 if_detach((ifp));               \
  974         } while (/*CONSTCOND*/0)
  975 #define FIREWIRE_BUSRESET(ifp)  ieee1394_drain((ifp))
  976 #define FIREWIRE_INPUT(ifp, m, src) \
  977                                 ieee1394_input((ifp), (m), (src))
  978 #define FWIP_INIT(sc)           fwip_init(&(sc)->fwip_if)
  979 #define FWIP_STOP(sc)           fwip_stop(&(sc)->fwip_if, 1)
  980 #define FIREWIRE_IOCTL(ifp, cmd, data) \
  981                                 ieee1394_ioctl((ifp), (cmd), (data))
  982 #define IF_INITNAME(ifp, dev, unit)     \
  983         strcpy((ifp)->if_xname, (dev)->dv_xname);
  984 #define SET_IFFUNC(ifp, start, ioctl, init, stop)       \
  985         do {                                            \
  986                 (ifp)->if_start = (start);              \
  987                 (ifp)->if_ioctl = (ioctl);              \
  988                 (ifp)->if_init = (init);                \
  989                 (ifp)->if_stop = (stop);                \
  990         } while (/*CONSTCOND*/0)
  991 
  992 /*
  993  * fwdev macro for NetBSD
  994  */
  995 #define FWDEV_OPEN_START        \
  996         if (DEV_FWMEM(_dev))    \
  997                 return fwmem_open(_dev, flags, fmt, td)
  998 #define FWDEV_CLOSE_START       \
  999         if (DEV_FWMEM(_dev))    \
 1000                 return fwmem_close(_dev, flags, fmt, td)
 1001 #define FWDEV_READ_START        \
 1002         if (DEV_FWMEM(_dev))    \
 1003                 return physio(fw_strategy, NULL, _dev, ioflag, minphys, uio)
 1004 #define FWDEV_WRITE_START       \
 1005         if (DEV_FWMEM(_dev))    \
 1006                 return physio(fw_strategy, NULL, _dev, ioflag, minphys, uio)
 1007 #define FWDEV_IOCTL_START       \
 1008         if (DEV_FWMEM(_dev))    \
 1009                 return fwmem_ioctl(_dev, cmd, data, flag, td)
 1010 #define FWDEV_IOCTL_REDIRECT    fc->ioctl (_dev, cmd, data, flag, td)
 1011 #define FWDEV_POLL_START        \
 1012         if (DEV_FWMEM(_dev))    \
 1013                 return fwmem_poll(_dev, events, td)
 1014 #define FWDEV_MMAP_START        \
 1015         if (DEV_FWMEM(_dev))    \
 1016                 return fwmem_mmap(_dev, offset, nproto)
 1017 #define FWDEV_STRATEGY_START            \
 1018         if (DEV_FWMEM(_dev)) {          \
 1019                 fwmem_strategy(bp);     \
 1020                 return;                 \
 1021         }
 1022 
 1023 #define XS_REQ_INVALID          XS_DRIVER_STUFFUP
 1024 #define XS_SCSI_BUS_RESET       XS_RESET
 1025 #define XS_BDR_SENT             XS_RESET
 1026 #define XS_DEV_NOT_THERE        XS_DRIVER_STUFFUP
 1027 #define XS_CMD_TIMEOUT          XS_TIMEOUT
 1028 #define XS_REQUEUE_REQ          XS_REQUEUE
 1029 #define XS_REQ_CMP              XS_NOERROR
 1030 #define XS_REQ_CMP_ERR          XS_DRIVER_STUFFUP
 1031 #define XS_UA_ABORT             XS_DRIVER_STUFFUP
 1032 
 1033 typedef struct scsipi_xfer sbp_scsi_xfer;
 1034 typedef struct scsipi_inquiry_data sbp_scsi_inquiry_data;
 1035 
 1036 #define SCSI_XFER_TARGET(x)     ((x)->xs_periph->periph_target)
 1037 #define SCSI_XFER_LUN(x)        ((x)->xs_periph->periph_lun)
 1038 #define SCSI_XFER_ERROR(x)      ((x)->error)
 1039 #define SCSI_XFER_DIR(x) \
 1040         ((x)->xs_control & (XS_CTL_DATA_IN | XS_CTL_DATA_OUT))
 1041 #define     SCSI_XFER_DATA_IN   XS_CTL_DATA_IN
 1042 #define SCSI_XFER_CALLOUT(x)    ((x)->xs_callout)
 1043 #define SCSI_XFER_TIMEOUT(x)    ((x)->timeout)
 1044 #define SCSI_XFER_OPECODE(x)    ((x)->cmd->opcode)
 1045 #define SCSI_XFER_STATUS(x)     ((x)->xs_status)
 1046 #define SCSI_XFER_EVPD(x)       ((x)->cmd->bytes[0] & SI_EVPD)
 1047 #define     SI_EVPD             0x01
 1048 #define SCSI_XFER_CMDLEN(x)     ((x)->cmdlen)
 1049 #define SCSI_XFER_CMD(x)        ((x)->cmd)
 1050 #define SCSI_XFER_DATALEN(x)    ((x)->datalen)
 1051 #define SCSI_XFER_DATA(x)       ((x)->data)
 1052 #define SCSI_XFER_SENSELEN(x)   (0 /* XXXXX */)
 1053 #define SCSI_SENSE_DATA(x)      (&(x)->sense.scsi_sense)
 1054 #define SCSI_INQUIRY_DATA(x)    ((x)->data)
 1055 #define SCSI_XFER_FUNCCODE(x)   XPT_SCSI_IO
 1056 #define SCSI_XFER_10BCMD_DUMP(x)\
 1057         ((x)->cmd->opcode),     \
 1058         ((x)->cmd->bytes[0]),   \
 1059         ((x)->cmd->bytes[1]),   \
 1060         ((x)->cmd->bytes[2]),   \
 1061         ((x)->cmd->bytes[3]),   \
 1062         ((x)->cmd->bytes[4]),   \
 1063         ((x)->cmd->bytes[5]),   \
 1064         ((x)->cmd->bytes[6]),   \
 1065         ((x)->cmd->bytes[7]),   \
 1066         ((x)->cmd->bytes[8])
 1067 #define SCSI_XFER_REQUEST_COMPLETE(x) \
 1068         ((x)->resid = 0)
 1069 #define SCSI_TRANSFER_DONE(x)   scsipi_done((x))
 1070 
 1071 #define NOT_LUN_WILDCARD(l)     (1)
 1072 #define CAM_XFER_FLAGS(x)       (0)     /* XXX */
 1073 #define CAM_SCATTER_VALID       (0)     /* XXX */
 1074 #define CAM_DATA_PHYS           (0)     /* XXX */
 1075 #define XPT_SCSI_IO             (1)     /* XXX */
 1076 
 1077 
 1078 #define splfw()         splvm()
 1079 #define splfwnet()      splnet()
 1080 #define splfwsbp()      splbio()
 1081 #define splsoftvm()     splbio()
 1082 
 1083 #define roundup2(x, y) roundup((x), (y))
 1084 #ifndef rounddown
 1085 #define rounddown(x, y) ((x) / (y) * (y))
 1086 #endif
 1087 
 1088 #define timevalcmp(tv1, tv2, op)        timercmp((tv1), (tv2), op)
 1089 #define timevalsub(tv1, tv2)            timersub((tv1), (tv2), (tv1))
 1090 
 1091 #define device_get_nameunit(dev) (dev)->dv_xname
 1092 #define device_get_unit(dev)            device_unit((dev))
 1093 
 1094 /*
 1095  * queue macros for NetBSD
 1096  */
 1097 #define STAILQ_LAST(head, type, field) \
 1098         (STAILQ_EMPTY((head)) ? NULL : \
 1099         (struct type *) \
 1100         ((char *)(head)->stqh_last - (size_t)&((struct type *)0)->field))
 1101 
 1102 #define TASK_INIT(task, priority, func, context)
 1103 
 1104 
 1105 struct fw_hwaddr {
 1106         uint32_t                sender_unique_ID_hi;
 1107         uint32_t                sender_unique_ID_lo;
 1108         uint8_t                 sender_max_rec;
 1109         uint8_t                 sspd;
 1110         uint16_t                sender_unicast_FIFO_hi;
 1111         uint32_t                sender_unicast_FIFO_lo;
 1112 };
 1113 
 1114 
 1115 /*
 1116  * mbuf macros for NetBSD
 1117  */
 1118 #include <sys/mbuf.h>
 1119 #define M_TRYWAIT       M_WAITOK
 1120 
 1121 #define m_tag_alloc(cookie, type, len, wait) \
 1122                                 m_tag_get((type), (len), (wait))
 1123 #define m_tag_locate(m, cookie, type, t) \
 1124                                 m_tag_find((m), (type), (t))
 1125 
 1126 /*
 1127  * bus_dma macros for NetBSD
 1128  */
 1129 #include <machine/bus.h>
 1130 struct fw_bus_dma_tag {
 1131         bus_dma_tag_t tag;
 1132         bus_size_t alignment;
 1133         bus_size_t boundary;
 1134         bus_size_t size;
 1135         int nsegments;
 1136         bus_size_t maxsegsz;
 1137         int flags;
 1138 };
 1139 typedef struct fw_bus_dma_tag *fw_bus_dma_tag_t;
 1140 typedef int bus_dmasync_op_t;
 1141 typedef void bus_dmamap_callback_t(void *, bus_dma_segment_t *, int, int);
 1142 typedef void
 1143     bus_dmamap_callback2_t(void *, bus_dma_segment_t *, int, bus_size_t, int);
 1144 
 1145 #define fw_bus_dma_tag_create(                          \
 1146     p, a, b, la, ha, ffunc, farg, maxsz,                \
 1147     nseg, maxsegsz, f, lfunc, larg, dmat)               \
 1148                                                         \
 1149     _fw_bus_dma_tag_create((p), (a), (b), (la), (ha),   \
 1150         (ffunc), (farg), (maxsz), (nseg), (maxsegsz), (f), (dmat))
 1151 
 1152 static __inline int
 1153 _fw_bus_dma_tag_create(bus_dma_tag_t parent,
 1154     bus_size_t alignment, bus_size_t boundary,
 1155     bus_addr_t lowaddr, bus_addr_t highaddr,
 1156     void *filtfunc, void *filtfuncarg,
 1157     bus_size_t maxsize, int nsegments, bus_size_t maxsegsz,
 1158     int flags, fw_bus_dma_tag_t *fwdmat)
 1159 {
 1160         fw_bus_dma_tag_t tag;
 1161 
 1162         tag = malloc(sizeof (struct fw_bus_dma_tag), M_DEVBUF, M_NOWAIT);
 1163         if (tag == NULL)
 1164                 return ENOMEM;
 1165 
 1166 /* XXXX */
 1167 #define BUS_SPACE_MAXADDR_32BIT 0
 1168 #define BUS_SPACE_MAXADDR 0
 1169 
 1170         tag->tag = parent;
 1171         tag->alignment = alignment;
 1172         tag->boundary = boundary;
 1173         tag->size = maxsize;
 1174         tag->nsegments = nsegments;
 1175         tag->maxsegsz = maxsegsz;
 1176         tag->flags = flags;
 1177 
 1178         *fwdmat = tag;
 1179 
 1180         return 0;
 1181 }
 1182 #define fw_bus_dma_tag_destroy(ft) \
 1183         free(ft, M_DEVBUF)
 1184 #define fw_bus_dmamap_create(ft, f, mp)         \
 1185         bus_dmamap_create((ft)->tag, (ft)->size,\
 1186             (ft)->nsegments, (ft)->maxsegsz, (ft)->boundary, (f), (mp))
 1187 #define fw_bus_dmamap_destroy(ft, m) \
 1188         bus_dmamap_destroy((ft)->tag, (m))
 1189 static __inline int
 1190 fw_bus_dmamap_load(fw_bus_dma_tag_t ft, bus_dmamap_t m,
 1191     void *b, bus_size_t l, bus_dmamap_callback_t *func, void *a, int f)   
 1192 {
 1193         int lf = f & (BUS_DMA_WAITOK | BUS_DMA_NOWAIT | BUS_DMA_STREAMING |
 1194             BUS_DMA_READ | BUS_DMA_WRITE |
 1195             BUS_DMA_BUS1 | BUS_DMA_BUS2 | BUS_DMA_BUS3 | BUS_DMA_BUS4);
 1196         int err = bus_dmamap_load(ft->tag, m, b, l, NULL, lf);
 1197         (func)(a, m->dm_segs, m->dm_nsegs, err);
 1198         return err;
 1199 }
 1200 static __inline int
 1201 fw_bus_dmamap_load_mbuf(fw_bus_dma_tag_t ft, bus_dmamap_t m,
 1202     struct mbuf *b, bus_dmamap_callback2_t *func, void *a, int f)   
 1203 {
 1204         int lf = f & (BUS_DMA_WAITOK | BUS_DMA_NOWAIT | BUS_DMA_STREAMING |
 1205             BUS_DMA_READ | BUS_DMA_WRITE |
 1206             BUS_DMA_BUS1 | BUS_DMA_BUS2 | BUS_DMA_BUS3 | BUS_DMA_BUS4);
 1207         int err = bus_dmamap_load_mbuf(ft->tag, m, b, lf);
 1208         (func)(a, m->dm_segs, m->dm_nsegs, m->dm_mapsize, err);
 1209         return err;
 1210 }
 1211 #define fw_bus_dmamap_unload(ft, m) \
 1212         bus_dmamap_unload((ft)->tag, (m))
 1213 #define fw_bus_dmamap_sync(ft, m, op) \
 1214         bus_dmamap_sync((ft)->tag, (m), 0, (m)->dm_mapsize, (op))
 1215 static __inline int
 1216 fw_bus_dmamem_alloc(fw_bus_dma_tag_t ft, void **vp, int f, bus_dmamap_t *mp)
 1217 {
 1218         bus_dma_segment_t segs;
 1219         int nsegs, err;
 1220         int af, mf, cf;
 1221 
 1222         af = f & (BUS_DMA_WAITOK | BUS_DMA_NOWAIT | BUS_DMA_STREAMING |
 1223             BUS_DMA_BUS1 | BUS_DMA_BUS2 | BUS_DMA_BUS3 | BUS_DMA_BUS4);
 1224         err = bus_dmamem_alloc(ft->tag, ft->size,
 1225             ft->alignment, ft->boundary, &segs, ft->nsegments, &nsegs, af);
 1226         if (err) {
 1227                 printf("fw_bus_dmamem_alloc: failed(1)\n");
 1228                 return err;
 1229         }
 1230 
 1231         mf = f & (BUS_DMA_WAITOK | BUS_DMA_NOWAIT |
 1232             BUS_DMA_BUS1 | BUS_DMA_BUS2 | BUS_DMA_BUS3 | BUS_DMA_BUS4 |
 1233             BUS_DMA_COHERENT | BUS_DMA_NOCACHE);
 1234         err = bus_dmamem_map(ft->tag,
 1235             &segs, nsegs, ft->size, (caddr_t *)vp, mf);
 1236         if (err) {
 1237                 printf("fw_bus_dmamem_alloc: failed(2)\n");
 1238                 bus_dmamem_free(ft->tag, &segs, nsegs);
 1239                 return err;
 1240         }
 1241 
 1242         if (*mp != NULL)
 1243                 return err;
 1244 
 1245         cf = f & (BUS_DMA_WAITOK | BUS_DMA_NOWAIT | BUS_DMA_ALLOCNOW |
 1246             BUS_DMA_BUS1 | BUS_DMA_BUS2 | BUS_DMA_BUS3 | BUS_DMA_BUS4);
 1247         err = bus_dmamap_create(ft->tag,
 1248             ft->size, nsegs, ft->maxsegsz, ft->boundary, cf, mp);
 1249         if (err) {
 1250                 printf("fw_bus_dmamem_alloc: failed(3)\n");
 1251                 bus_dmamem_unmap(ft->tag, (caddr_t)*vp, ft->size);
 1252                 bus_dmamem_free(ft->tag, &segs, nsegs);\
 1253         }
 1254 
 1255         return err;
 1256 }
 1257 #define fw_bus_dmamem_free(ft, v, m)                                    \
 1258         do {                                                            \
 1259                 bus_dmamem_unmap((ft)->tag, (v), (ft)->size);           \
 1260                 bus_dmamem_free((ft)->tag, (m)->dm_segs, (m)->dm_nsegs);\
 1261                 bus_dmamap_destroy((ft)->tag, (m));                     \
 1262         } while (/*CONSTCOND*/0)
 1263 
 1264 
 1265 #define device_printf(dev, fmt, ...)                    \
 1266         do {                                            \
 1267                 aprint_normal("%s: ", (dev)->dv_xname); \
 1268                 aprint_normal((fmt) ,##__VA_ARGS__);    \
 1269         } while (/*CONSTCOND*/0)
 1270 
 1271 
 1272 #define CTR0(m, format)
 1273 #define CTR1(m, format, p1)
 1274 
 1275 
 1276 #define OHCI_CSR_WRITE(sc, reg, val) \
 1277         bus_space_write_4((sc)->bst, (sc)->bsh, reg, val)
 1278 
 1279 /*
 1280  * XXXXXXXXXXX
 1281  */
 1282 #define atomic_set_int(P, V) (*(u_int*)(P) |= (V))
 1283 
 1284 #endif
 1285 #endif
 1286 #if defined(__NetBSD__)
 1287 #define vm_offset_t caddr_t
 1288 #endif
 1289 #endif

Cache object: 6eae1badef915593b6c955426346e134


[ 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.