aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/firewire
diff options
context:
space:
mode:
authorClemens Ladisch <clemens@ladisch.de>2012-04-11 11:36:39 -0400
committerStefan Richter <stefanr@s5r6.in-berlin.de>2012-04-17 16:27:37 -0400
commitd33ec3b55e91f1c285099fee731b79a722d10fe6 (patch)
tree3bd2da84d19b852381d10bc5961b5e6b3731ba01 /drivers/firewire
parent8a8c47364eef8595e05b5bf53352aa6f16784356 (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.c9
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
1072enum { 1072enum {
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,