@@ -667,23 +667,50 @@ static void synaptics_pt_stop(struct serio *serio)
667667 serio_continue_rx (parent -> ps2dev .serio );
668668}
669669
670+ static int synaptics_pt_open (struct serio * serio )
671+ {
672+ struct psmouse * parent = psmouse_from_serio (serio -> parent );
673+ struct synaptics_data * priv = parent -> private ;
674+
675+ guard (serio_pause_rx )(parent -> ps2dev .serio );
676+ priv -> pt_port_open = true;
677+
678+ return 0 ;
679+ }
680+
681+ static void synaptics_pt_close (struct serio * serio )
682+ {
683+ struct psmouse * parent = psmouse_from_serio (serio -> parent );
684+ struct synaptics_data * priv = parent -> private ;
685+
686+ guard (serio_pause_rx )(parent -> ps2dev .serio );
687+ priv -> pt_port_open = false;
688+ }
689+
670690static int synaptics_is_pt_packet (u8 * buf )
671691{
672692 return (buf [0 ] & 0xFC ) == 0x84 && (buf [3 ] & 0xCC ) == 0xC4 ;
673693}
674694
675- static void synaptics_pass_pt_packet (struct serio * ptport , u8 * packet )
695+ static void synaptics_pass_pt_packet (struct synaptics_data * priv , u8 * packet )
676696{
677- struct psmouse * child = psmouse_from_serio ( ptport ) ;
697+ struct serio * ptport ;
678698
679- if (child && child -> state == PSMOUSE_ACTIVATED ) {
680- serio_interrupt (ptport , packet [1 ], 0 );
681- serio_interrupt (ptport , packet [4 ], 0 );
682- serio_interrupt (ptport , packet [5 ], 0 );
683- if (child -> pktsize == 4 )
684- serio_interrupt (ptport , packet [2 ], 0 );
685- } else {
686- serio_interrupt (ptport , packet [1 ], 0 );
699+ ptport = priv -> pt_port ;
700+ if (!ptport )
701+ return ;
702+
703+ serio_interrupt (ptport , packet [1 ], 0 );
704+
705+ if (priv -> pt_port_open ) {
706+ struct psmouse * child = psmouse_from_serio (ptport );
707+
708+ if (child -> state == PSMOUSE_ACTIVATED ) {
709+ serio_interrupt (ptport , packet [4 ], 0 );
710+ serio_interrupt (ptport , packet [5 ], 0 );
711+ if (child -> pktsize == 4 )
712+ serio_interrupt (ptport , packet [2 ], 0 );
713+ }
687714 }
688715}
689716
@@ -722,6 +749,8 @@ static void synaptics_pt_create(struct psmouse *psmouse)
722749 serio -> write = synaptics_pt_write ;
723750 serio -> start = synaptics_pt_start ;
724751 serio -> stop = synaptics_pt_stop ;
752+ serio -> open = synaptics_pt_open ;
753+ serio -> close = synaptics_pt_close ;
725754 serio -> parent = psmouse -> ps2dev .serio ;
726755
727756 psmouse -> pt_activate = synaptics_pt_activate ;
@@ -1218,11 +1247,10 @@ static psmouse_ret_t synaptics_process_byte(struct psmouse *psmouse)
12181247
12191248 if (SYN_CAP_PASS_THROUGH (priv -> info .capabilities ) &&
12201249 synaptics_is_pt_packet (psmouse -> packet )) {
1221- if (priv -> pt_port )
1222- synaptics_pass_pt_packet (priv -> pt_port ,
1223- psmouse -> packet );
1224- } else
1250+ synaptics_pass_pt_packet (priv , psmouse -> packet );
1251+ } else {
12251252 synaptics_process_packet (psmouse );
1253+ }
12261254
12271255 return PSMOUSE_FULL_PACKET ;
12281256 }
0 commit comments