summaryrefslogtreecommitdiffstats
path: root/drivers/firewire
diff options
context:
space:
mode:
authorClemens Ladisch <clemens@ladisch.de>2012-04-11 17:39:59 +0200
committerStefan Richter <stefanr@s5r6.in-berlin.de>2012-04-17 22:57:10 +0200
commit8527f8e2934683e53405fbe876a4e6f4a0c46eb8 (patch)
treeac62e400e7e901256657cb131017d2efcd48f6d9 /drivers/firewire
parent94fba9fbeac44462c498e848496ba088198d78d1 (diff)
downloadlinux-stable-8527f8e2934683e53405fbe876a4e6f4a0c46eb8.tar.gz
linux-stable-8527f8e2934683e53405fbe876a4e6f4a0c46eb8.tar.bz2
linux-stable-8527f8e2934683e53405fbe876a4e6f4a0c46eb8.zip
firewire: core: fw_device_refresh(): clean up error handling
In fw_device_init() and fw_device_refresh(), if a call to read_cofig_rom() fails, the operation is retried a few times, with these retries being controlled by the MAX_RETRIES and RETRY_DELAY symbols. fw_device_refresh() also reads part of the config rom by calling reread_config_rom(). Any errors from this call resulted in retries with MAX_RETRIES/2 and RETRY_DELAY/2. There is no reason to require that a device that has initiated a bus reset must react faster to read requests than a device that has just been plugged in. Furthermore, if the config rom has changed, any errors from the following read_config_rom() call are then handled with the normal retry count and delay. Remove this inconsistency by always using the normal retry count and delay. (This also makes the two error handlers identical and allows merging them.) 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.c33
1 files changed, 12 insertions, 21 deletions
diff --git a/drivers/firewire/core-device.c b/drivers/firewire/core-device.c
index a3f486fbd7b7..4d460ef87161 100644
--- a/drivers/firewire/core-device.c
+++ b/drivers/firewire/core-device.c
@@ -1115,16 +1115,8 @@ static void fw_device_refresh(struct work_struct *work)
bool changed;
ret = reread_config_rom(device, device->generation, &changed);
- if (ret != RCODE_COMPLETE) {
- if (device->config_rom_retries < MAX_RETRIES / 2 &&
- atomic_read(&device->state) == FW_DEVICE_INITIALIZING) {
- device->config_rom_retries++;
- fw_schedule_device_work(device, RETRY_DELAY / 2);
-
- return;
- }
- goto give_up;
- }
+ if (ret != RCODE_COMPLETE)
+ goto failed_config_rom;
if (!changed) {
if (atomic_cmpxchg(&device->state,
@@ -1144,16 +1136,8 @@ static void fw_device_refresh(struct work_struct *work)
device_for_each_child(&device->device, NULL, shutdown_unit);
ret = read_config_rom(device, device->generation);
- if (ret != RCODE_COMPLETE) {
- if (device->config_rom_retries < MAX_RETRIES &&
- atomic_read(&device->state) == FW_DEVICE_INITIALIZING) {
- device->config_rom_retries++;
- fw_schedule_device_work(device, RETRY_DELAY);
-
- return;
- }
- goto give_up;
- }
+ if (ret != RCODE_COMPLETE)
+ goto failed_config_rom;
fw_device_cdev_update(device);
create_units(device);
@@ -1170,7 +1154,14 @@ static void fw_device_refresh(struct work_struct *work)
device->config_rom_retries = 0;
goto out;
- give_up:
+ failed_config_rom:
+ if (device->config_rom_retries < MAX_RETRIES &&
+ atomic_read(&device->state) == FW_DEVICE_INITIALIZING) {
+ device->config_rom_retries++;
+ fw_schedule_device_work(device, RETRY_DELAY);
+ return;
+ }
+
fw_notice(card, "giving up on refresh of device %s: %s\n",
dev_name(&device->device), fw_rcode_string(ret));
gone: