Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/scsipi Use READ/WRITE (16) if the LBA is larger than...



details:   https://anonhg.NetBSD.org/src/rev/8b41a96ee40e
branches:  trunk
changeset: 571628:8b41a96ee40e
user:      thorpej <thorpej%NetBSD.org@localhost>
date:      Sat Dec 04 19:02:25 2004 +0000

description:
Use READ/WRITE (16) if the LBA is larger than 32 bits.  Another bit
of kern/28514.

diffstat:

 sys/dev/scsipi/scsipi_disk.h |  28 ++++++++++++++++++++++++++--
 sys/dev/scsipi/scsipiconf.h  |  16 +++++++++++++++-
 sys/dev/scsipi/sd.c          |  28 +++++++++++++++++-----------
 3 files changed, 58 insertions(+), 14 deletions(-)

diffs (154 lines):

diff -r 4ef8541e392a -r 8b41a96ee40e sys/dev/scsipi/scsipi_disk.h
--- a/sys/dev/scsipi/scsipi_disk.h      Sat Dec 04 18:40:45 2004 +0000
+++ b/sys/dev/scsipi/scsipi_disk.h      Sat Dec 04 19:02:25 2004 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: scsipi_disk.h,v 1.10 2004/12/03 20:20:32 thorpej Exp $ */
+/*     $NetBSD: scsipi_disk.h,v 1.11 2004/12/04 19:02:25 thorpej Exp $ */
 
 /*
  * SCSI and SCSI-like interfaces description
@@ -61,15 +61,39 @@
 struct scsipi_rw_big {
        u_int8_t opcode;
        u_int8_t byte2;
-#define        SRWB_RELADDR    0x01
+#define        SRWB_RELADDR    0x01    /* obsolete */
+#define        SRWB_FUA_NV     0x02    /* force unit access non-volatile cache */
 #define        SRWB_FUA        0x08    /* force unit access */
 #define        SRWB_DPO        0x10    /* disable page out */
+#define        SRWB_PROTECT(x) ((x) << 5)
        u_int8_t addr[4];
        u_int8_t reserved;
        u_int8_t length[2];
        u_int8_t control;
 } __attribute__((packed));
 
