diff options
Diffstat (limited to 'xpp/utils/fpga_load.c')
-rw-r--r-- | xpp/utils/fpga_load.c | 30 |
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; } |