[PATCH] USB: HCD: remove logic about which hcd is loaded

Greg Kroah-Hartman posted 1 patch 1 month ago
drivers/usb/core/hcd.c            | 4 ----
drivers/usb/fotg210/fotg210-hcd.c | 6 ------
drivers/usb/host/ehci-hcd.c       | 8 --------
drivers/usb/host/ohci-hcd.c       | 3 ---
drivers/usb/host/uhci-hcd.c       | 5 -----
include/linux/usb/hcd.h           | 6 ------
6 files changed, 32 deletions(-)
[PATCH] USB: HCD: remove logic about which hcd is loaded
Posted by Greg Kroah-Hartman 1 month ago
It turns out that warning about which USB host controller is loaded
before another one doesn't really matter.  All that really is needed is
the PCI softdep module loading logic, which has been present in the
kernel ever since commit 05c92da0c524 ("usb: ohci/uhci - add soft
dependencies on ehci_pci")

So remove the warning messages, they are not useful, not needed, and
only confuse people.  As can be seen in the discussion at
https://lore.kernel.org/r/20251230080014.3934590-1-chenhuacai@loongson.cn

Cc: Huacai Chen <chenhuacai@loongson.cn>
Suggested-by: Alan Stern <stern@rowland.harvard.edu>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
 drivers/usb/core/hcd.c            | 4 ----
 drivers/usb/fotg210/fotg210-hcd.c | 6 ------
 drivers/usb/host/ehci-hcd.c       | 8 --------
 drivers/usb/host/ohci-hcd.c       | 3 ---
 drivers/usb/host/uhci-hcd.c       | 5 -----
 include/linux/usb/hcd.h           | 6 ------
 6 files changed, 32 deletions(-)

diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
index 24feb0de1c00..2d99a59d9f3f 100644
--- a/drivers/usb/core/hcd.c
+++ b/drivers/usb/core/hcd.c
@@ -77,10 +77,6 @@
 
 /*-------------------------------------------------------------------------*/
 
-/* Keep track of which host controller drivers are loaded */
-unsigned long usb_hcds_loaded;
-EXPORT_SYMBOL_GPL(usb_hcds_loaded);
-
 /* host controllers we manage */
 DEFINE_IDR (usb_bus_idr);
 EXPORT_SYMBOL_GPL (usb_bus_idr);
diff --git a/drivers/usb/fotg210/fotg210-hcd.c b/drivers/usb/fotg210/fotg210-hcd.c
index 64c4965a160f..fbb5d590eab6 100644
--- a/drivers/usb/fotg210/fotg210-hcd.c
+++ b/drivers/usb/fotg210/fotg210-hcd.c
@@ -5625,11 +5625,6 @@ int __init fotg210_hcd_init(void)
 	if (usb_disabled())
 		return -ENODEV;
 
-	set_bit(USB_EHCI_LOADED, &usb_hcds_loaded);
-	if (test_bit(USB_UHCI_LOADED, &usb_hcds_loaded) ||
-			test_bit(USB_OHCI_LOADED, &usb_hcds_loaded))
-		pr_warn("Warning! fotg210_hcd should always be loaded before uhci_hcd and ohci_hcd, not after\n");
-
 	pr_debug("%s: block sizes: qh %zd qtd %zd itd %zd\n",
 			hcd_name, sizeof(struct fotg210_qh),
 			sizeof(struct fotg210_qtd),
@@ -5643,5 +5638,4 @@ int __init fotg210_hcd_init(void)
 void __exit fotg210_hcd_cleanup(void)
 {
 	debugfs_remove(fotg210_debug_root);
-	clear_bit(USB_EHCI_LOADED, &usb_hcds_loaded);
 }
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
index 6d1d190c914d..3c46bb18c7f3 100644
--- a/drivers/usb/host/ehci-hcd.c
+++ b/drivers/usb/host/ehci-hcd.c
@@ -1354,12 +1354,6 @@ static int __init ehci_hcd_init(void)
 	if (usb_disabled())
 		return -ENODEV;
 
-	set_bit(USB_EHCI_LOADED, &usb_hcds_loaded);
-	if (test_bit(USB_UHCI_LOADED, &usb_hcds_loaded) ||
-			test_bit(USB_OHCI_LOADED, &usb_hcds_loaded))
-		printk(KERN_WARNING "Warning! ehci_hcd should always be loaded"
-				" before uhci_hcd and ohci_hcd, not after\n");
-
 	pr_debug("%s: block sizes: qh %zd qtd %zd itd %zd sitd %zd\n",
 		 hcd_name,
 		 sizeof(struct ehci_qh), sizeof(struct ehci_qtd),
@@ -1390,7 +1384,6 @@ static int __init ehci_hcd_init(void)
 	debugfs_remove(ehci_debug_root);
 	ehci_debug_root = NULL;
 #endif
-	clear_bit(USB_EHCI_LOADED, &usb_hcds_loaded);
 	return retval;
 }
 module_init(ehci_hcd_init);
@@ -1404,6 +1397,5 @@ static void __exit ehci_hcd_cleanup(void)
 #ifdef CONFIG_DYNAMIC_DEBUG
 	debugfs_remove(ehci_debug_root);
 #endif
-	clear_bit(USB_EHCI_LOADED, &usb_hcds_loaded);
 }
 module_exit(ehci_hcd_cleanup);
diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c
index 9c7f3008646e..30840922f729 100644
--- a/drivers/usb/host/ohci-hcd.c
+++ b/drivers/usb/host/ohci-hcd.c
@@ -1282,7 +1282,6 @@ static int __init ohci_hcd_mod_init(void)
 
 	pr_debug ("%s: block sizes: ed %zd td %zd\n", hcd_name,
 		sizeof (struct ed), sizeof (struct td));
-	set_bit(USB_OHCI_LOADED, &usb_hcds_loaded);
 
 	ohci_debug_root = debugfs_create_dir("ohci", usb_debug_root);
 
@@ -1332,7 +1331,6 @@ static int __init ohci_hcd_mod_init(void)
 	debugfs_remove(ohci_debug_root);
 	ohci_debug_root = NULL;
 
-	clear_bit(USB_OHCI_LOADED, &usb_hcds_loaded);
 	return retval;
 }
 module_init(ohci_hcd_mod_init);
