svn commit: r216514 - in projects/graid/7: etc/mtree include lib/libcam sbin/atacontrol sbin/camcontrol share/man/man4 sys/cam sys/cam/ata sys/cam/scsi sys/conf sys/dev/ahci sys/dev/asr sys/dev/ata...

Alexander Motin mav at FreeBSD.org
Sat Dec 18 06:51:49 UTC 2010


Author: mav
Date: Sat Dec 18 06:51:48 2010
New Revision: 216514
URL: http://svn.freebsd.org/changeset/base/216514

Log:
  Sync CAM, ata(4), ahci(4), siis(4) and mvs(4) with HEAD around 2010-10.
  This should give people still using 7.x branch possibility to use new
  more reliable and functional CAM-based ATA instead of legacy ata(4).
  
  Some SCSI/RAID drivers were also updated to reflect CAM changes in bus
  scanning and support of the different transports/protocols, but not all
  of them.
  
  Due to many API/ABI changes this unlikely to be committed to 7-STABLE.
  
  Sponsored by:	Cisco

Added:
  projects/graid/7/share/man/man4/ada.4   (contents, props changed)
  projects/graid/7/share/man/man4/ahci.4   (contents, props changed)
  projects/graid/7/share/man/man4/mvs.4   (contents, props changed)
  projects/graid/7/share/man/man4/siis.4   (contents, props changed)
  projects/graid/7/sys/cam/ata/
  projects/graid/7/sys/cam/ata/ata_all.c   (contents, props changed)
  projects/graid/7/sys/cam/ata/ata_all.h   (contents, props changed)
  projects/graid/7/sys/cam/ata/ata_da.c   (contents, props changed)
  projects/graid/7/sys/cam/ata/ata_pmp.c   (contents, props changed)
  projects/graid/7/sys/cam/ata/ata_xpt.c   (contents, props changed)
  projects/graid/7/sys/cam/cam_xpt_internal.h   (contents, props changed)
  projects/graid/7/sys/cam/scsi/scsi_xpt.c   (contents, props changed)
  projects/graid/7/sys/dev/ahci/
  projects/graid/7/sys/dev/ahci/ahci.c   (contents, props changed)
  projects/graid/7/sys/dev/ahci/ahci.h   (contents, props changed)
  projects/graid/7/sys/dev/ata/ata-sata.c   (contents, props changed)
  projects/graid/7/sys/dev/ata/chipsets/
  projects/graid/7/sys/dev/ata/chipsets/ata-acard.c   (contents, props changed)
  projects/graid/7/sys/dev/ata/chipsets/ata-acerlabs.c   (contents, props changed)
  projects/graid/7/sys/dev/ata/chipsets/ata-adaptec.c   (contents, props changed)
  projects/graid/7/sys/dev/ata/chipsets/ata-ahci.c   (contents, props changed)
  projects/graid/7/sys/dev/ata/chipsets/ata-amd.c   (contents, props changed)
  projects/graid/7/sys/dev/ata/chipsets/ata-ati.c   (contents, props changed)
  projects/graid/7/sys/dev/ata/chipsets/ata-cenatek.c   (contents, props changed)
  projects/graid/7/sys/dev/ata/chipsets/ata-cypress.c   (contents, props changed)
  projects/graid/7/sys/dev/ata/chipsets/ata-cyrix.c   (contents, props changed)
  projects/graid/7/sys/dev/ata/chipsets/ata-highpoint.c   (contents, props changed)
  projects/graid/7/sys/dev/ata/chipsets/ata-intel.c   (contents, props changed)
  projects/graid/7/sys/dev/ata/chipsets/ata-ite.c   (contents, props changed)
  projects/graid/7/sys/dev/ata/chipsets/ata-jmicron.c   (contents, props changed)
  projects/graid/7/sys/dev/ata/chipsets/ata-marvell.c   (contents, props changed)
  projects/graid/7/sys/dev/ata/chipsets/ata-micron.c   (contents, props changed)
  projects/graid/7/sys/dev/ata/chipsets/ata-national.c   (contents, props changed)
  projects/graid/7/sys/dev/ata/chipsets/ata-netcell.c   (contents, props changed)
  projects/graid/7/sys/dev/ata/chipsets/ata-nvidia.c   (contents, props changed)
  projects/graid/7/sys/dev/ata/chipsets/ata-promise.c   (contents, props changed)
  projects/graid/7/sys/dev/ata/chipsets/ata-serverworks.c   (contents, props changed)
  projects/graid/7/sys/dev/ata/chipsets/ata-siliconimage.c   (contents, props changed)
  projects/graid/7/sys/dev/ata/chipsets/ata-sis.c   (contents, props changed)
  projects/graid/7/sys/dev/ata/chipsets/ata-via.c   (contents, props changed)
  projects/graid/7/sys/dev/mvs/
  projects/graid/7/sys/dev/mvs/mvs.c   (contents, props changed)
  projects/graid/7/sys/dev/mvs/mvs.h   (contents, props changed)
  projects/graid/7/sys/dev/mvs/mvs_if.m   (contents, props changed)
  projects/graid/7/sys/dev/mvs/mvs_pci.c   (contents, props changed)
  projects/graid/7/sys/dev/mvs/mvs_soc.c   (contents, props changed)
  projects/graid/7/sys/dev/siis/
  projects/graid/7/sys/dev/siis/siis.c   (contents, props changed)
  projects/graid/7/sys/dev/siis/siis.h   (contents, props changed)
  projects/graid/7/sys/modules/ahci/
  projects/graid/7/sys/modules/ahci/Makefile   (contents, props changed)
  projects/graid/7/sys/modules/ata/atacore/
  projects/graid/7/sys/modules/ata/atacore/Makefile   (contents, props changed)
  projects/graid/7/sys/modules/ata/atadevel/
  projects/graid/7/sys/modules/ata/atadevel/Makefile   (contents, props changed)
  projects/graid/7/sys/modules/ata/atadevel/ata-devel.c   (contents, props changed)
  projects/graid/7/sys/modules/ata/atapci/Makefile.inc   (contents, props changed)
  projects/graid/7/sys/modules/ata/atapci/chipsets/
  projects/graid/7/sys/modules/ata/atapci/chipsets/Makefile   (contents, props changed)
  projects/graid/7/sys/modules/ata/atapci/chipsets/Makefile.inc   (contents, props changed)
  projects/graid/7/sys/modules/ata/atapci/chipsets/ataacard/
  projects/graid/7/sys/modules/ata/atapci/chipsets/ataacard/Makefile   (contents, props changed)
  projects/graid/7/sys/modules/ata/atapci/chipsets/ataacerlabs/
  projects/graid/7/sys/modules/ata/atapci/chipsets/ataacerlabs/Makefile   (contents, props changed)
  projects/graid/7/sys/modules/ata/atapci/chipsets/ataadaptec/
  projects/graid/7/sys/modules/ata/atapci/chipsets/ataadaptec/Makefile   (contents, props changed)
  projects/graid/7/sys/modules/ata/atapci/chipsets/ataahci/
  projects/graid/7/sys/modules/ata/atapci/chipsets/ataahci/Makefile   (contents, props changed)
  projects/graid/7/sys/modules/ata/atapci/chipsets/ataamd/
  projects/graid/7/sys/modules/ata/atapci/chipsets/ataamd/Makefile   (contents, props changed)
  projects/graid/7/sys/modules/ata/atapci/chipsets/ataati/
  projects/graid/7/sys/modules/ata/atapci/chipsets/ataati/Makefile   (contents, props changed)
  projects/graid/7/sys/modules/ata/atapci/chipsets/atacenatek/
  projects/graid/7/sys/modules/ata/atapci/chipsets/atacenatek/Makefile   (contents, props changed)
  projects/graid/7/sys/modules/ata/atapci/chipsets/atacypress/
  projects/graid/7/sys/modules/ata/atapci/chipsets/atacypress/Makefile   (contents, props changed)
  projects/graid/7/sys/modules/ata/atapci/chipsets/atacyrix/
  projects/graid/7/sys/modules/ata/atapci/chipsets/atacyrix/Makefile   (contents, props changed)
  projects/graid/7/sys/modules/ata/atapci/chipsets/atahighpoint/
  projects/graid/7/sys/modules/ata/atapci/chipsets/atahighpoint/Makefile   (contents, props changed)
  projects/graid/7/sys/modules/ata/atapci/chipsets/ataintel/
  projects/graid/7/sys/modules/ata/atapci/chipsets/ataintel/Makefile   (contents, props changed)
  projects/graid/7/sys/modules/ata/atapci/chipsets/ataite/
  projects/graid/7/sys/modules/ata/atapci/chipsets/ataite/Makefile   (contents, props changed)
  projects/graid/7/sys/modules/ata/atapci/chipsets/atajmicron/
  projects/graid/7/sys/modules/ata/atapci/chipsets/atajmicron/Makefile   (contents, props changed)
  projects/graid/7/sys/modules/ata/atapci/chipsets/atamarvell/
  projects/graid/7/sys/modules/ata/atapci/chipsets/atamarvell/Makefile   (contents, props changed)
  projects/graid/7/sys/modules/ata/atapci/chipsets/atamicron/
  projects/graid/7/sys/modules/ata/atapci/chipsets/atamicron/Makefile   (contents, props changed)
  projects/graid/7/sys/modules/ata/atapci/chipsets/atanational/
  projects/graid/7/sys/modules/ata/atapci/chipsets/atanational/Makefile   (contents, props changed)
  projects/graid/7/sys/modules/ata/atapci/chipsets/atanetcell/
  projects/graid/7/sys/modules/ata/atapci/chipsets/atanetcell/Makefile   (contents, props changed)
  projects/graid/7/sys/modules/ata/atapci/chipsets/atanvidia/
  projects/graid/7/sys/modules/ata/atapci/chipsets/atanvidia/Makefile   (contents, props changed)
  projects/graid/7/sys/modules/ata/atapci/chipsets/atapromise/
  projects/graid/7/sys/modules/ata/atapci/chipsets/atapromise/Makefile   (contents, props changed)
  projects/graid/7/sys/modules/ata/atapci/chipsets/ataserverworks/
  projects/graid/7/sys/modules/ata/atapci/chipsets/ataserverworks/Makefile   (contents, props changed)
  projects/graid/7/sys/modules/ata/atapci/chipsets/atasiliconimage/
  projects/graid/7/sys/modules/ata/atapci/chipsets/atasiliconimage/Makefile   (contents, props changed)
  projects/graid/7/sys/modules/ata/atapci/chipsets/atasis/
  projects/graid/7/sys/modules/ata/atapci/chipsets/atasis/Makefile   (contents, props changed)
  projects/graid/7/sys/modules/ata/atapci/chipsets/atavia/
  projects/graid/7/sys/modules/ata/atapci/chipsets/atavia/Makefile   (contents, props changed)
  projects/graid/7/sys/modules/mvs/
  projects/graid/7/sys/modules/mvs/Makefile   (contents, props changed)
  projects/graid/7/sys/modules/siis/
  projects/graid/7/sys/modules/siis/Makefile   (contents, props changed)
  projects/graid/7/sys/powerpc/powermac/ata_dbdma.c   (contents, props changed)
  projects/graid/7/sys/powerpc/powermac/ata_dbdma.h   (contents, props changed)
