--- /dev/null
+From 935a9fee51c945b8942be2d7b4bae069167b4886 Mon Sep 17 00:00:00 2001
+From: Yinghai Lu <yinghai.lu@oracle.com>
+Date: Mon, 12 Dec 2011 12:39:14 -0800
+Subject: ibft: Fix finding IBFT ACPI table on UEFI
+
+From: Yinghai Lu <yinghai.lu@oracle.com>
+
+commit 935a9fee51c945b8942be2d7b4bae069167b4886 upstream.
+
+Found one system with UEFI/iBFT, kernel does not detect the iBFT during
+iscsi_ibft module loading.
+
+Root cause: on x86 (UEFI), we are calling of find_ibft_region() much earlier
+- specifically in setup_arch() before ACPI is enabled.
+
+Try to split acpi checking code out and call that later
+
+At that time ACPI iBFT already get permanent mapped with ioremap.
+So isa_virt_to_bus() will get wrong phys from right virt address.
+We could just skip that phys address printing.
+
+For legacy one, print the found address early.
+
+-v2: update comments and description according to Konrad.
+-v3: fix problem about module use case that is found by Konrad.
+-v4: use acpi_get_table() instead of acpi_table_parse() to handle module use case that is found by Konrad again..
+Signed-off-by: Yinghai Lu <yinghai@kernel.org>
+Signed-off-by: Konrad Rzeszutek Wilk <konrad@kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/firmware/iscsi_ibft.c | 42 +++++++++++++++++++++++++++++++++++--
+ drivers/firmware/iscsi_ibft_find.c | 26 +---------------------
+ 2 files changed, 42 insertions(+), 26 deletions(-)
+
+--- a/drivers/firmware/iscsi_ibft.c
++++ b/drivers/firmware/iscsi_ibft.c
+@@ -738,6 +738,37 @@ static void __exit ibft_exit(void)
+ ibft_cleanup();
+ }
+
++#ifdef CONFIG_ACPI
++static const struct {
++ char *sign;
++} ibft_signs[] = {
++ /*
++ * One spec says "IBFT", the other says "iBFT". We have to check
++ * for both.
++ */
++ { ACPI_SIG_IBFT },
++ { "iBFT" },
++};
++
++static void __init acpi_find_ibft_region(void)
++{
++ int i;
++ struct acpi_table_header *table = NULL;
++
++ if (acpi_disabled)
++ return;
++
++ for (i = 0; i < ARRAY_SIZE(ibft_signs) && !ibft_addr; i++) {
++ acpi_get_table(ibft_signs[i].sign, 0, &table);
++ ibft_addr = (struct acpi_table_ibft *)table;
++ }
++}
++#else
++static void __init acpi_find_ibft_region(void)
++{
++}
++#endif
++
+ /*
+ * ibft_init() - creates sysfs tree entries for the iBFT data.
+ */
+@@ -745,9 +776,16 @@ static int __init ibft_init(void)
+ {
+ int rc = 0;
+
++ /*
++ As on UEFI systems the setup_arch()/find_ibft_region()
++ is called before ACPI tables are parsed and it only does
++ legacy finding.
++ */
++ if (!ibft_addr)
++ acpi_find_ibft_region();
++
+ if (ibft_addr) {
+- printk(KERN_INFO "iBFT detected at 0x%llx.\n",
+- (u64)isa_virt_to_bus(ibft_addr));
++ pr_info("iBFT detected.\n");
+
+ rc = ibft_check_device();
+ if (rc)
+--- a/drivers/firmware/iscsi_ibft_find.c
++++ b/drivers/firmware/iscsi_ibft_find.c
+@@ -45,13 +45,6 @@ EXPORT_SYMBOL_GPL(ibft_addr);
+ static const struct {
+ char *sign;
+ } ibft_signs[] = {
+-#ifdef CONFIG_ACPI
+- /*
+- * One spec says "IBFT", the other says "iBFT". We have to check
+- * for both.
+- */
+- { ACPI_SIG_IBFT },
+-#endif
+ { "iBFT" },
+ { "BIFT" }, /* Broadcom iSCSI Offload */
+ };
+@@ -62,14 +55,6 @@ static const struct {
+ #define VGA_MEM 0xA0000 /* VGA buffer */
+ #define VGA_SIZE 0x20000 /* 128kB */
+
+-#ifdef CONFIG_ACPI
+-static int __init acpi_find_ibft(struct acpi_table_header *header)
+-{
+- ibft_addr = (struct acpi_table_ibft *)header;
+- return 0;
+-}
+-#endif /* CONFIG_ACPI */
+-
+ static int __init find_ibft_in_mem(void)
+ {
+ unsigned long pos;
+@@ -94,6 +79,7 @@ static int __init find_ibft_in_mem(void)
+ * the table cannot be valid. */
+ if (pos + len <= (IBFT_END-1)) {
+ ibft_addr = (struct acpi_table_ibft *)virt;
++ pr_info("iBFT found at 0x%lx.\n", pos);
+ goto done;
+ }
+ }
+@@ -108,20 +94,12 @@ done:
+ */
+ unsigned long __init find_ibft_region(unsigned long *sizep)
+ {
+-#ifdef CONFIG_ACPI
+- int i;
+-#endif
+ ibft_addr = NULL;
+
+-#ifdef CONFIG_ACPI
+- for (i = 0; i < ARRAY_SIZE(ibft_signs) && !ibft_addr; i++)
+- acpi_table_parse(ibft_signs[i].sign, acpi_find_ibft);
+-#endif /* CONFIG_ACPI */
+-
+ /* iBFT 1.03 section 1.4.3.1 mandates that UEFI machines will
+ * only use ACPI for this */
+
+- if (!ibft_addr && !efi_enabled)
++ if (!efi_enabled)
+ find_ibft_in_mem();
+
+ if (ibft_addr) {
fuse-fix-fuse_retrieve.patch
staging-r8712u-add-new-usb-id.patch
drm-radeon-kms-add-some-new-pci-ids.patch
+ibft-fix-finding-ibft-acpi-table-on-uefi.patch
+usb-cdc-acm-add-ids-for-motorola-h24-hspa-usb-module.patch
+usb-option-add-huawei-e398-controlling-interfaces.patch
+usb-option-removing-one-bogus-and-adding-some-new-huawei-combinations.patch
--- /dev/null
+From 6abff5dc4d5a2c90e597137ce8987e7fd439259b Mon Sep 17 00:00:00 2001
+From: Krzysztof Hałasa <khalasa@piap.pl>
+Date: Mon, 12 Dec 2011 14:51:00 +0100
+Subject: USB: cdc-acm: add IDs for Motorola H24 HSPA USB module.
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Krzysztof Hałasa <khalasa@piap.pl>
+
+commit 6abff5dc4d5a2c90e597137ce8987e7fd439259b upstream.
+
+Add USB IDs for Motorola H24 HSPA USB module.
+
+Signed-off-by: Krzysztof Hałasa <khalasa@piap.pl>
+Acked-by: Oliver Neukum <oneukum@suse.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/class/cdc-acm.c | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+--- a/drivers/usb/class/cdc-acm.c
++++ b/drivers/usb/class/cdc-acm.c
+@@ -1458,6 +1458,16 @@ static const struct usb_device_id acm_id
+ },
+ { USB_DEVICE(0x22b8, 0x6425), /* Motorola MOTOMAGX phones */
+ },
++ /* Motorola H24 HSPA module: */
++ { USB_DEVICE(0x22b8, 0x2d91) }, /* modem */
++ { USB_DEVICE(0x22b8, 0x2d92) }, /* modem + diagnostics */
++ { USB_DEVICE(0x22b8, 0x2d93) }, /* modem + AT port */
++ { USB_DEVICE(0x22b8, 0x2d95) }, /* modem + AT port + diagnostics */
++ { USB_DEVICE(0x22b8, 0x2d96) }, /* modem + NMEA */
++ { USB_DEVICE(0x22b8, 0x2d97) }, /* modem + diagnostics + NMEA */
++ { USB_DEVICE(0x22b8, 0x2d99) }, /* modem + AT port + NMEA */
++ { USB_DEVICE(0x22b8, 0x2d9a) }, /* modem + AT port + diagnostics + NMEA */
++
+ { USB_DEVICE(0x0572, 0x1329), /* Hummingbird huc56s (Conexant) */
+ .driver_info = NO_UNION_NORMAL, /* union descriptor misplaced on
+ data interface instead of
--- /dev/null
+From 414b591fd16655871e9f5592a55368b10a3ccc30 Mon Sep 17 00:00:00 2001
+From: Alex Hermann <alex@wenlex.nl>
+Date: Mon, 12 Dec 2011 21:42:23 +0100
+Subject: usb: option: Add Huawei E398 controlling interfaces
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Alex Hermann <alex@wenlex.nl>
+
+commit 414b591fd16655871e9f5592a55368b10a3ccc30 upstream.
+
+This patch adds the controlling interfaces for the Huawei E398.
+
+Thanks to Bjørn Mork <bjorn@mork.no> for extracting the interface
+numbers from the windows driver.
+
+Signed-off-by: Alex Hermann <alex@wenlex.nl>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/serial/option.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+--- a/drivers/usb/serial/option.c
++++ b/drivers/usb/serial/option.c
+@@ -660,6 +660,9 @@ static const struct usb_device_id option
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x01, 0x02) },
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x01, 0x03) },
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x01, 0x08) },
++ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x02, 0x01) }, /* E398 3G Modem */
++ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x02, 0x02) }, /* E398 3G PC UI Interface */
++ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x02, 0x03) }, /* E398 3G Application Interface */
+ { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V640) },
+ { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V620) },
+ { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V740) },
--- /dev/null
+From 02a551c9755b799579e0a093bcc99b80b4dc1453 Mon Sep 17 00:00:00 2001
+From: Bjørn Mork <bjorn@mork.no>
+Date: Tue, 13 Dec 2011 05:33:02 +0100
+Subject: USB: option: Removing one bogus and adding some new Huawei combinations
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Bjørn Mork <bjorn@mork.no>
+
+commit 02a551c9755b799579e0a093bcc99b80b4dc1453 upstream.
+
+Huawei use the product code HUAWEI_PRODUCT_E353 (0x1506) for a
+number of different devices, which each can appear with a number
+of different descriptor sets. Different types of interfaces
+can be identified by looking at the subclass and protocol fields
+
+Subclass 1 protocol 8 is actually the data interface of a CDC
+ECM set, with subclass 1 protocol 9 as the control interface.
+Neither support serial data communcation, and cannot therefore
+be supported by this driver.
+
+At the same time, add a few other sets which appear if the
+device is configured in "Windows mode" using this modeswitch
+message:
+55534243000000000000000000000011060000000100000000000000000000
+
+Signed-off-by: Bjørn Mork <bjorn@mork.no>
+Cc: stable <stable@vger.kernel.org>
+Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
+
+---
+ drivers/usb/serial/option.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+--- a/drivers/usb/serial/option.c
++++ b/drivers/usb/serial/option.c
+@@ -659,7 +659,9 @@ static const struct usb_device_id option
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x01, 0x01) },
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x01, 0x02) },
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x01, 0x03) },
+- { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x01, 0x08) },
++ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x01, 0x10) },
++ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x01, 0x12) },
++ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x01, 0x13) },
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x02, 0x01) }, /* E398 3G Modem */
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x02, 0x02) }, /* E398 3G PC UI Interface */
+ { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x02, 0x03) }, /* E398 3G Application Interface */