Input: psmouse - attempt to re-synchronize mouse every 5 seconds

This should help driver to deal vith KVMs that reset mice when
switching between boxes.

Signed-off-by: Dmitry Torokhov <dtor@mail.ru>

+302 -67
+38
drivers/input/mouse/alps.c
··· 348 348 return 0; 349 349 } 350 350 351 + /* 352 + * alps_poll() - poll the touchpad for current motion packet. 353 + * Used in resync. 354 + */ 355 + static int alps_poll(struct psmouse *psmouse) 356 + { 357 + struct alps_data *priv = psmouse->private; 358 + unsigned char buf[6]; 359 + int poll_failed; 360 + 361 + if (priv->i->flags & ALPS_PASS) 362 + alps_passthrough_mode(psmouse, 1); 363 + 364 + poll_failed = ps2_command(&psmouse->ps2dev, buf, 365 + PSMOUSE_CMD_POLL | (psmouse->pktsize << 8)) < 0; 366 + 367 + if (priv->i->flags & ALPS_PASS) 368 + alps_passthrough_mode(psmouse, 0); 369 + 370 + if (poll_failed || (buf[0] & priv->i->mask0) != priv->i->byte0) 371 + return -1; 372 + 373 + if ((psmouse->badbyte & 0xc8) == 0x08) { 374 + /* 375 + * Poll the track stick ... 376 + */ 377 + if (ps2_command(&psmouse->ps2dev, buf, PSMOUSE_CMD_POLL | (3 << 8))) 378 + return -1; 379 + } 380 + 381 + memcpy(psmouse->packet, buf, sizeof(buf)); 382 + return 0; 383 + } 384 + 351 385 static int alps_reconnect(struct psmouse *psmouse) 352 386 { 353 387 struct alps_data *priv = psmouse->private; ··· 485 451 input_register_device(priv->dev2); 486 452 487 453 psmouse->protocol_handler = alps_process_byte; 454 + psmouse->poll = alps_poll; 488 455 psmouse->disconnect = alps_disconnect; 489 456 psmouse->reconnect = alps_reconnect; 490 457 psmouse->pktsize = 6; 458 + 459 + /* We are having trouble resyncing ALPS touchpads so disable it for now */ 460 + psmouse->resync_time = 0; 491 461 492 462 return 0; 493 463
+1 -1
drivers/input/mouse/logips2pp.c
··· 117 117 if (psmouse_sliced_command(psmouse, command)) 118 118 return -1; 119 119 120 - if (ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_POLL)) 120 + if (ps2_command(&psmouse->ps2dev, param, PSMOUSE_CMD_POLL | 0x0300)) 121 121 return -1; 122 122 123 123 return 0;
+253 -65
drivers/input/mouse/psmouse-base.c
··· 54 54 module_param_named(smartscroll, psmouse_smartscroll, bool, 0644); 55 55 MODULE_PARM_DESC(smartscroll, "Logitech Smartscroll autorepeat, 1 = enabled (default), 0 = disabled."); 56 56 57 - static unsigned int psmouse_resetafter; 57 + static unsigned int psmouse_resetafter = 5; 58 58 module_param_named(resetafter, psmouse_resetafter, uint, 0644); 59 59 MODULE_PARM_DESC(resetafter, "Reset device after so many bad packets (0 = never)."); 60 + 61 + static unsigned int psmouse_resync_time = 5; 62 + module_param_named(resync_time, psmouse_resync_time, uint, 0644); 63 + MODULE_PARM_DESC(resync_time, "How long can mouse stay idle before forcing resync (in seconds, 0 = never)."); 60 64 61 65 PSMOUSE_DEFINE_ATTR(protocol, S_IWUSR | S_IRUGO, 62 66 NULL, ··· 74 70 PSMOUSE_DEFINE_ATTR(resetafter, S_IWUSR | S_IRUGO, 75 71 (void *) offsetof(struct psmouse, resetafter), 76 72 psmouse_show_int_attr, psmouse_set_int_attr); 73 + PSMOUSE_DEFINE_ATTR(resync_time, S_IWUSR | S_IRUGO, 74 + (void *) offsetof(struct psmouse, resync_time), 75 + psmouse_show_int_attr, psmouse_set_int_attr); 77 76 78 77 static struct attribute *psmouse_attributes[] = { 79 78 &psmouse_attr_protocol.dattr.attr, 80 79 &psmouse_attr_rate.dattr.attr, 81 80 &psmouse_attr_resolution.dattr.attr, 82 81 &psmouse_attr_resetafter.dattr.attr, 82 + &psmouse_attr_resync_time.dattr.attr, 83 83 NULL 84 84 }; 85 85 ··· 105 97 * is taken in "slow" paths it is not worth it. 106 98 */ 107 99 static DECLARE_MUTEX(psmouse_sem); 100 + 101 + static struct workqueue_struct *kpsmoused_wq; 108 102 109 103 struct psmouse_protocol { 110 104 enum psmouse_type type; ··· 188 178 } 189 179 190 180 /* 191 - * psmouse_interrupt() handles incoming characters, either gathering them into 192 - * packets or passing them to the command routine as command output. 181 + * __psmouse_set_state() sets new psmouse state and resets all flags. 182 + */ 183 + 184 + static inline void __psmouse_set_state(struct psmouse *psmouse, enum psmouse_state new_state) 185 + { 186 + psmouse->state = new_state; 187 + psmouse->pktcnt = psmouse->out_of_sync = 0; 188 + psmouse->ps2dev.flags = 0; 189 + psmouse->last = jiffies; 190 + } 191 + 192 + 193 + /* 194 + * psmouse_set_state() sets new psmouse state and resets all flags and 195 + * counters while holding serio lock so fighting with interrupt handler 196 + * is not a concern. 197 + */ 198 + 199 + static void psmouse_set_state(struct psmouse *psmouse, enum psmouse_state new_state) 200 + { 201 + serio_pause_rx(psmouse->ps2dev.serio); 202 + __psmouse_set_state(psmouse, new_state); 203 + serio_continue_rx(psmouse->ps2dev.serio); 204 + } 205 + 206 + /* 207 + * psmouse_handle_byte() processes one byte of the input data stream 208 + * by calling corresponding protocol handler. 209 + */ 210 + 211 + static int psmouse_handle_byte(struct psmouse *psmouse, struct pt_regs *regs) 212 + { 213 + psmouse_ret_t rc = psmouse->protocol_handler(psmouse, regs); 214 + 215 + switch (rc) { 216 + case PSMOUSE_BAD_DATA: 217 + if (psmouse->state == PSMOUSE_ACTIVATED) { 218 + printk(KERN_WARNING "psmouse.c: %s at %s lost sync at byte %d\n", 219 + psmouse->name, psmouse->phys, psmouse->pktcnt); 220 + if (++psmouse->out_of_sync == psmouse->resetafter) { 221 + __psmouse_set_state(psmouse, PSMOUSE_IGNORE); 222 + printk(KERN_NOTICE "psmouse.c: issuing reconnect request\n"); 223 + serio_reconnect(psmouse->ps2dev.serio); 224 + return -1; 225 + } 226 + } 227 + psmouse->pktcnt = 0; 228 + break; 229 + 230 + case PSMOUSE_FULL_PACKET: 231 + psmouse->pktcnt = 0; 232 + if (psmouse->out_of_sync) { 233 + psmouse->out_of_sync = 0; 234 + printk(KERN_NOTICE "psmouse.c: %s at %s - driver resynched.\n", 235 + psmouse->name, psmouse->phys); 236 + } 237 + break; 238 + 239 + case PSMOUSE_GOOD_DATA: 240 + break; 241 + } 242 + return 0; 243 + } 244 + 245 + /* 246 + * psmouse_interrupt() handles incoming characters, either passing them 247 + * for normal processing or gathering them as command response. 193 248 */ 194 249 195 250 static irqreturn_t psmouse_interrupt(struct serio *serio, 196 251 unsigned char data, unsigned int flags, struct pt_regs *regs) 197 252 { 198 253 struct psmouse *psmouse = serio_get_drvdata(serio); 199 - psmouse_ret_t rc; 200 254 201 255 if (psmouse->state == PSMOUSE_IGNORE) 202 256 goto out; ··· 282 208 if (ps2_handle_response(&psmouse->ps2dev, data)) 283 209 goto out; 284 210 285 - if (psmouse->state == PSMOUSE_INITIALIZING) 211 + if (psmouse->state <= PSMOUSE_RESYNCING) 286 212 goto out; 287 213 288 214 if (psmouse->state == PSMOUSE_ACTIVATED && 289 215 psmouse->pktcnt && time_after(jiffies, psmouse->last + HZ/2)) { 290 - printk(KERN_WARNING "psmouse.c: %s at %s lost synchronization, throwing %d bytes away.\n", 216 + printk(KERN_INFO "psmouse.c: %s at %s lost synchronization, throwing %d bytes away.\n", 291 217 psmouse->name, psmouse->phys, psmouse->pktcnt); 292 - psmouse->pktcnt = 0; 218 + psmouse->badbyte = psmouse->packet[0]; 219 + __psmouse_set_state(psmouse, PSMOUSE_RESYNCING); 220 + queue_work(kpsmoused_wq, &psmouse->resync_work); 221 + goto out; 293 222 } 294 223 295 - psmouse->last = jiffies; 296 224 psmouse->packet[psmouse->pktcnt++] = data; 297 - 298 - if (psmouse->packet[0] == PSMOUSE_RET_BAT) { 225 + /* 226 + * Check if this is a new device announcement (0xAA 0x00) 227 + */ 228 + if (unlikely(psmouse->packet[0] == PSMOUSE_RET_BAT && psmouse->pktcnt <= 2)) { 299 229 if (psmouse->pktcnt == 1) 300 230 goto out; 301 231 302 - if (psmouse->pktcnt == 2) { 303 - if (psmouse->packet[1] == PSMOUSE_RET_ID) { 304 - psmouse->state = PSMOUSE_IGNORE; 305 - serio_reconnect(serio); 306 - goto out; 307 - } 308 - if (psmouse->type == PSMOUSE_SYNAPTICS) { 309 - /* neither 0xAA nor 0x00 are valid first bytes 310 - * for a packet in absolute mode 311 - */ 312 - psmouse->pktcnt = 0; 313 - goto out; 314 - } 232 + if (psmouse->packet[1] == PSMOUSE_RET_ID) { 233 + __psmouse_set_state(psmouse, PSMOUSE_IGNORE); 234 + serio_reconnect(serio); 235 + goto out; 315 236 } 237 + /* 238 + * Not a new device, try processing first byte normally 239 + */ 240 + psmouse->pktcnt = 1; 241 + if (psmouse_handle_byte(psmouse, regs)) 242 + goto out; 243 + 244 + psmouse->packet[psmouse->pktcnt++] = data; 316 245 } 317 246 318 - rc = psmouse->protocol_handler(psmouse, regs); 319 - 320 - switch (rc) { 321 - case PSMOUSE_BAD_DATA: 322 - printk(KERN_WARNING "psmouse.c: %s at %s lost sync at byte %d\n", 323 - psmouse->name, psmouse->phys, psmouse->pktcnt); 324 - psmouse->pktcnt = 0; 325 - 326 - if (++psmouse->out_of_sync == psmouse->resetafter) { 327 - psmouse->state = PSMOUSE_IGNORE; 328 - printk(KERN_NOTICE "psmouse.c: issuing reconnect request\n"); 329 - serio_reconnect(psmouse->ps2dev.serio); 330 - } 331 - break; 332 - 333 - case PSMOUSE_FULL_PACKET: 334 - psmouse->pktcnt = 0; 335 - if (psmouse->out_of_sync) { 336 - psmouse->out_of_sync = 0; 337 - printk(KERN_NOTICE "psmouse.c: %s at %s - driver resynched.\n", 338 - psmouse->name, psmouse->phys); 339 - } 340 - break; 341 - 342 - case PSMOUSE_GOOD_DATA: 343 - break; 247 + /* 248 + * See if we need to force resync because mouse was idle for too long 249 + */ 250 + if (psmouse->state == PSMOUSE_ACTIVATED && 251 + psmouse->pktcnt == 1 && psmouse->resync_time && 252 + time_after(jiffies, psmouse->last + psmouse->resync_time * HZ)) { 253 + psmouse->badbyte = psmouse->packet[0]; 254 + __psmouse_set_state(psmouse, PSMOUSE_RESYNCING); 255 + queue_work(kpsmoused_wq, &psmouse->resync_work); 256 + goto out; 344 257 } 345 - out: 258 + 259 + psmouse->last = jiffies; 260 + psmouse_handle_byte(psmouse, regs); 261 + 262 + out: 346 263 return IRQ_HANDLED; 347 264 } 348 265 ··· 817 752 } 818 753 819 754 /* 820 - * psmouse_set_state() sets new psmouse state and resets all flags and 821 - * counters while holding serio lock so fighting with interrupt handler 822 - * is not a concern. 823 - */ 824 - 825 - static void psmouse_set_state(struct psmouse *psmouse, enum psmouse_state new_state) 826 - { 827 - serio_pause_rx(psmouse->ps2dev.serio); 828 - psmouse->state = new_state; 829 - psmouse->pktcnt = psmouse->out_of_sync = 0; 830 - psmouse->ps2dev.flags = 0; 831 - serio_continue_rx(psmouse->ps2dev.serio); 832 - } 833 - 834 - /* 835 755 * psmouse_activate() enables the mouse so that we get motion reports from it. 836 756 */ 837 757 ··· 844 794 psmouse_set_state(psmouse, PSMOUSE_CMD_MODE); 845 795 } 846 796 797 + /* 798 + * psmouse_poll() - default poll hanlder. Everyone except for ALPS uses it. 799 + */ 800 + 801 + static int psmouse_poll(struct psmouse *psmouse) 802 + { 803 + return ps2_command(&psmouse->ps2dev, psmouse->packet, 804 + PSMOUSE_CMD_POLL | (psmouse->pktsize << 8)); 805 + } 806 + 807 + 808 + /* 809 + * psmouse_resync() attempts to re-validate current protocol. 810 + */ 811 + 812 + static void psmouse_resync(void *p) 813 + { 814 + struct psmouse *psmouse = p, *parent = NULL; 815 + struct serio *serio = psmouse->ps2dev.serio; 816 + psmouse_ret_t rc = PSMOUSE_GOOD_DATA; 817 + int failed = 0, enabled = 0; 818 + int i; 819 + 820 + down(&psmouse_sem); 821 + 822 + if (psmouse->state != PSMOUSE_RESYNCING) 823 + goto out; 824 + 825 + if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) { 826 + parent = serio_get_drvdata(serio->parent); 827 + psmouse_deactivate(parent); 828 + } 829 + 830 + /* 831 + * Some mice don't ACK commands sent while they are in the middle of 832 + * transmitting motion packet. To avoid delay we use ps2_sendbyte() 833 + * instead of ps2_command() which would wait for 200ms for an ACK 834 + * that may never come. 835 + * As an additional quirk ALPS touchpads may not only forget to ACK 836 + * disable command but will stop reporting taps, so if we see that 837 + * mouse at least once ACKs disable we will do full reconnect if ACK 838 + * is missing. 839 + */ 840 + psmouse->num_resyncs++; 841 + 842 + if (ps2_sendbyte(&psmouse->ps2dev, PSMOUSE_CMD_DISABLE, 20)) { 843 + if (psmouse->num_resyncs < 3 || psmouse->acks_disable_command) 844 + failed = 1; 845 + } else 846 + psmouse->acks_disable_command = 1; 847 + 848 + /* 849 + * Poll the mouse. If it was reset the packet will be shorter than 850 + * psmouse->pktsize and ps2_command will fail. We do not expect and 851 + * do not handle scenario when mouse "upgrades" its protocol while 852 + * disconnected since it would require additional delay. If we ever 853 + * see a mouse that does it we'll adjust the code. 854 + */ 855 + if (!failed) { 856 + if (psmouse->poll(psmouse)) 857 + failed = 1; 858 + else { 859 + psmouse_set_state(psmouse, PSMOUSE_CMD_MODE); 860 + for (i = 0; i < psmouse->pktsize; i++) { 861 + psmouse->pktcnt++; 862 + rc = psmouse->protocol_handler(psmouse, NULL); 863 + if (rc != PSMOUSE_GOOD_DATA) 864 + break; 865 + } 866 + if (rc != PSMOUSE_FULL_PACKET) 867 + failed = 1; 868 + psmouse_set_state(psmouse, PSMOUSE_RESYNCING); 869 + } 870 + } 871 + /* 872 + * Now try to enable mouse. We try to do that even if poll failed and also 873 + * repeat our attempts 5 times, otherwise we may be left out with disabled 874 + * mouse. 875 + */ 876 + for (i = 0; i < 5; i++) { 877 + if (!ps2_command(&psmouse->ps2dev, NULL, PSMOUSE_CMD_ENABLE)) { 878 + enabled = 1; 879 + break; 880 + } 881 + msleep(200); 882 + } 883 + 884 + if (!enabled) { 885 + printk(KERN_WARNING "psmouse.c: failed to re-enable mouse on %s\n", 886 + psmouse->ps2dev.serio->phys); 887 + failed = 1; 888 + } 889 + 890 + if (failed) { 891 + psmouse_set_state(psmouse, PSMOUSE_IGNORE); 892 + printk(KERN_INFO "psmouse.c: resync failed, issuing reconnect request\n"); 893 + serio_reconnect(serio); 894 + } else 895 + psmouse_set_state(psmouse, PSMOUSE_ACTIVATED); 896 + 897 + if (parent) 898 + psmouse_activate(parent); 899 + out: 900 + up(&psmouse_sem); 901 + } 847 902 848 903 /* 849 904 * psmouse_cleanup() resets the mouse into power-on state. ··· 976 821 down(&psmouse_sem); 977 822 978 823 psmouse_set_state(psmouse, PSMOUSE_CMD_MODE); 824 + 825 + /* make sure we don't have a resync in progress */ 826 + up(&psmouse_sem); 827 + flush_workqueue(kpsmoused_wq); 828 + down(&psmouse_sem); 979 829 980 830 if (serio->parent && serio->id.type == SERIO_PS_PSTHRU) { 981 831 parent = serio_get_drvdata(serio->parent); ··· 1019 859 1020 860 psmouse->set_rate = psmouse_set_rate; 1021 861 psmouse->set_resolution = psmouse_set_resolution; 862 + psmouse->poll = psmouse_poll; 1022 863 psmouse->protocol_handler = psmouse_process_byte; 1023 864 psmouse->pktsize = 3; 1024 865 ··· 1034 873 } 1035 874 else 1036 875 psmouse->type = psmouse_extensions(psmouse, psmouse_max_proto, 1); 876 + 877 + /* 878 + * If mouse's packet size is 3 there is no point in polling the 879 + * device in hopes to detect protocol reset - we won't get less 880 + * than 3 bytes response anyhow. 881 + */ 882 + if (psmouse->pktsize == 3) 883 + psmouse->resync_time = 0; 884 + 885 + /* 886 + * Some smart KVMs fake response to POLL command returning just 887 + * 3 bytes and messing up our resync logic, so if initial poll 888 + * fails we won't try polling the device anymore. Hopefully 889 + * such KVM will maintain initially selected protocol. 890 + */ 891 + if (psmouse->resync_time && psmouse->poll(psmouse)) 892 + psmouse->resync_time = 0; 1037 893 1038 894 sprintf(psmouse->devname, "%s %s %s", 1039 895 psmouse_protocol_by_type(psmouse->type)->name, psmouse->vendor, psmouse->name); ··· 1092 914 goto out; 1093 915 1094 916 ps2_init(&psmouse->ps2dev, serio); 917 + INIT_WORK(&psmouse->resync_work, psmouse_resync, psmouse); 1095 918 psmouse->dev = input_dev; 1096 919 sprintf(psmouse->phys, "%s/input0", serio->phys); 1097 920 ··· 1113 934 psmouse->rate = psmouse_rate; 1114 935 psmouse->resolution = psmouse_resolution; 1115 936 psmouse->resetafter = psmouse_resetafter; 937 + psmouse->resync_time = parent ? 0 : psmouse_resync_time; 1116 938 psmouse->smartscroll = psmouse_smartscroll; 1117 939 1118 940 psmouse_switch_protocol(psmouse, NULL); ··· 1458 1278 1459 1279 static int __init psmouse_init(void) 1460 1280 { 1281 + kpsmoused_wq = create_singlethread_workqueue("kpsmoused"); 1282 + if (!kpsmoused_wq) { 1283 + printk(KERN_ERR "psmouse: failed to create kpsmoused workqueue\n"); 1284 + return -ENOMEM; 1285 + } 1286 + 1461 1287 serio_register_driver(&psmouse_drv); 1288 + 1462 1289 return 0; 1463 1290 } 1464 1291 1465 1292 static void __exit psmouse_exit(void) 1466 1293 { 1467 1294 serio_unregister_driver(&psmouse_drv); 1295 + destroy_workqueue(kpsmoused_wq); 1468 1296 } 1469 1297 1470 1298 module_init(psmouse_init);
+8 -1
drivers/input/mouse/psmouse.h
··· 7 7 #define PSMOUSE_CMD_GETINFO 0x03e9 8 8 #define PSMOUSE_CMD_SETSTREAM 0x00ea 9 9 #define PSMOUSE_CMD_SETPOLL 0x00f0 10 - #define PSMOUSE_CMD_POLL 0x03eb 10 + #define PSMOUSE_CMD_POLL 0x00eb /* caller sets number of bytes to receive */ 11 11 #define PSMOUSE_CMD_GETID 0x02f2 12 12 #define PSMOUSE_CMD_SETRATE 0x10f3 13 13 #define PSMOUSE_CMD_ENABLE 0x00f4 ··· 23 23 enum psmouse_state { 24 24 PSMOUSE_IGNORE, 25 25 PSMOUSE_INITIALIZING, 26 + PSMOUSE_RESYNCING, 26 27 PSMOUSE_CMD_MODE, 27 28 PSMOUSE_ACTIVATED, 28 29 }; ··· 39 38 void *private; 40 39 struct input_dev *dev; 41 40 struct ps2dev ps2dev; 41 + struct work_struct resync_work; 42 42 char *vendor; 43 43 char *name; 44 44 unsigned char packet[8]; 45 + unsigned char badbyte; 45 46 unsigned char pktcnt; 46 47 unsigned char pktsize; 47 48 unsigned char type; 49 + unsigned char acks_disable_command; 48 50 unsigned int model; 49 51 unsigned long last; 50 52 unsigned long out_of_sync; 53 + unsigned long num_resyncs; 51 54 enum psmouse_state state; 52 55 char devname[64]; 53 56 char phys[32]; ··· 59 54 unsigned int rate; 60 55 unsigned int resolution; 61 56 unsigned int resetafter; 57 + unsigned int resync_time; 62 58 unsigned int smartscroll; /* Logitech only */ 63 59 64 60 psmouse_ret_t (*protocol_handler)(struct psmouse *psmouse, struct pt_regs *regs); ··· 68 62 69 63 int (*reconnect)(struct psmouse *psmouse); 70 64 void (*disconnect)(struct psmouse *psmouse); 65 + int (*poll)(struct psmouse *psmouse); 71 66 72 67 void (*pt_activate)(struct psmouse *psmouse); 73 68 void (*pt_deactivate)(struct psmouse *psmouse);
+2
drivers/input/mouse/synaptics.c
··· 652 652 psmouse->disconnect = synaptics_disconnect; 653 653 psmouse->reconnect = synaptics_reconnect; 654 654 psmouse->pktsize = 6; 655 + /* Synaptics can usually stay in sync without extra help */ 656 + psmouse->resync_time = 0; 655 657 656 658 if (SYN_CAP_PASS_THROUGH(priv->capabilities)) 657 659 synaptics_pt_create(psmouse);