diff --git a/api/glue/device.c b/api/glue/device.c index 81b4d3955d019e95a825b9ef8918d1c1a4760f02..50d1430a070496c2c791f240bc6bb3710aa88ba4 100644 --- a/api/glue/device.c +++ b/api/glue/device.c @@ -107,10 +107,17 @@ eb_status_t eb_device_open(eb_socket_t socketp, const char* address, eb_width_t if (eb_transports[transport->link_type].mtu == 0) attempts = 1; - /* Try to determine port width */ if (attempts == 0) { - device->widths = EB_DATAX|EB_ADDRX; + /* Only ok if the proposed widths are distinct */ + if (!eb_width_refined(proposed_widths)) { + eb_device_close(devicep); + *result = EB_NULL; + return EB_WIDTH; + } + + device->widths = proposed_widths; } else { + /* Try to determine port width */ device->widths = 0; do { uint8_t buf[8] = { 0x4E, 0x6F, 0x11, proposed_widths, 0x0, 0x0, 0x0, 0x0 }; @@ -126,23 +133,23 @@ eb_status_t eb_device_open(eb_socket_t socketp, const char* address, eb_width_t eb_socket_poll(socketp); } } while (device->widths == 0 && --attempts != 0); + + if (device->widths == 0) { + eb_device_close(devicep); + *result = EB_NULL; + return EB_TIMEOUT; + } + + device->widths &= proposed_widths; + if (eb_width_possible(device->widths) == 0) { + eb_device_close(devicep); + *result = EB_NULL; + return EB_WIDTH; + } + + device->widths = eb_width_refine(device->widths); } - if (device->widths == 0) { - eb_device_close(devicep); - *result = EB_NULL; - return EB_TIMEOUT; - } - - device->widths &= proposed_widths; - if (eb_width_possible(device->widths) == 0) { - eb_device_close(devicep); - *result = EB_NULL; - return EB_WIDTH; - } - - device->widths = eb_width_refine(device->widths); - *result = devicep; return EB_OK; } diff --git a/api/glue/socket.c b/api/glue/socket.c index 56642ef8a0d61b80cf332dc2edcb894eaa81daf5..88a1e15332a5004063a47c7f66a6f8b54d01c371 100644 --- a/api/glue/socket.c +++ b/api/glue/socket.c @@ -42,7 +42,7 @@ const char* eb_status(eb_status_t code) { case EB_OK: return "success"; case EB_FAIL: return "system failure"; case EB_ADDRESS: return "invalid address"; - case EB_WIDTH: return "bus width mismatch"; + case EB_WIDTH: return "impossible bus width"; case EB_OVERFLOW: return "cycle length overflow"; case EB_BUSY: return "resource busy"; case EB_TIMEOUT: return "timeout";