svn commit: r290790 - stable/10/sys/dev/isp

Alexander Motin mav at FreeBSD.org
Fri Nov 13 19:48:43 UTC 2015


Author: mav
Date: Fri Nov 13 19:48:41 2015
New Revision: 290790
URL: https://svnweb.freebsd.org/changeset/base/290790

Log:
  MFC r289877: Remove ISP_INTERNAL_TARGET code.
  
  We have CTL now, which is real and much more functional then this joke.

Modified:
  stable/10/sys/dev/isp/isp_freebsd.c
  stable/10/sys/dev/isp/isp_freebsd.h
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/dev/isp/isp_freebsd.c
==============================================================================
--- stable/10/sys/dev/isp/isp_freebsd.c	Fri Nov 13 19:47:19 2015	(r290789)
+++ stable/10/sys/dev/isp/isp_freebsd.c	Fri Nov 13 19:48:41 2015	(r290790)
@@ -68,10 +68,6 @@ static timeout_t isp_ldt;
 static task_fn_t isp_ldt_task;
 static void isp_kthread(void *);
 static void isp_action(struct cam_sim *, union ccb *);
-#ifdef	ISP_INTERNAL_TARGET
-static void isp_target_thread_pi(void *);
-static void isp_target_thread_fc(void *);
-#endif
 static int isp_timer_count;
 static void isp_timer(void *);
 
