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)
This commit is contained in:
Kenneth D. Merry 1999-05-06 20:16:39 +00:00
parent b0eeea2042
commit 9deea8574e
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=46581
24 changed files with 1398 additions and 224 deletions

View File

@ -1,5 +1,5 @@
.\"
.\" Copyright (c) 1998 Kenneth D. Merry.
.\" Copyright (c) 1998, 1999 Kenneth D. Merry.
.\" All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
@ -25,7 +25,7 @@
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.\" $Id: camcontrol.8,v 1.9 1998/12/20 18:51:56 mjacob Exp $
.\" $Id: camcontrol.8,v 1.10 1999/02/27 07:55:58 ken Exp $
.\"
.Dd September 14, 1998
.Dt CAMCONTROL 8
@ -97,6 +97,24 @@ debug
.Op Fl S
.Op Fl c
.Aq all|off|bus Ns Op :target Ns Op :lun
.Nm camcontrol
tags
.Op generic args
.Op Fl N Ar tags
.Op Fl q
.Op Fl v
.Nm camcontrol
negotiate
.Op generic args
.Op Fl c
.Op Fl D Ar enable|disable
.Op Fl O Ar offset
.Op Fl q
.Op Fl R Ar syncrate
.Op Fl T Ar enable|disable
.Op Fl U
.Op Fl W Ar bus_width
.Op Fl v
.Sh DESCRIPTION
.Nm camcontrol
is a utility designed to provide a way for users to access and control the
@ -105,7 +123,7 @@ CAM subsystem.
.Pp
.Nm camcontrol
can cause a loss of data and/or system crashes if used improperly. Even
expert users are encouraged to excercise caution when using this command.
expert users are encouraged to exercise caution when using this command.
Novice users should stay away from this utility.
.Pp
.Nm camcontrol
@ -239,7 +257,7 @@ This can be overridden by specifying a different file in the
.Ev SCSI_MODES
environment variable. The modepage command takes several arguments:
.Bl -tag -width 012345678901
.It Fl B
.It Fl d
Disable block descriptors for mode sense.
.It Fl e
This flag allows the user to edit values in the mode page.
@ -314,6 +332,135 @@ Turn on debugging for the given bus, target or lun. If the lun or target
and lun are not specified, they are wildcarded. (i.e., just specifying a
bus turns on debugging printfs for all devices on that bus.)
.El
.It tags
Show or set the number of "tagged openings" or simultaneous transactions
we attempt to queue to a particular device. By default, the
.Sq tags
command, with no command-specific arguments (i.e. only generic arguments)
prints out the "soft" maximum number of transactions that can be queued to
the device in question. For more detailed information, use the
.Fl v
argument described below.
.Bl -tag -width 0123456
.It Fl N Ar tags
Set the number of tags for the given device. This must be between the
minimum and maximum number set in the kernel quirk table. The default for
most devices that support tagged queueing is a minimum of 2 and a maximum
of 255. The minimum and maximum values for a given device may be
determined by using the
.Fl v
switch. The meaning of the
.Fl v
switch for this
.Nm camcontrol
subcommand is described below.
.It Fl q
Be quiet, and don't report the number of tags. This is generally used when
setting the number of tags.
.It Fl v
The verbose flag has special functionality for the
.Em tags
argument. It causes
.Nm camcontrol
to print out the tagged queueing related fields of the XPT_GDEV_TYPE CCB:
.Bl -tag -width 0123456789012
.It dev_openings
This is the amount of capacity for transactions queued to a given device.
.It dev_active
This is the number of transactions currently queued to a device.
.It devq_openings
This is the kernel queue space for transactions. This count usually mirrors
dev_openings except during error recovery operations when
the device queue is frozen (device is not allowed to receive
commands), the number of dev_openings is reduced, or transaction
replay is occurring.
.It devq_queued
This is the number of transactions waiting in the kernel queue for capacity
on the device. This number is usually zero unless error recovery is in
progress.
.It held
The held count is the number of CCBs held by peripheral drivers that have
either just been completed or are about to be released to the transport
layer for service by a device. Held CCBs reserve capacity on a given
device.
.It mintags
This is the current "hard" minimum number of transactions that can be
queued to a device at once. The
.Ar dev_openings
value above cannot go below this number. The default value for
.Ar mintags
is 2, although it may be set higher or lower for various devices.
.It maxtags
This is the "hard" maximum number of transactions that can be queued to a
device at one time. The
.Ar dev_openings
value cannot go above this number. The default value for
.Ar maxtags
is 255, although it may be set higher or lower for various devices.
.El
.El
.It negotiate
Show or negotiate various communication parameters. Some controllers may
not support setting or changing some of these values. For instance, the
Adaptec 174x controllers do not support changing a device's sync rate or
offset.
.Nm camcontrol
will not attempt to set the parameter if the controller indicates that it
does not support setting the parameter. To find out what the controller
supports, use the
.Fl v
flag. The meaning of the
.Fl v
flag for the
.Sq negotiate
command is described below. Also, some controller drivers don't support
setting negotiation parameters, even if the underlying controller supports
negotiation changes. Some controllers, such as the Advansys wide
controllers, support enabling and disabling synchronous negotiation for
a device, but do not support setting the synchronous negotiation rate.
.Bl -tag -width 01234567890123456
.It Fl a
Attempt to make the negotiation settings take effect immediately by sending
a Test Unit Ready command to the device.
.It Fl c
Show or set current negotiation settings. This is the default.
.It Fl D Ar enable|disable
Enable or disable disconnection.
.It Fl O Ar offset
Set the command delay offset.
.It Fl q
Be quiet, don't print anything. This is generally useful when you want to
set a parameter, but don't want any status information.
.It Fl R Ar syncrate
Change the synchronization rate for a device. The sync rate is a floating
point value specified in MHz. So, for instance,
.Sq 20.000
is a legal value, as is
.Sq 20 .
.It Fl T Ar enable|disable
Enable or disable tagged queueing for a device.
.It Fl U
Show or set user negotiation settings. The default is to show or set
current negotiation settings.
.It Fl v
The verbose switch has special meaning for the
.Sq negotiate
subcommand. It causes
.Nm camcontrol
to print out the contents of a Path Inquiry (XPT_PATH_INQ) CCB sent to the
controller driver.
.It Fl W Ar bus_width
Specify the bus width to negotiate with a device. The bus width is
specified in bits. The only useful values to specify are 8, 16, and 32
bits. The controller must support the bus width in question in order for
the setting to take effect.
.El
.Pp
In general, sync rate and offset settings will not take effect for a
device until a command has been sent to the device. The
.Fl a
switch above will automatically send a Test Unit Ready to the device so
negotiation parameters will take effect.
.El
.Sh ENVIRONMENT
The
@ -396,8 +543,53 @@ Rescan SCSI bus 0 for devices that have been added, removed or changed.
.Pp
Rescan SCSI bus 0, target 1, lun 0 to see if it has been added, removed, or
changed.
.Pp
.Dl camcontrol tags -n da -u 5 -N 24
.Pp
Set the number of concurrent transactions for da5 to 24.
.Pp
.Bd -literal -offset foobar
camcontrol negotiate -n da -u 4 -T disable
.Ed
.Pp
Disable tagged queueing for da4.
.Pp
.Bd -literal -offset foobar
camcontrol negotiate -n da -u 3 -R 20.000 -O 15 -a
.Ed
.Pp
Negotiate a sync rate of 20MHz and an offset of 15 with da3. Then send a
Test Unit Ready command to make the settings take effect.
.Pp
.Bd -literal -offset foobar
camcontrol cmd -n da -u 3 -v -t 7200 -c "4 0 0 0 0 0"
.Ed
.Pp
Send the FORMAT UNIT (0x04) command to da3. This will low-level format the
disk. Print sense information if the command fails, and set the timeout to
two hours (or 7200 seconds).
.Pp
.Em WARNING! WARNING! WARNING!
.Pp
Low level formatting a disk will destroy ALL data on the disk. Use
extreme caution when issuing this command. Many users low-level format
disks that do not really need to be low-level formatted. There are
relatively few scenarios that call for low-level formatting a disk.
One reason for
low-level formatting a disk is if you want to change the physical sector
size of the disk. Another reason for low-level formatting a disk is to
revive the disk if you are getting "medium format corrupted" errors from the
disk in response to read and write requests.
.Pp
Some disks take longer than others to format. Users should specify a
timeout long enough to allow the format to complete. Some hard disks
will complete a format operation in a very short period of time (on the
order of 5 minutes or less). This is often because the drive doesn't
really support the FORMAT UNIT command -- it just accepts the command,
waits a few minutes and then returns it.
.Sh SEE ALSO
.Xr cam 3 ,
.Xr cam_cdbparse 3 ,
.Xr pass 4 ,
.Xr cam 9 ,
.Xr xpt 9

File diff suppressed because it is too large Load Diff

View File

@ -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 {

View File

@ -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;
@ -99,12 +98,6 @@ cam_sim_free(struct cam_sim *sim, int free_devq)
free(sim, M_DEVBUF);
}
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)
{

View File

@ -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;

View File

@ -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;

View File

@ -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),

View File

@ -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),

View File

@ -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;
}

View File

@ -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

View File

@ -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);

View File

@ -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;

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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 {

View File

@ -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);