diff options
| -rw-r--r-- | drivers/firewire/core-device.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/drivers/firewire/core-device.c b/drivers/firewire/core-device.c index 8ba7f7928f1f..f3b890da1e87 100644 --- a/drivers/firewire/core-device.c +++ b/drivers/firewire/core-device.c | |||
| @@ -455,15 +455,20 @@ static struct device_attribute fw_device_attributes[] = { | |||
| 455 | static int read_rom(struct fw_device *device, | 455 | static int read_rom(struct fw_device *device, |
| 456 | int generation, int index, u32 *data) | 456 | int generation, int index, u32 *data) |
| 457 | { | 457 | { |
| 458 | int rcode; | 458 | u64 offset = (CSR_REGISTER_BASE | CSR_CONFIG_ROM) + index * 4; |
| 459 | int i, rcode; | ||
| 459 | 460 | ||
| 460 | /* device->node_id, accessed below, must not be older than generation */ | 461 | /* device->node_id, accessed below, must not be older than generation */ |
| 461 | smp_rmb(); | 462 | smp_rmb(); |
| 462 | 463 | ||
| 463 | rcode = fw_run_transaction(device->card, TCODE_READ_QUADLET_REQUEST, | 464 | for (i = 10; i < 100; i += 10) { |
| 464 | device->node_id, generation, device->max_speed, | 465 | rcode = fw_run_transaction(device->card, |
| 465 | (CSR_REGISTER_BASE | CSR_CONFIG_ROM) + index * 4, | 466 | TCODE_READ_QUADLET_REQUEST, device->node_id, |
| 466 | data, 4); | 467 | generation, device->max_speed, offset, data, 4); |
| 468 | if (rcode != RCODE_BUSY) | ||
| 469 | break; | ||
| 470 | msleep(i); | ||
| 471 | } | ||
| 467 | be32_to_cpus(data); | 472 | be32_to_cpus(data); |
| 468 | 473 | ||
| 469 | return rcode; | 474 | return rcode; |
