Lines Matching refs:fdc
234 static int set_dor(int fdc, char mask, char data);
303 #define REVDRIVE(fdc, unit) ((unit) + ((fdc) << 2)) argument
592 static inline unsigned char fdc_inb(int fdc, int reg) in fdc_inb() argument
594 return fd_inb(fdc_state[fdc].address, reg); in fdc_inb()
597 static inline void fdc_outb(unsigned char value, int fdc, int reg) in fdc_outb() argument
599 fd_outb(value, fdc_state[fdc].address, reg); in fdc_outb()
732 int fdc = FDC(drive); in disk_change() local
736 if (!(fdc_state[fdc].dor & (0x10 << UNIT(drive))) || in disk_change()
737 (fdc_state[fdc].dor & 3) != UNIT(drive) || fdc != FDC(drive)) { in disk_change()
740 (unsigned int)fdc_state[fdc].dor); in disk_change()
747 fdc_inb(fdc, FD_DIR) & 0x80); in disk_change()
754 if ((fdc_inb(fdc, FD_DIR) ^ drive_params[drive].flags) & 0x80) { in disk_change()
790 static int set_dor(int fdc, char mask, char data) in set_dor() argument
797 if (fdc_state[fdc].address == -1) in set_dor()
800 olddor = fdc_state[fdc].dor; in set_dor()
805 drive = REVDRIVE(fdc, unit); in set_dor()
810 fdc_state[fdc].dor = newdor; in set_dor()
811 fdc_outb(newdor, fdc, FD_DOR); in set_dor()
815 drive = REVDRIVE(fdc, unit); in set_dor()
822 static void twaddle(int fdc, int drive) in twaddle() argument
826 fdc_outb(fdc_state[fdc].dor & ~(0x10 << UNIT(drive)), in twaddle()
827 fdc, FD_DOR); in twaddle()
828 fdc_outb(fdc_state[fdc].dor, fdc, FD_DOR); in twaddle()
836 static void reset_fdc_info(int fdc, int mode) in reset_fdc_info() argument
840 fdc_state[fdc].spec1 = fdc_state[fdc].spec2 = -1; in reset_fdc_info()
841 fdc_state[fdc].need_configure = 1; in reset_fdc_info()
842 fdc_state[fdc].perp_mode = 1; in reset_fdc_info()
843 fdc_state[fdc].rawcmd = 0; in reset_fdc_info()
845 if (FDC(drive) == fdc && in reset_fdc_info()
856 unsigned int fdc; in set_fdc() local
863 fdc = FDC(drive); in set_fdc()
864 if (fdc >= N_FDC) { in set_fdc()
869 set_dor(fdc, ~0, 8); in set_fdc()
871 set_dor(1 - fdc, ~8, 0); in set_fdc()
873 if (fdc_state[fdc].rawcmd == 2) in set_fdc()
874 reset_fdc_info(fdc, 1); in set_fdc()
875 if (fdc_inb(fdc, FD_STATUS) != STATUS_READY) in set_fdc()
876 fdc_state[fdc].reset = 1; in set_fdc()
879 current_fdc = fdc; in set_fdc()
933 int fdc = FDC(drive); in floppy_off() local
935 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()
4237 static char __init get_fdc_version(int fdc) in get_fdc_version() argument
4241 output_byte(fdc, FD_DUMPREGS); /* 82072 and better know DUMPREGS */ in get_fdc_version()
4242 if (fdc_state[fdc].reset) in get_fdc_version()
4244 r = result(fdc); in get_fdc_version()
4248 pr_info("FDC %d is an 8272A\n", fdc); in get_fdc_version()
4253 fdc, r); in get_fdc_version()
4257 if (!fdc_configure(fdc)) { in get_fdc_version()
4258 pr_info("FDC %d is an 82072\n", fdc); in get_fdc_version()
4262 output_byte(fdc, FD_PERPENDICULAR); in get_fdc_version()
4263 if (need_more_output(fdc) == MORE_OUTPUT) { in get_fdc_version()
4264 output_byte(fdc, 0); in get_fdc_version()
4266 pr_info("FDC %d is an 82072A\n", fdc); in get_fdc_version()
4270 output_byte(fdc, FD_UNLOCK); in get_fdc_version()
4271 r = result(fdc); in get_fdc_version()
4273 pr_info("FDC %d is a pre-1991 82077\n", fdc); in get_fdc_version()
4279 fdc, r); in get_fdc_version()
4282 output_byte(fdc, FD_PARTID); in get_fdc_version()
4283 r = result(fdc); in get_fdc_version()
4286 fdc, r); in get_fdc_version()
4290 pr_info("FDC %d is a post-1991 82077\n", fdc); in get_fdc_version()
4296 pr_info("FDC %d is an 82078.\n", fdc); in get_fdc_version()
4299 pr_info("FDC %d is a 44pin 82078\n", fdc); in get_fdc_version()
4302 pr_info("FDC %d is a S82078B\n", fdc); in get_fdc_version()
4305 pr_info("FDC %d is a National Semiconductor PC87306\n", fdc); in get_fdc_version()
4309 fdc, reply_buffer[ST0] >> 5); in get_fdc_version()
4472 int fdc; in floppy_resume() local
4476 for (fdc = 0; fdc < N_FDC; fdc++) in floppy_resume()
4477 if (fdc_state[fdc].address != -1) in floppy_resume()
4478 user_reset_fdc(REVDRIVE(fdc, 0), FD_RESET_ALWAYS, false); in floppy_resume()
4797 static void floppy_release_allocated_regions(int fdc, const struct io_region *p) in floppy_release_allocated_regions() argument
4801 release_region(fdc_state[fdc].address + p->offset, p->size); in floppy_release_allocated_regions()
4805 static int floppy_request_regions(int fdc) in floppy_request_regions() argument
4810 if (!request_region(fdc_state[fdc].address + p->offset, in floppy_request_regions()
4813 fdc_state[fdc].address + p->offset); in floppy_request_regions()
4814 floppy_release_allocated_regions(fdc, p); in floppy_request_regions()
4821 static void floppy_release_regions(int fdc) in floppy_release_regions() argument
4823 floppy_release_allocated_regions(fdc, ARRAY_END(io_regions)); in floppy_release_regions()
4828 int fdc; in floppy_grab_irq_and_dma() local
4857 for (fdc = 0; fdc < N_FDC; fdc++) { in floppy_grab_irq_and_dma()
4858 if (fdc_state[fdc].address != -1) { in floppy_grab_irq_and_dma()
4859 if (floppy_request_regions(fdc)) in floppy_grab_irq_and_dma()
4863 for (fdc = 0; fdc < N_FDC; fdc++) { in floppy_grab_irq_and_dma()
4864 if (fdc_state[fdc].address != -1) { in floppy_grab_irq_and_dma()
4865 reset_fdc_info(fdc, 1); in floppy_grab_irq_and_dma()
4866 fdc_outb(fdc_state[fdc].dor, fdc, FD_DOR); in floppy_grab_irq_and_dma()
4872 for (fdc = 0; fdc < N_FDC; fdc++) in floppy_grab_irq_and_dma()
4873 if (fdc_state[fdc].address != -1) in floppy_grab_irq_and_dma()
4874 fdc_outb(fdc_state[fdc].dor, fdc, FD_DOR); in floppy_grab_irq_and_dma()
4885 while (--fdc >= 0) in floppy_grab_irq_and_dma()
4886 floppy_release_regions(fdc); in floppy_grab_irq_and_dma()
4894 int fdc; in floppy_release_irq_and_dma() local
4935 for (fdc = 0; fdc < N_FDC; fdc++) in floppy_release_irq_and_dma()
4936 if (fdc_state[fdc].address != -1) in floppy_release_irq_and_dma()
4937 floppy_release_regions(fdc); in floppy_release_irq_and_dma()