firewire: fw-sbp2: implement sysfs ieee1394_id
The attribute /sys/bus/scsi/devices/*:*:*:*/ieee1394_id, as generated by the old sbp2 driver, is typically used to create persistently named links in /dev/disk/by-id. Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de> Signed-off-by: Kristian Høgsberg <krh@redhat.com>
This commit is contained in:
parent
d7794c8668
commit
14e2198646
2 changed files with 54 additions and 0 deletions
|
@ -99,6 +99,7 @@ fw_unit(struct device *dev)
|
||||||
#define CSR_DEPENDENT_INFO 0x14
|
#define CSR_DEPENDENT_INFO 0x14
|
||||||
#define CSR_MODEL 0x17
|
#define CSR_MODEL 0x17
|
||||||
#define CSR_INSTANCE 0x18
|
#define CSR_INSTANCE 0x18
|
||||||
|
#define CSR_DIRECTORY_ID 0x20
|
||||||
|
|
||||||
#define SBP2_COMMAND_SET_SPECIFIER 0x38
|
#define SBP2_COMMAND_SET_SPECIFIER 0x38
|
||||||
#define SBP2_COMMAND_SET 0x39
|
#define SBP2_COMMAND_SET 0x39
|
||||||
|
|
|
@ -1108,6 +1108,58 @@ static int sbp2_scsi_abort(struct scsi_cmnd *cmd)
|
||||||
return SUCCESS;
|
return SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Format of /sys/bus/scsi/devices/.../ieee1394_id:
|
||||||
|
* u64 EUI-64 : u24 directory_ID : u16 LUN (all printed in hexadecimal)
|
||||||
|
*
|
||||||
|
* This is the concatenation of target port identifier and logical unit
|
||||||
|
* identifier as per SAM-2...SAM-4 annex A.
|
||||||
|
*/
|
||||||
|
static ssize_t
|
||||||
|
sbp2_sysfs_ieee1394_id_show(struct device *dev, struct device_attribute *attr,
|
||||||
|
char *buf)
|
||||||
|
{
|
||||||
|
struct scsi_device *sdev = to_scsi_device(dev);
|
||||||
|
struct sbp2_device *sd;
|
||||||
|
struct fw_unit *unit;
|
||||||
|
struct fw_device *device;
|
||||||
|
u32 directory_id;
|
||||||
|
struct fw_csr_iterator ci;
|
||||||
|
int key, value, lun;
|
||||||
|
|
||||||
|
if (!sdev)
|
||||||
|
return 0;
|
||||||
|
sd = (struct sbp2_device *)sdev->host->hostdata;
|
||||||
|
unit = sd->unit;
|
||||||
|
device = fw_device(unit->device.parent);
|
||||||
|
|
||||||
|
/* implicit directory ID */
|
||||||
|
directory_id = ((unit->directory - device->config_rom) * 4
|
||||||
|
+ CSR_CONFIG_ROM) & 0xffffff;
|
||||||
|
|
||||||
|
/* explicit directory ID, overrides implicit ID if present */
|
||||||
|
fw_csr_iterator_init(&ci, unit->directory);
|
||||||
|
while (fw_csr_iterator_next(&ci, &key, &value))
|
||||||
|
if (key == CSR_DIRECTORY_ID) {
|
||||||
|
directory_id = value;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* FIXME: Make this work for multi-lun devices. */
|
||||||
|
lun = 0;
|
||||||
|
|
||||||
|
return sprintf(buf, "%08x%08x:%06x:%04x\n",
|
||||||
|
device->config_rom[3], device->config_rom[4],
|
||||||
|
directory_id, lun);
|
||||||
|
}
|
||||||
|
|
||||||
|
static DEVICE_ATTR(ieee1394_id, S_IRUGO, sbp2_sysfs_ieee1394_id_show, NULL);
|
||||||
|
|
||||||
|
static struct device_attribute *sbp2_scsi_sysfs_attrs[] = {
|
||||||
|
&dev_attr_ieee1394_id,
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
static struct scsi_host_template scsi_driver_template = {
|
static struct scsi_host_template scsi_driver_template = {
|
||||||
.module = THIS_MODULE,
|
.module = THIS_MODULE,
|
||||||
.name = "SBP-2 IEEE-1394",
|
.name = "SBP-2 IEEE-1394",
|
||||||
|
@ -1121,6 +1173,7 @@ static struct scsi_host_template scsi_driver_template = {
|
||||||
.use_clustering = ENABLE_CLUSTERING,
|
.use_clustering = ENABLE_CLUSTERING,
|
||||||
.cmd_per_lun = 1,
|
.cmd_per_lun = 1,
|
||||||
.can_queue = 1,
|
.can_queue = 1,
|
||||||
|
.sdev_attrs = sbp2_scsi_sysfs_attrs,
|
||||||
};
|
};
|
||||||
|
|
||||||
MODULE_AUTHOR("Kristian Hoegsberg <krh@bitplanet.net>");
|
MODULE_AUTHOR("Kristian Hoegsberg <krh@bitplanet.net>");
|
||||||
|
|
Loading…
Reference in a new issue