drivers/scsi/qla2xxx/qla_target.c

Source file repositories/reference/linux-study-clean/drivers/scsi/qla2xxx/qla_target.c

File Facts

System
Linux kernel
Corpus path
drivers/scsi/qla2xxx/qla_target.c
Extension
.c
Size
235231 bytes
Lines
8422
Domain
Driver Families
Bucket
drivers/scsi
Inferred role
Driver Families: exported/initcall integration point
Status
integration implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

if (rc != QLA_SUCCESS) {
			ql_dbg(ql_dbg_tgt, vha, 0xe03d,
			    "qla_target(%d): issue_marker() failed\n",
			    vha->vp_idx);
		}
		return rc;
	}
	return QLA_SUCCESS;
}

struct scsi_qla_host *qla_find_host_by_d_id(struct scsi_qla_host *vha,
					    be_id_t d_id)
{
	struct scsi_qla_host *host;
	uint32_t key;

	if (vha->d_id.b.area == d_id.area &&
	    vha->d_id.b.domain == d_id.domain &&
	    vha->d_id.b.al_pa == d_id.al_pa)
		return vha;

	key = be_to_port_id(d_id).b24;

	host = btree_lookup32(&vha->hw->host_map, key);
	if (!host)
		ql_dbg(ql_dbg_tgt_mgt + ql_dbg_verbose, vha, 0xf005,
		    "Unable to find host %06x\n", key);

	return host;
}

static inline void qlt_incr_num_pend_cmds(struct scsi_qla_host *vha)
{
	unsigned long flags;

	spin_lock_irqsave(&vha->hw->tgt.q_full_lock, flags);

	vha->hw->tgt.num_pend_cmds++;
	if (vha->hw->tgt.num_pend_cmds > vha->qla_stats.stat_max_pend_cmds)
		vha->qla_stats.stat_max_pend_cmds =
			vha->hw->tgt.num_pend_cmds;
	spin_unlock_irqrestore(&vha->hw->tgt.q_full_lock, flags);
}
static inline void qlt_decr_num_pend_cmds(struct scsi_qla_host *vha)
{
	unsigned long flags;

	spin_lock_irqsave(&vha->hw->tgt.q_full_lock, flags);
	vha->hw->tgt.num_pend_cmds--;
	spin_unlock_irqrestore(&vha->hw->tgt.q_full_lock, flags);
}


static void qlt_queue_unknown_atio(scsi_qla_host_t *vha,
	struct atio_from_isp *atio, uint8_t ha_locked)
{
	struct qla_tgt_sess_op *u;
	struct qla_tgt *tgt = vha->vha_tgt.qla_tgt;
	unsigned long flags;
	unsigned int add_cdb_len = 0;

	/* atio must be the last member of qla_tgt_sess_op for add_cdb_len */
	BUILD_BUG_ON(offsetof(struct qla_tgt_sess_op, atio) + sizeof(u->atio) != sizeof(*u));

	if (tgt->tgt_stop) {
		ql_dbg(ql_dbg_async, vha, 0x502c,
		    "qla_target(%d): dropping unknown ATIO_TYPE7, because tgt is being stopped",
		    vha->vp_idx);
		goto out_term;
	}

	if (atio->u.raw.entry_type == ATIO_TYPE7 &&
	    atio->u.isp24.fcp_cmnd.task_mgmt_flags == 0)
		add_cdb_len =
			((unsigned int) atio->u.isp24.fcp_cmnd.add_cdb_len) * 4;

	u = kzalloc(sizeof(*u) + add_cdb_len, GFP_ATOMIC);
	if (u == NULL)
		goto out_term;

	u->vha = vha;
	memcpy(&u->atio, atio, sizeof(*atio) + add_cdb_len);
	INIT_LIST_HEAD(&u->cmd_list);

	spin_lock_irqsave(&vha->cmd_list_lock, flags);
	list_add_tail(&u->cmd_list, &vha->unknown_atio_list);
	spin_unlock_irqrestore(&vha->cmd_list_lock, flags);

	schedule_delayed_work(&vha->unknown_atio_work, 1);

Annotation

Implementation Notes