Changeset acc7ce4 in mainline for uspace


Ignore:
Timestamp:
2011-01-07T14:57:40Z (14 years ago)
Author:
Martin Decky <martin@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
7c34b28f
Parents:
b404a98
Message:

uspace interrupt controller drivers for i8259 and APIC (non-functional yet)
convert NE2000 driver to use these drivers (not enabling the IRQ in kernel), this solves the "spurious interrupt" issue
(however, on SMP machines this renders the driver unusable for now since the APIC driver does not do anything yet)

Location:
uspace
Files:
4 added
6 edited
5 moved

Legend:

Unmodified
Added
Removed
  • uspace/Makefile

    rb404a98 racc7ce4  
    108108
    109109ifeq ($(UARCH),amd64)
    110         DIRS += drv/rootpc
    111         DIRS += drv/pciintel
    112         DIRS += drv/isa
    113         DIRS += drv/ns8250
     110        DIRS += \
     111                drv/rootpc \
     112                drv/pciintel \
     113                drv/isa \
     114                drv/ns8250 \
     115                srv/hw/irc/apic \
     116                srv/hw/irc/i8259
    114117endif
    115118
    116119ifeq ($(UARCH),ia32)
    117         DIRS += drv/rootpc
    118         DIRS += drv/pciintel
    119         DIRS += drv/isa
    120         DIRS += drv/ns8250
     120        DIRS += \
     121                drv/rootpc \
     122                drv/pciintel \
     123                drv/isa \
     124                drv/ns8250 \
     125                srv/hw/irc/apic \
     126                srv/hw/irc/i8259
    121127endif
    122128
     
    127133ifeq ($(UARCH),sparc64)
    128134        DIRS += \
    129                 srv/hw/cir/fhc \
    130                 srv/hw/cir/obio
     135                srv/hw/irc/fhc \
     136                srv/hw/irc/obio
    131137endif
    132138
  • uspace/app/init/init.c

    rb404a98 racc7ce4  
    273273        mount_tmpfs();
    274274       
     275        spawn("/srv/apic");
     276        spawn("/srv/i8259");
    275277        spawn("/srv/fhc");
    276278        spawn("/srv/obio");
  • uspace/lib/c/include/ipc/irc.h

    rb404a98 racc7ce4  
    3131 */
    3232/** @file
    33  */ 
     33 */
    3434
    35 #ifndef LIBC_BUS_H_
    36 #define LIBC_BUS_H_
     35#ifndef LIBC_IRC_H_
     36#define LIBC_IRC_H_
    3737
    3838#include <ipc/ipc.h>
    3939
    4040typedef enum {
    41         BUS_CLEAR_INTERRUPT = IPC_FIRST_USER_METHOD
    42 } bus_request_t;
     41        IRC_ENABLE_INTERRUPT = IPC_FIRST_USER_METHOD,
     42        IRC_CLEAR_INTERRUPT
     43} irc_request_t;
    4344
    4445#endif
  • uspace/lib/c/include/ipc/services.h

    rb404a98 racc7ce4  
    4949        SERVICE_FHC,
    5050        SERVICE_OBIO,
     51        SERVICE_APIC,
     52        SERVICE_I8259,
    5153        SERVICE_CLIPBOARD,
    5254        SERVICE_NETWORKING,
  • uspace/srv/hid/kbd/port/ns16550.c

    rb404a98 racc7ce4  
    3636
    3737#include <ipc/ipc.h>
    38 #include <ipc/bus.h>
     38#include <ipc/irc.h>
    3939#include <async.h>
    4040#include <sysinfo.h>
     
    122122       
    123123        if (cir_service)
    124                 async_msg_1(cir_phone, BUS_CLEAR_INTERRUPT,
     124                async_msg_1(cir_phone, IRC_CLEAR_INTERRUPT,
    125125                    IPC_GET_IMETHOD(*call));
    126126}
  • uspace/srv/hid/kbd/port/z8530.c

    rb404a98 racc7ce4  
    3636
    3737#include <ipc/ipc.h>
    38 #include <ipc/bus.h>
     38#include <ipc/irc.h>
    3939#include <async.h>
    4040#include <sysinfo.h>
     
    110110       
    111111        if (cir_service)
    112                 async_msg_1(cir_phone, BUS_CLEAR_INTERRUPT,
     112                async_msg_1(cir_phone, IRC_CLEAR_INTERRUPT,
    113113                    IPC_GET_IMETHOD(*call));
    114114}
  • uspace/srv/hw/irc/fhc/fhc.c

    rb404a98 racc7ce4  
    3838#include <ipc/ipc.h>
    3939#include <ipc/services.h>
    40 #include <ipc/bus.h>
     40#include <ipc/irc.h>
    4141#include <ipc/ns.h>
    4242#include <sysinfo.h>
     
    8383                callid = async_get_call(&call);
    8484                switch (IPC_GET_IMETHOD(call)) {
    85                 case BUS_CLEAR_INTERRUPT:
     85                case IRC_ENABLE_INTERRUPT:
     86                        /* Noop */
     87                        ipc_answer_0(callid, EOK);
     88                        break;
     89                case IRC_CLEAR_INTERRUPT:
    8690                        inr = IPC_GET_ARG1(call);
    8791                        switch (inr) {
  • uspace/srv/hw/irc/obio/obio.c

    rb404a98 racc7ce4  
    4444#include <ipc/ipc.h>
    4545#include <ipc/services.h>
    46 #include <ipc/bus.h>
     46#include <ipc/irc.h>
    4747#include <ipc/ns.h>
    4848#include <sysinfo.h>
     
    9393                callid = async_get_call(&call);
    9494                switch (IPC_GET_IMETHOD(call)) {
    95                 case BUS_CLEAR_INTERRUPT:
     95                case IRC_ENABLE_INTERRUPT:
     96                        /* Noop */
     97                        ipc_answer_0(callid, EOK);
     98                        break;
     99                case IRC_CLEAR_INTERRUPT:
    96100                        inr = IPC_GET_ARG1(call);
    97101                        base_virt[OBIO_CIR(inr & INO_MASK)] = 0;
  • uspace/srv/hw/netif/dp8390/dp8390_module.c

    rb404a98 racc7ce4  
    4141#include <err.h>
    4242#include <malloc.h>
     43#include <sysinfo.h>
    4344#include <ipc/ipc.h>
    4445#include <ipc/services.h>
     46#include <ipc/irc.h>
    4547#include <net/modules.h>
    4648#include <packet_client.h>
     
    7173 */
    7274#define IRQ_GET_ISR(call)  ((int) IPC_GET_ARG2(call))
     75
     76static int irc_service = 0;
     77static int irc_phone = -1;
    7378
    7479/** DP8390 kernel interrupt command sequence.
     
    136141}
    137142
    138 /** Changes the network interface state.
     143/** Change the network interface state.
     144 *
    139145 *  @param[in,out] device The network interface.
    140  *  @param[in] state The new state.
    141  *  @returns The new state.
     146 *  @param[in]     state  The new state.
     147 *
     148 *  @return The new state.
     149 *
    142150 */
    143151static int change_state(netif_device_t *device, device_state_t state)
     
    272280                return rc;
    273281       
    274         if (device->state != NETIF_ACTIVE){
     282        if (device->state != NETIF_ACTIVE) {
    275283                netif_pq_release(packet_get_id(packet));
    276284                return EFORWARD;
     
    312320                }
    313321               
    314                 return change_state(device, NETIF_ACTIVE);
     322                rc = change_state(device, NETIF_ACTIVE);
     323               
     324                if (irc_service)
     325                        async_msg_1(irc_phone, IRC_ENABLE_INTERRUPT, dep->de_irq);
     326               
     327                return rc;
    315328        }
    316329       
     
    334347int netif_initialize(void)
    335348{
     349        sysarg_t apic;
     350        sysarg_t i8259;
     351       
     352        if ((sysinfo_get_value("apic", &apic) == EOK) && (apic))
     353                irc_service = SERVICE_APIC;
     354        else if ((sysinfo_get_value("i8259", &i8259) == EOK) && (i8259))
     355                irc_service = SERVICE_I8259;
     356       
     357        if (irc_service) {
     358                while (irc_phone < 0) {
     359                        irc_phone = ipc_connect_me_to_blocking(PHONE_NS, irc_service,
     360                            0, 0);
     361                }
     362        }
     363       
     364        async_set_interrupt_received(irq_handler);
     365       
    336366        sysarg_t phonehash;
    337         async_set_interrupt_received(irq_handler);
    338367        return ipc_connect_to_me(PHONE_NS, SERVICE_DP8390, 0, 0, &phonehash);
    339368}
Note: See TracChangeset for help on using the changeset viewer.