svn commit: r200481 - head/sys/dev/ata

Sam Leffler sam at errno.com
Sun Dec 13 11:44:14 PST 2009


Marius Strobl wrote:
> Author: marius
> Date: Sun Dec 13 18:26:19 2009
> New Revision: 200481
> URL: http://svn.freebsd.org/changeset/base/200481
> 
> Log:
>   Specify the capability and media bits of the capabilities page in
>   native, i.e. big-endian, format and convert as appropriate like we
>   also do with the multibyte fields of the other pages. This fixes
>   the output of acd_describe() to match reality on big-endian machines
>   without breaking it on little-endian ones. While at it, also convert
>   the remaining multibyte fields of the pages read although they are
>   currently unused for consistency and in order to prevent possible
>   similar bugs in the future.
>   
>   MFC after:	1 week
> 
> Modified:
>   head/sys/dev/ata/atapi-cd.c
>   head/sys/dev/ata/atapi-cd.h
> 
> Modified: head/sys/dev/ata/atapi-cd.c
> ==============================================================================
> --- head/sys/dev/ata/atapi-cd.c	Sun Dec 13 17:49:22 2009	(r200480)
> +++ head/sys/dev/ata/atapi-cd.c	Sun Dec 13 18:26:19 2009	(r200481)
> @@ -1206,6 +1206,7 @@ acd_read_track_info(device_t dev, int32_
>      if ((error = ata_atapicmd(dev, ccb, (caddr_t)info, sizeof(*info),
>  			      ATA_R_READ, 30)))
>  	return error;
> +    info->data_length = ntohs(info->data_length);
>      info->track_start_addr = ntohl(info->track_start_addr);
>      info->next_writeable_addr = ntohl(info->next_writeable_addr);
>      info->free_blocks = ntohl(info->free_blocks);
> @@ -1644,12 +1645,17 @@ acd_get_cap(device_t dev)
>      for (count = 0 ; count < 5 ; count++) {
>  	if (!ata_atapicmd(dev, ccb, (caddr_t)&cdp->cap, sizeof(cdp->cap),
>  			  ATA_R_READ | ATA_R_QUIET, 5)) {
> +	    cdp->cap.data_length = ntohs(cdp->cap.data_length);
> +	    cdp->cap.blk_desc_len = ntohs(cdp->cap.blk_desc_len);
> +	    cdp->cap.media = ntohs(cdp->cap.media);
> +	    cdp->cap.capabilities = ntohs(cdp->cap.capabilities);
>  	    cdp->cap.max_read_speed = ntohs(cdp->cap.max_read_speed);
> +	    cdp->cap.max_vol_levels = ntohs(cdp->cap.max_vol_levels);
> +	    cdp->cap.buf_size = ntohs(cdp->cap.buf_size);
>  	    cdp->cap.cur_read_speed = ntohs(cdp->cap.cur_read_speed);
>  	    cdp->cap.max_write_speed = ntohs(cdp->cap.max_write_speed);
>  	    cdp->cap.cur_write_speed = max(ntohs(cdp->cap.cur_write_speed),177);
> -	    cdp->cap.max_vol_levels = ntohs(cdp->cap.max_vol_levels);
> -	    cdp->cap.buf_size = ntohs(cdp->cap.buf_size);
> +	    cdp->cap.copy_protect_rev = ntohs(cdp->cap.copy_protect_rev);
>  	}
>      }
>  }

I don't think this should use ntoh* but instead use le*/be* macros.

Separately the ata code was very broken in it's handling of big-endian 
byte order; e.g. for arm I had to supply wrong bus space methods as a 
workaround.  Do these changes take this byte-order confusion into account?

	Sam


More information about the svn-src-head mailing list