Changeset ac307b2 in mainline for uspace/srv
- Timestamp:
- 2017-11-25T11:12:23Z (8 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 98cb5e0d
- Parents:
- f571ca49 (diff), 0851a3d (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - Location:
- uspace/srv
- Files:
-
- 9 edited
-
hid/input/input.c (modified) (5 diffs)
-
hid/input/port/chardev.c (modified) (6 diffs)
-
hid/input/serial.h (modified) (2 diffs)
-
hid/isdv4_tablet/isdv4.c (modified) (8 diffs)
-
hid/isdv4_tablet/isdv4.h (modified) (3 diffs)
-
hid/output/port/chardev.c (modified) (4 diffs)
-
hw/char/s3c24xx_uart/s3c24xx_uart.c (modified) (9 diffs)
-
hw/char/s3c24xx_uart/s3c24xx_uart.h (modified) (3 diffs)
-
net/slip/slip.c (modified) (13 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/hid/input/input.c
rf571ca49 rac307b2 37 37 */ 38 38 39 #include <adt/fifo.h> 39 40 #include <adt/list.h> 40 #include <stdbool.h> 41 #include <async.h> 42 #include <config.h> 43 #include <errno.h> 44 #include <fibril.h> 41 45 #include <fibril_synch.h> 46 #include <io/chardev.h> 47 #include <io/console.h> 48 #include <io/keycode.h> 42 49 #include <ipc/services.h> 43 50 #include <ipc/input.h> 44 #include <config.h> 51 #include <loc.h> 52 #include <ns.h> 53 #include <stdbool.h> 45 54 #include <stdio.h> 46 55 #include <stdlib.h> 47 #include <ns.h>48 #include <async.h>49 #include <errno.h>50 #include <adt/fifo.h>51 #include <io/console.h>52 #include <io/keycode.h>53 #include <loc.h>54 56 #include <str_error.h> 55 #include <char_dev_iface.h> 56 #include <fibril.h> 57 #include "layout.h" 57 58 #include "input.h" 58 59 #include "kbd.h" 59 60 #include "kbd_port.h" 60 61 #include "kbd_ctl.h" 62 #include "layout.h" 61 63 #include "mouse.h" 62 64 #include "mouse_proto.h" 63 65 #include "serial.h" 64 #include "input.h"65 66 66 67 #define NUM_LAYOUTS 4 … … 536 537 while (true) { 537 538 uint8_t data; 538 539 char_dev_read(sdev->sess, &data, sizeof(data)); 539 size_t nread; 540 541 chardev_read(sdev->chardev, &data, sizeof(data), &nread); 542 /* XXX Handle error */ 540 543 kbd_push_data(sdev->kdev, data); 541 544 } … … 552 555 { 553 556 bool match = false; 557 int rc; 554 558 555 559 serial_dev_t *sdev = serial_dev_new(); … … 559 563 sdev->kdev->svc_id = service_id; 560 564 561 intrc = loc_service_get_name(service_id, &sdev->kdev->svc_name);565 rc = loc_service_get_name(service_id, &sdev->kdev->svc_name); 562 566 if (rc != EOK) 563 567 goto fail; … … 582 586 sdev->sess = loc_service_connect(service_id, INTERFACE_DDF, 583 587 IPC_FLAG_BLOCKING); 588 589 rc = chardev_open(sdev->sess, &sdev->chardev); 590 if (rc != EOK) { 591 async_hangup(sdev->sess); 592 sdev->sess = NULL; 593 list_remove(&sdev->link); 594 goto fail; 595 } 584 596 585 597 fid_t fid = fibril_create(serial_consumer, sdev); -
uspace/srv/hid/input/port/chardev.c
rf571ca49 rac307b2 35 35 */ 36 36 37 #include <ipc/char.h>38 37 #include <async.h> 38 #include <errno.h> 39 #include <fibril.h> 40 #include <io/chardev.h> 39 41 #include <loc.h> 40 #include <errno.h>41 42 #include <stdio.h> 42 43 #include "../input.h" … … 44 45 #include "../kbd.h" 45 46 46 static void kbd_port_events(ipc_callid_t iid, ipc_call_t *icall, void *arg);47 static int kbd_port_fibril(void *); 47 48 48 49 static int chardev_port_init(kbd_dev_t *); 49 static void chardev_port_write(uint8_t data);50 static void chardev_port_write(uint8_t); 50 51 51 52 kbd_port_ops_t chardev_port = { … … 56 57 static kbd_dev_t *kbd_dev; 57 58 static async_sess_t *dev_sess; 59 static chardev_t *chardev; 58 60 59 61 /** List of devices to try connecting to. */ … … 70 72 { 71 73 service_id_t service_id; 72 async_exch_t *exch;73 74 unsigned int i; 75 fid_t fid; 74 76 int rc; 75 77 … … 96 98 } 97 99 98 exch = async_exchange_begin(dev_sess);99 if ( exch == NULL) {100 printf("%s: Failed starting exchange withdevice\n", NAME);100 rc = chardev_open(dev_sess, &chardev); 101 if (rc != EOK) { 102 printf("%s: Failed opening character device\n", NAME); 101 103 async_hangup(dev_sess); 102 104 return ENOMEM; 103 105 } 104 106 105 port_id_t port; 106 rc = async_create_callback_port(exch, INTERFACE_CHAR_CB, 0, 0, 107 kbd_port_events, NULL, &port); 108 109 async_exchange_end(exch); 110 111 if (rc != 0) { 112 printf("%s: Failed to create callback from device\n", NAME); 107 fid = fibril_create(kbd_port_fibril, NULL); 108 if (fid == 0) { 109 printf("%s: Failed creating fibril\n", NAME); 110 chardev_close(chardev); 113 111 async_hangup(dev_sess); 114 return -1;112 return ENOMEM; 115 113 } 114 115 fibril_add_ready(fid); 116 116 117 117 printf("%s: Found input device '%s'\n", NAME, in_devs[i]); … … 121 121 static void chardev_port_write(uint8_t data) 122 122 { 123 async_exch_t *exch = async_exchange_begin(dev_sess); 124 if (exch == NULL) { 125 printf("%s: Failed starting exchange with device\n", NAME); 123 int rc; 124 size_t nwr; 125 126 rc = chardev_write(chardev, &data, sizeof(data), &nwr); 127 if (rc != EOK || nwr != sizeof(data)) { 128 printf("%s: Failed writing to character device\n", NAME); 126 129 return; 127 }128 129 async_msg_1(exch, CHAR_WRITE_BYTE, data);130 async_exchange_end(exch);131 }132 133 static void kbd_port_events(ipc_callid_t iid, ipc_call_t *icall, void *arg)134 {135 /* Ignore parameters, the connection is already opened */136 while (true) {137 138 ipc_call_t call;139 ipc_callid_t callid = async_get_call(&call);140 141 if (!IPC_GET_IMETHOD(call)) {142 /* TODO: Handle hangup */143 return;144 }145 146 int retval = EOK;147 148 switch (IPC_GET_IMETHOD(call)) {149 case CHAR_NOTIF_BYTE:150 kbd_push_data(kbd_dev, IPC_GET_ARG1(call));151 break;152 default:153 retval = ENOENT;154 }155 async_answer_0(callid, retval);156 130 } 157 131 } 158 132 133 static int kbd_port_fibril(void *arg) 134 { 135 int rc; 136 size_t nread; 137 uint8_t b; 138 139 while (true) { 140 rc = chardev_read(chardev, &b, sizeof(b), &nread); 141 if (rc != EOK || nread != sizeof(b)) { 142 printf("%s: Error reading data", NAME); 143 continue; 144 } 145 146 kbd_push_data(kbd_dev, b); 147 } 148 149 return 0; 150 } 159 151 160 152 /** -
uspace/srv/hid/input/serial.h
rf571ca49 rac307b2 39 39 40 40 #include <async.h> 41 #include <io/chardev.h> 41 42 #include "kbd.h" 42 43 … … 45 46 link_t link; 46 47 async_sess_t *sess; 48 chardev_t *chardev; 47 49 } serial_dev_t; 48 50 -
uspace/srv/hid/isdv4_tablet/isdv4.c
rf571ca49 rac307b2 27 27 */ 28 28 29 #include <char_dev_iface.h>30 29 #include <errno.h> 30 #include <io/chardev.h> 31 #include <mem.h> 31 32 #include <stdbool.h> 32 33 #include <stdint.h> 33 34 #include <stdlib.h> 34 #include <mem.h>35 35 #include <thread.h> 36 36 … … 298 298 bool reading = true; 299 299 while (reading) { 300 ssize_t read = char_dev_read(state->sess, state->buf + state->buf_end, 301 state->buf_size - state->buf_end); 302 if (read < 0) 300 size_t nread; 301 int rc; 302 303 rc = chardev_read(state->chardev, state->buf + state->buf_end, 304 state->buf_size - state->buf_end, &nread); 305 if (rc != EOK && nread == 0) 303 306 return EIO; 304 state->buf_end += read;307 state->buf_end += nread; 305 308 306 309 size_t i = 0; … … 357 360 return EOK; 358 361 } 359 static bool write_command(async_sess_t *sess, uint8_t command) 360 { 361 return char_dev_write(sess, &command, 1) == 1; 362 363 static bool write_command(chardev_t *chardev, uint8_t command) 364 { 365 int rc; 366 size_t nwr; 367 368 rc = chardev_write(chardev, &command, 1, &nwr); 369 return rc == EOK; 362 370 } 363 371 … … 365 373 isdv4_event_fn event_fn) 366 374 { 375 chardev_t *chardev; 376 int rc; 377 378 rc = chardev_open(sess, &chardev); 379 if (rc != EOK) 380 return rc; 381 367 382 memset(state, 0, sizeof(isdv4_state_t)); 383 368 384 state->sess = sess; 385 state->chardev = chardev; 386 369 387 state->buf = malloc(BUF_SIZE); 370 if (state->buf == NULL) 388 if (state->buf == NULL) { 389 chardev_close(chardev); 371 390 return ENOMEM; 391 } 392 372 393 state->buf_size = BUF_SIZE; 373 394 state->emit_event_fn = event_fn; … … 377 398 int isdv4_init_tablet(isdv4_state_t *state) 378 399 { 379 if (!write_command(state-> sess, CMD_STOP))400 if (!write_command(state->chardev, CMD_STOP)) 380 401 return EIO; 381 402 … … 383 404 384 405 // FIXME: Read all possible garbage before sending commands 385 if (!write_command(state-> sess, CMD_QUERY_STYLUS))406 if (!write_command(state->chardev, CMD_QUERY_STYLUS)) 386 407 return EIO; 387 408 … … 390 411 return rc; 391 412 392 if (!write_command(state-> sess, CMD_QUERY_TOUCH))413 if (!write_command(state->chardev, CMD_QUERY_TOUCH)) 393 414 return EIO; 394 415 … … 397 418 return rc; 398 419 399 if (!write_command(state-> sess, CMD_START))420 if (!write_command(state->chardev, CMD_START)) 400 421 return EIO; 401 422 -
uspace/srv/hid/isdv4_tablet/isdv4.h
rf571ca49 rac307b2 31 31 32 32 #include <async.h> 33 #include <io/chardev.h> 33 34 34 35 typedef struct isdv4_event isdv4_event_t; … … 58 59 bool finger1_pressed; /* Reported as touch button 1 */ 59 60 60 /* Session tothe serial device */61 /** Session with the serial device */ 61 62 async_sess_t *sess; 63 /** Character device */ 64 chardev_t *chardev; 62 65 63 66 /* Receive buffer state */ … … 66 69 size_t buf_end; 67 70 68 /* Callbacks */71 /** Callbacks */ 69 72 isdv4_event_fn emit_event_fn; 70 73 } isdv4_state_t; -
uspace/srv/hid/output/port/chardev.c
rf571ca49 rac307b2 30 30 */ 31 31 32 #include <async.h> 33 #include <config.h> 34 #include <errno.h> 35 #include <fibril_synch.h> 36 #include <io/chardev.h> 37 #include <loc.h> 32 38 #include <stddef.h> 33 39 #include <stdint.h> 34 #include <char_dev_iface.h>35 40 #include <stdio.h> 36 41 #include <stdlib.h> 37 #include <async.h>38 #include <fibril_synch.h>39 #include <loc.h>40 #include <errno.h>41 42 #include <str.h> 42 #include <config.h>43 43 #include "../ctl/serial.h" 44 44 #include "../output.h" … … 48 48 49 49 static async_sess_t *sess; 50 static chardev_t *chardev; 50 51 static service_id_t serial_cat_id; 51 52 … … 57 58 { 58 59 uint8_t byte = (uint8_t) ch; 59 char_dev_write(sess, &byte, 1); 60 size_t nwr; 61 chardev_write(chardev, &byte, 1, &nwr); 62 /* XXX Handle error */ 60 63 } 61 64 62 65 static void chardev_control_puts(const char *str) 63 66 { 64 char_dev_write(sess, (void *) str, str_size(str)); 67 size_t nwr; 68 chardev_write(chardev, (void *) str, str_size(str), &nwr); 69 /* XXX Handle error */ 65 70 } 66 71 … … 126 131 return; 127 132 } 133 134 rc = chardev_open(sess, &chardev); 135 if (rc != EOK) { 136 fibril_mutex_unlock(&discovery_lock); 137 printf("%s: Failed opening character device\n", NAME); 138 return; 139 } 140 128 141 serial_init(chardev_putchar, chardev_control_puts); 129 142 -
uspace/srv/hw/char/s3c24xx_uart/s3c24xx_uart.c
rf571ca49 rac307b2 27 27 */ 28 28 29 /** @addtogroup driver_serial30 * @{31 */32 29 /** 33 30 * @file … … 37 34 */ 38 35 36 #include <async.h> 39 37 #include <ddi.h> 38 #include <errno.h> 39 #include <inttypes.h> 40 #include <io/chardev_srv.h> 40 41 #include <loc.h> 41 #include <ipc/char.h>42 #include <async.h>43 42 #include <stdio.h> 44 43 #include <stdlib.h> 45 44 #include <sysinfo.h> 46 #include <errno.h>47 #include <inttypes.h>48 45 #include "s3c24xx_uart.h" 49 46 … … 72 69 static void s3c24xx_uart_sendb(s3c24xx_uart_t *, uint8_t); 73 70 71 static int s3c24xx_uart_read(chardev_srv_t *, void *, size_t, size_t *); 72 static int s3c24xx_uart_write(chardev_srv_t *, const void *, size_t, size_t *); 73 74 static chardev_ops_t s3c24xx_uart_chardev_ops = { 75 .read = s3c24xx_uart_read, 76 .write = s3c24xx_uart_write 77 }; 78 74 79 int main(int argc, char *argv[]) 75 80 { 76 81 printf("%s: S3C24xx on-chip UART driver\n", NAME); 77 82 78 async_set_fallback_port_handler(s3c24xx_uart_connection, NULL);83 async_set_fallback_port_handler(s3c24xx_uart_connection, uart); 79 84 int rc = loc_server_register(NAME); 80 85 if (rc != EOK) { … … 111 116 void *arg) 112 117 { 113 /* Answer the IPC_M_CONNECT_ME_TO call. */ 114 async_answer_0(iid, EOK); 115 116 while (true) { 117 ipc_call_t call; 118 ipc_callid_t callid = async_get_call(&call); 119 sysarg_t method = IPC_GET_IMETHOD(call); 120 121 if (!method) { 122 /* The other side has hung up. */ 123 async_answer_0(callid, EOK); 124 return; 125 } 126 127 async_sess_t *sess = 128 async_callback_receive_start(EXCHANGE_SERIALIZE, &call); 129 if (sess != NULL) { 130 if (uart->client_sess == NULL) { 131 uart->client_sess = sess; 132 async_answer_0(callid, EOK); 133 } else 134 async_answer_0(callid, ELIMIT); 135 } else { 136 switch (method) { 137 case CHAR_WRITE_BYTE: 138 printf(NAME ": write %" PRIun " to device\n", 139 IPC_GET_ARG1(call)); 140 s3c24xx_uart_sendb(uart, (uint8_t) IPC_GET_ARG1(call)); 141 async_answer_0(callid, EOK); 142 break; 143 default: 144 async_answer_0(callid, EINVAL); 145 } 146 } 147 } 148 } 118 s3c24xx_uart_t *uart = (s3c24xx_uart_t *) arg; 119 120 chardev_conn(iid, icall, &uart->cds); 121 } 122 149 123 150 124 static void s3c24xx_uart_irq_handler(ipc_callid_t iid, ipc_call_t *call, 151 125 void *arg) 152 126 { 127 int rc; 128 153 129 (void) iid; 154 130 (void) call; … … 159 135 uint32_t status = pio_read_32(&uart->io->uerstat); 160 136 161 if (uart->client_sess != NULL) { 162 async_exch_t *exch = async_exchange_begin(uart->client_sess); 163 async_msg_1(exch, CHAR_NOTIF_BYTE, data); 164 async_exchange_end(exch); 165 } 137 fibril_mutex_lock(&uart->buf_lock); 138 139 rc = circ_buf_push(&uart->cbuf, &data); 140 if (rc != EOK) 141 printf(NAME ": Buffer overrun\n"); 142 143 fibril_mutex_unlock(&uart->buf_lock); 144 fibril_condvar_broadcast(&uart->buf_cv); 166 145 167 146 if (status != 0) … … 176 155 sysarg_t inr; 177 156 157 circ_buf_init(&uart->cbuf, uart->buf, s3c24xx_uart_buf_size, 1); 158 fibril_mutex_initialize(&uart->buf_lock); 159 fibril_condvar_initialize(&uart->buf_cv); 160 178 161 if (sysinfo_get_value("s3c24xx_uart.address.physical", 179 162 &uart->paddr) != EOK) … … 188 171 189 172 uart->io = vaddr; 190 uart->client_sess = NULL;191 173 192 174 printf(NAME ": device at physical address %p, inr %" PRIun ".\n", … … 203 185 pio_read_32(&uart->io->ucon) & ~UCON_RX_INT_LEVEL); 204 186 187 chardev_srvs_init(&uart->cds); 188 uart->cds.ops = &s3c24xx_uart_chardev_ops; 189 uart->cds.sarg = uart; 190 205 191 return EOK; 206 192 } … … 216 202 } 217 203 204 static int s3c24xx_uart_read(chardev_srv_t *srv, void *buf, size_t size, 205 size_t *nread) 206 { 207 s3c24xx_uart_t *uart = (s3c24xx_uart_t *) srv->srvs->sarg; 208 size_t p; 209 uint8_t *bp = (uint8_t *) buf; 210 int rc; 211 212 fibril_mutex_lock(&uart->buf_lock); 213 214 while (circ_buf_nused(&uart->cbuf) == 0) 215 fibril_condvar_wait(&uart->buf_cv, &uart->buf_lock); 216 217 p = 0; 218 while (p < size) { 219 rc = circ_buf_pop(&uart->cbuf, &bp[p]); 220 if (rc != EOK) 221 break; 222 ++p; 223 } 224 225 fibril_mutex_unlock(&uart->buf_lock); 226 227 *nread = p; 228 return EOK; 229 } 230 231 static int s3c24xx_uart_write(chardev_srv_t *srv, const void *data, size_t size, 232 size_t *nwr) 233 { 234 s3c24xx_uart_t *uart = (s3c24xx_uart_t *) srv->srvs->sarg; 235 size_t i; 236 uint8_t *dp = (uint8_t *) data; 237 238 for (i = 0; i < size; i++) 239 s3c24xx_uart_sendb(uart, dp[i]); 240 241 *nwr = size; 242 return EOK; 243 } 244 245 218 246 /** @} 219 247 */ -
uspace/srv/hw/char/s3c24xx_uart/s3c24xx_uart.h
rf571ca49 rac307b2 38 38 #define S3C24XX_UART_H_ 39 39 40 #include <adt/circ_buf.h> 41 #include <async.h> 42 #include <fibril_synch.h> 43 #include <io/chardev_srv.h> 40 44 #include <stdint.h> 41 #include <async.h>42 45 43 46 /** S3C24xx UART I/O */ … … 76 79 #define UFCON_FIFO_ENABLE 0x01 77 80 81 enum { 82 s3c24xx_uart_buf_size = 64 83 }; 78 84 79 85 /** S3C24xx UART instance */ … … 85 91 s3c24xx_uart_io_t *io; 86 92 87 /** C allback session to the client*/88 async_sess_t *client_sess;93 /** Character device service */ 94 chardev_srvs_t cds; 89 95 90 96 /** Service ID */ 91 97 service_id_t service_id; 98 99 /** Circular buffer */ 100 circ_buf_t cbuf; 101 /** Buffer */ 102 uint8_t buf[s3c24xx_uart_buf_size]; 103 /** Buffer lock */ 104 fibril_mutex_t buf_lock; 105 /** Signal newly added data in buffer */ 106 fibril_condvar_t buf_cv; 92 107 } s3c24xx_uart_t; 93 108 -
uspace/srv/net/slip/slip.c
rf571ca49 rac307b2 40 40 #include <inet/addr.h> 41 41 #include <inet/iplink_srv.h> 42 #include < char_dev_iface.h>42 #include <io/chardev.h> 43 43 #include <io/log.h> 44 44 #include <errno.h> … … 96 96 } 97 97 98 static void write_flush( async_sess_t *sess)98 static void write_flush(chardev_t *chardev) 99 99 { 100 100 size_t written = 0; 101 101 102 102 while (slip_send_pending > 0) { 103 ssize_t size; 104 105 size = char_dev_write(sess, &slip_send_buf[written], 106 slip_send_pending); 107 if (size < 0) { 103 int rc; 104 size_t nwr; 105 106 rc = chardev_write(chardev, &slip_send_buf[written], 107 slip_send_pending, &nwr); 108 if (rc != EOK) { 108 109 log_msg(LOG_DEFAULT, LVL_ERROR, 109 "char_dev_write() returned %d", 110 (int) size); 110 "chardev_write() returned %d", rc); 111 111 slip_send_pending = 0; 112 112 break; 113 113 } 114 written += size;115 slip_send_pending -= size;116 } 117 } 118 119 static void write_buffered( async_sess_t *sess, uint8_t ch)114 written += nwr; 115 slip_send_pending -= nwr; 116 } 117 } 118 119 static void write_buffered(chardev_t *chardev, uint8_t ch) 120 120 { 121 121 if (slip_send_pending == sizeof(slip_send_buf)) 122 write_flush( sess);122 write_flush(chardev); 123 123 slip_send_buf[slip_send_pending++] = ch; 124 124 } … … 128 128 log_msg(LOG_DEFAULT, LVL_DEBUG, "slip_send()"); 129 129 130 async_sess_t *sess = (async_sess_t *) srv->arg;130 chardev_t *chardev = (chardev_t *) srv->arg; 131 131 uint8_t *data = sdu->data; 132 132 … … 136 136 * measure for dealing with previous possible noise on the line. 137 137 */ 138 write_buffered( sess, SLIP_END);138 write_buffered(chardev, SLIP_END); 139 139 140 140 for (size_t i = 0; i < sdu->size; i++) { 141 141 switch (data[i]) { 142 142 case SLIP_END: 143 write_buffered( sess, SLIP_ESC);144 write_buffered( sess, SLIP_ESC_END);143 write_buffered(chardev, SLIP_ESC); 144 write_buffered(chardev, SLIP_ESC_END); 145 145 break; 146 146 case SLIP_ESC: 147 write_buffered( sess, SLIP_ESC);148 write_buffered( sess, SLIP_ESC_ESC);147 write_buffered(chardev, SLIP_ESC); 148 write_buffered(chardev, SLIP_ESC_ESC); 149 149 break; 150 150 default: 151 write_buffered( sess, data[i]);151 write_buffered(chardev, data[i]); 152 152 break; 153 153 } 154 154 } 155 155 156 write_buffered( sess, SLIP_END);157 write_flush( sess);156 write_buffered(chardev, SLIP_END); 157 write_flush(chardev); 158 158 159 159 return EOK; … … 203 203 } 204 204 205 static uint8_t read_buffered( async_sess_t *sess)205 static uint8_t read_buffered(chardev_t *chardev) 206 206 { 207 207 while (slip_recv_pending == 0) { 208 ssize_t size; 209 210 size = char_dev_read(sess, slip_recv_buf, 211 sizeof(slip_recv_buf)); 212 if (size < 0) { 208 int rc; 209 size_t nread; 210 211 rc = chardev_read(chardev, slip_recv_buf, 212 sizeof(slip_recv_buf), &nread); 213 if (rc != EOK) { 213 214 log_msg(LOG_DEFAULT, LVL_ERROR, 214 "char_dev_read() returned %d", (int) size); 215 "char_dev_read() returned %d", rc); 216 } 217 218 if (nread == 0) 215 219 return SLIP_END; 216 } 217 slip_recv_pending = size;220 221 slip_recv_pending = nread; 218 222 slip_recv_read = 0; 219 223 } … … 224 228 static int slip_recv_fibril(void *arg) 225 229 { 226 async_sess_t *sess = (async_sess_t *) arg;230 chardev_t *chardev = (chardev_t *) arg; 227 231 static uint8_t recv_final[SLIP_MTU]; 228 232 iplink_recv_sdu_t sdu; … … 234 238 while (true) { 235 239 for (sdu.size = 0; sdu.size < sizeof(recv_final); /**/) { 236 ch = read_buffered( sess);240 ch = read_buffered(chardev); 237 241 switch (ch) { 238 242 case SLIP_END: … … 246 250 247 251 case SLIP_ESC: 248 ch = read_buffered( sess);252 ch = read_buffered(chardev); 249 253 if (ch == SLIP_ESC_END) { 250 254 recv_final[sdu.size++] = SLIP_END; 251 255 break; 252 } else if (ch == SLIP_ESC_ESC) {256 } else if (ch == SLIP_ESC_ESC) { 253 257 recv_final[sdu.size++] = SLIP_ESC; 254 258 break; … … 295 299 async_sess_t *sess_in = NULL; 296 300 async_sess_t *sess_out = NULL; 301 chardev_t *chardev_in = NULL; 302 chardev_t *chardev_out = NULL; 297 303 fid_t fid; 298 304 int rc; … … 336 342 return ENOENT; 337 343 } 338 slip_iplink.arg = sess_out; 344 345 rc = chardev_open(sess_out, &chardev_out); 346 if (rc != EOK) { 347 log_msg(LOG_DEFAULT, LVL_ERROR, 348 "Failed opening character device."); 349 return ENOENT; 350 } 351 352 slip_iplink.arg = chardev_out; 339 353 340 354 sess_in = loc_service_connect(svcid, INTERFACE_DDF, 0); … … 347 361 } 348 362 363 rc = chardev_open(sess_in, &chardev_in); 364 if (rc != EOK) { 365 log_msg(LOG_DEFAULT, LVL_ERROR, 366 "Failed opening character device."); 367 return ENOENT; 368 } 369 349 370 rc = loc_service_register(linkstr, &linksid); 350 371 if (rc != EOK) { … … 363 384 } 364 385 365 fid = fibril_create(slip_recv_fibril, sess_in);386 fid = fibril_create(slip_recv_fibril, chardev_in); 366 387 if (!fid) { 367 388 log_msg(LOG_DEFAULT, LVL_ERROR, … … 375 396 376 397 fail: 398 chardev_close(chardev_out); 377 399 if (sess_out) 378 400 async_hangup(sess_out); 401 chardev_close(chardev_in); 379 402 if (sess_in) 380 403 async_hangup(sess_in);
Note:
See TracChangeset
for help on using the changeset viewer.
