Print this page
    
5084 struct ecppunit's e_busy is multi-value, can't be a boolean_t
    
      
        | Split | Close | 
      | Expand all | 
      | Collapse all | 
    
    
          --- old/usr/src/uts/common/sys/ecppvar.h
          +++ new/usr/src/uts/common/sys/ecppvar.h
   1    1  /*
   2    2   * CDDL HEADER START
   3    3   *
   4    4   * The contents of this file are subject to the terms of the
   5    5   * Common Development and Distribution License, Version 1.0 only
   6    6   * (the "License").  You may not use this file except in compliance
   7    7   * with the License.
   8    8   *
   9    9   * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
  10   10   * or http://www.opensolaris.org/os/licensing.
  11   11   * See the License for the specific language governing permissions
  12   12   * and limitations under the License.
  13   13   *
  14   14   * When distributing Covered Code, include this CDDL HEADER in each
  15   15   * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
  16   16   * If applicable, add the following below this CDDL HEADER, with the
  17   17   * fields enclosed by brackets "[]" replaced with your own identifying
  18   18   * information: Portions Copyright [yyyy] [name of copyright owner]
  19   19   *
  
    | ↓ open down ↓ | 19 lines elided | ↑ open up ↑ | 
  20   20   * CDDL HEADER END
  21   21   */
  22   22  /*
  23   23   * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
  24   24   * Use is subject to license terms.
  25   25   */
  26   26  
  27   27  #ifndef _SYS_ECPPVAR_H
  28   28  #define _SYS_ECPPVAR_H
  29   29  
  30      -#pragma ident   "%Z%%M% %I%     %E% SMI"
  31      -
  32   30  #include <sys/note.h>
  33   31  
  34   32  #ifdef  __cplusplus
  35   33  extern "C" {
  36   34  #endif
  37   35  
  38   36  struct ecppunit;
  39   37  
  40   38  /*
  41   39   * Hardware-abstraction structure
  42   40   */
  43   41  struct ecpp_hw {
  44   42          int     (*map_regs)(struct ecppunit *);         /* map registers */
  45   43          void    (*unmap_regs)(struct ecppunit *);       /* unmap registers */
  46   44          int     (*config_chip)(struct ecppunit *);      /* configure SuperIO */
  47   45          void    (*config_mode)(struct ecppunit *);      /* config new mode */
  48   46          void    (*mask_intr)(struct ecppunit *);        /* mask interrupts */
  49   47          void    (*unmask_intr)(struct ecppunit *);      /* unmask interrupts */
  50   48          int     (*dma_start)(struct ecppunit *);        /* start DMA transfer */
  51   49          int     (*dma_stop)(struct ecppunit *, size_t *); /* stop DMA xfer */
  52   50          size_t  (*dma_getcnt)(struct ecppunit *);       /* get DMA counter */
  53   51          ddi_dma_attr_t  *attr;                          /* DMA attributes */
  54   52  };
  55   53  
  56   54  #define ECPP_MAP_REGS(pp)               (pp)->hw->map_regs(pp)
  57   55  #define ECPP_UNMAP_REGS(pp)             (pp)->hw->unmap_regs(pp)
  58   56  #define ECPP_CONFIG_CHIP(pp)            (pp)->hw->config_chip(pp)
  59   57  #define ECPP_CONFIG_MODE(pp)            (pp)->hw->config_mode(pp)
  60   58  #define ECPP_MASK_INTR(pp)              (pp)->hw->mask_intr(pp)
  61   59  #define ECPP_UNMASK_INTR(pp)            (pp)->hw->unmask_intr(pp)
  62   60  #define ECPP_DMA_START(pp)              (pp)->hw->dma_start(pp)
  63   61  #define ECPP_DMA_STOP(pp, cnt)          (pp)->hw->dma_stop(pp, cnt)
  64   62  #define ECPP_DMA_GETCNT(pp)             (pp)->hw->dma_getcnt(pp)
  65   63  
  66   64  /* NSC 87332/97317 and EBus DMAC */
  67   65  struct ecpp_ebus {
  68   66          struct config_reg       *c_reg;         /* configuration registers */
  69   67          ddi_acc_handle_t        c_handle;       /* handle for conf regs */
  70   68          struct cheerio_dma_reg  *dmac;          /* ebus dmac registers */
  71   69          ddi_acc_handle_t        d_handle;       /* handle for dmac registers */
  72   70          struct config2_reg      *c2_reg;        /* 97317 2nd level conf regs */
  73   71          ddi_acc_handle_t        c2_handle;      /* handle for c2_reg */
  74   72  };
  75   73  
  76   74  /* Southbridge SuperIO and 8237 DMAC */
  77   75  struct ecpp_m1553 {
  78   76          struct isaspace         *isa_space;     /* all of isa space */
  79   77          ddi_acc_handle_t        d_handle;       /* handle for isa space */
  80   78          uint8_t                 chn;            /* 8237 dma channel */
  81   79          int                     isadma_entered; /* Southbridge DMA workaround */
  82   80  };
  83   81  
  84   82  #if defined(__x86)
  85   83  struct ecpp_x86 {
  86   84          uint8_t                 chn;
  87   85  };
  88   86  #endif
  
    | ↓ open down ↓ | 47 lines elided | ↑ open up ↑ | 
  89   87  
  90   88  /*
  91   89   * Hardware binding structure
  92   90   */
  93   91  struct ecpp_hw_bind {
  94   92          char            *name;          /* binding name */
  95   93          struct ecpp_hw  *hw;            /* hw description */
  96   94          char            *info;          /* info string */
  97   95  };
  98   96  
       97 +/* ecpp e_busy states */
       98 +typedef enum {
       99 +        ECPP_IDLE = 1,  /* No ongoing transfers */
      100 +        ECPP_BUSY = 2,  /* Ongoing transfers on the cable */
      101 +        ECPP_DATA = 3,  /* Not used */
      102 +        ECPP_ERR = 4,   /* Bad status in Centronics mode */
      103 +        ECPP_FLUSH = 5  /* Currently flushing the q */
      104 +} ecpp_busy_t;
      105 +
  99  106  /*
 100  107   * ecpp soft state structure
 101  108   */
 102  109  struct ecppunit {
 103  110          kmutex_t        umutex;         /* lock for this structure */
 104  111          int             instance;       /* instance number */
 105  112          dev_info_t      *dip;           /* device information */
 106  113          ddi_iblock_cookie_t ecpp_trap_cookie;   /* interrupt cookie */
 107      -        boolean_t       e_busy;         /* ecpp busy flag */
      114 +        ecpp_busy_t     e_busy;         /* ecpp busy flag */
 108  115          kcondvar_t      pport_cv;       /* cv to signal idle state */
 109  116          /*
 110  117           * common SuperIO registers
 111  118           */
 112  119          struct info_reg         *i_reg;         /* info registers */
 113  120          struct fifo_reg         *f_reg;         /* fifo register */
 114  121          ddi_acc_handle_t        i_handle;
 115  122          ddi_acc_handle_t        f_handle;
 116  123          /*
 117  124           * DMA support
 118  125           */
 119  126          ddi_dma_handle_t        dma_handle;     /* DMA handle */
 120  127          ddi_dma_cookie_t        dma_cookie;     /* current cookie */
 121  128          uint_t                  dma_cookie_count;       /* # of cookies */
 122  129          uint_t                  dma_nwin;       /* # of DMA windows */
 123  130          uint_t                  dma_curwin;     /* current window number */
 124  131          uint_t                  dma_dir;        /* transfer direction */
 125  132          /*
 126  133           * hardware-dependent stuff
 127  134           */
 128  135          struct ecpp_hw  *hw;            /* operations/attributes */
 129  136          union {                         /* hw-dependent data */
 130  137                  struct ecpp_ebus        ebus;
 131  138                  struct ecpp_m1553       m1553;
 132  139  #if defined(__x86)
 133  140                  struct ecpp_x86         x86;
 134  141  #endif
 135  142          } uh;
 136  143          /*
 137  144           * DDI/STREAMS stuff
 138  145           */
 139  146          boolean_t       oflag;          /* instance open flag */
 140  147          queue_t         *readq;         /* pointer to readq */
 141  148          queue_t         *writeq;        /* pointer to writeq */
 142  149          mblk_t          *msg;           /* current message block */
 143  150          boolean_t       suspended;      /* driver suspended status */
 144  151          /*
 145  152           * Modes of operation
 146  153           */
 147  154          int             current_mode;   /* 1284 mode */
 148  155          uchar_t         current_phase;  /* 1284 phase */
 149  156          uchar_t         backchannel;    /* backchannel mode supported */
 150  157          uchar_t         io_mode;        /* transfer mode: PIO/DMA */
 151  158          /*
 152  159           * Ioctls support
 153  160           */
 154  161          struct ecpp_transfer_parms xfer_parms;  /* transfer parameters */
 155  162          struct ecpp_regs regs;          /* control/status registers */
 156  163          uint8_t         saved_dsr;      /* store the dsr returned from TESTIO */
 157  164          boolean_t       timeout_error;  /* store the timeout for GETERR */
 158  165          uchar_t         port;           /* xfer type: dma/pio/tfifo */
 159  166          struct prn_timeouts prn_timeouts; /* prnio timeouts */
 160  167          /*
 161  168           * ecpp.conf parameters
 162  169           */
 163  170          uchar_t         init_seq;       /* centronics init seq */
 164  171          uint32_t        wsrv_retry;     /* delay (ms) before next wsrv */
 165  172          uint32_t        wait_for_busy;  /* wait for BUSY to deassert */
 166  173          uint32_t        data_setup_time; /* pio centronics handshake */
 167  174          uint32_t        strobe_pulse_width; /* pio centronics handshake */
 168  175          uint8_t         fast_centronics; /* DMA/PIO centronics */
 169  176          uint8_t         fast_compat;    /* DMA/PIO 1284 compatible mode */
 170  177          uint32_t        ecp_rev_speed;  /* rev xfer speed in ECP, bytes/sec */
 171  178          uint32_t        rev_watchdog;   /* rev xfer watchdog period, ms */
 172  179          /*
 173  180           * Timeouts
 174  181           */
 175  182          timeout_id_t    timeout_id;     /* io transfers timer */
 176  183          timeout_id_t    fifo_timer_id;  /* drain SuperIO FIFO */
 177  184          timeout_id_t    wsrv_timer_id;  /* wsrv timeout */
 178  185          /*
 179  186           * Softintr data
 180  187           */
 181  188          ddi_softintr_t  softintr_id;
 182  189          int             softintr_flags; /* flags indicating softintr task */
 183  190          uint8_t         softintr_pending;
 184  191          /*
 185  192           * Misc stuff
 186  193           */
 187  194          caddr_t         ioblock;        /* transfer buffer block */
 188  195          size_t          xfercnt;        /* # of bytes to transfer */
 189  196          size_t          resid;          /* # of bytes not transferred */
 190  197          caddr_t         next_byte;      /* next byte for PIO transfer */
 191  198          caddr_t         last_byte;      /* last byte for PIO transfer */
 192  199          uint32_t        ecpp_drain_counter;     /* allows fifo to drain */
 193  200          uchar_t         dma_cancelled;  /* flushed while dma'ing */
 194  201          uint8_t         tfifo_intr;     /* TFIFO switch interrupt workaround */
 195  202          size_t          nread;          /* requested read */
 196  203          size_t          last_dmacnt;    /* DMA counter value for rev watchdog */
 197  204          uint32_t        rev_timeout_cnt; /* number of watchdog invocations */
 198  205          /*
 199  206           * Spurious interrupt detection
 200  207           */
 201  208          hrtime_t        lastspur;       /* last time spurious intrs started */
 202  209          long            nspur;          /* spurious intrs counter */
 203  210          /*
 204  211           * Statistics
 205  212           */
 206  213          kstat_t         *ksp;           /* kstat pointer */
 207  214          kstat_t         *intrstats;     /* kstat interrupt counter */
 208  215          /*
 209  216           * number of bytes, transferred in and out in each mode
 210  217           */
 211  218          uint32_t        ctxpio_obytes;
 212  219          uint32_t        obytes[ECPP_EPP_MODE+1];
 213  220          uint32_t        ibytes[ECPP_EPP_MODE+1];
 214  221          /*
 215  222           * other stats
 216  223           */
 217  224          uint32_t        to_mode[ECPP_EPP_MODE+1]; /* # transitions to mode */
 218  225          uint32_t        xfer_tout;      /* # transfer timeouts */
 219  226          uint32_t        ctx_cf;         /* # periph check failures */
 220  227          uint32_t        joblen;         /* of bytes xfer'd since open */
 221  228          uint32_t        isr_reattempt_high;     /* max times isr has looped */
 222  229          /*
 223  230           * interrupt stats
 224  231           */
 225  232          uint_t          intr_hard;
 226  233          uint_t          intr_spurious;
 227  234          uint_t          intr_soft;
 228  235          /*
 229  236           * identify second register set for ecp mode on Sx86
 230  237           */
 231  238          int             noecpregs;
 232  239  };
 233  240  
 234  241  _NOTE(MUTEX_PROTECTS_DATA(ecppunit::umutex, ecppunit))
 235  242  _NOTE(DATA_READABLE_WITHOUT_LOCK(ecppunit::dip))
 236  243  _NOTE(DATA_READABLE_WITHOUT_LOCK(ecppunit::instance))
 237  244  _NOTE(DATA_READABLE_WITHOUT_LOCK(ecppunit::i_reg))
 238  245  _NOTE(DATA_READABLE_WITHOUT_LOCK(ecppunit::f_reg))
 239  246  _NOTE(DATA_READABLE_WITHOUT_LOCK(ecppunit::i_handle))
 240  247  _NOTE(DATA_READABLE_WITHOUT_LOCK(ecppunit::f_handle))
 241  248  _NOTE(DATA_READABLE_WITHOUT_LOCK(ecppunit::ecpp_trap_cookie))
 242  249  _NOTE(DATA_READABLE_WITHOUT_LOCK(ecppunit::readq))
 243  250  _NOTE(DATA_READABLE_WITHOUT_LOCK(ecppunit::writeq))
 244  251  
 245  252  /*
 246  253   * current_phase values
 247  254   */
 248  255  #define ECPP_PHASE_INIT         0x00    /* initialization */
 249  256  #define ECPP_PHASE_NEGO         0x01    /* negotiation */
 250  257  #define ECPP_PHASE_TERM         0x02    /* termination */
 251  258  #define ECPP_PHASE_PO           0x03    /* power-on */
 252  259  
 253  260  #define ECPP_PHASE_C_FWD_DMA    0x10    /* cntrx/compat fwd dma xfer */
 254  261  #define ECPP_PHASE_C_FWD_PIO    0x11    /* cntrx/compat fwd PIO xfer */
 255  262  #define ECPP_PHASE_C_IDLE       0x12    /* cntrx/compat idle */
 256  263  
 257  264  #define ECPP_PHASE_NIBT_REVDATA 0x20    /* nibble/byte reverse data */
 258  265  #define ECPP_PHASE_NIBT_AVAIL   0x21    /* nibble/byte reverse data available */
 259  266  #define ECPP_PHASE_NIBT_NAVAIL  0x22    /* nibble/byte reverse data not avail */
 260  267  #define ECPP_PHASE_NIBT_REVIDLE 0x22    /* nibble/byte reverse idle */
 261  268  #define ECPP_PHASE_NIBT_REVINTR 0x23    /* nibble/byte reverse interrupt */
 262  269  
 263  270  #define ECPP_PHASE_ECP_SETUP    0x30    /* ecp setup */
 264  271  #define ECPP_PHASE_ECP_FWD_XFER 0x31    /* ecp forward transfer */
 265  272  #define ECPP_PHASE_ECP_FWD_IDLE 0x32    /* ecp forward idle */
 266  273  #define ECPP_PHASE_ECP_FWD_REV  0x33    /* ecp forward to reverse */
 267  274  #define ECPP_PHASE_ECP_REV_XFER 0x34    /* ecp reverse transfer */
 268  275  #define ECPP_PHASE_ECP_REV_IDLE 0x35    /* ecp reverse idle */
 269  276  #define ECPP_PHASE_ECP_REV_FWD  0x36    /* ecp reverse to forward */
 270  277  
  
    | ↓ open down ↓ | 153 lines elided | ↑ open up ↑ | 
 271  278  #define ECPP_PHASE_EPP_INIT_IDLE 0x40   /* epp init phase */
 272  279  #define ECPP_PHASE_EPP_IDLE     0x41    /* epp all-round phase */
 273  280  
 274  281  #define FAILURE_PHASE           0x80
 275  282  #define UNDEFINED_PHASE         0x81
 276  283  
 277  284  /* ecpp return values */
 278  285  #define SUCCESS         1
 279  286  #define FAILURE         2
 280  287  
 281      -/* ecpp e_busy states */
 282      -#define ECPP_IDLE       1 /* No ongoing transfers */
 283      -#define ECPP_BUSY       2 /* Ongoing transfers on the cable */
 284      -#define ECPP_DATA       3 /* Not used */
 285      -#define ECPP_ERR        4 /* Bad status in Centronics mode */
 286      -#define ECPP_FLUSH      5 /* Currently flushing the q */
 287      -
 288  288  #define TRUE            1
 289  289  #define FALSE           0
 290  290  
 291  291  /* message type */
 292  292  #define ECPP_BACKCHANNEL        0x45
 293  293  
 294  294  /* transfer modes */
 295  295  #define ECPP_DMA                0x1
 296  296  #define ECPP_PIO                0x2
 297  297  
 298  298  /* tuneable timing defaults */
 299  299  #define CENTRONICS_RETRY        750     /* 750 milliseconds */
 300  300  #define WAIT_FOR_BUSY           1000    /* 1000 microseconds */
 301  301  #define SUSPEND_TOUT            10      /* # seconds before suspend fails */
 302  302  
 303  303  /* Centronics hanshaking defaults */
 304  304  #define DATA_SETUP_TIME         2       /* 2 uSec Data Setup Time (2x min) */
 305  305  #define STROBE_PULSE_WIDTH      2       /* 2 uSec Strobe Pulse (2x min) */
 306  306  
 307  307  /* 1284 Extensibility Request values */
 308  308  #define ECPP_XREQ_NIBBLE        0x00    /* Nibble Mode Rev Channel Transfer */
 309  309  #define ECPP_XREQ_BYTE          0x01    /* Byte Mode Rev Channel Transfer */
 310  310  #define ECPP_XREQ_ID            0x04    /* Request Device ID */
 311  311  #define ECPP_XREQ_ECP           0x10    /* Request ECP Mode */
 312  312  #define ECPP_XREQ_ECPRLE        0x30    /* Request ECP Mode with RLE */
 313  313  #define ECPP_XREQ_EPP           0x40    /* Request EPP Mode */
 314  314  #define ECPP_XREQ_XLINK         0x80    /* Request Extensibility Link */
 315  315  
 316  316  /* softintr flags */
 317  317  #define ECPP_SOFTINTR_PIONEXT   0x1     /* write next byte in PIO mode */
 318  318  
 319  319  /* Stream  defaults */
 320  320  #define IO_BLOCK_SZ     1024 * 128      /* transfer buffer size */
 321  321  #define ECPPHIWAT       32 * 1024  * 6
 322  322  #define ECPPLOWAT       32 * 1024  * 4
 323  323  
 324  324  /* Loop timers */
 325  325  #define ECPP_REG_WRITE_MAX_LOOP 100     /* cpu is faster than superio */
 326  326  #define ECPP_ISR_MAX_DELAY      30      /* DMAC slow PENDING status */
 327  327  
 328  328  /* misc constants */
 329  329  #define ECPP_FIFO_SZ            16      /* FIFO size */
 330  330  #define FIFO_DRAIN_PERIOD       250000  /* max FIFO drain period in usec */
 331  331  #define NIBBLE_REV_BLKSZ        1024    /* send up to # bytes at a time */
 332  332  #define FWD_TIMEOUT_DEFAULT     90      /* forward xfer timeout in seconds */
 333  333  #define REV_TIMEOUT_DEFAULT     0       /* reverse xfer timeout in seconds */
 334  334  
 335  335  /* ECP mode constants */
 336  336  #define ECP_REV_BLKSZ           1024    /* send up to # bytes at a time */
 337  337  #define ECP_REV_BLKSZ_MAX       (4 * 1024)      /* maximum of # bytes */
 338  338  #define ECP_REV_SPEED           (1 * 1024 * 1024)       /* bytes/sec */
 339  339  #define ECP_REV_MINTOUT         5       /* min ECP rev xfer timeout in ms */
 340  340  #define REV_WATCHDOG            100     /* poll DMA counter every # ms */
 341  341  
 342  342  /* spurious interrupt detection */
 343  343  #define SPUR_CRITICAL           100     /* number of interrupts... */
 344  344  #define SPUR_PERIOD             1000000000 /* in # ns */
 345  345  
 346  346  /*
 347  347   * Copyin/copyout states
 348  348   */
 349  349  #define ECPP_STRUCTIN           0
 350  350  #define ECPP_STRUCTOUT          1
 351  351  #define ECPP_ADDRIN             2
 352  352  #define ECPP_ADDROUT            3
 353  353  
 354  354  /*
 355  355   * As other ioctls require the same structure, put inner struct's into union
 356  356   */
 357  357  struct ecpp_copystate {
 358  358          int     state;          /* see above */
 359  359          void    *uaddr;         /* user address of the following structure */
 360  360          union {
 361  361                  struct ecpp_device_id           devid;
 362  362                  struct prn_1284_device_id       prn_devid;
 363  363                  struct prn_interface_info       prn_if;
 364  364          } un;
 365  365  };
 366  366  
 367  367  /*
 368  368   * The structure is dynamically created for each M_IOCTL and is bound to mblk
 369  369   */
 370  370  _NOTE(SCHEME_PROTECTS_DATA("unique per call", ecpp_copystate))
 371  371  
 372  372  /* kstat structure */
 373  373  struct ecppkstat {
 374  374          /*
 375  375           * number of bytes, transferred in and out in each mode
 376  376           */
 377  377          struct kstat_named      ek_ctx_obytes;
 378  378          struct kstat_named      ek_ctxpio_obytes;
 379  379          struct kstat_named      ek_nib_ibytes;
 380  380          struct kstat_named      ek_ecp_obytes;
 381  381          struct kstat_named      ek_ecp_ibytes;
 382  382          struct kstat_named      ek_epp_obytes;
 383  383          struct kstat_named      ek_epp_ibytes;
 384  384          struct kstat_named      ek_diag_obytes;
 385  385          /*
 386  386           * number of transitions to particular mode
 387  387           */
 388  388          struct kstat_named      ek_to_ctx;
 389  389          struct kstat_named      ek_to_nib;
 390  390          struct kstat_named      ek_to_ecp;
 391  391          struct kstat_named      ek_to_epp;
 392  392          struct kstat_named      ek_to_diag;
 393  393          /*
 394  394           * other stats
 395  395           */
 396  396          struct kstat_named      ek_xfer_tout;   /* # transfer timeouts */
 397  397          struct kstat_named      ek_ctx_cf;      /* # periph check failures */
 398  398          struct kstat_named      ek_joblen;      /* # bytes xfer'd since open */
 399  399          struct kstat_named      ek_isr_reattempt_high;  /* max # times */
 400  400                                                          /* isr has looped */
 401  401          struct kstat_named      ek_mode;        /* 1284 mode */
 402  402          struct kstat_named      ek_phase;       /* 1284 ECP phase */
 403  403          struct kstat_named      ek_backchan;    /* backchannel mode supported */
 404  404          struct kstat_named      ek_iomode;      /* transfer mode: pio/dma */
 405  405          struct kstat_named      ek_state;       /* ecpp busy flag */
 406  406  };
 407  407  
 408  408  /* Macros for superio programming */
 409  409  #define PP_PUTB(x, y, z)        ddi_put8(x, y, z)
 410  410  #define PP_GETB(x, y)           ddi_get8(x, y)
 411  411  
 412  412  #define DSR_READ(pp)            PP_GETB((pp)->i_handle, &(pp)->i_reg->dsr)
 413  413  #define DCR_READ(pp)            PP_GETB((pp)->i_handle, &(pp)->i_reg->dcr)
 414  414  #define ECR_READ(pp)            \
 415  415          (pp->noecpregs) ? 0xff : PP_GETB((pp)->f_handle, &(pp)->f_reg->ecr)
 416  416  #define DATAR_READ(pp)          PP_GETB((pp)->i_handle, &(pp)->i_reg->ir.datar)
 417  417  #define DFIFO_READ(pp)          \
 418  418          (pp->noecpregs) ? 0xff : PP_GETB((pp)->f_handle, &(pp)->f_reg->fr.dfifo)
 419  419  #define TFIFO_READ(pp)          \
 420  420          (pp->noecpregs) ? 0xff : PP_GETB((pp)->f_handle, &(pp)->f_reg->fr.tfifo)
 421  421  
 422  422  #define DCR_WRITE(pp, val)      PP_PUTB((pp)->i_handle, &(pp)->i_reg->dcr, val)
 423  423  #define ECR_WRITE(pp, val)      \
 424  424          if (!pp->noecpregs) PP_PUTB((pp)->f_handle, &(pp)->f_reg->ecr, val)
 425  425  #define DATAR_WRITE(pp, val)    \
 426  426                          PP_PUTB((pp)->i_handle, &(pp)->i_reg->ir.datar, val)
 427  427  #define DFIFO_WRITE(pp, val)    \
 428  428          if (!pp->noecpregs) PP_PUTB((pp)->f_handle, &(pp)->f_reg->fr.dfifo, val)
 429  429  #define TFIFO_WRITE(pp, val)    \
 430  430          if (!pp->noecpregs) PP_PUTB((pp)->f_handle, &(pp)->f_reg->fr.tfifo, val)
 431  431  
 432  432  /*
 433  433   * Macros to manipulate register bits
 434  434   */
 435  435  #define OR_SET_BYTE_R(handle, addr, val) \
 436  436  {               \
 437  437          uint8_t tmpval;                                 \
 438  438          tmpval = ddi_get8(handle, (uint8_t *)addr);     \
 439  439          tmpval |= val;                                  \
 440  440          ddi_put8(handle, (uint8_t *)addr, tmpval);      \
 441  441  }
 442  442  
 443  443  #define OR_SET_LONG_R(handle, addr, val) \
 444  444  {               \
 445  445          uint32_t tmpval;                                \
 446  446          tmpval = ddi_get32(handle, (uint32_t *)addr);   \
 447  447          tmpval |= val;                                  \
 448  448          ddi_put32(handle, (uint32_t *)addr, tmpval);    \
 449  449  }
 450  450  
 451  451  #define AND_SET_BYTE_R(handle, addr, val) \
 452  452  {               \
 453  453          uint8_t tmpval;                                 \
 454  454          tmpval = ddi_get8(handle, (uint8_t *)addr);     \
 455  455          tmpval &= val;                                  \
 456  456          ddi_put8(handle, (uint8_t *)addr, tmpval);      \
 457  457  }
 458  458  
 459  459  #define AND_SET_LONG_R(handle, addr, val) \
 460  460  {               \
 461  461          uint32_t tmpval;                                \
 462  462          tmpval = ddi_get32(handle, (uint32_t *)addr);   \
 463  463          tmpval &= val;                                  \
 464  464          ddi_put32(handle, (uint32_t *)addr, tmpval);    \
 465  465  }
 466  466  
 467  467  #define NOR_SET_LONG_R(handle, addr, val, mask) \
 468  468  {               \
 469  469          uint32_t tmpval;                                \
 470  470          tmpval = ddi_get32(handle, (uint32_t *)addr);   \
 471  471          tmpval &= ~(mask);                              \
 472  472          tmpval |= val;                                  \
 473  473          ddi_put32(handle, (uint32_t *)addr, tmpval);    \
 474  474  }
 475  475  
 476  476  /*
 477  477   * Macros for Cheerio/RIO DMAC programming
 478  478   */
 479  479  #define SET_DMAC_CSR(pp, val)   ddi_put32(pp->uh.ebus.d_handle, \
 480  480                                  ((uint32_t *)&pp->uh.ebus.dmac->csr), \
 481  481                                  ((uint32_t)val))
 482  482  #define GET_DMAC_CSR(pp)        ddi_get32(pp->uh.ebus.d_handle, \
 483  483                                  (uint32_t *)&(pp->uh.ebus.dmac->csr))
 484  484  
 485  485  #define SET_DMAC_ACR(pp, val)   ddi_put32(pp->uh.ebus.d_handle, \
 486  486                                  ((uint32_t *)&pp->uh.ebus.dmac->acr), \
 487  487                                  ((uint32_t)val))
 488  488  
 489  489  #define GET_DMAC_ACR(pp)        ddi_get32(pp->uh.ebus.d_handle, \
 490  490                                  (uint32_t *)&pp->uh.ebus.dmac->acr)
 491  491  
 492  492  #define SET_DMAC_BCR(pp, val)   ddi_put32(pp->uh.ebus.d_handle, \
 493  493                                  ((uint32_t *)&pp->uh.ebus.dmac->bcr), \
 494  494                                  ((uint32_t)val))
 495  495  
 496  496  #define GET_DMAC_BCR(pp)        ddi_get32(pp->uh.ebus.d_handle, \
 497  497                                  ((uint32_t *)&pp->uh.ebus.dmac->bcr))
 498  498  
 499  499  #define DMAC_RESET_TIMEOUT      10000   /* in usec */
 500  500  
 501  501  /*
 502  502   * Macros to distinguish between PIO and DMA Compatibility mode
 503  503   */
 504  504  #define COMPAT_PIO(pp) (((pp)->io_mode == ECPP_PIO) &&          \
 505  505                      ((pp)->current_mode == ECPP_CENTRONICS ||   \
 506  506                      (pp)->current_mode == ECPP_COMPAT_MODE))
 507  507  
 508  508  #define COMPAT_DMA(pp) (((pp)->io_mode == ECPP_DMA) &&          \
 509  509                      ((pp)->current_mode == ECPP_CENTRONICS ||   \
 510  510                      (pp)->current_mode == ECPP_COMPAT_MODE))
 511  511  
 512  512  /*
 513  513   * Other useful macros
 514  514   */
 515  515  #define NELEM(a)        (sizeof (a) / sizeof (*(a)))
 516  516  #define offsetof(s, m)  ((size_t)(&(((s *)0)->m)))
 517  517  
 518  518  #ifdef  __cplusplus
 519  519  }
 520  520  #endif
 521  521  
 522  522  #endif  /* _SYS_ECPPVAR_H */
  
    | ↓ open down ↓ | 225 lines elided | ↑ open up ↑ | 
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX