1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27#include <linux/module.h>
28#include <linux/types.h>
29#include <linux/string.h>
30#include <linux/kernel.h>
31#include <linux/timer.h>
32#include <linux/mm.h>
33#include <linux/interrupt.h>
34#include <linux/major.h>
35#include <linux/errno.h>
36#include <linux/genhd.h>
37#include <linux/blkpg.h>
38#include <linux/slab.h>
39#include <linux/init.h>
40#include <linux/pci.h>
41#include <linux/delay.h>
42#include <linux/ide.h>
43#include <linux/completion.h>
44#include <linux/reboot.h>
45#include <linux/cdrom.h>
46#include <linux/seq_file.h>
47#include <linux/device.h>
48#include <linux/kmod.h>
49#include <linux/scatterlist.h>
50#include <linux/bitops.h>
51
52#include <asm/byteorder.h>
53#include <asm/irq.h>
54#include <linux/uaccess.h>
55#include <asm/io.h>
56
57int ide_end_rq(ide_drive_t *drive, struct request *rq, blk_status_t error,
58 unsigned int nr_bytes)
59{
60
61
62
63
64 if ((drive->dev_flags & IDE_DFLAG_DMA_PIO_RETRY) &&
65 drive->retry_pio <= 3) {
66 drive->dev_flags &= ~IDE_DFLAG_DMA_PIO_RETRY;
67 ide_dma_on(drive);
68 }
69
70 return blk_end_request(rq, error, nr_bytes);
71}
72EXPORT_SYMBOL_GPL(ide_end_rq);
73
74void ide_complete_cmd(ide_drive_t *drive, struct ide_cmd *cmd, u8 stat, u8 err)
75{
76 const struct ide_tp_ops *tp_ops = drive->hwif->tp_ops;
77 struct ide_taskfile *tf = &cmd->tf;
78 struct request *rq = cmd->rq;
79 u8 tf_cmd = tf->command;
80
81 tf->error = err;
82 tf->status = stat;
83
84 if (cmd->ftf_flags & IDE_FTFLAG_IN_DATA) {
85 u8 data[2];
86
87 tp_ops->input_data(drive, cmd, data, 2);
88
89 cmd->tf.data = data[0];
90 cmd->hob.data = data[1];
91 }
92
93 ide_tf_readback(drive, cmd);
94
95 if ((cmd->tf_flags & IDE_TFLAG_CUSTOM_HANDLER) &&
96 tf_cmd == ATA_CMD_IDLEIMMEDIATE) {
97 if (tf->lbal != 0xc4) {
98 printk(KERN_ERR "%s: head unload failed!\n",
99 drive->name);
100 ide_tf_dump(drive->name, cmd);
101 } else
102 drive->dev_flags |= IDE_DFLAG_PARKED;
103 }
104
105 if (rq && ata_taskfile_request(rq)) {
106 struct ide_cmd *orig_cmd = rq->special;
107
108 if (cmd->tf_flags & IDE_TFLAG_DYN)
109 kfree(orig_cmd);
110 else if (cmd != orig_cmd)
111 memcpy(orig_cmd, cmd, sizeof(*cmd));
112 }
113}
114
115int ide_complete_rq(ide_drive_t *drive, blk_status_t error, unsigned int nr_bytes)
116{
117 ide_hwif_t *hwif = drive->hwif;
118 struct request *rq = hwif->rq;
119 int rc;
120
121
122
123
124
125 if (blk_noretry_request(rq) && error)
126 nr_bytes = blk_rq_sectors(rq) << 9;
127
128 rc = ide_end_rq(drive, rq, error, nr_bytes);
129 if (rc == 0)
130 hwif->rq = NULL;
131
132 return rc;
133}
134EXPORT_SYMBOL(ide_complete_rq);
135
136void ide_kill_rq(ide_drive_t *drive, struct request *rq)
137{
138 u8 drv_req = ata_misc_request(rq) && rq->rq_disk;
139 u8 media = drive->media;
140
141 drive->failed_pc = NULL;
142
143 if ((media == ide_floppy || media == ide_tape) && drv_req) {
144 scsi_req(rq)->result = 0;
145 } else {
146 if (media == ide_tape)
147 scsi_req(rq)->result = IDE_DRV_ERROR_GENERAL;
148 else if (blk_rq_is_passthrough(rq) && scsi_req(rq)->result == 0)
149 scsi_req(rq)->result = -EIO;
150 }
151
152 ide_complete_rq(drive, BLK_STS_IOERR, blk_rq_bytes(rq));
153}
154
155static void ide_tf_set_specify_cmd(ide_drive_t *drive, struct ide_taskfile *tf)
156{
157 tf->nsect = drive->sect;
158 tf->lbal = drive->sect;
159 tf->lbam = drive->cyl;
160 tf->lbah = drive->cyl >> 8;
161 tf->device = (drive->head - 1) | drive->select;
162 tf->command = ATA_CMD_INIT_DEV_PARAMS;
163}
164
165static void ide_tf_set_restore_cmd(ide_drive_t *drive, struct ide_taskfile *tf)
166{
167 tf->nsect = drive->sect;
168 tf->command = ATA_CMD_RESTORE;
169}
170
171static void ide_tf_set_setmult_cmd(ide_drive_t *drive, struct ide_taskfile *tf)
172{
173 tf->nsect = drive->mult_req;
174 tf->command = ATA_CMD_SET_MULTI;
175}
176
177
178
179
180
181
182
183
184
185static ide_startstop_t do_special(ide_drive_t *drive)
186{
187 struct ide_cmd cmd;
188
189#ifdef DEBUG
190 printk(KERN_DEBUG "%s: %s: 0x%02x\n", drive->name, __func__,
191 drive->special_flags);
192#endif
193 if (drive->media != ide_disk) {
194 drive->special_flags = 0;
195 drive->mult_req = 0;
196 return ide_stopped;
197 }
198
199 memset(&cmd, 0, sizeof(cmd));
200 cmd.protocol = ATA_PROT_NODATA;
201
202 if (drive->special_flags & IDE_SFLAG_SET_GEOMETRY) {
203 drive->special_flags &= ~IDE_SFLAG_SET_GEOMETRY;
204 ide_tf_set_specify_cmd(drive, &cmd.tf);
205 } else if (drive->special_flags & IDE_SFLAG_RECALIBRATE) {
206 drive->special_flags &= ~IDE_SFLAG_RECALIBRATE;
207 ide_tf_set_restore_cmd(drive, &cmd.tf);
208 } else if (drive->special_flags & IDE_SFLAG_SET_MULTMODE) {
209 drive->special_flags &= ~IDE_SFLAG_SET_MULTMODE;
210 ide_tf_set_setmult_cmd(drive, &cmd.tf);
211 } else
212 BUG();
213
214 cmd.valid.out.tf = IDE_VALID_OUT_TF | IDE_VALID_DEVICE;
215 cmd.valid.in.tf = IDE_VALID_IN_TF | IDE_VALID_DEVICE;
216 cmd.tf_flags = IDE_TFLAG_CUSTOM_HANDLER;
217
218 do_rw_taskfile(drive, &cmd);
219
220 return ide_started;
221}
222
223void ide_map_sg(ide_drive_t *drive, struct ide_cmd *cmd)
224{
225 ide_hwif_t *hwif = drive->hwif;
226 struct scatterlist *sg = hwif->sg_table;
227 struct request *rq = cmd->rq;
228
229 cmd->sg_nents = blk_rq_map_sg(drive->queue, rq, sg);
230}
231EXPORT_SYMBOL_GPL(ide_map_sg);
232
233void ide_init_sg_cmd(struct ide_cmd *cmd, unsigned int nr_bytes)
234{
235 cmd->nbytes = cmd->nleft = nr_bytes;
236 cmd->cursg_ofs = 0;
237 cmd->cursg = NULL;
238}
239EXPORT_SYMBOL_GPL(ide_init_sg_cmd);
240
241
242
243
244
245
246
247
248
249
250
251
252
253static ide_startstop_t execute_drive_cmd (ide_drive_t *drive,
254 struct request *rq)
255{
256 struct ide_cmd *cmd = rq->special;
257
258 if (cmd) {
259 if (cmd->protocol == ATA_PROT_PIO) {
260 ide_init_sg_cmd(cmd, blk_rq_sectors(rq) << 9);
261 ide_map_sg(drive, cmd);
262 }
263
264 return do_rw_taskfile(drive, cmd);
265 }
266
267
268
269
270
271#ifdef DEBUG
272 printk("%s: DRIVE_CMD (null)\n", drive->name);
273#endif
274 scsi_req(rq)->result = 0;
275 ide_complete_rq(drive, BLK_STS_OK, blk_rq_bytes(rq));
276
277 return ide_stopped;
278}
279
280static ide_startstop_t ide_special_rq(ide_drive_t *drive, struct request *rq)
281{
282 u8 cmd = scsi_req(rq)->cmd[0];
283
284 switch (cmd) {
285 case REQ_PARK_HEADS:
286 case REQ_UNPARK_HEADS:
287 return ide_do_park_unpark(drive, rq);
288 case REQ_DEVSET_EXEC:
289 return ide_do_devset(drive, rq);
290 case REQ_DRIVE_RESET:
291 return ide_do_reset(drive);
292 default:
293 BUG();
294 }
295}
296
297
298
299
300
301
302
303
304
305
306static ide_startstop_t start_request (ide_drive_t *drive, struct request *rq)
307{
308 ide_startstop_t startstop;
309
310 BUG_ON(!(rq->rq_flags & RQF_STARTED));
311
312#ifdef DEBUG
313 printk("%s: start_request: current=0x%08lx\n",
314 drive->hwif->name, (unsigned long) rq);
315#endif
316
317
318 if (drive->max_failures && (drive->failures > drive->max_failures)) {
319 rq->rq_flags |= RQF_FAILED;
320 goto kill_rq;
321 }
322
323 if (ata_pm_request(rq))
324 ide_check_pm_state(drive, rq);
325
326 drive->hwif->tp_ops->dev_select(drive);
327 if (ide_wait_stat(&startstop, drive, drive->ready_stat,
328 ATA_BUSY | ATA_DRQ, WAIT_READY)) {
329 printk(KERN_ERR "%s: drive not ready for command\n", drive->name);
330 return startstop;
331 }
332
333 if (drive->special_flags == 0) {
334 struct ide_driver *drv;
335
336
337
338
339
340 if (drive->current_speed == 0xff)
341 ide_config_drive_speed(drive, drive->desired_speed);
342
343 if (ata_taskfile_request(rq))
344 return execute_drive_cmd(drive, rq);
345 else if (ata_pm_request(rq)) {
346 struct ide_pm_state *pm = rq->special;
347#ifdef DEBUG_PM
348 printk("%s: start_power_step(step: %d)\n",
349 drive->name, pm->pm_step);
350#endif
351 startstop = ide_start_power_step(drive, rq);
352 if (startstop == ide_stopped &&
353 pm->pm_step == IDE_PM_COMPLETED)
354 ide_complete_pm_rq(drive, rq);
355 return startstop;
356 } else if (!rq->rq_disk && ata_misc_request(rq))
357
358
359
360
361
362
363
364
365 return ide_special_rq(drive, rq);
366
367 drv = *(struct ide_driver **)rq->rq_disk->private_data;
368
369 return drv->do_request(drive, rq, blk_rq_pos(rq));
370 }
371 return do_special(drive);
372kill_rq:
373 ide_kill_rq(drive, rq);
374 return ide_stopped;
375}
376
377
378
379
380
381
382
383
384
385
386void ide_stall_queue (ide_drive_t *drive, unsigned long timeout)
387{
388 if (timeout > WAIT_WORSTCASE)
389 timeout = WAIT_WORSTCASE;
390 drive->sleep = timeout + jiffies;
391 drive->dev_flags |= IDE_DFLAG_SLEEPING;
392}
393EXPORT_SYMBOL(ide_stall_queue);
394
395static inline int ide_lock_port(ide_hwif_t *hwif)
396{
397 if (hwif->busy)
398 return 1;
399
400 hwif->busy = 1;
401
402 return 0;
403}
404
405static inline void ide_unlock_port(ide_hwif_t *hwif)
406{
407 hwif->busy = 0;
408}
409
410static inline int ide_lock_host(struct ide_host *host, ide_hwif_t *hwif)
411{
412 int rc = 0;
413
414 if (host->host_flags & IDE_HFLAG_SERIALIZE) {
415 rc = test_and_set_bit_lock(IDE_HOST_BUSY, &host->host_busy);
416 if (rc == 0) {
417 if (host->get_lock)
418 host->get_lock(ide_intr, hwif);
419 }
420 }
421 return rc;
422}
423
424static inline void ide_unlock_host(struct ide_host *host)
425{
426 if (host->host_flags & IDE_HFLAG_SERIALIZE) {
427 if (host->release_lock)
428 host->release_lock();
429 clear_bit_unlock(IDE_HOST_BUSY, &host->host_busy);
430 }
431}
432
433static void __ide_requeue_and_plug(struct request_queue *q, struct request *rq)
434{
435 if (rq)
436 blk_requeue_request(q, rq);
437 if (rq || blk_peek_request(q)) {
438
439 blk_delay_queue(q, 3);
440 }
441}
442
443void ide_requeue_and_plug(ide_drive_t *drive, struct request *rq)
444{
445 struct request_queue *q = drive->queue;
446 unsigned long flags;
447
448 spin_lock_irqsave(q->queue_lock, flags);
449 __ide_requeue_and_plug(q, rq);
450 spin_unlock_irqrestore(q->queue_lock, flags);
451}
452
453
454
455
456void do_ide_request(struct request_queue *q)
457{
458 ide_drive_t *drive = q->queuedata;
459 ide_hwif_t *hwif = drive->hwif;
460 struct ide_host *host = hwif->host;
461 struct request *rq = NULL;
462 ide_startstop_t startstop;
463
464 spin_unlock_irq(q->queue_lock);
465
466
467 might_sleep();
468
469 if (ide_lock_host(host, hwif))
470 goto plug_device_2;
471
472 spin_lock_irq(&hwif->lock);
473
474 if (!ide_lock_port(hwif)) {
475 ide_hwif_t *prev_port;
476
477 WARN_ON_ONCE(hwif->rq);
478repeat:
479 prev_port = hwif->host->cur_port;
480 if (drive->dev_flags & IDE_DFLAG_SLEEPING &&
481 time_after(drive->sleep, jiffies)) {
482 ide_unlock_port(hwif);
483 goto plug_device;
484 }
485
486 if ((hwif->host->host_flags & IDE_HFLAG_SERIALIZE) &&
487 hwif != prev_port) {
488 ide_drive_t *cur_dev =
489 prev_port ? prev_port->cur_dev : NULL;
490
491
492
493
494
495 if (cur_dev &&
496 (cur_dev->dev_flags & IDE_DFLAG_NIEN_QUIRK) == 0)
497 prev_port->tp_ops->write_devctl(prev_port,
498 ATA_NIEN |
499 ATA_DEVCTL_OBS);
500
501 hwif->host->cur_port = hwif;
502 }
503 hwif->cur_dev = drive;
504 drive->dev_flags &= ~(IDE_DFLAG_SLEEPING | IDE_DFLAG_PARKED);
505
506 spin_unlock_irq(&hwif->lock);
507 spin_lock_irq(q->queue_lock);
508
509
510
511
512 if (!rq)
513 rq = blk_fetch_request(drive->queue);
514
515 spin_unlock_irq(q->queue_lock);
516 spin_lock_irq(&hwif->lock);
517
518 if (!rq) {
519 ide_unlock_port(hwif);
520 goto out;
521 }
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536 if ((drive->dev_flags & IDE_DFLAG_BLOCKED) &&
537 ata_pm_request(rq) == 0 &&
538 (rq->rq_flags & RQF_PREEMPT) == 0) {
539
540 ide_unlock_port(hwif);
541 goto plug_device;
542 }
543
544 scsi_req(rq)->resid_len = blk_rq_bytes(rq);
545 hwif->rq = rq;
546
547 spin_unlock_irq(&hwif->lock);
548 startstop = start_request(drive, rq);
549 spin_lock_irq(&hwif->lock);
550
551 if (startstop == ide_stopped) {
552 rq = hwif->rq;
553 hwif->rq = NULL;
554 goto repeat;
555 }
556 } else
557 goto plug_device;
558out:
559 spin_unlock_irq(&hwif->lock);
560 if (rq == NULL)
561 ide_unlock_host(host);
562 spin_lock_irq(q->queue_lock);
563 return;
564
565plug_device:
566 spin_unlock_irq(&hwif->lock);
567 ide_unlock_host(host);
568plug_device_2:
569 spin_lock_irq(q->queue_lock);
570 __ide_requeue_and_plug(q, rq);
571}
572
573static int drive_is_ready(ide_drive_t *drive)
574{
575 ide_hwif_t *hwif = drive->hwif;
576 u8 stat = 0;
577
578 if (drive->waiting_for_dma)
579 return hwif->dma_ops->dma_test_irq(drive);
580
581 if (hwif->io_ports.ctl_addr &&
582 (hwif->host_flags & IDE_HFLAG_BROKEN_ALTSTATUS) == 0)
583 stat = hwif->tp_ops->read_altstatus(hwif);
584 else
585
586 stat = hwif->tp_ops->read_status(hwif);
587
588 if (stat & ATA_BUSY)
589
590 return 0;
591
592
593 return 1;
594}
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610void ide_timer_expiry (struct timer_list *t)
611{
612 ide_hwif_t *hwif = from_timer(hwif, t, timer);
613 ide_drive_t *uninitialized_var(drive);
614 ide_handler_t *handler;
615 unsigned long flags;
616 int wait = -1;
617 int plug_device = 0;
618 struct request *uninitialized_var(rq_in_flight);
619
620 spin_lock_irqsave(&hwif->lock, flags);
621
622 handler = hwif->handler;
623
624 if (handler == NULL || hwif->req_gen != hwif->req_gen_timer) {
625
626
627
628
629
630
631 } else {
632 ide_expiry_t *expiry = hwif->expiry;
633 ide_startstop_t startstop = ide_stopped;
634
635 drive = hwif->cur_dev;
636
637 if (expiry) {
638 wait = expiry(drive);
639 if (wait > 0) {
640
641 hwif->timer.expires = jiffies + wait;
642 hwif->req_gen_timer = hwif->req_gen;
643 add_timer(&hwif->timer);
644 spin_unlock_irqrestore(&hwif->lock, flags);
645 return;
646 }
647 }
648 hwif->handler = NULL;
649 hwif->expiry = NULL;
650
651
652
653
654
655 spin_unlock(&hwif->lock);
656
657 disable_irq(hwif->irq);
658
659 if (hwif->polling) {
660 startstop = handler(drive);
661 } else if (drive_is_ready(drive)) {
662 if (drive->waiting_for_dma)
663 hwif->dma_ops->dma_lost_irq(drive);
664 if (hwif->port_ops && hwif->port_ops->clear_irq)
665 hwif->port_ops->clear_irq(drive);
666
667 printk(KERN_WARNING "%s: lost interrupt\n",
668 drive->name);
669 startstop = handler(drive);
670 } else {
671 if (drive->waiting_for_dma)
672 startstop = ide_dma_timeout_retry(drive, wait);
673 else
674 startstop = ide_error(drive, "irq timeout",
675 hwif->tp_ops->read_status(hwif));
676 }
677
678 spin_lock_irq(&hwif->lock);
679 enable_irq(hwif->irq);
680 if (startstop == ide_stopped && hwif->polling == 0) {
681 rq_in_flight = hwif->rq;
682 hwif->rq = NULL;
683 ide_unlock_port(hwif);
684 plug_device = 1;
685 }
686 }
687 spin_unlock_irqrestore(&hwif->lock, flags);
688
689 if (plug_device) {
690 ide_unlock_host(hwif->host);
691 ide_requeue_and_plug(drive, rq_in_flight);
692 }
693}
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724static void unexpected_intr(int irq, ide_hwif_t *hwif)
725{
726 u8 stat = hwif->tp_ops->read_status(hwif);
727
728 if (!OK_STAT(stat, ATA_DRDY, BAD_STAT)) {
729
730 static unsigned long last_msgtime, count;
731 ++count;
732
733 if (time_after(jiffies, last_msgtime + HZ)) {
734 last_msgtime = jiffies;
735 printk(KERN_ERR "%s: unexpected interrupt, "
736 "status=0x%02x, count=%ld\n",
737 hwif->name, stat, count);
738 }
739 }
740}
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767irqreturn_t ide_intr (int irq, void *dev_id)
768{
769 ide_hwif_t *hwif = (ide_hwif_t *)dev_id;
770 struct ide_host *host = hwif->host;
771 ide_drive_t *uninitialized_var(drive);
772 ide_handler_t *handler;
773 unsigned long flags;
774 ide_startstop_t startstop;
775 irqreturn_t irq_ret = IRQ_NONE;
776 int plug_device = 0;
777 struct request *uninitialized_var(rq_in_flight);
778
779 if (host->host_flags & IDE_HFLAG_SERIALIZE) {
780 if (hwif != host->cur_port)
781 goto out_early;
782 }
783
784 spin_lock_irqsave(&hwif->lock, flags);
785
786 if (hwif->port_ops && hwif->port_ops->test_irq &&
787 hwif->port_ops->test_irq(hwif) == 0)
788 goto out;
789
790 handler = hwif->handler;
791
792 if (handler == NULL || hwif->polling) {
793
794
795
796
797
798
799
800
801
802
803
804
805 if ((host->irq_flags & IRQF_SHARED) == 0) {
806
807
808
809
810 unexpected_intr(irq, hwif);
811 } else {
812
813
814
815
816 (void)hwif->tp_ops->read_status(hwif);
817 }
818 goto out;
819 }
820
821 drive = hwif->cur_dev;
822
823 if (!drive_is_ready(drive))
824
825
826
827
828
829
830
831 goto out;
832
833 hwif->handler = NULL;
834 hwif->expiry = NULL;
835 hwif->req_gen++;
836 del_timer(&hwif->timer);
837 spin_unlock(&hwif->lock);
838
839 if (hwif->port_ops && hwif->port_ops->clear_irq)
840 hwif->port_ops->clear_irq(drive);
841
842 if (drive->dev_flags & IDE_DFLAG_UNMASK)
843 local_irq_enable_in_hardirq();
844
845
846 startstop = handler(drive);
847
848 spin_lock_irq(&hwif->lock);
849
850
851
852
853
854
855
856 if (startstop == ide_stopped && hwif->polling == 0) {
857 BUG_ON(hwif->handler);
858 rq_in_flight = hwif->rq;
859 hwif->rq = NULL;
860 ide_unlock_port(hwif);
861 plug_device = 1;
862 }
863 irq_ret = IRQ_HANDLED;
864out:
865 spin_unlock_irqrestore(&hwif->lock, flags);
866out_early:
867 if (plug_device) {
868 ide_unlock_host(hwif->host);
869 ide_requeue_and_plug(drive, rq_in_flight);
870 }
871
872 return irq_ret;
873}
874EXPORT_SYMBOL_GPL(ide_intr);
875
876void ide_pad_transfer(ide_drive_t *drive, int write, int len)
877{
878 ide_hwif_t *hwif = drive->hwif;
879 u8 buf[4] = { 0 };
880
881 while (len > 0) {
882 if (write)
883 hwif->tp_ops->output_data(drive, NULL, buf, min(4, len));
884 else
885 hwif->tp_ops->input_data(drive, NULL, buf, min(4, len));
886 len -= 4;
887 }
888}
889EXPORT_SYMBOL_GPL(ide_pad_transfer);
890