Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/usb/src/pipesio.c

    r77223f8 r2c2cbcf  
    4949#include <assert.h>
    5050#include <usbhc_iface.h>
     51#include <usb/request.h>
    5152#include "pipepriv.h"
    5253
     
    172173
    173174        int rc;
    174         rc = pipe_add_ref(pipe);
     175        rc = pipe_add_ref(pipe, false);
    175176        if (rc != EOK) {
    176177                return rc;
     
    295296        int rc;
    296297
    297         rc = pipe_add_ref(pipe);
     298        rc = pipe_add_ref(pipe, false);
    298299        if (rc != EOK) {
    299300                return rc;
     
    305306
    306307        return rc;
     308}
     309
     310/** Try to clear endpoint halt of default control pipe.
     311 *
     312 * @param pipe Pipe for control endpoint zero.
     313 */
     314static void clear_self_endpoint_halt(usb_pipe_t *pipe)
     315{
     316        assert(pipe != NULL);
     317
     318        if (!pipe->auto_reset_halt || (pipe->endpoint_no != 0)) {
     319                return;
     320        }
     321
     322
     323        /* Prevent indefinite recursion. */
     324        pipe->auto_reset_halt = false;
     325        usb_request_clear_endpoint_halt(pipe, 0);
     326        pipe->auto_reset_halt = true;
    307327}
    308328
     
    427447        int rc;
    428448
    429         rc = pipe_add_ref(pipe);
     449        rc = pipe_add_ref(pipe, false);
    430450        if (rc != EOK) {
    431451                return rc;
     
    436456            setup_buffer, setup_buffer_size,
    437457            data_buffer, data_buffer_size, &act_size);
     458
     459        if (rc == ESTALL) {
     460                clear_self_endpoint_halt(pipe);
     461        }
    438462
    439463        pipe_drop_ref(pipe);
     
    555579        int rc;
    556580
    557         rc = pipe_add_ref(pipe);
     581        rc = pipe_add_ref(pipe, false);
    558582        if (rc != EOK) {
    559583                return rc;
     
    563587            setup_buffer, setup_buffer_size, data_buffer, data_buffer_size);
    564588
     589        if (rc == ESTALL) {
     590                clear_self_endpoint_halt(pipe);
     591        }
     592
    565593        pipe_drop_ref(pipe);
    566594
Note: See TracChangeset for help on using the changeset viewer.