#include <linux/moduleparam.h>
#include <linux/slab.h>
#include <linux/blkdev.h>
#include <linux/iscsi_boot_sysfs.h>
#include <linux/inet.h>
#include <scsi/scsi_tcq.h>
#include <scsi/scsicam.h>
#include "ql4_def.h"
#include "ql4_version.h"
#include "ql4_glbl.h"
#include "ql4_dbg.h"
#include "ql4_inline.h"
#include "ql4_83xx.h"
static char qla4xxx_version_str[40];
static struct kmem_cache *srb_cachep;
static int ql4xdisablesysfsboot = …;
module_param(ql4xdisablesysfsboot, int, S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(…) …;
int ql4xdontresethba;
module_param(ql4xdontresethba, int, S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(…) …;
int ql4xextended_error_logging;
module_param(ql4xextended_error_logging, int, S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(…) …;
int ql4xenablemsix = …;
module_param(ql4xenablemsix, int, S_IRUGO|S_IWUSR);
MODULE_PARM_DESC(…) …;
#define QL4_DEF_QDEPTH …
static int ql4xmaxqdepth = …;
module_param(ql4xmaxqdepth, int, S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(…) …;
static int ql4xqfulltracking = …;
module_param(ql4xqfulltracking, int, S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(…) …;
static int ql4xsess_recovery_tmo = …;
module_param(ql4xsess_recovery_tmo, int, S_IRUGO);
MODULE_PARM_DESC(…) …;
int ql4xmdcapmask = …;
module_param(ql4xmdcapmask, int, S_IRUGO);
MODULE_PARM_DESC(…) …;
int ql4xenablemd = …;
module_param(ql4xenablemd, int, S_IRUGO | S_IWUSR);
MODULE_PARM_DESC(…) …;
static int qla4xxx_wait_for_hba_online(struct scsi_qla_host *ha);
static void qla4xxx_config_dma_addressing(struct scsi_qla_host *ha);
static int qla4xxx_session_get_param(struct iscsi_cls_session *cls_sess,
enum iscsi_param param, char *buf);
static int qla4xxx_conn_get_param(struct iscsi_cls_conn *conn,
enum iscsi_param param, char *buf);
static int qla4xxx_host_get_param(struct Scsi_Host *shost,
enum iscsi_host_param param, char *buf);
static int qla4xxx_iface_set_param(struct Scsi_Host *shost, void *data,
uint32_t len);
static int qla4xxx_get_iface_param(struct iscsi_iface *iface,
enum iscsi_param_type param_type,
int param, char *buf);
static enum scsi_timeout_action qla4xxx_eh_cmd_timed_out(struct scsi_cmnd *sc);
static struct iscsi_endpoint *qla4xxx_ep_connect(struct Scsi_Host *shost,
struct sockaddr *dst_addr,
int non_blocking);
static int qla4xxx_ep_poll(struct iscsi_endpoint *ep, int timeout_ms);
static void qla4xxx_ep_disconnect(struct iscsi_endpoint *ep);
static int qla4xxx_get_ep_param(struct iscsi_endpoint *ep,
enum iscsi_param param, char *buf);
static int qla4xxx_conn_start(struct iscsi_cls_conn *conn);
static struct iscsi_cls_conn *
qla4xxx_conn_create(struct iscsi_cls_session *cls_sess, uint32_t conn_idx);
static int qla4xxx_conn_bind(struct iscsi_cls_session *cls_session,
struct iscsi_cls_conn *cls_conn,
uint64_t transport_fd, int is_leading);
static void qla4xxx_conn_destroy(struct iscsi_cls_conn *conn);
static struct iscsi_cls_session *
qla4xxx_session_create(struct iscsi_endpoint *ep, uint16_t cmds_max,
uint16_t qdepth, uint32_t initial_cmdsn);
static void qla4xxx_session_destroy(struct iscsi_cls_session *sess);
static void qla4xxx_task_work(struct work_struct *wdata);
static int qla4xxx_alloc_pdu(struct iscsi_task *, uint8_t);
static int qla4xxx_task_xmit(struct iscsi_task *);
static void qla4xxx_task_cleanup(struct iscsi_task *);
static void qla4xxx_fail_session(struct iscsi_cls_session *cls_session);
static void qla4xxx_conn_get_stats(struct iscsi_cls_conn *cls_conn,
struct iscsi_stats *stats);
static int qla4xxx_send_ping(struct Scsi_Host *shost, uint32_t iface_num,
uint32_t iface_type, uint32_t payload_size,
uint32_t pid, struct sockaddr *dst_addr);
static int qla4xxx_get_chap_list(struct Scsi_Host *shost, uint16_t chap_tbl_idx,
uint32_t *num_entries, char *buf);
static int qla4xxx_delete_chap(struct Scsi_Host *shost, uint16_t chap_tbl_idx);
static int qla4xxx_set_chap_entry(struct Scsi_Host *shost, void *data,
int len);
static int qla4xxx_get_host_stats(struct Scsi_Host *shost, char *buf, int len);
static int qla4xxx_queuecommand(struct Scsi_Host *h, struct scsi_cmnd *cmd);
static int qla4xxx_eh_abort(struct scsi_cmnd *cmd);
static int qla4xxx_eh_device_reset(struct scsi_cmnd *cmd);
static int qla4xxx_eh_target_reset(struct scsi_cmnd *cmd);
static int qla4xxx_eh_host_reset(struct scsi_cmnd *cmd);
static int qla4xxx_slave_alloc(struct scsi_device *device);
static umode_t qla4_attr_is_visible(int param_type, int param);
static int qla4xxx_host_reset(struct Scsi_Host *shost, int reset_type);
static int
qla4xxx_sysfs_ddb_set_param(struct iscsi_bus_flash_session *fnode_sess,
struct iscsi_bus_flash_conn *fnode_conn,
void *data, int len);
static int
qla4xxx_sysfs_ddb_get_param(struct iscsi_bus_flash_session *fnode_sess,
int param, char *buf);
static int qla4xxx_sysfs_ddb_add(struct Scsi_Host *shost, const char *buf,
int len);
static int
qla4xxx_sysfs_ddb_delete(struct iscsi_bus_flash_session *fnode_sess);
static int qla4xxx_sysfs_ddb_login(struct iscsi_bus_flash_session *fnode_sess,
struct iscsi_bus_flash_conn *fnode_conn);
static int qla4xxx_sysfs_ddb_logout(struct iscsi_bus_flash_session *fnode_sess,
struct iscsi_bus_flash_conn *fnode_conn);
static int qla4xxx_sysfs_ddb_logout_sid(struct iscsi_cls_session *cls_sess);
static struct qla4_8xxx_legacy_intr_set legacy_intr[] = …;
static const uint32_t qla4_82xx_reg_tbl[] = …;
static const uint32_t qla4_83xx_reg_tbl[] = …;
static struct scsi_host_template qla4xxx_driver_template = …;
static struct iscsi_transport qla4xxx_iscsi_transport = …;
static struct scsi_transport_template *qla4xxx_scsi_transport;
static int qla4xxx_isp_check_reg(struct scsi_qla_host *ha)
{ … }
static int qla4xxx_send_ping(struct Scsi_Host *shost, uint32_t iface_num,
uint32_t iface_type, uint32_t payload_size,
uint32_t pid, struct sockaddr *dst_addr)
{ … }
static umode_t qla4_attr_is_visible(int param_type, int param)
{ … }
static void qla4xxx_create_chap_list(struct scsi_qla_host *ha)
{ … }
static int qla4xxx_get_chap_by_index(struct scsi_qla_host *ha,
int16_t chap_index,
struct ql4_chap_table **chap_entry)
{ … }
static int qla4xxx_find_free_chap_index(struct scsi_qla_host *ha,
uint16_t *chap_index)
{ … }
static int qla4xxx_get_chap_list(struct Scsi_Host *shost, uint16_t chap_tbl_idx,
uint32_t *num_entries, char *buf)
{ … }
static int __qla4xxx_is_chap_active(struct device *dev, void *data)
{ … }
static int qla4xxx_is_chap_active(struct Scsi_Host *shost,
uint16_t chap_tbl_idx)
{ … }
static int qla4xxx_delete_chap(struct Scsi_Host *shost, uint16_t chap_tbl_idx)
{ … }
static int qla4xxx_set_chap_entry(struct Scsi_Host *shost, void *data, int len)
{ … }
static int qla4xxx_get_host_stats(struct Scsi_Host *shost, char *buf, int len)
{ … }
static int qla4xxx_get_iface_param(struct iscsi_iface *iface,
enum iscsi_param_type param_type,
int param, char *buf)
{ … }
static struct iscsi_endpoint *
qla4xxx_ep_connect(struct Scsi_Host *shost, struct sockaddr *dst_addr,
int non_blocking)
{ … }
static int qla4xxx_ep_poll(struct iscsi_endpoint *ep, int timeout_ms)
{ … }
static void qla4xxx_ep_disconnect(struct iscsi_endpoint *ep)
{ … }
static int qla4xxx_get_ep_param(struct iscsi_endpoint *ep,
enum iscsi_param param,
char *buf)
{ … }
static void qla4xxx_conn_get_stats(struct iscsi_cls_conn *cls_conn,
struct iscsi_stats *stats)
{ … }
static enum scsi_timeout_action qla4xxx_eh_cmd_timed_out(struct scsi_cmnd *sc)
{ … }
static void qla4xxx_set_port_speed(struct Scsi_Host *shost)
{ … }
static void qla4xxx_set_port_state(struct Scsi_Host *shost)
{ … }
static int qla4xxx_host_get_param(struct Scsi_Host *shost,
enum iscsi_host_param param, char *buf)
{ … }
static void qla4xxx_create_ipv4_iface(struct scsi_qla_host *ha)
{ … }
static void qla4xxx_create_ipv6_iface(struct scsi_qla_host *ha)
{ … }
static void qla4xxx_create_ifaces(struct scsi_qla_host *ha)
{ … }
static void qla4xxx_destroy_ipv4_iface(struct scsi_qla_host *ha)
{ … }
static void qla4xxx_destroy_ipv6_iface(struct scsi_qla_host *ha)
{ … }
static void qla4xxx_destroy_ifaces(struct scsi_qla_host *ha)
{ … }
static void qla4xxx_set_ipv6(struct scsi_qla_host *ha,
struct iscsi_iface_param_info *iface_param,
struct addr_ctrl_blk *init_fw_cb)
{ … }
static void qla4xxx_set_ipv4(struct scsi_qla_host *ha,
struct iscsi_iface_param_info *iface_param,
struct addr_ctrl_blk *init_fw_cb)
{ … }
static void qla4xxx_set_iscsi_param(struct scsi_qla_host *ha,
struct iscsi_iface_param_info *iface_param,
struct addr_ctrl_blk *init_fw_cb)
{ … }
static void
qla4xxx_initcb_to_acb(struct addr_ctrl_blk *init_fw_cb)
{ … }
static int
qla4xxx_iface_set_param(struct Scsi_Host *shost, void *data, uint32_t len)
{ … }
static int qla4xxx_session_get_param(struct iscsi_cls_session *cls_sess,
enum iscsi_param param, char *buf)
{ … }
static int qla4xxx_conn_get_param(struct iscsi_cls_conn *cls_conn,
enum iscsi_param param, char *buf)
{ … }
int qla4xxx_get_ddb_index(struct scsi_qla_host *ha, uint16_t *ddb_index)
{ … }
static int qla4xxx_match_ipaddress(struct scsi_qla_host *ha,
struct ddb_entry *ddb_entry,
char *existing_ipaddr,
char *user_ipaddr)
{ … }
static int qla4xxx_match_fwdb_session(struct scsi_qla_host *ha,
struct iscsi_cls_conn *cls_conn)
{ … }
static struct iscsi_cls_session *
qla4xxx_session_create(struct iscsi_endpoint *ep,
uint16_t cmds_max, uint16_t qdepth,
uint32_t initial_cmdsn)
{ … }
static void qla4xxx_session_destroy(struct iscsi_cls_session *cls_sess)
{ … }
static struct iscsi_cls_conn *
qla4xxx_conn_create(struct iscsi_cls_session *cls_sess, uint32_t conn_idx)
{ … }
static int qla4xxx_conn_bind(struct iscsi_cls_session *cls_session,
struct iscsi_cls_conn *cls_conn,
uint64_t transport_fd, int is_leading)
{ … }
static int qla4xxx_conn_start(struct iscsi_cls_conn *cls_conn)
{ … }
static void qla4xxx_conn_destroy(struct iscsi_cls_conn *cls_conn)
{ … }
static void qla4xxx_task_work(struct work_struct *wdata)
{ … }
static int qla4xxx_alloc_pdu(struct iscsi_task *task, uint8_t opcode)
{ … }
static void qla4xxx_task_cleanup(struct iscsi_task *task)
{ … }
static int qla4xxx_task_xmit(struct iscsi_task *task)
{ … }
static int qla4xxx_copy_from_fwddb_param(struct iscsi_bus_flash_session *sess,
struct iscsi_bus_flash_conn *conn,
struct dev_db_entry *fw_ddb_entry)
{ … }
static int qla4xxx_copy_to_fwddb_param(struct iscsi_bus_flash_session *sess,
struct iscsi_bus_flash_conn *conn,
struct dev_db_entry *fw_ddb_entry)
{ … }
static void qla4xxx_copy_to_sess_conn_params(struct iscsi_conn *conn,
struct iscsi_session *sess,
struct dev_db_entry *fw_ddb_entry)
{ … }
static void qla4xxx_copy_fwddb_param(struct scsi_qla_host *ha,
struct dev_db_entry *fw_ddb_entry,
struct iscsi_cls_session *cls_sess,
struct iscsi_cls_conn *cls_conn)
{ … }
void qla4xxx_update_session_conn_fwddb_param(struct scsi_qla_host *ha,
struct ddb_entry *ddb_entry)
{ … }
void qla4xxx_update_session_conn_param(struct scsi_qla_host *ha,
struct ddb_entry *ddb_entry)
{ … }
static void qla4xxx_timer(struct timer_list *t);
static void qla4xxx_start_timer(struct scsi_qla_host *ha,
unsigned long interval)
{ … }
static void qla4xxx_stop_timer(struct scsi_qla_host *ha)
{ … }
void qla4xxx_mark_device_missing(struct iscsi_cls_session *cls_session)
{ … }
void qla4xxx_mark_all_devices_missing(struct scsi_qla_host *ha)
{ … }
static struct srb* qla4xxx_get_new_srb(struct scsi_qla_host *ha,
struct ddb_entry *ddb_entry,
struct scsi_cmnd *cmd)
{ … }
static void qla4xxx_srb_free_dma(struct scsi_qla_host *ha, struct srb *srb)
{ … }
void qla4xxx_srb_compl(struct kref *ref)
{ … }
static int qla4xxx_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd)
{ … }
static void qla4xxx_mem_free(struct scsi_qla_host *ha)
{ … }
static int qla4xxx_mem_alloc(struct scsi_qla_host *ha)
{ … }
static int qla4_8xxx_check_temp(struct scsi_qla_host *ha)
{ … }
static int qla4_8xxx_check_fw_alive(struct scsi_qla_host *ha)
{ … }
static void qla4_8xxx_process_fw_error(struct scsi_qla_host *ha)
{ … }
void qla4_8xxx_watchdog(struct scsi_qla_host *ha)
{ … }
static void qla4xxx_check_relogin_flash_ddb(struct iscsi_cls_session *cls_sess)
{ … }
static void qla4xxx_timer(struct timer_list *t)
{ … }
static int qla4xxx_cmd_wait(struct scsi_qla_host *ha)
{ … }
int qla4xxx_hw_reset(struct scsi_qla_host *ha)
{ … }
int qla4xxx_soft_reset(struct scsi_qla_host *ha)
{ … }
static void qla4xxx_abort_active_cmds(struct scsi_qla_host *ha, int res)
{ … }
void qla4xxx_dead_adapter_cleanup(struct scsi_qla_host *ha)
{ … }
static void qla4xxx_fail_session(struct iscsi_cls_session *cls_session)
{ … }
static int qla4xxx_recover_adapter(struct scsi_qla_host *ha)
{ … }
static void qla4xxx_relogin_devices(struct iscsi_cls_session *cls_session)
{ … }
int qla4xxx_unblock_flash_ddb(struct iscsi_cls_session *cls_session)
{ … }
int qla4xxx_unblock_ddb(struct iscsi_cls_session *cls_session)
{ … }
static void qla4xxx_relogin_all_devices(struct scsi_qla_host *ha)
{ … }
static void qla4xxx_relogin_flash_ddb(struct iscsi_cls_session *cls_sess)
{ … }
static void qla4xxx_dpc_relogin(struct iscsi_cls_session *cls_sess)
{ … }
void qla4xxx_wake_dpc(struct scsi_qla_host *ha)
{ … }
static struct qla4_work_evt *
qla4xxx_alloc_work(struct scsi_qla_host *ha, uint32_t data_size,
enum qla4_work_type type)
{ … }
static void qla4xxx_post_work(struct scsi_qla_host *ha,
struct qla4_work_evt *e)
{ … }
int qla4xxx_post_aen_work(struct scsi_qla_host *ha,
enum iscsi_host_event_code aen_code,
uint32_t data_size, uint8_t *data)
{ … }
int qla4xxx_post_ping_evt_work(struct scsi_qla_host *ha,
uint32_t status, uint32_t pid,
uint32_t data_size, uint8_t *data)
{ … }
static void qla4xxx_do_work(struct scsi_qla_host *ha)
{ … }
static void qla4xxx_do_dpc(struct work_struct *work)
{ … }
static void qla4xxx_free_adapter(struct scsi_qla_host *ha)
{ … }
int qla4_8xxx_iospace_config(struct scsi_qla_host *ha)
{ … }
int qla4xxx_iospace_config(struct scsi_qla_host *ha)
{ … }
static struct isp_operations qla4xxx_isp_ops = …;
static struct isp_operations qla4_82xx_isp_ops = …;
static struct isp_operations qla4_83xx_isp_ops = …;
uint16_t qla4xxx_rd_shdw_req_q_out(struct scsi_qla_host *ha)
{ … }
uint16_t qla4_82xx_rd_shdw_req_q_out(struct scsi_qla_host *ha)
{ … }
uint16_t qla4xxx_rd_shdw_rsp_q_in(struct scsi_qla_host *ha)
{ … }
uint16_t qla4_82xx_rd_shdw_rsp_q_in(struct scsi_qla_host *ha)
{ … }
static ssize_t qla4xxx_show_boot_eth_info(void *data, int type, char *buf)
{ … }
static umode_t qla4xxx_eth_get_attr_visibility(void *data, int type)
{ … }
static ssize_t qla4xxx_show_boot_ini_info(void *data, int type, char *buf)
{ … }
static umode_t qla4xxx_ini_get_attr_visibility(void *data, int type)
{ … }
static ssize_t
qla4xxx_show_boot_tgt_info(struct ql4_boot_session_info *boot_sess, int type,
char *buf)
{ … }
static ssize_t qla4xxx_show_boot_tgt_pri_info(void *data, int type, char *buf)
{ … }
static ssize_t qla4xxx_show_boot_tgt_sec_info(void *data, int type, char *buf)
{ … }
static umode_t qla4xxx_tgt_get_attr_visibility(void *data, int type)
{ … }
static void qla4xxx_boot_release(void *data)
{ … }
static int get_fw_boot_info(struct scsi_qla_host *ha, uint16_t ddb_index[])
{ … }
static int qla4xxx_get_bidi_chap(struct scsi_qla_host *ha, char *username,
char *password)
{ … }
static int qla4xxx_get_boot_target(struct scsi_qla_host *ha,
struct ql4_boot_session_info *boot_sess,
uint16_t ddb_index)
{ … }
static int qla4xxx_get_boot_info(struct scsi_qla_host *ha)
{ … }
static int qla4xxx_setup_boot_info(struct scsi_qla_host *ha)
{ … }
static void qla4xxx_get_param_ddb(struct ddb_entry *ddb_entry,
struct ql4_tuple_ddb *tddb)
{ … }
static void qla4xxx_convert_param_ddb(struct dev_db_entry *fw_ddb_entry,
struct ql4_tuple_ddb *tddb,
uint8_t *flash_isid)
{ … }
static int qla4xxx_compare_tuple_ddb(struct scsi_qla_host *ha,
struct ql4_tuple_ddb *old_tddb,
struct ql4_tuple_ddb *new_tddb,
uint8_t is_isid_compare)
{ … }
static int qla4xxx_is_session_exists(struct scsi_qla_host *ha,
struct dev_db_entry *fw_ddb_entry,
uint32_t *index)
{ … }
static int qla4xxx_check_existing_isid(struct list_head *list_nt, uint8_t *isid)
{ … }
static int qla4xxx_update_isid(struct scsi_qla_host *ha,
struct list_head *list_nt,
struct dev_db_entry *fw_ddb_entry)
{ … }
static int qla4xxx_should_update_isid(struct scsi_qla_host *ha,
struct ql4_tuple_ddb *old_tddb,
struct ql4_tuple_ddb *new_tddb)
{ … }
static int qla4xxx_is_flash_ddb_exists(struct scsi_qla_host *ha,
struct list_head *list_nt,
struct dev_db_entry *fw_ddb_entry)
{ … }
static void qla4xxx_free_ddb_list(struct list_head *list_ddb)
{ … }
static struct iscsi_endpoint *qla4xxx_get_ep_fwdb(struct scsi_qla_host *ha,
struct dev_db_entry *fw_ddb_entry)
{ … }
static int qla4xxx_verify_boot_idx(struct scsi_qla_host *ha, uint16_t idx)
{ … }
static void qla4xxx_setup_flash_ddb_entry(struct scsi_qla_host *ha,
struct ddb_entry *ddb_entry,
uint16_t idx)
{ … }
static void qla4xxx_wait_for_ip_configuration(struct scsi_qla_host *ha)
{ … }
static int qla4xxx_cmp_fw_stentry(struct dev_db_entry *fw_ddb_entry,
struct dev_db_entry *flash_ddb_entry)
{ … }
static int qla4xxx_find_flash_st_idx(struct scsi_qla_host *ha,
struct dev_db_entry *fw_ddb_entry,
uint32_t fw_idx, uint32_t *flash_index)
{ … }
static void qla4xxx_build_st_list(struct scsi_qla_host *ha,
struct list_head *list_st)
{ … }
static void qla4xxx_remove_failed_ddb(struct scsi_qla_host *ha,
struct list_head *list_ddb)
{ … }
static void qla4xxx_update_sess_disc_idx(struct scsi_qla_host *ha,
struct ddb_entry *ddb_entry,
struct dev_db_entry *fw_ddb_entry)
{ … }
static int qla4xxx_sess_conn_setup(struct scsi_qla_host *ha,
struct dev_db_entry *fw_ddb_entry,
int is_reset, uint16_t idx)
{ … }
static void qla4xxx_update_fw_ddb_link(struct scsi_qla_host *ha,
struct list_head *list_ddb,
struct dev_db_entry *fw_ddb_entry)
{ … }
static void qla4xxx_build_nt_list(struct scsi_qla_host *ha,
struct list_head *list_nt,
struct list_head *list_st,
int is_reset)
{ … }
static void qla4xxx_build_new_nt_list(struct scsi_qla_host *ha,
struct list_head *list_nt,
uint16_t target_id)
{ … }
static int qla4xxx_sysfs_ddb_is_non_persistent(struct device *dev, void *data)
{ … }
static int qla4xxx_sysfs_ddb_tgt_create(struct scsi_qla_host *ha,
struct dev_db_entry *fw_ddb_entry,
uint16_t *idx, int user)
{ … }
static int qla4xxx_sysfs_ddb_add(struct Scsi_Host *shost, const char *buf,
int len)
{ … }
static int qla4xxx_sysfs_ddb_apply(struct iscsi_bus_flash_session *fnode_sess,
struct iscsi_bus_flash_conn *fnode_conn)
{ … }
static ssize_t qla4xxx_sysfs_ddb_conn_open(struct scsi_qla_host *ha,
struct dev_db_entry *fw_ddb_entry,
uint16_t idx)
{ … }
static int qla4xxx_ddb_login_st(struct scsi_qla_host *ha,
struct dev_db_entry *fw_ddb_entry,
uint16_t target_id)
{ … }
static int qla4xxx_ddb_login_nt(struct scsi_qla_host *ha,
struct dev_db_entry *fw_ddb_entry,
uint16_t idx)
{ … }
static int qla4xxx_sysfs_ddb_login(struct iscsi_bus_flash_session *fnode_sess,
struct iscsi_bus_flash_conn *fnode_conn)
{ … }
static int qla4xxx_sysfs_ddb_logout_sid(struct iscsi_cls_session *cls_sess)
{ … }
static int qla4xxx_sysfs_ddb_logout(struct iscsi_bus_flash_session *fnode_sess,
struct iscsi_bus_flash_conn *fnode_conn)
{ … }
static int
qla4xxx_sysfs_ddb_get_param(struct iscsi_bus_flash_session *fnode_sess,
int param, char *buf)
{ … }
static int
qla4xxx_sysfs_ddb_set_param(struct iscsi_bus_flash_session *fnode_sess,
struct iscsi_bus_flash_conn *fnode_conn,
void *data, int len)
{ … }
static int qla4xxx_sysfs_ddb_delete(struct iscsi_bus_flash_session *fnode_sess)
{ … }
int qla4xxx_sysfs_ddb_export(struct scsi_qla_host *ha)
{ … }
static void qla4xxx_sysfs_ddb_remove(struct scsi_qla_host *ha)
{ … }
void qla4xxx_build_ddb_list(struct scsi_qla_host *ha, int is_reset)
{ … }
static void qla4xxx_wait_login_resp_boot_tgt(struct scsi_qla_host *ha)
{ … }
static int qla4xxx_probe_adapter(struct pci_dev *pdev,
const struct pci_device_id *ent)
{ … }
static void qla4xxx_prevent_other_port_reinit(struct scsi_qla_host *ha)
{ … }
static void qla4xxx_destroy_ddb(struct scsi_qla_host *ha,
struct ddb_entry *ddb_entry)
{ … }
static void qla4xxx_destroy_fw_ddb_session(struct scsi_qla_host *ha)
{ … }
static void qla4xxx_remove_adapter(struct pci_dev *pdev)
{ … }
static void qla4xxx_config_dma_addressing(struct scsi_qla_host *ha)
{ … }
static int qla4xxx_slave_alloc(struct scsi_device *sdev)
{ … }
struct srb *qla4xxx_del_from_active_array(struct scsi_qla_host *ha,
uint32_t index)
{ … }
static int qla4xxx_eh_wait_on_command(struct scsi_qla_host *ha,
struct scsi_cmnd *cmd)
{ … }
static int qla4xxx_wait_for_hba_online(struct scsi_qla_host *ha)
{ … }
static int qla4xxx_eh_wait_for_commands(struct scsi_qla_host *ha,
struct scsi_target *stgt,
struct scsi_device *sdev)
{ … }
static int qla4xxx_eh_abort(struct scsi_cmnd *cmd)
{ … }
static int qla4xxx_eh_device_reset(struct scsi_cmnd *cmd)
{ … }
static int qla4xxx_eh_target_reset(struct scsi_cmnd *cmd)
{ … }
static int qla4xxx_is_eh_active(struct Scsi_Host *shost)
{ … }
static int qla4xxx_eh_host_reset(struct scsi_cmnd *cmd)
{ … }
static int qla4xxx_context_reset(struct scsi_qla_host *ha)
{ … }
static int qla4xxx_host_reset(struct Scsi_Host *shost, int reset_type)
{ … }
static pci_ers_result_t
qla4xxx_pci_error_detected(struct pci_dev *pdev, pci_channel_state_t state)
{ … }
static pci_ers_result_t
qla4xxx_pci_mmio_enabled(struct pci_dev *pdev)
{ … }
static uint32_t qla4_8xxx_error_recovery(struct scsi_qla_host *ha)
{ … }
static pci_ers_result_t
qla4xxx_pci_slot_reset(struct pci_dev *pdev)
{ … }
static void
qla4xxx_pci_resume(struct pci_dev *pdev)
{ … }
static const struct pci_error_handlers qla4xxx_err_handler = …;
static struct pci_device_id qla4xxx_pci_tbl[] = …;
MODULE_DEVICE_TABLE(pci, qla4xxx_pci_tbl);
static struct pci_driver qla4xxx_pci_driver = …;
static int __init qla4xxx_module_init(void)
{ … }
static void __exit qla4xxx_module_exit(void)
{ … }
module_init(…) …;
module_exit(qla4xxx_module_exit);
MODULE_AUTHOR(…) …;
MODULE_DESCRIPTION(…) …;
MODULE_LICENSE(…) …;
MODULE_VERSION(…);