From owner-FreeBSD-users-jp@jp.FreeBSD.org Wed Feb 27 14:04:17 2002
Received: (from daemon@localhost)
	by castle.jp.FreeBSD.org (8.11.6+3.4W/8.11.3) id g1R54Hq40384;
	Wed, 27 Feb 2002 14:04:17 +0900 (JST)
	(envelope-from owner-FreeBSD-users-jp@jp.FreeBSD.org)
Received: from mail.sat.t.u-tokyo.ac.jp (nat.keisu.t.u-tokyo.ac.jp [133.11.68.2])
	by castle.jp.FreeBSD.org (8.11.6+3.4W/8.11.3) with ESMTP/inet id g1R54HW40379
	for <FreeBSD-users-jp@jp.FreeBSD.org>; Wed, 27 Feb 2002 14:04:17 +0900 (JST)
	(envelope-from simokawa@sat.t.u-tokyo.ac.jp)
Received: from ett.sat.t.u-tokyo.ac.jp (ett.sat.t.u-tokyo.ac.jp [10.6.1.30])
	by mail.sat.t.u-tokyo.ac.jp (Postfix) with ESMTP id D505C2DC6E
	for <FreeBSD-users-jp@jp.FreeBSD.org>; Wed, 27 Feb 2002 14:04:13 +0900 (JST)
