Lock ncr(4) and mark it MPSAFE along with various other fixes:
- Use bus_*() instead of bus_space_*(). - Use device_printf(). - Remove unused global variables and the extra warning suppression they required. - Use callout() instead of timeout(). Reviewed by: se
This commit is contained in:
parent
5d43fd685b
commit
9de2fdafa8
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=272121
@ -1949,8 +1949,7 @@ dev/nand/nandsim_ctrl.c optional nandsim nand
|
||||
dev/nand/nandsim_log.c optional nandsim nand
|
||||
dev/nand/nandsim_swap.c optional nandsim nand
|
||||
dev/nand/nfc_if.m optional nand
|
||||
dev/ncr/ncr.c optional ncr pci \
|
||||
compile-with "${NORMAL_C} -Wno-unused"
|
||||
dev/ncr/ncr.c optional ncr pci
|
||||
dev/ncv/ncr53c500.c optional ncv
|
||||
dev/ncv/ncr53c500_pccard.c optional ncv pccard
|
||||
dev/netmap/netmap.c optional netmap
|
||||
|
@ -43,11 +43,6 @@
|
||||
__FBSDID("$FreeBSD$");
|
||||
|
||||
|
||||
#define NCR_DATE "pl30 98/1/1"
|
||||
|
||||
#define NCR_VERSION (2)
|
||||
#define MAX_UNITS (16)
|
||||
|
||||
#define NCR_GETCC_WITHMSG
|
||||
|
||||
#if defined (__FreeBSD__) && defined(_KERNEL)
|
||||
@ -274,25 +269,22 @@ __FBSDID("$FreeBSD$");
|
||||
**==========================================================
|
||||
*/
|
||||
|
||||
#define INB(r) bus_space_read_1(np->bst, np->bsh, offsetof(struct ncr_reg, r))
|
||||
#define INW(r) bus_space_read_2(np->bst, np->bsh, offsetof(struct ncr_reg, r))
|
||||
#define INL(r) bus_space_read_4(np->bst, np->bsh, offsetof(struct ncr_reg, r))
|
||||
#define INB(r) bus_read_1(np->reg_res, offsetof(struct ncr_reg, r))
|
||||
#define INW(r) bus_read_2(np->reg_res, offsetof(struct ncr_reg, r))
|
||||
#define INL(r) bus_read_4(np->reg_res, offsetof(struct ncr_reg, r))
|
||||
|
||||
#define OUTB(r, val) bus_space_write_1(np->bst, np->bsh, \
|
||||
offsetof(struct ncr_reg, r), val)
|
||||
#define OUTW(r, val) bus_space_write_2(np->bst, np->bsh, \
|
||||
offsetof(struct ncr_reg, r), val)
|
||||
#define OUTL(r, val) bus_space_write_4(np->bst, np->bsh, \
|
||||
offsetof(struct ncr_reg, r), val)
|
||||
#define OUTL_OFF(o, val) bus_space_write_4(np->bst, np->bsh, o, val)
|
||||
#define OUTB(r, val) bus_write_1(np->reg_res, offsetof(struct ncr_reg, r), val)
|
||||
#define OUTW(r, val) bus_write_2(np->reg_res, offsetof(struct ncr_reg, r), val)
|
||||
#define OUTL(r, val) bus_write_4(np->reg_res, offsetof(struct ncr_reg, r), val)
|
||||
#define OUTL_OFF(o, val) bus_write_4(np->reg_res, o, val)
|
||||
|
||||
#define INB_OFF(o) bus_space_read_1(np->bst, np->bsh, o)
|
||||
#define INW_OFF(o) bus_space_read_2(np->bst, np->bsh, o)
|
||||
#define INL_OFF(o) bus_space_read_4(np->bst, np->bsh, o)
|
||||
#define INB_OFF(o) bus_read_1(np->reg_res, o)
|
||||
#define INW_OFF(o) bus_read_2(np->reg_res, o)
|
||||
#define INL_OFF(o) bus_read_4(np->reg_res, o)
|
||||
|
||||
#define READSCRIPT_OFF(base, off) \
|
||||
(base ? *((volatile u_int32_t *)((volatile char *)base + (off))) : \
|
||||
bus_space_read_4(np->bst2, np->bsh2, off))
|
||||
bus_read_4(np->sram_res, off))
|
||||
|
||||
#define WRITESCRIPT_OFF(base, off, val) \
|
||||
do { \
|
||||
@ -300,7 +292,7 @@ __FBSDID("$FreeBSD$");
|
||||
*((volatile u_int32_t *) \
|
||||
((volatile char *)base + (off))) = (val); \
|
||||
else \
|
||||
bus_space_write_4(np->bst2, np->bsh2, off, val); \
|
||||
bus_write_4(np->sram_res, off, val); \
|
||||
} while (0)
|
||||
|
||||
#define READSCRIPT(r) \
|
||||
@ -974,7 +966,7 @@ struct ncb {
|
||||
*/
|
||||
struct head header;
|
||||
|
||||
int unit;
|
||||
device_t dev;
|
||||
|
||||
/*-----------------------------------------------
|
||||
** Scripts ..
|
||||
@ -999,13 +991,9 @@ struct ncb {
|
||||
*/
|
||||
int reg_rid;
|
||||
struct resource *reg_res;
|
||||
bus_space_tag_t bst;
|
||||
bus_space_handle_t bsh;
|
||||
|
||||
int sram_rid;
|
||||
struct resource *sram_res;
|
||||
bus_space_tag_t bst2;
|
||||
bus_space_handle_t bsh2;
|
||||
|
||||
struct resource *irq_res;
|
||||
void *irq_handle;
|
||||
@ -1086,7 +1074,7 @@ struct ncb {
|
||||
u_short ticks;
|
||||
u_short latetime;
|
||||
time_t lasttime;
|
||||
struct callout_handle timeout_ch;
|
||||
struct callout timer;
|
||||
|
||||
/*-----------------------------------------------
|
||||
** Debug and profiling
|
||||
@ -1129,6 +1117,7 @@ struct ncb {
|
||||
*/
|
||||
u_char maxwide;
|
||||
|
||||
struct mtx lock;
|
||||
#ifdef NCR_IOMAPPED
|
||||
/*
|
||||
** address of the ncr control registers in io space
|
||||
@ -1261,6 +1250,7 @@ static u_int32_t ncr_info(int unit);
|
||||
#endif
|
||||
static void ncr_init(ncb_p np, char * msg, u_long code);
|
||||
static void ncr_intr(void *vnp);
|
||||
static void ncr_intr_locked(ncb_p np);
|
||||
static void ncr_int_ma(ncb_p np, u_char dstat);
|
||||
static void ncr_int_sir(ncb_p np);
|
||||
static void ncr_int_sto(ncb_p np);
|
||||
@ -1299,12 +1289,6 @@ static int ncr_attach(device_t dev);
|
||||
**==========================================================
|
||||
*/
|
||||
|
||||
static const u_long ncr_version = NCR_VERSION * 11
|
||||
+ (u_long) sizeof (struct ncb) * 7
|
||||
+ (u_long) sizeof (struct nccb) * 5
|
||||
+ (u_long) sizeof (struct lcb) * 3
|
||||
+ (u_long) sizeof (struct tcb) * 2;
|
||||
|
||||
#ifdef _KERNEL
|
||||
|
||||
static int ncr_debug = SCSI_NCR_DEBUG;
|
||||
@ -1335,13 +1319,6 @@ static int ncr_cache; /* to be aligned _NOT_ static */
|
||||
#define NCR_1510D_ID (0x000a1000ul)
|
||||
|
||||
|
||||
static char *ncr_name (ncb_p np)
|
||||
{
|
||||
static char name[10];
|
||||
snprintf(name, sizeof(name), "ncr%d", np->unit);
|
||||
return (name);
|
||||
}
|
||||
|
||||
/*==========================================================
|
||||
**
|
||||
**
|
||||
@ -3017,8 +2994,8 @@ static void ncr_script_copy_and_bind (ncb_p np, ncrcmd *src, ncrcmd *dst, int le
|
||||
*/
|
||||
|
||||
if (opcode == 0) {
|
||||
printf ("%s: ERROR0 IN SCRIPT at %d.\n",
|
||||
ncr_name(np), (int) (src-start-1));
|
||||
device_printf(np->dev, "ERROR0 IN SCRIPT at %d.\n",
|
||||
(int)(src - start - 1));
|
||||
DELAY (1000000);
|
||||
};
|
||||
|
||||
@ -3043,8 +3020,9 @@ static void ncr_script_copy_and_bind (ncb_p np, ncrcmd *src, ncrcmd *dst, int le
|
||||
if ((tmp2 & RELOC_MASK) == RELOC_KVAR)
|
||||
tmp2 = 0;
|
||||
if ((tmp1 ^ tmp2) & 3) {
|
||||
printf ("%s: ERROR1 IN SCRIPT at %d.\n",
|
||||
ncr_name(np), (int) (src-start-1));
|
||||
device_printf(np->dev,
|
||||
"ERROR1 IN SCRIPT at %d.\n",
|
||||
(int)(src - start - 1));
|
||||
DELAY (1000000);
|
||||
}
|
||||
/*
|
||||
@ -3368,14 +3346,16 @@ ncr_attach (device_t dev)
|
||||
** allocate and initialize structures.
|
||||
*/
|
||||
|
||||
np->unit = device_get_unit(dev);
|
||||
np->dev = dev;
|
||||
mtx_init(&np->lock, "ncr", NULL, MTX_DEF);
|
||||
callout_init_mtx(&np->timer, &np->lock, 0);
|
||||
|
||||
/*
|
||||
** Try to map the controller chip to
|
||||
** virtual and physical memory.
|
||||
*/
|
||||
|
||||
np->reg_rid = 0x14;
|
||||
np->reg_rid = PCIR_BAR(1);
|
||||
np->reg_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
|
||||
&np->reg_rid, RF_ACTIVE);
|
||||
if (!np->reg_res) {
|
||||
@ -3384,15 +3364,10 @@ ncr_attach (device_t dev)
|
||||
}
|
||||
|
||||
/*
|
||||
** Make the controller's registers available.
|
||||
** Now the INB INW INL OUTB OUTW OUTL macros
|
||||
** can be used safely.
|
||||
*/
|
||||
|
||||
np->bst = rman_get_bustag(np->reg_res);
|
||||
np->bsh = rman_get_bushandle(np->reg_res);
|
||||
|
||||
|
||||
#ifdef NCR_IOMAPPED
|
||||
/*
|
||||
** Try to map the controller chip into iospace.
|
||||
@ -3463,8 +3438,7 @@ ncr_attach (device_t dev)
|
||||
|
||||
#ifdef NCR_TEKRAM_EEPROM
|
||||
if (bootverbose) {
|
||||
printf ("%s: Tekram EEPROM read %s\n",
|
||||
ncr_name(np),
|
||||
device_printf(dev, "Tekram EEPROM read %s\n",
|
||||
read_tekram_eeprom (np, NULL) ?
|
||||
"succeeded" : "failed");
|
||||
}
|
||||
@ -3572,7 +3546,7 @@ ncr_attach (device_t dev)
|
||||
** Get on-chip SRAM address, if supported
|
||||
*/
|
||||
if ((np->features & FE_RAM) && sizeof(struct script) <= 4096) {
|
||||
np->sram_rid = 0x18;
|
||||
np->sram_rid = PCIR_BAR(2);
|
||||
np->sram_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY,
|
||||
&np->sram_rid,
|
||||
RF_ACTIVE);
|
||||
@ -3584,8 +3558,6 @@ ncr_attach (device_t dev)
|
||||
if (np->sram_res != NULL) {
|
||||
np->script = NULL;
|
||||
np->p_script = rman_get_start(np->sram_res);
|
||||
np->bst2 = rman_get_bustag(np->sram_res);
|
||||
np->bsh2 = rman_get_bushandle(np->sram_res);
|
||||
} else if (sizeof (struct script) > PAGE_SIZE) {
|
||||
np->script = (struct script*) contigmalloc
|
||||
(round_page(sizeof (struct script)), M_DEVBUF, M_WAITOK,
|
||||
@ -3617,15 +3589,16 @@ ncr_attach (device_t dev)
|
||||
|
||||
if (!cachelnsz) {
|
||||
cachelnsz = 8;
|
||||
printf("%s: setting PCI cache line size register to %d.\n",
|
||||
ncr_name(np), (int)cachelnsz);
|
||||
device_printf(dev,
|
||||
"setting PCI cache line size register to %d.\n",
|
||||
(int)cachelnsz);
|
||||
pci_write_config(dev, PCIR_CACHELNSZ, cachelnsz, 1);
|
||||
}
|
||||
|
||||
if (!(command & PCIM_CMD_MWRICEN)) {
|
||||
command |= PCIM_CMD_MWRICEN;
|
||||
printf("%s: setting PCI command write and invalidate.\n",
|
||||
ncr_name(np));
|
||||
device_printf(dev,
|
||||
"setting PCI command write and invalidate.\n");
|
||||
pci_write_config(dev, PCIR_COMMAND, command, 2);
|
||||
}
|
||||
}
|
||||
@ -3662,8 +3635,9 @@ ncr_attach (device_t dev)
|
||||
** Bells and whistles ;-)
|
||||
*/
|
||||
if (bootverbose)
|
||||
printf("%s: minsync=%d, maxsync=%d, maxoffs=%d, %d dwords burst, %s dma fifo\n",
|
||||
ncr_name(np), np->minsync, np->maxsync, np->maxoffs,
|
||||
device_printf(dev,
|
||||
"minsync=%d, maxsync=%d, maxoffs=%d, %d dwords burst, %s dma fifo\n",
|
||||
np->minsync, np->maxsync, np->maxoffs,
|
||||
burst_length(np->maxburst),
|
||||
(np->rv_ctest5 & DFS) ? "large" : "normal");
|
||||
|
||||
@ -3671,8 +3645,7 @@ ncr_attach (device_t dev)
|
||||
** Print some complementary information that can be helpfull.
|
||||
*/
|
||||
if (bootverbose)
|
||||
printf("%s: %s, %s IRQ driver%s\n",
|
||||
ncr_name(np),
|
||||
device_printf(dev, "%s, %s IRQ driver%s\n",
|
||||
np->rv_stest2 & 0x20 ? "differential" : "single-ended",
|
||||
np->rv_dcntl & IRQM ? "totem pole" : "open drain",
|
||||
np->sram_res ? ", using on-chip SRAM" : "");
|
||||
@ -3759,8 +3732,8 @@ ncr_attach (device_t dev)
|
||||
device_printf(dev,
|
||||
"interruptless mode: reduced performance.\n");
|
||||
} else {
|
||||
bus_setup_intr(dev, np->irq_res, INTR_TYPE_CAM | INTR_ENTROPY,
|
||||
NULL, ncr_intr, np, &np->irq_handle);
|
||||
bus_setup_intr(dev, np->irq_res, INTR_TYPE_CAM | INTR_ENTROPY |
|
||||
INTR_MPSAFE, NULL, ncr_intr, np, &np->irq_handle);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -3776,16 +3749,17 @@ ncr_attach (device_t dev)
|
||||
** Now tell the generic SCSI layer
|
||||
** about our bus.
|
||||
*/
|
||||
np->sim = cam_sim_alloc(ncr_action, ncr_poll, "ncr", np, np->unit,
|
||||
&Giant, 1, MAX_TAGS, devq);
|
||||
np->sim = cam_sim_alloc(ncr_action, ncr_poll, "ncr", np,
|
||||
device_get_unit(dev), &np->lock, 1, MAX_TAGS, devq);
|
||||
if (np->sim == NULL) {
|
||||
cam_simq_free(devq);
|
||||
return ENOMEM;
|
||||
}
|
||||
|
||||
|
||||
mtx_lock(&np->lock);
|
||||
if (xpt_bus_register(np->sim, dev, 0) != CAM_SUCCESS) {
|
||||
cam_sim_free(np->sim, /*free_devq*/ TRUE);
|
||||
mtx_unlock(&np->lock);
|
||||
return ENOMEM;
|
||||
}
|
||||
|
||||
@ -3794,6 +3768,7 @@ ncr_attach (device_t dev)
|
||||
CAM_LUN_WILDCARD) != CAM_REQ_CMP) {
|
||||
xpt_bus_deregister(cam_sim_path(np->sim));
|
||||
cam_sim_free(np->sim, /*free_devq*/TRUE);
|
||||
mtx_unlock(&np->lock);
|
||||
return ENOMEM;
|
||||
}
|
||||
|
||||
@ -3802,6 +3777,7 @@ ncr_attach (device_t dev)
|
||||
*/
|
||||
ncr_timeout (np);
|
||||
np->lasttime=0;
|
||||
mtx_unlock(&np->lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -3820,7 +3796,15 @@ ncr_intr(vnp)
|
||||
void *vnp;
|
||||
{
|
||||
ncb_p np = vnp;
|
||||
int oldspl = splcam();
|
||||
|
||||
mtx_lock(&np->lock);
|
||||
ncr_intr_locked(np);
|
||||
mtx_unlock(&np->lock);
|
||||
}
|
||||
|
||||
static void
|
||||
ncr_intr_locked(ncb_p np)
|
||||
{
|
||||
|
||||
if (DEBUG_FLAGS & DEBUG_TINY) printf ("[");
|
||||
|
||||
@ -3836,8 +3820,6 @@ ncr_intr(vnp)
|
||||
};
|
||||
|
||||
if (DEBUG_FLAGS & DEBUG_TINY) printf ("]\n");
|
||||
|
||||
splx (oldspl);
|
||||
}
|
||||
|
||||
/*==========================================================
|
||||
@ -3856,6 +3838,7 @@ ncr_action (struct cam_sim *sim, union ccb *ccb)
|
||||
ncb_p np;
|
||||
|
||||
np = (ncb_p) cam_sim_softc(sim);
|
||||
mtx_assert(&np->lock, MA_OWNED);
|
||||
|
||||
switch (ccb->ccb_h.func_code) {
|
||||
/* Common cases first */
|
||||
@ -3864,7 +3847,6 @@ ncr_action (struct cam_sim *sim, union ccb *ccb)
|
||||
nccb_p cp;
|
||||
lcb_p lp;
|
||||
tcb_p tp;
|
||||
int oldspl;
|
||||
struct ccb_scsiio *csio;
|
||||
u_int8_t *msgptr;
|
||||
u_int msglen;
|
||||
@ -3877,15 +3859,12 @@ ncr_action (struct cam_sim *sim, union ccb *ccb)
|
||||
tp = &np->target[ccb->ccb_h.target_id];
|
||||
csio = &ccb->csio;
|
||||
|
||||
oldspl = splcam();
|
||||
|
||||
/*
|
||||
* Last time we need to check if this CCB needs to
|
||||
* be aborted.
|
||||
*/
|
||||
if ((ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_INPROG) {
|
||||
xpt_done(ccb);
|
||||
splx(oldspl);
|
||||
return;
|
||||
}
|
||||
ccb->ccb_h.status |= CAM_SIM_QUEUED;
|
||||
@ -4040,7 +4019,6 @@ ncr_action (struct cam_sim *sim, union ccb *ccb)
|
||||
if (segments < 0) {
|
||||
ccb->ccb_h.status = CAM_REQ_TOO_BIG;
|
||||
ncr_free_nccb(np, cp);
|
||||
splx(oldspl);
|
||||
xpt_done(ccb);
|
||||
return;
|
||||
}
|
||||
@ -4153,8 +4131,8 @@ ncr_action (struct cam_sim *sim, union ccb *ccb)
|
||||
np->squeueput = qidx;
|
||||
|
||||
if(DEBUG_FLAGS & DEBUG_QUEUE)
|
||||
printf("%s: queuepos=%d tryoffset=%d.\n",
|
||||
ncr_name (np), np->squeueput,
|
||||
device_printf(np->dev, "queuepos=%d tryoffset=%d.\n",
|
||||
np->squeueput,
|
||||
(unsigned)(READSCRIPT(startpos[0]) -
|
||||
(NCB_SCRIPTH_PHYS (np, tryloop))));
|
||||
|
||||
@ -4163,11 +4141,6 @@ ncr_action (struct cam_sim *sim, union ccb *ccb)
|
||||
** Wake it up.
|
||||
*/
|
||||
OUTB (nc_istat, SIGP);
|
||||
|
||||
/*
|
||||
** and reenable interrupts
|
||||
*/
|
||||
splx (oldspl);
|
||||
break;
|
||||
}
|
||||
case XPT_RESET_DEV: /* Bus Device Reset the specified SCSI device */
|
||||
@ -4185,7 +4158,6 @@ ncr_action (struct cam_sim *sim, union ccb *ccb)
|
||||
struct ccb_trans_settings *cts = &ccb->cts;
|
||||
tcb_p tp;
|
||||
u_int update_type;
|
||||
int s;
|
||||
struct ccb_trans_settings_scsi *scsi =
|
||||
&cts->proto_specific.scsi;
|
||||
struct ccb_trans_settings_spi *spi =
|
||||
@ -4197,7 +4169,6 @@ ncr_action (struct cam_sim *sim, union ccb *ccb)
|
||||
if (cts->type == CTS_TYPE_USER_SETTINGS)
|
||||
update_type |= NCR_TRANS_USER;
|
||||
|
||||
s = splcam();
|
||||
tp = &np->target[ccb->ccb_h.target_id];
|
||||
/* Tag and disc enables */
|
||||
if ((spi->valid & CTS_SPI_VALID_DISC) != 0) {
|
||||
@ -4271,7 +4242,6 @@ ncr_action (struct cam_sim *sim, union ccb *ccb)
|
||||
if ((spi->valid & CTS_SPI_VALID_BUS_WIDTH) != 0)
|
||||
tp->tinfo.goal.width = spi->bus_width;
|
||||
}
|
||||
splx(s);
|
||||
ccb->ccb_h.status = CAM_REQ_CMP;
|
||||
xpt_done(ccb);
|
||||
break;
|
||||
@ -4282,7 +4252,6 @@ ncr_action (struct cam_sim *sim, union ccb *ccb)
|
||||
struct ccb_trans_settings *cts = &ccb->cts;
|
||||
struct ncr_transinfo *tinfo;
|
||||
tcb_p tp = &np->target[ccb->ccb_h.target_id];
|
||||
int s;
|
||||
struct ccb_trans_settings_scsi *scsi =
|
||||
&cts->proto_specific.scsi;
|
||||
struct ccb_trans_settings_spi *spi =
|
||||
@ -4293,7 +4262,6 @@ ncr_action (struct cam_sim *sim, union ccb *ccb)
|
||||
cts->transport = XPORT_SPI;
|
||||
cts->transport_version = 2;
|
||||
|
||||
s = splcam();
|
||||
if (cts->type == CTS_TYPE_CURRENT_SETTINGS) {
|
||||
tinfo = &tp->tinfo.current;
|
||||
if (tp->tinfo.disc_tag & NCR_CUR_DISCENB)
|
||||
@ -4322,7 +4290,6 @@ ncr_action (struct cam_sim *sim, union ccb *ccb)
|
||||
spi->sync_offset = tinfo->offset;
|
||||
spi->bus_width = tinfo->width;
|
||||
|
||||
splx(s);
|
||||
spi->valid = CTS_SPI_VALID_SYNC_RATE
|
||||
| CTS_SPI_VALID_SYNC_OFFSET
|
||||
| CTS_SPI_VALID_BUS_WIDTH
|
||||
@ -4718,7 +4685,8 @@ ncr_init(ncb_p np, char * msg, u_long code)
|
||||
** Message.
|
||||
*/
|
||||
|
||||
if (msg) printf ("%s: restart (%s).\n", ncr_name (np), msg);
|
||||
if (msg)
|
||||
device_printf(np->dev, "restart (%s).\n", msg);
|
||||
|
||||
/*
|
||||
** Clear Start Queue
|
||||
@ -4813,7 +4781,7 @@ ncr_init(ncb_p np, char * msg, u_long code)
|
||||
static void
|
||||
ncr_poll(struct cam_sim *sim)
|
||||
{
|
||||
ncr_intr(cam_sim_softc(sim));
|
||||
ncr_intr_locked(cam_sim_softc(sim));
|
||||
}
|
||||
|
||||
|
||||
@ -5089,11 +5057,8 @@ ncr_timeout (void *arg)
|
||||
long signed t;
|
||||
nccb_p cp;
|
||||
|
||||
mtx_assert(&np->lock, MA_OWNED);
|
||||
if (np->lasttime != thistime) {
|
||||
/*
|
||||
** block ncr interrupts
|
||||
*/
|
||||
int oldspl = splcam();
|
||||
np->lasttime = thistime;
|
||||
|
||||
/*----------------------------------------------------
|
||||
@ -5143,8 +5108,8 @@ ncr_timeout (void *arg)
|
||||
cp->jump_nccb.l_cmd = (SCR_JUMP);
|
||||
if (cp->phys.header.launch.l_paddr ==
|
||||
NCB_SCRIPT_PHYS (np, select)) {
|
||||
printf ("%s: timeout nccb=%p (skip)\n",
|
||||
ncr_name (np), cp);
|
||||
device_printf(np->dev,
|
||||
"timeout nccb=%p (skip)\n", cp);
|
||||
cp->phys.header.launch.l_paddr
|
||||
= NCB_SCRIPT_PHYS (np, skip);
|
||||
};
|
||||
@ -5164,11 +5129,9 @@ ncr_timeout (void *arg)
|
||||
*/
|
||||
ncr_complete (np, cp);
|
||||
};
|
||||
splx (oldspl);
|
||||
}
|
||||
|
||||
np->timeout_ch =
|
||||
timeout (ncr_timeout, (caddr_t) np, step ? step : 1);
|
||||
callout_reset(&np->timer, step ? step : 1, ncr_timeout, np);
|
||||
|
||||
if (INB(nc_istat) & (INTF|SIP|DIP)) {
|
||||
|
||||
@ -5176,11 +5139,9 @@ ncr_timeout (void *arg)
|
||||
** Process pending interrupts.
|
||||
*/
|
||||
|
||||
int oldspl = splcam();
|
||||
if (DEBUG_FLAGS & DEBUG_TINY) printf ("{");
|
||||
ncr_exception (np);
|
||||
if (DEBUG_FLAGS & DEBUG_TINY) printf ("}");
|
||||
splx (oldspl);
|
||||
};
|
||||
}
|
||||
|
||||
@ -5245,19 +5206,20 @@ static void ncr_log_hard_error(ncb_p np, u_short sist, u_char dstat)
|
||||
script_name = "mem";
|
||||
}
|
||||
|
||||
printf ("%s:%d: ERROR (%x:%x) (%x-%x-%x) (%x/%x) @ (%s %x:%08x).\n",
|
||||
ncr_name (np), (unsigned)INB (nc_sdid)&0x0f, dstat, sist,
|
||||
device_printf(np->dev,
|
||||
"%d: ERROR (%x:%x) (%x-%x-%x) (%x/%x) @ (%s %x:%08x).\n",
|
||||
(unsigned)INB (nc_sdid)&0x0f, dstat, sist,
|
||||
(unsigned)INB (nc_socl), (unsigned)INB (nc_sbcl), (unsigned)INB (nc_sbdl),
|
||||
(unsigned)INB (nc_sxfer),(unsigned)INB (nc_scntl3), script_name, script_ofs,
|
||||
(unsigned)INL (nc_dbc));
|
||||
|
||||
if (((script_ofs & 3) == 0) &&
|
||||
(unsigned)script_ofs < script_size) {
|
||||
printf ("%s: script cmd = %08x\n", ncr_name(np),
|
||||
device_printf(np->dev, "script cmd = %08x\n",
|
||||
(int)READSCRIPT_OFF(script_base, script_ofs));
|
||||
}
|
||||
|
||||
printf ("%s: regdump:", ncr_name(np));
|
||||
device_printf(np->dev, "regdump:");
|
||||
for (i=0; i<16;i++)
|
||||
printf (" %02x", (unsigned)INB_OFF(i));
|
||||
printf (".\n");
|
||||
@ -5411,7 +5373,7 @@ static void ncr_exception (ncb_p np)
|
||||
(INB(nc_sstat1) & (FF3210) ) ||
|
||||
(INB(nc_sstat2) & (ILF1|ORF1|OLF1)) || /* wide .. */
|
||||
!(dstat & DFE)) {
|
||||
printf ("%s: have to clear fifos.\n", ncr_name (np));
|
||||
device_printf(np->dev, "have to clear fifos.\n");
|
||||
OUTB (nc_stest3, TE|CSF); /* clear scsi fifo */
|
||||
OUTB (nc_ctest3, np->rv_ctest3 | CLF);
|
||||
/* clear dma fifo */
|
||||
@ -5423,7 +5385,7 @@ static void ncr_exception (ncb_p np)
|
||||
*/
|
||||
|
||||
if (sist & HTH) {
|
||||
printf ("%s: handshake timeout\n", ncr_name(np));
|
||||
device_printf(np->dev, "handshake timeout\n");
|
||||
OUTB (nc_scntl1, CRST);
|
||||
DELAY (1000);
|
||||
OUTB (nc_scntl1, 0x00);
|
||||
@ -5466,12 +5428,11 @@ static void ncr_exception (ncb_p np)
|
||||
/*
|
||||
** info message
|
||||
*/
|
||||
printf ("%s: INFO: LDSC while IID.\n",
|
||||
ncr_name (np));
|
||||
device_printf(np->dev, "INFO: LDSC while IID.\n");
|
||||
return;
|
||||
};
|
||||
printf ("%s: target %d doesn't release the bus.\n",
|
||||
ncr_name (np), INB (nc_sdid)&0x0f);
|
||||
device_printf(np->dev, "target %d doesn't release the bus.\n",
|
||||
INB (nc_sdid)&0x0f);
|
||||
/*
|
||||
** return without restarting the NCR.
|
||||
** timeout will do the real work.
|
||||
@ -5515,8 +5476,7 @@ static void ncr_exception (ncb_p np)
|
||||
switch (i%16) {
|
||||
|
||||
case 0:
|
||||
printf ("%s: reg[%d0]: ",
|
||||
ncr_name(np),i/16);
|
||||
device_printf(np->dev, "reg[%d0]: ", i / 16);
|
||||
break;
|
||||
case 4:
|
||||
case 8:
|
||||
@ -5524,14 +5484,14 @@ static void ncr_exception (ncb_p np)
|
||||
printf (" ");
|
||||
break;
|
||||
};
|
||||
val = bus_space_read_1(np->bst, np->bsh, i);
|
||||
val = bus_read_1(np->reg_res, i);
|
||||
printf (" %x%x", val/16, val%16);
|
||||
if (i%16==15) printf (".\n");
|
||||
};
|
||||
|
||||
untimeout (ncr_timeout, (caddr_t) np, np->timeout_ch);
|
||||
callout_stop(&np->timer);
|
||||
|
||||
printf ("%s: halted!\n", ncr_name(np));
|
||||
device_printf(np->dev, "halted!\n");
|
||||
/*
|
||||
** don't restart controller ...
|
||||
*/
|
||||
@ -5678,14 +5638,16 @@ static void ncr_int_ma (ncb_p np, u_char dstat)
|
||||
cp = cp->link_nccb;
|
||||
|
||||
if (!cp) {
|
||||
printf ("%s: SCSI phase error fixup: CCB already dequeued (%p)\n",
|
||||
ncr_name (np), (void *) np->header.cp);
|
||||
return;
|
||||
device_printf(np->dev,
|
||||
"SCSI phase error fixup: CCB already dequeued (%p)\n",
|
||||
(void *)np->header.cp);
|
||||
return;
|
||||
}
|
||||
if (cp != np->header.cp) {
|
||||
printf ("%s: SCSI phase error fixup: CCB address mismatch "
|
||||
device_printf(np->dev,
|
||||
"SCSI phase error fixup: CCB address mismatch "
|
||||
"(%p != %p) np->nccb = %p\n",
|
||||
ncr_name (np), (void *)cp, (void *)np->header.cp,
|
||||
(void *)cp, (void *)np->header.cp,
|
||||
(void *)np->link_nccb);
|
||||
/* return;*/
|
||||
}
|
||||
@ -5889,7 +5851,7 @@ static void ncr_int_sir (ncb_p np)
|
||||
*/
|
||||
|
||||
if (DEBUG_FLAGS & DEBUG_RESTART)
|
||||
printf ("%s: int#%d",ncr_name (np),num);
|
||||
device_printf(np->dev, "int#%d", num);
|
||||
cp = (nccb_p) 0;
|
||||
for (i=0; i<MAX_TARGET; i++) {
|
||||
if (DEBUG_FLAGS & DEBUG_RESTART) printf (" t%d", i);
|
||||
@ -6374,7 +6336,7 @@ static void ncr_int_sir (ncb_p np)
|
||||
** else remove the interrupt.
|
||||
*/
|
||||
|
||||
printf ("%s: queue empty.\n", ncr_name (np));
|
||||
device_printf(np->dev, "queue empty.\n");
|
||||
WRITESCRIPT(start1[0], SCR_INT ^ IFFALSE (0));
|
||||
break;
|
||||
};
|
||||
@ -6424,7 +6386,7 @@ static nccb_p ncr_get_nccb
|
||||
|
||||
if (cp != NULL) {
|
||||
if (cp->magic) {
|
||||
printf("%s: Bogus free cp found\n", ncr_name(np));
|
||||
device_printf(np->dev, "Bogus free cp found\n");
|
||||
return (NULL);
|
||||
}
|
||||
cp->magic = 1;
|
||||
@ -6913,7 +6875,7 @@ static void ncr_selectclock(ncb_p np, u_char scntl3)
|
||||
}
|
||||
|
||||
if (bootverbose >= 2)
|
||||
printf ("%s: enabling clock multiplier\n", ncr_name(np));
|
||||
device_printf(np->dev, "enabling clock multiplier\n");
|
||||
|
||||
OUTB(nc_stest1, DBLEN); /* Enable clock multiplier */
|
||||
if (np->multiplier > 2) { /* Poll bit 5 of stest4 for quadrupler */
|
||||
@ -6921,7 +6883,8 @@ static void ncr_selectclock(ncb_p np, u_char scntl3)
|
||||
while (!(INB(nc_stest4) & LCKFRQ) && --i > 0)
|
||||
DELAY(20);
|
||||
if (!i)
|
||||
printf("%s: the chip cannot lock the frequency\n", ncr_name(np));
|
||||
device_printf(np->dev,
|
||||
"the chip cannot lock the frequency\n");
|
||||
} else /* Wait 20 micro-seconds for doubler */
|
||||
DELAY(20);
|
||||
OUTB(nc_stest3, HSC); /* Halt the scsi clock */
|
||||
|
Loading…
Reference in New Issue
Block a user