|
@@ -1158,7 +1158,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;
|
|
|
+ int tcode, length, ext_tcode, sel, try;
|
|
|
__be32 *payload, lock_old;
|
|
|
u32 lock_arg, lock_data;
|
|
|
|
|
@@ -1185,21 +1185,26 @@ static void handle_local_lock(struct fw_ohci *ohci,
|
|
|
reg_write(ohci, OHCI1394_CSRCompareData, lock_arg);
|
|
|
reg_write(ohci, OHCI1394_CSRControl, sel);
|
|
|
|
|
|
- if (reg_read(ohci, OHCI1394_CSRControl) & 0x80000000)
|
|
|
- lock_old = cpu_to_be32(reg_read(ohci, OHCI1394_CSRData));
|
|
|
- else
|
|
|
- fw_notify("swap not done yet\n");
|
|
|
+ for (try = 0; try < 20; try++)
|
|
|
+ if (reg_read(ohci, OHCI1394_CSRControl) & 0x80000000) {
|
|
|
+ lock_old = cpu_to_be32(reg_read(ohci,
|
|
|
+ OHCI1394_CSRData));
|
|
|
+ fw_fill_response(&response, packet->header,
|
|
|
+ RCODE_COMPLETE,
|
|
|
+ &lock_old, sizeof(lock_old));
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
+
|
|
|
+ fw_error("swap not done (CSR lock timeout)\n");
|
|
|
+ fw_fill_response(&response, packet->header, RCODE_BUSY, NULL, 0);
|
|
|
|
|
|
- fw_fill_response(&response, packet->header,
|
|
|
- RCODE_COMPLETE, &lock_old, sizeof(lock_old));
|
|
|
out:
|
|
|
fw_core_handle_response(&ohci->card, &response);
|
|
|
}
|
|
|
|
|
|
static void handle_local_request(struct context *ctx, struct fw_packet *packet)
|
|
|
{
|
|
|
- u64 offset;
|
|
|
- u32 csr;
|
|
|
+ u64 offset, csr;
|
|
|
|
|
|
if (ctx == &ctx->ohci->at_request_ctx) {
|
|
|
packet->ack = ACK_PENDING;
|