sr_dev_close(): Set status to SR_ST_INACTIVE.

This ensures consistent checks and log messages across all drivers
and reduces the per-driver boilerplate.
This commit is contained in:
Uwe Hermann 2017-07-07 20:42:04 +02:00
parent 7e46362338
commit f1ba6b4b2c
37 changed files with 90 additions and 150 deletions

View File

@ -585,11 +585,21 @@ SR_API int sr_dev_open(struct sr_dev_inst *sdi)
} }
/** /**
* Close the specified device. * Close the specified device instance.
*
* If the device instance is not open (sdi->status != SR_ST_ACTIVE),
* SR_ERR_DEV_CLOSED will be returned and no closing will be attempted.
*
* Note: sdi->status will be set to SR_ST_INACTIVE, regardless of whether
* there are any errors during closing of the device instance (any errors
* will be reported via error code and log message, though).
* *
* @param sdi Device instance to use. Must not be NULL. * @param sdi Device instance to use. Must not be NULL.
* *
* @return SR_OK upon success, a negative error code upon errors. * @retval SR_OK Success.
* @retval SR_ERR_ARG Invalid arguments.
* @retval SR_ERR_DEV_CLOSED Device instance was not active.
* @retval SR_ERR Other error.
* *
* @since 0.2.0 * @since 0.2.0
*/ */
@ -598,7 +608,7 @@ SR_API int sr_dev_close(struct sr_dev_inst *sdi)
int ret; int ret;
if (!sdi || !sdi->driver || !sdi->driver->dev_close) if (!sdi || !sdi->driver || !sdi->driver->dev_close)
return SR_ERR; return SR_ERR_ARG;
if (sdi->status != SR_ST_ACTIVE) { if (sdi->status != SR_ST_ACTIVE) {
sr_err("%s: Device instance not active, can't close.", sr_err("%s: Device instance not active, can't close.",
@ -606,7 +616,9 @@ SR_API int sr_dev_close(struct sr_dev_inst *sdi)
return SR_ERR_DEV_CLOSED; return SR_ERR_DEV_CLOSED;
} }
sr_dbg("%s: Closing device.", sdi->driver->name) sdi->status = SR_ST_INACTIVE;
sr_dbg("%s: Closing device instance.", sdi->driver->name);
ret = sdi->driver->dev_close(sdi); ret = sdi->driver->dev_close(sdi);

View File

@ -156,11 +156,7 @@ static int dev_close(struct sr_dev_inst *sdi)
devc = sdi->priv; devc = sdi->priv;
ftdi_usb_close(&devc->ftdic); return (ftdi_usb_close(&devc->ftdic) == 0) ? SR_OK : SR_ERR;
sdi->status = SR_ST_INACTIVE;
return SR_OK;
} }
static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi, static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi,

View File

