All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] rtl8xxxu: increase polling timeout for firmware startup
@ 2016-05-18  1:14 Dan Lenski
  2016-05-18  1:14 ` [PATCH 1/2] rtl8xxxu: Increase default " Dan Lenski
  2016-05-18  1:14 ` [PATCH 2/2] rtl8xxxu: Make polling timeout for firmware configurable Dan Lenski
  0 siblings, 2 replies; 9+ messages in thread
From: Dan Lenski @ 2016-05-18  1:14 UTC (permalink / raw)
  To: linux-wireless; +Cc: Dan Lenski, jes.sorensen

Here are patches patch to increase the polling timeout for rtl8xxxu firmware
startup, and to make it configurable.

Resubmitting with changes per Julian Calaby's comments.


Dan Lenski (2):
  rtl8xxxu: Increase default polling timeout for firmware startup
  rtl8xxxu: Make polling timeout for firmware configurable

 drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c | 11 +++++++----
 drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h |  2 +-
 2 files changed, 8 insertions(+), 5 deletions(-)

-- 
2.8.2


^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 1/2] rtl8xxxu: Increase default polling timeout for firmware startup
  2016-05-18  1:14 [PATCH 0/2] rtl8xxxu: increase polling timeout for firmware startup Dan Lenski
@ 2016-05-18  1:14 ` Dan Lenski
  2016-05-18  1:20   ` Julian Calaby
  2016-05-18  3:35   ` Jes Sorensen
  2016-05-18  1:14 ` [PATCH 2/2] rtl8xxxu: Make polling timeout for firmware configurable Dan Lenski
  1 sibling, 2 replies; 9+ messages in thread
From: Dan Lenski @ 2016-05-18  1:14 UTC (permalink / raw)
  To: linux-wireless; +Cc: Dan Lenski, jes.sorensen

This patch increases the default value for the maximum number of polling
loops to wait for the rtl8xxxu MCU to start after the firmware is loaded
(from 1000 to 5000).

With RTL8723AU chipset, I frequently encounter "Firmware failed to start"
errors from rtl8xxxu after a cold boot.

It appears that other chipsets supported by the driver have the same
problem. Here are a couple of relevant bug reports:
- http://ubuntuforums.org/showthread.php?t=2321756
- https://www.mail-archive.com/ubuntu-bugs@lists.ubuntu.com/msg4942468.html

This issue seems to occur because RTL8XXXU_FIRMWARE_POLL_MAX (1000) is
too short, and the MCU fails to start up as quickly as expected.

With a longer value (5000), the driver starts up consistently and
successfully after cold-boot.

Signed-off-by: Dan Lenski <dlenski@gmail.com>
---
 drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
index f2a1bac..39c6ce7 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
@@ -49,7 +49,7 @@
 #define TX_PAGE_NUM_NORM_PQ		0x02
 
 #define RTL_FW_PAGE_SIZE		4096
-#define RTL8XXXU_FIRMWARE_POLL_MAX	1000
+#define RTL8XXXU_FIRMWARE_POLL_MAX	5000
 
 #define RTL8723A_CHANNEL_GROUPS		3
 #define RTL8723A_MAX_RF_PATHS		2
-- 
2.8.2


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 2/2] rtl8xxxu: Make polling timeout for firmware configurable
  2016-05-18  1:14 [PATCH 0/2] rtl8xxxu: increase polling timeout for firmware startup Dan Lenski
  2016-05-18  1:14 ` [PATCH 1/2] rtl8xxxu: Increase default " Dan Lenski
@ 2016-05-18  1:14 ` Dan Lenski
  2016-05-18  1:21   ` Julian Calaby
  2016-05-18  3:36   ` Jes Sorensen
  1 sibling, 2 replies; 9+ messages in thread
From: Dan Lenski @ 2016-05-18  1:14 UTC (permalink / raw)
  To: linux-wireless; +Cc: Dan Lenski, jes.sorensen

This patch makes RTL8XXXU_FIRMWARE_POLL_MAX into a configurable module
parameter, firmware_poll_max.

Signed-off-by: Dan Lenski <dlenski@gmail.com>
---
 drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
