2006-09-20 01:28:00 +08:00
|
|
|
/*
|
|
|
|
* QLogic iSCSI HBA Driver
|
2012-08-22 19:55:09 +08:00
|
|
|
* Copyright (c) 2003-2012 QLogic Corporation
|
2006-09-20 01:28:00 +08:00
|
|
|
*
|
|
|
|
* See LICENSE.qla4xxx for copyright and licensing details.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
*
|
|
|
|
* qla4xxx_lookup_ddb_by_fw_index
|
|
|
|
* This routine locates a device handle given the firmware device
|
|
|
|
* database index. If device doesn't exist, returns NULL.
|
|
|
|
*
|
|
|
|
* Input:
|
|
|
|
* ha - Pointer to host adapter structure.
|
|
|
|
* fw_ddb_index - Firmware's device database index
|
|
|
|
*
|
|
|
|
* Returns:
|
|
|
|
* Pointer to the corresponding internal device database structure
|
|
|
|
*/
|
|
|
|
static inline struct ddb_entry *
|
|
|
|
qla4xxx_lookup_ddb_by_fw_index(struct scsi_qla_host *ha, uint32_t fw_ddb_index)
|
|
|
|
{
|
|
|
|
struct ddb_entry *ddb_entry = NULL;
|
|
|
|
|
|
|
|
if ((fw_ddb_index < MAX_DDB_ENTRIES) &&
|
|
|
|
(ha->fw_ddb_index_map[fw_ddb_index] !=
|
|
|
|
(struct ddb_entry *) INVALID_ENTRY)) {
|
|
|
|
ddb_entry = ha->fw_ddb_index_map[fw_ddb_index];
|
|
|
|
}
|
|
|
|
|
2010-07-28 18:23:44 +08:00
|
|
|
DEBUG3(printk("scsi%d: %s: ddb [%d], ddb_entry = %p\n",
|
2006-09-20 01:28:00 +08:00
|
|
|
ha->host_no, __func__, fw_ddb_index, ddb_entry));
|
|
|
|
|
|
|
|
return ddb_entry;
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline void
|
|
|
|
__qla4xxx_enable_intrs(struct scsi_qla_host *ha)
|
|
|
|
{
|
2006-11-16 09:38:40 +08:00
|
|
|
if (is_qla4022(ha) | is_qla4032(ha)) {
|
2006-09-20 01:28:00 +08:00
|
|
|
writel(set_rmask(IMR_SCSI_INTR_ENABLE),
|
|
|
|
&ha->reg->u1.isp4022.intr_mask);
|
|
|
|
readl(&ha->reg->u1.isp4022.intr_mask);
|
|
|
|
} else {
|
|
|
|
writel(set_rmask(CSR_SCSI_INTR_ENABLE), &ha->reg->ctrl_status);
|
|
|
|
readl(&ha->reg->ctrl_status);
|
|
|
|
}
|
|
|
|
set_bit(AF_INTERRUPTS_ON, &ha->flags);
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline void
|
|
|
|
__qla4xxx_disable_intrs(struct scsi_qla_host *ha)
|
|
|
|
{
|
2006-11-16 09:38:40 +08:00
|
|
|
if (is_qla4022(ha) | is_qla4032(ha)) {
|
2006-09-20 01:28:00 +08:00
|
|
|
writel(clr_rmask(IMR_SCSI_INTR_ENABLE),
|
|
|
|
&ha->reg->u1.isp4022.intr_mask);
|
|
|
|
readl(&ha->reg->u1.isp4022.intr_mask);
|
|
|
|
} else {
|
|
|
|
writel(clr_rmask(CSR_SCSI_INTR_ENABLE), &ha->reg->ctrl_status);
|
|
|
|
readl(&ha->reg->ctrl_status);
|
|
|
|
}
|
|
|
|
clear_bit(AF_INTERRUPTS_ON, &ha->flags);
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline void
|
|
|
|
qla4xxx_enable_intrs(struct scsi_qla_host *ha)
|
|
|
|
{
|
|
|
|
unsigned long flags;
|
|
|
|
|
|
|
|
spin_lock_irqsave(&ha->hardware_lock, flags);
|
|
|
|
__qla4xxx_enable_intrs(ha);
|
|
|
|
spin_unlock_irqrestore(&ha->hardware_lock, flags);
|
|
|
|
}
|
|
|
|
|
|
|
|
static inline void
|
|
|
|
qla4xxx_disable_intrs(struct scsi_qla_host *ha)
|
|
|
|
{
|
|
|
|
unsigned long flags;
|
|
|
|
|
|
|
|
spin_lock_irqsave(&ha->hardware_lock, flags);
|
|
|
|
__qla4xxx_disable_intrs(ha);
|
|
|
|
spin_unlock_irqrestore(&ha->hardware_lock, flags);
|
|
|
|
}
|