ahb -> sc

This commit is contained in:
mycroft 1996-05-05 03:12:47 +00:00
parent f857b38b11
commit 5b8d7c943e
1 changed files with 101 additions and 101 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: aha1742.c,v 1.59 1996/04/09 22:47:00 cgd Exp $ */
/* $NetBSD: aha1742.c,v 1.60 1996/05/05 03:12:47 mycroft Exp $ */
/*
* Copyright (c) 1994 Charles Hannum. All rights reserved.
@ -331,13 +331,13 @@ struct cfdriver ahb_cd = {
* Function to send a command out through a mailbox
*/
void
ahb_send_mbox(ahb, opcode, ecb)
struct ahb_softc *ahb;
ahb_send_mbox(sc, opcode, ecb)
struct ahb_softc *sc;
int opcode;
struct ahb_ecb *ecb;
{
bus_chipset_tag_t bc = ahb->sc_bc;
bus_io_handle_t ioh = ahb->sc_ioh;
bus_chipset_tag_t bc = sc->sc_bc;
bus_io_handle_t ioh = sc->sc_ioh;
int wait = 300; /* 1ms should be enough */
while (--wait) {
@ -347,7 +347,7 @@ ahb_send_mbox(ahb, opcode, ecb)
delay(10);
}
if (!wait) {
printf("%s: board not responding\n", ahb->sc_dev.dv_xname);
printf("%s: board not responding\n", sc->sc_dev.dv_xname);
Debugger();
}
@ -359,13 +359,13 @@ ahb_send_mbox(ahb, opcode, ecb)
* Function to poll for command completion when in poll mode
*/
int
ahb_poll(ahb, xs, count)
struct ahb_softc *ahb;
ahb_poll(sc, xs, count)
struct ahb_softc *sc;
struct scsi_xfer *xs;
int count;
{ /* in msec */
bus_chipset_tag_t bc = ahb->sc_bc;
bus_io_handle_t ioh = ahb->sc_ioh;
bus_chipset_tag_t bc = sc->sc_bc;
bus_io_handle_t ioh = sc->sc_ioh;
while (count) {
/*
@ -373,7 +373,7 @@ ahb_poll(ahb, xs, count)
* have got an interrupt?
*/
if (bus_io_read_1(bc, ioh, G2STAT) & G2STAT_INT_PEND)
ahbintr(ahb);
ahbintr(sc);
if (xs->flags & ITSDONE)
return 0;
delay(1000);
@ -386,13 +386,13 @@ ahb_poll(ahb, xs, count)
* Function to send an immediate type command to the adapter
*/
void
ahb_send_immed(ahb, target, cmd)
struct ahb_softc *ahb;
ahb_send_immed(sc, target, cmd)
struct ahb_softc *sc;
int target;
u_long cmd;
{
bus_chipset_tag_t bc = ahb->sc_bc;
bus_io_handle_t ioh = ahb->sc_ioh;
bus_chipset_tag_t bc = sc->sc_bc;
bus_io_handle_t ioh = sc->sc_ioh;
int wait = 100; /* 1 ms enough? */
while (--wait) {
@ -402,7 +402,7 @@ ahb_send_immed(ahb, target, cmd)
delay(10);
}
if (!wait) {
printf("%s: board not responding\n", ahb->sc_dev.dv_xname);
printf("%s: board not responding\n", sc->sc_dev.dv_xname);
Debugger();
}
@ -466,33 +466,33 @@ ahbattach(parent, self, aux)
void *aux;
{
struct eisa_attach_args *ea = aux;
struct ahb_softc *ahb = (void *)self;
struct ahb_softc *sc = (void *)self;
bus_chipset_tag_t bc = ea->ea_bc;
bus_io_handle_t ioh;
eisa_chipset_tag_t ec = ea->ea_ec;
eisa_intr_handle_t ih;
const char *model, *intrstr;
ahb->sc_bc = bc;
ahb->sc_ec = ec;
sc->sc_bc = bc;
sc->sc_ec = ec;
if (bus_io_map(bc, EISA_SLOT_ADDR(ea->ea_slot), EISA_SLOT_SIZE, &ioh))
panic("ahbattach: could not map I/O addresses");
ahb->sc_ioh = ioh;
if (ahb_find(bc, ioh, ahb))
sc->sc_ioh = ioh;
if (ahb_find(bc, ioh, sc))
panic("ahbattach: ahb_find failed!");
ahb_init(ahb);
TAILQ_INIT(&ahb->free_ecb);
ahb_init(sc);
TAILQ_INIT(&sc->free_ecb);
/*
* fill in the prototype scsi_link.
*/
ahb->sc_link.adapter_softc = ahb;
ahb->sc_link.adapter_target = ahb->ahb_scsi_dev;
ahb->sc_link.adapter = &ahb_switch;
ahb->sc_link.device = &ahb_dev;
ahb->sc_link.openings = 2;
sc->sc_link.adapter_softc = sc;
sc->sc_link.adapter_target = sc->ahb_scsi_dev;
sc->sc_link.adapter = &ahb_switch;
sc->sc_link.device = &ahb_dev;
sc->sc_link.openings = 2;
if (!strcmp(ea->ea_idstring, "ADP0000"))
model = EISA_PRODUCT_ADP0000;
@ -506,30 +506,30 @@ ahbattach(parent, self, aux)
model = "unknown model!";
printf(": %s\n", model);
if (eisa_intr_map(ec, ahb->sc_irq, &ih)) {
if (eisa_intr_map(ec, sc->sc_irq, &ih)) {
printf("%s: couldn't map interrupt (%d)\n",
ahb->sc_dev.dv_xname, ahb->sc_irq);
sc->sc_dev.dv_xname, sc->sc_irq);
return;
}
intrstr = eisa_intr_string(ec, ih);
ahb->sc_ih = eisa_intr_establish(ec, ih, IST_LEVEL, IPL_BIO,
ahbintr, ahb);
if (ahb->sc_ih == NULL) {
sc->sc_ih = eisa_intr_establish(ec, ih, IST_LEVEL, IPL_BIO,
ahbintr, sc);
if (sc->sc_ih == NULL) {
printf("%s: couldn't establish interrupt",
ahb->sc_dev.dv_xname);
sc->sc_dev.dv_xname);
if (intrstr != NULL)
printf(" at %s", intrstr);
printf("\n");
return;
}
if (intrstr != NULL)
printf("%s: interrupting at %s\n", ahb->sc_dev.dv_xname,
printf("%s: interrupting at %s\n", sc->sc_dev.dv_xname,
intrstr);
/*
* ask the adapter what subunits are present
*/
config_found(self, &ahb->sc_link, ahbprint);
config_found(self, &sc->sc_link, ahbprint);
}
/*
@ -539,15 +539,15 @@ int
ahbintr(arg)
void *arg;
{
struct ahb_softc *ahb = arg;
bus_chipset_tag_t bc = ahb->sc_bc;
bus_io_handle_t ioh = ahb->sc_ioh;
struct ahb_softc *sc = arg;
bus_chipset_tag_t bc = sc->sc_bc;
bus_io_handle_t ioh = sc->sc_ioh;
struct ahb_ecb *ecb;
u_char ahbstat;
u_long mboxval;
#ifdef AHBDEBUG
printf("%s: ahbintr ", ahb->sc_dev.dv_xname);
printf("%s: ahbintr ", sc->sc_dev.dv_xname);
#endif /* AHBDEBUG */
if ((bus_io_read_1(bc, ioh, G2STAT) & G2STAT_INT_PEND) == 0)
@ -573,10 +573,10 @@ ahbintr(arg)
case AHB_ECB_OK:
case AHB_ECB_RECOVERED:
case AHB_ECB_ERR:
ecb = ahb_ecb_phys_kv(ahb, mboxval);
ecb = ahb_ecb_phys_kv(sc, mboxval);
if (!ecb) {
printf("%s: BAD ECB RETURNED!\n",
ahb->sc_dev.dv_xname);
sc->sc_dev.dv_xname);
continue; /* whatever it was, it'll timeout */
}
break;
@ -584,13 +584,13 @@ ahbintr(arg)
case AHB_IMMED_ERR:
ecb->flags |= ECB_IMMED_FAIL;
case AHB_IMMED_OK:
ecb = ahb->immed_ecb;
ahb->immed_ecb = 0;
ecb = sc->immed_ecb;
sc->immed_ecb = 0;
break;
default:
printf("%s: unexpected interrupt %x\n",
ahb->sc_dev.dv_xname, ahbstat);
sc->sc_dev.dv_xname, ahbstat);
ecb = 0;
break;
}
@ -602,7 +602,7 @@ ahbintr(arg)
printf("<int ecb(%x)>", ecb);
#endif /*AHBDEBUG */
untimeout(ahb_timeout, ecb);
ahb_done(ahb, ecb);
ahb_done(sc, ecb);
}
if ((bus_io_read_1(bc, ioh, G2STAT) & G2STAT_INT_PEND) == 0)
@ -615,8 +615,8 @@ ahbintr(arg)
* how the operation went.
*/
void
ahb_done(ahb, ecb)
struct ahb_softc *ahb;
ahb_done(sc, ecb)
struct ahb_softc *sc;
struct ahb_ecb *ecb;
{
struct ahb_ecb_status *stat = &ecb->ecb_status;
@ -629,7 +629,7 @@ ahb_done(ahb, ecb)
* into the xfer and call whoever started it
*/
if ((xs->flags & INUSE) == 0) {
printf("%s: exiting but not in use!\n", ahb->sc_dev.dv_xname);
printf("%s: exiting but not in use!\n", sc->sc_dev.dv_xname);
Debugger();
}
if (ecb->flags & ECB_IMMED) {
@ -653,7 +653,7 @@ ahb_done(ahb, ecb)
break;
default: /* Other scsi protocol messes */
printf("%s: host_stat %x\n",
ahb->sc_dev.dv_xname, stat->host_stat);
sc->sc_dev.dv_xname, stat->host_stat);
xs->error = XS_DRIVER_STUFFUP;
}
} else if (stat->target_stat != SCSI_OK) {
@ -669,7 +669,7 @@ ahb_done(ahb, ecb)
break;
default:
printf("%s: target_stat %x\n",
ahb->sc_dev.dv_xname, stat->target_stat);
sc->sc_dev.dv_xname, stat->target_stat);
xs->error = XS_DRIVER_STUFFUP;
}
} else
@ -677,7 +677,7 @@ ahb_done(ahb, ecb)
}
done:
xs->flags |= ITSDONE;
ahb_free_ecb(ahb, ecb, xs->flags);
ahb_free_ecb(sc, ecb, xs->flags);
scsi_done(xs);
}
@ -686,8 +686,8 @@ done:
* free list.
*/
void
ahb_free_ecb(ahb, ecb, flags)
struct ahb_softc *ahb;
ahb_free_ecb(sc, ecb, flags)
struct ahb_softc *sc;
struct ahb_ecb *ecb;
int flags;
{
@ -696,21 +696,21 @@ ahb_free_ecb(ahb, ecb, flags)
s = splbio();
ecb->flags = ECB_FREE;
TAILQ_INSERT_HEAD(&ahb->free_ecb, ecb, chain);
TAILQ_INSERT_HEAD(&sc->free_ecb, ecb, chain);
/*
* If there were none, wake anybody waiting for one to come free,
* starting with queued entries.
*/
if (ecb->chain.tqe_next == 0)
wakeup(&ahb->free_ecb);
wakeup(&sc->free_ecb);
splx(s);
}
static inline void
ahb_init_ecb(ahb, ecb)
struct ahb_softc *ahb;
ahb_init_ecb(sc, ecb)
struct ahb_softc *sc;
struct ahb_ecb *ecb;
{
int hashnum;
@ -722,13 +722,13 @@ ahb_init_ecb(ahb, ecb)
*/
ecb->hashkey = KVTOPHYS(ecb);
hashnum = ECB_HASH(ecb->hashkey);
ecb->nexthash = ahb->ecbhash[hashnum];
ahb->ecbhash[hashnum] = ecb;
ecb->nexthash = sc->ecbhash[hashnum];
sc->ecbhash[hashnum] = ecb;
}
static inline void
ahb_reset_ecb(ahb, ecb)
struct ahb_softc *ahb;
ahb_reset_ecb(sc, ecb)
struct ahb_softc *sc;
struct ahb_ecb *ecb;
{
@ -741,8 +741,8 @@ ahb_reset_ecb(ahb, ecb)
* hash table too otherwise either return an error or sleep.
*/
struct ahb_ecb *
ahb_get_ecb(ahb, flags)
struct ahb_softc *ahb;
ahb_get_ecb(sc, flags)
struct ahb_softc *sc;
int flags;
{
struct ahb_ecb *ecb;
@ -755,29 +755,29 @@ ahb_get_ecb(ahb, flags)
* but only if we can't allocate a new one.
*/
for (;;) {
ecb = ahb->free_ecb.tqh_first;
ecb = sc->free_ecb.tqh_first;
if (ecb) {
TAILQ_REMOVE(&ahb->free_ecb, ecb, chain);
TAILQ_REMOVE(&sc->free_ecb, ecb, chain);
break;
}
if (ahb->numecbs < AHB_ECB_MAX) {
if (sc->numecbs < AHB_ECB_MAX) {
if (ecb = (struct ahb_ecb *) malloc(sizeof(struct ahb_ecb),
M_TEMP, M_NOWAIT)) {
ahb_init_ecb(ahb, ecb);
ahb->numecbs++;
ahb_init_ecb(sc, ecb);
sc->numecbs++;
} else {
printf("%s: can't malloc ecb\n",
ahb->sc_dev.dv_xname);
sc->sc_dev.dv_xname);
goto out;
}
break;
}
if ((flags & SCSI_NOSLEEP) != 0)
goto out;
tsleep(&ahb->free_ecb, PRIBIO, "ahbecb", 0);
tsleep(&sc->free_ecb, PRIBIO, "ahbecb", 0);
}
ahb_reset_ecb(ahb, ecb);
ahb_reset_ecb(sc, ecb);
ecb->flags = ECB_ACTIVE;
out:
@ -789,12 +789,12 @@ out:
* given a physical address, find the ecb that it corresponds to.
*/
struct ahb_ecb *
ahb_ecb_phys_kv(ahb, ecb_phys)
struct ahb_softc *ahb;
ahb_ecb_phys_kv(sc, ecb_phys)
struct ahb_softc *sc;
physaddr ecb_phys;
{
int hashnum = ECB_HASH(ecb_phys);
struct ahb_ecb *ecb = ahb->ecbhash[hashnum];
struct ahb_ecb *ecb = sc->ecbhash[hashnum];
while (ecb) {
if (ecb->hashkey == ecb_phys)
@ -808,10 +808,10 @@ ahb_ecb_phys_kv(ahb, ecb_phys)
* Start the board, ready for normal operation
*/
int
ahb_find(bc, ioh, ahb)
ahb_find(bc, ioh, sc)
bus_chipset_tag_t bc;
bus_io_handle_t ioh;
struct ahb_softc *ahb;
struct ahb_softc *sc;
{
u_char intdef;
int i, irq, busid;
@ -888,9 +888,9 @@ ahb_find(bc, ioh, ahb)
busid = (bus_io_read_1(bc, ioh, SCSIDEF) & HSCSIID);
/* if we want to fill in softc, do so now */
if (ahb != NULL) {
ahb->sc_irq = irq;
ahb->ahb_scsi_dev = busid;
if (sc != NULL) {
sc->sc_irq = irq;
sc->ahb_scsi_dev = busid;
}
/*
@ -900,8 +900,8 @@ ahb_find(bc, ioh, ahb)
}
void
ahb_init(ahb)
struct ahb_softc *ahb;
ahb_init(sc)
struct ahb_softc *sc;
{
}
@ -925,7 +925,7 @@ ahb_scsi_cmd(xs)
struct scsi_xfer *xs;
{
struct scsi_link *sc_link = xs->sc_link;
struct ahb_softc *ahb = sc_link->adapter_softc;
struct ahb_softc *sc = sc_link->adapter_softc;
struct ahb_ecb *ecb;
struct ahb_dma_seg *sg;
int seg; /* scatter gather seg being worked on */
@ -942,11 +942,11 @@ ahb_scsi_cmd(xs)
*/
flags = xs->flags;
if ((flags & (ITSDONE|INUSE)) != INUSE) {
printf("%s: done or not in use?\n", ahb->sc_dev.dv_xname);
printf("%s: done or not in use?\n", sc->sc_dev.dv_xname);
xs->flags &= ~ITSDONE;
xs->flags |= INUSE;
}
if ((ecb = ahb_get_ecb(ahb, flags)) == NULL) {
if ((ecb = ahb_get_ecb(sc, flags)) == NULL) {
xs->error = XS_DRIVER_STUFFUP;
return TRY_AGAIN_LATER;
}
@ -960,13 +960,13 @@ ahb_scsi_cmd(xs)
*/
if (flags & SCSI_RESET) {
ecb->flags |= ECB_IMMED;
if (ahb->immed_ecb)
if (sc->immed_ecb)
return TRY_AGAIN_LATER;
ahb->immed_ecb = ecb;
sc->immed_ecb = ecb;
s = splbio();
ahb_send_immed(ahb, sc_link->target, AHB_TARG_RESET);
ahb_send_immed(sc, sc_link->target, AHB_TARG_RESET);
if ((flags & SCSI_POLL) == 0) {
timeout(ahb_timeout, ecb, (xs->timeout * hz) / 1000);
@ -979,7 +979,7 @@ ahb_scsi_cmd(xs)
/*
* If we can't use interrupts, poll on completion
*/
if (ahb_poll(ahb, xs, xs->timeout))
if (ahb_poll(sc, xs, xs->timeout))
ahb_timeout(ecb);
return COMPLETE;
}
@ -1080,9 +1080,9 @@ ahb_scsi_cmd(xs)
* there's still data, must have run out of segs!
*/
printf("%s: ahb_scsi_cmd, more than %d dma segs\n",
ahb->sc_dev.dv_xname, AHB_NSEG);
sc->sc_dev.dv_xname, AHB_NSEG);
xs->error = XS_DRIVER_STUFFUP;
ahb_free_ecb(ahb, ecb, flags);
ahb_free_ecb(sc, ecb, flags);
return COMPLETE;
}
} else { /* No data xfer, use non S/G values */
@ -1099,7 +1099,7 @@ ahb_scsi_cmd(xs)
s = splbio();
ahb_send_mbox(ahb, OP_START_ECB, ecb);
ahb_send_mbox(sc, OP_START_ECB, ecb);
/*
* Usually return SUCCESSFULLY QUEUED
@ -1115,9 +1115,9 @@ ahb_scsi_cmd(xs)
/*
* If we can't use interrupts, poll on completion
*/
if (ahb_poll(ahb, xs, xs->timeout)) {
if (ahb_poll(sc, xs, xs->timeout)) {
ahb_timeout(ecb);
if (ahb_poll(ahb, xs, 2000))
if (ahb_poll(sc, xs, 2000))
ahb_timeout(ecb);
}
return COMPLETE;
@ -1130,7 +1130,7 @@ ahb_timeout(arg)
struct ahb_ecb *ecb = arg;
struct scsi_xfer *xs = ecb->xs;
struct scsi_link *sc_link = xs->sc_link;
struct ahb_softc *ahb = sc_link->adapter_softc;
struct ahb_softc *sc = sc_link->adapter_softc;
int s;
sc_print_addr(sc_link);
@ -1142,7 +1142,7 @@ ahb_timeout(arg)
printf("\n");
ecb->xs->retries = 0; /* I MEAN IT ! */
ecb->flags |= ECB_IMMED_FAIL;
ahb_done(ahb, ecb);
ahb_done(sc, ecb);
splx(s);
return;
}
@ -1156,13 +1156,13 @@ ahb_timeout(arg)
/* abort timed out */
printf(" AGAIN\n");
ecb->xs->retries = 0; /* I MEAN IT ! */
ahb_done(ahb, ecb);
ahb_done(sc, ecb);
} else {
/* abort the operation that has timed out */
printf("\n");
ecb->xs->error = XS_TIMEOUT;
ecb->flags = ECB_ABORTED;
ahb_send_mbox(ahb, OP_ABORT_ECB, ecb);
ahb_send_mbox(sc, OP_ABORT_ECB, ecb);
/* 2 secs for the abort */
if ((xs->flags & SCSI_POLL) == 0)
timeout(ahb_timeout, ecb, 2 * hz);
@ -1185,14 +1185,14 @@ ahb_print_ecb(ecb)
}
void
ahb_print_active_ecb(ahb)
struct ahb_softc *ahb;
ahb_print_active_ecb(sc)
struct ahb_softc *sc;
{
struct ahb_ecb *ecb;
int i = 0;
while (i++ < ECB_HASH_SIZE) {
ecb = ahb->ecb_hash_list[i];
ecb = sc->ecb_hash_list[i];
while (ecb) {
if (ecb->flags != ECB_FREE)
ahb_print_ecb(ecb);