Changes in uspace/srv/hw/netif/dp8390/ne2000.c [3c106e88:7300c37] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/hw/netif/dp8390/ne2000.c
r3c106e88 r7300c37 68 68 #define IRQ_GET_ISR(call) ((int) IPC_GET_ARG2(call)) 69 69 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 70 77 static int irc_service = 0; 71 78 static int irc_phone = -1; … … 76 83 static irq_cmd_t ne2k_cmds[] = { 77 84 { 85 /* Read Interrupt Status Register */ 78 86 .cmd = CMD_PIO_READ_8, 79 87 .addr = NULL, … … 81 89 }, 82 90 { 91 /* Mask supported interrupt causes */ 83 92 .cmd = CMD_BTEST, 84 .value = 0x7f, 93 .value = (ISR_PRX | ISR_PTX | ISR_RXE | ISR_TXE | ISR_OVW | 94 ISR_CNT | ISR_RDC), 85 95 .srcarg = 2, 86 96 .dstarg = 3, 87 97 }, 88 98 { 99 /* Predicate for accepting the interrupt */ 89 100 .cmd = CMD_PREDICATE, 90 .value = 2,101 .value = 4, 91 102 .srcarg = 3 92 103 }, 93 104 { 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 */ 94 115 .cmd = CMD_PIO_WRITE_A_8, 95 116 .addr = NULL, 96 117 .srcarg = 3 118 }, 119 { 120 /* Read Transmit Status Register */ 121 .cmd = CMD_PIO_READ_8, 122 .addr = NULL, 123 .dstarg = 3 97 124 }, 98 125 { … … 111 138 /** Handle the interrupt notification. 112 139 * 113 * This is the interrupt notification function. 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). 114 145 * 115 146 * @param[in] iid Interrupt notification identifier. … … 134 165 fibril_rwlock_read_unlock(&netif_globals.lock); 135 166 136 if (ne2k != NULL) 137 ne2k_interrupt(ne2k, IRQ_GET_ISR(*call), nil_phone, device_id); 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 } 138 185 } 139 186 … … 265 312 266 313 ne2k_cmds[0].addr = ne2k->port + DP_ISR; 267 ne2k_cmds[3].addr = ne2k_cmds[0].addr; 314 ne2k_cmds[3].addr = ne2k->port + DP_IMR; 315 ne2k_cmds[4].addr = ne2k_cmds[0].addr; 268 316 269 317 int rc = ipc_register_irq(ne2k->irq, device->device_id, … … 278 326 } 279 327 328 change_state(device, NETIF_ACTIVE); 329 280 330 if (irc_service) 281 331 async_msg_1(irc_phone, IRC_ENABLE_INTERRUPT, ne2k->irq); 282 283 change_state(device, NETIF_ACTIVE);284 332 } 285 333
Note:
See TracChangeset
for help on using the changeset viewer.