adding patches for 4.16 kernels
This commit is contained in:
parent
1ffa646802
commit
b1a3bd85d7
156
patches-4.16/cameras.patch
Normal file
156
patches-4.16/cameras.patch
Normal file
|
@ -0,0 +1,156 @@
|
|||
diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c
|
||||
index fd387bf..35ae5af 100644
|
||||
--- a/drivers/media/usb/uvc/uvc_driver.c
|
||||
+++ b/drivers/media/usb/uvc/uvc_driver.c
|
||||
@@ -2353,6 +2353,46 @@ static const struct uvc_device_info uvc_quirk_force_y8 = {
|
||||
* though they are compliant.
|
||||
*/
|
||||
static const struct usb_device_id uvc_ids[] = {
|
||||
+ /* Microsoft Surface Pro 3 Front */
|
||||
+ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
||||
+ | USB_DEVICE_ID_MATCH_INT_INFO,
|
||||
+ .idVendor = 0x045e,
|
||||
+ .idProduct = 0x07be,
|
||||
+ .bInterfaceClass = USB_CLASS_VIDEO,
|
||||
+ .bInterfaceSubClass = 1,
|
||||
+ .bInterfaceProtocol = 1 },
|
||||
+ /* Microsoft Surface Pro 3 Rear */
|
||||
+ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
||||
+ | USB_DEVICE_ID_MATCH_INT_INFO,
|
||||
+ .idVendor = 0x045e,
|
||||
+ .idProduct = 0x07bf,
|
||||
+ .bInterfaceClass = USB_CLASS_VIDEO,
|
||||
+ .bInterfaceSubClass = 1,
|
||||
+ .bInterfaceProtocol = 1 },
|
||||
+ /* Microsoft Surface Pro 4 Cam */
|
||||
+ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
||||
+ | USB_DEVICE_ID_MATCH_INT_INFO,
|
||||
+ .idVendor = 0x045e,
|
||||
+ .idProduct = 0x090c,
|
||||
+ .bInterfaceClass = USB_CLASS_VIDEO,
|
||||
+ .bInterfaceSubClass = 1,
|
||||
+ .bInterfaceProtocol = 1 },
|
||||
+ /* Microsoft Surface Book Cam 1 */
|
||||
+ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
||||
+ | USB_DEVICE_ID_MATCH_INT_INFO,
|
||||
+ .idVendor = 0x045e,
|
||||
+ .idProduct = 0x090b,
|
||||
+ .bInterfaceClass = USB_CLASS_VIDEO,
|
||||
+ .bInterfaceSubClass = 1,
|
||||
+ .bInterfaceProtocol = 1 },
|
||||
+ /* Microsoft Surface Book Cam 2 */
|
||||
+ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
||||
+ | USB_DEVICE_ID_MATCH_INT_INFO,
|
||||
+ .idVendor = 0x045e,
|
||||
+ .idProduct = 0x091a,
|
||||
+ .bInterfaceClass = USB_CLASS_VIDEO,
|
||||
+ .bInterfaceSubClass = 1,
|
||||
+ .bInterfaceProtocol = 1 },
|
||||
/* LogiLink Wireless Webcam */
|
||||
{ .match_flags = USB_DEVICE_ID_MATCH_DEVICE
|
||||
| USB_DEVICE_ID_MATCH_INT_INFO,
|
||||
diff --git a/drivers/staging/media/atomisp/i2c/ov5693/Kconfig b/drivers/staging/media/atomisp/i2c/ov5693/Kconfig
|
||||
index 3f527f2..b882948 100644
|
||||
--- a/drivers/staging/media/atomisp/i2c/ov5693/Kconfig
|
||||
+++ b/drivers/staging/media/atomisp/i2c/ov5693/Kconfig
|
||||
@@ -1,7 +1,7 @@
|
||||
config VIDEO_ATOMISP_OV5693
|
||||
tristate "Omnivision ov5693 sensor support"
|
||||
depends on ACPI
|
||||
- depends on I2C && VIDEO_V4L2
|
||||
+ depends on I2C && VIDEO_V4L2 && MEDIA_CONTROLLER
|
||||
---help---
|
||||
This is a Video4Linux2 sensor-level driver for the Micron
|
||||
ov5693 5 Mpixel camera.
|
||||
diff --git a/drivers/staging/media/atomisp/i2c/ov5693/atomisp-ov5693.c b/drivers/staging/media/atomisp/i2c/ov5693/atomisp-ov5693.c
|
||||
index 40d01bf..4f33294 100644
|
||||
--- a/drivers/staging/media/atomisp/i2c/ov5693/atomisp-ov5693.c
|
||||
+++ b/drivers/staging/media/atomisp/i2c/ov5693/atomisp-ov5693.c
|
||||
@@ -1335,11 +1335,15 @@ static int power_ctrl(struct v4l2_subdev *sd, bool flag)
|
||||
static int gpio_ctrl(struct v4l2_subdev *sd, bool flag)
|
||||
{
|
||||
struct ov5693_device *dev = to_ov5693_sensor(sd);
|
||||
+ int ret = 0;
|
||||
|
||||
if (!dev || !dev->platform_data)
|
||||
return -ENODEV;
|
||||
|
||||
- return dev->platform_data->gpio0_ctrl(sd, flag);
|
||||
+ if (dev->platform_data->gpio0_ctrl)
|
||||
+ ret = dev->platform_data->gpio0_ctrl(sd, flag);
|
||||
+
|
||||
+ return ret;
|
||||
}
|
||||
|
||||
static int __power_up(struct v4l2_subdev *sd)
|
||||
@@ -1707,7 +1711,7 @@ static int ov5693_detect(struct i2c_client *client)
|
||||
OV5693_SC_CMMN_CHIP_ID_L, &low);
|
||||
id = ((((u16) high) << 8) | (u16) low);
|
||||
|
||||
- if (id != OV5693_ID) {
|
||||
+ if (id != OV5690_ID && id != OV5693_ID) {
|
||||
dev_err(&client->dev, "sensor ID error 0x%x\n", id);
|
||||
return -ENODEV;
|
||||
}
|
||||
diff --git a/drivers/staging/media/atomisp/i2c/ov5693/ov5693.h b/drivers/staging/media/atomisp/i2c/ov5693/ov5693.h
|
||||
index 68cfcb4..b4616ac 100644
|
||||
--- a/drivers/staging/media/atomisp/i2c/ov5693/ov5693.h
|
||||
+++ b/drivers/staging/media/atomisp/i2c/ov5693/ov5693.h
|
||||
@@ -29,7 +29,7 @@
|
||||
#include <linux/v4l2-mediabus.h>
|
||||
#include <media/media-entity.h>
|
||||
|
||||
-#include "../../include/linux/atomisp_platform.h"
|
||||
+#include "../../include/linux/atomisp_gmin_platform.h"
|
||||
|
||||
#define OV5693_POWER_UP_RETRY_NUM 5
|
||||
|
||||
@@ -72,7 +72,8 @@
|
||||
* bits 7-0: min f-number denominator
|
||||
*/
|
||||
#define OV5693_F_NUMBER_RANGE 0x180a180a
|
||||
-#define OV5693_ID 0x5690
|
||||
+#define OV5690_ID 0x5690
|
||||
+#define OV5693_ID 0x5693
|
||||
|
||||
#define OV5693_FINE_INTG_TIME_MIN 0
|
||||
#define OV5693_FINE_INTG_TIME_MAX_MARGIN 0
|
||||
diff --git a/drivers/staging/media/atomisp/platform/intel-mid/atomisp_gmin_platform.c b/drivers/staging/media/atomisp/platform/intel-mid/atomisp_gmin_platform.c
|
||||
index d8b7183..d9d8c48 100644
|
||||
--- a/drivers/staging/media/atomisp/platform/intel-mid/atomisp_gmin_platform.c
|
||||
+++ b/drivers/staging/media/atomisp/platform/intel-mid/atomisp_gmin_platform.c
|
||||
@@ -249,11 +249,13 @@ static struct gmin_cfg_var ecs7_vars[] = {
|
||||
{"INT33BE:00_CsiFmt", "13"},
|
||||
{"INT33BE:00_CsiBayer", "2"},
|
||||
{"INT33BE:00_CamClk", "0"},
|
||||
+ {"INT33BE:00_ClkSrc", "1"},
|
||||
{"INT33F0:00_CsiPort", "0"},
|
||||
{"INT33F0:00_CsiLanes", "1"},
|
||||
{"INT33F0:00_CsiFmt", "13"},
|
||||
{"INT33F0:00_CsiBayer", "0"},
|
||||
{"INT33F0:00_CamClk", "1"},
|
||||
+ {"INT33BE:00_I2CAddr", "-1"},
|
||||
{"gmin_V2P8GPIO", "402"},
|
||||
{},
|
||||
};
|
||||
@@ -305,6 +307,20 @@ static const struct dmi_system_id gmin_vars[] = {
|
||||
},
|
||||
.driver_data = i8880_vars,
|
||||
},
|
||||
+ {
|
||||
+ .ident = "Surface Book",
|
||||
+ .matches = {
|
||||
+ DMI_MATCH(DMI_BOARD_NAME, "Surface Book"),
|
||||
+ },
|
||||
+ .driver_data = ecs7_vars,
|
||||
+ },
|
||||
+ {
|
||||
+ .ident = "Surface Pro 4",
|
||||
+ .matches = {
|
||||
+ DMI_MATCH(DMI_BOARD_NAME, "Surface Pro 4"),
|
||||
+ },
|
||||
+ .driver_data = ecs7_vars,
|
||||
+ },
|
||||
{}
|
||||
};
|
||||
|
6014
patches-4.16/ipts.patch
Normal file
6014
patches-4.16/ipts.patch
Normal file
File diff suppressed because it is too large
Load diff
116
patches-4.16/keyboards_and_covers.patch
Normal file
116
patches-4.16/keyboards_and_covers.patch
Normal file
|
@ -0,0 +1,116 @@
|
|||
diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h
|
||||
index 9454ac1..ae2f26c 100644
|
||||
--- a/drivers/hid/hid-ids.h
|
||||
+++ b/drivers/hid/hid-ids.h
|
||||
@@ -774,11 +774,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_LAPTOP 0xf001
|
||||
+#define HID_DEVICE_ID_MS_SURFACE_LAPTOP 0xf001
|
||||
+#define USB_DEVICE_ID_MS_POWER_COVER 0x07da
|
||||
|
||||
#define USB_VENDOR_ID_MOJO 0x8282
|
||||
#define USB_DEVICE_ID_RETRO_ADAPTER 0x3201
|
||||
diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c
|
||||
index 3b4739bd..82cee6c 100644
|
||||
--- a/drivers/hid/hid-multitouch.c
|
||||
+++ b/drivers/hid/hid-multitouch.c
|
||||
@@ -1743,6 +1743,58 @@ 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 Laptop */
|
||||
+ { .driver_data = MT_CLS_EXPORT_ALL_INPUTS,
|
||||
+ HID_DEVICE(HID_BUS_ANY, HID_GROUP_ANY,
|
||||
+ USB_VENDOR_ID_MICROSOFT,
|
||||
+ HID_DEVICE_ID_MS_SURFACE_LAPTOP) },
|
||||
+
|
||||
+ /* 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 e92b77f..3cfadf1 100644
|
||||
--- a/drivers/hid/hid-quirks.c
|
||||
+++ b/drivers/hid/hid-quirks.c
|
||||
@@ -110,6 +110,16 @@ 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_LAPTOP), HID_QUIRK_NO_INIT_REPORTS },
|
||||
{ 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 },
|
20
patches-4.16/sdcard_reader.patch
Normal file
20
patches-4.16/sdcard_reader.patch
Normal file
|
@ -0,0 +1,20 @@
|
|||
From fbd83f772a3be3a00bae323f6d71a59b26352c57 Mon Sep 17 00:00:00 2001
|
||||
From: Jake Day <jake@ninebysix.com>
|
||||
Date: Fri, 2 Feb 2018 11:22:21 -0500
|
||||
Subject: fix for surface sd card reader
|
||||
|
||||
|
||||
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
|
||||
index cf7bbcb..826fdb8 100644
|
||||
--- a/drivers/usb/core/hub.c
|
||||
+++ b/drivers/usb/core/hub.c
|
||||
@@ -4047,7 +4047,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--;
|
471
patches-4.16/surfaceacpi.patch
Normal file
471
patches-4.16/surfaceacpi.patch
Normal file
|
@ -0,0 +1,471 @@
|
|||
diff --git a/drivers/platform/x86/Kconfig b/drivers/platform/x86/Kconfig
|
||||
index 9a8f964..58454cd 100644
|
||||
--- a/drivers/platform/x86/Kconfig
|
||||
+++ b/drivers/platform/x86/Kconfig
|
||||
@@ -1141,6 +1141,15 @@ config SURFACE_3_BUTTON
|
||||
---help---
|
||||
This driver handles the power/home/volume buttons on the Microsoft Surface 3 tablet.
|
||||
|
||||
+config ACPI_SURFACE
|
||||
+ tristate "Microsoft Surface Extras"
|
||||
+ depends on ACPI
|
||||
+ depends on ACPI_WMI
|
||||
+ depends on INPUT
|
||||
+ ---help---
|
||||
+ This driver adds support for access to certain system events
|
||||
+ on Microsoft Surface devices.
|
||||
+
|
||||
config INTEL_PUNIT_IPC
|
||||
tristate "Intel P-Unit IPC Driver"
|
||||
---help---
|
||||
diff --git a/drivers/platform/x86/Makefile b/drivers/platform/x86/Makefile
|
||||
index c388608..55ceae6 100644
|
||||
--- a/drivers/platform/x86/Makefile
|
||||
+++ b/drivers/platform/x86/Makefile
|
||||
@@ -80,6 +80,7 @@ obj-$(CONFIG_INTEL_PMC_IPC) += intel_pmc_ipc.o
|
||||
obj-$(CONFIG_SILEAD_DMI) += silead_dmi.o
|
||||
obj-$(CONFIG_SURFACE_PRO3_BUTTON) += surfacepro3_button.o
|
||||
obj-$(CONFIG_SURFACE_3_BUTTON) += surface3_button.o
|
||||
+obj-$(CONFIG_ACPI_SURFACE) += surface_acpi.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/surface_acpi.c b/drivers/platform/x86/surface_acpi.c
|
||||
new file mode 100644
|
||||
index 0000000..b65f7c3
|
||||
--- /dev/null
|
||||
+++ b/drivers/platform/x86/surface_acpi.c
|
||||
@@ -0,0 +1,433 @@
|
||||
+/*
|
||||
+ * surface_acpi.c - Microsoft Surface ACPI Notify
|
||||
+ *
|
||||
+ * This program is free software; you can redistribute it and/or modify
|
||||
+ * it under the terms of the GNU General Public License as published by
|
||||
+ * the Free Software Foundation; either version 2 of the License, or
|
||||
+ * (at your option) any later version.
|
||||
+ *
|
||||
+ * This program is distributed in the hope that it will be useful,
|
||||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
+ * GNU General Public License for more details.
|
||||
+ *
|
||||
+ * The full GNU General Public License is included in this distribution in
|
||||
+ * the file called "COPYING".
|
||||
+ */
|
||||
+
|
||||
+#define SURFACE_ACPI_VERSION "0.1"
|
||||
+#define SURFACE_GEN_VERSION 0x08
|
||||
+#define PROC_SURFACE "surface"
|
||||
+
|
||||
+#include <linux/kernel.h>
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/init.h>
|
||||
+#include <linux/types.h>
|
||||
+#include <linux/acpi.h>
|
||||
+#include <linux/power_supply.h>
|
||||
+#include <linux/thermal.h>
|
||||
+#include <linux/dmi.h>
|
||||
+#include <linux/seq_file.h>
|
||||
+#include <acpi/acpi_bus.h>
|
||||
+#include <acpi/acpi_drivers.h>
|
||||
+
|
||||
+MODULE_AUTHOR("Jake Day");
|
||||
+MODULE_DESCRIPTION("Microsoft Surface ACPI Notify Driver");
|
||||
+MODULE_LICENSE("GPL");
|
||||
+
|
||||
+#define SUR_METHOD_DSM "_DSM"
|
||||
+#define SUR_METHOD_REG "_REG"
|
||||
+#define SUR_METHOD_STA "_STA"
|
||||
+
|
||||
+#define SUR_QUERY_DEVICE 0x00
|
||||
+#define SUR_SET_DVER 0x01
|
||||
+#define SUR_GET_BOARD_REVID 0x02
|
||||
+#define SUR_BAT1_STATE_CHANGE 0x03
|
||||
+#define SUR_BAT1_INFO_CHANGE 0x04
|
||||
+#define SUR_PSU_STATE_CHANGE 0x05
|
||||
+#define SUR_PSU_INFO_CHANGE 0x06
|
||||
+#define SUR_BAT2_STATE_CHANGE 0x07
|
||||
+#define SUR_BAT2_INFO_CHANGE 0x08
|
||||
+#define SUR_SENSOR_TRIP_POINT 0x09
|
||||
+
|
||||
+#define REG_AVAILABLE 0x01
|
||||
+#define REG_INIT 0x09
|
||||
+
|
||||
+static char SURFACE_EVENT_GUID[] = "93b666c5-70c6-469f-a215-3d487c91ab3c";
|
||||
+static char SUR_SAN_RQST[] = "\\_SB._SAN.RQST";
|
||||
+static char SUR_SAN_RQSX[] = "\\_SB._SAN.RQSX";
|
||||
+
|
||||
+struct surface_acpi_dev {
|
||||
+ acpi_handle handle;
|
||||
+ acpi_handle rqst_handle;
|
||||
+ acpi_handle rqsx_handle;
|
||||
+
|
||||
+ struct acpi_device *acpi_dev;
|
||||
+ struct acpi_device *bat1_dev;
|
||||
+ struct acpi_device *bat2_dev;
|
||||
+ struct acpi_device *psu_dev;
|
||||
+
|
||||
+ unsigned int bat1_attached:1;
|
||||
+ unsigned int bat2_attached:1;
|
||||
+ unsigned int psu_registered:1;
|
||||
+};
|
||||
+
|
||||
+static struct surface_acpi_dev *surface_acpi;
|
||||
+
|
||||
+static struct proc_dir_entry *surface_proc_dir;
|
||||
+
|
||||
+static acpi_status surface_acpi_check_status(void)
|
||||
+{
|
||||
+ unsigned long long value;
|
||||
+ acpi_status status;
|
||||
+
|
||||
+ if (acpi_has_method(surface_acpi->handle, SUR_METHOD_STA)) {
|
||||
+ status = acpi_evaluate_integer(surface_acpi->handle,
|
||||
+ SUR_METHOD_STA, NULL, &value);
|
||||
+
|
||||
+ if (ACPI_FAILURE(status)) {
|
||||
+ pr_err("surface_acpi: ACPI event failure status %s\n",
|
||||
+ acpi_format_exception(status));
|
||||
+ return AE_ERROR;
|
||||
+ }
|
||||
+ }
|
||||
+ else
|
||||
+ return AE_NOT_FOUND;
|
||||
+
|
||||
+ return AE_OK;
|
||||
+}
|
||||
+
|
||||
+static acpi_status surface_acpi_reg(void)
|
||||
+{
|
||||
+ union acpi_object in_objs[2], out_objs[1];
|
||||
+ struct acpi_object_list params;
|
||||
+ struct acpi_buffer results;
|
||||
+ acpi_status status;
|
||||
+
|
||||
+ params.count = ARRAY_SIZE(in_objs);
|
||||
+ params.pointer = in_objs;
|
||||
+ in_objs[0].type = ACPI_TYPE_INTEGER;
|
||||
+ in_objs[0].integer.value = REG_INIT;
|
||||
+ in_objs[1].type = ACPI_TYPE_INTEGER;
|
||||
+ in_objs[1].integer.value = REG_AVAILABLE;
|
||||
+ results.length = sizeof(out_objs);
|
||||
+ results.pointer = out_objs;
|
||||
+
|
||||
+ if (acpi_has_method(surface_acpi->handle, SUR_METHOD_REG)) {
|
||||
+ status = acpi_evaluate_object(surface_acpi->handle,
|
||||
+ SUR_METHOD_REG, ¶ms, &results);
|
||||
+
|
||||
+ if (ACPI_FAILURE(status)) {
|
||||
+ pr_err("surface_acpi: ACPI event failure status %s\n",
|
||||
+ acpi_format_exception(status));
|
||||
+ return AE_ERROR;
|
||||
+ }
|
||||
+ }
|
||||
+ else
|
||||
+ return AE_NOT_FOUND;
|
||||
+
|
||||
+ return AE_OK;
|
||||
+}
|
||||
+
|
||||
+static acpi_status surface_acpi_event_handler(u32 event)
|
||||
+{
|
||||
+ union acpi_object in_objs[4], out_objs[5];
|
||||
+ struct acpi_object_list params;
|
||||
+ struct acpi_buffer results;
|
||||
+ acpi_status status;
|
||||
+
|
||||
+ params.count = ARRAY_SIZE(in_objs);
|
||||
+ params.pointer = in_objs;
|
||||
+ in_objs[0].type = ACPI_TYPE_BUFFER;
|
||||
+ in_objs[0].buffer.length = sizeof(SURFACE_EVENT_GUID);
|
||||
+ in_objs[0].buffer.pointer = SURFACE_EVENT_GUID;
|
||||
+ in_objs[1].type = ACPI_TYPE_INTEGER;
|
||||
+ in_objs[1].integer.value = SUR_QUERY_DEVICE;
|
||||
+ in_objs[2].type = ACPI_TYPE_INTEGER;
|
||||
+ in_objs[2].integer.value = event;
|
||||
+ in_objs[3].type = ACPI_TYPE_PACKAGE;
|
||||
+ in_objs[3].package.count = 0;
|
||||
+ in_objs[3].package.elements = SURFACE_GEN_VERSION;
|
||||
+ results.length = sizeof(out_objs);
|
||||
+ results.pointer = out_objs;
|
||||
+
|
||||
+ if (acpi_has_method(surface_acpi->handle, SUR_METHOD_DSM)) {
|
||||
+ status = acpi_evaluate_object(surface_acpi->handle,
|
||||
+ SUR_METHOD_DSM, ¶ms, &results);
|
||||
+
|
||||
+ if (ACPI_FAILURE(status)) {
|
||||
+ pr_err("surface_acpi: ACPI event failure status %s\n",
|
||||
+ acpi_format_exception(status));
|
||||
+ return AE_ERROR;
|
||||
+ }
|
||||
+ }
|
||||
+ else
|
||||
+ return AE_NOT_FOUND;
|
||||
+
|
||||
+ return AE_OK;
|
||||
+}
|
||||
+
|
||||
+static void surface_acpi_load(void)
|
||||
+{
|
||||
+ acpi_status ret;
|
||||
+
|
||||
+ ret = surface_acpi_event_handler(SUR_SET_DVER);
|
||||
+ if (ACPI_FAILURE(ret))
|
||||
+ pr_err("surface_acpi: Error setting Driver Version\n");
|
||||
+
|
||||
+ ret = surface_acpi_event_handler(SUR_SENSOR_TRIP_POINT);
|
||||
+ if (ACPI_FAILURE(ret))
|
||||
+ pr_err("surface_acpi: Error setting Sensor Trip Point\n");
|
||||
+
|
||||
+ ret = surface_acpi_event_handler(SUR_BAT1_INFO_CHANGE);
|
||||
+ if (ACPI_FAILURE(ret))
|
||||
+ pr_err("surface_acpi: Error attaching BAT1\n");
|
||||
+ else
|
||||
+ surface_acpi->bat1_attached = 1;
|
||||
+
|
||||
+ ret = surface_acpi_event_handler(SUR_BAT2_INFO_CHANGE);
|
||||
+ if (ACPI_FAILURE(ret))
|
||||
+ pr_err("surface_acpi: Error attaching BAT2\n");
|
||||
+ else
|
||||
+ surface_acpi->bat2_attached = 1;
|
||||
+
|
||||
+ ret = surface_acpi_event_handler(SUR_PSU_INFO_CHANGE);
|
||||
+ if (ACPI_FAILURE(ret))
|
||||
+ pr_err("surface_acpi: Error registering PSU\n");
|
||||
+ else
|
||||
+ surface_acpi->psu_registered = 1;
|
||||
+}
|
||||
+
|
||||
+static int bat1_proc_show(struct seq_file *m, void *v)
|
||||
+{
|
||||
+ seq_printf(m, "attached: %d\n", surface_acpi->bat1_attached);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int bat1_proc_open(struct inode *inode, struct file *file)
|
||||
+{
|
||||
+ return single_open(file, bat1_proc_show, PDE_DATA(inode));
|
||||
+}
|
||||
+
|
||||
+static const struct file_operations bat1_proc_fops = {
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .open = bat1_proc_open,
|
||||
+ .read = seq_read,
|
||||
+ .llseek = seq_lseek,
|
||||
+ .release = single_release,
|
||||
+};
|
||||
+
|
||||
+static int bat2_proc_show(struct seq_file *m, void *v)
|
||||
+{
|
||||
+ seq_printf(m, "attached: %d\n", surface_acpi->bat2_attached);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int bat2_proc_open(struct inode *inode, struct file *file)
|
||||
+{
|
||||
+ return single_open(file, bat2_proc_show, PDE_DATA(inode));
|
||||
+}
|
||||
+
|
||||
+static const struct file_operations bat2_proc_fops = {
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .open = bat2_proc_open,
|
||||
+ .read = seq_read,
|
||||
+ .llseek = seq_lseek,
|
||||
+ .release = single_release,
|
||||
+};
|
||||
+
|
||||
+static int psu_proc_show(struct seq_file *m, void *v)
|
||||
+{
|
||||
+ seq_printf(m, "registered: %d\n", surface_acpi->psu_registered);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int psu_proc_open(struct inode *inode, struct file *file)
|
||||
+{
|
||||
+ return single_open(file, psu_proc_show, PDE_DATA(inode));
|
||||
+}
|
||||
+
|
||||
+static const struct file_operations psu_proc_fops = {
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .open = psu_proc_open,
|
||||
+ .read = seq_read,
|
||||
+ .llseek = seq_lseek,
|
||||
+ .release = single_release,
|
||||
+};
|
||||
+
|
||||
+static int version_proc_show(struct seq_file *m, void *v)
|
||||
+{
|
||||
+ seq_printf(m, "driver: %s\n", SURFACE_ACPI_VERSION);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+static int version_proc_open(struct inode *inode, struct file *file)
|
||||
+{
|
||||
+ return single_open(file, version_proc_show, PDE_DATA(inode));
|
||||
+}
|
||||
+
|
||||
+static const struct file_operations version_proc_fops = {
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .open = version_proc_open,
|
||||
+ .read = seq_read,
|
||||
+ .llseek = seq_lseek,
|
||||
+ .release = single_release,
|
||||
+};
|
||||
+
|
||||
+static void create_surface_proc_entries(void)
|
||||
+{
|
||||
+ proc_create_data("BAT1", 0, surface_proc_dir,
|
||||
+ &bat1_proc_fops, surface_acpi->bat1_attached);
|
||||
+ proc_create_data("BAT2", 0, surface_proc_dir,
|
||||
+ &bat2_proc_fops, surface_acpi->bat2_attached);
|
||||
+ proc_create_data("ADP1", 0, surface_proc_dir,
|
||||
+ &psu_proc_fops, surface_acpi->psu_registered);
|
||||
+ proc_create_data("version", 0, surface_proc_dir,
|
||||
+ &version_proc_fops, SURFACE_ACPI_VERSION);
|
||||
+}
|
||||
+
|
||||
+static void remove_surface_proc_entries(void)
|
||||
+{
|
||||
+ remove_proc_entry("BAT1", surface_proc_dir);
|
||||
+ remove_proc_entry("BAT2", surface_proc_dir);
|
||||
+ remove_proc_entry("ADP1", surface_proc_dir);
|
||||
+ remove_proc_entry("version", surface_proc_dir);
|
||||
+}
|
||||
+
|
||||
+static void surface_acpi_notify(struct acpi_device *dev, u32 event)
|
||||
+{
|
||||
+ pr_info("surface_acpi: Event received %x\n", event);
|
||||
+}
|
||||
+
|
||||
+static void surface_acpi_register_rqst_handler(void)
|
||||
+{
|
||||
+ acpi_status status;
|
||||
+
|
||||
+ status = acpi_get_handle(NULL, SUR_SAN_RQST, &surface_acpi->rqst_handle);
|
||||
+ if (ACPI_FAILURE(status)) {
|
||||
+ pr_err("surface_acpi: ACPI event failure status %s\n",
|
||||
+ acpi_format_exception(status));
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void surface_acpi_register_rqsx_handler(void)
|
||||
+{
|
||||
+ acpi_status status;
|
||||
+
|
||||
+ status = acpi_get_handle(NULL, SUR_SAN_RQSX, &surface_acpi->rqsx_handle);
|
||||
+ if (ACPI_FAILURE(status)) {
|
||||
+ pr_err("surface_acpi: ACPI event failure status %s\n",
|
||||
+ acpi_format_exception(status));
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static acpi_status surface_acpi_walk_callback(acpi_handle handle, u32 level,
|
||||
+ void *context, void **return_value)
|
||||
+{
|
||||
+ struct acpi_device_info *info;
|
||||
+
|
||||
+ if (ACPI_SUCCESS(acpi_get_object_info(handle, &info))) {
|
||||
+ pr_warn("method: name: %4.4s, args %X\n",
|
||||
+ (char *)&info->name, info->param_count);
|
||||
+
|
||||
+ kfree(info);
|
||||
+ }
|
||||
+
|
||||
+ return AE_OK;
|
||||
+}
|
||||
+
|
||||
+static void surface_acpi_walk_namespace(void)
|
||||
+{
|
||||
+ acpi_status status;
|
||||
+
|
||||
+ status = acpi_walk_namespace(ACPI_TYPE_METHOD,
|
||||
+ surface_acpi->handle, 1, surface_acpi_walk_callback,
|
||||
+ NULL, NULL, NULL);
|
||||
+ if (ACPI_FAILURE(status))
|
||||
+ pr_warn("surface_acpi: Unable to walk acpi resources\n");
|
||||
+}
|
||||
+
|
||||
+static int surface_acpi_add(struct acpi_device *acpi_dev)
|
||||
+{
|
||||
+ if (surface_acpi)
|
||||
+ return AE_ALREADY_ACQUIRED;
|
||||
+
|
||||
+ pr_info("surface_acpi: Microsoft Surface ACPI Notify version %s\n",
|
||||
+ SURFACE_ACPI_VERSION);
|
||||
+
|
||||
+ surface_acpi = kzalloc(sizeof(*surface_acpi), GFP_KERNEL);
|
||||
+ if (!surface_acpi)
|
||||
+ return AE_NO_MEMORY;
|
||||
+
|
||||
+ surface_acpi->acpi_dev = acpi_dev;
|
||||
+ surface_acpi->handle = acpi_dev->handle;
|
||||
+
|
||||
+ surface_acpi_register_rqst_handler();
|
||||
+ surface_acpi_register_rqsx_handler();
|
||||
+
|
||||
+ surface_acpi_check_status();
|
||||
+
|
||||
+ surface_acpi_walk_namespace();
|
||||
+
|
||||
+ surface_acpi_reg();
|
||||
+
|
||||
+ surface_acpi_load();
|
||||
+
|
||||
+ create_surface_proc_entries();
|
||||
+
|
||||
+ return AE_OK;
|
||||
+}
|
||||
+
|
||||
+static int surface_acpi_remove(struct acpi_device *dev)
|
||||
+{
|
||||
+ remove_surface_proc_entries();
|
||||
+
|
||||
+ return AE_OK;
|
||||
+}
|
||||
+
|
||||
+static const struct acpi_device_id surface_device_ids[] = {
|
||||
+ {"MSHW0091", 0},
|
||||
+ {"", 0},
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(acpi, surface_device_ids);
|
||||
+
|
||||
+static struct acpi_driver surface_acpi_driver = {
|
||||
+ .name = "Microsoft Surface ACPI Notify Driver",
|
||||
+ .owner = THIS_MODULE,
|
||||
+ .ids = surface_device_ids,
|
||||
+ .flags = ACPI_DRIVER_ALL_NOTIFY_EVENTS,
|
||||
+ .ops = {
|
||||
+ .add = surface_acpi_add,
|
||||
+ .remove = surface_acpi_remove,
|
||||
+ .notify = surface_acpi_notify,
|
||||
+ },
|
||||
+};
|
||||
+
|
||||
+static int __init surface_acpi_init(void)
|
||||
+{
|
||||
+ int ret;
|
||||
+
|
||||
+ surface_proc_dir = proc_mkdir(PROC_SURFACE, acpi_root_dir);
|
||||
+ if (!surface_proc_dir) {
|
||||
+ pr_err("surface_acpi: Unable to create proc dir " PROC_SURFACE "\n");
|
||||
+ return -ENODEV;
|
||||
+ }
|
||||
+
|
||||
+ ret = acpi_bus_register_driver(&surface_acpi_driver);
|
||||
+ if (ret) {
|
||||
+ pr_err("surface_acpi: Failed to register ACPI driver: %d\n", ret);
|
||||
+ remove_proc_entry(PROC_SURFACE, acpi_root_dir);
|
||||
+ }
|
||||
+
|
||||
+ return ret;
|
||||
+}
|
||||
+
|
||||
+static void __exit surface_acpi_exit(void)
|
||||
+{
|
||||
+ acpi_bus_unregister_driver(&surface_acpi_driver);
|
||||
+ if (surface_proc_dir)
|
||||
+ remove_proc_entry(PROC_SURFACE, acpi_root_dir);
|
||||
+}
|
||||
+
|
||||
+module_init(surface_acpi_init);
|
||||
+module_exit(surface_acpi_exit);
|
36
patches-4.16/surfacedock.patch
Normal file
36
patches-4.16/surfacedock.patch
Normal file
|
@ -0,0 +1,36 @@
|
|||
From 3600aaa37a16777a07aa34672f12e30a1ae4d95b Mon Sep 17 00:00:00 2001
|
||||
From: Jake Day <jake@ninebysix.com>
|
||||
Date: Fri, 2 Feb 2018 11:21:06 -0500
|
||||
Subject: support for surface dock
|
||||
|
||||
|
||||
diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c
|
||||
index 05dca3e..59c2fcc 100644
|
||||
--- a/drivers/net/usb/cdc_ether.c
|
||||
+++ b/drivers/net/usb/cdc_ether.c
|
||||
@@ -807,13 +807,6 @@ static const struct usb_device_id products[] = {
|
||||
.driver_info = 0,
|
||||
},
|
||||
|
||||
-/* Microsoft Surface 3 dock (based on Realtek RTL8153) */
|
||||
-{
|
||||
- USB_DEVICE_AND_INTERFACE_INFO(MICROSOFT_VENDOR_ID, 0x07c6, USB_CLASS_COMM,
|
||||
- USB_CDC_SUBCLASS_ETHERNET, USB_CDC_PROTO_NONE),
|
||||
- .driver_info = 0,
|
||||
-},
|
||||
-
|
||||
/* TP-LINK UE300 USB 3.0 Ethernet Adapters (based on Realtek RTL8153) */
|
||||
{
|
||||
USB_DEVICE_AND_INTERFACE_INFO(TPLINK_VENDOR_ID, 0x0601, USB_CLASS_COMM,
|
||||
diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c
|
||||
index 0657203..0a52ea0 100644
|
||||
--- a/drivers/net/usb/r8152.c
|
||||
+++ b/drivers/net/usb/r8152.c
|
||||
@@ -5323,7 +5323,6 @@ static const struct usb_device_id rtl8152_table[] = {
|
||||
{REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8152)},
|
||||
{REALTEK_USB_DEVICE(VENDOR_ID_REALTEK, 0x8153)},
|
||||
{REALTEK_USB_DEVICE(VENDOR_ID_MICROSOFT, 0x07ab)},
|
||||
- {REALTEK_USB_DEVICE(VENDOR_ID_MICROSOFT, 0x07c6)},
|
||||
{REALTEK_USB_DEVICE(VENDOR_ID_SAMSUNG, 0xa101)},
|
||||
{REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x304f)},
|
||||
{REALTEK_USB_DEVICE(VENDOR_ID_LENOVO, 0x3062)},
|
271
patches-4.16/wifi.patch
Normal file
271
patches-4.16/wifi.patch
Normal file
|
@ -0,0 +1,271 @@
|
|||
From a359b5adc91cb9f2d3cc07705d804ef60bf6e4e3 Mon Sep 17 00:00:00 2001
|
||||
From: Jake Day <jake@ninebysix.com>
|
||||
Date: Fri, 2 Feb 2018 12:57:32 -0500
|
||||
Subject: fixes for marvell mwifiex
|
||||
|
||||
|
||||
diff --git a/drivers/net/wireless/marvell/mwifiex/11n_aggr.c b/drivers/net/wireless/marvell/mwifiex/11n_aggr.c
|
||||
index 042a1d0..fc9041f 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 6e0d9a9..d008687 100644
|
||||
--- a/drivers/net/wireless/marvell/mwifiex/cfg80211.c
|
||||
+++ b/drivers/net/wireless/marvell/mwifiex/cfg80211.c
|
||||
@@ -416,6 +416,9 @@ mwifiex_cfg80211_set_power_mgmt(struct wiphy *wiphy,
|
||||
|
||||
ps_mode = enabled;
|
||||
|
||||
+ mwifiex_dbg(priv->adapter, ERROR, "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 0edc5d6..c0c9c70 100644
|
||||
--- a/drivers/net/wireless/marvell/mwifiex/cmdevt.c
|
||||
+++ b/drivers/net/wireless/marvell/mwifiex/cmdevt.c
|
||||
@@ -998,6 +998,7 @@ mwifiex_cmd_timeout_func(unsigned long function_context)
|
||||
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) {
|
||||
diff --git a/drivers/net/wireless/marvell/mwifiex/init.c b/drivers/net/wireless/marvell/mwifiex/init.c
|
||||
index e1aa860..328829b 100644
|
||||
--- a/drivers/net/wireless/marvell/mwifiex/init.c
|
||||
+++ b/drivers/net/wireless/marvell/mwifiex/init.c
|
||||
@@ -60,7 +60,7 @@ static void wakeup_timer_fn(struct timer_list *t)
|
||||
adapter->hw_status = MWIFIEX_HW_STATUS_RESET;
|
||||
mwifiex_cancel_all_pending_cmd(adapter);
|
||||
|
||||
- if (adapter->if_ops.card_reset && !adapter->hs_activated)
|
||||
+ if (adapter->if_ops.card_reset)
|
||||
adapter->if_ops.card_reset(adapter);
|
||||
}
|
||||
|
||||
diff --git a/drivers/net/wireless/marvell/mwifiex/main.c b/drivers/net/wireless/marvell/mwifiex/main.c
|
||||
index a96bd7e..79b026f 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,13 +195,14 @@ 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 {
|
||||
adapter->rx_processing = true;
|
||||
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 +224,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,10 +292,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) &&
|
||||
diff --git a/drivers/net/wireless/marvell/mwifiex/main.h b/drivers/net/wireless/marvell/mwifiex/main.h
|
||||
index 154c079..4205344 100644
|
||||
--- a/drivers/net/wireless/marvell/mwifiex/main.h
|
||||
+++ b/drivers/net/wireless/marvell/mwifiex/main.h
|
||||
@@ -889,6 +889,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 */
|
||||
@@ -1661,6 +1662,7 @@ void mwifiex_upload_device_dump(struct mwifiex_adapter *adapter, void *drv_info,
|
||||
int drv_info_size);
|
||||
void *mwifiex_alloc_dma_align_buf(int rx_len, gfp_t flags);
|
||||
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 cd31494..575da92 100644
|
||||
--- a/drivers/net/wireless/marvell/mwifiex/pcie.c
|
||||
+++ b/drivers/net/wireless/marvell/mwifiex/pcie.c
|
||||
@@ -1729,6 +1729,16 @@ 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 fb09014..5b8329e 100644
|
||||
--- a/drivers/net/wireless/marvell/mwifiex/sta_cmd.c
|
||||
+++ b/drivers/net/wireless/marvell/mwifiex/sta_cmd.c
|
||||
@@ -2313,7 +2313,7 @@ int mwifiex_sta_init_cmd(struct mwifiex_private *priv, u8 first_sta, bool init)
|
||||
if (ret)
|
||||
return -1;
|
||||
|
||||
- if (priv->bss_type != MWIFIEX_BSS_TYPE_UAP) {
|
||||
+ if (0 && priv->bss_type != MWIFIEX_BSS_TYPE_UAP) {
|
||||
/* Enable IEEE PS by default */
|
||||
priv->adapter->ps_mode = MWIFIEX_802_11_POWER_MODE_PSP;
|
||||
ret = mwifiex_send_cmd(priv,
|
||||
@@ -2336,8 +2336,8 @@ int mwifiex_sta_init_cmd(struct mwifiex_private *priv, u8 first_sta, bool init)
|
||||
return -1;
|
||||
}
|
||||
|
||||
- mwifiex_send_cmd(priv, HostCmd_CMD_CHAN_REGION_CFG,
|
||||
- HostCmd_ACT_GEN_GET, 0, NULL, true);
|
||||
+ //mwifiex_send_cmd(priv, HostCmd_CMD_CHAN_REGION_CFG,
|
||||
+ // HostCmd_ACT_GEN_GET, 0, NULL, true);
|
||||
}
|
||||
|
||||
/* get tx rate */
|
||||
@@ -2369,7 +2369,7 @@ int mwifiex_sta_init_cmd(struct mwifiex_private *priv, u8 first_sta, bool init)
|
||||
if (ret)
|
||||
return -1;
|
||||
|
||||
- if (!disable_auto_ds && first_sta &&
|
||||
+ if (0 && !disable_auto_ds && first_sta &&
|
||||
priv->bss_type != MWIFIEX_BSS_TYPE_UAP) {
|
||||
/* Enable auto deep sleep */
|
||||
auto_ds.auto_ds = DEEP_SLEEP_ON;
|
||||
diff --git a/drivers/net/wireless/marvell/mwifiex/sta_cmdresp.c b/drivers/net/wireless/marvell/mwifiex/sta_cmdresp.c
|
||||
index 1bd4e13..27d2bac 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 4bc2448..d20fda1 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/net/wireless/sme.c b/net/wireless/sme.c
|
||||
index fdb3646..b44b23b 100644
|
||||
--- a/net/wireless/sme.c
|
||||
+++ b/net/wireless/sme.c
|
||||
@@ -690,6 +690,11 @@ void __cfg80211_connect_result(struct net_device *dev,
|
||||
return;
|
||||
}
|
||||
|
||||
+ if (WARN_ON(!wdev->ssid_len)) {
|
||||
+ cfg80211_put_bss(wdev->wiphy, cr->bss);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
nl80211_send_connect_result(wiphy_to_rdev(wdev->wiphy), dev, cr,
|
||||
GFP_KERNEL);
|
||||
|
||||
@@ -1105,7 +1110,7 @@ int cfg80211_connect(struct cfg80211_registered_device *rdev,
|
||||
/*
|
||||
* If we have an ssid_len, we're trying to connect or are
|
||||
* already connected, so reject a new SSID unless it's the
|
||||
- * same (which is the case for re-association.)
|
||||
+ * same (which is the case for Re-Association.
|
||||
*/
|
||||
if (wdev->ssid_len &&
|
||||
(wdev->ssid_len != connect->ssid_len ||
|
||||
diff --git a/scripts/leaking_addresses.pl b/scripts/leaking_addresses.pl
|
||||
old mode 100755
|
||||
new mode 100644
|
Loading…
Reference in a new issue