@ -421,6 +421,7 @@ static int dev_close(struct sr_dev_inst *sdi)
struct dev_context *devc; struct dev_context *devc;
devc = sdi->priv; devc = sdi->priv;
if (devc->config_dirty) if (devc->config_dirty)
/* Some configuration changes were queued up but didn't /* Some configuration changes were queued up but didn't
* get sent to the device, likely because we were never * get sent to the device, likely because we were never

View File

@ -137,8 +137,6 @@ static int dev_close(struct sr_dev_inst *sdi)
{ {
(void)sdi; (void)sdi;
sdi->status = SR_ST_INACTIVE;
return SR_OK; return SR_OK;
} }

View File

@ -168,8 +168,6 @@ static int dev_close(struct sr_dev_inst *sdi)
beaglelogic_munmap(devc); beaglelogic_munmap(devc);
beaglelogic_close(devc); beaglelogic_close(devc);
sdi->status = SR_ST_INACTIVE;
return SR_OK; return SR_OK;
} }

View File

@ -134,24 +134,18 @@ static int dev_close(struct sr_dev_inst *sdi)
if ((ret = libusb_release_interface(usb->devhdl, 0))) if ((ret = libusb_release_interface(usb->devhdl, 0)))
sr_err("Failed to release interface 0: %s.\n", libusb_error_name(ret)); sr_err("Failed to release interface 0: %s.\n", libusb_error_name(ret));
else
sr_dbg("Successfully released interface 0.\n");
if (!ret && devc->detached_kernel_driver) { if (!ret && devc->detached_kernel_driver) {
if ((ret = libusb_attach_kernel_driver(usb->devhdl, 0))) { if ((ret = libusb_attach_kernel_driver(usb->devhdl, 0)))
sr_err("Failed to attach kernel driver: %s.\n", sr_err("Failed to attach kernel driver: %s.\n",
libusb_error_name(ret)); libusb_error_name(ret));
} else { else
devc->detached_kernel_driver = 0; devc->detached_kernel_driver = 0;
sr_dbg("Successfully attached kernel driver.\n");
}
} }
libusb_close(usb->devhdl); libusb_close(usb->devhdl);
sdi->status = SR_ST_INACTIVE; return (ret == 0) ? SR_OK : SR_ERR;
return ret;
} }
static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi, static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi,

View File

@ -287,13 +287,14 @@ static int dev_close(struct sr_dev_inst *sdi)
devc = sdi->priv; devc = sdi->priv;
if (devc->ftdic && (ret = ftdi_usb_close(devc->ftdic)) < 0) if (!devc->ftdic)
return SR_ERR_BUG;
if ((ret = ftdi_usb_close(devc->ftdic)) < 0)
sr_err("Failed to close FTDI device (%d): %s.", sr_err("Failed to close FTDI device (%d): %s.",
ret, ftdi_get_error_string(devc->ftdic)); ret, ftdi_get_error_string(devc->ftdic));
sdi->status = SR_ST_INACTIVE; return (ret == 0) ? SR_OK : SR_ERR;
return SR_OK;
} }
static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi, static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi,

View File

@ -189,7 +189,7 @@ static int dev_open(struct sr_dev_inst *sdi)
static int dev_close(struct sr_dev_inst *sdi) static int dev_close(struct sr_dev_inst *sdi)
{ {
sdi->status = SR_ST_INACTIVE; (void)sdi;
return SR_OK; return SR_OK;
} }

View File

@ -382,14 +382,13 @@ static int dev_close(struct sr_dev_inst *sdi)
usb = sdi->conn; usb = sdi->conn;
if (!usb->devhdl) if (!usb->devhdl)
return SR_ERR; return SR_ERR_BUG;
sr_info("Closing device on %d.%d (logical) / %s (physical) interface %d.", sr_info("Closing device on %d.%d (logical) / %s (physical) interface %d.",
usb->bus, usb->address, sdi->connection_id, USB_INTERFACE); usb->bus, usb->address, sdi->connection_id, USB_INTERFACE);
libusb_release_interface(usb->devhdl, USB_INTERFACE); libusb_release_interface(usb->devhdl, USB_INTERFACE);
libusb_close(usb->devhdl); libusb_close(usb->devhdl);
usb->devhdl = NULL; usb->devhdl = NULL;
sdi->status = SR_ST_INACTIVE;
return SR_OK; return SR_OK;
} }

View File

@ -319,13 +319,12 @@ static int dev_close(struct sr_dev_inst *sdi)
devc = sdi->priv; devc = sdi->priv;
if (devc->ftdic) { if (!devc->ftdic)
ftdi_usb_close(devc->ftdic); return SR_ERR_BUG;
ftdi_free(devc->ftdic);
devc->ftdic = NULL;
}
sdi->status = SR_ST_INACTIVE; ftdi_usb_close(devc->ftdic);
ftdi_free(devc->ftdic);
devc->ftdic = NULL;
return SR_OK; return SR_OK;
} }

View File

@ -438,14 +438,13 @@ static int dev_close(struct sr_dev_inst *sdi)
usb = sdi->conn; usb = sdi->conn;
if (!usb->devhdl) if (!usb->devhdl)
return SR_ERR; return SR_ERR_BUG;
sr_info("fx2lafw: Closing device on %d.%d (logical) / %s (physical) interface %d.", sr_info("fx2lafw: Closing device on %d.%d (logical) / %s (physical) interface %d.",
usb->bus, usb->address, sdi->connection_id, USB_INTERFACE); usb->bus, usb->address, sdi->connection_id, USB_INTERFACE);
libusb_release_interface(usb->devhdl, USB_INTERFACE); libusb_release_interface(usb->devhdl, USB_INTERFACE);
libusb_close(usb->devhdl); libusb_close(usb->devhdl);
usb->devhdl = NULL; usb->devhdl = NULL;
sdi->status = SR_ST_INACTIVE;
return SR_OK; return SR_OK;
} }

View File

@ -334,12 +334,11 @@ static int dev_close(struct sr_dev_inst *sdi)
{ {
struct dev_context *devc; struct dev_context *devc;
std_serial_dev_close(sdi); devc = sdi->priv;
if ((devc = sdi->priv)) devc->model = METRAHIT_NONE;
devc->model = METRAHIT_NONE;
return SR_OK; return std_serial_dev_close(sdi);
} }
static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi, static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi,

View File

@ -106,13 +106,11 @@ static int dev_close(struct sr_dev_inst *sdi)
struct sr_scpi_dev_inst *scpi; struct sr_scpi_dev_inst *scpi;
scpi = sdi->conn; scpi = sdi->conn;
if (scpi) {
if (sr_scpi_close(scpi) < 0)
return SR_ERR;
sdi->status = SR_ST_INACTIVE;
}
return SR_OK; if (!scpi)
return SR_ERR_BUG;
return sr_scpi_close(scpi);
} }
static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi, static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi,

View File

@ -142,11 +142,7 @@ static int dev_open(struct sr_dev_inst *sdi)
static int dev_close(struct sr_dev_inst *sdi) static int dev_close(struct sr_dev_inst *sdi)
{ {
sr_scpi_close(sdi->conn); return sr_scpi_close(sdi->conn);
sdi->status = SR_ST_INACTIVE;
return SR_OK;
} }
static int check_channel_group(struct dev_context *devc, static int check_channel_group(struct dev_context *devc,

View File

@ -219,8 +219,6 @@ static int dev_close(struct sr_dev_inst *sdi)
sr_scpi_close(scpi); sr_scpi_close(scpi);
sdi->status = SR_ST_INACTIVE;
return SR_OK; return SR_OK;
} }

View File

@ -282,8 +282,6 @@ static int dev_close(struct sr_dev_inst *sdi)
ieee1284_release(sdi->conn); ieee1284_release(sdi->conn);
ieee1284_close(sdi->conn); ieee1284_close(sdi->conn);
sdi->status = SR_ST_INACTIVE;
return SR_OK; return SR_OK;
} }

View File

@ -242,13 +242,12 @@ static int dev_close(struct sr_dev_inst *sdi)
usb = sdi->conn; usb = sdi->conn;
if (!usb->devhdl) if (!usb->devhdl)
return SR_OK; return SR_ERR_BUG;
libusb_release_interface(usb->devhdl, USB_INTERFACE); libusb_release_interface(usb->devhdl, USB_INTERFACE);
libusb_close(usb->devhdl); libusb_close(usb->devhdl);
usb->devhdl = NULL; usb->devhdl = NULL;
sdi->status = SR_ST_INACTIVE;
return SR_OK; return SR_OK;
} }

View File

@ -221,8 +221,6 @@ static int dev_close(struct sr_dev_inst *sdi)
devc = sdi->priv; devc = sdi->priv;
sdi->status = SR_ST_INACTIVE;
return scanaplus_close(devc); return scanaplus_close(devc);
} }

View File

@ -183,8 +183,7 @@ static int dev_close(struct sr_dev_inst *sdi)
usb = sdi->conn; usb = sdi->conn;
if (!usb->devhdl) if (!usb->devhdl)
/* Nothing to do. */ return SR_ERR_BUG;
return SR_OK;
/* This allows a frontend to configure the device without ever /* This allows a frontend to configure the device without ever
* doing an acquisition step. */ * doing an acquisition step. */
@ -195,7 +194,6 @@ static int dev_close(struct sr_dev_inst *sdi)
libusb_release_interface(usb->devhdl, USB_INTERFACE); libusb_release_interface(usb->devhdl, USB_INTERFACE);
libusb_close(usb->devhdl); libusb_close(usb->devhdl);
usb->devhdl = NULL; usb->devhdl = NULL;
sdi->status = SR_ST_INACTIVE;
return SR_OK; return SR_OK;
} }

