Changeset cfb79747 in mainline for uspace/drv/nic/e1k/e1k.c
- Timestamp:
- 2012-02-14T22:06:15Z (12 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- a31aad1
- Parents:
- 199112e4 (diff), e10d41a (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. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/nic/e1k/e1k.c
r199112e4 rcfb79747 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 … … 488 487 } 489 488 490 /** Get state of acceptance of weird packets489 /** Get state of acceptance of weird frames 491 490 * 492 491 * @param device Device to check … … 506 505 }; 507 506 508 /** Set acceptance of weird packets507 /** Set acceptance of weird frames 509 508 * 510 509 * @param device Device to update … … 690 689 } 691 690 692 /** Disable receiving packets for default address691 /** Disable receiving frames for default address 693 692 * 694 693 * @param e1000 E1000 data structure … … 702 701 } 703 702 704 /** Enable receiving packets for default address703 /** Enable receiving frames for default address 705 704 * 706 705 * @param e1000 E1000 data structure … … 762 761 } 763 762 764 /** Enable accepting of broadcast packets763 /** Enable accepting of broadcast frames 765 764 * 766 765 * @param e1000 E1000 data structure … … 774 773 } 775 774 776 /** Disable accepting of broadcast packets775 /** Disable accepting of broadcast frames 777 776 * 778 777 * @param e1000 E1000 data structure … … 810 809 } 811 810 812 /** Set multicast packets acceptance mode811 /** Set multicast frames acceptance mode 813 812 * 814 813 * @param nic NIC device to update … … 864 863 } 865 864 866 /** Set unicast packets acceptance mode865 /** Set unicast frames acceptance mode 867 866 * 868 867 * @param nic NIC device to update … … 922 921 } 923 922 924 /** Set broadcast packets acceptance mode923 /** Set broadcast frames acceptance mode 925 924 * 926 925 * @param nic NIC device to update … … 1007 1006 if (vlan_mask) { 1008 1007 /* 1009 * Disable receiving, so that packetmatching1008 * Disable receiving, so that frame matching 1010 1009 * partially written VLAN is not received. 1011 1010 */ … … 1074 1073 } 1075 1074 1076 /** Fill receive descriptor with new empty packet1077 * 1078 * Store packet in e1000->rx_ring_packets1075 /** Fill receive descriptor with new empty buffer 1076 * 1077 * Store frame in e1000->rx_frame_phys 1079 1078 * 1080 1079 * @param nic NIC data stricture … … 1085 1084 { 1086 1085 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; 1086 1093 1087 e1000_rx_descriptor_t *rx_descriptor = (e1000_rx_descriptor_t *) 1094 1088 (e1000->rx_ring_virt + offset * sizeof(e1000_rx_descriptor_t)); 1095 1089 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 1090 rx_descriptor->phys_addr = PTR_TO_U64(e1000->rx_frame_phys[offset]); 1105 1091 rx_descriptor->length = 0; 1106 1092 rx_descriptor->checksum = 0; … … 1166 1152 } 1167 1153 1168 /** Receive packets1154 /** Receive frames 1169 1155 * 1170 1156 * @param nic NIC data 1171 1157 * 1172 1158 */ 1173 static void e1000_receive_ packets(nic_t *nic)1159 static void e1000_receive_frames(nic_t *nic) 1174 1160 { 1175 1161 e1000_t *e1000 = DRIVER_DATA_NIC(nic); … … 1178 1164 1179 1165 uint32_t *tail_addr = E1000_REG_ADDR(e1000, E1000_RDT); 1180 uint32_t next_tail = e1000_inc_tail(*tail_addr, E1000_RX_ PACKETS_COUNT);1166 uint32_t next_tail = e1000_inc_tail(*tail_addr, E1000_RX_FRAME_COUNT); 1181 1167 1182 1168 e1000_rx_descriptor_t *rx_descriptor = (e1000_rx_descriptor_t *) … … 1184 1170 1185 1171 while (rx_descriptor->status & 0x01) { 1186 uint32_t packet_size = rx_descriptor->length - E1000_CRC_SIZE;1172 uint32_t frame_size = rx_descriptor->length - E1000_CRC_SIZE; 1187 1173 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); 1174 nic_frame_t *frame = nic_alloc_frame(nic, frame_size); 1175 if (frame != NULL) { 1176 memcpy(frame->data, e1000->rx_frame_virt[next_tail], frame_size); 1177 nic_received_frame(nic, frame); 1178 } else { 1179 ddf_msg(LVL_ERROR, "Memory allocation failed. Frame dropped."); 1180 } 1193 1181 1194 1182 e1000_fill_new_rx_descriptor(nic, next_tail); 1195 1183 1196 *tail_addr = e1000_inc_tail(*tail_addr, E1000_RX_ PACKETS_COUNT);1197 next_tail = e1000_inc_tail(*tail_addr, E1000_RX_ PACKETS_COUNT);1184 *tail_addr = e1000_inc_tail(*tail_addr, E1000_RX_FRAME_COUNT); 1185 next_tail = e1000_inc_tail(*tail_addr, E1000_RX_FRAME_COUNT); 1198 1186 1199 1187 rx_descriptor = (e1000_rx_descriptor_t *) … … 1236 1224 { 1237 1225 if (icr & ICR_RXT0) 1238 e1000_receive_ packets(nic);1226 e1000_receive_frames(nic); 1239 1227 } 1240 1228 … … 1286 1274 } 1287 1275 1288 /** Force receiving all packets in the receive buffer1276 /** Force receiving all frames in the receive buffer 1289 1277 * 1290 1278 * @param nic NIC data … … 1359 1347 static void e1000_initialize_rx_registers(e1000_t *e1000) 1360 1348 { 1361 E1000_REG_WRITE(e1000, E1000_RDLEN, E1000_RX_ PACKETS_COUNT * 16);1349 E1000_REG_WRITE(e1000, E1000_RDLEN, E1000_RX_FRAME_COUNT * 16); 1362 1350 E1000_REG_WRITE(e1000, E1000_RDH, 0); 1363 1351 1364 1352 /* It is not posible to let HW use all descriptors */ 1365 E1000_REG_WRITE(e1000, E1000_RDT, E1000_RX_ PACKETS_COUNT - 1);1353 E1000_REG_WRITE(e1000, E1000_RDT, E1000_RX_FRAME_COUNT - 1); 1366 1354 1367 1355 /* Set Broadcast Enable Bit */ … … 1383 1371 1384 1372 int rc = dmamem_map_anonymous( 1385 E1000_RX_ PACKETS_COUNT * sizeof(e1000_rx_descriptor_t),1373 E1000_RX_FRAME_COUNT * sizeof(e1000_rx_descriptor_t), 1386 1374 AS_AREA_READ | AS_AREA_WRITE, 0, &e1000->rx_ring_phys, 1387 1375 &e1000->rx_ring_virt); … … 1394 1382 (uint32_t) PTR_TO_U64(e1000->rx_ring_phys)); 1395 1383 1396 e1000->rx_ring_packets = 1397 malloc(E1000_RX_PACKETS_COUNT * sizeof(packet_t *)); 1398 // FIXME: Check return value 1399 1384 e1000->rx_frame_phys = 1385 calloc(E1000_RX_FRAME_COUNT, sizeof(void *)); 1386 e1000->rx_frame_virt = 1387 calloc(E1000_RX_FRAME_COUNT, sizeof(void *)); 1388 if (e1000->rx_frame_phys == NULL || e1000->rx_frame_virt == NULL) { 1389 rc = ENOMEM; 1390 goto error; 1391 } 1392 1393 size_t i; 1394 void *frame_virt; 1395 void *frame_phys; 1396 1397 for (i = 0; i < E1000_RX_FRAME_COUNT; i++) { 1398 rc = dmamem_map_anonymous( 1399 E1000_MAX_SEND_FRAME_SIZE, AS_AREA_READ | AS_AREA_WRITE, 1400 0, &frame_phys, &frame_virt); 1401 if (rc != EOK) 1402 goto error; 1403 1404 e1000->rx_frame_virt[i] = frame_virt; 1405 e1000->rx_frame_phys[i] = frame_phys; 1406 } 1407 1408 /* Write descriptor */ 1409 for (i = 0; i < E1000_RX_FRAME_COUNT; i++) 1410 e1000_fill_new_rx_descriptor(nic, i); 1411 1412 e1000_initialize_rx_registers(e1000); 1413 1414 fibril_mutex_unlock(&e1000->rx_lock); 1415 return EOK; 1416 1417 error: 1418 for (i = 0; i < E1000_RX_FRAME_COUNT; i++) { 1419 if (e1000->rx_frame_virt[i] != NULL) { 1420 dmamem_unmap_anonymous(e1000->rx_frame_virt[i]); 1421 e1000->rx_frame_virt[i] = NULL; 1422 e1000->rx_frame_phys[i] = NULL; 1423 } 1424 } 1425 1426 if (e1000->rx_frame_phys != NULL) { 1427 free(e1000->rx_frame_phys); 1428 e1000->rx_frame_phys = NULL; 1429 } 1430 1431 if (e1000->rx_frame_virt != NULL) { 1432 free(e1000->rx_frame_virt); 1433 e1000->rx_frame_phys = NULL; 1434 } 1435 1436 return rc; 1437 } 1438 1439 /** Uninitialize receive structure 1440 * 1441 * @param nic NIC data 1442 * 1443 */ 1444 static void e1000_uninitialize_rx_structure(nic_t *nic) 1445 { 1446 e1000_t *e1000 = DRIVER_DATA_NIC(nic); 1447 1448 /* Write descriptor */ 1449 for (unsigned int offset = 0; offset < E1000_RX_FRAME_COUNT; offset++) { 1450 dmamem_unmap_anonymous(e1000->rx_frame_virt[offset]); 1451 e1000->rx_frame_virt[offset] = NULL; 1452 e1000->rx_frame_phys[offset] = NULL; 1453 } 1454 1455 free(e1000->rx_frame_virt); 1456 free(e1000->rx_frame_phys); 1457 e1000->rx_frame_virt = NULL; 1458 e1000->rx_frame_phys = NULL; 1459 dmamem_unmap_anonymous(e1000->rx_ring_virt); 1460 } 1461 1462 /** Clear receive descriptor ring 1463 * 1464 * @param e1000 E1000 data 1465 * 1466 */ 1467 static void e1000_clear_rx_ring(e1000_t *e1000) 1468 { 1400 1469 /* Write descriptor */ 1401 1470 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; 1471 offset < E1000_RX_FRAME_COUNT; 1444 1472 offset++) 1445 1473 e1000_clear_rx_descriptor(e1000, offset); … … 1510 1538 static void e1000_initialize_tx_registers(e1000_t *e1000) 1511 1539 { 1512 E1000_REG_WRITE(e1000, E1000_TDLEN, E1000_TX_ PACKETS_COUNT * 16);1540 E1000_REG_WRITE(e1000, E1000_TDLEN, E1000_TX_FRAME_COUNT * 16); 1513 1541 E1000_REG_WRITE(e1000, E1000_TDH, 0); 1514 1542 E1000_REG_WRITE(e1000, E1000_TDT, 0); … … 1542 1570 1543 1571 int rc = dmamem_map_anonymous( 1544 E1000_TX_ PACKETS_COUNT * sizeof(e1000_tx_descriptor_t),1572 E1000_TX_FRAME_COUNT * sizeof(e1000_tx_descriptor_t), 1545 1573 AS_AREA_READ | AS_AREA_WRITE, 0, &e1000->tx_ring_phys, 1546 1574 &e1000->tx_ring_virt); … … 1549 1577 1550 1578 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 *));1579 E1000_TX_FRAME_COUNT * sizeof(e1000_tx_descriptor_t)); 1580 1581 e1000->tx_frame_phys = calloc(E1000_TX_FRAME_COUNT, sizeof(void *)); 1582 e1000->tx_frame_virt = calloc(E1000_TX_FRAME_COUNT, sizeof(void *)); 1555 1583 1556 1584 if (e1000->tx_frame_phys == NULL || e1000->tx_frame_virt == NULL) { … … 1559 1587 } 1560 1588 1561 for (i = 0; i < E1000_TX_ PACKETS_COUNT; i++) {1589 for (i = 0; i < E1000_TX_FRAME_COUNT; i++) { 1562 1590 rc = dmamem_map_anonymous( 1563 1591 E1000_MAX_SEND_FRAME_SIZE, AS_AREA_READ | AS_AREA_WRITE, … … 1584 1612 1585 1613 if (e1000->tx_frame_phys != NULL && e1000->tx_frame_virt != NULL) { 1586 for (i = 0; i < E1000_TX_ PACKETS_COUNT; i++) {1614 for (i = 0; i < E1000_TX_FRAME_COUNT; i++) { 1587 1615 if (e1000->tx_frame_virt[i] != NULL) { 1588 1616 dmamem_unmap_anonymous(e1000->tx_frame_virt[i]); … … 1615 1643 size_t i; 1616 1644 1617 for (i = 0; i < E1000_TX_ PACKETS_COUNT; i++) {1645 for (i = 0; i < E1000_TX_FRAME_COUNT; i++) { 1618 1646 dmamem_unmap_anonymous(e1000->tx_frame_virt[i]); 1619 1647 e1000->tx_frame_virt[i] = NULL; … … 1630 1658 e1000->tx_frame_phys = NULL; 1631 1659 } 1660 1632 1661 dmamem_unmap_anonymous(e1000->tx_ring_virt); 1633 1662 } … … 1642 1671 /* Write descriptor */ 1643 1672 for (unsigned int offset = 0; 1644 offset < E1000_TX_ PACKETS_COUNT;1673 offset < E1000_TX_FRAME_COUNT; 1645 1674 offset++) 1646 1675 e1000_clear_tx_descriptor(nic, offset); … … 1699 1728 } 1700 1729 1701 /** Activate the device to receive and transmit packets1730 /** Activate the device to receive and transmit frames 1702 1731 * 1703 1732 * @param nic NIC driver data … … 2040 2069 case E1000_82545: 2041 2070 case E1000_82546: 2042 case E1000_82572:2043 2071 e1000->info.eerd_start = 0x01; 2044 2072 e1000->info.eerd_done = 0x10; … … 2047 2075 break; 2048 2076 case E1000_82547: 2077 case E1000_82572: 2049 2078 case E1000_80003ES2: 2050 2079 e1000->info.eerd_start = 0x01; … … 2085 2114 int e1000_dev_add(ddf_dev_t *dev) 2086 2115 { 2116 ddf_fun_t *fun; 2087 2117 assert(dev); 2088 2118 … … 2115 2145 e1000_initialize_vlan(e1000); 2116 2146 2117 rc = nic_register_as_ddf_fun(nic, &e1000_dev_ops);2118 if ( rc != EOK)2147 fun = ddf_fun_create(nic_get_ddf_dev(nic), fun_exposed, "port0"); 2148 if (fun == NULL) 2119 2149 goto err_tx_structure; 2150 nic_set_ddf_fun(nic, fun); 2151 fun->ops = &e1000_dev_ops; 2152 fun->driver_data = nic; 2120 2153 2121 2154 rc = e1000_register_int_handler(nic); 2122 2155 if (rc != EOK) 2123 goto err_ tx_structure;2156 goto err_fun_create; 2124 2157 2125 2158 rc = nic_connect_to_services(nic); … … 2144 2177 goto err_rx_structure; 2145 2178 2179 rc = ddf_fun_bind(fun); 2180 if (rc != EOK) 2181 goto err_fun_bind; 2182 2183 rc = ddf_fun_add_to_category(fun, DEVICE_CATEGORY_NIC); 2184 if (rc != EOK) 2185 goto err_add_to_cat; 2186 2146 2187 return EOK; 2147 2188 2189 err_add_to_cat: 2190 ddf_fun_unbind(fun); 2191 err_fun_bind: 2148 2192 err_rx_structure: 2149 2193 e1000_uninitialize_rx_structure(nic); 2150 2194 err_irq: 2151 2195 unregister_interrupt_handler(dev, DRIVER_DATA_DEV(dev)->irq); 2196 err_fun_create: 2197 ddf_fun_destroy(fun); 2198 nic_set_ddf_fun(nic, NULL); 2152 2199 err_tx_structure: 2153 2200 e1000_uninitialize_tx_structure(e1000); … … 2295 2342 2296 2343 if (!descriptor_available) { 2297 /* Packetlost */2344 /* Frame lost */ 2298 2345 fibril_mutex_unlock(&e1000->tx_lock); 2299 2346 return; … … 2324 2371 2325 2372 tdt++; 2326 if (tdt == E1000_TX_ PACKETS_COUNT)2373 if (tdt == E1000_TX_FRAME_COUNT) 2327 2374 tdt = 0; 2328 2375
Note:
See TracChangeset
for help on using the changeset viewer.