Source-Changes-HG archive

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

[src/trunk]: src/sys/dev/scsipi Rework sd_scsibus_get_parms() a little. Try ...



details:   https://anonhg.NetBSD.org/src/rev/227a47e4cc66
branches:  trunk
changeset: 551554:227a47e4cc66
user:      mycroft <mycroft%NetBSD.org@localhost>
date:      Mon Sep 08 06:31:23 2003 +0000

description:
Rework sd_scsibus_get_parms() a little.  Try to get a block descriptor even
if our other MODE SENSEs fail.  Use this code for the optical device case,
at least for now.  (We could query the optical media type and do a table
lookup for the geometry, but why bother?  Actually, why bother with geometry
at all, but I digress...)

diffstat:

 sys/dev/scsipi/sd_scsi.c |  157 ++++++++++++++++------------------------------
 1 files changed, 54 insertions(+), 103 deletions(-)

diffs (261 lines):

diff -r 83e946bfca41 -r 227a47e4cc66 sys/dev/scsipi/sd_scsi.c
--- a/sys/dev/scsipi/sd_scsi.c  Mon Sep 08 06:18:49 2003 +0000
+++ b/sys/dev/scsipi/sd_scsi.c  Mon Sep 08 06:31:23 2003 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: sd_scsi.c,v 1.33 2003/09/08 03:09:09 mycroft Exp $     */
+/*     $NetBSD: sd_scsi.c,v 1.34 2003/09/08 06:31:23 mycroft Exp $     */
 
 /*-
  * Copyright (c) 1998, 2003 The NetBSD Foundation, Inc.
@@ -54,7 +54,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sd_scsi.c,v 1.33 2003/09/08 03:09:09 mycroft Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sd_scsi.c,v 1.34 2003/09/08 06:31:23 mycroft Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -112,8 +112,6 @@
                    u_int8_t, void *, size_t, int, int, int *));
 static int     sd_scsibus_get_parms __P((struct sd_softc *,
                    struct disk_parms *, int));
-static int     sd_scsibus_get_optparms __P((struct sd_softc *,
-                   struct disk_parms *, int));
 static int     sd_scsibus_get_simplifiedparms __P((struct sd_softc *,
                    struct disk_parms *, int));
 static int     sd_scsibus_flush __P((struct sd_softc *, int));
@@ -201,51 +199,6 @@
 }
 
 static int
-sd_scsibus_get_optparms(sd, dp, flags)
-       struct sd_softc *sd;
-       struct disk_parms *dp;
-       int flags;
-{
-       struct sd_scsibus_mode_sense_data scsipi_sense;
-       u_int64_t sectors;
-       int error;
-
-/* XXXX */
-       dp->blksize = 512;
-       if ((sectors = scsipi_size(sd->sc_periph, flags)) == 0)
-               return (SDGP_RESULT_OFFLINE);           /* XXX? */
-
-       /* XXX
-        * It is better to get the following params from the
-        * mode sense page 6 only (optical device parameter page).
-        * However, there are stupid optical devices which does NOT
-        * support the page 6. Ghaa....
-        */
-       error = scsipi_mode_sense(sd->sc_periph, 0, 0x3f,
-           &scsipi_sense.header.small,
-           sizeof(struct scsipi_mode_header) + sizeof(struct scsi_blk_desc),
-           flags | XS_CTL_DATA_ONSTACK, SDRETRIES, 6000);
-
-       if (error != 0)
-               return (SDGP_RESULT_OFFLINE);           /* XXX? */
-
-       dp->blksize = _3btol(scsipi_sense.blk_desc.blklen);
-       if (dp->blksize == 0) 
-               dp->blksize = 512;
-
-       /*
-        * Create a pseudo-geometry.
-        */
-       dp->heads = 64;
-       dp->sectors = 32;
-       dp->cyls = sectors / (dp->heads * dp->sectors);
-       dp->disksize = sectors;
-       dp->disksize512 = (sectors * dp->blksize) / DEV_BSIZE;
-
-       return (SDGP_RESULT_OK);
-}
-
-static int
 sd_scsibus_get_simplifiedparms(sd, dp, flags)
        struct sd_softc *sd;
        struct disk_parms *dp;
