]> git.ipfire.org Git - thirdparty/kernel/stable.git/blobdiff - drivers/net/ethernet/chelsio/cxgb4/cxgb4_debugfs.c
cxgb4: add support for mirror Rxqs
[thirdparty/kernel/stable.git] / drivers / net / ethernet / chelsio / cxgb4 / cxgb4_debugfs.c
index b477b8842905dc275045ce6b05df5c2985e77748..05f33b7e3677ce6ebe5afb226b898bd1090824ab 100644 (file)
@@ -2742,6 +2742,58 @@ do { \
        }
 
        r -= eth_entries;
+       for_each_port(adap, j) {
+               struct port_info *pi = adap2pinfo(adap, j);
+               const struct sge_eth_rxq *rx;
+
+               mutex_lock(&pi->vi_mirror_mutex);
+               if (!pi->vi_mirror_count) {
+                       mutex_unlock(&pi->vi_mirror_mutex);
+                       continue;
+               }
+
+               if (r >= DIV_ROUND_UP(pi->nmirrorqsets, 4)) {
+                       r -= DIV_ROUND_UP(pi->nmirrorqsets, 4);
+                       mutex_unlock(&pi->vi_mirror_mutex);
+                       continue;
+               }
+
+               rx = &s->mirror_rxq[j][r * 4];
+               n = min(4, pi->nmirrorqsets - 4 * r);
+
+               S("QType:", "Mirror-Rxq");
+               S("Interface:",
+                 rx[i].rspq.netdev ? rx[i].rspq.netdev->name : "N/A");
+               R("RspQ ID:", rspq.abs_id);
+               R("RspQ size:", rspq.size);
+               R("RspQE size:", rspq.iqe_len);
+               R("RspQ CIDX:", rspq.cidx);
+               R("RspQ Gen:", rspq.gen);
+               S3("u", "Intr delay:", qtimer_val(adap, &rx[i].rspq));
+               S3("u", "Intr pktcnt:", s->counter_val[rx[i].rspq.pktcnt_idx]);
+               R("FL ID:", fl.cntxt_id);
+               R("FL size:", fl.size - 8);
+               R("FL pend:", fl.pend_cred);
+               R("FL avail:", fl.avail);
+               R("FL PIDX:", fl.pidx);
+               R("FL CIDX:", fl.cidx);
+               RL("RxPackets:", stats.pkts);
+               RL("RxCSO:", stats.rx_cso);
+               RL("VLANxtract:", stats.vlan_ex);
+               RL("LROmerged:", stats.lro_merged);
+               RL("LROpackets:", stats.lro_pkts);
+               RL("RxDrops:", stats.rx_drops);
+               RL("RxBadPkts:", stats.bad_rx_pkts);
+               RL("FLAllocErr:", fl.alloc_failed);
+               RL("FLLrgAlcErr:", fl.large_alloc_failed);
+               RL("FLMapErr:", fl.mapping_err);
+               RL("FLLow:", fl.low);
+               RL("FLStarving:", fl.starving);
+
+               mutex_unlock(&pi->vi_mirror_mutex);
+               goto out;
+       }
+
        if (!adap->tc_mqprio)
                goto skip_mqprio;
 
@@ -3098,9 +3150,10 @@ unlock:
        return 0;
 }
 
-static int sge_queue_entries(const struct adapter *adap)
+static int sge_queue_entries(struct adapter *adap)
 {
        int i, tot_uld_entries = 0, eohw_entries = 0, eosw_entries = 0;
+       int mirror_rxq_entries = 0;
 
        if (adap->tc_mqprio) {
                struct cxgb4_tc_port_mqprio *port_mqprio;
@@ -3123,6 +3176,15 @@ static int sge_queue_entries(const struct adapter *adap)
                mutex_unlock(&adap->tc_mqprio->mqprio_mutex);
        }
 
+       for_each_port(adap, i) {
+               struct port_info *pi = adap2pinfo(adap, i);
+
+               mutex_lock(&pi->vi_mirror_mutex);
+               if (pi->vi_mirror_count)
+                       mirror_rxq_entries += DIV_ROUND_UP(pi->nmirrorqsets, 4);
+               mutex_unlock(&pi->vi_mirror_mutex);
+       }
+
        if (!is_uld(adap))
                goto lld_only;
 
@@ -3137,7 +3199,7 @@ static int sge_queue_entries(const struct adapter *adap)
        mutex_unlock(&uld_mutex);
 
 lld_only:
-       return DIV_ROUND_UP(adap->sge.ethqsets, 4) +
+       return DIV_ROUND_UP(adap->sge.ethqsets, 4) + mirror_rxq_entries +
               eohw_entries + eosw_entries + tot_uld_entries +
               DIV_ROUND_UP(MAX_CTRL_QUEUES, 4) + 1;
 }