Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/bus/usb/uhci/pci.c

    r266976f r5203e256  
    2626 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    2727 */
     28
    2829/**
    2930 * @addtogroup drvusbuhcihc
     
    3839#include <assert.h>
    3940#include <devman.h>
    40 #include <device/hw_res_parsed.h>
     41#include <device/hw_res.h>
    4142
    4243#include <usb/debug.h>
     
    6061        assert(io_reg_size);
    6162        assert(irq_no);
    62 
     63       
    6364        async_sess_t *parent_sess =
    6465            devman_parent_device_connect(EXCHANGE_SERIALIZE, dev->handle,
     
    6667        if (!parent_sess)
    6768                return ENOMEM;
    68 
    69         hw_res_list_parsed_t hw_res;
    70         hw_res_list_parsed_init(&hw_res);
    71         const int ret =  hw_res_get_list_parsed(parent_sess, &hw_res, 0);
     69       
     70        hw_resource_list_t hw_resources;
     71        int rc = hw_res_get_resource_list(parent_sess, &hw_resources);
     72        if (rc != EOK) {
     73                async_hangup(parent_sess);
     74                return rc;
     75        }
     76       
     77        uintptr_t io_address = 0;
     78        size_t io_size = 0;
     79        bool io_found = false;
     80       
     81        int irq = 0;
     82        bool irq_found = false;
     83       
     84        size_t i;
     85        for (i = 0; i < hw_resources.count; i++) {
     86                const hw_resource_t *res = &hw_resources.resources[i];
     87                switch (res->type) {
     88                case INTERRUPT:
     89                        irq = res->res.interrupt.irq;
     90                        irq_found = true;
     91                        usb_log_debug2("Found interrupt: %d.\n", irq);
     92                        break;
     93                case IO_RANGE:
     94                        io_address = res->res.io_range.address;
     95                        io_size = res->res.io_range.size;
     96                        usb_log_debug2("Found io: %" PRIx64" %zu.\n",
     97                            res->res.io_range.address, res->res.io_range.size);
     98                        io_found = true;
     99                        break;
     100                default:
     101                        break;
     102                }
     103        }
     104       
    72105        async_hangup(parent_sess);
    73         if (ret != EOK) {
    74                 return ret;
    75         }
    76 
    77         /* We want one irq and one io range. */
    78         if (hw_res.irqs.count != 1 || hw_res.io_ranges.count != 1) {
    79                 hw_res_list_parsed_clean(&hw_res);
    80                 return EINVAL;
    81         }
    82 
    83         if (io_reg_address)
    84                 *io_reg_address = hw_res.io_ranges.ranges[0].address;
    85         if (io_reg_size)
    86                 *io_reg_size = hw_res.io_ranges.ranges[0].size;
    87         if (irq_no)
    88                 *irq_no = hw_res.irqs.irqs[0];
    89 
    90         hw_res_list_parsed_clean(&hw_res);
     106       
     107        if (!io_found || !irq_found)
     108                return ENOENT;
     109       
     110        *io_reg_address = io_address;
     111        *io_reg_size = io_size;
     112        *irq_no = irq;
     113       
    91114        return EOK;
    92115}
    93 /*----------------------------------------------------------------------------*/
     116
    94117/** Call the PCI driver with a request to enable interrupts
    95118 *
     
    104127        if (!parent_sess)
    105128                return ENOMEM;
    106 
     129       
    107130        const bool enabled = hw_res_enable_interrupt(parent_sess);
    108131        async_hangup(parent_sess);
    109 
     132       
    110133        return enabled ? EOK : EIO;
    111134}
    112 /*----------------------------------------------------------------------------*/
     135
    113136/** Call the PCI driver with a request to clear legacy support register
    114137 *
     
    119142{
    120143        assert(device);
    121 
     144       
    122145        async_sess_t *parent_sess =
    123146            devman_parent_device_connect(EXCHANGE_SERIALIZE, device->handle,
     
    125148        if (!parent_sess)
    126149                return ENOMEM;
    127 
     150       
    128151        /* See UHCI design guide for these values p.45,
    129152         * write all WC bits in USB legacy register */
    130153        const sysarg_t address = 0xc0;
    131154        const sysarg_t value = 0xaf00;
    132 
     155       
    133156        async_exch_t *exch = async_exchange_begin(parent_sess);
    134 
     157       
    135158        const int rc = async_req_3_0(exch, DEV_IFACE_ID(PCI_DEV_IFACE),
    136159            IPC_M_CONFIG_SPACE_WRITE_16, address, value);
    137 
     160       
    138161        async_exchange_end(exch);
    139162        async_hangup(parent_sess);
    140 
     163       
    141164        return rc;
    142165}
Note: See TracChangeset for help on using the changeset viewer.