Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/drivers/block/aoe/aoemain.c
15111 views
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 <[email protected]>");
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
aoechr_exit();
65
aoedev_exit();
66
aoeblk_exit(); /* free cache after de-allocating bufs */
67
}
68
69
static int __init
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
113