Changes in / [12b8e03:fa0f53b] in mainline


Ignore:
Location:
uspace/drv
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/ohci/ohci_regs.h

    r12b8e03 rfa0f53b  
    5555#define C_HCFS_MASK        (0x3) /* Host controller functional state */
    5656#define C_HCFS_RESET       (0x0)
    57 #define C_HCFS_RESUME      (0x1)
    58 #define C_HCFS_OPERATIONAL (0x2)
     57#define C_HCFS_OPERATIONAL (0x1)
     58#define C_HCFS_RESUME      (0x2)
    5959#define C_HCFS_SUSPEND     (0x3)
    6060#define C_HCFS_SHIFT       (6)
  • uspace/drv/uhci-hcd/hc.c

    r12b8e03 rfa0f53b  
    247247{
    248248        assert(instance);
    249 #define SETUP_TRANSFER_LIST(type, name) \
    250 do { \
    251         int ret = transfer_list_init(&instance->transfers_##type, name); \
     249#define CHECK_RET_CLEAR_RETURN(ret, message...) \
    252250        if (ret != EOK) { \
    253                 usb_log_error("Failed(%d) to setup %s transfer list: %s.\n", \
    254                     ret, name, str_error(ret)); \
     251                usb_log_error(message); \
    255252                transfer_list_fini(&instance->transfers_bulk_full); \
    256253                transfer_list_fini(&instance->transfers_control_full); \
     
    258255                transfer_list_fini(&instance->transfers_interrupt); \
    259256                return ret; \
    260         } \
    261 } while (0)
    262 
    263         SETUP_TRANSFER_LIST(bulk_full, "BULK FULL");
    264         SETUP_TRANSFER_LIST(control_full, "CONTROL FULL");
    265         SETUP_TRANSFER_LIST(control_slow, "CONTROL LOW");
    266         SETUP_TRANSFER_LIST(interrupt, "INTERRUPT");
    267 #undef SETUP_TRANSFER_LIST
    268         /* Connect lists into one schedule */
     257        } else (void) 0
     258
     259        /* initialize TODO: check errors */
     260        int ret;
     261        ret = transfer_list_init(&instance->transfers_bulk_full, "BULK_FULL");
     262        CHECK_RET_CLEAR_RETURN(ret, "Failed to init BULK list.");
     263
     264        ret = transfer_list_init(
     265            &instance->transfers_control_full, "CONTROL_FULL");
     266        CHECK_RET_CLEAR_RETURN(ret, "Failed to init CONTROL FULL list.");
     267
     268        ret = transfer_list_init(
     269            &instance->transfers_control_slow, "CONTROL_SLOW");
     270        CHECK_RET_CLEAR_RETURN(ret, "Failed to init CONTROL SLOW list.");
     271
     272        ret = transfer_list_init(&instance->transfers_interrupt, "INTERRUPT");
     273        CHECK_RET_CLEAR_RETURN(ret, "Failed to init INTERRUPT list.");
     274
    269275        transfer_list_set_next(&instance->transfers_control_full,
    270276                &instance->transfers_bulk_full);
     
    331337        assert(instance);
    332338//      status |= 1; //Uncomment to work around qemu hang
     339        /* TODO: Resume interrupts are not supported */
    333340        /* Lower 2 bits are transaction error and transaction complete */
    334         if (status & (UHCI_STATUS_INTERRUPT | UHCI_STATUS_ERROR_INTERRUPT)) {
     341        if (status & 0x3) {
    335342                LIST_INITIALIZE(done);
    336343                transfer_list_remove_finished(
     
    351358                }
    352359        }
    353         /* Resume interrupts are not supported */
    354 
    355         /* Bits 4 and 5 indicate hc error */
    356         if (status & (UHCI_STATUS_PROCESS_ERROR | UHCI_STATUS_SYSTEM_ERROR)) {
     360        /* bits 4 and 5 indicate hc error */
     361        if (status & 0x18) {
    357362                usb_log_error("UHCI hardware failure!.\n");
    358363                ++instance->hw_failures;
     
    384389
    385390        while (1) {
    386                 /* Readd and clear status register */
     391                /* read and ack interrupts */
    387392                uint16_t status = pio_read_16(&instance->registers->usbsts);
    388                 pio_write_16(&instance->registers->usbsts, status);
     393                pio_write_16(&instance->registers->usbsts, 0x1f);
    389394                if (status != 0)
    390395                        usb_log_debug2("UHCI status: %x.\n", status);
    391396                hc_interrupt(instance, status);
    392                 async_usleep(UHCI_INT_EMULATOR_TIMEOUT);
     397                async_usleep(UHCI_CLEANER_TIMEOUT);
    393398        }
    394399        return EOK;
  • uspace/drv/uhci-hcd/hc.h

    r12b8e03 rfa0f53b  
    8888
    8989#define UHCI_FRAME_LIST_COUNT 1024
    90 #define UHCI_INT_EMULATOR_TIMEOUT 10000
     90#define UHCI_CLEANER_TIMEOUT 10000
    9191#define UHCI_DEBUGER_TIMEOUT 5000000
    9292#define UHCI_ALLOWED_HW_FAIL 5
  • uspace/drv/uhci-hcd/main.c

    r12b8e03 rfa0f53b  
    7878        device->driver_data = uhci;
    7979
    80         usb_log_info("Controlling new UHCI device '%s'.\n", device->name);
     80        usb_log_info("Controlling new UHCI device `%s'.\n", device->name);
    8181
    8282        return EOK;
  • uspace/drv/uhci-rhd/port.c

    r12b8e03 rfa0f53b  
    6868 * @return Error code. (Always EOK)
    6969 */
    70 static inline void uhci_port_write_status(uhci_port_t *port, port_status_t val)
    71 {
    72         assert(port);
    73         pio_write_16(port->address, val);
     70static inline void uhci_port_write_status(
     71    uhci_port_t *port, port_status_t value)
     72{
     73        assert(port);
     74        pio_write_16(port->address, value);
    7475}
    7576/*----------------------------------------------------------------------------*/
     
    100101        port->rh = rh;
    101102
    102         int ret =
    103             usb_hc_connection_initialize_from_device(&port->hc_connection, rh);
    104         if (ret != EOK) {
     103        int rc = usb_hc_connection_initialize_from_device(
     104            &port->hc_connection, rh);
     105        if (rc != EOK) {
    105106                usb_log_error("Failed to initialize connection to HC.");
    106                 return ret;
     107                return rc;
    107108        }
    108109
     
    237238        /* Enable the port. */
    238239        uhci_port_set_enabled(port, true);
     240
    239241        return EOK;
    240242}
     
    269271        usb_log_info("New device at port %u, address %d (handle %llu).\n",
    270272            port->number, dev_addr, port->attached_device);
     273
    271274        return EOK;
    272275}
     
    310313        /* Write new value. */
    311314        uhci_port_write_status(port, port_status);
    312 
    313         /* Wait for port to become enabled */
    314         do {
    315                 async_usleep(1000);
    316                 port_status = uhci_port_read_status(port);
    317         } while ((port_status & STATUS_CONNECTED) &&
    318             !(port_status & STATUS_ENABLED));
    319315
    320316        usb_log_debug("%s: %sabled port.\n",
  • uspace/drv/uhci-rhd/port.h

    r12b8e03 rfa0f53b  
    5454#define STATUS_SUSPEND   (1 << 12)
    5555
    56 /** UHCI port structure */
    5756typedef struct uhci_port
    5857{
  • uspace/drv/uhci-rhd/root_hub.c

    r12b8e03 rfa0f53b  
    3333 */
    3434#include <errno.h>
    35 #include <str_error.h>
    3635#include <ddi.h>
    3736#include <usb/debug.h>
     
    4443 * @param[in] addr Address of I/O registers.
    4544 * @param[in] size Size of available I/O space.
    46  * @param[in] rh Pointer to DDF instance of the root hub driver.
     45 * @param[in] rh Pointer to ddf instance of the root hub driver.
    4746 * @return Error code.
    4847 */
     
    5958        if (ret < 0) {
    6059                usb_log_error(
    61                     "Failed(%d) to gain access to port registers at %p: %s.\n",
    62                     ret, regs, str_error(ret));
     60                    "Failed(%d) to gain access to port registers at %p\n",
     61                    ret, regs);
    6362                return ret;
    6463        }
     
    6766        unsigned i = 0;
    6867        for (; i < UHCI_ROOT_HUB_PORT_COUNT; ++i) {
     68                /* NOTE: mind pointer arithmetics here */
    6969                ret = uhci_port_init(
    70                     &instance->ports[i], &regs[i], i, ROOT_HUB_WAIT_USEC, rh);
     70                    &instance->ports[i], regs + i, i, ROOT_HUB_WAIT_USEC, rh);
    7171                if (ret != EOK) {
    7272                        unsigned j = 0;
  • uspace/drv/uhci-rhd/root_hub.h

    r12b8e03 rfa0f53b  
    4242#define ROOT_HUB_WAIT_USEC 250000 /* 250 miliseconds */
    4343
    44 /** UHCI root hub drvier structure */
    4544typedef struct root_hub {
    46         /** Ports provided by the hub */
    4745        uhci_port_t ports[UHCI_ROOT_HUB_PORT_COUNT];
     46        devman_handle_t hc_handle;
    4847} uhci_root_hub_t;
    4948
    5049int uhci_root_hub_init(
    51     uhci_root_hub_t *instance, void *addr, size_t size, ddf_dev_t *rh);
     50  uhci_root_hub_t *instance, void *addr, size_t size, ddf_dev_t *rh);
    5251
    5352void uhci_root_hub_fini(uhci_root_hub_t *instance);
Note: See TracChangeset for help on using the changeset viewer.