summaryrefslogtreecommitdiff
path: root/debian/patches/23_ps2_mouse.patch
blob: 28211627b635c2a775616d4d9a7d88e99f049a03 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#DPATCHLEVEL=1

2006-01-14  Samuel Thibault  <samuel.thibault@ens-lyon.org>

	Fix ps2 mouse driver command reception.

	* kd_mouse.c: Remove mouse_char_in and mouse_char variables.
	Add mouse_char_index variable.
	(mouse_handle_byte): Use mousebuf instead of mouse_char for
	storing incoming command characters.
	(kd_mouse_read): Use mousebuf instead of mouse_char
	for getting incoming command characters.
	(kd_mouse_read_reset): New function.
	(ibm_ps2_mouse_open,ibm_ps2_mouse_close): Call new
	kd_mouse_read_reset function.


--- gnumach-20050801/i386/i386at/kd_mouse.c	2001-04-05 08:39:21.000000000 +0200
+++ gnumach-mine/i386/i386at/kd_mouse.c	2006-01-14 22:49:41.000000000 +0100
@@ -122,8 +122,7 @@
 
 boolean_t	mouse_char_cmd = FALSE;		/* mouse response is to cmd */
 boolean_t	mouse_char_wanted = FALSE;	/* want mouse response */
-boolean_t	mouse_char_in = FALSE;		/* have mouse response */
-unsigned char	mouse_char;			/* mouse response */
+int		mouse_char_index;		/* mouse response */
 
 
 /*
@@ -573,11 +572,11 @@ mouse_handle_byte(ch)
 	    /*
 	     *	Mouse character is response to command
 	     */
-	    mouse_char = ch;
-	    mouse_char_in = TRUE;
+	    if (mousebufindex < mousebufsize)
+	        mousebuf[mousebufindex++] = ch;
 	    if (mouse_char_wanted) {
 		mouse_char_wanted = FALSE;
-		wakeup(&mouse_char);
+		wakeup(&mousebuf);
 	    }
 	    return;
 	}
@@ -747,22 +746,33 @@ int kd_mouse_read(void)
 {
 	int	ch;
 
-	while (!mouse_char_in) {
+	if (mouse_char_index >= mousebufsize)
+	    return -1;
+
+	while (mousebufindex <= mouse_char_index) {
 	    mouse_char_wanted = TRUE;
 #ifdef	MACH_KERNEL
-	    assert_wait((event_t) &mouse_char, FALSE);
+	    assert_wait((event_t) &mousebuf, FALSE);
 	    thread_block((void (*)()) 0);
 #else	/* MACH_KERNEL */
-	    sleep(&mouse_char, PZERO);
+	    sleep(&mousebuf, PZERO);
 #endif	/* MACH_KERNEL */
 	}
 
-	ch = mouse_char;
-	mouse_char_in = FALSE;
+	ch = mousebuf[mouse_char_index++];
 
 	return ch;
 }
 
+/*
+ *	Prepare buffer for receiving next packet from mouse.
+ */
+void kd_mouse_read_reset(void)
+{
+	mousebufindex = 0;
+	mouse_char_index = 0;
+}
+
 ibm_ps2_mouse_open(dev)
 {
 	spl_t	s = spltty();
@@ -775,6 +785,7 @@ ibm_ps2_mouse_open(dev)
 	kd_cmdreg_write(0x47);	/* allow mouse interrupts */
 				/* magic number for ibm? */
 
+	kd_mouse_read_reset();
 	kd_mouse_write(0xff);	/* reset mouse */
 	if (kd_mouse_read() != 0xfa) {
 	    splx(s);
@@ -784,18 +795,21 @@ ibm_ps2_mouse_open(dev)
 	(void) kd_mouse_read();	/* discard 2-character mouse ID */
 	(void) kd_mouse_read();
 
+	kd_mouse_read_reset();
 	kd_mouse_write(0xea);	/* set stream mode */
 	if (kd_mouse_read() != 0xfa) {
 	    splx(s);
 	    return;		/* need ACK */
 	}
 
+	kd_mouse_read_reset();
 	kd_mouse_write(0xf4);	/* enable */
 	if (kd_mouse_read() != 0xfa) {
 	    splx(s);
 	    return;		/* need ACK */
 	}
 
+	kd_mouse_read_reset();
 	mouse_char_cmd = FALSE;	/* now we get mouse packets */
 
 	splx(s);
@@ -807,6 +821,7 @@ ibm_ps2_mouse_close(dev)
 
 	mouse_char_cmd = TRUE;	/* responses are to commands */
 
+	kd_mouse_read_reset();
 	kd_mouse_write(0xff);	/* reset mouse */
 	if (kd_mouse_read() == 0xfa) {
 	    /* got ACK: discard 2-char mouse ID */