firewire: reread config ROM when device reset the bus
When a device changes its configuration ROM, it announces this with a bus reset. firewire-core has to check which node initiated a bus reset and whether any unit directories went away or were added on this node. Tested with an IOI FWB-IDE01AB which has its link-on bit set if bus power is available but does not respond to ROM read requests if self power is off. This implements - recognition of the units if self power is switched on after fw-core gave up the initial attempt to read the config ROM, - shutdown of the units when self power is switched off. Also tested with a second PC running Linux/ieee1394. When the eth1394 driver is inserted and removed on that node, fw-core now notices the addition and removal of the IPv4 unit on the ieee1394 node. Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
This commit is contained in:
@@ -153,6 +153,7 @@ struct sbp2_target {
|
||||
struct list_head lu_list;
|
||||
|
||||
u64 management_agent_address;
|
||||
u64 guid;
|
||||
int directory_id;
|
||||
int node_id;
|
||||
int address_high;
|
||||
@@ -1114,6 +1115,7 @@ static int sbp2_probe(struct device *dev)
|
||||
kref_init(&tgt->kref);
|
||||
INIT_LIST_HEAD(&tgt->lu_list);
|
||||
tgt->bus_id = unit->device.bus_id;
|
||||
tgt->guid = (u64)device->config_rom[3] << 32 | device->config_rom[4];
|
||||
|
||||
if (fw_device_enable_phys_dma(device) < 0)
|
||||
goto fail_shost_put;
|
||||
@@ -1571,16 +1573,14 @@ sbp2_sysfs_ieee1394_id_show(struct device *dev, struct device_attribute *attr,
|
||||
{
|
||||
struct scsi_device *sdev = to_scsi_device(dev);
|
||||
struct sbp2_logical_unit *lu;
|
||||
struct fw_device *device;
|
||||
|
||||
if (!sdev)
|
||||
return 0;
|
||||
|
||||
lu = sdev->hostdata;
|
||||
device = fw_device(lu->tgt->unit->device.parent);
|
||||
|
||||
return sprintf(buf, "%08x%08x:%06x:%04x\n",
|
||||
device->config_rom[3], device->config_rom[4],
|
||||
return sprintf(buf, "%016llx:%06x:%04x\n",
|
||||
(unsigned long long)lu->tgt->guid,
|
||||
lu->tgt->directory_id, lu->lun);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user