Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/hw/netif/dp8390/ne2000.c

    r7300c37 r3c106e88  
    6868#define IRQ_GET_ISR(call)  ((int) IPC_GET_ARG2(call))
    6969
    70 /** Return the TSR from the interrupt call.
    71  *
    72  * @param[in] call The interrupt call.
    73  *
    74  */
    75 #define IRQ_GET_TSR(call)  ((int) IPC_GET_ARG3(call))
    76 
    7770static int irc_service = 0;
    7871static int irc_phone = -1;
     
    8376static irq_cmd_t ne2k_cmds[] = {
    8477        {
    85                 /* Read Interrupt Status Register */
    8678                .cmd = CMD_PIO_READ_8,
    8779                .addr = NULL,
     
    8981        },
    9082        {
    91                 /* Mask supported interrupt causes */
    9283                .cmd = CMD_BTEST,
    93                 .value = (ISR_PRX | ISR_PTX | ISR_RXE | ISR_TXE | ISR_OVW |
    94                     ISR_CNT | ISR_RDC),
     84                .value = 0x7f,
    9585                .srcarg = 2,
    9686                .dstarg = 3,
    9787        },
    9888        {
    99                 /* Predicate for accepting the interrupt */
    10089                .cmd = CMD_PREDICATE,
    101                 .value = 4,
     90                .value = 2,
    10291                .srcarg = 3
    10392        },
    10493        {
    105                 /*
    106                  * Mask future interrupts via
    107                  * Interrupt Mask Register
    108                  */
    109                 .cmd = CMD_PIO_WRITE_8,
    110                 .addr = NULL,
    111                 .value = 0
    112         },
    113         {
    114                 /* Acknowledge the current interrupt */
    11594                .cmd = CMD_PIO_WRITE_A_8,
    11695                .addr = NULL,
     
    11897        },
    11998        {
    120                 /* Read Transmit Status Register */
    121                 .cmd = CMD_PIO_READ_8,
    122                 .addr = NULL,
    123                 .dstarg = 3
    124         },
    125         {
    12699                .cmd = CMD_ACCEPT
    127100        }
     
    138111/** Handle the interrupt notification.
    139112 *
    140  * This is the interrupt notification function. It is quarantied
    141  * that there is only a single instance of this notification
    142  * function running at one time until the return from the
    143  * ne2k_interrupt() function (where the interrupts are unmasked
    144  * again).
     113 * This is the interrupt notification function.
    145114 *
    146115 * @param[in] iid  Interrupt notification identifier.
     
    165134        fibril_rwlock_read_unlock(&netif_globals.lock);
    166135       
    167         if (ne2k != NULL) {
    168                 link_t *frames =
    169                     ne2k_interrupt(ne2k, IRQ_GET_ISR(*call), IRQ_GET_TSR(*call));
    170                
    171                 if (frames != NULL) {
    172                         while (!list_empty(frames)) {
    173                                 frame_t *frame =
    174                                     list_get_instance(frames->next, frame_t, link);
    175                                
    176                                 list_remove(&frame->link);
    177                                 nil_received_msg(nil_phone, device_id, frame->packet,
    178                                     SERVICE_NONE);
    179                                 free(frame);
    180                         }
    181                        
    182                         free(frames);
    183                 }
    184         }
     136        if (ne2k != NULL)
     137                ne2k_interrupt(ne2k, IRQ_GET_ISR(*call), nil_phone, device_id);
    185138}
    186139
     
    312265               
    313266                ne2k_cmds[0].addr = ne2k->port + DP_ISR;
    314                 ne2k_cmds[3].addr = ne2k->port + DP_IMR;
    315                 ne2k_cmds[4].addr = ne2k_cmds[0].addr;
     267                ne2k_cmds[3].addr = ne2k_cmds[0].addr;
    316268               
    317269                int rc = ipc_register_irq(ne2k->irq, device->device_id,
     
    326278                }
    327279               
    328                 change_state(device, NETIF_ACTIVE);
    329                
    330280                if (irc_service)
    331281                        async_msg_1(irc_phone, IRC_ENABLE_INTERRUPT, ne2k->irq);
     282               
     283                change_state(device, NETIF_ACTIVE);
    332284        }
    333285       
Note: See TracChangeset for help on using the changeset viewer.