aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/firewire/ohci.c37
1 files changed, 29 insertions, 8 deletions
diff --git a/drivers/firewire/ohci.c b/drivers/firewire/ohci.c
index 79bddf556d063e..7f59511595566e 100644
--- a/drivers/firewire/ohci.c
+++ b/drivers/firewire/ohci.c
@@ -326,7 +326,7 @@ static const struct {
static int param_quirks;
module_param_named(quirks, param_quirks, int, 0644);
-static int param_cycle_timer_hard_fail = 1;
+static bool param_cycle_timer_hard_fail = true;
module_param_named(cycle_timer_hard_fail, param_cycle_timer_hard_fail, bool, 0644);
static int param_sclk_retries = 20;
@@ -587,8 +587,14 @@ static int reg_rw_sclk(struct fw_ohci *ohci, int offset, u32 *data,
ret = check_reg_access_fail(ohci);
spin_unlock_irqrestore(&ohci->sclk_domain_reg_lock, flags);
- if (ret != -EAGAIN)
- return ret;
+ if (ret != -EAGAIN) {
+ if (i)
+ dev_notice(ohci->card.device,
+ "reg_rw_sclk took %d %s retries to %s register 0x%03x\n",
+ i, can_sleep ? "sleeping" : "busy",
+ read ? "read" : "write", offset);
+ goto out;
+ }
if (i == param_sclk_retries)
break;
if (can_sleep)
@@ -596,6 +602,8 @@ static int reg_rw_sclk(struct fw_ohci *ohci, int offset, u32 *data,
}
dev_err(ohci->card.device, "SClk is off, cannot %s register 0x%03x\n",
read ? "read" : "write", offset);
+ out:
+ dump_stack();
return ret;
}
@@ -1641,7 +1649,7 @@ static void handle_local_lock(struct fw_ohci *ohci,
struct fw_packet *packet, u32 csr)
{
struct fw_packet response;
- int tcode, length, ext_tcode, sel, try;
+ int tcode, length, ext_tcode, sel, try, err;
__be32 *payload, lock_old;
u32 lock_arg, lock_data, reg;
unsigned long flags;
@@ -1673,12 +1681,14 @@ static void handle_local_lock(struct fw_ohci *ohci,
for (try = 0; try < 20; try++) {
reg = reg_read(ohci, OHCI1394_CSRControl);
- if (check_reg_access_fail(ohci))
+ err = check_reg_access_fail(ohci);
+ if (err)
break;
if (reg & OHCI1394_CSRControl_csrDone) {
lock_old = cpu_to_be32(reg_read(ohci, OHCI1394_CSRData));
- if (check_reg_access_fail(ohci))
+ err = check_reg_access_fail(ohci);
+ if (err)
break;
fw_fill_response(&response, packet->header,
@@ -1687,8 +1697,13 @@ static void handle_local_lock(struct fw_ohci *ohci,
goto out_unlock;
}
}
-
- dev_err(ohci->card.device, "swap not done (CSR lock timeout)\n");
+ if (err == -EAGAIN) {
+ dev_err(ohci->card.device,
+ "SClk is off, cannot read CSRControl or CSRData\n");
+ dump_stack();
+ } else {
+ dev_err(ohci->card.device, "swap not done (CSR lock timeout)\n");
+ }
fw_fill_response(&response, packet->header, RCODE_BUSY, NULL, 0);
out_unlock:
@@ -1875,6 +1890,7 @@ static int get_cycle_time(struct fw_ohci *ohci, u32 *value)
return ret;
}
dev_err(ohci->card.device, "SClk is off, cannot read cycle timer\n");
+ dump_stack();
return ret;
}
@@ -3081,6 +3097,11 @@ static int set_multichannel_mask(struct fw_ohci *ohci, u64 channels)
ret = check_reg_access_fail(ohci);
if (ret == 0)
ohci->mc_channels = channels;
+ if (ret == -EAGAIN) {
+ dev_err(ohci->card.device,
+ "SClk is off, cannot write IRMultiChanMask\n");
+ dump_stack();
+ }
spin_unlock_irqrestore(&ohci->sclk_domain_reg_lock, flags);
return ret;