Changeset 206f71a in mainline


Ignore:
Timestamp:
2011-03-14T10:47:42Z (13 years ago)
Author:
Vojtech Horky <vojtechhorky@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
c2343cc, c69209d
Parents:
6dd35e0
Message:

Getting max_packet_size for default control pipe

Location:
uspace
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/usbinfo/info.c

    r6dd35e0 r206f71a  
    6565                goto leave;
    6666        }
     67        rc = usb_endpoint_pipe_probe_default_control(&ctrl_pipe);
     68        if (rc != EOK) {
     69                fprintf(stderr,
     70                    NAME ": probing default control pipe failed: %s.\n",
     71                    str_error(rc));
     72                goto leave;
     73        }
    6774        rc = usb_endpoint_pipe_start_session(&ctrl_pipe);
    6875        if (rc != EOK) {
  • uspace/drv/usbhid/hiddev.c

    r6dd35e0 r206f71a  
    391391                return rc;
    392392        }
     393        rc = usb_endpoint_pipe_probe_default_control(&hid_dev->ctrl_pipe);
     394        if (rc != EOK) {
     395                usb_log_error("Probing default control pipe failed: %s.\n",
     396                    str_error(rc));
     397                return rc;
     398        }
    393399
    394400        /*
  • uspace/drv/usbhub/usbhub.c

    r6dd35e0 r206f71a  
    118118                dprintf(USB_LOG_LEVEL_ERROR,
    119119                                "could not initialize connection to device endpoint, errno %d",opResult);
    120         }
    121         return opResult;
     120                return opResult;
     121        }
     122
     123        opResult = usb_endpoint_pipe_probe_default_control(&hub->endpoints.control);
     124        if (opResult != EOK) {
     125                dprintf(USB_LOG_LEVEL_ERROR, "failed probing endpoint 0, %d", opResult);
     126                return opResult;
     127        }
     128
     129        return EOK;
    122130}
    123131
     
    430438                        &new_device_pipe,
    431439                        &new_device_connection);
     440        usb_endpoint_pipe_probe_default_control(&new_device_pipe);
    432441        /// \TODO get highspeed info
    433442        usb_speed_t speed = isLowSpeed?USB_SPEED_LOW:USB_SPEED_FULL;
  • uspace/drv/usbmid/usbmid.c

    r6dd35e0 r206f71a  
    116116                return NULL;
    117117        }
     118        rc = usb_endpoint_pipe_probe_default_control(&mid->ctrl_pipe);
     119        if (rc != EOK) {
     120                usb_log_error("Probing default control pipe failed: %s.\n",
     121                    str_error(rc));
     122                free(mid);
     123                return NULL;
     124        }
    118125
    119126        mid->dev = dev;
  • uspace/lib/usb/include/usb/pipes.h

    r6dd35e0 r206f71a  
    129129int usb_endpoint_pipe_initialize_default_control(usb_endpoint_pipe_t *,
    130130    usb_device_connection_t *);
     131int usb_endpoint_pipe_probe_default_control(usb_endpoint_pipe_t *);
    131132int usb_endpoint_pipe_initialize_from_configuration(usb_endpoint_mapping_t *,
    132133    size_t, uint8_t *, size_t, usb_device_connection_t *);
  • uspace/lib/usb/src/devdrv.c

    r6dd35e0 r206f71a  
    228228        }
    229229
     230        rc = usb_endpoint_pipe_probe_default_control(&dev->ctrl_pipe);
     231        if (rc != EOK) {
     232                usb_log_error(
     233                    "Probing default control pipe on device `%s' failed: %s.\n",
     234                    dev->ddf_dev->name, str_error(rc));
     235                return rc;
     236        }
     237
    230238        /*
    231239         * Initialization of other pipes requires open session on
  • uspace/lib/usb/src/hub.c

    r6dd35e0 r206f71a  
    235235                goto leave_release_default_address;
    236236        }
     237        rc = usb_endpoint_pipe_probe_default_control(&ctrl_pipe);
     238        if (rc != EOK) {
     239                rc = ENOTCONN;
     240                goto leave_release_default_address;
     241        }
    237242
    238243        rc = usb_endpoint_pipe_start_session(&ctrl_pipe);
  • uspace/lib/usb/src/pipesinit.c

    r6dd35e0 r206f71a  
    4141#include <errno.h>
    4242#include <assert.h>
     43
     44#define CTRL_PIPE_MIN_PACKET_SIZE 8
     45#define DEV_DESCR_MAX_PACKET_SIZE_OFFSET 7
    4346
    4447
     
    371374
    372375        int rc = usb_endpoint_pipe_initialize(pipe, connection,
    373             0, USB_TRANSFER_CONTROL, 8, USB_DIRECTION_BOTH);
     376            0, USB_TRANSFER_CONTROL, CTRL_PIPE_MIN_PACKET_SIZE,
     377            USB_DIRECTION_BOTH);
     378
     379        return rc;
     380}
     381
     382/** Probe default control pipe for max packet size.
     383 *
     384 * The function tries to get the correct value of max packet size several
     385 * time before giving up.
     386 *
     387 * The session on the pipe shall not be started.
     388 *
     389 * @param pipe Default control pipe.
     390 * @return Error code.
     391 */
     392int usb_endpoint_pipe_probe_default_control(usb_endpoint_pipe_t *pipe)
     393{
     394        assert(pipe);
     395        assert(DEV_DESCR_MAX_PACKET_SIZE_OFFSET < CTRL_PIPE_MIN_PACKET_SIZE);
     396
     397        if ((pipe->direction != USB_DIRECTION_BOTH) ||
     398            (pipe->transfer_type != USB_TRANSFER_CONTROL) ||
     399            (pipe->endpoint_no != 0)) {
     400                return EINVAL;
     401        }
     402
     403#define TRY_LOOP(attempt_var) \
     404        for (attempt_var = 0; attempt_var < 3; attempt_var++)
     405
     406        size_t failed_attempts;
     407        int rc;
     408
     409        TRY_LOOP(failed_attempts) {
     410                rc = usb_endpoint_pipe_start_session(pipe);
     411                if (rc == EOK) {
     412                        break;
     413                }
     414        }
    374415        if (rc != EOK) {
    375416                return rc;
    376417        }
    377         rc = usb_endpoint_pipe_start_session(pipe);
     418
     419
     420        uint8_t dev_descr_start[CTRL_PIPE_MIN_PACKET_SIZE];
     421        size_t transferred_size;
     422        TRY_LOOP(failed_attempts) {
     423                rc = usb_request_get_descriptor(pipe, USB_REQUEST_TYPE_STANDARD,
     424                    USB_REQUEST_RECIPIENT_DEVICE, USB_DESCTYPE_DEVICE,
     425                    0, 0, dev_descr_start, CTRL_PIPE_MIN_PACKET_SIZE,
     426                    &transferred_size);
     427                if (rc == EOK) {
     428                        if (transferred_size != CTRL_PIPE_MIN_PACKET_SIZE) {
     429                                rc = ELIMIT;
     430                                continue;
     431                        }
     432                        break;
     433                }
     434        }
     435        usb_endpoint_pipe_end_session(pipe);
    378436        if (rc != EOK) {
    379437                return rc;
    380438        }
    381439
    382         uint8_t first[8];
    383         size_t size = 0;
    384         rc = usb_control_request_get(pipe, USB_REQUEST_TYPE_STANDARD,
    385             USB_REQUEST_RECIPIENT_DEVICE, USB_DEVREQ_GET_DESCRIPTOR, 1 << 8,
    386                         0, first, 8, &size);
    387         usb_endpoint_pipe_end_session(pipe);
    388         if (rc != EOK || size  != 8) {
    389                 return rc;
    390         }
    391 
    392         pipe->max_packet_size = first[7];
    393         return rc;
     440        pipe->max_packet_size
     441            = dev_descr_start[DEV_DESCR_MAX_PACKET_SIZE_OFFSET];
     442
     443        return EOK;
    394444}
    395445
  • uspace/lib/usb/src/recognise.c

    r6dd35e0 r206f71a  
    369369                goto failure;
    370370        }
     371        rc = usb_endpoint_pipe_probe_default_control(&ctrl_pipe);
     372        if (rc != EOK) {
     373                goto failure;
     374        }
    371375
    372376        /*
Note: See TracChangeset for help on using the changeset viewer.