svn commit: r274760 - in head/sys: cam/scsi dev/ct dev/ncv dev/nsp dev/stg
John Baldwin
jhb at FreeBSD.org
Thu Nov 20 20:50:08 UTC 2014
Author: jhb
Date: Thu Nov 20 20:50:05 2014
New Revision: 274760
URL: https://svnweb.freebsd.org/changeset/base/274760
Log:
Lock the scsi_low code and the drivers which use it along with other
related cleanups:
- Require each driver to initalize a mutex in the scsi_low_softc that
is shared with the scsi_low code. This mutex is used for CAM SIMs,
timers, and interrupt handlers.
- Replace the osdep function switch with direct calls to the relevant
CAM functions and direct manipulation of timers via callout(9).
- Collapse the CAM-specific scsi_low_osdep_interface substructure
directly into scsi_low_softc.
- Use bus_*() instead of bus_space_*().
- Return BUS_PROBE_DEFAULT from probe routines instead of 0.
- No need to zero softcs.
- Pass 0ul and ~0ul instead of 0 and ~0 to bus_alloc_resource().
- Spell "dettach" as "detach".
- Remove unused 'dvname' variables.
- De-spl().
Tested by: no one
Modified:
head/sys/cam/scsi/scsi_low.c
head/sys/cam/scsi/scsi_low.h
head/sys/dev/ct/bshw_machdep.c
head/sys/dev/ct/ct.c
head/sys/dev/ct/ct_isa.c
head/sys/dev/ct/ct_machdep.h
head/sys/dev/ct/ctvar.h
head/sys/dev/ncv/ncr53c500.c
head/sys/dev/ncv/ncr53c500_pccard.c
head/sys/dev/ncv/ncr53c500var.h
head/sys/dev/nsp/nsp.c
head/sys/dev/nsp/nsp_pccard.c
head/sys/dev/nsp/nspvar.h
head/sys/dev/stg/tmc18c30.c
head/sys/dev/stg/tmc18c30_isa.c
head/sys/dev/stg/tmc18c30_pccard.c
head/sys/dev/stg/tmc18c30_pci.c
head/sys/dev/stg/tmc18c30_subr.c
head/sys/dev/stg/tmc18c30var.h
Modified: head/sys/cam/scsi/scsi_low.c
==============================================================================
--- head/sys/cam/scsi/scsi_low.c Thu Nov 20 20:24:30 2014 (r274759)
+++ head/sys/cam/scsi/scsi_low.c Thu Nov 20 20:50:05 2014 (r274760)
@@ -150,6 +150,8 @@ int scsi_low_version_major = 2;
int scsi_low_version_minor = 17;
static struct scsi_low_softc_tab sl_tab = LIST_HEAD_INITIALIZER(sl_tab);
+static struct mtx sl_tab_lock;
+MTX_SYSINIT(sl_tab_lock, &sl_tab_lock, "scsi low table", MTX_DEF);
/**************************************************************
* Debug, Run test and Statics
@@ -365,21 +367,10 @@ static void scsi_low_poll_cam(struct cam
void scsi_low_scsi_action_cam(struct cam_sim *, union ccb *);
static int scsi_low_attach_cam(struct scsi_low_softc *);
-static int scsi_low_world_start_cam(struct scsi_low_softc *);
-static int scsi_low_dettach_cam(struct scsi_low_softc *);
+static int scsi_low_detach_cam(struct scsi_low_softc *);
static int scsi_low_ccb_setup_cam(struct scsi_low_softc *, struct slccb *);
static int scsi_low_done_cam(struct scsi_low_softc *, struct slccb *);
-static void scsi_low_timeout_cam(struct scsi_low_softc *, int, int);
-struct scsi_low_osdep_funcs scsi_low_osdep_funcs_cam = {
- scsi_low_attach_cam,
- scsi_low_world_start_cam,
- scsi_low_dettach_cam,
- scsi_low_ccb_setup_cam,
- scsi_low_done_cam,
- scsi_low_timeout_cam
-};
-
struct scsi_low_error_code scsi_low_error_code_cam[] = {
{0, CAM_REQ_CMP},
{SENSEIO, CAM_AUTOSNS_VALID | CAM_REQ_CMP_ERR},
@@ -409,12 +400,13 @@ scsi_low_poll_cam(sim)
{
struct scsi_low_softc *slp = SIM2SLP(sim);
+ SCSI_LOW_ASSERT_LOCKED(slp);
(*slp->sl_funcs->scsi_low_poll) (slp);
- if (slp->sl_si.si_poll_count ++ >=
+ if (slp->sl_poll_count ++ >=
SCSI_LOW_CAM_POLL_HZ / SCSI_LOW_TIMEOUT_HZ)
{
- slp->sl_si.si_poll_count = 0;
+ slp->sl_poll_count = 0;
scsi_low_timeout_check(slp);
}
}
@@ -429,8 +421,9 @@ scsi_low_scsi_action_cam(sim, ccb)
struct lun_info *li;
struct slccb *cb;
u_int lun, flags, msg, target;
- int s, rv;
+ int rv;
+ SCSI_LOW_ASSERT_LOCKED(slp);
target = (u_int) (ccb->ccb_h.target_id);
lun = (u_int) ccb->ccb_h.target_lun;
@@ -469,7 +462,6 @@ scsi_low_scsi_action_cam(sim, ccb)
else
flags = CCB_SCSIIO;
- s = splcam();
li = scsi_low_alloc_li(ti, lun, 1);
if (ti->ti_setup_msg != 0)
@@ -485,7 +477,6 @@ scsi_low_scsi_action_cam(sim, ccb)
scsi_low_test_abort(slp, ti, li);
}
#endif /* SCSI_LOW_DEBUG */
- splx(s);
break;
case XPT_EN_LUN: /* Enable LUN as a target */
@@ -508,10 +499,8 @@ scsi_low_scsi_action_cam(sim, ccb)
}
#endif /* SCSI_LOW_DIAGNOSTIC */
- s = splcam();
cb = scsi_low_find_ccb(slp, target, lun, ccb->cab.abort_ccb);
rv = scsi_low_abort_ccb(slp, cb);
- splx(s);
if (rv == 0)
ccb->ccb_h.status = CAM_REQ_CMP;
@@ -540,7 +529,6 @@ scsi_low_scsi_action_cam(sim, ccb)
if (lun == CAM_LUN_WILDCARD)
lun = 0;
- s = splcam();
scsi = &cts->proto_specific.scsi;
spi = &cts->xport_specific.spi;
if ((spi->valid & (CTS_SPI_VALID_BUS_WIDTH |
@@ -587,7 +575,6 @@ scsi_low_scsi_action_cam(sim, ccb)
if ((slp->sl_show_result & SHOW_CALCF_RES) != 0)
scsi_low_calcf_show(li);
}
- splx(s);
ccb->ccb_h.status = CAM_REQ_CMP;
xpt_done(ccb);
@@ -612,7 +599,6 @@ scsi_low_scsi_action_cam(sim, ccb)
if (lun == CAM_LUN_WILDCARD)
lun = 0;
- s = splcam();
li = scsi_low_alloc_li(ti, lun, 1);
if (li != NULL && cts->type == CTS_TYPE_CURRENT_SETTINGS) {
struct ccb_trans_settings_scsi *scsi =
@@ -658,7 +644,6 @@ scsi_low_scsi_action_cam(sim, ccb)
} else
ccb->ccb_h.status = CAM_FUNC_NOTAVAIL;
settings_out:
- splx(s);
xpt_done(ccb);
break;
}
@@ -670,9 +655,7 @@ settings_out:
}
case XPT_RESET_BUS: /* Reset the specified SCSI bus */
- s = splcam();
scsi_low_restart(slp, SCSI_LOW_RESTART_HARD, NULL);
- splx(s);
ccb->ccb_h.status = CAM_REQ_CMP;
xpt_done(ccb);
break;
@@ -711,10 +694,8 @@ settings_out:
else
flags = CCB_NORETRY | CCB_URGENT;
- s = splcam();
li = scsi_low_alloc_li(ti, lun, 1);
scsi_low_enqueue(slp, ti, li, cb, flags, msg);
- splx(s);
break;
case XPT_PATH_INQ: { /* Path routing inquiry */
@@ -774,51 +755,47 @@ scsi_low_attach_cam(slp)
* ask the adapter what subunits are present
*/
tagged_openings = min(slp->sl_openings, SCSI_LOW_MAXNEXUS);
- slp->sl_si.sim = cam_sim_alloc(scsi_low_scsi_action_cam,
+ slp->sl_sim = cam_sim_alloc(scsi_low_scsi_action_cam,
scsi_low_poll_cam,
device_get_name(slp->sl_dev), slp,
- device_get_unit(slp->sl_dev), &Giant,
+ device_get_unit(slp->sl_dev), &slp->sl_lock,
slp->sl_openings, tagged_openings, devq);
- if (slp->sl_si.sim == NULL) {
+ if (slp->sl_sim == NULL) {
cam_simq_free(devq);
return ENODEV;
}
- if (xpt_bus_register(slp->sl_si.sim, NULL, 0) != CAM_SUCCESS) {
- free(slp->sl_si.sim, M_SCSILOW);
+ SCSI_LOW_LOCK(slp);
+ if (xpt_bus_register(slp->sl_sim, slp->sl_dev, 0) != CAM_SUCCESS) {
+ cam_sim_free(slp->sl_sim, TRUE);
+ SCSI_LOW_UNLOCK(slp);
return ENODEV;
}
- if (xpt_create_path(&slp->sl_si.path, /*periph*/NULL,
- cam_sim_path(slp->sl_si.sim), CAM_TARGET_WILDCARD,
+ if (xpt_create_path(&slp->sl_path, /*periph*/NULL,
+ cam_sim_path(slp->sl_sim), CAM_TARGET_WILDCARD,
CAM_LUN_WILDCARD) != CAM_REQ_CMP) {
- xpt_bus_deregister(cam_sim_path(slp->sl_si.sim));
- cam_sim_free(slp->sl_si.sim, /*free_simq*/TRUE);
+ xpt_bus_deregister(cam_sim_path(slp->sl_sim));
+ cam_sim_free(slp->sl_sim, /*free_simq*/TRUE);
+ SCSI_LOW_UNLOCK(slp);
return ENODEV;
}
slp->sl_show_result = SHOW_CALCF_RES; /* OK ? */
+ SCSI_LOW_UNLOCK(slp);
return 0;
}
static int
-scsi_low_world_start_cam(slp)
- struct scsi_low_softc *slp;
-{
-
- return 0;
-}
-
-static int
-scsi_low_dettach_cam(slp)
+scsi_low_detach_cam(slp)
struct scsi_low_softc *slp;
{
- xpt_async(AC_LOST_DEVICE, slp->sl_si.path, NULL);
- xpt_free_path(slp->sl_si.path);
- xpt_bus_deregister(cam_sim_path(slp->sl_si.sim));
- cam_sim_free(slp->sl_si.sim, /* free_devq */ TRUE);
+ xpt_async(AC_LOST_DEVICE, slp->sl_path, NULL);
+ xpt_free_path(slp->sl_path);
+ xpt_bus_deregister(cam_sim_path(slp->sl_sim));
+ cam_sim_free(slp->sl_sim, /* free_devq */ TRUE);
return 0;
}
@@ -906,48 +883,6 @@ scsi_low_done_cam(slp, cb)
return 0;
}
-static void
-scsi_low_timeout_cam(slp, ch, action)
- struct scsi_low_softc *slp;
- int ch;
- int action;
-{
-
- switch (ch)
- {
- case SCSI_LOW_TIMEOUT_CH_IO:
- switch (action)
- {
- case SCSI_LOW_TIMEOUT_START:
- slp->sl_si.timeout_ch = timeout(scsi_low_timeout, slp,
- hz / SCSI_LOW_TIMEOUT_HZ);
- break;
- case SCSI_LOW_TIMEOUT_STOP:
- untimeout(scsi_low_timeout, slp, slp->sl_si.timeout_ch);
- break;
- }
- break;
-
- case SCSI_LOW_TIMEOUT_CH_ENGAGE:
- switch (action)
- {
- case SCSI_LOW_TIMEOUT_START:
- slp->sl_si.engage_ch = timeout(scsi_low_engage, slp, 1);
- break;
- case SCSI_LOW_TIMEOUT_STOP:
- untimeout(scsi_low_engage, slp, slp->sl_si.engage_ch);
- break;
- }
- break;
- case SCSI_LOW_TIMEOUT_CH_RECOVER:
- break;
- }
-}
-
-/*=============================================================
- * END OF OS switch (All OS depend fucntions should be above)
- =============================================================*/
-
/**************************************************************
* scsi low deactivate and activate
**************************************************************/
@@ -965,15 +900,10 @@ int
scsi_low_deactivate(slp)
struct scsi_low_softc *slp;
{
- int s;
- s = splcam();
slp->sl_flags |= HW_INACTIVE;
- (*slp->sl_osdep_fp->scsi_low_osdep_timeout)
- (slp, SCSI_LOW_TIMEOUT_CH_IO, SCSI_LOW_TIMEOUT_STOP);
- (*slp->sl_osdep_fp->scsi_low_osdep_timeout)
- (slp, SCSI_LOW_TIMEOUT_CH_ENGAGE, SCSI_LOW_TIMEOUT_STOP);
- splx(s);
+ callout_stop(&slp->sl_timeout_timer);
+ callout_stop(&slp->sl_engage_timer);
return 0;
}
@@ -981,21 +911,18 @@ int
scsi_low_activate(slp)
struct scsi_low_softc *slp;
{
- int error, s;
+ int error;
- s = splcam();
slp->sl_flags &= ~HW_INACTIVE;
if ((error = scsi_low_restart(slp, SCSI_LOW_RESTART_HARD, NULL)) != 0)
{
slp->sl_flags |= HW_INACTIVE;
- splx(s);
return error;
}
slp->sl_timeout_count = 0;
- (*slp->sl_osdep_fp->scsi_low_osdep_timeout)
- (slp, SCSI_LOW_TIMEOUT_CH_IO, SCSI_LOW_TIMEOUT_START);
- splx(s);
+ callout_reset(&slp->sl_timeout_timer, hz / SCSI_LOW_TIMEOUT_HZ,
+ scsi_low_timeout, slp);
return 0;
}
@@ -1063,15 +990,15 @@ scsi_low_engage(arg)
void *arg;
{
struct scsi_low_softc *slp = arg;
- int s = splcam();
+ SCSI_LOW_ASSERT_LOCKED(slp);
switch (slp->sl_rstep)
{
case 0:
slp->sl_rstep ++;
(*slp->sl_funcs->scsi_low_power) (slp, SCSI_LOW_ENGAGE);
- (*slp->sl_osdep_fp->scsi_low_osdep_timeout) (slp,
- SCSI_LOW_TIMEOUT_CH_ENGAGE, SCSI_LOW_TIMEOUT_START);
+ callout_reset(&slp->sl_engage_timer, hz / 1000,
+ scsi_low_engage, slp);
break;
case 1:
@@ -1083,7 +1010,6 @@ scsi_low_engage(arg)
case 2:
break;
}
- splx(s);
}
static int
@@ -1098,8 +1024,7 @@ scsi_low_init(slp, flags)
/* clear power control timeout */
if ((slp->sl_flags & HW_POWERCTRL) != 0)
{
- (*slp->sl_osdep_fp->scsi_low_osdep_timeout) (slp,
- SCSI_LOW_TIMEOUT_CH_ENGAGE, SCSI_LOW_TIMEOUT_STOP);
+ callout_stop(&slp->sl_engage_timer);
slp->sl_flags &= ~(HW_POWDOWN | HW_RESUME);
slp->sl_active = 1;
slp->sl_powc = SCSI_LOW_POWDOWN_TC;
@@ -1273,13 +1198,10 @@ scsi_low_timeout(arg)
void *arg;
{
struct scsi_low_softc *slp = arg;
- int s;
- s = splcam();
+ SCSI_LOW_ASSERT_LOCKED(slp);
(void) scsi_low_timeout_check(slp);
- (*slp->sl_osdep_fp->scsi_low_osdep_timeout)
- (slp, SCSI_LOW_TIMEOUT_CH_IO, SCSI_LOW_TIMEOUT_START);
- splx(s);
+ callout_schedule(&slp->sl_timeout_timer, hz / SCSI_LOW_TIMEOUT_HZ);
}
static int
@@ -1459,12 +1381,7 @@ scsi_low_attach(slp, openings, ntargs, n
{
struct targ_info *ti;
struct lun_info *li;
- int s, i, nccb, rv;
-
- slp->sl_osdep_fp = &scsi_low_osdep_funcs_cam;
-
- if (slp->sl_osdep_fp == NULL)
- panic("scsi_low: interface not spcified");
+ int i, nccb, rv;
if (ntargs > SCSI_LOW_NTARGETS)
{
@@ -1503,31 +1420,32 @@ scsi_low_attach(slp, openings, ntargs, n
TAILQ_INIT(&slp->sl_start);
/* call os depend attach */
- s = splcam();
- rv = (*slp->sl_osdep_fp->scsi_low_osdep_attach) (slp);
+ rv = scsi_low_attach_cam(slp);
if (rv != 0)
{
- splx(s);
device_printf(slp->sl_dev,
"scsi_low_attach: osdep attach failed\n");
- return EINVAL;
+ return (rv);
}
/* check hardware */
DELAY(1000); /* wait for 1ms */
+ SCSI_LOW_LOCK(slp);
if (scsi_low_init(slp, SCSI_LOW_RESTART_HARD) != 0)
{
- splx(s);
device_printf(slp->sl_dev,
"scsi_low_attach: initialization failed\n");
+ SCSI_LOW_UNLOCK(slp);
return EINVAL;
}
/* start watch dog */
slp->sl_timeout_count = 0;
- (*slp->sl_osdep_fp->scsi_low_osdep_timeout)
- (slp, SCSI_LOW_TIMEOUT_CH_IO, SCSI_LOW_TIMEOUT_START);
+ callout_reset(&slp->sl_timeout_timer, hz / SCSI_LOW_TIMEOUT_HZ,
+ scsi_low_timeout, slp);
+ mtx_lock(&sl_tab_lock);
LIST_INSERT_HEAD(&sl_tab, slp, sl_chain);
+ mtx_unlock(&sl_tab_lock);
/* fake call */
scsi_low_abort_ccb(slp, scsi_low_find_ccb(slp, 0, 0, NULL));
@@ -1536,38 +1454,40 @@ scsi_low_attach(slp, openings, ntargs, n
/* probing devices */
scsi_low_start_up(slp);
#endif /* SCSI_LOW_START_UP_CHECK */
+ SCSI_LOW_UNLOCK(slp);
- /* call os depend attach done*/
- (*slp->sl_osdep_fp->scsi_low_osdep_world_start) (slp);
- splx(s);
return 0;
}
int
-scsi_low_dettach(slp)
+scsi_low_detach(slp)
struct scsi_low_softc *slp;
{
- int s, rv;
+ int rv;
- s = splcam();
+ SCSI_LOW_LOCK(slp);
if (scsi_low_is_busy(slp) != 0)
{
- splx(s);
+ SCSI_LOW_UNLOCK(slp);
return EBUSY;
}
scsi_low_deactivate(slp);
- rv = (*slp->sl_osdep_fp->scsi_low_osdep_dettach) (slp);
+ rv = scsi_low_detach_cam(slp);
if (rv != 0)
{
- splx(s);
+ SCSI_LOW_UNLOCK(slp);
return EBUSY;
}
scsi_low_free_ti(slp);
+ SCSI_LOW_UNLOCK(slp);
+ callout_drain(&slp->sl_timeout_timer);
+ callout_drain(&slp->sl_engage_timer);
+ mtx_lock(&sl_tab_lock);
LIST_REMOVE(slp, sl_chain);
- splx(s);
+ mtx_unlock(&sl_tab_lock);
return 0;
}
@@ -1753,9 +1673,8 @@ scsi_low_resume(slp)
slp->sl_flags |= HW_RESUME;
slp->sl_rstep = 0;
(*slp->sl_funcs->scsi_low_power) (slp, SCSI_LOW_ENGAGE);
- (*slp->sl_osdep_fp->scsi_low_osdep_timeout)
- (slp, SCSI_LOW_TIMEOUT_CH_ENGAGE,
- SCSI_LOW_TIMEOUT_START);
+ callout_reset(&slp->sl_engage_timer, hz / 1000,
+ scsi_low_engage, slp);
return EJUSTRETURN;
}
return 0;
@@ -1839,7 +1758,7 @@ scsi_low_cmd_start:
else if (li->li_state >= SCSI_LOW_LUN_OK)
{
cb->ccb_flags &= ~CCB_INTERNAL;
- rv = (*slp->sl_osdep_fp->scsi_low_osdep_ccb_setup) (slp, cb);
+ rv = scsi_low_ccb_setup_cam(slp, cb);
if (cb->ccb_msgoutflag != 0)
{
scsi_low_ccb_message_exec(slp, cb);
@@ -2199,7 +2118,7 @@ scsi_low_done(slp, cb)
/* call OS depend done */
if (cb->osdep != NULL)
{
- rv = (*slp->sl_osdep_fp->scsi_low_osdep_done) (slp, cb);
+ rv = scsi_low_done_cam(slp, cb);
if (rv == EJUSTRETURN)
goto retry;
}
@@ -3140,7 +3059,7 @@ cmd_link_start:
scsi_low_init_msgsys(slp, ti);
- (*slp->sl_osdep_fp->scsi_low_osdep_ccb_setup) (slp, ncb);
+ scsi_low_ccb_setup_cam(slp, ncb);
if (ncb->ccb_tcmax < SCSI_LOW_MIN_TOUT)
ncb->ccb_tcmax = SCSI_LOW_MIN_TOUT;
Modified: head/sys/cam/scsi/scsi_low.h
==============================================================================
--- head/sys/cam/scsi/scsi_low.h Thu Nov 20 20:24:30 2014 (r274759)
+++ head/sys/cam/scsi/scsi_low.h Thu Nov 20 20:50:05 2014 (r274760)
@@ -44,10 +44,6 @@
#ifndef _SCSI_LOW_H_
#define _SCSI_LOW_H_
-/*================================================
- * Scsi low OSDEP
- * (All os depend structures should be here!)
- ================================================*/
/******** includes *******************************/
#include <sys/bus.h>
@@ -65,51 +61,8 @@
#undef MSG_IDENTIFY
-/******** os depend interface structures **********/
-typedef struct scsi_sense_data scsi_low_osdep_sense_data_t;
-
-struct scsi_low_osdep_interface {
- device_t si_dev;
-
- struct cam_sim *sim;
- struct cam_path *path;
-
- int si_poll_count;
-
- struct callout_handle engage_ch;
- struct callout_handle timeout_ch;
-#ifdef SCSI_LOW_POWFUNC
- struct callout_handle recover_ch;
-#endif
-};
-
-/******** os depend interface functions *************/
-struct slccb;
-struct scsi_low_softc;
-#define SCSI_LOW_TIMEOUT_STOP 0
-#define SCSI_LOW_TIMEOUT_START 1
-#define SCSI_LOW_TIMEOUT_CH_IO 0
-#define SCSI_LOW_TIMEOUT_CH_ENGAGE 1
-#define SCSI_LOW_TIMEOUT_CH_RECOVER 2
-
-struct scsi_low_osdep_funcs {
- int (*scsi_low_osdep_attach) \
- (struct scsi_low_softc *);
- int (*scsi_low_osdep_world_start) \
- (struct scsi_low_softc *);
- int (*scsi_low_osdep_dettach) \
- (struct scsi_low_softc *);
- int (*scsi_low_osdep_ccb_setup) \
- (struct scsi_low_softc *, struct slccb *);
- int (*scsi_low_osdep_done) \
- (struct scsi_low_softc *, struct slccb *);
- void (*scsi_low_osdep_timeout) \
- (struct scsi_low_softc *, int, int);
-};
-
/*================================================
* Generic Scsi Low header file
- * (All os depend structures should be above!)
================================================*/
/*************************************************
* Scsi low definitions
@@ -229,7 +182,7 @@ struct slccb {
* Sense data buffer
*****************************************/
u_int8_t ccb_scsi_cmd[12];
- scsi_low_osdep_sense_data_t ccb_sense;
+ struct scsi_sense_data ccb_sense;
};
/*************************************************
@@ -486,10 +439,19 @@ struct scsi_low_funcs {
};
struct scsi_low_softc {
- /* os depend structure */
- struct scsi_low_osdep_interface sl_si;
-#define sl_dev sl_si.si_dev
- struct scsi_low_osdep_funcs *sl_osdep_fp;
+ device_t sl_dev;
+
+ struct cam_sim *sl_sim;
+ struct cam_path *sl_path;
+
+ int sl_poll_count;
+
+ struct mtx sl_lock;
+ struct callout sl_engage_timer;
+ struct callout sl_timeout_timer;
+#ifdef SCSI_LOW_POWFUNC
+ struct callout sl_recover_timer;
+#endif
/* our chain */
LIST_ENTRY(scsi_low_softc) sl_chain;
@@ -596,6 +558,10 @@ struct scsi_low_softc {
int sl_targsize;
};
+#define SCSI_LOW_LOCK(sl) mtx_lock(&(sl)->sl_lock)
+#define SCSI_LOW_UNLOCK(sl) mtx_unlock(&(sl)->sl_lock)
+#define SCSI_LOW_ASSERT_LOCKED(sl) mtx_assert(&(sl)->sl_lock, MA_OWNED)
+
/*************************************************
* SCSI LOW service functions
*************************************************/
@@ -603,7 +569,7 @@ struct scsi_low_softc {
* Scsi low attachment function.
*/
int scsi_low_attach(struct scsi_low_softc *, int, int, int, int, int);
-int scsi_low_dettach(struct scsi_low_softc *);
+int scsi_low_detach(struct scsi_low_softc *);
/*
* Scsi low interface activate or deactivate functions
Modified: head/sys/dev/ct/bshw_machdep.c
==============================================================================
--- head/sys/dev/ct/bshw_machdep.c Thu Nov 20 20:24:30 2014 (r274759)
+++ head/sys/dev/ct/bshw_machdep.c Thu Nov 20 20:50:05 2014 (r274760)
@@ -46,6 +46,7 @@ __FBSDID("$FreeBSD$");
#include <sys/queue.h>
#include <sys/malloc.h>
#include <sys/errno.h>
+#include <sys/rman.h>
#include <vm/vm.h>
@@ -328,7 +329,7 @@ bshw_smit_xfer_start(struct ct_softc *ct
break;
count = (datalen > LC_FSZ ? LC_FSZ : datalen);
- bus_space_read_region_4(chp->ch_memt, chp->ch_memh,
+ bus_read_region_4(chp->ch_mem,
LC_SMIT_OFFSET, (u_int32_t *) data, count >> 2);
data += count;
datalen -= count;
@@ -354,7 +355,7 @@ bshw_smit_xfer_start(struct ct_softc *ct
}
count = (datalen > LC_SFSZ ? LC_SFSZ : datalen);
- bus_space_write_region_4(chp->ch_memt, chp->ch_memh,
+ bus_write_region_4(chp->ch_mem,
LC_SMIT_OFFSET, (u_int32_t *) data, count >> 2);
data += count;
datalen -= count;
@@ -363,7 +364,7 @@ bshw_smit_xfer_start(struct ct_softc *ct
break;
count = (datalen > LC_REST ? LC_REST : datalen);
- bus_space_write_region_4(chp->ch_memt, chp->ch_memh,
+ bus_write_region_4(chp->ch_mem,
LC_SMIT_OFFSET + LC_SFSZ,
(u_int32_t *) data, count >> 2);
data += count;
Modified: head/sys/dev/ct/ct.c
==============================================================================
--- head/sys/dev/ct/ct.c Thu Nov 20 20:24:30 2014 (r274759)
+++ head/sys/dev/ct/ct.c Thu Nov 20 20:50:05 2014 (r274760)
@@ -47,6 +47,7 @@ __FBSDID("$FreeBSD$");
#include <sys/queue.h>
#include <sys/malloc.h>
#include <sys/errno.h>
+#include <sys/rman.h>
#include <machine/bus.h>
@@ -140,6 +141,7 @@ static int ct_unbusy(struct ct_softc *);
static void ct_attention(struct ct_softc *);
static struct ct_synch_data *ct_make_synch_table(struct ct_softc *);
static int ct_catch_intr(struct ct_softc *);
+static int ct_poll(void *);
struct scsi_low_funcs ct_funcs = {
SC_LOW_INIT_T ct_world_start,
@@ -155,7 +157,7 @@ struct scsi_low_funcs ct_funcs = {
SC_LOW_MSG_T ct_msg,
SC_LOW_TIMEOUT_T NULL,
- SC_LOW_POLL_T ctintr,
+ SC_LOW_POLL_T ct_poll,
NULL, /* SC_LOW_POWER_T cthw_power, */
};
@@ -876,11 +878,22 @@ ct_catch_intr(struct ct_softc *ct)
return EJUSTRETURN;
}
-int
+void
ctintr(void *arg)
{
struct ct_softc *ct = arg;
struct scsi_low_softc *slp = &ct->sc_sclow;
+
+ SCSI_LOW_LOCK(slp);
+ ct_poll(ct);
+ SCSI_LOW_UNLOCK(slp);
+}
+
+static int
+ct_poll(void *arg)
+{
+ struct ct_softc *ct = arg;
+ struct scsi_low_softc *slp = &ct->sc_sclow;
struct ct_bus_access_handle *chp = &ct->sc_ch;
struct targ_info *ti;
struct buf *bp;
Modified: head/sys/dev/ct/ct_isa.c
==============================================================================
--- head/sys/dev/ct/ct_isa.c Thu Nov 20 20:24:30 2014 (r274759)
+++ head/sys/dev/ct/ct_isa.c Thu Nov 20 20:50:05 2014 (r274760)
@@ -137,8 +137,7 @@ ct_isa_match(device_t dev)
return ENXIO;
bzero(&ch, sizeof(ch));
- ch.ch_iot = rman_get_bustag(port_res);
- ch.ch_ioh = rman_get_bushandle(port_res),
+ ch.ch_io = port_res;
ch.ch_bus_weight = ct_isa_bus_access_weight;
rv = ctprobesubr(&ch, 0, BSHW_DEFAULT_HOSTID,
@@ -159,7 +158,7 @@ ct_isa_match(device_t dev)
bus_release_resource(dev, SYS_RES_MEMORY, 0, mem_res);
if (rv != 0)
- return 0;
+ return (BUS_PROBE_DEFAULT);
return ENXIO;
}
@@ -175,7 +174,6 @@ ct_isa_attach(device_t dev)
int irq_rid, drq_rid, chiprev;
u_int8_t *vaddr;
bus_addr_t addr;
- intrmask_t s;
hw = ct_find_hw(dev);
if (ct_space_map(dev, hw, &ct->port_res, &ct->mem_res) != 0) {
@@ -183,13 +181,8 @@ ct_isa_attach(device_t dev)
return ENXIO;
}
- bzero(chp, sizeof(*chp));
- chp->ch_iot = rman_get_bustag(ct->port_res);
- chp->ch_ioh = rman_get_bushandle(ct->port_res);
- if (ct->mem_res) {
- chp->ch_memt = rman_get_bustag(ct->mem_res);
- chp->ch_memh = rman_get_bushandle(ct->mem_res);
- }
+ chp->ch_io = ct->port_res;
+ chp->ch_mem = ct->mem_res;
chp->ch_bus_weight = ct_isa_bus_access_weight;
irq_rid = 0;
@@ -254,7 +247,7 @@ ct_isa_attach(device_t dev)
ct->ct_synch_setup = bshw_synch_setup;
ct->sc_xmode = CT_XMODE_DMA;
- if (chp->ch_memh != NULL)
+ if (chp->ch_mem != NULL)
ct->sc_xmode |= CT_XMODE_PIO;
ct->sc_chiprev = chiprev;
@@ -297,13 +290,12 @@ ct_isa_attach(device_t dev)
slp->sl_dev = dev;
slp->sl_hostid = bs->sc_hostid;
slp->sl_cfgflags = device_get_flags(dev);
+ mtx_init(&slp->sl_lock, "ct", NULL, MTX_DEF);
- s = splcam();
ctattachsubr(ct);
- splx(s);
- if (bus_setup_intr(dev, ct->irq_res, INTR_TYPE_CAM,
- NULL, (driver_intr_t *)ctintr, ct, &ct->sc_ih)) {
+ if (bus_setup_intr(dev, ct->irq_res, INTR_TYPE_CAM | INTR_MPSAFE,
+ NULL, ctintr, ct, &ct->sc_ih)) {
ct_space_unmap(dev, ct);
return ENXIO;
}
@@ -326,7 +318,7 @@ ct_space_map(device_t dev, struct bshw *
*memhp = NULL;
port_rid = 0;
- *iohp = bus_alloc_resource(dev, SYS_RES_IOPORT, &port_rid, 0, ~0,
+ *iohp = bus_alloc_resource(dev, SYS_RES_IOPORT, &port_rid, 0ul, ~0ul,
BSHW_IOSZ, RF_ACTIVE);
if (*iohp == NULL)
return ENXIO;
@@ -335,7 +327,7 @@ ct_space_map(device_t dev, struct bshw *
return 0;
mem_rid = 0;
- *memhp = bus_alloc_resource(dev, SYS_RES_MEMORY, &mem_rid, 0, ~0,
+ *memhp = bus_alloc_resource(dev, SYS_RES_MEMORY, &mem_rid, 0ul, ~0ul,
BSHW_MEMSZ, RF_ACTIVE);
if (*memhp == NULL) {
bus_release_resource(dev, SYS_RES_IOPORT, port_rid, *iohp);
Modified: head/sys/dev/ct/ct_machdep.h
==============================================================================
--- head/sys/dev/ct/ct_machdep.h Thu Nov 20 20:24:30 2014 (r274759)
+++ head/sys/dev/ct/ct_machdep.h Thu Nov 20 20:50:05 2014 (r274760)
@@ -94,7 +94,7 @@ ct_stat_read_1(struct ct_bus_access_hand
{
u_int8_t regv;
- regv = bus_space_read_1(chp->ch_iot, chp->ch_ioh, stat_port);
+ regv = bus_read_1(chp->ch_io, stat_port);
CT_BUS_WEIGHT(chp)
return regv;
}
@@ -102,33 +102,29 @@ ct_stat_read_1(struct ct_bus_access_hand
static __inline void
cthw_set_count(struct ct_bus_access_handle *chp, u_int count)
{
- bus_space_tag_t bst = chp->ch_iot;
- bus_space_handle_t bsh = chp->ch_ioh;
- bus_space_write_1(bst, bsh, addr_port, wd3s_cnt);
+ bus_write_1(chp->ch_io, addr_port, wd3s_cnt);
CT_BUS_WEIGHT(chp)
- bus_space_write_1(bst, bsh, ctrl_port, count >> 16);
+ bus_write_1(chp->ch_io, ctrl_port, count >> 16);
CT_BUS_WEIGHT(chp)
- bus_space_write_1(bst, bsh, ctrl_port, count >> 8);
+ bus_write_1(chp->ch_io, ctrl_port, count >> 8);
CT_BUS_WEIGHT(chp)
- bus_space_write_1(bst, bsh, ctrl_port, count);
+ bus_write_1(chp->ch_io, ctrl_port, count);
CT_BUS_WEIGHT(chp)
}
static __inline u_int
cthw_get_count(struct ct_bus_access_handle *chp)
{
- bus_space_tag_t bst = chp->ch_iot;
- bus_space_handle_t bsh = chp->ch_ioh;
u_int count;
- bus_space_write_1(bst, bsh, addr_port, wd3s_cnt);
+ bus_write_1(chp->ch_io, addr_port, wd3s_cnt);
CT_BUS_WEIGHT(chp)
- count = (((u_int) bus_space_read_1(bst, bsh, ctrl_port)) << 16);
+ count = (((u_int) bus_read_1(chp->ch_io, ctrl_port)) << 16);
CT_BUS_WEIGHT(chp)
- count += (((u_int) bus_space_read_1(bst, bsh, ctrl_port)) << 8);
+ count += (((u_int) bus_read_1(chp->ch_io, ctrl_port)) << 8);
CT_BUS_WEIGHT(chp)
- count += ((u_int) bus_space_read_1(bst, bsh, ctrl_port));
+ count += ((u_int) bus_read_1(chp->ch_io, ctrl_port));
CT_BUS_WEIGHT(chp)
return count;
}
@@ -136,15 +132,13 @@ cthw_get_count(struct ct_bus_access_hand
static __inline void
ct_write_cmds(struct ct_bus_access_handle *chp, u_int8_t *cmd, int len)
{
- bus_space_tag_t bst = chp->ch_iot;
- bus_space_handle_t bsh = chp->ch_ioh;
int i;
- bus_space_write_1(bst, bsh, addr_port, wd3s_cdb);
+ bus_write_1(chp->ch_io, addr_port, wd3s_cdb);
CT_BUS_WEIGHT(chp)
for (i = 0; i < len; i ++)
{
- bus_space_write_1(bst, bsh, ctrl_port, cmd[i]);
+ bus_write_1(chp->ch_io, ctrl_port, cmd[i]);
CT_BUS_WEIGHT(chp)
}
}
@@ -152,13 +146,11 @@ ct_write_cmds(struct ct_bus_access_handl
static __inline u_int8_t
ct_cr_read_1(struct ct_bus_access_handle *chp, bus_addr_t offs)
{
- bus_space_tag_t bst = chp->ch_iot;
- bus_space_handle_t bsh = chp->ch_ioh;
u_int8_t regv;
- bus_space_write_1(bst, bsh, addr_port, offs);
+ bus_write_1(chp->ch_io, addr_port, offs);
CT_BUS_WEIGHT(chp)
- regv = bus_space_read_1(bst, bsh, ctrl_port);
+ regv = bus_read_1(chp->ch_io, ctrl_port);
CT_BUS_WEIGHT(chp)
return regv;
}
@@ -166,12 +158,10 @@ ct_cr_read_1(struct ct_bus_access_handle
static __inline void
ct_cr_write_1(struct ct_bus_access_handle *chp, bus_addr_t offs, u_int8_t val)
{
- bus_space_tag_t bst = chp->ch_iot;
- bus_space_handle_t bsh = chp->ch_ioh;
- bus_space_write_1(bst, bsh, addr_port, offs);
+ bus_write_1(chp->ch_io, addr_port, offs);
CT_BUS_WEIGHT(chp)
- bus_space_write_1(bst, bsh, ctrl_port, val);
+ bus_write_1(chp->ch_io, ctrl_port, val);
CT_BUS_WEIGHT(chp)
}
@@ -180,7 +170,7 @@ ct_cmdp_read_1(struct ct_bus_access_hand
{
u_int8_t regv;
- regv = bus_space_read_1(chp->ch_iot, chp->ch_ioh, cmd_port);
+ regv = bus_read_1(chp->ch_io, cmd_port);
CT_BUS_WEIGHT(chp)
return regv;
}
@@ -189,7 +179,7 @@ static __inline void
ct_cmdp_write_1(struct ct_bus_access_handle *chp, u_int8_t val)
{
- bus_space_write_1(chp->ch_iot, chp->ch_ioh, cmd_port, val);
+ bus_write_1(chp->ch_io, cmd_port, val);
CT_BUS_WEIGHT(chp)
}
Modified: head/sys/dev/ct/ctvar.h
==============================================================================
--- head/sys/dev/ct/ctvar.h Thu Nov 20 20:24:30 2014 (r274759)
+++ head/sys/dev/ct/ctvar.h Thu Nov 20 20:50:05 2014 (r274760)
@@ -44,15 +44,8 @@
* Host adapter structure
*****************************************************************/
struct ct_bus_access_handle {
- bus_space_tag_t ch_iot; /* core chip ctrl port tag */
- bus_space_tag_t ch_delayt; /* delay port tag */
- bus_space_tag_t ch_datat; /* data port tag (pio) */
- bus_space_tag_t ch_memt; /* data port tag (shm) */
-
- bus_space_handle_t ch_ioh;
- bus_space_handle_t ch_delaybah;
- bus_space_handle_t ch_datah;
- bus_space_handle_t ch_memh;
+ struct resource *ch_io; /* core chip ctrl port */
+ struct resource *ch_mem; /* data port (shm) */
void (*ch_bus_weight)(struct ct_bus_access_handle *);
@@ -132,5 +125,5 @@ struct ct_targ_info {
*****************************************************************/
int ctprobesubr(struct ct_bus_access_handle *, u_int, int, u_int, int *);
void ctattachsubr(struct ct_softc *);
-int ctintr(void *);
+void ctintr(void *);
#endif /* !_CTVAR_H_ */
Modified: head/sys/dev/ncv/ncr53c500.c
==============================================================================
--- head/sys/dev/ncv/ncr53c500.c Thu Nov 20 20:24:30 2014 (r274759)
+++ head/sys/dev/ncv/ncr53c500.c Thu Nov 20 20:50:05 2014 (r274760)
@@ -47,6 +47,7 @@ __FBSDID("$FreeBSD$");
#include <sys/queue.h>
#include <sys/malloc.h>
#include <sys/errno.h>
+#include <sys/rman.h>
#include <machine/cpu.h>
#include <machine/bus.h>
@@ -107,18 +108,18 @@ static int ncv_msg(struct ncv_softc *, s
static int ncv_reselected(struct ncv_softc *);
static int ncv_disconnected(struct ncv_softc *, struct targ_info *);
-static __inline void ncvhw_set_count(bus_space_tag_t, bus_space_handle_t, int);
-static __inline u_int ncvhw_get_count(bus_space_tag_t, bus_space_handle_t);
-static __inline void ncvhw_select_register_0(bus_space_tag_t, bus_space_handle_t, struct ncv_hw *);
-static __inline void ncvhw_select_register_1(bus_space_tag_t, bus_space_handle_t, struct ncv_hw *);
-static __inline void ncvhw_fpush(bus_space_tag_t, bus_space_handle_t, u_int8_t *, int);
+static __inline void ncvhw_set_count(struct resource *, int);
+static __inline u_int ncvhw_get_count(struct resource *);
+static __inline void ncvhw_select_register_0(struct resource *, struct ncv_hw *);
+static __inline void ncvhw_select_register_1(struct resource *, struct ncv_hw *);
+static __inline void ncvhw_fpush(struct resource *, u_int8_t *, int);
static void ncv_pdma_end(struct ncv_softc *sc, struct targ_info *);
static int ncv_world_start(struct ncv_softc *, int);
static void ncvhw_bus_reset(struct ncv_softc *);
-static void ncvhw_reset(bus_space_tag_t, bus_space_handle_t, struct ncv_hw *);
-static int ncvhw_check(bus_space_tag_t, bus_space_handle_t, struct ncv_hw *);
-static void ncvhw_init(bus_space_tag_t, bus_space_handle_t, struct ncv_hw *);
+static void ncvhw_reset(struct resource *, struct ncv_hw *);
+static int ncvhw_check(struct resource *, struct ncv_hw *);
+static void ncvhw_init(struct resource *, struct ncv_hw *);
static int ncvhw_start_selection(struct ncv_softc *sc, struct slccb *);
static void ncvhw_attention(struct ncv_softc *);
static int ncv_ccb_nexus_establish(struct ncv_softc *);
@@ -154,74 +155,56 @@ struct scsi_low_funcs ncv_funcs = {
* hwfuncs
**************************************************************/
static __inline void
-ncvhw_select_register_0(iot, ioh, hw)
- bus_space_tag_t iot;
- bus_space_handle_t ioh;
- struct ncv_hw *hw;
+ncvhw_select_register_0(struct resource *res, struct ncv_hw *hw)
{
- bus_space_write_1(iot, ioh, cr0_cfg4, hw->hw_cfg4);
+ bus_write_1(res, cr0_cfg4, hw->hw_cfg4);
}
static __inline void
-ncvhw_select_register_1(iot, ioh, hw)
- bus_space_tag_t iot;
- bus_space_handle_t ioh;
- struct ncv_hw *hw;
+ncvhw_select_register_1(struct resource *res, struct ncv_hw *hw)
*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
More information about the svn-src-all
mailing list