svn commit: r222520 - head/sys/cam/ata

Goran Lowkrantz goran.lowkrantz at ismobile.com
Wed Aug 24 13:58:17 UTC 2011


--On May 31, 2011 9:22:52 +0000 Alexander Motin <mav at FreeBSD.org> wrote:

> Author: mav
> Date: Tue May 31 09:22:52 2011
> New Revision: 222520
> URL: http://svn.freebsd.org/changeset/base/222520
>
> Log:
>   Add quirks to hint 4K physical sector (Advanced Format) for ATA disks
> not   reporting it properly (none? of known disks now).
>
>   Hitachi and WDC AF disks seem could be identified more or less formally.
>   For Seagate and Samsung enumerate some found models/series.
>   For other disks it can be forced with kern.cam.ada.X.quirks=1 tunable.
>
> Modified:
>   head/sys/cam/ata/ata_da.c
>
> Modified: head/sys/cam/ata/ata_da.c
> =========================================================================
> ===== --- head/sys/cam/ata/ata_da.c	Tue May 31 07:13:07 2011	(r222519)
> +++ head/sys/cam/ata/ata_da.c	Tue May 31 09:22:52 2011	(r222520)
> @@ -89,7 +89,8 @@ typedef enum {
>  } ada_flags;
>
>  typedef enum {
> -	ADA_Q_NONE		= 0x00
> +	ADA_Q_NONE		= 0x00,
> +	ADA_Q_4K		= 0x01,
>  } ada_quirks;
>
>  typedef enum {
> @@ -154,6 +155,86 @@ struct ada_quirk_entry {
>  static struct ada_quirk_entry ada_quirk_table[] =
>  {
>  	{
> +		/* Hitachi Advanced Format (4k) drives */
> +		{ T_DIRECT, SIP_MEDIA_FIXED, "*", "Hitachi H??????????E3*", "*" },
> +		/*quirks*/ADA_Q_4K
> +	},
> +	{
> +		/* Samsung Advanced Format (4k) drives */
> +		{ T_DIRECT, SIP_MEDIA_FIXED, "*", "SAMSUNG HD204UI*", "*" },
> +		/*quirks*/ADA_Q_4K
> +	},
> +	{
> +		/* Seagate Barracuda Green Advanced Format (4k) drives */
> +		{ T_DIRECT, SIP_MEDIA_FIXED, "*", "ST????DL*", "*" },
> +		/*quirks*/ADA_Q_4K
> +	},
> +	{
> +		/* Seagate Momentus Advanced Format (4k) drives */
> +		{ T_DIRECT, SIP_MEDIA_FIXED, "*", "ST9500423AS*", "*" },
> +		/*quirks*/ADA_Q_4K
> +	},
> +	{
> +		/* Seagate Momentus Advanced Format (4k) drives */
> +		{ T_DIRECT, SIP_MEDIA_FIXED, "*", "ST9500424AS*", "*" },
> +		/*quirks*/ADA_Q_4K
> +	},
> +	{
> +		/* Seagate Momentus Advanced Format (4k) drives */
> +		{ T_DIRECT, SIP_MEDIA_FIXED, "*", "ST9750420AS*", "*" },
> +		/*quirks*/ADA_Q_4K
> +	},
> +	{
> +		/* Seagate Momentus Advanced Format (4k) drives */
> +		{ T_DIRECT, SIP_MEDIA_FIXED, "*", "ST9750422AS*", "*" },
> +		/*quirks*/ADA_Q_4K
> +	},
> +	{
> +		/* Seagate Momentus Thin Advanced Format (4k) drives */
> +		{ T_DIRECT, SIP_MEDIA_FIXED, "*", "ST???LT*", "*" },
> +		/*quirks*/ADA_Q_4K
> +	},
> +	{
> +		/* WDC Caviar Green Advanced Format (4k) drives */
> +		{ T_DIRECT, SIP_MEDIA_FIXED, "*", "WDC WD????RS*", "*" },
> +		/*quirks*/ADA_Q_4K
> +	},
> +	{
> +		/* WDC Caviar Green Advanced Format (4k) drives */
> +		{ T_DIRECT, SIP_MEDIA_FIXED, "*", "WDC WD????RX*", "*" },
> +		/*quirks*/ADA_Q_4K
> +	},
> +	{
> +		/* WDC Caviar Green Advanced Format (4k) drives */
> +		{ T_DIRECT, SIP_MEDIA_FIXED, "*", "WDC WD??????RS*", "*" },
> +		/*quirks*/ADA_Q_4K
> +	},
> +	{
> +		/* WDC Caviar Green Advanced Format (4k) drives */
> +		{ T_DIRECT, SIP_MEDIA_FIXED, "*", "WDC WD??????RX*", "*" },
> +		/*quirks*/ADA_Q_4K
> +	},
> +	{
> +		/* WDC Scorpio Black Advanced Format (4k) drives */
> +		{ T_DIRECT, SIP_MEDIA_FIXED, "*", "WDC WD???PKT*", "*" },
> +		/*quirks*/ADA_Q_4K
> +	},
> +	{
> +		/* WDC Scorpio Black Advanced Format (4k) drives */
> +		{ T_DIRECT, SIP_MEDIA_FIXED, "*", "WDC WD?????PKT*", "*" },
> +		/*quirks*/ADA_Q_4K
> +	},
> +	{
> +		/* WDC Scorpio Blue Advanced Format (4k) drives */
> +		{ T_DIRECT, SIP_MEDIA_FIXED, "*", "WDC WD???PVT*", "*" },
> +		/*quirks*/ADA_Q_4K
> +	},
> +	{
> +		/* WDC Scorpio Blue Advanced Format (4k) drives */
> +		{ T_DIRECT, SIP_MEDIA_FIXED, "*", "WDC WD?????PVT*", "*" },
> +		/*quirks*/ADA_Q_4K
> +	},
> +	{
>  		/* Default */
>  		{
>  		  T_ANY, SIP_MEDIA_REMOVABLE|SIP_MEDIA_FIXED,
> @@ -740,7 +821,7 @@ adaregister(struct cam_periph *periph, v
>  	struct disk_params *dp;
>  	caddr_t match;
>  	u_int maxio;
> -	int legacy_id;
> +	int legacy_id, quirks;
>
>  	cgd = (struct ccb_getdev *)arg;
>  	if (periph == NULL) {
> @@ -815,6 +896,11 @@ adaregister(struct cam_periph *periph, v
>  	 */
>  	(void)cam_periph_hold(periph, PRIBIO);
>  	mtx_unlock(periph->sim->mtx);
> +	snprintf(announce_buf, sizeof(announce_buf),
> +	    "kern.cam.ada.%d.quirks", periph->unit_number);
> +	quirks = softc->quirks;
> +	TUNABLE_INT_FETCH(announce_buf, &quirks);
> +	softc->quirks = quirks;
>  	softc->write_cache = -1;
>  	snprintf(announce_buf, sizeof(announce_buf),
>  	    "kern.cam.ada.%d.write_cache", periph->unit_number);
> @@ -870,6 +956,9 @@ adaregister(struct cam_periph *periph, v
>  		softc->disk->d_stripeoffset = (softc->disk->d_stripesize -
>  		    ata_logical_sector_offset(&cgd->ident_data)) %
>  		    softc->disk->d_stripesize;
> +	} else if (softc->quirks & ADA_Q_4K) {
> +		softc->disk->d_stripesize = 4096;
> +		softc->disk->d_stripeoffset = 0;
>  	}
>  	softc->disk->d_fwsectors = softc->params.secs_per_track;
>  	softc->disk->d_fwheads = softc->params.heads;
> _______________________________________________
> svn-src-all at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/svn-src-all
> To unsubscribe, send any mail to "svn-src-all-unsubscribe at freebsd.org"

Should this work with SAS/SATA cards like LSI 2008 (mps) too?

/glz

................................................... the future isMobile

  Goran Lowkrantz <goran.lowkrantz at ismobile.com>
  System Architect, isMobile AB
  Sandviksgatan 81, PO Box 58, S-971 03 Luleå, Sweden
  Mobile: +46(0)70-587 87 82
http://www.ismobile.com ...............................................


More information about the svn-src-all mailing list