diff options
author | Kenneth R Westerback <krw@cvs.openbsd.org> | 2005-06-04 01:25:03 +0000 |
---|---|---|
committer | Kenneth R Westerback <krw@cvs.openbsd.org> | 2005-06-04 01:25:03 +0000 |
commit | 8fa93c8e129db89e65d6b737281a95b5c7444727 (patch) | |
tree | 21de5a883a28e9a66ac9e316304d527c34921f9e | |
parent | cc08a0235632a2598ccdda1a7fc939726372e593 (diff) |
Make scsi_do_mode_sense() aware of the difference between the 8 byte
general block descriptor and the 8 byte direct block descriptor, and
return the correct values for density, block_count and block_size
based on the type of the device. First cut has T_SEQUENTIAL (i.e.
tape devices) as the only device type using general block descriptors,
so the behaviour change is minimal.
-rw-r--r-- | sys/scsi/scsi_base.c | 38 |
1 files changed, 29 insertions, 9 deletions
diff --git a/sys/scsi/scsi_base.c b/sys/scsi/scsi_base.c index d8dea358476..7c6fa23e255 100644 --- a/sys/scsi/scsi_base.c +++ b/sys/scsi/scsi_base.c @@ -1,4 +1,4 @@ -/* $OpenBSD: scsi_base.c,v 1.78 2005/06/03 15:50:10 krw Exp $ */ +/* $OpenBSD: scsi_base.c,v 1.79 2005/06/04 01:25:02 krw Exp $ */ /* $NetBSD: scsi_base.c,v 1.43 1997/04/02 02:29:36 mycroft Exp $ */ /* @@ -465,9 +465,10 @@ scsi_do_mode_sense(sc_link, page, buf, page_data, density, block_count, void **page_data; { struct scsi_mode_blk_desc_big *desc_big; - struct scsi_mode_direct_blk_desc *desc; + struct scsi_mode_direct_blk_desc *direct; struct scsi_mode_header_big *hdr_big; struct scsi_mode_header *hdr; + struct scsi_blk_desc *general; u_char *cbuf = (u_char *)buf; int error, blk_desc_len; @@ -525,16 +526,35 @@ scsi_do_mode_sense(sc_link, page, buf, page_data, density, block_count, blk_desc_len = hdr->blk_desc_len; eight_byte: + /* Both scsi_blk_desc and scsi_mode_direct_blk_desc are 8 bytes. */ if (blk_desc_len < sizeof(struct scsi_mode_direct_blk_desc)) return (0); - desc = (struct scsi_mode_direct_blk_desc *)cbuf; - if (density) - *density = desc->density; - if (block_size) - *block_size = _3btol(desc->blklen); - if (block_count) - *block_count = (u_int64_t)_4btol(desc->nblocks); + switch (sc_link->inqdata.device & SID_TYPE) { + case T_SEQUENTIAL: + /* + * XXX What other device types will return general block + * descriptors other than tape drives? + */ + general = (struct scsi_blk_desc *)cbuf; + if (density) + *density = general->density; + if (block_size) + *block_size = _3btol(general->blklen); + if (block_count) + *block_count = (u_int64_t)_3btol(general->nblocks); + break; + + default: + direct = (struct scsi_mode_direct_blk_desc *)cbuf; + if (density) + *density = direct->density; + if (block_size) + *block_size = _3btol(direct->blklen); + if (block_count) + *block_count = (u_int64_t)_4btol(direct->nblocks); + break; + } return (0); } |