Received: by 2002:ad5:474a:0:0:0:0:0 with SMTP id i10csp6985346imu; Wed, 14 Nov 2018 09:51:54 -0800 (PST) X-Google-Smtp-Source: AJdET5d9aLr1FkldJ4MBTHmtkkTxe5XBzk7LnxvOlRZb/so4gWl5Z22DfEYwvbn5KV7tg8mP+JBg X-Received: by 2002:a17:902:8214:: with SMTP id x20-v6mr2777149pln.224.1542217914621; Wed, 14 Nov 2018 09:51:54 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1542217914; cv=none; d=google.com; s=arc-20160816; b=LkPeoPsRGSSbsqdReaGLHH8CeOlCQokxmZjG5+W0OHnvWSfqx/YxiP/yXzrNs6Vt6V ZAewXbZhNFzMHIUQGcteUS94bq/OSyiiXjpMaiEDe3rWpdKI1Pv+zDmf8fBAZY1jhI9B 0884hW/tFdPyIzLGaL7pp+WrNL9EW7uwNVCFYIYwhlSUBrDzJAC7xm7H31gM3yPaOn1n D+OE04pY/JqIq9sjoqvbYd9fvV0hjFauyYOBlxdW5GP5zbcVXSqrUAqb/f3m8tQGGKSy XdwMCQFV4ubPxOsY7Q5URYDWkWhtTiJa3DzNNff67NqkTvqQWXnQbpyaGAJKSIvWLxPj 69Pg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from; bh=tQoDgFc3D1ypF4MYQZxlBX5DMPqCbWr9v6abe1UvLJU=; b=tOyvubb911DiRcko3RUxvlf5z31FWKHanKU+AWFFGS4wrb8iTaR2J3707TUYBbmEUl ytSZsfEqlvuD0LGcHeZpg0OL3d37mfYxykxDYAdaJ22LsslXJYrNxqBDcOMjy7GMPPJf ZZ9JIfS3R/ONuCiYEeo2IlHZChtSlZQ7xY7rYzdEub7O8MjpGT+Y/a0PFOpFHJQEcRrF IBr7MOMzdViG6AnvhIJmvv0+ecXt5/Qg9eo6UGYAdMDbw9btXUTgxYp2UXAyRUFXzXtV WQ2N/fCZ9XihfQogs3WH6cJsMqzkSOnH/uSnBC3Ang9pNmb0zu+OBrTutS12GuVa6Yfx 9uTQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id p75-v6si1893694pfi.12.2018.11.14.09.51.35; Wed, 14 Nov 2018 09:51:54 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1733211AbeKODye (ORCPT + 99 others); Wed, 14 Nov 2018 22:54:34 -0500 Received: from cpc82359-stkp12-2-0-cust135.10-2.cable.virginm.net ([86.17.48.136]:36656 "EHLO freya" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1727576AbeKODye (ORCPT ); Wed, 14 Nov 2018 22:54:34 -0500 X-Greylist: delayed 2222 seconds by postgrey-1.27 at vger.kernel.org; Wed, 14 Nov 2018 22:54:33 EST Received: from ben by freya with local (Exim 4.91) (envelope-from ) id 1gMyj8-0007B5-88; Wed, 14 Nov 2018 17:13:18 +0000 From: Ben Dooks To: stern@rowland.harvard.edu, gregkh@linuxfoundation.org, linux-usb@vger.kernel.org Cc: linux-kernel@lists.codethink.co.uk, linux-kernel@vger.kernel.org, Ben Dooks Subject: [PATCH] USB: host: ehci: allow tine of highspeed nak-count Date: Wed, 14 Nov 2018 17:13:15 +0000 Message-Id: <20181114171315.27549-1-ben-linux@fluff.org> X-Mailer: git-send-email 2.19.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Ben Dooks At least some systems benefit with less scheduling if the NAK count value is set higher than the default 4. For instance a Tegra3 with an SMSC9512 showed less interrupt load when this was changed to 14. To allow the changing of this value, add a sysfs node to each of the controllers to allow run-time changing. Signed-off-by: Ben Dooks --- drivers/usb/host/ehci-hcd.c | 1 + drivers/usb/host/ehci-q.c | 4 +-- drivers/usb/host/ehci-sysfs.c | 52 +++++++++++++++++++++++++++++++++-- drivers/usb/host/ehci.h | 1 + 4 files changed, 54 insertions(+), 4 deletions(-) diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index 8608ac513fb7..799262951f41 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c @@ -526,6 +526,7 @@ static int ehci_init(struct usb_hcd *hcd) hw->hw_qtd_next = EHCI_LIST_END(ehci); ehci->async->qh_state = QH_STATE_LINKED; hw->hw_alt_next = QTD_NEXT(ehci, ehci->async->dummy->qtd_dma); + ehci->nak_tune_hs = EHCI_TUNE_RL_HS; /* clear interrupt enables, set irq latency */ if (log2_irq_thresh < 0 || log2_irq_thresh > 6) diff --git a/drivers/usb/host/ehci-q.c b/drivers/usb/host/ehci-q.c index 327630405695..ccb754893b5a 100644 --- a/drivers/usb/host/ehci-q.c +++ b/drivers/usb/host/ehci-q.c @@ -898,12 +898,12 @@ qh_make ( case USB_SPEED_HIGH: /* no TT involved */ info1 |= QH_HIGH_SPEED; if (type == PIPE_CONTROL) { - info1 |= (EHCI_TUNE_RL_HS << 28); + info1 |= ehci->nak_tune_hs << 28; info1 |= 64 << 16; /* usb2 fixed maxpacket */ info1 |= QH_TOGGLE_CTL; /* toggle from qtd */ info2 |= (EHCI_TUNE_MULT_HS << 30); } else if (type == PIPE_BULK) { - info1 |= (EHCI_TUNE_RL_HS << 28); + info1 |= ehci->nak_tune_hs << 28; /* The USB spec says that high speed bulk endpoints * always use 512 byte maxpacket. But some device * vendors decided to ignore that, and MSFT is happy diff --git a/drivers/usb/host/ehci-sysfs.c b/drivers/usb/host/ehci-sysfs.c index 8f75cb7b197c..d710d35282a6 100644 --- a/drivers/usb/host/ehci-sysfs.c +++ b/drivers/usb/host/ehci-sysfs.c @@ -145,19 +145,66 @@ static ssize_t uframe_periodic_max_store(struct device *dev, } static DEVICE_ATTR_RW(uframe_periodic_max); +static ssize_t nak_tune_hs_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct ehci_hcd *ehci; + + ehci = hcd_to_ehci(dev_get_drvdata(dev)); + return scnprintf(buf, PAGE_SIZE, "%d\n", ehci->nak_tune_hs); +} + +static ssize_t nak_tune_hs_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct ehci_hcd *ehci; + unsigned val; + unsigned long flags; + + ehci = hcd_to_ehci(dev_get_drvdata(dev)); + + if (kstrtouint(buf, 0, &val) < 0) + return -EINVAL; + + if (val >= 15) { + ehci_info(ehci, "invalid value for nak_tune_hs (%d)\n", val); + return -EINVAL; + } + + spin_lock_irqsave (&ehci->lock, flags); + ehci->nak_tune_hs = val; + spin_unlock_irqrestore (&ehci->lock, flags); + return count; +} + +static DEVICE_ATTR_RW(nak_tune_hs); static inline int create_sysfs_files(struct ehci_hcd *ehci) { struct device *controller = ehci_to_hcd(ehci)->self.controller; int i = 0; + i = device_create_file(controller, &dev_attr_nak_tune_hs); + if (i) + goto out; + + i = device_create_file(controller, &dev_attr_uframe_periodic_max); + if (i) + goto out_nak; + /* with integrated TT there is no companion! */ if (!ehci_is_TDI(ehci)) i = device_create_file(controller, &dev_attr_companion); if (i) - goto out; + goto out_all; - i = device_create_file(controller, &dev_attr_uframe_periodic_max); + return 0; +out_all: + device_remove_file(controller, &dev_attr_uframe_periodic_max); +out_nak: + device_remove_file(controller, &dev_attr_nak_tune_hs); out: return i; } @@ -170,5 +217,6 @@ static inline void remove_sysfs_files(struct ehci_hcd *ehci) if (!ehci_is_TDI(ehci)) device_remove_file(controller, &dev_attr_companion); + device_remove_file(controller, &dev_attr_nak_tune_hs); device_remove_file(controller, &dev_attr_uframe_periodic_max); } diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h index c8e9a48e1d51..1fb6f1ad8128 100644 --- a/drivers/usb/host/ehci.h +++ b/drivers/usb/host/ehci.h @@ -154,6 +154,7 @@ struct ehci_hcd { /* one per controller */ dma_addr_t periodic_dma; struct list_head intr_qh_list; unsigned i_thresh; /* uframes HC might cache */ + u32 nak_tune_hs; union ehci_shadow *pshadow; /* mirror hw periodic table */ struct list_head intr_unlink_wait; -- 2.19.1