+ s = SPL_UP();
+ /*
+ * If the attention flag in dr_flags is set, it probably
+ * means that an attention has arrived by the time a
+ * previous DMA end-of-range interrupt was serviced. If
+ * ATRX is set, we will return with out sleeping, since
+ * we have received an attention since the last call to
+ * wait on attention. This may not be appropriate for
+ * some applications.
+ */
+ if ((dra->dr_flags & DR_ATRX) == 0) {
+ dra->dr_flags |= DR_ATWT; /* Set waiting flag */
+ /*
+ * Enable interrupt; use pulse reg.
+ * so function bits are not changed
+ */
+ rsaddr->dr_pulse = IENB;
+ sleep((caddr_t)&dra->dr_cmd, DRPRI);
+ }
+ splx(s);
+ break;
+
+ case DRPIOW: /* Write to p-i/o register */
+ rsaddr->dr_data = data[0];
+ break;
+
+ case DRPACL: /* Send pulse to device */
+ rsaddr->dr_pulse = FCN2;
+ break;
+
+ case DRDACL: /* Defer alco pulse until go */
+ dra->dr_cmd |= DR_DACL;
+ break;
+
+ case DRPCYL: /* Set cycle with next go */
+ dra->dr_cmd |= DR_PCYL;
+ break;
+
+ case DRDFCN: /* Update function with next go */
+ dra->dr_cmd |= DR_DFCN;
+ break;
+
+ case DRRATN: /* Reset attention flag */
+ rsaddr->dr_pulse = RATN;
+ break;
+
+ case DRRDMA: /* Reset DMA e-o-r flag */
+ rsaddr->dr_pulse = RDMA;
+ break;
+
+ case DRSFCN: /* Set function bits */
+ temp = data[0] & DR_FMSK;
+ /*
+ * This has a very important side effect -- It clears
+ * the interrupt enable flag. That is fine for this driver,
+ * but if it is desired to leave interrupt enable at all
+ * times, it will be necessary to read the status register
+ * first to get IENB, or carry a software flag that indicates
+ * whether interrupts are set, and or this into the control
+ * register value being written.
+ */
+ rsaddr->dr_cstat = temp;
+ break;
+
+ case DRRPER: /* Clear parity flag */
+ rsaddr->dr_pulse = RPER;
+ break;
+
+ case DRSETRSTALL: /* Set read stall mode. */
+ dra->dr_flags &= (~DR_NORSTALL);
+ break;
+
+ case DRSETNORSTALL: /* Set no stall read mode. */
+ dra->dr_flags |= DR_NORSTALL;
+ break;
+
+ case DRGETRSTALL: /* Returns true if in read stall mode */
+ data[0] = (dra->dr_flags & DR_NORSTALL)? 0 : 1;
+ break;
+
+ case DRSETRTIMEOUT: /* Set read stall timeout (1/10 secs) */
+ if (data[0] < 1) {
+ u.u_error = EINVAL;
+ temp = 1;
+ }
+ dra->rtimoticks = (data[0] * hz )/10;
+ break;