Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/nic/rtl8139/driver.c

    rd87561c r8820544  
    2727 */
    2828
    29 /* XXX Fix this */
    30 #define _DDF_DATA_IMPLANT
    31 
    3229#include <assert.h>
    3330#include <errno.h>
     
    3532#include <byteorder.h>
    3633#include <libarch/barrier.h>
    37 
    3834#include <as.h>
    3935#include <ddf/log.h>
     
    4137#include <io/log.h>
    4238#include <nic.h>
    43 #include <device/pci.h>
    44 
    45 #include <ipc/irc.h>
    46 #include <sysinfo.h>
    47 #include <ipc/ns.h>
    48 
     39#include <pci_dev_iface.h>
     40#include <irc.h>
     41#include <stdio.h>
    4942#include <str.h>
    5043
     
    190183        return;
    191184}
    192 
    193 #include <device/pci.h>
    194185
    195186/** Set PmEn (Power management enable) bit value
     
    861852/** Handle device interrupt
    862853 *
    863  *  @param dev    The rtl8139 device
    864  *  @param iid    The IPC call id
    865  *  @param icall  The IPC call structure
    866  */
    867 static void rtl8139_interrupt_handler(ddf_dev_t *dev, ipc_callid_t iid,
    868     ipc_call_t *icall)
     854 * @param iid    The IPC call id
     855 * @param icall  The IPC call structure
     856 * @param dev    The rtl8139 device
     857 *
     858 */
     859static void rtl8139_interrupt_handler(ipc_callid_t iid, ipc_call_t *icall,
     860    ddf_dev_t *dev)
    869861{
    870862        assert(dev);
     
    962954        rtl8139->int_mask = RTL_DEFAULT_INTERRUPTS;
    963955        rtl8139_hw_int_enable(rtl8139);
    964         nic_enable_interrupt(nic_data, rtl8139->irq);
     956
     957        int rc = irc_enable_interrupt(rtl8139->irq);
     958        if (rc != EOK) {
     959                rtl8139_on_stopped(nic_data);
     960                return rc;
     961        }
    965962
    966963        ddf_msg(LVL_DEBUG, "Device activated, interrupt %d registered", rtl8139->irq);
     
    10871084        ddf_msg(LVL_DEBUG, "%s device: irq 0x%x assigned", ddf_dev_get_name(dev), rtl8139->irq);
    10881085
    1089         rtl8139->io_addr = IOADDR_TO_PTR(hw_resources->io_ranges.ranges[0].address);
     1086        rtl8139->io_addr = IOADDR_TO_PTR(RNGABS(hw_resources->io_ranges.ranges[0]));
    10901087        if (hw_resources->io_ranges.ranges[0].size < RTL8139_IO_SIZE) {
    10911088                ddf_msg(LVL_ERROR, "i/o range assigned to the device "
     
    11431140
    11441141        ddf_msg(LVL_DEBUG, "Creating buffers");
    1145 
    1146         rc = dmamem_map_anonymous(TX_PAGES * PAGE_SIZE, AS_AREA_WRITE, 0,
    1147             &rtl8139->tx_buff_phys, &rtl8139->tx_buff_virt);
     1142       
     1143        rtl8139->tx_buff_virt = AS_AREA_ANY;
     1144        rc = dmamem_map_anonymous(TX_PAGES * PAGE_SIZE, DMAMEM_4GiB,
     1145            AS_AREA_WRITE, 0, &rtl8139->tx_buff_phys, &rtl8139->tx_buff_virt);
    11481146        if (rc != EOK) {
    11491147                ddf_msg(LVL_ERROR, "Can not allocate transmitter buffers.");
     
    11631161        ddf_msg(LVL_DEBUG, "Allocating receiver buffer of the size %d bytes",
    11641162            RxBUF_TOT_LENGTH);
    1165 
    1166         rc = dmamem_map_anonymous(RxBUF_TOT_LENGTH, AS_AREA_READ, 0,
    1167             &rtl8139->rx_buff_phys, &rtl8139->rx_buff_virt);
     1163       
     1164        rtl8139->rx_buff_virt = AS_AREA_ANY;
     1165        rc = dmamem_map_anonymous(RxBUF_TOT_LENGTH, DMAMEM_4GiB,
     1166            AS_AREA_READ, 0, &rtl8139->rx_buff_phys, &rtl8139->rx_buff_virt);
    11681167        if (rc != EOK) {
    11691168                ddf_msg(LVL_ERROR, "Can not allocate receive buffer.");
     
    13251324                goto err_pio;
    13261325
    1327         rc = nic_connect_to_services(nic_data);
    1328         if (rc != EOK) {
    1329                 ddf_msg(LVL_ERROR, "Failed to connect to services (%d)", rc);
    1330                 goto err_irq;
    1331         }
    1332 
    13331326        fun = ddf_fun_create(nic_get_ddf_dev(nic_data), fun_exposed, "port0");
    13341327        if (fun == NULL) {
     
    13361329                goto err_srv;
    13371330        }
     1331
    13381332        nic_set_ddf_fun(nic_data, fun);
    13391333        ddf_fun_set_ops(fun, &rtl8139_dev_ops);
    1340         ddf_fun_data_implant(fun, nic_data);
    13411334
    13421335        rc = ddf_fun_bind(fun);
     
    13611354        ddf_fun_destroy(fun);
    13621355err_srv:
    1363         /* XXX Disconnect from services */
    1364 err_irq:
    13651356        unregister_interrupt_handler(dev, rtl8139->irq);
    13661357err_pio:
     
    21802171int main(void)
    21812172{
     2173        printf("%s: HelenOS RTL8139 network adapter driver\n", NAME);
     2174
    21822175        int rc = nic_driver_init(NAME);
    21832176        if (rc != EOK)
    21842177                return rc;
    2185         nic_driver_implement(
    2186                 &rtl8139_driver_ops, &rtl8139_dev_ops, &rtl8139_nic_iface);
     2178
     2179        nic_driver_implement(&rtl8139_driver_ops, &rtl8139_dev_ops,
     2180            &rtl8139_nic_iface);
    21872181
    21882182        ddf_log_init(NAME);
    2189         ddf_msg(LVL_NOTE, "HelenOS RTL8139 driver started");
    21902183        return ddf_driver_main(&rtl8139_driver);
    21912184}
Note: See TracChangeset for help on using the changeset viewer.