Blame view

kernel/linux-imx6_3.14.28/drivers/block/aoe/aoemain.c 2.07 KB
6b13f685e   김민수   BSP 최초 추가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
  /* Copyright (c) 2012 Coraid, Inc.  See COPYING for GPL terms. */
  /*
   * aoemain.c
   * Module initialization routines, discover timer
   */
  
  #include <linux/hdreg.h>
  #include <linux/blkdev.h>
  #include <linux/module.h>
  #include <linux/skbuff.h>
  #include "aoe.h"
  
  MODULE_LICENSE("GPL");
  MODULE_AUTHOR("Sam Hopkins <sah@coraid.com>");
  MODULE_DESCRIPTION("AoE block/char driver for 2.6.2 and newer 2.6 kernels");
  MODULE_VERSION(VERSION);
  
  enum { TINIT, TRUN, TKILL };
  
  static void
  discover_timer(ulong vp)
  {
  	static struct timer_list t;
  	static volatile ulong die;
  	static spinlock_t lock;
  	ulong flags;
  	enum { DTIMERTICK = HZ * 60 }; /* one minute */
  
  	switch (vp) {
  	case TINIT:
  		init_timer(&t);
  		spin_lock_init(&lock);
  		t.data = TRUN;
  		t.function = discover_timer;
  		die = 0;
  	case TRUN:
  		spin_lock_irqsave(&lock, flags);
  		if (!die) {
  			t.expires = jiffies + DTIMERTICK;
  			add_timer(&t);
  		}
  		spin_unlock_irqrestore(&lock, flags);
  
  		aoecmd_cfg(0xffff, 0xff);
  		return;
  	case TKILL:
  		spin_lock_irqsave(&lock, flags);
  		die = 1;
  		spin_unlock_irqrestore(&lock, flags);
  
  		del_timer_sync(&t);
  	default:
  		return;
  	}
  }
  
  static void
  aoe_exit(void)
  {
  	discover_timer(TKILL);
  
  	aoenet_exit();
  	unregister_blkdev(AOE_MAJOR, DEVICE_NAME);
  	aoecmd_exit();
  	aoechr_exit();
  	aoedev_exit();
  	aoeblk_exit();		/* free cache after de-allocating bufs */
  }
  
  static int __init
  aoe_init(void)
  {
  	int ret;
  
  	ret = aoedev_init();
  	if (ret)
  		return ret;
  	ret = aoechr_init();
  	if (ret)
  		goto chr_fail;
  	ret = aoeblk_init();
  	if (ret)
  		goto blk_fail;
  	ret = aoenet_init();
  	if (ret)
  		goto net_fail;
  	ret = aoecmd_init();
  	if (ret)
  		goto cmd_fail;
  	ret = register_blkdev(AOE_MAJOR, DEVICE_NAME);
  	if (ret < 0) {
  		printk(KERN_ERR "aoe: can't register major
  ");
  		goto blkreg_fail;
  	}
  	printk(KERN_INFO "aoe: AoE v%s initialised.
  ", VERSION);
  	discover_timer(TINIT);
  	return 0;
   blkreg_fail:
  	aoecmd_exit();
   cmd_fail:
  	aoenet_exit();
   net_fail:
  	aoeblk_exit();
   blk_fail:
  	aoechr_exit();
   chr_fail:
  	aoedev_exit();
  
  	printk(KERN_INFO "aoe: initialisation failure.
  ");
  	return ret;
  }
  
  module_init(aoe_init);
  module_exit(aoe_exit);