 drivers/ata/libata-sff.c | 9 ++++++---
 drivers/ata/sata_sil.c   | 6 +++++-
 include/linux/libata.h   | 1 +
 3 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/drivers/ata/libata-sff.c b/drivers/ata/libata-sff.c
index b603720..d2bf5b3 100644
--- a/drivers/ata/libata-sff.c
+++ b/drivers/ata/libata-sff.c
@@ -1423,7 +1423,8 @@ unsigned int ata_sff_qc_issue(struct ata_queued_cmd *qc)
 	switch (qc->tf.protocol) {
 	case ATA_PROT_NODATA:
 		if (qc->tf.flags & ATA_TFLAG_POLLING)
-			ata_qc_set_polling(qc);
+      if (!(qc->tf.flags & ATA_TFLAG_POLLING_WITHOUT_NIEN))
+			  ata_qc_set_polling(qc);
 
 		ata_tf_to_host(ap, &qc->tf);
 		ap->hsm_task_state = HSM_ST_LAST;
@@ -1435,7 +1436,8 @@ unsigned int ata_sff_qc_issue(struct ata_queued_cmd *qc)
 
 	case ATA_PROT_PIO:
 		if (qc->tf.flags & ATA_TFLAG_POLLING)
-			ata_qc_set_polling(qc);
+      if (!(qc->tf.flags & ATA_TFLAG_POLLING_WITHOUT_NIEN))
+			  ata_qc_set_polling(qc);
 
 		ata_tf_to_host(ap, &qc->tf);
 
@@ -1465,7 +1467,8 @@ unsigned int ata_sff_qc_issue(struct ata_queued_cmd *qc)
 	case ATAPI_PROT_PIO:
 	case ATAPI_PROT_NODATA:
 		if (qc->tf.flags & ATA_TFLAG_POLLING)
-			ata_qc_set_polling(qc);
+      if (!(qc->tf.flags & ATA_TFLAG_POLLING_WITHOUT_NIEN))
+			  ata_qc_set_polling(qc);
 
 		ata_tf_to_host(ap, &qc->tf);
 
diff --git a/drivers/ata/sata_sil.c b/drivers/ata/sata_sil.c
index b7695e8..ff7cf51 100644
--- a/drivers/ata/sata_sil.c
+++ b/drivers/ata/sata_sil.c
@@ -336,8 +336,12 @@ static void sil_fill_sg(struct ata_queued_cmd *qc)
 
 static void sil_qc_prep(struct ata_queued_cmd *qc)
 {
-	if (!(qc->flags & ATA_QCFLAG_DMAMAP))
+  if (!(qc->flags & ATA_QCFLAG_DMAMAP)) {
+    // some devices (Intel s3500 series SSD drives) won't work in 
+    // polling mode on Sil3512 if the nIEN bit is enabled.
+    qc->tf.flags |= ATA_TFLAG_POLLING_WITHOUT_NIEN;
 		return;
+  }
 
 	sil_fill_sg(qc);
 }
diff --git a/include/linux/libata.h b/include/linux/libata.h
index bec6dbe..ecda27b 100644
--- a/include/linux/libata.h
+++ b/include/linux/libata.h
@@ -146,6 +146,7 @@ enum {
 	ATA_TFLAG_LBA		= (1 << 4), /* enable LBA */
 	ATA_TFLAG_FUA		= (1 << 5), /* enable FUA */
 	ATA_TFLAG_POLLING	= (1 << 6), /* set nIEN to 1 and use polling */
+  ATA_TFLAG_POLLING_WITHOUT_NIEN = (1 << 7), /* leave nIEN 0 while using polling */
 
 	/* protocol flags */
 	ATA_PROT_FLAG_PIO	= (1 << 0), /* is PIO */
