aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/ata
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/ata')
-rw-r--r--drivers/ata/libata-core.c13
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 @@
57#include <linux/scatterlist.h> 57#include <linux/scatterlist.h>
58#include <linux/io.h> 58#include <linux/io.h>
59#include <linux/async.h> 59#include <linux/async.h>
60#include <linux/log2.h>
60#include <scsi/scsi.h> 61#include <scsi/scsi.h>
61#include <scsi/scsi_cmnd.h> 62#include <scsi/scsi_cmnd.h>
62#include <scsi/scsi_host.h> 63#include <scsi/scsi_host.h>
@@ -2389,6 +2390,7 @@ int ata_dev_configure(struct ata_device *dev)
2389 dev->cylinders = 0; 2390 dev->cylinders = 0;
2390 dev->heads = 0; 2391 dev->heads = 0;
2391 dev->sectors = 0; 2392 dev->sectors = 0;
2393 dev->multi_count = 0;
2392 2394
2393 /* 2395 /*
2394 * common ATA, ATAPI feature tests 2396 * common ATA, ATAPI feature tests
@@ -2426,8 +2428,15 @@ int ata_dev_configure(struct ata_device *dev)
2426 2428
2427 dev->n_sectors = ata_id_n_sectors(id); 2429 dev->n_sectors = ata_id_n_sectors(id);
2428 2430
2429 if (dev->id[59] & 0x100) 2431 /* get current R/W Multiple count setting */
2430 dev->multi_count = dev->id[59] & 0xff; 2432 if ((dev->id[47] >> 8) == 0x80 && (dev->id[59] & 0x100)) {
2433 unsigned int max = dev->id[47] & 0xff;
2434 unsigned int cnt = dev->id[59] & 0xff;
2435 /* only recognize/allow powers of two here */
2436 if (is_power_of_2(max) && is_power_of_2(cnt))
2437 if (cnt <= max)
2438 dev->multi_count = cnt;
2439 }
2431 2440
2432 if (ata_id_has_lba(id)) { 2441 if (ata_id_has_lba(id)) {
2433 const char *lba_desc; 2442 const char *lba_desc;