[SCSI] Improve inquiry printing
authorMatthew Wilcox <matthew@wil.cx>
Tue, 4 Jul 2006 18:15:20 +0000 (12:15 -0600)
committerJames Bottomley <jejb@mulgrave.il.steeleye.com>
Sun, 6 Aug 2006 20:59:26 +0000 (15:59 -0500)
 - Replace scsi_device_types array API with scsi_device_type function API.
   Gets rid of a lot of common code, as well as being easier to use.
 - Add the new device types in SPC4 r05a, and rename some of the older ones.
 - Reformat the printing of inquiry data; now fits on one line and
   includes PQ.

I think I've addressed all the feedback from the previous versions.  My
current test box prints:

scsi 2:0:1:0: Direct access     HP 18.2G ATLAS10K3_18_SCA HP05 PQ: 0 ANSI: 2

Signed-off-by: Matthew Wilcox <matthew@wil.cx>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
drivers/block/cciss_scsi.c
drivers/scsi/fcal.c
drivers/scsi/g_NCR5380.c
drivers/scsi/megaraid.c
drivers/scsi/scsi.c
drivers/scsi/scsi_proc.c
drivers/scsi/scsi_scan.c
include/scsi/scsi.h

index afdff32f67247a4b2adf9ad091998bf56dd859fb..05f79d7393f72960a1f8af8006ba025f939e4a43 100644 (file)
@@ -251,10 +251,6 @@ scsi_cmd_stack_free(int ctlr)
        stk->pool = NULL;
 }
 
-/* scsi_device_types comes from scsi.h */
-#define DEVICETYPE(n) (n<0 || n>MAX_SCSI_DEVICE_CODE) ? \
-       "Unknown" : scsi_device_types[n]
-
 #if 0
 static int xmargin=8;
 static int amargin=60;
@@ -389,7 +385,7 @@ cciss_scsi_add_entry(int ctlr, int hostno,
           time anyway (the scsi layer's inquiries will show that info) */
        if (hostno != -1)
                printk("cciss%d: %s device c%db%dt%dl%d added.\n", 
-                       ctlr, DEVICETYPE(sd->devtype), hostno, 
+                       ctlr, scsi_device_type(sd->devtype), hostno,
                        sd->bus, sd->target, sd->lun);
        return 0;
 }
@@ -407,7 +403,7 @@ cciss_scsi_remove_entry(int ctlr, int hostno, int entry)
                ccissscsi[ctlr].dev[i] = ccissscsi[ctlr].dev[i+1];
        ccissscsi[ctlr].ndevices--;
        printk("cciss%d: %s device c%db%dt%dl%d removed.\n",
-               ctlr, DEVICETYPE(sd.devtype), hostno, 
+               ctlr, scsi_device_type(sd.devtype), hostno,
                        sd.bus, sd.target, sd.lun);
 }
 
