| David Somayajulu | afaf5a2 | 2006-09-19 10:28:00 -0700 | [diff] [blame] | 1 | /* | 
|  | 2 | * QLogic iSCSI HBA Driver | 
|  | 3 | * Copyright (c)  2003-2006 QLogic Corporation | 
|  | 4 | * | 
|  | 5 | * See LICENSE.qla4xxx for copyright and licensing details. | 
|  | 6 | */ | 
|  | 7 |  | 
|  | 8 | /* | 
|  | 9 | * | 
|  | 10 | * qla4xxx_lookup_ddb_by_fw_index | 
|  | 11 | *	This routine locates a device handle given the firmware device | 
|  | 12 | *	database index.	 If device doesn't exist, returns NULL. | 
|  | 13 | * | 
|  | 14 | * Input: | 
|  | 15 | *	ha - Pointer to host adapter structure. | 
|  | 16 | *	fw_ddb_index - Firmware's device database index | 
|  | 17 | * | 
|  | 18 | * Returns: | 
|  | 19 | *	Pointer to the corresponding internal device database structure | 
|  | 20 | */ | 
|  | 21 | static inline struct ddb_entry * | 
|  | 22 | qla4xxx_lookup_ddb_by_fw_index(struct scsi_qla_host *ha, uint32_t fw_ddb_index) | 
|  | 23 | { | 
|  | 24 | struct ddb_entry *ddb_entry = NULL; | 
|  | 25 |  | 
|  | 26 | if ((fw_ddb_index < MAX_DDB_ENTRIES) && | 
|  | 27 | (ha->fw_ddb_index_map[fw_ddb_index] != | 
|  | 28 | (struct ddb_entry *) INVALID_ENTRY)) { | 
|  | 29 | ddb_entry = ha->fw_ddb_index_map[fw_ddb_index]; | 
|  | 30 | } | 
|  | 31 |  | 
|  | 32 | DEBUG3(printk("scsi%d: %s: index [%d], ddb_entry = %p\n", | 
|  | 33 | ha->host_no, __func__, fw_ddb_index, ddb_entry)); | 
|  | 34 |  | 
|  | 35 | return ddb_entry; | 
|  | 36 | } | 
|  | 37 |  | 
|  | 38 | static inline void | 
|  | 39 | __qla4xxx_enable_intrs(struct scsi_qla_host *ha) | 
|  | 40 | { | 
| David C Somayajulu | d915058 | 2006-11-15 17:38:40 -0800 | [diff] [blame] | 41 | if (is_qla4022(ha) | is_qla4032(ha)) { | 
| David Somayajulu | afaf5a2 | 2006-09-19 10:28:00 -0700 | [diff] [blame] | 42 | writel(set_rmask(IMR_SCSI_INTR_ENABLE), | 
|  | 43 | &ha->reg->u1.isp4022.intr_mask); | 
|  | 44 | readl(&ha->reg->u1.isp4022.intr_mask); | 
|  | 45 | } else { | 
|  | 46 | writel(set_rmask(CSR_SCSI_INTR_ENABLE), &ha->reg->ctrl_status); | 
|  | 47 | readl(&ha->reg->ctrl_status); | 
|  | 48 | } | 
|  | 49 | set_bit(AF_INTERRUPTS_ON, &ha->flags); | 
|  | 50 | } | 
|  | 51 |  | 
|  | 52 | static inline void | 
|  | 53 | __qla4xxx_disable_intrs(struct scsi_qla_host *ha) | 
|  | 54 | { | 
| David C Somayajulu | d915058 | 2006-11-15 17:38:40 -0800 | [diff] [blame] | 55 | if (is_qla4022(ha) | is_qla4032(ha)) { | 
| David Somayajulu | afaf5a2 | 2006-09-19 10:28:00 -0700 | [diff] [blame] | 56 | writel(clr_rmask(IMR_SCSI_INTR_ENABLE), | 
|  | 57 | &ha->reg->u1.isp4022.intr_mask); | 
|  | 58 | readl(&ha->reg->u1.isp4022.intr_mask); | 
|  | 59 | } else { | 
|  | 60 | writel(clr_rmask(CSR_SCSI_INTR_ENABLE), &ha->reg->ctrl_status); | 
|  | 61 | readl(&ha->reg->ctrl_status); | 
|  | 62 | } | 
|  | 63 | clear_bit(AF_INTERRUPTS_ON, &ha->flags); | 
|  | 64 | } | 
|  | 65 |  | 
|  | 66 | static inline void | 
|  | 67 | qla4xxx_enable_intrs(struct scsi_qla_host *ha) | 
|  | 68 | { | 
|  | 69 | unsigned long flags; | 
|  | 70 |  | 
|  | 71 | spin_lock_irqsave(&ha->hardware_lock, flags); | 
|  | 72 | __qla4xxx_enable_intrs(ha); | 
|  | 73 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | 
|  | 74 | } | 
|  | 75 |  | 
|  | 76 | static inline void | 
|  | 77 | qla4xxx_disable_intrs(struct scsi_qla_host *ha) | 
|  | 78 | { | 
|  | 79 | unsigned long flags; | 
|  | 80 |  | 
|  | 81 | spin_lock_irqsave(&ha->hardware_lock, flags); | 
|  | 82 | __qla4xxx_disable_intrs(ha); | 
|  | 83 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | 
|  | 84 | } |