Changeset d51838f in mainline for uspace/drv/bus/pci/pciintel/pci.c


Ignore:
Timestamp:
2017-10-14T22:49:18Z (7 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
75911d24
Parents:
ce732e74
Message:

Let leaf drivers enable/disable/clear interrupts via hw_res instead of directly using irc.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/bus/pci/pciintel/pci.c

    rce732e74 rd51838f  
    9999}
    100100
     101static int pciintel_fun_owns_interrupt(pci_fun_t *fun, int irq)
     102{
     103        size_t i;
     104        hw_resource_list_t *res = &fun->hw_resources;
     105       
     106        for (i = 0; i < res->count; i++) {
     107                if (res->resources[i].type == INTERRUPT &&
     108                    res->resources[i].res.interrupt.irq == irq) {
     109                        return true;
     110                }
     111        }
     112       
     113        return false;
     114}
     115
    101116static int pciintel_enable_interrupt(ddf_fun_t *fnode, int irq)
    102117{
    103         pci_fun_t *dev_data = pci_fun(fnode);
    104        
    105         size_t i;
    106         hw_resource_list_t *res = &dev_data->hw_resources;
    107         bool found = false;
    108        
    109         found = false;
    110         for (i = 0; i < res->count; i++) {
    111                 if (res->resources[i].type == INTERRUPT) {
    112                         found = true;
    113                         break;
    114                 }
    115         }
    116        
    117         if (!found)
     118        pci_fun_t *fun = pci_fun(fnode);
     119       
     120        if (!pciintel_fun_owns_interrupt(fun, irq))
    118121                return EINVAL;
    119        
     122
    120123        return irc_enable_interrupt(irq);
     124}
     125
     126static int pciintel_disable_interrupt(ddf_fun_t *fnode, int irq)
     127{
     128        pci_fun_t *fun = pci_fun(fnode);
     129       
     130        if (!pciintel_fun_owns_interrupt(fun, irq))
     131                return EINVAL;
     132
     133        return irc_disable_interrupt(irq);
     134}
     135
     136static int pciintel_clear_interrupt(ddf_fun_t *fnode, int irq)
     137{
     138        pci_fun_t *fun = pci_fun(fnode);
     139       
     140        if (!pciintel_fun_owns_interrupt(fun, irq))
     141                return EINVAL;
     142
     143        return irc_clear_interrupt(irq);
    121144}
    122145
     
    188211        .get_resource_list = &pciintel_get_resources,
    189212        .enable_interrupt = &pciintel_enable_interrupt,
     213        .disable_interrupt = &pciintel_disable_interrupt,
     214        .clear_interrupt = &pciintel_clear_interrupt,
    190215};
    191216
Note: See TracChangeset for help on using the changeset viewer.