diff options
author | Hannes Reinecke <hare@suse.de> | 2014-10-24 08:26:56 -0400 |
---|---|---|
committer | Christoph Hellwig <hch@lst.de> | 2014-11-12 05:16:03 -0500 |
commit | 2478a736a7d01e3ef8d273e8fc5b11b6ed9af3ea (patch) | |
tree | 4c1a052410411ce08b2093776019e483330eec35 /drivers/scsi | |
parent | 234d67781956e5c6891906e4c3b1eb89edddb6be (diff) |
scsi: consolidate opcode lookup in scsi_opcode_sa_name()
Consolidate the CDB opcode lookup in scsi_opcode_sa_name(),
so that we don't have to call several functions to figure
out the CDB opcode string.
Signed-off-by: Hannes Reinecke <hare@suse.de>
Reviewed-by: Robert Elliott <elliott@hp.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
Diffstat (limited to 'drivers/scsi')
-rw-r--r-- | drivers/scsi/constants.c | 39 |
1 files changed, 23 insertions, 16 deletions
diff --git a/drivers/scsi/constants.c b/drivers/scsi/constants.c index 3707d8a6377a..dc1b18c821ed 100644 --- a/drivers/scsi/constants.c +++ b/drivers/scsi/constants.c | |||
@@ -29,6 +29,7 @@ | |||
29 | #define THIRD_PARTY_COPY_OUT 0x83 | 29 | #define THIRD_PARTY_COPY_OUT 0x83 |
30 | #define THIRD_PARTY_COPY_IN 0x84 | 30 | #define THIRD_PARTY_COPY_IN 0x84 |
31 | 31 | ||
32 | #define VENDOR_SPECIFIC_CDB 0xc0 | ||
32 | 33 | ||
33 | struct sa_name_list { | 34 | struct sa_name_list { |
34 | int opcode; | 35 | int opcode; |
@@ -266,7 +267,7 @@ static struct sa_name_list sa_names_arr[] = { | |||
266 | }; | 267 | }; |
267 | 268 | ||
268 | #else /* ifndef CONFIG_SCSI_CONSTANTS */ | 269 | #else /* ifndef CONFIG_SCSI_CONSTANTS */ |
269 | static const char *cdb_byte0_names[]; | 270 | static const char *cdb_byte0_names[0]; |
270 | 271 | ||
271 | static struct sa_name_list sa_names_arr[] = { | 272 | static struct sa_name_list sa_names_arr[] = { |
272 | {VARIABLE_LENGTH_CMD, NULL, 0}, | 273 | {VARIABLE_LENGTH_CMD, NULL, 0}, |
@@ -286,12 +287,19 @@ static struct sa_name_list sa_names_arr[] = { | |||
286 | #endif /* CONFIG_SCSI_CONSTANTS */ | 287 | #endif /* CONFIG_SCSI_CONSTANTS */ |
287 | 288 | ||
288 | static bool scsi_opcode_sa_name(int opcode, int service_action, | 289 | static bool scsi_opcode_sa_name(int opcode, int service_action, |
289 | const char **sa_name) | 290 | const char **cdb_name, const char **sa_name) |
290 | { | 291 | { |
291 | struct sa_name_list *sa_name_ptr; | 292 | struct sa_name_list *sa_name_ptr; |
292 | const struct value_name_pair *arr = NULL; | 293 | const struct value_name_pair *arr = NULL; |
293 | int arr_sz, k; | 294 | int arr_sz, k; |
294 | 295 | ||
296 | *cdb_name = NULL; | ||
297 | if (opcode >= VENDOR_SPECIFIC_CDB) | ||
298 | return false; | ||
299 | |||
300 | if (opcode < ARRAY_SIZE(cdb_byte0_names)) | ||
301 | *cdb_name = cdb_byte0_names[opcode]; | ||
302 | |||
295 | for (sa_name_ptr = sa_names_arr; sa_name_ptr->arr; ++sa_name_ptr) { | 303 | for (sa_name_ptr = sa_names_arr; sa_name_ptr->arr; ++sa_name_ptr) { |
296 | if (sa_name_ptr->opcode == opcode) { | 304 | if (sa_name_ptr->opcode == opcode) { |
297 | arr = sa_name_ptr->arr; | 305 | arr = sa_name_ptr->arr; |
@@ -316,7 +324,7 @@ static bool scsi_opcode_sa_name(int opcode, int service_action, | |||
316 | static void print_opcode_name(unsigned char * cdbp, int cdb_len) | 324 | static void print_opcode_name(unsigned char * cdbp, int cdb_len) |
317 | { | 325 | { |
318 | int sa, len, cdb0; | 326 | int sa, len, cdb0; |
319 | const char *name = NULL; | 327 | const char *cdb_name = NULL, *sa_name = NULL; |
320 | 328 | ||
321 | cdb0 = cdbp[0]; | 329 | cdb0 = cdbp[0]; |
322 | if (cdb0 == VARIABLE_LENGTH_CMD) { | 330 | if (cdb0 == VARIABLE_LENGTH_CMD) { |
@@ -332,21 +340,20 @@ static void print_opcode_name(unsigned char * cdbp, int cdb_len) | |||
332 | len = cdb_len; | 340 | len = cdb_len; |
333 | } | 341 | } |
334 | 342 | ||
335 | if (!scsi_opcode_sa_name(cdb0, sa, &name)) { | 343 | if (!scsi_opcode_sa_name(cdb0, sa, &cdb_name, &sa_name)) { |
336 | if (cdb0 < 0xc0) { | 344 | if (cdb_name) |
337 | if (ARRAY_SIZE(cdb_byte0_names) > 1) { | 345 | printk("%s", cdb_name); |
338 | name = cdb_byte0_names[cdb0]; | 346 | else if (cdb0 >= VENDOR_SPECIFIC_CDB) |
339 | if (name) | ||
340 | printk("%s", name); | ||
341 | else | ||
342 | printk("cdb[0]=0x%x (reserved)", cdb0); | ||
343 | } else | ||
344 | printk("cdb[0]=0x%x", cdb0); | ||
345 | } else | ||
346 | printk("cdb[0]=0x%x (vendor)", cdb0); | 347 | printk("cdb[0]=0x%x (vendor)", cdb0); |
348 | else if (cdb0 >= 0x60 && cdb0 < 0x7e) | ||
349 | printk("cdb[0]=0x%x (reserved)", cdb0); | ||
350 | else | ||
351 | printk("cdb[0]=0x%x", cdb0); | ||
347 | } else { | 352 | } else { |
348 | if (name) | 353 | if (sa_name) |
349 | printk("%s", name); | 354 | printk("%s", sa_name); |
355 | else if (cdb_name) | ||
356 | printk("%s, sa=0x%x", cdb_name, sa); | ||
350 | else | 357 | else |
351 | printk("cdb[0]=0x%x, sa=0x%x", cdb0, sa); | 358 | printk("cdb[0]=0x%x, sa=0x%x", cdb0, sa); |
352 | 359 | ||