]>
git.proxmox.com Git - mirror_ubuntu-kernels.git/blob - drivers/ide/ide-lib.c
217b7fdf2b1779f7ea881a140ba6bc84e998cc57
1 #include <linux/types.h>
2 #include <linux/string.h>
3 #include <linux/kernel.h>
4 #include <linux/interrupt.h>
6 #include <linux/bitops.h>
9 * ide_toggle_bounce - handle bounce buffering
10 * @drive: drive to update
13 * Enable or disable bounce buffering for the device. Drives move
14 * between PIO and DMA and that changes the rules we need.
17 void ide_toggle_bounce(ide_drive_t
*drive
, int on
)
19 u64 addr
= BLK_BOUNCE_HIGH
; /* dma64_addr_t */
21 if (!PCI_DMA_BUS_IS_PHYS
) {
22 addr
= BLK_BOUNCE_ANY
;
23 } else if (on
&& drive
->media
== ide_disk
) {
24 struct device
*dev
= drive
->hwif
->dev
;
26 if (dev
&& dev
->dma_mask
)
27 addr
= *dev
->dma_mask
;
31 blk_queue_bounce_limit(drive
->queue
, addr
);
34 static void ide_dump_opcode(ide_drive_t
*drive
)
36 struct request
*rq
= drive
->hwif
->rq
;
37 struct ide_cmd
*cmd
= NULL
;
42 if (rq
->cmd_type
== REQ_TYPE_ATA_TASKFILE
)
45 printk(KERN_ERR
"ide: failed opcode was: ");
47 printk(KERN_CONT
"unknown\n");
49 printk(KERN_CONT
"0x%02x\n", cmd
->tf
.command
);
52 u64
ide_get_lba_addr(struct ide_taskfile
*tf
, int lba48
)
57 high
= (tf
->hob_lbah
<< 16) | (tf
->hob_lbam
<< 8) |
60 high
= tf
->device
& 0xf;
61 low
= (tf
->lbah
<< 16) | (tf
->lbam
<< 8) | tf
->lbal
;
63 return ((u64
)high
<< 24) | low
;
65 EXPORT_SYMBOL_GPL(ide_get_lba_addr
);
67 static void ide_dump_sector(ide_drive_t
*drive
)
70 struct ide_taskfile
*tf
= &cmd
.tf
;
71 u8 lba48
= !!(drive
->dev_flags
& IDE_DFLAG_LBA48
);
73 memset(&cmd
, 0, sizeof(cmd
));
75 cmd
.tf_flags
= IDE_TFLAG_IN_LBA
| IDE_TFLAG_IN_HOB_LBA
|
78 cmd
.tf_flags
= IDE_TFLAG_IN_LBA
| IDE_TFLAG_IN_DEVICE
;
80 drive
->hwif
->tp_ops
->tf_read(drive
, &cmd
);
82 if (lba48
|| (tf
->device
& ATA_LBA
))
83 printk(KERN_CONT
", LBAsect=%llu",
84 (unsigned long long)ide_get_lba_addr(tf
, lba48
));
86 printk(KERN_CONT
", CHS=%d/%d/%d", (tf
->lbah
<< 8) + tf
->lbam
,
87 tf
->device
& 0xf, tf
->lbal
);
90 static void ide_dump_ata_error(ide_drive_t
*drive
, u8 err
)
92 printk(KERN_ERR
"{ ");
93 if (err
& ATA_ABORTED
)
94 printk(KERN_CONT
"DriveStatusError ");
96 printk(KERN_CONT
"%s",
97 (err
& ATA_ABORTED
) ? "BadCRC " : "BadSector ");
99 printk(KERN_CONT
"UncorrectableError ");
101 printk(KERN_CONT
"SectorIdNotFound ");
102 if (err
& ATA_TRK0NF
)
103 printk(KERN_CONT
"TrackZeroNotFound ");
105 printk(KERN_CONT
"AddrMarkNotFound ");
106 printk(KERN_CONT
"}");
107 if ((err
& (ATA_BBK
| ATA_ABORTED
)) == ATA_BBK
||
108 (err
& (ATA_UNC
| ATA_IDNF
| ATA_AMNF
))) {
109 struct request
*rq
= drive
->hwif
->rq
;
111 ide_dump_sector(drive
);
114 printk(KERN_CONT
", sector=%llu",
115 (unsigned long long)rq
->sector
);
117 printk(KERN_CONT
"\n");
120 static void ide_dump_atapi_error(ide_drive_t
*drive
, u8 err
)
122 printk(KERN_ERR
"{ ");
124 printk(KERN_CONT
"IllegalLengthIndication ");
126 printk(KERN_CONT
"EndOfMedia ");
127 if (err
& ATA_ABORTED
)
128 printk(KERN_CONT
"AbortedCommand ");
130 printk(KERN_CONT
"MediaChangeRequested ");
132 printk(KERN_CONT
"LastFailedSense=0x%02x ",
133 (err
& ATAPI_LFS
) >> 4);
134 printk(KERN_CONT
"}\n");
138 * ide_dump_status - translate ATA/ATAPI error
139 * @drive: drive that status applies to
140 * @msg: text message to print
141 * @stat: status byte to decode
143 * Error reporting, in human readable form (luxurious, but a memory hog).
144 * Combines the drive name, message and status byte to provide a
145 * user understandable explanation of the device error.
148 u8
ide_dump_status(ide_drive_t
*drive
, const char *msg
, u8 stat
)
152 printk(KERN_ERR
"%s: %s: status=0x%02x { ", drive
->name
, msg
, stat
);
154 printk(KERN_CONT
"Busy ");
157 printk(KERN_CONT
"DriveReady ");
159 printk(KERN_CONT
"DeviceFault ");
161 printk(KERN_CONT
"SeekComplete ");
163 printk(KERN_CONT
"DataRequest ");
165 printk(KERN_CONT
"CorrectedError ");
167 printk(KERN_CONT
"Index ");
169 printk(KERN_CONT
"Error ");
171 printk(KERN_CONT
"}\n");
172 if ((stat
& (ATA_BUSY
| ATA_ERR
)) == ATA_ERR
) {
173 err
= ide_read_error(drive
);
174 printk(KERN_ERR
"%s: %s: error=0x%02x ", drive
->name
, msg
, err
);
175 if (drive
->media
== ide_disk
)
176 ide_dump_ata_error(drive
, err
);
178 ide_dump_atapi_error(drive
, err
);
180 ide_dump_opcode(drive
);
183 EXPORT_SYMBOL(ide_dump_status
);