├── README.md ├── cam.patch ├── multitouch.patch ├── surface.nix ├── touchscreen_multitouch_fixes1.patch └── touchscreen_multitouch_fixes2.patch /README.md: -------------------------------------------------------------------------------- 1 | NixOS on a Surface Pro 3 (archived!) 2 | ======================== 3 | 4 | 5 | # No further updates 6 | 7 | I'm not actively running this machine anymore, but I'll keep this around for 8 | historical reference. 9 | 10 | # history 11 | 12 | I purchased a Surface Pro 3 in July of 2015, looking for an ultrabook sized 13 | machine that had some amount of Linux support. There are are a few people 14 | running Ubuntu/Arch but no recent mentions of this hardware on Nixos. 15 | 16 | Thanks to https://github.com/matthewwardrop/linux-surfacepro3 as I've grabbed 17 | the relevant hardware patches from there and just bundled them up in a NixOS 18 | compatible fashion. 19 | 20 | # What works 21 | 22 | In kernel 4.4, most things work with only minor patches to the typecover 23 | (hid-multitouch) and cameras. 24 | 25 | ## Type Cover 26 | 27 | MS introduced a new type cover that has a new USB id. If you happen to have a 28 | newer type cover, it won't work unless you apply the multitouch patch. Loading 29 | hid-multitouch in init lets the typecover work in gummiboot and during kernel 30 | load, so you can type in a passphrase for your encrypted disk. 31 | 32 | ## Touch Screen 33 | 34 | It works with basic evdev support except for the second pen button. Wacom 35 | support is supposed to fix that, but when I enabled it, it just caused the 36 | cursor to jump around when pressed and conflicted with the synaptics 37 | driver on the touch pad. It's not of great interest, so I let it be for now. 38 | 39 | ## Sound 40 | 41 | Yep. 42 | 43 | ## Wireless 44 | 45 | Yep. 46 | 47 | ## Cameras 48 | 49 | With the included patch, both worked in a Hangout in Chrome. 50 | 51 | ## Bluetooth 52 | 53 | Seems to work, I haven't paired any devices but hcitool scans/etc show activity. 54 | 55 | ## Hardware buttons 56 | 57 | Volume and the windows key work. 58 | 59 | ## Suspend 60 | 61 | Suspend to idle works. I've had some failures resuming from hibernation. Either 62 | it will finish with a blank screen or wifi driver will be in a state that 63 | requires a reboot. Suspend to ram (acpi S3) doesn't exist in this hardware. 64 | 65 | # Install 66 | 67 | You'll need: 68 | * USB keyboard 69 | * USB thumbdrive and hub or a MicroSD card with the NixOS media on it. 70 | If you plan on running NixOS from the SD card (it works!), you'll definitely 71 | need a thumb drive. 72 | * USB ethernet dongle (optional, but allows you to skip wireless setup) 73 | 74 | Turn off secureboot by mashing escape as you press the power button and it will 75 | drop you into the firmware setup screen. Disable the secureboot and (optionally) 76 | change the boot order to Usb -> SSD. If you don't do that, in order to boot USB, 77 | you'll need to hold the volume down button while hitting the power button, 78 | releasing when the 'Surface' text appears. 79 | 80 | The install itself is typical. If you are installing to the hard drive, shrink 81 | Windows. If installing to the SD card, partition as normal in gdisk. If you 82 | leave windows, the EFI partition will be on /dev/sda2 (mount as /mnt/boot) 83 | 84 | After you get to the "nixos-generate-config" step, copy surface.nix and the 85 | patches to /mnt/etc/nixos and include surface.nix in the confguration.nix 86 | imports. 87 | 88 | nixos-install will take a while as it will need to compile a new kernel. When 89 | it's over, reboot. 90 | 91 | All done. 92 | 93 | -------------------------------------------------------------------------------- /cam.patch: -------------------------------------------------------------------------------- 1 | diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c 2 | index c3bb250..753ad4c 100644 3 | --- a/drivers/media/usb/uvc/uvc_driver.c 4 | +++ b/drivers/media/usb/uvc/uvc_driver.c 5 | @@ -2108,6 +2108,22 @@ 6 | * though they are compliant. 7 | */ 8 | static struct usb_device_id uvc_ids[] = { 9 | + /* Microsoft Surface Pro 3 Front */ 10 | + { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 11 | + | USB_DEVICE_ID_MATCH_INT_INFO, 12 | + .idVendor = 0x045e, 13 | + .idProduct = 0x07be, 14 | + .bInterfaceClass = USB_CLASS_VIDEO, 15 | + .bInterfaceSubClass = 1, 16 | + .bInterfaceProtocol = 1 }, 17 | + /* Microsoft Surface Pro 3 Rear */ 18 | + { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 19 | + | USB_DEVICE_ID_MATCH_INT_INFO, 20 | + .idVendor = 0x045e, 21 | + .idProduct = 0x07bf, 22 | + .bInterfaceClass = USB_CLASS_VIDEO, 23 | + .bInterfaceSubClass = 1, 24 | + .bInterfaceProtocol = 1 }, 25 | /* LogiLink Wireless Webcam */ 26 | { .match_flags = USB_DEVICE_ID_MATCH_DEVICE 27 | | USB_DEVICE_ID_MATCH_INT_INFO, 28 | -------------------------------------------------------------------------------- /multitouch.patch: -------------------------------------------------------------------------------- 1 | From bd42a8f1017b0b456ce8dc2fe0e8c2eb7fd3d2c7 Mon Sep 17 00:00:00 2001 2 | From: Donavan Lance 3 | Date: Mon, 2 Nov 2015 16:06:40 -0500 4 | Subject: [PATCH] Add multitouch support for Microsoft Type Cover 3 5 | 6 | Add preliminary support for Type Cover 4 and Surface Book keyboard 7 | 8 | Patch based on code from Felipe Otamendi 9 | [buribullet@gmail.com: Add Japanese Type Cover] 10 | Contributor: Kobayasi Hiroaki 11 | Maintainer: Donavan Lance 12 | 13 | Signed-off-by: Donavan Lance 14 | --- 15 | drivers/hid/hid-core.c | 8 ++------ 16 | drivers/hid/hid-ids.h | 4 ++++ 17 | drivers/hid/hid-microsoft.c | 8 -------- 18 | drivers/hid/hid-multitouch.c | 27 +++++++++++++++++++++++++++ 19 | drivers/hid/usbhid/hid-quirks.c | 4 ++++ 20 | 5 files changed, 37 insertions(+), 14 deletions(-) 21 | 22 | diff --git a/drivers/hid/hid-core.c b/drivers/hid/hid-core.c 23 | index c6f7a69..45658e4 100644 24 | --- a/drivers/hid/hid-core.c 25 | +++ b/drivers/hid/hid-core.c 26 | @@ -724,13 +724,9 @@ static void hid_scan_collection(struct hid_parser *parser, unsigned type) 27 | hid->group = HID_GROUP_SENSOR_HUB; 28 | 29 | if (hid->vendor == USB_VENDOR_ID_MICROSOFT && 30 | - (hid->product == USB_DEVICE_ID_MS_TYPE_COVER_PRO_3 || 31 | - hid->product == USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_2 || 32 | - hid->product == USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_JP || 33 | - hid->product == USB_DEVICE_ID_MS_TYPE_COVER_3 || 34 | - hid->product == USB_DEVICE_ID_MS_POWER_COVER) && 35 | + hid->product == USB_DEVICE_ID_MS_POWER_COVER && 36 | hid->group == HID_GROUP_MULTITOUCH) 37 | - hid->group = HID_GROUP_GENERIC; 38 | + hid->group = HID_GROUP_GENERIC; 39 | 40 | if ((parser->global.usage_page << 16) == HID_UP_GENDESK) 41 | for (i = 0; i < parser->local.usage_index; i++) 42 | @@ -1927,10 +1924,6 @@ static const struct hid_device_id hid_have_special_driver[] = { 43 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_DIGITAL_MEDIA_3K) }, 44 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_WIRELESS_OPTICAL_DESKTOP_3_0) }, 45 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_OFFICE_KB) }, 46 | - { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_PRO_3) }, 47 | - { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_2) }, 48 | - { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_JP) }, 49 | - { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_3) }, 50 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_POWER_COVER) }, 51 | { HID_USB_DEVICE(USB_VENDOR_ID_MONTEREY, USB_DEVICE_ID_GENIUS_KB29E) }, 52 | { HID_USB_DEVICE(USB_VENDOR_ID_MSI, USB_DEVICE_ID_MSI_GT683R_LED_PANEL) }, 53 | diff --git a/drivers/hid/hid-ids.h b/drivers/hid/hid-ids.h 54 | index ac1feea..9e46b89 100644 55 | --- a/drivers/hid/hid-ids.h 56 | +++ b/drivers/hid/hid-ids.h 57 | @@ -688,6 +688,10 @@ 58 | #define USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_2 0x07e2 59 | #define USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_JP 0x07dd 60 | #define USB_DEVICE_ID_MS_TYPE_COVER_3 0x07de 61 | +#define USB_DEVICE_ID_MS_TYPE_COVER_3_2 0x07e2 62 | +#define USB_DEVICE_ID_MS_TYPE_COVER_4 0x07e4 63 | +#define USB_DEVICE_ID_MS_TYPE_COVER_4_2 0x07e8 64 | +#define USB_DEVICE_ID_MS_SURFACE_BOOK 0x07cd 65 | #define USB_DEVICE_ID_MS_POWER_COVER 0x07da 66 | 67 | #define USB_VENDOR_ID_MOJO 0x8282 68 | diff --git a/drivers/hid/hid-microsoft.c b/drivers/hid/hid-microsoft.c 69 | index 77a2cf3..3110927 100644 70 | --- a/drivers/hid/hid-microsoft.c 71 | +++ b/drivers/hid/hid-microsoft.c 72 | @@ -276,14 +276,6 @@ static const struct hid_device_id ms_devices[] = { 73 | .driver_data = MS_NOGET }, 74 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_COMFORT_MOUSE_4500), 75 | .driver_data = MS_DUPLICATE_USAGES }, 76 | - { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_PRO_3), 77 | - .driver_data = MS_HIDINPUT }, 78 | - { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_2), 79 | - .driver_data = MS_HIDINPUT }, 80 | - { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_JP), 81 | - .driver_data = MS_HIDINPUT }, 82 | - { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_3), 83 | - .driver_data = MS_HIDINPUT }, 84 | { HID_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_POWER_COVER), 85 | .driver_data = MS_HIDINPUT }, 86 | 87 | diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c 88 | index 3d664d0..5fcd5ce 100644 89 | --- a/drivers/hid/hid-multitouch.c 90 | +++ b/drivers/hid/hid-multitouch.c 91 | @@ -1330,6 +1330,33 @@ static const struct hid_device_id mt_devices[] = { 92 | MT_USB_DEVICE(USB_VENDOR_ID_ILITEK, 93 | USB_DEVICE_ID_ILITEK_MULTITOUCH) }, 94 | 95 | + /* Microsoft Type Cover 3 */ 96 | + { .driver_data = MT_CLS_EXPORT_ALL_INPUTS, 97 | + MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, 98 | + USB_DEVICE_ID_MS_TYPE_COVER_PRO_3) }, 99 | + { .driver_data = MT_CLS_EXPORT_ALL_INPUTS, 100 | + MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, 101 | + USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_JP) }, 102 | + { .driver_data = MT_CLS_EXPORT_ALL_INPUTS, 103 | + MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, 104 | + USB_DEVICE_ID_MS_TYPE_COVER_3) }, 105 | + { .driver_data = MT_CLS_EXPORT_ALL_INPUTS, 106 | + MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, 107 | + USB_DEVICE_ID_MS_TYPE_COVER_3_2) }, 108 | + 109 | + /* Microsoft Type Cover 3 */ 110 | + { .driver_data = MT_CLS_EXPORT_ALL_INPUTS, 111 | + MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, 112 | + USB_DEVICE_ID_MS_TYPE_COVER_4) }, 113 | + { .driver_data = MT_CLS_EXPORT_ALL_INPUTS, 114 | + MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, 115 | + USB_DEVICE_ID_MS_TYPE_COVER_4_2) }, 116 | + 117 | + /* Microsoft Surface Book */ 118 | + { .driver_data = MT_CLS_EXPORT_ALL_INPUTS, 119 | + MT_USB_DEVICE(USB_VENDOR_ID_MICROSOFT, 120 | + USB_DEVICE_ID_MS_SURFACE_BOOK) }, 121 | + 122 | /* MosArt panels */ 123 | { .driver_data = MT_CLS_CONFIDENCE_MINUS_ONE, 124 | MT_USB_DEVICE(USB_VENDOR_ID_ASUS, 125 | diff --git a/drivers/hid/usbhid/hid-quirks.c b/drivers/hid/usbhid/hid-quirks.c 126 | index 94bb137..48c1d8d 100644 127 | --- a/drivers/hid/usbhid/hid-quirks.c 128 | +++ b/drivers/hid/usbhid/hid-quirks.c 129 | @@ -95,6 +95,10 @@ static const struct hid_blacklist { 130 | { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_2, HID_QUIRK_NO_INIT_REPORTS }, 131 | { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_PRO_3_JP, HID_QUIRK_NO_INIT_REPORTS }, 132 | { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_3, HID_QUIRK_NO_INIT_REPORTS }, 133 | + { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_3_2, HID_QUIRK_NO_INIT_REPORTS }, 134 | + { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_4, HID_QUIRK_NO_INIT_REPORTS }, 135 | + { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_TYPE_COVER_4_2, HID_QUIRK_NO_INIT_REPORTS }, 136 | + { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_SURFACE_BOOK, HID_QUIRK_NO_INIT_REPORTS }, 137 | { USB_VENDOR_ID_MICROSOFT, USB_DEVICE_ID_MS_POWER_COVER, HID_QUIRK_NO_INIT_REPORTS }, 138 | { USB_VENDOR_ID_MSI, USB_DEVICE_ID_MSI_GT683R_LED_PANEL, HID_QUIRK_NO_INIT_REPORTS }, 139 | { USB_VENDOR_ID_NEXIO, USB_DEVICE_ID_NEXIO_MULTITOUCH_PTI0750, HID_QUIRK_NO_INIT_REPORTS }, 140 | -- 141 | 2.5.0 142 | -------------------------------------------------------------------------------- /surface.nix: -------------------------------------------------------------------------------- 1 | { config, pkgs, ... }: 2 | rec { 3 | services.xserver.synaptics = { 4 | enable = true; 5 | twoFingerScroll = true; 6 | palmDetect = false; 7 | buttonsMap = [ 1 3 2 ]; 8 | fingersMap = [ 1 3 2 ]; 9 | minSpeed = "0.8"; 10 | maxSpeed = "1.4"; 11 | additionalOptions = '' 12 | MatchDevicePath "/dev/input/event*" 13 | Option "vendor" "045e" 14 | Option "product" "07e2" 15 | ''; 16 | }; 17 | 18 | boot.kernelModules = [ "hid-multitouch" ]; 19 | boot.initrd.kernelModules = [ "hid-multitouch" ]; 20 | boot.loader.grub.enable = false; 21 | boot.loader.gummiboot.enable = true; 22 | boot.loader.efi.canTouchEfiVariables = true; 23 | 24 | hardware.pulseaudio.enable = true; 25 | hardware.bluetooth.enable = true; 26 | 27 | #suspend if powerbutton his bumped, rather than shutdown. 28 | services.logind.extraConfig = '' 29 | HandlePowerKey=suspend 30 | HandleLidSwitch=ignore 31 | ''; 32 | 33 | powerManagement.enable = true; 34 | #powerManagement.powerUpCommands = ""; 35 | #powerManagement.powerDwnCommands = ""; 36 | powerManagement.cpuFreqGovernor = "powersave"; 37 | 38 | boot.kernelPackages = pkgs.linuxPackages_4_4; 39 | nixpkgs.config.packageOverrides = pkgs: { 40 | linux_4_4 = pkgs.linux_4_4.override { 41 | kernelPatches = [ 42 | { patch = ./multitouch.patch; name = "multitouch-type-cover";} 43 | { patch = ./touchscreen_multitouch_fixes1.patch; name = "multitouch-fixes1";} 44 | { patch = ./touchscreen_multitouch_fixes2.patch; name = "multitouch-fixes2";} 45 | { patch = ./cam.patch; name = "surfacepro3-cameras"; } 46 | ]; 47 | extraConfig = '' 48 | I2C_DESIGNWARE_PLATFORM m 49 | X86_INTEL_LPSS y 50 | ''; 51 | }; 52 | }; 53 | 54 | systemd.timers.lidcheck = { 55 | partOf = [ "acpid.service"]; 56 | wantedBy = [ "timers.target" ]; 57 | timerConfig = { 58 | OnUnitActiveSec = "60"; 59 | OnBootSec = "60"; 60 | }; 61 | }; 62 | systemd.services.lidcheck = { 63 | environment = { DISPLAY = ":0"; }; 64 | description = "ensure sleep when unpowered and lid closed"; 65 | script = services.acpid.lidEventCommands; 66 | }; 67 | 68 | services.acpid.enable = true; 69 | #on lid event, lock if the lid is closed and we have power; 70 | # if closed and no power, sleep 71 | 72 | services.acpid.lidEventCommands = '' 73 | export PATH=/run/current-system/sw/bin 74 | LID_STATE=$(awk '{ print $2 }' /proc/acpi/button/lid/LID0/state) 75 | AC_STATE=$(cat /sys/class/power_supply/AC0/online) 76 | export DISPLAY=':0' 77 | if [ $LID_STATE = 'closed' ]; then 78 | xset dpms force off 79 | xautolock -locknow 80 | systemctl suspend 81 | if [ $AC_STATE = '0' ]; then 82 | systemctl suspend 83 | fi 84 | fi 85 | 86 | ''; 87 | 88 | services.acpid.acEventCommands = '' 89 | export PATH=/run/current-system/sw/bin 90 | AC_STATE=$(cat /sys/class/power_supply/AC0/online) 91 | if [ $AC_STATE = '0' ]; then 92 | iw dev wlp1s0 set power_save on 93 | else 94 | iw dev wlp1s0 set power_save off 95 | fi 96 | ''; 97 | } 98 | -------------------------------------------------------------------------------- /touchscreen_multitouch_fixes1.patch: -------------------------------------------------------------------------------- 1 | From 909b254eb818f63ba0e541abbbe829d923c19234 Mon Sep 17 00:00:00 2001 2 | From: Daniel Martin 3 | Date: Fri, 2 Oct 2015 10:07:15 +0200 4 | Subject: [PATCH 2/4] HID: multitouch: Add MT_QUIRK_NOT_SEEN_MEANS_UP to 5 | MT_CLS_WIN_8 6 | 7 | The firmware found in the touch screen of an SP3 is buggy and may miss 8 | to send lift off reports for contacts. Try to work around that issue by 9 | using MT_QUIRK_NOT_SEEN_MEANS_UP. 10 | 11 | Signed-off-by: Daniel Martin 12 | --- 13 | drivers/hid/hid-multitouch.c | 6 ++++-- 14 | 1 file changed, 4 insertions(+), 2 deletions(-) 15 | 16 | diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c 17 | index 1cc1108..625f1ee 100644 18 | --- a/drivers/hid/hid-multitouch.c 19 | +++ b/drivers/hid/hid-multitouch.c 20 | @@ -206,7 +206,8 @@ static struct mt_class mt_classes[] = { 21 | .quirks = MT_QUIRK_ALWAYS_VALID | 22 | MT_QUIRK_IGNORE_DUPLICATES | 23 | MT_QUIRK_HOVERING | 24 | - MT_QUIRK_CONTACT_CNT_ACCURATE }, 25 | + MT_QUIRK_CONTACT_CNT_ACCURATE | 26 | + MT_QUIRK_NOT_SEEN_MEANS_UP }, 27 | { .name = MT_CLS_EXPORT_ALL_INPUTS, 28 | .quirks = MT_QUIRK_ALWAYS_VALID | 29 | MT_QUIRK_CONTACT_CNT_ACCURATE, 30 | @@ -1054,7 +1055,8 @@ static int mt_probe(struct hid_device *hdev, const struct hid_device_id *id) 31 | return -ENOMEM; 32 | } 33 | 34 | - if (id->vendor == HID_ANY_ID && id->product == HID_ANY_ID) 35 | + if (id->vendor == HID_ANY_ID && id->product == HID_ANY_ID && 36 | + id->group != HID_GROUP_MULTITOUCH_WIN_8) 37 | td->serial_maybe = true; 38 | 39 | ret = hid_parse(hdev); 40 | -- 41 | 2.1.4 42 | 43 | 44 | -------------------------------------------------------------------------------- /touchscreen_multitouch_fixes2.patch: -------------------------------------------------------------------------------- 1 | From a84d692a5e0f894d7e9c81208197423d023f50d9 Mon Sep 17 00:00:00 2001 2 | From: Daniel Martin 3 | Date: Fri, 2 Oct 2015 10:05:29 +0200 4 | Subject: [PATCH 1/4] HID: multitouch: Ignore invalid reports 5 | 6 | Drop reports with invalid values. 7 | 8 | Signed-off-by: Daniel Martin 9 | --- 10 | drivers/hid/hid-multitouch.c | 5 +++++ 11 | 1 file changed, 5 insertions(+) 12 | 13 | diff --git a/drivers/hid/hid-multitouch.c b/drivers/hid/hid-multitouch.c 14 | index 7c81125..1cc1108 100644 15 | --- a/drivers/hid/hid-multitouch.c 16 | +++ b/drivers/hid/hid-multitouch.c 17 | @@ -559,6 +559,10 @@ static void mt_complete_slot(struct mt_device *td, struct input_dev *input) 18 | td->num_received >= td->num_expected) 19 | return; 20 | 21 | + if (td->curdata.x == 0xffff && td->curdata.x == td->curdata.y && 22 | + td->curdata.w == 0xffff && td->curdata.w == td->curdata.h) 23 | + goto inc_num_received; 24 | + 25 | if (td->curvalid || (td->mtclass.quirks & MT_QUIRK_ALWAYS_VALID)) { 26 | int slotnum = mt_compute_slot(td, input); 27 | struct mt_slot *s = &td->curdata; 28 | @@ -597,6 +601,7 @@ static void mt_complete_slot(struct mt_device *td, struct input_dev *input) 29 | } 30 | } 31 | 32 | +inc_num_received: 33 | td->num_received++; 34 | } 35 | 36 | -- 37 | 2.1.4 38 | 39 | 40 | --------------------------------------------------------------------------------