can anyone compile or even test this on a sparc or vax for me?
cheers,
dlg
Index: ncr5380sbc.c
===================================================================
RCS file: /cvs/src/sys/dev/ic/ncr5380sbc.c,v
retrieving revision 1.30
diff -u -p -r1.30 ncr5380sbc.c
--- ncr5380sbc.c 17 Jul 2011 22:46:48 -0000 1.30
+++ ncr5380sbc.c 18 Jan 2014 01:14:57 -0000
@@ -88,6 +88,9 @@
#include <dev/ic/ncr5380reg.h>
#include <dev/ic/ncr5380var.h>
+static void * ncr5380_io_get(void *);
+static void ncr5380_io_put(void *, void *);
+
static void ncr5380_sched(struct ncr5380_softc *);
static void ncr5380_done(struct ncr5380_softc *);
@@ -362,14 +365,17 @@ ncr5380_init(sc)
for (i = 0; i < SCI_OPENINGS; i++) {
sr = &sc->sc_ring[i];
- sr->sr_xs = NULL;
+ sr->sr_flags = SR_FREE;
timeout_set(&sr->sr_timeout, ncr5380_cmd_timeout, sr);
}
for (i = 0; i < 8; i++)
for (j = 0; j < 8; j++)
sc->sc_matrix[i][j] = NULL;
+ scsi_iopool_init(&sc->sc_iopool, sc, ncr5380_io_get, ncr5380_io_put);
+
sc->sc_link.openings = 2; /* XXX - Not SCI_OPENINGS */
+ sc->sc_link.pool = &sc->sc_iopool;
sc->sc_prevphase = PHASE_INVALID;
sc->sc_state = NCR_IDLE;
@@ -585,6 +591,44 @@ out:
*****************************************************************/
+void *
+ncr5380_io_get(void *xsc)
+{
+ struct ncr5380_softc *sc = xsc;
+ struct sci_req *sr = NULL;
+ int s;
+
+ /*
+ * Find lowest empty slot in ring buffer.
+ * XXX: What about "fairness" and cmd order?
+ */
+
+ s = splbio();
+ for (i = 0; i < SCI_OPENINGS; i++) {
+ if (sc->sc_ring[i].sr_flags == SR_FREE) {
+ sr = &sc->sc_ring[i];
+ sr->sr_flags = 0;
+ sc->sc_ncmds++;
+ break;
+ }
+ }
+ splx(s);
+
+ return (sr);
+}
+
+void
+ncr5380_io_put(void *xsc, void *xsr)
+{
+ struct ncr5380_softc *sc = xsc;
+ struct sci_req *sr = xsr;
+ int s;
+
+ s = splbio();
+ sr->sr_flags = SR_FREE;
+ splx(s);
+}
+
/*
* Enter a new SCSI command into the "issue" queue, and
* if there is work to do, start it going.
@@ -622,22 +666,8 @@ ncr5380_scsi_cmd(xs)
}
}
- /*
- * Find lowest empty slot in ring buffer.
- * XXX: What about "fairness" and cmd order?
- */
- for (i = 0; i < SCI_OPENINGS; i++)
- if (sc->sc_ring[i].sr_xs == NULL)
- goto new;
-
- xs->error = XS_NO_CCB;
- scsi_done(xs);
- NCR_TRACE("scsi_cmd: no openings\n", 0);
- goto out;
-
-new:
/* Create queue entry */
- sr = &sc->sc_ring[i];
+ sr = xs->io;
sr->sr_xs = xs;
sr->sr_target = xs->sc_link->target;
sr->sr_lun = xs->sc_link->lun;
Index: ncr5380var.h
===================================================================
RCS file: /cvs/src/sys/dev/ic/ncr5380var.h,v
retrieving revision 1.12
diff -u -p -r1.12 ncr5380var.h
--- ncr5380var.h 25 Mar 2010 13:18:03 -0000 1.12
+++ ncr5380var.h 18 Jan 2014 01:14:57 -0000
@@ -71,6 +71,7 @@ struct sci_req {
#define SR_SENSE 2 /* We are getting sense
*/
#define SR_OVERDUE 4 /* Timeout while not
current */
#define SR_ERROR 8 /* Error occurred */
+#define SR_FREE 16 /* We are free */
int sr_status; /* Status code from last cmd */
struct timeout sr_timeout;
@@ -144,6 +145,8 @@ struct ncr5380_softc {
/* Ring buffer of pending/active requests */
struct sci_req sc_ring[SCI_OPENINGS];
int sc_rr; /* Round-robin scan pointer */
+
+ struct scsi_iopool sc_iopool;
/* Active requests, by target/LUN */
struct sci_req *sc_matrix[8][8];