summaryrefslogtreecommitdiff
path: root/xpp/utils/fpga_load.c
diff options
context:
space:
mode:
Diffstat (limited to 'xpp/utils/fpga_load.c')
-rw-r--r--xpp/utils/fpga_load.c30
1 files changed, 22 insertions, 8 deletions
diff --git a/xpp/utils/fpga_load.c b/xpp/utils/fpga_load.c
index 92e3c33..3d6bdbe 100644
--- a/xpp/utils/fpga_load.c
+++ b/xpp/utils/fpga_load.c
@@ -28,6 +28,7 @@ static const char rcsid[] = "$Id$";
static int verbose = LOG_WARNING;
static char *progname;
+static int disconnected = 0;
#define MAX_HEX_LINES 10000
#define PACKET_SIZE 512
@@ -238,18 +239,22 @@ int get_usb_string(char *buf, unsigned int len, uint16_t item, usb_dev_handle *h
return snprintf(buf, len, "%s", tmp);
}
-void my_usb_device_cleanup(struct my_usb_device *mydev, const struct astribank_type *abtype)
+void my_usb_device_cleanup(struct my_usb_device *mydev)
{
assert(mydev != NULL);
if(!mydev->handle) {
return; /* Nothing to do */
}
- if(usb_release_interface(mydev->handle, abtype->my_interface_num) != 0) {
- ERR("Releasing interface: usb: %s\n", usb_strerror());
+ if(!disconnected) {
+ if(usb_release_interface(mydev->handle, mydev->abtype->my_interface_num) != 0) {
+ ERR("Releasing interface: usb: %s\n", usb_strerror());
+ }
}
if(usb_close(mydev->handle) != 0) {
ERR("Closing device: usb: %s\n", usb_strerror());
}
+ disconnected = 1;
+ mydev->handle = NULL;
}
static void show_device_info(const struct my_usb_device *mydev)
@@ -295,8 +300,17 @@ int send_usb(const char *msg, struct my_usb_device *mydev, struct fpga_packet_he
}
ret = usb_bulk_write(mydev->handle, mydev->my_ep_out, p, len, timeout);
if(ret < 0) {
- ERR("bulk_write to endpoint 0x%x failed: %s\n", mydev->my_ep_out, usb_strerror());
- dump_packet("send_usb[ERR]", p, len);
+ /*
+ * If the device was gone, it may be the
+ * result of renumeration. Ignore it.
+ */
+ if(ret != -ENODEV) {
+ ERR("bulk_write to endpoint 0x%x failed: %s\n", mydev->my_ep_out, usb_strerror());
+ dump_packet("send_usb[ERR]", p, len);
+ } else {
+ disconnected = 1;
+ my_usb_device_cleanup(mydev);
+ }
return ret;
} else if(ret != len) {
ERR("bulk_write to endpoint 0x%x short write: %s\n", mydev->my_ep_out, usb_strerror());
@@ -611,8 +625,8 @@ int renumerate_device(struct my_usb_device *mydev, enum fpga_load_packet_types p
DBG("Renumerating with 0x%X\n", pt);
phead->header.op = pt;
ret = send_usb("renumerate[W]", mydev, phead, 1, TIMEOUT);
- if(ret < 0)
- return ret;
+ if(ret < 0 && ret != -ENODEV)
+ return ret;
#if 0
/*
* FIXME: we count on our USB firmware to reset the device... should we?
@@ -984,6 +998,6 @@ int main(int argc, char *argv[])
}
DBG("Exiting\n");
dev_err:
- my_usb_device_cleanup(&mydev, abtype);
+ my_usb_device_cleanup(&mydev);
return ret;
}