Catch the divide by zero bug earlier. If the drive give back
[unix-history] / sys / scsi / sd.c
index 660d194..1cb15da 100644 (file)
@@ -14,7 +14,7 @@
  *
  * Ported to run under 386BSD by Julian Elischer (julian@dialix.oz.au) Sept 1992
  *
  *
  * Ported to run under 386BSD by Julian Elischer (julian@dialix.oz.au) Sept 1992
  *
- *      $Id: sd.c,v 1.12 1993/11/18 05:03:02 rgrimes Exp $
+ *      $Id: sd.c,v 1.19 1994/03/14 23:09:34 ats Exp $
  */
 
 #define SPLSD splbio
  */
 
 #define SPLSD splbio
@@ -22,6 +22,7 @@
 #include <sd.h>
 #include <sys/types.h>
 #include <sys/param.h>
 #include <sd.h>
 #include <sys/types.h>
 #include <sys/param.h>
+#include <sys/kernel.h>
 #include <sys/dkbad.h>
 #include <sys/systm.h>
 #include <sys/conf.h>
 #include <sys/dkbad.h>
 #include <sys/systm.h>
 #include <sys/conf.h>
@@ -36,6 +37,7 @@
 #include <scsi/scsi_all.h>
 #include <scsi/scsi_disk.h>
 #include <scsi/scsiconf.h>
 #include <scsi/scsi_all.h>
 #include <scsi/scsi_disk.h>
 #include <scsi/scsiconf.h>
+#include <vm/vm.h>
 
 u_int32 sdstrats, sdqueues;
 
 
 u_int32 sdstrats, sdqueues;
 
@@ -48,9 +50,8 @@ int     Debugger();
 #else /* NetBSD */
 #include <ddb.h>
 #if    NDDB > 0
 #else /* NetBSD */
 #include <ddb.h>
 #if    NDDB > 0
-int     Debugger();
 #else  /* NDDB > 0 */
 #else  /* NDDB > 0 */
-#define Debugger()
+#define Debugger(s)
 #endif /* NDDB > 0 */
 #endif
 
 #endif /* NDDB > 0 */
 #endif
 
@@ -61,6 +62,7 @@ int     Debugger();
 #define        SDOUTSTANDING   2
 #define SDQSIZE                4
 #define        SD_RETRIES      4
 #define        SDOUTSTANDING   2
 #define SDQSIZE                4
 #define        SD_RETRIES      4
+#define        MAXTRANSFER     8               /* 1 page at a time */
 
 #define MAKESDDEV(maj, unit, part)     (makedev(maj,((unit<<3)+part)))
 #define        UNITSHIFT       3
 
 #define MAKESDDEV(maj, unit, part)     (makedev(maj,((unit<<3)+part)))
 #define        UNITSHIFT       3
@@ -119,6 +121,8 @@ struct sd_data {
 
 static u_int32 next_sd_unit = 0;
 
 
 static u_int32 next_sd_unit = 0;
 
+static struct scsi_xfer sx;
+
 /*
  * The routine called by the low level scsi routine when it discovers
  * a device suitable for this driver.
 /*
  * The routine called by the low level scsi routine when it discovers
  * a device suitable for this driver.
@@ -271,7 +275,7 @@ sdopen(dev)
        if (sd->params.secsiz != SECSIZE) {     /* XXX One day... */
                printf("sd%d: Can't deal with %d bytes logical blocks\n",
                    unit, sd->params.secsiz);
        if (sd->params.secsiz != SECSIZE) {     /* XXX One day... */
                printf("sd%d: Can't deal with %d bytes logical blocks\n",
                    unit, sd->params.secsiz);
-               Debugger();
+               Debugger("sd");
                errcode = ENXIO;
                goto bad;
        }
                errcode = ENXIO;
                goto bad;
        }
@@ -516,7 +520,7 @@ sdstart(unit)
                bzero(&cmd, sizeof(cmd));
                cmd.op_code = (bp->b_flags & B_READ)
                    ? READ_BIG : WRITE_BIG;
                bzero(&cmd, sizeof(cmd));
                cmd.op_code = (bp->b_flags & B_READ)
                    ? READ_BIG : WRITE_BIG;
-               cmd.addr_3 = (blkno & 0xff000000) >> 24;
+               cmd.addr_3 = (blkno & 0xff000000UL) >> 24;
                cmd.addr_2 = (blkno & 0xff0000) >> 16;
                cmd.addr_1 = (blkno & 0xff00) >> 8;
                cmd.addr_0 = blkno & 0xff;
                cmd.addr_2 = (blkno & 0xff0000) >> 16;
                cmd.addr_1 = (blkno & 0xff00) >> 8;
                cmd.addr_0 = blkno & 0xff;
@@ -814,7 +818,7 @@ sd_get_parms(unit, flags)
        /*
         * First check if we have it all loaded
         */
        /*
         * First check if we have it all loaded
         */
