Ignore:
File:
1 edited

Legend:

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

    r5a6cc679 rb7fd2a0  
    4545#include <pci_dev_iface.h>
    4646
    47 #include "hc.h"
    4847#include "res.h"
    4948#include "ehci_regs.h"
     
    7473            eecp + USBLEGSUP_OFFSET, &usblegsup);
    7574        if (ret != EOK) {
    76                 usb_log_error("Failed to read USBLEGSUP: %s.", str_error(ret));
    77                 return ret;
    78         }
    79         usb_log_debug2("USBLEGSUP: %" PRIx32 ".", usblegsup);
     75                usb_log_error("Failed to read USBLEGSUP: %s.\n", str_error(ret));
     76                return ret;
     77        }
     78        usb_log_debug2("USBLEGSUP: %" PRIx32 ".\n", usblegsup);
    8079
    8180        /* Request control from firmware/BIOS by writing 1 to highest
    8281         * byte. (OS Control semaphore)*/
    83         usb_log_debug("Requesting OS control.");
     82        usb_log_debug("Requesting OS control.\n");
    8483        ret = pci_config_space_write_8(parent_sess,
    8584            eecp + USBLEGSUP_OFFSET + 3, 1);
    8685        if (ret != EOK) {
    87                 usb_log_error("Failed to request OS EHCI control: %s.",
     86                usb_log_error("Failed to request OS EHCI control: %s.\n",
    8887                    str_error(ret));
    8988                return ret;
     
    103102
    104103        if ((usblegsup & USBLEGSUP_BIOS_CONTROL) == 0) {
    105                 usb_log_info("BIOS released control after %zu usec.", wait);
     104                usb_log_info("BIOS released control after %zu usec.\n", wait);
    106105                return EOK;
    107106        }
     
    109108        /* BIOS failed to hand over control, this should not happen. */
    110109        usb_log_warning( "BIOS failed to release control after "
    111             "%zu usecs, force it.", wait);
     110            "%zu usecs, force it.\n", wait);
    112111        ret = pci_config_space_write_32(parent_sess,
    113112            eecp + USBLEGSUP_OFFSET, USBLEGSUP_OS_CONTROL);
    114113        if (ret != EOK) {
    115                 usb_log_error("Failed to force OS control: %s.",
     114                usb_log_error("Failed to force OS control: %s.\n",
    116115                    str_error(ret));
    117116                return ret;
     
    130129                    eecp + USBLEGCTLSTS_OFFSET, &usblegctlsts);
    131130                if (ret != EOK) {
    132                         usb_log_error("Failed to get USBLEGCTLSTS: %s.",
     131                        usb_log_error("Failed to get USBLEGCTLSTS: %s.\n",
    133132                            str_error(ret));
    134133                        return ret;
    135134                }
    136                 usb_log_debug2("USBLEGCTLSTS: %" PRIx32 ".", usblegctlsts);
     135                usb_log_debug2("USBLEGCTLSTS: %" PRIx32 ".\n", usblegctlsts);
    137136                /*
    138137                 * Zero SMI enables in legacy control register.
     
    143142                    eecp + USBLEGCTLSTS_OFFSET, 0xe0000000);
    144143                if (ret != EOK) {
    145                         usb_log_error("Failed to zero USBLEGCTLSTS: %s",
     144                        usb_log_error("Failed to zero USBLEGCTLSTS: %s\n",
    146145                            str_error(ret));
    147146                        return ret;
     
    153152                    eecp + USBLEGCTLSTS_OFFSET, &usblegctlsts);
    154153                if (ret != EOK) {
    155                         usb_log_error("Failed to get USBLEGCTLSTS 2: %s.",
     154                        usb_log_error("Failed to get USBLEGCTLSTS 2: %s.\n",
    156155                            str_error(ret));
    157156                        return ret;
    158157                }
    159                 usb_log_debug2("Zeroed USBLEGCTLSTS: %" PRIx32 ".",
     158                usb_log_debug2("Zeroed USBLEGCTLSTS: %" PRIx32 ".\n",
    160159                    usblegctlsts);
    161160        }
     
    165164            eecp + USBLEGSUP_OFFSET, &usblegsup);
    166165        if (ret != EOK) {
    167                 usb_log_error("Failed to read USBLEGSUP: %s.",
    168                     str_error(ret));
    169                 return ret;
    170         }
    171         usb_log_debug2("USBLEGSUP: %" PRIx32 ".", usblegsup);
     166                usb_log_error("Failed to read USBLEGSUP: %s.\n",
     167                    str_error(ret));
     168                return ret;
     169        }
     170        usb_log_debug2("USBLEGSUP: %" PRIx32 ".\n", usblegsup);
    172171        return ret;
    173172}
    174173
    175 errno_t disable_legacy(hc_device_t *hcd)
     174errno_t disable_legacy(ddf_dev_t *device)
    176175{
    177         hc_t *hc = hcd_to_hc(hcd);
    178 
    179         async_sess_t *parent_sess = ddf_dev_parent_sess_get(hcd->ddf_dev);
     176        assert(device);
     177
     178        async_sess_t *parent_sess = ddf_dev_parent_sess_get(device);
    180179        if (parent_sess == NULL)
    181180                return ENOMEM;
    182181
    183         usb_log_debug("Disabling EHCI legacy support.");
    184 
    185         const uint32_t hcc_params = EHCI_RD(hc->caps->hccparams);
    186         usb_log_debug2("Value of hcc params register: %x.", hcc_params);
     182        usb_log_debug("Disabling EHCI legacy support.\n");
     183
     184        hw_res_list_parsed_t res;
     185        hw_res_list_parsed_init(&res);
     186        errno_t ret = hw_res_get_list_parsed(parent_sess, &res, 0);
     187        if (ret != EOK) {
     188                usb_log_error("Failed to get resource list: %s\n",
     189                    str_error(ret));
     190                goto clean;
     191        }
     192
     193        if (res.mem_ranges.count < 1) {
     194                usb_log_error("Incorrect mem range count: %zu",
     195                    res.mem_ranges.count);
     196                ret = EINVAL;
     197                goto clean;
     198        }
     199
     200        /* Map EHCI registers */
     201        void *regs = NULL;
     202        ret = pio_enable_range(&res.mem_ranges.ranges[0], &regs);
     203        if (ret != EOK) {
     204                usb_log_error("Failed to map registers %p: %s.\n",
     205                    RNGABSPTR(res.mem_ranges.ranges[0]), str_error(ret));
     206                goto clean;
     207        }
     208
     209        usb_log_debug("Registers mapped at: %p.\n", regs);
     210
     211        ehci_caps_regs_t *ehci_caps = regs;
     212
     213        const uint32_t hcc_params = EHCI_RD(ehci_caps->hccparams);
     214        usb_log_debug2("Value of hcc params register: %x.\n", hcc_params);
    187215
    188216        /* Read value of EHCI Extended Capabilities Pointer
     
    190218        const uint32_t eecp =
    191219            (hcc_params >> EHCI_CAPS_HCC_EECP_SHIFT) & EHCI_CAPS_HCC_EECP_MASK;
    192         usb_log_debug2("Value of EECP: %x.", eecp);
    193 
    194         int ret = disable_extended_caps(parent_sess, eecp);
    195         if (ret != EOK) {
    196                 usb_log_error("Failed to disable extended capabilities: %s.",
     220        usb_log_debug2("Value of EECP: %x.\n", eecp);
     221
     222        ret = disable_extended_caps(parent_sess, eecp);
     223        if (ret != EOK) {
     224                usb_log_error("Failed to disable extended capabilities: %s.\n",
    197225                    str_error(ret));
    198226                    goto clean;
    199227        }
    200228clean:
    201         async_hangup(parent_sess);
     229        //TODO unmap registers
     230        hw_res_list_parsed_clean(&res);
    202231        return ret;
    203232}
Note: See TracChangeset for help on using the changeset viewer.