diff options
author | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2008-10-10 16:39:34 -0400 |
---|---|---|
committer | Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> | 2008-10-10 16:39:34 -0400 |
commit | 51509eec34debffec3c6f481f7371c9aeb6c63c1 (patch) | |
tree | 94728b2030fadb1f59d5d171541af9518d194366 /drivers/ide/ide-atapi.c | |
parent | 05236ea6df7419f0f37cf9603cfee265cfce5832 (diff) |
ide: add ide_check_atapi_device() helper
* Add ide_check_atapi_device() to ide-atapi.c and convert
ide-{floppy,tape}.c to use it instead of ide*_identify_device().
While at it:
* Add DRV_NAME defines to ide-{floppy,tape}.c.
Cc: Borislav Petkov <petkovbb@gmail.com>
Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Diffstat (limited to 'drivers/ide/ide-atapi.c')
-rw-r--r-- | drivers/ide/ide-atapi.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/drivers/ide/ide-atapi.c b/drivers/ide/ide-atapi.c index 12674e6519e6..61c52fb665ca 100644 --- a/drivers/ide/ide-atapi.c +++ b/drivers/ide/ide-atapi.c | |||
@@ -14,6 +14,53 @@ | |||
14 | #define debug_log(fmt, args...) do {} while (0) | 14 | #define debug_log(fmt, args...) do {} while (0) |
15 | #endif | 15 | #endif |
16 | 16 | ||
17 | /* | ||
18 | * Check whether we can support a device, | ||
19 | * based on the ATAPI IDENTIFY command results. | ||
20 | */ | ||
21 | int ide_check_atapi_device(ide_drive_t *drive, const char *s) | ||
22 | { | ||
23 | u16 *id = drive->id; | ||
24 | u8 gcw[2], protocol, device_type, removable, drq_type, packet_size; | ||
25 | |||
26 | *((u16 *)&gcw) = id[ATA_ID_CONFIG]; | ||
27 | |||
28 | protocol = (gcw[1] & 0xC0) >> 6; | ||
29 | device_type = gcw[1] & 0x1F; | ||
30 | removable = (gcw[0] & 0x80) >> 7; | ||
31 | drq_type = (gcw[0] & 0x60) >> 5; | ||
32 | packet_size = gcw[0] & 0x03; | ||
33 | |||
34 | #ifdef CONFIG_PPC | ||
35 | /* kludge for Apple PowerBook internal zip */ | ||
36 | if (drive->media == ide_floppy && device_type == 5 && | ||
37 | !strstr((char *)&id[ATA_ID_PROD], "CD-ROM") && | ||
38 | strstr((char *)&id[ATA_ID_PROD], "ZIP")) | ||
39 | device_type = 0; | ||
40 | #endif | ||
41 | |||
42 | if (protocol != 2) | ||
43 | printk(KERN_ERR "%s: %s: protocol (0x%02x) is not ATAPI\n", | ||
44 | s, drive->name, protocol); | ||
45 | else if ((drive->media == ide_floppy && device_type != 0) || | ||
46 | (drive->media == ide_tape && device_type != 1)) | ||
47 | printk(KERN_ERR "%s: %s: invalid device type (0x%02x)\n", | ||
48 | s, drive->name, device_type); | ||
49 | else if (removable == 0) | ||
50 | printk(KERN_ERR "%s: %s: the removable flag is not set\n", | ||
51 | s, drive->name); | ||
52 | else if (drive->media == ide_floppy && drq_type == 3) | ||
53 | printk(KERN_ERR "%s: %s: sorry, DRQ type (0x%02x) not " | ||
54 | "supported\n", s, drive->name, drq_type); | ||
55 | else if (packet_size != 0) | ||
56 | printk(KERN_ERR "%s: %s: packet size (0x%02x) is not 12 " | ||
57 | "bytes\n", s, drive->name, packet_size); | ||
58 | else | ||
59 | return 1; | ||
60 | return 0; | ||
61 | } | ||
62 | EXPORT_SYMBOL_GPL(ide_check_atapi_device); | ||
63 | |||
17 | /* TODO: unify the code thus making some arguments go away */ | 64 | /* TODO: unify the code thus making some arguments go away */ |
18 | ide_startstop_t ide_pc_intr(ide_drive_t *drive, struct ide_atapi_pc *pc, | 65 | ide_startstop_t ide_pc_intr(ide_drive_t *drive, struct ide_atapi_pc *pc, |
19 | ide_handler_t *handler, unsigned int timeout, ide_expiry_t *expiry, | 66 | ide_handler_t *handler, unsigned int timeout, ide_expiry_t *expiry, |