summaryrefslogtreecommitdiffstats
path: root/drivers/ntb/hw
diff options
context:
space:
mode:
authorSerge Semin <fancer.lancer@gmail.com>2018-07-17 05:24:36 -0400
committerJon Mason <jdmason@kudzu.us>2018-11-01 10:33:12 -0400
commitb8babacbae624da6d244d0721263edda56be3991 (patch)
treed52389c295510d0fdf3110927bad82f7d98b7210 /drivers/ntb/hw
parentaed1b7b31154bdd6f2fccca0ab5cf8a6fe2f52eb (diff)
ntb: idt: Discard temperature sensor IRQ handler
IDT PCIe-switch temperature sensor interface is very broken. First of all only a few combinations of TMPCTL threshold enable bits really cause the interrupts unmasked. Even if an individual bit indicates the event unmasked, corresponding IRQ just isn't generated. Most of the threshold enable bits combinations are in fact useless and non of them can help to create a fully functional alarm interface. So to speak, we can't create a well defined hwmon alarms based on the IDT PCI-switch threshold IRQs. Secondly a single threshold IRQ (not a combination of thresholds) can be successfully enabled without the issue described above. But in this case we experienced an enormous number of interrupts generated by the chip if the temperature got near the enabled threshold value. Filter adjustment didn't help much. It also doesn't provide a hysteresis settings. Due to the temperature sample fluctuations near the threshold the interrupts spate makes the system nearly unusable until the temperature value finally settled so being pushed either to be fully higher or lower the threshold. All of these issues makes the temperature sensor alarm interface useless and even at some point dangerous to be used in the driver. In this case it is safer to completely discard it and disable the temperature alarm interrupts. Signed-off-by: Serge Semin <fancer.lancer@gmail.com> Signed-off-by: Jon Mason <jdmason@kudzu.us>
Diffstat (limited to 'drivers/ntb/hw')
-rw-r--r--drivers/ntb/hw/idt/ntb_hw_idt.c41
-rw-r--r--drivers/ntb/hw/idt/ntb_hw_idt.h5
2 files changed, 3 insertions, 43 deletions
diff --git a/drivers/ntb/hw/idt/ntb_hw_idt.c b/drivers/ntb/hw/idt/ntb_hw_idt.c
index 19425a2c60cd..c4594a708b48 100644
--- a/drivers/ntb/hw/idt/ntb_hw_idt.c
+++ b/drivers/ntb/hw/idt/ntb_hw_idt.c
@@ -2075,38 +2075,6 @@ static struct attribute *idt_temp_attrs[] = {
2075ATTRIBUTE_GROUPS(idt_temp); 2075ATTRIBUTE_GROUPS(idt_temp);
2076 2076
2077/* 2077/*
2078 * idt_temp_isr() - temperature sensor alarm events ISR
2079 * @ndev: IDT NTB hardware driver descriptor
2080 * @ntint_sts: NT-function interrupt status
2081 *
2082 * It handles events of temperature crossing alarm thresholds. Since reading
2083 * of TMPALARM register clears it up, the function doesn't analyze the
2084 * read value, instead the current temperature value just warningly printed to
2085 * log.
2086 * The method is called from PCIe ISR bottom-half routine.
2087 */
2088static void idt_temp_isr(struct idt_ntb_dev *ndev, u32 ntint_sts)
2089{
2090 unsigned long mdeg;
2091
2092 /* Read the current temperature value */
2093 idt_read_temp(ndev, IDT_TEMP_CUR, &mdeg);
2094
2095 /* Read the temperature alarm to clean the alarm status out */
2096 /*(void)idt_sw_read(ndev, IDT_SW_TMPALARM);*/
2097
2098 /* Clean the corresponding interrupt bit */
2099 idt_nt_write(ndev, IDT_NT_NTINTSTS, IDT_NTINTSTS_TMPSENSOR);
2100
2101 dev_dbg(&ndev->ntb.pdev->dev,
2102 "Temp sensor IRQ detected %#08x", ntint_sts);
2103
2104 /* Print temperature value to log */
2105 dev_warn(&ndev->ntb.pdev->dev, "Temperature %hhd.%hhuC",
2106 idt_get_deg(mdeg), idt_get_deg_frac(mdeg));
2107}
2108
2109/*
2110 * idt_init_temp() - initialize temperature sensor interface 2078 * idt_init_temp() - initialize temperature sensor interface
2111 * @ndev: IDT NTB hardware driver descriptor 2079 * @ndev: IDT NTB hardware driver descriptor
2112 * 2080 *
@@ -2188,7 +2156,7 @@ static int idt_init_isr(struct idt_ntb_dev *ndev)
2188 goto err_free_vectors; 2156 goto err_free_vectors;
2189 } 2157 }
2190 2158
2191 /* Unmask Message/Doorbell/SE/Temperature interrupts */ 2159 /* Unmask Message/Doorbell/SE interrupts */
2192 ntint_mask = idt_nt_read(ndev, IDT_NT_NTINTMSK) & ~IDT_NTINTMSK_ALL; 2160 ntint_mask = idt_nt_read(ndev, IDT_NT_NTINTMSK) & ~IDT_NTINTMSK_ALL;
2193 idt_nt_write(ndev, IDT_NT_NTINTMSK, ntint_mask); 2161 idt_nt_write(ndev, IDT_NT_NTINTMSK, ntint_mask);
2194 2162
@@ -2203,7 +2171,6 @@ err_free_vectors:
2203 return ret; 2171 return ret;
2204} 2172}
2205 2173
2206
2207/* 2174/*
2208 * idt_deinit_ist() - deinitialize PCIe interrupt handler 2175 * idt_deinit_ist() - deinitialize PCIe interrupt handler
2209 * @ndev: IDT NTB hardware driver descriptor 2176 * @ndev: IDT NTB hardware driver descriptor
@@ -2264,12 +2231,6 @@ static irqreturn_t idt_thread_isr(int irq, void *devid)
2264 handled = true; 2231 handled = true;
2265 } 2232 }
2266 2233
2267 /* Handle temperature sensor interrupt */
2268 if (ntint_sts & IDT_NTINTSTS_TMPSENSOR) {
2269 idt_temp_isr(ndev, ntint_sts);
2270 handled = true;
2271 }
2272
2273 dev_dbg(&ndev->ntb.pdev->dev, "IDT IRQs 0x%08x handled", ntint_sts); 2234 dev_dbg(&ndev->ntb.pdev->dev, "IDT IRQs 0x%08x handled", ntint_sts);
2274 2235
2275 return handled ? IRQ_HANDLED : IRQ_NONE; 2236 return handled ? IRQ_HANDLED : IRQ_NONE;
diff --git a/drivers/ntb/hw/idt/ntb_hw_idt.h b/drivers/ntb/hw/idt/ntb_hw_idt.h
index 032f81cb4d44..3517cd2e2baa 100644
--- a/drivers/ntb/hw/idt/ntb_hw_idt.h
+++ b/drivers/ntb/hw/idt/ntb_hw_idt.h
@@ -688,15 +688,14 @@
688 * @IDT_NTINTMSK_DBELL: Doorbell interrupt mask bit 688 * @IDT_NTINTMSK_DBELL: Doorbell interrupt mask bit
689 * @IDT_NTINTMSK_SEVENT: Switch Event interrupt mask bit 689 * @IDT_NTINTMSK_SEVENT: Switch Event interrupt mask bit
690 * @IDT_NTINTMSK_TMPSENSOR: Temperature sensor interrupt mask bit 690 * @IDT_NTINTMSK_TMPSENSOR: Temperature sensor interrupt mask bit
691 * @IDT_NTINTMSK_ALL: All the useful interrupts mask 691 * @IDT_NTINTMSK_ALL: NTB-related interrupts mask
692 */ 692 */
693#define IDT_NTINTMSK_MSG 0x00000001U 693#define IDT_NTINTMSK_MSG 0x00000001U
694#define IDT_NTINTMSK_DBELL 0x00000002U 694#define IDT_NTINTMSK_DBELL 0x00000002U
695#define IDT_NTINTMSK_SEVENT 0x00000008U 695#define IDT_NTINTMSK_SEVENT 0x00000008U
696#define IDT_NTINTMSK_TMPSENSOR 0x00000080U 696#define IDT_NTINTMSK_TMPSENSOR 0x00000080U
697#define IDT_NTINTMSK_ALL \ 697#define IDT_NTINTMSK_ALL \
698 (IDT_NTINTMSK_MSG | IDT_NTINTMSK_DBELL | \ 698 (IDT_NTINTMSK_MSG | IDT_NTINTMSK_DBELL | IDT_NTINTMSK_SEVENT)
699 IDT_NTINTMSK_SEVENT | IDT_NTINTMSK_TMPSENSOR)
700 699
701/* 700/*
702 * NTGSIGNAL register fields related constants 701 * NTGSIGNAL register fields related constants