/*===========================================================================* * 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; }
/*===========================================================================* * 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"); } } }
/*===========================================================================* * 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; }
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; }
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; }