Пример #1
0
/*===========================================================================*
 *				do_vrdwt				     *
 *===========================================================================*/
static int do_vrdwt(int flag_rw)
{
	size_t size, size_ret;
	int grants;
	int r, i;
	u64_t pos;
	iovec_t iov_proc[NR_IOREQS];

	/* Extract informations. */
	grants = m_in.BDEV_COUNT;
	if((r = sys_safecopyfrom(who_e, grant_id, 0, (vir_bytes) iov_proc,
		grants * sizeof(iovec_t))) != OK) {
		panic("copying in grant vector failed: %d", r);
	}

	pos = make64(m_in.BDEV_POS_LO, m_in.BDEV_POS_HI);
	for(size = 0, i = 0; i < grants; i++)
		size += iov_proc[i].iov_size;

	if (rem64u(pos, SECTOR_SIZE) != 0 || size % SECTOR_SIZE != 0) {
		printf("Filter: unaligned request from caller!\n");
		return EINVAL;
	}

	buffer = flt_malloc(size, buf_array, BUF_SIZE);

	if(flag_rw == FLT_WRITE)
		vcarry(grants, iov_proc, flag_rw, size);

	reset_kills();

	for (;;) {
		size_ret = size;
		r = transfer(pos, buffer, &size_ret, flag_rw);
		if(r != RET_REDO)
			break;

#if DEBUG
		printf("Filter: transfer yielded RET_REDO, checking drivers\n");
#endif
		if((r = check_driver(DRIVER_MAIN)) != OK) break;
		if((r = check_driver(DRIVER_BACKUP)) != OK) break;
	}

	if(r != OK) {
		flt_free(buffer, size, buf_array);
		return r;
	}

	if(flag_rw == FLT_READ)
		vcarry(grants, iov_proc, flag_rw, size_ret);

	flt_free(buffer, size, buf_array);

	return size_ret;
}
Пример #2
0
/*===========================================================================*
 *				driver_init				     *
 *===========================================================================*/
void driver_init(void)
{
    /* Initialize the driver layer. */
    int r;

    memset(driver, 0, sizeof(driver));

    /* Endpoints unknown. */
    driver[DRIVER_MAIN].endpt = NONE;
    driver[DRIVER_BACKUP].endpt = NONE;

    /* Get disk driver's and this proc's endpoint. */
    driver[DRIVER_MAIN].label = MAIN_LABEL;
    driver[DRIVER_MAIN].minor = MAIN_MINOR;

    /* No up received yet but expected when the driver starts. */
    driver[DRIVER_MAIN].up_event = UP_EXPECTED;
    driver[DRIVER_BACKUP].up_event = UP_EXPECTED;

    r = ds_retrieve_label_endpt(driver[DRIVER_MAIN].label,
                                &driver[DRIVER_MAIN].endpt);
    if (r != OK) {
        printf("Filter: failed to get main disk driver's endpoint: "
               "%d\n", r);
        bad_driver(DRIVER_MAIN, BD_DEAD, EFAULT);
        check_driver(DRIVER_MAIN);
    }
    else if (driver_open(DRIVER_MAIN) != OK) {
        panic("unhandled driver_open failure");
    }

    if(USE_MIRROR) {
        driver[DRIVER_BACKUP].label = BACKUP_LABEL;
        driver[DRIVER_BACKUP].minor = BACKUP_MINOR;

        if(!strcmp(driver[DRIVER_MAIN].label,
                   driver[DRIVER_BACKUP].label)) {
            panic("same driver: not tested");
        }

        r = ds_retrieve_label_endpt(driver[DRIVER_BACKUP].label,
                                    &driver[DRIVER_BACKUP].endpt);
        if (r != OK) {
            printf("Filter: failed to get backup disk driver's "
                   "endpoint: %d\n", r);
            bad_driver(DRIVER_BACKUP, BD_DEAD, EFAULT);
            check_driver(DRIVER_BACKUP);
        }
        else if (driver_open(DRIVER_BACKUP) != OK) {
            panic("unhandled driver_open failure");
        }
    }
}
Пример #3
0
/*===========================================================================*
 *				do_rdwt					     *
 *===========================================================================*/
static int do_rdwt(int flag_rw)
{
	size_t size, size_ret;
	u64_t pos;
	int r;

	pos = make64(m_in.BDEV_POS_LO, m_in.BDEV_POS_HI);
	size = m_in.BDEV_COUNT;

	if (rem64u(pos, SECTOR_SIZE) != 0 || size % SECTOR_SIZE != 0) {
		printf("Filter: unaligned request from caller!\n");

		return EINVAL;
	}

	buffer = flt_malloc(size, buf_array, BUF_SIZE);

	if(flag_rw == FLT_WRITE)
		carry(size, flag_rw);

	reset_kills();

	for (;;) {
		size_ret = size;
		r = transfer(pos, buffer, &size_ret, flag_rw);
		if(r != RET_REDO)
			break;

#if DEBUG
		printf("Filter: transfer yielded RET_REDO, checking drivers\n");
#endif
		if((r = check_driver(DRIVER_MAIN)) != OK) break;
		if((r = check_driver(DRIVER_BACKUP)) != OK) break;
	}

	if(r == OK && flag_rw == FLT_READ)
		carry(size_ret, flag_rw);

	flt_free(buffer, size, buf_array);

	if (r != OK)
		return r;

	return size_ret;
}
Пример #4
0
snk_module_t* veth_module_init(snk_kernel_t *snk_kernel_int, vio_config_t *conf)
{
	snk_kernel_interface = snk_kernel_int;
	snk_module_interface = &veth_interface;

	if (snk_kernel_int->version != snk_module_interface->version)
		return 0;

	/* Check if this is the right driver */
	if (check_driver(conf) < 0)
		return 0;

	snk_module_interface->link_addr = module_init;
	return snk_module_interface;
}
Пример #5
0
int DMAbuf_open(int dev, int mode)
{
	struct audio_operations *adev = audio_devs[dev];
	int retval;
	struct dma_buffparms *dmap_in = NULL;
	struct dma_buffparms *dmap_out = NULL;

	if (!adev)
		  return -ENXIO;
	if (!(adev->flags & DMA_DUPLEX))
		adev->dmap_in = adev->dmap_out;
	check_driver(adev->d);

	if ((retval = adev->d->open(dev, mode)) < 0)
		return retval;
	dmap_out = adev->dmap_out;
	dmap_in = adev->dmap_in;
	if (dmap_in == dmap_out)
		adev->flags &= ~DMA_DUPLEX;

	if (mode & OPEN_WRITE) {
		if ((retval = open_dmap(adev, mode, dmap_out)) < 0) {
			adev->d->close(dev);
			return retval;
		}
	}
	adev->enable_bits = mode;

	if (mode == OPEN_READ || (mode != OPEN_WRITE && (adev->flags & DMA_DUPLEX))) {
		if ((retval = open_dmap(adev, mode, dmap_in)) < 0) {
			adev->d->close(dev);
			if (mode & OPEN_WRITE)
				close_dmap(adev, dmap_out);
			return retval;
		}
	}
	adev->open_mode = mode;
	adev->go = 1;

	adev->d->set_bits(dev, 8);
	adev->d->set_channels(dev, 1);
	adev->d->set_speed(dev, DSP_DEFAULT_SPEED);
	if (adev->dmap_out->dma_mode == DMODE_OUTPUT) 
		memset(adev->dmap_out->raw_buf, adev->dmap_out->neutral_byte,
		       adev->dmap_out->bytes_in_use);
	return 0;
}