/* * This routine is called when everything should be correctly set up * for the transfer (ie floppy motor is on and the correct floppy is * selected). */ static void transfer(void) { read_track = (command == FD_READ) && (CURRENT_ERRORS < 4) && (floppy->sect <= MAX_BUFFER_SECTORS); configure_fdc_mode(); if (reset) { redo_fd_request(); return; } if (!seek) { setup_rw_floppy(); return; } do_floppy = seek_interrupt; output_byte(FD_SEEK); if (read_track) output_byte(current_drive); else output_byte((head<<2) | current_drive); output_byte(seek_track); if (reset) redo_fd_request(); }
/* * This routine is called when everything should be correctly set up * for the transfer (ie floppy motor is on and the correct floppy is * selected). */ static void transfer(void) { read_track = (command == FD_READ) && (CURRENT_ERRORS < 4) && (floppy->sect <= MAX_BUFFER_SECTORS); if (cur_spec1 != floppy->spec1) { cur_spec1 = floppy->spec1; output_byte(FD_SPECIFY); output_byte(cur_spec1); /* hut etc */ output_byte(6); /* Head load time =6ms, DMA */ } if (cur_rate != floppy->rate) { /* use bit 6 of floppy->rate to indicate perpendicular mode */ perpendicular_mode(floppy->rate); outb_p(cur_rate = ((floppy->rate)) & ~0x40, FD_DCR); } if (reset) { redo_fd_request(); return; } if (!seek) { setup_rw_floppy(); return; } do_floppy = seek_interrupt; output_byte(FD_SEEK); if (read_track) output_byte(current_drive); else output_byte((head<<2) | current_drive); output_byte(seek_track); if (reset) redo_fd_request(); }
/* * This is the routine called after every seek (or recalibrate) interrupt * from the floppy controller. Note that the "unexpected interrupt" routine * also does a recalibrate, but doesn't come here. */ static void seek_interrupt(void) { /* sense drive status */ output_byte(FD_SENSEI); if (result() != 2 || (ST0 & 0xF8) != 0x20 || ST1 != seek_track) { printk(DEVICE_NAME ": seek failed\n"); recalibrate = 1; bad_flp_intr(); redo_fd_request(); return; } current_track = ST1; setup_rw_floppy(); }