+#define        READ_12                 0xa8
+#define        WRITE_12                0xaa
+struct scsipi_rw_12 {
+       u_int8_t opcode;
+       u_int8_t byte2;         /* see scsipi_rw_big bits */
+       u_int8_t addr[4];
+       u_int8_t length[4];
+       u_int8_t byte11;
+       u_int8_t control;
+};
+
+#define        READ_16                 0x88
+#define        WRITE_16                0x8a
+struct scsipi_rw_16 {
+       u_int8_t opcode;
+       u_int8_t byte2;         /* see scsipi_rw_big bits */
+       u_int8_t addr[8];
+       u_int8_t length[4];
+       u_int8_t byte15;
+       u_int8_t control;
+};
+
 #define        READ_CAPACITY           0x25
 struct scsipi_read_capacity {
        u_int8_t opcode;
diff -r 4ef8541e392a -r 8b41a96ee40e sys/dev/scsipi/scsipiconf.h
--- a/sys/dev/scsipi/scsipiconf.h       Sat Dec 04 18:40:45 2004 +0000
+++ b/sys/dev/scsipi/scsipiconf.h       Sat Dec 04 19:02:25 2004 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: scsipiconf.h,v 1.91 2004/12/03 20:20:32 thorpej Exp $  */
+/*     $NetBSD: scsipiconf.h,v 1.92 2004/12/04 19:02:25 thorpej Exp $  */
 
 /*-
  * Copyright (c) 1998, 1999, 2000, 2004 The NetBSD Foundation, Inc.
@@ -727,6 +727,20 @@
        bytes[3] = val & 0xff;
 }
 
+static __inline void __unused
+_lto8b(u_int64_t val, u_int8_t *bytes)
+{
+
+       bytes[0] = (val >> 56) & 0xff;
+       bytes[1] = (val >> 48) & 0xff;
+       bytes[2] = (val >> 40) & 0xff;
+       bytes[3] = (val >> 32) & 0xff;
+       bytes[4] = (val >> 24) & 0xff;
+       bytes[5] = (val >> 16) & 0xff;
+       bytes[6] = (val >> 8)  & 0xff;
+       bytes[7] = val         & 0xff;
+}
+
 static __inline u_int32_t __unused
 _2btol(const u_int8_t *bytes)
 {
diff -r 4ef8541e392a -r 8b41a96ee40e sys/dev/scsipi/sd.c
--- a/sys/dev/scsipi/sd.c       Sat Dec 04 18:40:45 2004 +0000
+++ b/sys/dev/scsipi/sd.c       Sat Dec 04 19:02:25 2004 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: sd.c,v 1.229 2004/10/28 07:07:45 yamt Exp $    */
+/*     $NetBSD: sd.c,v 1.230 2004/12/04 19:02:26 thorpej Exp $ */
 
 /*-
  * Copyright (c) 1998, 2003, 2004 The NetBSD Foundation, Inc.
@@ -54,7 +54,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sd.c,v 1.229 2004/10/28 07:07:45 yamt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sd.c,v 1.230 2004/12/04 19:02:26 thorpej Exp $");
 
 #include "opt_scsi.h"
 #include "rnd.h"
@@ -773,6 +773,7 @@
        struct sd_softc *sd = (void *)periph->periph_dev;
        struct disklabel *lp = sd->sc_dk.dk_label;
        struct buf *bp = 0;
+       struct scsipi_rw_16 cmd16;
        struct scsipi_rw_big cmd_big;
        struct scsi_rw cmd_small;
        struct scsipi_generic *cmdp;
@@ -829,15 +830,13 @@
                        nblks = howmany(bp->b_bcount, lp->d_secsize);
 
                /*
-                *  Fill out the scsi command.  If the transfer will
-                *  fit in a "small" cdb, use it.
+                * Fill out the scsi command.  Use the smallest CDB possible
+                * (6-byte, 10-byte, or 16-byte).
                 */
                if (((bp->b_rawblkno & 0x1fffff) == bp->b_rawblkno) &&
                    ((nblks & 0xff) == nblks) &&
                    !(periph->periph_quirks & PQUIRK_ONLYBIG)) {
-                       /*
-                        * We can fit in a small cdb.
-                        */
+                       /* 6-byte CDB */
                        memset(&cmd_small, 0, sizeof(cmd_small));
                        cmd_small.opcode = (bp->b_flags & B_READ) ?
                            SCSI_READ_COMMAND : SCSI_WRITE_COMMAND;
@@ -845,10 +844,8 @@
                        cmd_small.length = nblks & 0xff;
                        cmdlen = sizeof(cmd_small);
                        cmdp = (struct scsipi_generic *)&cmd_small;
-               } else {
-                       /*
-                        * Need a large cdb.
-                        */
+               } else if ((bp->b_rawblkno & 0xffffffff) == bp->b_rawblkno) {
+                       /* 10-byte CDB */
                        memset(&cmd_big, 0, sizeof(cmd_big));
                        cmd_big.opcode = (bp->b_flags & B_READ) ?
                            READ_BIG : WRITE_BIG;
@@ -856,6 +853,15 @@
                        _lto2b(nblks, cmd_big.length);
                        cmdlen = sizeof(cmd_big);
                        cmdp = (struct scsipi_generic *)&cmd_big;
+               } else {
+                       /* 16-byte CDB */
+                       memset(&cmd16, 0, sizeof(cmd16));
+                       cmd16.opcode = (bp->b_flags & B_READ) ?
+                           READ_16 : WRITE_16;
+                       _lto8b(bp->b_rawblkno, cmd16.addr);
+                       _lto4b(nblks, cmd16.length);
+                       cmdlen = sizeof(cmd16);
+                       cmdp = (struct scsipi_generic *)&cmd16;
                }
 
                /* Instrumentation. */



Home | Main Index | Thread Index | Old Index