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 static struct timer_list timer;
19 
discover_timer(struct timer_list * t)20 static void discover_timer(struct timer_list *t)
21 {
22 	mod_timer(t, jiffies + HZ * 60); /* one minute */
23 
24 	aoecmd_cfg(0xffff, 0xff);
25 }
26 
27 static void __exit
aoe_exit(void)28 aoe_exit(void)
29 {
30 	del_timer_sync(&timer);
31 
32 	aoenet_exit();
33 	unregister_blkdev(AOE_MAJOR, DEVICE_NAME);
34 	aoecmd_exit();
35 	aoechr_exit();
36 	aoedev_exit();
37 	aoeblk_exit();		/* free cache after de-allocating bufs */
38 }
39 
40 static int __init
aoe_init(void)41 aoe_init(void)
42 {
43 	int ret;
44 
45 	ret = aoedev_init();
46 	if (ret)
47 		return ret;
48 	ret = aoechr_init();
49 	if (ret)
50 		goto chr_fail;
51 	ret = aoeblk_init();
52 	if (ret)
53 		goto blk_fail;
54 	ret = aoenet_init();
55 	if (ret)
56 		goto net_fail;
57 	ret = aoecmd_init();
58 	if (ret)
59 		goto cmd_fail;
60 	ret = register_blkdev(AOE_MAJOR, DEVICE_NAME);
61 	if (ret < 0) {
62 		printk(KERN_ERR "aoe: can't register major\n");
63 		goto blkreg_fail;
64 	}
65 	printk(KERN_INFO "aoe: AoE v%s initialised.\n", VERSION);
66 
67 	timer_setup(&timer, discover_timer, 0);
68 	discover_timer(&timer);
69 	return 0;
70  blkreg_fail:
71 	aoecmd_exit();
72  cmd_fail:
73 	aoenet_exit();
74  net_fail:
75 	aoeblk_exit();
76  blk_fail:
77 	aoechr_exit();
78  chr_fail:
79 	aoedev_exit();
80 
81 	printk(KERN_INFO "aoe: initialisation failure.\n");
82 	return ret;
83 }
84 
85 module_init(aoe_init);
86 module_exit(aoe_exit);
87 
88