Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 941b1cda authored by Stephen M. Cameron's avatar Stephen M. Cameron Committed by James Bottomley
Browse files

[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: default avatarStephen M. Cameron <scameron@beardog.cce.hp.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
parent 3f5eac3a
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -45,6 +45,7 @@ HPSA specific entries in /sys

  /sys/class/scsi_host/host*/rescan
  /sys/class/scsi_host/host*/firmware_revision
  /sys/class/scsi_host/host*/resettable
  /sys/class/scsi_host/host*/transport_mode

  the host "rescan" attribute is a write only attribute.  Writing to this
@@ -66,6 +67,17 @@ HPSA specific entries in /sys
  or "simple" mode.  This is controlled by the "hpsa_simple_mode" module
  parameter.

  The "resettable" read-only attribute indicates whether a particular
  controller is able to honor the "reset_devices" kernel parameter.  If the
  device is resettable, this file will contain a "1", otherwise, a "0".  This
  parameter is used by kdump, for example, to reset the controller at driver
  load time to eliminate any outstanding commands on the controller and get the
  controller into a known state so that the kdump initiated i/o will work right
  and not be disrupted in any way by stale commands or other stale state
  remaining on the controller from the previous kernel.  This attribute enables
  kexec tools to warn the user if they attempt to designate a device which is
  unable to honor the reset_devices kernel parameter as a dump device.

  HPSA specific disk attributes:
  ------------------------------

+41 −0
Original line number Diff line number Diff line
@@ -273,6 +273,44 @@ static ssize_t host_show_transport_mode(struct device *dev,
			"performant" : "simple");
}

/* List of controllers which cannot be reset on kexec with reset_devices */
static u32 unresettable_controller[] = {
	0x324a103C, /* Smart Array P712m */
	0x324b103C, /* SmartArray P711m */
	0x3223103C, /* Smart Array P800 */
	0x3234103C, /* Smart Array P400 */
	0x3235103C, /* Smart Array P400i */
	0x3211103C, /* Smart Array E200i */
	0x3212103C, /* Smart Array E200 */
	0x3213103C, /* Smart Array E200i */
	0x3214103C, /* Smart Array E200i */
	0x3215103C, /* Smart Array E200i */
	0x3237103C, /* Smart Array E500 */
	0x323D103C, /* Smart Array P700m */
	0x409C0E11, /* Smart Array 6400 */
	0x409D0E11, /* Smart Array 6400 EM */
};

static int ctlr_is_resettable(struct ctlr_info *h)
{
	int i;

	for (i = 0; i < ARRAY_SIZE(unresettable_controller); i++)
		if (unresettable_controller[i] == h->board_id)
			return 0;
	return 1;
}

static ssize_t host_show_resettable(struct device *dev,
	struct device_attribute *attr, char *buf)
{
	struct ctlr_info *h;
	struct Scsi_Host *shost = class_to_shost(dev);

	h = shost_to_hba(shost);
	return snprintf(buf, 20, "%d\n", ctlr_is_resettable(h));
}

static inline int is_logical_dev_addr_mode(unsigned char scsi3addr[])
{
	return (scsi3addr[3] & 0xC0) == 0x40;
@@ -379,6 +417,8 @@ static DEVICE_ATTR(commands_outstanding, S_IRUGO,
	host_show_commands_outstanding, NULL);
static DEVICE_ATTR(transport_mode, S_IRUGO,
	host_show_transport_mode, NULL);
static DEVICE_ATTR(resettable, S_IRUGO,
	host_show_resettable, NULL);

static struct device_attribute *hpsa_sdev_attrs[] = {
	&dev_attr_raid_level,
@@ -392,6 +432,7 @@ static struct device_attribute *hpsa_shost_attrs[] = {
	&dev_attr_firmware_revision,
	&dev_attr_commands_outstanding,
	&dev_attr_transport_mode,
	&dev_attr_resettable,
	NULL,
};