@@ -1352,7 +1350,6 @@ static void __exit ohci_hcd_mod_exit(void)
 	ps3_ohci_driver_unregister(&PS3_SYSTEM_BUS_DRIVER);
 #endif
 	debugfs_remove(ohci_debug_root);
-	clear_bit(USB_OHCI_LOADED, &usb_hcds_loaded);
 }
 module_exit(ohci_hcd_mod_exit);
 
diff --git a/drivers/usb/host/uhci-hcd.c b/drivers/usb/host/uhci-hcd.c
index 14e6dfef16c6..8bb11109b66c 100644
--- a/drivers/usb/host/uhci-hcd.c
+++ b/drivers/usb/host/uhci-hcd.c
@@ -867,8 +867,6 @@ static int __init uhci_hcd_init(void)
 	if (usb_disabled())
 		return -ENODEV;
 
-	set_bit(USB_UHCI_LOADED, &usb_hcds_loaded);
-
 #ifdef CONFIG_DYNAMIC_DEBUG
 	errbuf = kmalloc(ERRBUF_LEN, GFP_KERNEL);
 	if (!errbuf)
@@ -912,8 +910,6 @@ static int __init uhci_hcd_init(void)
 
 errbuf_failed:
 #endif
-
-	clear_bit(USB_UHCI_LOADED, &usb_hcds_loaded);
 	return retval;
 }
 
@@ -930,7 +926,6 @@ static void __exit uhci_hcd_cleanup(void)
 #ifdef CONFIG_DYNAMIC_DEBUG
 	kfree(errbuf);
 #endif
-	clear_bit(USB_UHCI_LOADED, &usb_hcds_loaded);
 }
 
 module_init(uhci_hcd_init);
diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h
index ac95e7c89df5..181db044c4d2 100644
--- a/include/linux/usb/hcd.h
+++ b/include/linux/usb/hcd.h
@@ -760,12 +760,6 @@ static inline void usbmon_urb_complete(struct usb_bus *bus, struct urb *urb,
  */
 extern struct rw_semaphore ehci_cf_port_reset_rwsem;
 
-/* Keep track of which host controller drivers are loaded */
-#define USB_UHCI_LOADED		0
-#define USB_OHCI_LOADED		1
-#define USB_EHCI_LOADED		2
-extern unsigned long usb_hcds_loaded;
-
 #endif /* __KERNEL__ */
 
 #endif /* __USB_CORE_HCD_H */
-- 
2.52.0
Re: [PATCH] USB: HCD: remove logic about which hcd is loaded
Posted by 陈华才 4 weeks ago


> -----原始邮件-----
> 发件人: "Greg Kroah-Hartman" <gregkh@linuxfoundation.org>
> 发送时间:2026-01-07 23:25:40 (星期三)
> 收件人: linux-usb@vger.kernel.org
> 抄送: linux-kernel@vger.kernel.org, "Greg Kroah-Hartman" <gregkh@linuxfoundation.org>, "Huacai Chen" <chenhuacai@loongson.cn>, "Alan Stern" <stern@rowland.harvard.edu>
> 主题: [PATCH] USB: HCD: remove logic about which hcd is loaded
> 
> It turns out that warning about which USB host controller is loaded
> before another one doesn't really matter.  All that really is needed is
> the PCI softdep module loading logic, which has been present in the
> kernel ever since commit 05c92da0c524 ("usb: ohci/uhci - add soft
> dependencies on ehci_pci")
> 
> So remove the warning messages, they are not useful, not needed, and
> only confuse people.  As can be seen in the discussion at
> https://lore.kernel.org/r/20251230080014.3934590-1-chenhuacai@loongson.cn
> 
> Cc: Huacai Chen <chenhuacai@loongson.cn>
> Suggested-by: Alan Stern <stern@rowland.harvard.edu>
> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Huacai Chen <chenhuacai@loongson.cn>

And it should be backported to stable branches?

Huacai

> ---
>  drivers/usb/core/hcd.c            | 4 ----
>  drivers/usb/fotg210/fotg210-hcd.c | 6 ------
>  drivers/usb/host/ehci-hcd.c       | 8 --------
>  drivers/usb/host/ohci-hcd.c       | 3 ---
>  drivers/usb/host/uhci-hcd.c       | 5 -----
>  include/linux/usb/hcd.h           | 6 ------
>  6 files changed, 32 deletions(-)
> 
> diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
> index 24feb0de1c00..2d99a59d9f3f 100644
> --- a/drivers/usb/core/hcd.c
> +++ b/drivers/usb/core/hcd.c
> @@ -77,10 +77,6 @@
>  
>  /*-------------------------------------------------------------------------*/
>  
> -/* Keep track of which host controller drivers are loaded */
> -unsigned long usb_hcds_loaded;
> -EXPORT_SYMBOL_GPL(usb_hcds_loaded);
> -
>  /* host controllers we manage */
>  DEFINE_IDR (usb_bus_idr);
>  EXPORT_SYMBOL_GPL (usb_bus_idr);
> diff --git a/drivers/usb/fotg210/fotg210-hcd.c b/drivers/usb/fotg210/fotg210-hcd.c
> index 64c4965a160f..fbb5d590eab6 100644
> --- a/drivers/usb/fotg210/fotg210-hcd.c
> +++ b/drivers/usb/fotg210/fotg210-hcd.c
> @@ -5625,11 +5625,6 @@ int __init fotg210_hcd_init(void)
>  	if (usb_disabled())
>  		return -ENODEV;
>  
> -	set_bit(USB_EHCI_LOADED, &usb_hcds_loaded);
> -	if (test_bit(USB_UHCI_LOADED, &usb_hcds_loaded) ||
> -			test_bit(USB_OHCI_LOADED, &usb_hcds_loaded))
> -		pr_warn("Warning! fotg210_hcd should always be loaded before uhci_hcd and ohci_hcd, not after\n");
> -
>  	pr_debug("%s: block sizes: qh %zd qtd %zd itd %zd\n",
>  			hcd_name, sizeof(struct fotg210_qh),
>  			sizeof(struct fotg210_qtd),
> @@ -5643,5 +5638,4 @@ int __init fotg210_hcd_init(void)
>  void __exit fotg210_hcd_cleanup(void)
>  {
>  	debugfs_remove(fotg210_debug_root);
> -	clear_bit(USB_EHCI_LOADED, &usb_hcds_loaded);
>  }
> diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c
> index 6d1d190c914d..3c46bb18c7f3 100644
> --- a/drivers/usb/host/ehci-hcd.c
> +++ b/drivers/usb/host/ehci-hcd.c
> @@ -1354,12 +1354,6 @@ static int __init ehci_hcd_init(void)
>  	if (usb_disabled())
>  		return -ENODEV;
>  
> -	set_bit(USB_EHCI_LOADED, &usb_hcds_loaded);
> -	if (test_bit(USB_UHCI_LOADED, &usb_hcds_loaded) ||
> -			test_bit(USB_OHCI_LOADED, &usb_hcds_loaded))
> -		printk(KERN_WARNING "Warning! ehci_hcd should always be loaded"
> -				" before uhci_hcd and ohci_hcd, not after\n");
> -
>  	pr_debug("%s: block sizes: qh %zd qtd %zd itd %zd sitd %zd\n",
>  		 hcd_name,
>  		 sizeof(struct ehci_qh), sizeof(struct ehci_qtd),
> @@ -1390,7 +1384,6 @@ static int __init ehci_hcd_init(void)
>  	debugfs_remove(ehci_debug_root);
>  	ehci_debug_root = NULL;
>  #endif
> -	clear_bit(USB_EHCI_LOADED, &usb_hcds_loaded);
>  	return retval;
>  }
>  module_init(ehci_hcd_init);
> @@ -1404,6 +1397,5 @@ static void __exit ehci_hcd_cleanup(void)
>  #ifdef CONFIG_DYNAMIC_DEBUG
>  	debugfs_remove(ehci_debug_root);
>  #endif
> -	clear_bit(USB_EHCI_LOADED, &usb_hcds_loaded);
>  }
>  module_exit(ehci_hcd_cleanup);
> diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c
> index 9c7f3008646e..30840922f729 100644
> --- a/drivers/usb/host/ohci-hcd.c
> +++ b/drivers/usb/host/ohci-hcd.c
> @@ -1282,7 +1282,6 @@ static int __init ohci_hcd_mod_init(void)
>  
>  	pr_debug ("%s: block sizes: ed %zd td %zd\n", hcd_name,
>  		sizeof (struct ed), sizeof (struct td));
> -	set_bit(USB_OHCI_LOADED, &usb_hcds_loaded);
>  
>  	ohci_debug_root = debugfs_create_dir("ohci", usb_debug_root);
>  
> @@ -1332,7 +1331,6 @@ static int __init ohci_hcd_mod_init(void)
>  	debugfs_remove(ohci_debug_root);
>  	ohci_debug_root = NULL;
>  
> -	clear_bit(USB_OHCI_LOADED, &usb_hcds_loaded);
>  	return retval;
>  }
>  module_init(ohci_hcd_mod_init);
> @@ -1352,7 +1350,6 @@ static void __exit ohci_hcd_mod_exit(void)
>  	ps3_ohci_driver_unregister(&PS3_SYSTEM_BUS_DRIVER);
>  #endif
>  	debugfs_remove(ohci_debug_root);
> -	clear_bit(USB_OHCI_LOADED, &usb_hcds_loaded);
>  }
>  module_exit(ohci_hcd_mod_exit);
>  
> diff --git a/drivers/usb/host/uhci-hcd.c b/drivers/usb/host/uhci-hcd.c
> index 14e6dfef16c6..8bb11109b66c 100644
> --- a/drivers/usb/host/uhci-hcd.c
> +++ b/drivers/usb/host/uhci-hcd.c
> @@ -867,8 +867,6 @@ static int __init uhci_hcd_init(void)
>  	if (usb_disabled())
>  		return -ENODEV;
>  
> -	set_bit(USB_UHCI_LOADED, &usb_hcds_loaded);
> -
>  #ifdef CONFIG_DYNAMIC_DEBUG
>  	errbuf = kmalloc(ERRBUF_LEN, GFP_KERNEL);
>  	if (!errbuf)
> @@ -912,8 +910,6 @@ static int __init uhci_hcd_init(void)
>  
>  errbuf_failed:
>  #endif
> -
> -	clear_bit(USB_UHCI_LOADED, &usb_hcds_loaded);
>  	return retval;
>  }
>  
> @@ -930,7 +926,6 @@ static void __exit uhci_hcd_cleanup(void)
>  #ifdef CONFIG_DYNAMIC_DEBUG
>  	kfree(errbuf);
>  #endif
> -	clear_bit(USB_UHCI_LOADED, &usb_hcds_loaded);
>  }
>  
>  module_init(uhci_hcd_init);
> diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h
> index ac95e7c89df5..181db044c4d2 100644
> --- a/include/linux/usb/hcd.h
> +++ b/include/linux/usb/hcd.h
> @@ -760,12 +760,6 @@ static inline void usbmon_urb_complete(struct usb_bus *bus, struct urb *urb,
>   */
>  extern struct rw_semaphore ehci_cf_port_reset_rwsem;
>  
> -/* Keep track of which host controller drivers are loaded */
> -#define USB_UHCI_LOADED		0
> -#define USB_OHCI_LOADED		1
> -#define USB_EHCI_LOADED		2
> -extern unsigned long usb_hcds_loaded;
> -
>  #endif /* __KERNEL__ */
>  
>  #endif /* __USB_CORE_HCD_H */
> -- 
> 2.52.0


本邮件及其附件含有龙芯中科的商业秘密信息,仅限于发送给上面地址中列出的个人或群组。禁止任何其他人以任何形式使用(包括但不限于全部或部分地泄露、复制或散发)本邮件及其附件中的信息。如果您错收本邮件,请您立即电话或邮件通知发件人并删除本邮件。 
This email and its attachments contain confidential information from Loongson Technology , which is intended only for the person or entity whose address is listed above. Any use of the information contained herein in any way (including, but not limited to, total or partial disclosure, reproduction or dissemination) by persons other than the intended recipient(s) is prohibited. If you receive this email in error, please notify the sender by phone or email immediately and delete it. 


Re: [PATCH] USB: HCD: remove logic about which hcd is loaded
Posted by Greg Kroah-Hartman 4 weeks ago
On Sat, Jan 10, 2026 at 05:49:25PM +0800, 陈华才 wrote:
> 
> 
> 
> > -----原始邮件-----
> > 发件人: "Greg Kroah-Hartman" <gregkh@linuxfoundation.org>
> > 发送时间:2026-01-07 23:25:40 (星期三)
> > 收件人: linux-usb@vger.kernel.org
> > 抄送: linux-kernel@vger.kernel.org, "Greg Kroah-Hartman" <gregkh@linuxfoundation.org>, "Huacai Chen" <chenhuacai@loongson.cn>, "Alan Stern" <stern@rowland.harvard.edu>
> > 主题: [PATCH] USB: HCD: remove logic about which hcd is loaded
> > 
> > It turns out that warning about which USB host controller is loaded
> > before another one doesn't really matter.  All that really is needed is
> > the PCI softdep module loading logic, which has been present in the
> > kernel ever since commit 05c92da0c524 ("usb: ohci/uhci - add soft
> > dependencies on ehci_pci")
> > 
> > So remove the warning messages, they are not useful, not needed, and
> > only confuse people.  As can be seen in the discussion at
> > https://lore.kernel.org/r/20251230080014.3934590-1-chenhuacai@loongson.cn
> > 
> > Cc: Huacai Chen <chenhuacai@loongson.cn>
> > Suggested-by: Alan Stern <stern@rowland.harvard.edu>
> > Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> Reviewed-by: Huacai Chen <chenhuacai@loongson.cn>
> 
> And it should be backported to stable branches?

It doesn't change any behavior, so why would it be needed anywhere else?
It's just removing a message that people have been ignoring for a very
very long time :)

thanks,

greg k-h
Re: Re: [PATCH] USB: HCD: remove logic about which hcd is loaded
Posted by 陈华才 4 weeks ago


> -----原始邮件-----
> 发件人: "Greg Kroah-Hartman" <gregkh@linuxfoundation.org>
> 发送时间:2026-01-10 17:54:10 (星期六)
> 收件人: 陈华才 <chenhuacai@loongson.cn>
> 抄送: linux-usb@vger.kernel.org, linux-kernel@vger.kernel.org, "Alan Stern" <stern@rowland.harvard.edu>
> 主题: Re: [PATCH] USB: HCD: remove logic about which hcd is loaded
> 
> On Sat, Jan 10, 2026 at 05:49:25PM +0800, 陈华才 wrote:
> > 
> > 
> > 
> > > -----原始邮件-----
> > > 发件人: "Greg Kroah-Hartman" <gregkh@linuxfoundation.org>
> > > 发送时间:2026-01-07 23:25:40 (星期三)
> > > 收件人: linux-usb@vger.kernel.org
> > > 抄送: linux-kernel@vger.kernel.org, "Greg Kroah-Hartman" <gregkh@linuxfoundation.org>, "Huacai Chen" <chenhuacai@loongson.cn>, "Alan Stern" <stern@rowland.harvard.edu>
> > > 主题: [PATCH] USB: HCD: remove logic about which hcd is loaded
> > > 
> > > It turns out that warning about which USB host controller is loaded
> > > before another one doesn't really matter.  All that really is needed is
> > > the PCI softdep module loading logic, which has been present in the
> > > kernel ever since commit 05c92da0c524 ("usb: ohci/uhci - add soft
> > > dependencies on ehci_pci")
> > > 
> > > So remove the warning messages, they are not useful, not needed, and
> > > only confuse people.  As can be seen in the discussion at
> > > https://lore.kernel.org/r/20251230080014.3934590-1-chenhuacai@loongson.cn
> > > 
> > > Cc: Huacai Chen <chenhuacai@loongson.cn>
> > > Suggested-by: Alan Stern <stern@rowland.harvard.edu>
> > > Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
> > Reviewed-by: Huacai Chen <chenhuacai@loongson.cn>
> > 
> > And it should be backported to stable branches?
> 
> It doesn't change any behavior, so why would it be needed anywhere else?
> It's just removing a message that people have been ignoring for a very
> very long time :)
Because I (and others) don't want to see a bogus warning when I use LTS branches.

Huacai

> 
> thanks,
> 
> greg k-h


本邮件及其附件含有龙芯中科的商业秘密信息,仅限于发送给上面地址中列出的个人或群组。禁止任何其他人以任何形式使用(包括但不限于全部或部分地泄露、复制或散发)本邮件及其附件中的信息。如果您错收本邮件,请您立即电话或邮件通知发件人并删除本邮件。 
This email and its attachments contain confidential information from Loongson Technology , which is intended only for the person or entity whose address is listed above. Any use of the information contained herein in any way (including, but not limited to, total or partial disclosure, reproduction or dissemination) by persons other than the intended recipient(s) is prohibited. If you receive this email in error, please notify the sender by phone or email immediately and delete it. 


Re: Re: [PATCH] USB: HCD: remove logic about which hcd is loaded
Posted by Greg Kroah-Hartman 3 weeks, 6 days ago
On Sat, Jan 10, 2026 at 06:09:20PM +0800, 陈华才 wrote:
> 本邮件及其附件含有龙芯中科的商业秘密信息,仅限于发送给上面地址中列出的个人或群组。禁止任何其他人以任何形式使用(包括但不限于全部或部分地泄露、复制或散发)本邮件及其附件中的信息。如果您错收本邮件,请您立即电话或邮件通知发件人并删除本邮件。 
> This email and its attachments contain confidential information from Loongson Technology , which is intended only for the person or entity whose address is listed above. Any use of the information contained herein in any way (including, but not limited to, total or partial disclosure, reproduction or dissemination) by persons other than the intended recipient(s) is prohibited. If you receive this email in error, please notify the sender by phone or email immediately and delete it. 

Now deleted.