Package: src:linux Version: 3.16.7-ckt7-1 Severity: important Tags: upstream patch
linux-image-3.16.0-4-amd64: Problem, is mostly the same as described here: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1372609 Oryginal autor submited this patch to upstream and it will be propably included in 4.0. I've backported his patch to kernel version 3.16. To do this I've used also two other patches first adds initial support of focalteh devices to upstream (without focaltech protocol): https://github.com/mgottschlag/linux/commit/3ace3686f198e656624d7ca2984d053e65f6e09d and second allowing to set firmware_id for muxed ports (allowing this upper one to work) https://github.com/mgottschlag/linux/commit/266e43c4eb81440e81da6c51bc5d4f9be2b7839c All three patches are reqiored so I'm attaching them as one patch. -- Package-specific info: ** Version: Linux version 3.16.0-4-amd64 ([email protected]) (gcc version 4.8.4 (Debian 4.8.4-1) ) #1 SMP Debian 3.16.7-ckt7-1 (2015-03-01) ** Command line: BOOT_IMAGE=/boot/vmlinuz-3.16.0-4-amd64 root=UUID=88a33fd7-7aa6-4136-8047-e9206de8d37f ro quiet ** Tainted: WC (1536) * Taint on warning. * Module from drivers/staging has been loaded. ** Kernel log: [ 954.695748] rtl8821ae-0:rtl8821ae_phy_switch_wirelessband():<0-0> 2.4G [ 954.957607] rtl8821ae-0:rtl8821ae_phy_switch_wirelessband():<0-0> 5G [ 955.064108] rtl8821ae-0:rtl8821ae_phy_switch_wirelessband():<0-0> 2.4G [ 955.144260] rtl8821ae-0:rtl8821ae_update_hal_rate_mask():<0-0> ratr_bitmap :ff0 [ 955.144266] rtl8821ae-0:rtl8821ae_update_hal_rate_mask():<0-0> Rate_index:4, ratr_val:ff0, 0:6:0:f0:f:0:0 [ 957.150513] rtl8821ae-0:rtl_watchdog_wq_callback():<0-0> AP off for 2 s [ 959.156725] rtl8821ae-0:rtl_watchdog_wq_callback():<0-0> AP off for 4 s [ 961.162929] rtl8821ae-0:rtl_watchdog_wq_callback():<0-0> AP off for 6 s [ 963.169132] rtl8821ae-0:rtl_watchdog_wq_callback():<0-0> AP off for 8 s [ 965.175287] rtl8821ae-0:rtl_watchdog_wq_callback():<0-0> AP off for 10 s [ 965.175290] rtl8821ae-0:rtl_watchdog_wq_callback():<0-0> AP off, try to reconnect now [ 965.175324] wlan0: Connection to AP 00:19:e0:fa:2b:f2 lost [ 965.175442] rtl8821ae-0:rtl_op_set_key():<0-0> Disabling hardware based encryption for keyidx: 0, mac: 00:19:e0:fa:2b:f2 [ 965.175446] rtl8821ae-0:rtl_op_set_key():<0-0> alg:CCMP [ 965.175448] rtl8821ae-0:rtl_op_set_key():<0-0> set enable_hw_sec, key_type:4(OPEN:0 WEP40:1 TKIP:2 AES:4 WEP104:5) [ 965.175450] rtl8821ae-0:rtl8821ae_enable_hw_security_config():<0-0> PairwiseEncAlgorithm = 4 GroupEncAlgorithm = 4 [ 965.175457] rtl8821ae-0:rtl8821ae_enable_hw_security_config():<0-0> The SECR-value cc [ 965.175462] rtl8821ae-0:rtl_op_set_key():<0-0> disable key delete one entry [ 965.175463] rtl8821ae-0:rtl_cam_delete_one_entry():<0-0> key_idx:0 [ 965.175469] rtl8821ae-0:rtl_cam_delete_one_entry():<0-0> rtl_cam_delete_one_entry(): WRITE A4: 0 [ 965.175471] rtl8821ae-0:rtl_cam_delete_one_entry():<0-0> rtl_cam_delete_one_entry(): WRITE A0: 80010000 [ 965.175479] rtl8821ae-0:rtl_op_sta_remove():<0-0> Remove sta addr is 00:19:e0:fa:2b:f2 [ 965.175516] rtl8821ae-0:rtl_op_bss_info_changed():<0-0> BSS_CHANGED_UN_ASSOC [ 965.175547] rtl8821ae-0:rtl_op_bss_info_changed():<0-0> bssid: 00:00:00:00:00:00 [ 965.191235] rtl8821ae-0:rtl_op_set_key():<0-0> Disabling hardware based encryption for keyidx: 1, mac: ff:ff:ff:ff:ff:ff [ 965.191240] rtl8821ae-0:rtl_op_set_key():<0-0> alg:CCMP [ 965.191242] rtl8821ae-0:rtl_op_set_key():<0-0> disable key delete one entry [ 965.191243] rtl8821ae-0:rtl_cam_delete_one_entry():<0-0> key_idx:1 [ 965.191250] rtl8821ae-0:rtl_cam_delete_one_entry():<0-0> rtl_cam_delete_one_entry(): WRITE A4: 0 [ 965.191251] rtl8821ae-0:rtl_cam_delete_one_entry():<0-0> rtl_cam_delete_one_entry(): WRITE A0: 80010008 [ 965.191672] cfg80211: Calling CRDA to update world regulatory domain [ 965.193684] cfg80211: World regulatory domain updated: [ 965.193687] cfg80211: DFS Master region: unset [ 965.193688] cfg80211: (start_freq - end_freq @ bandwidth), (max_antenna_gain, max_eirp), (dfs_cac_time) [ 965.193690] cfg80211: (2402000 KHz - 2472000 KHz @ 40000 KHz), (N/A, 2000 mBm), (N/A) [ 965.193691] cfg80211: (2457000 KHz - 2482000 KHz @ 40000 KHz), (N/A, 2000 mBm), (N/A) [ 965.193692] cfg80211: (2474000 KHz - 2494000 KHz @ 20000 KHz), (N/A, 2000 mBm), (N/A) [ 965.193694] cfg80211: (5170000 KHz - 5250000 KHz @ 80000 KHz, 160000 KHz AUTO), (N/A, 2000 mBm), (N/A) [ 965.193695] cfg80211: (5250000 KHz - 5330000 KHz @ 80000 KHz, 160000 KHz AUTO), (N/A, 2000 mBm), (0 s) [ 965.193696] cfg80211: (5490000 KHz - 5730000 KHz @ 160000 KHz), (N/A, 2000 mBm), (0 s) [ 965.193697] cfg80211: (5735000 KHz - 5835000 KHz @ 80000 KHz), (N/A, 2000 mBm), (N/A) [ 965.193699] cfg80211: (57240000 KHz - 63720000 KHz @ 2160000 KHz), (N/A, 0 mBm), (N/A) [ 965.891968] rtl8821ae-0:rtl8821ae_phy_switch_wirelessband():<0-0> 5G [ 967.297544] rtl8821ae-0:rtl8821ae_phy_switch_wirelessband():<0-0> 2.4G [ 967.298106] wlan0: authenticate with 00:19:e0:fa:2b:f2 [ 967.298459] rtl8821ae-0:rtl_op_bss_info_changed():<0-0> bssid: 00:19:e0:fa:2b:f2 [ 967.298494] wlan0: send auth to 00:19:e0:fa:2b:f2 (try 1/3) [ 967.298500] rtl8821ae-0:rtl_tx_mgmt_proc():<200-1> MAC80211_LINKING [ 967.300458] wlan0: authenticated [ 967.300615] rtl8821ae 0000:03:00.0 wlan0: disabling HT as WMM/QoS is not supported by the AP [ 967.300619] rtl8821ae 0000:03:00.0 wlan0: disabling VHT as WMM/QoS is not supported by the AP [ 967.301506] wlan0: associate with 00:19:e0:fa:2b:f2 (try 1/3) [ 967.303917] wlan0: RX AssocResp from 00:19:e0:fa:2b:f2 (capab=0x431 status=0 aid=9) [ 967.303927] rtl8821ae-0:rtl_op_sta_add():<0-0> Add sta addr is 00:19:e0:fa:2b:f2 [ 967.303930] rtl8821ae-0:rtl8821ae_update_hal_rate_mask():<0-0> ratr_bitmap :ff5 [ 967.303931] rtl8821ae-0:rtl8821ae_update_hal_rate_mask():<0-0> Rate_index:4, ratr_val:ff5, 0:6:0:f5:f:0:0 [ 967.303968] rtl8821ae-0:rtl8821ae_update_hal_rate_mask():<0-0> ratr_bitmap :ff5 [ 967.303969] rtl8821ae-0:rtl8821ae_update_hal_rate_mask():<0-0> Rate_index:4, ratr_val:ff5, 0:6:0:f5:f:0:0 [ 967.303995] rtl8821ae-0:rtl_op_bss_info_changed():<0-0> BSS_CHANGED_ASSOC [ 967.304017] rtl8821ae-0:rtl8821ae_set_hw_reg():<0-0> switch case not process 5c [ 967.304041] rtl8821ae: [ 967.304042] In process "kworker/u16:0" (pid 6): [ 967.304043] rtl8821ae_set_fw_rsvdpagepkt(): HW_VAR_SET_TX_CMD: ALL [ 967.304044] 03 01 02 [ 967.304050] rtl8821ae: [ 967.304050] In process "kworker/u16:0" (pid 6): [ 967.304051] H2C_RSVDPAGE: [ 967.304051] 03 01 02 [ 967.304106] wlan0: associated [ 968.286680] rtl8821ae-0:rtl_is_special_data():<10000-1> 802.1X Rx EAPOL pkt!! [ 968.293189] rtl8821ae-0:rtl_is_special_data():<10000-1> 802.1X Rx EAPOL pkt!! [ 968.293443] rtl8821ae-0:rtl_op_set_key():<0-0> Using hardware based encryption for keyidx: 0, mac: 00:19:e0:fa:2b:f2 [ 968.293447] rtl8821ae-0:rtl_op_set_key():<0-0> alg:CCMP [ 968.293449] rtl8821ae-0:rtl_op_set_key():<0-0> set enable_hw_sec, key_type:4(OPEN:0 WEP40:1 TKIP:2 AES:4 WEP104:5) [ 968.293451] rtl8821ae-0:rtl8821ae_enable_hw_security_config():<0-0> PairwiseEncAlgorithm = 4 GroupEncAlgorithm = 0 [ 968.293458] rtl8821ae-0:rtl8821ae_enable_hw_security_config():<0-0> The SECR-value cc [ 968.293462] rtl8821ae-0:rtl_op_set_key():<0-0> set pairwise key [ 968.293463] rtl8821ae-0:rtl8821ae_set_key():<0-0> add one entry [ 968.293464] rtl8821ae-0:rtl8821ae_set_key():<0-0> set Pairwiase key [ 968.293466] rtl8821ae-0:rtl_cam_add_one_entry():<0-0> EntryNo:4, ulKeyId=0, ulEncAlg=4, ulUseDK=0 MacAddr 00:19:e0:fa:2b:f2 [ 968.293467] rtl8821ae: [ 968.293468] In process "wpa_supplicant" (pid 1057): [ 968.293469] Key content :58 07 56 43 9C C7 24 30 2B F7 7E 4D C2 B8 FE BB [ 968.294111] rtl8821ae-0:rtl_cam_add_one_entry():<0-0> end [ 968.294194] rtl8821ae-0:rtl_op_set_key():<0-0> Using hardware based encryption for keyidx: 1, mac: ff:ff:ff:ff:ff:ff [ 968.294197] rtl8821ae-0:rtl_op_set_key():<0-0> alg:CCMP [ 968.294199] rtl8821ae-0:rtl_op_set_key():<0-0> set group key [ 968.294200] rtl8821ae-0:rtl8821ae_set_key():<0-0> add one entry [ 968.294202] rtl8821ae-0:rtl8821ae_set_key():<0-0> set group key [ 968.294203] rtl8821ae-0:rtl_cam_add_one_entry():<0-0> EntryNo:1, ulKeyId=1, ulEncAlg=4, ulUseDK=0 MacAddr ff:ff:ff:ff:ff:ff [ 968.294205] rtl8821ae: [ 968.294206] In process "wpa_supplicant" (pid 1057): [ 968.294207] Key content :7A C5 B8 4B C6 E7 E9 44 02 1B 54 B8 15 CF 9E DB [ 968.294850] rtl8821ae-0:rtl_cam_add_one_entry():<0-0> end [ 969.187668] rtl8821ae-0:rtl8821ae_update_hal_rate_mask():<0-0> ratr_bitmap :f00 [ 969.187671] rtl8821ae-0:rtl8821ae_update_hal_rate_mask():<0-0> Rate_index:4, ratr_val:f00, 0:6:0:0:f:0:0 ** Model information sys_vendor: ASUSTeK COMPUTER INC. product_name: X550JK product_version: 1.0 chassis_vendor: ASUSTeK COMPUTER INC. chassis_version: 1.0 bios_vendor: American Megatrends Inc. bios_version: X550JK.303 board_vendor: ASUSTeK COMPUTER INC. board_name: X550JK board_version: 1.0 ** Loaded modules: tun ctr ccm binfmt_misc bnep nfsd auth_rpcgss oid_registry nfs_acl nfs lockd fscache sunrpc x86_pkg_temp_thermal intel_powerclamp intel_rapl coretemp kvm_intel kvm crc32_pclmul uvcvideo videobuf2_vmalloc videobuf2_memops videobuf2_core v4l2_common videodev ghash_clmulni_intel snd_hda_codec_conexant snd_hda_codec_hdmi snd_hda_codec_generic media aesni_intel aes_x86_64 lrw arc4 gf128mul ecb glue_helper btusb rtl8821ae(C) bluetooth 6lowpan_iphc mac80211 ablk_helper joydev cryptd iTCO_wdt iTCO_vendor_support nouveau cfg80211 asus_nb_wmi asus_wmi snd_hda_intel snd_hda_controller sparse_keymap rfkill i915 snd_hda_codec mxm_wmi evdev pcspkr button rtsx_pci_ms ac battery ttm snd_hwdep memstick lpc_ich psmouse snd_pcm serio_raw drm_kms_helper video mei_me snd_timer snd soundcore mei i2c_i801 drm shpchp processor efi_pstore i2c_algo_bit efivars i2c_core wmi loop fuse parport_pc ppdev lp parport autofs4 ext4 crc16 mbcache jbd2 sg sd_mod crc_t10dif sr_mod crct10dif_generic cdrom rtsx_pci_sdmmc mmc_core crct10dif_pclmul ahci crct10dif_common libahci crc32c_intel r8169 mii libata rtsx_pci xhci_hcd mfd_core scsi_mod usbcore usb_common thermal thermal_sys ** PCI devices: 00:00.0 Host bridge [0600]: Intel Corporation Xeon E3-1200 v3/4th Gen Core Processor DRAM Controller [8086:0c04] (rev 06) Subsystem: ASUSTeK Computer Inc. Device [1043:178d] Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx- Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=fast >TAbort- <TAbort+ <MAbort+ >SERR- <PERR- INTx- Latency: 0 Capabilities: <access denied> 00:01.0 PCI bridge [0604]: Intel Corporation Xeon E3-1200 v3/4th Gen Core Processor PCI Express x16 Controller [8086:0c01] (rev 06) (prog-if 00 [Normal decode]) Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+ Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx- Latency: 0, Cache Line Size: 64 bytes Bus: primary=00, secondary=01, subordinate=01, sec-latency=0 I/O behind bridge: 0000e000-0000efff Memory behind bridge: f6000000-f70fffff Prefetchable memory behind bridge: 00000000e0000000-00000000f1ffffff Secondary status: 66MHz- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort+ <SERR- <PERR- BridgeCtl: Parity- SERR- NoISA- VGA- MAbort- >Reset- FastB2B- PriDiscTmr- SecDiscTmr- DiscTmrStat- DiscTmrSERREn- Capabilities: <access denied> Kernel driver in use: pcieport 00:02.0 VGA compatible controller [0300]: Intel Corporation 4th Gen Core Processor Integrated Graphics Controller [8086:0416] (rev 06) (prog-if 00 [VGA controller]) Subsystem: ASUSTeK Computer Inc. Device [1043:178d] Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+ Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx- Latency: 0 Interrupt: pin A routed to IRQ 51 Region 0: Memory at f7400000 (64-bit, non-prefetchable) [size=4M] Region 2: Memory at d0000000 (64-bit, prefetchable) [size=256M] Region 4: I/O ports at f000 [size=64] Expansion ROM at <unassigned> [disabled] Capabilities: <access denied> Kernel driver in use: i915 00:03.0 Audio device [0403]: Intel Corporation Xeon E3-1200 v3/4th Gen Core Processor HD Audio Controller [8086:0c0c] (rev 06) Subsystem: Intel Corporation Device [8086:2010] Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+ Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx- Latency: 0, Cache Line Size: 64 bytes Interrupt: pin A routed to IRQ 53 Region 0: Memory at f7a14000 (64-bit, non-prefetchable) [size=16K] Capabilities: <access denied> Kernel driver in use: snd_hda_intel 00:14.0 USB controller [0c03]: Intel Corporation 8 Series/C220 Series Chipset Family USB xHCI [8086:8c31] (rev 05) (prog-if 30 [XHCI]) Subsystem: ASUSTeK Computer Inc. Device [1043:201f] Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+ Status: Cap+ 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx- Latency: 0 Interrupt: pin A routed to IRQ 46 Region 0: Memory at f7a00000 (64-bit, non-prefetchable) [size=64K] Capabilities: <access denied> Kernel driver in use: xhci_hcd 00:16.0 Communication controller [0780]: Intel Corporation 8 Series/C220 Series Chipset Family MEI Controller #1 [8086:8c3a] (rev 04) Subsystem: ASUSTeK Computer Inc. Device [1043:178d] Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+ Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx- Latency: 0 Interrupt: pin A routed to IRQ 50 Region 0: Memory at f7a1c000 (64-bit, non-prefetchable) [size=16] Capabilities: <access denied> Kernel driver in use: mei_me 00:1b.0 Audio device [0403]: Intel Corporation 8 Series/C220 Series Chipset High Definition Audio Controller [8086:8c20] (rev 05) Subsystem: ASUSTeK Computer Inc. Device [1043:178d] Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+ Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx- Latency: 0, Cache Line Size: 64 bytes Interrupt: pin A routed to IRQ 52 Region 0: Memory at f7a10000 (64-bit, non-prefetchable) [size=16K] Capabilities: <access denied> Kernel driver in use: snd_hda_intel 00:1c.0 PCI bridge [0604]: Intel Corporation 8 Series/C220 Series Chipset Family PCI Express Root Port #1 [8086:8c10] (rev d5) (prog-if 00 [Normal decode]) Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+ Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx- Latency: 0, Cache Line Size: 64 bytes Bus: primary=00, secondary=02, subordinate=02, sec-latency=0 Secondary status: 66MHz- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort+ <SERR- <PERR- BridgeCtl: Parity- SERR- NoISA- VGA- MAbort- >Reset- FastB2B- PriDiscTmr- SecDiscTmr- DiscTmrStat- DiscTmrSERREn- Capabilities: <access denied> Kernel driver in use: pcieport 00:1c.2 PCI bridge [0604]: Intel Corporation 8 Series/C220 Series Chipset Family PCI Express Root Port #3 [8086:8c14] (rev d5) (prog-if 00 [Normal decode]) Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+ Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort+ <TAbort- <MAbort- >SERR- <PERR- INTx- Latency: 0, Cache Line Size: 64 bytes Bus: primary=00, secondary=03, subordinate=03, sec-latency=0 I/O behind bridge: 0000d000-0000dfff Memory behind bridge: f7900000-f79fffff Secondary status: 66MHz- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort+ <MAbort+ <SERR- <PERR- BridgeCtl: Parity- SERR- NoISA- VGA- MAbort- >Reset- FastB2B- PriDiscTmr- SecDiscTmr- DiscTmrStat- DiscTmrSERREn- Capabilities: <access denied> Kernel driver in use: pcieport 00:1c.3 PCI bridge [0604]: Intel Corporation 8 Series/C220 Series Chipset Family PCI Express Root Port #4 [8086:8c16] (rev d5) (prog-if 00 [Normal decode]) Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+ Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx- Latency: 0, Cache Line Size: 64 bytes Bus: primary=00, secondary=04, subordinate=04, sec-latency=0 I/O behind bridge: 0000c000-0000cfff Memory behind bridge: f7800000-f78fffff Secondary status: 66MHz- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort+ <SERR- <PERR- BridgeCtl: Parity- SERR- NoISA- VGA- MAbort- >Reset- FastB2B- PriDiscTmr- SecDiscTmr- DiscTmrStat- DiscTmrSERREn- Capabilities: <access denied> Kernel driver in use: pcieport 00:1f.0 ISA bridge [0601]: Intel Corporation HM86 Express LPC Controller [8086:8c49] (rev 05) Subsystem: ASUSTeK Computer Inc. Device [1043:178d] Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx- Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx- Latency: 0 Capabilities: <access denied> Kernel driver in use: lpc_ich 00:1f.2 SATA controller [0106]: Intel Corporation 8 Series/C220 Series Chipset Family 6-port SATA Controller 1 [AHCI mode] [8086:8c03] (rev 05) (prog-if 01 [AHCI 1.0]) Subsystem: ASUSTeK Computer Inc. Device [1043:178d] Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+ Status: Cap+ 66MHz+ UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx- Latency: 0 Interrupt: pin B routed to IRQ 48 Region 0: I/O ports at f0b0 [size=8] Region 1: I/O ports at f0a0 [size=4] Region 2: I/O ports at f090 [size=8] Region 3: I/O ports at f080 [size=4] Region 4: I/O ports at f060 [size=32] Region 5: Memory at f7a1a000 (32-bit, non-prefetchable) [size=2K] Capabilities: <access denied> Kernel driver in use: ahci 00:1f.3 SMBus [0c05]: Intel Corporation 8 Series/C220 Series Chipset Family SMBus Controller [8086:8c22] (rev 05) Subsystem: ASUSTeK Computer Inc. Device [1043:178d] Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx- Status: Cap- 66MHz- UDF- FastB2B+ ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx- Interrupt: pin C routed to IRQ 18 Region 0: Memory at f7a19000 (64-bit, non-prefetchable) [size=256] Region 4: I/O ports at f040 [size=32] 01:00.0 3D controller [0302]: NVIDIA Corporation GM107M [GeForce GTX 850M] [10de:1391] (rev a2) Subsystem: ASUSTeK Computer Inc. Device [1043:178d] Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx- Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx+ Interrupt: pin A routed to IRQ 16 Region 0: Memory at f6000000 (32-bit, non-prefetchable) [size=16M] Region 1: Memory at e0000000 (64-bit, prefetchable) [size=256M] Region 3: Memory at f0000000 (64-bit, prefetchable) [size=32M] Region 5: I/O ports at e000 [size=128] Expansion ROM at f7000000 [disabled] [size=512K] Capabilities: <access denied> 03:00.0 Network controller [0280]: Realtek Semiconductor Co., Ltd. RTL8821AE 802.11ac PCIe Wireless Network Adapter [10ec:8821] Subsystem: AzureWave Device [1a3b:2161] Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx- Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort+ <TAbort- <MAbort- >SERR- <PERR- INTx- Latency: 0, Cache Line Size: 64 bytes Interrupt: pin A routed to IRQ 18 Region 0: I/O ports at d000 [size=256] Region 2: Memory at f7900000 (64-bit, non-prefetchable) [size=16K] Capabilities: <access denied> Kernel driver in use: rtl8821ae 04:00.0 Unassigned class [ff00]: Realtek Semiconductor Co., Ltd. Device [10ec:5287] (rev 01) Subsystem: ASUSTeK Computer Inc. Device [1043:202f] Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+ Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx- Latency: 0, Cache Line Size: 64 bytes Interrupt: pin B routed to IRQ 47 Region 0: Memory at f7815000 (32-bit, non-prefetchable) [size=4K] Expansion ROM at f7800000 [disabled] [size=64K] Capabilities: <access denied> Kernel driver in use: rtsx_pci 04:00.1 Ethernet controller [0200]: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller [10ec:8168] (rev 12) Subsystem: ASUSTeK Computer Inc. Device [1043:200f] Control: I/O+ Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+ Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx- Latency: 0, Cache Line Size: 64 bytes Interrupt: pin A routed to IRQ 49 Region 0: I/O ports at c000 [size=256] Region 2: Memory at f7814000 (64-bit, non-prefetchable) [size=4K] Region 4: Memory at f7810000 (64-bit, non-prefetchable) [size=16K] Capabilities: <access denied> Kernel driver in use: r8169 ** USB devices: Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 001 Device 003: ID 0bda:57b4 Realtek Semiconductor Corp. Bus 001 Device 002: ID 13d3:3414 IMC Networks Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub -- System Information: Debian Release: 8.0 APT prefers testing-updates APT policy: (500, 'testing-updates'), (500, 'testing') Architecture: amd64 (x86_64) Kernel: Linux 3.16.0-4-amd64 (SMP w/8 CPU cores) Locale: LANG=pl_PL.UTF-8, LC_CTYPE=pl_PL.UTF-8 (charmap=UTF-8) Shell: /bin/sh linked to /bin/dash Init: systemd (via /run/systemd/system) Versions of packages linux-image-3.16.0-4-amd64 depends on: ii debconf [debconf-2.0] 1.5.55 ii initramfs-tools [linux-initramfs-tool] 0.119 ii kmod 18-3 ii linux-base 3.5 ii module-init-tools 18-3 Versions of packages linux-image-3.16.0-4-amd64 recommends: ii firmware-linux-free 3.3 ii irqbalance 1.0.6-3 Versions of packages linux-image-3.16.0-4-amd64 suggests: pn debian-kernel-handbook <none> ii grub-efi 2.02~beta2-21 pn linux-doc-3.16 <none> Versions of packages linux-image-3.16.0-4-amd64 is related to: pn firmware-atheros <none> pn firmware-bnx2 <none> pn firmware-bnx2x <none> pn firmware-brcm80211 <none> pn firmware-intelwimax <none> pn firmware-ipw2x00 <none> pn firmware-ivtv <none> pn firmware-iwlwifi <none> pn firmware-libertas <none> pn firmware-linux <none> pn firmware-linux-nonfree <none> pn firmware-myricom <none> pn firmware-netxen <none> pn firmware-qlogic <none> pn firmware-ralink <none> ii firmware-realtek 0.43 pn xen-hypervisor <none> -- debconf information: linux-image-3.16.0-4-amd64/prerm/removing-running-kernel-3.16.0-4-amd64: true linux-image-3.16.0-4-amd64/postinst/mips-initrd-3.16.0-4-amd64: linux-image-3.16.0-4-amd64/postinst/depmod-error-initrd-3.16.0-4-amd64: false
--- linux-3.16.7-ckt7.orig/drivers/input/mouse/Kconfig +++ linux-3.16.7-ckt7/drivers/input/mouse/Kconfig @@ -146,6 +146,16 @@ config MOUSE_PS2_OLPC If unsure, say N. +config MOUSE_PS2_FOCALTECH + bool "FocalTech PS/2 mouse protocol extension" if EXPERT + default y + depends on MOUSE_PS2 + help + Say Y here if you have a FocalTech PS/2 TouchPad connected to + your system. + + If unsure, say Y. + config MOUSE_SERIAL tristate "Serial mouse" select SERIO --- /dev/null +++ linux-3.16.7-ckt7/drivers/input/mouse/focaltech.c @@ -0,0 +1,364 @@ +/* + * Focaltech TouchPad PS/2 mouse driver + * + * Copyright (c) 2014 Red Hat Inc. + * Copyright (c) 2014 Mathias Gottschlag <[email protected]> + * + * 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. + * + * Red Hat authors: + * + * Hans de Goede <[email protected]> + */ + + +#include <linux/device.h> +#include <linux/libps2.h> +#include <linux/input/mt.h> +#include <linux/serio.h> +#include <linux/slab.h> +#include "psmouse.h" +#include "focaltech.h" + +static const char * const focaltech_pnp_ids[] = { + "FLT0101", + "FLT0102", + "FLT0103", + NULL +}; + +/* + * Even if the kernel is built without support for Focaltech PS/2 touchpads (or + * when the real driver fails to recognize the device), we still have to detect + * them in order to avoid further detection attempts confusing the touchpad. + * This way it at least works in PS/2 mouse compatibility mode. + */ + +int focaltech_detect_fallback(struct psmouse *psmouse, bool set_properties) +{ + if (!psmouse_matches_pnp_id(psmouse, focaltech_pnp_ids)) + return -ENODEV; + + if (set_properties) { + psmouse->vendor = "FocalTech"; + psmouse->name = "FocalTech Touchpad in mouse emulation mode"; + } + + return 0; +} + +int focaltech_init_fallback(struct psmouse *psmouse) +{ + ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_RESET_DIS); + psmouse_reset(psmouse); + + return 0; +} + +#ifdef CONFIG_MOUSE_PS2_FOCALTECH + +static int focaltech_read_register(struct ps2dev *ps2dev, int reg, + unsigned char *param) +{ + if (ps2_command(ps2dev, param, PSMOUSE_CMD_SETSCALE11)) + return -1; + param[0] = 0; + if (ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES)) + return -1; + if (ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES)) + return -1; + if (ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES)) + return -1; + param[0] = reg; + if (ps2_command(ps2dev, param, PSMOUSE_CMD_SETRES)) + return -1; + if (ps2_command(ps2dev, param, PSMOUSE_CMD_GETINFO)) + return -1; + return 0; +} + +int focaltech_detect(struct psmouse *psmouse, bool set_properties) +{ + struct ps2dev *ps2dev = &psmouse->ps2dev; + unsigned char param[3]; + + if (!psmouse_matches_pnp_id(psmouse, focaltech_pnp_ids)) + return -ENODEV; + + /* + * We don't know how to identify the device, so we just check the + * content of all registers. + */ + if (focaltech_read_register(ps2dev, 0, param)) + return -EIO; + if (param[0] != 0x69 || param[1] != 0x80 || param[2] != 0x80) + return -ENODEV; + if (focaltech_read_register(ps2dev, 1, param)) + return -EIO; + if (param[0] != 0x36 || param[1] != 0x53 || param[2] != 0x03) + return -ENODEV; + if (focaltech_read_register(ps2dev, 2, param)) + return -EIO; + /* 0x13 and 0x0d might be the touchpad size? */ + if (param[0] != 0x00 || param[1] != 0x13 || param[2] != 0x0d) + return -ENODEV; + if (focaltech_read_register(ps2dev, 5, param)) + return -EIO; + if (param[0] != 0x0b || param[1] != 0x03 || param[2] != 0x00) + return -ENODEV; + if (focaltech_read_register(ps2dev, 6, param)) + return -EIO; + if (param[0] != 0x23 || param[1] != 0xbd || param[2] != 0xf8) + return -ENODEV; + + if (set_properties) { + psmouse->vendor = "FocalTech"; + psmouse->name = "FocalTech Touchpad"; + } + + return 0; +} + +static void focaltech_report_state(struct psmouse *psmouse) +{ + int i; + struct focaltech_data *priv = psmouse->private; + struct focaltech_hw_state *state = &priv->state; + struct input_dev *dev = psmouse->dev; + int finger_count = 0; + + for (i = 0; i < FOC_MAX_FINGERS; i++) { + struct focaltech_finger_state *finger = &state->fingers[i]; + int active = finger->active && finger->valid; + input_mt_slot(dev, i); + input_mt_report_slot_state(dev, MT_TOOL_FINGER, active); + if (active) { + finger_count++; + input_report_abs(dev, ABS_MT_POSITION_X, finger->x); + input_report_abs(dev, ABS_MT_POSITION_Y, + focaltech_invert_y(finger->y)); + } + } + input_mt_report_pointer_emulation(dev, false); + input_mt_report_finger_count(dev, finger_count); + + input_report_key(psmouse->dev, BTN_LEFT, state->pressed); + input_sync(psmouse->dev); +} + +static void process_touch_packet(struct focaltech_hw_state *state, + unsigned char *packet) +{ + int i; + unsigned char fingers = packet[1]; + + state->pressed = (packet[0] >> 4) & 1; + /* the second byte contains a bitmap of all fingers touching the pad */ + for (i = 0; i < FOC_MAX_FINGERS; i++) { + if ((fingers & 0x1) && !state->fingers[i].active) { + /* we do not have a valid position for the finger yet */ + state->fingers[i].valid = 0; + } + state->fingers[i].active = fingers & 0x1; + fingers >>= 1; + } +} + +static void process_abs_packet(struct focaltech_hw_state *state, + unsigned char *packet) +{ + unsigned int finger = (packet[1] >> 4) - 1; + + state->pressed = (packet[0] >> 4) & 1; + if (finger >= FOC_MAX_FINGERS) + return; + /* + * packet[5] contains some kind of tool size in the most significant + * nibble. 0xff is a special value (latching) that signals a large + * contact area. + */ + if (packet[5] == 0xff) + return; + state->fingers[finger].x = ((packet[1] & 0xf) << 8) | packet[2]; + state->fingers[finger].y = (packet[3] << 8) | packet[4]; + state->fingers[finger].valid = 1; +} +static void process_rel_packet(struct focaltech_hw_state *state, + unsigned char *packet) +{ + int finger1 = ((packet[0] >> 4) & 0x7) - 1; + int finger2 = ((packet[3] >> 4) & 0x7) - 1; + + state->pressed = packet[0] >> 7; + if (finger1 < FOC_MAX_FINGERS) { + state->fingers[finger1].x += (char)packet[1]; + state->fingers[finger1].y += (char)packet[2]; + } + /* + * If there is an odd number of fingers, the last relative packet only + * contains one finger. In this case, the second finger index in the + * packet is 0 (we subtract 1 in the lines above to create array + * indices). + */ + if (finger2 != -1 && finger2 < FOC_MAX_FINGERS) { + state->fingers[finger2].x += (char)packet[4]; + state->fingers[finger2].y += (char)packet[5]; + } +} + +static void focaltech_process_packet(struct psmouse *psmouse) +{ + struct focaltech_data *priv = psmouse->private; + unsigned char *packet = psmouse->packet; + + switch (packet[0] & 0xf) { + case FOC_TOUCH: + process_touch_packet(&priv->state, packet); + break; + case FOC_ABS: + process_abs_packet(&priv->state, packet); + break; + case FOC_REL: + process_rel_packet(&priv->state, packet); + break; + default: + psmouse_err(psmouse, "Unknown packet type: %02x", packet[0]); + break; + } + + focaltech_report_state(psmouse); +} + +static psmouse_ret_t focaltech_process_byte(struct psmouse *psmouse) +{ + if (psmouse->pktcnt >= 6) { /* Full packet received */ + focaltech_process_packet(psmouse); + return PSMOUSE_FULL_PACKET; + } + /* + * we might want to do some validation of the data here, but we do not + * know the protocoll well enough + */ + return PSMOUSE_GOOD_DATA; +} + +static void focaltech_reset(struct psmouse *psmouse) +{ + psmouse_info(psmouse, "focaltech_reset"); + ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_RESET_DIS); + psmouse_reset(psmouse); +} + +static int focaltech_switch_protocol(struct psmouse *psmouse) +{ + struct ps2dev *ps2dev = &psmouse->ps2dev; + unsigned char param[3]; + + param[0] = 0; + if (ps2_command(ps2dev, param, 0x10f8)) + return -EIO; + if (ps2_command(ps2dev, param, 0x10f8)) + return -EIO; + if (ps2_command(ps2dev, param, 0x10f8)) + return -EIO; + param[0] = 1; + if (ps2_command(ps2dev, param, 0x10f8)) + return -EIO; + if (ps2_command(ps2dev, param, PSMOUSE_CMD_SETSCALE11)) + return -EIO; + + if (ps2_command(ps2dev, param, PSMOUSE_CMD_ENABLE)) + return -EIO; + + return 0; +} + +static void focaltech_disconnect(struct psmouse *psmouse) +{ + focaltech_reset(psmouse); + kfree(psmouse->private); + psmouse->private = NULL; +} + +static int focaltech_reconnect(struct psmouse *psmouse) +{ + focaltech_reset(psmouse); + if (focaltech_switch_protocol(psmouse)) { + psmouse_err(psmouse, + "Unable to initialize the device."); + return -1; + } + return 0; +} + +static void set_input_params(struct psmouse *psmouse) +{ + struct input_dev *dev = psmouse->dev; + + __set_bit(EV_KEY, dev->evbit); + __set_bit(EV_ABS, dev->evbit); + input_set_abs_params(dev, ABS_X, 0, FOC_MAX_X, 0, 0); + input_set_abs_params(dev, ABS_Y, 0, FOC_MAX_Y, 0, 0); + input_mt_init_slots(dev, 5, INPUT_MT_POINTER); + input_set_abs_params(dev, ABS_MT_POSITION_X, 0, FOC_MAX_X, 0, 0); + input_set_abs_params(dev, ABS_MT_POSITION_Y, 0, FOC_MAX_Y, 0, 0); + __set_bit(BTN_TOUCH, dev->keybit); + __set_bit(BTN_TOOL_FINGER, dev->keybit); + __set_bit(BTN_TOOL_DOUBLETAP, dev->keybit); + __set_bit(BTN_TOOL_TRIPLETAP, dev->keybit); + __set_bit(BTN_TOOL_QUADTAP, dev->keybit); + __set_bit(BTN_TOOL_QUINTTAP, dev->keybit); + __clear_bit(EV_REL, dev->evbit); + __clear_bit(REL_X, dev->relbit); + __clear_bit(REL_Y, dev->relbit); + __set_bit(BTN_LEFT, dev->keybit); + __clear_bit(BTN_RIGHT, dev->keybit); + __clear_bit(BTN_MIDDLE, dev->keybit); + __set_bit(INPUT_PROP_BUTTONPAD, dev->propbit); +} + +int focaltech_init(struct psmouse *psmouse) +{ + struct focaltech_data *priv; + + focaltech_reset(psmouse); + if (focaltech_switch_protocol(psmouse)) { + focaltech_reset(psmouse); + psmouse_info(psmouse, + "Unable to initialize the device."); + return -ENOSYS; + } + + psmouse->private = priv = kzalloc(sizeof(struct focaltech_data), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + set_input_params(psmouse); + + psmouse->protocol_handler = focaltech_process_byte; + psmouse->pktsize = 6; + psmouse->disconnect = focaltech_disconnect; + psmouse->reconnect = focaltech_reconnect; + psmouse->cleanup = focaltech_reset; + /* resync is not supported yet */ + psmouse->resync_time = 0; + + return 0; +} + +#else /* CONFIG_MOUSE_PS2_FOCALTECH */ + +int focaltech_detect(struct psmouse *psmouse, bool set_properties) +{ + return -ENOSYS; +} + +int focaltech_init(struct psmouse *psmouse) +{ + return -ENOSYS; +} + +#endif /* CONFIG_MOUSE_PS2_FOCALTECH */ --- /dev/null +++ linux-3.16.7-ckt7/drivers/input/mouse/focaltech.h @@ -0,0 +1,83 @@ +/* + * Focaltech TouchPad PS/2 mouse driver + * + * Copyright (c) 2014 Red Hat Inc. + * Copyright (c) 2014 Mathias Gottschlag <[email protected]> + * + * 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. + * + * Red Hat authors: + * + * Hans de Goede <[email protected]> + */ + +#ifndef _FOCALTECH_H +#define _FOCALTECH_H + +/* + * Packet types - the numbers are not consecutive, so we might be missing + * something here. + */ +#define FOC_TOUCH 0x3 /* bitmap of active fingers */ +#define FOC_ABS 0x6 /* absolute position of one finger */ +#define FOC_REL 0x9 /* relative position of 1-2 fingers */ + +#define FOC_MAX_FINGERS 5 + +#define FOC_MAX_X 2431 +#define FOC_MAX_Y 1663 + +static inline int focaltech_invert_y(int y) +{ + return FOC_MAX_Y - y; +} + +/* + * Current state of a single finger on the touchpad. + */ +struct focaltech_finger_state { + /* the touchpad has generated a touch event for the finger */ + bool active; + /* + * The touchpad has sent position data for the finger. Touch event + * packages reset this flag for new fingers, and there is a time + * between the first touch event and the following absolute position + * packet for the finger where the touchpad has declared the finger to + * be valid, but we do not have any valid position yet. + */ + bool valid; + /* absolute position (from the bottom left corner) of the finger */ + unsigned int x; + unsigned int y; +}; + +/* + * Description of the current state of the touchpad hardware. + */ +struct focaltech_hw_state { + /* + * The touchpad tracks the positions of the fingers for us, the array + * indices correspond to the finger indices returned in the report + * packages. + */ + struct focaltech_finger_state fingers[FOC_MAX_FINGERS]; + /* + * True if the clickpad has been pressed. + */ + bool pressed; +}; + +struct focaltech_data { + struct focaltech_hw_state state; +}; + +int focaltech_detect(struct psmouse *psmouse, bool set_properties); +int focaltech_init(struct psmouse *psmouse); + +int focaltech_detect_fallback(struct psmouse *psmouse, bool set_properties); +int focaltech_init_fallback(struct psmouse *psmouse); + +#endif --- linux-3.16.7-ckt7.orig/drivers/input/mouse/psmouse-base.c +++ linux-3.16.7-ckt7/drivers/input/mouse/psmouse-base.c @@ -35,6 +35,7 @@ #include "elantech.h" #include "sentelic.h" #include "cypress_ps2.h" +#include "focaltech.h" #define DRIVER_DESC "PS/2 mouse driver" @@ -462,6 +462,20 @@ static int psmouse_poll(struct psmouse *psmouse) PSMOUSE_CMD_POLL | (psmouse->pktsize << 8)); } +/* + * psmouse_matches_pnp_id - check if psmouse matches one of the passed in ids. + */ +bool psmouse_matches_pnp_id(struct psmouse *psmouse, const char * const ids[]) +{ + int i; + + if (!strncmp(psmouse->ps2dev.serio->firmware_id, "PNP:", 4)) + for (i = 0; ids[i]; i++) + if (strstr(psmouse->ps2dev.serio->firmware_id, ids[i])) + return true; + + return false; +} /* * Genius NetMouse magic init. @@ -706,6 +732,27 @@ static int psmouse_extensions(struct psm { bool synaptics_hardware = false; +/* Always check for focaltech, this is safe as it uses pnp-id matching */ + if (psmouse_do_detect(focaltech_detect, psmouse, set_properties) == 0) { + if (!set_properties || focaltech_init(psmouse) == 0) { + return PSMOUSE_FOCALTECH; + } + } + if (psmouse_do_detect(focaltech_detect_fallback, + psmouse, set_properties) == 0) { + if (!set_properties || focaltech_init_fallback(psmouse) == 0) { + /* + * Not supported yet, use bare protocol. + * Note that we need to also restrict + * psmouse_max_proto so that psmouse_initialize() + * does not try to reset rate and resolution, + * because even that upsets the device. + */ + psmouse_max_proto = PSMOUSE_PS2; + return PSMOUSE_PS2; + } + } + /* * We always check for lifebook because it does not disturb mouse * (it only checks DMI information). @@ -1031,6 +1078,15 @@ static const struct psmouse_protocol psm .alias = "cortps", .detect = cortron_detect, }, +#ifdef CONFIG_MOUSE_PS2_FOCALTECH + { + .type = PSMOUSE_FOCALTECH, + .name = "FocalTechPS/2", + .alias = "focaltech", + .detect = focaltech_detect, + .init = focaltech_init, + }, +#endif { .type = PSMOUSE_AUTO, .name = "auto", --- linux-3.16.7-ckt7.orig/drivers/input/mouse/psmouse.h +++ linux-3.16.7-ckt7/drivers/input/mouse/psmouse.h @@ -96,6 +96,7 @@ enum psmouse_type { PSMOUSE_FSP, PSMOUSE_SYNAPTICS_RELATIVE, PSMOUSE_CYPRESS, + PSMOUSE_FOCALTECH, PSMOUSE_AUTO /* This one should always be last */ }; @@ -108,6 +109,7 @@ void psmouse_set_resolution(struct psmou psmouse_ret_t psmouse_process_byte(struct psmouse *psmouse); int psmouse_activate(struct psmouse *psmouse); int psmouse_deactivate(struct psmouse *psmouse); +bool psmouse_matches_pnp_id(struct psmouse *psmouse, const char * const ids[]); struct psmouse_attribute { struct device_attribute dattr; --- linux-3.16.7-ckt7.orig/drivers/input/mouse/Makefile +++ linux-3.16.7-ckt7/drivers/input/mouse/Makefile @@ -23,7 +23,7 @@ obj-$(CONFIG_MOUSE_SYNAPTICS_I2C) += syn obj-$(CONFIG_MOUSE_SYNAPTICS_USB) += synaptics_usb.o obj-$(CONFIG_MOUSE_VSXXXAA) += vsxxxaa.o -psmouse-objs := psmouse-base.o synaptics.o +psmouse-objs := psmouse-base.o synaptics.o focaltech.o psmouse-$(CONFIG_MOUSE_PS2_ALPS) += alps.o psmouse-$(CONFIG_MOUSE_PS2_ELANTECH) += elantech.o --- linux-3.16.7-ckt7.orig/drivers/input/serio/i8042.c +++ linux-3.16.7-ckt7/drivers/input/serio/i8042.c @@ -1268,6 +1268,8 @@ static int __init i8042_create_aux_port( } else { snprintf(serio->name, sizeof(serio->name), "i8042 AUX%d port", idx); snprintf(serio->phys, sizeof(serio->phys), I8042_MUX_PHYS_DESC, idx + 1); + strlcpy(serio->firmware_id, i8042_aux_firmware_id, + sizeof(serio->firmware_id)); } port->serio = serio;

