aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/aac/aac.c
diff options
context:
space:
mode:
authorScott Long <scottl@FreeBSD.org>2004-08-13 01:44:09 +0000
committerScott Long <scottl@FreeBSD.org>2004-08-13 01:44:09 +0000
commit4afedc314e8e6ded5fb719708bcc78deba2eadcb (patch)
treeb680ed2cf8bb931c47c77d00ab1735fd99963d28 /sys/dev/aac/aac.c
parentc00661f83c24f095ac8189860537917027bc19f8 (diff)
downloadsrc-4afedc314e8e6ded5fb719708bcc78deba2eadcb.tar.gz
src-4afedc314e8e6ded5fb719708bcc78deba2eadcb.zip
Add support for the Adaptec RAID-On-Chip architecture. This in turn
provides support for the Adaptec 2130S adapter. Thanks to Adaptec for providing hardware for this.
Notes
Notes: svn path=/head/; revision=133606
Diffstat (limited to 'sys/dev/aac/aac.c')
-rw-r--r--sys/dev/aac/aac.c91
1 files changed, 91 insertions, 0 deletions
diff --git a/sys/dev/aac/aac.c b/sys/dev/aac/aac.c
index 60d4f1c29bd9..335359c8c10b 100644
--- a/sys/dev/aac/aac.c
+++ b/sys/dev/aac/aac.c
@@ -161,6 +161,27 @@ struct aac_interface aac_rx_interface = {
aac_rx_set_interrupts
};
+/* Rocket/MIPS interface */
+static int aac_rkt_get_fwstatus(struct aac_softc *sc);
+static void aac_rkt_qnotify(struct aac_softc *sc, int qbit);
+static int aac_rkt_get_istatus(struct aac_softc *sc);
+static void aac_rkt_clear_istatus(struct aac_softc *sc, int mask);
+static void aac_rkt_set_mailbox(struct aac_softc *sc, u_int32_t command,
+ u_int32_t arg0, u_int32_t arg1,
+ u_int32_t arg2, u_int32_t arg3);
+static int aac_rkt_get_mailbox(struct aac_softc *sc, int mb);
+static void aac_rkt_set_interrupts(struct aac_softc *sc, int enable);
+
+struct aac_interface aac_rkt_interface = {
+ aac_rkt_get_fwstatus,
+ aac_rkt_qnotify,
+ aac_rkt_get_istatus,
+ aac_rkt_clear_istatus,
+ aac_rkt_set_mailbox,
+ aac_rkt_get_mailbox,
+ aac_rkt_set_interrupts
+};
+
/* Debugging and Diagnostics */
static void aac_describe_controller(struct aac_softc *sc);
static char *aac_describe_code(struct aac_code_lookup *table,
@@ -1634,6 +1655,11 @@ aac_init(struct aac_softc *sc)
case AAC_HWIF_I960RX:
AAC_SETREG4(sc, AAC_RX_ODBR, ~0);
break;
+ case AAC_HWIF_RKT:
+ AAC_SETREG4(sc, AAC_RKT_ODBR, ~0);
+ break;
+ default:
+ break;
}
/*
@@ -2020,6 +2046,14 @@ aac_fa_get_fwstatus(struct aac_softc *sc)
return (val);
}
+static int
+aac_rkt_get_fwstatus(struct aac_softc *sc)
+{
+ debug_called(3);
+
+ return(AAC_GETREG4(sc, AAC_RKT_FWSTATUS));
+}
+
/*
* Notify the controller of a change in a given queue
*/
@@ -2049,6 +2083,14 @@ aac_fa_qnotify(struct aac_softc *sc, int qbit)
AAC_FA_HACK(sc);
}
+static void
+aac_rkt_qnotify(struct aac_softc *sc, int qbit)
+{
+ debug_called(3);
+
+ AAC_SETREG4(sc, AAC_RKT_IDBR, qbit);
+}
+
/*
* Get the interrupt reason bits
*/
@@ -2079,6 +2121,14 @@ aac_fa_get_istatus(struct aac_softc *sc)
return (val);
}
+static int
+aac_rkt_get_istatus(struct aac_softc *sc)
+{
+ debug_called(3);
+
+ return(AAC_GETREG4(sc, AAC_RKT_ODBR));
+}
+
/*
* Clear some interrupt reason bits
*/
@@ -2107,6 +2157,14 @@ aac_fa_clear_istatus(struct aac_softc *sc, int mask)
AAC_FA_HACK(sc);
}
+static void
+aac_rkt_clear_istatus(struct aac_softc *sc, int mask)
+{
+ debug_called(3);
+
+ AAC_SETREG4(sc, AAC_RKT_ODBR, mask);
+}
+
/*
* Populate the mailbox and set the command word
*/
@@ -2154,6 +2212,19 @@ aac_fa_set_mailbox(struct aac_softc *sc, u_int32_t command,
AAC_FA_HACK(sc);
}
+static void
+aac_rkt_set_mailbox(struct aac_softc *sc, u_int32_t command, u_int32_t arg0,
+ u_int32_t arg1, u_int32_t arg2, u_int32_t arg3)
+{
+ debug_called(4);
+
+ AAC_SETREG4(sc, AAC_RKT_MAILBOX, command);
+ AAC_SETREG4(sc, AAC_RKT_MAILBOX + 4, arg0);
+ AAC_SETREG4(sc, AAC_RKT_MAILBOX + 8, arg1);
+ AAC_SETREG4(sc, AAC_RKT_MAILBOX + 12, arg2);
+ AAC_SETREG4(sc, AAC_RKT_MAILBOX + 16, arg3);
+}
+
/*
* Fetch the immediate command status word
*/
@@ -2184,6 +2255,14 @@ aac_fa_get_mailbox(struct aac_softc *sc, int mb)
return (val);
}
+static int
+aac_rkt_get_mailbox(struct aac_softc *sc, int mb)
+{
+ debug_called(4);
+
+ return(AAC_GETREG4(sc, AAC_RKT_MAILBOX + (mb * 4)));
+}
+
/*
* Set/clear interrupt masks
*/
@@ -2225,6 +2304,18 @@ aac_fa_set_interrupts(struct aac_softc *sc, int enable)
}
}
+static void
+aac_rkt_set_interrupts(struct aac_softc *sc, int enable)
+{
+ debug(2, "%sable interrupts", enable ? "en" : "dis");
+
+ if (enable) {
+ AAC_SETREG4(sc, AAC_RKT_OIMR, ~AAC_DB_INTERRUPTS);
+ } else {
+ AAC_SETREG4(sc, AAC_RKT_OIMR, ~0);
+ }
+}
+
/*
* Debugging and Diagnostics
*/