Ignore:
File:
1 edited

Legend:

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

    racdb5bac r8820544  
    3333 */
    3434
    35 /* XXX Fix this */
    36 #define _DDF_DATA_IMPLANT
    37 
    3835#include <assert.h>
    3936#include <stdio.h>
     
    4239#include <align.h>
    4340#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>
    4743#include <ddi.h>
    48 #include <as.h>
    4944#include <ddf/log.h>
    5045#include <ddf/interrupt.h>
    5146#include <device/hw_res_parsed.h>
    52 #include <device/pci.h>
     47#include <pci_dev_iface.h>
    5348#include <nic.h>
    5449#include <ops/nic.h>
     
    7671/** ddf_fun_t * -> nic_driver_data_t* cast */
    7772#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)))
    7974
    8075/** ddf_dev_t * -> nic_driver_data_t* cast */
     
    129124       
    130125        /** Physical tx ring address */
    131         void *tx_ring_phys;
     126        uintptr_t tx_ring_phys;
    132127        /** Virtual tx ring address */
    133128        void *tx_ring_virt;
    134129       
    135130        /** Ring of TX frames, physical address */
    136         void **tx_frame_phys;
     131        uintptr_t *tx_frame_phys;
    137132        /** Ring of TX frames, virtual address */
    138133        void **tx_frame_virt;
    139134       
    140135        /** Physical rx ring address */
    141         void *rx_ring_phys;
     136        uintptr_t rx_ring_phys;
    142137        /** Virtual rx ring address */
    143138        void *rx_ring_virt;
    144139       
    145140        /** Ring of RX frames, physical address */
    146         void **rx_frame_phys;
     141        uintptr_t *rx_frame_phys;
    147142        /** Ring of RX frames, virtual address */
    148143        void **rx_frame_virt;
     
    12341229/** Handle device interrupt
    12351230 *
    1236  * @param dev   E1000 device
    12371231 * @param iid   IPC call id
    12381232 * @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 */
     1236static void e1000_interrupt_handler(ipc_callid_t iid, ipc_call_t *icall,
     1237    ddf_dev_t *dev)
    12431238{
    12441239        uint32_t icr = (uint32_t) IPC_GET_ARG2(*icall);
     
    13751370        fibril_mutex_lock(&e1000->rx_lock);
    13761371       
     1372        e1000->rx_ring_virt = AS_AREA_ANY;
    13771373        int rc = dmamem_map_anonymous(
    13781374            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);
    13811377        if (rc != EOK)
    13821378                return rc;
     
    13871383            (uint32_t) PTR_TO_U64(e1000->rx_ring_phys));
    13881384       
    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));
    13911387        e1000->rx_frame_virt =
    13921388            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)) {
    13941390                rc = ENOMEM;
    13951391                goto error;
    13961392        }
    13971393       
    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);
    14061401                if (rc != EOK)
    14071402                        goto error;
    14081403               
     1404                e1000->rx_frame_phys[i] = frame_phys;
    14091405                e1000->rx_frame_virt[i] = frame_virt;
    1410                 e1000->rx_frame_phys[i] = frame_phys;
    14111406        }
    14121407       
    14131408        /* Write descriptor */
    1414         for (i = 0; i < E1000_RX_FRAME_COUNT; i++)
     1409        for (size_t i = 0; i < E1000_RX_FRAME_COUNT; i++)
    14151410                e1000_fill_new_rx_descriptor(nic, i);
    14161411       
     
    14211416       
    14221417error:
    1423         for (i = 0; i < E1000_RX_FRAME_COUNT; i++) {
     1418        for (size_t i = 0; i < E1000_RX_FRAME_COUNT; i++) {
    14241419                if (e1000->rx_frame_virt[i] != NULL) {
    14251420                        dmamem_unmap_anonymous(e1000->rx_frame_virt[i]);
     1421                        e1000->rx_frame_phys[i] = 0;
    14261422                        e1000->rx_frame_virt[i] = NULL;
    1427                         e1000->rx_frame_phys[i] = NULL;
    14281423                }
    14291424        }
     
    14361431        if (e1000->rx_frame_virt != NULL) {
    14371432                free(e1000->rx_frame_virt);
    1438                 e1000->rx_frame_phys = NULL;
     1433                e1000->rx_frame_virt = NULL;
    14391434        }
    14401435       
     
    14541449        for (unsigned int offset = 0; offset < E1000_RX_FRAME_COUNT; offset++) {
    14551450                dmamem_unmap_anonymous(e1000->rx_frame_virt[offset]);
     1451                e1000->rx_frame_phys[offset] = 0;
    14561452                e1000->rx_frame_virt[offset] = NULL;
    1457                 e1000->rx_frame_phys[offset] = NULL;
    14581453        }
    14591454       
    14601455        free(e1000->rx_frame_virt);
    1461         free(e1000->rx_frame_phys);
     1456       
     1457        e1000->rx_frame_phys = NULL;
    14621458        e1000->rx_frame_virt = NULL;
    1463         e1000->rx_frame_phys = NULL;
     1459       
    14641460        dmamem_unmap_anonymous(e1000->rx_ring_virt);
    14651461}
     
    15691565        fibril_mutex_lock(&e1000->tx_lock);
    15701566       
    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       
    15731570        e1000->tx_frame_phys = NULL;
    15741571        e1000->tx_frame_virt = NULL;
     
    15761573        int rc = dmamem_map_anonymous(
    15771574            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);
    15801577        if (rc != EOK)
    15811578                goto error;
     
    15841581            E1000_TX_FRAME_COUNT * sizeof(e1000_tx_descriptor_t));
    15851582       
    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)) {
    15901589                rc = ENOMEM;
    15911590                goto error;
     
    15931592       
    15941593        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,
    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;
    16221623                                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_phys = NULL;
     1635                e1000->tx_frame_virt = 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;
    16521653                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_phys = NULL;
     1663                e1000->tx_frame_virt = NULL;
    16641664        }
    16651665       
     
    17531753        e1000_enable_interrupts(e1000);
    17541754       
    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        }
    17561763       
    17571764        e1000_clear_rx_ring(e1000);
     
    17911798        e1000_disable_rx(e1000);
    17921799       
    1793         nic_disable_interrupt(nic, e1000->irq);
     1800        irc_disable_interrupt(e1000->irq);
    17941801        e1000_disable_interrupts(e1000);
    17951802       
     
    19371944        e1000->irq = hw_resources->irqs.irqs[0];
    19381945        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]));
    19401947       
    19411948        return EOK;
     
    21432150        nic_set_ddf_fun(nic, fun);
    21442151        ddf_fun_set_ops(fun, &e1000_dev_ops);
    2145         ddf_fun_data_implant(fun, nic);
    21462152       
    21472153        rc = e1000_register_int_handler(nic);
    21482154        if (rc != EOK)
    21492155                goto err_fun_create;
    2150        
    2151         rc = nic_connect_to_services(nic);
    2152         if (rc != EOK)
    2153                 goto err_irq;
    21542156       
    21552157        rc = e1000_initialize_rx_structure(nic);
     
    23742376int main(void)
    23752377{
    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;
    23792382       
    23802383        nic_driver_implement(&e1000_driver_ops, &e1000_dev_ops,
     
    23822385       
    23832386        ddf_log_init(NAME);
    2384         ddf_msg(LVL_NOTE, "HelenOS E1000 driver started");
    23852387        return ddf_driver_main(&e1000_driver);
    23862388}
Note: See TracChangeset for help on using the changeset viewer.