18f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe/*
28f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe *    HMC Drive DVD Module
38f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe *
48f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe *    Copyright IBM Corp. 2013
58f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe *    Author(s): Ralf Hoppe (rhoppe@de.ibm.com)
68f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe */
78f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe
88f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe#define KMSG_COMPONENT "hmcdrv"
98f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe#define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
108f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe
118f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe#include <linux/kernel.h>
128f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe#include <linux/module.h>
138f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe#include <linux/moduleparam.h>
148f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe#include <linux/version.h>
158f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe#include <linux/stat.h>
168f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe
178f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe#include "hmcdrv_ftp.h"
188f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe#include "hmcdrv_dev.h"
198f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe#include "hmcdrv_cache.h"
208f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe
218f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf HoppeMODULE_LICENSE("GPL");
228f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf HoppeMODULE_AUTHOR("Copyright 2013 IBM Corporation");
238f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf HoppeMODULE_DESCRIPTION("HMC drive DVD access");
248f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe
258f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe/*
268f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe * module parameter 'cachesize'
278f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe */
288f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppestatic size_t hmcdrv_mod_cachesize = HMCDRV_CACHE_SIZE_DFLT;
298f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppemodule_param_named(cachesize, hmcdrv_mod_cachesize, ulong, S_IRUGO);
308f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe
318f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe/**
328f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe * hmcdrv_mod_init() - module init function
338f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe */
348f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppestatic int __init hmcdrv_mod_init(void)
358f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe{
368f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe	int rc = hmcdrv_ftp_probe(); /* perform w/o cache */
378f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe
388f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe	if (rc)
398f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe		return rc;
408f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe
418f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe	rc = hmcdrv_cache_startup(hmcdrv_mod_cachesize);
428f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe
438f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe	if (rc)
448f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe		return rc;
458f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe
468f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe	rc = hmcdrv_dev_init();
478f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe
488f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe	if (rc)
498f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe		hmcdrv_cache_shutdown();
508f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe
518f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe	return rc;
528f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe}
538f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe
548f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe/**
558f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe * hmcdrv_mod_exit() - module exit function
568f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe */
578f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppestatic void __exit hmcdrv_mod_exit(void)
588f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe{
598f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe	hmcdrv_dev_exit();
608f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe	hmcdrv_cache_shutdown();
618f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe}
628f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppe
638f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppemodule_init(hmcdrv_mod_init);
648f933b1043e1e51f4776fc1ffe86752c7785fd4eRalf Hoppemodule_exit(hmcdrv_mod_exit);
65