aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/oxnas/patches-3.18/999-libata-hacks.patch
diff options
context:
space:
mode:
authorJohn Crispin <john@openwrt.org>2014-12-10 15:51:07 +0000
committerJohn Crispin <john@openwrt.org>2014-12-10 15:51:07 +0000
commit9432cbd577561f047ff13da7519a0ba3a93a252e (patch)
treeb8e2e7ed5430f9616b04e71f75d001b321afcf76 /target/linux/oxnas/patches-3.18/999-libata-hacks.patch
parent1fa7c8587dda724dcd19294dc8932d790ec5acb3 (diff)
downloadupstream-9432cbd577561f047ff13da7519a0ba3a93a252e.tar.gz
upstream-9432cbd577561f047ff13da7519a0ba3a93a252e.tar.bz2
upstream-9432cbd577561f047ff13da7519a0ba3a93a252e.zip
oxnas: add support for 2nd S-ATA port to sata_oxnas driver
similar to mv_sata, use nr-ports attribute from device tree. import and adapt locking code from vendor GPL sources. add dma controller handling, it may be used in future to avoid full core resets similar to the vendor SDK's "progressive cleanup" function. this is still very dirty and aimed to first of all do things quite exactly like the reference code. and it somehow works. obviously there is lots of room for improvement :) Signed-off-by: Daniel Golle <daniel@makrotopia.org> SVN-Revision: 43598
Diffstat (limited to 'target/linux/oxnas/patches-3.18/999-libata-hacks.patch')
-rw-r--r--target/linux/oxnas/patches-3.18/999-libata-hacks.patch60
1 files changed, 60 insertions, 0 deletions
diff --git a/target/linux/oxnas/patches-3.18/999-libata-hacks.patch b/target/linux/oxnas/patches-3.18/999-libata-hacks.patch
new file mode 100644
index 0000000000..39d9e51cf0
--- /dev/null
+++ b/target/linux/oxnas/patches-3.18/999-libata-hacks.patch
@@ -0,0 +1,60 @@
+Index: linux-3.18-rc7/drivers/ata/libata-core.c
+===================================================================
+--- linux-3.18-rc7.orig/drivers/ata/libata-core.c
++++ linux-3.18-rc7/drivers/ata/libata-core.c
+@@ -1568,6 +1568,14 @@ unsigned ata_exec_internal_sg(struct ata
+ return AC_ERR_SYSTEM;
+ }
+
++ if (ap->ops->acquire_hw && !ap->ops->acquire_hw(ap->port_no, 0, 0)) {
++ spin_unlock_irqrestore(ap->lock, flags);
++ if (!ap->ops->acquire_hw(ap->port_no, 1, (2*HZ))) {
++ return AC_ERR_TIMEOUT;
++ }
++ spin_lock_irqsave(ap->lock, flags);
++ }
++
+ /* initialize internal qc */
+
+ /* XXX: Tag 0 is used for drivers with legacy EH as some
+@@ -4739,6 +4747,9 @@ static struct ata_queued_cmd *ata_qc_new
+ if (unlikely(ap->pflags & ATA_PFLAG_FROZEN))
+ return NULL;
+
++ if (ap->ops->qc_new && ap->ops->qc_new(ap))
++ return NULL;
++
+ for (i = 0, tag = ap->last_tag + 1; i < max_queue; i++, tag++) {
+ tag = tag < max_queue ? tag : 0;
+
+@@ -4805,6 +4816,8 @@ void ata_qc_free(struct ata_queued_cmd *
+ if (likely(ata_tag_valid(tag))) {
+ qc->tag = ATA_TAG_POISON;
+ clear_bit(tag, &ap->qc_allocated);
++ if (ap->ops->qc_free)
++ ap->ops->qc_free(qc);
+ }
+ }
+
+Index: linux-3.18-rc7/include/linux/libata.h
+===================================================================
+--- linux-3.18-rc7.orig/include/linux/libata.h
++++ linux-3.18-rc7/include/linux/libata.h
+@@ -884,6 +884,8 @@ struct ata_port_operations {
+ void (*qc_prep)(struct ata_queued_cmd *qc);
+ unsigned int (*qc_issue)(struct ata_queued_cmd *qc);
+ bool (*qc_fill_rtf)(struct ata_queued_cmd *qc);
++ int (*qc_new)(struct ata_port *ap);
++ void (*qc_free)(struct ata_queued_cmd *qc);
+
+ /*
+ * Configuration and exception handling
+@@ -974,6 +976,8 @@ struct ata_port_operations {
+ void (*phy_reset)(struct ata_port *ap);
+ void (*eng_timeout)(struct ata_port *ap);
+
++ int (*acquire_hw)(int port_no, int may_sleep, int timeout_jiffies);
++
+ /*
+ * ->inherits must be the last field and all the preceding
+ * fields must be pointers.