Date: Wed, 27 Feb 2002 14:04:13 +0900
Message-ID: <ybsofibikhe.wl@ett.sat.t.u-tokyo.ac.jp>
From: Hidetoshi Shimokawa <simokawa@sat.t.u-tokyo.ac.jp>
To: FreeBSD-users-jp@jp.FreeBSD.org
In-Reply-To: <20020224211048.46a0d481.raven@katsurajima.seya.yokohama.jp>
References: <20020224211048.46a0d481.raven@katsurajima.seya.yokohama.jp>
User-Agent: Wanderlust/2.4.1 (Stand By Me) REMI/1.14.3 (Matsudai) FLIM/1.13.2 (Kasanui) APEL/10.3 MULE XEmacs/21.2 (beta19) (Shinjuku) (i386-unknown-freebsd3.2)
X-Face: OE([KxWyJI0r[R~S/>7ia}SJ)i%a,$-9%7{*yihQk|]gl}2p#"oXmX/fT}Bn7:#j7i14gu$
 jgR\S*&C3R/pJX<mI-4Z8'mqt1R'CjWdw-xqVoilv`\JgZcquM5oVuO^<vt/~051rCDM(`{rM~?{Ok
 r,XC+}Ycm9IJO)odT*-0nyJjBJYzL{GsZ
MIME-Version: 1.0 (generated by REMI 1.14.3 - "Matsudai")
Content-Type: text/plain; charset=ISO-2022-JP
Reply-To: FreeBSD-users-jp@jp.FreeBSD.org
Precedence: list
X-Distribute: distribute version 2.1 (Alpha) patchlevel 24e+011218
X-Sequence: FreeBSD-users-jp 67150
Subject: [FreeBSD-users-jp 67150] DA_Q_NO6_BYTE quirk (Re: umass device configuration)
Errors-To: owner-FreeBSD-users-jp@jp.FreeBSD.org
Sender: owner-FreeBSD-users-jp@jp.FreeBSD.org
X-Originator: simokawa@sat.t.u-tokyo.ac.jp

$B2<@n$G$9(B.

$BK\Bj$H$O$:$l$^$9$,(B, 
At Sun, 24 Feb 2002 21:10:48 +0900,
Katsurajima Naoto wrote:
> 
> $B7KEg(B@$B2#IM$G$9(B.
> 
> $B<~JU%\!<%I$N2r@OMQ$K$H;W$C$F(BMINOLTA$B$N(BDIMAGE X$B$r9XF~$7$^$7$?(B($B%]%1%C%H%G%8%+(B
> $B%a$G8w3X(B3$BG\%:!<%`$H$$$&$N$,Bg$-$+$C$?$N$G$9$,(B).
> 
> $B$G(B, $B$3$$$D$J$s$G$9$,(BUSB$B@\B3$9$k$H(Bumass$B%G%P%$%9$H$7$F(BFreeBSD-CURRENT$B$NJ}$+(B
> $B$i$OG'<1$5$l$^$9$,(B, $B$=$N$^$^$G$O(Bmount$B$7$h$&$H$7$?CJ3,$G(BSCSI$B%3%^%s%I%(%i!<(B
> $B$H$J$k$?$a(B, /usr/src/sys/cam/scsi/scsi_da.c$B$K(B
> 
> {
>         /*
>          * Minolta Dimage X
>          */
>        {T_DIRECT, SIP_MEDIA_REMOVABLE, "MINOLTA", "DIMAGE X*", "*"},
>         /*quirks*/ DA_Q_NO_6_BYTE|DA_Q_NO_SYNC_CACHE
> },
> 

DA_Q_NO_6_BYTE quirk $B$,I,MW$J(B device $B$r;}$C$F$$$kJ}(B, $B2<5-$N(B patch
$B$r;n$7$F$b$i$($J$$$G$7$g$&$+(B? quirk $B$J$7$G$b(B, READ(6)/WRITE(6) $B$,(B
$B<:GT$9$k$H(B, $B<+F0E*$K(B, READ(10)/WRITE(10) $B$G(B retry $B$7(B, $B$=$N8e$O(B
READ(6)/WRITE(6) $B$O;H$o$J$$$h$&$K$9$k(B patch $B$G$9(B.
-stable $B$G$b(B current $B$G$b;H$($k$H;W$$$^$9(B.

/\ Hidetoshi Shimokawa
\/  simokawa@sat.t.u-tokyo.ac.jp
PGP public key: http://www.sat.t.u-tokyo.ac.jp/~simokawa/pgp.html

Index: scsi_da.c
===================================================================
RCS file: /pub/FreeBSD-CVS/src/sys/cam/scsi/scsi_da.c,v
retrieving revision 1.42.2.22
diff -u -r1.42.2.22 scsi_da.c
--- scsi_da.c	23 Feb 2002 02:37:02 -0000	1.42.2.22
+++ scsi_da.c	27 Feb 2002 04:56:23 -0000
@@ -1558,14 +1558,68 @@
 	xpt_release_ccb(done_ccb);
 }
 
+static void
+cmd6to10(struct ccb_scsiio *csio)
+{
+	struct scsi_rw_6 cmd6;
+	struct scsi_rw_10 *cmd10;
+
+	bcopy(&csio->cdb_io.cdb_bytes, &cmd6, sizeof(struct scsi_rw_6));
+	cmd10 = (struct scsi_rw_10 *) &csio->cdb_io.cdb_bytes;
+	cmd10->opcode = (cmd6.opcode == READ_6) ? READ_10 : WRITE_10;
+	cmd10->byte2 = 0;
+	scsi_ulto4b(scsi_3btoul(cmd6.addr), cmd10->addr);
+	cmd10->reserved = 0;
+	scsi_ulto2b(cmd6.length, cmd10->length);
+	cmd10->control = cmd6.control;
+	csio->cdb_len = sizeof(*cmd10);
+}
+
 static int
 daerror(union ccb *ccb, u_int32_t cam_flags, u_int32_t sense_flags)
 {
 	struct da_softc	  *softc;
 	struct cam_periph *periph;
+	struct ccb_scsiio *csio;
+	u_int8_t opcode;
 
 	periph = xpt_path_periph(ccb->ccb_h.path);
 	softc = (struct da_softc *)periph->softc;
+
+ 	/*
+	 * XXX 
+	 * Work around for broken direct access device
+ 	 * which doesn't support READ(6)/WRITE(6).
+ 	 */
+	csio = &ccb->csio;
+ 	opcode = ((struct scsi_rw_6 *)csio->cdb_io.cdb_bytes)->opcode; 
+	if (((ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_SCSI_STATUS_ERROR)
+			& (opcode == READ_6 || opcode == WRITE_6)) {
+ 		int sense_key, error_code;
+ 		int asc, ascq;
+ 		scsi_extract_sense(&csio->sense_data,
+ 				   &error_code,
+ 				   &sense_key, 
+ 				   &asc, &ascq);
+		if (sense_key == SSD_KEY_ILLEGAL_REQUEST) {
+			xpt_print_path(ccb->ccb_h.path);
+ 			printf("READ(6)/WRITE(6) failed, "
+				"minimum_cmd_size is increased to 10.\n");
+ 			softc->minimum_cmd_size = 10;
+			/* command translation */
+ 			cmd6to10(csio);
+			/* requeue */
+ 			ccb->ccb_h.status = CAM_REQUEUE_REQ;
+			xpt_action(ccb);
+			if ((ccb->ccb_h.status & CAM_DEV_QFRZN) != 0)
+				cam_release_devq(ccb->ccb_h.path,
+						 /*relsim_flags*/0,
+						 /*reduction*/0,
+						 /*timeout*/0,
+						 /*getcount_only*/0);
+			return (ERESTART);
+		}
+ 	}
 
 	/*
 	 * XXX

