diff options
author | Scott Long <scottl@FreeBSD.org> | 2004-08-13 01:44:09 +0000 |
---|---|---|
committer | Scott Long <scottl@FreeBSD.org> | 2004-08-13 01:44:09 +0000 |
commit | 4afedc314e8e6ded5fb719708bcc78deba2eadcb (patch) | |
tree | b680ed2cf8bb931c47c77d00ab1735fd99963d28 /sys/dev/aac/aac.c | |
parent | c00661f83c24f095ac8189860537917027bc19f8 (diff) | |
download | src-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.c | 91 |
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 */ |