Deleted:
  projects/graid/7/sys/dev/ata/ata-chipset.c
  projects/graid/7/sys/dev/ata/ata-usb.c
  projects/graid/7/sys/modules/ata/ata/
  projects/graid/7/sys/modules/ata/atausb/
Modified:
  projects/graid/7/etc/mtree/BSD.include.dist
  projects/graid/7/include/Makefile
  projects/graid/7/lib/libcam/Makefile
  projects/graid/7/lib/libcam/cam.3
  projects/graid/7/lib/libcam/cam_cdbparse.3
  projects/graid/7/lib/libcam/camlib.c
  projects/graid/7/sbin/atacontrol/atacontrol.c
  projects/graid/7/sbin/camcontrol/camcontrol.8
  projects/graid/7/sbin/camcontrol/camcontrol.c
  projects/graid/7/sbin/camcontrol/modeedit.c
  projects/graid/7/share/man/man4/Makefile
  projects/graid/7/share/man/man4/ata.4
  projects/graid/7/share/man/man4/scsi.4
  projects/graid/7/sys/cam/cam.c
  projects/graid/7/sys/cam/cam.h
  projects/graid/7/sys/cam/cam_ccb.h
  projects/graid/7/sys/cam/cam_debug.h
  projects/graid/7/sys/cam/cam_periph.c
  projects/graid/7/sys/cam/cam_periph.h
  projects/graid/7/sys/cam/cam_queue.c
  projects/graid/7/sys/cam/cam_queue.h
  projects/graid/7/sys/cam/cam_sim.c
  projects/graid/7/sys/cam/cam_xpt.c
  projects/graid/7/sys/cam/cam_xpt.h
  projects/graid/7/sys/cam/cam_xpt_periph.h
  projects/graid/7/sys/cam/cam_xpt_sim.h
  projects/graid/7/sys/cam/scsi/scsi_all.c
  projects/graid/7/sys/cam/scsi/scsi_all.h
  projects/graid/7/sys/cam/scsi/scsi_cd.c
  projects/graid/7/sys/cam/scsi/scsi_ch.c
  projects/graid/7/sys/cam/scsi/scsi_ch.h
  projects/graid/7/sys/cam/scsi/scsi_da.c
  projects/graid/7/sys/cam/scsi/scsi_low.c
  projects/graid/7/sys/cam/scsi/scsi_pass.c
  projects/graid/7/sys/cam/scsi/scsi_pt.c
  projects/graid/7/sys/cam/scsi/scsi_sa.c
  projects/graid/7/sys/cam/scsi/scsi_ses.c
  projects/graid/7/sys/cam/scsi/scsi_sg.c
  projects/graid/7/sys/cam/scsi/scsi_targ_bh.c
  projects/graid/7/sys/cam/scsi/scsi_target.c
  projects/graid/7/sys/conf/files
  projects/graid/7/sys/conf/files.powerpc
  projects/graid/7/sys/conf/options
  projects/graid/7/sys/dev/asr/asr.c
  projects/graid/7/sys/dev/ata/ata-all.c
  projects/graid/7/sys/dev/ata/ata-all.h
  projects/graid/7/sys/dev/ata/ata-card.c
  projects/graid/7/sys/dev/ata/ata-cbus.c
  projects/graid/7/sys/dev/ata/ata-disk.c
  projects/graid/7/sys/dev/ata/ata-disk.h
  projects/graid/7/sys/dev/ata/ata-dma.c
  projects/graid/7/sys/dev/ata/ata-isa.c
  projects/graid/7/sys/dev/ata/ata-lowlevel.c
  projects/graid/7/sys/dev/ata/ata-pci.c
  projects/graid/7/sys/dev/ata/ata-pci.h
  projects/graid/7/sys/dev/ata/ata-queue.c
  projects/graid/7/sys/dev/ata/ata-raid.c
  projects/graid/7/sys/dev/ata/ata_if.m
  projects/graid/7/sys/dev/ata/atapi-cam.c
  projects/graid/7/sys/dev/ata/atapi-cd.c
  projects/graid/7/sys/dev/ata/atapi-fd.c
  projects/graid/7/sys/dev/ata/atapi-tape.c
  projects/graid/7/sys/dev/ciss/ciss.c
  projects/graid/7/sys/dev/hptiop/hptiop.c
  projects/graid/7/sys/dev/hptrr/hptrr_osm_bsd.c
  projects/graid/7/sys/dev/hptrr/os_bsd.h
  projects/graid/7/sys/dev/iscsi/initiator/isc_cam.c
  projects/graid/7/sys/dev/mly/mly.c
  projects/graid/7/sys/dev/mpt/mpt_cam.h
  projects/graid/7/sys/dev/mpt/mpt_raid.c
  projects/graid/7/sys/dev/ppbus/vpo.c
  projects/graid/7/sys/dev/trm/trm.c
  projects/graid/7/sys/dev/twa/tw_osl_cam.c
  projects/graid/7/sys/dev/usb/umass.c
  projects/graid/7/sys/geom/geom_disk.c
  projects/graid/7/sys/geom/geom_disk.h
  projects/graid/7/sys/modules/Makefile
  projects/graid/7/sys/modules/ata/Makefile
  projects/graid/7/sys/modules/ata/atapci/Makefile
  projects/graid/7/sys/modules/cam/Makefile
  projects/graid/7/sys/pc98/include/md_var.h
  projects/graid/7/sys/pc98/pc98/pc98_machdep.c
  projects/graid/7/sys/powerpc/powermac/ata_kauai.c
  projects/graid/7/sys/powerpc/powermac/ata_macio.c
  projects/graid/7/sys/powerpc/psim/ata_iobus.c
  projects/graid/7/sys/sparc64/include/md_var.h
  projects/graid/7/sys/sparc64/sparc64/ata_machdep.c
  projects/graid/7/sys/sys/ata.h
  projects/graid/7/sys/sys/bio.h

