diff mbox series

[v2,1/2] USB:ehci:Add a whitelist for EHCI controllers

Message ID 1617889760-17733-2-git-send-email-liulongfang@huawei.com (mailing list archive)
State Superseded
Headers show
Series USB:ehci:fix the no SRBN register problem | expand

Commit Message

liulongfang April 8, 2021, 1:49 p.m. UTC
Some types of EHCI controllers do not have SBRN registers.
By comparing the white list, the operation of reading the SBRN
registers is skipped.

Subsequent EHCI controller types without SBRN registers can be
directly added to the white list.

The current patch does not affect the drive function.

Signed-off-by: Longfang Liu <liulongfang@huawei.com>
---
 drivers/usb/host/ehci-pci.c | 28 ++++++++++++++++++++++++----
 1 file changed, 24 insertions(+), 4 deletions(-)

Comments

Greg Kroah-Hartman April 8, 2021, 2:53 p.m. UTC | #1
On Thu, Apr 08, 2021 at 09:49:19PM +0800, Longfang Liu wrote:
> Some types of EHCI controllers do not have SBRN registers.
> By comparing the white list, the operation of reading the SBRN
> registers is skipped.
> 
> Subsequent EHCI controller types without SBRN registers can be
> directly added to the white list.
> 
> The current patch does not affect the drive function.
> 
> Signed-off-by: Longfang Liu <liulongfang@huawei.com>
> ---
>  drivers/usb/host/ehci-pci.c | 28 ++++++++++++++++++++++++----
>  1 file changed, 24 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c
> index 3c3820a..534e906 100644
> --- a/drivers/usb/host/ehci-pci.c
> +++ b/drivers/usb/host/ehci-pci.c
> @@ -47,6 +47,29 @@ static inline bool is_bypassed_id(struct pci_dev *pdev)
>  	return !!pci_match_id(bypass_pci_id_table, pdev);
>  }
>  
> +static const struct usb_nosbrn_whitelist_entry {

Again, please do not use the term "whitelist", it is vague and you can
pick a better term for this.

How about:
	struct ehci_nosbrn;

thanks,

greg k-h
kernel test robot April 8, 2021, 5:30 p.m. UTC | #2
Hi Longfang,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on usb/usb-testing]
[also build test WARNING on v5.12-rc6 next-20210408]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Longfang-Liu/USB-ehci-fix-the-no-SRBN-register-problem/20210408-215249
base:   https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git usb-testing
config: x86_64-randconfig-s022-20210408 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-22) 9.3.0
reproduce:
        # apt-get install sparse
        # sparse version: v0.6.3-279-g6d5d9b42-dirty
        # https://github.com/0day-ci/linux/commit/01b93fbbf8fb6137c7779062232c0fe8c1592940
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Longfang-Liu/USB-ehci-fix-the-no-SRBN-register-problem/20210408-215249
        git checkout 01b93fbbf8fb6137c7779062232c0fe8c1592940
        # save the attached .config to linux build tree
        make W=1 C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' ARCH=x86_64 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>


sparse warnings: (new ones prefixed by >>)
>> drivers/usb/host/ehci-pci.c:57:10: sparse: sparse: incorrect type in initializer (different base types) @@     expected unsigned short [usertype] vendor @@     got void * @@
   drivers/usb/host/ehci-pci.c:57:10: sparse:     expected unsigned short [usertype] vendor
   drivers/usb/host/ehci-pci.c:57:10: sparse:     got void *
>> drivers/usb/host/ehci-pci.c:57:16: sparse: sparse: incorrect type in initializer (different base types) @@     expected unsigned short [usertype] device @@     got void * @@
   drivers/usb/host/ehci-pci.c:57:16: sparse:     expected unsigned short [usertype] device
   drivers/usb/host/ehci-pci.c:57:16: sparse:     got void *

vim +57 drivers/usb/host/ehci-pci.c

    49	
    50	static const struct usb_nosbrn_whitelist_entry {
    51		u16 vendor;
    52		u16 device;
    53	} usb_nosbrn_whitelist[] = {
    54		/* STMICRO ConneXT has no sbrn register */
    55		{PCI_VENDOR_ID_STMICRO, PCI_DEVICE_ID_STMICRO_USB_HOST},
    56		/* End of list */
  > 57		{NULL, NULL}
    58	};
    59	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
