-/* Recalibrate and wait until home.
- */
-int fdc_recalibrate(void)
-{
- __u8 out[2];
- int st0;
- int pcn;
- int retry;
- int old_seek_rate = fdc_seek_rate;
- TRACE_FUN(ft_t_any);
-
- TRACE_CATCH(fdc_set_seek_rate(6),);
- out[0] = FDC_RECAL;
- out[1] = ft_drive_sel;
- ft_seek_completed = 0;
- TRACE_CATCH(fdc_command(out, 2),);
- /* Handle interrupts until ft_seek_completed or timeout.
- */
- for (retry = 0;; ++retry) {
- TRACE_CATCH(fdc_interrupt_wait(2 * FT_SECOND),);
- if (ft_seek_completed) {
- TRACE_CATCH(fdc_sense_interrupt_status(&st0, &pcn),);
- if ((st0 & ST0_SEEK_END) == 0) {
- if (retry < 1) {
- continue; /* some drives/fdc's
- * give an extra interrupt
- */
- } else {
- TRACE_ABORT(-EIO, ft_t_err,
- "no seek-end after seek completion !??");
- }
- }
- break;
- }
- }
- ftape_current_cylinder = pcn;
- if (pcn != 0) {
- TRACE(ft_t_err, "failed: resulting track = %d", pcn);
- }
- TRACE_CATCH(fdc_set_seek_rate(old_seek_rate),);
- TRACE_EXIT 0;
-}
-