]> git.ipfire.org Git - thirdparty/kernel/stable.git/blobdiff - drivers/net/ethernet/chelsio/cxgb4/t4_hw.c
cxgb4: Addded support in debugfs to dump CIM outbound queue content
[thirdparty/kernel/stable.git] / drivers / net / ethernet / chelsio / cxgb4 / t4_hw.c
index 4ea4a4a9c4261fa1f72d4809432c29f2da416b3d..a3d2f31439c4e347229950844d631ff086ffa981 100644 (file)
@@ -4567,6 +4567,49 @@ int t4_read_cim_ibq(struct adapter *adap, unsigned int qid, u32 *data, size_t n)
        return i;
 }
 
+/**
+ *     t4_read_cim_obq - read the contents of a CIM outbound queue
+ *     @adap: the adapter
+ *     @qid: the queue index
+ *     @data: where to store the queue contents
+ *     @n: capacity of @data in 32-bit words
+ *
+ *     Reads the contents of the selected CIM queue starting at address 0 up
+ *     to the capacity of @data.  @n must be a multiple of 4.  Returns < 0 on
+ *     error and the number of 32-bit words actually read on success.
+ */
+int t4_read_cim_obq(struct adapter *adap, unsigned int qid, u32 *data, size_t n)
+{
+       int i, err;
+       unsigned int addr, v, nwords;
+       int cim_num_obq = is_t4(adap->params.chip) ?
+                               CIM_NUM_OBQ : CIM_NUM_OBQ_T5;
+
+       if ((qid > (cim_num_obq - 1)) || (n & 3))
+               return -EINVAL;
+
+       t4_write_reg(adap, CIM_QUEUE_CONFIG_REF_A, OBQSELECT_F |
+                    QUENUMSELECT_V(qid));
+       v = t4_read_reg(adap, CIM_QUEUE_CONFIG_CTRL_A);
+
+       addr = CIMQBASE_G(v) * 64;    /* muliple of 256 -> muliple of 4 */
+       nwords = CIMQSIZE_G(v) * 64;  /* same */
+       if (n > nwords)
+               n = nwords;
+
+       for (i = 0; i < n; i++, addr++) {
+               t4_write_reg(adap, CIM_OBQ_DBG_CFG_A, OBQDBGADDR_V(addr) |
+                            OBQDBGEN_F);
+               err = t4_wait_op_done(adap, CIM_OBQ_DBG_CFG_A, OBQDBGBUSY_F, 0,
+                                     2, 1);
+               if (err)
+                       return err;
+               *data++ = t4_read_reg(adap, CIM_OBQ_DBG_DATA_A);
+       }
+       t4_write_reg(adap, CIM_OBQ_DBG_CFG_A, 0);
+       return i;
+}
+
 /**
  *     t4_cim_read - read a block from CIM internal address space
  *     @adap: the adapter