+ htirq-allow-buggy-drivers-of-buggy-hardware-to-write-the-registers.patch added to -mm tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The patch titled
     htirq: allow buggy drivers of buggy hardware to write the registers
has been added to the -mm tree.  Its filename is
     htirq-allow-buggy-drivers-of-buggy-hardware-to-write-the-registers.patch

See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find
out what to do about this

------------------------------------------------------
Subject: htirq: allow buggy drivers of buggy hardware to write the registers
From: Eric W. Biederman <ebiederm@xxxxxxxxxxxx>

This patch adds a variant of ht_create_irq __ht_create_irq that takes an
aditional parameter update that is a function that is called whenever we want
to write to a drivers htirq configuration registers.

This is needed to support the ipath_iba6110 because it's registers in the
proper location are not actually conected to the hardware that controlls
interrupt delivery.

Signed-off-by: Eric W. Biederman <ebiederm@xxxxxxxxxxxx>
Cc: Andi Kleen <ak@xxxxxxx>
Cc: <olson@xxxxxxxxxxxxx>
Cc: Bryan O'Sullivan <bos@xxxxxxxxxxxxx>
Cc: Roland Dreier <rolandd@xxxxxxxxx>
Signed-off-by: Andrew Morton <akpm@xxxxxxxx>
---

 drivers/pci/htirq.c   |   46 ++++++++++++++++++++++++++++------------
 include/linux/htirq.h |    4 +++
 2 files changed, 37 insertions(+), 13 deletions(-)

diff -puN drivers/pci/htirq.c~htirq-allow-buggy-drivers-of-buggy-hardware-to-write-the-registers drivers/pci/htirq.c
--- a/drivers/pci/htirq.c~htirq-allow-buggy-drivers-of-buggy-hardware-to-write-the-registers
+++ a/drivers/pci/htirq.c
@@ -25,6 +25,8 @@ static DEFINE_SPINLOCK(ht_irq_lock);
 
 struct ht_irq_cfg {
 	struct pci_dev *dev;
+	 /* Update callback used to cope with buggy hardware */
+	ht_irq_update_t *update;
 	unsigned pos;
 	unsigned idx;
 	struct ht_irq_msg msg;
@@ -36,14 +38,17 @@ void write_ht_irq_msg(unsigned int irq, 
 	struct ht_irq_cfg *cfg = get_irq_data(irq);
 	unsigned long flags;
 	spin_lock_irqsave(&ht_irq_lock, flags);
-	if (cfg->msg.address_lo != msg->address_lo) {
-		pci_write_config_byte(cfg->dev, cfg->pos + 2, cfg->idx);
-		pci_write_config_dword(cfg->dev, cfg->pos + 4, msg->address_lo);
-	}
-	if (cfg->msg.address_hi != msg->address_hi) {
-		pci_write_config_byte(cfg->dev, cfg->pos + 2, cfg->idx + 1);
-		pci_write_config_dword(cfg->dev, cfg->pos + 4, msg->address_hi);
-	}
+	if (!likely(cfg->update)) {
+		if (cfg->msg.address_lo != msg->address_lo) {
+			pci_write_config_byte(cfg->dev, cfg->pos + 2, cfg->idx);
+			pci_write_config_dword(cfg->dev, cfg->pos + 4, msg->address_lo);
+		}
+		if (cfg->msg.address_hi != msg->address_hi) {
+			pci_write_config_byte(cfg->dev, cfg->pos + 2, cfg->idx + 1);
+			pci_write_config_dword(cfg->dev, cfg->pos + 4, msg->address_hi);
+		}
+	} else
+		cfg->update(irq, msg);
 	spin_unlock_irqrestore(&ht_irq_lock, flags);
 	cfg->msg = *msg;
 }
@@ -79,16 +84,14 @@ void unmask_ht_irq(unsigned int irq)
 }
 
 /**
- * ht_create_irq - create an irq and attach it to a device.
+ * __ht_create_irq - create an irq and attach it to a device.
  * @dev: The hypertransport device to find the irq capability on.
  * @idx: Which of the possible irqs to attach to.
- *
- * ht_create_irq is needs to be called for all hypertransport devices
- * that generate irqs.
+ * @update: Function to be called when changing the htirq message
  *
  * The irq number of the new irq or a negative error value is returned.
  */