View File

@ -108,13 +108,11 @@ static int dev_close(struct sr_dev_inst *sdi)
usb = sdi->conn; usb = sdi->conn;
if (!usb->devhdl) if (!usb->devhdl)
/* Nothing to do. */ return SR_ERR_BUG;
return SR_OK;
libusb_release_interface(usb->devhdl, LASCAR_INTERFACE); libusb_release_interface(usb->devhdl, LASCAR_INTERFACE);
libusb_close(usb->devhdl); libusb_close(usb->devhdl);
usb->devhdl = NULL; usb->devhdl = NULL;
sdi->status = SR_ST_INACTIVE;
return SR_OK; return SR_OK;
} }

View File

@ -337,15 +337,13 @@ static int dev_close(struct sr_dev_inst *sdi)
} }
if (!usb->devhdl) if (!usb->devhdl)
return SR_ERR; return SR_ERR_BUG;
libusb_release_interface(usb->devhdl, 0); libusb_release_interface(usb->devhdl, 0);
libusb_close(usb->devhdl); libusb_close(usb->devhdl);
usb->devhdl = NULL; usb->devhdl = NULL;
sdi->status = SR_ST_INACTIVE;
return SR_OK; return SR_OK;
} }

View File

@ -146,11 +146,7 @@ static int dev_open(struct sr_dev_inst *sdi)
static int dev_close(struct sr_dev_inst *sdi) static int dev_close(struct sr_dev_inst *sdi)
{ {
sr_scpi_close(sdi->conn); return sr_scpi_close(sdi->conn);
sdi->status = SR_ST_INACTIVE;
return SR_OK;
} }
static int config_get(uint32_t key, GVariant **data, static int config_get(uint32_t key, GVariant **data,

View File

@ -215,23 +215,21 @@ static int dev_close(struct sr_dev_inst *sdi)
modbus = sdi->conn; modbus = sdi->conn;
if (modbus) { if (!modbus)
devc = sdi->priv; return SR_ERR_BUG;
if (devc->expecting_registers) {
/* Wait for the last data that was requested from the device. */
uint16_t registers[devc->expecting_registers];
sr_modbus_read_holding_registers(modbus, -1,
devc->expecting_registers, registers);
}
maynuo_m97_set_bit(modbus, PC1, 0); devc = sdi->priv;
if (sr_modbus_close(modbus) < 0) if (devc->expecting_registers) {
return SR_ERR; /* Wait for the last data that was requested from the device. */
sdi->status = SR_ST_INACTIVE; uint16_t registers[devc->expecting_registers];
sr_modbus_read_holding_registers(modbus, -1,
devc->expecting_registers, registers);
} }
return SR_OK; maynuo_m97_set_bit(modbus, PC1, 0);
return sr_modbus_close(modbus);
} }
static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi, static int config_get(uint32_t key, GVariant **data, const struct sr_dev_inst *sdi,

View File

@ -420,8 +420,6 @@ static int dev_close(struct sr_dev_inst *sdi)
devc = sdi->priv; devc = sdi->priv;
sdi->status = SR_ST_INACTIVE;
return p_ols_close(devc); return p_ols_close(devc);
} }

