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