diff options
Diffstat (limited to 'drivers/firewire')
-rw-r--r-- | drivers/firewire/ohci.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/drivers/firewire/ohci.c b/drivers/firewire/ohci.c index bffc2ad7ecab..b6977149394e 100644 --- a/drivers/firewire/ohci.c +++ b/drivers/firewire/ohci.c | |||
@@ -1860,8 +1860,22 @@ static void bus_reset_work(struct work_struct *work) | |||
1860 | 1860 | ||
1861 | for (i = 1, j = 0; j < self_id_count; i += 2, j++) { | 1861 | for (i = 1, j = 0; j < self_id_count; i += 2, j++) { |
1862 | if (ohci->self_id_cpu[i] != ~ohci->self_id_cpu[i + 1]) { | 1862 | if (ohci->self_id_cpu[i] != ~ohci->self_id_cpu[i + 1]) { |
1863 | fw_notify("inconsistent self IDs\n"); | 1863 | /* |
1864 | return; | 1864 | * If the invalid data looks like a cycle start packet, |
1865 | * it's likely to be the result of the cycle master | ||
1866 | * having a wrong gap count. In this case, the self IDs | ||
1867 | * so far are valid and should be processed so that the | ||
1868 | * bus manager can then correct the gap count. | ||
1869 | */ | ||
1870 | if (cond_le32_to_cpu(ohci->self_id_cpu[i]) | ||
1871 | == 0xffff008f) { | ||
1872 | fw_notify("ignoring spurious self IDs\n"); | ||
1873 | self_id_count = j; | ||
1874 | break; | ||
1875 | } else { | ||
1876 | fw_notify("inconsistent self IDs\n"); | ||
1877 | return; | ||
1878 | } | ||
1865 | } | 1879 | } |
1866 | ohci->self_id_buffer[j] = | 1880 | ohci->self_id_buffer[j] = |
1867 | cond_le32_to_cpu(ohci->self_id_cpu[i]); | 1881 | cond_le32_to_cpu(ohci->self_id_cpu[i]); |