Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
ql4_def.h
Go to the documentation of this file.
1 /*
2  * QLogic iSCSI HBA Driver
3  * Copyright (c) 2003-2012 QLogic Corporation
4  *
5  * See LICENSE.qla4xxx for copyright and licensing details.
6  */
7 
8 #ifndef __QL4_DEF_H
9 #define __QL4_DEF_H
10 
11 #include <linux/kernel.h>
12 #include <linux/init.h>
13 #include <linux/types.h>
14 #include <linux/module.h>
15 #include <linux/list.h>
16 #include <linux/pci.h>
17 #include <linux/dma-mapping.h>
18 #include <linux/sched.h>
19 #include <linux/slab.h>
20 #include <linux/dmapool.h>
21 #include <linux/mempool.h>
22 #include <linux/spinlock.h>
23 #include <linux/workqueue.h>
24 #include <linux/delay.h>
25 #include <linux/interrupt.h>
26 #include <linux/mutex.h>
27 #include <linux/aer.h>
28 #include <linux/bsg-lib.h>
29 
30 #include <net/tcp.h>
31 #include <scsi/scsi.h>
32 #include <scsi/scsi_host.h>
33 #include <scsi/scsi_device.h>
34 #include <scsi/scsi_cmnd.h>
35 #include <scsi/scsi_transport.h>
37 #include <scsi/scsi_bsg_iscsi.h>
38 #include <scsi/scsi_netlink.h>
39 #include <scsi/libiscsi.h>
40 
41 #include "ql4_dbg.h"
42 #include "ql4_nx.h"
43 #include "ql4_fw.h"
44 #include "ql4_nvram.h"
45 #include "ql4_83xx.h"
46 
47 #ifndef PCI_DEVICE_ID_QLOGIC_ISP4010
48 #define PCI_DEVICE_ID_QLOGIC_ISP4010 0x4010
49 #endif
50 
51 #ifndef PCI_DEVICE_ID_QLOGIC_ISP4022
52 #define PCI_DEVICE_ID_QLOGIC_ISP4022 0x4022
53 #endif
54 
55 #ifndef PCI_DEVICE_ID_QLOGIC_ISP4032
56 #define PCI_DEVICE_ID_QLOGIC_ISP4032 0x4032
57 #endif
58 
59 #ifndef PCI_DEVICE_ID_QLOGIC_ISP8022
60 #define PCI_DEVICE_ID_QLOGIC_ISP8022 0x8022
61 #endif
62 
63 #ifndef PCI_DEVICE_ID_QLOGIC_ISP8324
64 #define PCI_DEVICE_ID_QLOGIC_ISP8324 0x8032
65 #endif
66 
67 #define ISP4XXX_PCI_FN_1 0x1
68 #define ISP4XXX_PCI_FN_2 0x3
69 
70 #define QLA_SUCCESS 0
71 #define QLA_ERROR 1
72 
73 /*
74  * Data bit definitions
75  */
76 #define BIT_0 0x1
77 #define BIT_1 0x2
78 #define BIT_2 0x4
79 #define BIT_3 0x8
80 #define BIT_4 0x10
81 #define BIT_5 0x20
82 #define BIT_6 0x40
83 #define BIT_7 0x80
84 #define BIT_8 0x100
85 #define BIT_9 0x200
86 #define BIT_10 0x400
87 #define BIT_11 0x800
88 #define BIT_12 0x1000
89 #define BIT_13 0x2000
90 #define BIT_14 0x4000
91 #define BIT_15 0x8000
92 #define BIT_16 0x10000
93 #define BIT_17 0x20000
94 #define BIT_18 0x40000
95 #define BIT_19 0x80000
96 #define BIT_20 0x100000
97 #define BIT_21 0x200000
98 #define BIT_22 0x400000
99 #define BIT_23 0x800000
100 #define BIT_24 0x1000000
101 #define BIT_25 0x2000000
102 #define BIT_26 0x4000000
103 #define BIT_27 0x8000000
104 #define BIT_28 0x10000000
105 #define BIT_29 0x20000000
106 #define BIT_30 0x40000000
107 #define BIT_31 0x80000000
108 
112 #define ql4_printk(level, ha, format, arg...) \
113  dev_printk(level , &((ha)->pdev->dev) , format , ## arg)
114 
115 
116 /*
117  * Host adapter default definitions
118  ***********************************/
119 #define MAX_HBAS 16
120 #define MAX_BUSES 1
121 #define MAX_TARGETS MAX_DEV_DB_ENTRIES
122 #define MAX_LUNS 0xffff
123 #define MAX_AEN_ENTRIES MAX_DEV_DB_ENTRIES
124 #define MAX_DDB_ENTRIES MAX_DEV_DB_ENTRIES
125 #define MAX_PDU_ENTRIES 32
126 #define INVALID_ENTRY 0xFFFF
127 #define MAX_CMDS_TO_RISC 1024
128 #define MAX_SRBS MAX_CMDS_TO_RISC
129 #define MBOX_AEN_REG_COUNT 8
130 #define MAX_INIT_RETRIES 5
131 
132 /*
133  * Buffer sizes
134  */
135 #define REQUEST_QUEUE_DEPTH MAX_CMDS_TO_RISC
136 #define RESPONSE_QUEUE_DEPTH 64
137 #define QUEUE_SIZE 64
138 #define DMA_BUFFER_SIZE 512
139 
140 /*
141  * Misc
142  */
143 #define MAC_ADDR_LEN 6 /* in bytes */
144 #define IP_ADDR_LEN 4 /* in bytes */
145 #define IPv6_ADDR_LEN 16 /* IPv6 address size */
146 #define DRIVER_NAME "qla4xxx"
147 
148 #define MAX_LINKED_CMDS_PER_LUN 3
149 #define MAX_REQS_SERVICED_PER_INTR 1
150 
151 #define ISCSI_IPADDR_SIZE 4 /* IP address size */
152 #define ISCSI_ALIAS_SIZE 32 /* ISCSI Alias name size */
153 #define ISCSI_NAME_SIZE 0xE0 /* ISCSI Name size */
154 
155 #define QL4_SESS_RECOVERY_TMO 120 /* iSCSI session */
156  /* recovery timeout */
157 
158 #define LSDW(x) ((u32)((u64)(x)))
159 #define MSDW(x) ((u32)((((u64)(x)) >> 16) >> 16))
160 
161 /*
162  * Retry & Timeout Values
163  */
164 #define MBOX_TOV 60
165 #define SOFT_RESET_TOV 30
166 #define RESET_INTR_TOV 3
167 #define SEMAPHORE_TOV 10
168 #define ADAPTER_INIT_TOV 30
169 #define ADAPTER_RESET_TOV 180
170 #define EXTEND_CMD_TOV 60
171 #define WAIT_CMD_TOV 30
172 #define EH_WAIT_CMD_TOV 120
173 #define FIRMWARE_UP_TOV 60
174 #define RESET_FIRMWARE_TOV 30
175 #define LOGOUT_TOV 10
176 #define IOCB_TOV_MARGIN 10
177 #define RELOGIN_TOV 18
178 #define ISNS_DEREG_TOV 5
179 #define HBA_ONLINE_TOV 30
180 #define DISABLE_ACB_TOV 30
181 #define IP_CONFIG_TOV 30
182 #define LOGIN_TOV 12
183 
184 #define MAX_RESET_HA_RETRIES 2
185 #define FW_ALIVE_WAIT_TOV 3
186 
187 #define CMD_SP(Cmnd) ((Cmnd)->SCp.ptr)
188 
189 /*
190  * SCSI Request Block structure (srb) that is placed
191  * on cmd->SCp location of every I/O [We have 22 bytes available]
192  */
193 struct srb {
194  struct list_head list; /* (8) */
195  struct scsi_qla_host *ha; /* HA the SP is queued on */
196  struct ddb_entry *ddb;
197  uint16_t flags; /* (1) Status flags. */
198 
199 #define SRB_DMA_VALID BIT_3 /* DMA Buffer mapped. */
200 #define SRB_GOT_SENSE BIT_4 /* sense data received. */
201  uint8_t state; /* (1) Status flags. */
202 
203 #define SRB_NO_QUEUE_STATE 0 /* Request is in between states */
204 #define SRB_FREE_STATE 1
205 #define SRB_ACTIVE_STATE 3
206 #define SRB_ACTIVE_TIMEOUT_STATE 4
207 #define SRB_SUSPENDED_STATE 7 /* Request in suspended state */
208 
209  struct scsi_cmnd *cmd; /* (4) SCSI command block */
210  dma_addr_t dma_handle; /* (4) for unmap of single transfers */
211  struct kref srb_ref; /* reference count for this srb */
212  uint8_t err_id; /* error id */
213 #define SRB_ERR_PORT 1 /* Request failed because "port down" */
214 #define SRB_ERR_LOOP 2 /* Request failed because "loop down" */
215 #define SRB_ERR_DEVICE 3 /* Request failed because "device error" */
216 #define SRB_ERR_OTHER 4
217 
220  uint16_t iocb_cnt; /* Number of used iocbs */
222 
223  /* Used for extended sense / status continuation */
227 };
228 
229 /* Mailbox request block structure */
230 struct mrb {
231  struct scsi_qla_host *ha;
234  uint16_t iocb_cnt; /* Number of used iocbs */
236 };
237 
238 /*
239  * Asynchronous Event Queue structure
240  */
241 struct aen {
243 };
244 
245 struct ql4_aen_log {
246  int count;
248 };
249 
250 /*
251  * Device Database (DDB) structure
252  */
253 struct ddb_entry {
254  struct scsi_qla_host *ha;
257 
258  uint16_t fw_ddb_index; /* DDB firmware index */
259  uint32_t fw_ddb_device_state; /* F/W Device State -- see ql4_fw.h */
261 #define FLASH_DDB 0x01
262 
264  int (*unblock_sess)(struct iscsi_cls_session *cls_session);
266  struct ddb_entry *ddb_entry, uint32_t state);
267 
268  /* Driver Re-login */
269  unsigned long flags; /* DDB Flags */
270  uint16_t default_relogin_timeout; /* Max time to wait for
271  * relogin to complete */
272  atomic_t retry_relogin_timer; /* Min Time between relogins
273  * (4000 only) */
274  atomic_t relogin_timer; /* Max Time to wait for
275  * relogin to complete */
276  atomic_t relogin_retry_count; /* Num of times relogin has been
277  * retried */
278  uint32_t default_time2wait; /* Default Min time between
279  * relogins (+aens) */
281 };
282 
284  struct list_head list;
288 };
289 
290 #define DDB_IPADDR_LEN 64
291 
293  int port;
294  int tpgt;
298 #define DDB_OPT_IPV6 0x0e0e
299 #define DDB_OPT_IPV4 0x0f0f
301 };
302 
303 /*
304  * DDB states.
305  */
306 #define DDB_STATE_DEAD 0 /* We can no longer talk to
307  * this device */
308 #define DDB_STATE_ONLINE 1 /* Device ready to accept
309  * commands */
310 #define DDB_STATE_MISSING 2 /* Device logged off, trying
311  * to re-login */
312 
313 /*
314  * DDB flags.
315  */
316 #define DF_RELOGIN 0 /* Relogin to device */
317 #define DF_ISNS_DISCOVERED 2 /* Device was discovered via iSNS */
318 #define DF_FO_MASKED 3
320 enum qla4_work_type {
323 };
325 struct qla4_work_evt {
326  struct list_head list;
328  union {
329  struct {
333  } aen;
334  struct {
336  uint32_t pid;
338  uint8_t data[0];
339  } ping;
340  } u;
341 };
344  /* Offsets for flash/nvram access (set to ~0 if not used). */
363 };
370 };
372 /* MSI-X Support */
373 
374 #define QLA_MSIX_DEFAULT 0x00
375 #define QLA_MSIX_RSP_Q 0x01
377 #define QLA_MSIX_ENTRIES 2
378 #define QLA_MIDX_DEFAULT 0
379 #define QLA_MIDX_RSP_Q 1
382  int have_irq;
385 };
386 
387 /*
388  * ISP Operations
389  */
390 struct isp_operations {
391  int (*iospace_config) (struct scsi_qla_host *ha);
397  irqreturn_t (*intr_handler) (int , void *);
399  int (*need_reset) (struct scsi_qla_host *);
400  int (*reset_chip) (struct scsi_qla_host *);
411  int (*idc_lock) (struct scsi_qla_host *);
413  void (*rom_lock_recovery) (struct scsi_qla_host *);
416 };
426 };
428 /*qla4xxx ipaddress configuration details */
451 };
453 #define QL4_CHAP_MAX_NAME_LEN 256
454 #define QL4_CHAP_MAX_SECRET_LEN 100
455 #define LOCAL_CHAP 0
456 #define BIDI_CHAP 1
467 };
469 struct ip_address_format {
470  u8 ip_type;
472 };
475  u16 dest_port;
476  struct ip_address_format dest_ipaddr;
478 };
480 struct ql4_boot_session_info {
481  u8 target_name[224];
483 };
485 struct ql4_boot_tgt_info {
486  struct ql4_boot_session_info boot_pri_sess;
487  struct ql4_boot_session_info boot_sec_sess;
488 };
489 
490 /*
491  * Linux Host Adapter structure
492  */
493 struct scsi_qla_host {
494  /* Linux adapter configuration data */
495  unsigned long flags;
497 #define AF_ONLINE 0 /* 0x00000001 */
498 #define AF_INIT_DONE 1 /* 0x00000002 */
499 #define AF_MBOX_COMMAND 2 /* 0x00000004 */
500 #define AF_MBOX_COMMAND_DONE 3 /* 0x00000008 */
501 #define AF_INTERRUPTS_ON 6 /* 0x00000040 */
502 #define AF_GET_CRASH_RECORD 7 /* 0x00000080 */
503 #define AF_LINK_UP 8 /* 0x00000100 */
504 #define AF_IRQ_ATTACHED 10 /* 0x00000400 */
505 #define AF_DISABLE_ACB_COMPLETE 11 /* 0x00000800 */
506 #define AF_HA_REMOVAL 12 /* 0x00001000 */
507 #define AF_INTx_ENABLED 15 /* 0x00008000 */
508 #define AF_MSI_ENABLED 16 /* 0x00010000 */
509 #define AF_MSIX_ENABLED 17 /* 0x00020000 */
510 #define AF_MBOX_COMMAND_NOPOLL 18 /* 0x00040000 */
511 #define AF_FW_RECOVERY 19 /* 0x00080000 */
512 #define AF_EEH_BUSY 20 /* 0x00100000 */
513 #define AF_PCI_CHANNEL_IO_PERM_FAILURE 21 /* 0x00200000 */
514 #define AF_BUILD_DDB_LIST 22 /* 0x00400000 */
515 #define AF_82XX_FW_DUMPED 24 /* 0x01000000 */
516 #define AF_8XXX_RST_OWNER 25 /* 0x02000000 */
517 #define AF_82XX_DUMP_READING 26 /* 0x04000000 */
518 #define AF_83XX_NO_FW_DUMP 27 /* 0x08000000 */
520  unsigned long dpc_flags;
522 #define DPC_RESET_HA 1 /* 0x00000002 */
523 #define DPC_RETRY_RESET_HA 2 /* 0x00000004 */
524 #define DPC_RELOGIN_DEVICE 3 /* 0x00000008 */
525 #define DPC_RESET_HA_FW_CONTEXT 4 /* 0x00000010 */
526 #define DPC_RESET_HA_INTR 5 /* 0x00000020 */
527 #define DPC_ISNS_RESTART 7 /* 0x00000080 */
528 #define DPC_AEN 9 /* 0x00000200 */
529 #define DPC_GET_DHCP_IP_ADDR 15 /* 0x00008000 */
530 #define DPC_LINK_CHANGED 18 /* 0x00040000 */
531 #define DPC_RESET_ACTIVE 20 /* 0x00040000 */
532 #define DPC_HA_UNRECOVERABLE 21 /* 0x00080000 ISP-82xx only*/
533 #define DPC_HA_NEED_QUIESCENT 22 /* 0x00100000 ISP-82xx only*/
534 #define DPC_POST_IDC_ACK 23 /* 0x00200000 */
535 
536  struct Scsi_Host *host; /* pointer to host data */
538 
541  /* SRB cache. */
542 #define SRB_MIN_REQ 128
544 
545  /* pci information */
546  struct pci_dev *pdev;
548  struct isp_reg __iomem *reg; /* Base I/O address */
549  unsigned long pio_address;
550  unsigned long pio_length;
551 #define MIN_IOBASE_LEN 0x100
552 
554 
555  unsigned long host_no;
557  /* NVRAM registers */
558  struct eeprom_data *nvram;
559  spinlock_t hardware_lock ____cacheline_aligned;
562  /* Counters for general statistics */
579  /* Info Needed for Management App */
580  /* --- From GetFwVersion --- */
586  /* --- From Init_FW --- */
587  /* init_cb_t *init_cb; */
589  uint8_t alias[32];
590  uint8_t name_string[256];
593  /* --- From FlashSysInfo --- */
597  /* --- From GetFwState --- */
601  /* Linux kernel thread */
603  struct work_struct dpc_work;
604 
605  /* Linux timer thread */
606  struct timer_list timer;
609  /* Recovery Timers */
612  uint32_t isp_reset_timer; /* reset test timer */
613  uint32_t nic_reset_timer; /* simulated nic reset test timer */
614  int eh_start;
615  struct list_head free_srb_q;
619  /* DMA Memory Block */
620  void *queues;
622  unsigned long queues_len;
623 
624 #define MEM_ALIGN_VALUE \
625  ((max(REQUEST_QUEUE_DEPTH, RESPONSE_QUEUE_DEPTH)) * \
626  sizeof(struct queue_entry))
627  /* request and response queue variables */
629  struct queue_entry *request_ring;
630  struct queue_entry *request_ptr;
632  struct queue_entry *response_ring;
633  struct queue_entry *response_ptr;
636  uint16_t request_in; /* Current indexes. */
641  /* aen queue variables */
642  uint16_t aen_q_count; /* Number of available aen_q entries */
643  uint16_t aen_in; /* Current indexes */
645  struct aen aen_q[MAX_AEN_ENTRIES];
646 
647  struct ql4_aen_log aen_log;/* tracks all aens */
648 
649  /* This mutex protects several threads to do mailbox commands
650  * concurrently.
651  */
652  struct mutex mbox_sem;
654  /* temporary mailbox status registers */
655  volatile uint8_t mbox_status_count;
657 
658  /* FW ddb index map */
660 
661  /* Saved srb for status continuation entry processing */
662  struct srb *status_srb;
663 
666  /* qla82xx specific fields */
667  struct device_reg_82xx __iomem *qla4_82xx_reg; /* Base I/O address */
668  unsigned long nx_pcibase; /* Base I/O address */
669  uint8_t *nx_db_rd_ptr; /* Doorbell read pointer */
670  unsigned long nx_db_wr_ptr; /* Door bell write pointer */
671  unsigned long first_page_group_start;
672  unsigned long first_page_group_end;
677  unsigned long mn_win_crb;
678  unsigned long ms_win_crb;
683 
686 
689 
691  struct ql82xx_hw_data hw;
697  void *fw_dump;
706  struct iscsi_iface *iface_ipv4;
707  struct iscsi_iface *iface_ipv6_0;
710  /* --- From About Firmware --- */
717  uint16_t def_timeout; /* Default login timeout */
720 #define QLFLASH_WAITING 0
721 #define QLFLASH_READING 1
722 #define QLFLASH_WRITING 2
723  struct dma_pool *chap_dma_pool;
724  uint8_t *chap_list; /* CHAP table cache */
725  struct mutex chap_sem;
727 #define CHAP_DMA_BLOCK_SIZE 512
730 #define SYSFS_FLAG_FW_SEL_BOOT 2
739 #define DDB_DMA_BLOCK_SIZE 512
742  int is_reset;
744 
745  /* event work list */
746  struct list_head work_list;
749  /* mbox iocb */
750 #define MAX_MRB 128
754  uint32_t *reg_tbl;
756  struct device_reg_83xx __iomem *qla4_83xx_reg; /* Base I/O address
757  for ISP8324 */
760 };
763  struct scsi_qla_host *ha;
766  void *req_buffer;
769  void *resp_buffer;
772  struct iscsi_task *task;
773  struct passthru_status sts;
775 };
777 struct qla_endpoint {
778  struct Scsi_Host *host;
780 };
781 
782 struct qla_conn {
783  struct qla_endpoint *qla_ep;
784 };
785 
786 static inline int is_ipv4_enabled(struct scsi_qla_host *ha)
787 {
788  return ((ha->ip_config.ipv4_options & IPOPT_IPV4_PROTOCOL_ENABLE) != 0);
789 }
790 
791 static inline int is_ipv6_enabled(struct scsi_qla_host *ha)
792 {
793  return ((ha->ip_config.ipv6_options &
795 }
796 
797 static inline int is_qla4010(struct scsi_qla_host *ha)
798 {
799  return ha->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP4010;
800 }
801 
802 static inline int is_qla4022(struct scsi_qla_host *ha)
803 {
804  return ha->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP4022;
805 }
806 
807 static inline int is_qla4032(struct scsi_qla_host *ha)
808 {
809  return ha->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP4032;
810 }
811 
812 static inline int is_qla40XX(struct scsi_qla_host *ha)
813 {
814  return is_qla4032(ha) || is_qla4022(ha) || is_qla4010(ha);
815 }
816 
817 static inline int is_qla8022(struct scsi_qla_host *ha)
818 {
819  return ha->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP8022;
820 }
821 
822 static inline int is_qla8032(struct scsi_qla_host *ha)
823 {
824  return ha->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP8324;
825 }
826 
827 static inline int is_qla80XX(struct scsi_qla_host *ha)
828 {
829  return is_qla8022(ha) || is_qla8032(ha);
830 }
831 
832 static inline int is_aer_supported(struct scsi_qla_host *ha)
833 {
834  return ((ha->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP8022) ||
835  (ha->pdev->device == PCI_DEVICE_ID_QLOGIC_ISP8324));
836 }
837 
838 static inline int adapter_up(struct scsi_qla_host *ha)
839 {
840  return (test_bit(AF_ONLINE, &ha->flags) != 0) &&
841  (test_bit(AF_LINK_UP, &ha->flags) != 0);
842 }
843 
844 static inline struct scsi_qla_host* to_qla_host(struct Scsi_Host *shost)
845 {
846  return (struct scsi_qla_host *)iscsi_host_priv(shost);
847 }
848 
849 static inline void __iomem* isp_semaphore(struct scsi_qla_host *ha)
850 {
851  return (is_qla4010(ha) ?
852  &ha->reg->u1.isp4010.nvram :
853  &ha->reg->u1.isp4022.semaphore);
854 }
855 
856 static inline void __iomem* isp_nvram(struct scsi_qla_host *ha)
857 {
858  return (is_qla4010(ha) ?
859  &ha->reg->u1.isp4010.nvram :
860  &ha->reg->u1.isp4022.nvram);
861 }
862 
863 static inline void __iomem* isp_ext_hw_conf(struct scsi_qla_host *ha)
864 {
865  return (is_qla4010(ha) ?
866  &ha->reg->u2.isp4010.ext_hw_conf :
867  &ha->reg->u2.isp4022.p0.ext_hw_conf);
868 }
869 
870 static inline void __iomem* isp_port_status(struct scsi_qla_host *ha)
871 {
872  return (is_qla4010(ha) ?
873  &ha->reg->u2.isp4010.port_status :
874  &ha->reg->u2.isp4022.p0.port_status);
875 }
876 
877 static inline void __iomem* isp_port_ctrl(struct scsi_qla_host *ha)
878 {
879  return (is_qla4010(ha) ?
880  &ha->reg->u2.isp4010.port_ctrl :
881  &ha->reg->u2.isp4022.p0.port_ctrl);
882 }
883 
884 static inline void __iomem* isp_port_error_status(struct scsi_qla_host *ha)
885 {
886  return (is_qla4010(ha) ?
887  &ha->reg->u2.isp4010.port_err_status :
888  &ha->reg->u2.isp4022.p0.port_err_status);
889 }
890 
891 static inline void __iomem * isp_gp_out(struct scsi_qla_host *ha)
892 {
893  return (is_qla4010(ha) ?
894  &ha->reg->u2.isp4010.gp_out :
895  &ha->reg->u2.isp4022.p0.gp_out);
896 }
897 
898 static inline int eeprom_ext_hw_conf_offset(struct scsi_qla_host *ha)
899 {
900  return (is_qla4010(ha) ?
901  offsetof(struct eeprom_data, isp4010.ext_hw_conf) / 2 :
902  offsetof(struct eeprom_data, isp4022.ext_hw_conf) / 2);
903 }
904 
905 int ql4xxx_sem_spinlock(struct scsi_qla_host * ha, u32 sem_mask, u32 sem_bits);
906 void ql4xxx_sem_unlock(struct scsi_qla_host * ha, u32 sem_mask);
907 int ql4xxx_sem_lock(struct scsi_qla_host * ha, u32 sem_mask, u32 sem_bits);
908 
909 static inline int ql4xxx_lock_flash(struct scsi_qla_host *a)
910 {
911  if (is_qla4010(a))
914  else
917  (a->mac_index)) << 13);
918 }
919 
920 static inline void ql4xxx_unlock_flash(struct scsi_qla_host *a)
921 {
922  if (is_qla4010(a))
924  else
926 }
927 
928 static inline int ql4xxx_lock_nvram(struct scsi_qla_host *a)
929 {
930  if (is_qla4010(a))
933  else
936  (a->mac_index)) << 10);
937 }
938 
939 static inline void ql4xxx_unlock_nvram(struct scsi_qla_host *a)
940 {
941  if (is_qla4010(a))
943  else
945 }
946 
947 static inline int ql4xxx_lock_drvr(struct scsi_qla_host *a)
948 {
949  if (is_qla4010(a))
952  else
955  (a->mac_index)) << 1);
956 }
957 
958 static inline void ql4xxx_unlock_drvr(struct scsi_qla_host *a)
959 {
960  if (is_qla4010(a))
962  else
964 }
965 
966 static inline int ql4xxx_reset_active(struct scsi_qla_host *ha)
967 {
968  return test_bit(DPC_RESET_ACTIVE, &ha->dpc_flags) ||
974 
975 }
976 
977 static inline int qla4_8xxx_rd_direct(struct scsi_qla_host *ha,
978  const uint32_t crb_reg)
979 {
980  return ha->isp_ops->rd_reg_direct(ha, ha->reg_tbl[crb_reg]);
981 }
982 
983 static inline void qla4_8xxx_wr_direct(struct scsi_qla_host *ha,
984  const uint32_t crb_reg,
985  const uint32_t value)
986 {
987  ha->isp_ops->wr_reg_direct(ha, ha->reg_tbl[crb_reg], value);
988 }
989 
990 /*---------------------------------------------------------------------------*/
992 /* Defines for qla4xxx_initialize_adapter() and qla4xxx_recover_adapter() */
993 
994 #define INIT_ADAPTER 0
995 #define RESET_ADAPTER 1
996 
997 #define PRESERVE_DDB_LIST 0
998 #define REBUILD_DDB_LIST 1
1000 /* Defines for process_aen() */
1001 #define PROCESS_ALL_AENS 0
1002 #define FLUSH_DDB_CHANGED_AENS 1
1003 
1004 /* Defines for udev events */
1005 #define QL4_UEVENT_CODE_FW_DUMP 0
1006 
1007 #endif /*_QLA4XXX_H */