kernel test robot April 8, 2021, 8:34 p.m. UTC | #3
Hi Longfang,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on usb/usb-testing]
[also build test WARNING on v5.12-rc6 next-20210408]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Longfang-Liu/USB-ehci-fix-the-no-SRBN-register-problem/20210408-215249
base:   https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git usb-testing
config: riscv-randconfig-r025-20210408 (attached as .config)
compiler: clang version 13.0.0 (https://github.com/llvm/llvm-project 56ea2e2fdd691136d5e6631fa0e447173694b82c)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # install riscv cross compiling tool for clang build
        # apt-get install binutils-riscv64-linux-gnu
        # https://github.com/0day-ci/linux/commit/01b93fbbf8fb6137c7779062232c0fe8c1592940
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Longfang-Liu/USB-ehci-fix-the-no-SRBN-register-problem/20210408-215249
        git checkout 01b93fbbf8fb6137c7779062232c0fe8c1592940
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=riscv 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

>> drivers/usb/host/ehci-pci.c:57:3: warning: incompatible pointer to integer conversion initializing 'u16' (aka 'unsigned short') with an expression of type 'void *' [-Wint-conversion]
           {NULL, NULL}
            ^~~~
   include/linux/stddef.h:8:14: note: expanded from macro 'NULL'
   #define NULL ((void *)0)
                ^~~~~~~~~~~
   drivers/usb/host/ehci-pci.c:57:9: warning: incompatible pointer to integer conversion initializing 'u16' (aka 'unsigned short') with an expression of type 'void *' [-Wint-conversion]
           {NULL, NULL}
                  ^~~~
   include/linux/stddef.h:8:14: note: expanded from macro 'NULL'
   #define NULL ((void *)0)
                ^~~~~~~~~~~
   2 warnings generated.


vim +57 drivers/usb/host/ehci-pci.c

    49	
    50	static const struct usb_nosbrn_whitelist_entry {
    51		u16 vendor;
    52		u16 device;
    53	} usb_nosbrn_whitelist[] = {
    54		/* STMICRO ConneXT has no sbrn register */
    55		{PCI_VENDOR_ID_STMICRO, PCI_DEVICE_ID_STMICRO_USB_HOST},
    56		/* End of list */
  > 57		{NULL, NULL}
    58	};
    59	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
diff mbox series

Patch

diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c
index 3c3820a..534e906 100644
--- a/drivers/usb/host/ehci-pci.c
+++ b/drivers/usb/host/ehci-pci.c
@@ -47,6 +47,29 @@  static inline bool is_bypassed_id(struct pci_dev *pdev)
 	return !!pci_match_id(bypass_pci_id_table, pdev);
 }
 
+static const struct usb_nosbrn_whitelist_entry {
+	u16 vendor;
+	u16 device;
+} usb_nosbrn_whitelist[] = {
+	/* STMICRO ConneXT has no sbrn register */
+	{PCI_VENDOR_ID_STMICRO, PCI_DEVICE_ID_STMICRO_USB_HOST},
+	/* End of list */
+	{NULL, NULL}
+};
+
+static bool usb_forbid_sbrn_read(struct pci_dev *pdev)
+{
+	const struct usb_nosbrn_whitelist_entry *entry;
+
+	for (entry = usb_nosbrn_whitelist; entry->vendor; entry++) {
+		if (pdev->vendor == entry->vendor &&
+		    pdev->device == entry->device)
+			return true;
+	}
+
+	return false;
+}
+
 /*
  * 0x84 is the offset of in/out threshold register,
  * and it is the same offset as the register of 'hostpc'.
@@ -288,10 +311,7 @@  static int ehci_pci_setup(struct usb_hcd *hcd)
 	}
 
 	/* Serial Bus Release Number is at PCI 0x60 offset */
-	if (pdev->vendor == PCI_VENDOR_ID_STMICRO
-	    && pdev->device == PCI_DEVICE_ID_STMICRO_USB_HOST)
-		;	/* ConneXT has no sbrn register */
-	else
+	if (!usb_forbid_sbrn_read(pdev))
 		pci_read_config_byte(pdev, 0x60, &ehci->sbrn);
 
 	/* Keep this around for a while just in case some EHCI