Ignore:
File:
1 edited

Legend:

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

    r920d0fc r2ef8023  
    2626 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    2727 */
    28 /** @addtogroup drvusbuhcihc
     28/** @addtogroup drvusbuhci
    2929 * @{
    3030 */
     
    3232 * @brief UHCI driver initialization
    3333 */
     34
     35#include <assert.h>
    3436#include <ddf/driver.h>
     37#include <devman.h>
    3538#include <errno.h>
     39#include <io/log.h>
     40#include <pci_dev_iface.h>
     41#include <stdio.h>
    3642#include <str_error.h>
     43#include <usb/debug.h>
     44#include <usb/host/ddf_helpers.h>
    3745
    38 #include <usb/ddfiface.h>
    39 #include <usb/debug.h>
    40 
    41 #include "uhci.h"
     46#include "hc.h"
    4247
    4348#define NAME "uhci"
    4449
     50// TODO: This should be merged to hc_interrupt
     51static void uhci_interrupt(hcd_t *hcd, uint32_t status)
     52{
     53        assert(hcd);
     54        if (hcd->driver.data)
     55                hc_interrupt(hcd->driver.data, status);
     56}
     57
     58static int uhci_driver_init(hcd_t *hcd, const hw_res_list_parsed_t *res, bool irq)
     59{
     60        assert(hcd);
     61        assert(hcd->driver.data == NULL);
     62
     63        hc_t *instance = malloc(sizeof(hc_t));
     64        if (!instance)
     65                return ENOMEM;
     66
     67        const int ret =  hc_init(instance, res, irq);
     68        if (ret == EOK)
     69                hcd_set_implementation(hcd, instance, hc_schedule, NULL, NULL,
     70                    uhci_interrupt);
     71        return ret;
     72}
     73
     74static void uhci_driver_fini(hcd_t *hcd)
     75{
     76        assert(hcd);
     77        if (hcd->driver.data)
     78                hc_fini(hcd->driver.data);
     79
     80        free(hcd->driver.data);
     81        hcd_set_implementation(hcd, NULL, NULL, NULL, NULL, NULL);
     82}
     83
    4584static int uhci_dev_add(ddf_dev_t *device);
    4685
    47 static driver_ops_t uhci_driver_ops = {
     86static const driver_ops_t uhci_driver_ops = {
    4887        .dev_add = uhci_dev_add,
    4988};
    5089
    51 static driver_t uhci_driver = {
     90static const driver_t uhci_driver = {
    5291        .name = NAME,
    5392        .driver_ops = &uhci_driver_ops
    5493};
     94
     95/** Call the PCI driver with a request to clear legacy support register
     96 *
     97 * @param[in] device Device asking to disable interrupts
     98 * @return Error code.
     99 */
     100static int disable_legacy(ddf_dev_t *device)
     101{
     102        assert(device);
     103
     104        async_sess_t *parent_sess = devman_parent_device_connect(
     105            EXCHANGE_SERIALIZE, ddf_dev_get_handle(device), IPC_FLAG_BLOCKING);
     106        if (!parent_sess)
     107                return ENOMEM;
     108
     109        /* See UHCI design guide page 45 for these values.
     110         * Write all WC bits in USB legacy register */
     111        const int rc = pci_config_space_write_16(parent_sess, 0xc0, 0xaf00);
     112
     113        async_hangup(parent_sess);
     114        return rc;
     115}
    55116
    56117/** Initialize a new ddf driver instance for uhci hc and hub.
     
    64125        assert(device);
    65126
    66         const int ret = device_setup_uhci(device);
     127        int ret = disable_legacy(device);
     128        if (ret != EOK) {
     129                usb_log_error("Failed to disable legacy USB: %s.\n",
     130                    str_error(ret));
     131                return ret;
     132        }
     133
     134
     135        ret = ddf_hcd_device_setup_all(device, USB_SPEED_FULL,
     136            BANDWIDTH_AVAILABLE_USB11, bandwidth_count_usb11,
     137            ddf_hcd_gen_irq_handler, hc_gen_irq_code,
     138            uhci_driver_init, uhci_driver_fini);
    67139        if (ret != EOK) {
    68140                usb_log_error("Failed to initialize UHCI driver: %s.\n",
Note: See TracChangeset for help on using the changeset viewer.