]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blame - src/patches/suse-2.6.27.31/patches.drivers/libata-sata_via-load-DEVICE-register-when-CTL-changes
Move xen patchset to new version's subdir.
[people/pmueller/ipfire-2.x.git] / src / patches / suse-2.6.27.31 / patches.drivers / libata-sata_via-load-DEVICE-register-when-CTL-changes
CommitLineData
00e5a55c
BS
1From b78152e9dbab6d6175e2adcbd8c62959e8f0f922 Mon Sep 17 00:00:00 2001
2From: Tejun Heo <tj@kernel.org>
3Date: Wed, 22 Oct 2008 00:45:57 +0900
4Subject: [PATCH] sata_via: load DEVICE register when CTL changes
5References: bnc#441718
6
7VIA controllers clear DEVICE register when IEN changes. Make sure
8DEVICE is updated along with CTL.
9
10This change is separated from Joseph Chan's larger patch.
11
12 http://thread.gmane.org/gmane.linux.kernel.commits.mm/40640
13
14Signed-off-by: Tejun Heo <tj@kernel.org>
15Cc: Joseph Chan <JosephChan@via.com.tw>
16Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
17Signed-off-by: Tejun Heo <teheo@suse.de>
18---
19 drivers/ata/sata_via.c | 35 ++++++++++++++++++++++++++++++++---
20 1 files changed, 32 insertions(+), 3 deletions(-)
21
22diff --git a/drivers/ata/sata_via.c b/drivers/ata/sata_via.c
23index 1cfa745..5b72e73 100644
24--- a/drivers/ata/sata_via.c
25+++ b/drivers/ata/sata_via.c
26@@ -70,6 +70,7 @@ enum {
27 static int svia_init_one(struct pci_dev *pdev, const struct pci_device_id *ent);
28 static int svia_scr_read(struct ata_link *link, unsigned int sc_reg, u32 *val);
29 static int svia_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val);
30+static void svia_tf_load(struct ata_port *ap, const struct ata_taskfile *tf);
31 static void svia_noop_freeze(struct ata_port *ap);
32 static int vt6420_prereset(struct ata_link *link, unsigned long deadline);
33 static int vt6421_pata_cable_detect(struct ata_port *ap);
34@@ -103,21 +104,26 @@ static struct scsi_host_template svia_sht = {
35 ATA_BMDMA_SHT(DRV_NAME),
36 };
37
38-static struct ata_port_operations vt6420_sata_ops = {
39+static struct ata_port_operations svia_base_ops = {
40 .inherits = &ata_bmdma_port_ops,
41+ .sff_tf_load = svia_tf_load,
42+};
43+
44+static struct ata_port_operations vt6420_sata_ops = {
45+ .inherits = &svia_base_ops,
46 .freeze = svia_noop_freeze,
47 .prereset = vt6420_prereset,
48 };
49
50 static struct ata_port_operations vt6421_pata_ops = {
51- .inherits = &ata_bmdma_port_ops,
52+ .inherits = &svia_base_ops,
53 .cable_detect = vt6421_pata_cable_detect,
54 .set_piomode = vt6421_set_pio_mode,
55 .set_dmamode = vt6421_set_dma_mode,
56 };
57
58 static struct ata_port_operations vt6421_sata_ops = {
59- .inherits = &ata_bmdma_port_ops,
60+ .inherits = &svia_base_ops,
61 .scr_read = svia_scr_read,
62 .scr_write = svia_scr_write,
63 };
64@@ -168,6 +174,29 @@ static int svia_scr_write(struct ata_link *link, unsigned int sc_reg, u32 val)
65 return 0;
66 }
67
68+/**
69+ * svia_tf_load - send taskfile registers to host controller
70+ * @ap: Port to which output is sent
71+ * @tf: ATA taskfile register set
72+ *
73+ * Outputs ATA taskfile to standard ATA host controller.
74+ *
75+ * This is to fix the internal bug of via chipsets, which will
76+ * reset the device register after changing the IEN bit on ctl
77+ * register.
78+ */
79+static void svia_tf_load(struct ata_port *ap, const struct ata_taskfile *tf)
80+{
81+ struct ata_taskfile ttf;
82+
83+ if (tf->ctl != ap->last_ctl) {
84+ ttf = *tf;
85+ ttf.flags |= ATA_TFLAG_DEVICE;
86+ tf = &ttf;
87+ }
88+ ata_sff_tf_load(ap, tf);
89+}
90+
91 static void svia_noop_freeze(struct ata_port *ap)
92 {
93 /* Some VIA controllers choke if ATA_NIEN is manipulated in
94--
951.5.4.5
96