diff options
author | krw <krw@openbsd.org> | 2019-11-28 17:25:59 +0000 |
---|---|---|
committer | krw <krw@openbsd.org> | 2019-11-28 17:25:59 +0000 |
commit | 577d7b69c481f6f9404cb80db556b44aa56d0087 (patch) | |
tree | ced8e16ed757c79a94c4e2e89b868d7d8e505527 /sys/scsi/scsi_base.c | |
parent | Remove end of line whitespace. (diff) | |
download | wireguard-openbsd-577d7b69c481f6f9404cb80db556b44aa56d0087.tar.xz wireguard-openbsd-577d7b69c481f6f9404cb80db556b44aa56d0087.zip |
Abstract mode sense block descriptor parsing into a separate function.
Diffstat (limited to 'sys/scsi/scsi_base.c')
-rw-r--r-- | sys/scsi/scsi_base.c | 86 |
1 files changed, 50 insertions, 36 deletions
diff --git a/sys/scsi/scsi_base.c b/sys/scsi/scsi_base.c index 5d3dfde097a..deb8f6cd224 100644 --- a/sys/scsi/scsi_base.c +++ b/sys/scsi/scsi_base.c @@ -1,4 +1,4 @@ -/* $OpenBSD: scsi_base.c,v 1.247 2019/11/28 16:41:07 krw Exp $ */ +/* $OpenBSD: scsi_base.c,v 1.248 2019/11/28 17:25:59 krw Exp $ */ /* $NetBSD: scsi_base.c,v 1.43 1997/04/02 02:29:36 mycroft Exp $ */ /* @@ -1157,15 +1157,60 @@ scsi_mode_sense_big_page(struct scsi_mode_header_big *hdr, const int page_len) return ((u_char *)hdr + header_length); } +void +scsi_parse_blkdesc(struct scsi_link *link, union scsi_mode_sense_buf *buf, + int big, u_int32_t *density, u_int64_t *block_count, u_int32_t *block_size) +{ + struct scsi_direct_blk_desc *direct; + struct scsi_blk_desc *general; + size_t offset; + unsigned int blk_desc_len; + + if (big == 0) { + offset = sizeof(struct scsi_mode_header); + blk_desc_len = buf->hdr.blk_desc_len; + } else { + offset = sizeof(struct scsi_mode_header_big); + blk_desc_len = _2btol(buf->hdr_big.blk_desc_len); + } + + /* Both scsi_blk_desc and scsi_direct_blk_desc are 8 bytes. */ + if (blk_desc_len == 0 || (blk_desc_len % 8 != 0)) + return; + + switch (link->inqdata.device & SID_TYPE) { + case T_SEQUENTIAL: + /* + * XXX What other device types return general block descriptors? + */ + general = (struct scsi_blk_desc *)&buf->buf[offset]; + if (density != NULL) + *density = general->density; + if (block_size != NULL) + *block_size = _3btol(general->blklen); + if (block_count != NULL) + *block_count = (u_int64_t)_3btol(general->nblocks); + break; + + default: + direct = (struct scsi_direct_blk_desc *)&buf->buf[offset]; + if (density != NULL) + *density = direct->density; + if (block_size != NULL) + *block_size = _3btol(direct->blklen); + if (block_count != NULL) + *block_count = (u_int64_t)_4btol(direct->nblocks); + break; + } +} + int scsi_do_mode_sense(struct scsi_link *link, int page, union scsi_mode_sense_buf *buf, void **page_data, u_int32_t *density, u_int64_t *block_count, u_int32_t *block_size, int page_len, int flags, int *big) { - struct scsi_direct_blk_desc *direct; - struct scsi_blk_desc *general; - int error, blk_desc_len, offset; + int error; *page_data = NULL; *big = 0; @@ -1196,8 +1241,6 @@ scsi_do_mode_sense(struct scsi_link *link, int page, */ return (0); } - offset = sizeof(struct scsi_mode_header); - blk_desc_len = buf->hdr.blk_desc_len; goto blk_desc; } } @@ -1220,39 +1263,10 @@ scsi_do_mode_sense(struct scsi_link *link, int page, return (EIO); *big = 1; - offset = sizeof(struct scsi_mode_header_big); *page_data = scsi_mode_sense_big_page(&buf->hdr_big, page_len); - blk_desc_len = _2btol(buf->hdr_big.blk_desc_len); blk_desc: - /* Both scsi_blk_desc and scsi_direct_blk_desc are 8 bytes. */ - if (blk_desc_len == 0 || (blk_desc_len % 8 != 0)) - return (0); - - switch (link->inqdata.device & SID_TYPE) { - case T_SEQUENTIAL: - /* - * XXX What other device types return general block descriptors? - */ - general = (struct scsi_blk_desc *)&buf->buf[offset]; - if (density != NULL) - *density = general->density; - if (block_size != NULL) - *block_size = _3btol(general->blklen); - if (block_count != NULL) - *block_count = (u_int64_t)_3btol(general->nblocks); - break; - - default: - direct = (struct scsi_direct_blk_desc *)&buf->buf[offset]; - if (density != NULL) - *density = direct->density; - if (block_size != NULL) - *block_size = _3btol(direct->blklen); - if (block_count != NULL) - *block_count = (u_int64_t)_4btol(direct->nblocks); - break; - } + scsi_parse_blkdesc(link, buf, *big, density, block_count, block_size); return (0); } |