adding patches for 4.16 kernels

This commit is contained in:
Jake Day 2018-03-10 17:13:33 -05:00
parent 1ffa646802
commit b1a3bd85d7
7 changed files with 7084 additions and 0 deletions

156
patches-4.16/cameras.patch Normal file
View 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

File diff suppressed because it is too large Load diff

View 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 },

View 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--;

View 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, &params, &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, &params, &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);

View 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
View 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