@@ -159,14 +155,6 @@ isp_attach_chan(ispsoftc_t *isp, struct 
 		struct isp_spi *spi = ISP_SPI_PC(isp, chan);
 		spi->sim = sim;
 		spi->path = path;
-#ifdef	ISP_INTERNAL_TARGET
-		ISP_SET_PC(isp, chan, proc_active, 1);
-		if (THREAD_CREATE(isp_target_thread_pi, spi, &spi->target_proc, 0, 0, "%s: isp_test_tgt%d", device_get_nameunit(isp->isp_osinfo.dev), chan)) {
-			ISP_SET_PC(isp, chan, proc_active, 0);
-			isp_prt(isp, ISP_LOGERR, "cannot create test target thread");
-		}
-		ISP_SPI_PC(isp, chan)->num_threads += 1;
-#endif
 	} else {
 		fcparam *fcp = FCPARAM(isp, chan);
 		struct isp_fc *fc = ISP_FC_PC(isp, chan);
@@ -205,14 +193,6 @@ isp_attach_chan(ispsoftc_t *isp, struct 
 			return (ENOMEM);
 		}
 		fc->num_threads += 1;
-#ifdef	ISP_INTERNAL_TARGET
-		ISP_SET_PC(isp, chan, proc_active, 1);
-		if (THREAD_CREATE(isp_target_thread_fc, fc, &fc->target_proc, 0, 0, "%s: isp_test_tgt%d", device_get_nameunit(isp->isp_osinfo.dev), chan)) {
-			ISP_SET_PC(isp, chan, proc_active, 0);
-			isp_prt(isp, ISP_LOGERR, "cannot create test target thread");
-		}
-		fc->num_threads += 1;
-#endif
 		if (chan > 0) {
 			snprintf(name, sizeof(name), "chan%d", chan);
 			tree = SYSCTL_ADD_NODE(ctx, SYSCTL_CHILDREN(tree),
@@ -258,18 +238,6 @@ isp_attach_chan(ispsoftc_t *isp, struct 
 }
 
 static void
-isp_detach_internal_target(ispsoftc_t *isp, int chan)
-{
-#ifdef ISP_INTERNAL_TARGET
-	void *wchan;
-
-	ISP_GET_PC(isp, chan, target_proc, wchan);
-	ISP_SET_PC(isp, chan, proc_active, 0);
-	wakeup(wchan);
-#endif
-}
-
-static void
 isp_detach_chan(ispsoftc_t *isp, int chan)
 {
 	struct cam_sim *sim;
@@ -293,7 +261,6 @@ isp_detach_chan(ispsoftc_t *isp, int cha
 
 	/* Wait for the channel's spawned threads to exit. */
 	wakeup(isp->isp_osinfo.pc.ptr);
-	isp_detach_internal_target(isp, chan);
 	while (*num_threads != 0)
 		mtx_sleep(isp, &isp->isp_osinfo.lock, PRIBIO, "isp_reap", 100);
 }
@@ -3598,859 +3565,6 @@ isp_target_mark_aborted_early(ispsoftc_t
 		}
 	}
 }
-
-
-#ifdef	ISP_INTERNAL_TARGET
-//#define	ISP_SEPARATE_STATUS	1
-#define	ISP_MULTI_CCBS		1
-#if defined(ISP_MULTI_CCBS) && !defined(ISP_SEPARATE_STATUS)
-#define	ISP_SEPARATE_STATUS 1
-#endif
-
-typedef struct periph_private_data_t {
-	union ccb *ccb;			/* original ATIO or Immediate Notify */
-	unsigned long	offset;		/* current offset */
-	int		sequence;	/* current CTIO sequence */
-	int		ctio_cnt;	/* current # of ctio's outstanding */
-	int
-		status_sent	: 1,
-		on_queue	: 1;	/* on restart queue */
-} ppd_t;
-/*
- * Each ATIO we allocate will have periph private data associated with it
- * that maintains per-command state. This private to each ATIO.
- */
-#define	ATIO_PPD(ccb)		((ppd_t *)(((struct ccb_hdr *)ccb)->ppriv_ptr0))
-/*
- * Each CTIO we send downstream will get a pointer to the ATIO itself
- * so that on completion we can retrieve that pointer.
- */
-#define	ccb_atio		ppriv_ptr1
-#define	ccb_inot		ppriv_ptr1
-
-/*
- * Each CTIO we send downstream will contain a sequence number
- */
-#define	CTIO_SEQ(ccb)		ccb->ccb_h.ppriv_field0
-
-#define	MAX_ISP_TARG_TRANSFER	(2 << 20)
-#define	NISP_TARG_CMDS		64
-#define	NISP_TARG_NOTIFIES	64
-#define	DISK_SHIFT		9
-#define	JUNK_SIZE		256
-#define	MULTI_CCB_DATA_LIM	8192
-//#define	MULTI_CCB_DATA_CNT	64
-#define	MULTI_CCB_DATA_CNT	8
-
-extern u_int vm_kmem_size;
-static int ca;
-static uint32_t disk_size;
-static uint8_t *disk_data = NULL;
-static uint8_t *junk_data;
-static MALLOC_DEFINE(M_ISPTARG, "ISPTARG", "ISP TARGET data");
-struct isptarg_softc {
-	/* CCBs (CTIOs, ATIOs, INOTs) pending on the controller */
-	struct isp_ccbq		work_queue;
-	struct isp_ccbq		rework_queue;
-	struct isp_ccbq		running_queue;
-	struct isp_ccbq		inot_queue;
-	struct cam_periph       *periph;
-	struct cam_path	 	*path;
-	ispsoftc_t		*isp;
-};
-static periph_ctor_t	isptargctor;
-static periph_dtor_t	isptargdtor;
-static periph_start_t	isptargstart;
-static periph_init_t	isptarginit;
-static void		isptarg_done(struct cam_periph *, union ccb *);
-static void		isptargasync(void *, u_int32_t, struct cam_path *, void *);
-
-
-static int isptarg_rwparm(uint8_t *, uint8_t *, uint64_t, uint32_t, uint8_t **, uint32_t *, int *);
-
-static struct periph_driver isptargdriver =
-{
-	isptarginit, "isptarg", TAILQ_HEAD_INITIALIZER(isptargdriver.units), 0
-};
-
-static void
-isptarginit(void)
-{
-}
-
-static void
-isptargnotify(ispsoftc_t *isp, union ccb *iccb, struct ccb_immediate_notify *inot)
-{
-	struct ccb_notify_acknowledge *ack = &iccb->cna2;
-
-	ISP_PATH_PRT(isp, ISP_LOGTDEBUG0, inot->ccb_h.path, "%s: [0x%x] immediate notify for 0x%x from 0x%x status 0x%x arg 0x%x\n", __func__,
-	    inot->tag_id, inot->initiator_id, inot->seq_id, inot->ccb_h.status, inot->arg);
-	ack->ccb_h.func_code = XPT_NOTIFY_ACKNOWLEDGE;
-	ack->ccb_h.flags = 0;
-	ack->ccb_h.retry_count = 0;
-	ack->ccb_h.cbfcnp = isptarg_done;
-	ack->ccb_h.timeout = 0;
-	ack->ccb_h.ccb_inot = inot;
-	ack->tag_id = inot->tag_id;
-	ack->seq_id = inot->seq_id;
-	ack->initiator_id = inot->initiator_id;
-	xpt_action(iccb);
-}
-
-static void
-isptargstart(struct cam_periph *periph, union ccb *iccb)
-{
-	const uint8_t niliqd[SHORT_INQUIRY_LENGTH] = {
-		0x7f, 0x0, 0x5, 0x2, 32, 0, 0, 0x32,
-		'F', 'R', 'E', 'E', 'B', 'S', 'D', ' ',
-		'S', 'C', 'S', 'I', ' ', 'N', 'U', 'L',
-		'L', ' ', 'D', 'E', 'V', 'I', 'C', 'E',
-		'0', '0', '0', '1'
-	};
-	const uint8_t iqd[SHORT_INQUIRY_LENGTH] = {
-		0, 0x0, 0x5, 0x2, 32, 0, 0, 0x32,
-		'F', 'R', 'E', 'E', 'B', 'S', 'D', ' ',
-		'S', 'C', 'S', 'I', ' ', 'M', 'E', 'M',
-		'O', 'R', 'Y', ' ', 'D', 'I', 'S', 'K',
-		'0', '0', '0', '1'
-	};
-	int r, i, more = 0, last, is_data_cmd = 0, is_write;
-	char *queue;
-	struct isptarg_softc *softc = periph->softc;
-	struct ccb_scsiio *csio;
-	lun_id_t return_lun;
-	struct ccb_accept_tio *atio;
-	uint8_t *cdb, *ptr, status;
-	uint8_t *data_ptr;
-	uint32_t data_len, flags;
-	struct ccb_hdr *ccbh;
-	    
-	mtx_assert(periph->sim->mtx, MA_OWNED);
-	ISP_PATH_PRT(softc->isp, ISP_LOGTDEBUG1, iccb->ccb_h.path, "%s: function code 0x%x INOTQ=%c WORKQ=%c REWORKQ=%c\n", __func__, iccb->ccb_h.func_code,
-	    TAILQ_FIRST(&softc->inot_queue)? 'y' : 'n', TAILQ_FIRST(&softc->work_queue)? 'y' : 'n', TAILQ_FIRST(&softc->rework_queue)? 'y' : 'n');
-	/*
-	 * Check for immediate notifies first
-	 */
-	ccbh = TAILQ_FIRST(&softc->inot_queue);
-	if (ccbh) {
-		TAILQ_REMOVE(&softc->inot_queue, ccbh, periph_links.tqe);
-		if (TAILQ_FIRST(&softc->inot_queue) || TAILQ_FIRST(&softc->work_queue) || TAILQ_FIRST(&softc->rework_queue)) {
-			xpt_schedule(periph, 1);
-		}
-		isptargnotify(softc->isp, iccb, (struct ccb_immediate_notify *)ccbh);
-		return;
-	}
-
-	/*
-	 * Check the rework (continuation) work queue first.
-	 */
-	ccbh = TAILQ_FIRST(&softc->rework_queue);
-	if (ccbh) {
-		atio = (struct ccb_accept_tio *)ccbh;
-		TAILQ_REMOVE(&softc->rework_queue, ccbh, periph_links.tqe);
-		more = TAILQ_FIRST(&softc->work_queue) || TAILQ_FIRST(&softc->rework_queue);
-		queue = "rework";
-	} else {
-		ccbh = TAILQ_FIRST(&softc->work_queue);
-		if (ccbh == NULL) {
-			xpt_release_ccb(iccb);
-			return;
-		}
-		atio = (struct ccb_accept_tio *)ccbh;
-		TAILQ_REMOVE(&softc->work_queue, ccbh, periph_links.tqe);
-		more = TAILQ_FIRST(&softc->work_queue) != NULL;
-		queue = "work";
-	}
-	ATIO_PPD(atio)->on_queue = 0;
-
-	if (atio->tag_id == 0xffffffff || atio->ccb_h.func_code != XPT_ACCEPT_TARGET_IO) {
-		panic("BAD ATIO");
-	}
-
-	data_len = is_write = 0;
-	data_ptr = NULL;
-	csio = &iccb->csio;
-	status = SCSI_STATUS_OK;
-	flags = CAM_SEND_STATUS;
-	memset(&atio->sense_data, 0, sizeof (atio->sense_data));
-	cdb = atio->cdb_io.cdb_bytes;
-	ISP_PATH_PRT(softc->isp, ISP_LOGTDEBUG0, ccbh->path, "%s: [0x%x] processing ATIO from %s queue initiator 0x%x CDB=0x%x data_offset=%u\n", __func__, atio->tag_id,
-	    queue, atio->init_id, cdb[0], ATIO_PPD(atio)->offset);
-
-	return_lun = XS_LUN(atio);
-	if (return_lun != 0) {
-		xpt_print(atio->ccb_h.path, "[0x%x] Non-Zero Lun %d: cdb0=0x%x\n", atio->tag_id, return_lun, cdb[0]);
-		if (cdb[0] != INQUIRY && cdb[0] != REPORT_LUNS && cdb[0] != REQUEST_SENSE) {
-			status = SCSI_STATUS_CHECK_COND;
-			SDFIXED(atio->sense_data)->error_code = SSD_ERRCODE_VALID|SSD_CURRENT_ERROR;
-			SDFIXED(atio->sense_data)->flags = SSD_KEY_ILLEGAL_REQUEST;
-			SDFIXED(atio->sense_data)->add_sense_code = 0x25;	/* LOGICAL UNIT NOT SUPPORTED */
-			atio->sense_len = SSD_MIN_SIZE;
-		}
-		return_lun = CAM_LUN_WILDCARD;
-	}
-
-	switch (cdb[0]) {
-	case REQUEST_SENSE:
-		flags |= CAM_DIR_IN;
-		data_len = sizeof (atio->sense_data);
-		junk_data[0] = SSD_ERRCODE_VALID|SSD_CURRENT_ERROR|SSD_KEY_NO_SENSE;
-		memset(junk_data+1, 0, data_len-1);
-		if (data_len > cdb[4]) {
-			data_len = cdb[4];
-		}
-		if (data_len) {
-			data_ptr = junk_data;
-		}
-		break;
-	case WRITE_6:
-	case WRITE_10:
-	case WRITE_12:
-	case WRITE_16:
-		is_write = 1;
-		/* FALLTHROUGH */
-	case READ_6:
-	case READ_10:
-	case READ_12:
-	case READ_16:
-		is_data_cmd = 1;
-		r = isptarg_rwparm(cdb, disk_data, disk_size, ATIO_PPD(atio)->offset, &data_ptr, &data_len, &last);
-		if (r != 0) {
-			status = SCSI_STATUS_CHECK_COND;
-			SDFIXED(atio->sense_data)->error_code = SSD_ERRCODE_VALID|SSD_CURRENT_ERROR;
-			SDFIXED(atio->sense_data)->flags = SSD_KEY_ILLEGAL_REQUEST;
-			if (r == -1) {
-				SDFIXED(atio->sense_data)->add_sense_code = 0x21;	/* LOGICAL BLOCK ADDRESS OUT OF RANGE */
-			} else {
-				SDFIXED(atio->sense_data)->add_sense_code = 0x20;	/* INVALID COMMAND OPERATION CODE */
-			}
-			atio->sense_len = SSD_MIN_SIZE;
-		} else {
-#ifdef	ISP_SEPARATE_STATUS
-			if (last && data_len) {
-				last = 0;
-			}
-#endif
-			if (last == 0) {
-				flags &= ~CAM_SEND_STATUS;
-			}
-			if (data_len) {
-				ATIO_PPD(atio)->offset += data_len;
-				if (is_write)
-					flags |= CAM_DIR_OUT;
-				else
-					flags |= CAM_DIR_IN;
-			} else {
-				flags |= CAM_DIR_NONE;
-			}
-		}
-		break;
-	case INQUIRY:
-		flags |= CAM_DIR_IN;
-		if (cdb[1] || cdb[2] || cdb[3]) {
-			status = SCSI_STATUS_CHECK_COND;
-			SDFIXED(atio->sense_data)->error_code = SSD_ERRCODE_VALID|SSD_CURRENT_ERROR;
-			SDFIXED(atio->sense_data)->flags = SSD_KEY_UNIT_ATTENTION;
-			SDFIXED(atio->sense_data)->add_sense_code = 0x24;	/* INVALID FIELD IN CDB */
-			atio->sense_len = SSD_MIN_SIZE;
-			break;
-		}
-		data_len = sizeof (iqd);
-		if (data_len > cdb[4]) {
-			data_len = cdb[4];
-		}
-		if (data_len) {
-			if (XS_LUN(iccb) != 0) {
-				memcpy(junk_data, niliqd, sizeof (iqd));
-			} else {
-				memcpy(junk_data, iqd, sizeof (iqd));
-			}
-			data_ptr = junk_data;
-		}
-		break;
-	case TEST_UNIT_READY:
-		flags |= CAM_DIR_NONE;
-		if (ca) {
-			ca = 0;
-			status = SCSI_STATUS_CHECK_COND;
-			SDFIXED(atio->sense_data)->error_code = SSD_ERRCODE_VALID|SSD_CURRENT_ERROR;
-			SDFIXED(atio->sense_data)->flags = SSD_KEY_UNIT_ATTENTION;
-			SDFIXED(atio->sense_data)->add_sense_code = 0x29;	/* POWER ON, RESET, OR BUS DEVICE RESET OCCURRED */
-			atio->sense_len = SSD_MIN_SIZE;
-		}
-		break;
-	case SYNCHRONIZE_CACHE:
-	case START_STOP:
-	case RESERVE:
-	case RELEASE:
-	case VERIFY_10:
-		flags |= CAM_DIR_NONE;
-		break;
-
-	case READ_CAPACITY:
-		flags |= CAM_DIR_IN;
-		if (cdb[2] || cdb[3] || cdb[4] || cdb[5]) {
-			status = SCSI_STATUS_CHECK_COND;
-			SDFIXED(atio->sense_data)->error_code = SSD_ERRCODE_VALID|SSD_CURRENT_ERROR;
-			SDFIXED(atio->sense_data)->flags = SSD_KEY_ILLEGAL_REQUEST;
-			SDFIXED(atio->sense_data)->add_sense_code =  0x24;	/* INVALID FIELD IN CDB */
-			atio->sense_len = SSD_MIN_SIZE;
-			break;
-		}
-		if (cdb[8] & 0x1) { /* PMI */
-			junk_data[0] = 0xff;
-			junk_data[1] = 0xff;
-			junk_data[2] = 0xff;
-			junk_data[3] = 0xff;
-		} else {
-			uint64_t last_blk = (disk_size >> DISK_SHIFT) - 1;
-			if (last_blk < 0xffffffffULL) {
-			    junk_data[0] = (last_blk >> 24) & 0xff;
-			    junk_data[1] = (last_blk >> 16) & 0xff;
-			    junk_data[2] = (last_blk >>  8) & 0xff;
-			    junk_data[3] = (last_blk) & 0xff;
-			} else {
-			    junk_data[0] = 0xff;
-			    junk_data[1] = 0xff;
-			    junk_data[2] = 0xff;
-			    junk_data[3] = 0xff;
-			}
-		}
-		junk_data[4] = ((1 << DISK_SHIFT) >> 24) & 0xff;
-		junk_data[5] = ((1 << DISK_SHIFT) >> 16) & 0xff;
-		junk_data[6] = ((1 << DISK_SHIFT) >>  8) & 0xff;
-		junk_data[7] = ((1 << DISK_SHIFT)) & 0xff;
-		data_ptr = junk_data;
-		data_len = 8;
-		break;
-	case REPORT_LUNS:
-		flags |= CAM_DIR_IN;
-		memset(junk_data, 0, JUNK_SIZE);
-		junk_data[0] = (1 << 3) >> 24;
-		junk_data[1] = (1 << 3) >> 16;
-		junk_data[2] = (1 << 3) >> 8;
-		junk_data[3] = (1 << 3);
-		ptr = NULL;
-		for (i = 0; i < 1; i++) {
-			ptr = &junk_data[8 + (i << 3)];
-			if (i >= 256) {
-				ptr[0] = 0x40 | ((i >> 8) & 0x3f);
-			}
-			ptr[1] = i;
-		}
-		data_ptr = junk_data;
-		data_len = (ptr + 8) - junk_data;
-		break;
-
-	default:
-		flags |= CAM_DIR_NONE;
-		status = SCSI_STATUS_CHECK_COND;
-		SDFIXED(atio->sense_data)->error_code = SSD_ERRCODE_VALID|SSD_CURRENT_ERROR;
-		SDFIXED(atio->sense_data)->flags = SSD_KEY_ILLEGAL_REQUEST;
-		SDFIXED(atio->sense_data)->add_sense_code = 0x20;	/* INVALID COMMAND OPERATION CODE */
-		atio->sense_len = SSD_MIN_SIZE;
-		break;
-	}
-
-	/*
-	 * If we are done with the transaction, tell the
-	 * controller to send status and perform a CMD_CMPLT.
-	 * If we have associated sense data, see if we can
-	 * send that too.
-	 */
-	if (status == SCSI_STATUS_CHECK_COND) {
-		flags |= CAM_SEND_SENSE;
-		csio->sense_len = atio->sense_len;
-		csio->sense_data = atio->sense_data;
-		flags &= ~CAM_DIR_MASK;
-		data_len = 0;
-		data_ptr = NULL;
-	}
-	cam_fill_ctio(csio, 0, isptarg_done, flags, MSG_SIMPLE_Q_TAG, atio->tag_id, atio->init_id, status, data_ptr, data_len, 30 * hz);
-	iccb->ccb_h.target_id = atio->ccb_h.target_id;
-	iccb->ccb_h.target_lun = return_lun;
-	iccb->ccb_h.ccb_atio = atio;
-	CTIO_SEQ(iccb) = ATIO_PPD(atio)->sequence++;
-	ATIO_PPD(atio)->ctio_cnt++;
-	if (flags & CAM_SEND_STATUS) {
-		KASSERT((ATIO_PPD(atio)->status_sent == 0), ("we have already sent status for 0x%x in %s", atio->tag_id, __func__));
-		ATIO_PPD(atio)->status_sent = 1;
-	}
-	ISP_PATH_PRT(softc->isp, ISP_LOGTDEBUG0, atio->ccb_h.path, "%s: sending downstream for  0x%x sequence %u len %u flags %x\n", __func__, atio->tag_id, CTIO_SEQ(iccb), data_len, flags);
-	xpt_action(iccb);
-
-	if ((atio->ccb_h.status & CAM_DEV_QFRZN) != 0) {
-		cam_release_devq(periph->path, 0, 0, 0, 0); 
-		atio->ccb_h.status &= ~CAM_DEV_QFRZN;
-	}
-#ifdef	ISP_MULTI_CCBS
-	if (is_data_cmd && ATIO_PPD(atio)->status_sent == 0 && ATIO_PPD(atio)->ctio_cnt < MULTI_CCB_DATA_CNT && ATIO_PPD(atio)->on_queue == 0) {
-		ISP_PATH_PRT(softc->isp, ISP_LOGTDEBUG0, atio->ccb_h.path, "%s: more still to do for 0x%x\n", __func__, atio->tag_id);
-		TAILQ_INSERT_TAIL(&softc->rework_queue, &atio->ccb_h, periph_links.tqe); 
-		ATIO_PPD(atio)->on_queue = 1;
-		more = 1;
-	}
-#endif
-	if (more) {
-		xpt_schedule(periph, 1);
-	}
-}
-
-static cam_status
-isptargctor(struct cam_periph *periph, void *arg)
-{
-	struct isptarg_softc *softc;
-
-	softc = (struct isptarg_softc *)arg;
-	periph->softc = softc;
-	softc->periph = periph;
-	softc->path = periph->path;
-	ISP_PATH_PRT(softc->isp, ISP_LOGTDEBUG1, periph->path, "%s called\n", __func__);
-	return (CAM_REQ_CMP);
-}
-
-static void
-isptargdtor(struct cam_periph *periph)
-{
-	struct isptarg_softc *softc;
-	softc = (struct isptarg_softc *)periph->softc;
-	ISP_PATH_PRT(softc->isp, ISP_LOGTDEBUG1, periph->path, "%s called\n", __func__);
-	softc->periph = NULL;
-	softc->path = NULL;
-	periph->softc = NULL;
-}
-
-static void
-isptarg_done(struct cam_periph *periph, union ccb *ccb)
-{
-	struct isptarg_softc *softc;
-	ispsoftc_t *isp;
-	uint32_t newoff;
-	struct ccb_accept_tio *atio;
-	struct ccb_immediate_notify *inot;
-	cam_status status;
-
-	softc = (struct isptarg_softc *)periph->softc;
-	isp = softc->isp;
-	status = ccb->ccb_h.status & CAM_STATUS_MASK;
-
-	switch (ccb->ccb_h.func_code) {
-	case XPT_ACCEPT_TARGET_IO:
-		atio = (struct ccb_accept_tio *) ccb;
-		ISP_PATH_PRT(isp, ISP_LOGTDEBUG0, ccb->ccb_h.path, "[0x%x] ATIO seen in %s\n", atio->tag_id, __func__);
-		memset(ATIO_PPD(atio), 0, sizeof (ppd_t));
-		TAILQ_INSERT_TAIL(&softc->work_queue, &ccb->ccb_h, periph_links.tqe); 
-		ATIO_PPD(atio)->on_queue = 1;
-		xpt_schedule(periph, 1);
-		break;
-	case XPT_IMMEDIATE_NOTIFY:
-		inot = (struct ccb_immediate_notify *) ccb;
-		ISP_PATH_PRT(isp, ISP_LOGTDEBUG0, ccb->ccb_h.path, "[0x%x] INOT for 0x%x seen in %s\n", inot->tag_id, inot->seq_id, __func__);
-		TAILQ_INSERT_TAIL(&softc->inot_queue, &ccb->ccb_h, periph_links.tqe); 
-		xpt_schedule(periph, 1);
-		break;
-	case XPT_CONT_TARGET_IO:
-		atio = ccb->ccb_h.ccb_atio;
-		KASSERT((ATIO_PPD(atio)->ctio_cnt != 0), ("ctio zero when finishing a CTIO"));
-		ATIO_PPD(atio)->ctio_cnt--;
-		if ((ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) {
-			switch (ccb->ccb_h.status & CAM_STATUS_MASK) {
-			case CAM_MESSAGE_RECV:
-				newoff = (ccb->csio.msg_ptr[3] << 24) | (ccb->csio.msg_ptr[4] << 16) | (ccb->csio.msg_ptr[5] << 8) | (ccb->csio.msg_ptr[6]);
-				ISP_PATH_PRT(isp, ISP_LOGWARN, ccb->ccb_h.path, "[0x%x] got message to return to reset offset to 0x%x at sequence %u\n", atio->tag_id, newoff, CTIO_SEQ(ccb));
-				ATIO_PPD(atio)->offset = newoff;
-				ATIO_PPD(atio)->status_sent = 0;
-				if (ATIO_PPD(atio)->on_queue == 0) {
-					TAILQ_INSERT_TAIL(&softc->rework_queue, &atio->ccb_h, periph_links.tqe); 
-					ATIO_PPD(atio)->on_queue = 1;
-				}
-				xpt_schedule(periph, 1);
-				break;
-			default:
-				cam_error_print(ccb, CAM_ESF_ALL, CAM_EPF_ALL);
-				xpt_action((union ccb *)atio);
-				break;
-			}
-		} else if ((ccb->ccb_h.flags & CAM_SEND_STATUS) == 0) {
-			ISP_PATH_PRT(isp, ISP_LOGTDEBUG0, ccb->ccb_h.path, "[0x%x] MID CTIO sequence %u seen in %s\n", atio->tag_id, CTIO_SEQ(ccb), __func__);
-			if (ATIO_PPD(atio)->status_sent == 0 && ATIO_PPD(atio)->on_queue == 0) {
-				TAILQ_INSERT_TAIL(&softc->rework_queue, &atio->ccb_h, periph_links.tqe); 
-				ATIO_PPD(atio)->on_queue = 1;
-			}
-			xpt_schedule(periph, 1);
-		} else {
-			KASSERT((ATIO_PPD(atio)->ctio_cnt == 0), ("ctio count still %d when we think we've sent the STATUS ctio", ATIO_PPD(atio)->ctio_cnt));
-			ISP_PATH_PRT(isp, ISP_LOGTDEBUG0, ccb->ccb_h.path, "[0x%x] FINAL CTIO sequence %u seen in %s\n", atio->tag_id, CTIO_SEQ(ccb), __func__);
-			xpt_action((union ccb *)atio);
-		}
-		if ((ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) {
-			cam_release_devq(ccb->ccb_h.path, 0, 0, 0, 0); 
-			ccb->ccb_h.status &= ~CAM_DEV_QFRZN;
-		}
-		xpt_release_ccb(ccb);
-		break;
-	case XPT_NOTIFY_ACKNOWLEDGE:
-		if ((ccb->ccb_h.status & CAM_DEV_QFRZN) != 0) {
-			cam_release_devq(ccb->ccb_h.path, 0, 0, 0, 0); 
-			ccb->ccb_h.status &= ~CAM_DEV_QFRZN;
-		}
-		inot = ccb->ccb_h.ccb_inot;
-		ISP_PATH_PRT(isp, ISP_LOGTDEBUG1, inot->ccb_h.path, "[0x%x] recycle notify for tag 0x%x\n", inot->tag_id, inot->seq_id);
-		xpt_release_ccb(ccb);
-		xpt_action((union ccb *)inot);
-		break;
-	default:
-		xpt_print(ccb->ccb_h.path, "unexpected code 0x%x\n", ccb->ccb_h.func_code);
-		break;
-	}
-}
-
-static void
-isptargasync(void *callback_arg, u_int32_t code, struct cam_path *path, void *arg)
-{
-	struct ac_contract *acp = arg;
-	struct ac_device_changed *fc = (struct ac_device_changed *) acp->contract_data;
-
-	if (code != AC_CONTRACT) {
-		return;
-	}
-	xpt_print(path, "0x%016llx Port ID 0x%06x %s\n", (unsigned long long) fc->wwpn, fc->port, fc->arrived? "arrived" : "departed");
-}
-
-static void
-isp_target_thread(ispsoftc_t *isp, int chan)
-{
-	union ccb *ccb = NULL;
-	int i;
-	void *wchan;
-	cam_status status;
-	struct isptarg_softc *softc = NULL;
-	struct cam_periph *periph = NULL, *wperiph = NULL;
-	struct cam_path *path, *wpath;
-	struct cam_sim *sim;
-
-	if (disk_data == NULL) {
-		disk_size = roundup2(vm_kmem_size >> 1, (1ULL << 20));
-		if (disk_size < (50 << 20)) {
-			disk_size = 50 << 20;
-		}
-		disk_data = malloc(disk_size, M_ISPTARG, M_WAITOK | M_ZERO);
-		if (disk_data == NULL) {
-			isp_prt(isp, ISP_LOGERR, "%s: could not allocate disk data", __func__);
-			goto out;
-		}
-		isp_prt(isp, ISP_LOGINFO, "allocated a %ju MiB disk", (uintmax_t) (disk_size >> 20));
-	}
-	junk_data = malloc(JUNK_SIZE, M_ISPTARG, M_WAITOK | M_ZERO);
-	if (junk_data == NULL) {
-		isp_prt(isp, ISP_LOGERR, "%s: could not allocate junk", __func__);
-		goto out;
-	}
-
-
-	softc = malloc(sizeof (*softc), M_ISPTARG, M_WAITOK | M_ZERO);
-	if (softc == NULL) {
-		isp_prt(isp, ISP_LOGERR, "%s: could not allocate softc", __func__);
-		goto out;
-	}
-	TAILQ_INIT(&softc->work_queue);
-	TAILQ_INIT(&softc->rework_queue);
-	TAILQ_INIT(&softc->running_queue);
-	TAILQ_INIT(&softc->inot_queue);
-	softc->isp = isp;
-
-	periphdriver_register(&isptargdriver);
-	ISP_GET_PC(isp, chan, sim, sim);
-	ISP_GET_PC(isp, chan, path,  path);
-	status = xpt_create_path(&wpath, NULL, cam_sim_path(sim), CAM_TARGET_WILDCARD, CAM_LUN_WILDCARD);
-	if (status != CAM_REQ_CMP) {
-		isp_prt(isp, ISP_LOGERR, "%s: could not allocate wildcard path", __func__);
-		return;
-	}
-	status = xpt_create_path(&path, NULL, cam_sim_path(sim), 0, 0);
-	if (status != CAM_REQ_CMP) {
-		xpt_free_path(wpath);
-		isp_prt(isp, ISP_LOGERR, "%s: could not allocate path", __func__);
-		return;
-	}
-
-	ISP_LOCK(isp);
-	status = cam_periph_alloc(isptargctor, NULL, isptargdtor, isptargstart, "isptarg", CAM_PERIPH_BIO, wpath, NULL, 0, softc);
-	if (status != CAM_REQ_CMP) {
-		ISP_UNLOCK(isp);
-		isp_prt(isp, ISP_LOGERR, "%s: cam_periph_alloc for wildcard failed", __func__);
-		goto out;
-	}
-	wperiph = cam_periph_find(wpath, "isptarg");
-	if (wperiph == NULL) {
-		ISP_UNLOCK(isp);
-		isp_prt(isp, ISP_LOGERR, "%s: wildcard periph already allocated but doesn't exist", __func__);
-		goto out;
-	}
-
-	status = cam_periph_alloc(isptargctor, NULL, isptargdtor, isptargstart, "isptarg", CAM_PERIPH_BIO, path, NULL, 0, softc);
-	if (status != CAM_REQ_CMP) {
-		ISP_UNLOCK(isp);
-		isp_prt(isp, ISP_LOGERR, "%s: cam_periph_alloc failed", __func__);
-		goto out;
-	}
-
-	periph = cam_periph_find(path, "isptarg");
-	if (periph == NULL) {
-		ISP_UNLOCK(isp);
-		isp_prt(isp, ISP_LOGERR, "%s: periph already allocated but doesn't exist", __func__);
-		goto out;
-	}
-
-	status = xpt_register_async(AC_CONTRACT, isptargasync, isp, wpath);
-	if (status != CAM_REQ_CMP) {
-		ISP_UNLOCK(isp);
-		isp_prt(isp, ISP_LOGERR, "%s: xpt_register_async failed", __func__);
-		goto out;
-	}
-
-	ISP_UNLOCK(isp);
-
-	ccb = xpt_alloc_ccb();
-
-	/*
-	 * Make sure role is none.
-	 */
-	xpt_setup_ccb(&ccb->ccb_h, periph->path, 10);
-	ccb->ccb_h.func_code = XPT_SET_SIM_KNOB;
-	ccb->knob.xport_specific.fc.role = KNOB_ROLE_NONE;
-	ccb->knob.xport_specific.fc.valid = KNOB_VALID_ROLE;
-
-	ISP_LOCK(isp);
-	xpt_action(ccb);
-	ISP_UNLOCK(isp);
-
-	/*
-	 * Now enable luns
-	 */
-	xpt_setup_ccb(&ccb->ccb_h, periph->path, 10);
-	ccb->ccb_h.func_code = XPT_EN_LUN;
-	ccb->cel.enable = 1;
-	ISP_LOCK(isp);
-	xpt_action(ccb);
-	ISP_UNLOCK(isp);
-	if (ccb->ccb_h.status != CAM_REQ_CMP) {
-		xpt_free_ccb(ccb);
-		xpt_print(periph->path, "failed to enable lun (0x%x)\n", ccb->ccb_h.status);
-		goto out;
-	}
-
-	xpt_setup_ccb(&ccb->ccb_h, wperiph->path, 10);
-	ccb->ccb_h.func_code = XPT_EN_LUN;
-	ccb->cel.enable = 1;
-	ISP_LOCK(isp);
-	xpt_action(ccb);
-	ISP_UNLOCK(isp);
-	if (ccb->ccb_h.status != CAM_REQ_CMP) {
-		xpt_free_ccb(ccb);
-		xpt_print(wperiph->path, "failed to enable lun (0x%x)\n", ccb->ccb_h.status);
-		goto out;
-	}
-	xpt_free_ccb(ccb);
-
-	/*
-	 * Add resources
-	 */
-	ISP_GET_PC(isp, chan, target_proc, wchan);
-	for (i = 0; i < 4; i++) {
-		ccb = malloc(sizeof (*ccb), M_ISPTARG, M_WAITOK | M_ZERO);
-		xpt_setup_ccb(&ccb->ccb_h, wperiph->path, 1);
-		ccb->ccb_h.func_code = XPT_ACCEPT_TARGET_IO;
-		ccb->ccb_h.cbfcnp = isptarg_done;
-		ccb->ccb_h.ppriv_ptr0 = malloc(sizeof (ppd_t), M_ISPTARG, M_WAITOK | M_ZERO);
-		ISP_LOCK(isp);
-		xpt_action(ccb);
-		ISP_UNLOCK(isp);
-	}
-	for (i = 0; i < NISP_TARG_CMDS; i++) {
-		ccb = malloc(sizeof (*ccb), M_ISPTARG, M_WAITOK | M_ZERO);
-		xpt_setup_ccb(&ccb->ccb_h, periph->path, 1);
-		ccb->ccb_h.func_code = XPT_ACCEPT_TARGET_IO;
-		ccb->ccb_h.cbfcnp = isptarg_done;
-		ccb->ccb_h.ppriv_ptr0 = malloc(sizeof (ppd_t), M_ISPTARG, M_WAITOK | M_ZERO);
-		ISP_LOCK(isp);
-		xpt_action(ccb);
-		ISP_UNLOCK(isp);
-	}
-	for (i = 0; i < 4; i++) {
-		ccb = malloc(sizeof (*ccb), M_ISPTARG, M_WAITOK | M_ZERO);
-		xpt_setup_ccb(&ccb->ccb_h, wperiph->path, 1);
-		ccb->ccb_h.func_code = XPT_IMMEDIATE_NOTIFY;
-		ccb->ccb_h.cbfcnp = isptarg_done;
-		ISP_LOCK(isp);
-		xpt_action(ccb);
-		ISP_UNLOCK(isp);
-	}
-	for (i = 0; i < NISP_TARG_NOTIFIES; i++) {
-		ccb = malloc(sizeof (*ccb), M_ISPTARG, M_WAITOK | M_ZERO);
-		xpt_setup_ccb(&ccb->ccb_h, periph->path, 1);
-		ccb->ccb_h.func_code = XPT_IMMEDIATE_NOTIFY;
-		ccb->ccb_h.cbfcnp = isptarg_done;
-		ISP_LOCK(isp);
-		xpt_action(ccb);
-		ISP_UNLOCK(isp);
-	}
-
-	/*
-	 * Now turn it all back on
-	 */
-	xpt_setup_ccb(&ccb->ccb_h, periph->path, 10);
-	ccb->ccb_h.func_code = XPT_SET_SIM_KNOB;
-	ccb->knob.xport_specific.fc.valid = KNOB_VALID_ROLE;
-	ccb->knob.xport_specific.fc.role = KNOB_ROLE_TARGET;
-	ISP_LOCK(isp);
-	xpt_action(ccb);
-	ISP_UNLOCK(isp);
-
-	/*
-	 * Okay, while things are still active, sleep...
-	 */
-	ISP_LOCK(isp);
-	for (;;) {
-		ISP_GET_PC(isp, chan, proc_active, i);
-		if (i == 0) {
-			break;
-		}
-		msleep(wchan, &isp->isp_lock, PUSER, "tsnooze", 0);
-	}
-	ISP_UNLOCK(isp);
-
-out:
-	if (wperiph) {
-		cam_periph_invalidate(wperiph);
-	}
-	if (periph) {
-		cam_periph_invalidate(periph);
-	}
-	if (junk_data) {
-		free(junk_data, M_ISPTARG);
-	}
-	if (disk_data) {
-		free(disk_data, M_ISPTARG);
-	}
-	if (softc) {
-		free(softc, M_ISPTARG);
-	}
-	xpt_free_path(path);
-	xpt_free_path(wpath);
-}
-
-static void
-isp_target_thread_pi(void *arg)
-{
-	struct isp_spi *pi = arg;
-	ispsoftc_t *isp = cam_sim_softc(pi->sim);
-	int chan = cam_sim_bus(pi->sim);
-
-	isp_target_thread(isp, chan);
-	ISP_SPI_PC(isp, chan)->num_threads -= 1;
-	kthread_exit();
-}
-
-static void
-isp_target_thread_fc(void *arg)
-{
-	struct isp_fc *fc = arg;
-	ispsoftc_t *isp = cam_sim_softc(pi->sim);
-	int chan = cam_sim_bus(pi->sim);
-
-	isp_target_thread(isp, chan);
-	ISP_FC_PC(isp, chan)->num_threads -= 1;
-	kthread_exit();
-}
-
-static int
-isptarg_rwparm(uint8_t *cdb, uint8_t *dp, uint64_t dl, uint32_t offset, uint8_t **kp, uint32_t *tl, int *lp)
-{
-	uint32_t cnt, curcnt;
-	uint64_t lba;
-
-	switch (cdb[0]) {
-	case WRITE_16:
-	case READ_16:
-		cnt =	(((uint32_t)cdb[10]) <<  24) |
-			(((uint32_t)cdb[11]) <<  16) |
-			(((uint32_t)cdb[12]) <<   8) |
-			((uint32_t)cdb[13]);
-
-		lba =	(((uint64_t)cdb[2]) << 56) |
-			(((uint64_t)cdb[3]) << 48) |
-			(((uint64_t)cdb[4]) << 40) |
-			(((uint64_t)cdb[5]) << 32) |
-			(((uint64_t)cdb[6]) << 24) |
-			(((uint64_t)cdb[7]) << 16) |
-			(((uint64_t)cdb[8]) <<  8) |
-			((uint64_t)cdb[9]);
-		break;
-	case WRITE_12:
-	case READ_12:
-		cnt =	(((uint32_t)cdb[6]) <<  16) |
-			(((uint32_t)cdb[7]) <<   8) |
-			((u_int32_t)cdb[8]);
-
-		lba =	(((uint32_t)cdb[2]) << 24) |
-			(((uint32_t)cdb[3]) << 16) |
-			(((uint32_t)cdb[4]) <<  8) |
-			((uint32_t)cdb[5]);
-		break;
-	case WRITE_10:
-	case READ_10:
-		cnt =	(((uint32_t)cdb[7]) <<  8) |
-			((u_int32_t)cdb[8]);
-
-		lba =	(((uint32_t)cdb[2]) << 24) |
-			(((uint32_t)cdb[3]) << 16) |
-			(((uint32_t)cdb[4]) <<  8) |
-			((uint32_t)cdb[5]);
-		break;
-	case WRITE_6:
-	case READ_6:
-		cnt = cdb[4];
-		if (cnt == 0) {
-			cnt = 256;
-		}
-		lba =	(((uint32_t)cdb[1] & 0x1f) << 16) |
-			(((uint32_t)cdb[2]) << 8) |
-			((uint32_t)cdb[3]);
-		break;
-	default:
-		return (-1);
-	}
-
-	cnt <<= DISK_SHIFT;
-	lba <<= DISK_SHIFT;
-
-	if (offset == cnt) {
-		*lp = 1;
-		return (0);
-	}
-
-	if (lba + cnt > dl) {
-		return (-2);
-	}
-
-	curcnt = MAX_ISP_TARG_TRANSFER;
-	if (offset + curcnt >= cnt) {
-		curcnt = cnt - offset;
-		*lp = 1;
-	} else {
-		*lp = 0;
-	}
-#ifdef	ISP_MULTI_CCBS
-	if (curcnt > MULTI_CCB_DATA_LIM)
-		curcnt = MULTI_CCB_DATA_LIM;
-#endif
-	*tl = curcnt;
-	*kp = &dp[lba + offset];
-	return (0);
-}
-
-#endif
 #endif
 
 static void

Modified: stable/10/sys/dev/isp/isp_freebsd.h
==============================================================================
--- stable/10/sys/dev/isp/isp_freebsd.h	Fri Nov 13 19:47:19 2015	(r290789)
+++ stable/10/sys/dev/isp/isp_freebsd.h	Fri Nov 13 19:48:41 2015	(r290790)
@@ -242,9 +242,6 @@ struct isp_fc {
 	struct isp_nexus *nexus_free_list;
 	uint32_t
 #ifdef	ISP_TARGET_MODE
-#ifdef	ISP_INTERNAL_TARGET
-		proc_active	: 1,
-#endif
 		tm_luns_enabled	: 1,
 		tm_enable_defer	: 1,
 		tm_enabled	: 1,
@@ -263,9 +260,6 @@ struct isp_fc {
 	struct task gtask;
 #ifdef	ISP_TARGET_MODE
 	struct tslist lun_hash[LUN_HASH_SIZE];
-#ifdef	ISP_INTERNAL_TARGET
-	struct proc *		target_proc;
-#endif
 #if defined(DEBUG)
 	unsigned int inject_lost_data_frame;
 #endif
@@ -278,9 +272,6 @@ struct isp_spi {
 	struct cam_path *path;
 	uint32_t
 #ifdef	ISP_TARGET_MODE
-#ifdef	ISP_INTERNAL_TARGET
-		proc_active	: 1,
-#endif
 		tm_luns_enabled	: 1,
 		tm_enable_defer	: 1,
 		tm_enabled	: 1,
@@ -290,9 +281,6 @@ struct isp_spi {
 		iid		: 4;
 #ifdef	ISP_TARGET_MODE
 	struct tslist lun_hash[LUN_HASH_SIZE];
-#ifdef	ISP_INTERNAL_TARGET
-	struct proc *		target_proc;
-#endif
 #endif
 	int			num_threads;
 };


More information about the svn-src-all mailing list