int tries;
uint8_t err = 0;
uint8_t *driveptr = fd_tab + minor;
- uint8_t cmd[6];
+ uint8_t cmd[7];
if(rawflag)
- goto bad2;
+ if (d_blkoff(9))
+ return -1;
if (fd_selected != minor) {
uint8_t err;
if (*driveptr == 0xFF)
fd_reset(driveptr);
- dptr = (uint16_t)udata.u_buf->bf_data;
- block = udata.u_buf->bf_blk;
-
- cmd[0] = is_read ? FD_READ : FD_WRITE;
- /* Double sided assumed FIXME */
- cmd[1] = block / 20;
- /* floppy.s will sort the side out */
- cmd[2] = ((block % 20) << 1) + 1;
- cmd[3] = is_read ? OPDIR_READ: OPDIR_WRITE;
- cmd[4] = dptr & 0xFF;
- cmd[5] = dptr >> 8;
-
- for (tries = 0; tries < 4 ; tries++) {
- err = fd_operation(cmd, driveptr);
- if (err == 0)
- break;
- if (tries > 1)
- fd_reset(driveptr);
- }
- if (tries != 4)
- return 1;
+ dptr = (uint16_t)udata.u_dptr;
+ block = udata.u_block;
+
+ while(ct < udata.u_nblock) {
+ cmd[0] = is_read ? FD_READ : FD_WRITE;
+ /* Double sided assumed FIXME */
+ cmd[1] = block / 20;
+ /* floppy.s will sort the side out */
+ cmd[2] = ((block % 20) << 1) + 1;
+ cmd[3] = is_read ? OPDIR_READ: OPDIR_WRITE;
+ cmd[4] = dptr & 0xFF;
+ cmd[5] = dptr >> 8;
+ cmd[6] = rawflag;
+
+ for (tries = 0; tries < 4 ; tries++) {
+ err = fd_operation(cmd, driveptr);
+ if (err == 0)
+ break;
+ if (tries > 1)
+ fd_reset(driveptr);
+ }
+ if (tries == 4)
+ goto bad;
+ udata.u_block++;
+ udata.u_dptr += 512;
+ ct++;
+ }
+ return ct << BLKSHIFT;
bad:
kprintf("fd%d: error %x\n", minor, err);
-bad2:
udata.u_error = EIO;
return -1;
}
static int hd_transfer(uint8_t minor, bool is_read, uint8_t rawflag)
{
- blkno_t block;
uint16_t dptr;
uint16_t ct = 0;
int tries;
uint8_t cmd = HDCMD_READ;
uint8_t head;
uint8_t sector;
- uint16_t nblock;
-
- if (rawflag == 0) {
- dptr = (uint16_t)udata.u_buf->bf_data;
- block = udata.u_buf->bf_blk;
- nblock = 1;
- hd_page = 0; /* Kernel */
- } else if (rawflag == 2) {
- nblock = swapcnt >> 9; /* in 512 byte chunks */
- dptr = (uint16_t)swapbase;
- hd_page = swappage;
- block = swapblk;
- } else
- goto bad2;
+
+ if (rawflag) {
+ if (rawflag == 1) {
+ if (d_blkoff(9))
+ return -1;
+ /* TODO */
+ hd_page = 0xFF;
+ } else {
+ hd_page = swappage;
+ }
+ }
+
+ dptr = (uint16_t)udata.u_dptr;
if (!is_read)
cmd = HDCMD_WRITE;
/* We don't touch precomp and hope the firmware set it right */
hd_seccnt = 1;
- while (ct < nblock) {
- uint16_t b = block / spt[minor];
- sector = block % spt[minor];
+ while (ct < udata.u_nblock) {
+ uint16_t b = udata.u_block / spt[minor];
+ sector = udata.u_block % spt[minor];
head = b % heads[minor];
if (minor < MAX_HD) {
/* ECC, 512 bytes, head and drive */
goto bad;
ct++;
dptr += 512;
- block ++;
+ udata.u_block ++;
}
- return 1;
+ return ct << BLKSHIFT;
bad:
if (err & 1)
kprintf("hd%d: error %x\n", minor, hd_err);