diff options
| -rw-r--r-- | drivers/ata/libata-core.c | 13 | 
1 files changed, 11 insertions, 2 deletions
| diff --git a/drivers/ata/libata-core.c b/drivers/ata/libata-core.c index d4a7b8a96ecd..e7ea77cf6069 100644 --- a/drivers/ata/libata-core.c +++ b/drivers/ata/libata-core.c @@ -57,6 +57,7 @@  #include <linux/scatterlist.h>  #include <linux/io.h>  #include <linux/async.h> +#include <linux/log2.h>  #include <scsi/scsi.h>  #include <scsi/scsi_cmnd.h>  #include <scsi/scsi_host.h> @@ -2389,6 +2390,7 @@ int ata_dev_configure(struct ata_device *dev)  	dev->cylinders = 0;  	dev->heads = 0;  	dev->sectors = 0; +	dev->multi_count = 0;  	/*  	 * common ATA, ATAPI feature tests @@ -2426,8 +2428,15 @@ int ata_dev_configure(struct ata_device *dev)  		dev->n_sectors = ata_id_n_sectors(id); -		if (dev->id[59] & 0x100) -			dev->multi_count = dev->id[59] & 0xff; +		/* get current R/W Multiple count setting */ +		if ((dev->id[47] >> 8) == 0x80 && (dev->id[59] & 0x100)) { +			unsigned int max = dev->id[47] & 0xff; +			unsigned int cnt = dev->id[59] & 0xff; +			/* only recognize/allow powers of two here */ +			if (is_power_of_2(max) && is_power_of_2(cnt)) +				if (cnt <= max) +					dev->multi_count = cnt; +		}  		if (ata_id_has_lba(id)) {  			const char *lba_desc; | 
