Writing Device Drivers

tran_reset_notify(9E)

The tran_reset_notify(9E) entry point for a SCSI HBA driver is called to request that the HBA driver notify the target driver via callback when a SCSI bus reset occurs.


Example 14-14 HBA Driver tran_reset_notify(9E) Entry Point

isp_scsi_reset_notify(
	struct scsi_address								*ap,
	int								flag,
	void								(*callback)(caddr_t),
	caddr_t								arg)
{
	struct isp								*isp;
	struct isp_reset_notify_entry								*p, *beforep;
	int								rval = DDI_FAILURE;

	isp = (struct isp *)ap->a_hba_tran->tran_hba_private;

	mutex_enter(ISP_REQ_MUTEX(isp));

	/*
	 * Try to find an existing entry for this target
	 */
	p = isp->isp_reset_notify_listf;
	beforep = NULL;

	while (p) {
		if (p->ap == ap)
			break;
		beforep = p;
		p = p->next;
	}

	if ((flag & SCSI_RESET_CANCEL) && (p != NULL)) {
		if (beforep == NULL) {
			isp->isp_reset_notify_listf = p->next;
		} else {
			beforep->next = p->next;
		}
		kmem_free((caddr_t)p, sizeof (struct
					isp_reset_notify_entry));
		rval = DDI_SUCCESS;

	} else if ((flag & SCSI_RESET_NOTIFY) && (p == NULL)) {
		p = kmem_zalloc(sizeof (struct isp_reset_notify_entry),
				KM_SLEEP);
		p->ap = ap;
		p->callback = callback;
		p->arg = arg;
		p->next = isp->isp_reset_notify_listf;
		isp->isp_reset_notify_listf = p;
		rval = DDI_SUCCESS;
	}

	mutex_exit(ISP_REQ_MUTEX(isp));

	return (rval);
}