View File

@ -456,16 +456,13 @@ static int dev_close(struct sr_dev_inst *sdi)
scpi = sdi->conn; scpi = sdi->conn;
devc = sdi->priv; devc = sdi->priv;
if (!scpi)
return SR_ERR_BUG;
if (devc->model->series->protocol == PROTOCOL_V2) if (devc->model->series->protocol == PROTOCOL_V2)
rigol_ds_config_set(sdi, ":KEY:LOCK DISABLE"); rigol_ds_config_set(sdi, ":KEY:LOCK DISABLE");
if (scpi) { return sr_scpi_close(scpi);
if (sr_scpi_close(scpi) < 0)
return SR_ERR;
sdi->status = SR_ST_INACTIVE;
}
return SR_OK;
} }
static int analog_frame_size(const struct sr_dev_inst *sdi) static int analog_frame_size(const struct sr_dev_inst *sdi)

View File

@ -167,11 +167,7 @@ static int dev_open(struct sr_dev_inst *sdi)
static int dev_close(struct sr_dev_inst *sdi) static int dev_close(struct sr_dev_inst *sdi)
{ {
sr_scpi_close(sdi->conn); return sr_scpi_close(sdi->conn);
sdi->status = SR_ST_INACTIVE;
return SR_OK;
} }
static int config_get(uint32_t key, GVariant **data, static int config_get(uint32_t key, GVariant **data,

View File

@ -210,11 +210,7 @@ static int dev_open(struct sr_dev_inst *sdi)
static int dev_close(struct sr_dev_inst *sdi) static int dev_close(struct sr_dev_inst *sdi)
{ {
struct sr_usb_dev_inst *usb = sdi->conn; sr_usb_close(sdi->conn);
sr_usb_close(usb);
sdi->status = SR_ST_INACTIVE;
return SR_OK; return SR_OK;
} }

View File

@ -379,15 +379,15 @@ static int dev_close(struct sr_dev_inst *sdi)
struct sr_usb_dev_inst *usb; struct sr_usb_dev_inst *usb;
usb = sdi->conn; usb = sdi->conn;
if (!usb->devhdl) if (!usb->devhdl)
return SR_ERR; return SR_ERR_BUG;
sr_info("Closing device on %d.%d (logical) / %s (physical) interface %d.", sr_info("Closing device on %d.%d (logical) / %s (physical) interface %d.",
usb->bus, usb->address, sdi->connection_id, USB_INTERFACE); usb->bus, usb->address, sdi->connection_id, USB_INTERFACE);
libusb_release_interface(usb->devhdl, USB_INTERFACE); libusb_release_interface(usb->devhdl, USB_INTERFACE);
libusb_close(usb->devhdl); libusb_close(usb->devhdl);
usb->devhdl = NULL; usb->devhdl = NULL;
sdi->status = SR_ST_INACTIVE;
return SR_OK; return SR_OK;
} }

