From patchwork Sun Oct 1 13:19:41 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bin Meng X-Patchwork-Id: 820272 X-Patchwork-Delegate: marek.vasut@gmail.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="KL0R8h/H"; dkim-atps=neutral Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 3y4m8F5cT5z9t2x for ; Mon, 2 Oct 2017 00:18:37 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id 82738C21EBB; Sun, 1 Oct 2017 13:16:41 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=FREEMAIL_FROM, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, T_DKIM_INVALID autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id 4F931C21EF2; Sun, 1 Oct 2017 13:15:46 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 78896C21EF3; Sun, 1 Oct 2017 13:15:32 +0000 (UTC) Received: from mail-it0-f67.google.com (mail-it0-f67.google.com [209.85.214.67]) by lists.denx.de (Postfix) with ESMTPS id C63D4C21E54 for ; Sun, 1 Oct 2017 13:15:28 +0000 (UTC) Received: by mail-it0-f67.google.com with SMTP id c195so4502037itb.4 for ; Sun, 01 Oct 2017 06:15:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id:in-reply-to:references; bh=Qd9R5lhWmyO8jkSyW9j8Jzt9NjVVhq2llKhr/lT2Fv8=; b=KL0R8h/H465DloKi2JLHDjrOTzHg2FFMc5EvYXNCc1JRL50tNCkMehvWmp0HM/CJIR DMKjhxWFeWP//xrqTOVzAYOoRmfEUM960ge3K5U6+IsPiswhRGISjgJfYwvuHiwMO3Vx 7GOgQwHbP85lythD8L42TzoNvHdhhGXh3AZ267TCTV9lQUDZW4hbCN2XYXUsKkE4j1t4 Zn9471rovquzGRK+AuwcEC+yBDH9rFrEW1ktL+vGPnsYWEK1BqA3+BV9w0eTXKDjGXn4 jQV90pGWueAgyVUCFSTtPuqBMaUHTf737xllLT4hMu1MBeC2S7ry2nhNOmf6x6GMdxyP roBg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=Qd9R5lhWmyO8jkSyW9j8Jzt9NjVVhq2llKhr/lT2Fv8=; b=bSILcoHUuJHKqwdUtlSVCva6mGvPnRHawFkgDTPhjUO87y9h8mEkAaF1FeX6hhBMKw yd6VTwKanRQ4ZWWO8HUnfqm0wPII4vk0VYOhErJkeTPVLFStxaIKAuX4fJ4KfBmN8RsP 8skTXNgHhtgh94AZY+9KuGbGUOOZfubu6Ke+CWvo+YPP2+UYtNh4uEfCiNtmqnBywuD6 29Kh1wXknfJcF5IbPgAptXCgrUJUA1caFL1JAMt/w3hcMxsTDAZ1WjQL1NsRJSP2pTWn aN1Yzih34T9gHdm0YmGxnNDD4s/l5aR/ZRcxBf1HR5KIPH8/8b4UaZzj2hMtbbrIvB4M 5AIQ== X-Gm-Message-State: AMCzsaWUKICEURIVi+AkV34nxVSA0sKeUc19kysmiwZ6SnhqXBKYVKIt aVmUI6XFBtj6HNANSYumIm23qg== X-Google-Smtp-Source: AOwi7QD0W+LrUrpbXugUJSn1dxNmfr92JAtyLzwJr4rKc5ccbwbrMhNEUF+9gSgWz7M5EkNejJJJQw== X-Received: by 10.36.105.21 with SMTP id e21mr14459491itc.24.1506863727762; Sun, 01 Oct 2017 06:15:27 -0700 (PDT) Received: from ala-d2121-lx1.wrs.com (unknown-156-139.windriver.com. [147.11.156.139]) by smtp.gmail.com with ESMTPSA id r85sm3643553ioi.8.2017.10.01.06.15.26 (version=TLS1_1 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sun, 01 Oct 2017 06:15:26 -0700 (PDT) From: Bin Meng To: Marek Vasut , U-Boot Mailing List Date: Sun, 1 Oct 2017 06:19:41 -0700 Message-Id: <1506863985-30907-6-git-send-email-bmeng.cn@gmail.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1506863985-30907-1-git-send-email-bmeng.cn@gmail.com> References: <1506863985-30907-1-git-send-email-bmeng.cn@gmail.com> Subject: [U-Boot] [PATCH 06/10] usb: emul: hub: Report the actual device speed of the emulation device X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" At present the usb hub emulator always reports its downstream port speed as full speed. Actually it is high speed for sandbox-flash, and low speed for sandbox-keyb. We can determine the device speed by checking its device descriptor bcdUSB field, and do the proper hub port status report based on that. Signed-off-by: Bin Meng --- drivers/usb/emul/sandbox_hub.c | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/drivers/usb/emul/sandbox_hub.c b/drivers/usb/emul/sandbox_hub.c index 8ed7a0f..9a0f47b 100644 --- a/drivers/usb/emul/sandbox_hub.c +++ b/drivers/usb/emul/sandbox_hub.c @@ -121,9 +121,12 @@ struct sandbox_hub_priv { int change[SANDBOX_NUM_PORTS]; }; -static struct udevice *hub_find_device(struct udevice *hub, int port) +static struct udevice *hub_find_device(struct udevice *hub, int port, + enum usb_device_speed *speed) { struct udevice *dev; + struct usb_generic_descriptor **gen_desc; + struct usb_device_descriptor **dev_desc; for (device_find_first_child(hub, &dev); dev; @@ -131,8 +134,27 @@ static struct udevice *hub_find_device(struct udevice *hub, int port) struct sandbox_hub_platdata *plat; plat = dev_get_parent_platdata(dev); - if (plat->port == port) + if (plat->port == port) { + gen_desc = plat->plat.desc_list; + gen_desc = usb_emul_find_descriptor(gen_desc, + USB_DT_DEVICE, 0); + dev_desc = (struct usb_device_descriptor **)gen_desc; + + switch (le16_to_cpu((*dev_desc)->bcdUSB)) { + case 0x0100: + *speed = USB_SPEED_LOW; + break; + case 0x0101: + *speed = USB_SPEED_FULL; + break; + case 0x0200: + default: + *speed = USB_SPEED_HIGH; + break; + } + return dev; + } } return NULL; @@ -146,7 +168,8 @@ static int clrset_post_state(struct udevice *hub, int port, int clear, int set) int ret = 0; if ((clear | set) & USB_PORT_STAT_POWER) { - struct udevice *dev = hub_find_device(hub, port); + enum usb_device_speed speed; + struct udevice *dev = hub_find_device(hub, port, &speed); if (dev) { if (set & USB_PORT_STAT_POWER) { @@ -156,6 +179,10 @@ static int clrset_post_state(struct udevice *hub, int port, int clear, int set) if (!ret) { set |= USB_PORT_STAT_CONNECTION | USB_PORT_STAT_ENABLE; + if (speed == USB_SPEED_LOW) + set |= USB_PORT_STAT_LOW_SPEED; + else if (speed == USB_SPEED_HIGH) + set |= USB_PORT_STAT_HIGH_SPEED; } } else if (clear & USB_PORT_STAT_POWER) {