Skip to content

Commit 6d90615

Browse files
MurthyBhat37martinkpetersen
authored andcommitted
scsi: smartpqi: add sysfs entries
- serial number - model - vendor Reviewed-by: Scott Benesh <[email protected]> Reviewed-by: Kevin Barnett <[email protected]> Signed-off-by: Murthy Bhat <[email protected]> Signed-off-by: Don Brace <[email protected]> Signed-off-by: Martin K. Petersen <[email protected]>
1 parent 522bc02 commit 6d90615

File tree

2 files changed

+124
-16
lines changed

2 files changed

+124
-16
lines changed

drivers/scsi/smartpqi/smartpqi.h

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1074,6 +1074,9 @@ struct pqi_ctrl_info {
10741074
unsigned int ctrl_id;
10751075
struct pci_dev *pci_dev;
10761076
char firmware_version[11];
1077+
char serial_number[17];
1078+
char model[17];
1079+
char vendor[9];
10771080
void __iomem *iomem_base;
10781081
struct pqi_ctrl_registers __iomem *registers;
10791082
struct pqi_device_registers __iomem *pqi_registers;
@@ -1225,9 +1228,17 @@ struct bmic_identify_controller {
12251228
__le16 extended_logical_unit_count;
12261229
u8 reserved1[34];
12271230
__le16 firmware_build_number;
1228-
u8 reserved2[100];
1231+
u8 reserved2[8];
1232+
u8 vendor_id[8];
1233+
u8 product_id[16];
1234+
u8 reserved3[68];
12291235
u8 controller_mode;
1230-
u8 reserved3[32];
1236+
u8 reserved4[32];
1237+
};
1238+
1239+
struct bmic_sense_subsystem_info {
1240+
u8 reserved[44];
1241+
u8 ctrl_serial_number[16];
12311242
};
12321243

12331244
#define SA_EXPANDER_SMP_DEVICE 0x05

drivers/scsi/smartpqi/smartpqi_init.c

Lines changed: 111 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -484,6 +484,7 @@ static int pqi_build_raid_path_request(struct pqi_ctrl_info *ctrl_info,
484484
/* fall through */
485485
case BMIC_IDENTIFY_CONTROLLER:
486486
case BMIC_IDENTIFY_PHYSICAL_DEVICE:
487+
case BMIC_SENSE_SUBSYSTEM_INFORMATION:
487488
request->data_direction = SOP_READ_FLAG;
488489
cdb[0] = BMIC_READ;
489490
cdb[6] = cmd;
@@ -612,6 +613,14 @@ static inline int pqi_identify_controller(struct pqi_ctrl_info *ctrl_info,
612613
buffer, sizeof(*buffer));
613614
}
614615

616+
static inline int pqi_sense_subsystem_info(struct pqi_ctrl_info *ctrl_info,
617+
struct bmic_sense_subsystem_info *sense_info)
618+
{
619+
return pqi_send_ctrl_raid_request(ctrl_info,
620+
BMIC_SENSE_SUBSYSTEM_INFORMATION,
621+
sense_info, sizeof(*sense_info));
622+
}
623+
615624
static inline int pqi_scsi_inquiry(struct pqi_ctrl_info *ctrl_info,
616625
u8 *scsi3addr, u16 vpd_page, void *buffer, size_t buffer_length)
617626
{
@@ -6129,23 +6138,65 @@ static int pqi_ioctl(struct scsi_device *sdev, unsigned int cmd,
61296138
return rc;
61306139
}
61316140

6132-
static ssize_t pqi_version_show(struct device *dev,
6141+
static ssize_t pqi_firmware_version_show(struct device *dev,
61336142
struct device_attribute *attr, char *buffer)
61346143
{
6135-
ssize_t count = 0;
61366144
struct Scsi_Host *shost;
61376145
struct pqi_ctrl_info *ctrl_info;
61386146

61396147
shost = class_to_shost(dev);
61406148
ctrl_info = shost_to_hba(shost);
61416149

6142-
count += snprintf(buffer + count, PAGE_SIZE - count,
6143-
" driver: %s\n", DRIVER_VERSION BUILD_TIMESTAMP);
6150+
return snprintf(buffer, PAGE_SIZE, "%s\n", ctrl_info->firmware_version);
6151+
}
6152+
6153+
static ssize_t pqi_driver_version_show(struct device *dev,
6154+
struct device_attribute *attr, char *buffer)
6155+
{
6156+
struct Scsi_Host *shost;
6157+
struct pqi_ctrl_info *ctrl_info;
6158+
6159+
shost = class_to_shost(dev);
6160+
ctrl_info = shost_to_hba(shost);
61446161

6145-
count += snprintf(buffer + count, PAGE_SIZE - count,
6146-
"firmware: %s\n", ctrl_info->firmware_version);
6162+
return snprintf(buffer, PAGE_SIZE,
6163+
"%s\n", DRIVER_VERSION BUILD_TIMESTAMP);
6164+
}
61476165

6148-
return count;
6166+
static ssize_t pqi_serial_number_show(struct device *dev,
6167+
struct device_attribute *attr, char *buffer)
6168+
{
6169+
struct Scsi_Host *shost;
6170+
struct pqi_ctrl_info *ctrl_info;
6171+
6172+
shost = class_to_shost(dev);
6173+
ctrl_info = shost_to_hba(shost);
6174+
6175+
return snprintf(buffer, PAGE_SIZE, "%s\n", ctrl_info->serial_number);
6176+
}
6177+
6178+
static ssize_t pqi_model_show(struct device *dev,
6179+
struct device_attribute *attr, char *buffer)
6180+
{
6181+
struct Scsi_Host *shost;
6182+
struct pqi_ctrl_info *ctrl_info;
6183+
6184+
shost = class_to_shost(dev);
6185+
ctrl_info = shost_to_hba(shost);
6186+
6187+
return snprintf(buffer, PAGE_SIZE, "%s\n", ctrl_info->model);
6188+
}
6189+
6190+
static ssize_t pqi_vendor_show(struct device *dev,
6191+
struct device_attribute *attr, char *buffer)
6192+
{
6193+
struct Scsi_Host *shost;
6194+
struct pqi_ctrl_info *ctrl_info;
6195+
6196+
shost = class_to_shost(dev);
6197+
ctrl_info = shost_to_hba(shost);
6198+
6199+
return snprintf(buffer, PAGE_SIZE, "%s\n", ctrl_info->vendor);
61496200
}
61506201

61516202
static ssize_t pqi_host_rescan_store(struct device *dev,
@@ -6198,13 +6249,21 @@ static ssize_t pqi_lockup_action_store(struct device *dev,
61986249
return -EINVAL;
61996250
}
62006251

6201-
static DEVICE_ATTR(version, 0444, pqi_version_show, NULL);
6252+
static DEVICE_ATTR(driver_version, 0444, pqi_driver_version_show, NULL);
6253+
static DEVICE_ATTR(firmware_version, 0444, pqi_firmware_version_show, NULL);
6254+
static DEVICE_ATTR(model, 0444, pqi_model_show, NULL);
6255+
static DEVICE_ATTR(serial_number, 0444, pqi_serial_number_show, NULL);
6256+
static DEVICE_ATTR(vendor, 0444, pqi_vendor_show, NULL);
62026257
static DEVICE_ATTR(rescan, 0200, NULL, pqi_host_rescan_store);
62036258
static DEVICE_ATTR(lockup_action, 0644,
62046259
pqi_lockup_action_show, pqi_lockup_action_store);
62056260

62066261
static struct device_attribute *pqi_shost_attrs[] = {
6207-
&dev_attr_version,
6262+
&dev_attr_driver_version,
6263+
&dev_attr_firmware_version,
6264+
&dev_attr_model,
6265+
&dev_attr_serial_number,
6266+
&dev_attr_vendor,
62086267
&dev_attr_rescan,
62096268
&dev_attr_lockup_action,
62106269
NULL
@@ -6596,7 +6655,30 @@ static int pqi_reset(struct pqi_ctrl_info *ctrl_info)
65966655
return rc;
65976656
}
65986657

6599-
static int pqi_get_ctrl_firmware_version(struct pqi_ctrl_info *ctrl_info)
6658+
static int pqi_get_ctrl_serial_number(struct pqi_ctrl_info *ctrl_info)
6659+
{
6660+
int rc;
6661+
struct bmic_sense_subsystem_info *sense_info;
6662+
6663+
sense_info = kzalloc(sizeof(*sense_info), GFP_KERNEL);
6664+
if (!sense_info)
6665+
return -ENOMEM;
6666+
6667+
rc = pqi_sense_subsystem_info(ctrl_info, sense_info);
6668+
if (rc)
6669+
goto out;
6670+
6671+
memcpy(ctrl_info->serial_number, sense_info->ctrl_serial_number,
6672+
sizeof(sense_info->ctrl_serial_number));
6673+
ctrl_info->serial_number[sizeof(sense_info->ctrl_serial_number)] = '\0';
6674+
6675+
out:
6676+
kfree(sense_info);
6677+
6678+
return rc;
6679+
}
6680+
6681+
static int pqi_get_ctrl_product_details(struct pqi_ctrl_info *ctrl_info)
66006682
{
66016683
int rc;
66026684
struct bmic_identify_controller *identify;
@@ -6617,6 +6699,14 @@ static int pqi_get_ctrl_firmware_version(struct pqi_ctrl_info *ctrl_info)
66176699
sizeof(ctrl_info->firmware_version),
66186700
"-%u", get_unaligned_le16(&identify->firmware_build_number));
66196701

6702+
memcpy(ctrl_info->model, identify->product_id,
6703+
sizeof(identify->product_id));
6704+
ctrl_info->model[sizeof(identify->product_id)] = '\0';
6705+
6706+
memcpy(ctrl_info->vendor, identify->vendor_id,
6707+
sizeof(identify->vendor_id));
6708+
ctrl_info->vendor[sizeof(identify->vendor_id)] = '\0';
6709+
66206710
out:
66216711
kfree(identify);
66226712

@@ -7136,10 +7226,17 @@ static int pqi_ctrl_init(struct pqi_ctrl_info *ctrl_info)
71367226
if (rc)
71377227
return rc;
71387228

7139-
rc = pqi_get_ctrl_firmware_version(ctrl_info);
7229+
rc = pqi_get_ctrl_product_details(ctrl_info);
7230+
if (rc) {
7231+
dev_err(&ctrl_info->pci_dev->dev,
7232+
"error obtaining product details\n");
7233+
return rc;
7234+
}
7235+
7236+
rc = pqi_get_ctrl_serial_number(ctrl_info);
71407237
if (rc) {
71417238
dev_err(&ctrl_info->pci_dev->dev,
7142-
"error obtaining firmware version\n");
7239+
"error obtaining ctrl serial number\n");
71437240
return rc;
71447241
}
71457242

@@ -7279,10 +7376,10 @@ static int pqi_ctrl_init_resume(struct pqi_ctrl_info *ctrl_info)
72797376
return rc;
72807377
}
72817378

7282-
rc = pqi_get_ctrl_firmware_version(ctrl_info);
7379+
rc = pqi_get_ctrl_product_details(ctrl_info);
72837380
if (rc) {
72847381
dev_err(&ctrl_info->pci_dev->dev,
7285-
"error obtaining firmware version\n");
7382+
"error obtaining product detail\n");
72867383
return rc;
72877384
}
72887385

0 commit comments

Comments
 (0)