View File

@ -277,15 +277,15 @@ static int dev_close(struct sr_dev_inst *sdi)
devc = sdi->priv; devc = sdi->priv;
scpi = sdi->conn; scpi = sdi->conn;
if (scpi) {
if (devc->beeper_was_set)
scpi_cmd(sdi, devc->device->commands, SCPI_CMD_BEEPER_ENABLE);
scpi_cmd(sdi, devc->device->commands, SCPI_CMD_LOCAL);
sr_scpi_close(scpi);
sdi->status = SR_ST_INACTIVE;
}
return SR_OK; if (!scpi)
return SR_ERR_BUG;
if (devc->beeper_was_set)
scpi_cmd(sdi, devc->device->commands, SCPI_CMD_BEEPER_ENABLE);
scpi_cmd(sdi, devc->device->commands, SCPI_CMD_LOCAL);
return sr_scpi_close(scpi);
} }
static void clear_helper(void *priv) static void clear_helper(void *priv)

View File

@ -324,8 +324,7 @@ static int dev_open(struct sr_dev_inst *sdi)
return ret; return ret;
} }
/* Shutdown and close device. /* Shutdown and close device. */
*/
static int dev_close(struct sr_dev_inst *sdi) static int dev_close(struct sr_dev_inst *sdi)
{ {
struct dev_context *devc; struct dev_context *devc;
@ -342,17 +341,16 @@ static int dev_close(struct sr_dev_inst *sdi)
return SR_ERR_BUG; return SR_ERR_BUG;
} }
sdi->status = SR_ST_INACTIVE;
/* Download of the shutdown bitstream, if any. */ /* Download of the shutdown bitstream, if any. */
ret = (*devc->model->apply_fpga_config)(sdi); ret = (*devc->model->apply_fpga_config)(sdi);
if (ret != SR_OK) if (ret != SR_OK)
sr_warn("Unable to shut down device."); sr_warn("Unable to shut down device.");
libusb_release_interface(usb->devhdl, USB_INTERFACE); libusb_release_interface(usb->devhdl, USB_INTERFACE);
sr_usb_close(usb); sr_usb_close(usb);
return ret; return SR_OK;
} }
/* Check whether the device options contain a specific key. /* Check whether the device options contain a specific key.

View File

@ -171,14 +171,13 @@ static int dev_close(struct sr_dev_inst *sdi)
struct sr_usb_dev_inst *usb; struct sr_usb_dev_inst *usb;
usb = sdi->conn; usb = sdi->conn;
if (!usb->devhdl) if (!usb->devhdl)
/* Nothing to do. */ return SR_ERR_BUG;
return SR_OK;
libusb_release_interface(usb->devhdl, 0); libusb_release_interface(usb->devhdl, 0);
libusb_close(usb->devhdl); libusb_close(usb->devhdl);
usb->devhdl = NULL; usb->devhdl = NULL;
sdi->status = SR_ST_INACTIVE;
return SR_OK; return SR_OK;
} }

View File

