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