-       if (sd->flags & SDEV_MEDIA_LOADED)
+       if (sd->sc_link->flags & SDEV_MEDIA_LOADED)
                return 0;
 
        /*
                return 0;
 
        /*
@@ -873,7 +877,16 @@ sd_get_parms(unit, flags)
 
                sectors = sd_size(unit, flags);
                disk_parms->disksize = sectors;
 
                sectors = sd_size(unit, flags);
                disk_parms->disksize = sectors;
-               sectors /= (disk_parms->heads * disk_parms->cyls);
+               /* Check if none of these values are zero */
+               if(disk_parms->heads && disk_parms->cyls) {
+                       sectors /= (disk_parms->heads * disk_parms->cyls);
+               }
+               else {
+                       /* set it to something reasonable */
+                       sectors = 32;
+                       disk_parms->heads = 64;
+                       disk_parms->cyls = sectors / (64 * 32);
+               }
                disk_parms->sectors = sectors;  /* dubious on SCSI *//*XXX */
        }
        sd->sc_link->flags |= SDEV_MEDIA_LOADED;
                disk_parms->sectors = sectors;  /* dubious on SCSI *//*XXX */
        }
        sd->sc_link->flags |= SDEV_MEDIA_LOADED;
@@ -905,17 +918,6 @@ sdsize(dev_t dev)
        return (int)sd->disklabel.d_partitions[part].p_size;
 }
 
        return (int)sd->disklabel.d_partitions[part].p_size;
 }
 
-
-#define SCSIDUMP 1
-#undef SCSIDUMP
-#define NOT_TRUSTED 1
-
-#ifdef SCSIDUMP
-#include <vm/vm.h>
-
-static struct scsi_xfer sx;
-#define        MAXTRANSFER 8           /* 1 page at a time */
-
 /*
  * dump all of physical memory into the partition specified, starting
  * at offset 'dumplo' into the partition.
 /*
  * dump all of physical memory into the partition specified, starting
  * at offset 'dumplo' into the partition.
@@ -932,8 +934,8 @@ sddump(dev_t dev)
        struct  scsi_rw_big cmd;
        extern  int Maxmem;
        static  int sddoingadump = 0;
        struct  scsi_rw_big cmd;
        extern  int Maxmem;
        static  int sddoingadump = 0;
-#define MAPTO CADDR1
-       extern  caddr_t MAPTO;  /* map the page we are about to write, here */
+       extern  caddr_t CADDR1; /* map the page we are about to write, here */
+       extern  struct pte *CMAP1;
        struct  scsi_xfer *xs = &sx;
        errval  retval;
        int     c;
        struct  scsi_xfer *xs = &sx;
        errval  retval;
        int     c;
@@ -949,7 +951,7 @@ sddump(dev_t dev)
        part = PARTITION(dev);  /* file system */
        /* check for acceptable drive number */
        if (unit >= NSD)
        part = PARTITION(dev);  /* file system */
        /* check for acceptable drive number */
        if (unit >= NSD)
-               return (ENXIO); /* 31 Jul 92 */
+               return (ENXIO);
 
        sd = sd_data[unit];
        if (!sd)
 
        sd = sd_data[unit];
        if (!sd)
@@ -979,14 +981,10 @@ sddump(dev_t dev)
        sddoingadump = 1;
 
        blknum = dumplo + blkoff;
        sddoingadump = 1;
 
        blknum = dumplo + blkoff;
-       /* blkcnt = initialise_me; */
        while (num > 0) {
        while (num > 0) {
-               pmap_enter(kernel_pmap,
-                   MAPTO,
-                   trunc_page(addr),
-                   VM_PROT_READ,
-                   TRUE);
-#ifndef        NOT_TRUSTED
+                *(int *)CMAP1 =
+                       PG_V | PG_KW | trunc_page(addr);
+                tlbflush();
                /*
                 *  Fill out the scsi command
                 */
                /*
                 *  Fill out the scsi command
                 */
@@ -1014,7 +1012,7 @@ sddump(dev_t dev)
                xs->resid = blkcnt * 512;
                xs->error = XS_NOERROR;
                xs->bp = 0;
                xs->resid = blkcnt * 512;
                xs->error = XS_NOERROR;
                xs->bp = 0;
-               xs->data = (u_char *) MAPTO;
+               xs->data = (u_char *) CADDR1;
                xs->datalen = blkcnt * 512;
 
                /*
                xs->datalen = blkcnt * 512;
 
                /*
@@ -1030,10 +1028,6 @@ sddump(dev_t dev)
                default:
                        return (ENXIO);         /* we said not to sleep! */
                }
                default:
                        return (ENXIO);         /* we said not to sleep! */
                }
-#else  /* NOT_TRUSTED */
-               /* lets just talk about this first... */
-               printf("sd%d: dump addr 0x%x, blk %d\n", unit, addr, blknum);
-#endif /* NOT_TRUSTED */
 
                if ((unsigned) addr % (1024 * 1024) == 0)
                        printf("%d ", num / 2048);
 
                if ((unsigned) addr % (1024 * 1024) == 0)
                        printf("%d ", num / 2048);
@@ -1048,12 +1042,3 @@ sddump(dev_t dev)
        }
        return (0);
 }
        }
        return (0);
 }
-#else  /* SCSIDUMP */
-errval
-sddump()
-{
-       printf("\nsddump()        -- not implemented\n");
-       DELAY(60000000);        /* 60 seconds */
-       return -1;
-}
-#endif /* SCSIDUMP */