Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/nic/src/nic_driver.c

    ra41b691 racdb5bac  
    4242#include <stdio.h>
    4343#include <str_error.h>
     44#include <ipc/services.h>
     45#include <ipc/ns.h>
     46#include <ipc/irc.h>
    4447#include <sysinfo.h>
    4548#include <as.h>
     
    375378}
    376379
     380
     381/**
     382 * Enable interrupts for this driver.
     383 *
     384 * @param nic_data
     385 * @param irq                   The IRQ number for this device
     386 */
     387void nic_enable_interrupt(nic_t *nic_data, int irq)
     388{
     389        async_exch_t *exch = async_exchange_begin(nic_data->irc_session);
     390        async_msg_1(exch, IRC_ENABLE_INTERRUPT, irq);
     391        async_exchange_end(exch);
     392}
     393
     394/**
     395 * Disable interrupts for this driver.
     396 *
     397 * @param nic_data
     398 * @param irq                   The IRQ number for this device
     399 */
     400void nic_disable_interrupt(nic_t *nic_data, int irq)
     401{
     402        async_exch_t *exch = async_exchange_begin(nic_data->irc_session);
     403        async_msg_1(exch, IRC_CLEAR_INTERRUPT, irq);
     404        async_exchange_end(exch);
     405}
     406
    377407/** Get the polling mode information from the device
    378408 *
     
    390420        return nic_data->poll_mode;
    391421};
     422
     423/**
     424 * Connect to IRC service. This function should be called only from
     425 * the add_device handler, thus no locking is required.
     426 *
     427 * @param nic_data
     428 *
     429 * @return EOK          If connection was successful.
     430 * @return EINVAL       If the IRC service cannot be determined.
     431 * @return EREFUSED     If IRC service cannot be connected.
     432 */
     433int nic_connect_to_services(nic_t *nic_data)
     434{
     435        /* IRC service */
     436        sysarg_t apic;
     437        sysarg_t i8259;
     438        services_t irc_service = -1;
     439        if (((sysinfo_get_value("apic", &apic) == EOK) && (apic)) ||
     440            ((sysinfo_get_value("i8259", &i8259) == EOK) && (i8259)))
     441                irc_service = SERVICE_IRC;
     442        else
     443                return EINVAL;
     444       
     445        nic_data->irc_session = service_connect_blocking(EXCHANGE_SERIALIZE,
     446                irc_service, 0, 0);
     447        if (nic_data->irc_session == NULL)
     448                return errno;
     449       
     450        return EOK;
     451}
    392452
    393453/** Inform the NICF about poll mode
     
    436496                int rc = nic_ev_addr_changed(nic_data->client_session,
    437497                    address);
    438 
    439498                if (rc != EOK) {
    440499                        fibril_rwlock_write_unlock(&nic_data->main_lock);
     
    609668        nic_data->state = NIC_STATE_STOPPED;
    610669        nic_data->client_session = NULL;
     670        nic_data->irc_session = NULL;
    611671        nic_data->poll_mode = NIC_POLL_IMMEDIATE;
    612672        nic_data->default_poll_mode = NIC_POLL_IMMEDIATE;
     
    915975nic_t *nic_get_from_ddf_fun(ddf_fun_t *fun)
    916976{
    917         return (nic_t *) ddf_dev_data_get(ddf_fun_get_dev(fun));
     977        return (nic_t *) ddf_fun_data_get(fun);
    918978}
    919979
Note: See TracChangeset for help on using the changeset viewer.