2006-09-20 01:28:00 +08:00
|
|
|
/*
|
|
|
|
* QLogic iSCSI HBA Driver
|
2010-12-03 14:12:51 +08:00
|
|
|
* Copyright (c) 2003-2010 QLogic Corporation
|
2006-09-20 01:28:00 +08:00
|
|
|
*
|
|
|
|
* See LICENSE.qla4xxx for copyright and licensing details.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef __QLA4x_GBL_H
|
|
|
|
#define __QLA4x_GBL_H
|
|
|
|
|
2007-05-24 09:14:34 +08:00
|
|
|
struct iscsi_cls_conn;
|
|
|
|
|
2010-07-28 18:23:44 +08:00
|
|
|
int qla4xxx_hw_reset(struct scsi_qla_host *ha);
|
2006-11-16 08:41:09 +08:00
|
|
|
int ql4xxx_lock_drvr_wait(struct scsi_qla_host *a);
|
2006-09-20 01:28:00 +08:00
|
|
|
int qla4xxx_send_tgts(struct scsi_qla_host *ha, char *ip, uint16_t port);
|
2010-07-28 18:23:44 +08:00
|
|
|
int qla4xxx_send_command_to_isp(struct scsi_qla_host *ha, struct srb *srb);
|
|
|
|
int qla4xxx_initialize_adapter(struct scsi_qla_host *ha,
|
2006-09-20 01:28:00 +08:00
|
|
|
uint8_t renew_ddb_list);
|
|
|
|
int qla4xxx_soft_reset(struct scsi_qla_host *ha);
|
IRQ: Maintain regs pointer globally rather than passing to IRQ handlers
Maintain a per-CPU global "struct pt_regs *" variable which can be used instead
of passing regs around manually through all ~1800 interrupt handlers in the
Linux kernel.
The regs pointer is used in few places, but it potentially costs both stack
space and code to pass it around. On the FRV arch, removing the regs parameter
from all the genirq function results in a 20% speed up of the IRQ exit path
(ie: from leaving timer_interrupt() to leaving do_IRQ()).
Where appropriate, an arch may override the generic storage facility and do
something different with the variable. On FRV, for instance, the address is
maintained in GR28 at all times inside the kernel as part of general exception
handling.
Having looked over the code, it appears that the parameter may be handed down
through up to twenty or so layers of functions. Consider a USB character
device attached to a USB hub, attached to a USB controller that posts its
interrupts through a cascaded auxiliary interrupt controller. A character
device driver may want to pass regs to the sysrq handler through the input
layer which adds another few layers of parameter passing.
I've build this code with allyesconfig for x86_64 and i386. I've runtested the
main part of the code on FRV and i386, though I can't test most of the drivers.
I've also done partial conversion for powerpc and MIPS - these at least compile
with minimal configurations.
This will affect all archs. Mostly the changes should be relatively easy.
Take do_IRQ(), store the regs pointer at the beginning, saving the old one:
struct pt_regs *old_regs = set_irq_regs(regs);
And put the old one back at the end:
set_irq_regs(old_regs);
Don't pass regs through to generic_handle_irq() or __do_IRQ().
In timer_interrupt(), this sort of change will be necessary:
- update_process_times(user_mode(regs));
- profile_tick(CPU_PROFILING, regs);
+ update_process_times(user_mode(get_irq_regs()));
+ profile_tick(CPU_PROFILING);
I'd like to move update_process_times()'s use of get_irq_regs() into itself,
except that i386, alone of the archs, uses something other than user_mode().
Some notes on the interrupt handling in the drivers:
(*) input_dev() is now gone entirely. The regs pointer is no longer stored in
the input_dev struct.
(*) finish_unlinks() in drivers/usb/host/ohci-q.c needs checking. It does
something different depending on whether it's been supplied with a regs
pointer or not.
(*) Various IRQ handler function pointers have been moved to type
irq_handler_t.
Signed-Off-By: David Howells <dhowells@redhat.com>
(cherry picked from 1b16e7ac850969f38b375e511e3fa2f474a33867 commit)
2006-10-05 21:55:46 +08:00
|
|
|
irqreturn_t qla4xxx_intr_handler(int irq, void *dev_id);
|
2006-09-20 01:28:00 +08:00
|
|
|
|
2010-07-28 18:23:44 +08:00
|
|
|
void qla4xxx_free_ddb_list(struct scsi_qla_host *ha);
|
|
|
|
void qla4xxx_free_ddb(struct scsi_qla_host *ha, struct ddb_entry *ddb_entry);
|
|
|
|
void qla4xxx_process_aen(struct scsi_qla_host *ha, uint8_t process_aen);
|
2006-09-20 01:28:00 +08:00
|
|
|
|
2010-07-28 18:23:44 +08:00
|
|
|
int qla4xxx_get_dhcp_ip_address(struct scsi_qla_host *ha);
|
|
|
|
int qla4xxx_relogin_device(struct scsi_qla_host *ha,
|
|
|
|
struct ddb_entry *ddb_entry);
|
2010-04-28 14:12:24 +08:00
|
|
|
int qla4xxx_abort_task(struct scsi_qla_host *ha, struct srb *srb);
|
2010-07-28 18:23:44 +08:00
|
|
|
int qla4xxx_reset_lun(struct scsi_qla_host *ha, struct ddb_entry *ddb_entry,
|
2006-09-20 01:28:00 +08:00
|
|
|
int lun);
|
2010-07-28 18:23:44 +08:00
|
|
|
int qla4xxx_reset_target(struct scsi_qla_host *ha,
|
|
|
|
struct ddb_entry *ddb_entry);
|
|
|
|
int qla4xxx_get_flash(struct scsi_qla_host *ha, dma_addr_t dma_addr,
|
2006-09-20 01:28:00 +08:00
|
|
|
uint32_t offset, uint32_t len);
|
2010-07-28 18:23:44 +08:00
|
|
|
int qla4xxx_get_firmware_status(struct scsi_qla_host *ha);
|
|
|
|
int qla4xxx_get_firmware_state(struct scsi_qla_host *ha);
|
|
|
|
int qla4xxx_initialize_fw_cb(struct scsi_qla_host *ha);
|
2006-09-20 01:28:00 +08:00
|
|
|
|
|
|
|
/* FIXME: Goodness! this really wants a small struct to hold the
|
|
|
|
* parameters. On x86 the args will get passed on the stack! */
|
|
|
|
int qla4xxx_get_fwddb_entry(struct scsi_qla_host *ha,
|
|
|
|
uint16_t fw_ddb_index,
|
|
|
|
struct dev_db_entry *fw_ddb_entry,
|
|
|
|
dma_addr_t fw_ddb_entry_dma,
|
|
|
|
uint32_t *num_valid_ddb_entries,
|
|
|
|
uint32_t *next_ddb_index,
|
|
|
|
uint32_t *fw_ddb_device_state,
|
|
|
|
uint32_t *conn_err_detail,
|
|
|
|
uint16_t *tcp_source_port_num,
|
|
|
|
uint16_t *connection_id);
|
|
|
|
|
|
|
|
int qla4xxx_set_ddb_entry(struct scsi_qla_host * ha, uint16_t fw_ddb_index,
|
|
|
|
dma_addr_t fw_ddb_entry_dma);
|
|
|
|
|
|
|
|
void qla4xxx_mark_device_missing(struct scsi_qla_host *ha,
|
|
|
|
struct ddb_entry *ddb_entry);
|
2010-07-28 18:23:44 +08:00
|
|
|
u16 rd_nvram_word(struct scsi_qla_host *ha, int offset);
|
|
|
|
void qla4xxx_get_crash_record(struct scsi_qla_host *ha);
|
2006-09-20 01:28:00 +08:00
|
|
|
struct ddb_entry *qla4xxx_alloc_sess(struct scsi_qla_host *ha);
|
|
|
|
int qla4xxx_add_sess(struct ddb_entry *);
|
|
|
|
void qla4xxx_destroy_sess(struct ddb_entry *ddb_entry);
|
2010-07-28 18:23:44 +08:00
|
|
|
int qla4xxx_is_nvram_configuration_valid(struct scsi_qla_host *ha);
|
2011-05-18 14:17:11 +08:00
|
|
|
int qla4xxx_about_firmware(struct scsi_qla_host *ha);
|
2010-07-28 18:23:44 +08:00
|
|
|
void qla4xxx_interrupt_service_routine(struct scsi_qla_host *ha,
|
2006-09-20 01:28:00 +08:00
|
|
|
uint32_t intr_status);
|
2010-07-28 18:23:44 +08:00
|
|
|
int qla4xxx_init_rings(struct scsi_qla_host *ha);
|
2010-04-28 14:12:24 +08:00
|
|
|
void qla4xxx_srb_compl(struct kref *ref);
|
2010-07-28 18:23:44 +08:00
|
|
|
struct srb *qla4xxx_del_from_active_array(struct scsi_qla_host *ha,
|
|
|
|
uint32_t index);
|
|
|
|
int qla4xxx_reinitialize_ddb_list(struct scsi_qla_host *ha);
|
2010-04-28 14:11:21 +08:00
|
|
|
int qla4xxx_process_ddb_changed(struct scsi_qla_host *ha, uint32_t fw_ddb_index,
|
|
|
|
uint32_t state, uint32_t conn_error);
|
2007-05-24 09:14:34 +08:00
|
|
|
void qla4xxx_dump_buffer(void *b, uint32_t size);
|
2008-03-20 02:23:03 +08:00
|
|
|
int qla4xxx_send_marker_iocb(struct scsi_qla_host *ha,
|
|
|
|
struct ddb_entry *ddb_entry, int lun, uint16_t mrkr_mod);
|
2010-04-28 14:11:21 +08:00
|
|
|
int qla4_is_relogin_allowed(struct scsi_qla_host *ha, uint32_t conn_err);
|
2006-09-20 01:28:00 +08:00
|
|
|
|
2010-07-28 18:23:44 +08:00
|
|
|
int qla4xxx_mailbox_command(struct scsi_qla_host *ha, uint8_t inCount,
|
|
|
|
uint8_t outCount, uint32_t *mbx_cmd, uint32_t *mbx_sts);
|
|
|
|
|
|
|
|
void qla4xxx_queue_iocb(struct scsi_qla_host *ha);
|
|
|
|
void qla4xxx_complete_iocb(struct scsi_qla_host *ha);
|
|
|
|
int qla4xxx_get_sys_info(struct scsi_qla_host *ha);
|
|
|
|
int qla4xxx_iospace_config(struct scsi_qla_host *ha);
|
|
|
|
void qla4xxx_pci_config(struct scsi_qla_host *ha);
|
|
|
|
int qla4xxx_start_firmware(struct scsi_qla_host *ha);
|
|
|
|
irqreturn_t qla4xxx_intr_handler(int irq, void *dev_id);
|
|
|
|
uint16_t qla4xxx_rd_shdw_req_q_out(struct scsi_qla_host *ha);
|
|
|
|
uint16_t qla4xxx_rd_shdw_rsp_q_in(struct scsi_qla_host *ha);
|
|
|
|
int qla4xxx_request_irqs(struct scsi_qla_host *ha);
|
|
|
|
void qla4xxx_free_irqs(struct scsi_qla_host *ha);
|
|
|
|
void qla4xxx_process_response_queue(struct scsi_qla_host *ha);
|
|
|
|
void qla4xxx_wake_dpc(struct scsi_qla_host *ha);
|
|
|
|
void qla4xxx_get_conn_event_log(struct scsi_qla_host *ha);
|
2010-07-30 16:58:07 +08:00
|
|
|
void qla4xxx_mailbox_premature_completion(struct scsi_qla_host *ha);
|
2010-10-07 13:50:21 +08:00
|
|
|
void qla4xxx_dump_registers(struct scsi_qla_host *ha);
|
2010-07-28 18:23:44 +08:00
|
|
|
|
|
|
|
void qla4_8xxx_pci_config(struct scsi_qla_host *);
|
|
|
|
int qla4_8xxx_iospace_config(struct scsi_qla_host *ha);
|
|
|
|
int qla4_8xxx_load_risc(struct scsi_qla_host *);
|
|
|
|
irqreturn_t qla4_8xxx_intr_handler(int irq, void *dev_id);
|
|
|
|
void qla4_8xxx_queue_iocb(struct scsi_qla_host *ha);
|
|
|
|
void qla4_8xxx_complete_iocb(struct scsi_qla_host *ha);
|
|
|
|
|
|
|
|
int qla4_8xxx_crb_win_lock(struct scsi_qla_host *);
|
|
|
|
void qla4_8xxx_crb_win_unlock(struct scsi_qla_host *);
|
|
|
|
int qla4_8xxx_pci_get_crb_addr_2M(struct scsi_qla_host *, ulong *);
|
|
|
|
void qla4_8xxx_wr_32(struct scsi_qla_host *, ulong, u32);
|
|
|
|
int qla4_8xxx_rd_32(struct scsi_qla_host *, ulong);
|
|
|
|
int qla4_8xxx_pci_mem_read_2M(struct scsi_qla_host *, u64, void *, int);
|
|
|
|
int qla4_8xxx_pci_mem_write_2M(struct scsi_qla_host *ha, u64, void *, int);
|
|
|
|
int qla4_8xxx_isp_reset(struct scsi_qla_host *ha);
|
|
|
|
void qla4_8xxx_interrupt_service_routine(struct scsi_qla_host *ha,
|
|
|
|
uint32_t intr_status);
|
|
|
|
uint16_t qla4_8xxx_rd_shdw_req_q_out(struct scsi_qla_host *ha);
|
|
|
|
uint16_t qla4_8xxx_rd_shdw_rsp_q_in(struct scsi_qla_host *ha);
|
|
|
|
int qla4_8xxx_get_sys_info(struct scsi_qla_host *ha);
|
|
|
|
void qla4_8xxx_watchdog(struct scsi_qla_host *ha);
|
|
|
|
int qla4_8xxx_stop_firmware(struct scsi_qla_host *ha);
|
|
|
|
int qla4_8xxx_get_flash_info(struct scsi_qla_host *ha);
|
|
|
|
void qla4_8xxx_enable_intrs(struct scsi_qla_host *ha);
|
|
|
|
void qla4_8xxx_disable_intrs(struct scsi_qla_host *ha);
|
|
|
|
int qla4_8xxx_enable_msix(struct scsi_qla_host *ha);
|
|
|
|
void qla4_8xxx_disable_msix(struct scsi_qla_host *ha);
|
|
|
|
irqreturn_t qla4_8xxx_msi_handler(int irq, void *dev_id);
|
|
|
|
irqreturn_t qla4_8xxx_default_intr_handler(int irq, void *dev_id);
|
|
|
|
irqreturn_t qla4_8xxx_msix_rsp_q(int irq, void *dev_id);
|
|
|
|
void qla4xxx_mark_all_devices_missing(struct scsi_qla_host *ha);
|
|
|
|
void qla4xxx_dead_adapter_cleanup(struct scsi_qla_host *ha);
|
|
|
|
int qla4_8xxx_idc_lock(struct scsi_qla_host *ha);
|
|
|
|
void qla4_8xxx_idc_unlock(struct scsi_qla_host *ha);
|
|
|
|
int qla4_8xxx_device_state_handler(struct scsi_qla_host *ha);
|
|
|
|
void qla4_8xxx_need_qsnt_handler(struct scsi_qla_host *ha);
|
|
|
|
void qla4_8xxx_clear_drv_active(struct scsi_qla_host *ha);
|
2010-08-20 05:13:42 +08:00
|
|
|
void qla4_8xxx_set_drv_active(struct scsi_qla_host *ha);
|
2010-07-28 18:23:44 +08:00
|
|
|
|
2006-10-07 00:54:59 +08:00
|
|
|
extern int ql4xextended_error_logging;
|
2006-09-20 01:28:00 +08:00
|
|
|
extern int ql4xdontresethba;
|
2010-07-28 18:23:44 +08:00
|
|
|
extern int ql4xenablemsix;
|
|
|
|
|
2011-05-18 14:17:11 +08:00
|
|
|
extern struct device_attribute *qla4xxx_host_attrs[];
|
2006-11-16 09:38:40 +08:00
|
|
|
#endif /* _QLA4x_GBL_H */
|