c887c38d0bb25cc254c6945a02602dbea8aa683c
* Copyright (c) 1992 The Regents of the University of California.
* This software was developed by the Computer Systems Engineering group
* at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
* contributed to Berkeley.
* %sccs.include.redist.c%
* @(#)scsiformat.c 5.3 (Berkeley) %G%
#include <hp300/dev/scsireg.h>
struct scsi_inquiry inqbuf
;
struct scsi_modesense_hdr h
;
struct scsi_fmt_cdb cap
= {
CMD_READ_CAPACITY
, 0, 0, 0, 0, 0, 0, 0, 0, 0
struct scsi_fmt_cdb format
= {
CMD_FORMAT_UNIT
, 0, 0, 0, 0, 0
struct scsi_fmt_cdb inq
= {
CMD_INQUIRY
, 0, 0, 0, sizeof(inqbuf
), 0
struct scsi_fmt_cdb modeselect
= {
CMD_MODE_SELECT
, 0x11, 0, 0, sizeof(mselbuf
), 0
struct scsi_fmt_cdb modesense
= {
CMD_MODE_SENSE
, 0, 0x3f, 0, sizeof(msbuf
), 0
void do_command
__P((int, struct scsi_fmt_cdb
*, u_char
*, int));
void do_format
__P((void));
void print_capacity
__P((void));
void print_inquiry
__P((void));
u_char
*print_mode_page
__P((u_char
*));
void print_mode_sense
__P((void));
while ((ch
= getopt(argc
, argv
, "")) != EOF
)
if ((fd
= open(device
, O_RDWR
, 0)) < 0) {
"scsiformat: %s: %s\n", device
, strerror(errno
));
do_command(fd
, &inq
, (u_char
*)&inqbuf
, sizeof(inqbuf
));
if (inqbuf
.version
!= 1) {
printf("type 0x%x, qual 0x%x, ver %d\n", inqbuf
.type
,
inqbuf
.qual
, inqbuf
.version
);
case 0: printf("(disk)"); break;
case 4: printf("(WORM)"); break;
case 5: printf("(CD-ROM)"); break;
case 7: printf("(MO-DISK)"); break;
default: printf("(??)"); break;
bcopy((caddr_t
)&inqbuf
.vendor_id
, (caddr_t
)idstr
, 28);
for (i
= 27; i
> 23; --i
)
printf(" %s %s rev %s:", idstr
, &idstr
[8], &idstr
[24]);
do_command(fd
, &cap
, (u_char
*)&capbuf
, sizeof(capbuf
));
printf(" %d blocks of %d bytes each\n", capbuf
.blks
, capbuf
.blksize
);
do_command(fd
, &modesense
, (u_char
*)&msbuf
, sizeof(msbuf
));
printf("\n%d bytes of mode sense data. ", msbuf
.h
.len
);
printf("media type %d, %swrite protected\n", msbuf
.h
.media_type
,
msbuf
.h
.wp
? "" : "not ");
if (msbuf
.h
.block_desc_len
) {
printf("density 0x%x, ", msbuf
.h
.density
);
if (msbuf
.h
.number_blocks
)
printf("%d blocks of length %d\n",
msbuf
.h
.number_blocks
, msbuf
.h
.block_length
);
printf("all blocks of length %d\n",
cp
= &msbuf
.h
.block_desc_len
+ 1;
ep
= (u_char
*)&msbuf
+ msbuf
.h
.len
;
cp
= print_mode_page(cp
);
printf("\npage type %d%s (%d bytes): ", cp
[0] & 0x7f,
(cp
[0] & 0x80)? " (saveable)" : "", n
);
printf("Error Recovery parameters.\n");
printf("\tflags = 0x%x ", i
= cp
[2]);
printf("\n\t%d retries, %d correction span bits,\n", cp
[3],
printf("\t%d head offsets, %d data strobe offsets,\n\t",
printf(" recovery time limit.\n");
printf("Disconnect/Reconnect control.\n");
printf("\tbuffer full ratio %d, buffer empty ratio %d,\n",
printf("\ttime limits: %d bus inactivity, ",
printf("%d disconnect, %d connect.\n",
*(u_short
*)&cp
[6],*(u_short
*)&cp
[8]);
struct scsi_format
*sf
= (struct scsi_format
*)cp
;
printf("Format parameters.\n");
printf("\t%d tracks/zone, %d alt.sect./zone, ",
sf
->tracks_per_zone
, sf
->alt_sect_zone
);
printf("%d alt.tracks/zone,\n\t%d alt.tracks/vol., ",
sf
->alt_tracks_zone
, sf
->alt_tracks_vol
);
printf("%d sectors/track, %d bytes/sector, interleave %d\n",
sf
->sect_track
, sf
->data_sect
, sf
->interleave
);
printf("\ttrack skew %d, cylinder skew %d,\n",
sf
->track_skew_factor
, sf
->cyl_skew_factor
);
printf("\tdrive type 0x%x ", i
= cp
[20]);
printf("Disk Geometry parameters.\n");
printf("\t%d cylinders, %d heads.\n",
(cp
[2] << 16) | (cp
[3] << 8) | cp
[4], cp
[5]);
printf("Unknown page type.");
for (cp
+= 2, i
= 0; i
< n
; ++i
) {
static struct scsi_fmt_sense s
;
if (ioctl(fd
, SDIOCSENSE
, &s
) < 0)
"scsiformat: SDIOCSENSE: %s\n", strerror(errno
));
(void)printf("scsi status 0x%x", s
.status
);
if (s
.status
& STS_CHECKCOND
) {
struct scsi_xsense
*sp
= (struct scsi_xsense
*)s
.sense
;
(void)printf(" sense class %d, code %d", sp
->class, sp
->code
);
(void)printf(", key %d", sp
->key
);
(void)printf(", blk %d", *(int *)&sp
->info1
);
static u_char fmtbuf
[128];
struct scsi_modesel_hdr
*ms
= (struct scsi_modesel_hdr
*)mselbuf
;
if (ioctl(fd
, SDIOCSFORMAT
, &on
) < 0) {
"scsiformat: SDIOCSFORMAT (on): %s\n", strerror(errno
));
if (ioctl(fd
, SDIOCSCSICOMMAND
, &modeselect
) < 0)
"scsiformat: modeselect cmd: %s\n", strerror(errno
));
else if (write(fd
, mselbuf
, sizeof(mselbuf
)) < 0) {
"scsiformat: modeselect write: %s\n", strerror(errno
));
} else if (ioctl(fd
, SDIOCSCSICOMMAND
, &format
) < 0)
"scsiformat: format cmd: %s\n", strerror(errno
));
else if (write(fd
, fmtbuf
, sizeof(fmtbuf
)) < 0) {
"scsiformat: format write: %s\n", strerror(errno
));
if (ioctl(fd
, SDIOCSFORMAT
, &off
) < 0)
"scsiformat: SDIOCSFORMAT (off): %s\n", strerror(errno
));
do_command(fd
, cdb
, buf
, len
)
struct scsi_fmt_cdb
*cdb
;
if (ioctl(fd
, SDIOCSFORMAT
, &on
) < 0) {
"scsiformat: SDIOCSFORMAT (on): %s\n", strerror(errno
));
if (ioctl(fd
, SDIOCSCSICOMMAND
, cdb
) < 0)
"scsiformat: SDIOCSCSICOMMAND: %s\n", strerror(errno
));
else if (read(fd
, buf
, len
) < 0) {
"scsiformat: read: %s\n", strerror(errno
));
if (ioctl(fd
, SDIOCSFORMAT
, &off
) < 0)
"scsiformat: SDIOCSFORMAT (off): %s\n", strerror(errno
));
(void)fprintf(stderr
, "usage: scsiformat device\n");