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
discover_timer(ulong vp)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
aoe_exit(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
aoe_init(void)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