ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.bz2
[linux-2.6.git] / Documentation / DocBook / mousedrivers.tmpl
1 <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook V3.1//EN"[]>
2
3 <book id="MouseGuide">
4  <bookinfo>
5   <title>Mouse Drivers</title>
6   
7   <authorgroup>
8    <author>
9     <firstname>Alan</firstname>
10     <surname>Cox</surname>
11     <affiliation>
12      <address>
13       <email>alan@redhat.com</email>
14      </address>
15     </affiliation>
16    </author>
17   </authorgroup>
18
19   <copyright>
20    <year>2000</year>
21    <holder>Alan Cox</holder>
22   </copyright>
23
24   <legalnotice>
25    <para>
26      This documentation is free software; you can redistribute
27      it and/or modify it under the terms of the GNU General Public
28      License as published by the Free Software Foundation; either
29      version 2 of the License, or (at your option) any later
30      version.
31    </para>
32       
33    <para>
34      This program is distributed in the hope that it will be
35      useful, but WITHOUT ANY WARRANTY; without even the implied
36      warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
37      See the GNU General Public License for more details.
38    </para>
39       
40    <para>
41      You should have received a copy of the GNU General Public
42      License along with this program; if not, write to the Free
43      Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
44      MA 02111-1307 USA
45    </para>
46       
47    <para>
48      For more details see the file COPYING in the source
49      distribution of Linux.
50    </para>
51   </legalnotice>
52  </bookinfo>
53
54  <toc></toc>
55
56  <chapter id="intro">
57   <title>Introduction</title>
58   <note>
59    <title>Earlier publication</title>
60     <para>
61       Parts of this document first appeared in Linux Magazine under a
62       ninety day exclusivity.
63    </para>
64   </note> 
65
66   <para>
67     Mice are conceptually one of the simplest device interfaces in the 
68     Linux operating system. Not all mice are handled by the kernel. 
69     Instead there is a two layer abstraction.
70   </para>
71
72   <para>
73     The kernel mouse drivers and userspace drivers for the serial mice are
74     all managed by a system daemon called <application>gpm</application> 
75     - the general purpose mouse driver. <application>gpm</application> 
76     handles cutting and pasting on the text consoles. It provides a 
77     general library for mouse-aware applications and it handles the 
78     sharing of mouse services with the 
79     <application>X Window System</application> user interface.
80   </para>
81   <para>
82     Sometimes a mouse speaks a sufficiently convoluted protocol that the
83     protocol is handled by <application>Gpm</application> itself. Most 
84     of the mouse drivers follow a common interface called the bus mouse 
85     protocol.
86   </para>
87   <para>
88     Each read from a bus mouse interface device returns a block of data. 
89     The first three bytes of each read are defined as follows: 
90
91    <table frame="all">
92     <title>Mouse Data Encoding</title>
93     <tgroup cols="2" align="left">
94      <tbody>
95       <row>
96        <entry>Byte 0</entry>
97        <entry>0x80 + the buttons currently down.</entry>
98       </row>
99       <row>
100        <entry>Byte 1</entry>
101        <entry>A signed value for the shift in X position</entry>
102       </row>
103       <row>
104        <entry>Byte 2</entry>
105        <entry>A signed value for the shift in Y position</entry>
106       </row>
107      </tbody>
108     </tgroup>
109    </table>
110
111     An application can choose to read more than 3 bytes. The rest of the 
112     bytes will be zero, or may optionally return some additional 
113     device-specific information.
114   </para>
115   <para>
116     The position values are truncated if they exceed the 8bit range (that
117     is -127 &lt;= delta &lt;= 127). While the value -128 does fit into a 
118     byte is not allowed.
119   </para>
120   <para>
121     The <mousebutton>buttons</mousebutton> are numbered left to right as 
122     0, 1, 2, 3.. and each button sets the relevant bit. So a user pressing 
123     the left and right button of a three button mouse will set bits 0 and 2.
124   </para>
125   <para>
126     All mice are required to support the <function>poll</function> 
127     operation. Indeed pretty much every user of a mouse device uses 
128     <function>poll</function> to wait for mouse events to occur.
129   </para>
130   <para>
131     Finally the mice support asynchronous I/O. This is a topic we have not 
132     yet covered but which I will explain after looking at a simple mouse 
133     driver.
134   </para>
135  </chapter>
136
137  <chapter id="driver">
138   <title>A simple mouse driver</title>
139   <para>
140     First we will need the set up functions for our mouse device. To keep 
141     this simple our imaginary mouse device has three I/O ports fixed at I/O 
142     address 0x300 and always lives on interrupt 5.  The ports will be the X 
143     position, the Y position and the buttons in that order.
144   </para>
145
146   <programlisting>
147 #define OURMOUSE_BASE        0x300
148
149 static struct miscdevice our_mouse = {
150         OURMOUSE_MINOR, "ourmouse", &amp;our_mouse_fops
151 };
152
153 __init ourmouse_init(void)
154 {
155
156         if (request_region(OURMOUSE_BASE, 3, "ourmouse") < 0) {
157                 printk(KERN_ERR "ourmouse: request_region failed.\n");
158                 return -ENODEV;
159         }
160
161         if (misc_register(&amp;our_mouse) < 0) {
162                 printk(KERN_ERR "ourmouse: cannot register misc device.\n");
163                 release_region(OURMOUSE_BASE, 3);
164                 return -EBUSY;
165         }
166
167         return 0;
168 }
169   </programlisting>
170
171   <para>
172     The <structname>miscdevice</structname> is new here. Linux normally 
173     parcels devices out by major number, and each device has 256 units. 
174     For things like mice this is extremely wasteful so a device exists 
175     which is used to accumulate all the odd individual devices that 
176     computers tend to have.
177   </para>
178   <para>
179     Minor numbers in this space are allocated by a central source, although 
180     you can look in the kernel <filename>Documentation/devices.txt</filename>
181     file and pick a free one for development use. This kernel file also 
182     carries instructions for registering a device. This may change over time 
183     so it is a good idea to obtain a current copy of this file first.
184   </para>
185   <para>
186     Our code then is fairly simple. We reserve our I/O address space with
187     request_region, checking to make sure that it succeeded (i.e. the
188     space wasn't reserved by anyone else). 
189   </para>
190   <para>
191     Then we ask the misc driver to allocate our minor device number. We also
192     hand it our name (which is used in 
193     <filename class="directory">/proc/misc</filename>) and a set of file 
194     operations that are to be used. The file operations work exactly like the 
195     file operations you would register for a normal character device. The misc 
196     device itself is simply acting as a redirector for requests.
197     Since misc_register can fail, it is important to check for failure
198     and act accordingly (which in the case of a mouse driver is to abort,
199     since you can't use the mouse without a working device node).
200   </para>
201   <para>
202     Next, in order to be able to use and test our code we need to add some 
203     module code to support it. This too is fairly simple:
204   </para>
205   <programlisting>
206 #ifdef MODULE
207
208 int init_module(void)
209 {
210         if(ourmouse_init()&lt;0)
211                 return -ENODEV:
212         return 0;
213 }
214
215 void cleanup_module(void)
216 {
217         misc_deregister(&amp;our_mouse);
218         free_region(OURMOUSE_BASE, 3);
219 }
220
221
222 #endif
223   </programlisting>
224
225   <para>
226     The module code provides the normal two functions. The 
227     <function>init_module</function> function is called when the module is 
228     loaded. In our case it simply calls the initialising function we wrote 
229     and returns an error if this fails. This ensures the module will only 
230     be loaded if it was successfully set up.
231   </para>
232   <para>
233     The <function>cleanup_module</function> function is called when the 
234     module is unloaded. We give the miscellaneous device entry back, and 
235     then free our I/O resources. If we didn't free the I/O resources then 
236     the next time the module loaded it would think someone else had its I/O 
237     space.
238   </para>
239   <para>
240     Once the <function>misc_deregister</function> has been called any 
241     attempts to open the mouse device will fail with the error  
242     <errorcode>ENODEV</errorcode> (<errorname>No such device</errorname>).
243   </para>
244   <para>
245     Next we need to fill in our file operations. A mouse doesn't need many 
246     of these. We need to provide open, release, read and poll. That makes 
247     for a nice simple structure:
248   </para>
249
250   <programlisting>
251 struct file_operations our_mouse_fops = {
252         owner: THIS_MODULE,            /* Automatic usage management */
253         read:  read_mouse,             /* You can read a mouse */
254         write: write_mouse,            /* This won't do a lot */
255         poll:  poll_mouse,             /* Poll */
256         open:  open_mouse,             /* Called on open */
257         release: close_mouse,          /* Called on close */
258 };
259   </programlisting>
260
261   <para>
262     There is nothing particularly special needed here. We provide functions 
263     for all the relevant or required operations and little else. There is 
264     nothing stopping us providing an ioctl function for this mouse. Indeed 
265     if you have a configurable mouse it may be very appropriate to provide 
266     configuration interfaces via ioctl calls.
267   </para>
268   <para>
269     The syntax we use is not standard C as such. GCC provides the ability
270     to initialise fields by name, and this generally makes the method table
271     much easier to read than counting through NULL pointers and remembering
272     the order by hand.
273   </para>
274   <para>
275     The owner field is used to manage the locking of module load an
276     unloading. It is obviously important that a module is not unloaded while
277     in use. When your device is opened the module specified by "owner" is 
278     locked. When it is finally released the module is unlocked.
279   </para>
280   <para>
281     The open and close routines need to manage enabling and disabling the 
282     interrupts for the mouse as well as stopping the mouse being unloaded
283     when it is no longer required. 
284   </para>
285
286   <programlisting>
287 static int mouse_users = 0;                /* User count */
288 static int mouse_dx = 0;                   /* Position changes */
289 static int mouse_dy = 0;
290 static int mouse_event = 0;                /* Mouse has moved */
291
292 static int open_mouse(struct inode *inode, struct file *file)
293 {
294         if(mouse_users++)
295                 return 0;
296
297         if(request_irq(mouse_intr, OURMOUSE_IRQ, 0, "ourmouse", NULL))
298         {
299                 mouse_users--;
300                 return -EBUSY;
301         }
302         mouse_dx = 0;
303         mouse_dy = 0;
304         mouse_event = 0;
305         mouse_buttons = 0;
306         return 0;
307 }
308   </programlisting>
309   <para>
310     The open function has to do a small amount of housework. We keep a count 
311     of the number of times the mouse is open. This is because we do not want 
312     to request the interrupt multiple times. If the mouse has at least one 
313     user then it is set up and we simply add to the user count and return
314     <returnvalue>0</returnvalue> for success.
315   </para>
316   <para>
317     We grab the interrupt and thus start mouse interrupts. If the interrupt 
318     has been borrowed by some other driver then <function>request_irq</function>
319     will fail and we will return an error. If we were capable of sharing an 
320     interrupt line we would specify <constant>SA_SHIRQ</constant> instead of 
321     <constant>zero</constant>. Provided that everyone claiming an interrupt 
322     sets this flag, they get to share the line. <hardware>PCI</hardware> can 
323     share interrupts, <hardware>ISA</hardware> normally however cannot. 
324   </para>
325   <para>
326     We do the housekeeping. We make the current mouse position the starting
327     point for accumulated changes and declare that nothing has happened
328     since the mouse driver was opened.
329   </para>
330   <para>
331     The release function needs to unwind all these:
332   </para>
333   <programlisting>
334 static int close_mouse(struct inode *inode, struct file *file)
335 {
336         if(--mouse_users)
337                 return 0;
338         free_irq(OURMOUSE_IRQ, NULL);
339         return 0;
340 }
341   </programlisting>
342   <para>
343     We count off a user and provided that there are still other users need 
344     take no further action. The last person closing the mouse causes us to 
345     free up the interrupt. This stops interrupts from the mouse from using 
346     our CPU time, and ensures that the mouse can now be unloaded.
347   </para>
348   <para>
349     We can fill in the write handler at this point as the write function for 
350     our mouse simply declines to allow writes:
351   </para>
352
353   <programlisting>
354 static ssize_t write_mouse(struct file *file, const char *buffer, size_t
355                                 count, loff_t *ppos)
356 {
357         return -EINVAL;
358 }
359   </programlisting>
360
361   <para>
362     This is pretty much self-explanatory. Whenever you write you get told 
363     it was an invalid function.
364   </para>
365   <para>
366     To make the poll and read functions work we have to consider how we 
367     handle the mouse interrupt. 
368   </para>
369
370   <programlisting>
371 static struct wait_queue *mouse_wait;
372 static spinlock_t mouse_lock = SPIN_LOCK_UNLOCKED;
373
374 static void ourmouse_interrupt(int irq, void *dev_id, struct pt_regs *regs)
375 {
376         char delta_x;
377         char delta_y;
378         unsigned char new_buttons;
379
380         delta_x = inb(OURMOUSE_BASE);
381         delta_y = inb(OURMOUSE_BASE+1);
382         new_buttons = inb(OURMOUSE_BASE+2);
383
384         if(delta_x || delta_y || new_buttons != mouse_buttons)
385         {
386                 /* Something happened */
387
388                 spin_lock(&amp;mouse_lock);
389                 mouse_event = 1;
390                 mouse_dx += delta_x;
391                 mouse_dy += delta_y;
392                 mouse_buttons = new_buttons;
393                 spin_unlock(&amp;mouse_lock);
394                 
395                 wake_up_interruptible(&amp;mouse_wait);
396         }
397 }
398   </programlisting>
399
400   <para>
401     The interrupt handler reads the mouse status. The next thing we do is 
402     to check whether something has changed. If the mouse was smart it would
403     only interrupt us if something had changed, but let's assume our mouse 
404     is stupid as most mice actually tend to be. 
405   </para>
406   <para>
407     If the mouse has changed we need to update the status variables. What we
408     don't want is the mouse functions reading these variables to read them
409     during a change. We add a spinlock that protects these variables while we
410     play with them.
411   </para>
412   <para>
413     If a change has occurred we also need to wake sleeping processes, so we 
414     add a wakeup call and a <structname>wait_queue</structname> to use when 
415     we wish to await a mouse event.
416   </para>
417   <para>
418     Now we have the wait queue we can implement the poll function for the 
419     mouse relatively easily:
420   </para>
421
422   <programlisting>
423 static unsigned int mouse_poll(struct file *file, poll_table *wait)
424 {
425         poll_wait(file, &amp;mouse_wait, wait);
426         if(mouse_event)
427                 return POLLIN | POLLRDNORM;
428         return 0;
429 }
430   </programlisting>
431
432   <para>
433     This is fairly standard poll code. First we add the wait queue to the 
434     list of queues we want to monitor for an event. Secondly we check if an 
435     event has occurred. We only have one kind of event - the 
436     <varname>mouse_event</varname> flag tells us that something happened. 
437     We know that this something can only be mouse data. We return the flags 
438     indicating input and normal reading will succeed.
439   </para>
440   <para>
441     You may be wondering what happens if the function returns saying 'no 
442     event yet'. In this case the wake up from the wait queue we added to 
443     the poll table will cause the function to be called again. Eventually 
444     we will be woken up and have an event ready. At this point the 
445     <function>poll</function> call will exit back to the user.
446   </para>
447   <para>
448     After the poll completes the user will want to read the data. We now 
449     need to think about how our <function>mouse_read</function> function 
450     will work:
451   </para>
452   <programlisting>
453 static ssize_t mouse_read(struct file *file, char *buffer, 
454                 size_t count, loff_t *pos)
455 {
456         int dx, dy;
457         unsigned char button;
458         unsigned long flags;
459         int n;
460
461         if(count&lt;3)
462                 return -EINVAL;
463
464         /*
465           *        Wait for an event
466          */
467
468         while(!mouse_event)
469         {
470                 if(file-&gt;f_flags&amp;O_NDELAY)
471                         return -EAGAIN;
472                 interruptible_sleep_on(&amp;mouse_wait);
473                 if(signal_pending(current))
474                         return -ERESTARTSYS;
475         }
476   </programlisting>
477
478   <para>
479     We start by validating that the user is reading enough data. We could 
480     handle partial reads if we wanted but it isn't terribly useful and the 
481     mouse drivers don't bother to try.
482   </para>
483   <para>
484     Next we wait for an event to occur. The loop is fairly standard event
485     waiting in Linux. Having checked that the event has not yet occurred, we
486     then check if an event is pending and if not we need to sleep. 
487   </para>
488   <para>
489     A user process can set the <constant>O_NDELAY</constant> flag on a file 
490     to indicate that it wishes to be told immediately if no event is 
491     pending. We check this and give the appropriate error if so. 
492   </para>
493   <para>
494     Next we sleep until the mouse or a signal awakens us. A signal will 
495     awaken us as we have used <function>wakeup_interruptible</function>. 
496     This is important as it means a user can kill processes waiting for 
497     the mouse - clearly a desirable property. If we are interrupted we 
498     exit the call and the kernel will then process signals and maybe 
499     restart the call again - from the beginning.
500   </para>
501   <para>
502     This code contains a classic Linux bug. All will be revealed later in this
503     article as well as explanations for how to avoid it.
504   </para>
505   <programlisting>
506         /* Grab the event */
507
508         spinlock_irqsave(&amp;mouse_lock, flags);
509
510         dx = mouse_dx;
511         dy = mouse_dy;
512         button = mouse_buttons;
513
514         if(dx&lt;=-127)
515                 dx=-127;
516         if(dx&gt;=127)
517                 dx=127;
518         if(dy&lt;=-127)
519                 dy=-127;
520         if(dy&gt;=127)
521                 dy=127;
522
523         mouse_dx -= dx;
524         mouse_dy -= dy;
525         
526         if(mouse_dx == 0 &amp;&amp; mouse_dy == 0)
527                 mouse_event = 0;
528
529         spin_unlock_irqrestore(&amp;mouse_lock, flags);
530   </programlisting>
531   <para>
532     This is the next stage. Having established that there is an event 
533     going, we capture it. To be sure that the event is not being updated 
534     as we capture it we also take the spinlock and thus prevent parallel 
535     updates. Note here we use <function>spinlock_irqsave</function>. We 
536     need to disable interrupts on the local processor otherwise bad things 
537     will happen.
538   </para>
539   <para>
540     What will occur is that we take the spinlock. While we hold the lock 
541     an interrupt will occur. At this point our interrupt handler will try 
542     and take the spinlock. It will sit in a loop waiting for the read 
543     routine to release the lock. However because we are sitting in a loop 
544     in the interrupt handler we will never release the lock. The machine 
545     hangs and the user gets upset.
546   </para>
547   <para>
548     By blocking the interrupt on this processor we ensure that the lock 
549     holder will always give the lock back without deadlocking.
550   </para>
551   <para>
552     There is a little cleverness in the reporting mechanism too. We can 
553     only report a move of 127 per read. We don't however want to lose 
554     information by throwing away further movement. Instead we keep 
555     returning as much information as possible. Each time we return a 
556     report we remove the amount from the pending movement in 
557     <varname>mouse_dx</varname> and <varname>mouse_dy</varname>. Eventually 
558     when these counts hit zero we clear the <varname>mouse_event</varname>
559     flag as there is nothing else left to report.
560   </para>
561
562   <programlisting>
563         if(put_user(button|0x80, buffer))
564                 return -EFAULT;
565         if(put_user((char)dx, buffer+1))
566                 return -EFAULT;
567         if(put_user((char)dy, buffer+2))
568                 return -EFAULT;
569
570         for(n=3; n < count; n++)
571                 if(put_user(0x00, buffer+n))
572                         return -EFAULT;
573
574         return count;
575 }
576   </programlisting>
577
578   <para>
579     Finally we must put the results in the user supplied buffer. We cannot 
580     do this while holding the lock as a write to user memory may sleep. 
581     For example the user memory may be residing on disk at this instant. 
582     Thus we did our computation beforehand and now copy the data. Each 
583     <function>put_user call</function> is filling in one byte of the buffer. 
584     If it returns an error we inform the program that it passed us an 
585     invalid buffer and abort.
586   </para>
587   <para>
588     Having written the data we blank the rest of the buffer that was read 
589     and report the read as being successful.
590   </para>
591  </chapter>
592
593  <chapter id="debugging">
594   <title>Debugging the mouse driver</title>
595
596   <para>
597     We now have an almost perfectly usable mouse driver. If you were to 
598     actually try and use it however you would eventually find a couple of 
599     problems with it. A few programs will also not work with as it does not 
600     yet support asynchronous I/O.
601   </para>
602   <para>
603     First let us look at the bugs. The most obvious one isn't really a driver
604     bug but a failure to consider the consequences. Imagine you bumped the 
605     mouse hard by accident and sent it skittering across the desk. The mouse 
606     interrupt routine will add up all that movement and report it in steps of 
607     127 until it has reported all of it. Clearly there is a point beyond 
608     which mouse movement isn't worth reporting. We need to add this as a 
609     limit to the interrupt handler:
610   </para>
611
612   <programlisting>
613 static void ourmouse_interrupt(int irq, void *dev_id, struct pt_regs *regs)
614 {
615         char delta_x;
616         char delta_y;
617         unsigned char new_buttons;
618
619         delta_x = inb(OURMOUSE_BASE);
620         delta_y = inb(OURMOUSE_BASE+1);
621         new_buttons = inb(OURMOUSE_BASE+2);
622
623         if(delta_x || delta_y || new_buttons != mouse_buttons)
624         {
625                 /* Something happened */
626
627                 spin_lock(&amp;mouse_lock);
628                 mouse_event = 1;
629                 mouse_dx += delta_x;
630                 mouse_dy += delta_y;
631
632                 if(mouse_dx &lt; -4096)
633                         mouse_dx = -4096;
634                 if(mouse_dx &gt; 4096)
635                         mouse_dx = 4096;
636
637                 if(mouse_dy &lt; -4096)
638                         mouse_dy = -4096;
639                 if(mouse_dy &gt; 4096)
640                         mouse_dy = 4096;
641
642                 mouse_buttons = new_buttons;
643                 spin_unlock(&amp;mouse_lock);
644                 
645                 wake_up_interruptible(&amp;mouse_wait);
646         }
647 }
648   </programlisting>
649
650   <para>
651     By adding these checks we limit the range of accumulated movement to
652     something sensible. 
653   </para>
654   <para>
655     The second bug is a bit more subtle, and that is perhaps why this is 
656     such a common mistake. Remember, I said the waiting loop for the read 
657     handler had a bug in it. Think about what happens when we execute:
658   </para>
659
660   <programlisting>
661         while(!mouse_event)
662         {
663   </programlisting>
664
665   <para>
666     and an interrupt occurs at this point here. This causes a mouse movement
667     and wakes up the queue. 
668   </para>
669
670   <programlisting>
671                 interruptible_sleep_on(&amp;mouse_wait);
672   </programlisting>
673
674   <para>
675     Now we sleep on the queue. We missed the wake up and the application 
676     will not see an event until the next mouse event occurs. This will 
677     lead to just the odd instance when a mouse button gets delayed. The 
678     consequences to the user will probably be almost undetectable with a 
679     mouse driver. With other drivers this bug could be a lot more severe.
680   </para>
681   <para>
682     There are two ways to solve this. The first is to disable interrupts 
683     during the testing and the sleep. This works because when a task sleeps 
684     it ceases to disable interrupts, and when it resumes it disables them 
685     again. Our code thus becomes:
686   </para>
687
688   <programlisting>
689         save_flags(flags);
690         cli();
691
692         while(!mouse_event)
693         {
694                 if(file-&gt;f_flags&amp;O_NDELAY)
695                 {
696                         restore_flags(flags);
697                         return -EAGAIN;
698                 }
699                 interruptible_sleep_on(&amp;mouse_wait);
700                 if(signal_pending(current))
701                 {
702                         restore_flags(flags);
703                         return -ERESTARTSYS;
704                 }
705         }
706         restore_flags(flags);
707   </programlisting>
708
709   <para>
710     This is the sledgehammer approach. It works but it means we spend a 
711     lot more time turning interrupts on and off. It also affects 
712     interrupts globally and has bad properties on multiprocessor machines 
713     where turning interrupts off globally is not a simple operation, but 
714     instead involves kicking each processor, waiting for them to disable 
715     interrupts and reply.
716   </para>
717   <para>
718     The real problem is the race between the event testing and the sleeping. 
719     We can avoid that by using the scheduling functions more directly. 
720     Indeed this is the way they generally should be used for an interrupt.
721   </para>
722
723   <programlisting>
724         struct wait_queue wait = { current, NULL };
725
726         add_wait_queue(&amp;mouse_wait, &amp;wait);
727         set_current_state(TASK_INTERRUPTIBLE);
728         
729         while(!mouse_event)
730         {
731                 if(file-&gt;f_flags&amp;O_NDELAY)
732                 {
733                         remove_wait_queue(&amp;mouse_wait, &amp;wait);
734                         set_current_state(TASK_RUNNING);
735                         return -EWOULDBLOCK;
736                 }
737                 if(signal_pending(current))
738                 {
739                         remove_wait_queue(&amp;mouse_wait, &amp;wait);
740                         current-&gt;state = TASK_RUNNING;
741                         return -ERESTARTSYS;
742                 }
743                 schedule();
744                 set_current_state(TASK_INTERRUPTIBLE);
745         }
746         
747         remove_wait_wait(&amp;mouse_wait, &amp;wait);
748         set_current_state(TASK_RUNNING);
749   </programlisting>
750
751   <para>
752     At first sight this probably looks like deep magic. To understand how 
753     this works you need to understand how scheduling and events work on 
754     Linux. Having a good grasp of this is one of the keys to writing clean 
755     efficient device drivers.
756   </para>
757   <para>
758     <function>add_wait_queue</function> does what its name suggests. It adds 
759     an entry to the <varname>mouse_wait</varname> list. The entry in this 
760     case is the entry for our current process (<varname>current</varname>
761     is the current task pointer). 
762   </para>
763   <para>
764     So we start by adding an entry for ourself onto the 
765     <varname>mouse_wait</varname> list. This does not put us to sleep 
766     however. We are merely tagged onto the list. 
767   </para>
768   <para>
769     Next we set our status to <constant>TASK_INTERRUPTIBLE</constant>. Again 
770     this does not mean we are now asleep. This flag says what should happen 
771     next time the process sleeps. <constant>TASK_INTERRUPTIBLE</constant> says 
772     that the process should not be rescheduled. It will run from now until it 
773     sleeps and then will need to be woken up.
774   </para>
775   <para>
776     The <function>wakeup_interruptible</function> call in the interrupt 
777     handler can now be explained in more detail. This function is also very 
778     simple. It goes along the list of processes on the queue it is given and 
779     any that are marked as <constant>TASK_INTERRUPTIBLE</constant> it changes 
780     to <constant>TASK_RUNNING</constant> and tells the kernel that new 
781     processes are runnable.
782   </para>
783   <para>
784     Behind all the wrappers in the original code what is happening is this
785   </para>
786
787   <procedure>
788    <step>
789     <para>
790       We add ourself to the mouse wait queue
791     </para>
792    </step>
793    <step>
794     <para>
795       We mark ourself as sleeping
796     </para>
797    </step>
798    <step>
799     <para>
800       We ask the kernel to schedule tasks again
801     </para>
802    </step>
803    <step>
804     <para>
805       The kernel sees we are asleep and schedules someone else.
806     </para>
807    </step>
808    <step>
809     <para>
810       The mouse interrupt sets our state to <constant>TASK_RUNNING</constant> 
811       and makes a note that the kernel should reschedule tasks
812     </para>
813    </step>
814    <step>
815     <para>
816       The kernel sees we are running again and continues our execution
817     </para>
818    </step>
819   </procedure>
820   <para>
821     This is why the apparent magic works. Because we mark ourself as
822     <constant>TASK_INTERRUPTIBLE</constant> and as we add ourselves 
823     to the queue before we check if there are events pending, the race 
824     condition is removed.
825   </para>
826   <para>
827     Now if an interrupt occurs after we check the queue status and before 
828     we call the <function>schedule</function> function in order to sleep, 
829     things work out. Instead of missing an event, we are set back to 
830     <constant>TASK_RUNNING</constant> by the mouse interrupt. We still call 
831     <function>schedule</function> but it will continue running our task. 
832     We go back around the loop and this time there may be an event.
833   </para>
834   <para>
835     There will not always be an event. Thus we set ourselves back to
836     <constant>TASK_INTERRUPTIBLE</constant> before resuming the loop. 
837     Another process doing a read may already have cleared the event flag, 
838     and if so we will need to go back to sleep again. Eventually we will 
839     get our event and escape.
840   </para>
841   <para>
842     Finally when we exit the loop we remove ourselves from the 
843     <varname>mouse_wait</varname> queue as we are no longer interested
844     in mouse events, and we set ourself back to 
845     <constant>TASK_RUNNABLE</constant> as we do not wish to go to sleep 
846     again just yet.
847   </para>
848   <note>
849    <title>Note</title> 
850    <para>
851      This isn't an easy topic. Don't be afraid to reread the description a 
852      few times and also look at other device drivers to see how it works. 
853      Finally if you can't grasp it just yet, you can use the code as 
854      boilerplate to write other drivers and trust me instead.
855    </para>
856   </note>
857  </chapter>
858
859  <chapter id="asyncio">
860   <title>Asynchronous I/O</title>
861   <para>
862     This leaves the missing feature - Asynchronous I/O. Normally UNIX 
863     programs use the <function>poll</function> call (or its variant form 
864     <function>select</function>) to wait for an event to occur on one of 
865     multiple input or output devices. This model works well for most tasks 
866     but because <function>poll</function> and <function>select</function> 
867     wait for an event isn't suitable for tasks that are also continually 
868     doing computation work. Such programs really want the kernel to kick 
869     them when something happens rather than watch for events.
870   </para>
871   <para>
872     Poll is akin to having a row of lights in front of you. You can see at a
873     glance which ones if any are lit. You cannot however get anything useful
874     done while watching them. Asynchronous I/O uses signals which work more 
875     like a door bell. Instead of you watching, it tells you that something 
876     is up.
877   </para>
878   <para>
879     Asynchronous I/O sends the signal SIGIO to a user process when the I/O 
880     events occur. In this case that means when people move the mouse. The 
881     SIGIO signal causes the user process to jump to its signal handler and 
882     execute code in that handler before returning to whatever was going on 
883     previously. It is the application equivalent of an interrupt handler.
884   </para>
885   <para>
886     Most of the code needed for this operation is common to all its users. 
887     The kernel provides a simple set of functions for managing asynchronous 
888     I/O.
889   </para>
890   <para>
891     Our first job is to allow users to set asynchronous I/O on file handles. 
892     To do that we need to add a new function to the file operations table for 
893     our mouse:
894   </para>
895
896   <programlisting>
897 struct file_operations our_mouse_fops = {
898         owner: THIS_MODULE
899         read:  read_mouse,      /* You can read a mouse */
900         write: write_mouse,     /* This won't do a lot */
901         poll:  poll_mouse,      /* Poll */
902         open:  open_mouse,      /* Called on open */
903         release: close_mouse,   /* Called on close */
904         fasync: fasync_mouse,   /* Asynchronous I/O */
905 };
906   </programlisting>
907
908   <para>
909     Once we have installed this entry the kernel knows we support 
910     asynchronous I/O and will allow all the relevant operations on the 
911     device. Whenever a user adds or removes asynchronous I/O notification 
912     on a file handle it calls our <function>fasync_mouse</function> routine 
913     we just added. This routine uses the helper functions to keep the queue 
914     of handles up to date:
915   </para>
916
917   <programlisting>
918 static struct fasync_struct *mouse_fasync = NULL;
919
920 static int fasync_mouse(int fd, struct file *filp, int on)
921 {
922          int retval = fasync_helper(fd, filp, on, &amp;mouse_fasync);
923
924          if (retval &lt; 0)
925                  return retval;
926         return 0;
927 }
928   </programlisting>
929
930   <para>
931     The fasync helper adds and deletes entries by managing the supplied 
932     list. We also need to remove entries from this list when the file is 
933     closed. This requires we add one line to our close function:
934   </para>
935
936   <programlisting>
937 static int close_mouse(struct inode *inode, struct file *file)
938 {
939         fasync_mouse(-1, file, 0)
940         if(--mouse_users)
941                 return 0;
942         free_irq(OURMOUSE_IRQ, NULL);
943         MOD_DEC_USE_COUNT;
944         return 0;
945 }
946   </programlisting>
947
948   <para>
949     When we close the file we now call our own fasync handler as if the 
950     user had requested that this file cease to be used for asynchronous 
951     I/O. This rather neatly cleans up any loose ends. We certainly don't 
952     wait to deliver a signal for a file that no longer exists.
953   </para>
954   <para>
955     At this point the mouse driver supports all the asynchronous I/O 
956     operations, and applications using them will not error. They won't 
957     however work yet. We need to actually send the signals. Again the 
958     kernel provides a function for handling this.
959   </para>
960   <para>
961     We update our interrupt handler a little:
962   </para>
963
964   <programlisting>
965 static void ourmouse_interrupt(int irq, void *dev_id, struct pt_regs *regs)
966 {
967         char delta_x;
968         char delta_y;
969         unsigned char new_buttons;
970
971         delta_x = inb(OURMOUSE_BASE);
972         delta_y = inb(OURMOUSE_BASE+1);
973         new_buttons = inb(OURMOUSE_BASE+2);
974
975         if(delta_x || delta_y || new_buttons != mouse_buttons)
976         {
977                 /* Something happened */
978
979                 spin_lock(&amp;mouse_lock);
980                 mouse_event = 1;
981                 mouse_dx += delta_x;
982                 mouse_dy += delta_y;
983
984                 if(mouse_dx &lt; -4096)
985                         mouse_dx = -4096;
986                 if(mouse_dx &gt; 4096)
987                         mouse_dx = 4096;
988
989                 if(mouse_dy &lt; -4096)
990                         mouse_dy = -4096;
991                 if(mouse_dy &gt; 4096)
992                         mouse_dy = 4096;
993
994                 mouse_buttons = new_buttons;
995                 spin_unlock(&amp;mouse_lock);
996
997                 /* Now we do asynchronous I/O */
998                 kill_fasync(&amp;mouse_fasync, SIGIO); 
999                 
1000                 wake_up_interruptible(&amp;mouse_wait);
1001         }
1002 }
1003   </programlisting>
1004
1005   <para>
1006     The new code simply calls the <function>kill_fasync</function> routine
1007     provided by the kernel if the queue is non-empty. This sends the 
1008     required signal (SIGIO in this case) to the process each file handle 
1009     says should be informed about the exciting new mouse movement that 
1010     just happened.
1011   </para>
1012   <para>
1013     With this in place and the bugs in the original version fixed, you now 
1014     have a fully functional mouse driver using the bus mouse protocol. It 
1015     will work with the <application>X window system</application>, will work 
1016     with <application>GPM</application> and should work with every other 
1017     application you need. <application>Doom</application> is of course the 
1018     ideal way to test your new mouse driver is functioning properly. Be sure 
1019     to test it thoroughly.
1020   </para>
1021  </chapter>
1022 </book>
1023