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