xref: /openbmc/linux/drivers/block/aoe/aoemain.c (revision 4f6cce39)
1 /* Copyright (c) 2012 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 	aoecmd_exit();
65 	aoechr_exit();
66 	aoedev_exit();
67 	aoeblk_exit();		/* free cache after de-allocating bufs */
68 }
69 
70 static int __init
71 aoe_init(void)
72 {
73 	int ret;
74 
75 	ret = aoedev_init();
76 	if (ret)
77 		return ret;
78 	ret = aoechr_init();
79 	if (ret)
80 		goto chr_fail;
81 	ret = aoeblk_init();
82 	if (ret)
83 		goto blk_fail;
84 	ret = aoenet_init();
85 	if (ret)
86 		goto net_fail;
87 	ret = aoecmd_init();
88 	if (ret)
89 		goto cmd_fail;
90 	ret = register_blkdev(AOE_MAJOR, DEVICE_NAME);
91 	if (ret < 0) {
92 		printk(KERN_ERR "aoe: can't register major\n");
93 		goto blkreg_fail;
94 	}
95 	printk(KERN_INFO "aoe: AoE v%s initialised.\n", VERSION);
96 	discover_timer(TINIT);
97 	return 0;
98  blkreg_fail:
99 	aoecmd_exit();
100  cmd_fail:
101 	aoenet_exit();
102  net_fail:
103 	aoeblk_exit();
104  blk_fail:
105 	aoechr_exit();
106  chr_fail:
107 	aoedev_exit();
108 
109 	printk(KERN_INFO "aoe: initialisation failure.\n");
110 	return ret;
111 }
112 
113 module_init(aoe_init);
114 module_exit(aoe_exit);
115 
116