Skip to content

Commit

Permalink
[SCSI] ipr: fix resource type update and add sdev and shost attributes
Browse files Browse the repository at this point in the history
Setting the resource type in the ipr_update_res_entry function was incorrect in
that the top 4 bits were masked off.  The assignment has been updated to no
longer mask those bits.

Then, two new attributes were added to allow the user space utilities to more
easily get information.  The resource_type sdev attribute is set for all devices
in the adapter's configuration table and indicates the type of device.  The
fw_type shost attribute indicates the firmware type supported by the adapter.

Finally, the resource_path attribute was changed to be mode S_IRUGO.

Signed-off-by: Wayne Boyer <wayneb@linux.vnet.ibm.com>
Acked-by: Brian King <brking@linux.vnet.ibm.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
  • Loading branch information
Wayne Boyer authored and James Bottomley committed Jul 28, 2010
1 parent 1df79ca commit 75576bb
Showing 1 changed file with 68 additions and 2 deletions.
70 changes: 68 additions & 2 deletions drivers/scsi/ipr.c
Original file line number Diff line number Diff line change
Expand Up @@ -1168,7 +1168,7 @@ static void ipr_update_res_entry(struct ipr_resource_entry *res,
if (res->ioa_cfg->sis64) {
res->flags = cfgtew->u.cfgte64->flags;
res->res_flags = cfgtew->u.cfgte64->res_flags;
res->type = cfgtew->u.cfgte64->res_type & 0x0f;
res->type = cfgtew->u.cfgte64->res_type;

memcpy(&res->std_inq_data, &cfgtew->u.cfgte64->std_inq_data,
sizeof(struct ipr_std_inq_data));
Expand Down Expand Up @@ -3762,13 +3762,44 @@ static struct device_attribute ipr_update_fw_attr = {
.store = ipr_store_update_fw
};

/**
* ipr_show_fw_type - Show the adapter's firmware type.
* @dev: class device struct
* @buf: buffer
*
* Return value:
* number of bytes printed to buffer
**/
static ssize_t ipr_show_fw_type(struct device *dev,
struct device_attribute *attr, char *buf)
{
struct Scsi_Host *shost = class_to_shost(dev);
struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)shost->hostdata;
unsigned long lock_flags = 0;
int len;

spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
len = snprintf(buf, PAGE_SIZE, "%d\n", ioa_cfg->sis64);
spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
return len;
}

static struct device_attribute ipr_ioa_fw_type_attr = {
.attr = {
.name = "fw_type",
.mode = S_IRUGO,
},
.show = ipr_show_fw_type
};

static struct device_attribute *ipr_ioa_attrs[] = {
&ipr_fw_version_attr,
&ipr_log_level_attr,
&ipr_diagnostics_attr,
&ipr_ioa_state_attr,
&ipr_ioa_reset_attr,
&ipr_update_fw_attr,
&ipr_ioa_fw_type_attr,
NULL,
};

Expand Down Expand Up @@ -4122,14 +4153,49 @@ static ssize_t ipr_show_resource_path(struct device *dev, struct device_attribut
static struct device_attribute ipr_resource_path_attr = {
.attr = {
.name = "resource_path",
.mode = S_IRUSR,
.mode = S_IRUGO,
},
.show = ipr_show_resource_path
};

/**
* ipr_show_resource_type - Show the resource type for this device.
* @dev: device struct
* @buf: buffer
*
* Return value:
* number of bytes printed to buffer
**/
static ssize_t ipr_show_resource_type(struct device *dev, struct device_attribute *attr, char *buf)
{
struct scsi_device *sdev = to_scsi_device(dev);
struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *)sdev->host->hostdata;
struct ipr_resource_entry *res;
unsigned long lock_flags = 0;
ssize_t len = -ENXIO;

spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
res = (struct ipr_resource_entry *)sdev->hostdata;

if (res)
len = snprintf(buf, PAGE_SIZE, "%x\n", res->type);

spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
return len;
}

static struct device_attribute ipr_resource_type_attr = {
.attr = {
.name = "resource_type",
.mode = S_IRUGO,
},
.show = ipr_show_resource_type
};

static struct device_attribute *ipr_dev_attrs[] = {
&ipr_adapter_handle_attr,
&ipr_resource_path_attr,
&ipr_resource_type_attr,
NULL,
};

Expand Down

0 comments on commit 75576bb

Please sign in to comment.