summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorken <ken@FreeBSD.org>1999-05-06 20:16:39 +0000
committerken <ken@FreeBSD.org>1999-05-06 20:16:39 +0000
commit2bb789d7a3f2adcda33230cdaeda95918cf54a8d (patch)
tree73c8cd7f798e8bccec0dbcf97e5d0e4447a4ec4e /sys
parentf57a01ebfcda8effff50ce6f1c90b572e76d8cd2 (diff)
downloadFreeBSD-src-2bb789d7a3f2adcda33230cdaeda95918cf54a8d.zip
FreeBSD-src-2bb789d7a3f2adcda33230cdaeda95918cf54a8d.tar.gz
Add a number of interrelated CAM feature enhancements and bug fixes.
NOTE: These changes will require recompilation of any userland applications, like cdrecord, xmcd, etc., that use the CAM passthrough interface. A make world is recommended. camcontrol.[c8]: - We now support two new commands, "tags" and "negotiate". - The tags commands allows users to view the number of tagged openings for a device as well as a number of other related parameters, and it allows users to set tagged openings for a device. - The negotiate command allows users to enable and disable disconnection and tagged queueing, set sync rates, offsets and bus width. Note that not all of those features are available for all controllers. Only the adv, ahc, and ncr drivers fully support all of the features at this point. Some cards do not allow the setting of sync rates, offsets and the like, and some of the drivers don't have any facilities to do so. Some drivers, like the adw driver, only support enabling or disabling sync negotiation, but do not support setting sync rates. - new description in the camcontrol man page of how to format a disk - cleanup of the camcontrol inquiry command - add support in the 'devlist' command for skipping unconfigured devices if -v was not specified on the command line. - make use of the new base_transfer_speed in the path inquiry CCB. - fix CCB bzero cases cam_xpt.c, cam_sim.[ch], cam_ccb.h: - new flags on many CCB function codes to designate whether they're non-immediate, use a user-supplied CCB, and can only be passed from userland programs via the xpt device. Use these flags in the transport layer and pass driver to categorize CCBs. - new flag in the transport layer device matching code for device nodes that indicates whether a device is unconfigured - bump the CAM version from 0x10 to 0x11 - Change the CAM ioctls to use the version as their group code, so we can force users to recompile code even when the CCB size doesn't change. - add + fill in a new value in the path inquiry CCB, base_transfer_speed. Remove a corresponding field from the cam_sim structure, and add code to every SIM to set this field to the proper value. - Fix the set transfer settings code in the transport layer. scsi_cd.c: - make some variables volatile instead of just casting them in various places - fix a race condition in the changer code - attach unless we get a "logical unit not supported" error. This should fix all of the cases where people have devices that return weird errors when they don't have media in the drive. scsi_da.c: - attach unless we get a "logical unit not supported" error scsi_pass.c: - for immediate CCBs, just malloc a CCB to send the user request in. This gets rid of the 'held' count problem in camcontrol tags. scsi_pass.h: - change the CAM ioctls to use the CAM version as their group code. adv driver: - Allow changing the sync rate and offset separately. adw driver - Allow changing the sync rate and offset separately. aha driver: - Don't return CAM_REQ_CMP for SET_TRAN_SETTINGS CCBs. ahc driver: - Allow setting offset and sync rate separately bt driver: - Don't return CAM_REQ_CMP for SET_TRAN_SETTINGS CCBs. NCR driver: - Fix the ultra/ultra 2 negotiation bug - allow setting both the sync rate and offset separately Other HBA drivers: - Put code in to set the base_transfer_speed field for XPT_GET_TRAN_SETTINGS CCBs. Reviewed by: gibbs, mjacob (isp), imp (aha)
Diffstat (limited to 'sys')
-rw-r--r--sys/cam/cam_ccb.h120
-rw-r--r--sys/cam/cam_sim.c13
-rw-r--r--sys/cam/cam_sim.h13
-rw-r--r--sys/cam/cam_xpt.c68
-rw-r--r--sys/cam/scsi/scsi_cd.c35
-rw-r--r--sys/cam/scsi/scsi_da.c13
-rw-r--r--sys/cam/scsi/scsi_pass.c48
-rw-r--r--sys/cam/scsi/scsi_pass.h8
-rw-r--r--sys/dev/advansys/advansys.c45
-rw-r--r--sys/dev/advansys/advlib.c5
-rw-r--r--sys/dev/advansys/adwcam.c26
-rw-r--r--sys/dev/aha/aha.c5
-rw-r--r--sys/dev/ahb/ahb.c3
-rw-r--r--sys/dev/aic7xxx/aic7xxx.c14
-rw-r--r--sys/dev/buslogic/bt.c5
-rw-r--r--sys/dev/dpt/dpt_scsi.c3
-rw-r--r--sys/dev/isp/isp_freebsd.c19
-rw-r--r--sys/dev/ppbus/vpo.c3
-rw-r--r--sys/i386/eisa/ahb.c3
-rw-r--r--sys/i386/isa/bs/bs.c1
-rw-r--r--sys/pci/ncr.c62
-rw-r--r--sys/pci/simos.c3
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);
OpenPOWER on IntegriCloud