summaryrefslogtreecommitdiff
path: root/sys/dev/ic/adw.h
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/ic/adw.h')
-rw-r--r--sys/dev/ic/adw.h91
1 files changed, 74 insertions, 17 deletions
diff --git a/sys/dev/ic/adw.h b/sys/dev/ic/adw.h
index d05355a2ce0..fa9c4c3d5e0 100644
--- a/sys/dev/ic/adw.h
+++ b/sys/dev/ic/adw.h
@@ -1,11 +1,10 @@
-/* $OpenBSD: adw.h,v 1.2 1998/12/30 15:13:04 downsj Exp $ */
-/* $NetBSD: adw.h,v 1.1 1998/09/26 16:10:41 dante Exp $ */
+/* $NetBSD: adw.h,v 1.5 2000/02/03 20:29:15 dante Exp $ */
/*
* Generic driver definitions and exported functions for the Advanced
* Systems Inc. SCSI controllers
*
- * Copyright (c) 1998 The NetBSD Foundation, Inc.
+ * Copyright (c) 1998, 1999, 2000 The NetBSD Foundation, Inc.
* All rights reserved.
*
* Author: Baldassare Dante Profeta <dante@mclink.it>
@@ -45,10 +44,55 @@
/******************************************************************************/
typedef int (* ADW_ISR_CALLBACK) (ADW_SOFTC *, ADW_SCSI_REQ_Q *);
-typedef int (* ADW_SBRESET_CALLBACK) (ADW_SOFTC *);
+typedef void (* ADW_ASYNC_CALLBACK) (ADW_SOFTC *, u_int8_t);
-/* per request scatter-gather element limit */
-#define ADW_MAX_SG_LIST 64
+
+/*
+ * Every adw_carrier structure _MUST_ always be aligned on a 16 bytes boundary
+ */
+struct adw_carrier {
+/* ---------- the microcode wants the field below ---------- */
+ u_int32_t unused; /* Carrier Virtual Address -UNUSED- */
+ u_int32_t carr_pa; /* Carrier Physical Address */
+ u_int32_t areq_vpa; /* ADW_SCSI_REQ_Q Physical Address */
+ /*
+ * next_vpa [31:4] Carrier Physical Next Pointer
+ *
+ * next_vpa [3:1] Reserved Bits
+ * next_vpa [0] Done Flag set in Response Queue.
+ */
+ u_int32_t next_vpa;
+/* ---------- ---------- */
+ struct adw_carrier *nexthash; /* Carrier Virtual Address */
+
+ int id;
+ /*
+ * This DMA map maps the buffer involved in the carrier transfer.
+ */
+// bus_dmamap_t dmamap_xfer;
+};
+
+typedef struct adw_carrier ADW_CARRIER;
+
+#define ADW_CARRIER_SIZE ((((int)((sizeof(ADW_CARRIER)-1)/16))+1)*16)
+
+
+/*
+ * Mask used to eliminate low 4 bits of carrier 'next_vpa' field.
+ */
+#define ASC_NEXT_VPA_MASK 0xFFFFFFF0
+
+#define ASC_RQ_DONE 0x00000001
+#define ASC_CQ_STOPPER 0x00000000
+
+#define ASC_GET_CARRP(carrp) ((carrp) & ASC_NEXT_VPA_MASK)
+
+
+/*
+ * per request scatter-gather element limit
+ * We could have up to 256 SG lists.
+ */
+#define ADW_MAX_SG_LIST 255
/*
* Scatter-Gather Definitions per request.
@@ -61,14 +105,18 @@ typedef int (* ADW_SBRESET_CALLBACK) (ADW_SOFTC *);
((ADW_MAX_SG_LIST + (NO_OF_SG_PER_BLOCK - 1))/NO_OF_SG_PER_BLOCK)
-struct adw_ccb
-{
- ADW_SG_BLOCK sg_block[ADW_NUM_SG_BLOCK];
+struct adw_ccb {
ADW_SCSI_REQ_Q scsiq;
+ ADW_SG_BLOCK sg_block[ADW_NUM_SG_BLOCK];
+
+ ADW_CARRIER *carr_list; /* carriers involved */
- struct scsi_sense_data scsi_sense;
+ struct scsi_sense_data scsi_sense;
TAILQ_ENTRY(adw_ccb) chain;
+ struct adw_ccb *nexthash;
+ u_int32_t hashkey;
+
struct scsi_xfer *xs; /* the scsi_xfer for this cmd */
int flags; /* see below */
@@ -82,19 +130,26 @@ struct adw_ccb
typedef struct adw_ccb ADW_CCB;
/* flags for ADW_CCB */
-#define CCB_ALLOC 0x01
-#define CCB_ABORT 0x02
-#define CCB_WATCHDOG 0x10
+#define CCB_ALLOC 0x01
+#define CCB_ABORTING 0x02
+#define CCB_ABORTED 0x04
-#define ADW_MAX_CCB 64
+#define ADW_MAX_CARRIER 20 /* Max. number of host commands (253) */
+#define ADW_MAX_CCB 16 /* Max. number commands per device (63) */
-struct adw_control
-{
- ADW_CCB ccbs[ADW_MAX_CCB]; /* all our control blocks */
+struct adw_control {
+ ADW_CCB ccbs[ADW_MAX_CCB]; /* all our control blocks */
+ ADW_CARRIER *carriers; /* all our carriers */
+ bus_dmamap_t dmamap_xfer;
};
/*
+ * Offset of a carrier from the beginning of the carriers DMA mapping.
+ */
+#define ADW_CARRIER_ADDR(sc, x) ((sc)->sc_dmamap_carrier->dm_segs[0].ds_addr + \
+ (((u_long)x) - ((u_long)(sc)->sc_control->carriers)))
+/*
* Offset of a CCB from the beginning of the control DMA mapping.
*/
#define ADW_CCB_OFF(c) (offsetof(struct adw_control, ccbs[0]) + \
@@ -105,6 +160,8 @@ struct adw_control
int adw_init __P((ADW_SOFTC *sc));
void adw_attach __P((ADW_SOFTC *sc));
int adw_intr __P((void *arg));
+ADW_CCB *adw_ccb_phys_kv __P((ADW_SOFTC *, u_int32_t));
+ADW_CARRIER *adw_carrier_phys_kv __P((ADW_SOFTC *, u_int32_t));
/******************************************************************************/