int ramdisk_transfer(bool is_read, uint8_t minor, uint8_t rawflag)
{
blkno_t block;
- int block_xfer; /* r/w return value (number of 512 byte blocks transferred) */
- char *dptr;
- int dlen;
uint16_t addr;
- if(rawflag){
- dlen = udata.u_count;
- dptr = udata.u_base;
- block = udata.u_offset >> 9;
- block_xfer = dlen >> 9;
- }else{ /* rawflag == 0 */
- dlen = 512;
- dptr = udata.u_buf->bf_data;
- block = udata.u_buf->bf_blk;
- block_xfer = 1;
+ if (rawflag) {
+ if (d_blkoff(9))
+ return -1;
}
+ block = udata.u_block;
+
if(block > (2 * 1024 * 2)){ /* > 2MB? */
udata.u_error = EIO;
return -1;
}
- switch(minor){
- case 0:
- block += (4 * 1024 * 2); /* rd0 at 4MB */
- break;
- case 1:
- block += (6 * 1024 * 2); /* rd1 at 6MB */
- break;
- default:
- udata.u_error = ENXIO;
- return -1;
- }
+ if (minor == 0)
+ block += (4 * 1024 * 2); /* rd0 at 4MB */
+ else
+ block += (6 * 1024 * 2); /* rd1 at 6MB */
/* compute address in 256-byte chunks */
addr = block << 1;
/* FIXME Should be able to avoid the __critical once bank switching is fixed */
__critical {
- rd_dlen = dlen;
- rd_dptr = dptr;
+ rd_dlen = udata.u_nblock << 9;
+ rd_dptr = udata.u_dptr;
rd_address = addr;
if(is_read)
ramdisk_read();
ramdisk_write();
}
- return block_xfer;
+ return udata.u_nblock << BLKSHIFT;
}
if(minor < NUM_DEV_RD){
return 0;
} else {
- udata.u_error = EIO;
+ udata.u_error = ENXIO;
return -1;
}
}