version 1.28.2.5, 2007/12/03 18:34:27 |
version 1.29, 2007/07/09 20:51:59 |
Line 519 fdattach(parent, self, aux) |
|
Line 519 fdattach(parent, self, aux) |
|
/* |
/* |
* Initialize and attach the disk structure. |
* Initialize and attach the disk structure. |
*/ |
*/ |
disk_init(&fd->sc_dk, fd->sc_dev.dv_xname, &fddkdriver); |
fd->sc_dk.dk_name = fd->sc_dev.dv_xname; |
|
fd->sc_dk.dk_driver = &fddkdriver; |
disk_attach(&fd->sc_dk); |
disk_attach(&fd->sc_dk); |
|
|
/* Needed to power off if the motor is on when we halt. */ |
/* Needed to power off if the motor is on when we halt. */ |
|
|
((bp->b_bcount % FDC_BSIZE) != 0 && |
((bp->b_bcount % FDC_BSIZE) != 0 && |
(bp->b_flags & B_FORMAT) == 0)) { |
(bp->b_flags & B_FORMAT) == 0)) { |
bp->b_error = EINVAL; |
bp->b_error = EINVAL; |
goto done; |
goto bad; |
} |
} |
|
|
/* If it's a null transfer, return immediately. */ |
/* If it's a null transfer, return immediately. */ |
|
|
if (sz < 0) { |
if (sz < 0) { |
/* If past end of disk, return EINVAL. */ |
/* If past end of disk, return EINVAL. */ |
bp->b_error = EINVAL; |
bp->b_error = EINVAL; |
goto done; |
goto bad; |
} |
} |
/* Otherwise, truncate request. */ |
/* Otherwise, truncate request. */ |
bp->b_bcount = sz << DEV_BSHIFT; |
bp->b_bcount = sz << DEV_BSHIFT; |
|
|
splx(s); |
splx(s); |
return; |
return; |
|
|
|
bad: |
|
bp->b_flags |= B_ERROR; |
done: |
done: |
/* Toss transfer; we're done early. */ |
/* Toss transfer; we're done early. */ |
bp->b_resid = bp->b_bcount; |
bp->b_resid = bp->b_bcount; |
|
|
fdc->sc_fh.fh_regs = &fdc->sc_fr; |
fdc->sc_fh.fh_regs = &fdc->sc_fr; |
fdc->sc_fr.fr_r9 = IOMD_BASE + (IOMD_FIQRQ << 2); |
fdc->sc_fr.fr_r9 = IOMD_BASE + (IOMD_FIQRQ << 2); |
fdc->sc_fr.fr_r10 = fd->sc_nbytes; |
fdc->sc_fr.fr_r10 = fd->sc_nbytes; |
fdc->sc_fr.fr_r11 = |
fdc->sc_fr.fr_r11 = (u_int)(bp->b_data + fd->sc_skip); |
(u_int)((uintptr_t)bp->b_data + fd->sc_skip); |
|
fdc->sc_fr.fr_r12 = fdc->sc_drq; |
fdc->sc_fr.fr_r12 = fdc->sc_drq; |
#ifdef FD_DEBUG |
#ifdef FD_DEBUG |
printf("fdc-doio:r9=%x r10=%x r11=%x r12=%x data=%x skip=%x\n", |
printf("fdc-doio:r9=%x r10=%x r11=%x r12=%x data=%x skip=%x\n", |
|
|
fdc->sc_status[5]); |
fdc->sc_status[5]); |
} |
} |
|
|
|
bp->b_flags |= B_ERROR; |
bp->b_error = EIO; |
bp->b_error = EIO; |
fdfinish(fd, bp); |
fdfinish(fd, bp); |
} |
} |
Line 1552 fdformat(dev, finfo, l) |
|
Line 1555 fdformat(dev, finfo, l) |
|
/* timed out */ |
/* timed out */ |
rv = EIO; |
rv = EIO; |
biodone(bp); |
biodone(bp); |
} else if (bp->b_error != 0) |
} |
|
if(bp->b_flags & B_ERROR) { |
rv = bp->b_error; |
rv = bp->b_error; |
|
} |
free(bp, M_TEMP); |
free(bp, M_TEMP); |
return rv; |
return rv; |
} |
} |
Line 1606 load_memory_disc_from_floppy(md, dev) |
|
Line 1611 load_memory_disc_from_floppy(md, dev) |
|
s = spl0(); |
s = spl0(); |
|
|
if (fdopen(bp->b_dev, 0, 0, curlwp) != 0) { |
if (fdopen(bp->b_dev, 0, 0, curlwp) != 0) { |
brelse(bp, 0); |
brelse(bp); |
printf("Cannot open floppy device\n"); |
printf("Cannot open floppy device\n"); |
return(EINVAL); |
return(EINVAL); |
} |
} |
Line 1626 load_memory_disc_from_floppy(md, dev) |
|
Line 1631 load_memory_disc_from_floppy(md, dev) |
|
if (biowait(bp)) |
if (biowait(bp)) |
panic("Cannot load floppy image"); |
panic("Cannot load floppy image"); |
|
|
memcpy((char *)md->md_addr + loop * fd_types[type].sectrac |
memcpy((void *)md->md_addr + loop * fd_types[type].sectrac |
* DEV_BSIZE, (void *)bp->b_data, |
* DEV_BSIZE, (void *)bp->b_data, |
fd_types[type].sectrac * DEV_BSIZE); |
fd_types[type].sectrac * DEV_BSIZE); |
} |
} |
Line 1635 load_memory_disc_from_floppy(md, dev) |
|
Line 1640 load_memory_disc_from_floppy(md, dev) |
|
|
|
fdclose(bp->b_dev, 0, 0, curlwp); |
fdclose(bp->b_dev, 0, 0, curlwp); |
|
|
brelse(bp, 0); |
brelse(bp); |
|
|
splx(s); |
splx(s); |
return(0); |
return(0); |