Ignore:
File:
1 edited

Legend:

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

    r1ae51ae r87157982  
    3434#include <errno.h>
    3535#include <str_error.h>
    36 #include <fibril_synch.h>
    3736
    3837#include <usb/usb.h>    /* usb_address_t */
     
    4645#include "port_status.h"
    4746
    48 static int uhci_port_new_device(uhci_port_t *port, uint16_t status);
     47static int uhci_port_new_device(uhci_port_t *port);
    4948static int uhci_port_remove_device(uhci_port_t *port);
    5049static int uhci_port_set_enabled(uhci_port_t *port, bool enabled);
    5150static int uhci_port_check(void *port);
    52 static int new_device_enable_port(int portno, void *arg);
    5351
    5452int uhci_port_init(
    5553  uhci_port_t *port, port_status_t *address, unsigned number,
    56   unsigned usec, ddf_dev_t *rh)
     54  unsigned usec, ddf_dev_t *rh, int parent_phone)
    5755{
    5856        assert(port);
     
    9290        uhci_port_t *port_instance = port;
    9391        assert(port_instance);
    94         port_status_write(port_instance->address, 0);
    95 
    96         uint64_t count = 0;
    9792
    9893        while (1) {
    99                 async_usleep(port_instance->wait_period_usec);
    100 
    10194                /* read register value */
    10295                port_status_t port_status =
     
    10497
    10598                /* debug print */
    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 
     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) {
    118104                        int rc = usb_hc_connection_open(
    119105                            &port_instance->hc_connection);
    120106                        if (rc != EOK) {
    121107                                usb_log_error("Failed to connect to HC.");
    122                                 continue;
     108                                goto next;
    123109                        }
    124110
    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);
     111                        if (port_status & STATUS_CONNECTED) {
     112                                /* new device */
     113                                uhci_port_new_device(port_instance);
     114                        } else {
    129115                                uhci_port_remove_device(port_instance);
    130                         }
    131 
    132                         if ((port_status & STATUS_CONNECTED) != 0) {
    133                                 /* new device */
    134                                 uhci_port_new_device(port_instance, port_status);
    135                         } else {
    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);
    140116                        }
    141117
     
    144120                        if (rc != EOK) {
    145121                                usb_log_error("Failed to disconnect from HC.");
     122                                goto next;
    146123                        }
    147124                }
     125        next:
     126                async_usleep(port_instance->wait_period_usec);
    148127        }
    149128        return EOK;
     
    168147        async_usleep(100000);
    169148
     149        /* Enable the port. */
     150        uhci_port_set_enabled(port, true);
    170151
    171152        /* The hub maintains the reset signal to that port for 10 ms
     
    188169        }
    189170
    190         /* Enable the port. */
    191         uhci_port_set_enabled(port, true);
    192 
    193         return EOK;
    194 }
    195 
    196 /*----------------------------------------------------------------------------*/
    197 static int uhci_port_new_device(uhci_port_t *port, uint16_t status)
     171        return EOK;
     172}
     173
     174/*----------------------------------------------------------------------------*/
     175static int uhci_port_new_device(uhci_port_t *port)
    198176{
    199177        assert(port);
     
    204182        usb_address_t dev_addr;
    205183        int rc = usb_hc_new_device_wrapper(port->rh, &port->hc_connection,
    206             ((status & STATUS_LOW_SPEED) != 0) ? USB_SPEED_LOW : USB_SPEED_FULL,
     184            USB_SPEED_FULL,
    207185            new_device_enable_port, port->number, port,
    208186            &dev_addr, &port->attached_device, NULL, NULL, NULL);
    209 
    210187        if (rc != EOK) {
    211188                usb_log_error("Failed adding new device on port %u: %s.\n",
Note: See TracChangeset for help on using the changeset viewer.