drivers/scsi/bnx2fc/bnx2fc_tgt.c

Source file repositories/reference/linux-study-clean/drivers/scsi/bnx2fc/bnx2fc_tgt.c

File Facts

System
Linux kernel
Corpus path
drivers/scsi/bnx2fc/bnx2fc_tgt.c
Extension
.c
Size
24665 bytes
Lines
893
Domain
Driver Families
Bucket
drivers/scsi
Inferred role
Driver Families: implementation source
Status
source 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 (cancel_delayed_work(&io_req->timeout_work)) {
			if (test_and_clear_bit(BNX2FC_FLAG_EH_ABORT,
						&io_req->req_flags)) {
				/* Handle eh_abort timeout */
				BNX2FC_IO_DBG(io_req, "eh_abort for IO "
					      "cleaned up\n");
				complete(&io_req->abts_done);
			}
			kref_put(&io_req->refcount,
				 bnx2fc_cmd_release); /* drop timer hold */
		}

		set_bit(BNX2FC_FLAG_IO_COMPL, &io_req->req_flags);
		set_bit(BNX2FC_FLAG_IO_CLEANUP, &io_req->req_flags);

		/* Do not issue cleanup when disable request failed */
		if (test_bit(BNX2FC_FLAG_DISABLE_FAILED, &tgt->flags))
			bnx2fc_process_cleanup_compl(io_req, io_req->task, 0);
		else {
			rc = bnx2fc_initiate_cleanup(io_req);
			BUG_ON(rc);
		}
	}

	list_for_each_entry_safe(io_req, tmp, &tgt->active_tm_queue, link) {
		i++;
		list_del_init(&io_req->link);
		io_req->on_tmf_queue = 0;
		BNX2FC_IO_DBG(io_req, "tm_queue cleanup\n");
		if (io_req->wait_for_abts_comp)
			complete(&io_req->abts_done);
	}

	list_for_each_entry_safe(io_req, tmp, &tgt->els_queue, link) {
		i++;
		list_del_init(&io_req->link);
		io_req->on_active_queue = 0;

		BNX2FC_IO_DBG(io_req, "els_queue cleanup\n");

		if (cancel_delayed_work(&io_req->timeout_work))
			kref_put(&io_req->refcount,
				 bnx2fc_cmd_release); /* drop timer hold */

		if ((io_req->cb_func) && (io_req->cb_arg)) {
			io_req->cb_func(io_req->cb_arg);
			io_req->cb_arg = NULL;
		}

		/* Do not issue cleanup when disable request failed */
		if (test_bit(BNX2FC_FLAG_DISABLE_FAILED, &tgt->flags))
			bnx2fc_process_cleanup_compl(io_req, io_req->task, 0);
		else {
			rc = bnx2fc_initiate_cleanup(io_req);
			BUG_ON(rc);
		}
	}

	list_for_each_entry_safe(io_req, tmp, &tgt->io_retire_queue, link) {
		i++;
		list_del_init(&io_req->link);

		BNX2FC_IO_DBG(io_req, "retire_queue flush\n");

		if (cancel_delayed_work(&io_req->timeout_work)) {
			if (test_and_clear_bit(BNX2FC_FLAG_EH_ABORT,
						&io_req->req_flags)) {
				/* Handle eh_abort timeout */
				BNX2FC_IO_DBG(io_req, "eh_abort for IO "
					      "in retire_q\n");
				if (io_req->wait_for_abts_comp)
					complete(&io_req->abts_done);
			}
			kref_put(&io_req->refcount, bnx2fc_cmd_release);
		}

		clear_bit(BNX2FC_FLAG_ISSUE_RRQ, &io_req->req_flags);
	}

	BNX2FC_TGT_DBG(tgt, "IOs flushed = %d\n", i);
	i = 0;
	spin_unlock_bh(&tgt->tgt_lock);
	/* wait for active_ios to go to 0 */
	while ((tgt->num_active_ios.counter != 0) && (i++ < BNX2FC_WAIT_CNT))
		msleep(25);
	if (tgt->num_active_ios.counter != 0)
		printk(KERN_ERR PFX "CLEANUP on port 0x%x:"
				    " active_ios = %d\n",
			tgt->rdata->ids.port_id, tgt->num_active_ios.counter);
	spin_lock_bh(&tgt->tgt_lock);

Annotation

Implementation Notes