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 <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 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