index 6aed923..a1efb2c 100644
--- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
+++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
@@ -44,6 +44,7 @@
 
 static int rtl8xxxu_debug;
 static bool rtl8xxxu_ht40_2g;
+static int rtl8xxxu_firmware_poll_max = RTL8XXXU_FIRMWARE_POLL_MAX;
 
 MODULE_AUTHOR("Jes Sorensen <Jes.Sorensen@redhat.com>");
 MODULE_DESCRIPTION("RTL8XXXu USB mac80211 Wireless LAN Driver");
@@ -59,6 +60,8 @@ module_param_named(debug, rtl8xxxu_debug, int, 0600);
 MODULE_PARM_DESC(debug, "Set debug mask");
 module_param_named(ht40_2g, rtl8xxxu_ht40_2g, bool, 0600);
 MODULE_PARM_DESC(ht40_2g, "Enable HT40 support on the 2.4GHz band");
+module_param_named(firmware_poll_max, rtl8xxxu_firmware_poll_max, int, 0600);
+MODULE_PARM_DESC(firmware_poll_max, "Maximum polling count for firmware startup (increase if firmware fails to start)");
 
 #define USB_VENDOR_ID_REALTEK		0x0bda
 /* Minimum IEEE80211_MAX_FRAME_LEN */
@@ -2050,13 +2053,13 @@ static int rtl8xxxu_start_firmware(struct rtl8xxxu_priv *priv)
 	u32 val32;
 
 	/* Poll checksum report */
