Changeset 60744cb in mainline for uspace/drv/block


Ignore:
Timestamp:
2024-05-17T17:51:56Z (22 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/block
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/block/ahci/ahci.c

    r646849b3 r60744cb  
    162162}
    163163
    164 /** Get AHCI structure from DDF device. */
    165 static ahci_dev_t *dev_ahci_dev(ddf_dev_t *dev)
    166 {
    167         return ddf_dev_data_get(dev);
    168 }
    169 
    170164/** Get SATA device name.
    171165 *
     
    891885 *
    892886 * @param icall The IPC call structure.
    893  * @param dev   DDF device structure.
    894  *
    895  */
    896 static void ahci_interrupt(ipc_call_t *icall, ddf_dev_t *dev)
    897 {
    898         ahci_dev_t *ahci = dev_ahci_dev(dev);
     887 * @param arg   Argument (ahci_dev_t *)
     888 */
     889static void ahci_interrupt(ipc_call_t *icall, void *arg)
     890{
     891        ahci_dev_t *ahci = (ahci_dev_t *)arg;
    899892        unsigned int port = ipc_get_arg1(icall);
    900893        ahci_port_is_t pxis = ipc_get_arg2(icall);
     
    11861179        cap_irq_handle_t irq_cap;
    11871180        errno_t rc = register_interrupt_handler(dev,
    1188             hw_res_parsed.irqs.irqs[0], ahci_interrupt, &ct, &irq_cap);
     1181            hw_res_parsed.irqs.irqs[0], ahci_interrupt, (void *)ahci, &ct,
     1182            &irq_cap);
    11891183        if (rc != EOK) {
    11901184                ddf_msg(LVL_ERROR, "Failed registering interrupt handler.");
  • uspace/drv/block/ddisk/ddisk.c

    r646849b3 r60744cb  
    6464static void ddisk_bd_connection(ipc_call_t *, void *);
    6565
    66 static void ddisk_irq_handler(ipc_call_t *, ddf_dev_t *);
     66static void ddisk_irq_handler(ipc_call_t *, void *);
    6767
    6868static driver_ops_t driver_ops = {
     
    176176};
    177177
    178 void ddisk_irq_handler(ipc_call_t *icall, ddf_dev_t *dev)
     178/** Ddisk IRQ handler.
     179 *
     180 * @param icall IRQ event notification
     181 * @param arg Argument (ddisk_t *)
     182 */
     183void ddisk_irq_handler(ipc_call_t *icall, void *arg)
    179184{
    180185        ddf_msg(LVL_DEBUG, "ddisk_irq_handler(), status=%" PRIx32,
    181186            (uint32_t) ipc_get_arg1(icall));
    182187
    183         ddisk_t *ddisk = (ddisk_t *) ddf_dev_data_get(dev);
     188        ddisk_t *ddisk = (ddisk_t *)arg;
    184189
    185190        fibril_mutex_lock(&ddisk->lock);
     
    512517        ddisk_irq_commands[3].addr = (void *) &res_phys->command;
    513518        rc = register_interrupt_handler(dev, ddisk->ddisk_res.irq,
    514             ddisk_irq_handler, &ddisk_irq_code, &ddisk->irq_cap);
     519            ddisk_irq_handler, (void *)ddisk, &ddisk_irq_code, &ddisk->irq_cap);
    515520        if (rc != EOK) {
    516521                ddf_msg(LVL_ERROR, "Failed to register interrupt handler.");
  • uspace/drv/block/isa-ide/isa-ide.c

    r646849b3 r60744cb  
    5959static errno_t isa_ide_init_irq(isa_ide_channel_t *);
    6060static void isa_ide_fini_irq(isa_ide_channel_t *);
    61 static void isa_ide_irq_handler(ipc_call_t *, ddf_dev_t *);
     61static void isa_ide_irq_handler(ipc_call_t *, void *);
    6262
    6363static void isa_ide_write_data_16(void *, uint16_t *, size_t);
     
    256256
    257257        ddf_msg(LVL_NOTE, "IRQ %d", chan->irq);
    258         rc = register_interrupt_handler_arg(chan->ctrl->dev, chan->irq,
     258        rc = register_interrupt_handler(chan->ctrl->dev, chan->irq,
    259259            isa_ide_irq_handler, (void *)chan, &irq_code, &chan->ihandle);
    260260        if (rc != EOK) {
     
    291291 *
    292292 * @param call Call data
    293  * @param dev Device that caused the interrupt
    294  */
    295 static void isa_ide_irq_handler(ipc_call_t *call, ddf_dev_t *xdev)
    296 {
    297         isa_ide_channel_t *chan = (isa_ide_channel_t *)(void *)xdev; // XXX
     293 * @param arg Argument (isa_ide_channel_t *)
     294 */
     295static void isa_ide_irq_handler(ipc_call_t *call, void *arg)
     296{
     297        isa_ide_channel_t *chan = (isa_ide_channel_t *)arg;
    298298        uint8_t status;
    299299        async_sess_t *parent_sess;
  • uspace/drv/block/virtio-blk/virtio-blk.c

    r646849b3 r60744cb  
    7373};
    7474
    75 static void virtio_blk_irq_handler(ipc_call_t *icall, ddf_dev_t *dev)
    76 {
    77         virtio_blk_t *virtio_blk = (virtio_blk_t *) ddf_dev_data_get(dev);
     75/** VirtIO block IRQ handler.
     76 *
     77 * @param icall IRQ event notification
     78 * @param arg Argument (virtio_blk_t *)
     79 */
     80static void virtio_blk_irq_handler(ipc_call_t *icall, void *arg)
     81{
     82        virtio_blk_t *virtio_blk = (virtio_blk_t *)arg;
    7883        virtio_dev_t *vdev = &virtio_blk->virtio_dev;
    7984
     
    145150
    146151        return register_interrupt_handler(dev, virtio_blk->irq,
    147             virtio_blk_irq_handler, &irq_code, &virtio_blk->irq_handle);
     152            virtio_blk_irq_handler, (void *)virtio_blk, &irq_code,
     153            &virtio_blk->irq_handle);
    148154}
    149155
Note: See TracChangeset for help on using the changeset viewer.