Modified: projects/graid/7/etc/mtree/BSD.include.dist
==============================================================================
--- projects/graid/7/etc/mtree/BSD.include.dist	Sat Dec 18 02:54:51 2010	(r216513)
+++ projects/graid/7/etc/mtree/BSD.include.dist	Sat Dec 18 06:51:48 2010	(r216514)
@@ -78,6 +78,8 @@
         ..
     ..
     cam
+        ata
+        ..
         scsi
         ..
     ..

Modified: projects/graid/7/include/Makefile
==============================================================================
--- projects/graid/7/include/Makefile	Sat Dec 18 02:54:51 2010	(r216513)
+++ projects/graid/7/include/Makefile	Sat Dec 18 06:51:48 2010	(r216514)
@@ -41,7 +41,7 @@ LDIRS=	bsm cam geom net net80211 netatal
 	nfs nfsclient nfsserver \
 	pccard sys vm
 
-LSUBDIRS=	cam/scsi \
+LSUBDIRS=	cam/ata cam/scsi \
 	dev/acpica dev/an dev/bktr dev/firewire dev/hwpmc \
 	dev/ic dev/iicbus ${_dev_ieee488} dev/lmc dev/mfi dev/ofw \
 	dev/pbio ${_dev_powermac_nvram} dev/ppbus dev/smbus \

Modified: projects/graid/7/lib/libcam/Makefile
==============================================================================
--- projects/graid/7/lib/libcam/Makefile	Sat Dec 18 02:54:51 2010	(r216513)
+++ projects/graid/7/lib/libcam/Makefile	Sat Dec 18 06:51:48 2010	(r216514)
@@ -2,7 +2,8 @@
 
 LIB=		cam
 SHLIBDIR?=	/lib
-SRCS=		camlib.c scsi_cmdparse.c scsi_all.c scsi_da.c scsi_sa.c cam.c
+SRCS=		camlib.c scsi_cmdparse.c scsi_all.c scsi_da.c scsi_sa.c cam.c \
+		ata_all.c
 INCS=		camlib.h
 
 DPADD=		${LIBSBUF}
@@ -10,6 +11,7 @@ LDADD=		-lsbuf
 
 MAN=		cam.3 cam_cdbparse.3
 
+WARNS?=		2
 
 MLINKS+=	cam.3 cam_open_device.3 \
 		cam.3 cam_open_spec_device.3 \
@@ -34,7 +36,8 @@ MLINKS+=	cam.3 cam_open_device.3 \
 		cam_cdbparse.3 csio_encode_visit.3 \
 		cam_cdbparse.3 buff_encode_visit.3
 
-.PATH:		${.CURDIR}/../../sys/cam/scsi ${.CURDIR}/../../sys/cam
+.PATH:		${.CURDIR}/../../sys/cam/scsi ${.CURDIR}/../../sys/cam/ata \
+		${.CURDIR}/../../sys/cam
 
 SDIR=		${.CURDIR}/../../sys
 CFLAGS+=	-I${.CURDIR} -I${SDIR}

Modified: projects/graid/7/lib/libcam/cam.3
==============================================================================
--- projects/graid/7/lib/libcam/cam.3	Sat Dec 18 02:54:51 2010	(r216513)
+++ projects/graid/7/lib/libcam/cam.3	Sat Dec 18 06:51:48 2010	(r216514)
@@ -28,8 +28,8 @@
 .\" $FreeBSD$
 .\"
 .Dd October 10, 1998
-.Os
 .Dt CAM 3
+.Os
 .Sh NAME
 .Nm cam_open_device ,
 .Nm cam_open_spec_device ,
@@ -190,12 +190,6 @@ into a device name and unit number.
 Once the device name and unit number
 are determined, a lookup is performed to determine the passthrough device
 that corresponds to the given device.
-.Fn cam_open_device
-is rather simple to use, but it is not really suitable for general use
-because its behavior is not necessarily deterministic.
-Programmers writing
-new applications should make the extra effort to use one of the other open
-routines documented below.
 .Pp
 .Fn cam_open_spec_device
 opens the
@@ -354,19 +348,15 @@ respectively.
 can handle strings of the following forms, at least:
 .Pp
 .Bl -tag -width 1234 -compact
-.It /dev/foo0a
-.It /dev/foo1s2c
+.It /dev/foo1
 .It foo0
-.It foo0a
-.It nfoo0
+.It nsa2
 .El
 .Pp
 .Fn cam_get_device
 is provided as a convenience function for applications that need to provide
 functionality similar to
 .Fn cam_open_device .
-Programmers are encouraged to use more deterministic methods of obtaining
-device names and unit numbers if possible.
 .Sh RETURN VALUES
 .Fn cam_open_device ,
 .Fn cam_open_spec_device ,
@@ -382,7 +372,7 @@ returns an allocated and partially initi
 of the CCB failed.
 .Pp
 .Fn cam_send_ccb
-returns a value of -1 if an error occured, and
+returns a value of -1 if an error occurred, and
 .Va errno
 is set to indicate the error.
 .Pp

