This source file includes following definitions.
- fd_end_request_cur
- start_motor_off_timer
- start_check_change_timer
- start_timeout
- stop_timeout
- fd_select_side
- fd_select_drive
- fd_deselect
- fd_motor_off_timer
- check_change
- set_head_settle_flag
- get_head_settle_flag
- copy_buffer
- floppy_irq
- fd_error
- do_format
- do_fd_action
- fd_calibrate
- fd_calibrate_done
- fd_seek
- fd_seek_done
- fd_rwsec
- fd_readtrack_check
- fd_rwsec_done
- fd_rwsec_done1
- fd_writetrack
- fd_writetrack_done
- fd_times_out
- finish_fdc
- finish_fdc_done
- floppy_check_events
- floppy_revalidate
- setup_req_params
- ataflop_commit_rqs
- ataflop_queue_rq
- fd_locked_ioctl
- fd_ioctl
- fd_probe
- fd_test_drive_present
- config_types
- floppy_open
- floppy_unlocked_open
- floppy_release
- floppy_find
- atari_floppy_init
- atari_floppy_setup
- atari_floppy_exit
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65 #include <linux/module.h>
66
67 #include <linux/fd.h>
68 #include <linux/delay.h>
69 #include <linux/init.h>
70 #include <linux/blk-mq.h>
71 #include <linux/mutex.h>
72 #include <linux/completion.h>
73 #include <linux/wait.h>
74
75 #include <asm/atariints.h>
76 #include <asm/atari_stdma.h>
77 #include <asm/atari_stram.h>
78
79 #define FD_MAX_UNITS 2
80
81 #undef DEBUG
82
83 static DEFINE_MUTEX(ataflop_mutex);
84 static struct request *fd_request;
85
86
87
88
89
90
91
92 #define FDCSELREG_STP (0x80)
93 #define FDCSELREG_TRA (0x82)
94 #define FDCSELREG_SEC (0x84)
95 #define FDCSELREG_DTA (0x86)
96
97
98
99 #define FDCREG_CMD 0
100 #define FDCREG_STATUS 0
101 #define FDCREG_TRACK 2
102 #define FDCREG_SECTOR 4
103 #define FDCREG_DATA 6
104
105
106
107 #define FDCCMD_RESTORE (0x00)
108 #define FDCCMD_SEEK (0x10)
109 #define FDCCMD_STEP (0x20)
110 #define FDCCMD_STIN (0x40)
111 #define FDCCMD_STOT (0x60)
112 #define FDCCMD_RDSEC (0x80)
113 #define FDCCMD_WRSEC (0xa0)
114 #define FDCCMD_RDADR (0xc0)
115 #define FDCCMD_RDTRA (0xe0)
116 #define FDCCMD_WRTRA (0xf0)
117 #define FDCCMD_FORCI (0xd0)
118
119
120
121 #define FDCCMDADD_SR6 (0x00)
122 #define FDCCMDADD_SR12 (0x01)
123 #define FDCCMDADD_SR2 (0x02)
124 #define FDCCMDADD_SR3 (0x03)
125 #define FDCCMDADD_V (0x04)
126 #define FDCCMDADD_H (0x08)
127 #define FDCCMDADD_U (0x10)
128 #define FDCCMDADD_M (0x10)
129 #define FDCCMDADD_E (0x04)
130 #define FDCCMDADD_P (0x02)
131 #define FDCCMDADD_A0 (0x01)
132
133
134
135 #define FDCSTAT_MOTORON (0x80)
136 #define FDCSTAT_WPROT (0x40)
137 #define FDCSTAT_SPINUP (0x20)
138 #define FDCSTAT_DELDAM (0x20)
139 #define FDCSTAT_RECNF (0x10)
140 #define FDCSTAT_CRC (0x08)
141 #define FDCSTAT_TR00 (0x04)
142 #define FDCSTAT_LOST (0x04)
143 #define FDCSTAT_IDX (0x02)
144 #define FDCSTAT_DRQ (0x02)
145 #define FDCSTAT_BUSY (0x01)
146
147
148
149 #define DSKSIDE (0x01)
150
151 #define DSKDRVNONE (0x06)
152 #define DSKDRV0 (0x02)
153 #define DSKDRV1 (0x04)
154
155
156 #define FDCSTEP_6 0x00
157 #define FDCSTEP_12 0x01
158 #define FDCSTEP_2 0x02
159 #define FDCSTEP_3 0x03
160
161 struct atari_format_descr {
162 int track;
163 int head;
164 int sect_offset;
165 };
166
167
168 static struct atari_disk_type {
169 const char *name;
170 unsigned spt;
171 unsigned blocks;
172 unsigned fdc_speed;
173 unsigned stretch;
174 } atari_disk_type[] = {
175 { "d360", 9, 720, 0, 0},
176 { "D360", 9, 720, 0, 1},
177 { "D720", 9,1440, 0, 0},
178 { "D820", 10,1640, 0, 0},
179
180 #define MAX_TYPE_DD 3
181 { "h1200",15,2400, 3, 0},
182 { "H1440",18,2880, 3, 0},
183 { "H1640",20,3280, 3, 0},
184
185 #define MAX_TYPE_HD 6
186 { "E2880",36,5760, 3, 0},
187 { "E3280",40,6560, 3, 0},
188
189 #define MAX_TYPE_ED 8
190
191 { "H1680",21,3360, 3, 0},
192 { "h410",10,820, 0, 1},
193 { "h1476",18,2952, 3, 0},
194 { "H1722",21,3444, 3, 0},
195 { "h420",10,840, 0, 1},
196 { "H830",10,1660, 0, 0},
197 { "h1494",18,2952, 3, 0},
198 { "H1743",21,3486, 3, 0},
199 { "h880",11,1760, 0, 0},
200 { "D1040",13,2080, 0, 0},
201 { "D1120",14,2240, 0, 0},
202 { "h1600",20,3200, 3, 0},
203 { "H1760",22,3520, 3, 0},
204 { "H1920",24,3840, 3, 0},
205 { "E3200",40,6400, 3, 0},
206 { "E3520",44,7040, 3, 0},
207 { "E3840",48,7680, 3, 0},
208 { "H1840",23,3680, 3, 0},
209 { "D800",10,1600, 0, 0},
210 };
211
212 static int StartDiskType[] = {
213 MAX_TYPE_DD,
214 MAX_TYPE_HD,
215 MAX_TYPE_ED
216 };
217
218 #define TYPE_DD 0
219 #define TYPE_HD 1
220 #define TYPE_ED 2
221
222 static int DriveType = TYPE_HD;
223
224 static DEFINE_SPINLOCK(ataflop_lock);
225
226
227 static struct {
228 int index;
229 unsigned drive_types;
230 } minor2disktype[] = {
231 { 0, TYPE_DD },
232 { 4, TYPE_HD },
233 { 1, TYPE_DD },
234 { 2, TYPE_DD },
235 { 1, TYPE_DD },
236 { 2, TYPE_DD },
237 { 5, TYPE_HD },
238 { 7, TYPE_ED },
239
240 { 8, TYPE_ED },
241 { 5, TYPE_HD },
242 { 9, TYPE_HD },
243 { 10, TYPE_DD },
244 { 3, TYPE_DD },
245 { 11, TYPE_HD },
246 { 12, TYPE_HD },
247 { 13, TYPE_DD },
248 { 14, TYPE_DD },
249 { 15, TYPE_HD },
250 { 16, TYPE_HD },
251 { 17, TYPE_DD },
252 { 18, TYPE_DD },
253 { 19, TYPE_DD },
254 { 20, TYPE_HD },
255 { 21, TYPE_HD },
256 { 22, TYPE_HD },
257 { 23, TYPE_ED },
258 { 24, TYPE_ED },
259 { 25, TYPE_ED },
260 { 26, TYPE_HD },
261 { 27, TYPE_DD },
262 { 6, TYPE_HD },
263 };
264
265 #define NUM_DISK_MINORS ARRAY_SIZE(minor2disktype)
266
267
268
269
270
271 #define MAX_DISK_SIZE 3280
272
273
274
275
276
277 static struct atari_disk_type user_params[FD_MAX_UNITS];
278
279
280
281
282
283
284
285 static struct atari_disk_type default_params[FD_MAX_UNITS];
286
287
288 static struct atari_floppy_struct {
289 int connected;
290 int autoprobe;
291
292 struct atari_disk_type *disktype;
293
294 int track;
295
296 unsigned int steprate;
297 unsigned int wpstat;
298
299 int flags;
300 struct gendisk *disk;
301 int ref;
302 int type;
303 struct blk_mq_tag_set tag_set;
304 } unit[FD_MAX_UNITS];
305
306 #define UD unit[drive]
307 #define UDT unit[drive].disktype
308 #define SUD unit[SelectedDrive]
309 #define SUDT unit[SelectedDrive].disktype
310
311
312 #define FDC_READ(reg) ({ \
313 \
314 unsigned short __val; \
315 \
316 dma_wd.dma_mode_status = 0x80 | (reg); \
317 udelay(25); \
318 __val = dma_wd.fdc_acces_seccount; \
319 MFPDELAY(); \
320 \
321 __val & 0xff; \
322 })
323
324 #define FDC_WRITE(reg,val) \
325 do { \
326 \
327 \
328 dma_wd.dma_mode_status = 0x80 | (reg); \
329 udelay(25); \
330 dma_wd.fdc_acces_seccount = (val); \
331 MFPDELAY(); \
332 \
333 } while(0)
334
335
336
337
338
339
340
341
342
343 static int MaxSectors[] = {
344 11, 22, 44
345 };
346 static int BufferSize[] = {
347 15*512, 30*512, 60*512
348 };
349
350 #define BUFFER_SIZE (BufferSize[DriveType])
351
352 unsigned char *DMABuffer;
353 static unsigned long PhysDMABuffer;
354
355 static int UseTrackbuffer = -1;
356 module_param(UseTrackbuffer, int, 0);
357
358 unsigned char *TrackBuffer;
359 static unsigned long PhysTrackBuffer;
360 static int BufferDrive, BufferSide, BufferTrack;
361 static int read_track;
362
363 #define SECTOR_BUFFER(sec) (TrackBuffer + ((sec)-1)*512)
364 #define IS_BUFFERED(drive,side,track) \
365 (BufferDrive == (drive) && BufferSide == (side) && BufferTrack == (track))
366
367
368
369
370
371
372 static int SelectedDrive = 0;
373 static int ReqCmd, ReqBlock;
374 static int ReqSide, ReqTrack, ReqSector, ReqCnt;
375 static int HeadSettleFlag = 0;
376 static unsigned char *ReqData, *ReqBuffer;
377 static int MotorOn = 0, MotorOffTrys;
378 static int IsFormatting = 0, FormatError;
379
380 static int UserSteprate[FD_MAX_UNITS] = { -1, -1 };
381 module_param_array(UserSteprate, int, NULL, 0);
382
383 static DECLARE_COMPLETION(format_wait);
384
385 static unsigned long changed_floppies = 0xff, fake_change = 0;
386 #define CHECK_CHANGE_DELAY HZ/2
387
388 #define FD_MOTOR_OFF_DELAY (3*HZ)
389 #define FD_MOTOR_OFF_MAXTRY (10*20)
390
391 #define FLOPPY_TIMEOUT (6*HZ)
392 #define RECALIBRATE_ERRORS 4
393
394 #define MAX_ERRORS 8
395
396
397
398
399
400
401
402
403 static int Probing = 0;
404
405
406
407
408 static int NeedSeek = 0;
409
410
411 #ifdef DEBUG
412 #define DPRINT(a) printk a
413 #else
414 #define DPRINT(a)
415 #endif
416
417
418
419 static void fd_select_side( int side );
420 static void fd_select_drive( int drive );
421 static void fd_deselect( void );
422 static void fd_motor_off_timer(struct timer_list *unused);
423 static void check_change(struct timer_list *unused);
424 static irqreturn_t floppy_irq (int irq, void *dummy);
425 static void fd_error( void );
426 static int do_format(int drive, int type, struct atari_format_descr *desc);
427 static void do_fd_action( int drive );
428 static void fd_calibrate( void );
429 static void fd_calibrate_done( int status );
430 static void fd_seek( void );
431 static void fd_seek_done( int status );
432 static void fd_rwsec( void );
433 static void fd_readtrack_check(struct timer_list *unused);
434 static void fd_rwsec_done( int status );
435 static void fd_rwsec_done1(int status);
436 static void fd_writetrack( void );
437 static void fd_writetrack_done( int status );
438 static void fd_times_out(struct timer_list *unused);
439 static void finish_fdc( void );
440 static void finish_fdc_done( int dummy );
441 static void setup_req_params( int drive );
442 static int fd_locked_ioctl(struct block_device *bdev, fmode_t mode, unsigned int
443 cmd, unsigned long param);
444 static void fd_probe( int drive );
445 static int fd_test_drive_present( int drive );
446 static void config_types( void );
447 static int floppy_open(struct block_device *bdev, fmode_t mode);
448 static void floppy_release(struct gendisk *disk, fmode_t mode);
449
450
451
452 static DEFINE_TIMER(motor_off_timer, fd_motor_off_timer);
453 static DEFINE_TIMER(readtrack_timer, fd_readtrack_check);
454 static DEFINE_TIMER(timeout_timer, fd_times_out);
455 static DEFINE_TIMER(fd_timer, check_change);
456
457 static void fd_end_request_cur(blk_status_t err)
458 {
459 if (!blk_update_request(fd_request, err,
460 blk_rq_cur_bytes(fd_request))) {
461 __blk_mq_end_request(fd_request, err);
462 fd_request = NULL;
463 }
464 }
465
466 static inline void start_motor_off_timer(void)
467 {
468 mod_timer(&motor_off_timer, jiffies + FD_MOTOR_OFF_DELAY);
469 MotorOffTrys = 0;
470 }
471
472 static inline void start_check_change_timer( void )
473 {
474 mod_timer(&fd_timer, jiffies + CHECK_CHANGE_DELAY);
475 }
476
477 static inline void start_timeout(void)
478 {
479 mod_timer(&timeout_timer, jiffies + FLOPPY_TIMEOUT);
480 }
481
482 static inline void stop_timeout(void)
483 {
484 del_timer(&timeout_timer);
485 }
486
487
488
489 static void fd_select_side( int side )
490 {
491 unsigned long flags;
492
493
494 local_irq_save(flags);
495
496 sound_ym.rd_data_reg_sel = 14;
497 sound_ym.wd_data = (side == 0) ? sound_ym.rd_data_reg_sel | 0x01 :
498 sound_ym.rd_data_reg_sel & 0xfe;
499
500 local_irq_restore(flags);
501 }
502
503
504
505
506
507
508 static void fd_select_drive( int drive )
509 {
510 unsigned long flags;
511 unsigned char tmp;
512
513 if (drive == SelectedDrive)
514 return;
515
516
517 local_irq_save(flags);
518 sound_ym.rd_data_reg_sel = 14;
519 tmp = sound_ym.rd_data_reg_sel;
520 sound_ym.wd_data = (tmp | DSKDRVNONE) & ~(drive == 0 ? DSKDRV0 : DSKDRV1);
521 atari_dont_touch_floppy_select = 1;
522 local_irq_restore(flags);
523
524
525 FDC_WRITE( FDCREG_TRACK, UD.track );
526 udelay(25);
527
528
529 if (UDT)
530 if (ATARIHW_PRESENT(FDCSPEED))
531 dma_wd.fdc_speed = UDT->fdc_speed;
532
533 SelectedDrive = drive;
534 }
535
536
537
538
539 static void fd_deselect( void )
540 {
541 unsigned long flags;
542
543
544 local_irq_save(flags);
545 atari_dont_touch_floppy_select = 0;
546 sound_ym.rd_data_reg_sel=14;
547 sound_ym.wd_data = (sound_ym.rd_data_reg_sel |
548 (MACH_IS_FALCON ? 3 : 7));
549
550
551 SelectedDrive = -1;
552 local_irq_restore(flags);
553 }
554
555
556
557
558
559
560
561 static void fd_motor_off_timer(struct timer_list *unused)
562 {
563 unsigned char status;
564
565 if (SelectedDrive < 0)
566
567 return;
568
569 if (stdma_islocked())
570 goto retry;
571
572 status = FDC_READ( FDCREG_STATUS );
573
574 if (!(status & 0x80)) {
575
576 MotorOn = 0;
577 fd_deselect();
578 return;
579 }
580
581
582 retry:
583
584
585
586
587
588 mod_timer(&motor_off_timer,
589 jiffies + (MotorOffTrys++ < FD_MOTOR_OFF_MAXTRY ? HZ/20 : HZ/2));
590 }
591
592
593
594
595
596
597 static void check_change(struct timer_list *unused)
598 {
599 static int drive = 0;
600
601 unsigned long flags;
602 unsigned char old_porta;
603 int stat;
604
605 if (++drive > 1 || !UD.connected)
606 drive = 0;
607
608
609 local_irq_save(flags);
610
611 if (!stdma_islocked()) {
612 sound_ym.rd_data_reg_sel = 14;
613 old_porta = sound_ym.rd_data_reg_sel;
614 sound_ym.wd_data = (old_porta | DSKDRVNONE) &
615 ~(drive == 0 ? DSKDRV0 : DSKDRV1);
616 stat = !!(FDC_READ( FDCREG_STATUS ) & FDCSTAT_WPROT);
617 sound_ym.wd_data = old_porta;
618
619 if (stat != UD.wpstat) {
620 DPRINT(( "wpstat[%d] = %d\n", drive, stat ));
621 UD.wpstat = stat;
622 set_bit (drive, &changed_floppies);
623 }
624 }
625 local_irq_restore(flags);
626
627 start_check_change_timer();
628 }
629
630
631
632
633
634
635 static inline void set_head_settle_flag(void)
636 {
637 HeadSettleFlag = FDCCMDADD_E;
638 }
639
640 static inline int get_head_settle_flag(void)
641 {
642 int tmp = HeadSettleFlag;
643 HeadSettleFlag = 0;
644 return( tmp );
645 }
646
647 static inline void copy_buffer(void *from, void *to)
648 {
649 ulong *p1 = (ulong *)from, *p2 = (ulong *)to;
650 int cnt;
651
652 for (cnt = 512/4; cnt; cnt--)
653 *p2++ = *p1++;
654 }
655
656
657
658
659
660
661 static void (*FloppyIRQHandler)( int status ) = NULL;
662
663 static irqreturn_t floppy_irq (int irq, void *dummy)
664 {
665 unsigned char status;
666 void (*handler)( int );
667
668 handler = xchg(&FloppyIRQHandler, NULL);
669
670 if (handler) {
671 nop();
672 status = FDC_READ( FDCREG_STATUS );
673 DPRINT(("FDC irq, status = %02x handler = %08lx\n",status,(unsigned long)handler));
674 handler( status );
675 }
676 else {
677 DPRINT(("FDC irq, no handler\n"));
678 }
679 return IRQ_HANDLED;
680 }
681
682
683
684
685
686
687 static void fd_error( void )
688 {
689 if (IsFormatting) {
690 IsFormatting = 0;
691 FormatError = 1;
692 complete(&format_wait);
693 return;
694 }
695
696 if (!fd_request)
697 return;
698
699 fd_request->error_count++;
700 if (fd_request->error_count >= MAX_ERRORS) {
701 printk(KERN_ERR "fd%d: too many errors.\n", SelectedDrive );
702 fd_end_request_cur(BLK_STS_IOERR);
703 }
704 else if (fd_request->error_count == RECALIBRATE_ERRORS) {
705 printk(KERN_WARNING "fd%d: recalibrating\n", SelectedDrive );
706 if (SelectedDrive != -1)
707 SUD.track = -1;
708 }
709 }
710
711
712
713 #define SET_IRQ_HANDLER(proc) do { FloppyIRQHandler = (proc); } while(0)
714
715
716
717
718 #define FILL(n,val) \
719 do { \
720 memset( p, val, n ); \
721 p += n; \
722 } while(0)
723
724 static int do_format(int drive, int type, struct atari_format_descr *desc)
725 {
726 struct request_queue *q = unit[drive].disk->queue;
727 unsigned char *p;
728 int sect, nsect;
729 unsigned long flags;
730 int ret;
731
732 blk_mq_freeze_queue(q);
733 blk_mq_quiesce_queue(q);
734
735 local_irq_save(flags);
736 stdma_lock(floppy_irq, NULL);
737 atari_turnon_irq( IRQ_MFP_FDC );
738 local_irq_restore(flags);
739
740 if (type) {
741 if (--type >= NUM_DISK_MINORS ||
742 minor2disktype[type].drive_types > DriveType) {
743 ret = -EINVAL;
744 goto out;
745 }
746 type = minor2disktype[type].index;
747 UDT = &atari_disk_type[type];
748 }
749
750 if (!UDT || desc->track >= UDT->blocks/UDT->spt/2 || desc->head >= 2) {
751 ret = -EINVAL;
752 goto out;
753 }
754
755 nsect = UDT->spt;
756 p = TrackBuffer;
757
758
759 BufferDrive = -1;
760
761 del_timer( &motor_off_timer );
762
763 FILL( 60 * (nsect / 9), 0x4e );
764 for( sect = 0; sect < nsect; ++sect ) {
765 FILL( 12, 0 );
766 FILL( 3, 0xf5 );
767 *p++ = 0xfe;
768 *p++ = desc->track;
769 *p++ = desc->head;
770 *p++ = (nsect + sect - desc->sect_offset) % nsect + 1;
771 *p++ = 2;
772 *p++ = 0xf7;
773 FILL( 22, 0x4e );
774 FILL( 12, 0 );
775 FILL( 3, 0xf5 );
776 *p++ = 0xfb;
777 FILL( 512, 0xe5 );
778 *p++ = 0xf7;
779 FILL( 40, 0x4e );
780 }
781 FILL( TrackBuffer+BUFFER_SIZE-p, 0x4e );
782
783 IsFormatting = 1;
784 FormatError = 0;
785 ReqTrack = desc->track;
786 ReqSide = desc->head;
787 do_fd_action( drive );
788
789 wait_for_completion(&format_wait);
790
791 ret = FormatError ? -EIO : 0;
792 out:
793 blk_mq_unquiesce_queue(q);
794 blk_mq_unfreeze_queue(q);
795 return ret;
796 }
797
798
799
800
801
802
803
804
805
806
807
808 static void do_fd_action( int drive )
809 {
810 DPRINT(("do_fd_action\n"));
811
812 if (UseTrackbuffer && !IsFormatting) {
813 repeat:
814 if (IS_BUFFERED( drive, ReqSide, ReqTrack )) {
815 if (ReqCmd == READ) {
816 copy_buffer( SECTOR_BUFFER(ReqSector), ReqData );
817 if (++ReqCnt < blk_rq_cur_sectors(fd_request)) {
818
819 setup_req_params( drive );
820 goto repeat;
821 }
822 else {
823
824 fd_end_request_cur(BLK_STS_OK);
825 return;
826 }
827 }
828 else {
829
830
831 copy_buffer( ReqData, SECTOR_BUFFER(ReqSector) );
832 }
833 }
834 }
835
836 if (SelectedDrive != drive)
837 fd_select_drive( drive );
838
839 if (UD.track == -1)
840 fd_calibrate();
841 else if (UD.track != ReqTrack << UDT->stretch)
842 fd_seek();
843 else if (IsFormatting)
844 fd_writetrack();
845 else
846 fd_rwsec();
847 }
848
849
850
851
852 static void fd_calibrate( void )
853 {
854 if (SUD.track >= 0) {
855 fd_calibrate_done( 0 );
856 return;
857 }
858
859 if (ATARIHW_PRESENT(FDCSPEED))
860 dma_wd.fdc_speed = 0; ;
861 DPRINT(("fd_calibrate\n"));
862 SET_IRQ_HANDLER( fd_calibrate_done );
863
864 FDC_WRITE( FDCREG_CMD, FDCCMD_RESTORE | SUD.steprate );
865
866 NeedSeek = 1;
867 MotorOn = 1;
868 start_timeout();
869
870 }
871
872
873 static void fd_calibrate_done( int status )
874 {
875 DPRINT(("fd_calibrate_done()\n"));
876 stop_timeout();
877
878
879 if (ATARIHW_PRESENT(FDCSPEED))
880 dma_wd.fdc_speed = SUDT->fdc_speed;
881 if (status & FDCSTAT_RECNF) {
882 printk(KERN_ERR "fd%d: restore failed\n", SelectedDrive );
883 fd_error();
884 }
885 else {
886 SUD.track = 0;
887 fd_seek();
888 }
889 }
890
891
892
893
894
895
896 static void fd_seek( void )
897 {
898 if (SUD.track == ReqTrack << SUDT->stretch) {
899 fd_seek_done( 0 );
900 return;
901 }
902
903 if (ATARIHW_PRESENT(FDCSPEED)) {
904 dma_wd.fdc_speed = 0;
905 MFPDELAY();
906 }
907
908 DPRINT(("fd_seek() to track %d\n",ReqTrack));
909 FDC_WRITE( FDCREG_DATA, ReqTrack << SUDT->stretch);
910 udelay(25);
911 SET_IRQ_HANDLER( fd_seek_done );
912 FDC_WRITE( FDCREG_CMD, FDCCMD_SEEK | SUD.steprate );
913
914 MotorOn = 1;
915 set_head_settle_flag();
916 start_timeout();
917
918 }
919
920
921 static void fd_seek_done( int status )
922 {
923 DPRINT(("fd_seek_done()\n"));
924 stop_timeout();
925
926
927 if (ATARIHW_PRESENT(FDCSPEED))
928 dma_wd.fdc_speed = SUDT->fdc_speed;
929 if (status & FDCSTAT_RECNF) {
930 printk(KERN_ERR "fd%d: seek error (to track %d)\n",
931 SelectedDrive, ReqTrack );
932
933 SUD.track = -1;
934 fd_error();
935 }
936 else {
937 SUD.track = ReqTrack << SUDT->stretch;
938 NeedSeek = 0;
939 if (IsFormatting)
940 fd_writetrack();
941 else
942 fd_rwsec();
943 }
944 }
945
946
947
948
949
950
951 static int MultReadInProgress = 0;
952
953
954 static void fd_rwsec( void )
955 {
956 unsigned long paddr, flags;
957 unsigned int rwflag, old_motoron;
958 unsigned int track;
959
960 DPRINT(("fd_rwsec(), Sec=%d, Access=%c\n",ReqSector, ReqCmd == WRITE ? 'w' : 'r' ));
961 if (ReqCmd == WRITE) {
962 if (ATARIHW_PRESENT(EXTD_DMA)) {
963 paddr = virt_to_phys(ReqData);
964 }
965 else {
966 copy_buffer( ReqData, DMABuffer );
967 paddr = PhysDMABuffer;
968 }
969 dma_cache_maintenance( paddr, 512, 1 );
970 rwflag = 0x100;
971 }
972 else {
973 if (read_track)
974 paddr = PhysTrackBuffer;
975 else
976 paddr = ATARIHW_PRESENT(EXTD_DMA) ?
977 virt_to_phys(ReqData) : PhysDMABuffer;
978 rwflag = 0;
979 }
980
981 fd_select_side( ReqSide );
982
983
984 FDC_WRITE( FDCREG_SECTOR, read_track ? 1 : ReqSector );
985 MFPDELAY();
986
987 if (SUDT->stretch) {
988 track = FDC_READ( FDCREG_TRACK);
989 MFPDELAY();
990 FDC_WRITE( FDCREG_TRACK, track >> SUDT->stretch);
991 }
992 udelay(25);
993
994
995 local_irq_save(flags);
996 dma_wd.dma_lo = (unsigned char)paddr;
997 MFPDELAY();
998 paddr >>= 8;
999 dma_wd.dma_md = (unsigned char)paddr;
1000 MFPDELAY();
1001 paddr >>= 8;
1002 if (ATARIHW_PRESENT(EXTD_DMA))
1003 st_dma_ext_dmahi = (unsigned short)paddr;
1004 else
1005 dma_wd.dma_hi = (unsigned char)paddr;
1006 MFPDELAY();
1007 local_irq_restore(flags);
1008
1009
1010 dma_wd.dma_mode_status = 0x90 | rwflag;
1011 MFPDELAY();
1012 dma_wd.dma_mode_status = 0x90 | (rwflag ^ 0x100);
1013 MFPDELAY();
1014 dma_wd.dma_mode_status = 0x90 | rwflag;
1015 MFPDELAY();
1016
1017
1018 dma_wd.fdc_acces_seccount = read_track ? SUDT->spt : 1;
1019
1020 udelay(25);
1021
1022
1023 dma_wd.dma_mode_status = FDCSELREG_STP | rwflag;
1024 udelay(25);
1025 SET_IRQ_HANDLER( fd_rwsec_done );
1026 dma_wd.fdc_acces_seccount =
1027 (get_head_settle_flag() |
1028 (rwflag ? FDCCMD_WRSEC : (FDCCMD_RDSEC | (read_track ? FDCCMDADD_M : 0))));
1029
1030 old_motoron = MotorOn;
1031 MotorOn = 1;
1032 NeedSeek = 1;
1033
1034
1035 if (read_track) {
1036
1037
1038
1039
1040
1041 MultReadInProgress = 1;
1042 mod_timer(&readtrack_timer,
1043
1044 jiffies + HZ/5 + (old_motoron ? 0 : HZ));
1045 }
1046 start_timeout();
1047 }
1048
1049
1050 static void fd_readtrack_check(struct timer_list *unused)
1051 {
1052 unsigned long flags, addr, addr2;
1053
1054 local_irq_save(flags);
1055
1056 if (!MultReadInProgress) {
1057
1058
1059
1060
1061
1062
1063 local_irq_restore(flags);
1064 return;
1065 }
1066
1067
1068
1069 addr = 0;
1070 do {
1071 addr2 = addr;
1072 addr = dma_wd.dma_lo & 0xff;
1073 MFPDELAY();
1074 addr |= (dma_wd.dma_md & 0xff) << 8;
1075 MFPDELAY();
1076 if (ATARIHW_PRESENT( EXTD_DMA ))
1077 addr |= (st_dma_ext_dmahi & 0xffff) << 16;
1078 else
1079 addr |= (dma_wd.dma_hi & 0xff) << 16;
1080 MFPDELAY();
1081 } while(addr != addr2);
1082
1083 if (addr >= PhysTrackBuffer + SUDT->spt*512) {
1084
1085
1086
1087 SET_IRQ_HANDLER( NULL );
1088 MultReadInProgress = 0;
1089 local_irq_restore(flags);
1090 DPRINT(("fd_readtrack_check(): done\n"));
1091 FDC_WRITE( FDCREG_CMD, FDCCMD_FORCI );
1092 udelay(25);
1093
1094
1095
1096
1097 fd_rwsec_done1(0);
1098 }
1099 else {
1100
1101 local_irq_restore(flags);
1102 DPRINT(("fd_readtrack_check(): not yet finished\n"));
1103 mod_timer(&readtrack_timer, jiffies + HZ/5/10);
1104 }
1105 }
1106
1107
1108 static void fd_rwsec_done( int status )
1109 {
1110 DPRINT(("fd_rwsec_done()\n"));
1111
1112 if (read_track) {
1113 del_timer(&readtrack_timer);
1114 if (!MultReadInProgress)
1115 return;
1116 MultReadInProgress = 0;
1117 }
1118 fd_rwsec_done1(status);
1119 }
1120
1121 static void fd_rwsec_done1(int status)
1122 {
1123 unsigned int track;
1124
1125 stop_timeout();
1126
1127
1128 if (SUDT->stretch) {
1129 track = FDC_READ( FDCREG_TRACK);
1130 MFPDELAY();
1131 FDC_WRITE( FDCREG_TRACK, track << SUDT->stretch);
1132 }
1133
1134 if (!UseTrackbuffer) {
1135 dma_wd.dma_mode_status = 0x90;
1136 MFPDELAY();
1137 if (!(dma_wd.dma_mode_status & 0x01)) {
1138 printk(KERN_ERR "fd%d: DMA error\n", SelectedDrive );
1139 goto err_end;
1140 }
1141 }
1142 MFPDELAY();
1143
1144 if (ReqCmd == WRITE && (status & FDCSTAT_WPROT)) {
1145 printk(KERN_NOTICE "fd%d: is write protected\n", SelectedDrive );
1146 goto err_end;
1147 }
1148 if ((status & FDCSTAT_RECNF) &&
1149
1150
1151 !(read_track && FDC_READ(FDCREG_SECTOR) > SUDT->spt)) {
1152 if (Probing) {
1153 if (SUDT > atari_disk_type) {
1154 if (SUDT[-1].blocks > ReqBlock) {
1155
1156 SUDT--;
1157 set_capacity(unit[SelectedDrive].disk,
1158 SUDT->blocks);
1159 } else
1160 Probing = 0;
1161 }
1162 else {
1163 if (SUD.flags & FTD_MSG)
1164 printk(KERN_INFO "fd%d: Auto-detected floppy type %s\n",
1165 SelectedDrive, SUDT->name );
1166 Probing=0;
1167 }
1168 } else {
1169
1170 if (SUD.autoprobe) {
1171 SUDT = atari_disk_type + StartDiskType[DriveType];
1172 set_capacity(unit[SelectedDrive].disk,
1173 SUDT->blocks);
1174 Probing = 1;
1175 }
1176 }
1177 if (Probing) {
1178 if (ATARIHW_PRESENT(FDCSPEED)) {
1179 dma_wd.fdc_speed = SUDT->fdc_speed;
1180 MFPDELAY();
1181 }
1182 setup_req_params( SelectedDrive );
1183 BufferDrive = -1;
1184 do_fd_action( SelectedDrive );
1185 return;
1186 }
1187
1188 printk(KERN_ERR "fd%d: sector %d not found (side %d, track %d)\n",
1189 SelectedDrive, FDC_READ (FDCREG_SECTOR), ReqSide, ReqTrack );
1190 goto err_end;
1191 }
1192 if (status & FDCSTAT_CRC) {
1193 printk(KERN_ERR "fd%d: CRC error (side %d, track %d, sector %d)\n",
1194 SelectedDrive, ReqSide, ReqTrack, FDC_READ (FDCREG_SECTOR) );
1195 goto err_end;
1196 }
1197 if (status & FDCSTAT_LOST) {
1198 printk(KERN_ERR "fd%d: lost data (side %d, track %d, sector %d)\n",
1199 SelectedDrive, ReqSide, ReqTrack, FDC_READ (FDCREG_SECTOR) );
1200 goto err_end;
1201 }
1202
1203 Probing = 0;
1204
1205 if (ReqCmd == READ) {
1206 if (!read_track) {
1207 void *addr;
1208 addr = ATARIHW_PRESENT( EXTD_DMA ) ? ReqData : DMABuffer;
1209 dma_cache_maintenance( virt_to_phys(addr), 512, 0 );
1210 if (!ATARIHW_PRESENT( EXTD_DMA ))
1211 copy_buffer (addr, ReqData);
1212 } else {
1213 dma_cache_maintenance( PhysTrackBuffer, MaxSectors[DriveType] * 512, 0 );
1214 BufferDrive = SelectedDrive;
1215 BufferSide = ReqSide;
1216 BufferTrack = ReqTrack;
1217 copy_buffer (SECTOR_BUFFER (ReqSector), ReqData);
1218 }
1219 }
1220
1221 if (++ReqCnt < blk_rq_cur_sectors(fd_request)) {
1222
1223 setup_req_params( SelectedDrive );
1224 do_fd_action( SelectedDrive );
1225 }
1226 else {
1227
1228 fd_end_request_cur(BLK_STS_OK);
1229 }
1230 return;
1231
1232 err_end:
1233 BufferDrive = -1;
1234 fd_error();
1235 }
1236
1237
1238 static void fd_writetrack( void )
1239 {
1240 unsigned long paddr, flags;
1241 unsigned int track;
1242
1243 DPRINT(("fd_writetrack() Tr=%d Si=%d\n", ReqTrack, ReqSide ));
1244
1245 paddr = PhysTrackBuffer;
1246 dma_cache_maintenance( paddr, BUFFER_SIZE, 1 );
1247
1248 fd_select_side( ReqSide );
1249
1250
1251 if (SUDT->stretch) {
1252 track = FDC_READ( FDCREG_TRACK);
1253 MFPDELAY();
1254 FDC_WRITE(FDCREG_TRACK,track >> SUDT->stretch);
1255 }
1256 udelay(40);
1257
1258
1259 local_irq_save(flags);
1260 dma_wd.dma_lo = (unsigned char)paddr;
1261 MFPDELAY();
1262 paddr >>= 8;
1263 dma_wd.dma_md = (unsigned char)paddr;
1264 MFPDELAY();
1265 paddr >>= 8;
1266 if (ATARIHW_PRESENT( EXTD_DMA ))
1267 st_dma_ext_dmahi = (unsigned short)paddr;
1268 else
1269 dma_wd.dma_hi = (unsigned char)paddr;
1270 MFPDELAY();
1271 local_irq_restore(flags);
1272
1273
1274 dma_wd.dma_mode_status = 0x190;
1275 MFPDELAY();
1276 dma_wd.dma_mode_status = 0x90;
1277 MFPDELAY();
1278 dma_wd.dma_mode_status = 0x190;
1279 MFPDELAY();
1280
1281
1282 dma_wd.fdc_acces_seccount = BUFFER_SIZE/512;
1283 udelay(40);
1284
1285
1286 dma_wd.dma_mode_status = FDCSELREG_STP | 0x100;
1287 udelay(40);
1288 SET_IRQ_HANDLER( fd_writetrack_done );
1289 dma_wd.fdc_acces_seccount = FDCCMD_WRTRA | get_head_settle_flag();
1290
1291 MotorOn = 1;
1292 start_timeout();
1293
1294 }
1295
1296
1297 static void fd_writetrack_done( int status )
1298 {
1299 DPRINT(("fd_writetrack_done()\n"));
1300
1301 stop_timeout();
1302
1303 if (status & FDCSTAT_WPROT) {
1304 printk(KERN_NOTICE "fd%d: is write protected\n", SelectedDrive );
1305 goto err_end;
1306 }
1307 if (status & FDCSTAT_LOST) {
1308 printk(KERN_ERR "fd%d: lost data (side %d, track %d)\n",
1309 SelectedDrive, ReqSide, ReqTrack );
1310 goto err_end;
1311 }
1312
1313 complete(&format_wait);
1314 return;
1315
1316 err_end:
1317 fd_error();
1318 }
1319
1320 static void fd_times_out(struct timer_list *unused)
1321 {
1322 atari_disable_irq( IRQ_MFP_FDC );
1323 if (!FloppyIRQHandler) goto end;
1324
1325
1326 SET_IRQ_HANDLER( NULL );
1327
1328
1329 if (UseTrackbuffer)
1330 del_timer( &readtrack_timer );
1331 FDC_WRITE( FDCREG_CMD, FDCCMD_FORCI );
1332 udelay( 25 );
1333
1334 printk(KERN_ERR "floppy timeout\n" );
1335 fd_error();
1336 end:
1337 atari_enable_irq( IRQ_MFP_FDC );
1338 }
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348 static void finish_fdc( void )
1349 {
1350 if (!NeedSeek) {
1351 finish_fdc_done( 0 );
1352 }
1353 else {
1354 DPRINT(("finish_fdc: dummy seek started\n"));
1355 FDC_WRITE (FDCREG_DATA, SUD.track);
1356 SET_IRQ_HANDLER( finish_fdc_done );
1357 FDC_WRITE (FDCREG_CMD, FDCCMD_SEEK);
1358 MotorOn = 1;
1359 start_timeout();
1360
1361
1362
1363 }
1364 }
1365
1366
1367 static void finish_fdc_done( int dummy )
1368 {
1369 unsigned long flags;
1370
1371 DPRINT(("finish_fdc_done entered\n"));
1372 stop_timeout();
1373 NeedSeek = 0;
1374
1375 if (timer_pending(&fd_timer) && time_before(fd_timer.expires, jiffies + 5))
1376
1377
1378
1379 mod_timer(&fd_timer, jiffies + 5);
1380 else
1381 start_check_change_timer();
1382 start_motor_off_timer();
1383
1384 local_irq_save(flags);
1385 stdma_release();
1386 local_irq_restore(flags);
1387
1388 DPRINT(("finish_fdc() finished\n"));
1389 }
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406 static unsigned int floppy_check_events(struct gendisk *disk,
1407 unsigned int clearing)
1408 {
1409 struct atari_floppy_struct *p = disk->private_data;
1410 unsigned int drive = p - unit;
1411 if (test_bit (drive, &fake_change)) {
1412
1413 return DISK_EVENT_MEDIA_CHANGE;
1414 }
1415 if (test_bit (drive, &changed_floppies)) {
1416
1417 return DISK_EVENT_MEDIA_CHANGE;
1418 }
1419 if (UD.wpstat) {
1420
1421
1422
1423 return DISK_EVENT_MEDIA_CHANGE;
1424 }
1425
1426 return 0;
1427 }
1428
1429 static int floppy_revalidate(struct gendisk *disk)
1430 {
1431 struct atari_floppy_struct *p = disk->private_data;
1432 unsigned int drive = p - unit;
1433
1434 if (test_bit(drive, &changed_floppies) ||
1435 test_bit(drive, &fake_change) ||
1436 p->disktype == 0) {
1437 if (UD.flags & FTD_MSG)
1438 printk(KERN_ERR "floppy: clear format %p!\n", UDT);
1439 BufferDrive = -1;
1440 clear_bit(drive, &fake_change);
1441 clear_bit(drive, &changed_floppies);
1442
1443
1444
1445 if (default_params[drive].blocks == 0)
1446 UDT = NULL;
1447 else
1448 UDT = &default_params[drive];
1449 }
1450 return 0;
1451 }
1452
1453
1454
1455
1456 static void setup_req_params( int drive )
1457 {
1458 int block = ReqBlock + ReqCnt;
1459
1460 ReqTrack = block / UDT->spt;
1461 ReqSector = block - ReqTrack * UDT->spt + 1;
1462 ReqSide = ReqTrack & 1;
1463 ReqTrack >>= 1;
1464 ReqData = ReqBuffer + 512 * ReqCnt;
1465
1466 if (UseTrackbuffer)
1467 read_track = (ReqCmd == READ && fd_request->error_count == 0);
1468 else
1469 read_track = 0;
1470
1471 DPRINT(("Request params: Si=%d Tr=%d Se=%d Data=%08lx\n",ReqSide,
1472 ReqTrack, ReqSector, (unsigned long)ReqData ));
1473 }
1474
1475 static void ataflop_commit_rqs(struct blk_mq_hw_ctx *hctx)
1476 {
1477 spin_lock_irq(&ataflop_lock);
1478 atari_disable_irq(IRQ_MFP_FDC);
1479 finish_fdc();
1480 atari_enable_irq(IRQ_MFP_FDC);
1481 spin_unlock_irq(&ataflop_lock);
1482 }
1483
1484 static blk_status_t ataflop_queue_rq(struct blk_mq_hw_ctx *hctx,
1485 const struct blk_mq_queue_data *bd)
1486 {
1487 struct atari_floppy_struct *floppy = bd->rq->rq_disk->private_data;
1488 int drive = floppy - unit;
1489 int type = floppy->type;
1490
1491 spin_lock_irq(&ataflop_lock);
1492 if (fd_request) {
1493 spin_unlock_irq(&ataflop_lock);
1494 return BLK_STS_DEV_RESOURCE;
1495 }
1496 if (!stdma_try_lock(floppy_irq, NULL)) {
1497 spin_unlock_irq(&ataflop_lock);
1498 return BLK_STS_RESOURCE;
1499 }
1500 fd_request = bd->rq;
1501 blk_mq_start_request(fd_request);
1502
1503 atari_disable_irq( IRQ_MFP_FDC );
1504
1505 IsFormatting = 0;
1506
1507 if (!UD.connected) {
1508
1509 printk(KERN_ERR "Unknown Device: fd%d\n", drive );
1510 fd_end_request_cur(BLK_STS_IOERR);
1511 goto out;
1512 }
1513
1514 if (type == 0) {
1515 if (!UDT) {
1516 Probing = 1;
1517 UDT = atari_disk_type + StartDiskType[DriveType];
1518 set_capacity(floppy->disk, UDT->blocks);
1519 UD.autoprobe = 1;
1520 }
1521 }
1522 else {
1523
1524 if (--type >= NUM_DISK_MINORS) {
1525 printk(KERN_WARNING "fd%d: invalid disk format", drive );
1526 fd_end_request_cur(BLK_STS_IOERR);
1527 goto out;
1528 }
1529 if (minor2disktype[type].drive_types > DriveType) {
1530 printk(KERN_WARNING "fd%d: unsupported disk format", drive );
1531 fd_end_request_cur(BLK_STS_IOERR);
1532 goto out;
1533 }
1534 type = minor2disktype[type].index;
1535 UDT = &atari_disk_type[type];
1536 set_capacity(floppy->disk, UDT->blocks);
1537 UD.autoprobe = 0;
1538 }
1539
1540
1541 del_timer( &motor_off_timer );
1542
1543 ReqCnt = 0;
1544 ReqCmd = rq_data_dir(fd_request);
1545 ReqBlock = blk_rq_pos(fd_request);
1546 ReqBuffer = bio_data(fd_request->bio);
1547 setup_req_params( drive );
1548 do_fd_action( drive );
1549
1550 if (bd->last)
1551 finish_fdc();
1552 atari_enable_irq( IRQ_MFP_FDC );
1553
1554 out:
1555 spin_unlock_irq(&ataflop_lock);
1556 return BLK_STS_OK;
1557 }
1558
1559 static int fd_locked_ioctl(struct block_device *bdev, fmode_t mode,
1560 unsigned int cmd, unsigned long param)
1561 {
1562 struct gendisk *disk = bdev->bd_disk;
1563 struct atari_floppy_struct *floppy = disk->private_data;
1564 int drive = floppy - unit;
1565 int type = floppy->type;
1566 struct atari_format_descr fmt_desc;
1567 struct atari_disk_type *dtp;
1568 struct floppy_struct getprm;
1569 int settype;
1570 struct floppy_struct setprm;
1571 void __user *argp = (void __user *)param;
1572
1573 switch (cmd) {
1574 case FDGETPRM:
1575 if (type) {
1576 if (--type >= NUM_DISK_MINORS)
1577 return -ENODEV;
1578 if (minor2disktype[type].drive_types > DriveType)
1579 return -ENODEV;
1580 type = minor2disktype[type].index;
1581 dtp = &atari_disk_type[type];
1582 if (UD.flags & FTD_MSG)
1583 printk (KERN_ERR "floppy%d: found dtp %p name %s!\n",
1584 drive, dtp, dtp->name);
1585 }
1586 else {
1587 if (!UDT)
1588 return -ENXIO;
1589 else
1590 dtp = UDT;
1591 }
1592 memset((void *)&getprm, 0, sizeof(getprm));
1593 getprm.size = dtp->blocks;
1594 getprm.sect = dtp->spt;
1595 getprm.head = 2;
1596 getprm.track = dtp->blocks/dtp->spt/2;
1597 getprm.stretch = dtp->stretch;
1598 if (copy_to_user(argp, &getprm, sizeof(getprm)))
1599 return -EFAULT;
1600 return 0;
1601 }
1602 switch (cmd) {
1603 case FDSETPRM:
1604 case FDDEFPRM:
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615 if (floppy->ref != 1 && floppy->ref != -1)
1616 return -EBUSY;
1617 if (copy_from_user(&setprm, argp, sizeof(setprm)))
1618 return -EFAULT;
1619
1620
1621
1622
1623
1624 if (floppy_check_events(disk, 0))
1625 floppy_revalidate(disk);
1626
1627 if (UD.flags & FTD_MSG)
1628 printk (KERN_INFO "floppy%d: setting size %d spt %d str %d!\n",
1629 drive, setprm.size, setprm.sect, setprm.stretch);
1630
1631
1632 if (type) {
1633
1634 return -EINVAL;
1635 }
1636
1637
1638
1639
1640
1641
1642
1643
1644 for (settype = 0; settype < NUM_DISK_MINORS; settype++) {
1645 int setidx = 0;
1646 if (minor2disktype[settype].drive_types > DriveType) {
1647
1648 continue;
1649 }
1650 setidx = minor2disktype[settype].index;
1651 dtp = &atari_disk_type[setidx];
1652
1653
1654 if ( dtp->blocks == setprm.size
1655 && dtp->spt == setprm.sect
1656 && dtp->stretch == setprm.stretch ) {
1657 if (UD.flags & FTD_MSG)
1658 printk (KERN_INFO "floppy%d: setting %s %p!\n",
1659 drive, dtp->name, dtp);
1660 UDT = dtp;
1661 set_capacity(floppy->disk, UDT->blocks);
1662
1663 if (cmd == FDDEFPRM) {
1664
1665 default_params[drive].name = dtp->name;
1666 default_params[drive].spt = dtp->spt;
1667 default_params[drive].blocks = dtp->blocks;
1668 default_params[drive].fdc_speed = dtp->fdc_speed;
1669 default_params[drive].stretch = dtp->stretch;
1670 }
1671
1672 return 0;
1673 }
1674
1675 }
1676
1677
1678
1679 if (cmd == FDDEFPRM) {
1680
1681 dtp = &default_params[drive];
1682 } else
1683
1684 dtp = &user_params[drive];
1685
1686 dtp->name = "user format";
1687 dtp->blocks = setprm.size;
1688 dtp->spt = setprm.sect;
1689 if (setprm.sect > 14)
1690 dtp->fdc_speed = 3;
1691 else
1692 dtp->fdc_speed = 0;
1693 dtp->stretch = setprm.stretch;
1694
1695 if (UD.flags & FTD_MSG)
1696 printk (KERN_INFO "floppy%d: blk %d spt %d str %d!\n",
1697 drive, dtp->blocks, dtp->spt, dtp->stretch);
1698
1699
1700 if (setprm.track != dtp->blocks/dtp->spt/2 ||
1701 setprm.head != 2)
1702 return -EINVAL;
1703
1704 UDT = dtp;
1705 set_capacity(floppy->disk, UDT->blocks);
1706
1707 return 0;
1708 case FDMSGON:
1709 UD.flags |= FTD_MSG;
1710 return 0;
1711 case FDMSGOFF:
1712 UD.flags &= ~FTD_MSG;
1713 return 0;
1714 case FDSETEMSGTRESH:
1715 return -EINVAL;
1716 case FDFMTBEG:
1717 return 0;
1718 case FDFMTTRK:
1719 if (floppy->ref != 1 && floppy->ref != -1)
1720 return -EBUSY;
1721 if (copy_from_user(&fmt_desc, argp, sizeof(fmt_desc)))
1722 return -EFAULT;
1723 return do_format(drive, type, &fmt_desc);
1724 case FDCLRPRM:
1725 UDT = NULL;
1726
1727 default_params[drive].blocks = 0;
1728 set_capacity(floppy->disk, MAX_DISK_SIZE * 2);
1729
1730 case FDFMTEND:
1731 case FDFLUSH:
1732
1733 BufferDrive = -1;
1734 set_bit(drive, &fake_change);
1735 check_disk_change(bdev);
1736 return 0;
1737 default:
1738 return -EINVAL;
1739 }
1740 }
1741
1742 static int fd_ioctl(struct block_device *bdev, fmode_t mode,
1743 unsigned int cmd, unsigned long arg)
1744 {
1745 int ret;
1746
1747 mutex_lock(&ataflop_mutex);
1748 ret = fd_locked_ioctl(bdev, mode, cmd, arg);
1749 mutex_unlock(&ataflop_mutex);
1750
1751 return ret;
1752 }
1753
1754
1755
1756 static void __init fd_probe( int drive )
1757 {
1758 UD.connected = 0;
1759 UDT = NULL;
1760
1761 if (!fd_test_drive_present( drive ))
1762 return;
1763
1764 UD.connected = 1;
1765 UD.track = 0;
1766 switch( UserSteprate[drive] ) {
1767 case 2:
1768 UD.steprate = FDCSTEP_2;
1769 break;
1770 case 3:
1771 UD.steprate = FDCSTEP_3;
1772 break;
1773 case 6:
1774 UD.steprate = FDCSTEP_6;
1775 break;
1776 case 12:
1777 UD.steprate = FDCSTEP_12;
1778 break;
1779 default:
1780 if (ATARIHW_PRESENT( FDCSPEED ) || MACH_IS_MEDUSA)
1781 UD.steprate = FDCSTEP_3;
1782 else
1783 UD.steprate = FDCSTEP_6;
1784 break;
1785 }
1786 MotorOn = 1;
1787 }
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799 static int __init fd_test_drive_present( int drive )
1800 {
1801 unsigned long timeout;
1802 unsigned char status;
1803 int ok;
1804
1805 if (drive >= (MACH_IS_FALCON ? 1 : 2)) return( 0 );
1806 fd_select_drive( drive );
1807
1808
1809 atari_turnoff_irq( IRQ_MFP_FDC );
1810 FDC_WRITE (FDCREG_TRACK, 0xff00);
1811 FDC_WRITE( FDCREG_CMD, FDCCMD_RESTORE | FDCCMDADD_H | FDCSTEP_6 );
1812
1813 timeout = jiffies + 2*HZ+HZ/2;
1814 while (time_before(jiffies, timeout))
1815 if (!(st_mfp.par_dt_reg & 0x20))
1816 break;
1817
1818 status = FDC_READ( FDCREG_STATUS );
1819 ok = (status & FDCSTAT_TR00) != 0;
1820
1821
1822
1823 FDC_WRITE( FDCREG_CMD, FDCCMD_FORCI );
1824 udelay(500);
1825 status = FDC_READ( FDCREG_STATUS );
1826 udelay(20);
1827
1828 if (ok) {
1829
1830 FDC_WRITE( FDCREG_DATA, 0 );
1831 FDC_WRITE( FDCREG_CMD, FDCCMD_SEEK );
1832 while( st_mfp.par_dt_reg & 0x20 )
1833 ;
1834 status = FDC_READ( FDCREG_STATUS );
1835 }
1836
1837 atari_turnon_irq( IRQ_MFP_FDC );
1838 return( ok );
1839 }
1840
1841
1842
1843
1844
1845
1846 static void __init config_types( void )
1847 {
1848 int drive, cnt = 0;
1849
1850
1851 if (ATARIHW_PRESENT(FDCSPEED))
1852 dma_wd.fdc_speed = 0;
1853
1854 printk(KERN_INFO "Probing floppy drive(s):\n");
1855 for( drive = 0; drive < FD_MAX_UNITS; drive++ ) {
1856 fd_probe( drive );
1857 if (UD.connected) {
1858 printk(KERN_INFO "fd%d\n", drive);
1859 ++cnt;
1860 }
1861 }
1862
1863 if (FDC_READ( FDCREG_STATUS ) & FDCSTAT_BUSY) {
1864
1865
1866
1867
1868
1869
1870 FDC_WRITE( FDCREG_CMD, FDCCMD_FORCI );
1871 udelay(500);
1872 FDC_READ( FDCREG_STATUS );
1873 udelay(20);
1874 }
1875
1876 if (cnt > 0) {
1877 start_motor_off_timer();
1878 if (cnt == 1) fd_select_drive( 0 );
1879 start_check_change_timer();
1880 }
1881 }
1882
1883
1884
1885
1886
1887
1888
1889 static int floppy_open(struct block_device *bdev, fmode_t mode)
1890 {
1891 struct atari_floppy_struct *p = bdev->bd_disk->private_data;
1892 int type = MINOR(bdev->bd_dev) >> 2;
1893
1894 DPRINT(("fd_open: type=%d\n",type));
1895 if (p->ref && p->type != type)
1896 return -EBUSY;
1897
1898 if (p->ref == -1 || (p->ref && mode & FMODE_EXCL))
1899 return -EBUSY;
1900
1901 if (mode & FMODE_EXCL)
1902 p->ref = -1;
1903 else
1904 p->ref++;
1905
1906 p->type = type;
1907
1908 if (mode & FMODE_NDELAY)
1909 return 0;
1910
1911 if (mode & (FMODE_READ|FMODE_WRITE)) {
1912 check_disk_change(bdev);
1913 if (mode & FMODE_WRITE) {
1914 if (p->wpstat) {
1915 if (p->ref < 0)
1916 p->ref = 0;
1917 else
1918 p->ref--;
1919 return -EROFS;
1920 }
1921 }
1922 }
1923 return 0;
1924 }
1925
1926 static int floppy_unlocked_open(struct block_device *bdev, fmode_t mode)
1927 {
1928 int ret;
1929
1930 mutex_lock(&ataflop_mutex);
1931 ret = floppy_open(bdev, mode);
1932 mutex_unlock(&ataflop_mutex);
1933
1934 return ret;
1935 }
1936
1937 static void floppy_release(struct gendisk *disk, fmode_t mode)
1938 {
1939 struct atari_floppy_struct *p = disk->private_data;
1940 mutex_lock(&ataflop_mutex);
1941 if (p->ref < 0)
1942 p->ref = 0;
1943 else if (!p->ref--) {
1944 printk(KERN_ERR "floppy_release with fd_ref == 0");
1945 p->ref = 0;
1946 }
1947 mutex_unlock(&ataflop_mutex);
1948 }
1949
1950 static const struct block_device_operations floppy_fops = {
1951 .owner = THIS_MODULE,
1952 .open = floppy_unlocked_open,
1953 .release = floppy_release,
1954 .ioctl = fd_ioctl,
1955 .check_events = floppy_check_events,
1956 .revalidate_disk= floppy_revalidate,
1957 };
1958
1959 static const struct blk_mq_ops ataflop_mq_ops = {
1960 .queue_rq = ataflop_queue_rq,
1961 .commit_rqs = ataflop_commit_rqs,
1962 };
1963
1964 static struct kobject *floppy_find(dev_t dev, int *part, void *data)
1965 {
1966 int drive = *part & 3;
1967 int type = *part >> 2;
1968 if (drive >= FD_MAX_UNITS || type > NUM_DISK_MINORS)
1969 return NULL;
1970 *part = 0;
1971 return get_disk_and_module(unit[drive].disk);
1972 }
1973
1974 static int __init atari_floppy_init (void)
1975 {
1976 int i;
1977 int ret;
1978
1979 if (!MACH_IS_ATARI)
1980
1981 return -ENODEV;
1982
1983 if (register_blkdev(FLOPPY_MAJOR,"fd"))
1984 return -EBUSY;
1985
1986 for (i = 0; i < FD_MAX_UNITS; i++) {
1987 unit[i].disk = alloc_disk(1);
1988 if (!unit[i].disk) {
1989 ret = -ENOMEM;
1990 goto err;
1991 }
1992
1993 unit[i].disk->queue = blk_mq_init_sq_queue(&unit[i].tag_set,
1994 &ataflop_mq_ops, 2,
1995 BLK_MQ_F_SHOULD_MERGE);
1996 if (IS_ERR(unit[i].disk->queue)) {
1997 put_disk(unit[i].disk);
1998 ret = PTR_ERR(unit[i].disk->queue);
1999 unit[i].disk->queue = NULL;
2000 goto err;
2001 }
2002 }
2003
2004 if (UseTrackbuffer < 0)
2005
2006
2007
2008
2009 UseTrackbuffer = !MACH_IS_MEDUSA;
2010
2011
2012 SelectedDrive = -1;
2013 BufferDrive = -1;
2014
2015 DMABuffer = atari_stram_alloc(BUFFER_SIZE+512, "ataflop");
2016 if (!DMABuffer) {
2017 printk(KERN_ERR "atari_floppy_init: cannot get dma buffer\n");
2018 ret = -ENOMEM;
2019 goto err;
2020 }
2021 TrackBuffer = DMABuffer + 512;
2022 PhysDMABuffer = atari_stram_to_phys(DMABuffer);
2023 PhysTrackBuffer = virt_to_phys(TrackBuffer);
2024 BufferDrive = BufferSide = BufferTrack = -1;
2025
2026 for (i = 0; i < FD_MAX_UNITS; i++) {
2027 unit[i].track = -1;
2028 unit[i].flags = 0;
2029 unit[i].disk->major = FLOPPY_MAJOR;
2030 unit[i].disk->first_minor = i;
2031 sprintf(unit[i].disk->disk_name, "fd%d", i);
2032 unit[i].disk->fops = &floppy_fops;
2033 unit[i].disk->events = DISK_EVENT_MEDIA_CHANGE;
2034 unit[i].disk->private_data = &unit[i];
2035 set_capacity(unit[i].disk, MAX_DISK_SIZE * 2);
2036 add_disk(unit[i].disk);
2037 }
2038
2039 blk_register_region(MKDEV(FLOPPY_MAJOR, 0), 256, THIS_MODULE,
2040 floppy_find, NULL, NULL);
2041
2042 printk(KERN_INFO "Atari floppy driver: max. %cD, %strack buffering\n",
2043 DriveType == 0 ? 'D' : DriveType == 1 ? 'H' : 'E',
2044 UseTrackbuffer ? "" : "no ");
2045 config_types();
2046
2047 return 0;
2048
2049 err:
2050 while (--i >= 0) {
2051 struct gendisk *disk = unit[i].disk;
2052
2053 blk_cleanup_queue(disk->queue);
2054 blk_mq_free_tag_set(&unit[i].tag_set);
2055 put_disk(unit[i].disk);
2056 }
2057
2058 unregister_blkdev(FLOPPY_MAJOR, "fd");
2059 return ret;
2060 }
2061
2062 #ifndef MODULE
2063 static int __init atari_floppy_setup(char *str)
2064 {
2065 int ints[3 + FD_MAX_UNITS];
2066 int i;
2067
2068 if (!MACH_IS_ATARI)
2069 return 0;
2070
2071 str = get_options(str, 3 + FD_MAX_UNITS, ints);
2072
2073 if (ints[0] < 1) {
2074 printk(KERN_ERR "ataflop_setup: no arguments!\n" );
2075 return 0;
2076 }
2077 else if (ints[0] > 2+FD_MAX_UNITS) {
2078 printk(KERN_ERR "ataflop_setup: too many arguments\n" );
2079 }
2080
2081 if (ints[1] < 0 || ints[1] > 2)
2082 printk(KERN_ERR "ataflop_setup: bad drive type\n" );
2083 else
2084 DriveType = ints[1];
2085
2086 if (ints[0] >= 2)
2087 UseTrackbuffer = (ints[2] > 0);
2088
2089 for( i = 3; i <= ints[0] && i-3 < FD_MAX_UNITS; ++i ) {
2090 if (ints[i] != 2 && ints[i] != 3 && ints[i] != 6 && ints[i] != 12)
2091 printk(KERN_ERR "ataflop_setup: bad steprate\n" );
2092 else
2093 UserSteprate[i-3] = ints[i];
2094 }
2095 return 1;
2096 }
2097
2098 __setup("floppy=", atari_floppy_setup);
2099 #endif
2100
2101 static void __exit atari_floppy_exit(void)
2102 {
2103 int i;
2104 blk_unregister_region(MKDEV(FLOPPY_MAJOR, 0), 256);
2105 for (i = 0; i < FD_MAX_UNITS; i++) {
2106 del_gendisk(unit[i].disk);
2107 blk_cleanup_queue(unit[i].disk->queue);
2108 blk_mq_free_tag_set(&unit[i].tag_set);
2109 put_disk(unit[i].disk);
2110 }
2111 unregister_blkdev(FLOPPY_MAJOR, "fd");
2112
2113 del_timer_sync(&fd_timer);
2114 atari_stram_free( DMABuffer );
2115 }
2116
2117 module_init(atari_floppy_init)
2118 module_exit(atari_floppy_exit)
2119
2120 MODULE_LICENSE("GPL");