Ignore:
File:
1 edited

Legend:

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

    rdced52a 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);
     
    7169        port->checker = fibril_create(uhci_port_check, port);
    7270        if (port->checker == 0) {
    73                 usb_log_error("Port(%p - %d): failed to launch root hub fibril.",
    74                     port->address, port->number);
     71                usb_log_error(": failed to launch root hub fibril.");
    7572                return ENOMEM;
    7673        }
    7774        fibril_add_ready(port->checker);
    78         usb_log_debug("Port(%p - %d): Added fibril. %x\n",
    79             port->address, port->number, port->checker);
     75        usb_log_debug(
     76          "Added fibril for port %d: %p.\n", number, port->checker);
    8077        return EOK;
    8178}
     
    9390        uhci_port_t *port_instance = port;
    9491        assert(port_instance);
    95 //      port_status_write(port_instance->address, 0);
    96 
    97         unsigned count = 0;
    9892
    9993        while (1) {
    100                 async_usleep(port_instance->wait_period_usec);
    101 
    10294                /* read register value */
    10395                port_status_t port_status =
     
    10597
    10698                /* debug print */
    107                 static fibril_mutex_t dbg_mtx = FIBRIL_MUTEX_INITIALIZER(dbg_mtx);
    108                 fibril_mutex_lock(&dbg_mtx);
    109                 usb_log_debug2("Port(%p - %d): Status: %#04x. === %u\n",
    110                   port_instance->address, port_instance->number, port_status, count++);
    111 //              print_port_status(port_status);
    112                 fibril_mutex_unlock(&dbg_mtx);
    113 
    114                 if ((port_status & STATUS_CONNECTED_CHANGED) != 0) {
    115                         usb_log_debug("Port(%p - %d): Connected change detected: %x.\n",
    116                             port_instance->address, port_instance->number, port_status);
    117 
    118 
     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) {
    119104                        int rc = usb_hc_connection_open(
    120105                            &port_instance->hc_connection);
    121106                        if (rc != EOK) {
    122                                 usb_log_error("Port(%p - %d): Failed to connect to HC.",
    123                                     port_instance->address, port_instance->number);
    124                                 continue;
     107                                usb_log_error("Failed to connect to HC.");
     108                                goto next;
    125109                        }
    126110
    127                         /* remove any old device */
    128                         if (port_instance->attached_device) {
    129                                 usb_log_debug("Port(%p - %d): Removing device.\n",
    130                                     port_instance->address, port_instance->number);
     111                        if (port_status & STATUS_CONNECTED) {
     112                                /* new device */
     113                                uhci_port_new_device(port_instance);
     114                        } else {
    131115                                uhci_port_remove_device(port_instance);
    132                         }
    133 
    134                         if ((port_status & STATUS_CONNECTED) != 0) {
    135                                 /* new device */
    136                                 uhci_port_new_device(port_instance, port_status);
    137                         } else {
    138                                 /* ack changes by writing one to WC bits */
    139                                 port_status_write(port_instance->address, port_status);
    140                                 usb_log_debug("Port(%p - %d): Change status ACK.\n",
    141                                                 port_instance->address, port_instance->number);
    142116                        }
    143117
     
    145119                            &port_instance->hc_connection);
    146120                        if (rc != EOK) {
    147                                 usb_log_error("Port(%p - %d): Failed to disconnect from HC.",
    148                                     port_instance->address, port_instance->number);
     121                                usb_log_error("Failed to disconnect from HC.");
     122                                goto next;
    149123                        }
    150124                }
     125        next:
     126                async_usleep(port_instance->wait_period_usec);
    151127        }
    152128        return EOK;
     
    163139        uhci_port_t *port = (uhci_port_t *) arg;
    164140
    165         usb_log_debug2("Port(%p - %d): new_device_enable_port.\n",
    166             port->address, port->number);
     141        usb_log_debug("new_device_enable_port(%d)\n", port->number);
    167142
    168143        /*
     
    172147        async_usleep(100000);
    173148
     149        /* Enable the port. */
     150        uhci_port_set_enabled(port, true);
    174151
    175152        /* The hub maintains the reset signal to that port for 10 ms
     
    177154         */
    178155        {
    179                 usb_log_debug("Port(%p - %d): Reset Signal start.\n",
    180                     port->address, port->number);
     156                usb_log_debug("Reset Signal start on port %d.\n",
     157                    port->number);
    181158                port_status_t port_status =
    182159                        port_status_read(port->address);
     
    188165                port_status &= ~STATUS_IN_RESET;
    189166                port_status_write(port->address, port_status);
    190                 usb_log_debug("Port(%p - %d): Reset Signal stop.\n",
    191                     port->address, port->number);
    192         }
    193 
    194         /* Enable the port. */
    195         uhci_port_set_enabled(port, true);
    196 
    197         return EOK;
    198 }
    199 
    200 /*----------------------------------------------------------------------------*/
    201 static int uhci_port_new_device(uhci_port_t *port, uint16_t status)
     167                usb_log_debug("Reset Signal stop on port %d.\n",
     168                    port->number);
     169        }
     170
     171        return EOK;
     172}
     173
     174/*----------------------------------------------------------------------------*/
     175static int uhci_port_new_device(uhci_port_t *port)
    202176{
    203177        assert(port);
    204178        assert(usb_hc_connection_is_opened(&port->hc_connection));
    205179
    206         usb_log_info("Port(%p-%d): Detected new device.\n",
    207             port->address, port->number);
     180        usb_log_info("Detected new device on port %u.\n", port->number);
    208181
    209182        usb_address_t dev_addr;
    210183        int rc = usb_hc_new_device_wrapper(port->rh, &port->hc_connection,
    211             ((status & STATUS_LOW_SPEED) != 0) ? USB_SPEED_LOW : USB_SPEED_FULL,
     184            USB_SPEED_FULL,
    212185            new_device_enable_port, port->number, port,
    213186            &dev_addr, &port->attached_device, NULL, NULL, NULL);
    214 
    215187        if (rc != EOK) {
    216                 usb_log_error("Port(%p-%d): Failed(%d) adding new device: %s.\n",
    217                     port->address, port->number, rc, str_error(rc));
     188                usb_log_error("Failed adding new device on port %u: %s.\n",
     189                    port->number, str_error(rc));
    218190                uhci_port_set_enabled(port, false);
    219191                return rc;
    220192        }
    221193
    222         usb_log_info("Port(%p-%d): New device has address %d (handle %zu).\n",
    223             port->address, port->number, dev_addr, port->attached_device);
     194        usb_log_info("New device on port %u has address %d (handle %zu).\n",
     195            port->number, dev_addr, port->attached_device);
    224196
    225197        return EOK;
     
    229201static int uhci_port_remove_device(uhci_port_t *port)
    230202{
    231         usb_log_error("Port(%p-%d): Don't know how to remove device %#x.\n",
    232                 port->address, port->number, (unsigned int)port->attached_device);
     203        usb_log_error("Don't know how to remove device %#x.\n",
     204                (unsigned int)port->attached_device);
    233205//      uhci_port_set_enabled(port, false);
    234206        return EOK;
     
    251223        port_status_write(port->address, port_status);
    252224
    253         usb_log_info("Port(%p-%d): %sabled port.\n",
    254                 port->address, port->number, enabled ? "En" : "Dis");
     225        usb_log_info("%s port %d.\n",
     226          enabled ? "Enabled" : "Disabled", port->number);
    255227        return EOK;
    256228}
Note: See TracChangeset for help on using the changeset viewer.