serial: Add non-fileio interface to serial binding
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Change-Id: I86d04368bdb5b2348f947717c1806cbbbdd29b17
diff --git a/libmctp-serial.h b/libmctp-serial.h
index 994173d..5504864 100644
--- a/libmctp-serial.h
+++ b/libmctp-serial.h
@@ -12,14 +12,24 @@
struct mctp_binding_serial;
struct mctp_binding_serial *mctp_serial_init(void);
-int mctp_serial_get_fd(struct mctp_binding_serial *serial);
+
void mctp_serial_register_bus(struct mctp_binding_serial *serial,
struct mctp *mctp, mctp_eid_t eid);
+
+/* file-based IO */
+int mctp_serial_get_fd(struct mctp_binding_serial *serial);
int mctp_serial_read(struct mctp_binding_serial *serial);
int mctp_serial_open_path(struct mctp_binding_serial *serial,
const char *path);
void mctp_serial_open_fd(struct mctp_binding_serial *serial, int fd);
+/* direct function call IO */
+typedef int (*mctp_serial_tx_fn)(void *data, void *buf, size_t len);
+void mctp_serial_set_tx_fn(struct mctp_binding_serial *serial,
+ mctp_serial_tx_fn fn, void *data);
+int mctp_serial_rx(struct mctp_binding_serial *serial,
+ const void *buf, size_t len);
+
#ifdef __cplusplus
}
#endif
diff --git a/serial.c b/serial.c
index 081538f..f673a52 100644
--- a/serial.c
+++ b/serial.c
@@ -12,6 +12,11 @@
#ifdef MCTP_HAVE_FILEIO
#include <fcntl.h>
+#else
+static const size_t write(int fd, void *buf, size_t len)
+{
+ return -1;
+}
#endif
#define pr_fmt(x) "serial: " x
@@ -26,6 +31,9 @@
int fd;
unsigned long bus_id;
+ mctp_serial_tx_fn tx_fn;
+ void *tx_fn_data;
+
/* receive buffer and state */
uint8_t rxbuf[1024];
struct mctp_pktbuf *rx_pkt;
@@ -129,7 +137,12 @@
tlr->fcs_msb = 0;
tlr->fcs_lsb = 0;
- write(serial->fd, serial->txbuf, sizeof(*hdr) + len + sizeof(*tlr));
+ len += sizeof(*hdr) + sizeof(*tlr);
+
+ if (serial->tx_fn)
+ serial->tx_fn(serial->tx_fn_data, serial->txbuf, len);
+ else
+ write(serial->fd, serial->txbuf, len);
return 0;
}
@@ -237,8 +250,8 @@
mctp_prdebug(" -> state: %d", serial->rx_state);
}
-static void __attribute__((used)) mctp_rx_consume(struct mctp_binding_serial *serial,
- void *buf, size_t len)
+static void mctp_rx_consume(struct mctp_binding_serial *serial,
+ const void *buf, size_t len)
{
size_t i;
@@ -286,6 +299,19 @@
}
#endif
+void mctp_serial_set_tx_fn(struct mctp_binding_serial *serial,
+ mctp_serial_tx_fn fn, void *data)
+{
+ serial->tx_fn = fn;
+ serial->tx_fn_data = data;
+}
+
+int mctp_serial_rx(struct mctp_binding_serial *serial,
+ const void *buf, size_t len)
+{
+ mctp_rx_consume(serial, buf, len);
+}
+
void mctp_serial_register_bus(struct mctp_binding_serial *serial,
struct mctp *mctp, mctp_eid_t eid)
{