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*4882a593Smuzhiyunstatic 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*4882a593Smuzhiyunaoe_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*4882a593Smuzhiyunaoe_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