Changeset 49ff5f3 in mainline for uspace/drv/nic
- Timestamp:
- 2012-04-18T20:55:21Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/fix-logger-deadlock, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 7769ec9
- Parents:
- e895352 (diff), 63920b0 (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/drv/nic
- Files:
-
- 10 added
- 6 edited
- 2 moved
-
e1k/Makefile (added)
-
e1k/e1k.c (added)
-
e1k/e1k.h (added)
-
e1k/e1k.ma (added)
-
lo/Makefile (modified) (1 diff)
-
lo/lo.c (modified) (4 diffs)
-
ne2k/Makefile (modified) (1 diff)
-
ne2k/dp8390.c (modified) (12 diffs)
-
ne2k/dp8390.h (modified) (1 diff)
-
ne2k/ne2k.c (modified) (9 diffs)
-
rtl8139/Makefile (moved) (moved from uspace/srv/net/tl/icmp/Makefile ) (2 diffs)
-
rtl8139/defs.c (added)
-
rtl8139/defs.h (added)
-
rtl8139/driver.c (added)
-
rtl8139/driver.h (added)
-
rtl8139/general.c (added)
-
rtl8139/general.h (moved) (moved from uspace/lib/c/include/ipc/arp.h ) (2 diffs)
-
rtl8139/rtl8139.ma (added)
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/nic/lo/Makefile
re895352 r49ff5f3 28 28 29 29 USPACE_PREFIX = ../../.. 30 LIBS = $(LIBDRV_PREFIX)/libdrv.a $(LIBN ET_PREFIX)/libnet.a $(LIBNIC_PREFIX)/libnic.a31 EXTRA_CFLAGS += -I$(LIBDRV_PREFIX)/include -I$(LIBN ET_PREFIX)/include -I$(LIBNIC_PREFIX)/include30 LIBS = $(LIBDRV_PREFIX)/libdrv.a $(LIBNIC_PREFIX)/libnic.a 31 EXTRA_CFLAGS += -I$(LIBDRV_PREFIX)/include -I$(LIBNIC_PREFIX)/include 32 32 BINARY = lo 33 33 -
uspace/drv/nic/lo/lo.c
re895352 r49ff5f3 42 42 #include <async.h> 43 43 #include <nic.h> 44 #include <packet_client.h>45 44 46 45 #define NAME "lo" … … 59 58 }; 60 59 61 static void lo_ write_packet(nic_t *nic_data, packet_t *packet)60 static void lo_send_frame(nic_t *nic_data, void *data, size_t size) 62 61 { 63 nic_report_send_ok(nic_data, 1, packet_get_data_length(packet));64 nic_received_noneth_ packet(nic_data, packet);62 nic_report_send_ok(nic_data, 1, size); 63 nic_received_noneth_frame(nic_data, data, size); 65 64 } 66 65 … … 79 78 } 80 79 81 static int lo_ add_device(ddf_dev_t *dev)80 static int lo_dev_add(ddf_dev_t *dev) 82 81 { 83 nic_t *nic_data = nic_create_and_bind(dev); 84 if (nic_data == NULL) { 82 ddf_fun_t *fun = NULL; 83 bool bound = false; 84 85 nic_t *nic = nic_create_and_bind(dev); 86 if (nic == NULL) { 85 87 printf("%s: Failed to initialize\n", NAME); 86 88 return ENOMEM; 87 89 } 88 90 89 dev->driver_data = nic _data;90 nic_set_ write_packet_handler(nic_data, lo_write_packet);91 dev->driver_data = nic; 92 nic_set_send_frame_handler(nic, lo_send_frame); 91 93 92 int rc = nic_connect_to_services(nic _data);94 int rc = nic_connect_to_services(nic); 93 95 if (rc != EOK) { 94 96 printf("%s: Failed to connect to services\n", NAME); 95 nic_unbind_and_destroy(dev); 96 return rc; 97 goto error; 97 98 } 98 99 99 rc = nic_register_as_ddf_fun(nic_data, &lo_dev_ops); 100 fun = ddf_fun_create(nic_get_ddf_dev(nic), fun_exposed, "port0"); 101 if (fun == NULL) { 102 printf("%s: Failed creating function\n", NAME); 103 rc = ENOMEM; 104 goto error; 105 } 106 nic_set_ddf_fun(nic, fun); 107 fun->ops = &lo_dev_ops; 108 fun->driver_data = nic; 109 110 rc = nic_report_address(nic, &lo_addr); 100 111 if (rc != EOK) { 101 printf("%s: Failed to register as DDF function\n", NAME); 102 nic_unbind_and_destroy(dev); 103 return rc; 112 printf("%s: Failed to setup loopback address\n", NAME); 113 goto error; 104 114 } 105 115 106 rc = nic_report_address(nic_data, &lo_addr);116 rc = ddf_fun_bind(fun); 107 117 if (rc != EOK) { 108 printf("%s: Failed to setup loopback address\n", NAME); 109 nic_unbind_and_destroy(dev); 110 return rc; 118 printf("%s: Failed binding function\n", NAME); 119 goto error; 111 120 } 121 bound = true; 122 123 rc = ddf_fun_add_to_category(fun, DEVICE_CATEGORY_NIC); 124 if (rc != EOK) 125 goto error; 112 126 113 127 printf("%s: Adding loopback device '%s'\n", NAME, dev->name); 114 128 return EOK; 129 130 error: 131 if (bound) 132 ddf_fun_unbind(fun); 133 134 if (fun != NULL) 135 ddf_fun_destroy(fun); 136 137 nic_unbind_and_destroy(dev); 138 return rc; 115 139 } 116 140 … … 118 142 119 143 static driver_ops_t lo_driver_ops = { 120 . add_device = lo_add_device,144 .dev_add = lo_dev_add, 121 145 }; 122 146 -
uspace/drv/nic/ne2k/Makefile
re895352 r49ff5f3 28 28 29 29 USPACE_PREFIX = ../../.. 30 LIBS = $(LIBDRV_PREFIX)/libdrv.a $(LIBN ET_PREFIX)/libnet.a $(LIBNIC_PREFIX)/libnic.a31 EXTRA_CFLAGS += -I$(LIBDRV_PREFIX)/include -I$(LIBN ET_PREFIX)/include -I$(LIBNIC_PREFIX)/include30 LIBS = $(LIBDRV_PREFIX)/libdrv.a $(LIBNIC_PREFIX)/libnic.a 31 EXTRA_CFLAGS += -I$(LIBDRV_PREFIX)/include -I$(LIBNIC_PREFIX)/include 32 32 BINARY = ne2k 33 33 -
uspace/drv/nic/ne2k/dp8390.c
re895352 r49ff5f3 59 59 #include <stdio.h> 60 60 #include <libarch/ddi.h> 61 #include <net/packet.h>62 #include <packet_client.h>63 61 #include "dp8390.h" 64 62 … … 76 74 uint8_t status; 77 75 78 /** Pointer to next packet*/76 /** Pointer to next frame */ 79 77 uint8_t next; 80 78 … … 142 140 static void ne2k_upload(ne2k_t *ne2k, void *buf, size_t addr, size_t size) 143 141 { 142 size_t esize_ru = (size + 1) & ~1; 144 143 size_t esize = size & ~1; 145 144 146 pio_write_8(ne2k->port + DP_RBCR0, esize & 0xff);147 pio_write_8(ne2k->port + DP_RBCR1, (esize >> 8) & 0xff);145 pio_write_8(ne2k->port + DP_RBCR0, esize_ru & 0xff); 146 pio_write_8(ne2k->port + DP_RBCR1, (esize_ru >> 8) & 0xff); 148 147 pio_write_8(ne2k->port + DP_RSAR0, addr & 0xff); 149 148 pio_write_8(ne2k->port + DP_RSAR1, (addr >> 8) & 0xff); … … 392 391 /* 393 392 * Reset the transmit ring. If we were transmitting a frame, 394 * we pretend that the packetis processed. Higher layers will395 * retransmit if the packetwasn't actually sent.393 * we pretend that the frame is processed. Higher layers will 394 * retransmit if the frame wasn't actually sent. 396 395 */ 397 396 ne2k->sq.dirty = false; … … 403 402 * 404 403 * @param[in,out] ne2k Network interface structure. 405 * @param[in] packet Frame to be sent. 406 * 407 */ 408 void ne2k_send(nic_t *nic_data, packet_t *packet) 404 * @param[in] data Pointer to frame data 405 * @param[in] size Frame size in bytes 406 * 407 */ 408 void ne2k_send(nic_t *nic_data, void *data, size_t size) 409 409 { 410 410 ne2k_t *ne2k = (ne2k_t *) nic_get_specific(nic_data); … … 418 418 fibril_condvar_wait(&ne2k->sq_cv, &ne2k->sq_mutex); 419 419 } 420 void *buf = packet_get_data(packet);421 size_t size = packet_get_data_length(packet);422 420 423 421 if ((size < ETH_MIN_PACK_SIZE) || (size > ETH_MAX_PACK_SIZE_TAGGED)) { … … 427 425 428 426 /* Upload the frame to the ethernet card */ 429 ne2k_upload(ne2k, buf, ne2k->sq.page * DP_PAGE, size);427 ne2k_upload(ne2k, data, ne2k->sq.page * DP_PAGE, size); 430 428 ne2k->sq.dirty = true; 431 429 ne2k->sq.size = size; … … 437 435 pio_write_8(ne2k->port + DP_CR, CR_TXP | CR_STA); 438 436 fibril_mutex_unlock(&ne2k->sq_mutex); 439 440 /* Relase packet */441 nic_release_packet(nic_data, packet);442 437 } 443 438 … … 451 446 return NULL; 452 447 453 void *buf = packet_suffix(frame->packet, length); 454 bzero(buf, length); 448 bzero(frame->data, length); 455 449 uint8_t last = page + length / DP_PAGE; 456 450 … … 458 452 size_t left = (ne2k->stop_page - page) * DP_PAGE 459 453 - sizeof(recv_header_t); 460 ne2k_download(ne2k, buf, page * DP_PAGE + sizeof(recv_header_t),454 ne2k_download(ne2k, frame->data, page * DP_PAGE + sizeof(recv_header_t), 461 455 left); 462 ne2k_download(ne2k, buf+ left, ne2k->start_page * DP_PAGE,456 ne2k_download(ne2k, frame->data + left, ne2k->start_page * DP_PAGE, 463 457 length - left); 464 458 } else { 465 ne2k_download(ne2k, buf, page * DP_PAGE + sizeof(recv_header_t),459 ne2k_download(ne2k, frame->data, page * DP_PAGE + sizeof(recv_header_t), 466 460 length); 467 461 } … … 544 538 * Update the boundary pointer 545 539 * to the value of the page 546 * prior to the next packetto540 * prior to the next frame to 547 541 * be processed. 548 542 */ … … 587 581 fibril_mutex_lock(&ne2k->sq_mutex); 588 582 if (ne2k->sq.dirty) { 589 /* Prepare the buffer for next packet*/583 /* Prepare the buffer for next frame */ 590 584 ne2k->sq.dirty = false; 591 585 ne2k->sq.size = 0; -
uspace/drv/nic/ne2k/dp8390.h
re895352 r49ff5f3 262 262 extern int ne2k_up(ne2k_t *); 263 263 extern void ne2k_down(ne2k_t *); 264 extern void ne2k_send(nic_t *, packet_t *);264 extern void ne2k_send(nic_t *, void *, size_t); 265 265 extern void ne2k_interrupt(nic_t *, uint8_t, uint8_t); 266 extern packet_t *ne2k_alloc_packet(nic_t *, size_t);267 266 268 267 extern void ne2k_set_accept_mcast(ne2k_t *, int); -
uspace/drv/nic/ne2k/ne2k.c
re895352 r49ff5f3 64 64 #define NE2K(device) ((ne2k_t *) nic_get_specific(DRIVER_DATA(device))) 65 65 66 static irq_pio_range_t ne2k_ranges_prototype[] = { 67 { 68 .base = 0, 69 .size = NE2K_IO_SIZE, 70 } 71 }; 72 66 73 /** NE2000 kernel interrupt command sequence. 67 74 * … … 122 129 123 130 if (ne2k->code.cmdcount == 0) { 124 irq_cmd_t *ne2k_cmds = malloc(sizeof(ne2k_cmds_prototype)); 125 if (ne2k_cmds == NULL) { 131 irq_pio_range_t *ne2k_ranges; 132 irq_cmd_t *ne2k_cmds; 133 134 ne2k_ranges = malloc(sizeof(ne2k_ranges_prototype)); 135 if (!ne2k_ranges) 136 return ENOMEM; 137 memcpy(ne2k_ranges, ne2k_ranges_prototype, 138 sizeof(ne2k_ranges_prototype)); 139 ne2k_ranges[0].base = (uintptr_t) ne2k->base_port; 140 141 ne2k_cmds = malloc(sizeof(ne2k_cmds_prototype)); 142 if (!ne2k_cmds) { 143 free(ne2k_ranges); 126 144 return ENOMEM; 127 145 } 128 memcpy(ne2k_cmds, ne2k_cmds_prototype, sizeof (ne2k_cmds_prototype)); 129 ne2k_cmds[0].addr = ne2k->port + DP_ISR; 130 ne2k_cmds[3].addr = ne2k->port + DP_IMR; 146 memcpy(ne2k_cmds, ne2k_cmds_prototype, 147 sizeof(ne2k_cmds_prototype)); 148 ne2k_cmds[0].addr = ne2k->base_port + DP_ISR; 149 ne2k_cmds[3].addr = ne2k->base_port + DP_IMR; 131 150 ne2k_cmds[4].addr = ne2k_cmds[0].addr; 132 ne2k_cmds[5].addr = ne2k->port + DP_TSR; 133 134 ne2k->code.cmdcount = sizeof(ne2k_cmds_prototype) / sizeof(irq_cmd_t); 151 ne2k_cmds[5].addr = ne2k->base_port + DP_TSR; 152 153 ne2k->code.rangecount = sizeof(ne2k_ranges_prototype) / 154 sizeof(irq_pio_range_t); 155 ne2k->code.ranges = ne2k_ranges; 156 157 ne2k->code.cmdcount = sizeof(ne2k_cmds_prototype) / 158 sizeof(irq_cmd_t); 135 159 ne2k->code.cmds = ne2k_cmds; 136 160 } … … 148 172 ne2k_t *ne2k = NE2K(dev); 149 173 if (ne2k) { 174 free(ne2k->code.ranges); 150 175 free(ne2k->code.cmds); 151 176 } … … 261 286 /* Note: some frame with previous physical address may slip to NIL here 262 287 * (for a moment the filtering is not exact), but ethernet should be OK with 263 * that. Some packetmay also be lost, but this is not a problem.288 * that. Some frames may also be lost, but this is not a problem. 264 289 */ 265 290 ne2k_set_physical_address((ne2k_t *) nic_get_specific(nic_data), address); … … 336 361 } 337 362 338 static int ne2k_add_device(ddf_dev_t *dev) 339 { 363 static int ne2k_dev_add(ddf_dev_t *dev) 364 { 365 ddf_fun_t *fun; 366 340 367 /* Allocate driver data for the device. */ 341 368 nic_t *nic_data = nic_create_and_bind(dev); … … 343 370 return ENOMEM; 344 371 345 nic_set_ write_packet_handler(nic_data, ne2k_send);372 nic_set_send_frame_handler(nic_data, ne2k_send); 346 373 nic_set_state_change_handlers(nic_data, 347 374 ne2k_on_activating, NULL, ne2k_on_stopping); … … 371 398 } 372 399 373 rc = nic_ register_as_ddf_fun(nic_data, &ne2k_dev_ops);400 rc = nic_connect_to_services(nic_data); 374 401 if (rc != EOK) { 375 402 ne2k_dev_cleanup(dev); … … 377 404 } 378 405 379 rc = nic_connect_to_services(nic_data);380 if ( rc != EOK) {406 fun = ddf_fun_create(nic_get_ddf_dev(nic_data), fun_exposed, "port0"); 407 if (fun == NULL) { 381 408 ne2k_dev_cleanup(dev); 409 return ENOMEM; 410 } 411 nic_set_ddf_fun(nic_data, fun); 412 fun->ops = &ne2k_dev_ops; 413 fun->driver_data = nic_data; 414 415 rc = ddf_fun_bind(fun); 416 if (rc != EOK) { 417 ddf_fun_destroy(fun); 418 ne2k_dev_cleanup(dev); 419 return rc; 420 } 421 422 rc = ddf_fun_add_to_category(fun, DEVICE_CATEGORY_NIC); 423 if (rc != EOK) { 424 ddf_fun_unbind(fun); 425 ddf_fun_destroy(fun); 382 426 return rc; 383 427 } … … 391 435 392 436 static driver_ops_t ne2k_driver_ops = { 393 . add_device = ne2k_add_device437 .dev_add = ne2k_dev_add 394 438 }; 395 439 -
uspace/drv/nic/rtl8139/Makefile
re895352 r49ff5f3 1 1 # 2 # Copyright (c) 2005 Martin Decky 3 # Copyright (c) 2007 Jakub Jermar 2 # Copyright (c) 2011 Radim Vansa 4 3 # All rights reserved. 5 4 # … … 28 27 # 29 28 30 USPACE_PREFIX = ../../../.. 31 LIBS = $(LIBNET_PREFIX)/libnet.a 32 EXTRA_CFLAGS = -I$(LIBNET_PREFIX)/include 33 BINARY = icmp 34 STATIC_ONLY = y 29 USPACE_PREFIX = ../../.. 30 LIBS = $(LIBDRV_PREFIX)/libdrv.a $(LIBNIC_PREFIX)/libnic.a 31 EXTRA_CFLAGS += -I$(LIBDRV_PREFIX)/include -I$(LIBNIC_PREFIX)/include 32 BINARY = rtl8139 35 33 36 34 SOURCES = \ 37 icmp.c 35 driver.c \ 36 general.c \ 37 defs.c 38 38 39 39 include $(USPACE_PREFIX)/Makefile.common -
uspace/drv/nic/rtl8139/general.h
re895352 r49ff5f3 1 1 /* 2 * Copyright (c) 20 09 Lukas Mejdrech2 * Copyright (c) 2011 Jiri Michalec 3 3 * All rights reserved. 4 4 * … … 27 27 */ 28 28 29 /** @addtogroup libc 30 * @{ 29 /** @file 30 * 31 * General functions and structures used in rtl8139 driver 31 32 */ 32 33 33 /** @file 34 * ARP module messages. 35 * @see arp_interface.h 36 */ 34 #ifndef RTL8139_GENERAL_H_ 35 #define RTL8139_GENERAL_H_ 37 36 38 #ifndef LIBC_ARP_MESSAGES_ 39 #define LIBC_ARP_MESSAGES_ 37 #include <unistd.h> 40 38 41 #include <ipc/net.h> 39 /** Number of microseconds in second */ 40 #define RTL8139_USEC_IN_SEC 1000000 42 41 43 /** ARP module messages. */ 44 typedef enum { 45 /** Clean cache message. 46 * @see arp_clean_cache() 47 */ 48 NET_ARP_CLEAN_CACHE = NET_ARP_FIRST, 49 /** Clear address cache message. 50 * @see arp_clear_address_msg() 51 */ 52 NET_ARP_CLEAR_ADDRESS, 53 /** Clear device cache message. 54 * @see arp_clear_device_req() 55 */ 56 NET_ARP_CLEAR_DEVICE, 57 /** New device message. 58 * @see arp_device_req() 59 */ 60 NET_ARP_DEVICE, 61 /** Address translation message. 62 * @see arp_translate_req() 63 */ 64 NET_ARP_TRANSLATE 65 } arp_messages; 42 /** Structure for HW timer control */ 43 typedef struct { 44 /** Register value set in the last timer period */ 45 uint32_t last_val; 46 47 /** Register value set in the common timer period */ 48 uint32_t full_val; 49 50 /** Amount of full register periods in timer period */ 51 size_t full_skips; 52 53 /** Remaining full register periods to the next period end */ 54 size_t full_skips_remains; 55 56 /** Mark if there is a last run */ 57 int last_run; 58 } rtl8139_timer_act_t; 66 59 67 /** @name ARP specific message parameters definitions */ 68 /*@{*/ 69 70 /** Return the protocol service message parameter. 71 * 72 * @param[in] call Message call structure. 73 * 74 */ 75 #define ARP_GET_NETIF(call) ((services_t) IPC_GET_ARG2(call)) 76 77 /*@}*/ 60 extern void *rtl8139_memcpy_wrapped(void *, const void *, size_t, size_t, 61 size_t); 62 extern int rtl8139_timer_act_init(rtl8139_timer_act_t *, uint32_t, 63 const struct timeval *); 64 extern int rtl8139_timer_act_step(rtl8139_timer_act_t *, uint32_t *); 78 65 79 66 #endif 80 81 /** @}82 */
Note:
See TracChangeset
for help on using the changeset viewer.
