xref: /OK3568_Linux_fs/kernel/drivers/block/aoe/aoemain.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* Copyright (c) 2012 Coraid, Inc.  See COPYING for GPL terms. */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * aoemain.c
4*4882a593Smuzhiyun  * Module initialization routines, discover timer
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #include <linux/hdreg.h>
8*4882a593Smuzhiyun #include <linux/blkdev.h>
9*4882a593Smuzhiyun #include <linux/module.h>
10*4882a593Smuzhiyun #include <linux/skbuff.h>
11*4882a593Smuzhiyun #include "aoe.h"
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun MODULE_LICENSE("GPL");
14*4882a593Smuzhiyun MODULE_AUTHOR("Sam Hopkins <sah@coraid.com>");
15*4882a593Smuzhiyun MODULE_DESCRIPTION("AoE block/char driver for 2.6.2 and newer 2.6 kernels");
16*4882a593Smuzhiyun MODULE_VERSION(VERSION);
17*4882a593Smuzhiyun 
18*4882a593Smuzhiyun static struct timer_list timer;
19*4882a593Smuzhiyun 
discover_timer(struct timer_list * t)20*4882a593Smuzhiyun static void discover_timer(struct timer_list *t)
21*4882a593Smuzhiyun {
22*4882a593Smuzhiyun 	mod_timer(t, jiffies + HZ * 60); /* one minute */
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun 	aoecmd_cfg(0xffff, 0xff);
25*4882a593Smuzhiyun }
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun static void __exit
aoe_exit(void)28*4882a593Smuzhiyun aoe_exit(void)
29*4882a593Smuzhiyun {
30*4882a593Smuzhiyun 	del_timer_sync(&timer);
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun 	aoenet_exit();
33*4882a593Smuzhiyun 	unregister_blkdev(AOE_MAJOR, DEVICE_NAME);
34*4882a593Smuzhiyun 	aoecmd_exit();
35*4882a593Smuzhiyun 	aoechr_exit();
36*4882a593Smuzhiyun 	aoedev_exit();
37*4882a593Smuzhiyun 	aoeblk_exit();		/* free cache after de-allocating bufs */
38*4882a593Smuzhiyun }
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun static int __init
aoe_init(void)41*4882a593Smuzhiyun aoe_init(void)
42*4882a593Smuzhiyun {
43*4882a593Smuzhiyun 	int ret;
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun 	ret = aoedev_init();
46*4882a593Smuzhiyun 	if (ret)
47*4882a593Smuzhiyun 		return ret;
48*4882a593Smuzhiyun 	ret = aoechr_init();
49*4882a593Smuzhiyun 	if (ret)
50*4882a593Smuzhiyun 		goto chr_fail;
51*4882a593Smuzhiyun 	ret = aoeblk_init();
52*4882a593Smuzhiyun 	if (ret)
53*4882a593Smuzhiyun 		goto blk_fail;
54*4882a593Smuzhiyun 	ret = aoenet_init();
55*4882a593Smuzhiyun 	if (ret)
56*4882a593Smuzhiyun 		goto net_fail;
57*4882a593Smuzhiyun 	ret = aoecmd_init();
58*4882a593Smuzhiyun 	if (ret)
59*4882a593Smuzhiyun 		goto cmd_fail;
60*4882a593Smuzhiyun 	ret = register_blkdev(AOE_MAJOR, DEVICE_NAME);
61*4882a593Smuzhiyun 	if (ret < 0) {
62*4882a593Smuzhiyun 		printk(KERN_ERR "aoe: can't register major\n");
63*4882a593Smuzhiyun 		goto blkreg_fail;
64*4882a593Smuzhiyun 	}
65*4882a593Smuzhiyun 	printk(KERN_INFO "aoe: AoE v%s initialised.\n", VERSION);
66*4882a593Smuzhiyun 
67*4882a593Smuzhiyun 	timer_setup(&timer, discover_timer, 0);
68*4882a593Smuzhiyun 	discover_timer(&timer);
69*4882a593Smuzhiyun 	return 0;
70*4882a593Smuzhiyun  blkreg_fail:
71*4882a593Smuzhiyun 	aoecmd_exit();
72*4882a593Smuzhiyun  cmd_fail:
73*4882a593Smuzhiyun 	aoenet_exit();
74*4882a593Smuzhiyun  net_fail:
75*4882a593Smuzhiyun 	aoeblk_exit();
76*4882a593Smuzhiyun  blk_fail:
77*4882a593Smuzhiyun 	aoechr_exit();
78*4882a593Smuzhiyun  chr_fail:
79*4882a593Smuzhiyun 	aoedev_exit();
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun 	printk(KERN_INFO "aoe: initialisation failure.\n");
82*4882a593Smuzhiyun 	return ret;
83*4882a593Smuzhiyun }
84*4882a593Smuzhiyun 
85*4882a593Smuzhiyun module_init(aoe_init);
86*4882a593Smuzhiyun module_exit(aoe_exit);
87*4882a593Smuzhiyun 
88