Lines Matching refs:fdc
235 static int set_dor(int fdc, char mask, char data);
306 #define REVDRIVE(fdc, unit) ((unit) + ((fdc) << 2)) argument
596 static inline unsigned char fdc_inb(int fdc, int reg) in fdc_inb() argument
598 return fd_inb(fdc_state[fdc].address, reg); in fdc_inb()
601 static inline void fdc_outb(unsigned char value, int fdc, int reg) in fdc_outb() argument
603 fd_outb(value, fdc_state[fdc].address, reg); in fdc_outb()
736 int fdc = FDC(drive); in disk_change() local
740 if (!(fdc_state[fdc].dor & (0x10 << UNIT(drive))) || in disk_change()
741 (fdc_state[fdc].dor & 3) != UNIT(drive) || fdc != FDC(drive)) { in disk_change()
744 (unsigned int)fdc_state[fdc].dor); in disk_change()
751 fdc_inb(fdc, FD_DIR) & 0x80); in disk_change()
758 if ((fdc_inb(fdc, FD_DIR) ^ drive_params[drive].flags) & 0x80) { in disk_change()
794 static int set_dor(int fdc, char mask, char data) in set_dor() argument
801 if (fdc_state[fdc].address == -1) in set_dor()
804 olddor = fdc_state[fdc].dor; in set_dor()
809 drive = REVDRIVE(fdc, unit); in set_dor()
814 fdc_state[fdc].dor = newdor; in set_dor()
815 fdc_outb(newdor, fdc, FD_DOR); in set_dor()
819 drive = REVDRIVE(fdc, unit); in set_dor()
826 static void twaddle(int fdc, int drive) in twaddle() argument
830 fdc_outb(fdc_state[fdc].dor & ~(0x10 << UNIT(drive)), in twaddle()
831 fdc, FD_DOR); in twaddle()
832 fdc_outb(fdc_state[fdc].dor, fdc, FD_DOR); in twaddle()
840 static void reset_fdc_info(int fdc, int mode) in reset_fdc_info() argument
844 fdc_state[fdc].spec1 = fdc_state[fdc].spec2 = -1; in reset_fdc_info()
845 fdc_state[fdc].need_configure = 1; in reset_fdc_info()
846 fdc_state[fdc].perp_mode = 1; in reset_fdc_info()
847 fdc_state[fdc].rawcmd = 0; in reset_fdc_info()
849 if (FDC(drive) == fdc && in reset_fdc_info()
860 unsigned int fdc; in set_fdc() local
867 fdc = FDC(drive); in set_fdc()
868 if (fdc >= N_FDC) { in set_fdc()
873 set_dor(fdc, ~0, 8); in set_fdc()
875 set_dor(1 - fdc, ~8, 0); in set_fdc()
877 if (fdc_state[fdc].rawcmd == 2) in set_fdc()
878 reset_fdc_info(fdc, 1); in set_fdc()
879 if (fdc_inb(fdc, FD_STATUS) != STATUS_READY) in set_fdc()
880 fdc_state[fdc].reset = 1; in set_fdc()
883 current_fdc = fdc; in set_fdc()
937 int fdc = FDC(drive); in floppy_off() local
939 if (!(fdc_state[fdc].dor & (0x10 << UNIT(drive)))) in floppy_off()
1111 static void show_floppy(int fdc);
1114 static int wait_til_ready(int fdc) in wait_til_ready() argument
1119 if (fdc_state[fdc].reset) in wait_til_ready()
1122 status = fdc_inb(fdc, FD_STATUS); in wait_til_ready()
1127 DPRINT("Getstatus times out (%x) on fdc %d\n", status, fdc); in wait_til_ready()
1128 show_floppy(fdc); in wait_til_ready()
1130 fdc_state[fdc].reset = 1; in wait_til_ready()
1135 static int output_byte(int fdc, char byte) in output_byte() argument
1137 int status = wait_til_ready(fdc); in output_byte()
1143 fdc_outb(byte, fdc, FD_DATA); in output_byte()
1150 fdc_state[fdc].reset = 1; in output_byte()
1153 byte, fdc, status); in output_byte()
1154 show_floppy(fdc); in output_byte()
1160 static int result(int fdc) in result() argument
1166 status = wait_til_ready(fdc); in result()
1176 reply_buffer[i] = fdc_inb(fdc, FD_DATA); in result()
1182 fdc, status, i); in result()
1183 show_floppy(fdc); in result()
1185 fdc_state[fdc].reset = 1; in result()
1191 static int need_more_output(int fdc) in need_more_output() argument
1193 int status = wait_til_ready(fdc); in need_more_output()
1201 return result(fdc); in need_more_output()
1207 static void perpendicular_mode(int fdc) in perpendicular_mode() argument
1222 fdc_state[fdc].reset = 1; in perpendicular_mode()
1233 if (fdc_state[fdc].perp_mode == perp_mode) in perpendicular_mode()
1235 if (fdc_state[fdc].version >= FDC_82077_ORIG) { in perpendicular_mode()
1236 output_byte(fdc, FD_PERPENDICULAR); in perpendicular_mode()
1237 output_byte(fdc, perp_mode); in perpendicular_mode()
1238 fdc_state[fdc].perp_mode = perp_mode; in perpendicular_mode()
1247 static int fdc_configure(int fdc) in fdc_configure() argument
1250 output_byte(fdc, FD_CONFIGURE); in fdc_configure()
1251 if (need_more_output(fdc) != MORE_OUTPUT) in fdc_configure()
1253 output_byte(fdc, 0); in fdc_configure()
1254 output_byte(fdc, 0x10 | (no_fifo & 0x20) | (fifo_depth & 0xf)); in fdc_configure()
1255 output_byte(fdc, 0); /* pre-compensation from track 0 upwards */ in fdc_configure()
1280 static void fdc_specify(int fdc, int drive) in fdc_specify() argument
1292 if (fdc_state[fdc].need_configure && in fdc_specify()
1293 fdc_state[fdc].version >= FDC_82072A) { in fdc_specify()
1294 fdc_configure(fdc); in fdc_specify()
1295 fdc_state[fdc].need_configure = 0; in fdc_specify()
1304 if (fdc_state[fdc].version >= FDC_82078) { in fdc_specify()
1307 output_byte(fdc, FD_DRIVESPEC); in fdc_specify()
1308 if (need_more_output(fdc) == MORE_OUTPUT) { in fdc_specify()
1309 output_byte(fdc, UNIT(drive)); in fdc_specify()
1310 output_byte(fdc, 0xc0); in fdc_specify()
1319 if (fdc_state[fdc].version >= FDC_82072) { in fdc_specify()
1352 if (fdc_state[fdc].spec1 != spec1 || in fdc_specify()
1353 fdc_state[fdc].spec2 != spec2) { in fdc_specify()
1355 output_byte(fdc, FD_SPECIFY); in fdc_specify()
1356 output_byte(fdc, fdc_state[fdc].spec1 = spec1); in fdc_specify()
1357 output_byte(fdc, fdc_state[fdc].spec2 = spec2); in fdc_specify()
1568 static void check_wp(int fdc, int drive) in check_wp() argument
1572 output_byte(fdc, FD_GETSTATUS); in check_wp()
1573 output_byte(fdc, UNIT(drive)); in check_wp()
1574 if (result(fdc) != 1) { in check_wp()
1575 fdc_state[fdc].reset = 1; in check_wp()
1827 static void show_floppy(int fdc) in show_floppy() argument
1850 pr_info("status=%x\n", fdc_inb(fdc, FD_STATUS)); in show_floppy()
4309 static char __init get_fdc_version(int fdc) in get_fdc_version() argument
4313 output_byte(fdc, FD_DUMPREGS); /* 82072 and better know DUMPREGS */ in get_fdc_version()
4314 if (fdc_state[fdc].reset) in get_fdc_version()
4316 r = result(fdc); in get_fdc_version()
4320 pr_info("FDC %d is an 8272A\n", fdc); in get_fdc_version()
4325 fdc, r); in get_fdc_version()
4329 if (!fdc_configure(fdc)) { in get_fdc_version()
4330 pr_info("FDC %d is an 82072\n", fdc); in get_fdc_version()
4334 output_byte(fdc, FD_PERPENDICULAR); in get_fdc_version()
4335 if (need_more_output(fdc) == MORE_OUTPUT) { in get_fdc_version()
4336 output_byte(fdc, 0); in get_fdc_version()
4338 pr_info("FDC %d is an 82072A\n", fdc); in get_fdc_version()
4342 output_byte(fdc, FD_UNLOCK); in get_fdc_version()
4343 r = result(fdc); in get_fdc_version()
4345 pr_info("FDC %d is a pre-1991 82077\n", fdc); in get_fdc_version()
4351 fdc, r); in get_fdc_version()
4354 output_byte(fdc, FD_PARTID); in get_fdc_version()
4355 r = result(fdc); in get_fdc_version()
4358 fdc, r); in get_fdc_version()
4362 pr_info("FDC %d is a post-1991 82077\n", fdc); in get_fdc_version()
4368 pr_info("FDC %d is an 82078.\n", fdc); in get_fdc_version()
4371 pr_info("FDC %d is a 44pin 82078\n", fdc); in get_fdc_version()
4374 pr_info("FDC %d is a S82078B\n", fdc); in get_fdc_version()
4377 pr_info("FDC %d is a National Semiconductor PC87306\n", fdc); in get_fdc_version()
4381 fdc, reply_buffer[0] >> 5); in get_fdc_version()
4544 int fdc; in floppy_resume() local
4548 for (fdc = 0; fdc < N_FDC; fdc++) in floppy_resume()
4549 if (fdc_state[fdc].address != -1) in floppy_resume()
4550 user_reset_fdc(REVDRIVE(fdc, 0), FD_RESET_ALWAYS, false); in floppy_resume()
4833 static void floppy_release_allocated_regions(int fdc, const struct io_region *p) in floppy_release_allocated_regions() argument
4837 release_region(fdc_state[fdc].address + p->offset, p->size); in floppy_release_allocated_regions()
4843 static int floppy_request_regions(int fdc) in floppy_request_regions() argument
4848 if (!request_region(fdc_state[fdc].address + p->offset, in floppy_request_regions()
4851 fdc_state[fdc].address + p->offset); in floppy_request_regions()
4852 floppy_release_allocated_regions(fdc, p); in floppy_request_regions()
4859 static void floppy_release_regions(int fdc) in floppy_release_regions() argument
4861 floppy_release_allocated_regions(fdc, ARRAY_END(io_regions)); in floppy_release_regions()
4866 int fdc; in floppy_grab_irq_and_dma() local
4895 for (fdc = 0; fdc < N_FDC; fdc++) { in floppy_grab_irq_and_dma()
4896 if (fdc_state[fdc].address != -1) { in floppy_grab_irq_and_dma()
4897 if (floppy_request_regions(fdc)) in floppy_grab_irq_and_dma()
4901 for (fdc = 0; fdc < N_FDC; fdc++) { in floppy_grab_irq_and_dma()
4902 if (fdc_state[fdc].address != -1) { in floppy_grab_irq_and_dma()
4903 reset_fdc_info(fdc, 1); in floppy_grab_irq_and_dma()
4904 fdc_outb(fdc_state[fdc].dor, fdc, FD_DOR); in floppy_grab_irq_and_dma()
4910 for (fdc = 0; fdc < N_FDC; fdc++) in floppy_grab_irq_and_dma()
4911 if (fdc_state[fdc].address != -1) in floppy_grab_irq_and_dma()
4912 fdc_outb(fdc_state[fdc].dor, fdc, FD_DOR); in floppy_grab_irq_and_dma()
4923 while (--fdc >= 0) in floppy_grab_irq_and_dma()
4924 floppy_release_regions(fdc); in floppy_grab_irq_and_dma()
4932 int fdc; in floppy_release_irq_and_dma() local
4973 for (fdc = 0; fdc < N_FDC; fdc++) in floppy_release_irq_and_dma()
4974 if (fdc_state[fdc].address != -1) in floppy_release_irq_and_dma()
4975 floppy_release_regions(fdc); in floppy_release_irq_and_dma()