diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2011-08-21 18:13:19 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2011-08-21 18:13:19 -0700 | 
| commit | 3210d190dcb717c328d74f8c3f69ec717d665b40 (patch) | |
| tree | 4fbdbc85beea494165dc4bc8866f77051a730762 /drivers/firewire/core-device.c | |
| parent | 6719db6a23d4b7f1e5052eedae394135e3aef9c1 (diff) | |
| parent | aaff12039ffd812d0c8bbff50b87b6f1f09bec3e (diff) | |
| download | olio-linux-3.10-3210d190dcb717c328d74f8c3f69ec717d665b40.tar.xz olio-linux-3.10-3210d190dcb717c328d74f8c3f69ec717d665b40.zip  | |
Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6
* 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394/linux1394-2.6:
  firewire: core: handle ack_busy when fetching the Config ROM
Diffstat (limited to 'drivers/firewire/core-device.c')
| -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 8ba7f7928f1..f3b890da1e8 100644 --- a/drivers/firewire/core-device.c +++ b/drivers/firewire/core-device.c @@ -455,15 +455,20 @@ static struct device_attribute fw_device_attributes[] = {  static int read_rom(struct fw_device *device,  		    int generation, int index, u32 *data)  { -	int rcode; +	u64 offset = (CSR_REGISTER_BASE | CSR_CONFIG_ROM) + index * 4; +	int i, rcode;  	/* device->node_id, accessed below, must not be older than generation */  	smp_rmb(); -	rcode = fw_run_transaction(device->card, TCODE_READ_QUADLET_REQUEST, -			device->node_id, generation, device->max_speed, -			(CSR_REGISTER_BASE | CSR_CONFIG_ROM) + index * 4, -			data, 4); +	for (i = 10; i < 100; i += 10) { +		rcode = fw_run_transaction(device->card, +				TCODE_READ_QUADLET_REQUEST, device->node_id, +				generation, device->max_speed, offset, data, 4); +		if (rcode != RCODE_BUSY) +			break; +		msleep(i); +	}  	be32_to_cpus(data);  	return rcode;  |