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 ***
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to