Changes in uspace/drv/nic/e1k/e1k.c [8820544:acdb5bac] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/nic/e1k/e1k.c
r8820544 racdb5bac 33 33 */ 34 34 35 /* XXX Fix this */ 36 #define _DDF_DATA_IMPLANT 37 35 38 #include <assert.h> 36 39 #include <stdio.h> … … 39 42 #include <align.h> 40 43 #include <byteorder.h> 41 #include <irc.h> 44 #include <sysinfo.h> 45 #include <ipc/irc.h> 46 #include <ipc/ns.h> 47 #include <ddi.h> 42 48 #include <as.h> 43 #include <ddi.h>44 49 #include <ddf/log.h> 45 50 #include <ddf/interrupt.h> 46 51 #include <device/hw_res_parsed.h> 47 #include < pci_dev_iface.h>52 #include <device/pci.h> 48 53 #include <nic.h> 49 54 #include <ops/nic.h> … … 71 76 /** ddf_fun_t * -> nic_driver_data_t* cast */ 72 77 #define NIC_DATA_FUN(fun) \ 73 ((nic_t *) ddf_ dev_data_get(ddf_fun_get_dev(fun)))78 ((nic_t *) ddf_fun_data_get(fun)) 74 79 75 80 /** ddf_dev_t * -> nic_driver_data_t* cast */ … … 124 129 125 130 /** Physical tx ring address */ 126 uintptr_ttx_ring_phys;131 void *tx_ring_phys; 127 132 /** Virtual tx ring address */ 128 133 void *tx_ring_virt; 129 134 130 135 /** Ring of TX frames, physical address */ 131 uintptr_t*tx_frame_phys;136 void **tx_frame_phys; 132 137 /** Ring of TX frames, virtual address */ 133 138 void **tx_frame_virt; 134 139 135 140 /** Physical rx ring address */ 136 uintptr_trx_ring_phys;141 void *rx_ring_phys; 137 142 /** Virtual rx ring address */ 138 143 void *rx_ring_virt; 139 144 140 145 /** Ring of RX frames, physical address */ 141 uintptr_t*rx_frame_phys;146 void **rx_frame_phys; 142 147 /** Ring of RX frames, virtual address */ 143 148 void **rx_frame_virt; … … 1229 1234 /** Handle device interrupt 1230 1235 * 1236 * @param dev E1000 device 1231 1237 * @param iid IPC call id 1232 1238 * @param icall IPC call structure 1233 * @param dev E1000 device 1234 * 1235 */ 1236 static void e1000_interrupt_handler(ipc_callid_t iid, ipc_call_t *icall, 1237 ddf_dev_t *dev) 1239 * 1240 */ 1241 static void e1000_interrupt_handler(ddf_dev_t *dev, ipc_callid_t iid, 1242 ipc_call_t *icall) 1238 1243 { 1239 1244 uint32_t icr = (uint32_t) IPC_GET_ARG2(*icall); … … 1370 1375 fibril_mutex_lock(&e1000->rx_lock); 1371 1376 1372 e1000->rx_ring_virt = AS_AREA_ANY;1373 1377 int rc = dmamem_map_anonymous( 1374 1378 E1000_RX_FRAME_COUNT * sizeof(e1000_rx_descriptor_t), 1375 DMAMEM_4GiB, AS_AREA_READ | AS_AREA_WRITE, 0,1376 &e1000->rx_ring_ phys, &e1000->rx_ring_virt);1379 AS_AREA_READ | AS_AREA_WRITE, 0, &e1000->rx_ring_phys, 1380 &e1000->rx_ring_virt); 1377 1381 if (rc != EOK) 1378 1382 return rc; … … 1383 1387 (uint32_t) PTR_TO_U64(e1000->rx_ring_phys)); 1384 1388 1385 e1000->rx_frame_phys = (uintptr_t *)1386 calloc(E1000_RX_FRAME_COUNT, sizeof( uintptr_t));1389 e1000->rx_frame_phys = 1390 calloc(E1000_RX_FRAME_COUNT, sizeof(void *)); 1387 1391 e1000->rx_frame_virt = 1388 1392 calloc(E1000_RX_FRAME_COUNT, sizeof(void *)); 1389 if ( (e1000->rx_frame_phys == NULL) || (e1000->rx_frame_virt == NULL)) {1393 if (e1000->rx_frame_phys == NULL || e1000->rx_frame_virt == NULL) { 1390 1394 rc = ENOMEM; 1391 1395 goto error; 1392 1396 } 1393 1397 1394 for (size_t i = 0; i < E1000_RX_FRAME_COUNT; i++) { 1395 uintptr_t frame_phys; 1396 void *frame_virt = AS_AREA_ANY; 1397 1398 rc = dmamem_map_anonymous(E1000_MAX_SEND_FRAME_SIZE, 1399 DMAMEM_4GiB, AS_AREA_READ | AS_AREA_WRITE, 0, 1400 &frame_phys, &frame_virt); 1398 size_t i; 1399 void *frame_virt; 1400 void *frame_phys; 1401 1402 for (i = 0; i < E1000_RX_FRAME_COUNT; i++) { 1403 rc = dmamem_map_anonymous( 1404 E1000_MAX_SEND_FRAME_SIZE, AS_AREA_READ | AS_AREA_WRITE, 1405 0, &frame_phys, &frame_virt); 1401 1406 if (rc != EOK) 1402 1407 goto error; 1403 1408 1409 e1000->rx_frame_virt[i] = frame_virt; 1404 1410 e1000->rx_frame_phys[i] = frame_phys; 1405 e1000->rx_frame_virt[i] = frame_virt;1406 1411 } 1407 1412 1408 1413 /* Write descriptor */ 1409 for ( size_ti = 0; i < E1000_RX_FRAME_COUNT; i++)1414 for (i = 0; i < E1000_RX_FRAME_COUNT; i++) 1410 1415 e1000_fill_new_rx_descriptor(nic, i); 1411 1416 … … 1416 1421 1417 1422 error: 1418 for ( size_ti = 0; i < E1000_RX_FRAME_COUNT; i++) {1423 for (i = 0; i < E1000_RX_FRAME_COUNT; i++) { 1419 1424 if (e1000->rx_frame_virt[i] != NULL) { 1420 1425 dmamem_unmap_anonymous(e1000->rx_frame_virt[i]); 1421 e1000->rx_frame_phys[i] = 0;1422 1426 e1000->rx_frame_virt[i] = NULL; 1427 e1000->rx_frame_phys[i] = NULL; 1423 1428 } 1424 1429 } … … 1431 1436 if (e1000->rx_frame_virt != NULL) { 1432 1437 free(e1000->rx_frame_virt); 1433 e1000->rx_frame_ virt= NULL;1438 e1000->rx_frame_phys = NULL; 1434 1439 } 1435 1440 … … 1449 1454 for (unsigned int offset = 0; offset < E1000_RX_FRAME_COUNT; offset++) { 1450 1455 dmamem_unmap_anonymous(e1000->rx_frame_virt[offset]); 1451 e1000->rx_frame_phys[offset] = 0;1452 1456 e1000->rx_frame_virt[offset] = NULL; 1457 e1000->rx_frame_phys[offset] = NULL; 1453 1458 } 1454 1459 1455 1460 free(e1000->rx_frame_virt); 1456 1461 free(e1000->rx_frame_phys); 1462 e1000->rx_frame_virt = NULL; 1457 1463 e1000->rx_frame_phys = NULL; 1458 e1000->rx_frame_virt = NULL;1459 1460 1464 dmamem_unmap_anonymous(e1000->rx_ring_virt); 1461 1465 } … … 1565 1569 fibril_mutex_lock(&e1000->tx_lock); 1566 1570 1567 e1000->tx_ring_phys = 0; 1568 e1000->tx_ring_virt = AS_AREA_ANY; 1569 1571 e1000->tx_ring_phys = NULL; 1572 e1000->tx_ring_virt = NULL; 1570 1573 e1000->tx_frame_phys = NULL; 1571 1574 e1000->tx_frame_virt = NULL; … … 1573 1576 int rc = dmamem_map_anonymous( 1574 1577 E1000_TX_FRAME_COUNT * sizeof(e1000_tx_descriptor_t), 1575 DMAMEM_4GiB, AS_AREA_READ | AS_AREA_WRITE, 0,1576 &e1000->tx_ring_ phys, &e1000->tx_ring_virt);1578 AS_AREA_READ | AS_AREA_WRITE, 0, &e1000->tx_ring_phys, 1579 &e1000->tx_ring_virt); 1577 1580 if (rc != EOK) 1578 1581 goto error; … … 1581 1584 E1000_TX_FRAME_COUNT * sizeof(e1000_tx_descriptor_t)); 1582 1585 1583 e1000->tx_frame_phys = (uintptr_t *) 1584 calloc(E1000_TX_FRAME_COUNT, sizeof(uintptr_t)); 1585 e1000->tx_frame_virt = 1586 calloc(E1000_TX_FRAME_COUNT, sizeof(void *)); 1587 1588 if ((e1000->tx_frame_phys == NULL) || (e1000->tx_frame_virt == NULL)) { 1586 e1000->tx_frame_phys = calloc(E1000_TX_FRAME_COUNT, sizeof(void *)); 1587 e1000->tx_frame_virt = calloc(E1000_TX_FRAME_COUNT, sizeof(void *)); 1588 1589 if (e1000->tx_frame_phys == NULL || e1000->tx_frame_virt == NULL) { 1589 1590 rc = ENOMEM; 1590 1591 goto error; … … 1592 1593 1593 1594 for (i = 0; i < E1000_TX_FRAME_COUNT; i++) { 1594 e1000->tx_frame_virt[i] = AS_AREA_ANY; 1595 rc = dmamem_map_anonymous(E1000_MAX_SEND_FRAME_SIZE, 1596 DMAMEM_4GiB, AS_AREA_READ | AS_AREA_WRITE, 1595 rc = dmamem_map_anonymous( 1596 E1000_MAX_SEND_FRAME_SIZE, AS_AREA_READ | AS_AREA_WRITE, 1597 1597 0, &e1000->tx_frame_phys[i], &e1000->tx_frame_virt[i]); 1598 1598 if (rc != EOK) … … 1616 1616 } 1617 1617 1618 if ( (e1000->tx_frame_phys != NULL) && (e1000->tx_frame_virt != NULL)) {1618 if (e1000->tx_frame_phys != NULL && e1000->tx_frame_virt != NULL) { 1619 1619 for (i = 0; i < E1000_TX_FRAME_COUNT; i++) { 1620 1620 if (e1000->tx_frame_virt[i] != NULL) { 1621 1621 dmamem_unmap_anonymous(e1000->tx_frame_virt[i]); 1622 e1000->tx_frame_phys[i] = 0;1623 1622 e1000->tx_frame_virt[i] = NULL; 1623 e1000->tx_frame_phys[i] = NULL; 1624 1624 } 1625 1625 } … … 1633 1633 if (e1000->tx_frame_virt != NULL) { 1634 1634 free(e1000->tx_frame_virt); 1635 e1000->tx_frame_ virt= NULL;1635 e1000->tx_frame_phys = NULL; 1636 1636 } 1637 1637 … … 1650 1650 for (i = 0; i < E1000_TX_FRAME_COUNT; i++) { 1651 1651 dmamem_unmap_anonymous(e1000->tx_frame_virt[i]); 1652 e1000->tx_frame_phys[i] = 0;1653 1652 e1000->tx_frame_virt[i] = NULL; 1653 e1000->tx_frame_phys[i] = NULL; 1654 1654 } 1655 1655 … … 1661 1661 if (e1000->tx_frame_virt != NULL) { 1662 1662 free(e1000->tx_frame_virt); 1663 e1000->tx_frame_ virt= NULL;1663 e1000->tx_frame_phys = NULL; 1664 1664 } 1665 1665 … … 1753 1753 e1000_enable_interrupts(e1000); 1754 1754 1755 int rc = irc_enable_interrupt(e1000->irq); 1756 if (rc != EOK) { 1757 e1000_disable_interrupts(e1000); 1758 fibril_mutex_unlock(&e1000->ctrl_lock); 1759 fibril_mutex_unlock(&e1000->tx_lock); 1760 fibril_mutex_unlock(&e1000->rx_lock); 1761 return rc; 1762 } 1755 nic_enable_interrupt(nic, e1000->irq); 1763 1756 1764 1757 e1000_clear_rx_ring(e1000); … … 1798 1791 e1000_disable_rx(e1000); 1799 1792 1800 irc_disable_interrupt(e1000->irq);1793 nic_disable_interrupt(nic, e1000->irq); 1801 1794 e1000_disable_interrupts(e1000); 1802 1795 … … 1944 1937 e1000->irq = hw_resources->irqs.irqs[0]; 1945 1938 e1000->reg_base_phys = 1946 MEMADDR_TO_PTR( RNGABS(hw_resources->mem_ranges.ranges[0]));1939 MEMADDR_TO_PTR(hw_resources->mem_ranges.ranges[0].address); 1947 1940 1948 1941 return EOK; … … 2150 2143 nic_set_ddf_fun(nic, fun); 2151 2144 ddf_fun_set_ops(fun, &e1000_dev_ops); 2145 ddf_fun_data_implant(fun, nic); 2152 2146 2153 2147 rc = e1000_register_int_handler(nic); 2154 2148 if (rc != EOK) 2155 2149 goto err_fun_create; 2150 2151 rc = nic_connect_to_services(nic); 2152 if (rc != EOK) 2153 goto err_irq; 2156 2154 2157 2155 rc = e1000_initialize_rx_structure(nic); … … 2376 2374 int main(void) 2377 2375 { 2378 printf("%s: HelenOS E1000 network adapter driver\n", NAME); 2379 2380 if (nic_driver_init(NAME) != EOK) 2381 return 1; 2376 int rc = nic_driver_init(NAME); 2377 if (rc != EOK) 2378 return rc; 2382 2379 2383 2380 nic_driver_implement(&e1000_driver_ops, &e1000_dev_ops, … … 2385 2382 2386 2383 ddf_log_init(NAME); 2384 ddf_msg(LVL_NOTE, "HelenOS E1000 driver started"); 2387 2385 return ddf_driver_main(&e1000_driver); 2388 2386 }
Note:
See TracChangeset
for help on using the changeset viewer.