@@ -458,7 +454,7 @@ adjust_cciss_scsi_table(int ctlr, int hostno,
                if (found == 0) { /* device no longer present. */ 
                        changes++;
                        /* printk("cciss%d: %s device c%db%dt%dl%d removed.\n",
-                               ctlr, DEVICETYPE(csd->devtype), hostno, 
+                               ctlr, scsi_device_type(csd->devtype), hostno,
                                        csd->bus, csd->target, csd->lun); */
                        cciss_scsi_remove_entry(ctlr, hostno, i);
                        /* note, i not incremented */
@@ -468,7 +464,7 @@ adjust_cciss_scsi_table(int ctlr, int hostno,
                        printk("cciss%d: device c%db%dt%dl%d type changed "
                                "(device type now %s).\n",
                                ctlr, hostno, csd->bus, csd->target, csd->lun,
-                                       DEVICETYPE(csd->devtype));
+                                       scsi_device_type(csd->devtype));
                        csd->devtype = sd[j].devtype;
                        i++;    /* so just move along. */
                } else          /* device is same as it ever was, */
@@ -1098,7 +1094,7 @@ cciss_update_non_disk_devices(int cntl_num, int hostno)
                        if (ncurrent >= CCISS_MAX_SCSI_DEVS_PER_HBA) {
                                printk(KERN_INFO "cciss%d: %s ignored, "
                                        "too many devices.\n", cntl_num,
-                                       DEVICETYPE(devtype));
+                                       scsi_device_type(devtype));
                                break;
                        }
                        memcpy(&currentsd[ncurrent].scsi3addr[0], 
index 7f891023aa15c9857e21f7bdb59610f7305e4d58..c4e16c0775def31770e99bead26f0f310e612694 100644 (file)
@@ -248,8 +248,7 @@ int fcal_proc_info (struct Scsi_Host *host, char *buffer, char **start, off_t of
                                if (scd->id == target) {
                                        SPRINTF ("  [AL-PA: %02x, Id: %02d, Port WWN: %08x%08x, Node WWN: %08x%08x]  ",
                                                alpa, target, u1[0], u1[1], u2[0], u2[1]);
-                                       SPRINTF ("%s ", (scd->type < MAX_SCSI_DEVICE_CODE) ?
-                                               scsi_device_types[(short) scd->type] : "Unknown device");
+                                       SPRINTF ("%s ", scsi_device_type(scd->type));
 
                                        for (j = 0; (j < 8) && (scd->vendor[j] >= 0x20); j++)
                                                SPRINTF ("%c", scd->vendor[j]);
index 67f1100f310361708647f4c28952895a608dc82f..cdd893bb4e28156e43a1d83b5eda37592b2b1bd6 100644 (file)
@@ -811,7 +811,6 @@ static int generic_NCR5380_proc_info(struct Scsi_Host *scsi_ptr, char *buffer, c
        struct NCR5380_hostdata *hostdata;
 #ifdef NCR5380_STATS
        struct scsi_device *dev;
-       extern const char *const scsi_device_types[MAX_SCSI_DEVICE_CODE];
 #endif
 
        NCR5380_setup(scsi_ptr);
@@ -851,7 +850,7 @@ static int generic_NCR5380_proc_info(struct Scsi_Host *scsi_ptr, char *buffer, c
                long tr = hostdata->time_read[dev->id] / HZ;
                long tw = hostdata->time_write[dev->id] / HZ;
 
-               PRINTP("  T:%d %s " ANDP dev->id ANDP(dev->type < MAX_SCSI_DEVICE_CODE) ? scsi_device_types[(int) dev->type] : "Unknown");
+               PRINTP("  T:%d %s " ANDP dev->id ANDP scsi_device_type(dev->type));
                for (i = 0; i < 8; i++)
                        if (dev->vendor[i] >= 0x20)
                                *(buffer + (len++)) = dev->vendor[i];
index 76edbb639d373b9e51d48b16f1bb2c146612eea0..ccb0055ac73add3ed031491eae3d57f487b232a3 100644 (file)
@@ -2822,9 +2822,7 @@ mega_print_inquiry(char *page, char *scsi_inq)
 
        i = scsi_inq[0] & 0x1f;
 
-       len += sprintf(page+len, "  Type:   %s ",
-               i < MAX_SCSI_DEVICE_CODE ? scsi_device_types[i] :
-                  "Unknown          ");
+       len += sprintf(page+len, "  Type:   %s ", scsi_device_type(i));
 
        len += sprintf(page+len,
        "                 ANSI SCSI revision: %02x", scsi_inq[2] & 0x07);
index b332caddd5b379f849764922fd78a69164253bef..94df671d776a33b21a442c93d8b6695be3b2e715 100644 (file)
@@ -96,24 +96,40 @@ unsigned int scsi_logging_level;
 EXPORT_SYMBOL(scsi_logging_level);
 #endif
 
-const char *const scsi_device_types[MAX_SCSI_DEVICE_CODE] = {
-       "Direct-Access    ",
-       "Sequential-Access",
+static const char *const scsi_device_types[] = {
+       "Direct access    ",
+       "Sequential access",
        "Printer          ",
        "Processor        ",
        "WORM             ",
-       "CD-ROM           ",
+       "CD/DVD           ",
        "Scanner          ",
-       "Optical Device   ",
-       "Medium Changer   ",
+       "Optical memory   ",
+       "Media changer    ",
        "Communications   ",
-       "Unknown          ",
-       "Unknown          ",
+       "ASC IT8          ",
+       "ASC IT8          ",
        "RAID             ",
        "Enclosure        ",
-       "Direct-Access-RBC",
+       "Direct access RBC",
+       "Optical card     ",
+       "Bridge controller",
+       "Object storage   ",
+       "Automation/Drive ",
 };
-EXPORT_SYMBOL(scsi_device_types);
+
+const char * scsi_device_type(unsigned type)
+{
+       if (type == 0x1e)
+               return "Well-known LUN   ";
+       if (type == 0x1f)
+               return "No Device        ";
+       if (type > ARRAY_SIZE(scsi_device_types))
+               return "Unknown          ";
+       return scsi_device_types[type];
+}
+
+EXPORT_SYMBOL(scsi_device_type);
 
 struct scsi_host_cmd_pool {
        kmem_cache_t    *slab;
index 55200e4fdf11e933183528754729fb284181187c..524a5f7a5193d0a0275120bf5743196c78153a26 100644 (file)
@@ -178,9 +178,7 @@ static int proc_print_scsidevice(struct device *dev, void *data)
 
        seq_printf(s, "\n");
 
-       seq_printf(s, "  Type:   %s ",
-                    sdev->type < MAX_SCSI_DEVICE_CODE ?
-              scsi_device_types[(int) sdev->type] : "Unknown          ");
+       seq_printf(s, "  Type:   %s ", scsi_device_type(sdev->type));
        seq_printf(s, "               ANSI"
                     " SCSI revision: %02x", (sdev->scsi_level - 1) ?
                     sdev->scsi_level - 1 : 1);
index 1bd92b9b46d9ccc5209103beb59cfb75ccafdb5d..180399406510917111b7580dfc8f3a5f1ce7d95d 100644 (file)
@@ -133,59 +133,6 @@ static void scsi_unlock_floptical(struct scsi_device *sdev,
                         SCSI_TIMEOUT, 3);
 }
 
-/**
- * print_inquiry - printk the inquiry information
- * @inq_result:        printk this SCSI INQUIRY
- *
- * Description:
- *     printk the vendor, model, and other information found in the
- *     INQUIRY data in @inq_result.
- *
- * Notes:
- *     Remove this, and replace with a hotplug event that logs any
- *     relevant information.
- **/
-static void print_inquiry(unsigned char *inq_result)
-{
-       int i;
-
-       printk(KERN_NOTICE "  Vendor: ");
-       for (i = 8; i < 16; i++)
-               if (inq_result[i] >= 0x20 && i < inq_result[4] + 5)
-                       printk("%c", inq_result[i]);
-               else
-                       printk(" ");
-
-       printk("  Model: ");
-       for (i = 16; i < 32; i++)
-               if (inq_result[i] >= 0x20 && i < inq_result[4] + 5)
-                       printk("%c", inq_result[i]);
-               else
-                       printk(" ");
-
-       printk("  Rev: ");
-       for (i = 32; i < 36; i++)
-               if (inq_result[i] >= 0x20 && i < inq_result[4] + 5)
-                       printk("%c", inq_result[i]);
-               else
-                       printk(" ");
-
-       printk("\n");
-
-       i = inq_result[0] & 0x1f;
-
-       printk(KERN_NOTICE "  Type:   %s ",
-              i <
-              MAX_SCSI_DEVICE_CODE ? scsi_device_types[i] :
-              "Unknown          ");
-       printk("                 ANSI SCSI revision: %02x",
-              inq_result[2] & 0x07);
-       if ((inq_result[2] & 0x07) == 1 && (inq_result[3] & 0x0f) == 1)
-               printk(" CCS\n");
-       else
-               printk("\n");
-}
-
 /**
  * scsi_alloc_sdev - allocate and setup a scsi_Device
  *
@@ -653,9 +600,8 @@ static int scsi_add_lun(struct scsi_device *sdev, char *inq_result, int *bflags)
        if (*bflags & BLIST_ISROM) {
                /*
                 * It would be better to modify sdev->type, and set
-                * sdev->removable, but then the print_inquiry() output
-                * would not show TYPE_ROM; if print_inquiry() is removed
-                * the issue goes away.
+                * sdev->removable; this can now be done since
+                * print_inquiry has gone away.
                 */
                inq_result[0] = TYPE_ROM;
                inq_result[1] |= 0x80;  /* removable */
@@ -684,8 +630,6 @@ static int scsi_add_lun(struct scsi_device *sdev, char *inq_result, int *bflags)
                printk(KERN_INFO "scsi: unknown device type %d\n", sdev->type);
        }
 
-       print_inquiry(inq_result);
-
        /*
         * For a peripheral qualifier (PQ) value of 1 (001b), the SCSI
         * spec says: The device server is capable of supporting the
@@ -715,6 +659,12 @@ static int scsi_add_lun(struct scsi_device *sdev, char *inq_result, int *bflags)
        if (inq_result[7] & 0x10)
                sdev->sdtr = 1;
 
+       sdev_printk(KERN_NOTICE "scsi", sdev, "%s %.8s %.16s %.4s PQ: %d "
+                       "ANSI: %d%s\n", scsi_device_type(sdev->type),
+                       sdev->vendor, sdev->model, sdev->rev,
+                       sdev->inq_periph_qual, inq_result[2] & 0x07,
+                       (inq_result[3] & 0x0f) == 1 ? " CCS" : "");
+
        /*
         * End sysfs code.
         */
index c60b8ff2f5e4f5d7a2952a8fb0951a689ec451b1..1bc6752014139eeb22ff7fd97ebee707a9cf2818 100644 (file)
 extern const unsigned char scsi_command_size[8];
 #define COMMAND_SIZE(opcode) scsi_command_size[((opcode) >> 5) & 7]
 
-/*
- *     SCSI device types
- */
-
-#define MAX_SCSI_DEVICE_CODE 15
-extern const char *const scsi_device_types[MAX_SCSI_DEVICE_CODE];
-
 /*
  * Special value for scanning to specify scanning or rescanning of all
  * possible channels, (target) ids, or luns on a given shost.
@@ -225,6 +218,9 @@ static inline int scsi_status_is_good(int status)
 #define TYPE_RBC           0x0e
 #define TYPE_NO_LUN         0x7f
 
+/* Returns a human-readable name for the device */
+extern const char * scsi_device_type(unsigned type);
+
 /*
  * standard mode-select header prepended to all mode-select commands
  */