OSDN Git Service

ntb: idt: Discard temperature sensor IRQ handler
authorSerge Semin <fancer.lancer@gmail.com>
Tue, 17 Jul 2018 09:24:36 +0000 (12:24 +0300)
committerJon Mason <jdmason@kudzu.us>
Thu, 1 Nov 2018 14:33:12 +0000 (10:33 -0400)
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>
drivers/ntb/hw/idt/ntb_hw_idt.c
drivers/ntb/hw/idt/ntb_hw_idt.h

index 19425a2..c4594a7 100644 (file)
@@ -2075,38 +2075,6 @@ static struct attribute *idt_temp_attrs[] = {
 ATTRIBUTE_GROUPS(idt_temp);
 
 /*
- * idt_temp_isr() - temperature sensor alarm events ISR
- * @ndev:      IDT NTB hardware driver descriptor
- * @ntint_sts: NT-function interrupt status
- *
- * It handles events of temperature crossing alarm thresholds. Since reading
- * of TMPALARM register clears it up, the function doesn't analyze the
- * read value, instead the current temperature value just warningly printed to
- * log.
- * The method is called from PCIe ISR bottom-half routine.
- */
-static void idt_temp_isr(struct idt_ntb_dev *ndev, u32 ntint_sts)
-{
-       unsigned long mdeg;
-
-       /* Read the current temperature value */
-       idt_read_temp(ndev, IDT_TEMP_CUR, &mdeg);
-
-       /* Read the temperature alarm to clean the alarm status out */
-       /*(void)idt_sw_read(ndev, IDT_SW_TMPALARM);*/
-
-       /* Clean the corresponding interrupt bit */
-       idt_nt_write(ndev, IDT_NT_NTINTSTS, IDT_NTINTSTS_TMPSENSOR);
-
-       dev_dbg(&ndev->ntb.pdev->dev,
-               "Temp sensor IRQ detected %#08x", ntint_sts);
-
-       /* Print temperature value to log */
-       dev_warn(&ndev->ntb.pdev->dev, "Temperature %hhd.%hhuC",
-               idt_get_deg(mdeg), idt_get_deg_frac(mdeg));
-}
-
-/*
  * idt_init_temp() - initialize temperature sensor interface
  * @ndev:      IDT NTB hardware driver descriptor
  *
@@ -2188,7 +2156,7 @@ static int idt_init_isr(struct idt_ntb_dev *ndev)
                goto err_free_vectors;
        }
 
-       /* Unmask Message/Doorbell/SE/Temperature interrupts */
+       /* Unmask Message/Doorbell/SE interrupts */
        ntint_mask = idt_nt_read(ndev, IDT_NT_NTINTMSK) & ~IDT_NTINTMSK_ALL;
        idt_nt_write(ndev, IDT_NT_NTINTMSK, ntint_mask);
 
@@ -2203,7 +2171,6 @@ err_free_vectors:
        return ret;
 }
 
-
 /*
  * idt_deinit_ist() - deinitialize PCIe interrupt handler
  * @ndev:      IDT NTB hardware driver descriptor
@@ -2264,12 +2231,6 @@ static irqreturn_t idt_thread_isr(int irq, void *devid)
                handled = true;
        }
 
-       /* Handle temperature sensor interrupt */
-       if (ntint_sts & IDT_NTINTSTS_TMPSENSOR) {
-               idt_temp_isr(ndev, ntint_sts);
-               handled = true;
-       }
-
        dev_dbg(&ndev->ntb.pdev->dev, "IDT IRQs 0x%08x handled", ntint_sts);
 
        return handled ? IRQ_HANDLED : IRQ_NONE;
index 032f81c..3517cd2 100644 (file)
  * @IDT_NTINTMSK_DBELL:                Doorbell interrupt mask bit
  * @IDT_NTINTMSK_SEVENT:       Switch Event interrupt mask bit
  * @IDT_NTINTMSK_TMPSENSOR:    Temperature sensor interrupt mask bit
- * @IDT_NTINTMSK_ALL:          All the useful interrupts mask
+ * @IDT_NTINTMSK_ALL:          NTB-related interrupts mask
  */
 #define IDT_NTINTMSK_MSG               0x00000001U
 #define IDT_NTINTMSK_DBELL             0x00000002U
 #define IDT_NTINTMSK_SEVENT            0x00000008U
 #define IDT_NTINTMSK_TMPSENSOR         0x00000080U
 #define IDT_NTINTMSK_ALL \
-       (IDT_NTINTMSK_MSG | IDT_NTINTMSK_DBELL | \
-        IDT_NTINTMSK_SEVENT | IDT_NTINTMSK_TMPSENSOR)
+       (IDT_NTINTMSK_MSG | IDT_NTINTMSK_DBELL | IDT_NTINTMSK_SEVENT)
 
 /*
  * NTGSIGNAL register fields related constants