[1/2] usb: dwc3: core: Add support for xhci-sg-trb-cache-size-quirk

Message ID 20231118055455.249088-2-quic_prashk@quicinc.com
State New
Headers
Series Add support for xhci-sg-trb-cache-size-quirk |

Commit Message

Prashanth K Nov. 18, 2023, 5:54 a.m. UTC
  Upstream commit bac1ec551434 ("usb: xhci: Set quirk for
XHCI_SG_TRB_CACHE_SIZE_QUIRK") introduced a new quirk in XHCI
which fixes XHC timeout while using SG buffers. Add a new quirk
in DWC3 layer to enable this XHCI quirk since this is needed
for DWC3 controller. Added xhci private data structure to pass
the quirk to XHCI.

In Synopsys DWC3 databook,
Table 9-3: xHCI Debug Capability Limitations
Chained TRBs greater than TRB cache size: The debug capability
driver must not create a multi-TRB TD that describes smaller
than a 1K packet that spreads across 8 or more TRBs on either
the IN TR or the OUT TR

Cc: <stable@vger.kernel.org> # 5.11
Fixes: bac1ec551434 ("usb: xhci: Set quirk for XHCI_SG_TRB_CACHE_SIZE_QUIRK")
Signed-off-by: Prashanth K <quic_prashk@quicinc.com>
---
 drivers/usb/dwc3/core.c | 2 ++
 drivers/usb/dwc3/core.h | 3 +++
 drivers/usb/dwc3/host.c | 9 +++++++++
 3 files changed, 14 insertions(+)
  

Comments

kernel test robot Nov. 18, 2023, 10:48 a.m. UTC | #1
Hi Prashanth,

kernel test robot noticed the following build warnings:

[auto build test WARNING on usb/usb-testing]
[also build test WARNING on usb/usb-next usb/usb-linus linus/master v6.7-rc1 next-20231117]
[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#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Prashanth-K/usb-dwc3-core-Add-support-for-xhci-sg-trb-cache-size-quirk/20231118-135837
base:   https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git usb-testing
patch link:    https://lore.kernel.org/r/20231118055455.249088-2-quic_prashk%40quicinc.com
patch subject: [PATCH 1/2] usb: dwc3: core: Add support for xhci-sg-trb-cache-size-quirk
config: x86_64-allyesconfig (https://download.01.org/0day-ci/archive/20231118/202311181846.AjhQ7gvy-lkp@intel.com/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231118/202311181846.AjhQ7gvy-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202311181846.AjhQ7gvy-lkp@intel.com/

All warnings (new ones prefixed by >>):

   drivers/usb/dwc3/host.c: In function 'dwc3_host_init':
   drivers/usb/dwc3/host.c:66:16: error: variable 'dwc3_xhci_plat_priv' has initializer but incomplete type
      66 |         struct xhci_plat_priv   dwc3_xhci_plat_priv = {0};
         |                ^~~~~~~~~~~~~~
>> drivers/usb/dwc3/host.c:66:56: warning: excess elements in struct initializer
      66 |         struct xhci_plat_priv   dwc3_xhci_plat_priv = {0};
         |                                                        ^
   drivers/usb/dwc3/host.c:66:56: note: (near initialization for 'dwc3_xhci_plat_priv')
   drivers/usb/dwc3/host.c:66:33: error: storage size of 'dwc3_xhci_plat_priv' isn't known
      66 |         struct xhci_plat_priv   dwc3_xhci_plat_priv = {0};
         |                                 ^~~~~~~~~~~~~~~~~~~
   drivers/usb/dwc3/host.c:92:47: error: 'XHCI_SG_TRB_CACHE_SIZE_QUIRK' undeclared (first use in this function)
      92 |                 dwc3_xhci_plat_priv.quirks |= XHCI_SG_TRB_CACHE_SIZE_QUIRK;
         |                                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/usb/dwc3/host.c:92:47: note: each undeclared identifier is reported only once for each function it appears in
>> drivers/usb/dwc3/host.c:66:33: warning: unused variable 'dwc3_xhci_plat_priv' [-Wunused-variable]
      66 |         struct xhci_plat_priv   dwc3_xhci_plat_priv = {0};
         |                                 ^~~~~~~~~~~~~~~~~~~


vim +66 drivers/usb/dwc3/host.c

    61	
    62	int dwc3_host_init(struct dwc3 *dwc)
    63	{
    64		struct property_entry	props[4];
    65		struct platform_device	*xhci;
  > 66		struct xhci_plat_priv   dwc3_xhci_plat_priv = {0};
    67		int			ret, irq;
    68		int			prop_idx = 0;
    69	
    70		irq = dwc3_host_get_irq(dwc);
    71		if (irq < 0)
    72			return irq;
    73	
    74		xhci = platform_device_alloc("xhci-hcd", PLATFORM_DEVID_AUTO);
    75		if (!xhci) {
    76			dev_err(dwc->dev, "couldn't allocate xHCI device\n");
    77			return -ENOMEM;
    78		}
    79	
    80		xhci->dev.parent	= dwc->dev;
    81	
    82		dwc->xhci = xhci;
    83	
    84		ret = platform_device_add_resources(xhci, dwc->xhci_resources,
    85							DWC3_XHCI_RESOURCES_NUM);
    86		if (ret) {
    87			dev_err(dwc->dev, "couldn't add resources to xHCI device\n");
    88			goto err;
    89		}
    90	
    91		if (dwc->xhci_sg_trb_cache_size_quirk)
    92			dwc3_xhci_plat_priv.quirks |= XHCI_SG_TRB_CACHE_SIZE_QUIRK;
    93	
    94		ret = platform_device_add_data(xhci, &dwc3_xhci_plat_priv,
    95						sizeof(dwc3_xhci_plat_priv));
    96		if (ret)
    97			goto err;
    98	
    99		memset(props, 0, sizeof(struct property_entry) * ARRAY_SIZE(props));
   100	
   101		if (dwc->usb3_lpm_capable)
   102			props[prop_idx++] = PROPERTY_ENTRY_BOOL("usb3-lpm-capable");
   103	
   104		if (dwc->usb2_lpm_disable)
   105			props[prop_idx++] = PROPERTY_ENTRY_BOOL("usb2-lpm-disable");
   106	
   107		/**
   108		 * WORKAROUND: dwc3 revisions <=3.00a have a limitation
   109		 * where Port Disable command doesn't work.
   110		 *
   111		 * The suggested workaround is that we avoid Port Disable
   112		 * completely.
   113		 *
   114		 * This following flag tells XHCI to do just that.
   115		 */
   116		if (DWC3_VER_IS_WITHIN(DWC3, ANY, 300A))
   117			props[prop_idx++] = PROPERTY_ENTRY_BOOL("quirk-broken-port-ped");
   118	
   119		if (prop_idx) {
   120			ret = device_create_managed_software_node(&xhci->dev, props, NULL);
   121			if (ret) {
   122				dev_err(dwc->dev, "failed to add properties to xHCI\n");
   123				goto err;
   124			}
   125		}
   126	
   127		ret = platform_device_add(xhci);
   128		if (ret) {
   129			dev_err(dwc->dev, "failed to register xHCI device\n");
   130			goto err;
   131		}
   132	
   133		return 0;
   134	err:
   135		platform_device_put(xhci);
   136		return ret;
   137	}
   138
  
kernel test robot Nov. 18, 2023, 1:43 p.m. UTC | #2
Hi Prashanth,

kernel test robot noticed the following build errors:

[auto build test ERROR on usb/usb-testing]
[also build test ERROR on usb/usb-next usb/usb-linus linus/master v6.7-rc1 next-20231117]
[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#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Prashanth-K/usb-dwc3-core-Add-support-for-xhci-sg-trb-cache-size-quirk/20231118-135837
base:   https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git usb-testing
patch link:    https://lore.kernel.org/r/20231118055455.249088-2-quic_prashk%40quicinc.com
patch subject: [PATCH 1/2] usb: dwc3: core: Add support for xhci-sg-trb-cache-size-quirk
config: x86_64-allyesconfig (https://download.01.org/0day-ci/archive/20231118/202311182124.Rhvs60sb-lkp@intel.com/config)
compiler: gcc-12 (Debian 12.2.0-14) 12.2.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231118/202311182124.Rhvs60sb-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202311182124.Rhvs60sb-lkp@intel.com/

All errors (new ones prefixed by >>):

   drivers/usb/dwc3/host.c: In function 'dwc3_host_init':
>> drivers/usb/dwc3/host.c:66:16: error: variable 'dwc3_xhci_plat_priv' has initializer but incomplete type
      66 |         struct xhci_plat_priv   dwc3_xhci_plat_priv = {0};
         |                ^~~~~~~~~~~~~~
   drivers/usb/dwc3/host.c:66:56: warning: excess elements in struct initializer
      66 |         struct xhci_plat_priv   dwc3_xhci_plat_priv = {0};
         |                                                        ^
   drivers/usb/dwc3/host.c:66:56: note: (near initialization for 'dwc3_xhci_plat_priv')
>> drivers/usb/dwc3/host.c:66:33: error: storage size of 'dwc3_xhci_plat_priv' isn't known
      66 |         struct xhci_plat_priv   dwc3_xhci_plat_priv = {0};
         |                                 ^~~~~~~~~~~~~~~~~~~
>> drivers/usb/dwc3/host.c:92:47: error: 'XHCI_SG_TRB_CACHE_SIZE_QUIRK' undeclared (first use in this function)
      92 |                 dwc3_xhci_plat_priv.quirks |= XHCI_SG_TRB_CACHE_SIZE_QUIRK;
         |                                               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
   drivers/usb/dwc3/host.c:92:47: note: each undeclared identifier is reported only once for each function it appears in
   drivers/usb/dwc3/host.c:66:33: warning: unused variable 'dwc3_xhci_plat_priv' [-Wunused-variable]
      66 |         struct xhci_plat_priv   dwc3_xhci_plat_priv = {0};
         |                                 ^~~~~~~~~~~~~~~~~~~


vim +/dwc3_xhci_plat_priv +66 drivers/usb/dwc3/host.c

    61	
    62	int dwc3_host_init(struct dwc3 *dwc)
    63	{
    64		struct property_entry	props[4];
    65		struct platform_device	*xhci;
  > 66		struct xhci_plat_priv   dwc3_xhci_plat_priv = {0};
    67		int			ret, irq;
    68		int			prop_idx = 0;
    69	
    70		irq = dwc3_host_get_irq(dwc);
    71		if (irq < 0)
    72			return irq;
    73	
    74		xhci = platform_device_alloc("xhci-hcd", PLATFORM_DEVID_AUTO);
    75		if (!xhci) {
    76			dev_err(dwc->dev, "couldn't allocate xHCI device\n");
    77			return -ENOMEM;
    78		}
    79	
    80		xhci->dev.parent	= dwc->dev;
    81	
    82		dwc->xhci = xhci;
    83	
    84		ret = platform_device_add_resources(xhci, dwc->xhci_resources,
    85							DWC3_XHCI_RESOURCES_NUM);
    86		if (ret) {
    87			dev_err(dwc->dev, "couldn't add resources to xHCI device\n");
    88			goto err;
    89		}
    90	
    91		if (dwc->xhci_sg_trb_cache_size_quirk)
  > 92			dwc3_xhci_plat_priv.quirks |= XHCI_SG_TRB_CACHE_SIZE_QUIRK;
    93	
    94		ret = platform_device_add_data(xhci, &dwc3_xhci_plat_priv,
    95						sizeof(dwc3_xhci_plat_priv));
    96		if (ret)
    97			goto err;
    98	
    99		memset(props, 0, sizeof(struct property_entry) * ARRAY_SIZE(props));
   100	
   101		if (dwc->usb3_lpm_capable)
   102			props[prop_idx++] = PROPERTY_ENTRY_BOOL("usb3-lpm-capable");
   103	
   104		if (dwc->usb2_lpm_disable)
   105			props[prop_idx++] = PROPERTY_ENTRY_BOOL("usb2-lpm-disable");
   106	
   107		/**
   108		 * WORKAROUND: dwc3 revisions <=3.00a have a limitation
   109		 * where Port Disable command doesn't work.
   110		 *
   111		 * The suggested workaround is that we avoid Port Disable
   112		 * completely.
   113		 *
   114		 * This following flag tells XHCI to do just that.
   115		 */
   116		if (DWC3_VER_IS_WITHIN(DWC3, ANY, 300A))
   117			props[prop_idx++] = PROPERTY_ENTRY_BOOL("quirk-broken-port-ped");
   118	
   119		if (prop_idx) {
   120			ret = device_create_managed_software_node(&xhci->dev, props, NULL);
   121			if (ret) {
   122				dev_err(dwc->dev, "failed to add properties to xHCI\n");
   123				goto err;
   124			}
   125		}
   126	
   127		ret = platform_device_add(xhci);
   128		if (ret) {
   129			dev_err(dwc->dev, "failed to register xHCI device\n");
   130			goto err;
   131		}
   132	
   133		return 0;
   134	err:
   135		platform_device_put(xhci);
   136		return ret;
   137	}
   138
  
kernel test robot Nov. 18, 2023, 3:38 p.m. UTC | #3
Hi Prashanth,

kernel test robot noticed the following build errors:

[auto build test ERROR on usb/usb-testing]
[also build test ERROR on usb/usb-next usb/usb-linus linus/master v6.7-rc1 next-20231117]
[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#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Prashanth-K/usb-dwc3-core-Add-support-for-xhci-sg-trb-cache-size-quirk/20231118-135837
base:   https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git usb-testing
patch link:    https://lore.kernel.org/r/20231118055455.249088-2-quic_prashk%40quicinc.com
patch subject: [PATCH 1/2] usb: dwc3: core: Add support for xhci-sg-trb-cache-size-quirk
config: hexagon-randconfig-002-20231118 (https://download.01.org/0day-ci/archive/20231118/202311182312.lJrwZFwZ-lkp@intel.com/config)
compiler: clang version 17.0.0 (https://github.com/llvm/llvm-project.git 4a5ac14ee968ff0ad5d2cc1ffa0299048db4c88a)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20231118/202311182312.lJrwZFwZ-lkp@intel.com/reproduce)

If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202311182312.lJrwZFwZ-lkp@intel.com/

All errors (new ones prefixed by >>):

   In file included from drivers/usb/dwc3/host.c:10:
   In file included from include/linux/irq.h:20:
   In file included from include/linux/io.h:13:
   In file included from arch/hexagon/include/asm/io.h:337:
   include/asm-generic/io.h:547:31: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
     547 |         val = __raw_readb(PCI_IOBASE + addr);
         |                           ~~~~~~~~~~ ^
   include/asm-generic/io.h:560:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
     560 |         val = __le16_to_cpu((__le16 __force)__raw_readw(PCI_IOBASE + addr));
         |                                                         ~~~~~~~~~~ ^
   include/uapi/linux/byteorder/little_endian.h:37:51: note: expanded from macro '__le16_to_cpu'
      37 | #define __le16_to_cpu(x) ((__force __u16)(__le16)(x))
         |                                                   ^
   In file included from drivers/usb/dwc3/host.c:10:
   In file included from include/linux/irq.h:20:
   In file included from include/linux/io.h:13:
   In file included from arch/hexagon/include/asm/io.h:337:
   include/asm-generic/io.h:573:61: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
     573 |         val = __le32_to_cpu((__le32 __force)__raw_readl(PCI_IOBASE + addr));
         |                                                         ~~~~~~~~~~ ^
   include/uapi/linux/byteorder/little_endian.h:35:51: note: expanded from macro '__le32_to_cpu'
      35 | #define __le32_to_cpu(x) ((__force __u32)(__le32)(x))
         |                                                   ^
   In file included from drivers/usb/dwc3/host.c:10:
   In file included from include/linux/irq.h:20:
   In file included from include/linux/io.h:13:
   In file included from arch/hexagon/include/asm/io.h:337:
   include/asm-generic/io.h:584:33: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
     584 |         __raw_writeb(value, PCI_IOBASE + addr);
         |                             ~~~~~~~~~~ ^
   include/asm-generic/io.h:594:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
     594 |         __raw_writew((u16 __force)cpu_to_le16(value), PCI_IOBASE + addr);
         |                                                       ~~~~~~~~~~ ^
   include/asm-generic/io.h:604:59: warning: performing pointer arithmetic on a null pointer has undefined behavior [-Wnull-pointer-arithmetic]
     604 |         __raw_writel((u32 __force)cpu_to_le32(value), PCI_IOBASE + addr);
         |                                                       ~~~~~~~~~~ ^
>> drivers/usb/dwc3/host.c:66:26: error: variable has incomplete type 'struct xhci_plat_priv'
      66 |         struct xhci_plat_priv   dwc3_xhci_plat_priv = {0};
         |                                 ^
   drivers/usb/dwc3/host.c:66:9: note: forward declaration of 'struct xhci_plat_priv'
      66 |         struct xhci_plat_priv   dwc3_xhci_plat_priv = {0};
         |                ^
>> drivers/usb/dwc3/host.c:92:33: error: use of undeclared identifier 'XHCI_SG_TRB_CACHE_SIZE_QUIRK'
      92 |                 dwc3_xhci_plat_priv.quirks |= XHCI_SG_TRB_CACHE_SIZE_QUIRK;
         |                                               ^
   6 warnings and 2 errors generated.


vim +66 drivers/usb/dwc3/host.c

    61	
    62	int dwc3_host_init(struct dwc3 *dwc)
    63	{
    64		struct property_entry	props[4];
    65		struct platform_device	*xhci;
  > 66		struct xhci_plat_priv   dwc3_xhci_plat_priv = {0};
    67		int			ret, irq;
    68		int			prop_idx = 0;
    69	
    70		irq = dwc3_host_get_irq(dwc);
    71		if (irq < 0)
    72			return irq;
    73	
    74		xhci = platform_device_alloc("xhci-hcd", PLATFORM_DEVID_AUTO);
    75		if (!xhci) {
    76			dev_err(dwc->dev, "couldn't allocate xHCI device\n");
    77			return -ENOMEM;
    78		}
    79	
    80		xhci->dev.parent	= dwc->dev;
    81	
    82		dwc->xhci = xhci;
    83	
    84		ret = platform_device_add_resources(xhci, dwc->xhci_resources,
    85							DWC3_XHCI_RESOURCES_NUM);
    86		if (ret) {
    87			dev_err(dwc->dev, "couldn't add resources to xHCI device\n");
    88			goto err;
    89		}
    90	
    91		if (dwc->xhci_sg_trb_cache_size_quirk)
  > 92			dwc3_xhci_plat_priv.quirks |= XHCI_SG_TRB_CACHE_SIZE_QUIRK;
    93	
    94		ret = platform_device_add_data(xhci, &dwc3_xhci_plat_priv,
    95						sizeof(dwc3_xhci_plat_priv));
    96		if (ret)
    97			goto err;
    98	
    99		memset(props, 0, sizeof(struct property_entry) * ARRAY_SIZE(props));
   100	
   101		if (dwc->usb3_lpm_capable)
   102			props[prop_idx++] = PROPERTY_ENTRY_BOOL("usb3-lpm-capable");
   103	
   104		if (dwc->usb2_lpm_disable)
   105			props[prop_idx++] = PROPERTY_ENTRY_BOOL("usb2-lpm-disable");
   106	
   107		/**
   108		 * WORKAROUND: dwc3 revisions <=3.00a have a limitation
   109		 * where Port Disable command doesn't work.
   110		 *
   111		 * The suggested workaround is that we avoid Port Disable
   112		 * completely.
   113		 *
   114		 * This following flag tells XHCI to do just that.
   115		 */
   116		if (DWC3_VER_IS_WITHIN(DWC3, ANY, 300A))
   117			props[prop_idx++] = PROPERTY_ENTRY_BOOL("quirk-broken-port-ped");
   118	
   119		if (prop_idx) {
   120			ret = device_create_managed_software_node(&xhci->dev, props, NULL);
   121			if (ret) {
   122				dev_err(dwc->dev, "failed to add properties to xHCI\n");
   123				goto err;
   124			}
   125		}
   126	
   127		ret = platform_device_add(xhci);
   128		if (ret) {
   129			dev_err(dwc->dev, "failed to register xHCI device\n");
   130			goto err;
   131		}
   132	
   133		return 0;
   134	err:
   135		platform_device_put(xhci);
   136		return ret;
   137	}
   138
  

Patch

diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c
index 0328c86..c6b0ae9 100644
--- a/drivers/usb/dwc3/core.c
+++ b/drivers/usb/dwc3/core.c
@@ -1633,6 +1633,8 @@  static void dwc3_get_properties(struct dwc3 *dwc)
 				"snps,parkmode-disable-hs-quirk");
 	dwc->gfladj_refclk_lpm_sel = device_property_read_bool(dev,
 				"snps,gfladj-refclk-lpm-sel-quirk");
+	dwc->xhci_sg_trb_cache_size_quirk = device_property_read_bool(dev,
+				"xhci-sg-trb-cache-size-quirk");
 
 	dwc->tx_de_emphasis_quirk = device_property_read_bool(dev,
 				"snps,tx_de_emphasis_quirk");
diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h
index efe6caf..dde1447 100644
--- a/drivers/usb/dwc3/core.h
+++ b/drivers/usb/dwc3/core.h
@@ -1119,6 +1119,8 @@  struct dwc3_scratchpad_array {
  *			instances in park mode.
  * @gfladj_refclk_lpm_sel: set if we need to enable SOF/ITP counter
  *                          running based on ref_clk
+ * @xhci_sg_trb_cache_size_quirk: set to prevent XHC timeout when scatter-gather
+ *			is enabled due to TRB_CACHE_SIZE.
  * @tx_de_emphasis_quirk: set if we enable Tx de-emphasis quirk
  * @tx_de_emphasis: Tx de-emphasis value
  *	0	- -6dB de-emphasis
@@ -1342,6 +1344,7 @@  struct dwc3 {
 	unsigned		parkmode_disable_ss_quirk:1;
 	unsigned		parkmode_disable_hs_quirk:1;
 	unsigned		gfladj_refclk_lpm_sel:1;
+	unsigned		xhci_sg_trb_cache_size_quirk:1;
 
 	unsigned		tx_de_emphasis_quirk:1;
 	unsigned		tx_de_emphasis:2;
diff --git a/drivers/usb/dwc3/host.c b/drivers/usb/dwc3/host.c
index 61f57fe..09f049b 100644
--- a/drivers/usb/dwc3/host.c
+++ b/drivers/usb/dwc3/host.c
@@ -63,6 +63,7 @@  int dwc3_host_init(struct dwc3 *dwc)
 {
 	struct property_entry	props[4];
 	struct platform_device	*xhci;
+	struct xhci_plat_priv   dwc3_xhci_plat_priv = {0};
 	int			ret, irq;
 	int			prop_idx = 0;
 
@@ -87,6 +88,14 @@  int dwc3_host_init(struct dwc3 *dwc)
 		goto err;
 	}
 
+	if (dwc->xhci_sg_trb_cache_size_quirk)
+		dwc3_xhci_plat_priv.quirks |= XHCI_SG_TRB_CACHE_SIZE_QUIRK;
+
+	ret = platform_device_add_data(xhci, &dwc3_xhci_plat_priv,
+					sizeof(dwc3_xhci_plat_priv));
+	if (ret)
+		goto err;
+
 	memset(props, 0, sizeof(struct property_entry) * ARRAY_SIZE(props));
 
 	if (dwc->usb3_lpm_capable)