Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 24 Oct 2002 17:07:18 +0900
From:      Hidetoshi Shimokawa <simokawa@sat.t.u-tokyo.ac.jp>
To:        Dmitry Mottl <dima@sinp.msu.ru>
Cc:        freebsd-firewire@freebsd.org
Subject:   Re: VAIO Firewire dock station with DVD-ROM
Message-ID:  <ybsptu0s1jd.wl@ett.sat.t.u-tokyo.ac.jp>
In-Reply-To: <ybsvg3tsz2j.wl@ett.sat.t.u-tokyo.ac.jp>
References:  <20021022154423.X217-100000@localhost> <ybsvg3tsz2j.wl@ett.sat.t.u-tokyo.ac.jp>

next in thread | previous in thread | raw e-mail | index | archive | help
At Wed, 23 Oct 2002 10:50:44 +0900,
simokawa wrote:
> 
> At Tue, 22 Oct 2002 15:54:03 +0400 (MSD),
> Dmitry Mottl wrote:
> > 
> > Hello,
> > 
> > I have Sony VAIO laptop and I have successfuly installed firewire driver (/sys/dev/firewire/*) on it and i'm
> > using DVD on DockStation without any problems except one -- i can't listen audio CD-ROMs.
> > CD-ROM can be mount in usual way and all is going fine, if it has data (not audio) format.
> > 
> > If i try to play audio with /usr/sbin/cdcontrol, following messages appear:
> > 
> > Oct 22 15:42:06 VAIO /kernel: sbp0:0:0 ORB status src:1 resp:0 dead:0 len:7 stat:c orb:000025270
> > Oct 22 15:42:06 VAIO /kernel: sbp0:0:0 Request aborted
> > Oct 22 15:42:06 VAIO /kernel: sbp0:0:0 XPT_SCSI_IO: cmd: 1a 00 0e 00 1c 00 aa 00 0c 00, flags: 0x40, 6b cmd/28b data/32b sense
> > Oct 22 15:42:06 VAIO /kernel: sbp0:0:0 SCSI status 2 sfmt 0 valid 0 key 5 code 20 qlfr 0 len 7
> > Oct 22 15:42:06 VAIO /kernel: (cd0:sbp0:0:0:0): MODE SENSE(06). CDB: 1a 0 e 0 1c 0
> > Oct 22 15:42:06 VAIO /kernel: (cd0:sbp0:0:0:0): ILLEGAL REQUEST asc:20,0
> > Oct 22 15:42:06 VAIO /kernel: (cd0:sbp0:0:0:0): Invalid command operation code
> > 
> > Thank you for your advice.
> 
> This seems another 6bytes and 10bytes command problem.
> /sys/cam/scsi/scsi_cd.c issues "MODE SENSE(6)" though the DVD drive
> doesn't support it.
> We need some workaround to use "MODE SENSE(10)".

Could you try this patch?

Index: sbp.c
===================================================================
RCS file: /home/firewire/src/sys/dev/firewire/sbp.c,v
retrieving revision 1.173
diff -u -r1.173 sbp.c
--- sbp.c	23 Oct 2002 13:07:05 -0000	1.173
+++ sbp.c	24 Oct 2002 08:04:28 -0000
@@ -299,6 +299,10 @@
 static void sbp_detach_target __P((struct sbp_target *));
 static void sbp_timeout __P((void *arg));
 static void sbp_mgm_orb __P((struct sbp_dev *, int));
+#define FIX_6BYTES_CMD 1
+#if FIX_6BYTES_CMD
+static int sbp_scsi_6_to_10 __P((unsigned char *, unsigned char *, int));
+#endif
 
 MALLOC_DEFINE(M_SBP, "sbp", "SBP-II/Firewire");
 
@@ -1754,6 +1758,7 @@
 	{
 		struct ccb_scsiio *csio;
 		struct sbp_ocb *ocb;
+		void *cdb;
 		int s, speed;
 
 		csio = &ccb->csio;
@@ -1823,15 +1828,19 @@
 		if (csio->ccb_h.flags & CAM_DATA_PHYS)
 			printf("sbp: CAM_DATA_PHYS\n");
 
-		if (csio->ccb_h.flags & CAM_CDB_POINTER) {
-			bcopy(csio->cdb_io.cdb_ptr,
-			(void *)(uintptr_t)(volatile void *)&ocb->orb[5],
-			(csio->cdb_len + 3) & ~0x3);
-		} else {
-			bcopy(&csio->cdb_io.cdb_bytes,
+		if (csio->ccb_h.flags & CAM_CDB_POINTER)
+			cdb = (void *)csio->cdb_io.cdb_ptr;
+		else
+			cdb = (void *)&csio->cdb_io.cdb_bytes;
+#if FIX_6BYTES_CMD
+		sbp_scsi_6_to_10((char *)cdb,
+			(char *)(uintptr_t)(volatile void *)&ocb->orb[5],
+			(csio->cdb_len + 3) &~0x3);
+#else
+		bcopy(cdb,
 			(void *)(uintptr_t)(volatile void *)&ocb->orb[5],
 			(csio->cdb_len + 3) &~0x3);
-		}
+#endif
 /*
 printf("ORB %08x %08x %08x %08x\n", ntohl(ocb->orb[0]), ntohl(ocb->orb[1]), ntohl(ocb->orb[2]), ntohl(ocb->orb[3]));
 printf("ORB %08x %08x %08x %08x\n", ntohl(ocb->orb[4]), ntohl(ocb->orb[5]), ntohl(ocb->orb[6]), ntohl(ocb->orb[7]));
@@ -2190,6 +2199,50 @@
 
 	splx(s);
 }
+
+#if FIX_6BYTES_CMD
+/*
+ * This is based on umass_scsi_6_to_10() in umass.c.
+ */
+
+static int
+sbp_scsi_6_to_10(unsigned char *cmd, unsigned char *rcmd, int size)
+{
+	switch (cmd[0]) {
+	case READ_6:
+		rcmd[0] = READ_10;
+		break;
+	case WRITE_6:
+		rcmd[0] = WRITE_10;
+		break;
+	case MODE_SENSE_6:
+		rcmd[0] = MODE_SENSE_10;
+		break;
+	case MODE_SELECT_6:
+		rcmd[0] = MODE_SELECT_10;
+		break;
+	default:
+		bcopy(cmd, rcmd, size);
+		return (0);
+	}
+
+	bzero(rcmd + 1, 10 - 1);
+	switch (cmd[0]) {
+	case READ_6:
+	case WRITE_6:
+		memcpy(&rcmd[3], &cmd[1], 3);
+		break;
+	case MODE_SENSE_6:
+		rcmd[2] = cmd[2];
+	case MODE_SELECT_6:
+		rcmd[1] = cmd[1];
+		break;
+	}
+	rcmd[8] = cmd[4];
+	rcmd[9] = cmd[5];
+	return (1);
+}
+#endif
 
 static devclass_t sbp_devclass;
 
/\ Hidetoshi Shimokawa
\/  simokawa@sat.t.u-tokyo.ac.jp
PGP public key: http://www.sat.t.u-tokyo.ac.jp/~simokawa/pgp.html

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-firewire" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?ybsptu0s1jd.wl>