Hi Subhash, > -----Original Message----- > From: subhashj@xxxxxxxxxxxxxx [mailto:subhashj@xxxxxxxxxxxxxx] > Sent: Wednesday, March 09, 2011 11:35 PM > To: Nath, Arindam; cjb@xxxxxxxxxx > Cc: zhangfei.gao@xxxxxxxxx; prakity@xxxxxxxxxxx; linux- > mmc@xxxxxxxxxxxxxxx; Su, Henry; Lu, Aaron; anath.amd@xxxxxxxxx > Subject: RE: [PATCH v2 03/12] mmc: sd: query function modes for uhs > cards > > > > > -----Original Message----- > > From: linux-mmc-owner@xxxxxxxxxxxxxxx [mailto:linux-mmc- > > owner@xxxxxxxxxxxxxxx] On Behalf Of Nath, Arindam > > Sent: Wednesday, March 09, 2011 8:01 PM > > To: subhashj@xxxxxxxxxxxxxx; cjb@xxxxxxxxxx > > Cc: zhangfei.gao@xxxxxxxxx; prakity@xxxxxxxxxxx; linux- > > mmc@xxxxxxxxxxxxxxx; Su, Henry; Lu, Aaron; anath.amd@xxxxxxxxx > > Subject: RE: [PATCH v2 03/12] mmc: sd: query function modes for uhs > > cards > > > > Hi Subhash, > > > > > > > -----Original Message----- > > > From: subhashj@xxxxxxxxxxxxxx [mailto:subhashj@xxxxxxxxxxxxxx] > > > Sent: Wednesday, March 09, 2011 7:39 PM > > > To: Nath, Arindam; cjb@xxxxxxxxxx > > > Cc: zhangfei.gao@xxxxxxxxx; prakity@xxxxxxxxxxx; linux- > > > mmc@xxxxxxxxxxxxxxx; Su, Henry; Lu, Aaron; anath.amd@xxxxxxxxx > > > Subject: RE: [PATCH v2 03/12] mmc: sd: query function modes for uhs > > > cards > > > > > > > > > > > > > -----Original Message----- > > > > From: linux-mmc-owner@xxxxxxxxxxxxxxx [mailto:linux-mmc- > > > > owner@xxxxxxxxxxxxxxx] On Behalf Of Arindam Nath > > > > Sent: Friday, March 04, 2011 5:03 PM > > > > To: cjb@xxxxxxxxxx > > > > Cc: zhangfei.gao@xxxxxxxxx; prakity@xxxxxxxxxxx; > > > > subhashj@xxxxxxxxxxxxxx; linux-mmc@xxxxxxxxxxxxxxx; > > henry.su@xxxxxxx; > > > > aaron.lu@xxxxxxx; anath.amd@xxxxxxxxx; Arindam Nath > > > > Subject: [PATCH v2 03/12] mmc: sd: query function modes for uhs > > cards > > > > > > > > SD cards which conform to Physical Layer Spec v3.01 can support > > > > additional Bus Speed Modes, Driver Strength, and Current Limit > > > > other than the default values. We use CMD6 mode 0 to read these > > > > additional card functions. The values read here will be used > > > > during UHS-I initialization steps. > > > > > > > > Signed-off-by: Arindam Nath <arindam.nath@xxxxxxx> > > > > --- > > > > drivers/mmc/core/sd.c | 99 > > > > +++++++++++++++++++++++++++++++++++++++------- > > > > include/linux/mmc/card.h | 3 + > > > > 2 files changed, 87 insertions(+), 15 deletions(-) > > > > > > > > diff --git a/drivers/mmc/core/sd.c b/drivers/mmc/core/sd.c > > > > index 3e82599..a63956b 100644 > > > > --- a/drivers/mmc/core/sd.c > > > > +++ b/drivers/mmc/core/sd.c > > > > @@ -283,25 +283,94 @@ static int mmc_read_switch(struct mmc_card > > > *card) > > > > return -ENOMEM; > > > > } > > > > > > > > - err = mmc_sd_switch(card, 0, 0, 1, status); > > > > - if (err) { > > > > - /* If the host or the card can't do the switch, > > > > - * fail more gracefully. */ > > > > - if ((err != -EINVAL) > > > > - && (err != -ENOSYS) > > > > - && (err != -EFAULT)) > > > > + if (card->scr.sda_spec3) { > > > > + /* First find out the supported Bus Speed Modes. */ > > > > + err = mmc_sd_switch(card, 0, 0, 1, status); > > > Reading function-group-1 status applies for both SD3.0 and SD2.0 > > cards > > > as > > > well. With card->scr.sda_spec check, you are duplicating the same > > code > > > in > > > else part of it as well. You can optimize it to only one call to > > > mmc_sd_switch() to read function-group-1. > > > > Yes, there is a duplication of the code. I will try to minimize it in > > the next version. > > > > > > > > > + if (err) { > > > > + /* > > > > + * If the host or the card can't do the switch, > > > > + * fail more gracefully. > > > > + */ > > > > + if ((err != -EINVAL) > > > > + && (err != -ENOSYS) > > > > + && (err != -EFAULT)) > > > > + goto out; > > > > + > > > > + printk(KERN_WARNING "%s: problem reading " > > > > + "Bus Speed modes.\n", > > > > + mmc_hostname(card->host)); > > > > + err = 0; > > > > + > > > > goto out; > > > > + } > > > > > > > > - printk(KER N_WARNING "%s: problem reading switch " > > > > - "capabilities, performance might suffer.\n", > > > > - mmc_hostname(card->host)); > > > > - err = 0; > > > > + card->sw_caps.uhs_bus_mode = status[13]; > > > Is adding uhs* prefix is appropriate? If card supports SD3.0 spec > > means > > > card > > > have to support UHS modes? Can we have cards (SDXC?) which sets > SD3.0 > > > spec > > > bit in SCR but does not support any of the UHS modes. So in this > case > > > putting uhs* prefix might not be appropriate. > > > > As per Physical Layer Spec v3.01, UHS-I can be applied to SDHC and > SDXC > > cards. Cards which support UHS-I should have sda_spec3 set in the SCR > > register. Since we need to set the data rate depending on the exact > > UHS-I speed mode, I have prefixed the variable with uhs_ to make > things > > clear. > > UHS-I speed mode support is not a must condition to set SD_SPEC3 bit to > 1 in > SCR register: > This is what the spec says: > . Essential conditions to indicate Version 3.00 Card (SD_SPEC=2 and > SD_SPEC3=1) > (1) The card shall support CMD6 > (2) The card shall support CMD8 > (3) The card shall support CMD42 > (4) User area capacity shall be up to 2GB (SDSC) or 32GB (SDHC) > User area capacity shall be more than or equal to 32GB and up to 2TB > (SDXC) > (5) Speed Class shall be supported (SDHC or SDXC) > > Supporting UHS-I mode is an optional conditional. Thanks for the clarification. I will change the variable names as sd3_*. Arindam > > > > > Thanks, > > Arindam > > > > > > > > > > > > + > > > > + /* Find out Driver Strengths supported by the card */ > > > > + err = mmc_sd_switch(card, 0, 2, 1, status); > > > > + if (err) { > > > > + /* > > > > + * If the host or the card can't do the switch, > > > > + * fail more gracefully. > > > > + */ > > > > + if ((err != -EINVAL) > > > > + && (err != -ENOSYS) > > > > + && (err != -EFAULT)) > > > > + goto out; > > > > + > > > > + printk(KERN_WARNING "%s: problem reading " > > > > + "Driver Strength.\n", > > > > + mmc_hostname(card->host)); > > > > + err = 0; > > > > > > > > - goto out; > > > > - } > > > > + goto out; > > > > + } > > > > > > > > - if (status[13] & 0x02) > > > > - card->sw_caps.hs_max_dtr = 50000000; > > > > + card->sw_caps.uhs_drv_type = status[9]; > > > > + > > > > + /* Find out Current Limits supported by the card */ > > > > + err = mmc_sd_switch(card, 0, 3, 1, status); > > > > + if (err) { > > > > + /* > > > > + * If the host or the card can't do the switch, > > > > + * fail more gracefully. > > > > + */ > > > > + if ((err != -EINVAL) > > > > + && (err != -ENOSYS) > > > > + && (err != -EFAULT)) > > > > + goto out; > > > > + > > > > + printk(KERN_WARNING "%s: problem reading " > > > > + "Current Limit.\n", > > > > + mmc_hostname(card->host)); > > > > + err = 0; > > > > + > > > > + goto out; > > > > + } > > > > + > > > > + card->sw_caps.uhs_curr_limit = status[7]; > > > > + } else { > > > > + err = mmc_sd_switch(card, 0, 0, 1, status); > > > > + if (err) { > > > > + /* > > > > + * If the host or the card can't do the switch, > > > > + * fail more gracefully. > > > > + */ > > > > + if ((err != -EINVAL) > > > > + && (err != -ENOSYS) > > > > + && (err != -EFAULT)) > > > > + goto out; > > > > + > > > > + printk(KERN_WARNING "%s: problem reading switch > " > > > > + "capabilities, performance might > suffer.\n", > > > > + mmc_hostname(card->host)); > > > > + err = 0; > > > > + goto out; > > > > + } > > > > + > > > > + if (status[13] & 0x02) > > > > + card->sw_caps.hs_max_dtr = 50000000; > > > > + } > > > > > > > > out: > > > > kfree(status); > > > > diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h > > > > index 22b0335..7080f22 100644 > > > > --- a/include/linux/mmc/card.h > > > > +++ b/include/linux/mmc/card.h > > > > @@ -75,6 +75,9 @@ struct sd_ssr { > > > > > > > > struct sd_switch_caps { > > > > unsigned int hs_max_dtr; > > > > + unsigned int uhs_bus_mode; > > > > + unsigned int uhs_drv_type; > > > > + unsigned int uhs_curr_limit; > > > > }; > > > > > > > > struct sdio_cccr { > > > > -- > > > > 1.7.1 > > > > > > > > -- > > > > To unsubscribe from this list: send the line "unsubscribe linux- > > mmc" > > > in > > > > the body of a message to majordomo@xxxxxxxxxxxxxxx > > > > More majordomo info at http://vger.kernel.org/majordomo- > info.html > > > > > > > > > -- > > To unsubscribe from this list: send the line "unsubscribe linux-mmc" > in > > the body of a message to majordomo@xxxxxxxxxxxxxxx > > More majordomo info at http://vger.kernel.org/majordomo-info.html > -- To unsubscribe from this list: send the line "unsubscribe linux-mmc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html