-int ht_create_irq(struct pci_dev *dev, int idx)
+int __ht_create_irq(struct pci_dev *dev, int idx, ht_irq_update_t *update)
 {
 	struct ht_irq_cfg *cfg;
 	unsigned long flags;
@@ -123,6 +126,7 @@ int ht_create_irq(struct pci_dev *dev, i
 		return -ENOMEM;
 
 	cfg->dev = dev;
+	cfg->update = update;
 	cfg->pos = pos;
 	cfg->idx = 0x10 + (idx * 2);
 	/* Initialize msg to a value that will never match the first write. */
@@ -145,6 +149,21 @@ int ht_create_irq(struct pci_dev *dev, i
 }
 
 /**
+ * ht_create_irq - create an irq and attach it to a device.
+ * @dev: The hypertransport device to find the irq capability on.
+ * @idx: Which of the possible irqs to attach to.
+ *
+ * ht_create_irq needs to be called for all hypertransport devices
+ * that generate irqs.
+ *
+ * The irq number of the new irq or a negative error value is returned.
+ */
+int ht_create_irq(struct pci_dev *dev, int idx)
+{
+	return __ht_create_irq(dev, idx, NULL);
+}
+
+/**
  * ht_destroy_irq - destroy an irq created with ht_create_irq
  *
  * This reverses ht_create_irq removing the specified irq from
@@ -162,5 +181,6 @@ void ht_destroy_irq(unsigned int irq)
 	kfree(cfg);
 }
 
+EXPORT_SYMBOL(__ht_create_irq);
 EXPORT_SYMBOL(ht_create_irq);
 EXPORT_SYMBOL(ht_destroy_irq);
diff -puN include/linux/htirq.h~htirq-allow-buggy-drivers-of-buggy-hardware-to-write-the-registers include/linux/htirq.h
--- a/include/linux/htirq.h~htirq-allow-buggy-drivers-of-buggy-hardware-to-write-the-registers
+++ a/include/linux/htirq.h
@@ -15,4 +15,8 @@ void unmask_ht_irq(unsigned int irq);
 /* The arch hook for getting things started */
 int arch_setup_ht_irq(unsigned int irq, struct pci_dev *dev);
 
+/* For drivers of buggy hardware */
+typedef void (ht_irq_update_t)(int irq, struct ht_irq_msg *);
+int __ht_create_irq(struct pci_dev *dev, int idx, ht_irq_update_t *update);
+
 #endif /* LINUX_HTIRQ_H */
_

Patches currently in -mm which might be from ebiederm@xxxxxxxxxxxx are

improve-the-remove-sysctl-warnings.patch
sysctl-allow-a-zero-ctl_name-in-the-middle-of-a-sysctl-table.patch
sysctl-implement-ctl_unnumbered.patch
htirq-refactor-so-we-only-have-one-function-that-writes-to-the-chip.patch
htirq-allow-buggy-drivers-of-buggy-hardware-to-write-the-registers.patch
add-process_session-helper-routine.patch
rename-struct-namespace-to-struct-mnt_namespace.patch
add-an-identifier-to-nsproxy.patch
rename-struct-pspace-to-struct-pid_namespace.patch
add-pid_namespace-to-nsproxy.patch
use-current-nsproxy-pid_ns.patch
add-child-reaper-to-pid_namespace.patch
rename-struct-namespace-to-struct-mnt_namespace-cachefiles.patch
pidhash-temporary-debug-checks.patch

-
To unsubscribe from this list: send the line "unsubscribe mm-commits" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Kernel Newbies FAQ]     [Kernel Archive]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [Bugtraq]     [Photo]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]

  Powered by Linux