/* * Must do 4 FD_SENSEIs after reset because of ``drive polling''. */ static void reset_interrupt(void) { short i; for (i=0; i<4; i++) { output_byte(FD_SENSEI); (void) result(); } output_byte(FD_SPECIFY); output_byte(cur_spec1); /* hut etc */ output_byte(6); /* Head load time =6ms, DMA */ configure_fdc_mode(); /* reprogram fdc */ if (initial_reset_flag) { initial_reset_flag = 0; recalibrate = 1; reset = 0; return; } if (!recover) redo_fd_request(); else { recalibrate_floppy(); recover = 0; } }
static void recal_interrupt(void) { output_byte(FD_SENSEI); current_track = NO_TRACK; if (result()!=2 || (ST0 & 0xE0) == 0x60) reset = 1; /* Recalibrate until track 0 is reached. Might help on some errors. */ if ((ST0 & 0x10) == 0x10) recalibrate_floppy(); else redo_fd_request(); }
static void floppy_on_interrupt(void) { if (inb(FD_DIR) & 0x80) { changed_floppies |= 1<<current_drive; buffer_track = -1; if (keep_data[current_drive]) { if (keep_data[current_drive] > 0) keep_data[current_drive]--; } else { if (ftd_msg[current_drive] && current_type[ current_drive] != NULL) printk("Disk type is undefined after disk " "change in fd%d\r\n",current_drive); current_type[current_drive] = NULL; floppy_sizes[current_drive] = MAX_DISK_SIZE; } /* Forcing the drive to seek makes the "media changed" condition go away. * There should be a cleaner solution for that ... */ if (!reset && !recalibrate) { do_floppy = (current_track && current_track != NO_TRACK) ? shake_zero : shake_one; output_byte(FD_RECALIBRATE); output_byte(head<<2 | current_drive); return; } } if (reset) { reset_floppy(); return; } if (recalibrate) { recalibrate_floppy(); return; } /* We cannot do a floppy-select, as that might sleep. We just force it */ selected = 1; if (current_drive != (current_DOR & 3)) { seek = 1; current_track = NO_TRACK; current_DOR &= 0xFC; current_DOR |= current_drive; outb(current_DOR,FD_DOR); add_timer(2,&transfer); } else transfer(); }
static void floppy_ready(void) { if (inb(FDC_DIR) & 0x80) { changed_floppies |= 1<<current_drive; buffer_track = -1; if (keep_data[current_drive]) { if (keep_data[current_drive] > 0) keep_data[current_drive]--; } else { if (ftd_msg[current_drive] && current_type[current_drive] != NULL) printk("Disk type is undefined after disk " "change in fd%d\n",current_drive); current_type[current_drive] = NULL; floppy_sizes[current_drive] = MAX_DISK_SIZE; } /* Forcing the drive to seek makes the "media changed" condition go away. * There should be a cleaner solution for that ... */ if (!reset && !recalibrate) { if (current_track && current_track != NO_TRACK) { do_floppy = shake_zero; } else { do_floppy = shake_one; } output_byte(FD_RECALIBRATE); output_byte(head<<2 | current_drive); return; } } if (reset) { reset_floppy(); return; } if (recalibrate) { recalibrate_floppy(); return; } transfer(); }