summaryrefslogtreecommitdiffstats
path: root/drivers/scsi
diff options
context:
space:
mode:
authorHannes Reinecke <hare@suse.de>2014-10-24 08:26:56 -0400
committerChristoph Hellwig <hch@lst.de>2014-11-12 05:16:03 -0500
commit2478a736a7d01e3ef8d273e8fc5b11b6ed9af3ea (patch)
tree4c1a052410411ce08b2093776019e483330eec35 /drivers/scsi
parent234d67781956e5c6891906e4c3b1eb89edddb6be (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.c39
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
33struct sa_name_list { 34struct 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 */
269static const char *cdb_byte0_names[]; 270static const char *cdb_byte0_names[0];
270 271
271static struct sa_name_list sa_names_arr[] = { 272static 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
288static bool scsi_opcode_sa_name(int opcode, int service_action, 289static 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,
316static void print_opcode_name(unsigned char * cdbp, int cdb_len) 324static 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