^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* Copyright (c) 2012 Coraid, Inc. See COPYING for GPL terms. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * aoemain.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Module initialization routines, discover timer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <linux/hdreg.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/blkdev.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/skbuff.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include "aoe.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) MODULE_LICENSE("GPL");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) MODULE_AUTHOR("Sam Hopkins <sah@coraid.com>");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) MODULE_DESCRIPTION("AoE block/char driver for 2.6.2 and newer 2.6 kernels");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) MODULE_VERSION(VERSION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) static struct timer_list timer;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) static void discover_timer(struct timer_list *t)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) mod_timer(t, jiffies + HZ * 60); /* one minute */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) aoecmd_cfg(0xffff, 0xff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) static void __exit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) aoe_exit(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) del_timer_sync(&timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) aoenet_exit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) unregister_blkdev(AOE_MAJOR, DEVICE_NAME);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) aoecmd_exit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) aoechr_exit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) aoedev_exit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) aoeblk_exit(); /* free cache after de-allocating bufs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) static int __init
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) aoe_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) ret = aoedev_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) ret = aoechr_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) goto chr_fail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) ret = aoeblk_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) goto blk_fail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) ret = aoenet_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) goto net_fail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) ret = aoecmd_init();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) if (ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) goto cmd_fail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) ret = register_blkdev(AOE_MAJOR, DEVICE_NAME);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) if (ret < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) printk(KERN_ERR "aoe: can't register major\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) goto blkreg_fail;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) printk(KERN_INFO "aoe: AoE v%s initialised.\n", VERSION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) timer_setup(&timer, discover_timer, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) discover_timer(&timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) blkreg_fail:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) aoecmd_exit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) cmd_fail:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) aoenet_exit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) net_fail:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) aoeblk_exit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) blk_fail:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) aoechr_exit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) chr_fail:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) aoedev_exit();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) printk(KERN_INFO "aoe: initialisation failure.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) module_init(aoe_init);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) module_exit(aoe_exit);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87)