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