This source file includes following definitions.
- read_timer
- set_recovery_timer
- init_hwif_data
- init_ide_data
- do_vlb_sync
- ide_input_data
- ide_output_data
- ide_set_handler
- lba_capacity_is_ok
- current_capacity
- ide_geninit
- init_gendisk
- atapi_reset_pollfunc
- reset_pollfunc
- do_reset1
- ide_do_reset
- ide_end_drive_cmd
- ide_dump_status
- try_to_flush_leftover_data
- ide_error
- read_intr
- write_intr
- ide_multwrite
- multwrite_intr
- ide_cmd
- set_multmode_intr
- set_geometry_intr
- recal_intr
- drive_cmd_intr
- do_special
- ide_wait_stat
- do_rw_disk
- execute_drive_cmd
- do_request
- ide_do_request
- do_hwgroup_request
- do_ide0_request
- do_ide1_request
- do_ide2_request
- do_ide3_request
- timer_expiry
- unexpected_intr
- ide_intr
- get_info_ptr
- ide_init_drive_cmd
- ide_do_drive_cmd
- ide_open
- ide_release
- revalidate_disk
- write_fs_long
- ide_ioctl
- ide_check_media_change
- ide_fixstring
- do_identify
- delay_10ms
- try_to_identify
- do_probe
- probe_for_drive
- probe_hwif
- stridx
- match_parm
- ide_setup
- ide_xlate_1024
- probe_cmos_for_drives
- init_irq
- ide_probe_pci
- probe_for_hwifs
- hwif_init
- ide_init
- ide_register
- ide_unregister
1
2
3
4
5
6 #define _IDE_C
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235 #undef REALLY_SLOW_IO
236
237 #include <linux/config.h>
238 #include <linux/types.h>
239 #include <linux/string.h>
240 #include <linux/kernel.h>
241 #include <linux/delay.h>
242 #include <linux/timer.h>
243 #include <linux/mm.h>
244 #include <linux/ioport.h>
245 #include <linux/interrupt.h>
246 #include <linux/major.h>
247 #include <linux/blkdev.h>
248 #include <linux/errno.h>
249 #include <linux/hdreg.h>
250 #include <linux/genhd.h>
251 #include <linux/malloc.h>
252
253 #include <asm/byteorder.h>
254 #include <asm/irq.h>
255 #include <asm/segment.h>
256 #include <asm/io.h>
257
258 #ifdef CONFIG_PCI
259 #include <linux/bios32.h>
260 #include <linux/pci.h>
261 #endif
262
263 #include "ide.h"
264 #include "ide_modes.h"
265
266 #ifdef CONFIG_BLK_DEV_PROMISE
267 #include "promise.h"
268 #define IS_PROMISE_DRIVE (HWIF(drive)->chipset == ide_promise)
269 #else
270 #define IS_PROMISE_DRIVE (0)
271 #endif
272
273 static const byte ide_hwif_to_major[MAX_HWIFS] = {IDE0_MAJOR, IDE1_MAJOR, IDE2_MAJOR, IDE3_MAJOR};
274
275 static const unsigned short default_io_base[MAX_HWIFS] = {0x1f0, 0x170, 0x1e8, 0x168};
276 static const byte default_irqs[MAX_HWIFS] = {14, 15, 11, 10};
277
278 #if (DISK_RECOVERY_TIME > 0)
279
280
281
282
283 static unsigned long read_timer(void)
284 {
285 unsigned long t, flags;
286 int i;
287
288 save_flags(flags);
289 cli();
290 t = jiffies * 11932;
291 outb_p(0, 0x43);
292 i = inb_p(0x40);
293 i |= inb(0x40) << 8;
294 restore_flags(flags);
295 return (t - i);
296 }
297
298 static void set_recovery_timer (ide_hwif_t *hwif)
299 {
300 hwif->last_time = read_timer();
301 }
302 #define SET_RECOVERY_TIMER(drive) set_recovery_timer (drive)
303
304 #else
305
306 #define SET_RECOVERY_TIMER(drive)
307
308 #endif
309
310
311
312
313
314 static void init_hwif_data (unsigned int index)
315 {
316 byte *p;
317 unsigned int unit;
318 ide_hwif_t *hwif = &ide_hwifs[index];
319
320
321 p = ((byte *) hwif) + sizeof(ide_hwif_t);
322 do {
323 *--p = 0;
324 } while (p > (byte *) hwif);
325
326
327 hwif->index = index;
328 hwif->noprobe = (index > 1);
329 hwif->io_base = default_io_base[index];
330 hwif->ctl_port = hwif->io_base ? hwif->io_base+0x206 : 0x000;
331 #ifdef CONFIG_BLK_DEV_HD
332 if (hwif->io_base == HD_DATA)
333 hwif->noprobe = 1;
334 #endif
335 hwif->major = ide_hwif_to_major[index];
336 hwif->name[0] = 'i';
337 hwif->name[1] = 'd';
338 hwif->name[2] = 'e';
339 hwif->name[3] = '0' + index;
340 #ifdef CONFIG_BLK_DEV_IDETAPE
341 hwif->tape_drive = NULL;
342 #endif
343 for (unit = 0; unit < MAX_DRIVES; ++unit) {
344 ide_drive_t *drive = &hwif->drives[unit];
345
346 drive->select.all = (unit<<4)|0xa0;
347 drive->hwif = hwif;
348 drive->ctl = 0x08;
349 drive->ready_stat = READY_STAT;
350 drive->bad_wstat = BAD_W_STAT;
351 drive->special.b.recalibrate = 1;
352 drive->special.b.set_geometry = 1;
353 drive->name[0] = 'h';
354 drive->name[1] = 'd';
355 drive->name[2] = 'a' + (index * MAX_DRIVES) + unit;
356 }
357 }
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373 #define MAGIC_COOKIE 0x12345678
374 static void init_ide_data (void)
375 {
376 unsigned int index;
377 static unsigned long magic_cookie = MAGIC_COOKIE;
378
379 if (magic_cookie != MAGIC_COOKIE)
380 return;
381 magic_cookie = 0;
382
383 for (index = 0; index < MAX_HWIFS; ++index)
384 init_hwif_data(index);
385 }
386
387 #if SUPPORT_VLB_SYNC
388
389
390
391
392
393
394
395 static inline void do_vlb_sync (unsigned short port) {
396 (void) inb (port);
397 (void) inb (port);
398 (void) inb (port);
399 }
400 #endif
401
402
403
404
405 void ide_input_data (ide_drive_t *drive, void *buffer, unsigned int wcount)
406 {
407 unsigned short io_base = HWIF(drive)->io_base;
408 unsigned short data_reg = io_base+IDE_DATA_OFFSET;
409 byte io_32bit = drive->io_32bit;
410
411 if (io_32bit) {
412 #if SUPPORT_VLB_SYNC
413 if (io_32bit & 2) {
414 cli();
415 do_vlb_sync(io_base+IDE_NSECTOR_OFFSET);
416 insl(data_reg, buffer, wcount);
417 if (drive->unmask)
418 sti();
419 } else
420 #endif
421 insl(data_reg, buffer, wcount);
422 } else
423 insw(data_reg, buffer, wcount<<1);
424 }
425
426
427
428
429 void ide_output_data (ide_drive_t *drive, void *buffer, unsigned int wcount)
430 {
431 unsigned short io_base = HWIF(drive)->io_base;
432 unsigned short data_reg = io_base+IDE_DATA_OFFSET;
433 byte io_32bit = drive->io_32bit;
434
435 if (io_32bit) {
436 #if SUPPORT_VLB_SYNC
437 if (io_32bit & 2) {
438 cli();
439 do_vlb_sync(io_base+IDE_NSECTOR_OFFSET);
440 outsl(data_reg, buffer, wcount);
441 if (drive->unmask)
442 sti();
443 } else
444 #endif
445 outsl(data_reg, buffer, wcount);
446 } else
447 outsw(data_reg, buffer, wcount<<1);
448 }
449
450
451
452
453
454
455
456
457 void ide_set_handler (ide_drive_t *drive, ide_handler_t *handler, unsigned int timeout)
458 {
459 ide_hwgroup_t *hwgroup = HWGROUP(drive);
460 #ifdef DEBUG
461 if (hwgroup->handler != NULL) {
462 printk("%s: ide_set_handler: handler not null; old=%p, new=%p\n",
463 drive->name, hwgroup->handler, handler);
464 }
465 #endif
466 hwgroup->handler = handler;
467 hwgroup->timer.expires = jiffies + timeout;
468 add_timer(&(hwgroup->timer));
469 }
470
471
472
473
474
475
476
477
478 static int lba_capacity_is_ok (struct hd_driveid *id)
479 {
480 unsigned long lba_sects = id->lba_capacity;
481 unsigned long chs_sects = id->cyls * id->heads * id->sectors;
482 unsigned long _10_percent = chs_sects / 10;
483
484
485 if ((lba_sects - chs_sects) < _10_percent)
486 return 1;
487
488
489 lba_sects = (lba_sects << 16) | (lba_sects >> 16);
490 if ((lba_sects - chs_sects) < _10_percent) {
491 id->lba_capacity = lba_sects;
492 return 1;
493 }
494 return 0;
495 }
496
497
498
499
500
501 static unsigned long current_capacity (ide_drive_t *drive)
502 {
503 struct hd_driveid *id = drive->id;
504 unsigned long capacity = drive->cyl * drive->head * drive->sect;
505
506 if (!drive->present)
507 return 0;
508 if (drive->media != ide_disk)
509 return 0x7fffffff;
510 drive->select.b.lba = 0;
511
512 if (id != NULL && (id->capability & 2) && lba_capacity_is_ok(id)) {
513 if (id->lba_capacity >= capacity) {
514 capacity = id->lba_capacity;
515 drive->select.b.lba = 1;
516 }
517 }
518 return (capacity - drive->sect0);
519 }
520
521
522
523
524
525 static void ide_geninit (struct gendisk *gd)
526 {
527 unsigned int unit;
528 ide_hwif_t *hwif = gd->real_devices;
529
530 for (unit = 0; unit < gd->nr_real; ++unit) {
531 ide_drive_t *drive = &hwif->drives[unit];
532 #ifdef CONFIG_BLK_DEV_IDECD
533 if (drive->present && drive->media == ide_cdrom)
534 ide_cdrom_setup(drive);
535 #endif
536 #ifdef CONFIG_BLK_DEV_IDETAPE
537 if (drive->present && drive->media == ide_tape)
538 idetape_setup(drive);
539 #endif
540 drive->part[0].nr_sects = current_capacity(drive);
541 if (!drive->present || drive->media != ide_disk) {
542 drive->part[0].start_sect = -1;
543 }
544 }
545 }
546
547
548
549
550
551
552
553 static void init_gendisk (ide_hwif_t *hwif)
554 {
555 struct gendisk *gd, **gdp;
556 unsigned int unit, units, minors;
557 int *bs;
558
559
560 for (units = MAX_DRIVES; units > 0; --units) {
561 if (hwif->drives[units-1].present)
562 break;
563 }
564 minors = units * (1<<PARTN_BITS);
565 gd = kmalloc (sizeof(struct gendisk), GFP_KERNEL);
566 gd->sizes = kmalloc (minors * sizeof(int), GFP_KERNEL);
567 gd->part = kmalloc (minors * sizeof(struct hd_struct), GFP_KERNEL);
568 bs = kmalloc (minors*sizeof(int), GFP_KERNEL);
569
570
571 blksize_size[hwif->major] = bs;
572 for (unit = 0; unit < minors; ++unit)
573 *bs++ = BLOCK_SIZE;
574
575 for (unit = 0; unit < units; ++unit)
576 hwif->drives[unit].part = &gd->part[unit << PARTN_BITS];
577
578 gd->major = hwif->major;
579 gd->major_name = IDE_MAJOR_NAME;
580 gd->minor_shift = PARTN_BITS;
581 gd->max_p = 1<<PARTN_BITS;
582 gd->max_nr = units;
583 gd->nr_real = units;
584 gd->init = ide_geninit;
585 gd->real_devices= hwif;
586 gd->next = NULL;
587
588 for (gdp = &gendisk_head; *gdp; gdp = &((*gdp)->next)) ;
589 hwif->gd = *gdp = gd;
590 }
591
592 static void do_reset1 (ide_drive_t *, int);
593
594 #ifdef CONFIG_BLK_DEV_IDEATAPI
595
596
597
598
599
600
601 static void atapi_reset_pollfunc (ide_drive_t *drive)
602 {
603 ide_hwgroup_t *hwgroup = HWGROUP(drive);
604 byte stat;
605
606 OUT_BYTE (drive->select.all, IDE_SELECT_REG);
607 udelay (10);
608
609 if (OK_STAT(stat=GET_STAT(), 0, BUSY_STAT)) {
610 printk("%s: ATAPI reset complete\n", drive->name);
611 } else {
612 if (jiffies < hwgroup->poll_timeout) {
613 ide_set_handler (drive, &atapi_reset_pollfunc, HZ/20);
614 return;
615 }
616 hwgroup->poll_timeout = 0;
617 printk("%s: ATAPI reset timed-out, status=0x%02x\n", drive->name, stat);
618 do_reset1 (drive, 1);
619 }
620 hwgroup->poll_timeout = 0;
621 }
622 #endif
623
624
625
626
627
628
629
630 static void reset_pollfunc (ide_drive_t *drive)
631 {
632 ide_hwgroup_t *hwgroup = HWGROUP(drive);
633 ide_hwif_t *hwif = HWIF(drive);
634 byte tmp;
635
636 if (!OK_STAT(tmp=GET_STAT(), 0, BUSY_STAT)) {
637 if (jiffies < hwgroup->poll_timeout) {
638 ide_set_handler (drive, &reset_pollfunc, HZ/20);
639 return;
640 }
641 printk("%s: reset timed-out, status=0x%02x\n", hwif->name, tmp);
642 } else {
643 printk("%s: reset: ", hwif->name);
644 if ((tmp = GET_ERR()) == 1)
645 printk("success\n");
646 else {
647 #if FANCY_STATUS_DUMPS
648 printk("master: ");
649 switch (tmp & 0x7f) {
650 case 1: printk("passed");
651 break;
652 case 2: printk("formatter device error");
653 break;
654 case 3: printk("sector buffer error");
655 break;
656 case 4: printk("ECC circuitry error");
657 break;
658 case 5: printk("controlling MPU error");
659 break;
660 default:printk("error (0x%02x?)", tmp);
661 }
662 if (tmp & 0x80)
663 printk("; slave: failed");
664 printk("\n");
665 #else
666 printk("failed\n");
667 #endif
668 }
669 }
670 hwgroup->poll_timeout = 0;
671 }
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688 static void do_reset1 (ide_drive_t *drive, int do_not_try_atapi)
689 {
690 unsigned int unit;
691 unsigned long flags;
692 ide_hwif_t *hwif = HWIF(drive);
693 ide_hwgroup_t *hwgroup = HWGROUP(drive);
694
695 save_flags(flags);
696 cli();
697
698 #ifdef CONFIG_BLK_DEV_IDEATAPI
699
700 if (drive->media != ide_disk) {
701 if (!do_not_try_atapi) {
702 if (!drive->keep_settings)
703 drive->unmask = 0;
704 OUT_BYTE (drive->select.all, IDE_SELECT_REG);
705 udelay (20);
706 OUT_BYTE (WIN_SRST, IDE_COMMAND_REG);
707 hwgroup->poll_timeout = jiffies + WAIT_WORSTCASE;
708 ide_set_handler (drive, &atapi_reset_pollfunc, HZ/20);
709 restore_flags (flags);
710 return;
711 }
712 }
713 #endif
714
715
716
717
718
719 for (unit = 0; unit < MAX_DRIVES; ++unit) {
720 ide_drive_t *rdrive = &hwif->drives[unit];
721 rdrive->special.all = 0;
722 rdrive->special.b.set_geometry = 1;
723 rdrive->special.b.recalibrate = 1;
724 if (OK_TO_RESET_CONTROLLER)
725 rdrive->mult_count = 0;
726 if (!rdrive->keep_settings) {
727 rdrive->mult_req = 0;
728 rdrive->unmask = 0;
729 if (rdrive->using_dma) {
730 rdrive->using_dma = 0;
731 printk("%s: disabled DMA\n", rdrive->name);
732 }
733 }
734 if (rdrive->mult_req != rdrive->mult_count)
735 rdrive->special.b.set_multmode = 1;
736 }
737
738 #if OK_TO_RESET_CONTROLLER
739
740
741
742
743
744
745
746
747 OUT_BYTE(drive->ctl|6,IDE_CONTROL_REG);
748 udelay(5);
749 OUT_BYTE(drive->ctl|2,IDE_CONTROL_REG);
750 hwgroup->poll_timeout = jiffies + WAIT_WORSTCASE;
751 ide_set_handler (drive, &reset_pollfunc, HZ/20);
752 #endif
753
754 restore_flags (flags);
755 }
756
757
758
759
760 void ide_do_reset (ide_drive_t *drive)
761 {
762 do_reset1 (drive, 0);
763 #ifdef CONFIG_BLK_DEV_IDETAPE
764 if (drive->media == ide_tape)
765 drive->tape.reset_issued=1;
766 #endif
767 }
768
769
770
771
772 void ide_end_drive_cmd (ide_drive_t *drive, byte stat, byte err)
773 {
774 unsigned long flags;
775 struct request *rq = HWGROUP(drive)->rq;
776
777 if (rq->cmd == IDE_DRIVE_CMD) {
778 byte *args = (byte *) rq->buffer;
779 rq->errors = !OK_STAT(stat,READY_STAT,BAD_STAT);
780 if (args) {
781 args[0] = stat;
782 args[1] = err;
783 args[2] = IN_BYTE(IDE_NSECTOR_REG);
784 }
785 }
786 save_flags(flags);
787 cli();
788 blk_dev[MAJOR(rq->rq_dev)].current_request = rq->next;
789 HWGROUP(drive)->rq = NULL;
790 rq->rq_status = RQ_INACTIVE;
791 if (rq->sem != NULL)
792 up(rq->sem);
793 restore_flags(flags);
794 }
795
796
797
798
799 byte ide_dump_status (ide_drive_t *drive, const char *msg, byte stat)
800 {
801 unsigned long flags;
802 byte err = 0;
803
804 save_flags (flags);
805 sti();
806 printk("%s: %s: status=0x%02x", drive->name, msg, stat);
807 #if FANCY_STATUS_DUMPS
808 if (drive->media == ide_disk) {
809 printk(" { ");
810 if (stat & BUSY_STAT)
811 printk("Busy ");
812 else {
813 if (stat & READY_STAT) printk("DriveReady ");
814 if (stat & WRERR_STAT) printk("DeviceFault ");
815 if (stat & SEEK_STAT) printk("SeekComplete ");
816 if (stat & DRQ_STAT) printk("DataRequest ");
817 if (stat & ECC_STAT) printk("CorrectedError ");
818 if (stat & INDEX_STAT) printk("Index ");
819 if (stat & ERR_STAT) printk("Error ");
820 }
821 printk("}");
822 }
823 #endif
824 printk("\n");
825 if ((stat & (BUSY_STAT|ERR_STAT)) == ERR_STAT) {
826 err = GET_ERR();
827 printk("%s: %s: error=0x%02x", drive->name, msg, err);
828 #if FANCY_STATUS_DUMPS
829 if (drive->media == ide_disk) {
830 printk(" { ");
831 if (err & BBD_ERR) printk("BadSector ");
832 if (err & ECC_ERR) printk("UncorrectableError ");
833 if (err & ID_ERR) printk("SectorIdNotFound ");
834 if (err & ABRT_ERR) printk("DriveStatusError ");
835 if (err & TRK0_ERR) printk("TrackZeroNotFound ");
836 if (err & MARK_ERR) printk("AddrMarkNotFound ");
837 printk("}");
838 if (err & (BBD_ERR|ECC_ERR|ID_ERR|MARK_ERR)) {
839 byte cur = IN_BYTE(IDE_SELECT_REG);
840 if (cur & 0x40) {
841 printk(", LBAsect=%ld", (unsigned long)
842 ((cur&0xf)<<24)
843 |(IN_BYTE(IDE_HCYL_REG)<<16)
844 |(IN_BYTE(IDE_LCYL_REG)<<8)
845 | IN_BYTE(IDE_SECTOR_REG));
846 } else {
847 printk(", CHS=%d/%d/%d",
848 (IN_BYTE(IDE_HCYL_REG)<<8) +
849 IN_BYTE(IDE_LCYL_REG),
850 cur & 0xf,
851 IN_BYTE(IDE_SECTOR_REG));
852 }
853 if (HWGROUP(drive)->rq)
854 printk(", sector=%ld", HWGROUP(drive)->rq->sector);
855 }
856 }
857 #endif
858 printk("\n");
859 }
860 restore_flags (flags);
861 return err;
862 }
863
864
865
866
867
868
869
870
871 static void try_to_flush_leftover_data (ide_drive_t *drive)
872 {
873 int i = (drive->mult_count ? drive->mult_count : 1) * SECTOR_WORDS;
874
875 while (i > 0) {
876 unsigned long buffer[16];
877 unsigned int wcount = (i > 16) ? 16 : i;
878 i -= wcount;
879 ide_input_data (drive, buffer, wcount);
880 }
881 }
882
883
884
885
886 void ide_error (ide_drive_t *drive, const char *msg, byte stat)
887 {
888 struct request *rq;
889 byte err;
890
891 err = ide_dump_status(drive, msg, stat);
892 if ((rq = HWGROUP(drive)->rq) == NULL || drive == NULL)
893 return;
894
895 if (rq->cmd == IDE_DRIVE_CMD) {
896 rq->errors = 1;
897 ide_end_drive_cmd(drive, stat, err);
898 return;
899 }
900 if (stat & BUSY_STAT) {
901 rq->errors |= ERROR_RESET;
902 } else {
903 if (drive->media == ide_disk && (stat & ERR_STAT)) {
904
905 if (err & (BBD_ERR | ECC_ERR))
906 rq->errors = ERROR_MAX;
907 else if (err & TRK0_ERR)
908 rq->errors |= ERROR_RECAL;
909 }
910 if ((stat & DRQ_STAT) && rq->cmd != WRITE)
911 try_to_flush_leftover_data(drive);
912 }
913 if (GET_STAT() & (BUSY_STAT|DRQ_STAT))
914 rq->errors |= ERROR_RESET;
915
916 if (rq->errors >= ERROR_MAX) {
917 #ifdef CONFIG_BLK_DEV_IDETAPE
918 if (drive->media == ide_tape) {
919 rq->errors = 0;
920 idetape_end_request(0, HWGROUP(drive));
921 }
922 else
923 #endif
924 ide_end_request(0, HWGROUP(drive));
925 }
926 else {
927 if ((rq->errors & ERROR_RESET) == ERROR_RESET) {
928 ++rq->errors;
929 ide_do_reset(drive);
930 return;
931 } else if ((rq->errors & ERROR_RECAL) == ERROR_RECAL)
932 drive->special.b.recalibrate = 1;
933 ++rq->errors;
934 }
935 }
936
937
938
939
940 static void read_intr (ide_drive_t *drive)
941 {
942 byte stat;
943 int i;
944 unsigned int msect, nsect;
945 struct request *rq;
946
947 if (!OK_STAT(stat=GET_STAT(),DATA_READY,BAD_R_STAT)) {
948 ide_error(drive, "read_intr", stat);
949 return;
950 }
951 msect = drive->mult_count;
952 read_next:
953 rq = HWGROUP(drive)->rq;
954 if (msect) {
955 if ((nsect = rq->current_nr_sectors) > msect)
956 nsect = msect;
957 msect -= nsect;
958 } else
959 nsect = 1;
960 ide_input_data(drive, rq->buffer, nsect * SECTOR_WORDS);
961 #ifdef DEBUG
962 printk("%s: read: sectors(%ld-%ld), buffer=0x%08lx, remaining=%ld\n",
963 drive->name, rq->sector, rq->sector+nsect-1,
964 (unsigned long) rq->buffer+(nsect<<9), rq->nr_sectors-nsect);
965 #endif
966 rq->sector += nsect;
967 rq->buffer += nsect<<9;
968 rq->errors = 0;
969 i = (rq->nr_sectors -= nsect);
970 if ((rq->current_nr_sectors -= nsect) <= 0)
971 ide_end_request(1, HWGROUP(drive));
972 if (i > 0) {
973 if (msect)
974 goto read_next;
975 ide_set_handler (drive, &read_intr, WAIT_CMD);
976 }
977 }
978
979
980
981
982 static void write_intr (ide_drive_t *drive)
983 {
984 byte stat;
985 int i;
986 ide_hwgroup_t *hwgroup = HWGROUP(drive);
987 struct request *rq = hwgroup->rq;
988
989 if (OK_STAT(stat=GET_STAT(),DRIVE_READY,drive->bad_wstat)) {
990 #ifdef DEBUG
991 printk("%s: write: sector %ld, buffer=0x%08lx, remaining=%ld\n",
992 drive->name, rq->sector, (unsigned long) rq->buffer,
993 rq->nr_sectors-1);
994 #endif
995 if ((rq->nr_sectors == 1) ^ ((stat & DRQ_STAT) != 0)) {
996 rq->sector++;
997 rq->buffer += 512;
998 rq->errors = 0;
999 i = --rq->nr_sectors;
1000 --rq->current_nr_sectors;
1001 if (rq->current_nr_sectors <= 0)
1002 ide_end_request(1, hwgroup);
1003 if (i > 0) {
1004 ide_output_data (drive, rq->buffer, SECTOR_WORDS);
1005 ide_set_handler (drive, &write_intr, WAIT_CMD);
1006 }
1007 return;
1008 }
1009 }
1010 ide_error(drive, "write_intr", stat);
1011 }
1012
1013
1014
1015
1016
1017 void ide_multwrite (ide_drive_t *drive, unsigned int mcount)
1018 {
1019 struct request *rq = &HWGROUP(drive)->wrq;
1020
1021 do {
1022 unsigned int nsect = rq->current_nr_sectors;
1023 if (nsect > mcount)
1024 nsect = mcount;
1025 mcount -= nsect;
1026
1027 ide_output_data(drive, rq->buffer, nsect<<7);
1028 #ifdef DEBUG
1029 printk("%s: multwrite: sector %ld, buffer=0x%08lx, count=%d, remaining=%ld\n",
1030 drive->name, rq->sector, (unsigned long) rq->buffer,
1031 nsect, rq->nr_sectors - nsect);
1032 #endif
1033 if ((rq->nr_sectors -= nsect) <= 0)
1034 break;
1035 if ((rq->current_nr_sectors -= nsect) == 0) {
1036 if ((rq->bh = rq->bh->b_reqnext) != NULL) {
1037 rq->current_nr_sectors = rq->bh->b_size>>9;
1038 rq->buffer = rq->bh->b_data;
1039 } else {
1040 panic("%s: buffer list corrupted\n", drive->name);
1041 break;
1042 }
1043 } else {
1044 rq->buffer += nsect << 9;
1045 }
1046 } while (mcount);
1047 }
1048
1049
1050
1051
1052 static void multwrite_intr (ide_drive_t *drive)
1053 {
1054 byte stat;
1055 int i;
1056 ide_hwgroup_t *hwgroup = HWGROUP(drive);
1057 struct request *rq = &hwgroup->wrq;
1058
1059 if (OK_STAT(stat=GET_STAT(),DRIVE_READY,drive->bad_wstat)) {
1060 if (stat & DRQ_STAT) {
1061 if (rq->nr_sectors) {
1062 ide_multwrite(drive, drive->mult_count);
1063 ide_set_handler (drive, &multwrite_intr, WAIT_CMD);
1064 return;
1065 }
1066 } else {
1067 if (!rq->nr_sectors) {
1068 rq = hwgroup->rq;
1069 for (i = rq->nr_sectors; i > 0;){
1070 i -= rq->current_nr_sectors;
1071 ide_end_request(1, hwgroup);
1072 }
1073 return;
1074 }
1075 }
1076 }
1077 ide_error(drive, "multwrite_intr", stat);
1078 }
1079
1080
1081
1082
1083
1084 static void ide_cmd(ide_drive_t *drive, byte cmd, byte nsect, ide_handler_t *handler)
1085 {
1086 ide_set_handler (drive, handler, WAIT_CMD);
1087 OUT_BYTE(drive->ctl,IDE_CONTROL_REG);
1088 OUT_BYTE(nsect,IDE_NSECTOR_REG);
1089 OUT_BYTE(cmd,IDE_COMMAND_REG);
1090 }
1091
1092
1093
1094
1095 static void set_multmode_intr (ide_drive_t *drive)
1096 {
1097 byte stat = GET_STAT();
1098
1099 sti();
1100 if (OK_STAT(stat,READY_STAT,BAD_STAT)) {
1101 drive->mult_count = drive->mult_req;
1102 } else {
1103 drive->mult_req = drive->mult_count = 0;
1104 drive->special.b.recalibrate = 1;
1105 (void) ide_dump_status(drive, "set_multmode", stat);
1106 }
1107 }
1108
1109
1110
1111
1112 static void set_geometry_intr (ide_drive_t *drive)
1113 {
1114 byte stat = GET_STAT();
1115
1116 sti();
1117 if (!OK_STAT(stat,READY_STAT,BAD_STAT))
1118 ide_error(drive, "set_geometry_intr", stat);
1119 }
1120
1121
1122
1123
1124 static void recal_intr (ide_drive_t *drive)
1125 {
1126 byte stat = GET_STAT();
1127
1128 sti();
1129 if (!OK_STAT(stat,READY_STAT,BAD_STAT))
1130 ide_error(drive, "recal_intr", stat);
1131 }
1132
1133
1134
1135
1136 static void drive_cmd_intr (ide_drive_t *drive)
1137 {
1138 struct request *rq = HWGROUP(drive)->rq;
1139 byte *args = (byte *) rq->buffer;
1140 byte stat = GET_STAT();
1141
1142 sti();
1143 if ((stat & DRQ_STAT) && args && args[3]) {
1144 ide_input_data(drive, &args[4], args[3] * SECTOR_WORDS);
1145 stat = GET_STAT();
1146 }
1147 if (OK_STAT(stat,READY_STAT,BAD_STAT))
1148 ide_end_drive_cmd (drive, stat, GET_ERR());
1149 else
1150 ide_error(drive, "drive_cmd", stat);
1151 }
1152
1153
1154
1155
1156
1157 static inline void do_special (ide_drive_t *drive)
1158 {
1159 special_t *s = &drive->special;
1160 next:
1161 #ifdef DEBUG
1162 printk("%s: do_special: 0x%02x\n", drive->name, s->all);
1163 #endif
1164 if (s->b.set_geometry) {
1165 s->b.set_geometry = 0;
1166 if (drive->media == ide_disk) {
1167 OUT_BYTE(drive->sect,IDE_SECTOR_REG);
1168 OUT_BYTE(drive->cyl,IDE_LCYL_REG);
1169 OUT_BYTE(drive->cyl>>8,IDE_HCYL_REG);
1170 OUT_BYTE(((drive->head-1)|drive->select.all)&0xBF,IDE_SELECT_REG);
1171 if (!IS_PROMISE_DRIVE)
1172 ide_cmd(drive, WIN_SPECIFY, drive->sect, &set_geometry_intr);
1173 }
1174 } else if (s->b.recalibrate) {
1175 s->b.recalibrate = 0;
1176 if (drive->media == ide_disk && !IS_PROMISE_DRIVE)
1177 ide_cmd(drive, WIN_RESTORE, drive->sect, &recal_intr);
1178 } else if (s->b.set_pio) {
1179 ide_tuneproc_t *tuneproc = HWIF(drive)->tuneproc;
1180 s->b.set_pio = 0;
1181 if (tuneproc != NULL)
1182 tuneproc(drive, drive->pio_req);
1183 goto next;
1184 } else if (s->b.set_multmode) {
1185 s->b.set_multmode = 0;
1186 if (drive->media == ide_disk) {
1187 if (drive->id && drive->mult_req > drive->id->max_multsect)
1188 drive->mult_req = drive->id->max_multsect;
1189 if (!IS_PROMISE_DRIVE)
1190 ide_cmd(drive, WIN_SETMULT, drive->mult_req, &set_multmode_intr);
1191 } else
1192 drive->mult_req = 0;
1193 } else if (s->all) {
1194 int special = s->all;
1195 s->all = 0;
1196 printk("%s: bad special flag: 0x%02x\n", drive->name, special);
1197 }
1198 }
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211 int ide_wait_stat (ide_drive_t *drive, byte good, byte bad, unsigned long timeout)
1212 {
1213 byte stat;
1214 unsigned long flags;
1215
1216 test:
1217 udelay(1);
1218 if (OK_STAT((stat = GET_STAT()), good, bad))
1219 return 0;
1220 if (!(stat & BUSY_STAT)) {
1221 ide_error(drive, "status error", stat);
1222 return 1;
1223 }
1224
1225 save_flags(flags);
1226 sti();
1227 timeout += jiffies;
1228 do {
1229 if (!((stat = GET_STAT()) & BUSY_STAT)) {
1230 restore_flags(flags);
1231 goto test;
1232 }
1233 } while (jiffies <= timeout);
1234
1235 restore_flags(flags);
1236 ide_error(drive, "status timeout", GET_STAT());
1237 return 1;
1238 }
1239
1240
1241
1242
1243
1244
1245 static inline void do_rw_disk (ide_drive_t *drive, struct request *rq, unsigned long block)
1246 {
1247 ide_hwif_t *hwif = HWIF(drive);
1248 unsigned short io_base = hwif->io_base;
1249 #ifdef CONFIG_BLK_DEV_PROMISE
1250 int use_promise_io = 0;
1251 #endif
1252
1253 OUT_BYTE(drive->ctl,IDE_CONTROL_REG);
1254 OUT_BYTE(rq->nr_sectors,io_base+IDE_NSECTOR_OFFSET);
1255 #ifdef CONFIG_BLK_DEV_PROMISE
1256 if (IS_PROMISE_DRIVE) {
1257 if (hwif->is_promise2 || rq->cmd == READ) {
1258 use_promise_io = 1;
1259 }
1260 }
1261 if (drive->select.b.lba || use_promise_io) {
1262 #else
1263 if (drive->select.b.lba) {
1264 #endif
1265 #ifdef DEBUG
1266 printk("%s: %sing: LBAsect=%ld, sectors=%ld, buffer=0x%08lx\n",
1267 drive->name, (rq->cmd==READ)?"read":"writ",
1268 block, rq->nr_sectors, (unsigned long) rq->buffer);
1269 #endif
1270 OUT_BYTE(block,io_base+IDE_SECTOR_OFFSET);
1271 OUT_BYTE(block>>=8,io_base+IDE_LCYL_OFFSET);
1272 OUT_BYTE(block>>=8,io_base+IDE_HCYL_OFFSET);
1273 OUT_BYTE(((block>>8)&0x0f)|drive->select.all,io_base+IDE_SELECT_OFFSET);
1274 } else {
1275 unsigned int sect,head,cyl,track;
1276 track = block / drive->sect;
1277 sect = block % drive->sect + 1;
1278 OUT_BYTE(sect,io_base+IDE_SECTOR_OFFSET);
1279 head = track % drive->head;
1280 cyl = track / drive->head;
1281 OUT_BYTE(cyl,io_base+IDE_LCYL_OFFSET);
1282 OUT_BYTE(cyl>>8,io_base+IDE_HCYL_OFFSET);
1283 OUT_BYTE(head|drive->select.all,io_base+IDE_SELECT_OFFSET);
1284 #ifdef DEBUG
1285 printk("%s: %sing: CHS=%d/%d/%d, sectors=%ld, buffer=0x%08lx\n",
1286 drive->name, (rq->cmd==READ)?"read":"writ", cyl,
1287 head, sect, rq->nr_sectors, (unsigned long) rq->buffer);
1288 #endif
1289 }
1290 #ifdef CONFIG_BLK_DEV_PROMISE
1291 if (use_promise_io) {
1292 do_promise_io (drive, rq);
1293 return;
1294 }
1295 #endif
1296 if (rq->cmd == READ) {
1297 #ifdef CONFIG_BLK_DEV_TRITON
1298 if (drive->using_dma && !(HWIF(drive)->dmaproc(ide_dma_read, drive)))
1299 return;
1300 #endif
1301 ide_set_handler(drive, &read_intr, WAIT_CMD);
1302 OUT_BYTE(drive->mult_count ? WIN_MULTREAD : WIN_READ, io_base+IDE_COMMAND_OFFSET);
1303 return;
1304 }
1305 if (rq->cmd == WRITE) {
1306 #ifdef CONFIG_BLK_DEV_TRITON
1307 if (drive->using_dma && !(HWIF(drive)->dmaproc(ide_dma_write, drive)))
1308 return;
1309 #endif
1310 OUT_BYTE(drive->mult_count ? WIN_MULTWRITE : WIN_WRITE, io_base+IDE_COMMAND_OFFSET);
1311 if (ide_wait_stat(drive, DATA_READY, drive->bad_wstat, WAIT_DRQ)) {
1312 printk("%s: no DRQ after issuing %s\n", drive->name,
1313 drive->mult_count ? "MULTWRITE" : "WRITE");
1314 return;
1315 }
1316 if (!drive->unmask)
1317 cli();
1318 if (drive->mult_count) {
1319 HWGROUP(drive)->wrq = *rq;
1320 ide_set_handler (drive, &multwrite_intr, WAIT_CMD);
1321 ide_multwrite(drive, drive->mult_count);
1322 } else {
1323 ide_set_handler (drive, &write_intr, WAIT_CMD);
1324 ide_output_data(drive, rq->buffer, SECTOR_WORDS);
1325 }
1326 return;
1327 }
1328 printk("%s: bad command: %d\n", drive->name, rq->cmd);
1329 ide_end_request(0, HWGROUP(drive));
1330 }
1331
1332
1333
1334
1335
1336 static void execute_drive_cmd (ide_drive_t *drive, struct request *rq)
1337 {
1338 byte *args = rq->buffer;
1339 if (args) {
1340 #ifdef DEBUG
1341 printk("%s: DRIVE_CMD cmd=0x%02x sc=0x%02x fr=0x%02x xx=0x%02x\n",
1342 drive->name, args[0], args[1], args[2], args[3]);
1343 #endif
1344 OUT_BYTE(args[2],IDE_FEATURE_REG);
1345 ide_cmd(drive, args[0], args[1], &drive_cmd_intr);
1346 return;
1347 } else {
1348
1349
1350
1351
1352 #ifdef DEBUG
1353 printk("%s: DRIVE_CMD (null)\n", drive->name);
1354 #endif
1355 ide_end_drive_cmd(drive, GET_STAT(), GET_ERR());
1356 return;
1357 }
1358 }
1359
1360
1361
1362
1363 static inline void do_request (ide_hwif_t *hwif, struct request *rq)
1364 {
1365 unsigned int minor, unit;
1366 unsigned long block, blockend;
1367 ide_drive_t *drive;
1368
1369 sti();
1370 #ifdef DEBUG
1371 printk("%s: do_request: current=0x%08lx\n", hwif->name, (unsigned long) rq);
1372 #endif
1373 minor = MINOR(rq->rq_dev);
1374 unit = minor >> PARTN_BITS;
1375 if (MAJOR(rq->rq_dev) != hwif->major || unit >= MAX_DRIVES) {
1376 printk("%s: bad device number: %s\n",
1377 hwif->name, kdevname(rq->rq_dev));
1378 goto kill_rq;
1379 }
1380 drive = &hwif->drives[unit];
1381 #ifdef DEBUG
1382 if (rq->bh && !buffer_locked(rq->bh)) {
1383 printk("%s: block not locked\n", drive->name);
1384 goto kill_rq;
1385 }
1386 #endif
1387 block = rq->sector;
1388 blockend = block + rq->nr_sectors;
1389 if ((blockend < block) || (blockend > drive->part[minor&PARTN_MASK].nr_sects)) {
1390 printk("%s%c: bad access: block=%ld, count=%ld\n", drive->name,
1391 (minor&PARTN_MASK)?'0'+(minor&PARTN_MASK):' ', block, rq->nr_sectors);
1392 goto kill_rq;
1393 }
1394 block += drive->part[minor&PARTN_MASK].start_sect + drive->sect0;
1395 #if FAKE_FDISK_FOR_EZDRIVE
1396 if (block == 0 && drive->remap_0_to_1)
1397 block = 1;
1398 #endif
1399 ((ide_hwgroup_t *)hwif->hwgroup)->drive = drive;
1400 #if (DISK_RECOVERY_TIME > 0)
1401 while ((read_timer() - hwif->last_time) < DISK_RECOVERY_TIME);
1402 #endif
1403
1404 #ifdef CONFIG_BLK_DEV_IDETAPE
1405 POLL_HWIF_TAPE_DRIVE;
1406 #endif
1407
1408 SELECT_DRIVE(hwif,drive);
1409 if (ide_wait_stat(drive, drive->ready_stat, BUSY_STAT|DRQ_STAT, WAIT_READY)) {
1410 printk("%s: drive not ready for command\n", drive->name);
1411 return;
1412 }
1413
1414 if (!drive->special.all) {
1415 if (rq->cmd == IDE_DRIVE_CMD) {
1416 execute_drive_cmd(drive, rq);
1417 return;
1418 }
1419 #ifdef CONFIG_BLK_DEV_IDEATAPI
1420 switch (drive->media) {
1421 case ide_disk:
1422 do_rw_disk (drive, rq, block);
1423 return;
1424 #ifdef CONFIG_BLK_DEV_IDECD
1425 case ide_cdrom:
1426 ide_do_rw_cdrom (drive, block);
1427 return;
1428 #endif
1429 #ifdef CONFIG_BLK_DEV_IDETAPE
1430 case ide_tape:
1431 idetape_do_request (drive, rq, block);
1432 return;
1433 #endif
1434
1435 default:
1436 printk("%s: media type %d not supported\n",
1437 drive->name, drive->media);
1438 goto kill_rq;
1439 }
1440 #else
1441 do_rw_disk (drive, rq, block);
1442 return;
1443 #endif ;
1444 }
1445 do_special(drive);
1446 return;
1447 kill_rq:
1448 ide_end_request(0, hwif->hwgroup);
1449 }
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466 void ide_do_request (ide_hwgroup_t *hwgroup)
1467 {
1468 cli();
1469 if (hwgroup->handler != NULL) {
1470 printk("%s: EEeekk!! handler not NULL in ide_do_request()\n", hwgroup->hwif->name);
1471 return;
1472 }
1473 do {
1474 ide_hwif_t *hwif = hwgroup->hwif;
1475 struct request *rq;
1476 if ((rq = hwgroup->rq) == NULL) {
1477
1478
1479
1480
1481
1482 hwif = hwgroup->next_hwif;
1483 do {
1484 rq = blk_dev[hwif->major].current_request;
1485 if (rq != NULL && rq->rq_status != RQ_INACTIVE)
1486 goto got_rq;
1487 } while ((hwif = hwif->next) != hwgroup->next_hwif);
1488 return;
1489 }
1490 got_rq:
1491 do_request(hwgroup->hwif = hwgroup->next_hwif = hwif, hwgroup->rq = rq);
1492 cli();
1493 } while (hwgroup->handler == NULL);
1494 }
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507 static void do_hwgroup_request (ide_hwgroup_t *hwgroup)
1508 {
1509 if (hwgroup->handler == NULL) {
1510 ide_hwif_t *hgif = hwgroup->hwif;
1511 ide_hwif_t *hwif = hgif;
1512 do {
1513 disable_irq(hwif->irq);
1514 } while ((hwif = hwif->next) != hgif);
1515 ide_do_request (hwgroup);
1516 do {
1517 enable_irq(hwif->irq);
1518 } while ((hwif = hwif->next) != hgif);
1519 }
1520 }
1521
1522 static void do_ide0_request (void)
1523 {
1524 do_hwgroup_request (ide_hwifs[0].hwgroup);
1525 }
1526
1527 #if MAX_HWIFS > 1
1528 static void do_ide1_request (void)
1529 {
1530 do_hwgroup_request (ide_hwifs[1].hwgroup);
1531 }
1532 #endif
1533
1534 #if MAX_HWIFS > 2
1535 static void do_ide2_request (void)
1536 {
1537 do_hwgroup_request (ide_hwifs[2].hwgroup);
1538 }
1539 #endif
1540
1541 #if MAX_HWIFS > 3
1542 static void do_ide3_request (void)
1543 {
1544 do_hwgroup_request (ide_hwifs[3].hwgroup);
1545 }
1546 #endif
1547
1548 static void timer_expiry (unsigned long data)
1549 {
1550 ide_hwgroup_t *hwgroup = (ide_hwgroup_t *) data;
1551 ide_drive_t *drive = hwgroup->drive;
1552 unsigned long flags;
1553
1554 save_flags(flags);
1555 cli();
1556
1557 if (hwgroup->poll_timeout != 0) {
1558 ide_handler_t *handler = hwgroup->handler;
1559 hwgroup->handler = NULL;
1560 handler(drive);
1561 } else if (hwgroup->handler == NULL) {
1562 sti();
1563 printk("%s: marginal timeout\n", drive->name);
1564 } else {
1565 hwgroup->handler = NULL;
1566 if (hwgroup->hwif->dmaproc)
1567 (void) hwgroup->hwif->dmaproc (ide_dma_abort, drive);
1568 ide_error(drive, "irq timeout", GET_STAT());
1569 }
1570 if (hwgroup->handler == NULL)
1571 do_hwgroup_request (hwgroup);
1572 restore_flags(flags);
1573 }
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598 static void unexpected_intr (int irq, ide_hwgroup_t *hwgroup)
1599 {
1600 byte stat;
1601 unsigned int unit;
1602 ide_hwif_t *hwif = hwgroup->hwif;
1603
1604
1605
1606
1607 do {
1608 if (hwif->irq == irq) {
1609 for (unit = 0; unit < MAX_DRIVES; ++unit) {
1610 ide_drive_t *drive = &hwif->drives[unit];
1611 if (!drive->present)
1612 continue;
1613 SELECT_DRIVE(hwif,drive);
1614 if (!OK_STAT(stat=GET_STAT(), drive->ready_stat, BAD_STAT))
1615 (void) ide_dump_status(drive, "unexpected_intr", stat);
1616 if ((stat & DRQ_STAT))
1617 try_to_flush_leftover_data(drive);
1618 }
1619 }
1620 } while ((hwif = hwif->next) != hwgroup->hwif);
1621 SELECT_DRIVE(hwif,hwgroup->drive);
1622 }
1623
1624
1625
1626
1627 void ide_intr (int irq, void *dev_id, struct pt_regs *regs)
1628 {
1629 ide_hwgroup_t *hwgroup = dev_id;
1630 ide_handler_t *handler;
1631
1632 if (irq == hwgroup->hwif->irq && (handler = hwgroup->handler) != NULL) {
1633 ide_drive_t *drive = hwgroup->drive;
1634 hwgroup->handler = NULL;
1635 del_timer(&(hwgroup->timer));
1636 if (drive->unmask)
1637 sti();
1638 handler(drive);
1639 cli();
1640 if (hwgroup->handler == NULL) {
1641 SET_RECOVERY_TIMER(HWIF(drive));
1642 ide_do_request(hwgroup);
1643 }
1644 } else {
1645 unexpected_intr(irq, hwgroup);
1646 }
1647 cli();
1648 }
1649
1650
1651
1652
1653
1654 static ide_drive_t *get_info_ptr (kdev_t i_rdev)
1655 {
1656 int major = MAJOR(i_rdev);
1657 unsigned int h;
1658
1659 for (h = 0; h < MAX_HWIFS; ++h) {
1660 ide_hwif_t *hwif = &ide_hwifs[h];
1661 if (hwif->present && major == hwif->major) {
1662 unsigned unit = DEVICE_NR(i_rdev);
1663 if (unit < MAX_DRIVES) {
1664 ide_drive_t *drive = &hwif->drives[unit];
1665 if (drive->present)
1666 return drive;
1667 } else if (major == IDE0_MAJOR && unit < 4) {
1668 printk("ide: probable bad entry for /dev/hd%c\n", 'a'+unit);
1669 printk("ide: to fix it, run: /usr/src/linux/drivers/block/MAKEDEV.ide\n");
1670 }
1671 break;
1672 }
1673 }
1674 return NULL;
1675 }
1676
1677
1678
1679
1680 void ide_init_drive_cmd (struct request *rq)
1681 {
1682 rq->buffer = NULL;
1683 rq->cmd = IDE_DRIVE_CMD;
1684 rq->sector = 0;
1685 rq->nr_sectors = 0;
1686 rq->current_nr_sectors = 0;
1687 rq->sem = NULL;
1688 rq->bh = NULL;
1689 rq->bhtail = NULL;
1690 rq->next = NULL;
1691
1692 #if 0
1693 rq->errors = 0;
1694 rq->rq_status = RQ_ACTIVE;
1695 rq->rq_dev = ????;
1696 #endif
1697 }
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725 int ide_do_drive_cmd (ide_drive_t *drive, struct request *rq, ide_action_t action)
1726 {
1727 unsigned long flags;
1728 unsigned int major = HWIF(drive)->major;
1729 struct request *cur_rq;
1730 struct blk_dev_struct *bdev = &blk_dev[major];
1731 struct semaphore sem = MUTEX_LOCKED;
1732
1733 if (IS_PROMISE_DRIVE && rq->buffer != NULL)
1734 return -ENOSYS;
1735 rq->errors = 0;
1736 rq->rq_status = RQ_ACTIVE;
1737 rq->rq_dev = MKDEV(major,(drive->select.b.unit)<<PARTN_BITS);
1738 if (action == ide_wait)
1739 rq->sem = &sem;
1740
1741 save_flags(flags);
1742 cli();
1743 if (action == ide_next)
1744 HWGROUP(drive)->next_hwif = HWIF(drive);
1745 cur_rq = bdev->current_request;
1746
1747 if (cur_rq == NULL || action == ide_preempt) {
1748 rq->next = cur_rq;
1749 bdev->current_request = rq;
1750 if (action == ide_preempt) {
1751 HWGROUP(drive)->rq = NULL;
1752 } else
1753 if (HWGROUP(drive)->rq == NULL) {
1754 bdev->request_fn();
1755 cli();
1756 }
1757 } else {
1758 if (action == ide_wait || action == ide_end) {
1759 while (cur_rq->next != NULL)
1760 cur_rq = cur_rq->next;
1761 }
1762 rq->next = cur_rq->next;
1763 cur_rq->next = rq;
1764 }
1765 if (action == ide_wait && rq->rq_status != RQ_INACTIVE) {
1766 run_task_queue(&tq_disk);
1767 down(&sem);
1768 }
1769 restore_flags(flags);
1770 return rq->errors ? -EIO : 0;
1771 }
1772
1773 static int ide_open(struct inode * inode, struct file * filp)
1774 {
1775 ide_drive_t *drive;
1776 unsigned long flags;
1777
1778 if ((drive = get_info_ptr(inode->i_rdev)) == NULL)
1779 return -ENODEV;
1780 save_flags(flags);
1781 cli();
1782 while (drive->busy)
1783 sleep_on(&drive->wqueue);
1784 drive->usage++;
1785 restore_flags(flags);
1786 #ifdef CONFIG_BLK_DEV_IDECD
1787 if (drive->media == ide_cdrom)
1788 return ide_cdrom_open (inode, filp, drive);
1789 #endif
1790 #ifdef CONFIG_BLK_DEV_IDETAPE
1791 if (drive->media == ide_tape)
1792 return idetape_blkdev_open (inode, filp, drive);
1793 #endif
1794 if (drive->removable) {
1795 byte door_lock[] = {WIN_DOORLOCK,0,0,0};
1796 struct request rq;
1797 check_disk_change(inode->i_rdev);
1798 ide_init_drive_cmd (&rq);
1799 rq.buffer = door_lock;
1800
1801
1802
1803
1804
1805 (void) ide_do_drive_cmd(drive, &rq, ide_wait);
1806 }
1807 return 0;
1808 }
1809
1810
1811
1812
1813
1814 static void ide_release(struct inode * inode, struct file * file)
1815 {
1816 ide_drive_t *drive;
1817
1818 if ((drive = get_info_ptr(inode->i_rdev)) != NULL) {
1819 fsync_dev(inode->i_rdev);
1820 drive->usage--;
1821 #ifdef CONFIG_BLK_DEV_IDECD
1822 if (drive->media == ide_cdrom) {
1823 ide_cdrom_release (inode, file, drive);
1824 return;
1825 }
1826 #endif
1827 #ifdef CONFIG_BLK_DEV_IDETAPE
1828 if (drive->media == ide_tape) {
1829 idetape_blkdev_release (inode, file, drive);
1830 return;
1831 }
1832 #endif
1833 if (drive->removable && !drive->usage) {
1834 byte door_unlock[] = {WIN_DOORUNLOCK,0,0,0};
1835 struct request rq;
1836 invalidate_buffers(inode->i_rdev);
1837 ide_init_drive_cmd (&rq);
1838 rq.buffer = door_unlock;
1839 (void) ide_do_drive_cmd(drive, &rq, ide_wait);
1840 }
1841 }
1842 }
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852 static int revalidate_disk(kdev_t i_rdev)
1853 {
1854 ide_drive_t *drive;
1855 unsigned int p, major, minor;
1856 long flags;
1857
1858 if ((drive = get_info_ptr(i_rdev)) == NULL)
1859 return -ENODEV;
1860
1861 major = MAJOR(i_rdev);
1862 minor = drive->select.b.unit << PARTN_BITS;
1863 save_flags(flags);
1864 cli();
1865 if (drive->busy || (drive->usage > 1)) {
1866 restore_flags(flags);
1867 return -EBUSY;
1868 };
1869 drive->busy = 1;
1870 restore_flags(flags);
1871
1872 for (p = 0; p < (1<<PARTN_BITS); ++p) {
1873 if (drive->part[p].nr_sects > 0) {
1874 kdev_t devp = MKDEV(major, minor+p);
1875 sync_dev (devp);
1876 invalidate_inodes (devp);
1877 invalidate_buffers (devp);
1878 }
1879 drive->part[p].start_sect = 0;
1880 drive->part[p].nr_sects = 0;
1881 };
1882
1883 drive->part[0].nr_sects = current_capacity(drive);
1884 if (drive->media == ide_disk)
1885 resetup_one_dev(HWIF(drive)->gd, drive->select.b.unit);
1886
1887 drive->busy = 0;
1888 wake_up(&drive->wqueue);
1889 return 0;
1890 }
1891
1892 static int write_fs_long (unsigned long useraddr, long value)
1893 {
1894 int err;
1895
1896 if (NULL == (long *)useraddr)
1897 return -EINVAL;
1898 if ((err = verify_area(VERIFY_WRITE, (long *)useraddr, sizeof(long))))
1899 return err;
1900 put_user((unsigned)value, (long *) useraddr);
1901 return 0;
1902 }
1903
1904 static int ide_ioctl (struct inode *inode, struct file *file,
1905 unsigned int cmd, unsigned long arg)
1906 {
1907 int err;
1908 ide_drive_t *drive;
1909 unsigned long flags;
1910 struct request rq;
1911
1912 if (!inode || !(inode->i_rdev))
1913 return -EINVAL;
1914 if ((drive = get_info_ptr(inode->i_rdev)) == NULL)
1915 return -ENODEV;
1916 ide_init_drive_cmd (&rq);
1917 switch (cmd) {
1918 case HDIO_GETGEO:
1919 {
1920 struct hd_geometry *loc = (struct hd_geometry *) arg;
1921 if (!loc || drive->media != ide_disk) return -EINVAL;
1922 err = verify_area(VERIFY_WRITE, loc, sizeof(*loc));
1923 if (err) return err;
1924 put_user(drive->bios_head, (byte *) &loc->heads);
1925 put_user(drive->bios_sect, (byte *) &loc->sectors);
1926 put_user(drive->bios_cyl, (unsigned short *) &loc->cylinders);
1927 put_user((unsigned)drive->part[MINOR(inode->i_rdev)&PARTN_MASK].start_sect,
1928 (unsigned long *) &loc->start);
1929 return 0;
1930 }
1931 case BLKFLSBUF:
1932 if (!suser()) return -EACCES;
1933 fsync_dev(inode->i_rdev);
1934 invalidate_buffers(inode->i_rdev);
1935 return 0;
1936
1937 case BLKRASET:
1938 if (!suser()) return -EACCES;
1939 if(arg > 0xff) return -EINVAL;
1940 read_ahead[MAJOR(inode->i_rdev)] = arg;
1941 return 0;
1942
1943 case BLKRAGET:
1944 return write_fs_long(arg, read_ahead[MAJOR(inode->i_rdev)]);
1945
1946 case BLKGETSIZE:
1947 return write_fs_long(arg, drive->part[MINOR(inode->i_rdev)&PARTN_MASK].nr_sects);
1948 case BLKRRPART:
1949 if (!suser()) return -EACCES;
1950 return revalidate_disk(inode->i_rdev);
1951
1952 case HDIO_GET_KEEPSETTINGS:
1953 return write_fs_long(arg, drive->keep_settings);
1954
1955 case HDIO_GET_UNMASKINTR:
1956 return write_fs_long(arg, drive->unmask);
1957
1958 case HDIO_GET_DMA:
1959 return write_fs_long(arg, drive->using_dma);
1960
1961 case HDIO_GET_32BIT:
1962 return write_fs_long(arg, drive->io_32bit);
1963
1964 case HDIO_GET_MULTCOUNT:
1965 return write_fs_long(arg, drive->mult_count);
1966
1967 case HDIO_GET_IDENTITY:
1968 if (!arg || (MINOR(inode->i_rdev) & PARTN_MASK))
1969 return -EINVAL;
1970 if (drive->id == NULL)
1971 return -ENOMSG;
1972 err = verify_area(VERIFY_WRITE, (char *)arg, sizeof(*drive->id));
1973 if (!err)
1974 memcpy_tofs((char *)arg, (char *)drive->id, sizeof(*drive->id));
1975 return err;
1976
1977 case HDIO_GET_NOWERR:
1978 return write_fs_long(arg, drive->bad_wstat == BAD_R_STAT);
1979
1980 case HDIO_SET_DMA:
1981 if (!suser()) return -EACCES;
1982 #ifdef CONFIG_BLK_DEV_IDECD
1983 if (drive->media == ide_cdrom)
1984 return -EPERM;
1985 #endif
1986 if (!drive->id || !(drive->id->capability & 1) || !HWIF(drive)->dmaproc)
1987 return -EPERM;
1988 case HDIO_SET_KEEPSETTINGS:
1989 case HDIO_SET_UNMASKINTR:
1990 case HDIO_SET_NOWERR:
1991 if (arg > 1)
1992 return -EINVAL;
1993 case HDIO_SET_32BIT:
1994 if (!suser()) return -EACCES;
1995 if ((MINOR(inode->i_rdev) & PARTN_MASK))
1996 return -EINVAL;
1997 save_flags(flags);
1998 cli();
1999 switch (cmd) {
2000 case HDIO_SET_DMA:
2001 if (!(HWIF(drive)->dmaproc)) {
2002 restore_flags(flags);
2003 return -EPERM;
2004 }
2005 drive->using_dma = arg;
2006 break;
2007 case HDIO_SET_KEEPSETTINGS:
2008 drive->keep_settings = arg;
2009 break;
2010 case HDIO_SET_UNMASKINTR:
2011 if (arg && HWIF(drive)->no_unmask) {
2012 restore_flags(flags);
2013 return -EPERM;
2014 }
2015 drive->unmask = arg;
2016 break;
2017 case HDIO_SET_NOWERR:
2018 drive->bad_wstat = arg ? BAD_R_STAT : BAD_W_STAT;
2019 break;
2020 case HDIO_SET_32BIT:
2021 if (arg > (1 + (SUPPORT_VLB_SYNC<<1)))
2022 return -EINVAL;
2023 drive->io_32bit = arg;
2024 #ifdef CONFIG_BLK_DEV_DTC2278
2025 if (HWIF(drive)->chipset == ide_dtc2278)
2026 HWIF(drive)->drives[!drive->select.b.unit].io_32bit = arg;
2027 #endif
2028 break;
2029 }
2030 restore_flags(flags);
2031 return 0;
2032
2033 case HDIO_SET_MULTCOUNT:
2034 if (!suser()) return -EACCES;
2035 if (MINOR(inode->i_rdev) & PARTN_MASK)
2036 return -EINVAL;
2037 if (drive->id && arg > drive->id->max_multsect)
2038 return -EINVAL;
2039 save_flags(flags);
2040 cli();
2041 if (drive->special.b.set_multmode) {
2042 restore_flags(flags);
2043 return -EBUSY;
2044 }
2045 drive->mult_req = arg;
2046 drive->special.b.set_multmode = 1;
2047 restore_flags(flags);
2048 (void) ide_do_drive_cmd (drive, &rq, ide_wait);
2049 return (drive->mult_count == arg) ? 0 : -EIO;
2050
2051 case HDIO_DRIVE_CMD:
2052 {
2053 byte args[4], *argbuf = args;
2054 int argsize = 4;
2055 if (!suser()) return -EACCES;
2056 if (NULL == (void *) arg) {
2057 err = ide_do_drive_cmd(drive, &rq, ide_wait);
2058 } else if (!(err = verify_area(VERIFY_READ,(void *)arg, 4))) {
2059 memcpy_fromfs(args, (void *)arg, 4);
2060 if (args[3]) {
2061 argsize = 4 + (SECTOR_WORDS * 4 * args[3]);
2062 argbuf = kmalloc(argsize, GFP_KERNEL);
2063 if (argbuf == NULL)
2064 return -ENOMEM;
2065 argbuf[0] = args[0];
2066 argbuf[1] = args[1];
2067 argbuf[2] = args[2];
2068 argbuf[3] = args[3];
2069 }
2070 if (!(err = verify_area(VERIFY_WRITE,(void *)arg, argsize))) {
2071 rq.buffer = argbuf;
2072 err = ide_do_drive_cmd(drive, &rq, ide_wait);
2073 memcpy_tofs((void *)arg, argbuf, argsize);
2074 }
2075 if (argsize > 4)
2076 kfree(argbuf);
2077 }
2078 return err;
2079 }
2080 case HDIO_SET_PIO_MODE:
2081 if (!suser()) return -EACCES;
2082 if (MINOR(inode->i_rdev) & PARTN_MASK)
2083 return -EINVAL;
2084 if (!HWIF(drive)->tuneproc)
2085 return -ENOSYS;
2086 save_flags(flags);
2087 cli();
2088 drive->pio_req = (int) arg;
2089 drive->special.b.set_pio = 1;
2090 restore_flags(flags);
2091 return 0;
2092
2093 RO_IOCTLS(inode->i_rdev, arg);
2094
2095 default:
2096 #ifdef CONFIG_BLK_DEV_IDECD
2097 if (drive->media == ide_cdrom)
2098 return ide_cdrom_ioctl(drive, inode, file, cmd, arg);
2099 #endif
2100 #ifdef CONFIG_BLK_DEV_IDETAPE
2101 if (drive->media == ide_tape)
2102 return idetape_blkdev_ioctl(drive, inode, file, cmd, arg);
2103 #endif
2104 return -EPERM;
2105 }
2106 }
2107
2108 static int ide_check_media_change (kdev_t i_rdev)
2109 {
2110 ide_drive_t *drive;
2111
2112 if ((drive = get_info_ptr(i_rdev)) == NULL)
2113 return -ENODEV;
2114 #ifdef CONFIG_BLK_DEV_IDECD
2115 if (drive->media == ide_cdrom)
2116 return ide_cdrom_check_media_change (drive);
2117 #endif
2118 if (drive->removable)
2119 return 1;
2120 return 0;
2121 }
2122
2123 void ide_fixstring (byte *s, const int bytecount, const int byteswap)
2124 {
2125 byte *p = s, *end = &s[bytecount & ~1];
2126
2127 if (byteswap) {
2128
2129 for (p = end ; p != s;) {
2130 unsigned short *pp = (unsigned short *) (p -= 2);
2131 *pp = ntohs(*pp);
2132 }
2133 }
2134
2135
2136 while (s != end && *s == ' ')
2137 ++s;
2138
2139
2140 while (s != end && *s) {
2141 if (*s++ != ' ' || (s != end && *s && *s != ' '))
2142 *p++ = *(s-1);
2143 }
2144
2145
2146 while (p != end)
2147 *p++ = '\0';
2148 }
2149
2150 static inline void do_identify (ide_drive_t *drive, byte cmd)
2151 {
2152 int bswap;
2153 struct hd_driveid *id;
2154 unsigned long capacity, check;
2155
2156 id = drive->id = kmalloc (SECTOR_WORDS*4, GFP_KERNEL);
2157 ide_input_data(drive, id, SECTOR_WORDS);
2158 sti();
2159
2160
2161
2162
2163 if ((id->model[0] == 'P' && id->model[1] == 'M')
2164 || (id->model[0] == 'S' && id->model[1] == 'K')) {
2165 printk("%s: EATA SCSI HBA %.10s\n", drive->name, id->model);
2166 drive->present = 0;
2167 return;
2168 }
2169
2170
2171
2172
2173
2174 bswap = 1;
2175 if (cmd == WIN_PIDENTIFY) {
2176 if ((id->model[0] == 'N' && id->model[1] == 'E')
2177 || (id->model[0] == 'F' && id->model[1] == 'X')
2178 || (id->model[0] == 'P' && id->model[1] == 'i'))
2179 bswap = 0;
2180 }
2181 ide_fixstring (id->model, sizeof(id->model), bswap);
2182 ide_fixstring (id->fw_rev, sizeof(id->fw_rev), bswap);
2183 ide_fixstring (id->serial_no, sizeof(id->serial_no), bswap);
2184
2185 #ifdef CONFIG_BLK_DEV_IDEATAPI
2186
2187
2188
2189 if (cmd == WIN_PIDENTIFY) {
2190 byte type = (id->config >> 8) & 0x1f;
2191 printk("%s: %s, ATAPI ", drive->name, id->model);
2192 #ifdef CONFIG_BLK_DEV_PROMISE
2193 if (HWIF(drive)->is_promise2) {
2194 printk(" -- not supported on 2nd Promise port\n");
2195 drive->present = 0;
2196 return;
2197 }
2198 #endif
2199 switch (type) {
2200 case 0:
2201 case 5:
2202 #ifdef CONFIG_BLK_DEV_IDECD
2203 printk ("CDROM drive\n");
2204 drive->media = ide_cdrom;
2205 drive->present = 1;
2206 drive->removable = 1;
2207 return;
2208 #else
2209 printk ("CDROM ");
2210 break;
2211 #endif
2212 case 1:
2213 #ifdef CONFIG_BLK_DEV_IDETAPE
2214 printk ("TAPE drive");
2215 if (idetape_identify_device (drive,id)) {
2216 drive->media = ide_tape;
2217 drive->present = 1;
2218 drive->removable = 1;
2219 if (drive->autotune != 2 && HWIF(drive)->dmaproc != NULL) {
2220 if (!HWIF(drive)->dmaproc(ide_dma_check, drive))
2221 printk(", DMA");
2222 }
2223 printk("\n");
2224 }
2225 else {
2226 drive->present = 0;
2227 printk ("\nide-tape: the tape is not supported by this version of the driver\n");
2228 }
2229 return;
2230 #else
2231 printk ("TAPE ");
2232 break;
2233 #endif
2234 default:
2235 drive->present = 0;
2236 printk("Type %d - Unknown device\n", type);
2237 return;
2238 }
2239 drive->present = 0;
2240 printk("- not supported by this kernel\n");
2241 return;
2242 }
2243 #endif
2244
2245
2246 if (id->config & (1<<7)) {
2247 if (id->model[0] != 'W' || id->model[1] != 'D')
2248 drive->removable = 1;
2249 }
2250
2251
2252 if (id->model[0] == 'S' && id->model[1] == 'u') {
2253 drive->removable = 0;
2254 if (drive->select.all & (1<<4)) {
2255 drive->present = 0;
2256 return;
2257 }
2258 }
2259
2260 drive->media = ide_disk;
2261
2262 if (!drive->present) {
2263 drive->present = 1;
2264 drive->cyl = drive->bios_cyl = id->cyls;
2265 drive->head = drive->bios_head = id->heads;
2266 drive->sect = drive->bios_sect = id->sectors;
2267 }
2268
2269 if ((id->field_valid & 1) && id->cur_cyls && id->cur_heads
2270 && (id->cur_heads <= 16) && id->cur_sectors)
2271 {
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282 drive->cyl = id->cur_cyls;
2283 drive->head = id->cur_heads;
2284 drive->sect = id->cur_sectors;
2285
2286
2287 capacity = drive->cyl * drive->head * drive->sect;
2288 check = (id->cur_capacity0 << 16) | id->cur_capacity1;
2289 if (check == capacity) {
2290
2291 id->cur_capacity0 = (capacity >> 0) & 0xffff;
2292 id->cur_capacity1 = (capacity >> 16) & 0xffff;
2293 }
2294 }
2295
2296 if ((!drive->head || drive->head > 16) && id->heads && id->heads <= 16) {
2297 drive->cyl = id->cyls;
2298 drive->head = id->heads;
2299 drive->sect = id->sectors;
2300 }
2301
2302 if (drive->sect == drive->bios_sect && drive->head == drive->bios_head) {
2303 if (drive->cyl > drive->bios_cyl)
2304 drive->bios_cyl = drive->cyl;
2305 }
2306
2307 (void) current_capacity (drive);
2308
2309 printk ("%s: %.40s, %ldMB w/%dkB Cache, %sCHS=%d/%d/%d",
2310 drive->name, id->model, current_capacity(drive)/2048L, id->buf_size/2,
2311 drive->select.b.lba ? "LBA, " : "",
2312 drive->bios_cyl, drive->bios_head, drive->bios_sect);
2313
2314 drive->mult_count = 0;
2315 if (id->max_multsect) {
2316 drive->mult_req = INITIAL_MULT_COUNT;
2317 if (drive->mult_req > id->max_multsect)
2318 drive->mult_req = id->max_multsect;
2319 if (drive->mult_req || ((id->multsect_valid & 1) && id->multsect))
2320 drive->special.b.set_multmode = 1;
2321 }
2322 if (drive->autotune != 2 && HWIF(drive)->dmaproc != NULL) {
2323 if (!(HWIF(drive)->dmaproc(ide_dma_check, drive)))
2324 printk(", DMA");
2325 }
2326 printk("\n");
2327 }
2328
2329
2330
2331
2332
2333
2334 static void delay_10ms (void)
2335 {
2336 unsigned long timer = jiffies + (HZ + 99)/100 + 1;
2337 while (timer > jiffies);
2338 }
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350 static int try_to_identify (ide_drive_t *drive, byte cmd)
2351 {
2352 int hd_status, rc;
2353 unsigned long timeout;
2354 int irqs = 0;
2355
2356 if (!HWIF(drive)->irq) {
2357 probe_irq_off(probe_irq_on());
2358 irqs = probe_irq_on();
2359 OUT_BYTE(drive->ctl,IDE_CONTROL_REG);
2360 }
2361
2362 delay_10ms();
2363 if ((IN_BYTE(IDE_ALTSTATUS_REG) ^ IN_BYTE(IDE_STATUS_REG)) & ~INDEX_STAT) {
2364 printk("%s: probing with STATUS instead of ALTSTATUS\n", drive->name);
2365 hd_status = IDE_STATUS_REG;
2366 } else
2367 hd_status = IDE_ALTSTATUS_REG;
2368
2369 #if CONFIG_BLK_DEV_PROMISE
2370 if (IS_PROMISE_DRIVE) {
2371 if(promise_cmd(drive,PROMISE_IDENTIFY))
2372 return 1;
2373 } else
2374 #endif
2375 OUT_BYTE(cmd,IDE_COMMAND_REG);
2376 timeout = ((cmd == WIN_IDENTIFY) ? WAIT_WORSTCASE : WAIT_PIDENTIFY) / 2;
2377 timeout += jiffies;
2378 do {
2379 if (jiffies > timeout) {
2380 if (!HWIF(drive)->irq)
2381 (void) probe_irq_off(irqs);
2382 return 1;
2383 }
2384 delay_10ms();
2385 } while (IN_BYTE(hd_status) & BUSY_STAT);
2386
2387 delay_10ms();
2388 if (OK_STAT(GET_STAT(),DRQ_STAT,BAD_R_STAT)) {
2389 unsigned long flags;
2390 save_flags(flags);
2391 cli();
2392 do_identify(drive, cmd);
2393 if (drive->present && drive->media != ide_tape) {
2394 ide_tuneproc_t *tuneproc = HWIF(drive)->tuneproc;
2395 if (tuneproc != NULL && drive->autotune == 1)
2396 tuneproc(drive, 255);
2397 }
2398 rc = 0;
2399 (void) GET_STAT();
2400 restore_flags(flags);
2401 } else
2402 rc = 2;
2403 if (!HWIF(drive)->irq) {
2404 irqs = probe_irq_off(irqs);
2405 if (irqs > 0)
2406 HWIF(drive)->irq = irqs;
2407 else
2408 printk("%s: IRQ probe failed (%d)\n", drive->name, irqs);
2409 }
2410 return rc;
2411 }
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429 static int do_probe (ide_drive_t *drive, byte cmd)
2430 {
2431 int rc;
2432 ide_hwif_t *hwif;
2433 #ifdef CONFIG_BLK_DEV_IDEATAPI
2434 if (drive->present) {
2435 if ((drive->media != ide_disk) && (cmd == WIN_IDENTIFY))
2436 return 4;
2437 }
2438 #endif
2439 #ifdef DEBUG
2440 printk("probing for %s: present=%d, media=%d, probetype=%s\n",
2441 drive->name, drive->present, drive->media,
2442 (cmd == WIN_IDENTIFY) ? "ATA" : "ATAPI");
2443 #endif
2444 hwif = HWIF(drive);
2445 SELECT_DRIVE(hwif,drive);
2446 OUT_BYTE(drive->select.all,IDE_SELECT_REG);
2447 delay_10ms();
2448 if (IN_BYTE(IDE_SELECT_REG) != drive->select.all && !drive->present) {
2449 OUT_BYTE(0xa0,IDE_SELECT_REG);
2450 return 3;
2451 }
2452
2453 if (OK_STAT(GET_STAT(),READY_STAT,BUSY_STAT)
2454 || drive->present || cmd == WIN_PIDENTIFY)
2455 {
2456 if ((rc = try_to_identify(drive,cmd)))
2457 rc = try_to_identify(drive,cmd);
2458 if (rc == 1)
2459 printk("%s: no response (status = 0x%02x)\n", drive->name, GET_STAT());
2460 (void) GET_STAT();
2461 } else {
2462 rc = 3;
2463 }
2464 if (drive->select.b.unit != 0) {
2465 OUT_BYTE(0xa0,IDE_SELECT_REG);
2466 delay_10ms();
2467 (void) GET_STAT();
2468 }
2469 return rc;
2470 }
2471
2472
2473
2474
2475
2476
2477
2478 static inline byte probe_for_drive (ide_drive_t *drive)
2479 {
2480 if (drive->noprobe)
2481 return drive->present;
2482 if (do_probe(drive, WIN_IDENTIFY) >= 2) {
2483 #ifdef CONFIG_BLK_DEV_IDEATAPI
2484 (void) do_probe(drive, WIN_PIDENTIFY);
2485 #endif
2486 }
2487 if (!drive->present)
2488 return 0;
2489 if (drive->id == NULL) {
2490 if (drive->media == ide_disk) {
2491 printk ("%s: non-IDE drive, CHS=%d/%d/%d\n",
2492 drive->name, drive->cyl, drive->head, drive->sect);
2493 }
2494 #ifdef CONFIG_BLK_DEV_IDECD
2495 else if (drive->media == ide_cdrom) {
2496 printk("%s: ATAPI cdrom (?)\n", drive->name);
2497 }
2498 #endif
2499 else {
2500 drive->present = 0;
2501 }
2502 }
2503 return 1;
2504 }
2505
2506
2507
2508
2509
2510 static void probe_hwif (ide_hwif_t *hwif)
2511 {
2512 unsigned int unit;
2513
2514 #if CONFIG_BLK_DEV_PROMISE
2515 if (!hwif->is_promise2 &&
2516 (check_region(hwif->io_base,8) || check_region(hwif->ctl_port,1))) {
2517 #else
2518 if (check_region(hwif->io_base,8) || check_region(hwif->ctl_port,1)) {
2519 #endif
2520 int msgout = 0;
2521 for (unit = 0; unit < MAX_DRIVES; ++unit) {
2522 ide_drive_t *drive = &hwif->drives[unit];
2523 if (drive->present) {
2524 drive->present = 0;
2525 printk("%s: ERROR, PORTS ALREADY IN USE\n", drive->name);
2526 msgout = 1;
2527 }
2528 }
2529 if (!msgout)
2530 printk("%s: ports already in use, skipping probe\n", hwif->name);
2531 } else {
2532 unsigned long flags;
2533 save_flags(flags);
2534
2535 sti();
2536
2537
2538
2539
2540 for (unit = 0; unit < MAX_DRIVES; ++unit) {
2541 ide_drive_t *drive = &hwif->drives[unit];
2542 (void) probe_for_drive (drive);
2543 if (drive->present && drive->media == ide_disk) {
2544 if ((!drive->head || drive->head > 16) && !drive->select.b.lba) {
2545 printk("%s: INVALID GEOMETRY: %d PHYSICAL HEADS?\n",
2546 drive->name, drive->head);
2547 drive->present = 0;
2548 }
2549 }
2550 if (drive->present && !hwif->present) {
2551 hwif->present = 1;
2552 request_region(hwif->io_base, 8, hwif->name);
2553 request_region(hwif->ctl_port, 1, hwif->name);
2554 }
2555 }
2556 restore_flags(flags);
2557 }
2558 }
2559
2560
2561
2562
2563
2564 static int stridx (const char *s, char c)
2565 {
2566 char *i = strchr(s, c);
2567 return (i && c) ? i - s : -1;
2568 }
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582 static int match_parm (char *s, const char *keywords[], int vals[], int max_vals)
2583 {
2584 static const char *decimal = "0123456789";
2585 static const char *hex = "0123456789abcdef";
2586 int i, n;
2587
2588 if (*s++ == '=') {
2589
2590
2591
2592
2593 for (i = 0; *keywords != NULL; ++i) {
2594 if (!strcmp(s, *keywords++))
2595 return -(i+1);
2596 }
2597
2598
2599
2600
2601
2602
2603 for (n = 0; (i = stridx(decimal, *s)) >= 0;) {
2604 vals[n] = i;
2605 while ((i = stridx(decimal, *++s)) >= 0)
2606 vals[n] = (vals[n] * 10) + i;
2607 if (*s == 'x' && !vals[n]) {
2608 while ((i = stridx(hex, *++s)) >= 0)
2609 vals[n] = (vals[n] * 0x10) + i;
2610 }
2611 if (++n == max_vals)
2612 break;
2613 if (*s == ',')
2614 ++s;
2615 }
2616 if (!*s)
2617 return n;
2618 }
2619 return 0;
2620 }
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669 void ide_setup (char *s)
2670 {
2671 int i, vals[3];
2672 ide_hwif_t *hwif;
2673 ide_drive_t *drive;
2674 unsigned int hw, unit;
2675 const char max_drive = 'a' + ((MAX_HWIFS * MAX_DRIVES) - 1);
2676 const char max_hwif = '0' + (MAX_HWIFS - 1);
2677
2678 printk("ide_setup: %s", s);
2679 init_ide_data ();
2680
2681
2682
2683
2684 if (s[0] == 'h' && s[1] == 'd' && s[2] >= 'a' && s[2] <= max_drive) {
2685 const char *hd_words[] = {"noprobe", "nowerr", "cdrom", "serialize",
2686 "autotune", "noautotune", NULL};
2687 unit = s[2] - 'a';
2688 hw = unit / MAX_DRIVES;
2689 unit = unit % MAX_DRIVES;
2690 hwif = &ide_hwifs[hw];
2691 drive = &hwif->drives[unit];
2692 switch (match_parm(&s[3], hd_words, vals, 3)) {
2693 case -1:
2694 drive->noprobe = 1;
2695 goto done;
2696 case -2:
2697 drive->bad_wstat = BAD_R_STAT;
2698 hwif->noprobe = 0;
2699 goto done;
2700 case -3:
2701 drive->present = 1;
2702 drive->media = ide_cdrom;
2703 hwif->noprobe = 0;
2704 goto done;
2705 case -4:
2706 printk(" -- USE \"ide%d=serialize\" INSTEAD", hw);
2707 goto do_serialize;
2708 case -5:
2709 drive->autotune = 1;
2710 goto done;
2711 case -6:
2712 drive->autotune = 2;
2713 goto done;
2714 case 3:
2715 drive->media = ide_disk;
2716 drive->cyl = drive->bios_cyl = vals[0];
2717 drive->head = drive->bios_head = vals[1];
2718 drive->sect = drive->bios_sect = vals[2];
2719 drive->present = 1;
2720 drive->forced_geom = 1;
2721 hwif->noprobe = 0;
2722 goto done;
2723 default:
2724 goto bad_option;
2725 }
2726 }
2727
2728
2729
2730 if (s[0] == 'i' && s[1] == 'd' && s[2] == 'e' && s[3] >= '0' && s[3] <= max_hwif) {
2731
2732
2733
2734 const char *ide_words[] = {"noprobe", "serialize", "autotune", "noautotune",
2735 "qd6580", "ht6560b", "cmd640_vlb", "dtc2278", "umc8672", "ali14xx", "dc4030", NULL};
2736 hw = s[3] - '0';
2737 hwif = &ide_hwifs[hw];
2738 i = match_parm(&s[4], ide_words, vals, 3);
2739
2740
2741
2742
2743 if (i != -1 && i != -2) {
2744 if (hwif->chipset != ide_unknown)
2745 goto bad_option;
2746 if (i < 0 && ide_hwifs[1].chipset != ide_unknown)
2747 goto bad_option;
2748 }
2749
2750
2751
2752 if (i <= -6 && hw != 0)
2753 goto bad_hwif;
2754
2755 switch (i) {
2756 #ifdef CONFIG_BLK_DEV_PROMISE
2757 case -11:
2758 {
2759 setup_dc4030(hwif);
2760 goto done;
2761 }
2762 #endif
2763 #ifdef CONFIG_BLK_DEV_ALI14XX
2764 case -10:
2765 {
2766 extern void init_ali14xx (void);
2767 init_ali14xx();
2768 goto done;
2769 }
2770 #endif
2771 #ifdef CONFIG_BLK_DEV_UMC8672
2772 case -9:
2773 {
2774 extern void init_umc8672 (void);
2775 init_umc8672();
2776 goto done;
2777 }
2778 #endif
2779 #ifdef CONFIG_BLK_DEV_DTC2278
2780 case -8:
2781 {
2782 extern void init_dtc2278 (void);
2783 init_dtc2278();
2784 goto done;
2785 }
2786 #endif
2787 #ifdef CONFIG_BLK_DEV_CMD640
2788 case -7:
2789 {
2790 extern int cmd640_vlb;
2791 cmd640_vlb = 1;
2792 goto done;
2793 }
2794 #endif
2795 #ifdef CONFIG_BLK_DEV_HT6560B
2796 case -6:
2797 {
2798 extern void init_ht6560b (void);
2799 init_ht6560b();
2800 goto done;
2801 }
2802 #endif
2803 #if CONFIG_BLK_DEV_QD6580
2804 case -5:
2805 {
2806 extern void init_qd6580 (void);
2807 init_qd6580();
2808 goto done;
2809 }
2810 #endif
2811 case -4:
2812 hwif->drives[0].autotune = 2;
2813 hwif->drives[1].autotune = 2;
2814 goto done;
2815 case -3:
2816 hwif->drives[0].autotune = 1;
2817 hwif->drives[1].autotune = 1;
2818 goto done;
2819 case -2:
2820 do_serialize:
2821 ide_hwifs[hw].serialized = 1;
2822 ide_hwifs[hw^1].serialized = 1;
2823 goto done;
2824
2825 case -1:
2826 hwif->noprobe = 1;
2827 goto done;
2828
2829 case 1:
2830 vals[1] = vals[0] + 0x206;
2831 case 2:
2832 vals[2] = 0;
2833 case 3:
2834 hwif->io_base = vals[0];
2835 hwif->ctl_port = vals[1];
2836 hwif->irq = vals[2];
2837 hwif->noprobe = 0;
2838 hwif->chipset = ide_generic;
2839 goto done;
2840
2841 case 0: goto bad_option;
2842 default:
2843 printk(" -- SUPPORT NOT CONFIGURED IN THIS KERNEL\n");
2844 return;
2845 }
2846 }
2847 bad_option:
2848 printk(" -- BAD OPTION\n");
2849 return;
2850 bad_hwif:
2851 printk("-- NOT SUPPORTED ON ide%d", hw);
2852 done:
2853 printk("\n");
2854 }
2855
2856
2857
2858
2859
2860
2861
2862
2863
2864
2865
2866
2867
2868
2869
2870
2871
2872 int ide_xlate_1024 (kdev_t i_rdev, int xparm, const char *msg)
2873 {
2874 ide_drive_t *drive;
2875 static const byte head_vals[] = {4, 8, 16, 32, 64, 128, 255, 0};
2876 const byte *heads = head_vals;
2877 unsigned long tracks;
2878
2879 if ((drive = get_info_ptr(i_rdev)) == NULL || drive->forced_geom)
2880 return 0;
2881
2882 if (xparm > 1 && xparm <= drive->bios_head && drive->bios_sect == 63)
2883 return 0;
2884
2885 printk("%s ", msg);
2886
2887 if (drive->id) {
2888 drive->cyl = drive->id->cyls;
2889 drive->head = drive->id->heads;
2890 drive->sect = drive->id->sectors;
2891 }
2892 drive->bios_cyl = drive->cyl;
2893 drive->bios_head = drive->head;
2894 drive->bios_sect = drive->sect;
2895 drive->special.b.set_geometry = 1;
2896
2897 tracks = drive->bios_cyl * drive->bios_head * drive->bios_sect / 63;
2898 drive->bios_sect = 63;
2899 if (xparm > 1) {
2900 drive->bios_head = xparm;
2901 drive->bios_cyl = tracks / drive->bios_head;
2902 } else {
2903 while (drive->bios_cyl >= 1024) {
2904 drive->bios_head = *heads;
2905 drive->bios_cyl = tracks / drive->bios_head;
2906 if (0 == *++heads)
2907 break;
2908 }
2909 #if FAKE_FDISK_FOR_EZDRIVE
2910 if (xparm == -1) {
2911 drive->remap_0_to_1 = 1;
2912 msg = "0->1";
2913 } else
2914 #endif
2915 if (xparm == 1) {
2916 drive->sect0 = 63;
2917 drive->bios_cyl = (tracks - 1) / drive->bios_head;
2918 msg = "+63";
2919 }
2920 printk("[remap %s] ", msg);
2921 }
2922 drive->part[0].nr_sects = current_capacity(drive);
2923 printk("[%d/%d/%d]", drive->bios_cyl, drive->bios_head, drive->bios_sect);
2924 return 1;
2925 }
2926
2927
2928
2929
2930
2931
2932
2933
2934
2935
2936
2937
2938
2939
2940
2941
2942
2943
2944
2945
2946
2947
2948
2949
2950 static void probe_cmos_for_drives (ide_hwif_t *hwif)
2951 {
2952 #ifdef __i386__
2953 extern struct drive_info_struct drive_info;
2954 byte cmos_disks, *BIOS = (byte *) &drive_info;
2955 int unit;
2956
2957 #ifdef CONFIG_BLK_DEV_PROMISE
2958 if (hwif->is_promise2)
2959 return;
2960 #endif
2961 outb_p(0x12,0x70);
2962 cmos_disks = inb_p(0x71);
2963
2964 for (unit = 0; unit < MAX_DRIVES; ++unit) {
2965 ide_drive_t *drive = &hwif->drives[unit];
2966 if ((cmos_disks & (0xf0 >> (unit*4))) && !drive->present) {
2967 drive->cyl = drive->bios_cyl = *(unsigned short *)BIOS;
2968 drive->head = drive->bios_head = *(BIOS+2);
2969 drive->sect = drive->bios_sect = *(BIOS+14);
2970 drive->ctl = *(BIOS+8);
2971 drive->present = 1;
2972 }
2973 BIOS += 16;
2974 }
2975 #endif
2976 }
2977
2978
2979
2980
2981
2982
2983
2984
2985
2986
2987 static int init_irq (ide_hwif_t *hwif)
2988 {
2989 unsigned long flags;
2990 ide_hwgroup_t *hwgroup = hwif->hwgroup;
2991 ide_hwif_t *mate_hwif;
2992 unsigned int index, mate_irq = hwif->irq;
2993
2994 save_flags(flags);
2995 cli();
2996
2997
2998
2999
3000 mate_hwif = &ide_hwifs[hwif->index ^ 1];
3001 if (hwif->serialized && mate_hwif->present)
3002 mate_irq = mate_hwif->irq;
3003
3004
3005
3006
3007 for (index = 0; index < MAX_HWIFS; index++) {
3008 if (index != hwif->index) {
3009 ide_hwif_t *g = &ide_hwifs[index];
3010 if (g->irq == hwif->irq || g->irq == mate_irq) {
3011 if (hwgroup && !g->hwgroup)
3012 g->hwgroup = hwgroup;
3013 else if (!hwgroup)
3014 hwgroup = g->hwgroup;
3015 }
3016 }
3017 }
3018
3019
3020
3021
3022 if (hwgroup == NULL) {
3023 hwgroup = kmalloc (sizeof(ide_hwgroup_t), GFP_KERNEL);
3024 hwgroup->hwif = hwgroup->next_hwif = hwif->next = hwif;
3025 hwgroup->rq = NULL;
3026 hwgroup->handler = NULL;
3027 if (hwif->drives[0].present)
3028 hwgroup->drive = &hwif->drives[0];
3029 else
3030 hwgroup->drive = &hwif->drives[1];
3031 hwgroup->poll_timeout = 0;
3032 init_timer(&hwgroup->timer);
3033 hwgroup->timer.function = &timer_expiry;
3034 hwgroup->timer.data = (unsigned long) hwgroup;
3035 }
3036
3037
3038
3039
3040 if (!hwif->got_irq) {
3041 if (request_irq(hwif->irq, ide_intr, SA_INTERRUPT|SA_SAMPLE_RANDOM, hwif->name, hwgroup)) {
3042 restore_flags(flags);
3043 return 1;
3044 }
3045 for (index = 0; index < MAX_HWIFS; index++) {
3046 ide_hwif_t *g = &ide_hwifs[index];
3047 if (g->irq == hwif->irq)
3048 g->got_irq = 1;
3049 }
3050 }
3051
3052
3053
3054
3055 hwif->hwgroup = hwgroup;
3056 hwif->next = hwgroup->hwif->next;
3057 hwgroup->hwif->next = hwif;
3058
3059 restore_flags(flags);
3060
3061 printk("%s at 0x%03x-0x%03x,0x%03x on irq %d", hwif->name,
3062 hwif->io_base, hwif->io_base+7, hwif->ctl_port, hwif->irq);
3063 if (hwgroup->hwif != hwif)
3064 printk(" (serialized with %s)", hwgroup->hwif->name);
3065 printk("\n");
3066 return 0;
3067 }
3068
3069 static struct file_operations ide_fops = {
3070 NULL,
3071 block_read,
3072 block_write,
3073 NULL,
3074 NULL,
3075 ide_ioctl,
3076 NULL,
3077 ide_open,
3078 ide_release,
3079 block_fsync
3080 ,NULL,
3081 ide_check_media_change,
3082 revalidate_disk
3083 };
3084
3085 #ifdef CONFIG_PCI
3086 #if defined(CONFIG_BLK_DEV_RZ1000) || defined(CONFIG_BLK_DEV_TRITON)
3087
3088 typedef void (ide_pci_init_proc_t)(byte, byte);
3089
3090
3091
3092
3093
3094 static void ide_probe_pci (unsigned short vendor, unsigned short device, ide_pci_init_proc_t *init, int func_adj)
3095 {
3096 unsigned long flags;
3097 unsigned index;
3098 byte fn, bus;
3099
3100 save_flags(flags);
3101 cli();
3102 for (index = 0; !pcibios_find_device (vendor, device, index, &bus, &fn); ++index) {
3103 init (bus, fn + func_adj);
3104 }
3105 restore_flags(flags);
3106 }
3107
3108 #endif
3109 #endif
3110
3111
3112
3113
3114
3115
3116
3117 static void probe_for_hwifs (void)
3118 {
3119 #ifdef CONFIG_PCI
3120
3121
3122
3123 if (pcibios_present()) {
3124 #ifdef CONFIG_BLK_DEV_RZ1000
3125 ide_pci_init_proc_t init_rz1000;
3126 ide_probe_pci (PCI_VENDOR_ID_PCTECH, PCI_DEVICE_ID_PCTECH_RZ1000, &init_rz1000, 0);
3127 ide_probe_pci (PCI_VENDOR_ID_PCTECH, PCI_DEVICE_ID_PCTECH_RZ1001, &init_rz1000, 0);
3128 #endif
3129 #ifdef CONFIG_BLK_DEV_TRITON
3130
3131
3132
3133
3134
3135
3136 ide_probe_pci (PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371_0, &ide_init_triton, 1);
3137 #endif
3138 }
3139 #endif
3140 #ifdef CONFIG_BLK_DEV_CMD640
3141 {
3142 extern void ide_probe_for_cmd640x (void);
3143 ide_probe_for_cmd640x();
3144 }
3145 #endif
3146 #ifdef CONFIG_BLK_DEV_PROMISE
3147 init_dc4030();
3148 #endif
3149 }
3150
3151 static int hwif_init (int h)
3152 {
3153 ide_hwif_t *hwif = &ide_hwifs[h];
3154 void (*rfn)(void);
3155
3156 if (hwif->noprobe)
3157 return 0;
3158 else {
3159 if (hwif->io_base == HD_DATA)
3160 probe_cmos_for_drives (hwif);
3161 probe_hwif (hwif);
3162 if (!hwif->present)
3163 return 0;
3164 }
3165 if (!hwif->irq) {
3166 if (!(hwif->irq = default_irqs[h])) {
3167 printk("%s: DISABLED, NO IRQ\n", hwif->name);
3168 return (hwif->present = 0);
3169 }
3170 }
3171 #ifdef CONFIG_BLK_DEV_HD
3172 if (hwif->irq == HD_IRQ && hwif->io_base != HD_DATA) {
3173 printk("%s: CANNOT SHARE IRQ WITH OLD HARDDISK DRIVER (hd.c)\n", hwif->name);
3174 return (hwif->present = 0);
3175 }
3176 #endif
3177
3178 hwif->present = 0;
3179 switch (hwif->major) {
3180 case IDE0_MAJOR: rfn = &do_ide0_request; break;
3181 #if MAX_HWIFS > 1
3182 case IDE1_MAJOR: rfn = &do_ide1_request; break;
3183 #endif
3184 #if MAX_HWIFS > 2
3185 case IDE2_MAJOR: rfn = &do_ide2_request; break;
3186 #endif
3187 #if MAX_HWIFS > 3
3188 case IDE3_MAJOR: rfn = &do_ide3_request; break;
3189 #endif
3190 default:
3191 printk("%s: request_fn NOT DEFINED\n", hwif->name);
3192 return (hwif->present = 0);
3193 }
3194 if (register_blkdev (hwif->major, hwif->name, &ide_fops)) {
3195 printk("%s: UNABLE TO GET MAJOR NUMBER %d\n", hwif->name, hwif->major);
3196 } else if (init_irq (hwif)) {
3197 printk("%s: UNABLE TO GET IRQ %d\n", hwif->name, hwif->irq);
3198 (void) unregister_blkdev (hwif->major, hwif->name);
3199 } else {
3200 init_gendisk(hwif);
3201 blk_dev[hwif->major].request_fn = rfn;
3202 read_ahead[hwif->major] = 8;
3203 hwif->present = 1;
3204 }
3205 return hwif->present;
3206 }
3207
3208
3209
3210
3211 int ide_init (void)
3212 {
3213 int index;
3214
3215 init_ide_data ();
3216
3217
3218
3219 probe_for_hwifs ();
3220
3221
3222
3223
3224 for (index = 0; index < MAX_HWIFS; ++index)
3225 hwif_init (index);
3226
3227 #ifdef CONFIG_BLK_DEV_IDETAPE
3228 idetape_register_chrdev();
3229 #endif
3230
3231 return 0;
3232 }
3233
3234 #ifdef CONFIG_BLK_DEV_IDE_PCMCIA
3235 int ide_register(int io_base, int ctl_port, int irq)
3236 {
3237 int index, i, rc = -1;
3238 ide_hwif_t *hwif;
3239 unsigned long flags;
3240
3241 save_flags(flags);
3242 cli();
3243 for (index = 0; index < MAX_HWIFS; ++index) {
3244 hwif = &ide_hwifs[index];
3245 if (hwif->present) {
3246 if (hwif->io_base == io_base || hwif->ctl_port == ctl_port)
3247 break;
3248 } else {
3249 hwif->io_base = io_base;
3250 hwif->ctl_port = ctl_port;
3251 hwif->irq = irq;
3252 hwif->noprobe = 0;
3253 if (!hwif_init(index))
3254 break;
3255 for (i = 0; i < hwif->gd->nr_real; i++)
3256 revalidate_disk(MKDEV(hwif->major, i<<PARTN_BITS));
3257 rc = index;
3258 break;
3259 }
3260 }
3261 restore_flags(flags);
3262 return rc;
3263 }
3264
3265 void ide_unregister (unsigned int index)
3266 {
3267 struct gendisk *gd, **gdp;
3268 ide_hwif_t *hwif, *g;
3269 ide_hwgroup_t *hwgroup;
3270 int irq_count = 0;
3271 unsigned long flags;
3272
3273 if (index >= MAX_HWIFS)
3274 return;
3275 save_flags(flags);
3276 cli();
3277 hwif = &ide_hwifs[index];
3278 if (!hwif->present || hwif->drives[0].busy || hwif->drives[1].busy) {
3279 restore_flags(flags);
3280 return;
3281 }
3282 hwif->present = 0;
3283 hwgroup = hwif->hwgroup;
3284
3285
3286
3287
3288 g = hwgroup->hwif;
3289 do {
3290 if (g->irq == hwif->irq)
3291 ++irq_count;
3292 g = g->next;
3293 } while (g != hwgroup->hwif);
3294 if (irq_count == 1)
3295 free_irq(hwif->irq, hwgroup);
3296
3297
3298
3299
3300
3301
3302 release_region(hwif->io_base, 8);
3303 release_region(hwif->ctl_port, 1);
3304
3305
3306
3307
3308
3309 while (hwgroup->hwif->next != hwif)
3310 hwgroup->hwif = hwgroup->hwif->next;
3311 hwgroup->hwif->next = hwif->next;
3312 if (hwgroup->hwif == hwif)
3313 hwgroup->hwif = hwif->next;
3314 if (hwgroup->next_hwif == hwif)
3315 hwgroup->next_hwif = hwif->next;
3316 if (hwgroup->hwif == hwif)
3317 kfree(hwgroup);
3318
3319
3320
3321
3322 unregister_blkdev(hwif->major, hwif->name);
3323 kfree(blksize_size[hwif->major]);
3324 blk_dev[hwif->major].request_fn = NULL;
3325 blksize_size[hwif->major] = NULL;
3326 for (gdp = &gendisk_head; *gdp; gdp = &((*gdp)->next))
3327 if (*gdp == hwif->gd)
3328 break;
3329 if (*gdp == NULL)
3330 printk("gd not in disk chain!\n");
3331 else {
3332 gd = *gdp; *gdp = gd->next;
3333 kfree(gd->sizes);
3334 kfree(gd->part);
3335 kfree(gd);
3336 }
3337 init_hwif_data (index);
3338 restore_flags(flags);
3339 }
3340 #endif