/* Get the device id from inquiry page 0x83 */
 static int hpsa_get_device_id(struct ctlr_info *h, unsigned char *scsi3addr,
-       unsigned char *device_id, int buflen)
+       unsigned char *device_id, int index, int buflen)
 {
        int rc;
        unsigned char *buf;
                return -ENOMEM;
        rc = hpsa_scsi_do_inquiry(h, scsi3addr, VPD_PAGE | 0x83, buf, 64);
        if (rc == 0)
-               memcpy(device_id, &buf[8], buflen);
+               memcpy(device_id, &buf[index], buflen);
+
        kfree(buf);
+
        return rc != 0;
 }
 
        return rc;
 }
 
+static void sanitize_inquiry_string(unsigned char *s, int len)
+{
+       bool terminated = false;
+
+       for (; len > 0; (--len, ++s)) {
+               if (*s == 0)
+                       terminated = true;
+               if (terminated || *s < 0x20 || *s > 0x7e)
+                       *s = ' ';
+       }
+}
+
 static int hpsa_update_device_info(struct ctlr_info *h,
        unsigned char scsi3addr[], struct hpsa_scsi_dev_t *this_device,
        unsigned char *is_OBDR_device)
                goto bail_out;
        }
 
+       sanitize_inquiry_string(&inq_buff[8], 8);
+       sanitize_inquiry_string(&inq_buff[16], 16);
+
        this_device->devtype = (inq_buff[0] & 0x1f);
        memcpy(this_device->scsi3addr, scsi3addr, 8);
        memcpy(this_device->vendor, &inq_buff[8],
                sizeof(this_device->model));
        memset(this_device->device_id, 0,
                sizeof(this_device->device_id));
-       hpsa_get_device_id(h, scsi3addr, this_device->device_id,
+       hpsa_get_device_id(h, scsi3addr, this_device->device_id, 8,
                sizeof(this_device->device_id));
 
        if (this_device->devtype == TYPE_DISK &&