Example #1
0
static void
ptinit(void)
{
	cam_status status;

	/*
	 * Create our extend array for storing the devices we attach to.
	 */
	ptperiphs = cam_extend_new();
	if (ptperiphs == NULL) {
		kprintf("pt: Failed to alloc extend array!\n");
		return;
	}
	
	/*
	 * Install a global async callback.  This callback will
	 * receive async callbacks like "new device found".
	 */
	status = xpt_register_async(AC_FOUND_DEVICE, ptasync, NULL, NULL);

	if (status != CAM_REQ_CMP) {
		kprintf("pt: Failed to attach master async callback "
		       "due to status 0x%x!\n", status);
	}
}
Example #2
0
static void
ptoninvalidate(struct cam_periph *periph)
{
	struct pt_softc *softc;
	struct bio *q_bio;
	struct buf *q_bp;

	softc = (struct pt_softc *)periph->softc;

	/*
	 * De-register any async callbacks.
	 */
	xpt_register_async(0, ptasync, periph, periph->path);

	softc->flags |= PT_FLAG_DEVICE_INVALID;

	/*
	 * Return all queued I/O with ENXIO.
	 * XXX Handle any transactions queued to the card
	 *     with XPT_ABORT_CCB.
	 */
	while ((q_bio = bioq_takefirst(&softc->bio_queue)) != NULL) {
		q_bp = q_bio->bio_buf;
		q_bp->b_resid = q_bp->b_bcount;
		q_bp->b_error = ENXIO;
		q_bp->b_flags |= B_ERROR;
		biodone(q_bio);
	}

	xpt_print(periph->path, "lost device\n");
}
Example #3
0
static cam_status
pmpregister(struct cam_periph *periph, void *arg)
{
	struct pmp_softc *softc;
	struct ccb_getdev *cgd;

	cgd = (struct ccb_getdev *)arg;
	if (periph == NULL) {
		printf("pmpregister: periph was NULL!!\n");
		return(CAM_REQ_CMP_ERR);
	}

	if (cgd == NULL) {
		printf("pmpregister: no getdev CCB, can't register device\n");
		return(CAM_REQ_CMP_ERR);
	}

	softc = (struct pmp_softc *)malloc(sizeof(*softc), M_DEVBUF,
	    M_NOWAIT|M_ZERO);

	if (softc == NULL) {
		printf("pmpregister: Unable to probe new device. "
		       "Unable to allocate softc\n");				
		return(CAM_REQ_CMP_ERR);
	}
	periph->softc = softc;

	softc->pm_pid = ((uint32_t *)&cgd->ident_data)[0];
	softc->pm_prv = ((uint32_t *)&cgd->ident_data)[1];
	TASK_INIT(&softc->sysctl_task, 0, pmpsysctlinit, periph);

	xpt_announce_periph(periph, NULL);

	/*
	 * Add async callbacks for bus reset and
	 * bus device reset calls.  I don't bother
	 * checking if this fails as, in most cases,
	 * the system will function just fine without
	 * them and the only alternative would be to
	 * not attach the device on failure.
	 */
	xpt_register_async(AC_SENT_BDR | AC_BUS_RESET | AC_LOST_DEVICE |
		AC_SCSI_AEN, pmpasync, periph, periph->path);

	/*
	 * Take an exclusive refcount on the periph while pmpstart is called
	 * to finish the probe.  The reference will be dropped in pmpdone at
	 * the end of probe.
	 */
	(void)cam_periph_acquire(periph);
	xpt_hold_boot();
	softc->state = PMP_STATE_PORTS;
	softc->events = PMP_EV_RESCAN;
	xpt_schedule(periph, CAM_PRIORITY_DEV);

	return(CAM_REQ_CMP);
}
Example #4
0
static cam_status
ptctor(struct cam_periph *periph, void *arg)
{
	struct pt_softc *softc;
	struct ccb_getdev *cgd;

	cgd = (struct ccb_getdev *)arg;
	if (periph == NULL) {
		kprintf("ptregister: periph was NULL!!\n");
		return(CAM_REQ_CMP_ERR);
	}

	if (cgd == NULL) {
		kprintf("ptregister: no getdev CCB, can't register device\n");
		return(CAM_REQ_CMP_ERR);
	}

	softc = kmalloc(sizeof(*softc), M_DEVBUF, M_INTWAIT | M_ZERO);
	LIST_INIT(&softc->pending_ccbs);
	softc->state = PT_STATE_NORMAL;
	bioq_init(&softc->bio_queue);

	softc->io_timeout = SCSI_PT_DEFAULT_TIMEOUT * 1000;

	periph->softc = softc;
	
	cam_periph_unlock(periph);
	cam_extend_set(ptperiphs, periph->unit_number, periph);

	devstat_add_entry(&softc->device_stats, "pt",
			  periph->unit_number, 0,
			  DEVSTAT_NO_BLOCKSIZE,
			  SID_TYPE(&cgd->inq_data) | DEVSTAT_TYPE_IF_SCSI,
			  DEVSTAT_PRIORITY_OTHER);

	make_dev(&pt_ops, periph->unit_number, UID_ROOT,
		  GID_OPERATOR, 0600, "%s%d", periph->periph_name,
		  periph->unit_number);
	cam_periph_lock(periph);
	/*
	 * Add async callbacks for bus reset and
	 * bus device reset calls.  I don't bother
	 * checking if this fails as, in most cases,
	 * the system will function just fine without
	 * them and the only alternative would be to
	 * not attach the device on failure.
	 */
	xpt_register_async(AC_SENT_BDR | AC_BUS_RESET | AC_LOST_DEVICE,
			   ptasync, periph, periph->path);

	/* Tell the user we've attached to the device */
	xpt_announce_periph(periph, NULL);

	return(CAM_REQ_CMP);
}
static void
ptinit(void)
{
	cam_status status;

	/*
	 * Install a global async callback.  This callback will
	 * receive async callbacks like "new device found".
	 */
	status = xpt_register_async(AC_FOUND_DEVICE, ptasync, NULL, NULL);

	if (status != CAM_REQ_CMP) {
		printf("pt: Failed to attach master async callback "
		       "due to status 0x%x!\n", status);
	}
}
Example #6
0
static void
pmponinvalidate(struct cam_periph *periph)
{
	struct cam_path *dpath;
	int i;

	/*
	 * De-register any async callbacks.
	 */
	xpt_register_async(0, pmpasync, periph, periph->path);

	for (i = 0; i < 15; i++) {
		if (xpt_create_path(&dpath, periph,
		    xpt_path_path_id(periph->path),
		    i, 0) == CAM_REQ_CMP) {
			xpt_async(AC_LOST_DEVICE, dpath, NULL);
			xpt_free_path(dpath);
		}
	}
	pmprelease(periph, -1);
}
Example #7
0
static void
ptoninvalidate(struct cam_periph *periph)
{
    struct pt_softc *softc;

    softc = (struct pt_softc *)periph->softc;

    /*
     * De-register any async callbacks.
     */
    xpt_register_async(0, ptasync, periph, periph->path);

    softc->flags |= PT_FLAG_DEVICE_INVALID;

    /*
     * Return all queued I/O with ENXIO.
     * XXX Handle any transactions queued to the card
     *     with XPT_ABORT_CCB.
     */
    bioq_flush(&softc->bio_queue, NULL, ENXIO);
}
Example #8
0
static cam_status
ptctor(struct cam_periph *periph, void *arg)
{
    struct pt_softc *softc;
    struct ccb_getdev *cgd;
    struct ccb_pathinq cpi;

    cgd = (struct ccb_getdev *)arg;
    if (cgd == NULL) {
        printf("ptregister: no getdev CCB, can't register device\n");
        return(CAM_REQ_CMP_ERR);
    }

    softc = (struct pt_softc *)malloc(sizeof(*softc),M_DEVBUF,M_NOWAIT);

    if (softc == NULL) {
        printf("daregister: Unable to probe new device. "
               "Unable to allocate softc\n");
        return(CAM_REQ_CMP_ERR);
    }

    bzero(softc, sizeof(*softc));
    LIST_INIT(&softc->pending_ccbs);
    softc->state = PT_STATE_NORMAL;
    bioq_init(&softc->bio_queue);

    softc->io_timeout = SCSI_PT_DEFAULT_TIMEOUT * 1000;

    periph->softc = softc;

    bzero(&cpi, sizeof(cpi));
    xpt_setup_ccb(&cpi.ccb_h, periph->path, CAM_PRIORITY_NORMAL);
    cpi.ccb_h.func_code = XPT_PATH_INQ;
    xpt_action((union ccb *)&cpi);

    cam_periph_unlock(periph);
    softc->device_stats = devstat_new_entry("pt",
                                            periph->unit_number, 0,
                                            DEVSTAT_NO_BLOCKSIZE,
                                            SID_TYPE(&cgd->inq_data) |
                                            XPORT_DEVSTAT_TYPE(cpi.transport),
                                            DEVSTAT_PRIORITY_OTHER);

    softc->dev = make_dev(&pt_cdevsw, periph->unit_number, UID_ROOT,
                          GID_OPERATOR, 0600, "%s%d", periph->periph_name,
                          periph->unit_number);
    cam_periph_lock(periph);
    softc->dev->si_drv1 = periph;

    /*
     * Add async callbacks for bus reset and
     * bus device reset calls.  I don't bother
     * checking if this fails as, in most cases,
     * the system will function just fine without
     * them and the only alternative would be to
     * not attach the device on failure.
     */
    xpt_register_async(AC_SENT_BDR | AC_BUS_RESET | AC_LOST_DEVICE,
                       ptasync, periph, periph->path);

    /* Tell the user we've attached to the device */
    xpt_announce_periph(periph, NULL);

    return(CAM_REQ_CMP);
}