Changes in uspace/drv/ns8250/ns8250.c [af6b5157:228e490] in mainline
- File:
-
- 1 edited
-
uspace/drv/ns8250/ns8250.c (modified) (37 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/ns8250/ns8250.c
raf6b5157 r228e490 1 1 /* 2 2 * Copyright (c) 2010 Lenka Trochtova 3 * Copyright (c) 2011 Jiri Svoboda4 3 * All rights reserved. 5 4 * … … 53 52 #include <libarch/ddi.h> 54 53 55 #include <d df/driver.h>56 #include < ddf/interrupt.h>57 #include < ops/char_dev.h>54 #include <driver.h> 55 #include <char.h> 56 #include <resource.h> 58 57 59 58 #include <devman.h> … … 69 68 #define MAX_BAUD_RATE 115200 70 69 #define DLAB_MASK (1 << 7) 71 72 /** Obtain soft-state structure from function node */73 #define NS8250(fnode) ((ns8250_t *) ((fnode)->dev->driver_data))74 75 /** Obtain soft-state structure from device node */76 #define NS8250_FROM_DEV(dnode) ((ns8250_t *) ((dnode)->driver_data))77 70 78 71 /** The number of bits of one data unit send by the serial port. */ … … 93 86 94 87 /** The driver data for the serial port devices. */ 95 typedef struct ns8250 { 96 /** DDF device node */ 97 ddf_dev_t *dev; 98 /** DDF function node */ 99 ddf_fun_t *fun; 88 typedef struct ns8250_dev_data { 100 89 /** Is there any client conntected to the device? */ 101 90 bool client_connected; … … 110 99 /** The fibril mutex for synchronizing the access to the device. */ 111 100 fibril_mutex_t mutex; 112 } ns8250_ t;113 114 /** Create per-device soft-state structure.115 * 116 * @return Pointer to soft-state structure.117 */ 118 static ns8250_ t *ns8250_new(void)119 { 120 ns8250_ t *ns;121 122 ns = (ns8250_t *) calloc(1, sizeof(ns8250_t));123 if ( ns == NULL)124 return NULL;125 126 fibril_mutex_initialize(&ns->mutex);127 return ns;128 } 129 130 /** Delete soft-state structure.131 * 132 * @param nsThe driver data structure.133 */ 134 static void ns8250_delete(ns8250_t *ns)135 { 136 assert(ns != NULL);137 free(ns);101 } ns8250_dev_data_t; 102 103 /** Create driver data for a device. 104 * 105 * @return The driver data. 106 */ 107 static ns8250_dev_data_t *create_ns8250_dev_data(void) 108 { 109 ns8250_dev_data_t *data; 110 111 data = (ns8250_dev_data_t *) malloc(sizeof(ns8250_dev_data_t)); 112 if (NULL != data) { 113 memset(data, 0, sizeof(ns8250_dev_data_t)); 114 fibril_mutex_initialize(&data->mutex); 115 } 116 return data; 117 } 118 119 /** Delete driver data. 120 * 121 * @param data The driver data structure. 122 */ 123 static void delete_ns8250_dev_data(ns8250_dev_data_t *data) 124 { 125 if (data != NULL) 126 free(data); 138 127 } 139 128 … … 183 172 /** Read data from the serial port device. 184 173 * 185 * @param fun The serial port function174 * @param dev The serial port device. 186 175 * @param buf The ouput buffer for read data. 187 176 * @param count The number of bytes to be read. … … 190 179 * error number otherwise. 191 180 */ 192 static int ns8250_read(ddf_fun_t *fun, char *buf, size_t count) 193 { 194 ns8250_t *ns = NS8250(fun); 181 static int ns8250_read(device_t *dev, char *buf, size_t count) 182 { 195 183 int ret = EOK; 196 197 fibril_mutex_lock(&ns->mutex); 198 while (!buf_is_empty(&ns->input_buffer) && (size_t)ret < count) { 199 buf[ret] = (char)buf_pop_front(&ns->input_buffer); 184 ns8250_dev_data_t *data = (ns8250_dev_data_t *) dev->driver_data; 185 186 fibril_mutex_lock(&data->mutex); 187 while (!buf_is_empty(&data->input_buffer) && (size_t)ret < count) { 188 buf[ret] = (char)buf_pop_front(&data->input_buffer); 200 189 ret++; 201 190 } 202 fibril_mutex_unlock(& ns->mutex);191 fibril_mutex_unlock(&data->mutex); 203 192 204 193 return ret; … … 207 196 /** Write a character to the serial port. 208 197 * 209 * @param ns Serial port device210 * @param c The character to be written 211 */ 212 static inline void ns8250_putchar(ns8250_ t *ns, uint8_t c)213 { 214 fibril_mutex_lock(& ns->mutex);215 ns8250_write_8( ns->port, c);216 fibril_mutex_unlock(& ns->mutex);198 * @param data The serial port device's driver data. 199 * @param c The character to be written. 200 */ 201 static inline void ns8250_putchar(ns8250_dev_data_t *data, uint8_t c) 202 { 203 fibril_mutex_lock(&data->mutex); 204 ns8250_write_8(data->port, c); 205 fibril_mutex_unlock(&data->mutex); 217 206 } 218 207 219 208 /** Write data to the serial port. 220 209 * 221 * @param fun The serial port function222 * @param buf The data to be written 223 * @param count The number of bytes to be written 224 * @return Zero on success 225 */ 226 static int ns8250_write(d df_fun_t *fun, char *buf, size_t count)227 { 228 ns8250_ t *ns = NS8250(fun);210 * @param dev The serial port device. 211 * @param buf The data to be written. 212 * @param count The number of bytes to be written. 213 * @return Zero on success. 214 */ 215 static int ns8250_write(device_t *dev, char *buf, size_t count) 216 { 217 ns8250_dev_data_t *data = (ns8250_dev_data_t *) dev->driver_data; 229 218 size_t idx; 230 219 231 220 for (idx = 0; idx < count; idx++) 232 ns8250_putchar( ns, (uint8_t) buf[idx]);221 ns8250_putchar(data, (uint8_t) buf[idx]); 233 222 234 223 return 0; 235 224 } 236 225 237 static d df_dev_ops_t ns8250_dev_ops;226 static device_ops_t ns8250_dev_ops; 238 227 239 228 /** The character interface's callbacks. */ 240 static char_ dev_ops_t ns8250_char_dev_ops= {229 static char_iface_t ns8250_char_iface = { 241 230 .read = &ns8250_read, 242 231 .write = &ns8250_write 243 232 }; 244 233 245 static int ns8250_add_device(d df_dev_t *dev);234 static int ns8250_add_device(device_t *dev); 246 235 247 236 /** The serial port device driver's standard operations. */ … … 256 245 }; 257 246 258 /** Clean up the serial port soft-state 259 * 260 * @param ns Serial port device 261 */ 262 static void ns8250_dev_cleanup(ns8250_t *ns) 263 { 264 if (ns->dev->parent_phone > 0) { 265 async_hangup(ns->dev->parent_phone); 266 ns->dev->parent_phone = 0; 247 /** Clean up the serial port device structure. 248 * 249 * @param dev The device structure. 250 */ 251 static void ns8250_dev_cleanup(device_t *dev) 252 { 253 if (dev->driver_data != NULL) { 254 delete_ns8250_dev_data((ns8250_dev_data_t*) dev->driver_data); 255 dev->driver_data = NULL; 256 } 257 258 if (dev->parent_phone > 0) { 259 ipc_hangup(dev->parent_phone); 260 dev->parent_phone = 0; 267 261 } 268 262 } … … 270 264 /** Enable the i/o ports of the device. 271 265 * 272 * @param ns Serial port device 273 * @return True on success, false otherwise 274 */ 275 static bool ns8250_pio_enable(ns8250_t *ns) 276 { 277 printf(NAME ": ns8250_pio_enable %s\n", ns->dev->name); 266 * @param dev The serial port device. 267 * @return True on success, false otherwise. 268 */ 269 static bool ns8250_pio_enable(device_t *dev) 270 { 271 printf(NAME ": ns8250_pio_enable %s\n", dev->name); 272 273 ns8250_dev_data_t *data = (ns8250_dev_data_t *)dev->driver_data; 278 274 279 275 /* Gain control over port's registers. */ 280 if (pio_enable((void *)(uintptr_t) ns->io_addr, REG_COUNT,281 (void **) & ns->port)) {276 if (pio_enable((void *)(uintptr_t) data->io_addr, REG_COUNT, 277 (void **) &data->port)) { 282 278 printf(NAME ": error - cannot gain the port %#" PRIx32 " for device " 283 "%s.\n", ns->io_addr, ns->dev->name);279 "%s.\n", data->io_addr, dev->name); 284 280 return false; 285 281 } … … 290 286 /** Probe the serial port device for its presence. 291 287 * 292 * @param ns Serial port device 293 * @return True if the device is present, false otherwise 294 */ 295 static bool ns8250_dev_probe(ns8250_t *ns) 296 { 297 printf(NAME ": ns8250_dev_probe %s\n", ns->dev->name); 298 299 ioport8_t *port_addr = ns->port; 288 * @param dev The serial port device. 289 * @return True if the device is present, false otherwise. 290 */ 291 static bool ns8250_dev_probe(device_t *dev) 292 { 293 printf(NAME ": ns8250_dev_probe %s\n", dev->name); 294 295 ns8250_dev_data_t *data = (ns8250_dev_data_t *) dev->driver_data; 296 ioport8_t *port_addr = data->port; 300 297 bool res = true; 301 298 uint8_t olddata; … … 314 311 315 312 if (!res) 316 printf(NAME ": device %s is not present.\n", ns->dev->name);313 printf(NAME ": device %s is not present.\n", dev->name); 317 314 318 315 return res; … … 321 318 /** Initialize serial port device. 322 319 * 323 * @param ns Serial port device324 * @return Zero on success, negative error number otherwise 325 */ 326 static int ns8250_dev_initialize( ns8250_t *ns)327 { 328 printf(NAME ": ns8250_dev_initialize %s\n", ns->dev->name);320 * @param dev The serial port device. 321 * @return Zero on success, negative error number otherwise. 322 */ 323 static int ns8250_dev_initialize(device_t *dev) 324 { 325 printf(NAME ": ns8250_dev_initialize %s\n", dev->name); 329 326 330 327 int ret = EOK; … … 333 330 memset(&hw_resources, 0, sizeof(hw_resource_list_t)); 334 331 332 /* Allocate driver data for the device. */ 333 ns8250_dev_data_t *data = create_ns8250_dev_data(); 334 if (data == NULL) 335 return ENOMEM; 336 dev->driver_data = data; 337 335 338 /* Connect to the parent's driver. */ 336 ns->dev->parent_phone = devman_parent_device_connect(ns->dev->handle,339 dev->parent_phone = devman_parent_device_connect(dev->handle, 337 340 IPC_FLAG_BLOCKING); 338 if ( ns->dev->parent_phone < 0) {341 if (dev->parent_phone < 0) { 339 342 printf(NAME ": failed to connect to the parent driver of the " 340 "device %s.\n", ns->dev->name);341 ret = ns->dev->parent_phone;343 "device %s.\n", dev->name); 344 ret = EPARTY; /* FIXME: use another EC */ 342 345 goto failed; 343 346 } 344 347 345 348 /* Get hw resources. */ 346 ret = hw_res_get_resource_list(ns->dev->parent_phone, &hw_resources); 347 if (ret != EOK) { 349 if (!get_hw_resources(dev->parent_phone, &hw_resources)) { 348 350 printf(NAME ": failed to get hw resources for the device " 349 "%s.\n", ns->dev->name); 351 "%s.\n", dev->name); 352 ret = EPARTY; /* FIXME: use another EC */ 350 353 goto failed; 351 354 } … … 360 363 switch (res->type) { 361 364 case INTERRUPT: 362 ns->irq = res->res.interrupt.irq;365 data->irq = res->res.interrupt.irq; 363 366 irq = true; 364 367 printf(NAME ": the %s device was asigned irq = 0x%x.\n", 365 ns->dev->name, ns->irq);368 dev->name, data->irq); 366 369 break; 367 370 368 371 case IO_RANGE: 369 ns->io_addr = res->res.io_range.address;372 data->io_addr = res->res.io_range.address; 370 373 if (res->res.io_range.size < REG_COUNT) { 371 374 printf(NAME ": i/o range assigned to the device " 372 "%s is too small.\n", ns->dev->name);373 ret = E LIMIT;375 "%s is too small.\n", dev->name); 376 ret = EPARTY; /* FIXME: use another EC */ 374 377 goto failed; 375 378 } 376 379 ioport = true; 377 380 printf(NAME ": the %s device was asigned i/o address = " 378 "0x%x.\n", ns->dev->name, ns->io_addr);381 "0x%x.\n", dev->name, data->io_addr); 379 382 break; 380 383 … … 386 389 if (!irq || !ioport) { 387 390 printf(NAME ": missing hw resource(s) for the device %s.\n", 388 ns->dev->name);389 ret = E NOENT;391 dev->name); 392 ret = EPARTY; /* FIXME: use another EC */ 390 393 goto failed; 391 394 } 392 395 393 hw_res_clean_resource_list(&hw_resources);396 clean_hw_resource_list(&hw_resources); 394 397 return ret; 395 398 396 399 failed: 397 ns8250_dev_cleanup( ns);398 hw_res_clean_resource_list(&hw_resources);400 ns8250_dev_cleanup(dev); 401 clean_hw_resource_list(&hw_resources); 399 402 return ret; 400 403 } … … 402 405 /** Enable interrupts on the serial port device. 403 406 * 404 * Interrupt when data is received 407 * Interrupt when data is received. 405 408 * 406 409 * @param port The base address of the serial port device's ports. 407 410 */ 408 411 static inline void ns8250_port_interrupts_enable(ioport8_t *port) 409 { 412 { 410 413 pio_write_8(port + 1, 0x1); /* Interrupt when data received. */ 411 414 pio_write_8(port + 4, 0xB); … … 414 417 /** Disable interrupts on the serial port device. 415 418 * 416 * @param port The base address of the serial port device's ports 419 * @param port The base address of the serial port device's ports. 417 420 */ 418 421 static inline void ns8250_port_interrupts_disable(ioport8_t *port) … … 423 426 /** Enable interrupts for the serial port device. 424 427 * 425 * @param ns Serial port device 426 * @return Zero on success, negative error number otherwise 427 */ 428 static int ns8250_interrupt_enable(ns8250_t *ns) 429 { 428 * @param dev The device. 429 * @return Zero on success, negative error number otherwise. 430 */ 431 static int ns8250_interrupt_enable(device_t *dev) 432 { 433 ns8250_dev_data_t *data = (ns8250_dev_data_t *) dev->driver_data; 434 int res; 435 436 /* Enable interrupt globally. */ 437 res = interrupt_enable(data->irq); 438 if (res != EOK) 439 return res; 440 430 441 /* Enable interrupt on the serial port. */ 431 ns8250_port_interrupts_enable( ns->port);442 ns8250_port_interrupts_enable(data->port); 432 443 433 444 return EOK; … … 614 625 * Set the default parameters of the serial communication. 615 626 * 616 * @param ns Serial port device 617 */ 618 static void ns8250_initialize_port(ns8250_t *ns) 619 { 620 ioport8_t *port = ns->port; 627 * @param dev The serial port device. 628 */ 629 static void ns8250_initialize_port(device_t *dev) 630 { 631 ns8250_dev_data_t *data = (ns8250_dev_data_t *)dev->driver_data; 632 ioport8_t *port = data->port; 621 633 622 634 /* Disable interrupts. */ … … 638 650 * buffer. 639 651 * 640 * @param ns Serial port device 641 */ 642 static void ns8250_read_from_device(ns8250_t *ns) 643 { 644 ioport8_t *port = ns->port; 652 * @param dev The serial port device. 653 */ 654 static void ns8250_read_from_device(device_t *dev) 655 { 656 ns8250_dev_data_t *data = (ns8250_dev_data_t *) dev->driver_data; 657 ioport8_t *port = data->port; 645 658 bool cont = true; 646 659 647 660 while (cont) { 648 fibril_mutex_lock(& ns->mutex);661 fibril_mutex_lock(&data->mutex); 649 662 650 663 cont = ns8250_received(port); … … 652 665 uint8_t val = ns8250_read_8(port); 653 666 654 if ( ns->client_connected) {655 if (!buf_push_back(& ns->input_buffer, val)) {667 if (data->client_connected) { 668 if (!buf_push_back(&data->input_buffer, val)) { 656 669 printf(NAME ": buffer overflow on " 657 "%s.\n", ns->dev->name);670 "%s.\n", dev->name); 658 671 } else { 659 672 printf(NAME ": the character %c saved " 660 673 "to the buffer of %s.\n", 661 val, ns->dev->name);674 val, dev->name); 662 675 } 663 676 } 664 677 } 665 678 666 fibril_mutex_unlock(& ns->mutex);679 fibril_mutex_unlock(&data->mutex); 667 680 fibril_yield(); 668 681 } … … 676 689 * @param dev The serial port device. 677 690 */ 678 static inline void ns8250_interrupt_handler(d df_dev_t *dev, ipc_callid_t iid,691 static inline void ns8250_interrupt_handler(device_t *dev, ipc_callid_t iid, 679 692 ipc_call_t *icall) 680 693 { 681 ns8250_read_from_device( NS8250_FROM_DEV(dev));694 ns8250_read_from_device(dev); 682 695 } 683 696 684 697 /** Register the interrupt handler for the device. 685 698 * 686 * @param ns Serial port device 687 */ 688 static inline int ns8250_register_interrupt_handler(ns8250_t *ns) 689 { 690 return register_interrupt_handler(ns->dev, ns->irq, 699 * @param dev The serial port device. 700 */ 701 static inline int ns8250_register_interrupt_handler(device_t *dev) 702 { 703 ns8250_dev_data_t *data = (ns8250_dev_data_t *) dev->driver_data; 704 705 return register_interrupt_handler(dev, data->irq, 691 706 ns8250_interrupt_handler, NULL); 692 707 } … … 694 709 /** Unregister the interrupt handler for the device. 695 710 * 696 * @param ns Serial port device 697 */ 698 static inline int ns8250_unregister_interrupt_handler(ns8250_t *ns) 699 { 700 return unregister_interrupt_handler(ns->dev, ns->irq); 711 * @param dev The serial port device. 712 */ 713 static inline int ns8250_unregister_interrupt_handler(device_t *dev) 714 { 715 ns8250_dev_data_t *data = (ns8250_dev_data_t *) dev->driver_data; 716 717 return unregister_interrupt_handler(dev, data->irq); 701 718 } 702 719 … … 707 724 * @param dev The serial port device. 708 725 */ 709 static int ns8250_add_device(ddf_dev_t *dev) 710 { 711 ns8250_t *ns = NULL; 712 ddf_fun_t *fun = NULL; 713 bool need_cleanup = false; 714 int rc; 715 726 static int ns8250_add_device(device_t *dev) 727 { 716 728 printf(NAME ": ns8250_add_device %s (handle = %d)\n", 717 729 dev->name, (int) dev->handle); 718 730 719 /* Allocate soft-state for the device */ 720 ns = ns8250_new(); 721 if (ns == NULL) { 722 rc = ENOMEM; 723 goto fail; 724 } 725 726 ns->dev = dev; 727 dev->driver_data = ns; 728 729 rc = ns8250_dev_initialize(ns); 730 if (rc != EOK) 731 goto fail; 732 733 need_cleanup = true; 734 735 if (!ns8250_pio_enable(ns)) { 736 rc = EADDRNOTAVAIL; 737 goto fail; 731 int res = ns8250_dev_initialize(dev); 732 if (res != EOK) 733 return res; 734 735 if (!ns8250_pio_enable(dev)) { 736 ns8250_dev_cleanup(dev); 737 return EADDRNOTAVAIL; 738 738 } 739 739 740 740 /* Find out whether the device is present. */ 741 if (!ns8250_dev_probe( ns)) {742 rc = ENOENT;743 goto fail;741 if (!ns8250_dev_probe(dev)) { 742 ns8250_dev_cleanup(dev); 743 return ENOENT; 744 744 } 745 745 746 746 /* Serial port initialization (baud rate etc.). */ 747 ns8250_initialize_port( ns);747 ns8250_initialize_port(dev); 748 748 749 749 /* Register interrupt handler. */ 750 if (ns8250_register_interrupt_handler( ns) != EOK) {750 if (ns8250_register_interrupt_handler(dev) != EOK) { 751 751 printf(NAME ": failed to register interrupt handler.\n"); 752 rc = EADDRNOTAVAIL;753 goto fail;752 ns8250_dev_cleanup(dev); 753 return res; 754 754 } 755 755 756 756 /* Enable interrupt. */ 757 r c = ns8250_interrupt_enable(ns);758 if (r c!= EOK) {757 res = ns8250_interrupt_enable(dev); 758 if (res != EOK) { 759 759 printf(NAME ": failed to enable the interrupt. Error code = " 760 "%d.\n", rc); 761 goto fail; 762 } 763 764 fun = ddf_fun_create(dev, fun_exposed, "a"); 765 if (fun == NULL) { 766 printf(NAME ": error creating function.\n"); 767 goto fail; 760 "%d.\n", res); 761 ns8250_dev_cleanup(dev); 762 ns8250_unregister_interrupt_handler(dev); 763 return res; 768 764 } 769 765 770 766 /* Set device operations. */ 771 fun->ops = &ns8250_dev_ops; 772 rc = ddf_fun_bind(fun); 773 if (rc != EOK) { 774 printf(NAME ": error binding function.\n"); 775 goto fail; 776 } 777 778 ns->fun = fun; 779 780 ddf_fun_add_to_class(fun, "serial"); 767 dev->ops = &ns8250_dev_ops; 768 769 add_device_to_class(dev, "serial"); 781 770 782 771 printf(NAME ": the %s device has been successfully initialized.\n", … … 784 773 785 774 return EOK; 786 fail:787 if (fun != NULL)788 ddf_fun_destroy(fun);789 if (need_cleanup)790 ns8250_dev_cleanup(ns);791 if (ns != NULL)792 ns8250_delete(ns);793 return rc;794 775 } 795 776 … … 801 782 * @param dev The device. 802 783 */ 803 static int ns8250_open(d df_fun_t *fun)804 { 805 ns8250_ t *data = (ns8250_t *) fun->dev->driver_data;784 static int ns8250_open(device_t *dev) 785 { 786 ns8250_dev_data_t *data = (ns8250_dev_data_t *) dev->driver_data; 806 787 int res; 807 788 … … 814 795 } 815 796 fibril_mutex_unlock(&data->mutex); 816 797 817 798 return res; 818 799 } … … 825 806 * @param dev The device. 826 807 */ 827 static void ns8250_close(d df_fun_t *fun)828 { 829 ns8250_ t *data = (ns8250_t *) fun->dev->driver_data;808 static void ns8250_close(device_t *dev) 809 { 810 ns8250_dev_data_t *data = (ns8250_dev_data_t *) dev->driver_data; 830 811 831 812 fibril_mutex_lock(&data->mutex); … … 849 830 */ 850 831 static void 851 ns8250_get_props(d df_dev_t *dev, unsigned int *baud_rate, unsigned int *parity,832 ns8250_get_props(device_t *dev, unsigned int *baud_rate, unsigned int *parity, 852 833 unsigned int *word_length, unsigned int* stop_bits) 853 834 { 854 ns8250_ t *data = (ns8250_t *) dev->driver_data;835 ns8250_dev_data_t *data = (ns8250_dev_data_t *) dev->driver_data; 855 836 ioport8_t *port = data->port; 856 837 … … 876 857 * @param stop_bits The number of stop bits to be used. 877 858 */ 878 static int ns8250_set_props(d df_dev_t *dev, unsigned int baud_rate,859 static int ns8250_set_props(device_t *dev, unsigned int baud_rate, 879 860 unsigned int parity, unsigned int word_length, unsigned int stop_bits) 880 861 { … … 883 864 stop_bits); 884 865 885 ns8250_ t *data = (ns8250_t *) dev->driver_data;866 ns8250_dev_data_t *data = (ns8250_dev_data_t *) dev->driver_data; 886 867 ioport8_t *port = data->port; 887 868 int ret; … … 903 884 * Configure the parameters of the serial communication. 904 885 */ 905 static void ns8250_default_handler(d df_fun_t *fun, ipc_callid_t callid,886 static void ns8250_default_handler(device_t *dev, ipc_callid_t callid, 906 887 ipc_call_t *call) 907 888 { … … 912 893 switch (method) { 913 894 case SERIAL_GET_COM_PROPS: 914 ns8250_get_props( fun->dev, &baud_rate, &parity, &word_length,895 ns8250_get_props(dev, &baud_rate, &parity, &word_length, 915 896 &stop_bits); 916 async_answer_4(callid, EOK, baud_rate, parity, word_length,897 ipc_answer_4(callid, EOK, baud_rate, parity, word_length, 917 898 stop_bits); 918 899 break; … … 923 904 word_length = IPC_GET_ARG3(*call); 924 905 stop_bits = IPC_GET_ARG4(*call); 925 ret = ns8250_set_props( fun->dev, baud_rate, parity, word_length,906 ret = ns8250_set_props(dev, baud_rate, parity, word_length, 926 907 stop_bits); 927 async_answer_0(callid, ret);908 ipc_answer_0(callid, ret); 928 909 break; 929 910 930 911 default: 931 async_answer_0(callid, ENOTSUP);912 ipc_answer_0(callid, ENOTSUP); 932 913 } 933 914 } … … 943 924 ns8250_dev_ops.close = &ns8250_close; 944 925 945 ns8250_dev_ops.interfaces[CHAR_DEV_IFACE] = &ns8250_char_ dev_ops;926 ns8250_dev_ops.interfaces[CHAR_DEV_IFACE] = &ns8250_char_iface; 946 927 ns8250_dev_ops.default_handler = &ns8250_default_handler; 947 928 } … … 951 932 printf(NAME ": HelenOS serial port driver\n"); 952 933 ns8250_init(); 953 return d df_driver_main(&ns8250_driver);934 return driver_main(&ns8250_driver); 954 935 } 955 936
Note:
See TracChangeset
for help on using the changeset viewer.
