diff options
author | Clemens Ladisch <clemens@ladisch.de> | 2012-04-11 11:36:39 -0400 |
---|---|---|
committer | Stefan Richter <stefanr@s5r6.in-berlin.de> | 2012-04-17 16:27:37 -0400 |
commit | d33ec3b55e91f1c285099fee731b79a722d10fe6 (patch) | |
tree | 3bd2da84d19b852381d10bc5961b5e6b3731ba01 /drivers/firewire | |
parent | 8a8c47364eef8595e05b5bf53352aa6f16784356 (diff) |
firewire: core: wait for inaccessible devices after bus reset
When reread_config_rom() encountered a config rom that was marked as not
yet accessible, that device would be treated as "gone". This would mean
that that device would effectively vanish until the next bus reset.
The correct way to handle this situation is the same as in
read_config_rom(), to treat this like other errors and to retry the read
later, when the (possibly changed) config rom is available. The device
is marked "gone" only if it continues to return zero values after these
retries.
Signed-off-by: Clemens Ladisch <clemens@ladisch.de>
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
Diffstat (limited to 'drivers/firewire')
-rw-r--r-- | drivers/firewire/core-device.c | 9 |
1 files changed, 3 insertions, 6 deletions
diff --git a/drivers/firewire/core-device.c b/drivers/firewire/core-device.c index 68109e9bb04e..8038311e1737 100644 --- a/drivers/firewire/core-device.c +++ b/drivers/firewire/core-device.c | |||
@@ -505,7 +505,7 @@ static int read_config_rom(struct fw_device *device, int generation) | |||
505 | if (read_rom(device, generation, i, &rom[i]) != RCODE_COMPLETE) | 505 | if (read_rom(device, generation, i, &rom[i]) != RCODE_COMPLETE) |
506 | goto out; | 506 | goto out; |
507 | /* | 507 | /* |
508 | * As per IEEE1212 7.2, during power-up, devices can | 508 | * As per IEEE1212 7.2, during initialization, devices can |
509 | * reply with a 0 for the first quadlet of the config | 509 | * reply with a 0 for the first quadlet of the config |
510 | * rom to indicate that they are booting (for example, | 510 | * rom to indicate that they are booting (for example, |
511 | * if the firmware is on the disk of a external | 511 | * if the firmware is on the disk of a external |
@@ -1071,7 +1071,6 @@ static void fw_device_init(struct work_struct *work) | |||
1071 | 1071 | ||
1072 | enum { | 1072 | enum { |
1073 | REREAD_BIB_ERROR, | 1073 | REREAD_BIB_ERROR, |
1074 | REREAD_BIB_GONE, | ||
1075 | REREAD_BIB_UNCHANGED, | 1074 | REREAD_BIB_UNCHANGED, |
1076 | REREAD_BIB_CHANGED, | 1075 | REREAD_BIB_CHANGED, |
1077 | }; | 1076 | }; |
@@ -1087,7 +1086,8 @@ static int reread_config_rom(struct fw_device *device, int generation) | |||
1087 | return REREAD_BIB_ERROR; | 1086 | return REREAD_BIB_ERROR; |
1088 | 1087 | ||
1089 | if (i == 0 && q == 0) | 1088 | if (i == 0 && q == 0) |
1090 | return REREAD_BIB_GONE; | 1089 | /* inaccessible (see read_config_rom); retry later */ |
1090 | return REREAD_BIB_ERROR; | ||
1091 | 1091 | ||
1092 | if (q != device->config_rom[i]) | 1092 | if (q != device->config_rom[i]) |
1093 | return REREAD_BIB_CHANGED; | 1093 | return REREAD_BIB_CHANGED; |
@@ -1114,9 +1114,6 @@ static void fw_device_refresh(struct work_struct *work) | |||
1114 | } | 1114 | } |
1115 | goto give_up; | 1115 | goto give_up; |
1116 | 1116 | ||
1117 | case REREAD_BIB_GONE: | ||
1118 | goto gone; | ||
1119 | |||
1120 | case REREAD_BIB_UNCHANGED: | 1117 | case REREAD_BIB_UNCHANGED: |
1121 | if (atomic_cmpxchg(&device->state, | 1118 | if (atomic_cmpxchg(&device->state, |
1122 | FW_DEVICE_INITIALIZING, | 1119 | FW_DEVICE_INITIALIZING, |