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