blob: ff2fa396a236a83cd4f4205362143fb86c3089e6 [file] [log] [blame]
/*
* Copyright (c) 2010 Cisco Systems, Inc.
*
* This program is free software; you may redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; version 2 of the License.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/types.h>
#include <scsi/libfc.h>
#include "fcst.h"
unsigned int ft_debug_logging;
module_param_named(debug_logging, ft_debug_logging, int, S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(debug_logging, "log levels bigmask");
DEFINE_MUTEX(ft_lport_lock);
static struct notifier_block ft_notifier = {
.notifier_call = ft_lport_notify
};
/*
* SCST target ops and configuration.
* XXX - re-check uninitialized fields
*/
struct scst_tgt_template ft_scst_template = {
.sg_tablesize = 0xffff,
.xmit_response_atomic = 1,
.rdy_to_xfer_atomic = 1,
.xmit_response = ft_send_response,
.rdy_to_xfer = ft_send_xfer_rdy,
.on_hw_pending_cmd_timeout = ft_cmd_timeout,
.on_free_cmd = ft_cmd_free,
.task_mgmt_fn_done = ft_cmd_tm_done,
.release = ft_tgt_release,
.report_aen = ft_report_aen,
.enable_target = ft_tgt_enable,
.is_target_enabled = ft_tgt_enabled,
.get_initiator_port_transport_id = ft_get_transport_id,
.max_hw_pending_time = FT_MAX_HW_PENDING_TIME,
.name = FT_MODULE,
};
static int __init ft_module_init(void)
{
int err;
err = scst_register_target_template(&ft_scst_template);
if (err)
return err;
err = fc_fc4_register_provider(FC_TYPE_FCP, &ft_prov);
if (err) {
scst_unregister_target_template(&ft_scst_template);
return err;
}
blocking_notifier_chain_register(&fc_lport_notifier_head, &ft_notifier);
fc_lport_iterate(ft_lport_add, NULL);
return 0;
}
static void __exit ft_module_exit(void)
{
rcu_barrier();
blocking_notifier_chain_unregister(&fc_lport_notifier_head,
&ft_notifier);
fc_fc4_deregister_provider(FC_TYPE_FCP, &ft_prov);
fc_lport_iterate(ft_lport_del, NULL);
scst_unregister_target_template(&ft_scst_template);
synchronize_rcu();
}
MODULE_AUTHOR("Joe Eykholt <jeykholt@cisco.com>");
MODULE_DESCRIPTION("SCST FCoE target driver v" FT_VERSION);
MODULE_LICENSE("GPL v2");
MODULE_IMPORT_NS(SCST);
module_init(ft_module_init);
module_exit(ft_module_exit);