/* Copyright (c) 2013-2014, 2016 The Linux Foundation. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
 * only version 2 as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 *
 * RMNET Data generic framework
 */

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/export.h>
#include "rmnet_data_private.h"
#include "rmnet_data_config.h"
#include "rmnet_data_vnd.h"

/* Trace Points */
#define CREATE_TRACE_POINTS
#include "rmnet_data_trace.h"

/* Module Parameters */
unsigned int rmnet_data_log_level = RMNET_LOG_LVL_ERR | RMNET_LOG_LVL_HI;
module_param(rmnet_data_log_level, uint, 0644);
MODULE_PARM_DESC(log_level, "Logging level");

unsigned int rmnet_data_log_module_mask;
module_param(rmnet_data_log_module_mask, uint, 0644);
MODULE_PARM_DESC(rmnet_data_log_module_mask, "Logging module mask");

/* Startup/Shutdown */

/* rmnet_init() - Module initialization
 *
 * todo: check for (and init) startup errors
 */
static int __init rmnet_init(void)
{
	rmnet_config_init();
	rmnet_vnd_init();

	LOGL("%s", "RMNET Data driver loaded successfully");
	return 0;
}

static void __exit rmnet_exit(void)
{
	rmnet_config_exit();
	rmnet_vnd_exit();
}

module_init(rmnet_init)
module_exit(rmnet_exit)
MODULE_LICENSE("GPL v2");
