1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * QLogic iSCSI HBA Driver
4*4882a593Smuzhiyun * Copyright (c) 2003-2013 QLogic Corporation
5*4882a593Smuzhiyun */
6*4882a593Smuzhiyun
7*4882a593Smuzhiyun /*
8*4882a593Smuzhiyun *
9*4882a593Smuzhiyun * qla4xxx_lookup_ddb_by_fw_index
10*4882a593Smuzhiyun * This routine locates a device handle given the firmware device
11*4882a593Smuzhiyun * database index. If device doesn't exist, returns NULL.
12*4882a593Smuzhiyun *
13*4882a593Smuzhiyun * Input:
14*4882a593Smuzhiyun * ha - Pointer to host adapter structure.
15*4882a593Smuzhiyun * fw_ddb_index - Firmware's device database index
16*4882a593Smuzhiyun *
17*4882a593Smuzhiyun * Returns:
18*4882a593Smuzhiyun * Pointer to the corresponding internal device database structure
19*4882a593Smuzhiyun */
20*4882a593Smuzhiyun static inline struct ddb_entry *
qla4xxx_lookup_ddb_by_fw_index(struct scsi_qla_host * ha,uint32_t fw_ddb_index)21*4882a593Smuzhiyun qla4xxx_lookup_ddb_by_fw_index(struct scsi_qla_host *ha, uint32_t fw_ddb_index)
22*4882a593Smuzhiyun {
23*4882a593Smuzhiyun struct ddb_entry *ddb_entry = NULL;
24*4882a593Smuzhiyun
25*4882a593Smuzhiyun if ((fw_ddb_index < MAX_DDB_ENTRIES) &&
26*4882a593Smuzhiyun (ha->fw_ddb_index_map[fw_ddb_index] !=
27*4882a593Smuzhiyun (struct ddb_entry *) INVALID_ENTRY)) {
28*4882a593Smuzhiyun ddb_entry = ha->fw_ddb_index_map[fw_ddb_index];
29*4882a593Smuzhiyun }
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun DEBUG3(printk("scsi%d: %s: ddb [%d], ddb_entry = %p\n",
32*4882a593Smuzhiyun ha->host_no, __func__, fw_ddb_index, ddb_entry));
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun return ddb_entry;
35*4882a593Smuzhiyun }
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun static inline void
__qla4xxx_enable_intrs(struct scsi_qla_host * ha)38*4882a593Smuzhiyun __qla4xxx_enable_intrs(struct scsi_qla_host *ha)
39*4882a593Smuzhiyun {
40*4882a593Smuzhiyun if (is_qla4022(ha) | is_qla4032(ha)) {
41*4882a593Smuzhiyun writel(set_rmask(IMR_SCSI_INTR_ENABLE),
42*4882a593Smuzhiyun &ha->reg->u1.isp4022.intr_mask);
43*4882a593Smuzhiyun readl(&ha->reg->u1.isp4022.intr_mask);
44*4882a593Smuzhiyun } else {
45*4882a593Smuzhiyun writel(set_rmask(CSR_SCSI_INTR_ENABLE), &ha->reg->ctrl_status);
46*4882a593Smuzhiyun readl(&ha->reg->ctrl_status);
47*4882a593Smuzhiyun }
48*4882a593Smuzhiyun set_bit(AF_INTERRUPTS_ON, &ha->flags);
49*4882a593Smuzhiyun }
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun static inline void
__qla4xxx_disable_intrs(struct scsi_qla_host * ha)52*4882a593Smuzhiyun __qla4xxx_disable_intrs(struct scsi_qla_host *ha)
53*4882a593Smuzhiyun {
54*4882a593Smuzhiyun if (is_qla4022(ha) | is_qla4032(ha)) {
55*4882a593Smuzhiyun writel(clr_rmask(IMR_SCSI_INTR_ENABLE),
56*4882a593Smuzhiyun &ha->reg->u1.isp4022.intr_mask);
57*4882a593Smuzhiyun readl(&ha->reg->u1.isp4022.intr_mask);
58*4882a593Smuzhiyun } else {
59*4882a593Smuzhiyun writel(clr_rmask(CSR_SCSI_INTR_ENABLE), &ha->reg->ctrl_status);
60*4882a593Smuzhiyun readl(&ha->reg->ctrl_status);
61*4882a593Smuzhiyun }
62*4882a593Smuzhiyun clear_bit(AF_INTERRUPTS_ON, &ha->flags);
63*4882a593Smuzhiyun }
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun static inline void
qla4xxx_enable_intrs(struct scsi_qla_host * ha)66*4882a593Smuzhiyun qla4xxx_enable_intrs(struct scsi_qla_host *ha)
67*4882a593Smuzhiyun {
68*4882a593Smuzhiyun unsigned long flags;
69*4882a593Smuzhiyun
70*4882a593Smuzhiyun spin_lock_irqsave(&ha->hardware_lock, flags);
71*4882a593Smuzhiyun __qla4xxx_enable_intrs(ha);
72*4882a593Smuzhiyun spin_unlock_irqrestore(&ha->hardware_lock, flags);
73*4882a593Smuzhiyun }
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun static inline void
qla4xxx_disable_intrs(struct scsi_qla_host * ha)76*4882a593Smuzhiyun qla4xxx_disable_intrs(struct scsi_qla_host *ha)
77*4882a593Smuzhiyun {
78*4882a593Smuzhiyun unsigned long flags;
79*4882a593Smuzhiyun
80*4882a593Smuzhiyun spin_lock_irqsave(&ha->hardware_lock, flags);
81*4882a593Smuzhiyun __qla4xxx_disable_intrs(ha);
82*4882a593Smuzhiyun spin_unlock_irqrestore(&ha->hardware_lock, flags);
83*4882a593Smuzhiyun }
84*4882a593Smuzhiyun
qla4xxx_get_chap_type(struct ql4_chap_table * chap_entry)85*4882a593Smuzhiyun static inline int qla4xxx_get_chap_type(struct ql4_chap_table *chap_entry)
86*4882a593Smuzhiyun {
87*4882a593Smuzhiyun int type;
88*4882a593Smuzhiyun
89*4882a593Smuzhiyun if (chap_entry->flags & BIT_7)
90*4882a593Smuzhiyun type = LOCAL_CHAP;
91*4882a593Smuzhiyun else
92*4882a593Smuzhiyun type = BIDI_CHAP;
93*4882a593Smuzhiyun
94*4882a593Smuzhiyun return type;
95*4882a593Smuzhiyun }
96