From b80431f3274b6d95b08ab9c955cc4064896097fa Mon Sep 17 00:00:00 2001 From: Vladislav Bolkhovitin Date: Fri, 7 Jun 2013 04:43:51 +0000 Subject: [PATCH] scst_lib: Rework the CDB parsing routines Factor out common code into a new function. Signed-off-by: Bart Van Assche with some cleanups and improvements git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@4896 d57e44dd-8a1f-0410-8b47-8ef2f437770f --- scst/include/scst_const.h | 7 +-- scst/src/scst_lib.c | 109 +++++++++++++++----------------------- 2 files changed, 47 insertions(+), 69 deletions(-) diff --git a/scst/include/scst_const.h b/scst/include/scst_const.h index f558f88d4..0072aa70d 100644 --- a/scst/include/scst_const.h +++ b/scst/include/scst_const.h @@ -186,9 +186,10 @@ enum scst_cmd_queue_type { ** compiler with another bitfields layout can be used. ***************************************************************/ enum scst_cdb_flags { - SCST_TRANSFER_LEN_TYPE_FIXED = 0x0001, - SCST_SMALL_TIMEOUT = 0x0002, - SCST_LONG_TIMEOUT = 0x0004, + SCST_SMALL_TIMEOUT = 0x0001, + SCST_LONG_TIMEOUT = 0x0002, +#define SCST_BOTH_TIMEOUTS (SCST_SMALL_TIMEOUT | SCST_LONG_TIMEOUT) + SCST_TRANSFER_LEN_TYPE_FIXED = 0x0004, SCST_UNKNOWN_LBA = 0x0008, SCST_UNKNOWN_LENGTH = 0x0010, SCST_INFO_VALID = 0x0020, diff --git a/scst/src/scst_lib.c b/scst/src/scst_lib.c index a9eddfaeb..204257829 100644 --- a/scst/src/scst_lib.c +++ b/scst/src/scst_lib.c @@ -6977,11 +6977,9 @@ int scst_calc_block_shift(int sector_size) EXPORT_SYMBOL_GPL(scst_calc_block_shift); /** - * scst_sbc_generic_parse() - generic SBC parsing - * - * Generic parse() for SBC (disk) devices + * scst_generic_parse() - Generic parse() for devices supporting an LBA */ -int scst_sbc_generic_parse(struct scst_cmd *cmd) +static inline int scst_generic_parse(struct scst_cmd *cmd, const int timeout[3]) { int res = 0; @@ -7003,12 +7001,7 @@ int scst_sbc_generic_parse(struct scst_cmd *cmd) cmd->out_bufflen = cmd->out_bufflen << block_shift; } - if ((cmd->op_flags & (SCST_SMALL_TIMEOUT | SCST_LONG_TIMEOUT)) == 0) - cmd->timeout = SCST_GENERIC_DISK_REG_TIMEOUT; - else if (cmd->op_flags & SCST_SMALL_TIMEOUT) - cmd->timeout = SCST_GENERIC_DISK_SMALL_TIMEOUT; - else if (cmd->op_flags & SCST_LONG_TIMEOUT) - cmd->timeout = SCST_GENERIC_DISK_LONG_TIMEOUT; + cmd->timeout = timeout[cmd->op_flags & SCST_BOTH_TIMEOUTS]; TRACE_DBG("res %d, bufflen %d, data_len %lld, direct %d", res, cmd->bufflen, (long long)cmd->data_len, cmd->data_direction); @@ -7016,6 +7009,26 @@ int scst_sbc_generic_parse(struct scst_cmd *cmd) TRACE_EXIT_RES(res); return res; } + + /** + * scst_sbc_generic_parse() - generic SBC parsing + * + * Generic parse() for SBC (disk) devices + */ +int scst_sbc_generic_parse(struct scst_cmd *cmd) +{ + static const int disk_timeout[] = { + [0] = SCST_GENERIC_DISK_REG_TIMEOUT, + [SCST_SMALL_TIMEOUT] = SCST_GENERIC_DISK_SMALL_TIMEOUT, + [SCST_LONG_TIMEOUT] = SCST_GENERIC_DISK_LONG_TIMEOUT, + [SCST_BOTH_TIMEOUTS] = SCST_GENERIC_DISK_LONG_TIMEOUT, + }; + BUILD_BUG_ON(SCST_SMALL_TIMEOUT != 1); + BUILD_BUG_ON(SCST_LONG_TIMEOUT != 2); + BUILD_BUG_ON(SCST_BOTH_TIMEOUTS != 3); + + return scst_generic_parse(cmd, disk_timeout); +} EXPORT_SYMBOL_GPL(scst_sbc_generic_parse); /** @@ -7025,36 +7038,18 @@ EXPORT_SYMBOL_GPL(scst_sbc_generic_parse); */ int scst_cdrom_generic_parse(struct scst_cmd *cmd) { - int res = 0; - - TRACE_ENTRY(); - - /* - * SCST sets good defaults for cmd->data_direction and cmd->bufflen, - * therefore change them only if necessary - */ + static const int cdrom_timeout[] = { + [0] = SCST_GENERIC_CDROM_REG_TIMEOUT, + [SCST_SMALL_TIMEOUT] = SCST_GENERIC_CDROM_SMALL_TIMEOUT, + [SCST_LONG_TIMEOUT] = SCST_GENERIC_CDROM_LONG_TIMEOUT, + [SCST_BOTH_TIMEOUTS] = SCST_GENERIC_CDROM_LONG_TIMEOUT, + }; + BUILD_BUG_ON(SCST_SMALL_TIMEOUT != 1); + BUILD_BUG_ON(SCST_LONG_TIMEOUT != 2); + BUILD_BUG_ON(SCST_BOTH_TIMEOUTS != 3); cmd->cdb[1] &= 0x1f; - - if (cmd->op_flags & SCST_TRANSFER_LEN_TYPE_FIXED) { - int block_shift = cmd->dev->block_shift; - cmd->bufflen = cmd->bufflen << block_shift; - cmd->data_len = cmd->data_len << block_shift; - cmd->out_bufflen = cmd->out_bufflen << block_shift; - } - - if ((cmd->op_flags & (SCST_SMALL_TIMEOUT | SCST_LONG_TIMEOUT)) == 0) - cmd->timeout = SCST_GENERIC_CDROM_REG_TIMEOUT; - else if (cmd->op_flags & SCST_SMALL_TIMEOUT) - cmd->timeout = SCST_GENERIC_CDROM_SMALL_TIMEOUT; - else if (cmd->op_flags & SCST_LONG_TIMEOUT) - cmd->timeout = SCST_GENERIC_CDROM_LONG_TIMEOUT; - - TRACE_DBG("res=%d, bufflen=%d, direct=%d", res, cmd->bufflen, - cmd->data_direction); - - TRACE_EXIT(); - return res; + return scst_generic_parse(cmd, cdrom_timeout); } EXPORT_SYMBOL_GPL(scst_cdrom_generic_parse); @@ -7065,36 +7060,18 @@ EXPORT_SYMBOL_GPL(scst_cdrom_generic_parse); */ int scst_modisk_generic_parse(struct scst_cmd *cmd) { - int res = 0; - - TRACE_ENTRY(); - - /* - * SCST sets good defaults for cmd->data_direction and cmd->bufflen, - * therefore change them only if necessary - */ + static const int modisk_timeout[] = { + [0] = SCST_GENERIC_MODISK_REG_TIMEOUT, + [SCST_SMALL_TIMEOUT] = SCST_GENERIC_MODISK_SMALL_TIMEOUT, + [SCST_LONG_TIMEOUT] = SCST_GENERIC_MODISK_LONG_TIMEOUT, + [SCST_BOTH_TIMEOUTS] = SCST_GENERIC_MODISK_LONG_TIMEOUT, + }; + BUILD_BUG_ON(SCST_SMALL_TIMEOUT != 1); + BUILD_BUG_ON(SCST_LONG_TIMEOUT != 2); + BUILD_BUG_ON(SCST_BOTH_TIMEOUTS != 3); cmd->cdb[1] &= 0x1f; - - if (cmd->op_flags & SCST_TRANSFER_LEN_TYPE_FIXED) { - int block_shift = cmd->dev->block_shift; - cmd->bufflen = cmd->bufflen << block_shift; - cmd->data_len = cmd->data_len << block_shift; - cmd->out_bufflen = cmd->out_bufflen << block_shift; - } - - if ((cmd->op_flags & (SCST_SMALL_TIMEOUT | SCST_LONG_TIMEOUT)) == 0) - cmd->timeout = SCST_GENERIC_MODISK_REG_TIMEOUT; - else if (cmd->op_flags & SCST_SMALL_TIMEOUT) - cmd->timeout = SCST_GENERIC_MODISK_SMALL_TIMEOUT; - else if (cmd->op_flags & SCST_LONG_TIMEOUT) - cmd->timeout = SCST_GENERIC_MODISK_LONG_TIMEOUT; - - TRACE_DBG("res=%d, bufflen=%d, direct=%d", res, cmd->bufflen, - cmd->data_direction); - - TRACE_EXIT_RES(res); - return res; + return scst_generic_parse(cmd, modisk_timeout); } EXPORT_SYMBOL_GPL(scst_modisk_generic_parse);