-	for (i = 0; i < RTL8XXXU_FIRMWARE_POLL_MAX; i++) {
+	for (i = 0; i < rtl8xxxu_firmware_poll_max; i++) {
 		val32 = rtl8xxxu_read32(priv, REG_MCU_FW_DL);
 		if (val32 & MCU_FW_DL_CSUM_REPORT)
 			break;
 	}
 
-	if (i == RTL8XXXU_FIRMWARE_POLL_MAX) {
+	if (i == rtl8xxxu_firmware_poll_max) {
 		dev_warn(dev, "Firmware checksum poll timed out\n");
 		ret = -EAGAIN;
 		goto exit;
@@ -2068,7 +2071,7 @@ static int rtl8xxxu_start_firmware(struct rtl8xxxu_priv *priv)
 	rtl8xxxu_write32(priv, REG_MCU_FW_DL, val32);
 
 	/* Wait for firmware to become ready */
-	for (i = 0; i < RTL8XXXU_FIRMWARE_POLL_MAX; i++) {
+	for (i = 0; i < rtl8xxxu_firmware_poll_max; i++) {
 		val32 = rtl8xxxu_read32(priv, REG_MCU_FW_DL);
 		if (val32 & MCU_WINT_INIT_READY)
 			break;
@@ -2076,7 +2079,7 @@ static int rtl8xxxu_start_firmware(struct rtl8xxxu_priv *priv)
 		udelay(100);
 	}
 
-	if (i == RTL8XXXU_FIRMWARE_POLL_MAX) {
+	if (i == rtl8xxxu_firmware_poll_max) {
 		dev_warn(dev, "Firmware failed to start\n");
 		ret = -EAGAIN;
 		goto exit;
-- 
2.8.2


^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/2] rtl8xxxu: Increase default polling timeout for firmware startup
  2016-05-18  1:14 ` [PATCH 1/2] rtl8xxxu: Increase default " Dan Lenski
@ 2016-05-18  1:20   ` Julian Calaby
  2016-05-18  3:35   ` Jes Sorensen
  1 sibling, 0 replies; 9+ messages in thread
From: Julian Calaby @ 2016-05-18  1:20 UTC (permalink / raw)
  To: Dan Lenski; +Cc: linux-wireless, Jes Sorensen

Hi,

On Wed, May 18, 2016 at 11:14 AM, Dan Lenski <dlenski@gmail.com> wrote:
> This patch increases the default value for the maximum number of polling
> loops to wait for the rtl8xxxu MCU to start after the firmware is loaded
> (from 1000 to 5000).
>
> With RTL8723AU chipset, I frequently encounter "Firmware failed to start"
> errors from rtl8xxxu after a cold boot.
>
> It appears that other chipsets supported by the driver have the same
> problem. Here are a couple of relevant bug reports:
> - http://ubuntuforums.org/showthread.php?t=2321756
> - https://www.mail-archive.com/ubuntu-bugs@lists.ubuntu.com/msg4942468.html
>
> This issue seems to occur because RTL8XXXU_FIRMWARE_POLL_MAX (1000) is
> too short, and the MCU fails to start up as quickly as expected.
>
> With a longer value (5000), the driver starts up consistently and
> successfully after cold-boot.
>
> Signed-off-by: Dan Lenski <dlenski@gmail.com>

This looks good to me.

Reviewed-by: Julian Calaby <julian.calaby@gmail.com>

> ---
>  drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
> index f2a1bac..39c6ce7 100644
> --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
> +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
> @@ -49,7 +49,7 @@
>  #define TX_PAGE_NUM_NORM_PQ            0x02
>
>  #define RTL_FW_PAGE_SIZE               4096
> -#define RTL8XXXU_FIRMWARE_POLL_MAX     1000
> +#define RTL8XXXU_FIRMWARE_POLL_MAX     5000
>
>  #define RTL8723A_CHANNEL_GROUPS                3
>  #define RTL8723A_MAX_RF_PATHS          2
> --
> 2.8.2
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html



-- 
Julian Calaby

Email: julian.calaby@gmail.com
Profile: http://www.google.com/profiles/julian.calaby/

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 2/2] rtl8xxxu: Make polling timeout for firmware configurable
  2016-05-18  1:14 ` [PATCH 2/2] rtl8xxxu: Make polling timeout for firmware configurable Dan Lenski
@ 2016-05-18  1:21   ` Julian Calaby
  2016-05-18  3:36   ` Jes Sorensen
  1 sibling, 0 replies; 9+ messages in thread
From: Julian Calaby @ 2016-05-18  1:21 UTC (permalink / raw)
  To: Dan Lenski; +Cc: linux-wireless, Jes Sorensen

Hi,

On Wed, May 18, 2016 at 11:14 AM, Dan Lenski <dlenski@gmail.com> wrote:
> This patch makes RTL8XXXU_FIRMWARE_POLL_MAX into a configurable module
> parameter, firmware_poll_max.
>
> Signed-off-by: Dan Lenski <dlenski@gmail.com>

This looks good to me.

Reviewed-by: Julian Calaby <julian.calaby@gmail.com>

> ---
>  drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c | 11 +++++++----
>  1 file changed, 7 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
> index 6aed923..a1efb2c 100644
> --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
> +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c
> @@ -44,6 +44,7 @@
>
>  static int rtl8xxxu_debug;
>  static bool rtl8xxxu_ht40_2g;
> +static int rtl8xxxu_firmware_poll_max = RTL8XXXU_FIRMWARE_POLL_MAX;
>
>  MODULE_AUTHOR("Jes Sorensen <Jes.Sorensen@redhat.com>");
>  MODULE_DESCRIPTION("RTL8XXXu USB mac80211 Wireless LAN Driver");
> @@ -59,6 +60,8 @@ module_param_named(debug, rtl8xxxu_debug, int, 0600);
>  MODULE_PARM_DESC(debug, "Set debug mask");
>  module_param_named(ht40_2g, rtl8xxxu_ht40_2g, bool, 0600);
>  MODULE_PARM_DESC(ht40_2g, "Enable HT40 support on the 2.4GHz band");
> +module_param_named(firmware_poll_max, rtl8xxxu_firmware_poll_max, int, 0600);
> +MODULE_PARM_DESC(firmware_poll_max, "Maximum polling count for firmware startup (increase if firmware fails to start)");
>
>  #define USB_VENDOR_ID_REALTEK          0x0bda
>  /* Minimum IEEE80211_MAX_FRAME_LEN */
> @@ -2050,13 +2053,13 @@ static int rtl8xxxu_start_firmware(struct rtl8xxxu_priv *priv)
>         u32 val32;
>
>         /* Poll checksum report */
> -       for (i = 0; i < RTL8XXXU_FIRMWARE_POLL_MAX; i++) {
> +       for (i = 0; i < rtl8xxxu_firmware_poll_max; i++) {
>                 val32 = rtl8xxxu_read32(priv, REG_MCU_FW_DL);
>                 if (val32 & MCU_FW_DL_CSUM_REPORT)
>                         break;
>         }
>
> -       if (i == RTL8XXXU_FIRMWARE_POLL_MAX) {
> +       if (i == rtl8xxxu_firmware_poll_max) {
>                 dev_warn(dev, "Firmware checksum poll timed out\n");
>                 ret = -EAGAIN;
>                 goto exit;
> @@ -2068,7 +2071,7 @@ static int rtl8xxxu_start_firmware(struct rtl8xxxu_priv *priv)
>         rtl8xxxu_write32(priv, REG_MCU_FW_DL, val32);
>
>         /* Wait for firmware to become ready */
> -       for (i = 0; i < RTL8XXXU_FIRMWARE_POLL_MAX; i++) {
> +       for (i = 0; i < rtl8xxxu_firmware_poll_max; i++) {
>                 val32 = rtl8xxxu_read32(priv, REG_MCU_FW_DL);
>                 if (val32 & MCU_WINT_INIT_READY)
>                         break;
> @@ -2076,7 +2079,7 @@ static int rtl8xxxu_start_firmware(struct rtl8xxxu_priv *priv)
>                 udelay(100);
>         }
>
> -       if (i == RTL8XXXU_FIRMWARE_POLL_MAX) {
> +       if (i == rtl8xxxu_firmware_poll_max) {
>                 dev_warn(dev, "Firmware failed to start\n");
>                 ret = -EAGAIN;
>                 goto exit;
> --
> 2.8.2
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html



-- 
Julian Calaby

Email: julian.calaby@gmail.com
Profile: http://www.google.com/profiles/julian.calaby/

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/2] rtl8xxxu: Increase default polling timeout for firmware startup
  2016-05-18  1:14 ` [PATCH 1/2] rtl8xxxu: Increase default " Dan Lenski
  2016-05-18  1:20   ` Julian Calaby
@ 2016-05-18  3:35   ` Jes Sorensen
  2016-05-18  4:03     ` Daniel Lenski
  1 sibling, 1 reply; 9+ messages in thread
From: Jes Sorensen @ 2016-05-18  3:35 UTC (permalink / raw)
  To: Dan Lenski; +Cc: linux-wireless

Dan Lenski <dlenski@gmail.com> writes:
> This patch increases the default value for the maximum number of polling
> loops to wait for the rtl8xxxu MCU to start after the firmware is loaded
> (from 1000 to 5000).
>
> With RTL8723AU chipset, I frequently encounter "Firmware failed to start"
> errors from rtl8xxxu after a cold boot.
>
> It appears that other chipsets supported by the driver have the same
> problem. Here are a couple of relevant bug reports:
> - http://ubuntuforums.org/showthread.php?t=2321756
> - https://www.mail-archive.com/ubuntu-bugs@lists.ubuntu.com/msg4942468.html
>
> This issue seems to occur because RTL8XXXU_FIRMWARE_POLL_MAX (1000) is
> too short, and the MCU fails to start up as quickly as expected.
>
> With a longer value (5000), the driver starts up consistently and
> successfully after cold-boot.
>
> Signed-off-by: Dan Lenski <dlenski@gmail.com>
> ---
>  drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)

As previously pointed out, please provide some details about the system
where this goes wrong.

> diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
> b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
> index f2a1bac..39c6ce7 100644
> --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
> +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
> @@ -49,7 +49,7 @@
>  #define TX_PAGE_NUM_NORM_PQ		0x02
>  
>  #define RTL_FW_PAGE_SIZE		4096
> -#define RTL8XXXU_FIRMWARE_POLL_MAX	1000
> +#define RTL8XXXU_FIRMWARE_POLL_MAX	5000

This is a long delay - how about 2000?

Jes

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 2/2] rtl8xxxu: Make polling timeout for firmware configurable
  2016-05-18  1:14 ` [PATCH 2/2] rtl8xxxu: Make polling timeout for firmware configurable Dan Lenski
  2016-05-18  1:21   ` Julian Calaby
@ 2016-05-18  3:36   ` Jes Sorensen
  1 sibling, 0 replies; 9+ messages in thread
From: Jes Sorensen @ 2016-05-18  3:36 UTC (permalink / raw)
  To: Dan Lenski; +Cc: linux-wireless

Dan Lenski <dlenski@gmail.com> writes:
> This patch makes RTL8XXXU_FIRMWARE_POLL_MAX into a configurable module
> parameter, firmware_poll_max.
>
> Signed-off-by: Dan Lenski <dlenski@gmail.com>
> ---
>  drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.c | 11 +++++++----
>  1 file changed, 7 insertions(+), 4 deletions(-)

I really see no use for this one - it's an extremely rare case, and not
something that I'd expect anyone ever using.

Again, please submit patches against the correct git tree.

Jes

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/2] rtl8xxxu: Increase default polling timeout for firmware startup
  2016-05-18  3:35   ` Jes Sorensen
@ 2016-05-18  4:03     ` Daniel Lenski
  2016-05-18 14:57       ` Jes Sorensen
  0 siblings, 1 reply; 9+ messages in thread
From: Daniel Lenski @ 2016-05-18  4:03 UTC (permalink / raw)
  To: Jes Sorensen; +Cc: linux-wireless

On Tue, May 17, 2016 at 8:35 PM, Jes Sorensen <Jes.Sorensen@redhat.com> wrote:
> Dan Lenski <dlenski@gmail.com> writes:
>> diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
>> b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
>> index f2a1bac..39c6ce7 100644
>> --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
>> +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
>> @@ -49,7 +49,7 @@
>>  #define TX_PAGE_NUM_NORM_PQ          0x02
>>
>>  #define RTL_FW_PAGE_SIZE             4096
>> -#define RTL8XXXU_FIRMWARE_POLL_MAX   1000
>> +#define RTL8XXXU_FIRMWARE_POLL_MAX   5000
>
> This is a long delay - how about 2000?

I tried 2000 first, and it worked for me on only 1 out of 3 cold boots.

Dan

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 1/2] rtl8xxxu: Increase default polling timeout for firmware startup
  2016-05-18  4:03     ` Daniel Lenski
@ 2016-05-18 14:57       ` Jes Sorensen
  0 siblings, 0 replies; 9+ messages in thread
From: Jes Sorensen @ 2016-05-18 14:57 UTC (permalink / raw)
  To: Daniel Lenski; +Cc: linux-wireless

Daniel Lenski <dlenski@gmail.com> writes:
> On Tue, May 17, 2016 at 8:35 PM, Jes Sorensen <Jes.Sorensen@redhat.com> wrote:
>> Dan Lenski <dlenski@gmail.com> writes:
>>> diff --git a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
>>> b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
>>> index f2a1bac..39c6ce7 100644
>>> --- a/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
>>> +++ b/drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu.h
>>> @@ -49,7 +49,7 @@
>>>  #define TX_PAGE_NUM_NORM_PQ          0x02
>>>
>>>  #define RTL_FW_PAGE_SIZE             4096
>>> -#define RTL8XXXU_FIRMWARE_POLL_MAX   1000
>>> +#define RTL8XXXU_FIRMWARE_POLL_MAX   5000
>>
>> This is a long delay - how about 2000?
>
> I tried 2000 first, and it worked for me on only 1 out of 3 cold boots.

OK, lets go for 5000 then to be safe.

Cheers,
Jes

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2016-05-18 14:57 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-05-18  1:14 [PATCH 0/2] rtl8xxxu: increase polling timeout for firmware startup Dan Lenski
2016-05-18  1:14 ` [PATCH 1/2] rtl8xxxu: Increase default " Dan Lenski
2016-05-18  1:20   ` Julian Calaby
2016-05-18  3:35   ` Jes Sorensen
2016-05-18  4:03     ` Daniel Lenski
2016-05-18 14:57       ` Jes Sorensen
2016-05-18  1:14 ` [PATCH 2/2] rtl8xxxu: Make polling timeout for firmware configurable Dan Lenski
2016-05-18  1:21   ` Julian Calaby
2016-05-18  3:36   ` Jes Sorensen

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.