Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/nic/e1k/e1k.c

    r8820544 racdb5bac  
    3333 */
    3434
     35/* XXX Fix this */
     36#define _DDF_DATA_IMPLANT
     37
    3538#include <assert.h>
    3639#include <stdio.h>
     
    3942#include <align.h>
    4043#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>
    4248#include <as.h>
    43 #include <ddi.h>
    4449#include <ddf/log.h>
    4550#include <ddf/interrupt.h>
    4651#include <device/hw_res_parsed.h>
    47 #include <pci_dev_iface.h>
     52#include <device/pci.h>
    4853#include <nic.h>
    4954#include <ops/nic.h>
     
    7176/** ddf_fun_t * -> nic_driver_data_t* cast */
    7277#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))
    7479
    7580/** ddf_dev_t * -> nic_driver_data_t* cast */
     
    124129       
    125130        /** Physical tx ring address */
    126         uintptr_t tx_ring_phys;
     131        void *tx_ring_phys;
    127132        /** Virtual tx ring address */
    128133        void *tx_ring_virt;
    129134       
    130135        /** Ring of TX frames, physical address */
    131         uintptr_t *tx_frame_phys;
     136        void **tx_frame_phys;
    132137        /** Ring of TX frames, virtual address */
    133138        void **tx_frame_virt;
    134139       
    135140        /** Physical rx ring address */
    136         uintptr_t rx_ring_phys;
     141        void *rx_ring_phys;
    137142        /** Virtual rx ring address */
    138143        void *rx_ring_virt;
    139144       
    140145        /** Ring of RX frames, physical address */
    141         uintptr_t *rx_frame_phys;
     146        void **rx_frame_phys;
    142147        /** Ring of RX frames, virtual address */
    143148        void **rx_frame_virt;
     
    12291234/** Handle device interrupt
    12301235 *
     1236 * @param dev   E1000 device
    12311237 * @param iid   IPC call id
    12321238 * @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 */
     1241static void e1000_interrupt_handler(ddf_dev_t *dev, ipc_callid_t iid,
     1242    ipc_call_t *icall)
    12381243{
    12391244        uint32_t icr = (uint32_t) IPC_GET_ARG2(*icall);
     
    13701375        fibril_mutex_lock(&e1000->rx_lock);
    13711376       
    1372         e1000->rx_ring_virt = AS_AREA_ANY;
    13731377        int rc = dmamem_map_anonymous(
    13741378            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);
    13771381        if (rc != EOK)
    13781382                return rc;
     
    13831387            (uint32_t) PTR_TO_U64(e1000->rx_ring_phys));
    13841388       
    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 *));
    13871391        e1000->rx_frame_virt =
    13881392            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) {
    13901394                rc = ENOMEM;
    13911395                goto error;
    13921396        }
    13931397       
    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);
    14011406                if (rc != EOK)
    14021407                        goto error;
    14031408               
     1409                e1000->rx_frame_virt[i] = frame_virt;
    14041410                e1000->rx_frame_phys[i] = frame_phys;
    1405                 e1000->rx_frame_virt[i] = frame_virt;
    14061411        }
    14071412       
    14081413        /* Write descriptor */
    1409         for (size_t i = 0; i < E1000_RX_FRAME_COUNT; i++)
     1414        for (i = 0; i < E1000_RX_FRAME_COUNT; i++)
    14101415                e1000_fill_new_rx_descriptor(nic, i);
    14111416       
     
    14161421       
    14171422error:
    1418         for (size_t i = 0; i < E1000_RX_FRAME_COUNT; i++) {
     1423        for (i = 0; i < E1000_RX_FRAME_COUNT; i++) {
    14191424                if (e1000->rx_frame_virt[i] != NULL) {
    14201425                        dmamem_unmap_anonymous(e1000->rx_frame_virt[i]);
    1421                         e1000->rx_frame_phys[i] = 0;
    14221426                        e1000->rx_frame_virt[i] = NULL;
     1427                        e1000->rx_frame_phys[i] = NULL;
    14231428                }
    14241429        }
     
    14311436        if (e1000->rx_frame_virt != NULL) {
    14321437                free(e1000->rx_frame_virt);
    1433                 e1000->rx_frame_virt = NULL;
     1438                e1000->rx_frame_phys = NULL;
    14341439        }
    14351440       
     
    14491454        for (unsigned int offset = 0; offset < E1000_RX_FRAME_COUNT; offset++) {
    14501455                dmamem_unmap_anonymous(e1000->rx_frame_virt[offset]);
    1451                 e1000->rx_frame_phys[offset] = 0;
    14521456                e1000->rx_frame_virt[offset] = NULL;
     1457                e1000->rx_frame_phys[offset] = NULL;
    14531458        }
    14541459       
    14551460        free(e1000->rx_frame_virt);
    1456        
     1461        free(e1000->rx_frame_phys);
     1462        e1000->rx_frame_virt = NULL;
    14571463        e1000->rx_frame_phys = NULL;
    1458         e1000->rx_frame_virt = NULL;
    1459        
    14601464        dmamem_unmap_anonymous(e1000->rx_ring_virt);
    14611465}
     
    15651569        fibril_mutex_lock(&e1000->tx_lock);
    15661570       
    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;
    15701573        e1000->tx_frame_phys = NULL;
    15711574        e1000->tx_frame_virt = NULL;
     
    15731576        int rc = dmamem_map_anonymous(
    15741577            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);
    15771580        if (rc != EOK)
    15781581                goto error;
     
    15811584            E1000_TX_FRAME_COUNT * sizeof(e1000_tx_descriptor_t));
    15821585       
    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) {
    15891590                rc = ENOMEM;
    15901591                goto error;
     
    15921593       
    15931594        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,
    15971597                    0, &e1000->tx_frame_phys[i], &e1000->tx_frame_virt[i]);
    15981598                if (rc != EOK)
     
    16161616        }
    16171617       
    1618         if ((e1000->tx_frame_phys != NULL) && (e1000->tx_frame_virt != NULL)) {
     1618        if (e1000->tx_frame_phys != NULL && e1000->tx_frame_virt != NULL) {
    16191619                for (i = 0; i < E1000_TX_FRAME_COUNT; i++) {
    16201620                        if (e1000->tx_frame_virt[i] != NULL) {
    16211621                                dmamem_unmap_anonymous(e1000->tx_frame_virt[i]);
    1622                                 e1000->tx_frame_phys[i] = 0;
    16231622                                e1000->tx_frame_virt[i] = NULL;
     1623                                e1000->tx_frame_phys[i] = NULL;
    16241624                        }
    16251625                }
     
    16331633        if (e1000->tx_frame_virt != NULL) {
    16341634                free(e1000->tx_frame_virt);
    1635                 e1000->tx_frame_virt = NULL;
     1635                e1000->tx_frame_phys = NULL;
    16361636        }
    16371637       
     
    16501650        for (i = 0; i < E1000_TX_FRAME_COUNT; i++) {
    16511651                dmamem_unmap_anonymous(e1000->tx_frame_virt[i]);
    1652                 e1000->tx_frame_phys[i] = 0;
    16531652                e1000->tx_frame_virt[i] = NULL;
     1653                e1000->tx_frame_phys[i] = NULL;
    16541654        }
    16551655       
     
    16611661        if (e1000->tx_frame_virt != NULL) {
    16621662                free(e1000->tx_frame_virt);
    1663                 e1000->tx_frame_virt = NULL;
     1663                e1000->tx_frame_phys = NULL;
    16641664        }
    16651665       
     
    17531753        e1000_enable_interrupts(e1000);
    17541754       
    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);
    17631756       
    17641757        e1000_clear_rx_ring(e1000);
     
    17981791        e1000_disable_rx(e1000);
    17991792       
    1800         irc_disable_interrupt(e1000->irq);
     1793        nic_disable_interrupt(nic, e1000->irq);
    18011794        e1000_disable_interrupts(e1000);
    18021795       
     
    19441937        e1000->irq = hw_resources->irqs.irqs[0];
    19451938        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);
    19471940       
    19481941        return EOK;
     
    21502143        nic_set_ddf_fun(nic, fun);
    21512144        ddf_fun_set_ops(fun, &e1000_dev_ops);
     2145        ddf_fun_data_implant(fun, nic);
    21522146       
    21532147        rc = e1000_register_int_handler(nic);
    21542148        if (rc != EOK)
    21552149                goto err_fun_create;
     2150       
     2151        rc = nic_connect_to_services(nic);
     2152        if (rc != EOK)
     2153                goto err_irq;
    21562154       
    21572155        rc = e1000_initialize_rx_structure(nic);
     
    23762374int main(void)
    23772375{
    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;
    23822379       
    23832380        nic_driver_implement(&e1000_driver_ops, &e1000_dev_ops,
     
    23852382       
    23862383        ddf_log_init(NAME);
     2384        ddf_msg(LVL_NOTE, "HelenOS E1000 driver started");
    23872385        return ddf_driver_main(&e1000_driver);
    23882386}
Note: See TracChangeset for help on using the changeset viewer.