From: Richard Purdie 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 Cc: Bartlomiej Zolnierkiewicz Cc: Alan Cox Signed-off-by: Andrew Morton --- drivers/ide/ide-disk.c | 6 ----- drivers/ide/ide-probe.c | 51 +++++++----------------------------------------- drivers/ide/ide.c | 1 include/linux/ide.h | 1 4 files changed, 9 insertions(+), 50 deletions(-) diff -puN drivers/ide/ide.c~stop-compactflash-devices-being-marked-as-removable drivers/ide/ide.c --- devel/drivers/ide/ide.c~stop-compactflash-devices-being-marked-as-removable 2005-12-22 05:10:05.000000000 -0800 +++ devel-akpm/drivers/ide/ide.c 2005-12-22 05:10:05.000000000 -0800 @@ -242,7 +242,6 @@ static void init_hwif_data(ide_hwif_t *h 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); sema_init(&drive->gendev_rel_sem, 0); diff -puN drivers/ide/ide-disk.c~stop-compactflash-devices-being-marked-as-removable drivers/ide/ide-disk.c --- devel/drivers/ide/ide-disk.c~stop-compactflash-devices-being-marked-as-removable 2005-12-22 05:10:05.000000000 -0800 +++ devel-akpm/drivers/ide/ide-disk.c 2005-12-22 05:10:05.000000000 -0800 @@ -895,11 +895,7 @@ static void idedisk_setup (ide_drive_t * 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 */ diff -puN drivers/ide/ide-probe.c~stop-compactflash-devices-being-marked-as-removable drivers/ide/ide-probe.c --- devel/drivers/ide/ide-probe.c~stop-compactflash-devices-being-marked-as-removable 2005-12-22 05:10:05.000000000 -0800 +++ devel-akpm/drivers/ide/ide-probe.c 2005-12-22 05:10:05.000000000 -0800 @@ -125,45 +125,6 @@ static void ide_disk_init_mult_count(ide } /** - * 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 * @cmd: command used @@ -278,13 +239,17 @@ static inline void do_identify (ide_driv /* * 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; diff -puN include/linux/ide.h~stop-compactflash-devices-being-marked-as-removable include/linux/ide.h --- devel/include/linux/ide.h~stop-compactflash-devices-being-marked-as-removable 2005-12-22 05:10:05.000000000 -0800 +++ devel-akpm/include/linux/ide.h 2005-12-22 05:10:05.000000000 -0800 @@ -581,7 +581,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 */ _