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;

Reply via email to