1 /* 2 * PS/2 driver library 3 * 4 * Copyright (c) 1999-2002 Vojtech Pavlik 5 * Copyright (c) 2004 Dmitry Torokhov 6 */ 7 8 /* 9 * This program is free software; you can redistribute it and/or modify it 10 * under the terms of the GNU General Public License version 2 as published by 11 * the Free Software Foundation. 12 */ 13 14 #include <linux/delay.h> 15 #include <linux/module.h> 16 #include <linux/sched.h> 17 #include <linux/interrupt.h> 18 #include <linux/input.h> 19 #include <linux/serio.h> 20 #include <linux/i8042.h> 21 #include <linux/libps2.h> 22 23 #define DRIVER_DESC "PS/2 driver library" 24 25 MODULE_AUTHOR("Dmitry Torokhov <dtor@mail.ru>"); 26 MODULE_DESCRIPTION("PS/2 driver library"); 27 MODULE_LICENSE("GPL"); 28 29 static int ps2_do_sendbyte(struct ps2dev *ps2dev, u8 byte, 30 unsigned int timeout, unsigned int max_attempts) 31 __releases(&ps2dev->serio->lock) __acquires(&ps2dev->serio->lock) 32 { 33 int attempt = 0; 34 int error; 35 36 lockdep_assert_held(&ps2dev->serio->lock); 37 38 do { 39 ps2dev->nak = 1; 40 ps2dev->flags |= PS2_FLAG_ACK; 41 42 serio_continue_rx(ps2dev->serio); 43 44 error = serio_write(ps2dev->serio, byte); 45 if (error) 46 dev_dbg(&ps2dev->serio->dev, 47 "failed to write %#02x: %d\n", byte, error); 48 else 49 wait_event_timeout(ps2dev->wait, 50 !(ps2dev->flags & PS2_FLAG_ACK), 51 msecs_to_jiffies(timeout)); 52 53 serio_pause_rx(ps2dev->serio); 54 } while (ps2dev->nak == PS2_RET_NAK && ++attempt < max_attempts); 55 56 ps2dev->flags &= ~PS2_FLAG_ACK; 57 58 if (!error) { 59 switch (ps2dev->nak) { 60 case 0: 61 break; 62 case PS2_RET_NAK: 63 error = -EAGAIN; 64 break; 65 case PS2_RET_ERR: 66 error = -EPROTO; 67 break; 68 default: 69 error = -EIO; 70 break; 71 } 72 } 73 74 if (error || attempt > 1) 75 dev_dbg(&ps2dev->serio->dev, 76 "%02x - %d (%x), attempt %d\n", 77 byte, error, ps2dev->nak, attempt); 78 79 return error; 80 } 81 82 /* 83 * ps2_sendbyte() sends a byte to the device and waits for acknowledge. 84 * It doesn't handle retransmission, the caller is expected to handle 85 * it when needed. 86 * 87 * ps2_sendbyte() can only be called from a process context. 88 */ 89 90 int ps2_sendbyte(struct ps2dev *ps2dev, u8 byte, unsigned int timeout) 91 { 92 int retval; 93 94 serio_pause_rx(ps2dev->serio); 95 96 retval = ps2_do_sendbyte(ps2dev, byte, timeout, 1); 97 dev_dbg(&ps2dev->serio->dev, "%02x - %x\n", byte, ps2dev->nak); 98 99 serio_continue_rx(ps2dev->serio); 100 101 return retval; 102 } 103 EXPORT_SYMBOL(ps2_sendbyte); 104 105 void ps2_begin_command(struct ps2dev *ps2dev) 106 { 107 struct mutex *m = ps2dev->serio->ps2_cmd_mutex ?: &ps2dev->cmd_mutex; 108 109 mutex_lock(m); 110 } 111 EXPORT_SYMBOL(ps2_begin_command); 112 113 void ps2_end_command(struct ps2dev *ps2dev) 114 { 115 struct mutex *m = ps2dev->serio->ps2_cmd_mutex ?: &ps2dev->cmd_mutex; 116 117 mutex_unlock(m); 118 } 119 EXPORT_SYMBOL(ps2_end_command); 120 121 /* 122 * ps2_drain() waits for device to transmit requested number of bytes 123 * and discards them. 124 */ 125 126 void ps2_drain(struct ps2dev *ps2dev, size_t maxbytes, unsigned int timeout) 127 { 128 if (maxbytes > sizeof(ps2dev->cmdbuf)) { 129 WARN_ON(1); 130 maxbytes = sizeof(ps2dev->cmdbuf); 131 } 132 133 ps2_begin_command(ps2dev); 134 135 serio_pause_rx(ps2dev->serio); 136 ps2dev->flags = PS2_FLAG_CMD; 137 ps2dev->cmdcnt = maxbytes; 138 serio_continue_rx(ps2dev->serio); 139 140 wait_event_timeout(ps2dev->wait, 141 !(ps2dev->flags & PS2_FLAG_CMD), 142 msecs_to_jiffies(timeout)); 143 144 ps2_end_command(ps2dev); 145 } 146 EXPORT_SYMBOL(ps2_drain); 147 148 /* 149 * ps2_is_keyboard_id() checks received ID byte against the list of 150 * known keyboard IDs. 151 */ 152 153 bool ps2_is_keyboard_id(u8 id_byte) 154 { 155 static const u8 keyboard_ids[] = { 156 0xab, /* Regular keyboards */ 157 0xac, /* NCD Sun keyboard */ 158 0x2b, /* Trust keyboard, translated */ 159 0x5d, /* Trust keyboard */ 160 0x60, /* NMB SGI keyboard, translated */ 161 0x47, /* NMB SGI keyboard */ 162 }; 163 164 return memchr(keyboard_ids, id_byte, sizeof(keyboard_ids)) != NULL; 165 } 166 EXPORT_SYMBOL(ps2_is_keyboard_id); 167 168 /* 169 * ps2_adjust_timeout() is called after receiving 1st byte of command 170 * response and tries to reduce remaining timeout to speed up command 171 * completion. 172 */ 173 174 static int ps2_adjust_timeout(struct ps2dev *ps2dev, 175 unsigned int command, unsigned int timeout) 176 { 177 switch (command) { 178 case PS2_CMD_RESET_BAT: 179 /* 180 * Device has sent the first response byte after 181 * reset command, reset is thus done, so we can 182 * shorten the timeout. 183 * The next byte will come soon (keyboard) or not 184 * at all (mouse). 185 */ 186 if (timeout > msecs_to_jiffies(100)) 187 timeout = msecs_to_jiffies(100); 188 break; 189 190 case PS2_CMD_GETID: 191 /* 192 * Microsoft Natural Elite keyboard responds to 193 * the GET ID command as it were a mouse, with 194 * a single byte. Fail the command so atkbd will 195 * use alternative probe to detect it. 196 */ 197 if (ps2dev->cmdbuf[1] == 0xaa) { 198 serio_pause_rx(ps2dev->serio); 199 ps2dev->flags = 0; 200 serio_continue_rx(ps2dev->serio); 201 timeout = 0; 202 } 203 204 /* 205 * If device behind the port is not a keyboard there 206 * won't be 2nd byte of ID response. 207 */ 208 if (!ps2_is_keyboard_id(ps2dev->cmdbuf[1])) { 209 serio_pause_rx(ps2dev->serio); 210 ps2dev->flags = ps2dev->cmdcnt = 0; 211 serio_continue_rx(ps2dev->serio); 212 timeout = 0; 213 } 214 break; 215 216 default: 217 break; 218 } 219 220 return timeout; 221 } 222 223 /* 224 * ps2_command() sends a command and its parameters to the mouse, 225 * then waits for the response and puts it in the param array. 226 * 227 * ps2_command() can only be called from a process context 228 */ 229 230 int __ps2_command(struct ps2dev *ps2dev, u8 *param, unsigned int command) 231 { 232 unsigned int timeout; 233 unsigned int send = (command >> 12) & 0xf; 234 unsigned int receive = (command >> 8) & 0xf; 235 int rc; 236 int i; 237 u8 send_param[16]; 238 239 if (receive > sizeof(ps2dev->cmdbuf)) { 240 WARN_ON(1); 241 return -EINVAL; 242 } 243 244 if (send && !param) { 245 WARN_ON(1); 246 return -EINVAL; 247 } 248 249 memcpy(send_param, param, send); 250 251 serio_pause_rx(ps2dev->serio); 252 253 ps2dev->flags = command == PS2_CMD_GETID ? PS2_FLAG_WAITID : 0; 254 ps2dev->cmdcnt = receive; 255 if (receive && param) 256 for (i = 0; i < receive; i++) 257 ps2dev->cmdbuf[(receive - 1) - i] = param[i]; 258 259 /* Signal that we are sending the command byte */ 260 ps2dev->flags |= PS2_FLAG_ACK_CMD; 261 262 /* 263 * Some devices (Synaptics) peform the reset before 264 * ACKing the reset command, and so it can take a long 265 * time before the ACK arrives. 266 */ 267 timeout = command == PS2_CMD_RESET_BAT ? 1000 : 200; 268 269 rc = ps2_do_sendbyte(ps2dev, command & 0xff, timeout, 2); 270 if (rc) 271 goto out_reset_flags; 272 273 /* Now we are sending command parameters, if any */ 274 ps2dev->flags &= ~PS2_FLAG_ACK_CMD; 275 276 for (i = 0; i < send; i++) { 277 rc = ps2_do_sendbyte(ps2dev, param[i], 200, 2); 278 if (rc) 279 goto out_reset_flags; 280 } 281 282 serio_continue_rx(ps2dev->serio); 283 284 /* 285 * The reset command takes a long time to execute. 286 */ 287 timeout = msecs_to_jiffies(command == PS2_CMD_RESET_BAT ? 4000 : 500); 288 289 timeout = wait_event_timeout(ps2dev->wait, 290 !(ps2dev->flags & PS2_FLAG_CMD1), timeout); 291 292 if (ps2dev->cmdcnt && !(ps2dev->flags & PS2_FLAG_CMD1)) { 293 294 timeout = ps2_adjust_timeout(ps2dev, command, timeout); 295 wait_event_timeout(ps2dev->wait, 296 !(ps2dev->flags & PS2_FLAG_CMD), timeout); 297 } 298 299 serio_pause_rx(ps2dev->serio); 300 301 if (param) 302 for (i = 0; i < receive; i++) 303 param[i] = ps2dev->cmdbuf[(receive - 1) - i]; 304 305 if (ps2dev->cmdcnt && 306 (command != PS2_CMD_RESET_BAT || ps2dev->cmdcnt != 1)) { 307 rc = -EPROTO; 308 goto out_reset_flags; 309 } 310 311 rc = 0; 312 313 out_reset_flags: 314 ps2dev->flags = 0; 315 serio_continue_rx(ps2dev->serio); 316 317 dev_dbg(&ps2dev->serio->dev, 318 "%02x [%*ph] - %x/%08lx [%*ph]\n", 319 command & 0xff, send, send_param, 320 ps2dev->nak, ps2dev->flags, 321 receive, param ?: send_param); 322 323 /* 324 * ps_command() handles resends itself, so do not leak -EAGAIN 325 * to the callers. 326 */ 327 return rc != -EAGAIN ? rc : -EPROTO; 328 } 329 EXPORT_SYMBOL(__ps2_command); 330 331 int ps2_command(struct ps2dev *ps2dev, u8 *param, unsigned int command) 332 { 333 int rc; 334 335 ps2_begin_command(ps2dev); 336 rc = __ps2_command(ps2dev, param, command); 337 ps2_end_command(ps2dev); 338 339 return rc; 340 } 341 EXPORT_SYMBOL(ps2_command); 342 343 /* 344 * ps2_sliced_command() sends an extended PS/2 command to the mouse 345 * using sliced syntax, understood by advanced devices, such as Logitech 346 * or Synaptics touchpads. The command is encoded as: 347 * 0xE6 0xE8 rr 0xE8 ss 0xE8 tt 0xE8 uu where (rr*64)+(ss*16)+(tt*4)+uu 348 * is the command. 349 */ 350 351 int ps2_sliced_command(struct ps2dev *ps2dev, u8 command) 352 { 353 int i; 354 int retval; 355 356 ps2_begin_command(ps2dev); 357 358 retval = __ps2_command(ps2dev, NULL, PS2_CMD_SETSCALE11); 359 if (retval) 360 goto out; 361 362 for (i = 6; i >= 0; i -= 2) { 363 u8 d = (command >> i) & 3; 364 retval = __ps2_command(ps2dev, &d, PS2_CMD_SETRES); 365 if (retval) 366 break; 367 } 368 369 out: 370 dev_dbg(&ps2dev->serio->dev, "%02x - %d\n", command, retval); 371 ps2_end_command(ps2dev); 372 return retval; 373 } 374 EXPORT_SYMBOL(ps2_sliced_command); 375 376 /* 377 * ps2_init() initializes ps2dev structure 378 */ 379 380 void ps2_init(struct ps2dev *ps2dev, struct serio *serio) 381 { 382 mutex_init(&ps2dev->cmd_mutex); 383 lockdep_set_subclass(&ps2dev->cmd_mutex, serio->depth); 384 init_waitqueue_head(&ps2dev->wait); 385 ps2dev->serio = serio; 386 } 387 EXPORT_SYMBOL(ps2_init); 388 389 /* 390 * ps2_handle_ack() is supposed to be used in interrupt handler 391 * to properly process ACK/NAK of a command from a PS/2 device. 392 */ 393 394 bool ps2_handle_ack(struct ps2dev *ps2dev, u8 data) 395 { 396 switch (data) { 397 case PS2_RET_ACK: 398 ps2dev->nak = 0; 399 break; 400 401 case PS2_RET_NAK: 402 ps2dev->flags |= PS2_FLAG_NAK; 403 ps2dev->nak = PS2_RET_NAK; 404 break; 405 406 case PS2_RET_ERR: 407 if (ps2dev->flags & PS2_FLAG_NAK) { 408 ps2dev->flags &= ~PS2_FLAG_NAK; 409 ps2dev->nak = PS2_RET_ERR; 410 break; 411 } 412 413 /* 414 * Workaround for mice which don't ACK the Get ID command. 415 * These are valid mouse IDs that we recognize. 416 */ 417 case 0x00: 418 case 0x03: 419 case 0x04: 420 if (ps2dev->flags & PS2_FLAG_WAITID) { 421 ps2dev->nak = 0; 422 break; 423 } 424 /* Fall through */ 425 default: 426 /* 427 * Do not signal errors if we get unexpected reply while 428 * waiting for an ACK to the initial (first) command byte: 429 * the device might not be quiesced yet and continue 430 * delivering data. 431 * Note that we reset PS2_FLAG_WAITID flag, so the workaround 432 * for mice not acknowledging the Get ID command only triggers 433 * on the 1st byte; if device spews data we really want to see 434 * a real ACK from it. 435 */ 436 dev_dbg(&ps2dev->serio->dev, "unexpected %#02x\n", data); 437 ps2dev->flags &= ~PS2_FLAG_WAITID; 438 return ps2dev->flags & PS2_FLAG_ACK_CMD; 439 } 440 441 if (!ps2dev->nak) { 442 ps2dev->flags &= ~PS2_FLAG_NAK; 443 if (ps2dev->cmdcnt) 444 ps2dev->flags |= PS2_FLAG_CMD | PS2_FLAG_CMD1; 445 } 446 447 ps2dev->flags &= ~PS2_FLAG_ACK; 448 wake_up(&ps2dev->wait); 449 450 if (data != PS2_RET_ACK) 451 ps2_handle_response(ps2dev, data); 452 453 return true; 454 } 455 EXPORT_SYMBOL(ps2_handle_ack); 456 457 /* 458 * ps2_handle_response() is supposed to be used in interrupt handler 459 * to properly store device's response to a command and notify process 460 * waiting for completion of the command. 461 */ 462 463 bool ps2_handle_response(struct ps2dev *ps2dev, u8 data) 464 { 465 if (ps2dev->cmdcnt) 466 ps2dev->cmdbuf[--ps2dev->cmdcnt] = data; 467 468 if (ps2dev->flags & PS2_FLAG_CMD1) { 469 ps2dev->flags &= ~PS2_FLAG_CMD1; 470 if (ps2dev->cmdcnt) 471 wake_up(&ps2dev->wait); 472 } 473 474 if (!ps2dev->cmdcnt) { 475 ps2dev->flags &= ~PS2_FLAG_CMD; 476 wake_up(&ps2dev->wait); 477 } 478 479 return true; 480 } 481 EXPORT_SYMBOL(ps2_handle_response); 482 483 void ps2_cmd_aborted(struct ps2dev *ps2dev) 484 { 485 if (ps2dev->flags & PS2_FLAG_ACK) 486 ps2dev->nak = 1; 487 488 if (ps2dev->flags & (PS2_FLAG_ACK | PS2_FLAG_CMD)) 489 wake_up(&ps2dev->wait); 490 491 /* reset all flags except last nack */ 492 ps2dev->flags &= PS2_FLAG_NAK; 493 } 494 EXPORT_SYMBOL(ps2_cmd_aborted); 495