diff options
Diffstat (limited to 'sys')
-rw-r--r-- | sys/cam/cam_ccb.h | 120 | ||||
-rw-r--r-- | sys/cam/cam_sim.c | 13 | ||||
-rw-r--r-- | sys/cam/cam_sim.h | 13 | ||||
-rw-r--r-- | sys/cam/cam_xpt.c | 68 | ||||
-rw-r--r-- | sys/cam/scsi/scsi_cd.c | 35 | ||||
-rw-r--r-- | sys/cam/scsi/scsi_da.c | 13 | ||||
-rw-r--r-- | sys/cam/scsi/scsi_pass.c | 48 | ||||
-rw-r--r-- | sys/cam/scsi/scsi_pass.h | 8 | ||||
-rw-r--r-- | sys/dev/advansys/advansys.c | 45 | ||||
-rw-r--r-- | sys/dev/advansys/advlib.c | 5 | ||||
-rw-r--r-- | sys/dev/advansys/adwcam.c | 26 | ||||
-rw-r--r-- | sys/dev/aha/aha.c | 5 | ||||
-rw-r--r-- | sys/dev/ahb/ahb.c | 3 | ||||
-rw-r--r-- | sys/dev/aic7xxx/aic7xxx.c | 14 | ||||
-rw-r--r-- | sys/dev/buslogic/bt.c | 5 | ||||
-rw-r--r-- | sys/dev/dpt/dpt_scsi.c | 3 | ||||
-rw-r--r-- | sys/dev/isp/isp_freebsd.c | 19 | ||||
-rw-r--r-- | sys/dev/ppbus/vpo.c | 3 | ||||
-rw-r--r-- | sys/i386/eisa/ahb.c | 3 | ||||
-rw-r--r-- | sys/i386/isa/bs/bs.c | 1 | ||||
-rw-r--r-- | sys/pci/ncr.c | 62 | ||||
-rw-r--r-- | sys/pci/simos.c | 3 |
22 files changed, 339 insertions, 176 deletions
diff --git a/sys/cam/cam_ccb.h b/sys/cam/cam_ccb.h index 5c04dfa..67b5934 100644 --- a/sys/cam/cam_ccb.h +++ b/sys/cam/cam_ccb.h @@ -25,7 +25,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: cam_ccb.h,v 1.3 1998/12/10 04:05:49 gibbs Exp $ + * $Id: cam_ccb.h,v 1.4 1999/03/05 23:13:20 gibbs Exp $ */ #ifndef _CAM_CAM_CCB_H @@ -98,61 +98,96 @@ typedef enum { /* XPT Opcodes for xpt_action */ typedef enum { +/* Function code flags are bits greater than 0xff */ + XPT_FC_QUEUED = 0x100, + /* Non-immediate function code */ + XPT_FC_USER_CCB = 0x200, + XPT_FC_XPT_ONLY = 0x400, + /* Only for the transport layer device */ /* Common function commands: 0x00->0x0F */ - XPT_NOOP, /* Execute Nothing */ - XPT_SCSI_IO, /* Execute the requested I/O operation */ - XPT_GDEV_TYPE, /* Get type information for specified device */ - XPT_GDEVLIST, /* Get a list of peripheral devices */ - XPT_PATH_INQ, /* Path routing inquiry */ - XPT_REL_SIMQ, /* Release a frozen SIM queue */ - XPT_SASYNC_CB, /* Set Asynchronous Callback Parameters */ - XPT_SDEV_TYPE, /* Set device type information */ - XPT_SCAN_BUS, /* (Re)Scan the SCSI Bus */ - XPT_DEV_MATCH, /* Get EDT entries matching the given pattern */ - XPT_DEBUG, /* Turn on debugging for a bus, target or lun */ + XPT_NOOP = 0x00, + /* Execute Nothing */ + XPT_SCSI_IO = 0x01 | XPT_FC_QUEUED, + /* Execute the requested I/O operation */ + XPT_GDEV_TYPE = 0x02, + /* Get type information for specified device */ + XPT_GDEVLIST = 0x03, + /* Get a list of peripheral devices */ + XPT_PATH_INQ = 0x04, + /* Path routing inquiry */ + XPT_REL_SIMQ = 0x05, + /* Release a frozen SIM queue */ + XPT_SASYNC_CB = 0x06, + /* Set Asynchronous Callback Parameters */ + XPT_SDEV_TYPE = 0x07, + /* Set device type information */ + XPT_SCAN_BUS = 0x08 | XPT_FC_QUEUED | XPT_FC_USER_CCB + | XPT_FC_XPT_ONLY, + /* (Re)Scan the SCSI Bus */ + XPT_DEV_MATCH = 0x09 | XPT_FC_XPT_ONLY, + /* Get EDT entries matching the given pattern */ + XPT_DEBUG = 0x0a, + /* Turn on debugging for a bus, target or lun */ /* SCSI Control Functions: 0x10->0x1F */ - XPT_ABORT = 0x10, /* Abort the specified CCB */ - XPT_RESET_BUS, /* Reset the specified SCSI bus */ - XPT_RESET_DEV, /* Bus Device Reset the specified SCSI device */ - XPT_TERM_IO, /* Terminate the I/O process */ - XPT_SCAN_LUN, /* Scan Logical Unit */ - XPT_GET_TRAN_SETTINGS, /* + XPT_ABORT = 0x10, + /* Abort the specified CCB */ + XPT_RESET_BUS = 0x11 | XPT_FC_XPT_ONLY, + /* Reset the specified SCSI bus */ + XPT_RESET_DEV = 0x12, + /* Bus Device Reset the specified SCSI device */ + XPT_TERM_IO = 0x13, + /* Terminate the I/O process */ + XPT_SCAN_LUN = 0x14 | XPT_FC_QUEUED | XPT_FC_USER_CCB + | XPT_FC_XPT_ONLY, + /* Scan Logical Unit */ + XPT_GET_TRAN_SETTINGS = 0x15, + /* * Get default/user transfer settings * for the target */ - XPT_SET_TRAN_SETTINGS, /* + XPT_SET_TRAN_SETTINGS = 0x16, + /* * Set transfer rate/width * negotiation settings */ - XPT_CALC_GEOMETRY, /* + XPT_CALC_GEOMETRY = 0x17, + /* * Calculate the geometry parameters for * a device give the sector size and * volume size. */ /* HBA engine commands 0x20->0x2F */ - XPT_ENG_INQ = 0x20, /* HBA engine feature inquiry */ - XPT_ENG_EXEC, /* HBA execute engine request */ + XPT_ENG_INQ = 0x20 | XPT_FC_XPT_ONLY, + /* HBA engine feature inquiry */ + XPT_ENG_EXEC = 0x21 | XPT_FC_QUEUED | XPT_FC_XPT_ONLY, + /* HBA execute engine request */ /* Target mode commands: 0x30->0x3F */ - XPT_EN_LUN = 0x30, /* Enable LUN as a target */ - XPT_TARGET_IO, /* Execute target I/O request */ - XPT_ACCEPT_TARGET_IO, /* Accept Host Target Mode CDB */ - XPT_CONT_TARGET_IO, /* Continue Host Target I/O Connection */ - XPT_IMMED_NOTIFY, /* Notify Host Target driver of event */ - XPT_NOTIFY_ACK, /* Acknowledgement of event */ + XPT_EN_LUN = 0x30, + /* Enable LUN as a target */ + XPT_TARGET_IO = 0x31 | XPT_FC_QUEUED, + /* Execute target I/O request */ + XPT_ACCEPT_TARGET_IO = 0x32 | XPT_FC_QUEUED | XPT_FC_USER_CCB, + /* Accept Host Target Mode CDB */ + XPT_CONT_TARGET_IO = 0x33 | XPT_FC_QUEUED, + /* Continue Host Target I/O Connection */ + XPT_IMMED_NOTIFY = 0x34 | XPT_FC_QUEUED | XPT_FC_USER_CCB, + /* Notify Host Target driver of event */ + XPT_NOTIFY_ACK = 0x35, + /* Acknowledgement of event */ /* Vendor Unique codes: 0x80->0x8F */ - XPT_VUNIQUE = 0x80 + XPT_VUNIQUE = 0x80 } xpt_opcode; -#define XPT_OPCODE_GROUP_MASK 0xF0 -#define XPT_OPCODE_GROUP(op) ((op) & XPT_OPCODE_GROUP_MASK) -#define XPT_OPCODE_GROUP_COMMON 0x00 -#define XPT_OPCODE_GROUP_SCSI_CONTROL 0x10 -#define XPT_OPCODE_GROUP_HBA_ENGINE 0x20 -#define XPT_OPCODE_GROUP_TMODE 0x30 -#define XPT_OPCODE_GROUP_VENDOR_UNIQUE 0x80 +#define XPT_FC_GROUP_MASK 0xF0 +#define XPT_FC_GROUP(op) ((op) & XPT_FC_GROUP_MASK) +#define XPT_FC_GROUP_COMMON 0x00 +#define XPT_FC_GROUP_SCSI_CONTROL 0x10 +#define XPT_FC_GROUP_HBA_ENGINE 0x20 +#define XPT_FC_GROUP_TMODE 0x30 +#define XPT_FC_GROUP_VENDOR_UNIQUE 0x80 typedef union { LIST_ENTRY(ccb_hdr) le; @@ -216,11 +251,11 @@ struct ccb_getdev { * CCBs held by peripheral drivers * for this device */ - u_int8_t maxtags; /* + int maxtags; /* * Boundary conditions for number of * tagged operations */ - u_int8_t mintags; + int mintags; }; @@ -318,11 +353,17 @@ struct periph_match_result { lun_id_t target_lun; }; +typedef enum { + DEV_RESULT_NOFLAG = 0x00, + DEV_RESULT_UNCONFIGURED = 0x01 +} dev_result_flags; + struct device_match_result { path_id_t path_id; target_id_t target_id; lun_id_t target_lun; struct scsi_inquiry_data inq_data; + dev_result_flags flags; }; struct bus_match_result { @@ -396,7 +437,7 @@ struct ccb_dev_match { /* * Definitions for the path inquiry CCB fields. */ -#define CAM_VERSION 0x10 /* Hex value for current version */ +#define CAM_VERSION 0x11 /* Hex value for current version */ typedef enum { PI_MDP_ABLE = 0x80, /* Supports MDP message */ @@ -444,6 +485,7 @@ struct ccb_pathinq { char dev_name[DEV_IDLEN];/* Device name for SIM */ u_int32_t unit_number; /* Unit number for SIM */ u_int32_t bus_id; /* Bus ID for SIM */ + u_int32_t base_transfer_speed;/* Base bus speed in KB/sec */ }; typedef union { diff --git a/sys/cam/cam_sim.c b/sys/cam/cam_sim.c index 7020441..feaf9ed 100644 --- a/sys/cam/cam_sim.c +++ b/sys/cam/cam_sim.c @@ -25,7 +25,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id$ + * $Id: cam_sim.c,v 1.1 1998/09/15 06:33:23 gibbs Exp $ */ #include <sys/param.h> @@ -54,8 +54,8 @@ cam_simq_free(struct cam_devq *devq) struct cam_sim * cam_sim_alloc(sim_action_func sim_action, sim_poll_func sim_poll, char *sim_name, void *softc, u_int32_t unit, - u_int32_t max_dev_transactions, - u_int32_t max_tagged_dev_transactions, struct cam_devq *queue) + int max_dev_transactions, + int max_tagged_dev_transactions, struct cam_devq *queue) { struct cam_sim *sim; @@ -80,7 +80,6 @@ cam_sim_alloc(sim_action_func sim_action, sim_poll_func sim_poll, sim->path_id = CAM_PATH_ANY; sim->unit_number = unit; sim->bus_id = 0; /* set in xpt_bus_register */ - sim->base_transfer_speed = 3300; /* asynchronous 3300 kB/sec */ sim->max_tagged_dev_openings = max_tagged_dev_transactions; sim->max_dev_openings = max_dev_transactions; sim->flags = 0; @@ -100,12 +99,6 @@ cam_sim_free(struct cam_sim *sim, int free_devq) } void -cam_sim_set_basexfer_speed(struct cam_sim *sim, u_int32_t base_xfer_speed) -{ - sim->base_transfer_speed = base_xfer_speed; -} - -void cam_sim_set_path(struct cam_sim *sim, u_int32_t path_id) { sim->path_id = path_id; diff --git a/sys/cam/cam_sim.h b/sys/cam/cam_sim.h index 183bced..53e7937 100644 --- a/sys/cam/cam_sim.h +++ b/sys/cam/cam_sim.h @@ -25,7 +25,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id$ + * $Id: cam_sim.h,v 1.1 1998/09/15 06:33:23 gibbs Exp $ */ #ifndef _CAM_CAM_SIM_H @@ -56,14 +56,12 @@ struct cam_sim * cam_sim_alloc(sim_action_func sim_action, char *sim_name, void *softc, u_int32_t unit, - u_int32_t max_dev_transactions, - u_int32_t max_tagged_dev_transactions, + int max_dev_transactions, + int max_tagged_dev_transactions, struct cam_devq *queue); void cam_sim_free(struct cam_sim *sim, int free_devq); /* Optional sim attributes may be set with these. */ -void cam_sim_set_basexfer_speed(struct cam_sim *sim, - u_int32_t base_xfer_speed); void cam_sim_set_path(struct cam_sim *sim, u_int32_t path_id); @@ -95,9 +93,8 @@ struct cam_sim { u_int32_t path_id;/* The Boot device may set this to 0? */ u_int32_t unit_number; u_int32_t bus_id; - u_int32_t base_transfer_speed; /* in kB/s */ - u_int32_t max_tagged_dev_openings; - u_int32_t max_dev_openings; + int max_tagged_dev_openings; + int max_dev_openings; u_int32_t flags; #define CAM_SIM_REL_TIMEOUT_PENDING 0x01 struct callout_handle c_handle; diff --git a/sys/cam/cam_xpt.c b/sys/cam/cam_xpt.c index 59c5883..b57bdbf 100644 --- a/sys/cam/cam_xpt.c +++ b/sys/cam/cam_xpt.c @@ -26,7 +26,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: cam_xpt.c,v 1.53 1999/04/21 07:26:24 peter Exp $ + * $Id: cam_xpt.c,v 1.54 1999/04/23 23:25:48 gibbs Exp $ */ #include <sys/param.h> #include <sys/systm.h> @@ -215,8 +215,8 @@ struct xpt_quirk_entry { u_int8_t quirks; #define CAM_QUIRK_NOLUNS 0x01 #define CAM_QUIRK_NOSERIAL 0x02 - u_int8_t mintags; - u_int8_t maxtags; + u_int mintags; + u_int maxtags; }; typedef enum { @@ -942,6 +942,7 @@ xptioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct proc *p) } /* FALLTHROUGH */ case XPT_SCAN_LUN: + case XPT_RESET_DEV: case XPT_ENG_INQ: /* XXX not implemented yet */ case XPT_ENG_EXEC: @@ -1449,8 +1450,15 @@ xpt_announce_periph(struct cam_periph *periph, char *announce_string) freq = scsi_calc_syncsrate(cts.sync_period); speed = freq; } else { + struct ccb_pathinq cpi; + + /* Ask the SIM for its base transfer speed */ + xpt_setup_ccb(&cpi.ccb_h, path, /*priority*/1); + cpi.ccb_h.func_code = XPT_PATH_INQ; + xpt_action((union ccb *)&cpi); + + speed = cpi.base_transfer_speed; freq = 0; - speed = path->bus->sim->base_transfer_speed; } if ((cts.valid & CCB_TRANS_BUS_WIDTH_VALID) != 0) speed *= (0x01 << cts.bus_width); @@ -2043,6 +2051,14 @@ xptedtdevicefunc(struct cam_ed *device, void *arg) bcopy(&device->inq_data, &cdm->matches[j].result.device_result.inq_data, sizeof(struct scsi_inquiry_data)); + + /* Let the user know whether this device is unconfigured */ + if (device->flags & CAM_DEV_UNCONFIGURED) + cdm->matches[j].result.device_result.flags = + DEV_RESULT_UNCONFIGURED; + else + cdm->matches[j].result.device_result.flags = + DEV_RESULT_NOFLAG; } /* @@ -4348,16 +4364,7 @@ xpt_done(union ccb *done_ccb) s = splcam(); CAM_DEBUG(done_ccb->ccb_h.path, CAM_DEBUG_TRACE, ("xpt_done\n")); - switch (done_ccb->ccb_h.func_code) { - case XPT_SCSI_IO: - case XPT_ENG_EXEC: - case XPT_TARGET_IO: - case XPT_ACCEPT_TARGET_IO: - case XPT_CONT_TARGET_IO: - case XPT_IMMED_NOTIFY: - case XPT_SCAN_BUS: - case XPT_SCAN_LUN: - { + if ((done_ccb->ccb_h.func_code & XPT_FC_QUEUED) != 0) { /* * Queue up the request for handling by our SWI handler * any of the "non-immediate" type of ccbs. @@ -4376,10 +4383,6 @@ xpt_done(union ccb *done_ccb) setsoftcamnet(); break; } - break; - } - default: - break; } splx(s); } @@ -5517,6 +5520,7 @@ xpt_set_transfer_settings(struct ccb_trans_settings *cts, struct cam_ed *device, if (async_update == FALSE) { struct scsi_inquiry_data *inq_data; struct ccb_pathinq cpi; + struct ccb_trans_settings cur_cts; if (device == NULL) { cts->ccb_h.status = CAM_PATH_INVALID; @@ -5531,8 +5535,28 @@ xpt_set_transfer_settings(struct ccb_trans_settings *cts, struct cam_ed *device, xpt_setup_ccb(&cpi.ccb_h, cts->ccb_h.path, /*priority*/1); cpi.ccb_h.func_code = XPT_PATH_INQ; xpt_action((union ccb *)&cpi); - + xpt_setup_ccb(&cur_cts.ccb_h, cts->ccb_h.path, /*priority*/1); + cur_cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS; + cur_cts.flags = CCB_TRANS_CURRENT_SETTINGS; + xpt_action((union ccb *)&cur_cts); inq_data = &device->inq_data; + + /* Fill in any gaps in what the user gave us */ + if ((cts->valid & CCB_TRANS_SYNC_RATE_VALID) == 0) + cts->sync_period = cur_cts.sync_period; + if ((cts->valid & CCB_TRANS_SYNC_OFFSET_VALID) == 0) + cts->sync_offset = cur_cts.sync_offset; + if ((cts->valid & CCB_TRANS_BUS_WIDTH_VALID) == 0) + cts->bus_width = cur_cts.bus_width; + if ((cts->valid & CCB_TRANS_DISC_VALID) == 0) { + cts->flags &= ~CCB_TRANS_DISC_ENB; + cts->flags |= cur_cts.flags & CCB_TRANS_DISC_ENB; + } + if ((cts->valid & CCB_TRANS_TQ_VALID) == 0) { + cts->flags &= ~CCB_TRANS_TAG_ENB; + cts->flags |= cur_cts.flags & CCB_TRANS_TAG_ENB; + } + if ((inq_data->flags & SID_Sync) == 0 || (cpi.hba_inquiry & PI_SDTR_ABLE) == 0) { /* Force async */ @@ -5911,6 +5935,7 @@ xptaction(struct cam_sim *sim, union ccb *work_ccb) strncpy(cpi->dev_name, sim->sim_name, DEV_IDLEN); cpi->unit_number = sim->unit_number; cpi->bus_id = sim->bus_id; + cpi->base_transfer_speed = 0; cpi->ccb_h.status = CAM_REQ_CMP; xpt_done(work_ccb); break; @@ -5984,10 +6009,7 @@ camisr(cam_isrq_t *queue) TRUE); } } - if ((ccb_h->func_code != XPT_ACCEPT_TARGET_IO) - && (ccb_h->func_code != XPT_IMMED_NOTIFY) - && (ccb_h->func_code != XPT_SCAN_LUN) - && (ccb_h->func_code != XPT_SCAN_BUS)) { + if ((ccb_h->func_code & XPT_FC_USER_CCB) == 0) { struct cam_ed *dev; dev = ccb_h->path->device; diff --git a/sys/cam/scsi/scsi_cd.c b/sys/cam/scsi/scsi_cd.c index 787abc7..dc23ab3 100644 --- a/sys/cam/scsi/scsi_cd.c +++ b/sys/cam/scsi/scsi_cd.c @@ -24,7 +24,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: scsi_cd.c,v 1.16 1999/04/07 22:57:54 gibbs Exp $ + * $Id: scsi_cd.c,v 1.17 1999/04/19 21:26:17 gibbs Exp $ */ /* * Portions of this driver taken from the original FreeBSD cd driver. @@ -126,7 +126,7 @@ typedef enum { struct cd_softc { cam_pinfo pinfo; cd_state state; - cd_flags flags; + volatile cd_flags flags; struct buf_queue_head buf_queue; LIST_HEAD(, ccb_hdr) pending_ccbs; struct cd_params params; @@ -301,7 +301,7 @@ struct cdchanger { struct cd_softc *cur_device; struct callout_handle short_handle; struct callout_handle long_handle; - cd_changer_flags flags; + volatile cd_changer_flags flags; STAILQ_ENTRY(cdchanger) changer_links; STAILQ_HEAD(chdevlist, cd_softc) chluns; }; @@ -1103,7 +1103,8 @@ cdschedule(struct cam_periph *periph, int priority) * bootstrap things. */ if (((softc->changer->flags & CHANGER_TIMEOUT_SCHED)==0) - &&((softc->changer->flags & CHANGER_NEED_TIMEOUT)==0)){ + && ((softc->changer->flags & CHANGER_NEED_TIMEOUT)==0) + && ((softc->changer->flags & CHANGER_SHORT_TMOUT_SCHED)==0)){ softc->changer->flags |= CHANGER_MANUAL_CALL; cdrunchangerqueue(softc->changer); } @@ -1341,7 +1342,7 @@ cdgetccb(struct cam_periph *periph, u_int32_t priority) * This should work the first time this device is woken up, * but just in case it doesn't, we use a while loop. */ - while ((((volatile cd_flags)softc->flags) & CD_FLAG_ACTIVE)==0){ + while ((softc->flags & CD_FLAG_ACTIVE) == 0) { /* * If this changer isn't already queued, queue it up. */ @@ -1352,10 +1353,10 @@ cdgetccb(struct cam_periph *periph, u_int32_t priority) camq_insert(&softc->changer->devq, (cam_pinfo *)softc); } - if (((((volatile cd_changer_flags)softc->changer->flags) - & CHANGER_TIMEOUT_SCHED)==0) - &&((((volatile cd_changer_flags)softc->changer->flags) - & CHANGER_NEED_TIMEOUT)==0)){ + if (((softc->changer->flags & CHANGER_TIMEOUT_SCHED)==0) + && ((softc->changer->flags & CHANGER_NEED_TIMEOUT)==0) + && ((softc->changer->flags + & CHANGER_SHORT_TMOUT_SCHED)==0)) { softc->changer->flags |= CHANGER_MANUAL_CALL; cdrunchangerqueue(softc->changer); } else @@ -1739,18 +1740,12 @@ cddone(struct cam_periph *periph, union ccb *done_ccb) &asc, &ascq); } /* - * With CDROM devices, we expect 0x3a - * (Medium not present) errors, since not - * everyone leaves a CD in the drive. Some - * broken Philips and HP WORM drives return - * 0x04,0x00 (logical unit not ready, cause - * not reportable), so we accept any "not - * ready" type errors as well. If the error - * is anything else, though, we shouldn't - * attach. + * Attach to anything that claims to be a + * CDROM or WORM device, as long as it + * doesn't return a "Logical unit not + * supported" (0x25) error. */ - if ((have_sense) - && ((asc == 0x3a) || (asc == 0x04)) + if ((have_sense) && (asc != 0x25) && (error_code == SSD_CURRENT_ERROR)) snprintf(announce_buf, sizeof(announce_buf), diff --git a/sys/cam/scsi/scsi_da.c b/sys/cam/scsi/scsi_da.c index 388939d..b603b17 100644 --- a/sys/cam/scsi/scsi_da.c +++ b/sys/cam/scsi/scsi_da.c @@ -25,7 +25,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: scsi_da.c,v 1.20 1999/02/10 00:03:15 ken Exp $ + * $Id: scsi_da.c,v 1.21 1999/03/05 23:20:20 gibbs Exp $ */ #include "opt_hw_wdog.h" @@ -1381,13 +1381,12 @@ dadone(struct cam_periph *periph, union ccb *done_ccb) &asc, &ascq); } /* - * With removable media devices, we expect - * 0x3a (Medium not present) errors, since not - * everyone leaves a disk in the drive. If - * the error is anything else, though, we - * shouldn't attach. + * Attach to anything that claims to be a + * direct access or optical disk device, + * as long as it doesn't return a "Logical + * unit not supported" (0x25) error. */ - if ((have_sense) && (asc == 0x3a) + if ((have_sense) && (asc != 0x25) && (error_code == SSD_CURRENT_ERROR)) snprintf(announce_buf, sizeof(announce_buf), diff --git a/sys/cam/scsi/scsi_pass.c b/sys/cam/scsi/scsi_pass.c index 927b1b8..2f5d973 100644 --- a/sys/cam/scsi/scsi_pass.c +++ b/sys/cam/scsi/scsi_pass.c @@ -24,7 +24,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: scsi_pass.c,v 1.5 1998/11/22 23:44:47 ken Exp $ + * $Id: scsi_pass.c,v 1.6 1999/02/10 00:03:15 ken Exp $ */ #include <sys/param.h> @@ -703,13 +703,55 @@ passioctl(dev_t dev, u_long cmd, caddr_t addr, int flag, struct proc *p) { union ccb *inccb; union ccb *ccb; + int ccb_malloced; inccb = (union ccb *)addr; - ccb = cam_periph_getccb(periph, inccb->ccb_h.pinfo.priority); + + /* + * Some CCB types, like scan bus and scan lun can only go + * through the transport layer device. + */ + if (inccb->ccb_h.func_code & XPT_FC_XPT_ONLY) { + xpt_print_path(periph->path); + printf("CCB function code %#x is restricted to the " + "XPT device\n", inccb->ccb_h.func_code); + error = ENODEV; + break; + } + + /* + * Non-immediate CCBs need a CCB from the per-device pool + * of CCBs, which is scheduled by the transport layer. + * Immediate CCBs and user-supplied CCBs should just be + * malloced. + */ + if ((inccb->ccb_h.func_code & XPT_FC_QUEUED) + && ((inccb->ccb_h.func_code & XPT_FC_USER_CCB) == 0)) { + ccb = cam_periph_getccb(periph, + inccb->ccb_h.pinfo.priority); + ccb_malloced = 0; + } else { + ccb = xpt_alloc_ccb(); + + if (ccb != NULL) + xpt_setup_ccb(&ccb->ccb_h, periph->path, + inccb->ccb_h.pinfo.priority); + ccb_malloced = 1; + } + + if (ccb == NULL) { + xpt_print_path(periph->path); + printf("unable to allocate CCB\n"); + error = ENOMEM; + break; + } error = passsendccb(periph, ccb, inccb); - xpt_release_ccb(ccb); + if (ccb_malloced) + xpt_free_ccb(ccb); + else + xpt_release_ccb(ccb); break; } diff --git a/sys/cam/scsi/scsi_pass.h b/sys/cam/scsi/scsi_pass.h index 501598b..12ad2e2 100644 --- a/sys/cam/scsi/scsi_pass.h +++ b/sys/cam/scsi/scsi_pass.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 1997 Kenneth D. Merry. + * Copyright (c) 1997, 1999 Kenneth D. Merry. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -22,7 +22,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id$ + * $Id: scsi_pass.h,v 1.1 1998/09/15 06:36:34 gibbs Exp $ */ #ifndef _SCSI_PASS_H @@ -32,7 +32,7 @@ #include <cam/cam_ccb.h> -#define CAMIOCOMMAND _IOWR('Q', 2, union ccb) -#define CAMGETPASSTHRU _IOWR('Q', 3, union ccb) +#define CAMIOCOMMAND _IOWR(CAM_VERSION, 2, union ccb) +#define CAMGETPASSTHRU _IOWR(CAM_VERSION, 3, union ccb) #endif diff --git a/sys/dev/advansys/advansys.c b/sys/dev/advansys/advansys.c index 0071950..ee3f887 100644 --- a/sys/dev/advansys/advansys.c +++ b/sys/dev/advansys/advansys.c @@ -32,7 +32,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: advansys.c,v 1.8 1999/04/07 22:59:12 gibbs Exp $ + * $Id: advansys.c,v 1.9 1999/04/19 21:27:35 gibbs Exp $ */ /* * Ported from: @@ -237,18 +237,30 @@ adv_action(struct cam_sim *sim, union ccb *ccb) { struct ccb_trans_settings *cts; target_bit_vector targ_mask; - struct adv_target_transinfo *tconf; + struct adv_transinfo *tconf; u_int update_type; int s; cts = &ccb->cts; targ_mask = ADV_TID_TO_TARGET_MASK(cts->ccb_h.target_id); - tconf = &adv->tinfo[cts->ccb_h.target_id]; update_type = 0; - if ((cts->flags & CCB_TRANS_CURRENT_SETTINGS) != 0) + + /* + * The user must specify which type of settings he wishes + * to change. + */ + if (((cts->flags & CCB_TRANS_CURRENT_SETTINGS) != 0) + && ((cts->flags & CCB_TRANS_USER_SETTINGS) == 0)) { + tconf = &adv->tinfo[cts->ccb_h.target_id].current; update_type |= ADV_TRANS_GOAL; - if ((cts->flags & CCB_TRANS_USER_SETTINGS) != 0) + } else if (((cts->flags & CCB_TRANS_USER_SETTINGS) != 0) + && ((cts->flags & CCB_TRANS_CURRENT_SETTINGS) == 0)) { + tconf = &adv->tinfo[cts->ccb_h.target_id].user; update_type |= ADV_TRANS_USER; + } else { + ccb->ccb_h.status = CAM_REQ_INVALID; + break; + } s = splcam(); @@ -286,9 +298,26 @@ adv_action(struct cam_sim *sim, union ccb *ccb) } } - if ((cts->valid & CCB_TRANS_SYNC_RATE_VALID) != 0) { + /* + * If the user specifies either the sync rate, or offset, + * but not both, the unspecified parameter defaults to its + * current value in transfer negotiations. + */ + if (((cts->valid & CCB_TRANS_SYNC_RATE_VALID) != 0) + || ((cts->valid & CCB_TRANS_SYNC_OFFSET_VALID) != 0)) { + /* + * If the user provided a sync rate but no offset, + * use the current offset. + */ if ((cts->valid & CCB_TRANS_SYNC_OFFSET_VALID) == 0) - cts->sync_offset = 0; + cts->sync_offset = tconf->offset; + + /* + * If the user provided an offset but no sync rate, + * use the current sync rate. + */ + if ((cts->valid & CCB_TRANS_SYNC_RATE_VALID) == 0) + cts->sync_period = tconf->period; adv_period_offset_to_sdtr(adv, &cts->sync_period, &cts->sync_offset, @@ -298,6 +327,7 @@ adv_action(struct cam_sim *sim, union ccb *ccb) cts->ccb_h.target_id, cts->sync_period, cts->sync_offset, update_type); } + splx(s); ccb->ccb_h.status = CAM_REQ_CMP; xpt_done(ccb); @@ -402,6 +432,7 @@ adv_action(struct cam_sim *sim, union ccb *ccb) cpi->max_lun = 7; cpi->initiator_id = adv->scsi_id; cpi->bus_id = cam_sim_bus(sim); + cpi->base_transfer_speed = 3300; strncpy(cpi->sim_vid, "FreeBSD", SIM_IDLEN); strncpy(cpi->hba_vid, "Advansys", HBA_IDLEN); strncpy(cpi->dev_name, cam_sim_name(sim), DEV_IDLEN); diff --git a/sys/dev/advansys/advlib.c b/sys/dev/advansys/advlib.c index 66640c8..568bf91 100644 --- a/sys/dev/advansys/advlib.c +++ b/sys/dev/advansys/advlib.c @@ -28,7 +28,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: advlib.c,v 1.11 1999/04/11 02:55:50 eivind Exp $ + * $Id: advlib.c,v 1.12 1999/04/19 21:27:36 gibbs Exp $ */ /* * Ported from: @@ -1790,7 +1790,8 @@ adv_put_ready_queue(struct adv_softc *adv, struct adv_scsi_q *scsiq, tid_no = ADV_TIX_TO_TID(scsiq->q2.target_ix); tinfo = &adv->tinfo[tid_no]; - if (tinfo->current.period != tinfo->goal.period) { + if ((tinfo->current.period != tinfo->goal.period) + || (tinfo->current.offset != tinfo->goal.offset)) { adv_msgout_sdtr(adv, tinfo->goal.period, tinfo->goal.offset); scsiq->q1.cntl |= QC_MSG_OUT; diff --git a/sys/dev/advansys/adwcam.c b/sys/dev/advansys/adwcam.c index e2c3921..aef4612 100644 --- a/sys/dev/advansys/adwcam.c +++ b/sys/dev/advansys/adwcam.c @@ -30,7 +30,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: adwcam.c,v 1.1 1998/10/07 03:20:46 gibbs Exp $ + * $Id: adwcam.c,v 1.2 1998/10/15 23:47:14 gibbs Exp $ */ /* * Ported from: @@ -595,7 +595,8 @@ adw_action(struct cam_sim *sim, union ccb *ccb) } } - if ((cts->valid & CCB_TRANS_SYNC_RATE_VALID) != 0) { + if (((cts->valid & CCB_TRANS_SYNC_RATE_VALID) != 0) + || ((cts->valid & CCB_TRANS_SYNC_OFFSET_VALID) != 0)) { u_int sdtrenb_orig; u_int sdtrenb; u_int ultraenb_orig; @@ -613,14 +614,18 @@ adw_action(struct cam_sim *sim, union ccb *ccb) sdtrdone = adw_lram_read_16(adw, ADW_MC_SDTR_DONE); - if (cts->sync_period == 0) { - sdtrenb &= ~target_mask; - } else if (cts->sync_period > 12) { - ultraenb &= ~target_mask; - sdtrenb |= target_mask; - } else { - ultraenb |= target_mask; - sdtrenb |= target_mask; + if ((cts->valid + & CCB_TRANS_SYNC_RATE_VALID) != 0) { + + if (cts->sync_period == 0) { + sdtrenb &= ~target_mask; + } else if (cts->sync_period > 12) { + ultraenb &= ~target_mask; + sdtrenb |= target_mask; + } else { + ultraenb |= target_mask; + sdtrenb |= target_mask; + } } if ((cts->valid @@ -786,6 +791,7 @@ adw_action(struct cam_sim *sim, union ccb *ccb) cpi->max_lun = ADW_MAX_LUN; cpi->initiator_id = adw->initiator_id; cpi->bus_id = cam_sim_bus(sim); + cpi->base_transfer_speed = 3300; strncpy(cpi->sim_vid, "FreeBSD", SIM_IDLEN); strncpy(cpi->hba_vid, "AdvanSys", HBA_IDLEN); strncpy(cpi->dev_name, cam_sim_name(sim), DEV_IDLEN); diff --git a/sys/dev/aha/aha.c b/sys/dev/aha/aha.c index 8ab5a85..f0456db 100644 --- a/sys/dev/aha/aha.c +++ b/sys/dev/aha/aha.c @@ -55,7 +55,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: aha.c,v 1.20 1999/03/02 20:56:07 imp Exp $ + * $Id: aha.c,v 1.21 1999/04/11 02:55:50 eivind Exp $ */ #include "pnp.h" @@ -1029,7 +1029,7 @@ ahaaction(struct cam_sim *sim, union ccb *ccb) case XPT_SET_TRAN_SETTINGS: { /* XXX Implement */ - ccb->ccb_h.status = CAM_REQ_CMP; + ccb->ccb_h.status = CAM_PROVIDE_FAIL; xpt_done(ccb); break; } @@ -1120,6 +1120,7 @@ ahaaction(struct cam_sim *sim, union ccb *ccb) cpi->max_lun = 7; cpi->initiator_id = aha->scsi_id; cpi->bus_id = cam_sim_bus(sim); + cpi->base_transfer_speed = 3300; strncpy(cpi->sim_vid, "FreeBSD", SIM_IDLEN); strncpy(cpi->hba_vid, "Adaptec", HBA_IDLEN); strncpy(cpi->dev_name, cam_sim_name(sim), DEV_IDLEN); diff --git a/sys/dev/ahb/ahb.c b/sys/dev/ahb/ahb.c index 4bdc6bb..6e0db43 100644 --- a/sys/dev/ahb/ahb.c +++ b/sys/dev/ahb/ahb.c @@ -25,7 +25,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: ahb.c,v 1.9 1999/04/18 15:50:33 peter Exp $ + * $Id: ahb.c,v 1.10 1999/04/23 23:29:00 gibbs Exp $ */ #include "eisa.h" @@ -1214,6 +1214,7 @@ ahbaction(struct cam_sim *sim, union ccb *ccb) cpi->max_lun = 7; cpi->initiator_id = ahb->scsi_id; cpi->bus_id = cam_sim_bus(sim); + cpi->base_transfer_speed = 3300; strncpy(cpi->sim_vid, "FreeBSD", SIM_IDLEN); strncpy(cpi->hba_vid, "Adaptec", HBA_IDLEN); strncpy(cpi->dev_name, cam_sim_name(sim), DEV_IDLEN); diff --git a/sys/dev/aic7xxx/aic7xxx.c b/sys/dev/aic7xxx/aic7xxx.c index 346e4b8..215e0a4 100644 --- a/sys/dev/aic7xxx/aic7xxx.c +++ b/sys/dev/aic7xxx/aic7xxx.c @@ -36,7 +36,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: aic7xxx.c,v 1.23 1999/04/23 23:27:29 gibbs Exp $ + * $Id: aic7xxx.c,v 1.24 1999/04/26 22:03:44 ken Exp $ */ /* * A few notes on features of the driver. @@ -1097,6 +1097,7 @@ ahc_update_target_msg_request(struct ahc_softc *ahc, targ_msg_req_orig = ahc->targ_msg_req; if (tinfo->current.period != tinfo->goal.period || tinfo->current.width != tinfo->goal.width + || tinfo->current.offset != tinfo->goal.offset || (force && (tinfo->goal.period != 0 || tinfo->goal.width != MSG_EXT_WDTR_BUS_8_BIT))) @@ -4480,7 +4481,8 @@ ahc_action(struct cam_sim *sim, union ccb *ccb) cts->bus_width, update_type); } - if ((cts->valid & CCB_TRANS_SYNC_RATE_VALID) != 0) { + if (((cts->valid & CCB_TRANS_SYNC_RATE_VALID) != 0) + || ((cts->valid & CCB_TRANS_SYNC_OFFSET_VALID) != 0)) { struct ahc_syncrate *syncrate; u_int maxsync; @@ -4498,6 +4500,13 @@ ahc_action(struct cam_sim *sim, union ccb *ccb) cts->sync_offset = tinfo->goal.offset; } + if ((cts->valid & CCB_TRANS_SYNC_RATE_VALID) == 0) { + if (update_type & AHC_TRANS_USER) + cts->sync_period = tinfo->user.period; + else + cts->sync_period = tinfo->goal.period; + } + syncrate = ahc_find_syncrate(ahc, &cts->sync_period, maxsync); ahc_validate_offset(ahc, syncrate, &cts->sync_offset, @@ -4645,6 +4654,7 @@ ahc_action(struct cam_sim *sim, union ccb *ccb) cpi->hba_misc |= PIM_NOBUSRESET; } cpi->bus_id = cam_sim_bus(sim); + cpi->base_transfer_speed = 3300; strncpy(cpi->sim_vid, "FreeBSD", SIM_IDLEN); strncpy(cpi->hba_vid, "Adaptec", HBA_IDLEN); strncpy(cpi->dev_name, cam_sim_name(sim), DEV_IDLEN); diff --git a/sys/dev/buslogic/bt.c b/sys/dev/buslogic/bt.c index 343ad91..23de96c 100644 --- a/sys/dev/buslogic/bt.c +++ b/sys/dev/buslogic/bt.c @@ -29,7 +29,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: bt.c,v 1.18 1999/04/23 23:28:19 gibbs Exp $ + * $Id: bt.c,v 1.19 1999/05/05 06:45:09 imp Exp $ */ /* @@ -1250,7 +1250,7 @@ btaction(struct cam_sim *sim, union ccb *ccb) case XPT_SET_TRAN_SETTINGS: { /* XXX Implement */ - ccb->ccb_h.status = CAM_REQ_CMP; + ccb->ccb_h.status = CAM_PROVIDE_FAIL; xpt_done(ccb); break; } @@ -1354,6 +1354,7 @@ btaction(struct cam_sim *sim, union ccb *ccb) cpi->max_lun = 7; cpi->initiator_id = bt->scsi_id; cpi->bus_id = cam_sim_bus(sim); + cpi->base_transfer_speed = 3300; strncpy(cpi->sim_vid, "FreeBSD", SIM_IDLEN); strncpy(cpi->hba_vid, "BusLogic", HBA_IDLEN); strncpy(cpi->dev_name, cam_sim_name(sim), DEV_IDLEN); diff --git a/sys/dev/dpt/dpt_scsi.c b/sys/dev/dpt/dpt_scsi.c index 47c12a5..d3143df 100644 --- a/sys/dev/dpt/dpt_scsi.c +++ b/sys/dev/dpt/dpt_scsi.c @@ -43,7 +43,7 @@ * arrays that span controllers (Wow!). */ -#ident "$Id: dpt_scsi.c,v 1.21 1998/12/22 00:52:27 eivind Exp $" +#ident "$Id: dpt_scsi.c,v 1.22 1998/12/22 20:21:12 eivind Exp $" #define _DPT_C_ @@ -974,6 +974,7 @@ dpt_action(struct cam_sim *sim, union ccb *ccb) cpi->max_lun = dpt->max_lun; cpi->initiator_id = dpt->hostid[cam_sim_bus(sim)]; cpi->bus_id = cam_sim_bus(sim); + cpi->base_transfer_speed = 3300; strncpy(cpi->sim_vid, "FreeBSD", SIM_IDLEN); strncpy(cpi->hba_vid, "DPT", HBA_IDLEN); strncpy(cpi->dev_name, cam_sim_name(sim), DEV_IDLEN); diff --git a/sys/dev/isp/isp_freebsd.c b/sys/dev/isp/isp_freebsd.c index 2c42f81..edeb582 100644 --- a/sys/dev/isp/isp_freebsd.c +++ b/sys/dev/isp/isp_freebsd.c @@ -1,4 +1,4 @@ -/* $Id: isp_freebsd.c,v 1.15 1999/04/04 01:35:03 mjacob Exp $ */ +/* $Id: isp_freebsd.c,v 1.16 1999/04/04 02:22:42 mjacob Exp $ */ /* release_4_3_99 */ /* * Platform (FreeBSD) dependent common attachment code for Qlogic adapters. @@ -83,15 +83,6 @@ isp_attach(struct ispsoftc *isp) csa.callback_arg = isp->isp_sim; xpt_action((union ccb *)&csa); - /* - * Set base transfer capabilities for Fibre Channel. - * Technically not correct because we don't know - * what media we're running on top of- but we'll - * look good if we always say 100MB/s. - */ - if (isp->isp_type & ISP_HA_FC) { - isp->isp_sim->base_transfer_speed = 100000; - } if (isp->isp_state == ISP_INITSTATE) isp->isp_state = ISP_RUNSTATE; } @@ -524,6 +515,13 @@ isp_action(struct cam_sim *sim, union ccb *ccb) #else cpi->max_lun = (1 << 4) - 1; #endif + /* + * Set base transfer capabilities for Fibre Channel. + * Technically not correct because we don't know + * what media we're running on top of- but we'll + * look good if we always say 100MB/s. + */ + cpi->base_transfer_speed = 100000; } else { cpi->hba_misc = 0; cpi->initiator_id = @@ -542,6 +540,7 @@ isp_action(struct cam_sim *sim, union ccb *ccb) } else { cpi->max_lun = (1 << 3) - 1; } + cpi->base_transfer_speed = 3300; } cpi->bus_id = cam_sim_bus(sim); diff --git a/sys/dev/ppbus/vpo.c b/sys/dev/ppbus/vpo.c index 17b67c5..046d575 100644 --- a/sys/dev/ppbus/vpo.c +++ b/sys/dev/ppbus/vpo.c @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: vpo.c,v 1.10 1999/01/09 18:05:46 nsouch Exp $ + * $Id: vpo.c,v 1.11 1999/01/10 12:04:55 nsouch Exp $ * */ @@ -421,6 +421,7 @@ vpo_action(struct cam_sim *sim, union ccb *ccb) cpi->max_lun = 0; cpi->initiator_id = VP0_INITIATOR; cpi->bus_id = sim->bus_id; + cpi->base_transfer_speed = 3300; strncpy(cpi->sim_vid, "FreeBSD", SIM_IDLEN); strncpy(cpi->hba_vid, "Iomega", HBA_IDLEN); strncpy(cpi->dev_name, sim->sim_name, DEV_IDLEN); diff --git a/sys/i386/eisa/ahb.c b/sys/i386/eisa/ahb.c index 4bdc6bb..6e0db43 100644 --- a/sys/i386/eisa/ahb.c +++ b/sys/i386/eisa/ahb.c @@ -25,7 +25,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: ahb.c,v 1.9 1999/04/18 15:50:33 peter Exp $ + * $Id: ahb.c,v 1.10 1999/04/23 23:29:00 gibbs Exp $ */ #include "eisa.h" @@ -1214,6 +1214,7 @@ ahbaction(struct cam_sim *sim, union ccb *ccb) cpi->max_lun = 7; cpi->initiator_id = ahb->scsi_id; cpi->bus_id = cam_sim_bus(sim); + cpi->base_transfer_speed = 3300; strncpy(cpi->sim_vid, "FreeBSD", SIM_IDLEN); strncpy(cpi->hba_vid, "Adaptec", HBA_IDLEN); strncpy(cpi->dev_name, cam_sim_name(sim), DEV_IDLEN); diff --git a/sys/i386/isa/bs/bs.c b/sys/i386/isa/bs/bs.c index 1f93746..0fdf78b8 100644 --- a/sys/i386/isa/bs/bs.c +++ b/sys/i386/isa/bs/bs.c @@ -206,6 +206,7 @@ bs_scsi_cmd(struct cam_sim *sim, union ccb *ccb) cpi->max_lun = 7; cpi->initiator_id = bsc->sc_hostid; cpi->bus_id = cam_sim_bus(sim); + cpi->base_transfer_speed = 3300; strncpy(cpi->sim_vid, "FreeBSD", SIM_IDLEN); strncpy(cpi->hba_vid, "NEC", HBA_IDLEN); strncpy(cpi->dev_name, cam_sim_name(sim), DEV_IDLEN); diff --git a/sys/pci/ncr.c b/sys/pci/ncr.c index a32e14a..38dd843 100644 --- a/sys/pci/ncr.c +++ b/sys/pci/ncr.c @@ -1,6 +1,6 @@ /************************************************************************** ** -** $Id: ncr.c,v 1.142 1999/01/27 23:45:43 dillon Exp $ +** $Id: ncr.c,v 1.143 1999/04/24 20:14:02 peter Exp $ ** ** Device driver for the NCR 53C8XX PCI-SCSI-Controller Family. ** @@ -1361,7 +1361,7 @@ static void ncr_attach (pcici_t tag, int unit); #if !defined(lint) static const char ident[] = - "\n$Id: ncr.c,v 1.142 1999/01/27 23:45:43 dillon Exp $\n"; + "\n$Id: ncr.c,v 1.143 1999/04/24 20:14:02 peter Exp $\n"; #endif static const u_long ncr_version = NCR_VERSION * 11 @@ -4022,8 +4022,10 @@ ncr_action (struct cam_sim *sim, union ccb *ccb) != tp->tinfo.goal.width) { tp->nego_cp = cp; nego = NS_WIDE; - } else if (tp->tinfo.current.period - != tp->tinfo.goal.period) { + } else if ((tp->tinfo.current.period + != tp->tinfo.goal.period) + || (tp->tinfo.current.offset + != tp->tinfo.goal.offset)) { tp->nego_cp = cp; nego = NS_SYNC; }; @@ -4327,10 +4329,13 @@ ncr_action (struct cam_sim *sim, union ccb *ccb) cts->bus_width = np->maxwide; } - if ((cts->valid & CCB_TRANS_SYNC_RATE_VALID) != 0) { - if (cts->sync_period != 0 - && (cts->sync_period < np->minsync)) - cts->sync_period = np->minsync; + if (((cts->valid & CCB_TRANS_SYNC_RATE_VALID) != 0) + || ((cts->valid & CCB_TRANS_SYNC_OFFSET_VALID) != 0)) { + if ((cts->valid & CCB_TRANS_SYNC_RATE_VALID) != 0) { + if (cts->sync_period != 0 + && (cts->sync_period < np->minsync)) + cts->sync_period = np->minsync; + } if ((cts->valid & CCB_TRANS_SYNC_OFFSET_VALID) != 0) { if (cts->sync_offset == 0) cts->sync_period = 0; @@ -4339,14 +4344,22 @@ ncr_action (struct cam_sim *sim, union ccb *ccb) } } if ((update_type & NCR_TRANS_USER) != 0) { - tp->tinfo.user.period = cts->sync_period; - tp->tinfo.user.offset = cts->sync_offset; - tp->tinfo.user.width = cts->bus_width; + if ((cts->valid & CCB_TRANS_SYNC_RATE_VALID) != 0) + tp->tinfo.user.period = cts->sync_period; + if ((cts->valid & CCB_TRANS_SYNC_OFFSET_VALID) != 0) + tp->tinfo.user.offset = cts->sync_offset; + if ((cts->valid & CCB_TRANS_BUS_WIDTH_VALID) != 0) + tp->tinfo.user.width = cts->bus_width; } if ((update_type & NCR_TRANS_GOAL) != 0) { - tp->tinfo.goal.period = cts->sync_period; - tp->tinfo.goal.offset = cts->sync_offset; - tp->tinfo.goal.width = cts->bus_width; + if ((cts->valid & CCB_TRANS_SYNC_RATE_VALID) != 0) + tp->tinfo.goal.period = cts->sync_period; + + if ((cts->valid & CCB_TRANS_SYNC_OFFSET_VALID) != 0) + tp->tinfo.goal.offset = cts->sync_offset; + + if ((cts->valid & CCB_TRANS_BUS_WIDTH_VALID) != 0) + tp->tinfo.goal.width = cts->bus_width; } splx(s); ccb->ccb_h.status = CAM_REQ_CMP; @@ -4368,21 +4381,25 @@ ncr_action (struct cam_sim *sim, union ccb *ccb) if ((cts->flags & CCB_TRANS_CURRENT_SETTINGS) != 0) { tinfo = &tp->tinfo.current; if (tp->tinfo.disc_tag & NCR_CUR_DISCENB) - cts->flags = CCB_TRANS_DISC_ENB; + cts->flags |= CCB_TRANS_DISC_ENB; else - cts->flags = 0; + cts->flags &= ~CCB_TRANS_DISC_ENB; if (tp->tinfo.disc_tag & NCR_CUR_TAGENB) cts->flags |= CCB_TRANS_TAG_ENB; + else + cts->flags &= ~CCB_TRANS_TAG_ENB; } else { tinfo = &tp->tinfo.user; if (tp->tinfo.disc_tag & NCR_USR_DISCENB) - cts->flags = CCB_TRANS_DISC_ENB; + cts->flags |= CCB_TRANS_DISC_ENB; else - cts->flags = 0; + cts->flags &= ~CCB_TRANS_DISC_ENB; if (tp->tinfo.disc_tag & NCR_USR_TAGENB) cts->flags |= CCB_TRANS_TAG_ENB; + else + cts->flags &= ~CCB_TRANS_TAG_ENB; } cts->sync_period = tinfo->period; @@ -4458,6 +4475,7 @@ ncr_action (struct cam_sim *sim, union ccb *ccb) cpi->max_lun = MAX_LUN - 1; cpi->initiator_id = np->myaddr; cpi->bus_id = cam_sim_bus(sim); + cpi->base_transfer_speed = 3300; strncpy(cpi->sim_vid, "FreeBSD", SIM_IDLEN); strncpy(cpi->hba_vid, "Symbios", HBA_IDLEN); strncpy(cpi->dev_name, cam_sim_name(sim), DEV_IDLEN); @@ -4785,8 +4803,8 @@ ncr_freeze_devq (ncb_p np, struct cam_path *path) **========================================================== */ -void ncr_init -(ncb_p np, char * msg, u_long code) +void +ncr_init(ncb_p np, char * msg, u_long code) { int i; @@ -7074,8 +7092,8 @@ static void ncr_getclock (ncb_p np, u_char multiplier) stest1 = INB(nc_stest1); np->multiplier = 1; - /* always false, except for 875 with clock doubler selected */ - if ((stest1 & (DBLEN+DBLSEL)) == DBLEN+DBLSEL) { + + if (multiplier > 1) { np->multiplier = multiplier; np->clock_khz = 40000 * multiplier; } else { diff --git a/sys/pci/simos.c b/sys/pci/simos.c index d833beb..4ad9bdf 100644 --- a/sys/pci/simos.c +++ b/sys/pci/simos.c @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $Id: simos.c,v 1.3 1998/12/14 06:32:57 dillon Exp $ + * $Id: simos.c,v 1.4 1999/04/24 20:14:03 peter Exp $ */ #include <sys/param.h> @@ -316,6 +316,7 @@ simos_action(struct cam_sim *sim, union ccb *ccb) cpi->max_lun = 0; cpi->initiator_id = 7; cpi->bus_id = sim->bus_id; + cpi->base_transfer_speed = 3300; strncpy(cpi->sim_vid, "FreeBSD", SIM_IDLEN); strncpy(cpi->hba_vid, "SimOS", HBA_IDLEN); strncpy(cpi->dev_name, sim->sim_name, DEV_IDLEN); |