Changeset ba4a03a5 in mainline


Ignore:
Timestamp:
2013-12-31T23:11:00Z (10 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
d1df381
Parents:
e3a07bba
Message:

usb host: Use all hw resources when generating irq code.

Location:
uspace
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/bus/usb/ehci/ehci.c

    re3a07bba rba4a03a5  
    9696        addr_range_t regs = hw_res.mem_ranges.ranges[0];
    9797        const int irq = hw_res.irqs.irqs[0];
    98         hw_res_list_parsed_clean(&hw_res);
    99 
    100         usb_log_debug("Memory mapped regs at %p (size %zu), IRQ %d.\n",
    101             RNGABSPTR(regs), RNGSZ(regs), irq);
    10298
    10399        /* Initialize generic HCD driver */
     
    107103                usb_log_error("Failed to setup generic hcd structures: %s.",
    108104                    str_error(ret));
     105                hw_res_list_parsed_clean(&hw_res);
    109106                return ret;
    110107        }
     
    113110        if (!hc) {
    114111                usb_log_error("Failed to allocate driver structure.\n");
     112                hw_res_list_parsed_clean(&hw_res);
    115113                ret = ENOMEM;
    116114                goto ddf_hc_clean;
     
    119117        /* Try to enable interrupts */
    120118        bool interrupts = false;
    121         ret = hcd_ddf_setup_interrupts(device, &regs, irq, irq_handler,
     119        ret = hcd_ddf_setup_interrupts(device, &hw_res, irq_handler,
    122120            hc_gen_irq_code);
    123121        if (ret != EOK) {
     
    131129        /* Initialize EHCI HC */
    132130        ret = hc_init(hc, &regs, interrupts);
     131        hw_res_list_parsed_clean(&hw_res);
    133132        if (ret != EOK) {
    134133                usb_log_error("Failed to init hc: %s.\n", str_error(ret));
  • uspace/drv/bus/usb/ehci/hc.c

    re3a07bba rba4a03a5  
    9999 * @param[out] cmds Commands buffer.
    100100 * @param[in] cmds_size Size of the commands buffer (bytes).
    101  * @param[in] regs Device's register range.
     101 * @param[in] hw_res Device's resources.
    102102 *
    103103 * @return Error code.
    104104 */
    105 int hc_gen_irq_code(irq_code_t *code, addr_range_t *regs)
     105int hc_gen_irq_code(irq_code_t *code, const hw_res_list_parsed_t *hw_res)
    106106{
    107107        assert(code);
    108         if (RNGSZ(*regs) < sizeof(ehci_regs_t))
     108        assert(hw_res);
     109
     110        if (hw_res->irqs.count != 1 || hw_res->mem_ranges.count != 1)
     111                return EINVAL;
     112
     113        addr_range_t regs = hw_res->mem_ranges.ranges[0];
     114
     115        if (RNGSZ(regs) < sizeof(ehci_regs_t))
    109116                return EOVERFLOW;
    110117
     
    123130
    124131        memcpy(code->ranges, ehci_pio_ranges, sizeof(ehci_pio_ranges));
    125         code->ranges[0].base = RNGABS(*regs);
     132        code->ranges[0].base = RNGABS(regs);
    126133
    127134        memcpy(code->cmds, ehci_irq_commands, sizeof(ehci_irq_commands));
    128135        ehci_caps_regs_t *caps = NULL;
    129         int ret = pio_enable_range(regs, (void**)&caps);
     136        int ret = pio_enable_range(&regs, (void**)&caps);
    130137        if (ret != EOK) {
    131138                return ret;
    132139        }
    133140        ehci_regs_t *registers =
    134             (ehci_regs_t *)(RNGABSPTR(*regs) + EHCI_RD8(caps->caplength));
     141            (ehci_regs_t *)(RNGABSPTR(regs) + EHCI_RD8(caps->caplength));
    135142        code->cmds[0].addr = (void *) &registers->usbsts;
    136143        code->cmds[3].addr = (void *) &registers->usbsts;
    137144        EHCI_WR(code->cmds[1].value, EHCI_USED_INTERRUPTS);
    138145
    139         return EOK;
     146        usb_log_debug("Memory mapped regs at %p (size %zu), IRQ %d.\n",
     147            RNGABSPTR(regs), RNGSZ(regs), hw_res->irqs.irqs[0]);
     148
     149        return hw_res->irqs.irqs[0];
    140150}
    141151
  • uspace/drv/bus/usb/ehci/hc.h

    re3a07bba rba4a03a5  
    7474} hc_t;
    7575
    76 int hc_gen_irq_code(irq_code_t *code, addr_range_t *regs);
     76int hc_gen_irq_code(irq_code_t *code, const hw_res_list_parsed_t *hw_res);
    7777int hc_register_hub(hc_t *instance, ddf_fun_t *hub_fun);
    7878int hc_init(hc_t *instance, addr_range_t *regs, bool interrupts);
  • uspace/drv/bus/usb/ohci/hc.c

    re3a07bba rba4a03a5  
    100100 * @param[out] cmds Commands buffer.
    101101 * @param[in] cmds_size Size of the commands buffer (bytes).
    102  * @param[in] regs Device's register range.
     102 * @param[in] hw_res Device's resources.
    103103 *
    104104 * @return Error code.
    105105 */
    106 int hc_gen_irq_code(irq_code_t *code, addr_range_t *regs)
     106int hc_gen_irq_code(irq_code_t *code, const hw_res_list_parsed_t *hw_res)
    107107{
    108108        assert(code);
    109         if (RNGSZ(*regs) < sizeof(ohci_regs_t))
     109        assert(hw_res);
     110
     111        if (hw_res->irqs.count != 1 || hw_res->mem_ranges.count != 1)
     112                return EINVAL;
     113
     114        const addr_range_t regs = hw_res->mem_ranges.ranges[0];
     115
     116        if (RNGSZ(regs) < sizeof(ohci_regs_t))
    110117                return EOVERFLOW;
    111118
     
    124131
    125132        memcpy(code->ranges, ohci_pio_ranges, sizeof(ohci_pio_ranges));
    126         code->ranges[0].base = RNGABS(*regs);
     133        code->ranges[0].base = RNGABS(regs);
    127134
    128135        memcpy(code->cmds, ohci_irq_commands, sizeof(ohci_irq_commands));
    129         ohci_regs_t *registers = (ohci_regs_t *) RNGABSPTR(*regs);
     136        ohci_regs_t *registers = (ohci_regs_t *) RNGABSPTR(regs);
    130137        code->cmds[0].addr = (void *) &registers->interrupt_status;
    131138        code->cmds[3].addr = (void *) &registers->interrupt_status;
    132139        OHCI_WR(code->cmds[1].value, OHCI_USED_INTERRUPTS);
    133140
    134         return EOK;
     141        usb_log_debug("Memory mapped regs at %p (size %zu), IRQ %d.\n",
     142            RNGABSPTR(regs), RNGSZ(regs), hw_res->irqs.irqs[0]);
     143
     144        return hw_res->irqs.irqs[0];
    135145}
    136146
  • uspace/drv/bus/usb/ohci/hc.h

    re3a07bba rba4a03a5  
    7575} hc_t;
    7676
    77 int hc_gen_irq_code(irq_code_t *code, addr_range_t *regs);
     77int hc_gen_irq_code(irq_code_t *code, const hw_res_list_parsed_t *hw_res);
    7878int hc_register_hub(hc_t *instance, ddf_fun_t *hub_fun);
    7979int hc_init(hc_t *instance, addr_range_t *regs, bool interrupts);
  • uspace/drv/bus/usb/ohci/ohci.c

    re3a07bba rba4a03a5  
    9696        addr_range_t regs = hw_res.mem_ranges.ranges[0];
    9797        const int irq = hw_res.irqs.irqs[0];
    98         hw_res_list_parsed_clean(&hw_res);
    99 
    100         usb_log_debug("Memory mapped regs at %p (size %zu), IRQ %d.\n",
    101             RNGABSPTR(regs), RNGSZ(regs), irq);
    10298
    10399        /* Initialize generic HCD driver */
     
    105101            BANDWIDTH_AVAILABLE_USB11, bandwidth_count_usb11);
    106102        if (ret != EOK) {
     103                hw_res_list_parsed_clean(&hw_res);
    107104                usb_log_error("Failed to setup generic hcd structures: %s.",
    108105                    str_error(ret));
     
    113110        if (!hc) {
    114111                usb_log_error("Failed to allocate driver structure.\n");
     112                hw_res_list_parsed_clean(&hw_res);
    115113                ret = ENOMEM;
    116114                goto ddf_hc_clean;
     
    119117        /* Try to enable interrupts */
    120118        bool interrupts = false;
    121         ret = hcd_ddf_setup_interrupts(device, &regs, irq, irq_handler,
     119        ret = hcd_ddf_setup_interrupts(device, &hw_res, irq_handler,
    122120            hc_gen_irq_code);
    123121        if (ret != EOK) {
     
    131129        /* Initialize OHCI HC */
    132130        ret = hc_init(hc, &regs, interrupts);
     131        hw_res_list_parsed_clean(&hw_res);
    133132        if (ret != EOK) {
    134133                usb_log_error("Failed to init hc: %s.\n", str_error(ret));
  • uspace/drv/bus/usb/uhci/hc.c

    re3a07bba rba4a03a5  
    102102/** Generate IRQ code.
    103103 * @param[out] code IRQ code structure.
    104  * @param[in] regs Device's register range.
     104 * @param[in] hw_res Device's resources.
    105105 *
    106106 * @return Error code.
    107107 */
    108 int hc_gen_irq_code(irq_code_t *code, addr_range_t *regs)
     108int hc_gen_irq_code(irq_code_t *code, const hw_res_list_parsed_t *hw_res)
    109109{
    110110        assert(code);
    111 
    112         if (RNGSZ(*regs) < sizeof(uhci_regs_t))
     111        assert(hw_res);
     112
     113        if (hw_res->irqs.count != 1 || hw_res->io_ranges.count != 1)
     114                return EINVAL;
     115        const addr_range_t regs = hw_res->io_ranges.ranges[0];
     116
     117        if (RNGSZ(regs) < sizeof(uhci_regs_t))
    113118                return EOVERFLOW;
    114119
     
    127132
    128133        memcpy(code->ranges, uhci_irq_pio_ranges, sizeof(uhci_irq_pio_ranges));
    129         code->ranges[0].base = RNGABS(*regs);
     134        code->ranges[0].base = RNGABS(regs);
    130135
    131136        memcpy(code->cmds, uhci_irq_commands, sizeof(uhci_irq_commands));
    132         uhci_regs_t *registers = (uhci_regs_t *) RNGABSPTR(*regs);
     137        uhci_regs_t *registers = (uhci_regs_t *) RNGABSPTR(regs);
    133138        code->cmds[0].addr = (void*)&registers->usbsts;
    134139        code->cmds[3].addr = (void*)&registers->usbsts;
    135140
    136         return EOK;
     141        usb_log_debug("I/O regs at %p (size %zu), IRQ %d.\n",
     142            RNGABSPTR(regs), RNGSZ(regs), hw_res->irqs.irqs[0]);
     143
     144        return hw_res->irqs.irqs[0];
    137145}
    138146
  • uspace/drv/bus/usb/uhci/hc.h

    re3a07bba rba4a03a5  
    127127} hc_t;
    128128
    129 int hc_gen_irq_code(irq_code_t *code, addr_range_t *regs);
     129int hc_gen_irq_code(irq_code_t *code, const hw_res_list_parsed_t *hw_res);
    130130void hc_interrupt(hc_t *instance, uint16_t status);
    131131int hc_init(hc_t *instance, addr_range_t *regs, bool interupts);
  • uspace/drv/bus/usb/uhci/uhci.c

    re3a07bba rba4a03a5  
    9898        addr_range_t regs = hw_res.io_ranges.ranges[0];
    9999        const int irq = hw_res.irqs.irqs[0];
    100         hw_res_list_parsed_clean(&hw_res);
    101 
    102         usb_log_debug("I/O regs at %p (size %zu), IRQ %d.\n",
    103             RNGABSPTR(regs), RNGSZ(regs), irq);
    104100
    105101        ret = hcd_ddf_setup_hc(device, USB_SPEED_FULL,
     
    107103        if (ret != EOK) {
    108104                usb_log_error("Failed to setup generic HCD.\n");
     105                hw_res_list_parsed_clean(&hw_res);
    109106                return ret;
    110107        }
     
    113110        if (!hc) {
    114111                usb_log_error("Failed to allocate UHCI HC structure.\n");
     112                hw_res_list_parsed_clean(&hw_res);
    115113                ret = ENOMEM;
    116114                goto ddf_hc_clean;
     
    118116
    119117        bool interrupts = false;
    120         ret = hcd_ddf_setup_interrupts(device, &regs, irq, irq_handler,
     118        ret = hcd_ddf_setup_interrupts(device, &hw_res, irq_handler,
    121119            hc_gen_irq_code);
    122120        if (ret != EOK) {
     
    129127
    130128        ret = hc_init(hc, &regs, interrupts);
     129        hw_res_list_parsed_clean(&hw_res);
    131130        if (ret != EOK) {
    132131                usb_log_error("Failed to init uhci_hcd: %s.\n", str_error(ret));
  • uspace/lib/usbhost/include/usb/host/ddf_helpers.h

    re3a07bba rba4a03a5  
    5454int hcd_ddf_enable_interrupts(ddf_dev_t *device);
    5555int hcd_ddf_get_registers(ddf_dev_t *device, hw_res_list_parsed_t *hw_res);
    56 int hcd_ddf_setup_interrupts(ddf_dev_t *device, addr_range_t *regs, int irq,
    57     interrupt_handler_t handler, int (*gen_irq_code)(irq_code_t *, addr_range_t *));
     56int hcd_ddf_setup_interrupts(ddf_dev_t *device,
     57    const hw_res_list_parsed_t *hw_res,
     58    interrupt_handler_t handler,
     59    int (*gen_irq_code)(irq_code_t *, const hw_res_list_parsed_t *));
    5860
    5961#endif
  • uspace/lib/usbhost/src/ddf_helpers.c

    re3a07bba rba4a03a5  
    712712 * @return EOK on success or negative error code
    713713 */
    714 int hcd_ddf_setup_interrupts(ddf_dev_t *device, addr_range_t *regs, int irq,
     714int hcd_ddf_setup_interrupts(ddf_dev_t *device,
     715    const hw_res_list_parsed_t *hw_res,
    715716    interrupt_handler_t handler,
    716     int (*gen_irq_code)(irq_code_t *, addr_range_t *))
     717    int (*gen_irq_code)(irq_code_t *, const hw_res_list_parsed_t *hw_res))
    717718{
    718719
    719720        assert(device);
    720         assert(regs);
     721        assert(hw_res);
    721722        assert(handler);
    722723        assert(gen_irq_code);
    723724
    724 
    725725        irq_code_t irq_code = {0};
    726726
    727         int ret = gen_irq_code(&irq_code, regs);
    728         if (ret != EOK) {
     727        int irq = gen_irq_code(&irq_code, hw_res);
     728        if (irq < 0) {
    729729                usb_log_error("Failed to generate IRQ code: %s.\n",
    730                     str_error(ret));
    731                 return ret;
     730                    str_error(irq));
     731                return irq;
    732732        }
    733733
    734734        /* Register handler to avoid interrupt lockup */
    735         ret = register_interrupt_handler(device, irq, handler, &irq_code);
     735        int ret = register_interrupt_handler(device, irq, handler, &irq_code);
    736736        irq_code_clean(&irq_code);
    737737        if (ret != EOK) {
Note: See TracChangeset for help on using the changeset viewer.