Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/uhci-rhd/port.c

    r87157982 r1ae51ae  
    3434#include <errno.h>
    3535#include <str_error.h>
     36#include <fibril_synch.h>
    3637
    3738#include <usb/usb.h>    /* usb_address_t */
     
    4546#include "port_status.h"
    4647
    47 static int uhci_port_new_device(uhci_port_t *port);
     48static int uhci_port_new_device(uhci_port_t *port, uint16_t status);
    4849static int uhci_port_remove_device(uhci_port_t *port);
    4950static int uhci_port_set_enabled(uhci_port_t *port, bool enabled);
    5051static int uhci_port_check(void *port);
     52static int new_device_enable_port(int portno, void *arg);
    5153
    5254int uhci_port_init(
    5355  uhci_port_t *port, port_status_t *address, unsigned number,
    54   unsigned usec, ddf_dev_t *rh, int parent_phone)
     56  unsigned usec, ddf_dev_t *rh)
    5557{
    5658        assert(port);
     
    9092        uhci_port_t *port_instance = port;
    9193        assert(port_instance);
     94        port_status_write(port_instance->address, 0);
     95
     96        uint64_t count = 0;
    9297
    9398        while (1) {
     99                async_usleep(port_instance->wait_period_usec);
     100
    94101                /* read register value */
    95102                port_status_t port_status =
     
    97104
    98105                /* debug print */
    99                 usb_log_debug("Port %d status at %p: 0x%04x.\n",
    100                   port_instance->number, port_instance->address, port_status);
    101                 print_port_status(port_status);
    102 
    103                 if (port_status & STATUS_CONNECTED_CHANGED) {
     106                static fibril_mutex_t dbg_mtx = FIBRIL_MUTEX_INITIALIZER(dbg_mtx);
     107                fibril_mutex_lock(&dbg_mtx);
     108                usb_log_debug("Port %d status at %p: 0x%04x. === %llu\n",
     109                  port_instance->number, port_instance->address, port_status, count++);
     110//              print_port_status(port_status);
     111                fibril_mutex_unlock(&dbg_mtx);
     112
     113                if ((port_status & STATUS_CONNECTED_CHANGED) != 0) {
     114                        usb_log_debug("Change detected on port %d: %x.\n",
     115                            port_instance->number, port_status);
     116
     117
    104118                        int rc = usb_hc_connection_open(
    105119                            &port_instance->hc_connection);
    106120                        if (rc != EOK) {
    107121                                usb_log_error("Failed to connect to HC.");
    108                                 goto next;
    109                         }
    110 
    111                         if (port_status & STATUS_CONNECTED) {
     122                                continue;
     123                        }
     124
     125                        /* remove any old device */
     126                        if (port_instance->attached_device) {
     127                                usb_log_debug("Removing device on port %d.\n",
     128                                    port_instance->number);
     129                                uhci_port_remove_device(port_instance);
     130                        }
     131
     132                        if ((port_status & STATUS_CONNECTED) != 0) {
    112133                                /* new device */
    113                                 uhci_port_new_device(port_instance);
     134                                uhci_port_new_device(port_instance, port_status);
    114135                        } else {
    115                                 uhci_port_remove_device(port_instance);
     136                                /* ack changes by writing one to WC bits */
     137                                port_status_write(port_instance->address, port_status);
     138                                usb_log_debug("Change status ack on port %d.\n",
     139                                                port_instance->number);
    116140                        }
    117141
     
    120144                        if (rc != EOK) {
    121145                                usb_log_error("Failed to disconnect from HC.");
    122                                 goto next;
    123146                        }
    124147                }
    125         next:
    126                 async_usleep(port_instance->wait_period_usec);
    127148        }
    128149        return EOK;
     
    147168        async_usleep(100000);
    148169
    149         /* Enable the port. */
    150         uhci_port_set_enabled(port, true);
    151170
    152171        /* The hub maintains the reset signal to that port for 10 ms
     
    169188        }
    170189
    171         return EOK;
    172 }
    173 
    174 /*----------------------------------------------------------------------------*/
    175 static int uhci_port_new_device(uhci_port_t *port)
     190        /* Enable the port. */
     191        uhci_port_set_enabled(port, true);
     192
     193        return EOK;
     194}
     195
     196/*----------------------------------------------------------------------------*/
     197static int uhci_port_new_device(uhci_port_t *port, uint16_t status)
    176198{
    177199        assert(port);
     
    182204        usb_address_t dev_addr;
    183205        int rc = usb_hc_new_device_wrapper(port->rh, &port->hc_connection,
    184             USB_SPEED_FULL,
     206            ((status & STATUS_LOW_SPEED) != 0) ? USB_SPEED_LOW : USB_SPEED_FULL,
    185207            new_device_enable_port, port->number, port,
    186208            &dev_addr, &port->attached_device, NULL, NULL, NULL);
     209
    187210        if (rc != EOK) {
    188211                usb_log_error("Failed adding new device on port %u: %s.\n",
Note: See TracChangeset for help on using the changeset viewer.