@ -108,9 +108,9 @@ static int dev_open(struct sr_dev_inst *sdi)
static int dev_close(struct sr_dev_inst *sdi) static int dev_close(struct sr_dev_inst *sdi)
{ {
/* TODO */ (void)sdi;
sdi->status = SR_ST_INACTIVE; /* TODO */
return SR_OK; return SR_OK;
} }

View File

@ -136,14 +136,13 @@ static int dev_close(struct sr_dev_inst *sdi)
struct sr_usb_dev_inst *usb; struct sr_usb_dev_inst *usb;
usb = sdi->conn; usb = sdi->conn;
if (!usb->devhdl) if (!usb->devhdl)
/* Nothing to do. */ return SR_ERR_BUG;
return SR_OK;
libusb_release_interface(usb->devhdl, USB_INTERFACE); libusb_release_interface(usb->devhdl, USB_INTERFACE);
libusb_close(usb->devhdl); libusb_close(usb->devhdl);
usb->devhdl = NULL; usb->devhdl = NULL;
sdi->status = SR_ST_INACTIVE;
return SR_OK; return SR_OK;
} }

View File

@ -131,13 +131,11 @@ static int dev_close(struct sr_dev_inst *sdi)
usb = sdi->conn; usb = sdi->conn;
if (!usb->devhdl) if (!usb->devhdl)
/* Nothing to do. */ return SR_ERR_BUG;
return SR_OK;
libusb_release_interface(usb->devhdl, VICTOR_INTERFACE); libusb_release_interface(usb->devhdl, VICTOR_INTERFACE);
libusb_close(usb->devhdl); libusb_close(usb->devhdl);
usb->devhdl = NULL; usb->devhdl = NULL;
sdi->status = SR_ST_INACTIVE;
return SR_OK; return SR_OK;
} }

View File

@ -152,11 +152,7 @@ static int dev_open(struct sr_dev_inst *sdi)
static int dev_close(struct sr_dev_inst *sdi) static int dev_close(struct sr_dev_inst *sdi)
{ {
sr_scpi_close(sdi->conn); return sr_scpi_close(sdi->conn);
sdi->status = SR_ST_INACTIVE;
return SR_OK;
} }
/** /**

View File

@ -319,7 +319,7 @@ static int dev_close(struct sr_dev_inst *sdi)
usb = sdi->conn; usb = sdi->conn;
if (!usb->devhdl) if (!usb->devhdl)
return SR_ERR; return SR_ERR_BUG;
sr_info("Closing device on %d.%d (logical) / %s (physical) interface %d.", sr_info("Closing device on %d.%d (logical) / %s (physical) interface %d.",
usb->bus, usb->address, sdi->connection_id, USB_INTERFACE); usb->bus, usb->address, sdi->connection_id, USB_INTERFACE);
@ -327,7 +327,6 @@ static int dev_close(struct sr_dev_inst *sdi)
libusb_reset_device(usb->devhdl); libusb_reset_device(usb->devhdl);
libusb_close(usb->devhdl); libusb_close(usb->devhdl);
usb->devhdl = NULL; usb->devhdl = NULL;
sdi->status = SR_ST_INACTIVE;
return SR_OK; return SR_OK;
} }

View File

@ -174,27 +174,20 @@ SR_PRIV int std_serial_dev_open(struct sr_dev_inst *sdi)
* This function can be used to implement the dev_close() driver API * This function can be used to implement the dev_close() driver API
* callback in drivers that use a serial port. * callback in drivers that use a serial port.
* *
* After closing the port, the status field of the given sdi is set
* to SR_ST_INACTIVE.
*
* @retval SR_OK Success. * @retval SR_OK Success.
* @retval SR_ERR_ARG Invalid arguments. * @retval SR_ERR_ARG Invalid arguments.
* @retval SR_ERR Serial port close failed.
*/ */
SR_PRIV int std_serial_dev_close(struct sr_dev_inst *sdi) SR_PRIV int std_serial_dev_close(struct sr_dev_inst *sdi)
{ {
struct sr_serial_dev_inst *serial; struct sr_serial_dev_inst *serial;
sdi->status = SR_ST_INACTIVE; if (!sdi || !sdi->conn)
return SR_ERR_ARG;
serial = sdi->conn; serial = sdi->conn;
if (!serial) {
sr_err("%s: Can't close invalid serial port.", sdi->driver->name);
return SR_ERR_ARG;
}
serial_close(serial); return serial_close(serial);
return SR_OK;
} }
/** /**