Use the new adapter_softc field in the scsi_link structure so that

these drivers don't need to maintain an array of configured units.

The bt driver still needs to because ISA interrupt handlers take a
unit number. :(
This commit is contained in:
Justin T. Gibbs 1996-01-07 19:24:36 +00:00
parent d026722aff
commit 7faea34be2
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=13317
3 changed files with 21 additions and 42 deletions

View File

@ -24,7 +24,7 @@
*
* commenced: Sun Sep 27 18:14:01 PDT 1992
*
* $Id: aic7xxx.c,v 1.51 1996/01/03 06:32:10 gibbs Exp $
* $Id: aic7xxx.c,v 1.52 1996/01/05 16:13:44 gibbs Exp $
*/
/*
* TODO:
@ -62,8 +62,6 @@
#define MIN(a,b) ((a < b) ? a : b)
#define ALL_TARGETS -1
struct ahc_data *ahcdata[NAHC];
u_long ahc_unit = 0;
static int ahc_debug = AHC_SHOWABORTS|AHC_SHOWMISC;
@ -248,9 +246,6 @@ static int ahc_num_syncrates =
* ahc_reset should be called before now since we assume that the card
* is paused.
*
* Sticking the ahc structure into the ahcdata array is an artifact of the
* need to index by unit. As soon as the upper level scsi code passes
* pointers instead of units down to us, this will go away.
*/
struct ahc_data *
ahc_alloc(unit, iobase, type, flags)
@ -266,26 +261,16 @@ ahc_alloc(unit, iobase, type, flags)
struct ahc_data *ahc;
if (unit >= NAHC) {
printf("ahc: unit number (%d) too high\n", unit);
return 0;
}
/*
* Allocate a storage area for us
*/
if (ahcdata[unit]) {
printf("ahc%d: memory already allocated\n", unit);
return NULL;
}
ahc = malloc(sizeof(struct ahc_data), M_TEMP, M_NOWAIT);
if (!ahc) {
printf("ahc%d: cannot malloc!\n", unit);
return NULL;
}
bzero(ahc, sizeof(struct ahc_data));
ahcdata[unit] = ahc;
ahc->unit = unit;
ahc->baseport = iobase;
ahc->type = type;
@ -300,7 +285,6 @@ void
ahc_free(ahc)
struct ahc_data *ahc;
{
ahcdata[ahc->unit] = NULL;
free(ahc, M_DEVBUF);
return;
}
@ -405,6 +389,7 @@ ahc_attach(ahc)
*/
ahc->sc_link.adapter_unit = ahc->unit;
ahc->sc_link.adapter_targ = ahc->our_id;
ahc->sc_link.adapter_softc = ahc;
ahc->sc_link.adapter = &ahc_switch;
ahc->sc_link.opennings = 2;
ahc->sc_link.device = &ahc_dev;
@ -1565,18 +1550,19 @@ static int32
ahc_scsi_cmd(xs)
struct scsi_xfer *xs;
{
struct scb *scb = NULL;
struct ahc_dma_seg *sg;
struct scb *scb;
struct ahc_dma_seg *sg;
int seg; /* scatter gather seg being worked on */
int thiskv;
physaddr thisphys, nextphys;
int unit = xs->sc_link->adapter_unit;
u_short mask = (0x01 << (xs->sc_link->target
| ((u_long)xs->sc_link->fordriver & 0x08)));
int bytes_this_seg, bytes_this_page, datalen, flags;
struct ahc_data *ahc = ahcdata[unit];
struct ahc_data *ahc;
u_short mask;
int s;
ahc = (struct ahc_data *)xs->sc_link->adapter_softc;
mask = (0x01 << (xs->sc_link->target
| ((u_long)xs->sc_link->fordriver & 0x08)));
SC_DEBUG(xs->sc_link, SDEV_DB2, ("ahc_scsi_cmd\n"));
/*
* get an scb to use. If the transfer
@ -1585,11 +1571,11 @@ ahc_scsi_cmd(xs)
*/
flags = xs->flags;
if (flags & ITSDONE) {
printf("ahc%d: Already done?", unit);
printf("ahc%d: Already done?", ahc->unit);
xs->flags &= ~ITSDONE;
}
if (!(flags & INUSE)) {
printf("ahc%d: Not in use?", unit);
printf("ahc%d: Not in use?", ahc->unit);
xs->flags |= INUSE;
}
if (!(scb = ahc_get_scb(ahc, flags))) {
@ -1691,7 +1677,7 @@ ahc_scsi_cmd(xs)
if (datalen) {
/* there's still data, must have run out of segs! */
printf("ahc_scsi_cmd%d: more than %d DMA segs\n",
unit, AHC_NSEG);
ahc->unit, AHC_NSEG);
xs->error = XS_DRIVER_STUFFUP;
ahc_free_scb(ahc, scb, flags);
return (HAD_ERROR);
@ -1707,9 +1693,6 @@ ahc_scsi_cmd(xs)
scb->datalen = 0;
}
/*
* Usually return SUCCESSFULLY QUEUED
*/
#ifdef AHC_DEBUG
if((ahc_debug & AHC_SHOWSCBS) && (xs->sc_link->target == DEBUGTARG))
ahc_print_scb(scb);
@ -2024,7 +2007,6 @@ static void
ahc_timeout(void *arg1)
{
struct scb *scb = (struct scb *)arg1;
int unit;
struct ahc_data *ahc;
int s;
@ -2036,9 +2018,8 @@ ahc_timeout(void *arg1)
return;
}
unit = scb->xs->sc_link->adapter_unit;
ahc = ahcdata[unit];
printf("ahc%d: target %d, lun %d (%s%d) timed out\n", unit
ahc = (struct ahc_data *)scb->xs->sc_link->adapter_softc;
printf("ahc%d: target %d, lun %d (%s%d) timed out\n", ahc->unit
,scb->xs->sc_link->target
,scb->xs->sc_link->lun
,scb->xs->sc_link->device->name

View File

@ -20,7 +20,7 @@
* 4. Modifications may be freely made to this file if the above conditions
* are met.
*
* $Id: aic7xxx.h,v 1.16 1995/11/05 04:50:55 gibbs Exp $
* $Id: aic7xxx.h,v 1.17 1996/01/03 06:32:12 gibbs Exp $
*/
#ifndef _AIC7XXX_H_
@ -201,8 +201,6 @@ extern int ahc_debug; /* Initialized in i386/scsi/aic7xxx.c */
UNPAUSE_SEQUENCER(ahc);
extern struct ahc_data *ahcdata[NAHC];
void ahc_reset __P((u_long iobase));
struct ahc_data *ahc_alloc __P((int unit, u_long io_base, ahc_type type, ahc_flag flags));
void ahc_free __P((struct ahc_data *));

View File

@ -12,7 +12,7 @@
* on the understanding that TFS is not responsible for the correct
* functioning of this software in any circumstances.
*
* $Id: bt.c,v 1.2 1995/12/13 14:32:59 bde Exp $
* $Id: bt.c,v 1.3 1995/12/14 14:19:16 peter Exp $
*/
/*
@ -502,6 +502,7 @@ bt_attach(bt)
*/
bt->sc_link.adapter_unit = bt->unit;
bt->sc_link.adapter_targ = bt->bt_scsi_dev;
bt->sc_link.adapter_softc = bt;
bt->sc_link.adapter = &bt_switch;
bt->sc_link.device = &bt_dev;
bt->sc_link.flags = bt->bt_bounce ? SDEV_BOUNCE : 0;
@ -1243,11 +1244,10 @@ bt_scsi_cmd(xs)
int seg; /* scatter gather seg being worked on */
int thiskv;
physaddr thisphys, nextphys;
int unit = xs->sc_link->adapter_unit;
int bytes_this_seg, bytes_this_page, datalen, flags;
struct bt_data *bt;
bt = btdata[unit];
bt = (struct bt_data *)xs->sc_link->adapter_softc;
SC_DEBUG(xs->sc_link, SDEV_DB2, ("bt_scsi_cmd\n"));
/*
@ -1257,11 +1257,11 @@ bt_scsi_cmd(xs)
*/
flags = xs->flags;
if (flags & ITSDONE) {
printf("bt%d: Already done?\n", unit);
printf("bt%d: Already done?\n", bt->unit);
xs->flags &= ~ITSDONE;
}
if (!(flags & INUSE)) {
printf("bt%d: Not in use?\n", unit);
printf("bt%d: Not in use?\n", bt->unit);
xs->flags |= INUSE;
}
if (!(ccb = bt_get_ccb(bt, flags))) {
@ -1373,7 +1373,7 @@ bt_scsi_cmd(xs)
* there's still data, must have run out of segs!
*/
printf("bt%d: bt_scsi_cmd, more than %d DMA segs\n",
unit, BT_NSEG);
bt->unit, BT_NSEG);
xs->error = XS_DRIVER_STUFFUP;
bt_free_ccb(bt, ccb, flags);
return (HAD_ERROR);