Changes in uspace/drv/nic/e1k/e1k.c [ec52752:d81eaf94] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/nic/e1k/e1k.c
rec52752 rd81eaf94 52 52 #include <nil_remote.h> 53 53 #include <ops/nic.h> 54 #include <packet_client.h>55 #include <packet_remote.h>56 #include <net/packet_header.h>57 54 #include "e1k.h" 58 55 … … 62 59 63 60 /* Must be power of 8 */ 64 #define E1000_RX_ PACKETS_COUNT 12865 #define E1000_TX_ PACKETS_COUNT 12861 #define E1000_RX_FRAME_COUNT 128 62 #define E1000_TX_FRAME_COUNT 128 66 63 67 64 #define E1000_RECEIVE_ADDRESS 16 68 65 69 /** Maximum sending packetsize */66 /** Maximum sending frame size */ 70 67 #define E1000_MAX_SEND_FRAME_SIZE 2048 71 /** Maximum receiving packetsize */72 #define E1000_MAX_RECEIVE_ PACKET_SIZE 204868 /** Maximum receiving frame size */ 69 #define E1000_MAX_RECEIVE_FRAME_SIZE 2048 73 70 74 71 /** nic_driver_data_t* -> e1000_t* cast */ … … 137 134 void *rx_ring_virt; 138 135 139 /** Packets in rx ring */ 140 packet_t **rx_ring_packets; 136 /** Ring of RX frames, physical address */ 137 void **rx_frame_phys; 138 /** Ring of RX frames, virtual address */ 139 void **rx_frame_virt; 141 140 142 141 /** VLAN tag */ 143 142 uint16_t vlan_tag; 144 143 145 /** Add VLAN tag to packet*/144 /** Add VLAN tag to frame */ 146 145 bool vlan_tag_add; 147 146 … … 228 227 static int e1000_on_stopping(nic_t *); 229 228 static void e1000_send_frame(nic_t *, void *, size_t); 230 231 /** PIO ranges used in the IRQ code. */232 irq_pio_range_t e1000_irq_pio_ranges[] = {233 {234 .base = 0,235 .size = PAGE_SIZE, /* XXX */236 }237 };238 229 239 230 /** Commands to deal with interrupt … … 265 256 /** Interrupt code definition */ 266 257 irq_code_t e1000_irq_code = { 267 .rangecount = sizeof(e1000_irq_pio_ranges) /268 sizeof(irq_pio_range_t),269 .ranges = e1000_irq_pio_ranges,270 258 .cmdcount = sizeof(e1000_irq_commands) / sizeof(irq_cmd_t), 271 259 .cmds = e1000_irq_commands … … 488 476 } 489 477 490 /** Get state of acceptance of weird packets478 /** Get state of acceptance of weird frames 491 479 * 492 480 * @param device Device to check … … 506 494 }; 507 495 508 /** Set acceptance of weird packets496 /** Set acceptance of weird frames 509 497 * 510 498 * @param device Device to update … … 690 678 } 691 679 692 /** Disable receiving packets for default address680 /** Disable receiving frames for default address 693 681 * 694 682 * @param e1000 E1000 data structure … … 702 690 } 703 691 704 /** Enable receiving packets for default address692 /** Enable receiving frames for default address 705 693 * 706 694 * @param e1000 E1000 data structure … … 762 750 } 763 751 764 /** Enable accepting of broadcast packets752 /** Enable accepting of broadcast frames 765 753 * 766 754 * @param e1000 E1000 data structure … … 774 762 } 775 763 776 /** Disable accepting of broadcast packets764 /** Disable accepting of broadcast frames 777 765 * 778 766 * @param e1000 E1000 data structure … … 810 798 } 811 799 812 /** Set multicast packets acceptance mode800 /** Set multicast frames acceptance mode 813 801 * 814 802 * @param nic NIC device to update … … 864 852 } 865 853 866 /** Set unicast packets acceptance mode854 /** Set unicast frames acceptance mode 867 855 * 868 856 * @param nic NIC device to update … … 922 910 } 923 911 924 /** Set broadcast packets acceptance mode912 /** Set broadcast frames acceptance mode 925 913 * 926 914 * @param nic NIC device to update … … 1007 995 if (vlan_mask) { 1008 996 /* 1009 * Disable receiving, so that packetmatching997 * Disable receiving, so that frame matching 1010 998 * partially written VLAN is not received. 1011 999 */ … … 1074 1062 } 1075 1063 1076 /** Fill receive descriptor with new empty packet1077 * 1078 * Store packet in e1000->rx_ring_packets1064 /** Fill receive descriptor with new empty buffer 1065 * 1066 * Store frame in e1000->rx_frame_phys 1079 1067 * 1080 1068 * @param nic NIC data stricture … … 1085 1073 { 1086 1074 e1000_t *e1000 = DRIVER_DATA_NIC(nic); 1087 packet_t *packet = 1088 nic_alloc_packet(nic, E1000_MAX_RECEIVE_PACKET_SIZE); 1089 1090 assert(packet); 1091 1092 *(e1000->rx_ring_packets + offset) = packet; 1075 1093 1076 e1000_rx_descriptor_t *rx_descriptor = (e1000_rx_descriptor_t *) 1094 1077 (e1000->rx_ring_virt + offset * sizeof(e1000_rx_descriptor_t)); 1095 1078 1096 void *phys; 1097 int rc = 1098 nic_dma_lock_packet(packet, E1000_MAX_RECEIVE_PACKET_SIZE, &phys); 1099 1100 if (rc == EOK) 1101 rx_descriptor->phys_addr = PTR_TO_U64(phys + packet->data_start); 1102 else 1103 rx_descriptor->phys_addr = 0; 1104 1079 rx_descriptor->phys_addr = PTR_TO_U64(e1000->rx_frame_phys[offset]); 1105 1080 rx_descriptor->length = 0; 1106 1081 rx_descriptor->checksum = 0; … … 1166 1141 } 1167 1142 1168 /** Receive packets1143 /** Receive frames 1169 1144 * 1170 1145 * @param nic NIC data 1171 1146 * 1172 1147 */ 1173 static void e1000_receive_ packets(nic_t *nic)1148 static void e1000_receive_frames(nic_t *nic) 1174 1149 { 1175 1150 e1000_t *e1000 = DRIVER_DATA_NIC(nic); … … 1178 1153 1179 1154 uint32_t *tail_addr = E1000_REG_ADDR(e1000, E1000_RDT); 1180 uint32_t next_tail = e1000_inc_tail(*tail_addr, E1000_RX_ PACKETS_COUNT);1155 uint32_t next_tail = e1000_inc_tail(*tail_addr, E1000_RX_FRAME_COUNT); 1181 1156 1182 1157 e1000_rx_descriptor_t *rx_descriptor = (e1000_rx_descriptor_t *) … … 1184 1159 1185 1160 while (rx_descriptor->status & 0x01) { 1186 uint32_t packet_size = rx_descriptor->length - E1000_CRC_SIZE;1161 uint32_t frame_size = rx_descriptor->length - E1000_CRC_SIZE; 1187 1162 1188 packet_t *packet = *(e1000->rx_ring_packets + next_tail); 1189 packet_suffix(packet, packet_size); 1190 1191 nic_dma_unlock_packet(packet, E1000_MAX_RECEIVE_PACKET_SIZE); 1192 nic_received_packet(nic, packet); 1163 nic_frame_t *frame = nic_alloc_frame(nic, frame_size); 1164 if (frame != NULL) { 1165 memcpy(frame->data, e1000->rx_frame_virt[next_tail], frame_size); 1166 nic_received_frame(nic, frame); 1167 } else { 1168 ddf_msg(LVL_ERROR, "Memory allocation failed. Frame dropped."); 1169 } 1193 1170 1194 1171 e1000_fill_new_rx_descriptor(nic, next_tail); 1195 1172 1196 *tail_addr = e1000_inc_tail(*tail_addr, E1000_RX_ PACKETS_COUNT);1197 next_tail = e1000_inc_tail(*tail_addr, E1000_RX_ PACKETS_COUNT);1173 *tail_addr = e1000_inc_tail(*tail_addr, E1000_RX_FRAME_COUNT); 1174 next_tail = e1000_inc_tail(*tail_addr, E1000_RX_FRAME_COUNT); 1198 1175 1199 1176 rx_descriptor = (e1000_rx_descriptor_t *) … … 1236 1213 { 1237 1214 if (icr & ICR_RXT0) 1238 e1000_receive_ packets(nic);1215 e1000_receive_frames(nic); 1239 1216 } 1240 1217 … … 1275 1252 fibril_mutex_lock(&irq_reg_mutex); 1276 1253 1277 e1000_irq_code.ranges[0].base = (uintptr_t) e1000->reg_base_phys; 1278 e1000_irq_code.cmds[0].addr = e1000->reg_base_phys + E1000_ICR; 1279 e1000_irq_code.cmds[2].addr = e1000->reg_base_phys + E1000_IMC; 1254 e1000_irq_code.cmds[0].addr = e1000->reg_base_virt + E1000_ICR; 1255 e1000_irq_code.cmds[2].addr = e1000->reg_base_virt + E1000_IMC; 1280 1256 1281 1257 int rc = register_interrupt_handler(nic_get_ddf_dev(nic), … … 1286 1262 } 1287 1263 1288 /** Force receiving all packets in the receive buffer1264 /** Force receiving all frames in the receive buffer 1289 1265 * 1290 1266 * @param nic NIC data … … 1359 1335 static void e1000_initialize_rx_registers(e1000_t *e1000) 1360 1336 { 1361 E1000_REG_WRITE(e1000, E1000_RDLEN, E1000_RX_ PACKETS_COUNT * 16);1337 E1000_REG_WRITE(e1000, E1000_RDLEN, E1000_RX_FRAME_COUNT * 16); 1362 1338 E1000_REG_WRITE(e1000, E1000_RDH, 0); 1363 1339 1364 1340 /* It is not posible to let HW use all descriptors */ 1365 E1000_REG_WRITE(e1000, E1000_RDT, E1000_RX_ PACKETS_COUNT - 1);1341 E1000_REG_WRITE(e1000, E1000_RDT, E1000_RX_FRAME_COUNT - 1); 1366 1342 1367 1343 /* Set Broadcast Enable Bit */ … … 1383 1359 1384 1360 int rc = dmamem_map_anonymous( 1385 E1000_RX_ PACKETS_COUNT * sizeof(e1000_rx_descriptor_t),1361 E1000_RX_FRAME_COUNT * sizeof(e1000_rx_descriptor_t), 1386 1362 AS_AREA_READ | AS_AREA_WRITE, 0, &e1000->rx_ring_phys, 1387 1363 &e1000->rx_ring_virt); … … 1394 1370 (uint32_t) PTR_TO_U64(e1000->rx_ring_phys)); 1395 1371 1396 e1000->rx_ring_packets = 1397 malloc(E1000_RX_PACKETS_COUNT * sizeof(packet_t *)); 1398 // FIXME: Check return value 1399 1372 e1000->rx_frame_phys = 1373 calloc(E1000_RX_FRAME_COUNT, sizeof(void *)); 1374 e1000->rx_frame_virt = 1375 calloc(E1000_RX_FRAME_COUNT, sizeof(void *)); 1376 if (e1000->rx_frame_phys == NULL || e1000->rx_frame_virt == NULL) { 1377 rc = ENOMEM; 1378 goto error; 1379 } 1380 1381 size_t i; 1382 void *frame_virt; 1383 void *frame_phys; 1384 1385 for (i = 0; i < E1000_RX_FRAME_COUNT; i++) { 1386 rc = dmamem_map_anonymous( 1387 E1000_MAX_SEND_FRAME_SIZE, AS_AREA_READ | AS_AREA_WRITE, 1388 0, &frame_phys, &frame_virt); 1389 if (rc != EOK) 1390 goto error; 1391 1392 e1000->rx_frame_virt[i] = frame_virt; 1393 e1000->rx_frame_phys[i] = frame_phys; 1394 } 1395 1396 /* Write descriptor */ 1397 for (i = 0; i < E1000_RX_FRAME_COUNT; i++) 1398 e1000_fill_new_rx_descriptor(nic, i); 1399 1400 e1000_initialize_rx_registers(e1000); 1401 1402 fibril_mutex_unlock(&e1000->rx_lock); 1403 return EOK; 1404 1405 error: 1406 for (i = 0; i < E1000_RX_FRAME_COUNT; i++) { 1407 if (e1000->rx_frame_virt[i] != NULL) { 1408 dmamem_unmap_anonymous(e1000->rx_frame_virt[i]); 1409 e1000->rx_frame_virt[i] = NULL; 1410 e1000->rx_frame_phys[i] = NULL; 1411 } 1412 } 1413 1414 if (e1000->rx_frame_phys != NULL) { 1415 free(e1000->rx_frame_phys); 1416 e1000->rx_frame_phys = NULL; 1417 } 1418 1419 if (e1000->rx_frame_virt != NULL) { 1420 free(e1000->rx_frame_virt); 1421 e1000->rx_frame_phys = NULL; 1422 } 1423 1424 return rc; 1425 } 1426 1427 /** Uninitialize receive structure 1428 * 1429 * @param nic NIC data 1430 * 1431 */ 1432 static void e1000_uninitialize_rx_structure(nic_t *nic) 1433 { 1434 e1000_t *e1000 = DRIVER_DATA_NIC(nic); 1435 1436 /* Write descriptor */ 1437 for (unsigned int offset = 0; offset < E1000_RX_FRAME_COUNT; offset++) { 1438 dmamem_unmap_anonymous(e1000->rx_frame_virt[offset]); 1439 e1000->rx_frame_virt[offset] = NULL; 1440 e1000->rx_frame_phys[offset] = NULL; 1441 } 1442 1443 free(e1000->rx_frame_virt); 1444 free(e1000->rx_frame_phys); 1445 e1000->rx_frame_virt = NULL; 1446 e1000->rx_frame_phys = NULL; 1447 dmamem_unmap_anonymous(e1000->rx_ring_virt); 1448 } 1449 1450 /** Clear receive descriptor ring 1451 * 1452 * @param e1000 E1000 data 1453 * 1454 */ 1455 static void e1000_clear_rx_ring(e1000_t *e1000) 1456 { 1400 1457 /* Write descriptor */ 1401 1458 for (unsigned int offset = 0; 1402 offset < E1000_RX_PACKETS_COUNT; 1403 offset++) 1404 e1000_fill_new_rx_descriptor(nic, offset); 1405 1406 e1000_initialize_rx_registers(e1000); 1407 1408 fibril_mutex_unlock(&e1000->rx_lock); 1409 return EOK; 1410 } 1411 1412 /** Uninitialize receive structure 1413 * 1414 * @param nic NIC data 1415 * 1416 */ 1417 static void e1000_uninitialize_rx_structure(nic_t *nic) 1418 { 1419 e1000_t *e1000 = DRIVER_DATA_NIC(nic); 1420 1421 /* Write descriptor */ 1422 for (unsigned int offset = 0; 1423 offset < E1000_RX_PACKETS_COUNT; 1424 offset++) { 1425 packet_t *packet = *(e1000->rx_ring_packets + offset); 1426 nic_dma_unlock_packet(packet, E1000_MAX_RECEIVE_PACKET_SIZE); 1427 nic_release_packet(nic, packet); 1428 } 1429 1430 free(e1000->rx_ring_packets); 1431 dmamem_unmap_anonymous(e1000->rx_ring_virt); 1432 } 1433 1434 /** Clear receive descriptor ring 1435 * 1436 * @param e1000 E1000 data 1437 * 1438 */ 1439 static void e1000_clear_rx_ring(e1000_t *e1000) 1440 { 1441 /* Write descriptor */ 1442 for (unsigned int offset = 0; 1443 offset < E1000_RX_PACKETS_COUNT; 1459 offset < E1000_RX_FRAME_COUNT; 1444 1460 offset++) 1445 1461 e1000_clear_rx_descriptor(e1000, offset); … … 1510 1526 static void e1000_initialize_tx_registers(e1000_t *e1000) 1511 1527 { 1512 E1000_REG_WRITE(e1000, E1000_TDLEN, E1000_TX_ PACKETS_COUNT * 16);1528 E1000_REG_WRITE(e1000, E1000_TDLEN, E1000_TX_FRAME_COUNT * 16); 1513 1529 E1000_REG_WRITE(e1000, E1000_TDH, 0); 1514 1530 E1000_REG_WRITE(e1000, E1000_TDT, 0); … … 1542 1558 1543 1559 int rc = dmamem_map_anonymous( 1544 E1000_TX_ PACKETS_COUNT * sizeof(e1000_tx_descriptor_t),1560 E1000_TX_FRAME_COUNT * sizeof(e1000_tx_descriptor_t), 1545 1561 AS_AREA_READ | AS_AREA_WRITE, 0, &e1000->tx_ring_phys, 1546 1562 &e1000->tx_ring_virt); … … 1549 1565 1550 1566 bzero(e1000->tx_ring_virt, 1551 E1000_TX_ PACKETS_COUNT * sizeof(e1000_tx_descriptor_t));1552 1553 e1000->tx_frame_phys = calloc(E1000_TX_ PACKETS_COUNT, sizeof(void *));1554 e1000->tx_frame_virt = calloc(E1000_TX_ PACKETS_COUNT, sizeof(void *));1567 E1000_TX_FRAME_COUNT * sizeof(e1000_tx_descriptor_t)); 1568 1569 e1000->tx_frame_phys = calloc(E1000_TX_FRAME_COUNT, sizeof(void *)); 1570 e1000->tx_frame_virt = calloc(E1000_TX_FRAME_COUNT, sizeof(void *)); 1555 1571 1556 1572 if (e1000->tx_frame_phys == NULL || e1000->tx_frame_virt == NULL) { … … 1559 1575 } 1560 1576 1561 for (i = 0; i < E1000_TX_ PACKETS_COUNT; i++) {1577 for (i = 0; i < E1000_TX_FRAME_COUNT; i++) { 1562 1578 rc = dmamem_map_anonymous( 1563 1579 E1000_MAX_SEND_FRAME_SIZE, AS_AREA_READ | AS_AREA_WRITE, … … 1584 1600 1585 1601 if (e1000->tx_frame_phys != NULL && e1000->tx_frame_virt != NULL) { 1586 for (i = 0; i < E1000_TX_ PACKETS_COUNT; i++) {1602 for (i = 0; i < E1000_TX_FRAME_COUNT; i++) { 1587 1603 if (e1000->tx_frame_virt[i] != NULL) { 1588 1604 dmamem_unmap_anonymous(e1000->tx_frame_virt[i]); … … 1615 1631 size_t i; 1616 1632 1617 for (i = 0; i < E1000_TX_ PACKETS_COUNT; i++) {1633 for (i = 0; i < E1000_TX_FRAME_COUNT; i++) { 1618 1634 dmamem_unmap_anonymous(e1000->tx_frame_virt[i]); 1619 1635 e1000->tx_frame_virt[i] = NULL; … … 1630 1646 e1000->tx_frame_phys = NULL; 1631 1647 } 1648 1632 1649 dmamem_unmap_anonymous(e1000->tx_ring_virt); 1633 1650 } … … 1642 1659 /* Write descriptor */ 1643 1660 for (unsigned int offset = 0; 1644 offset < E1000_TX_ PACKETS_COUNT;1661 offset < E1000_TX_FRAME_COUNT; 1645 1662 offset++) 1646 1663 e1000_clear_tx_descriptor(nic, offset); … … 1699 1716 } 1700 1717 1701 /** Activate the device to receive and transmit packets1718 /** Activate the device to receive and transmit frames 1702 1719 * 1703 1720 * @param nic NIC driver data … … 2040 2057 case E1000_82545: 2041 2058 case E1000_82546: 2042 case E1000_82572:2043 2059 e1000->info.eerd_start = 0x01; 2044 2060 e1000->info.eerd_done = 0x10; … … 2047 2063 break; 2048 2064 case E1000_82547: 2065 case E1000_82572: 2049 2066 case E1000_80003ES2: 2050 2067 e1000->info.eerd_start = 0x01; … … 2085 2102 int e1000_dev_add(ddf_dev_t *dev) 2086 2103 { 2104 ddf_fun_t *fun; 2087 2105 assert(dev); 2088 2106 … … 2115 2133 e1000_initialize_vlan(e1000); 2116 2134 2117 rc = nic_register_as_ddf_fun(nic, &e1000_dev_ops);2118 if ( rc != EOK)2135 fun = ddf_fun_create(nic_get_ddf_dev(nic), fun_exposed, "port0"); 2136 if (fun == NULL) 2119 2137 goto err_tx_structure; 2138 nic_set_ddf_fun(nic, fun); 2139 fun->ops = &e1000_dev_ops; 2140 fun->driver_data = nic; 2120 2141 2121 2142 rc = e1000_register_int_handler(nic); 2122 2143 if (rc != EOK) 2123 goto err_ tx_structure;2144 goto err_fun_create; 2124 2145 2125 2146 rc = nic_connect_to_services(nic); … … 2144 2165 goto err_rx_structure; 2145 2166 2167 rc = ddf_fun_bind(fun); 2168 if (rc != EOK) 2169 goto err_fun_bind; 2170 2171 rc = ddf_fun_add_to_category(fun, DEVICE_CATEGORY_NIC); 2172 if (rc != EOK) 2173 goto err_add_to_cat; 2174 2146 2175 return EOK; 2147 2176 2177 err_add_to_cat: 2178 ddf_fun_unbind(fun); 2179 err_fun_bind: 2148 2180 err_rx_structure: 2149 2181 e1000_uninitialize_rx_structure(nic); 2150 2182 err_irq: 2151 2183 unregister_interrupt_handler(dev, DRIVER_DATA_DEV(dev)->irq); 2184 err_fun_create: 2185 ddf_fun_destroy(fun); 2186 nic_set_ddf_fun(nic, NULL); 2152 2187 err_tx_structure: 2153 2188 e1000_uninitialize_tx_structure(e1000); … … 2295 2330 2296 2331 if (!descriptor_available) { 2297 /* Packetlost */2332 /* Frame lost */ 2298 2333 fibril_mutex_unlock(&e1000->tx_lock); 2299 2334 return; … … 2324 2359 2325 2360 tdt++; 2326 if (tdt == E1000_TX_ PACKETS_COUNT)2361 if (tdt == E1000_TX_FRAME_COUNT) 2327 2362 tdt = 0; 2328 2363
Note:
See TracChangeset
for help on using the changeset viewer.