@@ -283,7 +236,6 @@
        if (error != 0)
                return (SDGP_RESULT_OFFLINE);           /* XXX? */
 
-/* XXXX */
        dp->blksize = _2btol(scsipi_sense.lbs);
        if (dp->blksize == 0) 
                dp->blksize = 512;
@@ -327,23 +279,24 @@
        u_int8_t *p;
 #endif
 
-       dp->rot_rate = 3600;            /* XXX any way of getting this? */
-
        /*
         * If offline, the SDEV_MEDIA_LOADED flag will be
         * cleared by the caller if necessary.
         */
-       if (sd->type == T_OPTICAL)
-               return (sd_scsibus_get_optparms(sd, dp, flags));
-
        if (sd->type == T_SIMPLE_DIRECT)
                return (sd_scsibus_get_simplifiedparms(sd, dp, flags));
 
-       sectors = scsipi_size(sd->sc_periph, flags);
+       dp->disksize = sectors = scsipi_size(sd->sc_periph, flags);
+       if (sectors == 0)
+               return (SDGP_RESULT_OFFLINE);           /* XXX? */
+
+       if (sd->type == T_OPTICAL)
+               goto page0;
 
        memset(&scsipi_sense, 0, sizeof(scsipi_sense));
-       if ((error = sd_scsibus_mode_sense(sd, 0, &scsipi_sense,
-           sizeof(scsipi_sense), 4, flags, &big)) == 0) {
+       error = sd_scsibus_mode_sense(sd, 0, &scsipi_sense,
+           sizeof(scsipi_sense), 4, flags, &big);
+       if (!error) {
                if (big) {
                        bdesc = (void *)(&scsipi_sense.header.big + 1);
                        bsize = _2btol(scsipi_sense.header.big.blk_desc_len);
@@ -377,34 +330,25 @@
                 */
                dp->heads = pages->rigid_geometry.nheads;
                dp->cyls = _3btol(pages->rigid_geometry.ncyl);
-               dp->rot_rate = _2btol(pages->rigid_geometry.rpm);
-
                if (dp->heads == 0 || dp->cyls == 0)
                        goto page5;
+               dp->sectors = sectors / (dp->heads * dp->cyls); /* XXX */
 
-               if (bsize >= 8) {
-                       dp->blksize = _3btol(bdesc->blklen);
-                       if (dp->blksize == 0)
-                               dp->blksize = 512;
-               } else
-                       dp->blksize = 512;
+               dp->rot_rate = _2btol(pages->rigid_geometry.rpm);
                if (dp->rot_rate == 0)
                        dp->rot_rate = 3600;
 
-               dp->disksize = sectors;
-               dp->disksize512 = (sectors * dp->blksize) / DEV_BSIZE;
-               dp->sectors = sectors / (dp->heads * dp->cyls); /* XXX */
-
 #if 0
 printf("page 4 ok\n");
 #endif
-               return (SDGP_RESULT_OK);
+               goto blksize;
        }
 
 page5:
        memset(&scsipi_sense, 0, sizeof(scsipi_sense));
-       if ((error = sd_scsibus_mode_sense(sd, 0, &scsipi_sense,
-           sizeof(scsipi_sense), 5, flags, &big)) == 0) {
+       error = sd_scsibus_mode_sense(sd, 0, &scsipi_sense,
+           sizeof(scsipi_sense), 5, flags, &big);
+       if (!error) {
                if (big) {
                        bdesc = (void *)(&scsipi_sense.header.big + 1);
                        bsize = _2btol(scsipi_sense.header.big.blk_desc_len);
@@ -420,7 +364,7 @@
 #endif
 
                if ((pages->flex_geometry.pg_code & PGCODE_MASK) != 5)
-                       goto fake_it;
+                       goto page0;
                        
                SC_DEBUG(sd->sc_periph, SCSIPI_DB3,
                    ("%d cyls, %d heads, %d sec, %d bytes/sec\n",
@@ -432,46 +376,43 @@
                dp->heads = pages->flex_geometry.nheads;
                dp->cyls = _2btol(pages->flex_geometry.ncyl);
                dp->sectors = pages->flex_geometry.ph_sec_tr;
-               dp->rot_rate = _2btol(pages->rigid_geometry.rpm);
-
                if (dp->heads == 0 || dp->cyls == 0 || dp->sectors == 0)
-                       goto fake_it;
+                       goto page0;
 
-               if (bsize >= 8) {
-                       dp->blksize = _3btol(bdesc->blklen);
-                       if (dp->blksize == 0)
-                               dp->blksize = 512;
-               } else
-                       dp->blksize = 512;
+               dp->rot_rate = _2btol(pages->rigid_geometry.rpm);
                if (dp->rot_rate == 0)
                        dp->rot_rate = 3600;
 
-               dp->disksize = sectors;
-               dp->disksize512 = (sectors * dp->blksize) / DEV_BSIZE;
-
 #if 0
 printf("page 5 ok\n");
 #endif
-               return (SDGP_RESULT_OK);
+               goto blksize;
        }
 
-fake_it:
-       if (sectors == 0)
-               return (SDGP_RESULT_OFFLINE);           /* XXX? */
-
-       if ((sd->sc_periph->periph_quirks & PQUIRK_NOMODESENSE) == 0)
-               printf("%s: using fictitious geometry\n", sd->sc_dev.dv_xname);
+page0:
+       memset(&scsipi_sense, 0, sizeof(scsipi_sense));
+       error = sd_scsibus_mode_sense(sd, 0, &scsipi_sense,
+           sizeof(scsipi_sense), 0, flags, &big);
+       if (!error) {
+               if (big) {
+                       bdesc = (void *)(&scsipi_sense.header.big + 1);
+                       bsize = _2btol(scsipi_sense.header.big.blk_desc_len);
+               } else {
+                       bdesc = (void *)(&scsipi_sense.header.small + 1);
+                       bsize = scsipi_sense.header.small.blk_desc_len;
+               }
 
-       /*
-        * use adaptec standard fictitious geometry
-        * this depends on which controller (e.g. 1542C is
-        * different. but we have to put SOMETHING here..)
-        */
-       dp->blksize = 512;
-       dp->disksize512 = dp->disksize = sectors;
+#if 0
+printf("page 0 sense:"); for (i = sizeof(scsipi_sense), p = (void *)&scsipi_sense; i; i--, p++) printf(" %02x", *p); printf("\n");
+printf("page 0 bsize=%d\n", bsize);
+printf("page 0 ok\n");
+#endif
+       } else
+               bsize = 0;
+
+       printf("%s: fabricating a geometry\n", sd->sc_dev.dv_xname);
        /* Try calling driver's method for figuring out geometry. */
-       if (sd->sc_periph->periph_channel->chan_adapter->adapt_getgeom ==
-           NULL ||
+       if (!sd->sc_periph->periph_channel->chan_adapter->adapt_getgeom ||
            !(*sd->sc_periph->periph_channel->chan_adapter->adapt_getgeom)
                (sd->sc_periph, dp, sectors)) {
                /*
@@ -483,7 +424,17 @@
                dp->sectors = 32;
                dp->cyls = sectors / (64 * 32);
        }
- 
+       dp->rot_rate = 3600;
+
+blksize:       
+       if (bsize >= 8) {
+               dp->blksize = _3btol(bdesc->blklen);
+               if (dp->blksize == 0)
+                       dp->blksize = 512;
+       } else
+               dp->blksize = 512;
+       dp->disksize512 = (sectors * dp->blksize) / DEV_BSIZE;
+
        return (SDGP_RESULT_OK);
 }
 



Home | Main Index | Thread Index | Old Index