This source file includes following definitions.
- fallback_on_nodma_alloc
- drive_no_geom
- fd_eject
- set_debugt
- debugt
- set_debugt
- debugt
- is_alive
- __reschedule_timeout
- reschedule_timeout
- disk_change
- is_selected
- is_ready_state
- set_dor
- twaddle
- reset_fdc_info
- set_fdc
- lock_fdc
- unlock_fdc
- motor_off_callback
- floppy_off
- scandrives
- empty
- floppy_work_workfn
- schedule_bh
- fd_timer_workfn
- cancel_activity
- fd_watchdog
- main_command_interrupt
- fd_wait_for_completion
- setup_DMA
- wait_til_ready
- output_byte
- result
- need_more_output
- perpendicular_mode
- fdc_configure
- fdc_specify
- fdc_dtr
- tell_sector
- print_errors
- interpret_errors
- setup_rw_floppy
- seek_interrupt
- check_wp
- seek_floppy
- recal_interrupt
- print_result
- floppy_interrupt
- recalibrate_floppy
- reset_interrupt
- reset_fdc
- show_floppy
- floppy_shutdown
- start_motor
- floppy_ready
- floppy_start
- do_wakeup
- wait_til_done
- generic_done
- generic_success
- generic_failure
- success_and_wakeup
- next_valid_format
- bad_flp_intr
- set_floppy
- format_interrupt
- setup_format_params
- redo_format
- do_format
- floppy_end_request
- request_done
- rw_interrupt
- buffer_chain_size
- transfer_size
- copy_buffer
- virtualdmabug_workaround
- make_raw_rw_request
- set_next_request
- redo_fd_request
- process_fd_request
- floppy_queue_rq
- poll_drive
- reset_intr
- user_reset_fdc
- fd_copyout
- fd_copyin
- drive_name
- raw_cmd_done
- raw_cmd_copyout
- raw_cmd_free
- raw_cmd_copyin
- raw_cmd_ioctl
- invalidate_drive
- set_geometry
- normalize_ioctl
- get_floppy_geometry
- fd_getgeo
- valid_floppy_drive_params
- fd_locked_ioctl
- fd_ioctl
- compat_get_prm
- compat_setdrvprm
- compat_getdrvprm
- compat_getdrvstat
- compat_getfdcstat
- compat_werrorget
- fd_compat_ioctl
- config_types
- floppy_release
- floppy_open
- floppy_check_events
- floppy_rb0_cb
- __floppy_read_block_0
- floppy_revalidate
- get_fdc_version
- floppy_set_flags
- daring
- set_cmos
- floppy_setup
- floppy_cmos_show
- floppy_device_release
- floppy_resume
- floppy_available
- floppy_find
- do_floppy_init
- floppy_async_init
- floppy_init
- floppy_release_allocated_regions
- floppy_request_regions
- floppy_release_regions
- floppy_grab_irq_and_dma
- floppy_release_irq_and_dma
- parse_floppy_cfg_string
- floppy_module_init
- floppy_module_exit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148 #undef FLOPPY_SILENT_DCL_CLEAR
149
150 #define REALLY_SLOW_IO
151
152 #define DEBUGT 2
153
154 #define DPRINT(format, args...) \
155 pr_info("floppy%d: " format, current_drive, ##args)
156
157 #define DCL_DEBUG
158 #ifdef DCL_DEBUG
159 #define debug_dcl(test, fmt, args...) \
160 do { if ((test) & FD_DEBUG) DPRINT(fmt, ##args); } while (0)
161 #else
162 #define debug_dcl(test, fmt, args...) \
163 do { if (0) DPRINT(fmt, ##args); } while (0)
164 #endif
165
166
167 static int print_unex = 1;
168 #include <linux/module.h>
169 #include <linux/sched.h>
170 #include <linux/fs.h>
171 #include <linux/kernel.h>
172 #include <linux/timer.h>
173 #include <linux/workqueue.h>
174 #define FDPATCHES
175 #include <linux/fdreg.h>
176 #include <linux/fd.h>
177 #include <linux/hdreg.h>
178 #include <linux/errno.h>
179 #include <linux/slab.h>
180 #include <linux/mm.h>
181 #include <linux/bio.h>
182 #include <linux/string.h>
183 #include <linux/jiffies.h>
184 #include <linux/fcntl.h>
185 #include <linux/delay.h>
186 #include <linux/mc146818rtc.h>
187 #include <linux/ioport.h>
188 #include <linux/interrupt.h>
189 #include <linux/init.h>
190 #include <linux/platform_device.h>
191 #include <linux/mod_devicetable.h>
192 #include <linux/mutex.h>
193 #include <linux/io.h>
194 #include <linux/uaccess.h>
195 #include <linux/async.h>
196 #include <linux/compat.h>
197
198
199
200
201
202
203 static DEFINE_MUTEX(floppy_mutex);
204 static int slow_floppy;
205
206 #include <asm/dma.h>
207 #include <asm/irq.h>
208
209 static int FLOPPY_IRQ = 6;
210 static int FLOPPY_DMA = 2;
211 static int can_use_virtual_dma = 2;
212
213
214
215
216
217
218
219
220 static int use_virtual_dma;
221
222
223
224
225
226
227
228
229
230
231
232 static DEFINE_SPINLOCK(floppy_lock);
233
234 static unsigned short virtual_dma_port = 0x3f0;
235 irqreturn_t floppy_interrupt(int irq, void *dev_id);
236 static int set_dor(int fdc, char mask, char data);
237
238 #define K_64 0x10000
239
240
241
242
243
244
245
246
247
248
249
250 static int allowed_drive_mask = 0x33;
251
252 #include <asm/floppy.h>
253
254 static int irqdma_allocated;
255
256 #include <linux/blk-mq.h>
257 #include <linux/blkpg.h>
258 #include <linux/cdrom.h>
259 #include <linux/completion.h>
260
261 static LIST_HEAD(floppy_reqs);
262 static struct request *current_req;
263 static int set_next_request(void);
264
265 #ifndef fd_get_dma_residue
266 #define fd_get_dma_residue() get_dma_residue(FLOPPY_DMA)
267 #endif
268
269
270
271 #ifndef fd_dma_mem_free
272 #define fd_dma_mem_free(addr, size) free_pages(addr, get_order(size))
273 #endif
274
275 #ifndef fd_dma_mem_alloc
276 #define fd_dma_mem_alloc(size) __get_dma_pages(GFP_KERNEL, get_order(size))
277 #endif
278
279 #ifndef fd_cacheflush
280 #define fd_cacheflush(addr, size)
281 #endif
282
283 static inline void fallback_on_nodma_alloc(char **addr, size_t l)
284 {
285 #ifdef FLOPPY_CAN_FALLBACK_ON_NODMA
286 if (*addr)
287 return;
288 if (can_use_virtual_dma != 2)
289 return;
290 pr_info("DMA memory shortage. Temporarily falling back on virtual DMA\n");
291 *addr = (char *)nodma_mem_alloc(l);
292 #else
293 return;
294 #endif
295 }
296
297
298
299 static unsigned long fake_change;
300 static bool initialized;
301
302 #define ITYPE(x) (((x) >> 2) & 0x1f)
303 #define TOMINOR(x) ((x & 3) | ((x & 4) << 5))
304 #define UNIT(x) ((x) & 0x03)
305 #define FDC(x) (((x) & 0x04) >> 2)
306
307 #define REVDRIVE(fdc, unit) ((unit) + ((fdc) << 2))
308
309 #define DP (&drive_params[current_drive])
310 #define DRS (&drive_state[current_drive])
311 #define DRWE (&write_errors[current_drive])
312 #define FDCS (&fdc_state[fdc])
313
314 #define UDP (&drive_params[drive])
315 #define UDRS (&drive_state[drive])
316 #define UDRWE (&write_errors[drive])
317 #define UFDCS (&fdc_state[FDC(drive)])
318
319 #define PH_HEAD(floppy, head) (((((floppy)->stretch & 2) >> 1) ^ head) << 2)
320 #define STRETCH(floppy) ((floppy)->stretch & FD_STRETCH)
321
322
323 #define COMMAND (raw_cmd->cmd[0])
324 #define DR_SELECT (raw_cmd->cmd[1])
325 #define TRACK (raw_cmd->cmd[2])
326 #define HEAD (raw_cmd->cmd[3])
327 #define SECTOR (raw_cmd->cmd[4])
328 #define SIZECODE (raw_cmd->cmd[5])
329 #define SECT_PER_TRACK (raw_cmd->cmd[6])
330 #define GAP (raw_cmd->cmd[7])
331 #define SIZECODE2 (raw_cmd->cmd[8])
332 #define NR_RW 9
333
334
335 #define F_SIZECODE (raw_cmd->cmd[2])
336 #define F_SECT_PER_TRACK (raw_cmd->cmd[3])
337 #define F_GAP (raw_cmd->cmd[4])
338 #define F_FILL (raw_cmd->cmd[5])
339 #define NR_F 6
340
341
342
343
344
345
346 #define MAX_DISK_SIZE 4
347
348
349
350
351 #define MAX_REPLIES 16
352 static unsigned char reply_buffer[MAX_REPLIES];
353 static int inr;
354 #define ST0 (reply_buffer[0])
355 #define ST1 (reply_buffer[1])
356 #define ST2 (reply_buffer[2])
357 #define ST3 (reply_buffer[0])
358 #define R_TRACK (reply_buffer[3])
359 #define R_HEAD (reply_buffer[4])
360 #define R_SECTOR (reply_buffer[5])
361 #define R_SIZECODE (reply_buffer[6])
362
363 #define SEL_DLY (2 * HZ / 100)
364
365
366
367
368 static struct {
369 struct floppy_drive_params params;
370 const char *name;
371 } default_drive_params[] = {
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387 {{0, 500, 16, 16, 8000, 1*HZ, 3*HZ, 0, SEL_DLY, 5, 80, 3*HZ, 20, {3,1,2,0,2}, 0,
388 0, { 7, 4, 8, 2, 1, 5, 3,10}, 3*HZ/2, 0 }, "unknown" },
389
390 {{1, 300, 16, 16, 8000, 1*HZ, 3*HZ, 0, SEL_DLY, 5, 40, 3*HZ, 17, {3,1,2,0,2}, 0,
391 0, { 1, 0, 0, 0, 0, 0, 0, 0}, 3*HZ/2, 1 }, "360K PC" },
392
393 {{2, 500, 16, 16, 6000, 4*HZ/10, 3*HZ, 14, SEL_DLY, 6, 83, 3*HZ, 17, {3,1,2,0,2}, 0,
394 0, { 2, 5, 6,23,10,20,12, 0}, 3*HZ/2, 2 }, "1.2M" },
395
396 {{3, 250, 16, 16, 3000, 1*HZ, 3*HZ, 0, SEL_DLY, 5, 83, 3*HZ, 20, {3,1,2,0,2}, 0,
397 0, { 4,22,21,30, 3, 0, 0, 0}, 3*HZ/2, 4 }, "720k" },
398
399 {{4, 500, 16, 16, 4000, 4*HZ/10, 3*HZ, 10, SEL_DLY, 5, 83, 3*HZ, 20, {3,1,2,0,2}, 0,
400 0, { 7, 4,25,22,31,21,29,11}, 3*HZ/2, 7 }, "1.44M" },
401
402 {{5, 1000, 15, 8, 3000, 4*HZ/10, 3*HZ, 10, SEL_DLY, 5, 83, 3*HZ, 40, {3,1,2,0,2}, 0,
403 0, { 7, 8, 4,25,28,22,31,21}, 3*HZ/2, 8 }, "2.88M AMI BIOS" },
404
405 {{6, 1000, 15, 8, 3000, 4*HZ/10, 3*HZ, 10, SEL_DLY, 5, 83, 3*HZ, 40, {3,1,2,0,2}, 0,
406 0, { 7, 8, 4,25,28,22,31,21}, 3*HZ/2, 8 }, "2.88M" }
407
408
409
410
411 };
412
413 static struct floppy_drive_params drive_params[N_DRIVE];
414 static struct floppy_drive_struct drive_state[N_DRIVE];
415 static struct floppy_write_errors write_errors[N_DRIVE];
416 static struct timer_list motor_off_timer[N_DRIVE];
417 static struct gendisk *disks[N_DRIVE];
418 static struct blk_mq_tag_set tag_sets[N_DRIVE];
419 static struct block_device *opened_bdev[N_DRIVE];
420 static DEFINE_MUTEX(open_lock);
421 static struct floppy_raw_cmd *raw_cmd, default_raw_cmd;
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454 static struct floppy_struct floppy_type[32] = {
455 { 0, 0,0, 0,0,0x00,0x00,0x00,0x00,NULL },
456 { 720, 9,2,40,0,0x2A,0x02,0xDF,0x50,"d360" },
457 { 2400,15,2,80,0,0x1B,0x00,0xDF,0x54,"h1200" },
458 { 720, 9,1,80,0,0x2A,0x02,0xDF,0x50,"D360" },
459 { 1440, 9,2,80,0,0x2A,0x02,0xDF,0x50,"D720" },
460 { 720, 9,2,40,1,0x23,0x01,0xDF,0x50,"h360" },
461 { 1440, 9,2,80,0,0x23,0x01,0xDF,0x50,"h720" },
462 { 2880,18,2,80,0,0x1B,0x00,0xCF,0x6C,"H1440" },
463 { 5760,36,2,80,0,0x1B,0x43,0xAF,0x54,"E2880" },
464 { 6240,39,2,80,0,0x1B,0x43,0xAF,0x28,"E3120" },
465
466 { 2880,18,2,80,0,0x25,0x00,0xDF,0x02,"h1440" },
467 { 3360,21,2,80,0,0x1C,0x00,0xCF,0x0C,"H1680" },
468 { 820,10,2,41,1,0x25,0x01,0xDF,0x2E,"h410" },
469 { 1640,10,2,82,0,0x25,0x02,0xDF,0x2E,"H820" },
470 { 2952,18,2,82,0,0x25,0x00,0xDF,0x02,"h1476" },
471 { 3444,21,2,82,0,0x25,0x00,0xDF,0x0C,"H1722" },
472 { 840,10,2,42,1,0x25,0x01,0xDF,0x2E,"h420" },
473 { 1660,10,2,83,0,0x25,0x02,0xDF,0x2E,"H830" },
474 { 2988,18,2,83,0,0x25,0x00,0xDF,0x02,"h1494" },
475 { 3486,21,2,83,0,0x25,0x00,0xDF,0x0C,"H1743" },
476
477 { 1760,11,2,80,0,0x1C,0x09,0xCF,0x00,"h880" },
478 { 2080,13,2,80,0,0x1C,0x01,0xCF,0x00,"D1040" },
479 { 2240,14,2,80,0,0x1C,0x19,0xCF,0x00,"D1120" },
480 { 3200,20,2,80,0,0x1C,0x20,0xCF,0x2C,"h1600" },
481 { 3520,22,2,80,0,0x1C,0x08,0xCF,0x2e,"H1760" },
482 { 3840,24,2,80,0,0x1C,0x20,0xCF,0x00,"H1920" },
483 { 6400,40,2,80,0,0x25,0x5B,0xCF,0x00,"E3200" },
484 { 7040,44,2,80,0,0x25,0x5B,0xCF,0x00,"E3520" },
485 { 7680,48,2,80,0,0x25,0x63,0xCF,0x00,"E3840" },
486 { 3680,23,2,80,0,0x1C,0x10,0xCF,0x00,"H1840" },
487
488 { 1600,10,2,80,0,0x25,0x02,0xDF,0x2E,"D800" },
489 { 3200,20,2,80,0,0x1C,0x00,0xCF,0x2C,"H1600" },
490 };
491
492 #define SECTSIZE (_FD_SECTSIZE(*floppy))
493
494
495 static struct floppy_struct *current_type[N_DRIVE];
496
497
498
499
500
501 static struct floppy_struct user_params[N_DRIVE];
502
503 static sector_t floppy_sizes[256];
504
505 static char floppy_device_name[] = "floppy";
506
507
508
509
510
511
512 static int probing;
513
514
515 #define FD_COMMAND_NONE -1
516 #define FD_COMMAND_ERROR 2
517 #define FD_COMMAND_OKAY 3
518
519 static volatile int command_status = FD_COMMAND_NONE;
520 static unsigned long fdc_busy;
521 static DECLARE_WAIT_QUEUE_HEAD(fdc_wait);
522 static DECLARE_WAIT_QUEUE_HEAD(command_done);
523
524
525 static int format_errors;
526
527
528 static struct format_descr format_req;
529
530
531
532
533
534
535
536
537
538
539
540
541
542 static char *floppy_track_buffer;
543 static int max_buffer_sectors;
544
545 static int *errors;
546 typedef void (*done_f)(int);
547 static const struct cont_t {
548 void (*interrupt)(void);
549
550
551 void (*redo)(void);
552 void (*error)(void);
553 done_f done;
554
555 } *cont;
556
557 static void floppy_ready(void);
558 static void floppy_start(void);
559 static void process_fd_request(void);
560 static void recalibrate_floppy(void);
561 static void floppy_shutdown(struct work_struct *);
562
563 static int floppy_request_regions(int);
564 static void floppy_release_regions(int);
565 static int floppy_grab_irq_and_dma(void);
566 static void floppy_release_irq_and_dma(void);
567
568
569
570
571
572
573
574
575 static void reset_fdc(void);
576
577
578
579
580
581
582 #define NO_TRACK -1
583 #define NEED_1_RECAL -2
584 #define NEED_2_RECAL -3
585
586 static atomic_t usage_count = ATOMIC_INIT(0);
587
588
589 static int buffer_track = -1;
590 static int buffer_drive = -1;
591 static int buffer_min = -1;
592 static int buffer_max = -1;
593
594
595 static struct floppy_fdc_state fdc_state[N_FDC];
596 static int fdc;
597
598 static struct workqueue_struct *floppy_wq;
599
600 static struct floppy_struct *_floppy = floppy_type;
601 static unsigned char current_drive;
602 static long current_count_sectors;
603 static unsigned char fsector_t;
604 static unsigned char in_sector_offset;
605
606
607 static inline bool drive_no_geom(int drive)
608 {
609 return !current_type[drive] && !ITYPE(UDRS->fd_device);
610 }
611
612 #ifndef fd_eject
613 static inline int fd_eject(int drive)
614 {
615 return -EINVAL;
616 }
617 #endif
618
619
620
621
622
623 #ifdef DEBUGT
624 static long unsigned debugtimer;
625
626 static inline void set_debugt(void)
627 {
628 debugtimer = jiffies;
629 }
630
631 static inline void debugt(const char *func, const char *msg)
632 {
633 if (DP->flags & DEBUGT)
634 pr_info("%s:%s dtime=%lu\n", func, msg, jiffies - debugtimer);
635 }
636 #else
637 static inline void set_debugt(void) { }
638 static inline void debugt(const char *func, const char *msg) { }
639 #endif
640
641
642 static DECLARE_DELAYED_WORK(fd_timeout, floppy_shutdown);
643 static const char *timeout_message;
644
645 static void is_alive(const char *func, const char *message)
646 {
647
648 if (test_bit(0, &fdc_busy) && command_status < 2 &&
649 !delayed_work_pending(&fd_timeout)) {
650 DPRINT("%s: timeout handler died. %s\n", func, message);
651 }
652 }
653
654 static void (*do_floppy)(void) = NULL;
655
656 #define OLOGSIZE 20
657
658 static void (*lasthandler)(void);
659 static unsigned long interruptjiffies;
660 static unsigned long resultjiffies;
661 static int resultsize;
662 static unsigned long lastredo;
663
664 static struct output_log {
665 unsigned char data;
666 unsigned char status;
667 unsigned long jiffies;
668 } output_log[OLOGSIZE];
669
670 static int output_log_pos;
671
672 #define current_reqD -1
673 #define MAXTIMEOUT -2
674
675 static void __reschedule_timeout(int drive, const char *message)
676 {
677 unsigned long delay;
678
679 if (drive == current_reqD)
680 drive = current_drive;
681
682 if (drive < 0 || drive >= N_DRIVE) {
683 delay = 20UL * HZ;
684 drive = 0;
685 } else
686 delay = UDP->timeout;
687
688 mod_delayed_work(floppy_wq, &fd_timeout, delay);
689 if (UDP->flags & FD_DEBUG)
690 DPRINT("reschedule timeout %s\n", message);
691 timeout_message = message;
692 }
693
694 static void reschedule_timeout(int drive, const char *message)
695 {
696 unsigned long flags;
697
698 spin_lock_irqsave(&floppy_lock, flags);
699 __reschedule_timeout(drive, message);
700 spin_unlock_irqrestore(&floppy_lock, flags);
701 }
702
703 #define INFBOUND(a, b) (a) = max_t(int, a, b)
704 #define SUPBOUND(a, b) (a) = min_t(int, a, b)
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739 static int disk_change(int drive)
740 {
741 int fdc = FDC(drive);
742
743 if (time_before(jiffies, UDRS->select_date + UDP->select_delay))
744 DPRINT("WARNING disk change called early\n");
745 if (!(FDCS->dor & (0x10 << UNIT(drive))) ||
746 (FDCS->dor & 3) != UNIT(drive) || fdc != FDC(drive)) {
747 DPRINT("probing disk change on unselected drive\n");
748 DPRINT("drive=%d fdc=%d dor=%x\n", drive, FDC(drive),
749 (unsigned int)FDCS->dor);
750 }
751
752 debug_dcl(UDP->flags,
753 "checking disk change line for drive %d\n", drive);
754 debug_dcl(UDP->flags, "jiffies=%lu\n", jiffies);
755 debug_dcl(UDP->flags, "disk change line=%x\n", fd_inb(FD_DIR) & 0x80);
756 debug_dcl(UDP->flags, "flags=%lx\n", UDRS->flags);
757
758 if (UDP->flags & FD_BROKEN_DCL)
759 return test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags);
760 if ((fd_inb(FD_DIR) ^ UDP->flags) & 0x80) {
761 set_bit(FD_VERIFY_BIT, &UDRS->flags);
762
763
764 if (UDRS->maxblock)
765 set_bit(FD_DISK_CHANGED_BIT, &UDRS->flags);
766
767
768 if (UDRS->keep_data >= 0) {
769 if ((UDP->flags & FTD_MSG) &&
770 current_type[drive] != NULL)
771 DPRINT("Disk type is undefined after disk change\n");
772 current_type[drive] = NULL;
773 floppy_sizes[TOMINOR(drive)] = MAX_DISK_SIZE << 1;
774 }
775
776 return 1;
777 } else {
778 UDRS->last_checked = jiffies;
779 clear_bit(FD_DISK_NEWCHANGE_BIT, &UDRS->flags);
780 }
781 return 0;
782 }
783
784 static inline int is_selected(int dor, int unit)
785 {
786 return ((dor & (0x10 << unit)) && (dor & 3) == unit);
787 }
788
789 static bool is_ready_state(int status)
790 {
791 int state = status & (STATUS_READY | STATUS_DIR | STATUS_DMA);
792 return state == STATUS_READY;
793 }
794
795 static int set_dor(int fdc, char mask, char data)
796 {
797 unsigned char unit;
798 unsigned char drive;
799 unsigned char newdor;
800 unsigned char olddor;
801
802 if (FDCS->address == -1)
803 return -1;
804
805 olddor = FDCS->dor;
806 newdor = (olddor & mask) | data;
807 if (newdor != olddor) {
808 unit = olddor & 0x3;
809 if (is_selected(olddor, unit) && !is_selected(newdor, unit)) {
810 drive = REVDRIVE(fdc, unit);
811 debug_dcl(UDP->flags,
812 "calling disk change from set_dor\n");
813 disk_change(drive);
814 }
815 FDCS->dor = newdor;
816 fd_outb(newdor, FD_DOR);
817
818 unit = newdor & 0x3;
819 if (!is_selected(olddor, unit) && is_selected(newdor, unit)) {
820 drive = REVDRIVE(fdc, unit);
821 UDRS->select_date = jiffies;
822 }
823 }
824 return olddor;
825 }
826
827 static void twaddle(void)
828 {
829 if (DP->select_delay)
830 return;
831 fd_outb(FDCS->dor & ~(0x10 << UNIT(current_drive)), FD_DOR);
832 fd_outb(FDCS->dor, FD_DOR);
833 DRS->select_date = jiffies;
834 }
835
836
837
838
839
840 static void reset_fdc_info(int mode)
841 {
842 int drive;
843
844 FDCS->spec1 = FDCS->spec2 = -1;
845 FDCS->need_configure = 1;
846 FDCS->perp_mode = 1;
847 FDCS->rawcmd = 0;
848 for (drive = 0; drive < N_DRIVE; drive++)
849 if (FDC(drive) == fdc && (mode || UDRS->track != NEED_1_RECAL))
850 UDRS->track = NEED_2_RECAL;
851 }
852
853
854 static void set_fdc(int drive)
855 {
856 unsigned int new_fdc = fdc;
857
858 if (drive >= 0 && drive < N_DRIVE) {
859 new_fdc = FDC(drive);
860 current_drive = drive;
861 }
862 if (new_fdc >= N_FDC) {
863 pr_info("bad fdc value\n");
864 return;
865 }
866 fdc = new_fdc;
867 set_dor(fdc, ~0, 8);
868 #if N_FDC > 1
869 set_dor(1 - fdc, ~8, 0);
870 #endif
871 if (FDCS->rawcmd == 2)
872 reset_fdc_info(1);
873 if (fd_inb(FD_STATUS) != STATUS_READY)
874 FDCS->reset = 1;
875 }
876
877
878 static int lock_fdc(int drive)
879 {
880 if (WARN(atomic_read(&usage_count) == 0,
881 "Trying to lock fdc while usage count=0\n"))
882 return -1;
883
884 if (wait_event_interruptible(fdc_wait, !test_and_set_bit(0, &fdc_busy)))
885 return -EINTR;
886
887 command_status = FD_COMMAND_NONE;
888
889 reschedule_timeout(drive, "lock fdc");
890 set_fdc(drive);
891 return 0;
892 }
893
894
895 static void unlock_fdc(void)
896 {
897 if (!test_bit(0, &fdc_busy))
898 DPRINT("FDC access conflict!\n");
899
900 raw_cmd = NULL;
901 command_status = FD_COMMAND_NONE;
902 cancel_delayed_work(&fd_timeout);
903 do_floppy = NULL;
904 cont = NULL;
905 clear_bit(0, &fdc_busy);
906 wake_up(&fdc_wait);
907 }
908
909
910 static void motor_off_callback(struct timer_list *t)
911 {
912 unsigned long nr = t - motor_off_timer;
913 unsigned char mask = ~(0x10 << UNIT(nr));
914
915 if (WARN_ON_ONCE(nr >= N_DRIVE))
916 return;
917
918 set_dor(FDC(nr), mask, 0);
919 }
920
921
922 static void floppy_off(unsigned int drive)
923 {
924 unsigned long volatile delta;
925 int fdc = FDC(drive);
926
927 if (!(FDCS->dor & (0x10 << UNIT(drive))))
928 return;
929
930 del_timer(motor_off_timer + drive);
931
932
933
934 if (UDP->rps) {
935 delta = jiffies - UDRS->first_read_date + HZ -
936 UDP->spindown_offset;
937 delta = ((delta * UDP->rps) % HZ) / UDP->rps;
938 motor_off_timer[drive].expires =
939 jiffies + UDP->spindown - delta;
940 }
941 add_timer(motor_off_timer + drive);
942 }
943
944
945
946
947
948
949 static void scandrives(void)
950 {
951 int i;
952 int drive;
953 int saved_drive;
954
955 if (DP->select_delay)
956 return;
957
958 saved_drive = current_drive;
959 for (i = 0; i < N_DRIVE; i++) {
960 drive = (saved_drive + i + 1) % N_DRIVE;
961 if (UDRS->fd_ref == 0 || UDP->select_delay != 0)
962 continue;
963 set_fdc(drive);
964 if (!(set_dor(fdc, ~3, UNIT(drive) | (0x10 << UNIT(drive))) &
965 (0x10 << UNIT(drive))))
966
967
968 set_dor(fdc, ~(0x10 << UNIT(drive)), 0);
969 }
970 set_fdc(saved_drive);
971 }
972
973 static void empty(void)
974 {
975 }
976
977 static void (*floppy_work_fn)(void);
978
979 static void floppy_work_workfn(struct work_struct *work)
980 {
981 floppy_work_fn();
982 }
983
984 static DECLARE_WORK(floppy_work, floppy_work_workfn);
985
986 static void schedule_bh(void (*handler)(void))
987 {
988 WARN_ON(work_pending(&floppy_work));
989
990 floppy_work_fn = handler;
991 queue_work(floppy_wq, &floppy_work);
992 }
993
994 static void (*fd_timer_fn)(void) = NULL;
995
996 static void fd_timer_workfn(struct work_struct *work)
997 {
998 fd_timer_fn();
999 }
1000
1001 static DECLARE_DELAYED_WORK(fd_timer, fd_timer_workfn);
1002
1003 static void cancel_activity(void)
1004 {
1005 do_floppy = NULL;
1006 cancel_delayed_work_sync(&fd_timer);
1007 cancel_work_sync(&floppy_work);
1008 }
1009
1010
1011
1012 static void fd_watchdog(void)
1013 {
1014 debug_dcl(DP->flags, "calling disk change from watchdog\n");
1015
1016 if (disk_change(current_drive)) {
1017 DPRINT("disk removed during i/o\n");
1018 cancel_activity();
1019 cont->done(0);
1020 reset_fdc();
1021 } else {
1022 cancel_delayed_work(&fd_timer);
1023 fd_timer_fn = fd_watchdog;
1024 queue_delayed_work(floppy_wq, &fd_timer, HZ / 10);
1025 }
1026 }
1027
1028 static void main_command_interrupt(void)
1029 {
1030 cancel_delayed_work(&fd_timer);
1031 cont->interrupt();
1032 }
1033
1034
1035 static int fd_wait_for_completion(unsigned long expires,
1036 void (*function)(void))
1037 {
1038 if (FDCS->reset) {
1039 reset_fdc();
1040
1041
1042 return 1;
1043 }
1044
1045 if (time_before(jiffies, expires)) {
1046 cancel_delayed_work(&fd_timer);
1047 fd_timer_fn = function;
1048 queue_delayed_work(floppy_wq, &fd_timer, expires - jiffies);
1049 return 1;
1050 }
1051 return 0;
1052 }
1053
1054 static void setup_DMA(void)
1055 {
1056 unsigned long f;
1057
1058 if (raw_cmd->length == 0) {
1059 int i;
1060
1061 pr_info("zero dma transfer size:");
1062 for (i = 0; i < raw_cmd->cmd_count; i++)
1063 pr_cont("%x,", raw_cmd->cmd[i]);
1064 pr_cont("\n");
1065 cont->done(0);
1066 FDCS->reset = 1;
1067 return;
1068 }
1069 if (((unsigned long)raw_cmd->kernel_data) % 512) {
1070 pr_info("non aligned address: %p\n", raw_cmd->kernel_data);
1071 cont->done(0);
1072 FDCS->reset = 1;
1073 return;
1074 }
1075 f = claim_dma_lock();
1076 fd_disable_dma();
1077 #ifdef fd_dma_setup
1078 if (fd_dma_setup(raw_cmd->kernel_data, raw_cmd->length,
1079 (raw_cmd->flags & FD_RAW_READ) ?
1080 DMA_MODE_READ : DMA_MODE_WRITE, FDCS->address) < 0) {
1081 release_dma_lock(f);
1082 cont->done(0);
1083 FDCS->reset = 1;
1084 return;
1085 }
1086 release_dma_lock(f);
1087 #else
1088 fd_clear_dma_ff();
1089 fd_cacheflush(raw_cmd->kernel_data, raw_cmd->length);
1090 fd_set_dma_mode((raw_cmd->flags & FD_RAW_READ) ?
1091 DMA_MODE_READ : DMA_MODE_WRITE);
1092 fd_set_dma_addr(raw_cmd->kernel_data);
1093 fd_set_dma_count(raw_cmd->length);
1094 virtual_dma_port = FDCS->address;
1095 fd_enable_dma();
1096 release_dma_lock(f);
1097 #endif
1098 }
1099
1100 static void show_floppy(void);
1101
1102
1103 static int wait_til_ready(void)
1104 {
1105 int status;
1106 int counter;
1107
1108 if (FDCS->reset)
1109 return -1;
1110 for (counter = 0; counter < 10000; counter++) {
1111 status = fd_inb(FD_STATUS);
1112 if (status & STATUS_READY)
1113 return status;
1114 }
1115 if (initialized) {
1116 DPRINT("Getstatus times out (%x) on fdc %d\n", status, fdc);
1117 show_floppy();
1118 }
1119 FDCS->reset = 1;
1120 return -1;
1121 }
1122
1123
1124 static int output_byte(char byte)
1125 {
1126 int status = wait_til_ready();
1127
1128 if (status < 0)
1129 return -1;
1130
1131 if (is_ready_state(status)) {
1132 fd_outb(byte, FD_DATA);
1133 output_log[output_log_pos].data = byte;
1134 output_log[output_log_pos].status = status;
1135 output_log[output_log_pos].jiffies = jiffies;
1136 output_log_pos = (output_log_pos + 1) % OLOGSIZE;
1137 return 0;
1138 }
1139 FDCS->reset = 1;
1140 if (initialized) {
1141 DPRINT("Unable to send byte %x to FDC. Fdc=%x Status=%x\n",
1142 byte, fdc, status);
1143 show_floppy();
1144 }
1145 return -1;
1146 }
1147
1148
1149 static int result(void)
1150 {
1151 int i;
1152 int status = 0;
1153
1154 for (i = 0; i < MAX_REPLIES; i++) {
1155 status = wait_til_ready();
1156 if (status < 0)
1157 break;
1158 status &= STATUS_DIR | STATUS_READY | STATUS_BUSY | STATUS_DMA;
1159 if ((status & ~STATUS_BUSY) == STATUS_READY) {
1160 resultjiffies = jiffies;
1161 resultsize = i;
1162 return i;
1163 }
1164 if (status == (STATUS_DIR | STATUS_READY | STATUS_BUSY))
1165 reply_buffer[i] = fd_inb(FD_DATA);
1166 else
1167 break;
1168 }
1169 if (initialized) {
1170 DPRINT("get result error. Fdc=%d Last status=%x Read bytes=%d\n",
1171 fdc, status, i);
1172 show_floppy();
1173 }
1174 FDCS->reset = 1;
1175 return -1;
1176 }
1177
1178 #define MORE_OUTPUT -2
1179
1180 static int need_more_output(void)
1181 {
1182 int status = wait_til_ready();
1183
1184 if (status < 0)
1185 return -1;
1186
1187 if (is_ready_state(status))
1188 return MORE_OUTPUT;
1189
1190 return result();
1191 }
1192
1193
1194
1195
1196 static void perpendicular_mode(void)
1197 {
1198 unsigned char perp_mode;
1199
1200 if (raw_cmd->rate & 0x40) {
1201 switch (raw_cmd->rate & 3) {
1202 case 0:
1203 perp_mode = 2;
1204 break;
1205 case 3:
1206 perp_mode = 3;
1207 break;
1208 default:
1209 DPRINT("Invalid data rate for perpendicular mode!\n");
1210 cont->done(0);
1211 FDCS->reset = 1;
1212
1213
1214
1215
1216
1217 return;
1218 }
1219 } else
1220 perp_mode = 0;
1221
1222 if (FDCS->perp_mode == perp_mode)
1223 return;
1224 if (FDCS->version >= FDC_82077_ORIG) {
1225 output_byte(FD_PERPENDICULAR);
1226 output_byte(perp_mode);
1227 FDCS->perp_mode = perp_mode;
1228 } else if (perp_mode) {
1229 DPRINT("perpendicular mode not supported by this FDC.\n");
1230 }
1231 }
1232
1233 static int fifo_depth = 0xa;
1234 static int no_fifo;
1235
1236 static int fdc_configure(void)
1237 {
1238
1239 output_byte(FD_CONFIGURE);
1240 if (need_more_output() != MORE_OUTPUT)
1241 return 0;
1242 output_byte(0);
1243 output_byte(0x10 | (no_fifo & 0x20) | (fifo_depth & 0xf));
1244 output_byte(0);
1245
1246 return 1;
1247 }
1248
1249 #define NOMINAL_DTR 500
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270 static void fdc_specify(void)
1271 {
1272 unsigned char spec1;
1273 unsigned char spec2;
1274 unsigned long srt;
1275 unsigned long hlt;
1276 unsigned long hut;
1277 unsigned long dtr = NOMINAL_DTR;
1278 unsigned long scale_dtr = NOMINAL_DTR;
1279 int hlt_max_code = 0x7f;
1280 int hut_max_code = 0xf;
1281
1282 if (FDCS->need_configure && FDCS->version >= FDC_82072A) {
1283 fdc_configure();
1284 FDCS->need_configure = 0;
1285 }
1286
1287 switch (raw_cmd->rate & 0x03) {
1288 case 3:
1289 dtr = 1000;
1290 break;
1291 case 1:
1292 dtr = 300;
1293 if (FDCS->version >= FDC_82078) {
1294
1295
1296 output_byte(FD_DRIVESPEC);
1297 if (need_more_output() == MORE_OUTPUT) {
1298 output_byte(UNIT(current_drive));
1299 output_byte(0xc0);
1300 }
1301 }
1302 break;
1303 case 2:
1304 dtr = 250;
1305 break;
1306 }
1307
1308 if (FDCS->version >= FDC_82072) {
1309 scale_dtr = dtr;
1310 hlt_max_code = 0x00;
1311 hut_max_code = 0x0;
1312 }
1313
1314
1315 srt = 16 - DIV_ROUND_UP(DP->srt * scale_dtr / 1000, NOMINAL_DTR);
1316 if (slow_floppy)
1317 srt = srt / 4;
1318
1319 SUPBOUND(srt, 0xf);
1320 INFBOUND(srt, 0);
1321
1322 hlt = DIV_ROUND_UP(DP->hlt * scale_dtr / 2, NOMINAL_DTR);
1323 if (hlt < 0x01)
1324 hlt = 0x01;
1325 else if (hlt > 0x7f)
1326 hlt = hlt_max_code;
1327
1328 hut = DIV_ROUND_UP(DP->hut * scale_dtr / 16, NOMINAL_DTR);
1329 if (hut < 0x1)
1330 hut = 0x1;
1331 else if (hut > 0xf)
1332 hut = hut_max_code;
1333
1334 spec1 = (srt << 4) | hut;
1335 spec2 = (hlt << 1) | (use_virtual_dma & 1);
1336
1337
1338 if (FDCS->spec1 != spec1 || FDCS->spec2 != spec2) {
1339
1340 output_byte(FD_SPECIFY);
1341 output_byte(FDCS->spec1 = spec1);
1342 output_byte(FDCS->spec2 = spec2);
1343 }
1344 }
1345
1346
1347
1348
1349
1350 static int fdc_dtr(void)
1351 {
1352
1353 if ((raw_cmd->rate & 3) == FDCS->dtr)
1354 return 0;
1355
1356
1357 fd_outb(raw_cmd->rate & 3, FD_DCR);
1358
1359
1360
1361
1362
1363
1364 FDCS->dtr = raw_cmd->rate & 3;
1365 return fd_wait_for_completion(jiffies + 2UL * HZ / 100, floppy_ready);
1366 }
1367
1368 static void tell_sector(void)
1369 {
1370 pr_cont(": track %d, head %d, sector %d, size %d",
1371 R_TRACK, R_HEAD, R_SECTOR, R_SIZECODE);
1372 }
1373
1374 static void print_errors(void)
1375 {
1376 DPRINT("");
1377 if (ST0 & ST0_ECE) {
1378 pr_cont("Recalibrate failed!");
1379 } else if (ST2 & ST2_CRC) {
1380 pr_cont("data CRC error");
1381 tell_sector();
1382 } else if (ST1 & ST1_CRC) {
1383 pr_cont("CRC error");
1384 tell_sector();
1385 } else if ((ST1 & (ST1_MAM | ST1_ND)) ||
1386 (ST2 & ST2_MAM)) {
1387 if (!probing) {
1388 pr_cont("sector not found");
1389 tell_sector();
1390 } else
1391 pr_cont("probe failed...");
1392 } else if (ST2 & ST2_WC) {
1393 pr_cont("wrong cylinder");
1394 } else if (ST2 & ST2_BC) {
1395 pr_cont("bad cylinder");
1396 } else {
1397 pr_cont("unknown error. ST[0..2] are: 0x%x 0x%x 0x%x",
1398 ST0, ST1, ST2);
1399 tell_sector();
1400 }
1401 pr_cont("\n");
1402 }
1403
1404
1405
1406
1407
1408
1409
1410
1411 static int interpret_errors(void)
1412 {
1413 char bad;
1414
1415 if (inr != 7) {
1416 DPRINT("-- FDC reply error\n");
1417 FDCS->reset = 1;
1418 return 1;
1419 }
1420
1421
1422 switch (ST0 & ST0_INTR) {
1423 case 0x40:
1424 if (ST1 & ST1_EOC)
1425 return 0;
1426 bad = 1;
1427 if (ST1 & ST1_WP) {
1428 DPRINT("Drive is write protected\n");
1429 clear_bit(FD_DISK_WRITABLE_BIT, &DRS->flags);
1430 cont->done(0);
1431 bad = 2;
1432 } else if (ST1 & ST1_ND) {
1433 set_bit(FD_NEED_TWADDLE_BIT, &DRS->flags);
1434 } else if (ST1 & ST1_OR) {
1435 if (DP->flags & FTD_MSG)
1436 DPRINT("Over/Underrun - retrying\n");
1437 bad = 0;
1438 } else if (*errors >= DP->max_errors.reporting) {
1439 print_errors();
1440 }
1441 if (ST2 & ST2_WC || ST2 & ST2_BC)
1442
1443 DRS->track = NEED_2_RECAL;
1444 return bad;
1445 case 0x80:
1446 DPRINT("Invalid FDC command given!\n");
1447 cont->done(0);
1448 return 2;
1449 case 0xc0:
1450 DPRINT("Abnormal termination caused by polling\n");
1451 cont->error();
1452 return 2;
1453 default:
1454 return 0;
1455 }
1456 }
1457
1458
1459
1460
1461
1462
1463 static void setup_rw_floppy(void)
1464 {
1465 int i;
1466 int r;
1467 int flags;
1468 unsigned long ready_date;
1469 void (*function)(void);
1470
1471 flags = raw_cmd->flags;
1472 if (flags & (FD_RAW_READ | FD_RAW_WRITE))
1473 flags |= FD_RAW_INTR;
1474
1475 if ((flags & FD_RAW_SPIN) && !(flags & FD_RAW_NO_MOTOR)) {
1476 ready_date = DRS->spinup_date + DP->spinup;
1477
1478
1479
1480
1481 if (time_after(ready_date, jiffies + DP->select_delay)) {
1482 ready_date -= DP->select_delay;
1483 function = floppy_start;
1484 } else
1485 function = setup_rw_floppy;
1486
1487
1488 if (fd_wait_for_completion(ready_date, function))
1489 return;
1490 }
1491 if ((flags & FD_RAW_READ) || (flags & FD_RAW_WRITE))
1492 setup_DMA();
1493
1494 if (flags & FD_RAW_INTR)
1495 do_floppy = main_command_interrupt;
1496
1497 r = 0;
1498 for (i = 0; i < raw_cmd->cmd_count; i++)
1499 r |= output_byte(raw_cmd->cmd[i]);
1500
1501 debugt(__func__, "rw_command");
1502
1503 if (r) {
1504 cont->error();
1505 reset_fdc();
1506 return;
1507 }
1508
1509 if (!(flags & FD_RAW_INTR)) {
1510 inr = result();
1511 cont->interrupt();
1512 } else if (flags & FD_RAW_NEED_DISK)
1513 fd_watchdog();
1514 }
1515
1516 static int blind_seek;
1517
1518
1519
1520
1521
1522 static void seek_interrupt(void)
1523 {
1524 debugt(__func__, "");
1525 if (inr != 2 || (ST0 & 0xF8) != 0x20) {
1526 DPRINT("seek failed\n");
1527 DRS->track = NEED_2_RECAL;
1528 cont->error();
1529 cont->redo();
1530 return;
1531 }
1532 if (DRS->track >= 0 && DRS->track != ST1 && !blind_seek) {
1533 debug_dcl(DP->flags,
1534 "clearing NEWCHANGE flag because of effective seek\n");
1535 debug_dcl(DP->flags, "jiffies=%lu\n", jiffies);
1536 clear_bit(FD_DISK_NEWCHANGE_BIT, &DRS->flags);
1537
1538 DRS->select_date = jiffies;
1539 }
1540 DRS->track = ST1;
1541 floppy_ready();
1542 }
1543
1544 static void check_wp(void)
1545 {
1546 if (test_bit(FD_VERIFY_BIT, &DRS->flags)) {
1547
1548 output_byte(FD_GETSTATUS);
1549 output_byte(UNIT(current_drive));
1550 if (result() != 1) {
1551 FDCS->reset = 1;
1552 return;
1553 }
1554 clear_bit(FD_VERIFY_BIT, &DRS->flags);
1555 clear_bit(FD_NEED_TWADDLE_BIT, &DRS->flags);
1556 debug_dcl(DP->flags,
1557 "checking whether disk is write protected\n");
1558 debug_dcl(DP->flags, "wp=%x\n", ST3 & 0x40);
1559 if (!(ST3 & 0x40))
1560 set_bit(FD_DISK_WRITABLE_BIT, &DRS->flags);
1561 else
1562 clear_bit(FD_DISK_WRITABLE_BIT, &DRS->flags);
1563 }
1564 }
1565
1566 static void seek_floppy(void)
1567 {
1568 int track;
1569
1570 blind_seek = 0;
1571
1572 debug_dcl(DP->flags, "calling disk change from %s\n", __func__);
1573
1574 if (!test_bit(FD_DISK_NEWCHANGE_BIT, &DRS->flags) &&
1575 disk_change(current_drive) && (raw_cmd->flags & FD_RAW_NEED_DISK)) {
1576
1577
1578
1579
1580 set_bit(FD_DISK_CHANGED_BIT, &DRS->flags);
1581 cont->done(0);
1582 cont->redo();
1583 return;
1584 }
1585 if (DRS->track <= NEED_1_RECAL) {
1586 recalibrate_floppy();
1587 return;
1588 } else if (test_bit(FD_DISK_NEWCHANGE_BIT, &DRS->flags) &&
1589 (raw_cmd->flags & FD_RAW_NEED_DISK) &&
1590 (DRS->track <= NO_TRACK || DRS->track == raw_cmd->track)) {
1591
1592
1593 if (raw_cmd->track)
1594 track = raw_cmd->track - 1;
1595 else {
1596 if (DP->flags & FD_SILENT_DCL_CLEAR) {
1597 set_dor(fdc, ~(0x10 << UNIT(current_drive)), 0);
1598 blind_seek = 1;
1599 raw_cmd->flags |= FD_RAW_NEED_SEEK;
1600 }
1601 track = 1;
1602 }
1603 } else {
1604 check_wp();
1605 if (raw_cmd->track != DRS->track &&
1606 (raw_cmd->flags & FD_RAW_NEED_SEEK))
1607 track = raw_cmd->track;
1608 else {
1609 setup_rw_floppy();
1610 return;
1611 }
1612 }
1613
1614 do_floppy = seek_interrupt;
1615 output_byte(FD_SEEK);
1616 output_byte(UNIT(current_drive));
1617 if (output_byte(track) < 0) {
1618 reset_fdc();
1619 return;
1620 }
1621 debugt(__func__, "");
1622 }
1623
1624 static void recal_interrupt(void)
1625 {
1626 debugt(__func__, "");
1627 if (inr != 2)
1628 FDCS->reset = 1;
1629 else if (ST0 & ST0_ECE) {
1630 switch (DRS->track) {
1631 case NEED_1_RECAL:
1632 debugt(__func__, "need 1 recal");
1633
1634
1635
1636
1637 cont->error();
1638 cont->redo();
1639 return;
1640 case NEED_2_RECAL:
1641 debugt(__func__, "need 2 recal");
1642
1643
1644
1645
1646
1647
1648 debug_dcl(DP->flags,
1649 "clearing NEWCHANGE flag because of second recalibrate\n");
1650
1651 clear_bit(FD_DISK_NEWCHANGE_BIT, &DRS->flags);
1652 DRS->select_date = jiffies;
1653
1654 default:
1655 debugt(__func__, "default");
1656
1657
1658
1659
1660
1661
1662 DRS->track = NEED_1_RECAL;
1663 break;
1664 }
1665 } else
1666 DRS->track = ST1;
1667 floppy_ready();
1668 }
1669
1670 static void print_result(char *message, int inr)
1671 {
1672 int i;
1673
1674 DPRINT("%s ", message);
1675 if (inr >= 0)
1676 for (i = 0; i < inr; i++)
1677 pr_cont("repl[%d]=%x ", i, reply_buffer[i]);
1678 pr_cont("\n");
1679 }
1680
1681
1682 irqreturn_t floppy_interrupt(int irq, void *dev_id)
1683 {
1684 int do_print;
1685 unsigned long f;
1686 void (*handler)(void) = do_floppy;
1687
1688 lasthandler = handler;
1689 interruptjiffies = jiffies;
1690
1691 f = claim_dma_lock();
1692 fd_disable_dma();
1693 release_dma_lock(f);
1694
1695 do_floppy = NULL;
1696 if (fdc >= N_FDC || FDCS->address == -1) {
1697
1698 pr_info("DOR0=%x\n", fdc_state[0].dor);
1699 pr_info("floppy interrupt on bizarre fdc %d\n", fdc);
1700 pr_info("handler=%ps\n", handler);
1701 is_alive(__func__, "bizarre fdc");
1702 return IRQ_NONE;
1703 }
1704
1705 FDCS->reset = 0;
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715 do_print = !handler && print_unex && initialized;
1716
1717 inr = result();
1718 if (do_print)
1719 print_result("unexpected interrupt", inr);
1720 if (inr == 0) {
1721 int max_sensei = 4;
1722 do {
1723 output_byte(FD_SENSEI);
1724 inr = result();
1725 if (do_print)
1726 print_result("sensei", inr);
1727 max_sensei--;
1728 } while ((ST0 & 0x83) != UNIT(current_drive) &&
1729 inr == 2 && max_sensei);
1730 }
1731 if (!handler) {
1732 FDCS->reset = 1;
1733 return IRQ_NONE;
1734 }
1735 schedule_bh(handler);
1736 is_alive(__func__, "normal interrupt end");
1737
1738
1739 return IRQ_HANDLED;
1740 }
1741
1742 static void recalibrate_floppy(void)
1743 {
1744 debugt(__func__, "");
1745 do_floppy = recal_interrupt;
1746 output_byte(FD_RECALIBRATE);
1747 if (output_byte(UNIT(current_drive)) < 0)
1748 reset_fdc();
1749 }
1750
1751
1752
1753
1754 static void reset_interrupt(void)
1755 {
1756 debugt(__func__, "");
1757 result();
1758 if (FDCS->reset) {
1759 pr_info("reset set in interrupt, calling %ps\n", cont->error);
1760 cont->error();
1761 }
1762 cont->redo();
1763 }
1764
1765
1766
1767
1768
1769 static void reset_fdc(void)
1770 {
1771 unsigned long flags;
1772
1773 do_floppy = reset_interrupt;
1774 FDCS->reset = 0;
1775 reset_fdc_info(0);
1776
1777
1778
1779
1780 flags = claim_dma_lock();
1781 fd_disable_dma();
1782 release_dma_lock(flags);
1783
1784 if (FDCS->version >= FDC_82072A)
1785 fd_outb(0x80 | (FDCS->dtr & 3), FD_STATUS);
1786 else {
1787 fd_outb(FDCS->dor & ~0x04, FD_DOR);
1788 udelay(FD_RESET_DELAY);
1789 fd_outb(FDCS->dor, FD_DOR);
1790 }
1791 }
1792
1793 static void show_floppy(void)
1794 {
1795 int i;
1796
1797 pr_info("\n");
1798 pr_info("floppy driver state\n");
1799 pr_info("-------------------\n");
1800 pr_info("now=%lu last interrupt=%lu diff=%lu last called handler=%ps\n",
1801 jiffies, interruptjiffies, jiffies - interruptjiffies,
1802 lasthandler);
1803
1804 pr_info("timeout_message=%s\n", timeout_message);
1805 pr_info("last output bytes:\n");
1806 for (i = 0; i < OLOGSIZE; i++)
1807 pr_info("%2x %2x %lu\n",
1808 output_log[(i + output_log_pos) % OLOGSIZE].data,
1809 output_log[(i + output_log_pos) % OLOGSIZE].status,
1810 output_log[(i + output_log_pos) % OLOGSIZE].jiffies);
1811 pr_info("last result at %lu\n", resultjiffies);
1812 pr_info("last redo_fd_request at %lu\n", lastredo);
1813 print_hex_dump(KERN_INFO, "", DUMP_PREFIX_NONE, 16, 1,
1814 reply_buffer, resultsize, true);
1815
1816 pr_info("status=%x\n", fd_inb(FD_STATUS));
1817 pr_info("fdc_busy=%lu\n", fdc_busy);
1818 if (do_floppy)
1819 pr_info("do_floppy=%ps\n", do_floppy);
1820 if (work_pending(&floppy_work))
1821 pr_info("floppy_work.func=%ps\n", floppy_work.func);
1822 if (delayed_work_pending(&fd_timer))
1823 pr_info("delayed work.function=%p expires=%ld\n",
1824 fd_timer.work.func,
1825 fd_timer.timer.expires - jiffies);
1826 if (delayed_work_pending(&fd_timeout))
1827 pr_info("timer_function=%p expires=%ld\n",
1828 fd_timeout.work.func,
1829 fd_timeout.timer.expires - jiffies);
1830
1831 pr_info("cont=%p\n", cont);
1832 pr_info("current_req=%p\n", current_req);
1833 pr_info("command_status=%d\n", command_status);
1834 pr_info("\n");
1835 }
1836
1837 static void floppy_shutdown(struct work_struct *arg)
1838 {
1839 unsigned long flags;
1840
1841 if (initialized)
1842 show_floppy();
1843 cancel_activity();
1844
1845 flags = claim_dma_lock();
1846 fd_disable_dma();
1847 release_dma_lock(flags);
1848
1849
1850
1851 if (initialized)
1852 DPRINT("floppy timeout called\n");
1853 FDCS->reset = 1;
1854 if (cont) {
1855 cont->done(0);
1856 cont->redo();
1857 } else {
1858 pr_info("no cont in shutdown!\n");
1859 process_fd_request();
1860 }
1861 is_alive(__func__, "");
1862 }
1863
1864
1865 static int start_motor(void (*function)(void))
1866 {
1867 int mask;
1868 int data;
1869
1870 mask = 0xfc;
1871 data = UNIT(current_drive);
1872 if (!(raw_cmd->flags & FD_RAW_NO_MOTOR)) {
1873 if (!(FDCS->dor & (0x10 << UNIT(current_drive)))) {
1874 set_debugt();
1875
1876 DRS->first_read_date = 0;
1877
1878 DRS->spinup_date = jiffies;
1879 data |= (0x10 << UNIT(current_drive));
1880 }
1881 } else if (FDCS->dor & (0x10 << UNIT(current_drive)))
1882 mask &= ~(0x10 << UNIT(current_drive));
1883
1884
1885 del_timer(motor_off_timer + current_drive);
1886 set_dor(fdc, mask, data);
1887
1888
1889 return fd_wait_for_completion(DRS->select_date + DP->select_delay,
1890 function);
1891 }
1892
1893 static void floppy_ready(void)
1894 {
1895 if (FDCS->reset) {
1896 reset_fdc();
1897 return;
1898 }
1899 if (start_motor(floppy_ready))
1900 return;
1901 if (fdc_dtr())
1902 return;
1903
1904 debug_dcl(DP->flags, "calling disk change from floppy_ready\n");
1905 if (!(raw_cmd->flags & FD_RAW_NO_MOTOR) &&
1906 disk_change(current_drive) && !DP->select_delay)
1907 twaddle();
1908
1909
1910 #ifdef fd_chose_dma_mode
1911 if ((raw_cmd->flags & FD_RAW_READ) || (raw_cmd->flags & FD_RAW_WRITE)) {
1912 unsigned long flags = claim_dma_lock();
1913 fd_chose_dma_mode(raw_cmd->kernel_data, raw_cmd->length);
1914 release_dma_lock(flags);
1915 }
1916 #endif
1917
1918 if (raw_cmd->flags & (FD_RAW_NEED_SEEK | FD_RAW_NEED_DISK)) {
1919 perpendicular_mode();
1920 fdc_specify();
1921 seek_floppy();
1922 } else {
1923 if ((raw_cmd->flags & FD_RAW_READ) ||
1924 (raw_cmd->flags & FD_RAW_WRITE))
1925 fdc_specify();
1926 setup_rw_floppy();
1927 }
1928 }
1929
1930 static void floppy_start(void)
1931 {
1932 reschedule_timeout(current_reqD, "floppy start");
1933
1934 scandrives();
1935 debug_dcl(DP->flags, "setting NEWCHANGE in floppy_start\n");
1936 set_bit(FD_DISK_NEWCHANGE_BIT, &DRS->flags);
1937 floppy_ready();
1938 }
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954 static void do_wakeup(void)
1955 {
1956 reschedule_timeout(MAXTIMEOUT, "do wakeup");
1957 cont = NULL;
1958 command_status += 2;
1959 wake_up(&command_done);
1960 }
1961
1962 static const struct cont_t wakeup_cont = {
1963 .interrupt = empty,
1964 .redo = do_wakeup,
1965 .error = empty,
1966 .done = (done_f)empty
1967 };
1968
1969 static const struct cont_t intr_cont = {
1970 .interrupt = empty,
1971 .redo = process_fd_request,
1972 .error = empty,
1973 .done = (done_f)empty
1974 };
1975
1976 static int wait_til_done(void (*handler)(void), bool interruptible)
1977 {
1978 int ret;
1979
1980 schedule_bh(handler);
1981
1982 if (interruptible)
1983 wait_event_interruptible(command_done, command_status >= 2);
1984 else
1985 wait_event(command_done, command_status >= 2);
1986
1987 if (command_status < 2) {
1988 cancel_activity();
1989 cont = &intr_cont;
1990 reset_fdc();
1991 return -EINTR;
1992 }
1993
1994 if (FDCS->reset)
1995 command_status = FD_COMMAND_ERROR;
1996 if (command_status == FD_COMMAND_OKAY)
1997 ret = 0;
1998 else
1999 ret = -EIO;
2000 command_status = FD_COMMAND_NONE;
2001 return ret;
2002 }
2003
2004 static void generic_done(int result)
2005 {
2006 command_status = result;
2007 cont = &wakeup_cont;
2008 }
2009
2010 static void generic_success(void)
2011 {
2012 cont->done(1);
2013 }
2014
2015 static void generic_failure(void)
2016 {
2017 cont->done(0);
2018 }
2019
2020 static void success_and_wakeup(void)
2021 {
2022 generic_success();
2023 cont->redo();
2024 }
2025
2026
2027
2028
2029
2030
2031 static int next_valid_format(void)
2032 {
2033 int probed_format;
2034
2035 probed_format = DRS->probed_format;
2036 while (1) {
2037 if (probed_format >= 8 || !DP->autodetect[probed_format]) {
2038 DRS->probed_format = 0;
2039 return 1;
2040 }
2041 if (floppy_type[DP->autodetect[probed_format]].sect) {
2042 DRS->probed_format = probed_format;
2043 return 0;
2044 }
2045 probed_format++;
2046 }
2047 }
2048
2049 static void bad_flp_intr(void)
2050 {
2051 int err_count;
2052
2053 if (probing) {
2054 DRS->probed_format++;
2055 if (!next_valid_format())
2056 return;
2057 }
2058 err_count = ++(*errors);
2059 INFBOUND(DRWE->badness, err_count);
2060 if (err_count > DP->max_errors.abort)
2061 cont->done(0);
2062 if (err_count > DP->max_errors.reset)
2063 FDCS->reset = 1;
2064 else if (err_count > DP->max_errors.recal)
2065 DRS->track = NEED_2_RECAL;
2066 }
2067
2068 static void set_floppy(int drive)
2069 {
2070 int type = ITYPE(UDRS->fd_device);
2071
2072 if (type)
2073 _floppy = floppy_type + type;
2074 else
2075 _floppy = current_type[drive];
2076 }
2077
2078
2079
2080
2081
2082 static void format_interrupt(void)
2083 {
2084 switch (interpret_errors()) {
2085 case 1:
2086 cont->error();
2087 case 2:
2088 break;
2089 case 0:
2090 cont->done(1);
2091 }
2092 cont->redo();
2093 }
2094
2095 #define FM_MODE(x, y) ((y) & ~(((x)->rate & 0x80) >> 1))
2096 #define CT(x) ((x) | 0xc0)
2097
2098 static void setup_format_params(int track)
2099 {
2100 int n;
2101 int il;
2102 int count;
2103 int head_shift;
2104 int track_shift;
2105 struct fparm {
2106 unsigned char track, head, sect, size;
2107 } *here = (struct fparm *)floppy_track_buffer;
2108
2109 raw_cmd = &default_raw_cmd;
2110 raw_cmd->track = track;
2111
2112 raw_cmd->flags = (FD_RAW_WRITE | FD_RAW_INTR | FD_RAW_SPIN |
2113 FD_RAW_NEED_DISK | FD_RAW_NEED_SEEK);
2114 raw_cmd->rate = _floppy->rate & 0x43;
2115 raw_cmd->cmd_count = NR_F;
2116 COMMAND = FM_MODE(_floppy, FD_FORMAT);
2117 DR_SELECT = UNIT(current_drive) + PH_HEAD(_floppy, format_req.head);
2118 F_SIZECODE = FD_SIZECODE(_floppy);
2119 F_SECT_PER_TRACK = _floppy->sect << 2 >> F_SIZECODE;
2120 F_GAP = _floppy->fmt_gap;
2121 F_FILL = FD_FILL_BYTE;
2122
2123 raw_cmd->kernel_data = floppy_track_buffer;
2124 raw_cmd->length = 4 * F_SECT_PER_TRACK;
2125
2126 if (!F_SECT_PER_TRACK)
2127 return;
2128
2129
2130 head_shift = (F_SECT_PER_TRACK + 5) / 6;
2131
2132
2133 track_shift = 2 * head_shift + 3;
2134
2135
2136 n = (track_shift * format_req.track + head_shift * format_req.head)
2137 % F_SECT_PER_TRACK;
2138
2139
2140 il = 1;
2141 if (_floppy->fmt_gap < 0x22)
2142 il++;
2143
2144
2145 for (count = 0; count < F_SECT_PER_TRACK; ++count) {
2146 here[count].track = format_req.track;
2147 here[count].head = format_req.head;
2148 here[count].sect = 0;
2149 here[count].size = F_SIZECODE;
2150 }
2151
2152 for (count = 1; count <= F_SECT_PER_TRACK; ++count) {
2153 here[n].sect = count;
2154 n = (n + il) % F_SECT_PER_TRACK;
2155 if (here[n].sect) {
2156 ++n;
2157 if (n >= F_SECT_PER_TRACK) {
2158 n -= F_SECT_PER_TRACK;
2159 while (here[n].sect)
2160 ++n;
2161 }
2162 }
2163 }
2164 if (_floppy->stretch & FD_SECTBASEMASK) {
2165 for (count = 0; count < F_SECT_PER_TRACK; count++)
2166 here[count].sect += FD_SECTBASE(_floppy) - 1;
2167 }
2168 }
2169
2170 static void redo_format(void)
2171 {
2172 buffer_track = -1;
2173 setup_format_params(format_req.track << STRETCH(_floppy));
2174 floppy_start();
2175 debugt(__func__, "queue format request");
2176 }
2177
2178 static const struct cont_t format_cont = {
2179 .interrupt = format_interrupt,
2180 .redo = redo_format,
2181 .error = bad_flp_intr,
2182 .done = generic_done
2183 };
2184
2185 static int do_format(int drive, struct format_descr *tmp_format_req)
2186 {
2187 int ret;
2188
2189 if (lock_fdc(drive))
2190 return -EINTR;
2191
2192 set_floppy(drive);
2193 if (!_floppy ||
2194 _floppy->track > DP->tracks ||
2195 tmp_format_req->track >= _floppy->track ||
2196 tmp_format_req->head >= _floppy->head ||
2197 (_floppy->sect << 2) % (1 << FD_SIZECODE(_floppy)) ||
2198 !_floppy->fmt_gap) {
2199 process_fd_request();
2200 return -EINVAL;
2201 }
2202 format_req = *tmp_format_req;
2203 format_errors = 0;
2204 cont = &format_cont;
2205 errors = &format_errors;
2206 ret = wait_til_done(redo_format, true);
2207 if (ret == -EINTR)
2208 return -EINTR;
2209 process_fd_request();
2210 return ret;
2211 }
2212
2213
2214
2215
2216
2217
2218 static void floppy_end_request(struct request *req, blk_status_t error)
2219 {
2220 unsigned int nr_sectors = current_count_sectors;
2221 unsigned int drive = (unsigned long)req->rq_disk->private_data;
2222
2223
2224 if (error)
2225 nr_sectors = blk_rq_cur_sectors(req);
2226 if (blk_update_request(req, error, nr_sectors << 9))
2227 return;
2228 __blk_mq_end_request(req, error);
2229
2230
2231 floppy_off(drive);
2232 current_req = NULL;
2233 }
2234
2235
2236
2237 static void request_done(int uptodate)
2238 {
2239 struct request *req = current_req;
2240 int block;
2241 char msg[sizeof("request done ") + sizeof(int) * 3];
2242
2243 probing = 0;
2244 snprintf(msg, sizeof(msg), "request done %d", uptodate);
2245 reschedule_timeout(MAXTIMEOUT, msg);
2246
2247 if (!req) {
2248 pr_info("floppy.c: no request in request_done\n");
2249 return;
2250 }
2251
2252 if (uptodate) {
2253
2254
2255 block = current_count_sectors + blk_rq_pos(req);
2256 INFBOUND(DRS->maxblock, block);
2257 if (block > _floppy->sect)
2258 DRS->maxtrack = 1;
2259
2260 floppy_end_request(req, 0);
2261 } else {
2262 if (rq_data_dir(req) == WRITE) {
2263
2264 DRWE->write_errors++;
2265 if (DRWE->write_errors == 1) {
2266 DRWE->first_error_sector = blk_rq_pos(req);
2267 DRWE->first_error_generation = DRS->generation;
2268 }
2269 DRWE->last_error_sector = blk_rq_pos(req);
2270 DRWE->last_error_generation = DRS->generation;
2271 }
2272 floppy_end_request(req, BLK_STS_IOERR);
2273 }
2274 }
2275
2276
2277 static void rw_interrupt(void)
2278 {
2279 int eoc;
2280 int ssize;
2281 int heads;
2282 int nr_sectors;
2283
2284 if (R_HEAD >= 2) {
2285
2286
2287
2288 return;
2289 }
2290
2291 if (!DRS->first_read_date)
2292 DRS->first_read_date = jiffies;
2293
2294 nr_sectors = 0;
2295 ssize = DIV_ROUND_UP(1 << SIZECODE, 4);
2296
2297 if (ST1 & ST1_EOC)
2298 eoc = 1;
2299 else
2300 eoc = 0;
2301
2302 if (COMMAND & 0x80)
2303 heads = 2;
2304 else
2305 heads = 1;
2306
2307 nr_sectors = (((R_TRACK - TRACK) * heads +
2308 R_HEAD - HEAD) * SECT_PER_TRACK +
2309 R_SECTOR - SECTOR + eoc) << SIZECODE >> 2;
2310
2311 if (nr_sectors / ssize >
2312 DIV_ROUND_UP(in_sector_offset + current_count_sectors, ssize)) {
2313 DPRINT("long rw: %x instead of %lx\n",
2314 nr_sectors, current_count_sectors);
2315 pr_info("rs=%d s=%d\n", R_SECTOR, SECTOR);
2316 pr_info("rh=%d h=%d\n", R_HEAD, HEAD);
2317 pr_info("rt=%d t=%d\n", R_TRACK, TRACK);
2318 pr_info("heads=%d eoc=%d\n", heads, eoc);
2319 pr_info("spt=%d st=%d ss=%d\n",
2320 SECT_PER_TRACK, fsector_t, ssize);
2321 pr_info("in_sector_offset=%d\n", in_sector_offset);
2322 }
2323
2324 nr_sectors -= in_sector_offset;
2325 INFBOUND(nr_sectors, 0);
2326 SUPBOUND(current_count_sectors, nr_sectors);
2327
2328 switch (interpret_errors()) {
2329 case 2:
2330 cont->redo();
2331 return;
2332 case 1:
2333 if (!current_count_sectors) {
2334 cont->error();
2335 cont->redo();
2336 return;
2337 }
2338 break;
2339 case 0:
2340 if (!current_count_sectors) {
2341 cont->redo();
2342 return;
2343 }
2344 current_type[current_drive] = _floppy;
2345 floppy_sizes[TOMINOR(current_drive)] = _floppy->size;
2346 break;
2347 }
2348
2349 if (probing) {
2350 if (DP->flags & FTD_MSG)
2351 DPRINT("Auto-detected floppy type %s in fd%d\n",
2352 _floppy->name, current_drive);
2353 current_type[current_drive] = _floppy;
2354 floppy_sizes[TOMINOR(current_drive)] = _floppy->size;
2355 probing = 0;
2356 }
2357
2358 if (CT(COMMAND) != FD_READ ||
2359 raw_cmd->kernel_data == bio_data(current_req->bio)) {
2360
2361 cont->done(1);
2362 } else if (CT(COMMAND) == FD_READ) {
2363 buffer_track = raw_cmd->track;
2364 buffer_drive = current_drive;
2365 INFBOUND(buffer_max, nr_sectors + fsector_t);
2366 }
2367 cont->redo();
2368 }
2369
2370
2371 static int buffer_chain_size(void)
2372 {
2373 struct bio_vec bv;
2374 int size;
2375 struct req_iterator iter;
2376 char *base;
2377
2378 base = bio_data(current_req->bio);
2379 size = 0;
2380
2381 rq_for_each_segment(bv, current_req, iter) {
2382 if (page_address(bv.bv_page) + bv.bv_offset != base + size)
2383 break;
2384
2385 size += bv.bv_len;
2386 }
2387
2388 return size >> 9;
2389 }
2390
2391
2392 static int transfer_size(int ssize, int max_sector, int max_size)
2393 {
2394 SUPBOUND(max_sector, fsector_t + max_size);
2395
2396
2397 max_sector -= (max_sector % _floppy->sect) % ssize;
2398
2399
2400 current_count_sectors = max_sector - fsector_t;
2401
2402 return max_sector;
2403 }
2404
2405
2406
2407
2408 static void copy_buffer(int ssize, int max_sector, int max_sector_2)
2409 {
2410 int remaining;
2411 struct bio_vec bv;
2412 char *buffer;
2413 char *dma_buffer;
2414 int size;
2415 struct req_iterator iter;
2416
2417 max_sector = transfer_size(ssize,
2418 min(max_sector, max_sector_2),
2419 blk_rq_sectors(current_req));
2420
2421 if (current_count_sectors <= 0 && CT(COMMAND) == FD_WRITE &&
2422 buffer_max > fsector_t + blk_rq_sectors(current_req))
2423 current_count_sectors = min_t(int, buffer_max - fsector_t,
2424 blk_rq_sectors(current_req));
2425
2426 remaining = current_count_sectors << 9;
2427 if (remaining > blk_rq_bytes(current_req) && CT(COMMAND) == FD_WRITE) {
2428 DPRINT("in copy buffer\n");
2429 pr_info("current_count_sectors=%ld\n", current_count_sectors);
2430 pr_info("remaining=%d\n", remaining >> 9);
2431 pr_info("current_req->nr_sectors=%u\n",
2432 blk_rq_sectors(current_req));
2433 pr_info("current_req->current_nr_sectors=%u\n",
2434 blk_rq_cur_sectors(current_req));
2435 pr_info("max_sector=%d\n", max_sector);
2436 pr_info("ssize=%d\n", ssize);
2437 }
2438
2439 buffer_max = max(max_sector, buffer_max);
2440
2441 dma_buffer = floppy_track_buffer + ((fsector_t - buffer_min) << 9);
2442
2443 size = blk_rq_cur_bytes(current_req);
2444
2445 rq_for_each_segment(bv, current_req, iter) {
2446 if (!remaining)
2447 break;
2448
2449 size = bv.bv_len;
2450 SUPBOUND(size, remaining);
2451
2452 buffer = page_address(bv.bv_page) + bv.bv_offset;
2453 if (dma_buffer + size >
2454 floppy_track_buffer + (max_buffer_sectors << 10) ||
2455 dma_buffer < floppy_track_buffer) {
2456 DPRINT("buffer overrun in copy buffer %d\n",
2457 (int)((floppy_track_buffer - dma_buffer) >> 9));
2458 pr_info("fsector_t=%d buffer_min=%d\n",
2459 fsector_t, buffer_min);
2460 pr_info("current_count_sectors=%ld\n",
2461 current_count_sectors);
2462 if (CT(COMMAND) == FD_READ)
2463 pr_info("read\n");
2464 if (CT(COMMAND) == FD_WRITE)
2465 pr_info("write\n");
2466 break;
2467 }
2468 if (((unsigned long)buffer) % 512)
2469 DPRINT("%p buffer not aligned\n", buffer);
2470
2471 if (CT(COMMAND) == FD_READ)
2472 memcpy(buffer, dma_buffer, size);
2473 else
2474 memcpy(dma_buffer, buffer, size);
2475
2476 remaining -= size;
2477 dma_buffer += size;
2478 }
2479 if (remaining) {
2480 if (remaining > 0)
2481 max_sector -= remaining >> 9;
2482 DPRINT("weirdness: remaining %d\n", remaining >> 9);
2483 }
2484 }
2485
2486
2487
2488
2489
2490
2491
2492
2493 static void virtualdmabug_workaround(void)
2494 {
2495 int hard_sectors;
2496 int end_sector;
2497
2498 if (CT(COMMAND) == FD_WRITE) {
2499 COMMAND &= ~0x80;
2500
2501 hard_sectors = raw_cmd->length >> (7 + SIZECODE);
2502 end_sector = SECTOR + hard_sectors - 1;
2503 if (end_sector > SECT_PER_TRACK) {
2504 pr_info("too many sectors %d > %d\n",
2505 end_sector, SECT_PER_TRACK);
2506 return;
2507 }
2508 SECT_PER_TRACK = end_sector;
2509
2510
2511 }
2512 }
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524 static int make_raw_rw_request(void)
2525 {
2526 int aligned_sector_t;
2527 int max_sector;
2528 int max_size;
2529 int tracksize;
2530 int ssize;
2531
2532 if (WARN(max_buffer_sectors == 0, "VFS: Block I/O scheduled on unopened device\n"))
2533 return 0;
2534
2535 set_fdc((long)current_req->rq_disk->private_data);
2536
2537 raw_cmd = &default_raw_cmd;
2538 raw_cmd->flags = FD_RAW_SPIN | FD_RAW_NEED_DISK | FD_RAW_NEED_SEEK;
2539 raw_cmd->cmd_count = NR_RW;
2540 if (rq_data_dir(current_req) == READ) {
2541 raw_cmd->flags |= FD_RAW_READ;
2542 COMMAND = FM_MODE(_floppy, FD_READ);
2543 } else if (rq_data_dir(current_req) == WRITE) {
2544 raw_cmd->flags |= FD_RAW_WRITE;
2545 COMMAND = FM_MODE(_floppy, FD_WRITE);
2546 } else {
2547 DPRINT("%s: unknown command\n", __func__);
2548 return 0;
2549 }
2550
2551 max_sector = _floppy->sect * _floppy->head;
2552
2553 TRACK = (int)blk_rq_pos(current_req) / max_sector;
2554 fsector_t = (int)blk_rq_pos(current_req) % max_sector;
2555 if (_floppy->track && TRACK >= _floppy->track) {
2556 if (blk_rq_cur_sectors(current_req) & 1) {
2557 current_count_sectors = 1;
2558 return 1;
2559 } else
2560 return 0;
2561 }
2562 HEAD = fsector_t / _floppy->sect;
2563
2564 if (((_floppy->stretch & (FD_SWAPSIDES | FD_SECTBASEMASK)) ||
2565 test_bit(FD_NEED_TWADDLE_BIT, &DRS->flags)) &&
2566 fsector_t < _floppy->sect)
2567 max_sector = _floppy->sect;
2568
2569
2570 if ((_floppy->rate & FD_2M) && (!TRACK) && (!HEAD)) {
2571 max_sector = 2 * _floppy->sect / 3;
2572 if (fsector_t >= max_sector) {
2573 current_count_sectors =
2574 min_t(int, _floppy->sect - fsector_t,
2575 blk_rq_sectors(current_req));
2576 return 1;
2577 }
2578 SIZECODE = 2;
2579 } else
2580 SIZECODE = FD_SIZECODE(_floppy);
2581 raw_cmd->rate = _floppy->rate & 0x43;
2582 if ((_floppy->rate & FD_2M) && (TRACK || HEAD) && raw_cmd->rate == 2)
2583 raw_cmd->rate = 1;
2584
2585 if (SIZECODE)
2586 SIZECODE2 = 0xff;
2587 else
2588 SIZECODE2 = 0x80;
2589 raw_cmd->track = TRACK << STRETCH(_floppy);
2590 DR_SELECT = UNIT(current_drive) + PH_HEAD(_floppy, HEAD);
2591 GAP = _floppy->gap;
2592 ssize = DIV_ROUND_UP(1 << SIZECODE, 4);
2593 SECT_PER_TRACK = _floppy->sect << 2 >> SIZECODE;
2594 SECTOR = ((fsector_t % _floppy->sect) << 2 >> SIZECODE) +
2595 FD_SECTBASE(_floppy);
2596
2597
2598
2599
2600 tracksize = _floppy->sect - _floppy->sect % ssize;
2601 if (tracksize < _floppy->sect) {
2602 SECT_PER_TRACK++;
2603 if (tracksize <= fsector_t % _floppy->sect)
2604 SECTOR--;
2605
2606
2607 while (tracksize <= fsector_t % _floppy->sect) {
2608 while (tracksize + ssize > _floppy->sect) {
2609 SIZECODE--;
2610 ssize >>= 1;
2611 }
2612 SECTOR++;
2613 SECT_PER_TRACK++;
2614 tracksize += ssize;
2615 }
2616 max_sector = HEAD * _floppy->sect + tracksize;
2617 } else if (!TRACK && !HEAD && !(_floppy->rate & FD_2M) && probing) {
2618 max_sector = _floppy->sect;
2619 } else if (!HEAD && CT(COMMAND) == FD_WRITE) {
2620
2621 max_sector = _floppy->sect;
2622 }
2623
2624 in_sector_offset = (fsector_t % _floppy->sect) % ssize;
2625 aligned_sector_t = fsector_t - in_sector_offset;
2626 max_size = blk_rq_sectors(current_req);
2627 if ((raw_cmd->track == buffer_track) &&
2628 (current_drive == buffer_drive) &&
2629 (fsector_t >= buffer_min) && (fsector_t < buffer_max)) {
2630
2631 if (CT(COMMAND) == FD_READ) {
2632 copy_buffer(1, max_sector, buffer_max);
2633 return 1;
2634 }
2635 } else if (in_sector_offset || blk_rq_sectors(current_req) < ssize) {
2636 if (CT(COMMAND) == FD_WRITE) {
2637 unsigned int sectors;
2638
2639 sectors = fsector_t + blk_rq_sectors(current_req);
2640 if (sectors > ssize && sectors < ssize + ssize)
2641 max_size = ssize + ssize;
2642 else
2643 max_size = ssize;
2644 }
2645 raw_cmd->flags &= ~FD_RAW_WRITE;
2646 raw_cmd->flags |= FD_RAW_READ;
2647 COMMAND = FM_MODE(_floppy, FD_READ);
2648 } else if ((unsigned long)bio_data(current_req->bio) < MAX_DMA_ADDRESS) {
2649 unsigned long dma_limit;
2650 int direct, indirect;
2651
2652 indirect =
2653 transfer_size(ssize, max_sector,
2654 max_buffer_sectors * 2) - fsector_t;
2655
2656
2657
2658
2659
2660 max_size = buffer_chain_size();
2661 dma_limit = (MAX_DMA_ADDRESS -
2662 ((unsigned long)bio_data(current_req->bio))) >> 9;
2663 if ((unsigned long)max_size > dma_limit)
2664 max_size = dma_limit;
2665
2666 if (CROSS_64KB(bio_data(current_req->bio), max_size << 9))
2667 max_size = (K_64 -
2668 ((unsigned long)bio_data(current_req->bio)) %
2669 K_64) >> 9;
2670 direct = transfer_size(ssize, max_sector, max_size) - fsector_t;
2671
2672
2673
2674
2675
2676
2677
2678 if (!direct ||
2679 (indirect * 2 > direct * 3 &&
2680 *errors < DP->max_errors.read_track &&
2681 ((!probing ||
2682 (DP->read_track & (1 << DRS->probed_format)))))) {
2683 max_size = blk_rq_sectors(current_req);
2684 } else {
2685 raw_cmd->kernel_data = bio_data(current_req->bio);
2686 raw_cmd->length = current_count_sectors << 9;
2687 if (raw_cmd->length == 0) {
2688 DPRINT("%s: zero dma transfer attempted\n", __func__);
2689 DPRINT("indirect=%d direct=%d fsector_t=%d\n",
2690 indirect, direct, fsector_t);
2691 return 0;
2692 }
2693 virtualdmabug_workaround();
2694 return 2;
2695 }
2696 }
2697
2698 if (CT(COMMAND) == FD_READ)
2699 max_size = max_sector;
2700
2701
2702 if (buffer_track != raw_cmd->track ||
2703 buffer_drive != current_drive ||
2704 fsector_t > buffer_max ||
2705 fsector_t < buffer_min ||
2706 ((CT(COMMAND) == FD_READ ||
2707 (!in_sector_offset && blk_rq_sectors(current_req) >= ssize)) &&
2708 max_sector > 2 * max_buffer_sectors + buffer_min &&
2709 max_size + fsector_t > 2 * max_buffer_sectors + buffer_min)) {
2710
2711 buffer_track = -1;
2712 buffer_drive = current_drive;
2713 buffer_max = buffer_min = aligned_sector_t;
2714 }
2715 raw_cmd->kernel_data = floppy_track_buffer +
2716 ((aligned_sector_t - buffer_min) << 9);
2717
2718 if (CT(COMMAND) == FD_WRITE) {
2719
2720
2721
2722
2723 if (in_sector_offset && buffer_track == -1)
2724 DPRINT("internal error offset !=0 on write\n");
2725 buffer_track = raw_cmd->track;
2726 buffer_drive = current_drive;
2727 copy_buffer(ssize, max_sector,
2728 2 * max_buffer_sectors + buffer_min);
2729 } else
2730 transfer_size(ssize, max_sector,
2731 2 * max_buffer_sectors + buffer_min -
2732 aligned_sector_t);
2733
2734
2735 raw_cmd->length = in_sector_offset + current_count_sectors;
2736 raw_cmd->length = ((raw_cmd->length - 1) | (ssize - 1)) + 1;
2737 raw_cmd->length <<= 9;
2738 if ((raw_cmd->length < current_count_sectors << 9) ||
2739 (raw_cmd->kernel_data != bio_data(current_req->bio) &&
2740 CT(COMMAND) == FD_WRITE &&
2741 (aligned_sector_t + (raw_cmd->length >> 9) > buffer_max ||
2742 aligned_sector_t < buffer_min)) ||
2743 raw_cmd->length % (128 << SIZECODE) ||
2744 raw_cmd->length <= 0 || current_count_sectors <= 0) {
2745 DPRINT("fractionary current count b=%lx s=%lx\n",
2746 raw_cmd->length, current_count_sectors);
2747 if (raw_cmd->kernel_data != bio_data(current_req->bio))
2748 pr_info("addr=%d, length=%ld\n",
2749 (int)((raw_cmd->kernel_data -
2750 floppy_track_buffer) >> 9),
2751 current_count_sectors);
2752 pr_info("st=%d ast=%d mse=%d msi=%d\n",
2753 fsector_t, aligned_sector_t, max_sector, max_size);
2754 pr_info("ssize=%x SIZECODE=%d\n", ssize, SIZECODE);
2755 pr_info("command=%x SECTOR=%d HEAD=%d, TRACK=%d\n",
2756 COMMAND, SECTOR, HEAD, TRACK);
2757 pr_info("buffer drive=%d\n", buffer_drive);
2758 pr_info("buffer track=%d\n", buffer_track);
2759 pr_info("buffer_min=%d\n", buffer_min);
2760 pr_info("buffer_max=%d\n", buffer_max);
2761 return 0;
2762 }
2763
2764 if (raw_cmd->kernel_data != bio_data(current_req->bio)) {
2765 if (raw_cmd->kernel_data < floppy_track_buffer ||
2766 current_count_sectors < 0 ||
2767 raw_cmd->length < 0 ||
2768 raw_cmd->kernel_data + raw_cmd->length >
2769 floppy_track_buffer + (max_buffer_sectors << 10)) {
2770 DPRINT("buffer overrun in schedule dma\n");
2771 pr_info("fsector_t=%d buffer_min=%d current_count=%ld\n",
2772 fsector_t, buffer_min, raw_cmd->length >> 9);
2773 pr_info("current_count_sectors=%ld\n",
2774 current_count_sectors);
2775 if (CT(COMMAND) == FD_READ)
2776 pr_info("read\n");
2777 if (CT(COMMAND) == FD_WRITE)
2778 pr_info("write\n");
2779 return 0;
2780 }
2781 } else if (raw_cmd->length > blk_rq_bytes(current_req) ||
2782 current_count_sectors > blk_rq_sectors(current_req)) {
2783 DPRINT("buffer overrun in direct transfer\n");
2784 return 0;
2785 } else if (raw_cmd->length < current_count_sectors << 9) {
2786 DPRINT("more sectors than bytes\n");
2787 pr_info("bytes=%ld\n", raw_cmd->length >> 9);
2788 pr_info("sectors=%ld\n", current_count_sectors);
2789 }
2790 if (raw_cmd->length == 0) {
2791 DPRINT("zero dma transfer attempted from make_raw_request\n");
2792 return 0;
2793 }
2794
2795 virtualdmabug_workaround();
2796 return 2;
2797 }
2798
2799 static int set_next_request(void)
2800 {
2801 current_req = list_first_entry_or_null(&floppy_reqs, struct request,
2802 queuelist);
2803 if (current_req) {
2804 current_req->error_count = 0;
2805 list_del_init(¤t_req->queuelist);
2806 }
2807 return current_req != NULL;
2808 }
2809
2810 static void redo_fd_request(void)
2811 {
2812 int drive;
2813 int tmp;
2814
2815 lastredo = jiffies;
2816 if (current_drive < N_DRIVE)
2817 floppy_off(current_drive);
2818
2819 do_request:
2820 if (!current_req) {
2821 int pending;
2822
2823 spin_lock_irq(&floppy_lock);
2824 pending = set_next_request();
2825 spin_unlock_irq(&floppy_lock);
2826 if (!pending) {
2827 do_floppy = NULL;
2828 unlock_fdc();
2829 return;
2830 }
2831 }
2832 drive = (long)current_req->rq_disk->private_data;
2833 set_fdc(drive);
2834 reschedule_timeout(current_reqD, "redo fd request");
2835
2836 set_floppy(drive);
2837 raw_cmd = &default_raw_cmd;
2838 raw_cmd->flags = 0;
2839 if (start_motor(redo_fd_request))
2840 return;
2841
2842 disk_change(current_drive);
2843 if (test_bit(current_drive, &fake_change) ||
2844 test_bit(FD_DISK_CHANGED_BIT, &DRS->flags)) {
2845 DPRINT("disk absent or changed during operation\n");
2846 request_done(0);
2847 goto do_request;
2848 }
2849 if (!_floppy) {
2850 if (!probing) {
2851 DRS->probed_format = 0;
2852 if (next_valid_format()) {
2853 DPRINT("no autodetectable formats\n");
2854 _floppy = NULL;
2855 request_done(0);
2856 goto do_request;
2857 }
2858 }
2859 probing = 1;
2860 _floppy = floppy_type + DP->autodetect[DRS->probed_format];
2861 } else
2862 probing = 0;
2863 errors = &(current_req->error_count);
2864 tmp = make_raw_rw_request();
2865 if (tmp < 2) {
2866 request_done(tmp);
2867 goto do_request;
2868 }
2869
2870 if (test_bit(FD_NEED_TWADDLE_BIT, &DRS->flags))
2871 twaddle();
2872 schedule_bh(floppy_start);
2873 debugt(__func__, "queue fd request");
2874 return;
2875 }
2876
2877 static const struct cont_t rw_cont = {
2878 .interrupt = rw_interrupt,
2879 .redo = redo_fd_request,
2880 .error = bad_flp_intr,
2881 .done = request_done
2882 };
2883
2884 static void process_fd_request(void)
2885 {
2886 cont = &rw_cont;
2887 schedule_bh(redo_fd_request);
2888 }
2889
2890 static blk_status_t floppy_queue_rq(struct blk_mq_hw_ctx *hctx,
2891 const struct blk_mq_queue_data *bd)
2892 {
2893 blk_mq_start_request(bd->rq);
2894
2895 if (WARN(max_buffer_sectors == 0,
2896 "VFS: %s called on non-open device\n", __func__))
2897 return BLK_STS_IOERR;
2898
2899 if (WARN(atomic_read(&usage_count) == 0,
2900 "warning: usage count=0, current_req=%p sect=%ld flags=%llx\n",
2901 current_req, (long)blk_rq_pos(current_req),
2902 (unsigned long long) current_req->cmd_flags))
2903 return BLK_STS_IOERR;
2904
2905 if (test_and_set_bit(0, &fdc_busy)) {
2906
2907
2908 is_alive(__func__, "old request running");
2909 return BLK_STS_RESOURCE;
2910 }
2911
2912 spin_lock_irq(&floppy_lock);
2913 list_add_tail(&bd->rq->queuelist, &floppy_reqs);
2914 spin_unlock_irq(&floppy_lock);
2915
2916 command_status = FD_COMMAND_NONE;
2917 __reschedule_timeout(MAXTIMEOUT, "fd_request");
2918 set_fdc(0);
2919 process_fd_request();
2920 is_alive(__func__, "");
2921 return BLK_STS_OK;
2922 }
2923
2924 static const struct cont_t poll_cont = {
2925 .interrupt = success_and_wakeup,
2926 .redo = floppy_ready,
2927 .error = generic_failure,
2928 .done = generic_done
2929 };
2930
2931 static int poll_drive(bool interruptible, int flag)
2932 {
2933
2934 raw_cmd = &default_raw_cmd;
2935 raw_cmd->flags = flag;
2936 raw_cmd->track = 0;
2937 raw_cmd->cmd_count = 0;
2938 cont = &poll_cont;
2939 debug_dcl(DP->flags, "setting NEWCHANGE in poll_drive\n");
2940 set_bit(FD_DISK_NEWCHANGE_BIT, &DRS->flags);
2941
2942 return wait_til_done(floppy_ready, interruptible);
2943 }
2944
2945
2946
2947
2948
2949
2950 static void reset_intr(void)
2951 {
2952 pr_info("weird, reset interrupt called\n");
2953 }
2954
2955 static const struct cont_t reset_cont = {
2956 .interrupt = reset_intr,
2957 .redo = success_and_wakeup,
2958 .error = generic_failure,
2959 .done = generic_done
2960 };
2961
2962 static int user_reset_fdc(int drive, int arg, bool interruptible)
2963 {
2964 int ret;
2965
2966 if (lock_fdc(drive))
2967 return -EINTR;
2968
2969 if (arg == FD_RESET_ALWAYS)
2970 FDCS->reset = 1;
2971 if (FDCS->reset) {
2972 cont = &reset_cont;
2973 ret = wait_til_done(reset_fdc, interruptible);
2974 if (ret == -EINTR)
2975 return -EINTR;
2976 }
2977 process_fd_request();
2978 return 0;
2979 }
2980
2981
2982
2983
2984
2985 static inline int fd_copyout(void __user *param, const void *address,
2986 unsigned long size)
2987 {
2988 return copy_to_user(param, address, size) ? -EFAULT : 0;
2989 }
2990
2991 static inline int fd_copyin(void __user *param, void *address,
2992 unsigned long size)
2993 {
2994 return copy_from_user(address, param, size) ? -EFAULT : 0;
2995 }
2996
2997 static const char *drive_name(int type, int drive)
2998 {
2999 struct floppy_struct *floppy;
3000
3001 if (type)
3002 floppy = floppy_type + type;
3003 else {
3004 if (UDP->native_format)
3005 floppy = floppy_type + UDP->native_format;
3006 else
3007 return "(null)";
3008 }
3009 if (floppy->name)
3010 return floppy->name;
3011 else
3012 return "(null)";
3013 }
3014
3015
3016 static void raw_cmd_done(int flag)
3017 {
3018 int i;
3019
3020 if (!flag) {
3021 raw_cmd->flags |= FD_RAW_FAILURE;
3022 raw_cmd->flags |= FD_RAW_HARDFAILURE;
3023 } else {
3024 raw_cmd->reply_count = inr;
3025 if (raw_cmd->reply_count > MAX_REPLIES)
3026 raw_cmd->reply_count = 0;
3027 for (i = 0; i < raw_cmd->reply_count; i++)
3028 raw_cmd->reply[i] = reply_buffer[i];
3029
3030 if (raw_cmd->flags & (FD_RAW_READ | FD_RAW_WRITE)) {
3031 unsigned long flags;
3032 flags = claim_dma_lock();
3033 raw_cmd->length = fd_get_dma_residue();
3034 release_dma_lock(flags);
3035 }
3036
3037 if ((raw_cmd->flags & FD_RAW_SOFTFAILURE) &&
3038 (!raw_cmd->reply_count || (raw_cmd->reply[0] & 0xc0)))
3039 raw_cmd->flags |= FD_RAW_FAILURE;
3040
3041 if (disk_change(current_drive))
3042 raw_cmd->flags |= FD_RAW_DISK_CHANGE;
3043 else
3044 raw_cmd->flags &= ~FD_RAW_DISK_CHANGE;
3045 if (raw_cmd->flags & FD_RAW_NO_MOTOR_AFTER)
3046 motor_off_callback(&motor_off_timer[current_drive]);
3047
3048 if (raw_cmd->next &&
3049 (!(raw_cmd->flags & FD_RAW_FAILURE) ||
3050 !(raw_cmd->flags & FD_RAW_STOP_IF_FAILURE)) &&
3051 ((raw_cmd->flags & FD_RAW_FAILURE) ||
3052 !(raw_cmd->flags & FD_RAW_STOP_IF_SUCCESS))) {
3053 raw_cmd = raw_cmd->next;
3054 return;
3055 }
3056 }
3057 generic_done(flag);
3058 }
3059
3060 static const struct cont_t raw_cmd_cont = {
3061 .interrupt = success_and_wakeup,
3062 .redo = floppy_start,
3063 .error = generic_failure,
3064 .done = raw_cmd_done
3065 };
3066
3067 static int raw_cmd_copyout(int cmd, void __user *param,
3068 struct floppy_raw_cmd *ptr)
3069 {
3070 int ret;
3071
3072 while (ptr) {
3073 struct floppy_raw_cmd cmd = *ptr;
3074 cmd.next = NULL;
3075 cmd.kernel_data = NULL;
3076 ret = copy_to_user(param, &cmd, sizeof(cmd));
3077 if (ret)
3078 return -EFAULT;
3079 param += sizeof(struct floppy_raw_cmd);
3080 if ((ptr->flags & FD_RAW_READ) && ptr->buffer_length) {
3081 if (ptr->length >= 0 &&
3082 ptr->length <= ptr->buffer_length) {
3083 long length = ptr->buffer_length - ptr->length;
3084 ret = fd_copyout(ptr->data, ptr->kernel_data,
3085 length);
3086 if (ret)
3087 return ret;
3088 }
3089 }
3090 ptr = ptr->next;
3091 }
3092
3093 return 0;
3094 }
3095
3096 static void raw_cmd_free(struct floppy_raw_cmd **ptr)
3097 {
3098 struct floppy_raw_cmd *next;
3099 struct floppy_raw_cmd *this;
3100
3101 this = *ptr;
3102 *ptr = NULL;
3103 while (this) {
3104 if (this->buffer_length) {
3105 fd_dma_mem_free((unsigned long)this->kernel_data,
3106 this->buffer_length);
3107 this->buffer_length = 0;
3108 }
3109 next = this->next;
3110 kfree(this);
3111 this = next;
3112 }
3113 }
3114
3115 static int raw_cmd_copyin(int cmd, void __user *param,
3116 struct floppy_raw_cmd **rcmd)
3117 {
3118 struct floppy_raw_cmd *ptr;
3119 int ret;
3120 int i;
3121
3122 *rcmd = NULL;
3123
3124 loop:
3125 ptr = kmalloc(sizeof(struct floppy_raw_cmd), GFP_KERNEL);
3126 if (!ptr)
3127 return -ENOMEM;
3128 *rcmd = ptr;
3129 ret = copy_from_user(ptr, param, sizeof(*ptr));
3130 ptr->next = NULL;
3131 ptr->buffer_length = 0;
3132 ptr->kernel_data = NULL;
3133 if (ret)
3134 return -EFAULT;
3135 param += sizeof(struct floppy_raw_cmd);
3136 if (ptr->cmd_count > 33)
3137
3138
3139
3140
3141
3142
3143
3144
3145 return -EINVAL;
3146
3147 for (i = 0; i < 16; i++)
3148 ptr->reply[i] = 0;
3149 ptr->resultcode = 0;
3150
3151 if (ptr->flags & (FD_RAW_READ | FD_RAW_WRITE)) {
3152 if (ptr->length <= 0)
3153 return -EINVAL;
3154 ptr->kernel_data = (char *)fd_dma_mem_alloc(ptr->length);
3155 fallback_on_nodma_alloc(&ptr->kernel_data, ptr->length);
3156 if (!ptr->kernel_data)
3157 return -ENOMEM;
3158 ptr->buffer_length = ptr->length;
3159 }
3160 if (ptr->flags & FD_RAW_WRITE) {
3161 ret = fd_copyin(ptr->data, ptr->kernel_data, ptr->length);
3162 if (ret)
3163 return ret;
3164 }
3165
3166 if (ptr->flags & FD_RAW_MORE) {
3167 rcmd = &(ptr->next);
3168 ptr->rate &= 0x43;
3169 goto loop;
3170 }
3171
3172 return 0;
3173 }
3174
3175 static int raw_cmd_ioctl(int cmd, void __user *param)
3176 {
3177 struct floppy_raw_cmd *my_raw_cmd;
3178 int drive;
3179 int ret2;
3180 int ret;
3181
3182 if (FDCS->rawcmd <= 1)
3183 FDCS->rawcmd = 1;
3184 for (drive = 0; drive < N_DRIVE; drive++) {
3185 if (FDC(drive) != fdc)
3186 continue;
3187 if (drive == current_drive) {
3188 if (UDRS->fd_ref > 1) {
3189 FDCS->rawcmd = 2;
3190 break;
3191 }
3192 } else if (UDRS->fd_ref) {
3193 FDCS->rawcmd = 2;
3194 break;
3195 }
3196 }
3197
3198 if (FDCS->reset)
3199 return -EIO;
3200
3201 ret = raw_cmd_copyin(cmd, param, &my_raw_cmd);
3202 if (ret) {
3203 raw_cmd_free(&my_raw_cmd);
3204 return ret;
3205 }
3206
3207 raw_cmd = my_raw_cmd;
3208 cont = &raw_cmd_cont;
3209 ret = wait_til_done(floppy_start, true);
3210 debug_dcl(DP->flags, "calling disk change from raw_cmd ioctl\n");
3211
3212 if (ret != -EINTR && FDCS->reset)
3213 ret = -EIO;
3214
3215 DRS->track = NO_TRACK;
3216
3217 ret2 = raw_cmd_copyout(cmd, param, my_raw_cmd);
3218 if (!ret)
3219 ret = ret2;
3220 raw_cmd_free(&my_raw_cmd);
3221 return ret;
3222 }
3223
3224 static int invalidate_drive(struct block_device *bdev)
3225 {
3226
3227 set_bit((long)bdev->bd_disk->private_data, &fake_change);
3228 process_fd_request();
3229 check_disk_change(bdev);
3230 return 0;
3231 }
3232
3233 static int set_geometry(unsigned int cmd, struct floppy_struct *g,
3234 int drive, int type, struct block_device *bdev)
3235 {
3236 int cnt;
3237
3238
3239 if ((int)g->sect <= 0 ||
3240 (int)g->head <= 0 ||
3241
3242 (int)(g->sect * g->head) <= 0 ||
3243
3244 (unsigned char)((g->sect << 2) >> FD_SIZECODE(g)) == 0 ||
3245 g->track <= 0 || g->track > UDP->tracks >> STRETCH(g) ||
3246
3247 (g->stretch & ~(FD_STRETCH | FD_SWAPSIDES | FD_SECTBASEMASK)) != 0)
3248 return -EINVAL;
3249 if (type) {
3250 if (!capable(CAP_SYS_ADMIN))
3251 return -EPERM;
3252 mutex_lock(&open_lock);
3253 if (lock_fdc(drive)) {
3254 mutex_unlock(&open_lock);
3255 return -EINTR;
3256 }
3257 floppy_type[type] = *g;
3258 floppy_type[type].name = "user format";
3259 for (cnt = type << 2; cnt < (type << 2) + 4; cnt++)
3260 floppy_sizes[cnt] = floppy_sizes[cnt + 0x80] =
3261 floppy_type[type].size + 1;
3262 process_fd_request();
3263 for (cnt = 0; cnt < N_DRIVE; cnt++) {
3264 struct block_device *bdev = opened_bdev[cnt];
3265 if (!bdev || ITYPE(drive_state[cnt].fd_device) != type)
3266 continue;
3267 __invalidate_device(bdev, true);
3268 }
3269 mutex_unlock(&open_lock);
3270 } else {
3271 int oldStretch;
3272
3273 if (lock_fdc(drive))
3274 return -EINTR;
3275 if (cmd != FDDEFPRM) {
3276
3277
3278 if (poll_drive(true, FD_RAW_NEED_DISK) == -EINTR)
3279 return -EINTR;
3280 }
3281 oldStretch = g->stretch;
3282 user_params[drive] = *g;
3283 if (buffer_drive == drive)
3284 SUPBOUND(buffer_max, user_params[drive].sect);
3285 current_type[drive] = &user_params[drive];
3286 floppy_sizes[drive] = user_params[drive].size;
3287 if (cmd == FDDEFPRM)
3288 DRS->keep_data = -1;
3289 else
3290 DRS->keep_data = 1;
3291
3292
3293
3294
3295
3296 if (DRS->maxblock > user_params[drive].sect ||
3297 DRS->maxtrack ||
3298 ((user_params[drive].sect ^ oldStretch) &
3299 (FD_SWAPSIDES | FD_SECTBASEMASK)))
3300 invalidate_drive(bdev);
3301 else
3302 process_fd_request();
3303 }
3304 return 0;
3305 }
3306
3307
3308 static unsigned int ioctl_table[] = {
3309 FDCLRPRM,
3310 FDSETPRM,
3311 FDDEFPRM,
3312 FDGETPRM,
3313 FDMSGON,
3314 FDMSGOFF,
3315 FDFMTBEG,
3316 FDFMTTRK,
3317 FDFMTEND,
3318 FDSETEMSGTRESH,
3319 FDFLUSH,
3320 FDSETMAXERRS,
3321 FDGETMAXERRS,
3322 FDGETDRVTYP,
3323 FDSETDRVPRM,
3324 FDGETDRVPRM,
3325 FDGETDRVSTAT,
3326 FDPOLLDRVSTAT,
3327 FDRESET,
3328 FDGETFDCSTAT,
3329 FDWERRORCLR,
3330 FDWERRORGET,
3331 FDRAWCMD,
3332 FDEJECT,
3333 FDTWADDLE
3334 };
3335
3336 static int normalize_ioctl(unsigned int *cmd, int *size)
3337 {
3338 int i;
3339
3340 for (i = 0; i < ARRAY_SIZE(ioctl_table); i++) {
3341 if ((*cmd & 0xffff) == (ioctl_table[i] & 0xffff)) {
3342 *size = _IOC_SIZE(*cmd);
3343 *cmd = ioctl_table[i];
3344 if (*size > _IOC_SIZE(*cmd)) {
3345 pr_info("ioctl not yet supported\n");
3346 return -EFAULT;
3347 }
3348 return 0;
3349 }
3350 }
3351 return -EINVAL;
3352 }
3353
3354 static int get_floppy_geometry(int drive, int type, struct floppy_struct **g)
3355 {
3356 if (type)
3357 *g = &floppy_type[type];
3358 else {
3359 if (lock_fdc(drive))
3360 return -EINTR;
3361 if (poll_drive(false, 0) == -EINTR)
3362 return -EINTR;
3363 process_fd_request();
3364 *g = current_type[drive];
3365 }
3366 if (!*g)
3367 return -ENODEV;
3368 return 0;
3369 }
3370
3371 static int fd_getgeo(struct block_device *bdev, struct hd_geometry *geo)
3372 {
3373 int drive = (long)bdev->bd_disk->private_data;
3374 int type = ITYPE(drive_state[drive].fd_device);
3375 struct floppy_struct *g;
3376 int ret;
3377
3378 ret = get_floppy_geometry(drive, type, &g);
3379 if (ret)
3380 return ret;
3381
3382 geo->heads = g->head;
3383 geo->sectors = g->sect;
3384 geo->cylinders = g->track;
3385 return 0;
3386 }
3387
3388 static bool valid_floppy_drive_params(const short autodetect[8],
3389 int native_format)
3390 {
3391 size_t floppy_type_size = ARRAY_SIZE(floppy_type);
3392 size_t i = 0;
3393
3394 for (i = 0; i < 8; ++i) {
3395 if (autodetect[i] < 0 ||
3396 autodetect[i] >= floppy_type_size)
3397 return false;
3398 }
3399
3400 if (native_format < 0 || native_format >= floppy_type_size)
3401 return false;
3402
3403 return true;
3404 }
3405
3406 static int fd_locked_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd,
3407 unsigned long param)
3408 {
3409 int drive = (long)bdev->bd_disk->private_data;
3410 int type = ITYPE(UDRS->fd_device);
3411 int i;
3412 int ret;
3413 int size;
3414 union inparam {
3415 struct floppy_struct g;
3416 struct format_descr f;
3417 struct floppy_max_errors max_errors;
3418 struct floppy_drive_params dp;
3419 } inparam;
3420 const void *outparam;
3421
3422
3423
3424
3425 if (cmd == CDROMEJECT ||
3426 cmd == 0x6470) {
3427 DPRINT("obsolete eject ioctl\n");
3428 DPRINT("please use floppycontrol --eject\n");
3429 cmd = FDEJECT;
3430 }
3431
3432 if (!((cmd & 0xff00) == 0x0200))
3433 return -EINVAL;
3434
3435
3436 ret = normalize_ioctl(&cmd, &size);
3437 if (ret)
3438 return ret;
3439
3440
3441 if (((cmd & 0x40) && !(mode & (FMODE_WRITE | FMODE_WRITE_IOCTL))) ||
3442 ((cmd & 0x80) && !capable(CAP_SYS_ADMIN)))
3443 return -EPERM;
3444
3445 if (WARN_ON(size < 0 || size > sizeof(inparam)))
3446 return -EINVAL;
3447
3448
3449 memset(&inparam, 0, sizeof(inparam));
3450 if (_IOC_DIR(cmd) & _IOC_WRITE) {
3451 ret = fd_copyin((void __user *)param, &inparam, size);
3452 if (ret)
3453 return ret;
3454 }
3455
3456 switch (cmd) {
3457 case FDEJECT:
3458 if (UDRS->fd_ref != 1)
3459
3460 return -EBUSY;
3461 if (lock_fdc(drive))
3462 return -EINTR;
3463
3464
3465
3466 ret = fd_eject(UNIT(drive));
3467
3468 set_bit(FD_DISK_CHANGED_BIT, &UDRS->flags);
3469 set_bit(FD_VERIFY_BIT, &UDRS->flags);
3470 process_fd_request();
3471 return ret;
3472 case FDCLRPRM:
3473 if (lock_fdc(drive))
3474 return -EINTR;
3475 current_type[drive] = NULL;
3476 floppy_sizes[drive] = MAX_DISK_SIZE << 1;
3477 UDRS->keep_data = 0;
3478 return invalidate_drive(bdev);
3479 case FDSETPRM:
3480 case FDDEFPRM:
3481 return set_geometry(cmd, &inparam.g, drive, type, bdev);
3482 case FDGETPRM:
3483 ret = get_floppy_geometry(drive, type,
3484 (struct floppy_struct **)&outparam);
3485 if (ret)
3486 return ret;
3487 memcpy(&inparam.g, outparam,
3488 offsetof(struct floppy_struct, name));
3489 outparam = &inparam.g;
3490 break;
3491 case FDMSGON:
3492 UDP->flags |= FTD_MSG;
3493 return 0;
3494 case FDMSGOFF:
3495 UDP->flags &= ~FTD_MSG;
3496 return 0;
3497 case FDFMTBEG:
3498 if (lock_fdc(drive))
3499 return -EINTR;
3500 if (poll_drive(true, FD_RAW_NEED_DISK) == -EINTR)
3501 return -EINTR;
3502 ret = UDRS->flags;
3503 process_fd_request();
3504 if (ret & FD_VERIFY)
3505 return -ENODEV;
3506 if (!(ret & FD_DISK_WRITABLE))
3507 return -EROFS;
3508 return 0;
3509 case FDFMTTRK:
3510 if (UDRS->fd_ref != 1)
3511 return -EBUSY;
3512 return do_format(drive, &inparam.f);
3513 case FDFMTEND:
3514 case FDFLUSH:
3515 if (lock_fdc(drive))
3516 return -EINTR;
3517 return invalidate_drive(bdev);
3518 case FDSETEMSGTRESH:
3519 UDP->max_errors.reporting = (unsigned short)(param & 0x0f);
3520 return 0;
3521 case FDGETMAXERRS:
3522 outparam = &UDP->max_errors;
3523 break;
3524 case FDSETMAXERRS:
3525 UDP->max_errors = inparam.max_errors;
3526 break;
3527 case FDGETDRVTYP:
3528 outparam = drive_name(type, drive);
3529 SUPBOUND(size, strlen((const char *)outparam) + 1);
3530 break;
3531 case FDSETDRVPRM:
3532 if (!valid_floppy_drive_params(inparam.dp.autodetect,
3533 inparam.dp.native_format))
3534 return -EINVAL;
3535 *UDP = inparam.dp;
3536 break;
3537 case FDGETDRVPRM:
3538 outparam = UDP;
3539 break;
3540 case FDPOLLDRVSTAT:
3541 if (lock_fdc(drive))
3542 return -EINTR;
3543 if (poll_drive(true, FD_RAW_NEED_DISK) == -EINTR)
3544 return -EINTR;
3545 process_fd_request();
3546
3547 case FDGETDRVSTAT:
3548 outparam = UDRS;
3549 break;
3550 case FDRESET:
3551 return user_reset_fdc(drive, (int)param, true);
3552 case FDGETFDCSTAT:
3553 outparam = UFDCS;
3554 break;
3555 case FDWERRORCLR:
3556 memset(UDRWE, 0, sizeof(*UDRWE));
3557 return 0;
3558 case FDWERRORGET:
3559 outparam = UDRWE;
3560 break;
3561 case FDRAWCMD:
3562 if (type)
3563 return -EINVAL;
3564 if (lock_fdc(drive))
3565 return -EINTR;
3566 set_floppy(drive);
3567 i = raw_cmd_ioctl(cmd, (void __user *)param);
3568 if (i == -EINTR)
3569 return -EINTR;
3570 process_fd_request();
3571 return i;
3572 case FDTWADDLE:
3573 if (lock_fdc(drive))
3574 return -EINTR;
3575 twaddle();
3576 process_fd_request();
3577 return 0;
3578 default:
3579 return -EINVAL;
3580 }
3581
3582 if (_IOC_DIR(cmd) & _IOC_READ)
3583 return fd_copyout((void __user *)param, outparam, size);
3584
3585 return 0;
3586 }
3587
3588 static int fd_ioctl(struct block_device *bdev, fmode_t mode,
3589 unsigned int cmd, unsigned long param)
3590 {
3591 int ret;
3592
3593 mutex_lock(&floppy_mutex);
3594 ret = fd_locked_ioctl(bdev, mode, cmd, param);
3595 mutex_unlock(&floppy_mutex);
3596
3597 return ret;
3598 }
3599
3600 #ifdef CONFIG_COMPAT
3601
3602 struct compat_floppy_drive_params {
3603 char cmos;
3604 compat_ulong_t max_dtr;
3605 compat_ulong_t hlt;
3606 compat_ulong_t hut;
3607 compat_ulong_t srt;
3608 compat_ulong_t spinup;
3609 compat_ulong_t spindown;
3610 unsigned char spindown_offset;
3611 unsigned char select_delay;
3612 unsigned char rps;
3613 unsigned char tracks;
3614 compat_ulong_t timeout;
3615 unsigned char interleave_sect;
3616 struct floppy_max_errors max_errors;
3617 char flags;
3618 char read_track;
3619 short autodetect[8];
3620 compat_int_t checkfreq;
3621 compat_int_t native_format;
3622 };
3623
3624 struct compat_floppy_drive_struct {
3625 signed char flags;
3626 compat_ulong_t spinup_date;
3627 compat_ulong_t select_date;
3628 compat_ulong_t first_read_date;
3629 short probed_format;
3630 short track;
3631 short maxblock;
3632 short maxtrack;
3633 compat_int_t generation;
3634 compat_int_t keep_data;
3635 compat_int_t fd_ref;
3636 compat_int_t fd_device;
3637 compat_int_t last_checked;
3638 compat_caddr_t dmabuf;
3639 compat_int_t bufblocks;
3640 };
3641
3642 struct compat_floppy_fdc_state {
3643 compat_int_t spec1;
3644 compat_int_t spec2;
3645 compat_int_t dtr;
3646 unsigned char version;
3647 unsigned char dor;
3648 compat_ulong_t address;
3649 unsigned int rawcmd:2;
3650 unsigned int reset:1;
3651 unsigned int need_configure:1;
3652 unsigned int perp_mode:2;
3653 unsigned int has_fifo:1;
3654 unsigned int driver_version;
3655 unsigned char track[4];
3656 };
3657
3658 struct compat_floppy_write_errors {
3659 unsigned int write_errors;
3660 compat_ulong_t first_error_sector;
3661 compat_int_t first_error_generation;
3662 compat_ulong_t last_error_sector;
3663 compat_int_t last_error_generation;
3664 compat_uint_t badness;
3665 };
3666
3667 #define FDSETPRM32 _IOW(2, 0x42, struct compat_floppy_struct)
3668 #define FDDEFPRM32 _IOW(2, 0x43, struct compat_floppy_struct)
3669 #define FDSETDRVPRM32 _IOW(2, 0x90, struct compat_floppy_drive_params)
3670 #define FDGETDRVPRM32 _IOR(2, 0x11, struct compat_floppy_drive_params)
3671 #define FDGETDRVSTAT32 _IOR(2, 0x12, struct compat_floppy_drive_struct)
3672 #define FDPOLLDRVSTAT32 _IOR(2, 0x13, struct compat_floppy_drive_struct)
3673 #define FDGETFDCSTAT32 _IOR(2, 0x15, struct compat_floppy_fdc_state)
3674 #define FDWERRORGET32 _IOR(2, 0x17, struct compat_floppy_write_errors)
3675
3676 static int compat_set_geometry(struct block_device *bdev, fmode_t mode, unsigned int cmd,
3677 struct compat_floppy_struct __user *arg)
3678 {
3679 struct floppy_struct v;
3680 int drive, type;
3681 int err;
3682
3683 BUILD_BUG_ON(offsetof(struct floppy_struct, name) !=
3684 offsetof(struct compat_floppy_struct, name));
3685
3686 if (!(mode & (FMODE_WRITE | FMODE_WRITE_IOCTL)))
3687 return -EPERM;
3688
3689 memset(&v, 0, sizeof(struct floppy_struct));
3690 if (copy_from_user(&v, arg, offsetof(struct floppy_struct, name)))
3691 return -EFAULT;
3692
3693 mutex_lock(&floppy_mutex);
3694 drive = (long)bdev->bd_disk->private_data;
3695 type = ITYPE(UDRS->fd_device);
3696 err = set_geometry(cmd == FDSETPRM32 ? FDSETPRM : FDDEFPRM,
3697 &v, drive, type, bdev);
3698 mutex_unlock(&floppy_mutex);
3699 return err;
3700 }
3701
3702 static int compat_get_prm(int drive,
3703 struct compat_floppy_struct __user *arg)
3704 {
3705 struct compat_floppy_struct v;
3706 struct floppy_struct *p;
3707 int err;
3708
3709 memset(&v, 0, sizeof(v));
3710 mutex_lock(&floppy_mutex);
3711 err = get_floppy_geometry(drive, ITYPE(UDRS->fd_device), &p);
3712 if (err) {
3713 mutex_unlock(&floppy_mutex);
3714 return err;
3715 }
3716 memcpy(&v, p, offsetof(struct floppy_struct, name));
3717 mutex_unlock(&floppy_mutex);
3718 if (copy_to_user(arg, &v, sizeof(struct compat_floppy_struct)))
3719 return -EFAULT;
3720 return 0;
3721 }
3722
3723 static int compat_setdrvprm(int drive,
3724 struct compat_floppy_drive_params __user *arg)
3725 {
3726 struct compat_floppy_drive_params v;
3727
3728 if (!capable(CAP_SYS_ADMIN))
3729 return -EPERM;
3730 if (copy_from_user(&v, arg, sizeof(struct compat_floppy_drive_params)))
3731 return -EFAULT;
3732 if (!valid_floppy_drive_params(v.autodetect, v.native_format))
3733 return -EINVAL;
3734 mutex_lock(&floppy_mutex);
3735 UDP->cmos = v.cmos;
3736 UDP->max_dtr = v.max_dtr;
3737 UDP->hlt = v.hlt;
3738 UDP->hut = v.hut;
3739 UDP->srt = v.srt;
3740 UDP->spinup = v.spinup;
3741 UDP->spindown = v.spindown;
3742 UDP->spindown_offset = v.spindown_offset;
3743 UDP->select_delay = v.select_delay;
3744 UDP->rps = v.rps;
3745 UDP->tracks = v.tracks;
3746 UDP->timeout = v.timeout;
3747 UDP->interleave_sect = v.interleave_sect;
3748 UDP->max_errors = v.max_errors;
3749 UDP->flags = v.flags;
3750 UDP->read_track = v.read_track;
3751 memcpy(UDP->autodetect, v.autodetect, sizeof(v.autodetect));
3752 UDP->checkfreq = v.checkfreq;
3753 UDP->native_format = v.native_format;
3754 mutex_unlock(&floppy_mutex);
3755 return 0;
3756 }
3757
3758 static int compat_getdrvprm(int drive,
3759 struct compat_floppy_drive_params __user *arg)
3760 {
3761 struct compat_floppy_drive_params v;
3762
3763 memset(&v, 0, sizeof(struct compat_floppy_drive_params));
3764 mutex_lock(&floppy_mutex);
3765 v.cmos = UDP->cmos;
3766 v.max_dtr = UDP->max_dtr;
3767 v.hlt = UDP->hlt;
3768 v.hut = UDP->hut;
3769 v.srt = UDP->srt;
3770 v.spinup = UDP->spinup;
3771 v.spindown = UDP->spindown;
3772 v.spindown_offset = UDP->spindown_offset;
3773 v.select_delay = UDP->select_delay;
3774 v.rps = UDP->rps;
3775 v.tracks = UDP->tracks;
3776 v.timeout = UDP->timeout;
3777 v.interleave_sect = UDP->interleave_sect;
3778 v.max_errors = UDP->max_errors;
3779 v.flags = UDP->flags;
3780 v.read_track = UDP->read_track;
3781 memcpy(v.autodetect, UDP->autodetect, sizeof(v.autodetect));
3782 v.checkfreq = UDP->checkfreq;
3783 v.native_format = UDP->native_format;
3784 mutex_unlock(&floppy_mutex);
3785
3786 if (copy_to_user(arg, &v, sizeof(struct compat_floppy_drive_params)))
3787 return -EFAULT;
3788 return 0;
3789 }
3790
3791 static int compat_getdrvstat(int drive, bool poll,
3792 struct compat_floppy_drive_struct __user *arg)
3793 {
3794 struct compat_floppy_drive_struct v;
3795
3796 memset(&v, 0, sizeof(struct compat_floppy_drive_struct));
3797 mutex_lock(&floppy_mutex);
3798
3799 if (poll) {
3800 if (lock_fdc(drive))
3801 goto Eintr;
3802 if (poll_drive(true, FD_RAW_NEED_DISK) == -EINTR)
3803 goto Eintr;
3804 process_fd_request();
3805 }
3806 v.spinup_date = UDRS->spinup_date;
3807 v.select_date = UDRS->select_date;
3808 v.first_read_date = UDRS->first_read_date;
3809 v.probed_format = UDRS->probed_format;
3810 v.track = UDRS->track;
3811 v.maxblock = UDRS->maxblock;
3812 v.maxtrack = UDRS->maxtrack;
3813 v.generation = UDRS->generation;
3814 v.keep_data = UDRS->keep_data;
3815 v.fd_ref = UDRS->fd_ref;
3816 v.fd_device = UDRS->fd_device;
3817 v.last_checked = UDRS->last_checked;
3818 v.dmabuf = (uintptr_t)UDRS->dmabuf;
3819 v.bufblocks = UDRS->bufblocks;
3820 mutex_unlock(&floppy_mutex);
3821
3822 if (copy_to_user(arg, &v, sizeof(struct compat_floppy_drive_struct)))
3823 return -EFAULT;
3824 return 0;
3825 Eintr:
3826 mutex_unlock(&floppy_mutex);
3827 return -EINTR;
3828 }
3829
3830 static int compat_getfdcstat(int drive,
3831 struct compat_floppy_fdc_state __user *arg)
3832 {
3833 struct compat_floppy_fdc_state v32;
3834 struct floppy_fdc_state v;
3835
3836 mutex_lock(&floppy_mutex);
3837 v = *UFDCS;
3838 mutex_unlock(&floppy_mutex);
3839
3840 memset(&v32, 0, sizeof(struct compat_floppy_fdc_state));
3841 v32.spec1 = v.spec1;
3842 v32.spec2 = v.spec2;
3843 v32.dtr = v.dtr;
3844 v32.version = v.version;
3845 v32.dor = v.dor;
3846 v32.address = v.address;
3847 v32.rawcmd = v.rawcmd;
3848 v32.reset = v.reset;
3849 v32.need_configure = v.need_configure;
3850 v32.perp_mode = v.perp_mode;
3851 v32.has_fifo = v.has_fifo;
3852 v32.driver_version = v.driver_version;
3853 memcpy(v32.track, v.track, 4);
3854 if (copy_to_user(arg, &v32, sizeof(struct compat_floppy_fdc_state)))
3855 return -EFAULT;
3856 return 0;
3857 }
3858
3859 static int compat_werrorget(int drive,
3860 struct compat_floppy_write_errors __user *arg)
3861 {
3862 struct compat_floppy_write_errors v32;
3863 struct floppy_write_errors v;
3864
3865 memset(&v32, 0, sizeof(struct compat_floppy_write_errors));
3866 mutex_lock(&floppy_mutex);
3867 v = *UDRWE;
3868 mutex_unlock(&floppy_mutex);
3869 v32.write_errors = v.write_errors;
3870 v32.first_error_sector = v.first_error_sector;
3871 v32.first_error_generation = v.first_error_generation;
3872 v32.last_error_sector = v.last_error_sector;
3873 v32.last_error_generation = v.last_error_generation;
3874 v32.badness = v.badness;
3875 if (copy_to_user(arg, &v32, sizeof(struct compat_floppy_write_errors)))
3876 return -EFAULT;
3877 return 0;
3878 }
3879
3880 static int fd_compat_ioctl(struct block_device *bdev, fmode_t mode, unsigned int cmd,
3881 unsigned long param)
3882 {
3883 int drive = (long)bdev->bd_disk->private_data;
3884 switch (cmd) {
3885 case FDMSGON:
3886 case FDMSGOFF:
3887 case FDSETEMSGTRESH:
3888 case FDFLUSH:
3889 case FDWERRORCLR:
3890 case FDEJECT:
3891 case FDCLRPRM:
3892 case FDFMTBEG:
3893 case FDRESET:
3894 case FDTWADDLE:
3895 return fd_ioctl(bdev, mode, cmd, param);
3896 case FDSETMAXERRS:
3897 case FDGETMAXERRS:
3898 case FDGETDRVTYP:
3899 case FDFMTEND:
3900 case FDFMTTRK:
3901 case FDRAWCMD:
3902 return fd_ioctl(bdev, mode, cmd,
3903 (unsigned long)compat_ptr(param));
3904 case FDSETPRM32:
3905 case FDDEFPRM32:
3906 return compat_set_geometry(bdev, mode, cmd, compat_ptr(param));
3907 case FDGETPRM32:
3908 return compat_get_prm(drive, compat_ptr(param));
3909 case FDSETDRVPRM32:
3910 return compat_setdrvprm(drive, compat_ptr(param));
3911 case FDGETDRVPRM32:
3912 return compat_getdrvprm(drive, compat_ptr(param));
3913 case FDPOLLDRVSTAT32:
3914 return compat_getdrvstat(drive, true, compat_ptr(param));
3915 case FDGETDRVSTAT32:
3916 return compat_getdrvstat(drive, false, compat_ptr(param));
3917 case FDGETFDCSTAT32:
3918 return compat_getfdcstat(drive, compat_ptr(param));
3919 case FDWERRORGET32:
3920 return compat_werrorget(drive, compat_ptr(param));
3921 }
3922 return -EINVAL;
3923 }
3924 #endif
3925
3926 static void __init config_types(void)
3927 {
3928 bool has_drive = false;
3929 int drive;
3930
3931
3932 drive = 0;
3933 if (!UDP->cmos)
3934 UDP->cmos = FLOPPY0_TYPE;
3935 drive = 1;
3936 if (!UDP->cmos)
3937 UDP->cmos = FLOPPY1_TYPE;
3938
3939
3940
3941 for (drive = 0; drive < N_DRIVE; drive++) {
3942 unsigned int type = UDP->cmos;
3943 struct floppy_drive_params *params;
3944 const char *name = NULL;
3945 char temparea[32];
3946
3947 if (type < ARRAY_SIZE(default_drive_params)) {
3948 params = &default_drive_params[type].params;
3949 if (type) {
3950 name = default_drive_params[type].name;
3951 allowed_drive_mask |= 1 << drive;
3952 } else
3953 allowed_drive_mask &= ~(1 << drive);
3954 } else {
3955 params = &default_drive_params[0].params;
3956 snprintf(temparea, sizeof(temparea),
3957 "unknown type %d (usb?)", type);
3958 name = temparea;
3959 }
3960 if (name) {
3961 const char *prepend;
3962 if (!has_drive) {
3963 prepend = "";
3964 has_drive = true;
3965 pr_info("Floppy drive(s):");
3966 } else {
3967 prepend = ",";
3968 }
3969
3970 pr_cont("%s fd%d is %s", prepend, drive, name);
3971 }
3972 *UDP = *params;
3973 }
3974
3975 if (has_drive)
3976 pr_cont("\n");
3977 }
3978
3979 static void floppy_release(struct gendisk *disk, fmode_t mode)
3980 {
3981 int drive = (long)disk->private_data;
3982
3983 mutex_lock(&floppy_mutex);
3984 mutex_lock(&open_lock);
3985 if (!UDRS->fd_ref--) {
3986 DPRINT("floppy_release with fd_ref == 0");
3987 UDRS->fd_ref = 0;
3988 }
3989 if (!UDRS->fd_ref)
3990 opened_bdev[drive] = NULL;
3991 mutex_unlock(&open_lock);
3992 mutex_unlock(&floppy_mutex);
3993 }
3994
3995
3996
3997
3998
3999
4000 static int floppy_open(struct block_device *bdev, fmode_t mode)
4001 {
4002 int drive = (long)bdev->bd_disk->private_data;
4003 int old_dev, new_dev;
4004 int try;
4005 int res = -EBUSY;
4006 char *tmp;
4007
4008 mutex_lock(&floppy_mutex);
4009 mutex_lock(&open_lock);
4010 old_dev = UDRS->fd_device;
4011 if (opened_bdev[drive] && opened_bdev[drive] != bdev)
4012 goto out2;
4013
4014 if (!UDRS->fd_ref && (UDP->flags & FD_BROKEN_DCL)) {
4015 set_bit(FD_DISK_CHANGED_BIT, &UDRS->flags);
4016 set_bit(FD_VERIFY_BIT, &UDRS->flags);
4017 }
4018
4019 UDRS->fd_ref++;
4020
4021 opened_bdev[drive] = bdev;
4022
4023 res = -ENXIO;
4024
4025 if (!floppy_track_buffer) {
4026
4027
4028 if ((UDP->cmos == 6) || (UDP->cmos == 5))
4029 try = 64;
4030 else
4031 try = 32;
4032
4033 tmp = (char *)fd_dma_mem_alloc(1024 * try);
4034 if (!tmp && !floppy_track_buffer) {
4035 try >>= 1;
4036 INFBOUND(try, 16);
4037 tmp = (char *)fd_dma_mem_alloc(1024 * try);
4038 }
4039 if (!tmp && !floppy_track_buffer)
4040 fallback_on_nodma_alloc(&tmp, 2048 * try);
4041 if (!tmp && !floppy_track_buffer) {
4042 DPRINT("Unable to allocate DMA memory\n");
4043 goto out;
4044 }
4045 if (floppy_track_buffer) {
4046 if (tmp)
4047 fd_dma_mem_free((unsigned long)tmp, try * 1024);
4048 } else {
4049 buffer_min = buffer_max = -1;
4050 floppy_track_buffer = tmp;
4051 max_buffer_sectors = try;
4052 }
4053 }
4054
4055 new_dev = MINOR(bdev->bd_dev);
4056 UDRS->fd_device = new_dev;
4057 set_capacity(disks[drive], floppy_sizes[new_dev]);
4058 if (old_dev != -1 && old_dev != new_dev) {
4059 if (buffer_drive == drive)
4060 buffer_track = -1;
4061 }
4062
4063 if (UFDCS->rawcmd == 1)
4064 UFDCS->rawcmd = 2;
4065
4066 if (!(mode & FMODE_NDELAY)) {
4067 if (mode & (FMODE_READ|FMODE_WRITE)) {
4068 UDRS->last_checked = 0;
4069 clear_bit(FD_OPEN_SHOULD_FAIL_BIT, &UDRS->flags);
4070 check_disk_change(bdev);
4071 if (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags))
4072 goto out;
4073 if (test_bit(FD_OPEN_SHOULD_FAIL_BIT, &UDRS->flags))
4074 goto out;
4075 }
4076 res = -EROFS;
4077 if ((mode & FMODE_WRITE) &&
4078 !test_bit(FD_DISK_WRITABLE_BIT, &UDRS->flags))
4079 goto out;
4080 }
4081 mutex_unlock(&open_lock);
4082 mutex_unlock(&floppy_mutex);
4083 return 0;
4084 out:
4085 UDRS->fd_ref--;
4086
4087 if (!UDRS->fd_ref)
4088 opened_bdev[drive] = NULL;
4089 out2:
4090 mutex_unlock(&open_lock);
4091 mutex_unlock(&floppy_mutex);
4092 return res;
4093 }
4094
4095
4096
4097
4098 static unsigned int floppy_check_events(struct gendisk *disk,
4099 unsigned int clearing)
4100 {
4101 int drive = (long)disk->private_data;
4102
4103 if (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags) ||
4104 test_bit(FD_VERIFY_BIT, &UDRS->flags))
4105 return DISK_EVENT_MEDIA_CHANGE;
4106
4107 if (time_after(jiffies, UDRS->last_checked + UDP->checkfreq)) {
4108 if (lock_fdc(drive))
4109 return 0;
4110 poll_drive(false, 0);
4111 process_fd_request();
4112 }
4113
4114 if (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags) ||
4115 test_bit(FD_VERIFY_BIT, &UDRS->flags) ||
4116 test_bit(drive, &fake_change) ||
4117 drive_no_geom(drive))
4118 return DISK_EVENT_MEDIA_CHANGE;
4119 return 0;
4120 }
4121
4122
4123
4124
4125
4126
4127
4128 struct rb0_cbdata {
4129 int drive;
4130 struct completion complete;
4131 };
4132
4133 static void floppy_rb0_cb(struct bio *bio)
4134 {
4135 struct rb0_cbdata *cbdata = (struct rb0_cbdata *)bio->bi_private;
4136 int drive = cbdata->drive;
4137
4138 if (bio->bi_status) {
4139 pr_info("floppy: error %d while reading block 0\n",
4140 bio->bi_status);
4141 set_bit(FD_OPEN_SHOULD_FAIL_BIT, &UDRS->flags);
4142 }
4143 complete(&cbdata->complete);
4144 }
4145
4146 static int __floppy_read_block_0(struct block_device *bdev, int drive)
4147 {
4148 struct bio bio;
4149 struct bio_vec bio_vec;
4150 struct page *page;
4151 struct rb0_cbdata cbdata;
4152 size_t size;
4153
4154 page = alloc_page(GFP_NOIO);
4155 if (!page) {
4156 process_fd_request();
4157 return -ENOMEM;
4158 }
4159
4160 size = bdev->bd_block_size;
4161 if (!size)
4162 size = 1024;
4163
4164 cbdata.drive = drive;
4165
4166 bio_init(&bio, &bio_vec, 1);
4167 bio_set_dev(&bio, bdev);
4168 bio_add_page(&bio, page, size, 0);
4169
4170 bio.bi_iter.bi_sector = 0;
4171 bio.bi_flags |= (1 << BIO_QUIET);
4172 bio.bi_private = &cbdata;
4173 bio.bi_end_io = floppy_rb0_cb;
4174 bio_set_op_attrs(&bio, REQ_OP_READ, 0);
4175
4176 init_completion(&cbdata.complete);
4177
4178 submit_bio(&bio);
4179 process_fd_request();
4180
4181 wait_for_completion(&cbdata.complete);
4182
4183 __free_page(page);
4184
4185 return 0;
4186 }
4187
4188
4189
4190
4191
4192 static int floppy_revalidate(struct gendisk *disk)
4193 {
4194 int drive = (long)disk->private_data;
4195 int cf;
4196 int res = 0;
4197
4198 if (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags) ||
4199 test_bit(FD_VERIFY_BIT, &UDRS->flags) ||
4200 test_bit(drive, &fake_change) ||
4201 drive_no_geom(drive)) {
4202 if (WARN(atomic_read(&usage_count) == 0,
4203 "VFS: revalidate called on non-open device.\n"))
4204 return -EFAULT;
4205
4206 res = lock_fdc(drive);
4207 if (res)
4208 return res;
4209 cf = (test_bit(FD_DISK_CHANGED_BIT, &UDRS->flags) ||
4210 test_bit(FD_VERIFY_BIT, &UDRS->flags));
4211 if (!(cf || test_bit(drive, &fake_change) || drive_no_geom(drive))) {
4212 process_fd_request();
4213 return 0;
4214 }
4215 UDRS->maxblock = 0;
4216 UDRS->maxtrack = 0;
4217 if (buffer_drive == drive)
4218 buffer_track = -1;
4219 clear_bit(drive, &fake_change);
4220 clear_bit(FD_DISK_CHANGED_BIT, &UDRS->flags);
4221 if (cf)
4222 UDRS->generation++;
4223 if (drive_no_geom(drive)) {
4224
4225 res = __floppy_read_block_0(opened_bdev[drive], drive);
4226 } else {
4227 if (cf)
4228 poll_drive(false, FD_RAW_NEED_DISK);
4229 process_fd_request();
4230 }
4231 }
4232 set_capacity(disk, floppy_sizes[UDRS->fd_device]);
4233 return res;
4234 }
4235
4236 static const struct block_device_operations floppy_fops = {
4237 .owner = THIS_MODULE,
4238 .open = floppy_open,
4239 .release = floppy_release,
4240 .ioctl = fd_ioctl,
4241 .getgeo = fd_getgeo,
4242 .check_events = floppy_check_events,
4243 .revalidate_disk = floppy_revalidate,
4244 #ifdef CONFIG_COMPAT
4245 .compat_ioctl = fd_compat_ioctl,
4246 #endif
4247 };
4248
4249
4250
4251
4252
4253
4254
4255
4256 static char __init get_fdc_version(void)
4257 {
4258 int r;
4259
4260 output_byte(FD_DUMPREGS);
4261 if (FDCS->reset)
4262 return FDC_NONE;
4263 r = result();
4264 if (r <= 0x00)
4265 return FDC_NONE;
4266 if ((r == 1) && (reply_buffer[0] == 0x80)) {
4267 pr_info("FDC %d is an 8272A\n", fdc);
4268 return FDC_8272A;
4269 }
4270 if (r != 10) {
4271 pr_info("FDC %d init: DUMPREGS: unexpected return of %d bytes.\n",
4272 fdc, r);
4273 return FDC_UNKNOWN;
4274 }
4275
4276 if (!fdc_configure()) {
4277 pr_info("FDC %d is an 82072\n", fdc);
4278 return FDC_82072;
4279 }
4280
4281 output_byte(FD_PERPENDICULAR);
4282 if (need_more_output() == MORE_OUTPUT) {
4283 output_byte(0);
4284 } else {
4285 pr_info("FDC %d is an 82072A\n", fdc);
4286 return FDC_82072A;
4287 }
4288
4289 output_byte(FD_UNLOCK);
4290 r = result();
4291 if ((r == 1) && (reply_buffer[0] == 0x80)) {
4292 pr_info("FDC %d is a pre-1991 82077\n", fdc);
4293 return FDC_82077_ORIG;
4294
4295 }
4296 if ((r != 1) || (reply_buffer[0] != 0x00)) {
4297 pr_info("FDC %d init: UNLOCK: unexpected return of %d bytes.\n",
4298 fdc, r);
4299 return FDC_UNKNOWN;
4300 }
4301 output_byte(FD_PARTID);
4302 r = result();
4303 if (r != 1) {
4304 pr_info("FDC %d init: PARTID: unexpected return of %d bytes.\n",
4305 fdc, r);
4306 return FDC_UNKNOWN;
4307 }
4308 if (reply_buffer[0] == 0x80) {
4309 pr_info("FDC %d is a post-1991 82077\n", fdc);
4310 return FDC_82077;
4311 }
4312 switch (reply_buffer[0] >> 5) {
4313 case 0x0:
4314
4315 pr_info("FDC %d is an 82078.\n", fdc);
4316 return FDC_82078;
4317 case 0x1:
4318 pr_info("FDC %d is a 44pin 82078\n", fdc);
4319 return FDC_82078;
4320 case 0x2:
4321 pr_info("FDC %d is a S82078B\n", fdc);
4322 return FDC_S82078B;
4323 case 0x3:
4324 pr_info("FDC %d is a National Semiconductor PC87306\n", fdc);
4325 return FDC_87306;
4326 default:
4327 pr_info("FDC %d init: 82078 variant with unknown PARTID=%d.\n",
4328 fdc, reply_buffer[0] >> 5);
4329 return FDC_82078_UNKN;
4330 }
4331 }
4332
4333
4334
4335 static void __init floppy_set_flags(int *ints, int param, int param2)
4336 {
4337 int i;
4338
4339 for (i = 0; i < ARRAY_SIZE(default_drive_params); i++) {
4340 if (param)
4341 default_drive_params[i].params.flags |= param2;
4342 else
4343 default_drive_params[i].params.flags &= ~param2;
4344 }
4345 DPRINT("%s flag 0x%x\n", param2 ? "Setting" : "Clearing", param);
4346 }
4347
4348 static void __init daring(int *ints, int param, int param2)
4349 {
4350 int i;
4351
4352 for (i = 0; i < ARRAY_SIZE(default_drive_params); i++) {
4353 if (param) {
4354 default_drive_params[i].params.select_delay = 0;
4355 default_drive_params[i].params.flags |=
4356 FD_SILENT_DCL_CLEAR;
4357 } else {
4358 default_drive_params[i].params.select_delay =
4359 2 * HZ / 100;
4360 default_drive_params[i].params.flags &=
4361 ~FD_SILENT_DCL_CLEAR;
4362 }
4363 }
4364 DPRINT("Assuming %s floppy hardware\n", param ? "standard" : "broken");
4365 }
4366
4367 static void __init set_cmos(int *ints, int dummy, int dummy2)
4368 {
4369 int current_drive = 0;
4370
4371 if (ints[0] != 2) {
4372 DPRINT("wrong number of parameters for CMOS\n");
4373 return;
4374 }
4375 current_drive = ints[1];
4376 if (current_drive < 0 || current_drive >= 8) {
4377 DPRINT("bad drive for set_cmos\n");
4378 return;
4379 }
4380 #if N_FDC > 1
4381 if (current_drive >= 4 && !FDC2)
4382 FDC2 = 0x370;
4383 #endif
4384 DP->cmos = ints[2];
4385 DPRINT("setting CMOS code to %d\n", ints[2]);
4386 }
4387
4388 static struct param_table {
4389 const char *name;
4390 void (*fn) (int *ints, int param, int param2);
4391 int *var;
4392 int def_param;
4393 int param2;
4394 } config_params[] __initdata = {
4395 {"allowed_drive_mask", NULL, &allowed_drive_mask, 0xff, 0},
4396 {"all_drives", NULL, &allowed_drive_mask, 0xff, 0},
4397 {"asus_pci", NULL, &allowed_drive_mask, 0x33, 0},
4398 {"irq", NULL, &FLOPPY_IRQ, 6, 0},
4399 {"dma", NULL, &FLOPPY_DMA, 2, 0},
4400 {"daring", daring, NULL, 1, 0},
4401 #if N_FDC > 1
4402 {"two_fdc", NULL, &FDC2, 0x370, 0},
4403 {"one_fdc", NULL, &FDC2, 0, 0},
4404 #endif
4405 {"thinkpad", floppy_set_flags, NULL, 1, FD_INVERTED_DCL},
4406 {"broken_dcl", floppy_set_flags, NULL, 1, FD_BROKEN_DCL},
4407 {"messages", floppy_set_flags, NULL, 1, FTD_MSG},
4408 {"silent_dcl_clear", floppy_set_flags, NULL, 1, FD_SILENT_DCL_CLEAR},
4409 {"debug", floppy_set_flags, NULL, 1, FD_DEBUG},
4410 {"nodma", NULL, &can_use_virtual_dma, 1, 0},
4411 {"omnibook", NULL, &can_use_virtual_dma, 1, 0},
4412 {"yesdma", NULL, &can_use_virtual_dma, 0, 0},
4413 {"fifo_depth", NULL, &fifo_depth, 0xa, 0},
4414 {"nofifo", NULL, &no_fifo, 0x20, 0},
4415 {"usefifo", NULL, &no_fifo, 0, 0},
4416 {"cmos", set_cmos, NULL, 0, 0},
4417 {"slow", NULL, &slow_floppy, 1, 0},
4418 {"unexpected_interrupts", NULL, &print_unex, 1, 0},
4419 {"no_unexpected_interrupts", NULL, &print_unex, 0, 0},
4420 {"L40SX", NULL, &print_unex, 0, 0}
4421
4422 EXTRA_FLOPPY_PARAMS
4423 };
4424
4425 static int __init floppy_setup(char *str)
4426 {
4427 int i;
4428 int param;
4429 int ints[11];
4430
4431 str = get_options(str, ARRAY_SIZE(ints), ints);
4432 if (str) {
4433 for (i = 0; i < ARRAY_SIZE(config_params); i++) {
4434 if (strcmp(str, config_params[i].name) == 0) {
4435 if (ints[0])
4436 param = ints[1];
4437 else
4438 param = config_params[i].def_param;
4439 if (config_params[i].fn)
4440 config_params[i].fn(ints, param,
4441 config_params[i].
4442 param2);
4443 if (config_params[i].var) {
4444 DPRINT("%s=%d\n", str, param);
4445 *config_params[i].var = param;
4446 }
4447 return 1;
4448 }
4449 }
4450 }
4451 if (str) {
4452 DPRINT("unknown floppy option [%s]\n", str);
4453
4454 DPRINT("allowed options are:");
4455 for (i = 0; i < ARRAY_SIZE(config_params); i++)
4456 pr_cont(" %s", config_params[i].name);
4457 pr_cont("\n");
4458 } else
4459 DPRINT("botched floppy option\n");
4460 DPRINT("Read Documentation/admin-guide/blockdev/floppy.rst\n");
4461 return 0;
4462 }
4463
4464 static int have_no_fdc = -ENODEV;
4465
4466 static ssize_t floppy_cmos_show(struct device *dev,
4467 struct device_attribute *attr, char *buf)
4468 {
4469 struct platform_device *p = to_platform_device(dev);
4470 int drive;
4471
4472 drive = p->id;
4473 return sprintf(buf, "%X\n", UDP->cmos);
4474 }
4475
4476 static DEVICE_ATTR(cmos, 0444, floppy_cmos_show, NULL);
4477
4478 static struct attribute *floppy_dev_attrs[] = {
4479 &dev_attr_cmos.attr,
4480 NULL
4481 };
4482
4483 ATTRIBUTE_GROUPS(floppy_dev);
4484
4485 static void floppy_device_release(struct device *dev)
4486 {
4487 }
4488
4489 static int floppy_resume(struct device *dev)
4490 {
4491 int fdc;
4492
4493 for (fdc = 0; fdc < N_FDC; fdc++)
4494 if (FDCS->address != -1)
4495 user_reset_fdc(-1, FD_RESET_ALWAYS, false);
4496
4497 return 0;
4498 }
4499
4500 static const struct dev_pm_ops floppy_pm_ops = {
4501 .resume = floppy_resume,
4502 .restore = floppy_resume,
4503 };
4504
4505 static struct platform_driver floppy_driver = {
4506 .driver = {
4507 .name = "floppy",
4508 .pm = &floppy_pm_ops,
4509 },
4510 };
4511
4512 static const struct blk_mq_ops floppy_mq_ops = {
4513 .queue_rq = floppy_queue_rq,
4514 };
4515
4516 static struct platform_device floppy_device[N_DRIVE];
4517
4518 static bool floppy_available(int drive)
4519 {
4520 if (!(allowed_drive_mask & (1 << drive)))
4521 return false;
4522 if (fdc_state[FDC(drive)].version == FDC_NONE)
4523 return false;
4524 return true;
4525 }
4526
4527 static struct kobject *floppy_find(dev_t dev, int *part, void *data)
4528 {
4529 int drive = (*part & 3) | ((*part & 0x80) >> 5);
4530 if (drive >= N_DRIVE || !floppy_available(drive))
4531 return NULL;
4532 if (((*part >> 2) & 0x1f) >= ARRAY_SIZE(floppy_type))
4533 return NULL;
4534 *part = 0;
4535 return get_disk_and_module(disks[drive]);
4536 }
4537
4538 static int __init do_floppy_init(void)
4539 {
4540 int i, unit, drive, err;
4541
4542 set_debugt();
4543 interruptjiffies = resultjiffies = jiffies;
4544
4545 #if defined(CONFIG_PPC)
4546 if (check_legacy_ioport(FDC1))
4547 return -ENODEV;
4548 #endif
4549
4550 raw_cmd = NULL;
4551
4552 floppy_wq = alloc_ordered_workqueue("floppy", 0);
4553 if (!floppy_wq)
4554 return -ENOMEM;
4555
4556 for (drive = 0; drive < N_DRIVE; drive++) {
4557 disks[drive] = alloc_disk(1);
4558 if (!disks[drive]) {
4559 err = -ENOMEM;
4560 goto out_put_disk;
4561 }
4562
4563 disks[drive]->queue = blk_mq_init_sq_queue(&tag_sets[drive],
4564 &floppy_mq_ops, 2,
4565 BLK_MQ_F_SHOULD_MERGE);
4566 if (IS_ERR(disks[drive]->queue)) {
4567 err = PTR_ERR(disks[drive]->queue);
4568 disks[drive]->queue = NULL;
4569 goto out_put_disk;
4570 }
4571
4572 blk_queue_bounce_limit(disks[drive]->queue, BLK_BOUNCE_HIGH);
4573 blk_queue_max_hw_sectors(disks[drive]->queue, 64);
4574 disks[drive]->major = FLOPPY_MAJOR;
4575 disks[drive]->first_minor = TOMINOR(drive);
4576 disks[drive]->fops = &floppy_fops;
4577 disks[drive]->events = DISK_EVENT_MEDIA_CHANGE;
4578 sprintf(disks[drive]->disk_name, "fd%d", drive);
4579
4580 timer_setup(&motor_off_timer[drive], motor_off_callback, 0);
4581 }
4582
4583 err = register_blkdev(FLOPPY_MAJOR, "fd");
4584 if (err)
4585 goto out_put_disk;
4586
4587 err = platform_driver_register(&floppy_driver);
4588 if (err)
4589 goto out_unreg_blkdev;
4590
4591 blk_register_region(MKDEV(FLOPPY_MAJOR, 0), 256, THIS_MODULE,
4592 floppy_find, NULL, NULL);
4593
4594 for (i = 0; i < 256; i++)
4595 if (ITYPE(i))
4596 floppy_sizes[i] = floppy_type[ITYPE(i)].size;
4597 else
4598 floppy_sizes[i] = MAX_DISK_SIZE << 1;
4599
4600 reschedule_timeout(MAXTIMEOUT, "floppy init");
4601 config_types();
4602
4603 for (i = 0; i < N_FDC; i++) {
4604 fdc = i;
4605 memset(FDCS, 0, sizeof(*FDCS));
4606 FDCS->dtr = -1;
4607 FDCS->dor = 0x4;
4608 #if defined(__sparc__) || defined(__mc68000__)
4609
4610 #ifdef __mc68000__
4611 if (MACH_IS_SUN3X)
4612 #endif
4613 FDCS->version = FDC_82072A;
4614 #endif
4615 }
4616
4617 use_virtual_dma = can_use_virtual_dma & 1;
4618 fdc_state[0].address = FDC1;
4619 if (fdc_state[0].address == -1) {
4620 cancel_delayed_work(&fd_timeout);
4621 err = -ENODEV;
4622 goto out_unreg_region;
4623 }
4624 #if N_FDC > 1
4625 fdc_state[1].address = FDC2;
4626 #endif
4627
4628 fdc = 0;
4629 err = floppy_grab_irq_and_dma();
4630 if (err) {
4631 cancel_delayed_work(&fd_timeout);
4632 err = -EBUSY;
4633 goto out_unreg_region;
4634 }
4635
4636
4637 for (drive = 0; drive < N_DRIVE; drive++) {
4638 memset(UDRS, 0, sizeof(*UDRS));
4639 memset(UDRWE, 0, sizeof(*UDRWE));
4640 set_bit(FD_DISK_NEWCHANGE_BIT, &UDRS->flags);
4641 set_bit(FD_DISK_CHANGED_BIT, &UDRS->flags);
4642 set_bit(FD_VERIFY_BIT, &UDRS->flags);
4643 UDRS->fd_device = -1;
4644 floppy_track_buffer = NULL;
4645 max_buffer_sectors = 0;
4646 }
4647
4648
4649
4650
4651
4652 msleep(10);
4653
4654 for (i = 0; i < N_FDC; i++) {
4655 fdc = i;
4656 FDCS->driver_version = FD_DRIVER_VERSION;
4657 for (unit = 0; unit < 4; unit++)
4658 FDCS->track[unit] = 0;
4659 if (FDCS->address == -1)
4660 continue;
4661 FDCS->rawcmd = 2;
4662 if (user_reset_fdc(-1, FD_RESET_ALWAYS, false)) {
4663
4664 floppy_release_regions(fdc);
4665 FDCS->address = -1;
4666 FDCS->version = FDC_NONE;
4667 continue;
4668 }
4669
4670 FDCS->version = get_fdc_version();
4671 if (FDCS->version == FDC_NONE) {
4672
4673 floppy_release_regions(fdc);
4674 FDCS->address = -1;
4675 continue;
4676 }
4677 if (can_use_virtual_dma == 2 && FDCS->version < FDC_82072A)
4678 can_use_virtual_dma = 0;
4679
4680 have_no_fdc = 0;
4681
4682
4683
4684
4685 user_reset_fdc(-1, FD_RESET_ALWAYS, false);
4686 }
4687 fdc = 0;
4688 cancel_delayed_work(&fd_timeout);
4689 current_drive = 0;
4690 initialized = true;
4691 if (have_no_fdc) {
4692 DPRINT("no floppy controllers found\n");
4693 err = have_no_fdc;
4694 goto out_release_dma;
4695 }
4696
4697 for (drive = 0; drive < N_DRIVE; drive++) {
4698 if (!floppy_available(drive))
4699 continue;
4700
4701 floppy_device[drive].name = floppy_device_name;
4702 floppy_device[drive].id = drive;
4703 floppy_device[drive].dev.release = floppy_device_release;
4704 floppy_device[drive].dev.groups = floppy_dev_groups;
4705
4706 err = platform_device_register(&floppy_device[drive]);
4707 if (err)
4708 goto out_remove_drives;
4709
4710
4711 disks[drive]->private_data = (void *)(long)drive;
4712 disks[drive]->flags |= GENHD_FL_REMOVABLE;
4713 device_add_disk(&floppy_device[drive].dev, disks[drive], NULL);
4714 }
4715
4716 return 0;
4717
4718 out_remove_drives:
4719 while (drive--) {
4720 if (floppy_available(drive)) {
4721 del_gendisk(disks[drive]);
4722 platform_device_unregister(&floppy_device[drive]);
4723 }
4724 }
4725 out_release_dma:
4726 if (atomic_read(&usage_count))
4727 floppy_release_irq_and_dma();
4728 out_unreg_region:
4729 blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256);
4730 platform_driver_unregister(&floppy_driver);
4731 out_unreg_blkdev:
4732 unregister_blkdev(FLOPPY_MAJOR, "fd");
4733 out_put_disk:
4734 destroy_workqueue(floppy_wq);
4735 for (drive = 0; drive < N_DRIVE; drive++) {
4736 if (!disks[drive])
4737 break;
4738 if (disks[drive]->queue) {
4739 del_timer_sync(&motor_off_timer[drive]);
4740 blk_cleanup_queue(disks[drive]->queue);
4741 disks[drive]->queue = NULL;
4742 blk_mq_free_tag_set(&tag_sets[drive]);
4743 }
4744 put_disk(disks[drive]);
4745 }
4746 return err;
4747 }
4748
4749 #ifndef MODULE
4750 static __init void floppy_async_init(void *data, async_cookie_t cookie)
4751 {
4752 do_floppy_init();
4753 }
4754 #endif
4755
4756 static int __init floppy_init(void)
4757 {
4758 #ifdef MODULE
4759 return do_floppy_init();
4760 #else
4761
4762 async_schedule(floppy_async_init, NULL);
4763 return 0;
4764 #endif
4765 }
4766
4767 static const struct io_region {
4768 int offset;
4769 int size;
4770 } io_regions[] = {
4771 { 2, 1 },
4772
4773 { 4, 2 },
4774
4775
4776 { 7, 1 },
4777 };
4778
4779 static void floppy_release_allocated_regions(int fdc, const struct io_region *p)
4780 {
4781 while (p != io_regions) {
4782 p--;
4783 release_region(FDCS->address + p->offset, p->size);
4784 }
4785 }
4786
4787 #define ARRAY_END(X) (&((X)[ARRAY_SIZE(X)]))
4788
4789 static int floppy_request_regions(int fdc)
4790 {
4791 const struct io_region *p;
4792
4793 for (p = io_regions; p < ARRAY_END(io_regions); p++) {
4794 if (!request_region(FDCS->address + p->offset,
4795 p->size, "floppy")) {
4796 DPRINT("Floppy io-port 0x%04lx in use\n",
4797 FDCS->address + p->offset);
4798 floppy_release_allocated_regions(fdc, p);
4799 return -EBUSY;
4800 }
4801 }
4802 return 0;
4803 }
4804
4805 static void floppy_release_regions(int fdc)
4806 {
4807 floppy_release_allocated_regions(fdc, ARRAY_END(io_regions));
4808 }
4809
4810 static int floppy_grab_irq_and_dma(void)
4811 {
4812 if (atomic_inc_return(&usage_count) > 1)
4813 return 0;
4814
4815
4816
4817
4818
4819 flush_workqueue(floppy_wq);
4820
4821 if (fd_request_irq()) {
4822 DPRINT("Unable to grab IRQ%d for the floppy driver\n",
4823 FLOPPY_IRQ);
4824 atomic_dec(&usage_count);
4825 return -1;
4826 }
4827 if (fd_request_dma()) {
4828 DPRINT("Unable to grab DMA%d for the floppy driver\n",
4829 FLOPPY_DMA);
4830 if (can_use_virtual_dma & 2)
4831 use_virtual_dma = can_use_virtual_dma = 1;
4832 if (!(can_use_virtual_dma & 1)) {
4833 fd_free_irq();
4834 atomic_dec(&usage_count);
4835 return -1;
4836 }
4837 }
4838
4839 for (fdc = 0; fdc < N_FDC; fdc++) {
4840 if (FDCS->address != -1) {
4841 if (floppy_request_regions(fdc))
4842 goto cleanup;
4843 }
4844 }
4845 for (fdc = 0; fdc < N_FDC; fdc++) {
4846 if (FDCS->address != -1) {
4847 reset_fdc_info(1);
4848 fd_outb(FDCS->dor, FD_DOR);
4849 }
4850 }
4851 fdc = 0;
4852 set_dor(0, ~0, 8);
4853
4854 for (fdc = 0; fdc < N_FDC; fdc++)
4855 if (FDCS->address != -1)
4856 fd_outb(FDCS->dor, FD_DOR);
4857
4858
4859
4860
4861 fdc = 0;
4862 irqdma_allocated = 1;
4863 return 0;
4864 cleanup:
4865 fd_free_irq();
4866 fd_free_dma();
4867 while (--fdc >= 0)
4868 floppy_release_regions(fdc);
4869 atomic_dec(&usage_count);
4870 return -1;
4871 }
4872
4873 static void floppy_release_irq_and_dma(void)
4874 {
4875 int old_fdc;
4876 #ifndef __sparc__
4877 int drive;
4878 #endif
4879 long tmpsize;
4880 unsigned long tmpaddr;
4881
4882 if (!atomic_dec_and_test(&usage_count))
4883 return;
4884
4885 if (irqdma_allocated) {
4886 fd_disable_dma();
4887 fd_free_dma();
4888 fd_free_irq();
4889 irqdma_allocated = 0;
4890 }
4891 set_dor(0, ~0, 8);
4892 #if N_FDC > 1
4893 set_dor(1, ~8, 0);
4894 #endif
4895
4896 if (floppy_track_buffer && max_buffer_sectors) {
4897 tmpsize = max_buffer_sectors * 1024;
4898 tmpaddr = (unsigned long)floppy_track_buffer;
4899 floppy_track_buffer = NULL;
4900 max_buffer_sectors = 0;
4901 buffer_min = buffer_max = -1;
4902 fd_dma_mem_free(tmpaddr, tmpsize);
4903 }
4904 #ifndef __sparc__
4905 for (drive = 0; drive < N_FDC * 4; drive++)
4906 if (timer_pending(motor_off_timer + drive))
4907 pr_info("motor off timer %d still active\n", drive);
4908 #endif
4909
4910 if (delayed_work_pending(&fd_timeout))
4911 pr_info("floppy timer still active:%s\n", timeout_message);
4912 if (delayed_work_pending(&fd_timer))
4913 pr_info("auxiliary floppy timer still active\n");
4914 if (work_pending(&floppy_work))
4915 pr_info("work still pending\n");
4916 old_fdc = fdc;
4917 for (fdc = 0; fdc < N_FDC; fdc++)
4918 if (FDCS->address != -1)
4919 floppy_release_regions(fdc);
4920 fdc = old_fdc;
4921 }
4922
4923 #ifdef MODULE
4924
4925 static char *floppy;
4926
4927 static void __init parse_floppy_cfg_string(char *cfg)
4928 {
4929 char *ptr;
4930
4931 while (*cfg) {
4932 ptr = cfg;
4933 while (*cfg && *cfg != ' ' && *cfg != '\t')
4934 cfg++;
4935 if (*cfg) {
4936 *cfg = '\0';
4937 cfg++;
4938 }
4939 if (*ptr)
4940 floppy_setup(ptr);
4941 }
4942 }
4943
4944 static int __init floppy_module_init(void)
4945 {
4946 if (floppy)
4947 parse_floppy_cfg_string(floppy);
4948 return floppy_init();
4949 }
4950 module_init(floppy_module_init);
4951
4952 static void __exit floppy_module_exit(void)
4953 {
4954 int drive;
4955
4956 blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256);
4957 unregister_blkdev(FLOPPY_MAJOR, "fd");
4958 platform_driver_unregister(&floppy_driver);
4959
4960 destroy_workqueue(floppy_wq);
4961
4962 for (drive = 0; drive < N_DRIVE; drive++) {
4963 del_timer_sync(&motor_off_timer[drive]);
4964
4965 if (floppy_available(drive)) {
4966 del_gendisk(disks[drive]);
4967 platform_device_unregister(&floppy_device[drive]);
4968 }
4969 blk_cleanup_queue(disks[drive]->queue);
4970 blk_mq_free_tag_set(&tag_sets[drive]);
4971
4972
4973
4974
4975
4976 if (!(allowed_drive_mask & (1 << drive)) ||
4977 fdc_state[FDC(drive)].version == FDC_NONE)
4978 disks[drive]->queue = NULL;
4979
4980 put_disk(disks[drive]);
4981 }
4982
4983 cancel_delayed_work_sync(&fd_timeout);
4984 cancel_delayed_work_sync(&fd_timer);
4985
4986 if (atomic_read(&usage_count))
4987 floppy_release_irq_and_dma();
4988
4989
4990 fd_eject(0);
4991 }
4992
4993 module_exit(floppy_module_exit);
4994
4995 module_param(floppy, charp, 0);
4996 module_param(FLOPPY_IRQ, int, 0);
4997 module_param(FLOPPY_DMA, int, 0);
4998 MODULE_AUTHOR("Alain L. Knaff");
4999 MODULE_SUPPORTED_DEVICE("fd");
5000 MODULE_LICENSE("GPL");
5001
5002
5003 static const struct pnp_device_id floppy_pnpids[] = {
5004 {"PNP0700", 0},
5005 {}
5006 };
5007
5008 MODULE_DEVICE_TABLE(pnp, floppy_pnpids);
5009
5010 #else
5011
5012 __setup("floppy=", floppy_setup);
5013 module_init(floppy_init)
5014 #endif
5015
5016 MODULE_ALIAS_BLOCKDEV_MAJOR(FLOPPY_MAJOR);