- /* init fields that don't change */
- sc->sc_cmd.sd = sd = &sc->sc_sd;
- sc->sc_cmd.unit = (int)sc;
-
- /*
- * Try to find out what type of device this is.
- */
- scsiGroup0Cmd(SCSI_INQUIRY, sd->sd_slave, 0, sizeof(inqbuf), &inqcmd);
- sc->sc_cmd.cmdlen = sizeof(ScsiGroup0Cmd);
- sc->sc_cmd.cmd = (u_char *)&inqcmd;
- sc->sc_cmd.buflen = sizeof(inqbuf);
- sc->sc_cmd.buf = (char *)&inqbuf;
- sc->sc_cmd.flags = 0;
-
- /* tell controller to start this command */
- rzstart(sc);
-
- if (sc->sc_error || (i = sizeof(inqbuf) - sc->sc_resid) < 5)
- goto bad;
- switch (inqbuf.type) {
- case SCSI_DISK_TYPE: /* disk */
- case SCSI_WORM_TYPE: /* WORM */
- case SCSI_ROM_TYPE: /* CD-ROM */
- case SCSI_OPTICAL_MEM_TYPE: /* Magneto-optical */
- break;
-
- default: /* not a disk */
- goto bad;
- }
- sc->sc_type = inqbuf.type;
-
- /* find out how big a disk this is */
- scsiGroup1Cmd(SCSI_READ_CAPACITY, sd->sd_slave, 0, 0, &sc->sc_rwcmd);
- sc->sc_cmd.cmdlen = sizeof(ScsiGroup1Cmd);
- sc->sc_cmd.cmd = (u_char *)&sc->sc_rwcmd;
- sc->sc_cmd.buflen = sizeof(capbuf);
- sc->sc_cmd.buf = (char *)capbuf;
- sc->sc_cmd.flags = 0;
-
- rzstart(sc);
-
- if (sc->sc_error || sc->sc_resid != 0)
- goto bad;
- sc->sc_blks = ((capbuf[0] << 24) | (capbuf[1] << 16) |
- (capbuf[2] << 8) | capbuf[3]) + 1;
- sc->sc_blksize = (capbuf[4] << 24) | (capbuf[5] << 16) |
- (capbuf[6] << 8) | capbuf[7];
-
-#if 0
- printf("rz%d at %s%d drive %d slave %d", sd->sd_unit,
- sd->sd_cdriver->d_name, sd->sd_ctlr, sd->sd_drive,
- sd->sd_slave);
- if (inqbuf.version > 1 || i < 36)
- printf(" type 0x%x, qual 0x%x, ver %d",
- inqbuf.type, inqbuf.qualifier, inqbuf.version);
- else {
- char vid[9], pid[17], revl[5];
-
- bcopy((caddr_t)inqbuf.vendorID, (caddr_t)vid, 8);
- bcopy((caddr_t)inqbuf.productID, (caddr_t)pid, 16);
- bcopy((caddr_t)inqbuf.revLevel, (caddr_t)revl, 4);
- for (i = 8; --i > 0; )
- if (vid[i] != ' ')
- break;
- vid[i+1] = 0;
- for (i = 16; --i > 0; )
- if (pid[i] != ' ')
- break;
- pid[i+1] = 0;
- for (i = 4; --i > 0; )
- if (revl[i] != ' ')
- break;
- revl[i+1] = 0;
- printf(" %s %s rev %s", vid, pid, revl);
- }
- printf(", %d %d byte blocks\n", sc->sc_blks, sc->sc_blksize);
-#endif
-
- if (sc->sc_blksize != DEV_BSIZE) {
- if (sc->sc_blksize < DEV_BSIZE) {
- printf("rz%d: need %d byte blocks - drive ignored\n",
- unit, DEV_BSIZE);
- goto bad;
- }
- for (i = sc->sc_blksize; i > DEV_BSIZE; i >>= 1)
- ++sc->sc_bshift;
- sc->sc_blks <<= sc->sc_bshift;
- }
-