aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/hpsa.c
diff options
context:
space:
mode:
authorStephen M. Cameron <scameron@beardog.cce.hp.com>2011-03-09 18:00:06 -0500
committerJames Bottomley <James.Bottomley@suse.de>2011-03-14 19:44:41 -0400
commit941b1cdae83039c99fc5c1884a98d2afd39760e5 (patch)
tree050d9853589eb142b9edf292399e574d919c9151 /drivers/scsi/hpsa.c
parent3f5eac3a040a2ea61a575f713aabedecdd23c3f8 (diff)
[SCSI] hpsa: export resettable host attribute
This attribute, requested by Redhat, allows kexec-tools to know whether the controller can honor the reset_devices kernel parameter and actually reset the controller. For kdump to work properly it is necessary that the reset_devices parameter be honored. This attribute enables kexec-tools to warn the user if they attempt to designate a non-resettable controller as the dump device. Signed-off-by: Stephen M. Cameron <scameron@beardog.cce.hp.com> Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'drivers/scsi/hpsa.c')
-rw-r--r--drivers/scsi/hpsa.c41
1 files changed, 41 insertions, 0 deletions
diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c
index dcabef4bb149..415ad4fb50d4 100644
--- a/drivers/scsi/hpsa.c
+++ b/drivers/scsi/hpsa.c
@@ -273,6 +273,44 @@ static ssize_t host_show_transport_mode(struct device *dev,
273 "performant" : "simple"); 273 "performant" : "simple");
274} 274}
275 275
276/* List of controllers which cannot be reset on kexec with reset_devices */
277static u32 unresettable_controller[] = {
278 0x324a103C, /* Smart Array P712m */
279 0x324b103C, /* SmartArray P711m */
280 0x3223103C, /* Smart Array P800 */
281 0x3234103C, /* Smart Array P400 */
282 0x3235103C, /* Smart Array P400i */
283 0x3211103C, /* Smart Array E200i */
284 0x3212103C, /* Smart Array E200 */
285 0x3213103C, /* Smart Array E200i */
286 0x3214103C, /* Smart Array E200i */
287 0x3215103C, /* Smart Array E200i */
288 0x3237103C, /* Smart Array E500 */
289 0x323D103C, /* Smart Array P700m */
290 0x409C0E11, /* Smart Array 6400 */
291 0x409D0E11, /* Smart Array 6400 EM */
292};
293
294static int ctlr_is_resettable(struct ctlr_info *h)
295{
296 int i;
297
298 for (i = 0; i < ARRAY_SIZE(unresettable_controller); i++)
299 if (unresettable_controller[i] == h->board_id)
300 return 0;
301 return 1;
302}
303
304static ssize_t host_show_resettable(struct device *dev,
305 struct device_attribute *attr, char *buf)
306{
307 struct ctlr_info *h;
308 struct Scsi_Host *shost = class_to_shost(dev);
309
310 h = shost_to_hba(shost);
311 return snprintf(buf, 20, "%d\n", ctlr_is_resettable(h));
312}
313
276static inline int is_logical_dev_addr_mode(unsigned char scsi3addr[]) 314static inline int is_logical_dev_addr_mode(unsigned char scsi3addr[])
277{ 315{
278 return (scsi3addr[3] & 0xC0) == 0x40; 316 return (scsi3addr[3] & 0xC0) == 0x40;
@@ -379,6 +417,8 @@ static DEVICE_ATTR(commands_outstanding, S_IRUGO,
379 host_show_commands_outstanding, NULL); 417 host_show_commands_outstanding, NULL);
380static DEVICE_ATTR(transport_mode, S_IRUGO, 418static DEVICE_ATTR(transport_mode, S_IRUGO,
381 host_show_transport_mode, NULL); 419 host_show_transport_mode, NULL);
420static DEVICE_ATTR(resettable, S_IRUGO,
421 host_show_resettable, NULL);
382 422
383static struct device_attribute *hpsa_sdev_attrs[] = { 423static struct device_attribute *hpsa_sdev_attrs[] = {
384 &dev_attr_raid_level, 424 &dev_attr_raid_level,
@@ -392,6 +432,7 @@ static struct device_attribute *hpsa_shost_attrs[] = {
392 &dev_attr_firmware_revision, 432 &dev_attr_firmware_revision,
393 &dev_attr_commands_outstanding, 433 &dev_attr_commands_outstanding,
394 &dev_attr_transport_mode, 434 &dev_attr_transport_mode,
435 &dev_attr_resettable,
395 NULL, 436 NULL,
396}; 437};
397 438