@@ -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+
615624static 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
61516202static 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) ;
62026257static DEVICE_ATTR (rescan , 0200 , NULL, pqi_host_rescan_store ) ;
62036258static DEVICE_ATTR (lockup_action , 0644 ,
62046259 pqi_lockup_action_show , pqi_lockup_action_store ) ;
62056260
62066261static 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+
66206710out :
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