Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  1 /* Copyright (c) 2007 Coraid, Inc.  See COPYING for GPL terms. */
  2 /*
  3  * aoemain.c
  4  * Module initialization routines, discover timer
  5  */
  6 
  7 #include <linux/hdreg.h>
  8 #include <linux/blkdev.h>
  9 #include <linux/module.h>
 10 #include <linux/skbuff.h>
 11 #include "aoe.h"
 12 
 13 MODULE_LICENSE("GPL");
 14 MODULE_AUTHOR("Sam Hopkins <sah@coraid.com>");
 15 MODULE_DESCRIPTION("AoE block/char driver for 2.6.2 and newer 2.6 kernels");
 16 MODULE_VERSION(VERSION);
 17 
 18 enum { TINIT, TRUN, TKILL };
 19 
 20 static void
 21 discover_timer(ulong vp)
 22 {
 23         static struct timer_list t;
 24         static volatile ulong die;
 25         static spinlock_t lock;
 26         ulong flags;
 27         enum { DTIMERTICK = HZ * 60 }; /* one minute */
 28 
 29         switch (vp) {
 30         case TINIT:
 31                 init_timer(&t);
 32                 spin_lock_init(&lock);
 33                 t.data = TRUN;
 34                 t.function = discover_timer;
 35                 die = 0;
 36         case TRUN:
 37                 spin_lock_irqsave(&lock, flags);
 38                 if (!die) {
 39                         t.expires = jiffies + DTIMERTICK;
 40                         add_timer(&t);
 41                 }
 42                 spin_unlock_irqrestore(&lock, flags);
 43 
 44                 aoecmd_cfg(0xffff, 0xff);
 45                 return;
 46         case TKILL:
 47                 spin_lock_irqsave(&lock, flags);
 48                 die = 1;
 49                 spin_unlock_irqrestore(&lock, flags);
 50 
 51                 del_timer_sync(&t);
 52         default:
 53                 return;
 54         }
 55 }
 56 
 57 static void
 58 aoe_exit(void)
 59 {
 60         discover_timer(TKILL);
 61 
 62         aoenet_exit();
 63         unregister_blkdev(AOE_MAJOR, DEVICE_NAME);
 64         aoechr_exit();
 65         aoedev_exit();
 66         aoeblk_exit();          /* free cache after de-allocating bufs */
 67 }
 68 
 69 static int __init
 70 aoe_init(void)
 71 {
 72         int ret;
 73 
 74         ret = aoedev_init();
 75         if (ret)
 76                 return ret;
 77         ret = aoechr_init();
 78         if (ret)
 79                 goto chr_fail;
 80         ret = aoeblk_init();
 81         if (ret)
 82                 goto blk_fail;
 83         ret = aoenet_init();
 84         if (ret)
 85                 goto net_fail;
 86         ret = register_blkdev(AOE_MAJOR, DEVICE_NAME);
 87         if (ret < 0) {
 88                 printk(KERN_ERR "aoe: can't register major\n");
 89                 goto blkreg_fail;
 90         }
 91 
 92         printk(KERN_INFO "aoe: AoE v%s initialised.\n", VERSION);
 93         discover_timer(TINIT);
 94         return 0;
 95 
 96  blkreg_fail:
 97         aoenet_exit();
 98  net_fail:
 99         aoeblk_exit();
100  blk_fail:
101         aoechr_exit();
102  chr_fail:
103         aoedev_exit();
104         
105         printk(KERN_INFO "aoe: initialisation failure.\n");
106         return ret;
107 }
108 
109 module_init(aoe_init);
110 module_exit(aoe_exit);
111 
112 
  This page was automatically generated by the LXR engine.