From owner-freebsd-usb@FreeBSD.ORG Thu May 5 01:39:24 2011 Return-Path: Delivered-To: freebsd-usb@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id E5F6B106564A for ; Thu, 5 May 2011 01:39:24 +0000 (UTC) (envelope-from trevor.l.blackwell@gmail.com) Received: from mail-yx0-f182.google.com (mail-yx0-f182.google.com [209.85.213.182]) by mx1.freebsd.org (Postfix) with ESMTP id 9E39A8FC17 for ; Thu, 5 May 2011 01:39:24 +0000 (UTC) Received: by yxl31 with SMTP id 31so782962yxl.13 for ; Wed, 04 May 2011 18:39:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:sender:date:x-google-sender-auth :message-id:subject:from:to:content-type; bh=E8yLTl6EvSG44qntXGoNNR8KTpcJN0DzRy1+WZahUSc=; b=tSpyG8/mlyDW6jTaSeWVE4+OPjd197EI7Gqf5Rd8MlX9GihIj4REAVFtMucG0T9p74 sxf60xENlTY1qdW4MRPvlGrA1D0x8UX3YDXk70QeN5gi6pjO+CBIB8CazdSGKdn5C06v NLbNOizKPilUCO8rYFvDvJ4XRzdnFwvRKERk8= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:sender:date:x-google-sender-auth:message-id:subject :from:to:content-type; b=LFvacp06q4vote3sGUc0Ph4xw0AEO2p+vL++uehVVjYogIJqAsi1wDUtGHd/meG3et 2XIW/3VO3aa0ahVHlWrKLL9GGeQY5btPJBisInbglxXh65XuSgRZ1XM2dt+xiIcO9X3Y ROKGEDWmUUXpP8yBvYyDUVw39tCbgM7+9BSfo= MIME-Version: 1.0 Received: by 10.236.186.106 with SMTP id v70mr2246310yhm.207.1304558174929; Wed, 04 May 2011 18:16:14 -0700 (PDT) Sender: trevor.l.blackwell@gmail.com Received: by 10.236.103.2 with HTTP; Wed, 4 May 2011 18:16:14 -0700 (PDT) Date: Wed, 4 May 2011 18:16:14 -0700 X-Google-Sender-Auth: pJfT5sTbGtC48wj-CONyU_VcNR8 Message-ID: From: Trevor Blackwell To: freebsd-usb@freebsd.org Content-Type: text/plain; charset=ISO-8859-1 X-Content-Filtered-By: Mailman/MimeDel 2.1.5 Subject: Clearing stalls: usbd_xfer_set_stall vs usbd_do_clear_stall_callback X-BeenThere: freebsd-usb@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: FreeBSD support for USB List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 05 May 2011 01:39:25 -0000 We have a system that experiences occasional stalls due to ESD strikes in the cable between the host & hub. So I've been extensively testing the clear stall logic. It's done two different ways in the standard drivers. In if_cdce it's: if (error != USB_ERR_CANCELLED) { usbd_xfer_set_stall(xfer); usbd_transfer_submit(xfer); } In the midi part of uaudio it's done by setting up special control transfers and keeping state in the driver: if (error != USB_ERR_CANCELLED) { /* try to clear stall first */ chan->flags |= UMIDI_FLAG_READ_STALL; usbd_transfer_start(chan->xfer[3]); } ... static void umidi_read_clear_stall_callback(struct usb_xfer *xfer, usb_error_t error) { struct umidi_chan *chan = usbd_xfer_softc(xfer); struct usb_xfer *xfer_other = chan->xfer[1]; if (usbd_clear_stall_callback(xfer, xfer_other)) { DPRINTF("stall cleared\n"); chan->flags &= ~UMIDI_FLAG_READ_STALL; usbd_transfer_start(xfer_other); } } The first sure is simpler, but it doesn't seem to work. Stalls never get cleared. Tracing through the code, it's not clear how the clear stall request is supposed to get filled in. I can see that usb_xfer_set_stall ultimately leads to a call to usbd_clear_stall_proc, but I can't find where udev->ctrl_xfer[1] gets set up with the right endpoint values. -- Trevor Blackwell trevor@anybots.com 650 776 7870