Modified: projects/graid/7/lib/libcam/cam_cdbparse.3
==============================================================================
--- projects/graid/7/lib/libcam/cam_cdbparse.3	Sat Dec 18 02:54:51 2010	(r216513)
+++ projects/graid/7/lib/libcam/cam_cdbparse.3	Sat Dec 18 06:51:48 2010	(r216514)
@@ -62,8 +62,8 @@
 .\"
 .\"
 .Dd October 13, 1998
-.Os
 .Dt CAM_CDBPARSE 3
+.Os
 .Sh NAME
 .Nm csio_build ,
 .Nm csio_build_visit ,
@@ -258,7 +258,6 @@ typedef enum {
 Multiple flags should be ORed together.
 Any of the CCB flags may be used,
 although it is worth noting several important ones here:
-.Pp
 .Bl -tag -width CAM_PASS_ERR_RECOVER
 .It Dv CAM_DIR_IN
 This indicates that the operation in question is a read operation.

Modified: projects/graid/7/lib/libcam/camlib.c
==============================================================================
--- projects/graid/7/lib/libcam/camlib.c	Sat Dec 18 02:54:51 2010	(r216513)
+++ projects/graid/7/lib/libcam/camlib.c	Sat Dec 18 06:51:48 2010	(r216514)
@@ -42,14 +42,9 @@ __FBSDID("$FreeBSD$");
 #include <cam/scsi/scsi_pass.h>
 #include "camlib.h"
 
-struct cam_devequiv {
-	char *given_dev;
-	char *real_dev;
-};
 
-struct cam_devequiv devmatchtable[] = {
-	{"sd", "da"},
-	{"st", "sa"}
+static const char *nonrewind_devs[] = {
+	"sa"
 };
 
 char cam_errbuf[CAM_ERRBUF_SIZE];
@@ -103,19 +98,14 @@ cam_freeccb(union ccb *ccb)
 /*
  * Take a device name or path passed in by the user, and attempt to figure
  * out the device name and unit number.  Some possible device name formats are:
- * /dev/foo0a
- * /dev/rfoo0a
- * /dev/rfoos2c
+ * /dev/foo0
  * foo0
- * foo0a
- * rfoo0
- * rfoo0a
- * nrfoo0
- * 
- * If the caller passes in an old style device name like 'sd' or 'st',
- * it will be converted to the new style device name based upon devmatchtable
- * above.
+ * nfoo0
  * 
+ * Some peripheral drivers create separate device nodes with 'n' prefix for
+ * non-rewind operations.  Currently only sa(4) tape driver has this feature.
+ * We extract pure peripheral name as device name for this special case.
+ *
  * Input parameters:  device name/path, length of devname string
  * Output:            device name, unit number
  * Return values:     returns 0 for success, -1 for failure
@@ -127,7 +117,7 @@ cam_get_device(const char *path, char *d
 	char *tmpstr, *tmpstr2;
 	char *newpath;
 	int unit_offset;
-	int i, found = 0;
+	int i;
 
 
 	if (path == NULL) {
@@ -142,10 +132,6 @@ cam_get_device(const char *path, char *d
 	newpath = (char *)strdup(path);
 	tmpstr = newpath;
 
-	/* Get rid of any leading white space */
-	while (isspace(*tmpstr) && (*tmpstr != '\0'))
-		tmpstr++;
-
 	/*
 	 * Check to see whether we have an absolute pathname.
 	 */
@@ -166,61 +152,22 @@ cam_get_device(const char *path, char *d
 	 * Check to see whether the user has given us a nonrewound tape
 	 * device.
 	 */
-	if (*tmpstr == 'n')
-		tmpstr++;
-
-	if (*tmpstr == '\0') {
-		sprintf(cam_errbuf, "%s: no text after leading 'n'", func_name);
-		free(newpath);
-		return(-1);
-	}
-
-	/*
-	 * See if the user has given us a character device.
-	 */
-	if (*tmpstr == 'r')
-		tmpstr++;
-
-	if (*tmpstr == '\0') {
-		sprintf(cam_errbuf, "%s: no text after leading 'r'", func_name);
-		free(newpath);
-		return(-1);
-	}
-
-	/*
-	 * Try to get rid of any trailing white space or partition letters.
-	 */
-	tmpstr2 = &tmpstr[strlen(tmpstr) - 1];
-
-	while ((*tmpstr2 != '\0') && (tmpstr2 > tmpstr) &&(!isdigit(*tmpstr2))){
-		*tmpstr2 = '\0';
-		tmpstr2--;
-	}
-
-	/*
-	 * Check to see whether we have been given a partition with a slice
-	 * name.  If so, get rid of the slice name/number.
-	 */
-	if (strlen(tmpstr) > 3) {
-		/*
-		 * Basically, we're looking for a string that ends in the
-		 * following general manner:  1s1 -- a number, the letter
-		 * s, and then another number.  This indicates that the
-		 * user has given us a slice.  We substitute nulls for the
-		 * s and the slice number.
-		 */
-		if ((isdigit(tmpstr[strlen(tmpstr) - 1])) 
-		 && (tmpstr[strlen(tmpstr) - 2] == 's')
-		 && (isdigit(tmpstr[strlen(tmpstr) - 3]))) {
-			tmpstr[strlen(tmpstr) - 1] = '\0';
-			tmpstr[strlen(tmpstr) - 1] = '\0';
+	if (*tmpstr == 'n' || *tmpstr == 'e') {
+		for (i = 0; i < sizeof(nonrewind_devs)/sizeof(char *); i++) {
+			int len = strlen(nonrewind_devs[i]);
+			if (strncmp(tmpstr + 1, nonrewind_devs[i], len) == 0) {
+				if (isdigit(tmpstr[len + 1])) {
+					tmpstr++;
+					break;
+				}
+			}
 		}
 	}
 
 	/*
-	 * After we nuke off the slice, we should have just a device name
-	 * and unit number.  That means there must be at least 2
-	 * characters.  If we only have 1, we don't have a valid device name.
+	 * We should now have just a device name and unit number.
+	 * That means that there must be at least 2 characters.
+	 * If we only have 1, we don't have a valid device name.
 	 */
 	if (strlen(tmpstr) < 2) {
 		sprintf(cam_errbuf,
@@ -281,20 +228,7 @@ cam_get_device(const char *path, char *d
 	 */
 	tmpstr[strlen(tmpstr) - unit_offset] = '\0';
 
-	/*
-	 * Look through our equivalency table and see if the device name
-	 * the user gave us is an old style device name.  If so, translate
-	 * it to the new style device name.
-	 */
-	for (i = 0;i < (sizeof(devmatchtable)/sizeof(struct cam_devequiv));i++){
-		if (strcmp(tmpstr, devmatchtable[i].given_dev) == 0) {
-			strlcpy(dev_name,devmatchtable[i].real_dev, devnamelen);
-			found = 1;
-			break;
-		}
-	}
-	if (found == 0)
-		strlcpy(dev_name, tmpstr, devnamelen);
+	strlcpy(dev_name, tmpstr, devnamelen);
 
 	/* Clean up allocated memory */
 	free(newpath);

Modified: projects/graid/7/sbin/atacontrol/atacontrol.c
==============================================================================
--- projects/graid/7/sbin/atacontrol/atacontrol.c	Sat Dec 18 02:54:51 2010	(r216513)
+++ projects/graid/7/sbin/atacontrol/atacontrol.c	Sat Dec 18 06:51:48 2010	(r216514)
@@ -42,7 +42,7 @@
 static const char *
 mode2str(int mode)
 {
-	switch (mode) {
+	switch (mode & 0xff) {
 	case ATA_PIO: return "BIOSPIO";
 	case ATA_PIO0: return "PIO0";
 	case ATA_PIO1: return "PIO1";
@@ -59,16 +59,24 @@ mode2str(int mode)
 	case ATA_UDMA4: return "UDMA66";
 	case ATA_UDMA5: return "UDMA100";
 	case ATA_UDMA6: return "UDMA133";
-	case ATA_SA150: return "SATA150";
-	case ATA_SA300: return "SATA300";
-	case ATA_USB: return "USB";
-	case ATA_USB1: return "USB1";
-	case ATA_USB2: return "USB2";
 	case ATA_DMA: return "BIOSDMA";
 	default: return "???";
 	}
 }
 
+static const char *
+satarev2str(int mode)
+{
+	switch ((mode & 0xff00) >> 8) {
+	case 0: return "";
+	case 1: return "SATA 1.5Gb/s";
+	case 2: return "SATA 3Gb/s";
+	case 3: return "SATA 6Gb/s";
+	case 0xff: return "SATA";
+	default: return "???";
+	}
+}
+
 static int
 str2mode(char *str)
 {
@@ -82,7 +90,9 @@ str2mode(char *str)
 	if (!strcasecmp(str, "WDMA1")) return ATA_WDMA1;
 	if (!strcasecmp(str, "WDMA2")) return ATA_WDMA2;
 	if (!strcasecmp(str, "UDMA0")) return ATA_UDMA0;
+	if (!strcasecmp(str, "UDMA16")) return ATA_UDMA0;
 	if (!strcasecmp(str, "UDMA1")) return ATA_UDMA1;
+	if (!strcasecmp(str, "UDMA25")) return ATA_UDMA1;
 	if (!strcasecmp(str, "UDMA2")) return ATA_UDMA2;
 	if (!strcasecmp(str, "UDMA33")) return ATA_UDMA2;
 	if (!strcasecmp(str, "UDMA3")) return ATA_UDMA3;
@@ -93,11 +103,6 @@ str2mode(char *str)
 	if (!strcasecmp(str, "UDMA100")) return ATA_UDMA5;
 	if (!strcasecmp(str, "UDMA6")) return ATA_UDMA6;
 	if (!strcasecmp(str, "UDMA133")) return ATA_UDMA6;
-	if (!strcasecmp(str, "SATA150")) return ATA_SA150;
-	if (!strcasecmp(str, "SATA300")) return ATA_SA300;
-	if (!strcasecmp(str, "USB")) return ATA_USB;
-	if (!strcasecmp(str, "USB1")) return ATA_USB1;
-	if (!strcasecmp(str, "USB2")) return ATA_USB2;
 	if (!strcasecmp(str, "BIOSDMA")) return ATA_DMA;
 	return -1;
 }
@@ -388,7 +393,8 @@ main(int argc, char **argv)
 		if (argc == 3 || argc == 4) {
 			if (ioctl(fd, IOCATAGMODE, &mode) < 0)
 				err(1, "ioctl(IOCATAGMODE)");
-			printf("current mode = %s\n", mode2str(mode));
+			printf("current mode = %s %s\n",
+			    mode2str(mode), satarev2str(mode));
 		}
 		exit(EX_OK);
 	}

Modified: projects/graid/7/sbin/camcontrol/camcontrol.8
==============================================================================
--- projects/graid/7/sbin/camcontrol/camcontrol.8	Sat Dec 18 02:54:51 2010	(r216513)
+++ projects/graid/7/sbin/camcontrol/camcontrol.8	Sat Dec 18 06:51:48 2010	(r216514)
@@ -27,7 +27,7 @@
 .\"
 .\" $FreeBSD$
 .\"
-.Dd August 21, 2006
+.Dd July 1, 2010
 .Dt CAMCONTROL 8
 .Os
 .Sh NAME
@@ -59,6 +59,11 @@
 .Op Fl S
 .Op Fl R
 .Nm
+.Ic identify
+.Op device id
+.Op generic args
+.Op Fl v
+.Nm
 .Ic reportluns
 .Op device id
 .Op generic args
@@ -116,10 +121,14 @@
 .Ic cmd
 .Op device id
 .Op generic args
+.Aq Fl a Ar cmd Op args
 .Aq Fl c Ar cmd Op args
+.Op Fl d
+.Op Fl f
 .Op Fl i Ar len Ar fmt
 .Bk -words
 .Op Fl o Ar len Ar fmt Op args
+.Op Fl r Ar fmt
 .Ek
 .Nm
 .Ic debug
@@ -143,6 +152,7 @@
 .Op generic args
 .Op Fl c
 .Op Fl D Ar enable|disable
+.Op Fl M Ar mode
 .Op Fl O Ar offset
 .Op Fl q
 .Op Fl R Ar syncrate
@@ -159,6 +169,20 @@
 .Op Fl w
 .Op Fl y
 .Nm
+.Ic idle
+.Op device id
+.Op generic args
+.Op Fl t Ar time
+.Nm
+.Ic standby
+.Op device id
+.Op generic args
+.Op Fl t Ar time
+.Nm
+.Ic sleep
+.Op device id
+.Op generic args
+.Nm
 .Ic help
 .Sh DESCRIPTION
 The
@@ -283,6 +307,8 @@ This is to aid in script writing.
 .It Fl R
 Print out transfer rate information.
 .El
+.It Ic identify
+Send a ATA identify command (0xec) to a device.
 .It Ic reportluns
 Send the SCSI REPORT LUNS (0xA0) command to the given device.
 By default,
@@ -480,26 +506,36 @@ Saved values
 .El
 .El
 .It Ic cmd
-Allows the user to send an arbitrary SCSI CDB to any device.
+Allows the user to send an arbitrary ATA or SCSI CDB to any device.
 The
 .Ic cmd
 function requires the
 .Fl c
-argument to specify the CDB.
+argument to specify SCSI CDB or the
+.Fl a
+argument to specify ATA Command Block registers values.
 Other arguments are optional, depending on
 the command type.
 The command and data specification syntax is documented
 in
 .Xr cam_cdbparse 3 .
-NOTE: If the CDB specified causes data to be transfered to or from the
+NOTE: If the CDB specified causes data to be transferred to or from the
 SCSI device in question, you MUST specify either
 .Fl i
 or
 .Fl o .
 .Bl -tag -width 17n
+.It Fl a Ar cmd Op args
+This specifies the content of 12 ATA Command Block registers (command,
+features, lba_low, lba_mid, lba_high, device, lba_low_exp, lba_mid_exp.
+lba_high_exp, features_exp, sector_count, sector_count_exp).
 .It Fl c Ar cmd Op args
 This specifies the SCSI CDB.
-CDBs may be 6, 10, 12 or 16 bytes.
+SCSI CDBs may be 6, 10, 12 or 16 bytes.
+.It Fl d
+Specifies DMA protocol to be used for ATA command.
+.It Fl f
+Specifies FPDMA (NCQ) protocol to be used for ATA command.
 .It Fl i Ar len Ar fmt
 This specifies the amount of data to read, and how it should be displayed.
 If the format is
@@ -513,6 +549,13 @@ If the format is
 .Sq - ,
 .Ar len
 bytes of data will be read from standard input and written to the device.
+.It Fl r Ar fmt
+This specifies that 11 result ATA Command Block registers should be displayed
+(status, error, lba_low, lba_mid, lba_high, device, lba_low_exp, lba_mid_exp,
+lba_high_exp, sector_count, sector_count_exp), and how.
+If the format is
+.Sq - ,
+11 result registers will be written to standard output in hex.
 .El
 .It Ic debug
 Turn on CAM debugging printfs in the kernel.
@@ -670,6 +713,8 @@ Show or set current negotiation settings
 This is the default.
 .It Fl D Ar enable|disable
 Enable or disable disconnection.
+.It Fl M Ar mode
+Set ATA mode.
 .It Fl O Ar offset
 Set the command delay offset.
 .It Fl q
@@ -800,6 +845,17 @@ The user
 will not be asked about the timeout if a timeout is specified on the
 command line.
 .El
+.It Ic idle
+Put ATA device into IDLE state. Optional parameter
+.Pq Fl t
+specifies automatic standby timer value in seconds. Value 0 disables timer.
+.It Ic standby
+Put ATA device into STANDBY state. Optional parameter
+.Pq Fl t
+specifies automatic standby timer value in seconds. Value 0 disables timer.
+.It Ic sleep
+Put ATA device into SLEEP state. Note that the only way get device out of
+this state may be reset.
 .It Ic help
 Print out verbose usage information.
 .El

Modified: projects/graid/7/sbin/camcontrol/camcontrol.c
==============================================================================
--- projects/graid/7/sbin/camcontrol/camcontrol.c	Sat Dec 18 02:54:51 2010	(r216513)
+++ projects/graid/7/sbin/camcontrol/camcontrol.c	Sat Dec 18 06:51:48 2010	(r216514)
@@ -32,6 +32,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/ioctl.h>
 #include <sys/stdint.h>
 #include <sys/types.h>
+#include <sys/endian.h>
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -49,6 +50,7 @@ __FBSDID("$FreeBSD$");
 #include <cam/scsi/scsi_da.h>
 #include <cam/scsi/scsi_pass.h>
 #include <cam/scsi/scsi_message.h>
+#include <cam/ata/ata_all.h>
 #include <camlib.h>
 #include "camcontrol.h"
 
@@ -71,7 +73,11 @@ typedef enum {
 	CAM_CMD_RATE		= 0x0000000f,
 	CAM_CMD_DETACH		= 0x00000010,
 	CAM_CMD_REPORTLUNS	= 0x00000011,
-	CAM_CMD_READCAP		= 0x00000012
+	CAM_CMD_READCAP		= 0x00000012,
+	CAM_CMD_IDENTIFY	= 0x00000013,
+	CAM_CMD_IDLE		= 0x00000014,
+	CAM_CMD_STANDBY		= 0x00000015,
+	CAM_CMD_SLEEP		= 0x00000016
 } cam_cmdmask;
 
 typedef enum {
@@ -110,22 +116,23 @@ typedef enum {
 } cam_argmask;
 
 struct camcontrol_opts {
-	const char	*optname;	
+	const char	*optname;
 	cam_cmdmask	cmdnum;
 	cam_argmask	argnum;
 	const char	*subopt;
 };
 
 #ifndef MINIMALISTIC
-static const char scsicmd_opts[] = "c:i:o:";
+static const char scsicmd_opts[] = "a:c:dfi:o:r";
 static const char readdefect_opts[] = "f:GP";
-static const char negotiate_opts[] = "acD:O:qR:T:UW:";
+static const char negotiate_opts[] = "acD:M:O:qR:T:UW:";
 #endif
 
 struct camcontrol_opts option_table[] = {
 #ifndef MINIMALISTIC
 	{"tur", CAM_CMD_TUR, CAM_ARG_NONE, NULL},
 	{"inquiry", CAM_CMD_INQUIRY, CAM_ARG_NONE, "DSR"},
+	{"identify", CAM_CMD_IDENTIFY, CAM_ARG_NONE, NULL},
 	{"start", CAM_CMD_STARTSTOP, CAM_ARG_START_UNIT, NULL},
 	{"stop", CAM_CMD_STARTSTOP, CAM_ARG_NONE, NULL},
 	{"load", CAM_CMD_STARTSTOP, CAM_ARG_START_UNIT | CAM_ARG_EJECT, NULL},
@@ -150,6 +157,9 @@ struct camcontrol_opts option_table[] = 
 	{"rate", CAM_CMD_RATE, CAM_ARG_NONE, negotiate_opts},
 	{"debug", CAM_CMD_DEBUG, CAM_ARG_NONE, "IPTSXc"},
 	{"format", CAM_CMD_FORMAT, CAM_ARG_NONE, "qrwy"},
+	{"idle", CAM_CMD_IDLE, CAM_ARG_NONE, "t:"},
+	{"standby", CAM_CMD_STANDBY, CAM_ARG_NONE, "t:"},
+	{"sleep", CAM_CMD_SLEEP, CAM_ARG_NONE, ""},
 #endif /* MINIMALISTIC */
 	{"help", CAM_CMD_USAGE, CAM_ARG_NONE, NULL},
 	{"-?", CAM_CMD_USAGE, CAM_ARG_NONE, NULL},
@@ -182,7 +192,7 @@ static int scsidoinquiry(struct cam_devi
 			 char *combinedopt, int retry_count, int timeout);
 static int scsiinquiry(struct cam_device *device, int retry_count, int timeout);
 static int scsiserial(struct cam_device *device, int retry_count, int timeout);
-static int scsixferrate(struct cam_device *device);
+static int camxferrate(struct cam_device *device);
 #endif /* MINIMALISTIC */
 static int parse_btl(char *tstr, int *bus, int *target, int *lun,
 		     cam_argmask *arglst);
@@ -194,7 +204,7 @@ static int readdefects(struct cam_device
 		       char *combinedopt, int retry_count, int timeout);
 static void modepage(struct cam_device *device, int argc, char **argv,
 		     char *combinedopt, int retry_count, int timeout);
-static int scsicmd(struct cam_device *device, int argc, char **argv, 
+static int scsicmd(struct cam_device *device, int argc, char **argv,
 		   char *combinedopt, int retry_count, int timeout);
 static int tagcontrol(struct cam_device *device, int argc, char **argv,
 		      char *combinedopt);
@@ -202,6 +212,7 @@ static void cts_print(struct cam_device 
 		      struct ccb_trans_settings *cts);
 static void cpi_print(struct ccb_pathinq *cpi);
 static int get_cpi(struct cam_device *device, struct ccb_pathinq *cpi);
+static int get_cgd(struct cam_device *device, struct ccb_getdev *cgd);
 static int get_print_cts(struct cam_device *device, int user_settings,
 			 int quiet, struct ccb_trans_settings *cts);
 static int ratecontrol(struct cam_device *device, int retry_count,
@@ -212,10 +223,18 @@ static int scsireportluns(struct cam_dev
 			  char *combinedopt, int retry_count, int timeout);
 static int scsireadcapacity(struct cam_device *device, int argc, char **argv,
 			    char *combinedopt, int retry_count, int timeout);
+static int atapm(struct cam_device *device, int argc, char **argv,
+			    char *combinedopt, int retry_count, int timeout);
 #endif /* MINIMALISTIC */
+#ifndef min
+#define min(a,b) (((a)<(b))?(a):(b))
+#endif
+#ifndef max
+#define max(a,b) (((a)>(b))?(a):(b))
+#endif
 
 camcontrol_optret
-getoption(char *arg, cam_cmdmask *cmdnum, cam_argmask *argnum, 
+getoption(char *arg, cam_cmdmask *cmdnum, cam_argmask *argnum,
 	  const char **subopt)
 {
 	struct camcontrol_opts *opts;
@@ -401,19 +420,35 @@ getdevtree(void)
 				} else
 					skip_device = 0;
 
-				cam_strvis(vendor, dev_result->inq_data.vendor,
+				if (dev_result->protocol == PROTO_SCSI) {
+				    cam_strvis(vendor, dev_result->inq_data.vendor,
 					   sizeof(dev_result->inq_data.vendor),
 					   sizeof(vendor));
-				cam_strvis(product,
+				    cam_strvis(product,
 					   dev_result->inq_data.product,
 					   sizeof(dev_result->inq_data.product),
 					   sizeof(product));
-				cam_strvis(revision,
+				    cam_strvis(revision,
 					   dev_result->inq_data.revision,
 					  sizeof(dev_result->inq_data.revision),
 					   sizeof(revision));
-				sprintf(tmpstr, "<%s %s %s>", vendor, product,
+				    sprintf(tmpstr, "<%s %s %s>", vendor, product,
+					revision);
+				} else if (dev_result->protocol == PROTO_ATA ||
+				    dev_result->protocol == PROTO_SATAPM) {
+				    cam_strvis(product,
+					   dev_result->ident_data.model,
+					   sizeof(dev_result->ident_data.model),
+					   sizeof(product));
+				    cam_strvis(revision,
+					   dev_result->ident_data.revision,
+					  sizeof(dev_result->ident_data.revision),
+					   sizeof(revision));
+				    sprintf(tmpstr, "<%s %s>", product,
 					revision);
+				} else {
+				    sprintf(tmpstr, "<>");
+				}
 				if (need_close) {
 					fprintf(stdout, ")\n");
 					need_close = 0;
@@ -587,7 +622,7 @@ scsistart(struct cam_device *device, int
 		else
 			fprintf(stdout,
 				"Error received from stop unit command\n");
-			
+
 		if (arglist & CAM_ARG_VERBOSE) {
 			cam_error_print(device, ccb, CAM_ESF_ALL,
 					CAM_EPF_ALL, stderr);
@@ -642,7 +677,7 @@ scsidoinquiry(struct cam_device *device,
 		return(error);
 
 	if (arglist & CAM_ARG_GET_XFERRATE)
-		error = scsixferrate(device);
+		error = camxferrate(device);
 
 	return(error);
 }
@@ -653,7 +688,7 @@ scsiinquiry(struct cam_device *device, i
 	union ccb *ccb;
 	struct scsi_inquiry_data *inq_buf;
 	int error = 0;
-	
+
 	ccb = cam_getccb(device);
 
 	if (ccb == NULL) {
@@ -686,13 +721,13 @@ scsiinquiry(struct cam_device *device, i
 	 *    scsi_inquiry() will convert an inq_len (which is passed in as
 	 *    a u_int32_t, but the field in the CDB is only 1 byte) of 256
 	 *    to 0.  Evidently, very few devices meet the spec in that
-	 *    regard.  Some devices, like many Seagate disks, take the 0 as 
+	 *    regard.  Some devices, like many Seagate disks, take the 0 as
 	 *    0, and don't return any data.  One Pioneer DVD-R drive
 	 *    returns more data than the command asked for.
 	 *
 	 *    So, since there are numerous devices that just don't work
 	 *    right with the full inquiry size, we don't send the full size.
-	 * 
+	 *
 	 *  - The second reason not to use the full inquiry data length is
 	 *    that we don't need it here.  The only reason we issue a
 	 *    standard inquiry is to get the vendor name, device name,
@@ -852,14 +887,18 @@ scsiserial(struct cam_device *device, in
 }
 
 static int
-scsixferrate(struct cam_device *device)
+camxferrate(struct cam_device *device)
 {
+	struct ccb_pathinq cpi;
 	u_int32_t freq = 0;
 	u_int32_t speed = 0;
 	union ccb *ccb;
 	u_int mb;
 	int retval = 0;
 
+	if ((retval = get_cpi(device, &cpi)) != 0)
+		return (1);
+
 	ccb = cam_getccb(device);
 
 	if (ccb == NULL) {
@@ -892,6 +931,8 @@ scsixferrate(struct cam_device *device)
 
 	}
 
+	speed = cpi.base_transfer_speed;
+	freq = 0;
 	if (ccb->cts.transport == XPORT_SPI) {
 		struct ccb_trans_settings_spi *spi =
 		    &ccb->cts.xport_specific.spi;
@@ -900,26 +941,53 @@ scsixferrate(struct cam_device *device)
 			freq = scsi_calc_syncsrate(spi->sync_period);
 			speed = freq;
 		}
-
-		fprintf(stdout, "%s%d: ", device->device_name,
-			device->dev_unit_num);
-
 		if ((spi->valid & CTS_SPI_VALID_BUS_WIDTH) != 0) {
 			speed *= (0x01 << spi->bus_width);
 		}
+	} else if (ccb->cts.transport == XPORT_FC) {
+		struct ccb_trans_settings_fc *fc =
+		    &ccb->cts.xport_specific.fc;
+
+		if (fc->valid & CTS_FC_VALID_SPEED)
+			speed = fc->bitrate;
+	} else if (ccb->cts.transport == XPORT_SAS) {
+		struct ccb_trans_settings_sas *sas =
+		    &ccb->cts.xport_specific.sas;
+
+		if (sas->valid & CTS_SAS_VALID_SPEED)
+			speed = sas->bitrate;
+	} else if (ccb->cts.transport == XPORT_ATA) {
+		struct ccb_trans_settings_ata *ata =
+		    &ccb->cts.xport_specific.ata;
+
+		if (ata->valid & CTS_ATA_VALID_MODE)
+			speed = ata_mode2speed(ata->mode);
+	} else if (ccb->cts.transport == XPORT_SATA) {
+		struct	ccb_trans_settings_sata *sata =
+		    &ccb->cts.xport_specific.sata;
+
+		if (sata->valid & CTS_SATA_VALID_REVISION)
+			speed = ata_revision2speed(sata->revision);
+	}
+
+	mb = speed / 1000;
+	if (mb > 0) {
+		fprintf(stdout, "%s%d: %d.%03dMB/s transfers",
+			device->device_name, device->dev_unit_num,
+			mb, speed % 1000);
+	} else {
+		fprintf(stdout, "%s%d: %dKB/s transfers",
+			device->device_name, device->dev_unit_num,
+			speed);
+	}
 
-		mb = speed / 1000;
-
-		if (mb > 0) 
-			fprintf(stdout, "%d.%03dMB/s transfers ",
-				mb, speed % 1000);
-		else
-			fprintf(stdout, "%dKB/s transfers ",
-				speed);
+	if (ccb->cts.transport == XPORT_SPI) {
+		struct ccb_trans_settings_spi *spi =
+		    &ccb->cts.xport_specific.spi;
 
 		if (((spi->valid & CTS_SPI_VALID_SYNC_OFFSET) != 0)
 		 && (spi->sync_offset != 0))
-			fprintf(stdout, "(%d.%03dMHz, offset %d", freq / 1000,
+			fprintf(stdout, " (%d.%03dMHz, offset %d", freq / 1000,
 				freq % 1000, spi->sync_offset);
 
 		if (((spi->valid & CTS_SPI_VALID_BUS_WIDTH) != 0)
@@ -935,25 +1003,34 @@ scsixferrate(struct cam_device *device)
 		 && (spi->sync_offset != 0)) {
 			fprintf(stdout, ")");
 		}
-	} else {
-		struct ccb_pathinq cpi;
-
-		retval = get_cpi(device, &cpi);
-
-		if (retval != 0)
-			goto xferrate_bailout;
-
-		speed = cpi.base_transfer_speed;
-		freq = 0;
-
-		mb = speed / 1000;
-
-		if (mb > 0) 
-			fprintf(stdout, "%d.%03dMB/s transfers ",
-				mb, speed % 1000);
+	} else if (ccb->cts.transport == XPORT_ATA) {
+		struct ccb_trans_settings_ata *ata =
+		    &ccb->cts.xport_specific.ata;
+
+		printf(" (");
+		if (ata->valid & CTS_ATA_VALID_MODE)
+			printf("%s, ", ata_mode2string(ata->mode));
+		if ((ata->valid & CTS_ATA_VALID_ATAPI) && ata->atapi != 0)
+			printf("ATAPI %dbytes, ", ata->atapi);
+		if (ata->valid & CTS_ATA_VALID_BYTECOUNT)
+			printf("PIO %dbytes", ata->bytecount);
+		printf(")");
+	} else if (ccb->cts.transport == XPORT_SATA) {
+		struct ccb_trans_settings_sata *sata =
+		    &ccb->cts.xport_specific.sata;
+
+		printf(" (");
+		if (sata->valid & CTS_SATA_VALID_REVISION)
+			printf("SATA %d.x, ", sata->revision);
 		else
-			fprintf(stdout, "%dKB/s transfers ",
-				speed);
+			printf("SATA, ");
+		if (sata->valid & CTS_SATA_VALID_MODE)
+			printf("%s, ", ata_mode2string(sata->mode));
+		if ((sata->valid & CTS_SATA_VALID_ATAPI) && sata->atapi != 0)
+			printf("ATAPI %dbytes, ", sata->atapi);
+		if (sata->valid & CTS_SATA_VALID_BYTECOUNT)
+			printf("PIO %dbytes", sata->bytecount);
+		printf(")");
 	}
 
 	if (ccb->cts.protocol == PROTO_SCSI) {
@@ -974,6 +1051,342 @@ xferrate_bailout:
 
 	return(retval);
 }
+
+static void
+atacapprint(struct ata_params *parm)
+{
+	u_int32_t lbasize = (u_int32_t)parm->lba_size_1 |
+				((u_int32_t)parm->lba_size_2 << 16);
+
+	u_int64_t lbasize48 = ((u_int64_t)parm->lba_size48_1) |
+				((u_int64_t)parm->lba_size48_2 << 16) |
+				((u_int64_t)parm->lba_size48_3 << 32) |
+				((u_int64_t)parm->lba_size48_4 << 48);
+
+	printf("\n");
+	printf("protocol              ");
+	printf("ATA/ATAPI-%d", ata_version(parm->version_major));
+	if (parm->satacapabilities && parm->satacapabilities != 0xffff) {
+		if (parm->satacapabilities & ATA_SATA_GEN3)
+			printf(" SATA 3.x\n");
+		else if (parm->satacapabilities & ATA_SATA_GEN2)
+			printf(" SATA 2.x\n");
+		else if (parm->satacapabilities & ATA_SATA_GEN1)
+			printf(" SATA 1.x\n");
+		else
+			printf(" SATA\n");
+	}
+	else
+		printf("\n");
+	printf("device model          %.40s\n", parm->model);
+	printf("firmware revision     %.8s\n", parm->revision);
+	printf("serial number         %.20s\n", parm->serial);
+	if (parm->enabled.extension & ATA_SUPPORT_64BITWWN) {
+		printf("WWN                   %02x%02x%02x%02x\n",
+		    parm->wwn[0], parm->wwn[1], parm->wwn[2], parm->wwn[3]);
+	}
+	if (parm->enabled.extension & ATA_SUPPORT_MEDIASN) {
+		printf("media serial number   %.30s\n",
+		    parm->media_serial);
+	}
+
+	printf("cylinders             %d\n", parm->cylinders);
+	printf("heads                 %d\n", parm->heads);
+	printf("sectors/track         %d\n", parm->sectors);
+	printf("sector size           logical %u, physical %lu, offset %lu\n",
+	    ata_logical_sector_size(parm),
+	    (unsigned long)ata_physical_sector_size(parm),
+	    (unsigned long)ata_logical_sector_offset(parm));
+
+	if (parm->config == ATA_PROTO_CFA ||
+	    (parm->support.command2 & ATA_SUPPORT_CFA))
+		printf("CFA supported\n");
+
+	printf("LBA%ssupported         ",
+		parm->capabilities1 & ATA_SUPPORT_LBA ? " " : " not ");
+	if (lbasize)
+		printf("%d sectors\n", lbasize);
+	else
+		printf("\n");
+
+	printf("LBA48%ssupported       ",
+		parm->support.command2 & ATA_SUPPORT_ADDRESS48 ? " " : " not ");
+	if (lbasize48)
+		printf("%ju sectors\n", (uintmax_t)lbasize48);
+	else
+		printf("\n");
+
+	printf("PIO supported         PIO");
+	switch (ata_max_pmode(parm)) {
+	case ATA_PIO4:
+		printf("4");
+		break;
+	case ATA_PIO3:
+		printf("3");
+		break;
+	case ATA_PIO2:
+		printf("2");
+		break;
+	case ATA_PIO1:
+		printf("1");
+		break;
+	default:
+		printf("0");
+	}
+	if ((parm->capabilities1 & ATA_SUPPORT_IORDY) == 0)
+		printf(" w/o IORDY");
+	printf("\n");
+
+	printf("DMA%ssupported         ",
+		parm->capabilities1 & ATA_SUPPORT_DMA ? " " : " not ");
+	if (parm->capabilities1 & ATA_SUPPORT_DMA) {
+		if (parm->mwdmamodes & 0xff) {
+			printf("WDMA");
+			if (parm->mwdmamodes & 0x04)
+				printf("2");
+			else if (parm->mwdmamodes & 0x02)
+				printf("1");
+			else if (parm->mwdmamodes & 0x01)
+				printf("0");
+			printf(" ");
+		}
+		if ((parm->atavalid & ATA_FLAG_88) &&
+		    (parm->udmamodes & 0xff)) {
+			printf("UDMA");
+			if (parm->udmamodes & 0x40)
+				printf("6");
+			else if (parm->udmamodes & 0x20)
+				printf("5");
+			else if (parm->udmamodes & 0x10)
+				printf("4");
+			else if (parm->udmamodes & 0x08)
+				printf("3");
+			else if (parm->udmamodes & 0x04)
+				printf("2");
+			else if (parm->udmamodes & 0x02)
+				printf("1");
+			else if (parm->udmamodes & 0x01)
+				printf("0");
+			printf(" ");
+		}
+	}
+	printf("\n");
+
+	if (parm->media_rotation_rate == 1) {
+		printf("media RPM             non-rotating\n");
+	} else if (parm->media_rotation_rate >= 0x0401 &&
+	    parm->media_rotation_rate <= 0xFFFE) {
+		printf("media RPM             %d\n",
+			parm->media_rotation_rate);
+	}
+
+	printf("\nFeature                      "

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***


More information about the svn-src-projects mailing list