linux-ide.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH resend] ide/libata: fix ata_id_is_cfa() (take 4)
@ 2009-02-01 16:46 Sergei Shtylyov
  2009-02-03  3:45 ` Jeff Garzik
  0 siblings, 1 reply; 2+ messages in thread
From: Sergei Shtylyov @ 2009-02-01 16:46 UTC (permalink / raw)
  To: bzolnier, jgarzik; +Cc: linux-ide, alan, gdu

When checking for the CFA feature set support, ata_id_is_cfa() tests bit 2 in
word 82 of the identify data instead the word 83;  it also checks the ATA/PI
version support in the word 80 (which the CompactFlash specifications have as
reserved), this having no slightest chance to work on the modern CF cards that
don't have 0x848A in the word 0...

Signed-off-by: Sergei Shtylyov <sshtylyov@ru.mvista.com>

---
Oops, caught the comment typos, resending... :-/
So, here's the fourth version of this simplistic patch in which I had to drop
the paranoid ATA version check since apparently not all cards follow the CF
specs in this respect and it seems wrong to blacklist a card that does report
CFA feature set support...

 include/linux/ata.h |   15 ++++++++++-----
 1 files changed, 10 insertions(+), 5 deletions(-)

Index: linux-2.6/include/linux/ata.h
===================================================================
--- linux-2.6.orig/include/linux/ata.h
+++ linux-2.6/include/linux/ata.h
@@ -731,12 +731,17 @@ static inline int ata_id_current_chs_val
 
 static inline int ata_id_is_cfa(const u16 *id)
 {
-	if (id[ATA_ID_CONFIG] == 0x848A)	/* Standard CF */
+	if (id[ATA_ID_CONFIG] == 0x848A)	/* Traditional CF */
 		return 1;
-	/* Could be CF hiding as standard ATA */
-	if (ata_id_major_version(id) >= 3 &&
-	    id[ATA_ID_COMMAND_SET_1] != 0xFFFF &&
-	   (id[ATA_ID_COMMAND_SET_1] & (1 << 2)))
+	/*
+	 * CF specs don't require specific value in the word 0 anymore and yet
+	 * they forbid to report the ATA version in the word 80 and require the
+	 * CFA feature set support to be indicated in the word 83 in this case.
+	 * Unfortunately, some cards only follow either of this requirements,
+	 * and while those that don't indicate CFA feature support need some
+	 * sort of quirk list, it seems impractical for the ones that do...
+	 */
+	if ((id[ATA_ID_COMMAND_SET_2] & 0xC004) == 0x4004)
 		return 1;
 	return 0;
 }


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: [PATCH resend] ide/libata: fix ata_id_is_cfa() (take 4)
  2009-02-01 16:46 [PATCH resend] ide/libata: fix ata_id_is_cfa() (take 4) Sergei Shtylyov
@ 2009-02-03  3:45 ` Jeff Garzik
  0 siblings, 0 replies; 2+ messages in thread
From: Jeff Garzik @ 2009-02-03  3:45 UTC (permalink / raw)
  To: Sergei Shtylyov, bzolnier; +Cc: linux-ide, alan, gdu

Sergei Shtylyov wrote:
> When checking for the CFA feature set support, ata_id_is_cfa() tests bit 2 in
> word 82 of the identify data instead the word 83;  it also checks the ATA/PI
> version support in the word 80 (which the CompactFlash specifications have as
> reserved), this having no slightest chance to work on the modern CF cards that
> don't have 0x848A in the word 0...
> 
> Signed-off-by: Sergei Shtylyov <sshtylyov@ru.mvista.com>
> 
> ---
> Oops, caught the comment typos, resending... :-/
> So, here's the fourth version of this simplistic patch in which I had to drop
> the paranoid ATA version check since apparently not all cards follow the CF
> specs in this respect and it seems wrong to blacklist a card that does report
> CFA feature set support...
> 
>  include/linux/ata.h |   15 ++++++++++-----
>  1 files changed, 10 insertions(+), 5 deletions(-)
> 
> Index: linux-2.6/include/linux/ata.h
> ===================================================================
> --- linux-2.6.orig/include/linux/ata.h
> +++ linux-2.6/include/linux/ata.h
> @@ -731,12 +731,17 @@ static inline int ata_id_current_chs_val
>  
>  static inline int ata_id_is_cfa(const u16 *id)
>  {
> -	if (id[ATA_ID_CONFIG] == 0x848A)	/* Standard CF */
> +	if (id[ATA_ID_CONFIG] == 0x848A)	/* Traditional CF */
>  		return 1;
> -	/* Could be CF hiding as standard ATA */
> -	if (ata_id_major_version(id) >= 3 &&
> -	    id[ATA_ID_COMMAND_SET_1] != 0xFFFF &&
> -	   (id[ATA_ID_COMMAND_SET_1] & (1 << 2)))
> +	/*
> +	 * CF specs don't require specific value in the word 0 anymore and yet
> +	 * they forbid to report the ATA version in the word 80 and require the
> +	 * CFA feature set support to be indicated in the word 83 in this case.
> +	 * Unfortunately, some cards only follow either of this requirements,
> +	 * and while those that don't indicate CFA feature support need some
> +	 * sort of quirk list, it seems impractical for the ones that do...
> +	 */
> +	if ((id[ATA_ID_COMMAND_SET_2] & 0xC004) == 0x4004)
>  		return 1;
>  	return 0;
>  }

applied to libata tree...


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2009-02-03  3:45 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-02-01 16:46 [PATCH resend] ide/libata: fix ata_id_is_cfa() (take 4) Sergei Shtylyov
2009-02-03  3:45 ` Jeff Garzik

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).