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>
