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
13MODULE_LICENSE("GPL");
14MODULE_AUTHOR("Sam Hopkins <sah@coraid.com>");
15MODULE_DESCRIPTION("AoE block/char driver for 2.6.2 and newer 2.6 kernels");
16MODULE_VERSION(VERSION);
17
18static struct timer_list timer;
19
20static 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
27static void __exit
28aoe_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
40static int __init
41aoe_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
85module_init(aoe_init);
86module_exit(aoe_exit);
87
88