aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClemens Ladisch <clemens@ladisch.de>2011-06-14 11:30:45 +0200
committerClemens Ladisch <clemens@ladisch.de>2012-05-18 14:00:01 +0200
commit6f466e66c80c64e90fc4be823ab3d0872e0c416f (patch)
tree40881b6d19b406f1889f17d6ea05d4325781801e
parent630df53864dd3c9bb6fcaacf794e205823292177 (diff)
downloadlinux-firewire-utils-6f466e66c80c64e90fc4be823ab3d0872e0c416f.tar.gz
firewire-request: remove bus reset retries
Do not retry requests when they have been aborted due to a bus reset. There are requests that must be changed or dropped when the generation changes; and a request that causes a bus reset would result in an endless bus reset loop.
-rw-r--r--src/firewire-request.c89
1 files changed, 39 insertions, 50 deletions
diff --git a/src/firewire-request.c b/src/firewire-request.c
index fcb97ff..b44fc05 100644
--- a/src/firewire-request.c
+++ b/src/firewire-request.c
@@ -87,7 +87,6 @@ static struct fw_cdev_event_response *wait_for_response(void)
struct pollfd pfd;
int ready, r;
struct fw_cdev_event_common *event;
- struct fw_cdev_event_bus_reset *event_bus_reset;
pfd.fd = fd;
pfd.events = POLLIN;
@@ -109,10 +108,6 @@ static struct fw_cdev_event_response *wait_for_response(void)
event = (void *)buf;
if (event->type == FW_CDEV_EVENT_RESPONSE)
return (struct fw_cdev_event_response *)buf;
- if (event->type == FW_CDEV_EVENT_BUS_RESET) {
- event_bus_reset = (void *)buf;
- generation = event_bus_reset->generation;
- }
}
}
@@ -171,22 +166,20 @@ static void do_read(void)
struct fw_cdev_send_request send_request;
struct fw_cdev_event_response *response;
- do {
- if (read_length == 4 && !(address & 3))
- send_request.tcode = TCODE_READ_QUADLET_REQUEST;
- else
- send_request.tcode = TCODE_READ_BLOCK_REQUEST;
- send_request.length = read_length;
- send_request.offset = address;
- send_request.closure = 0;
- send_request.data = 0;
- send_request.generation = generation;
- if (ioctl(fd, FW_CDEV_IOC_SEND_REQUEST, &send_request) < 0) {
- perror("SEND_REQUEST ioctl failed");
- exit(EXIT_FAILURE);
- }
- response = wait_for_response();
- } while (response->rcode == RCODE_GENERATION);
+ if (read_length == 4 && !(address & 3))
+ send_request.tcode = TCODE_READ_QUADLET_REQUEST;
+ else
+ send_request.tcode = TCODE_READ_BLOCK_REQUEST;
+ send_request.length = read_length;
+ send_request.offset = address;
+ send_request.closure = 0;
+ send_request.data = 0;
+ send_request.generation = generation;
+ if (ioctl(fd, FW_CDEV_IOC_SEND_REQUEST, &send_request) < 0) {
+ perror("SEND_REQUEST ioctl failed");
+ exit(EXIT_FAILURE);
+ }
+ response = wait_for_response();
if (response->rcode != RCODE_COMPLETE)
print_rcode(response->rcode);
else
@@ -198,22 +191,20 @@ static void do_write_request(int request)
struct fw_cdev_send_request send_request;
struct fw_cdev_event_response *response;
- do {
- if (data.length == 4 && !(address & 3))
- send_request.tcode = TCODE_WRITE_QUADLET_REQUEST;
- else
- send_request.tcode = TCODE_WRITE_BLOCK_REQUEST;
- send_request.length = data.length;
- send_request.offset = address;
- send_request.closure = 0;
- send_request.data = (u64)data.data;
- send_request.generation = generation;
- if (ioctl(fd, request, &send_request) < 0) {
- perror("SEND_REQUEST ioctl failed");
- exit(EXIT_FAILURE);
- }
- response = wait_for_response();
- } while (response->rcode == RCODE_GENERATION);
+ if (data.length == 4 && !(address & 3))
+ send_request.tcode = TCODE_WRITE_QUADLET_REQUEST;
+ else
+ send_request.tcode = TCODE_WRITE_BLOCK_REQUEST;
+ send_request.length = data.length;
+ send_request.offset = address;
+ send_request.closure = 0;
+ send_request.data = (u64)data.data;
+ send_request.generation = generation;
+ if (ioctl(fd, request, &send_request) < 0) {
+ perror("SEND_REQUEST ioctl failed");
+ exit(EXIT_FAILURE);
+ }
+ response = wait_for_response();
if (response->rcode != RCODE_COMPLETE)
print_rcode(response->rcode);
}
@@ -255,19 +246,17 @@ static void do_lock_request(u32 tcode)
memcpy(buf + data.length, data2.data, data2.length);
} else
buf = data.data;
- do {
- send_request.tcode = tcode;;
- send_request.length = has_data2 ? data.length * 2 : data.length;
- send_request.offset = address;
- send_request.closure = 0;
- send_request.data = (u64)buf;
- send_request.generation = generation;
- if (ioctl(fd, FW_CDEV_IOC_SEND_REQUEST, &send_request) < 0) {
- perror("SEND_REQUEST ioctl failed");
- exit(EXIT_FAILURE);
- }
- response = wait_for_response();
- } while (response->rcode == RCODE_GENERATION);
+ send_request.tcode = tcode;;
+ send_request.length = has_data2 ? data.length * 2 : data.length;
+ send_request.offset = address;
+ send_request.closure = 0;
+ send_request.data = (u64)buf;
+ send_request.generation = generation;
+ if (ioctl(fd, FW_CDEV_IOC_SEND_REQUEST, &send_request) < 0) {
+ perror("SEND_REQUEST ioctl failed");
+ exit(EXIT_FAILURE);
+ }
+ response = wait_for_response();
if (response->rcode != RCODE_COMPLETE)
print_rcode(response->rcode);
else