提交 98109337 编写于 作者: R Richard Purdie 提交者: Linus Torvalds

[PATCH] stop CompactFlash devices being marked as removable

This patch stops CompactFlash devices being marked as removable.  They are
not removable (as defined by Linux) as the media and device are
inseparable.  When a card is removed, the whole device is removed from the
system and never sits in a media-less state.

This stops some nasty udev device creation/destruction loops.

Further, once this change is made, there is no need for ide to can be
removed from ide_drive_t.
Signed-off-by: NRichard Purdie <rpurdie@rpsys.net>
Acked-by: NBartlomiej Zolnierkiewicz <B.Zolnierkiewicz@elka.pw.edu.pl>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Signed-off-by: NAndrew Morton <akpm@osdl.org>
Signed-off-by: NLinus Torvalds <torvalds@osdl.org>
上级 3b6ce249
...@@ -889,11 +889,7 @@ static void idedisk_setup (ide_drive_t *drive) ...@@ -889,11 +889,7 @@ static void idedisk_setup (ide_drive_t *drive)
if (drive->id_read == 0) if (drive->id_read == 0)
return; return;
/* if (drive->removable) {
* CompactFlash cards and their brethern look just like hard drives
* to us, but they are removable and don't have a doorlock mechanism.
*/
if (drive->removable && !(drive->is_flash)) {
/* /*
* Removable disks (eg. SYQUEST); ignore 'WD' drives * Removable disks (eg. SYQUEST); ignore 'WD' drives
*/ */
......
...@@ -124,45 +124,6 @@ static void ide_disk_init_mult_count(ide_drive_t *drive) ...@@ -124,45 +124,6 @@ static void ide_disk_init_mult_count(ide_drive_t *drive)
} }
} }
/**
* drive_is_flashcard - check for compact flash
* @drive: drive to check
*
* CompactFlash cards and their brethern pretend to be removable
* hard disks, except:
* (1) they never have a slave unit, and
* (2) they don't have doorlock mechanisms.
* This test catches them, and is invoked elsewhere when setting
* appropriate config bits.
*
* FIXME: This treatment is probably applicable for *all* PCMCIA (PC CARD)
* devices, so in linux 2.3.x we should change this to just treat all
* PCMCIA drives this way, and get rid of the model-name tests below
* (too big of an interface change for 2.4.x).
* At that time, we might also consider parameterizing the timeouts and
* retries, since these are MUCH faster than mechanical drives. -M.Lord
*/
static inline int drive_is_flashcard (ide_drive_t *drive)
{
struct hd_driveid *id = drive->id;
if (drive->removable) {
if (id->config == 0x848a) return 1; /* CompactFlash */
if (!strncmp(id->model, "KODAK ATA_FLASH", 15) /* Kodak */
|| !strncmp(id->model, "Hitachi CV", 10) /* Hitachi */
|| !strncmp(id->model, "SunDisk SDCFB", 13) /* old SanDisk */
|| !strncmp(id->model, "SanDisk SDCFB", 13) /* SanDisk */
|| !strncmp(id->model, "HAGIWARA HPC", 12) /* Hagiwara */
|| !strncmp(id->model, "LEXAR ATA_FLASH", 15) /* Lexar */
|| !strncmp(id->model, "ATA_FLASH", 9)) /* Simple Tech */
{
return 1; /* yes, it is a flash memory card */
}
}
return 0; /* no, it is not a flash memory card */
}
/** /**
* do_identify - identify a drive * do_identify - identify a drive
* @drive: drive to identify * @drive: drive to identify
...@@ -278,13 +239,17 @@ static inline void do_identify (ide_drive_t *drive, u8 cmd) ...@@ -278,13 +239,17 @@ static inline void do_identify (ide_drive_t *drive, u8 cmd)
/* /*
* Not an ATAPI device: looks like a "regular" hard disk * Not an ATAPI device: looks like a "regular" hard disk
*/ */
if (id->config & (1<<7))
/*
* 0x848a = CompactFlash device
* These are *not* removable in Linux definition of the term
*/
if ((id->config != 0x848a) && (id->config & (1<<7)))
drive->removable = 1; drive->removable = 1;
if (drive_is_flashcard(drive))
drive->is_flash = 1;
drive->media = ide_disk; drive->media = ide_disk;
printk("%s DISK drive\n", (drive->is_flash) ? "CFA" : "ATA" ); printk("%s DISK drive\n", (id->config == 0x848a) ? "CFA" : "ATA" );
QUIRK_LIST(drive); QUIRK_LIST(drive);
return; return;
......
...@@ -242,7 +242,6 @@ static void init_hwif_data(ide_hwif_t *hwif, unsigned int index) ...@@ -242,7 +242,6 @@ static void init_hwif_data(ide_hwif_t *hwif, unsigned int index)
drive->name[2] = 'a' + (index * MAX_DRIVES) + unit; drive->name[2] = 'a' + (index * MAX_DRIVES) + unit;
drive->max_failures = IDE_DEFAULT_MAX_FAILURES; drive->max_failures = IDE_DEFAULT_MAX_FAILURES;
drive->using_dma = 0; drive->using_dma = 0;
drive->is_flash = 0;
drive->vdma = 0; drive->vdma = 0;
INIT_LIST_HEAD(&drive->list); INIT_LIST_HEAD(&drive->list);
init_completion(&drive->gendev_rel_comp); init_completion(&drive->gendev_rel_comp);
......
...@@ -582,7 +582,6 @@ typedef struct ide_drive_s { ...@@ -582,7 +582,6 @@ typedef struct ide_drive_s {
unsigned noprobe : 1; /* from: hdx=noprobe */ unsigned noprobe : 1; /* from: hdx=noprobe */
unsigned removable : 1; /* 1 if need to do check_media_change */ unsigned removable : 1; /* 1 if need to do check_media_change */
unsigned attach : 1; /* needed for removable devices */ unsigned attach : 1; /* needed for removable devices */
unsigned is_flash : 1; /* 1 if probed as flash */
unsigned forced_geom : 1; /* 1 if hdx=c,h,s was given at boot */ unsigned forced_geom : 1; /* 1 if hdx=c,h,s was given at boot */
unsigned no_unmask : 1; /* disallow setting unmask bit */ unsigned no_unmask : 1; /* disallow setting unmask bit */
unsigned no_io_32bit : 1; /* disallow enabling 32bit I/O */ unsigned no_io_32bit : 1; /* disallow enabling 32bit I/O */
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册