162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * QLogic iSCSI HBA Driver 462306a36Sopenharmony_ci * Copyright (c) 2003-2013 QLogic Corporation 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci/* 862306a36Sopenharmony_ci * 962306a36Sopenharmony_ci * qla4xxx_lookup_ddb_by_fw_index 1062306a36Sopenharmony_ci * This routine locates a device handle given the firmware device 1162306a36Sopenharmony_ci * database index. If device doesn't exist, returns NULL. 1262306a36Sopenharmony_ci * 1362306a36Sopenharmony_ci * Input: 1462306a36Sopenharmony_ci * ha - Pointer to host adapter structure. 1562306a36Sopenharmony_ci * fw_ddb_index - Firmware's device database index 1662306a36Sopenharmony_ci * 1762306a36Sopenharmony_ci * Returns: 1862306a36Sopenharmony_ci * Pointer to the corresponding internal device database structure 1962306a36Sopenharmony_ci */ 2062306a36Sopenharmony_cistatic inline struct ddb_entry * 2162306a36Sopenharmony_ciqla4xxx_lookup_ddb_by_fw_index(struct scsi_qla_host *ha, uint32_t fw_ddb_index) 2262306a36Sopenharmony_ci{ 2362306a36Sopenharmony_ci struct ddb_entry *ddb_entry = NULL; 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci if ((fw_ddb_index < MAX_DDB_ENTRIES) && 2662306a36Sopenharmony_ci (ha->fw_ddb_index_map[fw_ddb_index] != 2762306a36Sopenharmony_ci (struct ddb_entry *) INVALID_ENTRY)) { 2862306a36Sopenharmony_ci ddb_entry = ha->fw_ddb_index_map[fw_ddb_index]; 2962306a36Sopenharmony_ci } 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci DEBUG3(printk("scsi%d: %s: ddb [%d], ddb_entry = %p\n", 3262306a36Sopenharmony_ci ha->host_no, __func__, fw_ddb_index, ddb_entry)); 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_ci return ddb_entry; 3562306a36Sopenharmony_ci} 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_cistatic inline void 3862306a36Sopenharmony_ci__qla4xxx_enable_intrs(struct scsi_qla_host *ha) 3962306a36Sopenharmony_ci{ 4062306a36Sopenharmony_ci if (is_qla4022(ha) | is_qla4032(ha)) { 4162306a36Sopenharmony_ci writel(set_rmask(IMR_SCSI_INTR_ENABLE), 4262306a36Sopenharmony_ci &ha->reg->u1.isp4022.intr_mask); 4362306a36Sopenharmony_ci readl(&ha->reg->u1.isp4022.intr_mask); 4462306a36Sopenharmony_ci } else { 4562306a36Sopenharmony_ci writel(set_rmask(CSR_SCSI_INTR_ENABLE), &ha->reg->ctrl_status); 4662306a36Sopenharmony_ci readl(&ha->reg->ctrl_status); 4762306a36Sopenharmony_ci } 4862306a36Sopenharmony_ci set_bit(AF_INTERRUPTS_ON, &ha->flags); 4962306a36Sopenharmony_ci} 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_cistatic inline void 5262306a36Sopenharmony_ci__qla4xxx_disable_intrs(struct scsi_qla_host *ha) 5362306a36Sopenharmony_ci{ 5462306a36Sopenharmony_ci if (is_qla4022(ha) | is_qla4032(ha)) { 5562306a36Sopenharmony_ci writel(clr_rmask(IMR_SCSI_INTR_ENABLE), 5662306a36Sopenharmony_ci &ha->reg->u1.isp4022.intr_mask); 5762306a36Sopenharmony_ci readl(&ha->reg->u1.isp4022.intr_mask); 5862306a36Sopenharmony_ci } else { 5962306a36Sopenharmony_ci writel(clr_rmask(CSR_SCSI_INTR_ENABLE), &ha->reg->ctrl_status); 6062306a36Sopenharmony_ci readl(&ha->reg->ctrl_status); 6162306a36Sopenharmony_ci } 6262306a36Sopenharmony_ci clear_bit(AF_INTERRUPTS_ON, &ha->flags); 6362306a36Sopenharmony_ci} 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_cistatic inline void 6662306a36Sopenharmony_ciqla4xxx_enable_intrs(struct scsi_qla_host *ha) 6762306a36Sopenharmony_ci{ 6862306a36Sopenharmony_ci unsigned long flags; 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci spin_lock_irqsave(&ha->hardware_lock, flags); 7162306a36Sopenharmony_ci __qla4xxx_enable_intrs(ha); 7262306a36Sopenharmony_ci spin_unlock_irqrestore(&ha->hardware_lock, flags); 7362306a36Sopenharmony_ci} 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_cistatic inline void 7662306a36Sopenharmony_ciqla4xxx_disable_intrs(struct scsi_qla_host *ha) 7762306a36Sopenharmony_ci{ 7862306a36Sopenharmony_ci unsigned long flags; 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci spin_lock_irqsave(&ha->hardware_lock, flags); 8162306a36Sopenharmony_ci __qla4xxx_disable_intrs(ha); 8262306a36Sopenharmony_ci spin_unlock_irqrestore(&ha->hardware_lock, flags); 8362306a36Sopenharmony_ci} 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_cistatic inline int qla4xxx_get_chap_type(struct ql4_chap_table *chap_entry) 8662306a36Sopenharmony_ci{ 8762306a36Sopenharmony_ci int type; 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci if (chap_entry->flags & BIT_7) 9062306a36Sopenharmony_ci type = LOCAL_CHAP; 9162306a36Sopenharmony_ci else 9262306a36Sopenharmony_ci type = BIDI_CHAP; 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ci return type; 9562306a36Sopenharmony_ci} 96