Commit 67672134 authored by Peter Hurley's avatar Peter Hurley Committed by Stefan Richter

firewire: ohci: Improve bus reset error messages

Many of the error messages possible from bus_reset_work() do not
contain enough information to distinguish which error condition
occurred nor enough information to evaluate the error afterwards.

Differentiate all error conditions in bus_reset_work(); add
additional information to make error diagnosis possible.

[Stefan R:  fixed self-ID endian conversion]
Signed-off-by: default avatarPeter Hurley <peter@hurleysoftware.com>
Signed-off-by: default avatarStefan Richter <stefanr@s5r6.in-berlin.de>
parent de97cb64
...@@ -1911,7 +1911,7 @@ static void bus_reset_work(struct work_struct *work) ...@@ -1911,7 +1911,7 @@ static void bus_reset_work(struct work_struct *work)
reg = reg_read(ohci, OHCI1394_SelfIDCount); reg = reg_read(ohci, OHCI1394_SelfIDCount);
if (reg & OHCI1394_SelfIDCount_selfIDError) { if (reg & OHCI1394_SelfIDCount_selfIDError) {
ohci_notice(ohci, "inconsistent self IDs\n"); ohci_notice(ohci, "self ID receive error\n");
return; return;
} }
/* /*
...@@ -1923,7 +1923,7 @@ static void bus_reset_work(struct work_struct *work) ...@@ -1923,7 +1923,7 @@ static void bus_reset_work(struct work_struct *work)
self_id_count = (reg >> 3) & 0xff; self_id_count = (reg >> 3) & 0xff;
if (self_id_count > 252) { if (self_id_count > 252) {
ohci_notice(ohci, "inconsistent self IDs\n"); ohci_notice(ohci, "bad selfIDSize (%08x)\n", reg);
return; return;
} }
...@@ -1931,7 +1931,10 @@ static void bus_reset_work(struct work_struct *work) ...@@ -1931,7 +1931,10 @@ static void bus_reset_work(struct work_struct *work)
rmb(); rmb();
for (i = 1, j = 0; j < self_id_count; i += 2, j++) { for (i = 1, j = 0; j < self_id_count; i += 2, j++) {
if (ohci->self_id_cpu[i] != ~ohci->self_id_cpu[i + 1]) { u32 id = cond_le32_to_cpu(ohci->self_id_cpu[i]);
u32 id2 = cond_le32_to_cpu(ohci->self_id_cpu[i + 1]);
if (id != ~id2) {
/* /*
* If the invalid data looks like a cycle start packet, * If the invalid data looks like a cycle start packet,
* it's likely to be the result of the cycle master * it's likely to be the result of the cycle master
...@@ -1939,19 +1942,17 @@ static void bus_reset_work(struct work_struct *work) ...@@ -1939,19 +1942,17 @@ static void bus_reset_work(struct work_struct *work)
* so far are valid and should be processed so that the * so far are valid and should be processed so that the
* bus manager can then correct the gap count. * bus manager can then correct the gap count.
*/ */
if (cond_le32_to_cpu(ohci->self_id_cpu[i]) if (id == 0xffff008f) {
== 0xffff008f) { ohci_notice(ohci, "ignoring spurious self IDs\n");
ohci_notice(ohci,
"ignoring spurious self IDs\n");
self_id_count = j; self_id_count = j;
break; break;
} else {
ohci_notice(ohci, "inconsistent self IDs\n");
return;
} }
ohci_notice(ohci, "bad self ID %d/%d (%08x != ~%08x)\n",
j, self_id_count, id, id2);
return;
} }
ohci->self_id_buffer[j] = ohci->self_id_buffer[j] = id;
cond_le32_to_cpu(ohci->self_id_cpu[i]);
} }
if (ohci->quirks & QUIRK_TI_SLLZ059) { if (ohci->quirks & QUIRK_TI_SLLZ059) {
...@@ -1964,7 +1965,7 @@ static void bus_reset_work(struct work_struct *work) ...@@ -1964,7 +1965,7 @@ static void bus_reset_work(struct work_struct *work)
} }
if (self_id_count == 0) { if (self_id_count == 0) {
ohci_notice(ohci, "inconsistent self IDs\n"); ohci_notice(ohci, "no self IDs\n");
return; return;
} }
rmb(); rmb();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment