Update patches for v5.1
This commit is contained in:
parent
2b206b56e1
commit
79dec2382a
4139
patches/5.1/0001-surface-acpi.patch
Normal file
4139
patches/5.1/0001-surface-acpi.patch
Normal file
File diff suppressed because it is too large
Load diff
145
patches/5.1/0002-suspend.patch
Normal file
145
patches/5.1/0002-suspend.patch
Normal file
|
@ -0,0 +1,145 @@
|
||||||
|
From 3fe86ef98282f3509f77b2b454447d792f18b7b8 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Maximilian Luz <luzmaximilian@gmail.com>
|
||||||
|
Date: Thu, 16 May 2019 00:56:09 +0200
|
||||||
|
Subject: [PATCH 02/12] suspend
|
||||||
|
|
||||||
|
---
|
||||||
|
drivers/nvme/host/nvme.h | 5 +++++
|
||||||
|
drivers/nvme/host/pci.c | 10 +++++++++-
|
||||||
|
drivers/pci/quirks.c | 4 ++++
|
||||||
|
include/linux/pci_ids.h | 2 ++
|
||||||
|
kernel/power/suspend.c | 11 +++++++++++
|
||||||
|
kernel/sysctl.c | 9 +++++++++
|
||||||
|
6 files changed, 40 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/nvme/host/nvme.h b/drivers/nvme/host/nvme.h
|
||||||
|
index 527d64545023..35840869c8d4 100644
|
||||||
|
--- a/drivers/nvme/host/nvme.h
|
||||||
|
+++ b/drivers/nvme/host/nvme.h
|
||||||
|
@@ -92,6 +92,11 @@ enum nvme_quirks {
|
||||||
|
* Broken Write Zeroes.
|
||||||
|
*/
|
||||||
|
NVME_QUIRK_DISABLE_WRITE_ZEROES = (1 << 9),
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * Do not disable nvme when suspending (s2idle)
|
||||||
|
+ */
|
||||||
|
+ NVME_QUIRK_NO_DISABLE = (1 << 10),
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
|
||||||
|
index a90cf5d63aac..de5d5a2b1d38 100644
|
||||||
|
--- a/drivers/nvme/host/pci.c
|
||||||
|
+++ b/drivers/nvme/host/pci.c
|
||||||
|
@@ -23,6 +23,7 @@
|
||||||
|
#include <linux/io-64-nonatomic-lo-hi.h>
|
||||||
|
#include <linux/sed-opal.h>
|
||||||
|
#include <linux/pci-p2pdma.h>
|
||||||
|
+#include <linux/suspend.h>
|
||||||
|
|
||||||
|
#include "trace.h"
|
||||||
|
#include "nvme.h"
|
||||||
|
@@ -2850,8 +2851,11 @@ static int nvme_suspend(struct device *dev)
|
||||||
|
{
|
||||||
|
struct pci_dev *pdev = to_pci_dev(dev);
|
||||||
|
struct nvme_dev *ndev = pci_get_drvdata(pdev);
|
||||||
|
+ struct nvme_ctrl *ctrl = &ndev->ctrl;
|
||||||
|
+
|
||||||
|
+ if (!(pm_suspend_via_s2idle() && (ctrl->quirks & NVME_QUIRK_NO_DISABLE)))
|
||||||
|
+ nvme_dev_disable(ndev, true);
|
||||||
|
|
||||||
|
- nvme_dev_disable(ndev, true);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -2957,6 +2961,10 @@ static const struct pci_device_id nvme_id_table[] = {
|
||||||
|
.driver_data = NVME_QUIRK_LIGHTNVM, },
|
||||||
|
{ PCI_DEVICE(0x1d1d, 0x2601), /* CNEX Granby */
|
||||||
|
.driver_data = NVME_QUIRK_LIGHTNVM, },
|
||||||
|
+ { PCI_VDEVICE(SK_HYNIX, 0x1527), /* Sk Hynix */
|
||||||
|
+ .driver_data = NVME_QUIRK_NO_DISABLE, },
|
||||||
|
+ { PCI_VDEVICE(TOSHIBA, 0x010f), /* TOSHIBA NVMe found on Surface Book with Performance Base */
|
||||||
|
+ .driver_data = NVME_QUIRK_NO_DISABLE, },
|
||||||
|
{ PCI_DEVICE_CLASS(PCI_CLASS_STORAGE_EXPRESS, 0xffffff) },
|
||||||
|
{ PCI_DEVICE(PCI_VENDOR_ID_APPLE, 0x2001) },
|
||||||
|
{ PCI_DEVICE(PCI_VENDOR_ID_APPLE, 0x2003) },
|
||||||
|
diff --git a/drivers/pci/quirks.c b/drivers/pci/quirks.c
|
||||||
|
index a077f67fe1da..f8be239321a9 100644
|
||||||
|
--- a/drivers/pci/quirks.c
|
||||||
|
+++ b/drivers/pci/quirks.c
|
||||||
|
@@ -1357,6 +1357,10 @@ DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_AL, PCI_ANY_ID,
|
||||||
|
occur when mode detecting */
|
||||||
|
DECLARE_PCI_FIXUP_CLASS_EARLY(PCI_VENDOR_ID_VIA, PCI_ANY_ID,
|
||||||
|
PCI_CLASS_STORAGE_IDE, 8, quirk_no_ata_d3);
|
||||||
|
+DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SK_HYNIX, 0x1527, quirk_no_ata_d3);
|
||||||
|
+/* TOSHIBA NVMe disk found on Surface Book with Performance Base
|
||||||
|
+ cannot wakeup from D3 state after s2idle */
|
||||||
|
+DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_TOSHIBA, 0x010f, quirk_no_ata_d3);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This was originally an Alpha-specific thing, but it really fits here.
|
||||||
|
diff --git a/include/linux/pci_ids.h b/include/linux/pci_ids.h
|
||||||
|
index 70e86148cb1e..44e07bd7e7ee 100644
|
||||||
|
--- a/include/linux/pci_ids.h
|
||||||
|
+++ b/include/linux/pci_ids.h
|
||||||
|
@@ -3102,4 +3102,6 @@
|
||||||
|
|
||||||
|
#define PCI_VENDOR_ID_NCUBE 0x10ff
|
||||||
|
|
||||||
|
+#define PCI_VENDOR_ID_SK_HYNIX 0x1c5c
|
||||||
|
+
|
||||||
|
#endif /* _LINUX_PCI_IDS_H */
|
||||||
|
diff --git a/kernel/power/suspend.c b/kernel/power/suspend.c
|
||||||
|
index 0bd595a0b610..a8385e8894a5 100644
|
||||||
|
--- a/kernel/power/suspend.c
|
||||||
|
+++ b/kernel/power/suspend.c
|
||||||
|
@@ -526,6 +526,8 @@ int suspend_devices_and_enter(suspend_state_t state)
|
||||||
|
goto Resume_devices;
|
||||||
|
}
|
||||||
|
|
||||||
|
+unsigned int resume_delay = 3000;
|
||||||
|
+
|
||||||
|
/**
|
||||||
|
* suspend_finish - Clean up before finishing the suspend sequence.
|
||||||
|
*
|
||||||
|
@@ -534,6 +536,15 @@ int suspend_devices_and_enter(suspend_state_t state)
|
||||||
|
*/
|
||||||
|
static void suspend_finish(void)
|
||||||
|
{
|
||||||
|
+ if (resume_delay) {
|
||||||
|
+ /* Give kernel threads a head start, such that usb-storage
|
||||||
|
+ * can detect devices before syslog attempts to write log
|
||||||
|
+ * messages from the suspend code.
|
||||||
|
+ */
|
||||||
|
+ thaw_kernel_threads();
|
||||||
|
+ pr_debug("PM: Sleeping for %d milliseconds.\n", resume_delay);
|
||||||
|
+ msleep(resume_delay);
|
||||||
|
+ }
|
||||||
|
suspend_thaw_processes();
|
||||||
|
pm_notifier_call_chain(PM_POST_SUSPEND);
|
||||||
|
pm_restore_console();
|
||||||
|
diff --git a/kernel/sysctl.c b/kernel/sysctl.c
|
||||||
|
index c9ec050bcf46..155e94652093 100644
|
||||||
|
--- a/kernel/sysctl.c
|
||||||
|
+++ b/kernel/sysctl.c
|
||||||
|
@@ -321,7 +321,16 @@ static int min_extfrag_threshold;
|
||||||
|
static int max_extfrag_threshold = 1000;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+extern unsigned int resume_delay;
|
||||||
|
+
|
||||||
|
static struct ctl_table kern_table[] = {
|
||||||
|
+ {
|
||||||
|
+ .procname = "resume_delay",
|
||||||
|
+ .data = &resume_delay,
|
||||||
|
+ .maxlen = sizeof(unsigned int),
|
||||||
|
+ .mode = 0644,
|
||||||
|
+ .proc_handler = proc_dointvec,
|
||||||
|
+ },
|
||||||
|
{
|
||||||
|
.procname = "sched_child_runs_first",
|
||||||
|
.data = &sysctl_sched_child_runs_first,
|
||||||
|
--
|
||||||
|
2.21.0
|
||||||
|
|
257
patches/5.1/0003-buttons.patch
Normal file
257
patches/5.1/0003-buttons.patch
Normal file
|
@ -0,0 +1,257 @@
|
||||||
|
From 7b0b4c6986dff87b46e9118da1aadce5f7ee50f4 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Maximilian Luz <luzmaximilian@gmail.com>
|
||||||
|
Date: Thu, 16 May 2019 00:57:01 +0200
|
||||||
|
Subject: [PATCH 03/12] buttons
|
||||||
|
|
||||||
|
---
|
||||||
|
drivers/input/misc/soc_button_array.c | 133 ++++++++++++++++++++--
|
||||||
|
drivers/platform/x86/surfacepro3_button.c | 38 +++++++
|
||||||
|
2 files changed, 159 insertions(+), 12 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/input/misc/soc_button_array.c b/drivers/input/misc/soc_button_array.c
|
||||||
|
index bb458beecb43..e35580655cd0 100644
|
||||||
|
--- a/drivers/input/misc/soc_button_array.c
|
||||||
|
+++ b/drivers/input/misc/soc_button_array.c
|
||||||
|
@@ -29,6 +29,17 @@ struct soc_button_info {
|
||||||
|
bool wakeup;
|
||||||
|
};
|
||||||
|
|
||||||
|
+/**
|
||||||
|
+ * struct soc_device_data - driver data for different device types
|
||||||
|
+ * @button_info: specifications of buttons, if NULL specification is assumed to
|
||||||
|
+ * be present in _DSD
|
||||||
|
+ * @check: device-specific check (NULL means all will be accepted)
|
||||||
|
+ */
|
||||||
|
+struct soc_device_data {
|
||||||
|
+ struct soc_button_info *button_info;
|
||||||
|
+ int (*check)(struct device *dev);
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* Some of the buttons like volume up/down are auto repeat, while others
|
||||||
|
* are not. To support both, we register two platform devices, and put
|
||||||
|
@@ -314,6 +325,7 @@ static int soc_button_probe(struct platform_device *pdev)
|
||||||
|
{
|
||||||
|
struct device *dev = &pdev->dev;
|
||||||
|
const struct acpi_device_id *id;
|
||||||
|
+ struct soc_device_data *device_data;
|
||||||
|
struct soc_button_info *button_info;
|
||||||
|
struct soc_button_data *priv;
|
||||||
|
struct platform_device *pd;
|
||||||
|
@@ -324,18 +336,19 @@ static int soc_button_probe(struct platform_device *pdev)
|
||||||
|
if (!id)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
|
- if (!id->driver_data) {
|
||||||
|
+ device_data = (struct soc_device_data *)id->driver_data;
|
||||||
|
+ if (device_data && device_data->check) {
|
||||||
|
+ error = device_data->check(dev);
|
||||||
|
+ if (error)
|
||||||
|
+ return error;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (device_data && device_data->button_info) {
|
||||||
|
+ button_info = (struct soc_button_info *)device_data->button_info;
|
||||||
|
+ } else {
|
||||||
|
button_info = soc_button_get_button_info(dev);
|
||||||
|
if (IS_ERR(button_info))
|
||||||
|
return PTR_ERR(button_info);
|
||||||
|
- } else {
|
||||||
|
- button_info = (struct soc_button_info *)id->driver_data;
|
||||||
|
- }
|
||||||
|
-
|
||||||
|
- error = gpiod_count(dev, NULL);
|
||||||
|
- if (error < 0) {
|
||||||
|
- dev_dbg(dev, "no GPIO attached, ignoring...\n");
|
||||||
|
- return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
|
||||||
|
@@ -361,12 +374,32 @@ static int soc_button_probe(struct platform_device *pdev)
|
||||||
|
if (!priv->children[0] && !priv->children[1])
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
|
- if (!id->driver_data)
|
||||||
|
+ if (!device_data || !device_data->button_info)
|
||||||
|
devm_kfree(dev, button_info);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
+
|
||||||
|
+static int soc_device_check_generic(struct device *dev)
|
||||||
|
+{
|
||||||
|
+ int gpios;
|
||||||
|
+
|
||||||
|
+ gpios = gpiod_count(dev, NULL);
|
||||||
|
+ if (gpios < 0) {
|
||||||
|
+ dev_dbg(dev, "no GPIO attached, ignoring...\n");
|
||||||
|
+ return -ENODEV;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static struct soc_device_data soc_device_ACPI0011 = {
|
||||||
|
+ .button_info = NULL,
|
||||||
|
+ .check = soc_device_check_generic,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+
|
||||||
|
/*
|
||||||
|
* Definition of buttons on the tablet. The ACPI index of each button
|
||||||
|
* is defined in section 2.8.7.2 of "Windows ACPI Design Guide for SoC
|
||||||
|
@@ -381,9 +414,85 @@ static struct soc_button_info soc_button_PNP0C40[] = {
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
+static struct soc_device_data soc_device_PNP0C40 = {
|
||||||
|
+ .button_info = soc_button_PNP0C40,
|
||||||
|
+ .check = soc_device_check_generic,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * Special device check for Surface Book 2 and Surface Pro (2017).
|
||||||
|
+ * Both, the Surface Pro 4 (surfacepro3_button.c) and the above mentioned
|
||||||
|
+ * devices use MSHW0040 for power and volume buttons, however the way they
|
||||||
|
+ * have to be addressed differs. Make sure that we only load this drivers
|
||||||
|
+ * for the correct devices by checking the OEM Platform Revision provided by
|
||||||
|
+ * the _DSM method.
|
||||||
|
+ */
|
||||||
|
+#define MSHW0040_DSM_REVISION 0x01
|
||||||
|
+#define MSHW0040_DSM_GET_OMPR 0x02 // get OEM Platform Revision
|
||||||
|
+static const guid_t MSHW0040_DSM_UUID =
|
||||||
|
+ GUID_INIT(0x6fd05c69, 0xcde3, 0x49f4, 0x95, 0xed, 0xab, 0x16, 0x65,
|
||||||
|
+ 0x49, 0x80, 0x35);
|
||||||
|
+
|
||||||
|
+static int soc_device_check_MSHW0040(struct device *dev)
|
||||||
|
+{
|
||||||
|
+ acpi_handle handle = ACPI_HANDLE(dev);
|
||||||
|
+ union acpi_object *result;
|
||||||
|
+ u64 oem_platform_rev = 0;
|
||||||
|
+ int gpios;
|
||||||
|
+
|
||||||
|
+ // get OEM platform revision
|
||||||
|
+ result = acpi_evaluate_dsm_typed(handle, &MSHW0040_DSM_UUID,
|
||||||
|
+ MSHW0040_DSM_REVISION,
|
||||||
|
+ MSHW0040_DSM_GET_OMPR, NULL,
|
||||||
|
+ ACPI_TYPE_INTEGER);
|
||||||
|
+
|
||||||
|
+ if (result) {
|
||||||
|
+ oem_platform_rev = result->integer.value;
|
||||||
|
+ ACPI_FREE(result);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (oem_platform_rev == 0)
|
||||||
|
+ return -ENODEV;
|
||||||
|
+
|
||||||
|
+ dev_dbg(dev, "OEM Platform Revision %llu\n", oem_platform_rev);
|
||||||
|
+
|
||||||
|
+ /*
|
||||||
|
+ * We are _really_ expecting GPIOs here. If we do not get any, this
|
||||||
|
+ * means the GPIO driver has not been loaded yet (which can happen).
|
||||||
|
+ * Try again later.
|
||||||
|
+ */
|
||||||
|
+ gpios = gpiod_count(dev, NULL);
|
||||||
|
+ if (gpios < 0)
|
||||||
|
+ return -EAGAIN;
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * Button infos for Microsoft Surface Book 2 and Surface Pro (2017).
|
||||||
|
+ * Obtained from DSDT/testing.
|
||||||
|
+ */
|
||||||
|
+static struct soc_button_info soc_button_MSHW0040[] = {
|
||||||
|
+ { "power", 0, EV_KEY, KEY_POWER, false, true },
|
||||||
|
+ { "volume_up", 2, EV_KEY, KEY_VOLUMEUP, true, false },
|
||||||
|
+ { "volume_down", 4, EV_KEY, KEY_VOLUMEDOWN, true, false },
|
||||||
|
+ { }
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static struct soc_device_data soc_device_MSHW0040 = {
|
||||||
|
+ .button_info = soc_button_MSHW0040,
|
||||||
|
+ .check = soc_device_check_MSHW0040,
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+
|
||||||
|
static const struct acpi_device_id soc_button_acpi_match[] = {
|
||||||
|
- { "PNP0C40", (unsigned long)soc_button_PNP0C40 },
|
||||||
|
- { "ACPI0011", 0 },
|
||||||
|
+ { "PNP0C40", (unsigned long)&soc_device_PNP0C40 },
|
||||||
|
+ { "ACPI0011", (unsigned long)&soc_device_ACPI0011 },
|
||||||
|
+
|
||||||
|
+ /* Microsoft Surface Devices (5th and 6th generation) */
|
||||||
|
+ { "MSHW0040", (unsigned long)&soc_device_MSHW0040 },
|
||||||
|
+
|
||||||
|
{ }
|
||||||
|
};
|
||||||
|
|
||||||
|
diff --git a/drivers/platform/x86/surfacepro3_button.c b/drivers/platform/x86/surfacepro3_button.c
|
||||||
|
index 1b491690ce07..eaec30380b11 100644
|
||||||
|
--- a/drivers/platform/x86/surfacepro3_button.c
|
||||||
|
+++ b/drivers/platform/x86/surfacepro3_button.c
|
||||||
|
@@ -24,6 +24,12 @@
|
||||||
|
#define SURFACE_BUTTON_OBJ_NAME "VGBI"
|
||||||
|
#define SURFACE_BUTTON_DEVICE_NAME "Surface Pro 3/4 Buttons"
|
||||||
|
|
||||||
|
+#define MSHW0040_DSM_REVISION 0x01
|
||||||
|
+#define MSHW0040_DSM_GET_OMPR 0x02 // get OEM Platform Revision
|
||||||
|
+static const guid_t MSHW0040_DSM_UUID =
|
||||||
|
+ GUID_INIT(0x6fd05c69, 0xcde3, 0x49f4, 0x95, 0xed, 0xab, 0x16, 0x65,
|
||||||
|
+ 0x49, 0x80, 0x35);
|
||||||
|
+
|
||||||
|
#define SURFACE_BUTTON_NOTIFY_TABLET_MODE 0xc8
|
||||||
|
|
||||||
|
#define SURFACE_BUTTON_NOTIFY_PRESS_POWER 0xc6
|
||||||
|
@@ -146,6 +152,34 @@ static int surface_button_resume(struct device *dev)
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+/*
|
||||||
|
+ * Surface Pro 4 and Surface Book 2 / Surface Pro 2017 use the same device
|
||||||
|
+ * ID (MSHW0040) for the power/volume buttons. Make sure this is the right
|
||||||
|
+ * device by checking for the _DSM method and OEM Platform Revision.
|
||||||
|
+ */
|
||||||
|
+static int surface_button_check_MSHW0040(struct acpi_device *dev)
|
||||||
|
+{
|
||||||
|
+ acpi_handle handle = dev->handle;
|
||||||
|
+ union acpi_object *result;
|
||||||
|
+ u64 oem_platform_rev = 0;
|
||||||
|
+
|
||||||
|
+ // get OEM platform revision
|
||||||
|
+ result = acpi_evaluate_dsm_typed(handle, &MSHW0040_DSM_UUID,
|
||||||
|
+ MSHW0040_DSM_REVISION,
|
||||||
|
+ MSHW0040_DSM_GET_OMPR,
|
||||||
|
+ NULL, ACPI_TYPE_INTEGER);
|
||||||
|
+
|
||||||
|
+ if (result) {
|
||||||
|
+ oem_platform_rev = result->integer.value;
|
||||||
|
+ ACPI_FREE(result);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ dev_dbg(&dev->dev, "OEM Platform Revision %llu\n", oem_platform_rev);
|
||||||
|
+
|
||||||
|
+ return oem_platform_rev == 0 ? 0 : -ENODEV;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+
|
||||||
|
static int surface_button_add(struct acpi_device *device)
|
||||||
|
{
|
||||||
|
struct surface_button *button;
|
||||||
|
@@ -158,6 +192,10 @@ static int surface_button_add(struct acpi_device *device)
|
||||||
|
strlen(SURFACE_BUTTON_OBJ_NAME)))
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
|
+ error = surface_button_check_MSHW0040(device);
|
||||||
|
+ if (error)
|
||||||
|
+ return error;
|
||||||
|
+
|
||||||
|
button = kzalloc(sizeof(struct surface_button), GFP_KERNEL);
|
||||||
|
if (!button)
|
||||||
|
return -ENOMEM;
|
||||||
|
--
|
||||||
|
2.21.0
|
||||||
|
|
2753
patches/5.1/0004-cameras.patch
Normal file
2753
patches/5.1/0004-cameras.patch
Normal file
File diff suppressed because it is too large
Load diff
6178
patches/5.1/0005-ipts.patch
Normal file
6178
patches/5.1/0005-ipts.patch
Normal file
File diff suppressed because it is too large
Load diff
151
patches/5.1/0006-hid.patch
Normal file
151
patches/5.1/0006-hid.patch
Normal file
|
@ -0,0 +1,151 @@
|
||||||
|
From 6cc9c83a79ad320d66c031be1b1be5fc75d893bf Mon Sep 17 00:00:00 2001
|
||||||
|
From: Maximilian Luz <luzmaximilian@gmail.com>
|
||||||
|
Date: Thu, 16 May 2019 01:03:32 +0200
|
||||||
|
Subject: [PATCH 06/12] hid
|
||||||
|
|
||||||
|
---
|
||||||
|
drivers/hid/hid-ids.h | 21 +++++++++----
|
||||||
|
drivers/hid/hid-microsoft.c | 3 +-
|
||||||
|
drivers/hid/hid-multitouch.c | 57 ++++++++++++++++++++++++++++++++++++
|
||||||
|
drivers/hid/hid-quirks.c | 11 +++++++
|
||||||
|
4 files changed, 86 insertions(+), 6 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
|
||||||
|
index adce58f24f76..5cc94abc677e 100644
|
||||||
|
--- a/drivers/hid/hid-ids.h
|
||||||
|
+++ b/drivers/hid/hid-ids.h
|
||||||
|
@@ -816,11 +816,22 @@
|
||||||
|
#define USB_DEVICE_ID_MS_DIGITAL_MEDIA_3KV1 0x0732
|
||||||
|
#define USB_DEVICE_ID_MS_DIGITAL_MEDIA_600 0x0750
|
||||||
|
#define USB_DEVICE_ID_MS_COMFORT_MOUSE_4500 0x076c
|
||||||
|
-#define USB_DEVICE_ID_MS_COMFORT_KEYBOARD 0x00e3
|
||||||
|
-#define USB_DEVICE_ID_MS_SURFACE_PRO_2 0x0799
|
||||||
|
-#define USB_DEVICE_ID_MS_TOUCH_COVER_2 0x07a7
|
||||||
|
-#define USB_DEVICE_ID_MS_TYPE_COVER_2 0x07a9
|
||||||
|
-#define USB_DEVICE_ID_MS_POWER_COVER 0x07da
|
||||||
|
+#define USB_DEVICE_ID_MS_COMFORT_KEYBOARD 0x00e3
|
||||||
|
+#define USB_DEVICE_ID_MS_SURFACE_PRO_2 0x0799
|
||||||
|
+#define USB_DEVICE_ID_MS_TOUCH_COVER_2 0x07a7
|
||||||
|
+#define USB_DEVICE_ID_MS_TYPE_COVER_2 0x07a9
|
||||||
|
+#define USB_DEVICE_ID_MS_TYPE_COVER_3 0x07de
|
||||||
|
+#define USB_DEVICE_ID_MS_TYPE_COVER_PRO_3 0x07dc
|
||||||
|
+#define USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_1 0x07de
|
||||||
|
+#define USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_2 0x07e2
|
||||||
|
+#define USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_JP 0x07dd
|
||||||
|
+#define USB_DEVICE_ID_MS_TYPE_COVER_PRO_4 0x07e8
|
||||||
|
+#define USB_DEVICE_ID_MS_TYPE_COVER_PRO_4_1 0x07e4
|
||||||
|
+#define USB_DEVICE_ID_MS_SURFACE_BOOK 0x07cd
|
||||||
|
+#define USB_DEVICE_ID_MS_SURFACE_BOOK_2 0x0922
|
||||||
|
+#define USB_DEVICE_ID_MS_SURFACE_GO 0x096f
|
||||||
|
+#define USB_DEVICE_ID_MS_SURFACE_VHF 0xf001
|
||||||
|
+#define USB_DEVICE_ID_MS_POWER_COVER 0x07da
|
||||||
|
#define USB_DEVICE_ID_MS_XBOX_ONE_S_CONTROLLER 0x02fd
|
||||||
|
#define USB_DEVICE_ID_MS_PIXART_MOUSE 0x00cb
|
||||||
|
|
||||||
|
diff --git a/drivers/hid/hid-microsoft.c b/drivers/hid/hid-microsoft.c
|
||||||
|
index 330cb073cb66..f45fea460678 100644
|
||||||
|
--- a/drivers/hid/hid-microsoft.c
|
||||||
|
+++ b/drivers/hid/hid-microsoft.c
|
||||||
|
@@ -441,7 +441,8 @@ static const struct hid_device_id ms_devices[] = {
|
||||||
|
.driver_data = MS_HIDINPUT },
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_COMFORT_KEYBOARD),
|
||||||
|
.driver_data = MS_ERGONOMY},
|
||||||
|
-
|
||||||
|
+ { HID_DEVICE(BUS_VIRTUAL, 0, USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_SURFACE_VHF),
|
||||||
|
+ .driver_data = MS_HIDINPUT},
|
||||||
|
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_PRESENTER_8K_BT),
|
||||||
|
.driver_data = MS_PRESENTER },
|
||||||
|
{ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_MICROSOFT, 0x091B),
|
||||||
|
diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
|
||||||
|
index 1fb13dad7554..3ba9832f5001 100644
|
||||||
|
--- a/drivers/hid/hid-multitouch.c
|
||||||
|
+++ b/drivers/hid/hid-multitouch.c
|
||||||
|
@@ -1976,6 +1976,63 @@ static const struct hid_device_id mt_devices[] = {
|
||||||
|
HID_USB_DEVICE(USB_VENDOR_ID_LG,
|
||||||
|
USB_DEVICE_ID_LG_MELFAS_MT) },
|
||||||
|
|
||||||
|
+ /* Microsoft Touch Cover */
|
||||||
|
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
||||||
|
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
||||||
|
+ USB_DEVICE_ID_MS_TOUCH_COVER_2) },
|
||||||
|
+
|
||||||
|
+ /* Microsoft Type Cover */
|
||||||
|
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
||||||
|
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
||||||
|
+ USB_DEVICE_ID_MS_TYPE_COVER_2) },
|
||||||
|
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
||||||
|
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
||||||
|
+ USB_DEVICE_ID_MS_TYPE_COVER_3) },
|
||||||
|
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
||||||
|
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
||||||
|
+ USB_DEVICE_ID_MS_TYPE_COVER_PRO_3) },
|
||||||
|
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
||||||
|
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
||||||
|
+ USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_1) },
|
||||||
|
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
||||||
|
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
||||||
|
+ USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_2) },
|
||||||
|
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
||||||
|
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
||||||
|
+ USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_JP) },
|
||||||
|
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
||||||
|
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
||||||
|
+ USB_DEVICE_ID_MS_TYPE_COVER_PRO_4) },
|
||||||
|
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
||||||
|
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
||||||
|
+ USB_DEVICE_ID_MS_TYPE_COVER_PRO_4_1) },
|
||||||
|
+
|
||||||
|
+ /* Microsoft Surface Book */
|
||||||
|
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
||||||
|
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
||||||
|
+ USB_DEVICE_ID_MS_SURFACE_BOOK) },
|
||||||
|
+
|
||||||
|
+ /* Microsoft Surface Book 2 */
|
||||||
|
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
||||||
|
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
||||||
|
+ USB_DEVICE_ID_MS_SURFACE_BOOK_2) },
|
||||||
|
+
|
||||||
|
+ /* Microsoft Surface Go */
|
||||||
|
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
||||||
|
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
||||||
|
+ USB_DEVICE_ID_MS_SURFACE_GO) },
|
||||||
|
+
|
||||||
|
+ /* Microsoft Surface Laptop */
|
||||||
|
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
||||||
|
+ HID_DEVICE(HID_BUS_ANY, HID_GROUP_ANY,
|
||||||
|
+ USB_VENDOR_ID_MICROSOFT,
|
||||||
|
+ USB_DEVICE_ID_MS_SURFACE_VHF) },
|
||||||
|
+
|
||||||
|
+ /* Microsoft Power Cover */
|
||||||
|
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
||||||
|
+ MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT,
|
||||||
|
+ USB_DEVICE_ID_MS_POWER_COVER) },
|
||||||
|
+
|
||||||
|
/* MosArt panels */
|
||||||
|
{ .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE,
|
||||||
|
MT_USB_DEVICE(USB_VENDOR_ID_ASUS,
|
||||||
|
diff --git a/drivers/hid/hid-quirks.c b/drivers/hid/hid-quirks.c
|
||||||
|
index 77ffba48cc73..517143d5b305 100644
|
||||||
|
--- a/drivers/hid/hid-quirks.c
|
||||||
|
+++ b/drivers/hid/hid-quirks.c
|
||||||
|
@@ -113,6 +113,17 @@ static const struct hid_device_id hid_quirks[] = {
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_SURFACE_PRO_2), HID_QUIRK_NO_INIT_REPORTS },
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TOUCH_COVER_2), HID_QUIRK_NO_INIT_REPORTS },
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_2), HID_QUIRK_NO_INIT_REPORTS },
|
||||||
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_3), HID_QUIRK_NO_INIT_REPORTS },
|
||||||
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_PRO_3), HID_QUIRK_NO_INIT_REPORTS },
|
||||||
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_1), HID_QUIRK_NO_INIT_REPORTS },
|
||||||
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_2), HID_QUIRK_NO_INIT_REPORTS },
|
||||||
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_JP), HID_QUIRK_NO_INIT_REPORTS },
|
||||||
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_PRO_4), HID_QUIRK_NO_INIT_REPORTS },
|
||||||
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_PRO_4_1), HID_QUIRK_NO_INIT_REPORTS },
|
||||||
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_SURFACE_BOOK), HID_QUIRK_NO_INIT_REPORTS },
|
||||||
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_SURFACE_BOOK_2), HID_QUIRK_NO_INIT_REPORTS },
|
||||||
|
+ { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_SURFACE_GO), HID_QUIRK_NO_INIT_REPORTS },
|
||||||
|
+ { HID_DEVICE(BUS_VIRTUAL, 0, USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_SURFACE_VHF), HID_QUIRK_ALWAYS_POLL },
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_MOJO, USB_DEVICE_ID_RETRO_ADAPTER), HID_QUIRK_MULTI_INPUT },
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_MSI, USB_DEVICE_ID_MSI_GT683R_LED_PANEL), HID_QUIRK_NO_INIT_REPORTS },
|
||||||
|
{ HID_USB_DEVICE(USB_VENDOR_ID_MULTIPLE_1781, USB_DEVICE_ID_RAPHNET_4NES4SNES_OLD), HID_QUIRK_MULTI_INPUT },
|
||||||
|
--
|
||||||
|
2.21.0
|
||||||
|
|
26
patches/5.1/0007-sdcard-reader.patch
Normal file
26
patches/5.1/0007-sdcard-reader.patch
Normal file
|
@ -0,0 +1,26 @@
|
||||||
|
From 2ac6068e68209c79012a1d90a50c97cc9349bb50 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Maximilian Luz <luzmaximilian@gmail.com>
|
||||||
|
Date: Thu, 16 May 2019 01:04:02 +0200
|
||||||
|
Subject: [PATCH 07/12] sdcard-reader
|
||||||
|
|
||||||
|
---
|
||||||
|
drivers/usb/core/hub.c | 3 ++-
|
||||||
|
1 file changed, 2 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
|
||||||
|
index 8d4631c81b9f..904ab3de183a 100644
|
||||||
|
--- a/drivers/usb/core/hub.c
|
||||||
|
+++ b/drivers/usb/core/hub.c
|
||||||
|
@@ -4198,7 +4198,8 @@ void usb_enable_lpm(struct usb_device *udev)
|
||||||
|
if (!udev || !udev->parent ||
|
||||||
|
udev->speed < USB_SPEED_SUPER ||
|
||||||
|
!udev->lpm_capable ||
|
||||||
|
- udev->state < USB_STATE_DEFAULT)
|
||||||
|
+ udev->state < USB_STATE_DEFAULT ||
|
||||||
|
+ !udev->bos || !udev->bos->ss_cap)
|
||||||
|
return;
|
||||||
|
|
||||||
|
udev->lpm_disable_count--;
|
||||||
|
--
|
||||||
|
2.21.0
|
||||||
|
|
270
patches/5.1/0008-wifi.patch
Normal file
270
patches/5.1/0008-wifi.patch
Normal file
|
@ -0,0 +1,270 @@
|
||||||
|
From 05691e019642cdeaa5e1519000daa9f69006e27b Mon Sep 17 00:00:00 2001
|
||||||
|
From: Maximilian Luz <luzmaximilian@gmail.com>
|
||||||
|
Date: Thu, 16 May 2019 01:04:58 +0200
|
||||||
|
Subject: [PATCH 08/12] wifi
|
||||||
|
|
||||||
|
---
|
||||||
|
drivers/net/wireless/marvell/mwifiex/11n_aggr.c | 3 +--
|
||||||
|
drivers/net/wireless/marvell/mwifiex/cfg80211.c | 5 ++++-
|
||||||
|
drivers/net/wireless/marvell/mwifiex/cmdevt.c | 10 ++++++----
|
||||||
|
drivers/net/wireless/marvell/mwifiex/fw.h | 1 +
|
||||||
|
drivers/net/wireless/marvell/mwifiex/main.c | 17 +++++++++++++----
|
||||||
|
drivers/net/wireless/marvell/mwifiex/main.h | 2 ++
|
||||||
|
drivers/net/wireless/marvell/mwifiex/pcie.c | 9 +++++++++
|
||||||
|
drivers/net/wireless/marvell/mwifiex/sta_cmd.c | 4 ++--
|
||||||
|
.../net/wireless/marvell/mwifiex/sta_cmdresp.c | 11 ++++++++---
|
||||||
|
drivers/net/wireless/marvell/mwifiex/usb.c | 2 ++
|
||||||
|
scripts/leaking_addresses.pl | 0
|
||||||
|
11 files changed, 48 insertions(+), 16 deletions(-)
|
||||||
|
mode change 100755 => 100644 scripts/leaking_addresses.pl
|
||||||
|
|
||||||
|
diff --git a/drivers/net/wireless/marvell/mwifiex/11n_aggr.c b/drivers/net/wireless/marvell/mwifiex/11n_aggr.c
|
||||||
|
index 042a1d07f686..fc9041f58e9f 100644
|
||||||
|
--- a/drivers/net/wireless/marvell/mwifiex/11n_aggr.c
|
||||||
|
+++ b/drivers/net/wireless/marvell/mwifiex/11n_aggr.c
|
||||||
|
@@ -200,8 +200,7 @@ mwifiex_11n_aggregate_pkt(struct mwifiex_private *priv,
|
||||||
|
|
||||||
|
do {
|
||||||
|
/* Check if AMSDU can accommodate this MSDU */
|
||||||
|
- if ((skb_aggr->len + skb_src->len + LLC_SNAP_LEN) >
|
||||||
|
- adapter->tx_buf_size)
|
||||||
|
+ if (skb_tailroom(skb_aggr) < (skb_src->len + LLC_SNAP_LEN))
|
||||||
|
break;
|
||||||
|
|
||||||
|
skb_src = skb_dequeue(&pra_list->skb_head);
|
||||||
|
diff --git a/drivers/net/wireless/marvell/mwifiex/cfg80211.c b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
|
||||||
|
index c46f0a54a0c7..bce482bbcc6d 100644
|
||||||
|
--- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c
|
||||||
|
+++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
|
||||||
|
@@ -437,7 +437,10 @@ mwifiex_cfg80211_set_power_mgmt(struct wiphy *wiphy,
|
||||||
|
mwifiex_dbg(priv->adapter, INFO,
|
||||||
|
"info: ignore timeout value for IEEE Power Save\n");
|
||||||
|
|
||||||
|
- ps_mode = enabled;
|
||||||
|
+ //ps_mode = enabled;
|
||||||
|
+
|
||||||
|
+ mwifiex_dbg(priv->adapter, INFO, "overriding ps_mode to false\n");
|
||||||
|
+ ps_mode = 0;
|
||||||
|
|
||||||
|
return mwifiex_drv_set_power(priv, &ps_mode);
|
||||||
|
}
|
||||||
|
diff --git a/drivers/net/wireless/marvell/mwifiex/cmdevt.c b/drivers/net/wireless/marvell/mwifiex/cmdevt.c
|
||||||
|
index 60db2b969e20..efae99018c3c 100644
|
||||||
|
--- a/drivers/net/wireless/marvell/mwifiex/cmdevt.c
|
||||||
|
+++ b/drivers/net/wireless/marvell/mwifiex/cmdevt.c
|
||||||
|
@@ -1000,6 +1000,7 @@ mwifiex_cmd_timeout_func(struct timer_list *t)
|
||||||
|
if (cmd_node->wait_q_enabled) {
|
||||||
|
adapter->cmd_wait_q.status = -ETIMEDOUT;
|
||||||
|
mwifiex_cancel_pending_ioctl(adapter);
|
||||||
|
+ adapter->cmd_sent = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (adapter->hw_status == MWIFIEX_HW_STATUS_INITIALIZING) {
|
||||||
|
@@ -1007,11 +1008,11 @@ mwifiex_cmd_timeout_func(struct timer_list *t)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (adapter->if_ops.device_dump)
|
||||||
|
- adapter->if_ops.device_dump(adapter);
|
||||||
|
+ //if (adapter->if_ops.device_dump)
|
||||||
|
+ // adapter->if_ops.device_dump(adapter);
|
||||||
|
|
||||||
|
- if (adapter->if_ops.card_reset)
|
||||||
|
- adapter->if_ops.card_reset(adapter);
|
||||||
|
+ //if (adapter->if_ops.card_reset)
|
||||||
|
+ // adapter->if_ops.card_reset(adapter);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
@@ -1577,6 +1578,7 @@ int mwifiex_ret_get_hw_spec(struct mwifiex_private *priv,
|
||||||
|
adapter->key_api_minor_ver);
|
||||||
|
break;
|
||||||
|
case FW_API_VER_ID:
|
||||||
|
+ case FW_KEY_API_VER_ID:
|
||||||
|
adapter->fw_api_ver =
|
||||||
|
api_rev->major_ver;
|
||||||
|
mwifiex_dbg(adapter, INFO,
|
||||||
|
diff --git a/drivers/net/wireless/marvell/mwifiex/fw.h b/drivers/net/wireless/marvell/mwifiex/fw.h
|
||||||
|
index b73f99dc5a72..d96a0ffc9649 100644
|
||||||
|
--- a/drivers/net/wireless/marvell/mwifiex/fw.h
|
||||||
|
+++ b/drivers/net/wireless/marvell/mwifiex/fw.h
|
||||||
|
@@ -1052,6 +1052,7 @@ struct host_cmd_ds_802_11_ps_mode_enh {
|
||||||
|
enum API_VER_ID {
|
||||||
|
KEY_API_VER_ID = 1,
|
||||||
|
FW_API_VER_ID = 2,
|
||||||
|
+ FW_KEY_API_VER_ID = 4,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct hw_spec_api_rev {
|
||||||
|
diff --git a/drivers/net/wireless/marvell/mwifiex/main.c b/drivers/net/wireless/marvell/mwifiex/main.c
|
||||||
|
index 20cee5c397fb..13e49a3ae812 100644
|
||||||
|
--- a/drivers/net/wireless/marvell/mwifiex/main.c
|
||||||
|
+++ b/drivers/net/wireless/marvell/mwifiex/main.c
|
||||||
|
@@ -163,6 +163,7 @@ void mwifiex_queue_main_work(struct mwifiex_adapter *adapter)
|
||||||
|
spin_lock_irqsave(&adapter->main_proc_lock, flags);
|
||||||
|
if (adapter->mwifiex_processing) {
|
||||||
|
adapter->more_task_flag = true;
|
||||||
|
+ adapter->more_rx_task_flag = true;
|
||||||
|
spin_unlock_irqrestore(&adapter->main_proc_lock, flags);
|
||||||
|
} else {
|
||||||
|
spin_unlock_irqrestore(&adapter->main_proc_lock, flags);
|
||||||
|
@@ -171,18 +172,20 @@ void mwifiex_queue_main_work(struct mwifiex_adapter *adapter)
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(mwifiex_queue_main_work);
|
||||||
|
|
||||||
|
-static void mwifiex_queue_rx_work(struct mwifiex_adapter *adapter)
|
||||||
|
+void mwifiex_queue_rx_work(struct mwifiex_adapter *adapter)
|
||||||
|
{
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
|
spin_lock_irqsave(&adapter->rx_proc_lock, flags);
|
||||||
|
if (adapter->rx_processing) {
|
||||||
|
+ adapter->more_rx_task_flag = true;
|
||||||
|
spin_unlock_irqrestore(&adapter->rx_proc_lock, flags);
|
||||||
|
} else {
|
||||||
|
spin_unlock_irqrestore(&adapter->rx_proc_lock, flags);
|
||||||
|
queue_work(adapter->rx_workqueue, &adapter->rx_work);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+EXPORT_SYMBOL_GPL(mwifiex_queue_rx_work);
|
||||||
|
|
||||||
|
static int mwifiex_process_rx(struct mwifiex_adapter *adapter)
|
||||||
|
{
|
||||||
|
@@ -192,6 +195,7 @@ static int mwifiex_process_rx(struct mwifiex_adapter *adapter)
|
||||||
|
|
||||||
|
spin_lock_irqsave(&adapter->rx_proc_lock, flags);
|
||||||
|
if (adapter->rx_processing || adapter->rx_locked) {
|
||||||
|
+ adapter->more_rx_task_flag = true;
|
||||||
|
spin_unlock_irqrestore(&adapter->rx_proc_lock, flags);
|
||||||
|
goto exit_rx_proc;
|
||||||
|
} else {
|
||||||
|
@@ -199,6 +203,7 @@ static int mwifiex_process_rx(struct mwifiex_adapter *adapter)
|
||||||
|
spin_unlock_irqrestore(&adapter->rx_proc_lock, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
+rx_process_start:
|
||||||
|
/* Check for Rx data */
|
||||||
|
while ((skb = skb_dequeue(&adapter->rx_data_q))) {
|
||||||
|
atomic_dec(&adapter->rx_pending);
|
||||||
|
@@ -220,6 +225,11 @@ static int mwifiex_process_rx(struct mwifiex_adapter *adapter)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
spin_lock_irqsave(&adapter->rx_proc_lock, flags);
|
||||||
|
+ if (adapter->more_rx_task_flag) {
|
||||||
|
+ adapter->more_rx_task_flag = false;
|
||||||
|
+ spin_unlock_irqrestore(&adapter->rx_proc_lock, flags);
|
||||||
|
+ goto rx_process_start;
|
||||||
|
+ }
|
||||||
|
adapter->rx_processing = false;
|
||||||
|
spin_unlock_irqrestore(&adapter->rx_proc_lock, flags);
|
||||||
|
|
||||||
|
@@ -283,11 +293,10 @@ int mwifiex_main_process(struct mwifiex_adapter *adapter)
|
||||||
|
mwifiex_process_hs_config(adapter);
|
||||||
|
if (adapter->if_ops.process_int_status)
|
||||||
|
adapter->if_ops.process_int_status(adapter);
|
||||||
|
+ if (adapter->rx_work_enabled && adapter->data_received)
|
||||||
|
+ mwifiex_queue_rx_work(adapter);
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (adapter->rx_work_enabled && adapter->data_received)
|
||||||
|
- mwifiex_queue_rx_work(adapter);
|
||||||
|
-
|
||||||
|
/* Need to wake up the card ? */
|
||||||
|
if ((adapter->ps_state == PS_STATE_SLEEP) &&
|
||||||
|
(adapter->pm_wakeup_card_req &&
|
||||||
|
diff --git a/drivers/net/wireless/marvell/mwifiex/main.h b/drivers/net/wireless/marvell/mwifiex/main.h
|
||||||
|
index b025ba164412..d4027a803079 100644
|
||||||
|
--- a/drivers/net/wireless/marvell/mwifiex/main.h
|
||||||
|
+++ b/drivers/net/wireless/marvell/mwifiex/main.h
|
||||||
|
@@ -908,6 +908,7 @@ struct mwifiex_adapter {
|
||||||
|
spinlock_t main_proc_lock;
|
||||||
|
u32 mwifiex_processing;
|
||||||
|
u8 more_task_flag;
|
||||||
|
+ u8 more_rx_task_flag;
|
||||||
|
u16 tx_buf_size;
|
||||||
|
u16 curr_tx_buf_size;
|
||||||
|
/* sdio single port rx aggregation capability */
|
||||||
|
@@ -1694,6 +1695,7 @@ void mwifiex_upload_device_dump(struct mwifiex_adapter *adapter);
|
||||||
|
void *mwifiex_alloc_dma_align_buf(int rx_len, gfp_t flags);
|
||||||
|
void mwifiex_fw_dump_event(struct mwifiex_private *priv);
|
||||||
|
void mwifiex_queue_main_work(struct mwifiex_adapter *adapter);
|
||||||
|
+void mwifiex_queue_rx_work(struct mwifiex_adapter *adapter);
|
||||||
|
int mwifiex_get_wakeup_reason(struct mwifiex_private *priv, u16 action,
|
||||||
|
int cmd_type,
|
||||||
|
struct mwifiex_ds_wakeup_reason *wakeup_reason);
|
||||||
|
diff --git a/drivers/net/wireless/marvell/mwifiex/pcie.c b/drivers/net/wireless/marvell/mwifiex/pcie.c
|
||||||
|
index 3fe81b2a929a..6e734a83e6bf 100644
|
||||||
|
--- a/drivers/net/wireless/marvell/mwifiex/pcie.c
|
||||||
|
+++ b/drivers/net/wireless/marvell/mwifiex/pcie.c
|
||||||
|
@@ -1743,6 +1743,15 @@ static int mwifiex_pcie_process_cmd_complete(struct mwifiex_adapter *adapter)
|
||||||
|
}
|
||||||
|
|
||||||
|
rx_len = get_unaligned_le16(skb->data);
|
||||||
|
+
|
||||||
|
+ if (rx_len == 0) {
|
||||||
|
+ mwifiex_dbg(adapter, ERROR,
|
||||||
|
+ "0 byte cmdrsp\n");
|
||||||
|
+ mwifiex_map_pci_memory(adapter, skb, MWIFIEX_UPLD_SIZE,
|
||||||
|
+ PCI_DMA_FROMDEVICE);
|
||||||
|
+ return 0;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
skb_put(skb, MWIFIEX_UPLD_SIZE - skb->len);
|
||||||
|
skb_trim(skb, rx_len);
|
||||||
|
|
||||||
|
diff --git a/drivers/net/wireless/marvell/mwifiex/sta_cmd.c b/drivers/net/wireless/marvell/mwifiex/sta_cmd.c
|
||||||
|
index 4ed10cf82f9a..485360e8534b 100644
|
||||||
|
--- a/drivers/net/wireless/marvell/mwifiex/sta_cmd.c
|
||||||
|
+++ b/drivers/net/wireless/marvell/mwifiex/sta_cmd.c
|
||||||
|
@@ -30,8 +30,8 @@ static bool drcs;
|
||||||
|
module_param(drcs, bool, 0644);
|
||||||
|
MODULE_PARM_DESC(drcs, "multi-channel operation:1, single-channel operation:0");
|
||||||
|
|
||||||
|
-static bool disable_auto_ds;
|
||||||
|
-module_param(disable_auto_ds, bool, 0);
|
||||||
|
+static bool disable_auto_ds = 1;
|
||||||
|
+module_param(disable_auto_ds, bool, 0644);
|
||||||
|
MODULE_PARM_DESC(disable_auto_ds,
|
||||||
|
"deepsleep enabled=0(default), deepsleep disabled=1");
|
||||||
|
/*
|
||||||
|
diff --git a/drivers/net/wireless/marvell/mwifiex/sta_cmdresp.c b/drivers/net/wireless/marvell/mwifiex/sta_cmdresp.c
|
||||||
|
index 69e3b624adbb..884bad677cc3 100644
|
||||||
|
--- a/drivers/net/wireless/marvell/mwifiex/sta_cmdresp.c
|
||||||
|
+++ b/drivers/net/wireless/marvell/mwifiex/sta_cmdresp.c
|
||||||
|
@@ -48,9 +48,14 @@ mwifiex_process_cmdresp_error(struct mwifiex_private *priv,
|
||||||
|
struct host_cmd_ds_802_11_ps_mode_enh *pm;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
|
- mwifiex_dbg(adapter, ERROR,
|
||||||
|
- "CMD_RESP: cmd %#x error, result=%#x\n",
|
||||||
|
- resp->command, resp->result);
|
||||||
|
+ if (resp->command == 271 && resp->result == 2){
|
||||||
|
+ // ignore this command as the firmware does not support it
|
||||||
|
+ }
|
||||||
|
+ else {
|
||||||
|
+ mwifiex_dbg(adapter, ERROR,
|
||||||
|
+ "CMD_RESP: cmd %#x error, result=%#x\n",
|
||||||
|
+ resp->command, resp->result);
|
||||||
|
+ }
|
||||||
|
|
||||||
|
if (adapter->curr_cmd->wait_q_enabled)
|
||||||
|
adapter->cmd_wait_q.status = -1;
|
||||||
|
diff --git a/drivers/net/wireless/marvell/mwifiex/usb.c b/drivers/net/wireless/marvell/mwifiex/usb.c
|
||||||
|
index d445acc4786b..ae8e60cc17cb 100644
|
||||||
|
--- a/drivers/net/wireless/marvell/mwifiex/usb.c
|
||||||
|
+++ b/drivers/net/wireless/marvell/mwifiex/usb.c
|
||||||
|
@@ -144,6 +144,8 @@ static int mwifiex_usb_recv(struct mwifiex_adapter *adapter,
|
||||||
|
skb_queue_tail(&adapter->rx_data_q, skb);
|
||||||
|
adapter->data_received = true;
|
||||||
|
atomic_inc(&adapter->rx_pending);
|
||||||
|
+ if (adapter->rx_work_enabled)
|
||||||
|
+ mwifiex_queue_rx_work(adapter);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
mwifiex_dbg(adapter, ERROR,
|
||||||
|
diff --git a/scripts/leaking_addresses.pl b/scripts/leaking_addresses.pl
|
||||||
|
old mode 100755
|
||||||
|
new mode 100644
|
||||||
|
--
|
||||||
|
2.21.0
|
||||||
|
|
655
patches/5.1/0009-surface-power.patch
Normal file
655
patches/5.1/0009-surface-power.patch
Normal file
|
@ -0,0 +1,655 @@
|
||||||
|
From 8595ec15b6e77c335c79c938eb292700c5c9abc0 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Maximilian Luz <luzmaximilian@gmail.com>
|
||||||
|
Date: Thu, 16 May 2019 01:05:57 +0200
|
||||||
|
Subject: [PATCH 09/12] surface-power
|
||||||
|
|
||||||
|
---
|
||||||
|
drivers/platform/x86/Kconfig | 7 +
|
||||||
|
drivers/platform/x86/Makefile | 1 +
|
||||||
|
drivers/platform/x86/surface3_power.c | 604 ++++++++++++++++++++++++++
|
||||||
|
3 files changed, 612 insertions(+)
|
||||||
|
create mode 100644 drivers/platform/x86/surface3_power.c
|
||||||
|
|
||||||
|
diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig
|
||||||
|
index 501d06d4f196..21ffc03cd372 100644
|
||||||
|
--- a/drivers/platform/x86/Kconfig
|
||||||
|
+++ b/drivers/platform/x86/Kconfig
|
||||||
|
@@ -1300,6 +1300,13 @@ config SURFACE_3_BUTTON
|
||||||
|
---help---
|
||||||
|
This driver handles the power/home/volume buttons on the Microsoft Surface 3 tablet.
|
||||||
|
|
||||||
|
+config SURFACE_3_POWER_OPREGION
|
||||||
|
+ tristate "Surface 3 battery platform operation region support"
|
||||||
|
+ depends on ACPI && I2C
|
||||||
|
+ help
|
||||||
|
+ Select this option to enable support for ACPI operation
|
||||||
|
+ region of the Surface 3 battery platform driver.
|
||||||
|
+
|
||||||
|
config INTEL_PUNIT_IPC
|
||||||
|
tristate "Intel P-Unit IPC Driver"
|
||||||
|
---help---
|
||||||
|
diff --git a/drivers/platform/x86/Makefile b/drivers/platform/x86/Makefile
|
||||||
|
index be1ce92a365d..278ce32df99f 100644
|
||||||
|
--- a/drivers/platform/x86/Makefile
|
||||||
|
+++ b/drivers/platform/x86/Makefile
|
||||||
|
@@ -85,6 +85,7 @@ obj-$(CONFIG_INTEL_PMC_IPC) += intel_pmc_ipc.o
|
||||||
|
obj-$(CONFIG_TOUCHSCREEN_DMI) += touchscreen_dmi.o
|
||||||
|
obj-$(CONFIG_SURFACE_PRO3_BUTTON) += surfacepro3_button.o
|
||||||
|
obj-$(CONFIG_SURFACE_3_BUTTON) += surface3_button.o
|
||||||
|
+obj-$(CONFIG_SURFACE_3_POWER_OPREGION) += surface3_power.o
|
||||||
|
obj-$(CONFIG_INTEL_PUNIT_IPC) += intel_punit_ipc.o
|
||||||
|
obj-$(CONFIG_INTEL_BXTWC_PMIC_TMU) += intel_bxtwc_tmu.o
|
||||||
|
obj-$(CONFIG_INTEL_TELEMETRY) += intel_telemetry_core.o \
|
||||||
|
diff --git a/drivers/platform/x86/surface3_power.c b/drivers/platform/x86/surface3_power.c
|
||||||
|
new file mode 100644
|
||||||
|
index 000000000000..e0af01a60302
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/drivers/platform/x86/surface3_power.c
|
||||||
|
@@ -0,0 +1,604 @@
|
||||||
|
+// SPDX-License-Identifier: GPL-2.0+
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * Supports for the power IC on the Surface 3 tablet.
|
||||||
|
+ *
|
||||||
|
+ * (C) Copyright 2016-2018 Red Hat, Inc
|
||||||
|
+ * (C) Copyright 2016-2018 Benjamin Tissoires <benjamin.tissoires@gmail.com>
|
||||||
|
+ * (C) Copyright 2016 Stephen Just <stephenjust@gmail.com>
|
||||||
|
+ *
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+/*
|
||||||
|
+ * This driver has been reverse-engineered by parsing the DSDT of the Surface 3
|
||||||
|
+ * and looking at the registers of the chips.
|
||||||
|
+ *
|
||||||
|
+ * The DSDT allowed to find out that:
|
||||||
|
+ * - the driver is required for the ACPI BAT0 device to communicate to the chip
|
||||||
|
+ * through an operation region.
|
||||||
|
+ * - the various defines for the operation region functions to communicate with
|
||||||
|
+ * this driver
|
||||||
|
+ * - the DSM 3f99e367-6220-4955-8b0f-06ef2ae79412 allows to trigger ACPI
|
||||||
|
+ * events to BAT0 (the code is all available in the DSDT).
|
||||||
|
+ *
|
||||||
|
+ * Further findings regarding the 2 chips declared in the MSHW0011 are:
|
||||||
|
+ * - there are 2 chips declared:
|
||||||
|
+ * . 0x22 seems to control the ADP1 line status (and probably the charger)
|
||||||
|
+ * . 0x55 controls the battery directly
|
||||||
|
+ * - the battery chip uses a SMBus protocol (using plain SMBus allows non
|
||||||
|
+ * destructive commands):
|
||||||
|
+ * . the commands/registers used are in the range 0x00..0x7F
|
||||||
|
+ * . if bit 8 (0x80) is set in the SMBus command, the returned value is the
|
||||||
|
+ * same as when it is not set. There is a high chance this bit is the
|
||||||
|
+ * read/write
|
||||||
|
+ * . the various registers semantic as been deduced by observing the register
|
||||||
|
+ * dumps.
|
||||||
|
+ */
|
||||||
|
+
|
||||||
|
+#include <asm/unaligned.h>
|
||||||
|
+#include <linux/acpi.h>
|
||||||
|
+#include <linux/freezer.h>
|
||||||
|
+#include <linux/i2c.h>
|
||||||
|
+#include <linux/kernel.h>
|
||||||
|
+#include <linux/kthread.h>
|
||||||
|
+#include <linux/slab.h>
|
||||||
|
+#include <linux/uuid.h>
|
||||||
|
+
|
||||||
|
+#define POLL_INTERVAL (2 * HZ)
|
||||||
|
+
|
||||||
|
+struct mshw0011_data {
|
||||||
|
+ struct i2c_client *adp1;
|
||||||
|
+ struct i2c_client *bat0;
|
||||||
|
+ unsigned short notify_mask;
|
||||||
|
+ struct task_struct *poll_task;
|
||||||
|
+ bool kthread_running;
|
||||||
|
+
|
||||||
|
+ bool charging;
|
||||||
|
+ bool bat_charging;
|
||||||
|
+ u8 trip_point;
|
||||||
|
+ s32 full_capacity;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+struct mshw0011_lookup {
|
||||||
|
+ struct mshw0011_data *cdata;
|
||||||
|
+ unsigned int n;
|
||||||
|
+ unsigned int index;
|
||||||
|
+ int addr;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+struct mshw0011_handler_data {
|
||||||
|
+ struct acpi_connection_info info;
|
||||||
|
+ struct i2c_client *client;
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+struct bix {
|
||||||
|
+ u32 revision;
|
||||||
|
+ u32 power_unit;
|
||||||
|
+ u32 design_capacity;
|
||||||
|
+ u32 last_full_charg_capacity;
|
||||||
|
+ u32 battery_technology;
|
||||||
|
+ u32 design_voltage;
|
||||||
|
+ u32 design_capacity_of_warning;
|
||||||
|
+ u32 design_capacity_of_low;
|
||||||
|
+ u32 cycle_count;
|
||||||
|
+ u32 measurement_accuracy;
|
||||||
|
+ u32 max_sampling_time;
|
||||||
|
+ u32 min_sampling_time;
|
||||||
|
+ u32 max_average_interval;
|
||||||
|
+ u32 min_average_interval;
|
||||||
|
+ u32 battery_capacity_granularity_1;
|
||||||
|
+ u32 battery_capacity_granularity_2;
|
||||||
|
+ char model[10];
|
||||||
|
+ char serial[10];
|
||||||
|
+ char type[10];
|
||||||
|
+ char OEM[10];
|
||||||
|
+} __packed;
|
||||||
|
+
|
||||||
|
+struct bst {
|
||||||
|
+ u32 battery_state;
|
||||||
|
+ s32 battery_present_rate;
|
||||||
|
+ u32 battery_remaining_capacity;
|
||||||
|
+ u32 battery_present_voltage;
|
||||||
|
+} __packed;
|
||||||
|
+
|
||||||
|
+struct gsb_command {
|
||||||
|
+ u8 arg0;
|
||||||
|
+ u8 arg1;
|
||||||
|
+ u8 arg2;
|
||||||
|
+} __packed;
|
||||||
|
+
|
||||||
|
+struct gsb_buffer {
|
||||||
|
+ u8 status;
|
||||||
|
+ u8 len;
|
||||||
|
+ u8 ret;
|
||||||
|
+ union {
|
||||||
|
+ struct gsb_command cmd;
|
||||||
|
+ struct bst bst;
|
||||||
|
+ struct bix bix;
|
||||||
|
+ } __packed;
|
||||||
|
+} __packed;
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+#define ACPI_BATTERY_STATE_DISCHARGING BIT(0)
|
||||||
|
+#define ACPI_BATTERY_STATE_CHARGING BIT(1)
|
||||||
|
+#define ACPI_BATTERY_STATE_CRITICAL BIT(2)
|
||||||
|
+
|
||||||
|
+#define MSHW0011_CMD_DEST_BAT0 0x01
|
||||||
|
+#define MSHW0011_CMD_DEST_ADP1 0x03
|
||||||
|
+
|
||||||
|
+#define MSHW0011_CMD_BAT0_STA 0x01
|
||||||
|
+#define MSHW0011_CMD_BAT0_BIX 0x02
|
||||||
|
+#define MSHW0011_CMD_BAT0_BCT 0x03
|
||||||
|
+#define MSHW0011_CMD_BAT0_BTM 0x04
|
||||||
|
+#define MSHW0011_CMD_BAT0_BST 0x05
|
||||||
|
+#define MSHW0011_CMD_BAT0_BTP 0x06
|
||||||
|
+#define MSHW0011_CMD_ADP1_PSR 0x07
|
||||||
|
+#define MSHW0011_CMD_BAT0_PSOC 0x09
|
||||||
|
+#define MSHW0011_CMD_BAT0_PMAX 0x0a
|
||||||
|
+#define MSHW0011_CMD_BAT0_PSRC 0x0b
|
||||||
|
+#define MSHW0011_CMD_BAT0_CHGI 0x0c
|
||||||
|
+#define MSHW0011_CMD_BAT0_ARTG 0x0d
|
||||||
|
+
|
||||||
|
+#define MSHW0011_NOTIFY_GET_VERSION 0x00
|
||||||
|
+#define MSHW0011_NOTIFY_ADP1 0x01
|
||||||
|
+#define MSHW0011_NOTIFY_BAT0_BST 0x02
|
||||||
|
+#define MSHW0011_NOTIFY_BAT0_BIX 0x05
|
||||||
|
+
|
||||||
|
+#define MSHW0011_ADP1_REG_PSR 0x04
|
||||||
|
+
|
||||||
|
+#define MSHW0011_BAT0_REG_CAPACITY 0x0c
|
||||||
|
+#define MSHW0011_BAT0_REG_FULL_CHG_CAPACITY 0x0e
|
||||||
|
+#define MSHW0011_BAT0_REG_DESIGN_CAPACITY 0x40
|
||||||
|
+#define MSHW0011_BAT0_REG_VOLTAGE 0x08
|
||||||
|
+#define MSHW0011_BAT0_REG_RATE 0x14
|
||||||
|
+#define MSHW0011_BAT0_REG_OEM 0x45
|
||||||
|
+#define MSHW0011_BAT0_REG_TYPE 0x4e
|
||||||
|
+#define MSHW0011_BAT0_REG_SERIAL_NO 0x56
|
||||||
|
+#define MSHW0011_BAT0_REG_CYCLE_CNT 0x6e
|
||||||
|
+
|
||||||
|
+#define MSHW0011_EV_2_5 0x1ff
|
||||||
|
+
|
||||||
|
+static int
|
||||||
|
+mshw0011_notify(struct mshw0011_data *cdata, u8 arg1, u8 arg2,
|
||||||
|
+ unsigned int *ret_value)
|
||||||
|
+{
|
||||||
|
+ static const guid_t mshw0011_guid =
|
||||||
|
+ GUID_INIT(0x3F99E367, 0x6220, 0x4955,
|
||||||
|
+ 0x8B, 0x0F, 0x06, 0xEF, 0x2A, 0xE7, 0x94, 0x12);
|
||||||
|
+ union acpi_object *obj;
|
||||||
|
+ struct acpi_device *adev;
|
||||||
|
+ acpi_handle handle;
|
||||||
|
+ unsigned int i;
|
||||||
|
+
|
||||||
|
+ handle = ACPI_HANDLE(&cdata->adp1->dev);
|
||||||
|
+ if (!handle || acpi_bus_get_device(handle, &adev))
|
||||||
|
+ return -ENODEV;
|
||||||
|
+
|
||||||
|
+ obj = acpi_evaluate_dsm_typed(handle, &mshw0011_guid, arg1, arg2, NULL,
|
||||||
|
+ ACPI_TYPE_BUFFER);
|
||||||
|
+ if (!obj) {
|
||||||
|
+ dev_err(&cdata->adp1->dev, "device _DSM execution failed\n");
|
||||||
|
+ return -ENODEV;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ *ret_value = 0;
|
||||||
|
+ for (i = 0; i < obj->buffer.length; i++)
|
||||||
|
+ *ret_value |= obj->buffer.pointer[i] << (i * 8);
|
||||||
|
+
|
||||||
|
+ ACPI_FREE(obj);
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static const struct bix default_bix = {
|
||||||
|
+ .revision = 0x00,
|
||||||
|
+ .power_unit = 0x01,
|
||||||
|
+ .design_capacity = 0x1dca,
|
||||||
|
+ .last_full_charg_capacity = 0x1dca,
|
||||||
|
+ .battery_technology = 0x01,
|
||||||
|
+ .design_voltage = 0x10df,
|
||||||
|
+ .design_capacity_of_warning = 0x8f,
|
||||||
|
+ .design_capacity_of_low = 0x47,
|
||||||
|
+ .cycle_count = 0xffffffff,
|
||||||
|
+ .measurement_accuracy = 0x00015f90,
|
||||||
|
+ .max_sampling_time = 0x03e8,
|
||||||
|
+ .min_sampling_time = 0x03e8,
|
||||||
|
+ .max_average_interval = 0x03e8,
|
||||||
|
+ .min_average_interval = 0x03e8,
|
||||||
|
+ .battery_capacity_granularity_1 = 0x45,
|
||||||
|
+ .battery_capacity_granularity_2 = 0x11,
|
||||||
|
+ .model = "P11G8M",
|
||||||
|
+ .serial = "",
|
||||||
|
+ .type = "LION",
|
||||||
|
+ .OEM = "",
|
||||||
|
+};
|
||||||
|
+
|
||||||
|
+static int mshw0011_bix(struct mshw0011_data *cdata, struct bix *bix)
|
||||||
|
+{
|
||||||
|
+ struct i2c_client *client = cdata->bat0;
|
||||||
|
+ char buf[10];
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ *bix = default_bix;
|
||||||
|
+
|
||||||
|
+ /* get design capacity */
|
||||||
|
+ ret = i2c_smbus_read_word_data(client,
|
||||||
|
+ MSHW0011_BAT0_REG_DESIGN_CAPACITY);
|
||||||
|
+ if (ret < 0) {
|
||||||
|
+ dev_err(&client->dev, "Error reading design capacity: %d\n",
|
||||||
|
+ ret);
|
||||||
|
+ return ret;
|
||||||
|
+ }
|
||||||
|
+ bix->design_capacity = ret;
|
||||||
|
+
|
||||||
|
+ /* get last full charge capacity */
|
||||||
|
+ ret = i2c_smbus_read_word_data(client,
|
||||||
|
+ MSHW0011_BAT0_REG_FULL_CHG_CAPACITY);
|
||||||
|
+ if (ret < 0) {
|
||||||
|
+ dev_err(&client->dev,
|
||||||
|
+ "Error reading last full charge capacity: %d\n", ret);
|
||||||
|
+ return ret;
|
||||||
|
+ }
|
||||||
|
+ bix->last_full_charg_capacity = ret;
|
||||||
|
+
|
||||||
|
+ /* get serial number */
|
||||||
|
+ ret = i2c_smbus_read_i2c_block_data(client, MSHW0011_BAT0_REG_SERIAL_NO,
|
||||||
|
+ 10, buf);
|
||||||
|
+ if (ret != 10) {
|
||||||
|
+ dev_err(&client->dev, "Error reading serial no: %d\n", ret);
|
||||||
|
+ return ret;
|
||||||
|
+ }
|
||||||
|
+ snprintf(bix->serial, ARRAY_SIZE(bix->serial),
|
||||||
|
+ "%*pE%*pE", 3, buf + 7, 6, buf);
|
||||||
|
+
|
||||||
|
+ /* get cycle count */
|
||||||
|
+ ret = i2c_smbus_read_word_data(client, MSHW0011_BAT0_REG_CYCLE_CNT);
|
||||||
|
+ if (ret < 0) {
|
||||||
|
+ dev_err(&client->dev, "Error reading cycle count: %d\n", ret);
|
||||||
|
+ return ret;
|
||||||
|
+ }
|
||||||
|
+ bix->cycle_count = ret;
|
||||||
|
+
|
||||||
|
+ /* get OEM name */
|
||||||
|
+ ret = i2c_smbus_read_i2c_block_data(client, MSHW0011_BAT0_REG_OEM,
|
||||||
|
+ 4, buf);
|
||||||
|
+ if (ret != 4) {
|
||||||
|
+ dev_err(&client->dev, "Error reading cycle count: %d\n", ret);
|
||||||
|
+ return ret;
|
||||||
|
+ }
|
||||||
|
+ snprintf(bix->OEM, ARRAY_SIZE(bix->OEM), "%*pE", 3, buf);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int mshw0011_bst(struct mshw0011_data *cdata, struct bst *bst)
|
||||||
|
+{
|
||||||
|
+ struct i2c_client *client = cdata->bat0;
|
||||||
|
+ int rate, capacity, voltage, state;
|
||||||
|
+ s16 tmp;
|
||||||
|
+
|
||||||
|
+ rate = i2c_smbus_read_word_data(client, MSHW0011_BAT0_REG_RATE);
|
||||||
|
+ if (rate < 0)
|
||||||
|
+ return rate;
|
||||||
|
+
|
||||||
|
+ capacity = i2c_smbus_read_word_data(client, MSHW0011_BAT0_REG_CAPACITY);
|
||||||
|
+ if (capacity < 0)
|
||||||
|
+ return capacity;
|
||||||
|
+
|
||||||
|
+ voltage = i2c_smbus_read_word_data(client, MSHW0011_BAT0_REG_VOLTAGE);
|
||||||
|
+ if (voltage < 0)
|
||||||
|
+ return voltage;
|
||||||
|
+
|
||||||
|
+ tmp = rate;
|
||||||
|
+ bst->battery_present_rate = abs((s32)tmp);
|
||||||
|
+
|
||||||
|
+ state = 0;
|
||||||
|
+ if ((s32) tmp > 0)
|
||||||
|
+ state |= ACPI_BATTERY_STATE_CHARGING;
|
||||||
|
+ else if ((s32) tmp < 0)
|
||||||
|
+ state |= ACPI_BATTERY_STATE_DISCHARGING;
|
||||||
|
+ bst->battery_state = state;
|
||||||
|
+
|
||||||
|
+ bst->battery_remaining_capacity = capacity;
|
||||||
|
+ bst->battery_present_voltage = voltage;
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int mshw0011_adp_psr(struct mshw0011_data *cdata)
|
||||||
|
+{
|
||||||
|
+ struct i2c_client *client = cdata->adp1;
|
||||||
|
+ int ret;
|
||||||
|
+
|
||||||
|
+ ret = i2c_smbus_read_byte_data(client, MSHW0011_ADP1_REG_PSR);
|
||||||
|
+ if (ret < 0)
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
+ return ret;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int mshw0011_isr(struct mshw0011_data *cdata)
|
||||||
|
+{
|
||||||
|
+ struct bst bst;
|
||||||
|
+ struct bix bix;
|
||||||
|
+ int ret;
|
||||||
|
+ bool status, bat_status;
|
||||||
|
+
|
||||||
|
+ ret = mshw0011_adp_psr(cdata);
|
||||||
|
+ if (ret < 0)
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
+ status = ret;
|
||||||
|
+
|
||||||
|
+ if (status != cdata->charging)
|
||||||
|
+ mshw0011_notify(cdata, cdata->notify_mask,
|
||||||
|
+ MSHW0011_NOTIFY_ADP1, &ret);
|
||||||
|
+
|
||||||
|
+ cdata->charging = status;
|
||||||
|
+
|
||||||
|
+ ret = mshw0011_bst(cdata, &bst);
|
||||||
|
+ if (ret < 0)
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
+ bat_status = bst.battery_state;
|
||||||
|
+
|
||||||
|
+ if (bat_status != cdata->bat_charging)
|
||||||
|
+ mshw0011_notify(cdata, cdata->notify_mask,
|
||||||
|
+ MSHW0011_NOTIFY_BAT0_BST, &ret);
|
||||||
|
+
|
||||||
|
+ cdata->bat_charging = bat_status;
|
||||||
|
+
|
||||||
|
+ ret = mshw0011_bix(cdata, &bix);
|
||||||
|
+ if (ret < 0)
|
||||||
|
+ return ret;
|
||||||
|
+ if (bix.last_full_charg_capacity != cdata->full_capacity)
|
||||||
|
+ mshw0011_notify(cdata, cdata->notify_mask,
|
||||||
|
+ MSHW0011_NOTIFY_BAT0_BIX, &ret);
|
||||||
|
+
|
||||||
|
+ cdata->full_capacity = bix.last_full_charg_capacity;
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int mshw0011_poll_task(void *data)
|
||||||
|
+{
|
||||||
|
+ struct mshw0011_data *cdata = data;
|
||||||
|
+ int ret = 0;
|
||||||
|
+
|
||||||
|
+ cdata->kthread_running = true;
|
||||||
|
+
|
||||||
|
+ set_freezable();
|
||||||
|
+
|
||||||
|
+ while (!kthread_should_stop()) {
|
||||||
|
+ schedule_timeout_interruptible(POLL_INTERVAL);
|
||||||
|
+ try_to_freeze();
|
||||||
|
+ ret = mshw0011_isr(data);
|
||||||
|
+ if (ret)
|
||||||
|
+ break;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ cdata->kthread_running = false;
|
||||||
|
+ return ret;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static acpi_status
|
||||||
|
+mshw0011_space_handler(u32 function, acpi_physical_address command,
|
||||||
|
+ u32 bits, u64 *value64,
|
||||||
|
+ void *handler_context, void *region_context)
|
||||||
|
+{
|
||||||
|
+ struct gsb_buffer *gsb = (struct gsb_buffer *)value64;
|
||||||
|
+ struct mshw0011_handler_data *data = handler_context;
|
||||||
|
+ struct acpi_connection_info *info = &data->info;
|
||||||
|
+ struct acpi_resource_i2c_serialbus *sb;
|
||||||
|
+ struct i2c_client *client = data->client;
|
||||||
|
+ struct mshw0011_data *cdata = i2c_get_clientdata(client);
|
||||||
|
+ struct acpi_resource *ares;
|
||||||
|
+ u32 accessor_type = function >> 16;
|
||||||
|
+ acpi_status ret;
|
||||||
|
+ int status = 1;
|
||||||
|
+
|
||||||
|
+ ret = acpi_buffer_to_resource(info->connection, info->length, &ares);
|
||||||
|
+ if (ACPI_FAILURE(ret))
|
||||||
|
+ return ret;
|
||||||
|
+
|
||||||
|
+ if (!value64 || ares->type != ACPI_RESOURCE_TYPE_SERIAL_BUS) {
|
||||||
|
+ ret = AE_BAD_PARAMETER;
|
||||||
|
+ goto err;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ sb = &ares->data.i2c_serial_bus;
|
||||||
|
+ if (sb->type != ACPI_RESOURCE_SERIAL_TYPE_I2C) {
|
||||||
|
+ ret = AE_BAD_PARAMETER;
|
||||||
|
+ goto err;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (accessor_type != ACPI_GSB_ACCESS_ATTRIB_RAW_PROCESS) {
|
||||||
|
+ ret = AE_BAD_PARAMETER;
|
||||||
|
+ goto err;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (gsb->cmd.arg0 == MSHW0011_CMD_DEST_ADP1 &&
|
||||||
|
+ gsb->cmd.arg1 == MSHW0011_CMD_ADP1_PSR) {
|
||||||
|
+ ret = mshw0011_adp_psr(cdata);
|
||||||
|
+ if (ret >= 0) {
|
||||||
|
+ status = ret;
|
||||||
|
+ ret = 0;
|
||||||
|
+ }
|
||||||
|
+ goto out;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (gsb->cmd.arg0 != MSHW0011_CMD_DEST_BAT0) {
|
||||||
|
+ ret = AE_BAD_PARAMETER;
|
||||||
|
+ goto err;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ switch (gsb->cmd.arg1) {
|
||||||
|
+ case MSHW0011_CMD_BAT0_STA:
|
||||||
|
+ break;
|
||||||
|
+ case MSHW0011_CMD_BAT0_BIX:
|
||||||
|
+ ret = mshw0011_bix(cdata, &gsb->bix);
|
||||||
|
+ break;
|
||||||
|
+ case MSHW0011_CMD_BAT0_BTP:
|
||||||
|
+ cdata->trip_point = gsb->cmd.arg2;
|
||||||
|
+ break;
|
||||||
|
+ case MSHW0011_CMD_BAT0_BST:
|
||||||
|
+ ret = mshw0011_bst(cdata, &gsb->bst);
|
||||||
|
+ break;
|
||||||
|
+ default:
|
||||||
|
+ pr_info("command(0x%02x) is not supported.\n", gsb->cmd.arg1);
|
||||||
|
+ ret = AE_BAD_PARAMETER;
|
||||||
|
+ goto err;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ out:
|
||||||
|
+ gsb->ret = status;
|
||||||
|
+ gsb->status = 0;
|
||||||
|
+
|
||||||
|
+ err:
|
||||||
|
+ ACPI_FREE(ares);
|
||||||
|
+ return ret;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int mshw0011_install_space_handler(struct i2c_client *client)
|
||||||
|
+{
|
||||||
|
+ acpi_handle handle;
|
||||||
|
+ struct mshw0011_handler_data *data;
|
||||||
|
+ acpi_status status;
|
||||||
|
+
|
||||||
|
+ handle = ACPI_HANDLE(&client->dev);
|
||||||
|
+
|
||||||
|
+ if (!handle)
|
||||||
|
+ return -ENODEV;
|
||||||
|
+
|
||||||
|
+ data = kzalloc(sizeof(struct mshw0011_handler_data),
|
||||||
|
+ GFP_KERNEL);
|
||||||
|
+ if (!data)
|
||||||
|
+ return -ENOMEM;
|
||||||
|
+
|
||||||
|
+ data->client = client;
|
||||||
|
+ status = acpi_bus_attach_private_data(handle, (void *)data);
|
||||||
|
+ if (ACPI_FAILURE(status)) {
|
||||||
|
+ kfree(data);
|
||||||
|
+ return -ENOMEM;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ status = acpi_install_address_space_handler(handle,
|
||||||
|
+ ACPI_ADR_SPACE_GSBUS,
|
||||||
|
+ &mshw0011_space_handler,
|
||||||
|
+ NULL,
|
||||||
|
+ data);
|
||||||
|
+ if (ACPI_FAILURE(status)) {
|
||||||
|
+ dev_err(&client->dev, "Error installing i2c space handler\n");
|
||||||
|
+ acpi_bus_detach_private_data(handle);
|
||||||
|
+ kfree(data);
|
||||||
|
+ return -ENOMEM;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ acpi_walk_dep_device_list(handle);
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void mshw0011_remove_space_handler(struct i2c_client *client)
|
||||||
|
+{
|
||||||
|
+ acpi_handle handle = ACPI_HANDLE(&client->dev);
|
||||||
|
+ struct mshw0011_handler_data *data;
|
||||||
|
+ acpi_status status;
|
||||||
|
+
|
||||||
|
+ if (!handle)
|
||||||
|
+ return;
|
||||||
|
+
|
||||||
|
+ acpi_remove_address_space_handler(handle,
|
||||||
|
+ ACPI_ADR_SPACE_GSBUS,
|
||||||
|
+ &mshw0011_space_handler);
|
||||||
|
+
|
||||||
|
+ status = acpi_bus_get_private_data(handle, (void **)&data);
|
||||||
|
+ if (ACPI_SUCCESS(status))
|
||||||
|
+ kfree(data);
|
||||||
|
+
|
||||||
|
+ acpi_bus_detach_private_data(handle);
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int mshw0011_probe(struct i2c_client *client)
|
||||||
|
+{
|
||||||
|
+ struct i2c_board_info board_info;
|
||||||
|
+ struct device *dev = &client->dev;
|
||||||
|
+ struct i2c_client *bat0;
|
||||||
|
+
|
||||||
|
+ struct mshw0011_data *data;
|
||||||
|
+ int error, mask;
|
||||||
|
+
|
||||||
|
+ data = devm_kzalloc(dev, sizeof(*data), GFP_KERNEL);
|
||||||
|
+ if (!data)
|
||||||
|
+ return -ENOMEM;
|
||||||
|
+
|
||||||
|
+ data->adp1 = client;
|
||||||
|
+ i2c_set_clientdata(client, data);
|
||||||
|
+
|
||||||
|
+ memset(&board_info, 0, sizeof(board_info));
|
||||||
|
+ strlcpy(board_info.type, "MSHW0011-bat0", I2C_NAME_SIZE);
|
||||||
|
+
|
||||||
|
+ bat0 = i2c_acpi_new_device(dev, 1, &board_info);
|
||||||
|
+ if (!bat0)
|
||||||
|
+ return -ENOMEM;
|
||||||
|
+
|
||||||
|
+ data->bat0 = bat0;
|
||||||
|
+ i2c_set_clientdata(bat0, data);
|
||||||
|
+
|
||||||
|
+ error = mshw0011_notify(data, 1, MSHW0011_NOTIFY_GET_VERSION, &mask);
|
||||||
|
+ if (error)
|
||||||
|
+ goto out_err;
|
||||||
|
+
|
||||||
|
+ data->notify_mask = mask == MSHW0011_EV_2_5;
|
||||||
|
+
|
||||||
|
+ data->poll_task = kthread_run(mshw0011_poll_task, data, "mshw0011_adp");
|
||||||
|
+ if (IS_ERR(data->poll_task)) {
|
||||||
|
+ error = PTR_ERR(data->poll_task);
|
||||||
|
+ dev_err(&client->dev, "Unable to run kthread err %d\n", error);
|
||||||
|
+ goto out_err;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ error = mshw0011_install_space_handler(client);
|
||||||
|
+ if (error)
|
||||||
|
+ goto out_err;
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+
|
||||||
|
+out_err:
|
||||||
|
+ if (data->kthread_running)
|
||||||
|
+ kthread_stop(data->poll_task);
|
||||||
|
+ i2c_unregister_device(data->bat0);
|
||||||
|
+ return error;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static int mshw0011_remove(struct i2c_client *client)
|
||||||
|
+{
|
||||||
|
+ struct mshw0011_data *cdata = i2c_get_clientdata(client);
|
||||||
|
+
|
||||||
|
+ mshw0011_remove_space_handler(client);
|
||||||
|
+
|
||||||
|
+ if (cdata->kthread_running)
|
||||||
|
+ kthread_stop(cdata->poll_task);
|
||||||
|
+
|
||||||
|
+ i2c_unregister_device(cdata->bat0);
|
||||||
|
+
|
||||||
|
+ return 0;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static const struct acpi_device_id mshw0011_acpi_match[] = {
|
||||||
|
+ { "MSHW0011", 0 },
|
||||||
|
+ { }
|
||||||
|
+};
|
||||||
|
+MODULE_DEVICE_TABLE(acpi, mshw0011_acpi_match);
|
||||||
|
+
|
||||||
|
+static struct i2c_driver mshw0011_driver = {
|
||||||
|
+ .probe_new = mshw0011_probe,
|
||||||
|
+ .remove = mshw0011_remove,
|
||||||
|
+ .driver = {
|
||||||
|
+ .name = "mshw0011",
|
||||||
|
+ .acpi_match_table = ACPI_PTR(mshw0011_acpi_match),
|
||||||
|
+ },
|
||||||
|
+};
|
||||||
|
+module_i2c_driver(mshw0011_driver);
|
||||||
|
+
|
||||||
|
+MODULE_AUTHOR("Benjamin Tissoires <benjamin.tissoires@gmail.com>");
|
||||||
|
+MODULE_DESCRIPTION("mshw0011 driver");
|
||||||
|
+MODULE_LICENSE("GPL v2");
|
||||||
|
--
|
||||||
|
2.21.0
|
||||||
|
|
25
patches/5.1/0010-surface-dock.patch
Normal file
25
patches/5.1/0010-surface-dock.patch
Normal file
|
@ -0,0 +1,25 @@
|
||||||
|
From d98b685791c6001530e73a6e1a6e13a308a911d9 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Maximilian Luz <luzmaximilian@gmail.com>
|
||||||
|
Date: Thu, 16 May 2019 01:06:31 +0200
|
||||||
|
Subject: [PATCH 10/12] surface-dock
|
||||||
|
|
||||||
|
---
|
||||||
|
drivers/usb/core/quirks.c | 2 ++
|
||||||
|
1 file changed, 2 insertions(+)
|
||||||
|
|
||||||
|
diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
|
||||||
|
index 8bc35d53408b..11fa56cbd769 100644
|
||||||
|
--- a/drivers/usb/core/quirks.c
|
||||||
|
+++ b/drivers/usb/core/quirks.c
|
||||||
|
@@ -212,6 +212,8 @@ static const struct usb_device_id usb_quirk_list[] = {
|
||||||
|
/* Cherry Stream G230 2.0 (G85-231) and 3.0 (G85-232) */
|
||||||
|
{ USB_DEVICE(0x046a, 0x0023), .driver_info = USB_QUIRK_RESET_RESUME },
|
||||||
|
|
||||||
|
+ { USB_DEVICE(0x045e, 0x07c6), .driver_info = USB_QUIRK_NO_LPM },
|
||||||
|
+
|
||||||
|
/* Logitech HD Pro Webcams C920, C920-C, C925e and C930e */
|
||||||
|
{ USB_DEVICE(0x046d, 0x082d), .driver_info = USB_QUIRK_DELAY_INIT },
|
||||||
|
{ USB_DEVICE(0x046d, 0x0841), .driver_info = USB_QUIRK_DELAY_INIT },
|
||||||
|
--
|
||||||
|
2.21.0
|
||||||
|
|
19755
patches/5.1/0011-mwlwifi.patch
Normal file
19755
patches/5.1/0011-mwlwifi.patch
Normal file
File diff suppressed because it is too large
Load diff
24
patches/5.1/0012-surface-lte.patch
Normal file
24
patches/5.1/0012-surface-lte.patch
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
From 72d8973b13354125b9a5c6f6693f15bf57717691 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Maximilian Luz <luzmaximilian@gmail.com>
|
||||||
|
Date: Thu, 16 May 2019 01:07:48 +0200
|
||||||
|
Subject: [PATCH 12/12] surface-lte
|
||||||
|
|
||||||
|
---
|
||||||
|
drivers/usb/serial/qcserial.c | 1 +
|
||||||
|
1 file changed, 1 insertion(+)
|
||||||
|
|
||||||
|
diff --git a/drivers/usb/serial/qcserial.c b/drivers/usb/serial/qcserial.c
|
||||||
|
index 613f91add03d..e1428222dd73 100644
|
||||||
|
--- a/drivers/usb/serial/qcserial.c
|
||||||
|
+++ b/drivers/usb/serial/qcserial.c
|
||||||
|
@@ -177,6 +177,7 @@ static const struct usb_device_id id_table[] = {
|
||||||
|
{DEVICE_SWI(0x413c, 0x81d0)}, /* Dell Wireless 5819 */
|
||||||
|
{DEVICE_SWI(0x413c, 0x81d1)}, /* Dell Wireless 5818 */
|
||||||
|
{DEVICE_SWI(0x413c, 0x81d2)}, /* Dell Wireless 5818 */
|
||||||
|
+ {DEVICE_SWI(0x045e, 0x096e)}, /* Microsoft Surface Go LTE */
|
||||||
|
|
||||||
|
/* Huawei devices */
|
||||||
|
{DEVICE_HWI(0x03f0, 0x581d)}, /* HP lt4112 LTE/HSPA+ Gobi 4G Modem (Huawei me906e) */
|
||||||
|
--
|
||||||
|
2.21.0
|
||||||
|
|
Loading…
Reference in a new issue