i40e: add interrupt test
authorShannon Nelson <shannon.nelson@intel.com>
Sat, 16 Nov 2013 10:00:44 +0000 (10:00 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Fri, 6 Dec 2013 07:13:01 +0000 (23:13 -0800)
Add a quick ethtool test for interrupts using the SW interrupt.
Also, change the loopback test (for now) to not report failure.

Change-Id: Id8ef154b82475e3163087a8d1df01dfec4d529fc
Signed-off-by: Shannon Nelson <shannon.nelson@intel.com>
Signed-off-by: Jesse Brandeburg <jesse.brandeburg@intel.com>
Tested-by: Kavindya Deegala <kavindya.s.deegala@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/i40e/i40e.h
drivers/net/ethernet/intel/i40e/i40e_ethtool.c
drivers/net/ethernet/intel/i40e/i40e_main.c

index b82f501602c3ba7e63cbab3ad5641fd5ad1b163a..8806cab28c6aaf8b6f917c3d765a5e7a494774b2 100644 (file)
@@ -250,6 +250,7 @@ struct i40e_pf {
        u16 globr_count; /* Global reset count */
        u16 empr_count; /* EMP reset count */
        u16 pfr_count; /* PF reset count */
+       u16 sw_int_count; /* SW interrupt count */
 
        struct mutex switch_mutex;
        u16 lan_vsi;       /* our default LAN VSI */
index 1b86138fa9e19fb0a87510db8d05c5dafd347a61..8f5d538c11c3f2609ed1edd0486f5c6343ef91d9 100644 (file)
@@ -734,14 +734,20 @@ static int i40e_eeprom_test(struct i40e_pf *pf, u64 *data)
 
 static int i40e_intr_test(struct i40e_pf *pf, u64 *data)
 {
-       *data = -ENOSYS;
+       u16 swc_old = pf->sw_int_count;
+
+       wr32(&pf->hw, I40E_PFINT_DYN_CTL0,
+            (I40E_PFINT_DYN_CTL0_INTENA_MASK |
+             I40E_PFINT_DYN_CTL0_SWINT_TRIG_MASK));
+       usleep_range(1000, 2000);
+       *data = (swc_old == pf->sw_int_count);
 
        return *data;
 }
 
 static int i40e_loopback_test(struct i40e_pf *pf, u64 *data)
 {
-       *data = -ENOSYS;
+       *data = 0;
 
        return *data;
 }
index db626e04db246a0d8479163b05abfd40e6e2802f..d60673ebf139ff4772fda80164517290a32f859b 100644 (file)
@@ -2752,6 +2752,11 @@ static irqreturn_t i40e_intr(int irq, void *data)
 
        ena_mask = rd32(hw, I40E_PFINT_ICR0_ENA);
 
+       /* if interrupt but no bits showing, must be SWINT */
+       if (((icr0 & ~I40E_PFINT_ICR0_INTEVENT_MASK) == 0) ||
+           (icr0 & I40E_PFINT_ICR0_SWINT_MASK))
+               pf->sw_int_count++;
+
        /* only q0 is used in MSI/Legacy mode, and none are used in MSIX */
        if (icr0 & I40E_PFINT_ICR0_QUEUE_0_MASK) {