|
@@ -88,6 +88,10 @@ MODULE_PARM_DESC(nopnp, "Do not use PNP to detect controller settings");
|
|
static bool i8042_debug;
|
|
static bool i8042_debug;
|
|
module_param_named(debug, i8042_debug, bool, 0600);
|
|
module_param_named(debug, i8042_debug, bool, 0600);
|
|
MODULE_PARM_DESC(debug, "Turn i8042 debugging mode on and off");
|
|
MODULE_PARM_DESC(debug, "Turn i8042 debugging mode on and off");
|
|
|
|
+
|
|
|
|
+static bool i8042_unmask_kbd_data;
|
|
|
|
+module_param_named(unmask_kbd_data, i8042_unmask_kbd_data, bool, 0600);
|
|
|
|
+MODULE_PARM_DESC(unmask_kbd_data, "Unconditional enable (may reveal sensitive data) of normally sanitize-filtered kbd data traffic debug log [pre-condition: i8042.debug=1 enabled]");
|
|
#endif
|
|
#endif
|
|
|
|
|
|
static bool i8042_bypass_aux_irq_test;
|
|
static bool i8042_bypass_aux_irq_test;
|
|
@@ -116,6 +120,7 @@ struct i8042_port {
|
|
struct serio *serio;
|
|
struct serio *serio;
|
|
int irq;
|
|
int irq;
|
|
bool exists;
|
|
bool exists;
|
|
|
|
+ bool driver_bound;
|
|
signed char mux;
|
|
signed char mux;
|
|
};
|
|
};
|
|
|
|
|
|
@@ -133,6 +138,7 @@ static bool i8042_kbd_irq_registered;
|
|
static bool i8042_aux_irq_registered;
|
|
static bool i8042_aux_irq_registered;
|
|
static unsigned char i8042_suppress_kbd_ack;
|
|
static unsigned char i8042_suppress_kbd_ack;
|
|
static struct platform_device *i8042_platform_device;
|
|
static struct platform_device *i8042_platform_device;
|
|
|
|
+static struct notifier_block i8042_kbd_bind_notifier_block;
|
|
|
|
|
|
static irqreturn_t i8042_interrupt(int irq, void *dev_id);
|
|
static irqreturn_t i8042_interrupt(int irq, void *dev_id);
|
|
static bool (*i8042_platform_filter)(unsigned char data, unsigned char str,
|
|
static bool (*i8042_platform_filter)(unsigned char data, unsigned char str,
|
|
@@ -528,10 +534,10 @@ static irqreturn_t i8042_interrupt(int irq, void *dev_id)
|
|
port = &i8042_ports[port_no];
|
|
port = &i8042_ports[port_no];
|
|
serio = port->exists ? port->serio : NULL;
|
|
serio = port->exists ? port->serio : NULL;
|
|
|
|
|
|
- dbg("%02x <- i8042 (interrupt, %d, %d%s%s)\n",
|
|
|
|
- data, port_no, irq,
|
|
|
|
- dfl & SERIO_PARITY ? ", bad parity" : "",
|
|
|
|
- dfl & SERIO_TIMEOUT ? ", timeout" : "");
|
|
|
|
|
|
+ filter_dbg(port->driver_bound, data, "<- i8042 (interrupt, %d, %d%s%s)\n",
|
|
|
|
+ port_no, irq,
|
|
|
|
+ dfl & SERIO_PARITY ? ", bad parity" : "",
|
|
|
|
+ dfl & SERIO_TIMEOUT ? ", timeout" : "");
|
|
|
|
|
|
filtered = i8042_filter(data, str, serio);
|
|
filtered = i8042_filter(data, str, serio);
|
|
|
|
|
|
@@ -1438,6 +1444,29 @@ static int __init i8042_setup_kbd(void)
|
|
return error;
|
|
return error;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static int i8042_kbd_bind_notifier(struct notifier_block *nb,
|
|
|
|
+ unsigned long action, void *data)
|
|
|
|
+{
|
|
|
|
+ struct device *dev = data;
|
|
|
|
+ struct serio *serio = to_serio_port(dev);
|
|
|
|
+ struct i8042_port *port = serio->port_data;
|
|
|
|
+
|
|
|
|
+ if (serio != i8042_ports[I8042_KBD_PORT_NO].serio)
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
|
|
+ switch (action) {
|
|
|
|
+ case BUS_NOTIFY_BOUND_DRIVER:
|
|
|
|
+ port->driver_bound = true;
|
|
|
|
+ break;
|
|
|
|
+
|
|
|
|
+ case BUS_NOTIFY_UNBIND_DRIVER:
|
|
|
|
+ port->driver_bound = false;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
static int __init i8042_probe(struct platform_device *dev)
|
|
static int __init i8042_probe(struct platform_device *dev)
|
|
{
|
|
{
|
|
int error;
|
|
int error;
|
|
@@ -1507,6 +1536,10 @@ static struct platform_driver i8042_driver = {
|
|
.shutdown = i8042_shutdown,
|
|
.shutdown = i8042_shutdown,
|
|
};
|
|
};
|
|
|
|
|
|
|
|
+static struct notifier_block i8042_kbd_bind_notifier_block = {
|
|
|
|
+ .notifier_call = i8042_kbd_bind_notifier,
|
|
|
|
+};
|
|
|
|
+
|
|
static int __init i8042_init(void)
|
|
static int __init i8042_init(void)
|
|
{
|
|
{
|
|
struct platform_device *pdev;
|
|
struct platform_device *pdev;
|
|
@@ -1528,6 +1561,7 @@ static int __init i8042_init(void)
|
|
goto err_platform_exit;
|
|
goto err_platform_exit;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ bus_register_notifier(&serio_bus, &i8042_kbd_bind_notifier_block);
|
|
panic_blink = i8042_panic_blink;
|
|
panic_blink = i8042_panic_blink;
|
|
|
|
|
|
return 0;
|
|
return 0;
|
|
@@ -1543,6 +1577,7 @@ static void __exit i8042_exit(void)
|
|
platform_driver_unregister(&i8042_driver);
|
|
platform_driver_unregister(&i8042_driver);
|
|
i8042_platform_exit();
|
|
i8042_platform_exit();
|
|
|
|
|
|
|
|
+ bus_unregister_notifier(&serio_bus, &i8042_kbd_bind_notifier_block);
|
|
panic_blink = NULL;
|
|
panic_blink = NULL;
|
|
}
|
|
}
|
|
|
|
|