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