[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: Richard Purdie <rpurdie@rpsys.net>
Acked-by: Bartlomiej Zolnierkiewicz <B.Zolnierkiewicz@elka.pw.edu.pl>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
This commit is contained in:
Richard Purdie 2006-02-03 03:04:55 -08:00 committed by Linus Torvalds
parent 3b6ce2497f
commit 9810933701
4 changed files with 9 additions and 50 deletions

View File

@ -889,11 +889,7 @@ static void idedisk_setup (ide_drive_t *drive)
if (drive->id_read == 0)
return;
/*
* 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)) {
if (drive->removable) {
/*
* Removable disks (eg. SYQUEST); ignore 'WD' drives
*/

View File

@ -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
* @drive: drive to identify
@ -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
*/
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;
if (drive_is_flashcard(drive))
drive->is_flash = 1;
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);
return;

View File

@ -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->max_failures = IDE_DEFAULT_MAX_FAILURES;
drive->using_dma = 0;
drive->is_flash = 0;
drive->vdma = 0;
INIT_LIST_HEAD(&drive->list);
init_completion(&drive->gendev_rel_comp);

View File

@ -582,7 +582,6 @@ typedef struct ide_drive_s {
unsigned noprobe : 1; /* from: hdx=noprobe */
unsigned removable : 1; /* 1 if need to do check_media_change */
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 no_unmask : 1; /* disallow setting unmask bit */
unsigned no_io_32bit : 1; /* disallow enabling 32bit I/O */