Changeset 60744cb in mainline for uspace/drv/nic


Ignore:
Timestamp:
2024-05-17T17:51:56Z (23 months ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
master
Children:
1801005
Parents:
646849b3
Message:

Let driver specify any argument to IRQ handler

This allows the driver to register a single handler for multiple
interrupts and still distinguish between them. It also removes
the extra step of having to get softstate from ddf_dev_t.

Location:
uspace/drv/nic
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/nic/e1k/e1k.c

    r646849b3 r60744cb  
    12441244 *
    12451245 * @param icall IPC call structure
    1246  * @param dev   E1000 device
    1247  *
    1248  */
    1249 static void e1000_interrupt_handler(ipc_call_t *icall,
    1250     ddf_dev_t *dev)
     1246 * @param arg   Argument (nic_t *)
     1247 *
     1248 */
     1249static void e1000_interrupt_handler(ipc_call_t *icall, void *arg)
    12511250{
    12521251        uint32_t icr = (uint32_t) ipc_get_arg2(icall);
    1253         nic_t *nic = NIC_DATA_DEV(dev);
     1252        nic_t *nic = (nic_t *)arg;
    12541253        e1000_t *e1000 = DRIVER_DATA_NIC(nic);
    12551254
     
    12831282
    12841283        errno_t rc = register_interrupt_handler(nic_get_ddf_dev(nic), e1000->irq,
    1285             e1000_interrupt_handler, &e1000_irq_code, handle);
     1284            e1000_interrupt_handler, (void *)nic, &e1000_irq_code, handle);
    12861285
    12871286        fibril_mutex_unlock(&irq_reg_mutex);
  • uspace/drv/nic/ne2k/ne2k.c

    r646849b3 r60744cb  
    121121};
    122122
    123 static void ne2k_interrupt_handler(ipc_call_t *, ddf_dev_t *);
     123static void ne2k_interrupt_handler(ipc_call_t *, void *);
    124124
    125125static errno_t ne2k_register_interrupt(nic_t *nic_data,
     
    161161
    162162        return register_interrupt_handler(nic_get_ddf_dev(nic_data),
    163             ne2k->irq, ne2k_interrupt_handler, &ne2k->code, handle);
     163            ne2k->irq, ne2k_interrupt_handler, (void *)nic_data, &ne2k->code,
     164            handle);
    164165}
    165166
     
    237238}
    238239
    239 void ne2k_interrupt_handler(ipc_call_t *call, ddf_dev_t *dev)
    240 {
    241         nic_t *nic_data = DRIVER_DATA(dev);
     240/** NE2K interrupt handler
     241 *
     242 * @param call IRQ event notification
     243 * @param arg Argument (nic_t *)
     244 */
     245void ne2k_interrupt_handler(ipc_call_t *call, void *arg)
     246{
     247        nic_t *nic_data = (nic_t *)arg;
    242248        ne2k_interrupt(nic_data, IRQ_GET_ISR(*call), IRQ_GET_TSR(*call));
    243249}
  • uspace/drv/nic/rtl8139/driver.c

    r646849b3 r60744cb  
    819819 *
    820820 * @param icall  The IPC call structure
    821  * @param dev    The rtl8139 device
    822  *
    823  */
    824 static void rtl8139_interrupt_handler(ipc_call_t *icall, ddf_dev_t *dev)
    825 {
    826         assert(dev);
    827         assert(icall);
    828 
     821 * @param arg    Argument (nic_t *)
     822 *
     823 */
     824static void rtl8139_interrupt_handler(ipc_call_t *icall, void *arg)
     825{
    829826        uint16_t isr = (uint16_t) ipc_get_arg2(icall);
    830         nic_t *nic_data = nic_get_from_ddf_dev(dev);
     827        nic_t *nic_data = (nic_t *)arg;
    831828        rtl8139_t *rtl8139 = nic_get_specific(nic_data);
    832829
     
    861858        rtl8139_irq_code.cmds[3].addr = rtl8139->io_addr + IMR;
    862859        errno_t rc = register_interrupt_handler(nic_get_ddf_dev(nic_data),
    863             rtl8139->irq, rtl8139_interrupt_handler, &rtl8139_irq_code, handle);
     860            rtl8139->irq, rtl8139_interrupt_handler, (void *)nic_data,
     861            &rtl8139_irq_code, handle);
    864862
    865863        RTL8139_IRQ_STRUCT_UNLOCK();
  • uspace/drv/nic/rtl8169/driver.c

    r646849b3 r60744cb  
    7474static errno_t rtl8169_on_stopped(nic_t *nic_data);
    7575static void rtl8169_send_frame(nic_t *nic_data, void *data, size_t size);
    76 static void rtl8169_irq_handler(ipc_call_t *icall, ddf_dev_t *dev);
     76static void rtl8169_irq_handler(ipc_call_t *icall, void *);
    7777static inline errno_t rtl8169_register_int_handler(nic_t *nic_data,
    7878    cap_irq_handle_t *handle);
     
    372372        rtl8169_irq_code.cmds[3].addr = rtl8169->regs + IMR;
    373373        errno_t rc = register_interrupt_handler(nic_get_ddf_dev(nic_data),
    374             rtl8169->irq, rtl8169_irq_handler, &rtl8169_irq_code, handle);
     374            rtl8169->irq, rtl8169_irq_handler, (void *)rtl8169,
     375            &rtl8169_irq_code, handle);
    375376
    376377        return rc;
     
    10331034}
    10341035
    1035 static void rtl8169_irq_handler(ipc_call_t *icall, ddf_dev_t *dev)
    1036 {
    1037         assert(dev);
    1038         assert(icall);
    1039 
     1036/** RTL8169 IRQ handler.
     1037 *
     1038 * @param icall IRQ event notification
     1039 * @param arg Argument (rtl8169_t *)
     1040 */
     1041static void rtl8169_irq_handler(ipc_call_t *icall, void *arg)
     1042{
    10401043        uint16_t isr = (uint16_t) ipc_get_arg2(icall) & INT_KNOWN;
    1041         nic_t *nic_data = nic_get_from_ddf_dev(dev);
    1042         rtl8169_t *rtl8169 = nic_get_specific(nic_data);
     1044        rtl8169_t *rtl8169 = (rtl8169_t *)arg;
    10431045
    10441046        ddf_msg(LVL_DEBUG, "rtl8169_irq_handler(): isr=0x%04x", isr);
     
    10501052                /* Packet underrun or link change */
    10511053                if (isr & INT_PUN) {
    1052                         rtl8169_link_change(dev);
     1054                        rtl8169_link_change(rtl8169->dev);
    10531055                        pio_write_16(rtl8169->regs + ISR, INT_PUN);
    10541056                }
     
    10561058                /* Transmit notification */
    10571059                if (isr & (INT_TER | INT_TOK | INT_TDU)) {
    1058                         rtl8169_transmit_done(dev);
     1060                        rtl8169_transmit_done(rtl8169->dev);
    10591061                        pio_write_16(rtl8169->regs + ISR, (INT_TER | INT_TOK | INT_TDU));
    10601062                }
     
    10721074
    10731075                if (isr & (INT_RER | INT_ROK)) {
    1074                         rtl8169_receive_done(dev);
     1076                        rtl8169_receive_done(rtl8169->dev);
    10751077                        pio_write_16(rtl8169->regs + ISR, (INT_RER | INT_ROK));
    10761078                }
  • uspace/drv/nic/virtio-net/virtio-net.c

    r646849b3 r60744cb  
    7070};
    7171
    72 static void virtio_net_irq_handler(ipc_call_t *icall, ddf_dev_t *dev)
    73 {
    74         nic_t *nic = ddf_dev_data_get(dev);
     72/** VirtIO net IRQ handler.
     73 *
     74 * @param icall IRQ event notification
     75 * @param arg Argument (nic_t *)
     76 */
     77static void virtio_net_irq_handler(ipc_call_t *icall, void *arg)
     78{
     79        nic_t *nic = (nic_t *)arg;
    7580        virtio_net_t *virtio_net = nic_get_specific(nic);
    7681        virtio_dev_t *vdev = &virtio_net->virtio_dev;
     
    164169
    165170        return register_interrupt_handler(dev, virtio_net->irq,
    166             virtio_net_irq_handler, &irq_code, &virtio_net->irq_handle);
     171            virtio_net_irq_handler, (void *)nic, &irq_code,
     172            &virtio_net->irq_handle);
    167173}
    168174
Note: See TracChangeset for help on using the changeset viewer.