The patch titled htirq: allow buggy drivers of buggy hardware to write the registers has been removed from the -mm tree. Its filename was htirq-allow-buggy-drivers-of-buggy-hardware-to-write-the-registers.patch This patch was dropped because it was merged into mainline or a subsystem tree ------------------------------------------------------ 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. [bos@xxxxxxxxxxxxxx: fixes] Signed-off-by: Eric W. Biederman <ebiederm@xxxxxxxxxxxx> Cc: Andi Kleen <ak@xxxxxxx> Cc: <olson@xxxxxxxxxxxxx> Cc: Roland Dreier <rolandd@xxxxxxxxx> Signed-off-by: Bryan O'Sullivan <bryan.osullivan@xxxxxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxx> --- drivers/pci/htirq.c | 29 ++++++++++++++++++++++++----- include/linux/htirq.h | 5 +++++ 2 files changed, 29 insertions(+), 5 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; @@ -44,6 +46,8 @@ void write_ht_irq_msg(unsigned int irq, 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 (cfg->update) + cfg->update(cfg->dev, irq, msg); spin_unlock_irqrestore(&ht_irq_lock, flags); cfg->msg = *msg; } @@ -79,16 +83,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 +125,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 +148,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 +180,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,9 @@ 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)(struct pci_dev *dev, int irq, + struct ht_irq_msg *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 origin.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 clockevents-core-check-for-clock-event-device-handler-being-non-null-before-calling-it.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