Commit 3210d190dcb717c328d74f8c3f69ec717d665b40

Authored by Linus Torvalds

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

Showing 1 changed file Side-by-side Diff

drivers/firewire/core-device.c
... ... @@ -455,15 +455,20 @@
455 455 static int read_rom(struct fw_device *device,
456 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 461 /* device->node_id, accessed below, must not be older than generation */
461 462 smp_rmb();
462 463  
463   - rcode = fw_run_transaction(device->card, TCODE_READ_QUADLET_REQUEST,
464   - device->node_id, generation, device->max_speed,
465   - (CSR_REGISTER_BASE | CSR_CONFIG_ROM) + index * 4,
466   - data, 4);
  464 + for (i = 10; i < 100; i += 10) {
  465 + rcode = fw_run_transaction(device->card,
  466 + TCODE_READ_QUADLET_REQUEST, device->node_id,
  467 + generation, device->max_speed, offset, data, 4);
  468 + if (rcode != RCODE_BUSY)
  469 + break;
  470 + msleep(i);
  471 + }
467 472 be32_to_cpus(data);
468 473  
469 474 return rcode;