Changeset 138a7fd in mainline for uspace/drv/vhc/hubops.c


Ignore:
Timestamp:
2010-12-12T17:05:55Z (13 years ago)
Author:
Vojtech Horky <vojtechhorky@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
a39f4cf, ecf52c4b
Parents:
c9113d2
Message:

Fixes & improvements in virtual hub

The changes includes:

  • unified (a bit) debugging output
  • port is put into power-off state after SET_CONFIGURATION request
  • less ports on the hub
  • delayed port changes run in separate fibril
  • shorter waiting for transactions in HC scheduling manager
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/vhc/hubops.c

    rc9113d2 r138a7fd  
    5959static int on_get_descriptor(struct usbvirt_device *dev,
    6060    usb_device_request_setup_packet_t *request, uint8_t *data);
     61static int on_set_configuration(struct usbvirt_device *dev,
     62    usb_device_request_setup_packet_t *request, uint8_t *data);
    6163static int on_class_request(struct usbvirt_device *dev,
    6264    usb_device_request_setup_packet_t *request, uint8_t *data);
     
    6466    usb_endpoint_t endpoint,
    6567    void *buffer, size_t size, size_t *actual_size);
     68static void set_port_state(hub_port_t *, hub_port_state_t);
    6669
    6770/** Standard USB requests. */
     
    7477        .on_set_descriptor = NULL,
    7578        .on_get_configuration = NULL,
    76         .on_set_configuration = NULL,
     79        .on_set_configuration = on_set_configuration,
    7780        .on_get_interface = NULL,
    7881        .on_set_interface = NULL,
     
    102105}
    103106
     107/** Callback for SET_CONFIGURATION request. */
     108int on_set_configuration(struct usbvirt_device *dev,
     109    usb_device_request_setup_packet_t *request, uint8_t *data)
     110{
     111        /* We must suspend power source to all ports. */
     112        size_t i;
     113        for (i = 0; i < HUB_PORT_COUNT; i++) {
     114                hub_port_t *port = &hub_dev.ports[i];
     115               
     116                set_port_state(port, HUB_PORT_STATE_POWERED_OFF);
     117        }
     118       
     119        /* Let the framework handle the rest of the job. */
     120        return EFORWARD;
     121}
     122
     123struct delay_port_state_change {
     124        suseconds_t delay;
     125        hub_port_state_t old_state;
     126        hub_port_state_t new_state;
     127        hub_port_t *port;
     128};
     129
     130static int set_port_state_delayed_fibril(void *arg)
     131{
     132        struct delay_port_state_change *change
     133            = (struct delay_port_state_change *) arg;
     134       
     135        async_usleep(change->delay);
     136       
     137        if (change->port->state == change->old_state) {
     138                set_port_state(change->port, change->new_state);
     139        }
     140       
     141        free(change);
     142       
     143        return EOK;
     144}
     145
     146static void set_port_state_delayed(hub_port_t *port,
     147    suseconds_t delay_time,
     148    hub_port_state_t old_state, hub_port_state_t new_state)
     149{
     150        struct delay_port_state_change *change
     151            = malloc(sizeof(struct delay_port_state_change));
     152        change->port = port;
     153        change->delay = delay_time;
     154        change->old_state = old_state;
     155        change->new_state = new_state;
     156        fid_t fibril = fibril_create(set_port_state_delayed_fibril, change);
     157        if (fibril == 0) {
     158                printf("Failed to create fibril\n");
     159                return;
     160        }
     161        fibril_add_ready(fibril);
     162}
     163
    104164/** Change port status and updates status change status fields.
    105165 */
    106 static void set_port_state(hub_port_t *port, hub_port_state_t state)
    107 {
    108         port->state = state;
     166void set_port_state(hub_port_t *port, hub_port_state_t state)
     167{
     168        dprintf(1, "setting port %d state to %d (%c)", port->index,
     169            state, hub_port_state_as_char(state));
     170       
    109171        if (state == HUB_PORT_STATE_POWERED_OFF) {
    110172                clear_port_status_change(port, HUB_STATUS_C_PORT_CONNECTION);
     
    113175        }
    114176        if (state == HUB_PORT_STATE_RESUMING) {
    115                 async_usleep(10*1000);
    116                 if (port->state == state) {
    117                         set_port_state(port, HUB_PORT_STATE_ENABLED);
    118                 }
     177                set_port_state_delayed(port, 10*1000,
     178                    HUB_PORT_STATE_RESUMING, HUB_PORT_STATE_ENABLED);
    119179        }
    120180        if (state == HUB_PORT_STATE_RESETTING) {
    121                 async_usleep(10*1000);
    122                 if (port->state == state) {
    123                         set_port_status_change(port, HUB_STATUS_C_PORT_RESET);
    124                         set_port_state(port, HUB_PORT_STATE_ENABLED);
    125                 }
    126         }
     181                set_port_state_delayed(port, 10*1000,
     182                    HUB_PORT_STATE_RESETTING, HUB_PORT_STATE_ENABLED);
     183        }
     184        if ((port->state == HUB_PORT_STATE_RESETTING)
     185            && (state == HUB_PORT_STATE_ENABLED)) {
     186                set_port_status_change(port, HUB_STATUS_C_PORT_RESET);
     187        }
     188       
     189        port->state = state;
    127190}
    128191
     
    249312        status |= (port->status_change << 16);
    250313       
     314        dprintf(2, "GetPortStatus(port=%d, status=%u)\n", (int)portindex,
     315            (unsigned int) status);
    251316        return virthub_dev.control_transfer_reply(&virthub_dev, 0, &status, 4);
    252317}
     
    291356    usb_device_request_setup_packet_t *request, uint8_t *data)
    292357{       
    293         dprintf(2, "hub class request (%d)\n", (int) request->request);
     358        dprintf(2, "hub class request (%d)", (int) request->request);
    294359       
    295360        uint8_t recipient = request->request_type & 31;
     
    340405                       
    341406                default:
     407                        dprintf(0, "WARN: unknown request (%d)!\n",
     408                            request->request);
    342409                        break;
    343410        }
Note: See TracChangeset for help on using the changeset viewer.