net: thunderx: Add receive error stats reporting via ethtool
[cascardo/linux.git] / drivers / net / ethernet / cavium / thunder / nicvf_queues.c
index d69d228..4fc40d8 100644 (file)
@@ -103,9 +103,11 @@ static inline int nicvf_alloc_rcv_buffer(struct nicvf *nic, gfp_t gfp,
 
        /* Allocate a new page */
        if (!nic->rb_page) {
-               nic->rb_page = alloc_pages(gfp | __GFP_COMP, order);
+               nic->rb_page = alloc_pages(gfp | __GFP_COMP | __GFP_NOWARN,
+                                          order);
                if (!nic->rb_page) {
-                       netdev_err(nic->netdev, "Failed to allocate new rcv buffer\n");
+                       netdev_err(nic->netdev,
+                                  "Failed to allocate new rcv buffer\n");
                        return -ENOMEM;
                }
                nic->rb_page_offset = 0;
@@ -382,7 +384,8 @@ static void nicvf_free_snd_queue(struct nicvf *nic, struct snd_queue *sq)
                return;
 
        if (sq->tso_hdrs)
-               dma_free_coherent(&nic->pdev->dev, sq->dmem.q_len,
+               dma_free_coherent(&nic->pdev->dev,
+                                 sq->dmem.q_len * TSO_HEADER_SIZE,
                                  sq->tso_hdrs, sq->tso_hdrs_phys);
 
        kfree(sq->skbuff);
@@ -863,10 +866,11 @@ void nicvf_sq_free_used_descs(struct net_device *netdev, struct snd_queue *sq,
                        continue;
                }
                skb = (struct sk_buff *)sq->skbuff[sq->head];
+               if (skb)
+                       dev_kfree_skb_any(skb);
                atomic64_add(1, (atomic64_t *)&netdev->stats.tx_packets);
                atomic64_add(hdr->tot_len,
                             (atomic64_t *)&netdev->stats.tx_bytes);
-               dev_kfree_skb_any(skb);
                nicvf_put_sq_desc(sq, hdr->subdesc_cnt + 1);
        }
 }
@@ -992,7 +996,7 @@ static inline void nicvf_sq_add_gather_subdesc(struct snd_queue *sq, int qentry,
 
        memset(gather, 0, SND_QUEUE_DESC_SIZE);
        gather->subdesc_type = SQ_DESC_TYPE_GATHER;
-       gather->ld_type = NIC_SEND_LD_TYPE_E_LDWB;
+       gather->ld_type = NIC_SEND_LD_TYPE_E_LDD;
        gather->size = size;
        gather->addr = data;
 }
@@ -1048,7 +1052,7 @@ static int nicvf_sq_append_tso(struct nicvf *nic, struct snd_queue *sq,
                }
                nicvf_sq_add_hdr_subdesc(sq, hdr_qentry,
                                         seg_subdescs - 1, skb, seg_len);
-               sq->skbuff[hdr_qentry] = 0;
+               sq->skbuff[hdr_qentry] = (u64)NULL;
                qentry = nicvf_get_nxt_sqentry(sq, qentry);
 
                desc_cnt += seg_subdescs;
@@ -1062,6 +1066,7 @@ static int nicvf_sq_append_tso(struct nicvf *nic, struct snd_queue *sq,
        /* Inform HW to xmit all TSO segments */
        nicvf_queue_reg_write(nic, NIC_QSET_SQ_0_7_DOOR,
                              skb_get_queue_mapping(skb), desc_cnt);
+       nic->drv_stats.tx_tso++;
        return 1;
 }
 
@@ -1366,10 +1371,11 @@ void nicvf_update_sq_stats(struct nicvf *nic, int sq_idx)
 int nicvf_check_cqe_rx_errs(struct nicvf *nic,
                            struct cmp_queue *cq, struct cqe_rx_t *cqe_rx)
 {
-       struct cmp_queue_stats *stats = &cq->stats;
+       struct nicvf_hw_stats *stats = &nic->hw_stats;
+       struct nicvf_drv_stats *drv_stats = &nic->drv_stats;
 
        if (!cqe_rx->err_level && !cqe_rx->err_opcode) {
-               stats->rx.errop.good++;
+               drv_stats->rx_frames_ok++;
                return 0;
        }
 
@@ -1379,111 +1385,78 @@ int nicvf_check_cqe_rx_errs(struct nicvf *nic,
                           nic->netdev->name,
                           cqe_rx->err_level, cqe_rx->err_opcode);
 
-       switch (cqe_rx->err_level) {
-       case CQ_ERRLVL_MAC:
-               stats->rx.errlvl.mac_errs++;
-               break;
-       case CQ_ERRLVL_L2:
-               stats->rx.errlvl.l2_errs++;
-               break;
-       case CQ_ERRLVL_L3:
-               stats->rx.errlvl.l3_errs++;
-               break;
-       case CQ_ERRLVL_L4:
-               stats->rx.errlvl.l4_errs++;
-               break;
-       }
-
        switch (cqe_rx->err_opcode) {
        case CQ_RX_ERROP_RE_PARTIAL:
-               stats->rx.errop.partial_pkts++;
+               stats->rx_bgx_truncated_pkts++;
                break;
        case CQ_RX_ERROP_RE_JABBER:
-               stats->rx.errop.jabber_errs++;
+               stats->rx_jabber_errs++;
                break;
        case CQ_RX_ERROP_RE_FCS:
-               stats->rx.errop.fcs_errs++;
-               break;
-       case CQ_RX_ERROP_RE_TERMINATE:
-               stats->rx.errop.terminate_errs++;
+               stats->rx_fcs_errs++;
                break;
        case CQ_RX_ERROP_RE_RX_CTL:
-               stats->rx.errop.bgx_rx_errs++;
+               stats->rx_bgx_errs++;
                break;
        case CQ_RX_ERROP_PREL2_ERR:
-               stats->rx.errop.prel2_errs++;
-               break;
-       case CQ_RX_ERROP_L2_FRAGMENT:
-               stats->rx.errop.l2_frags++;
-               break;
-       case CQ_RX_ERROP_L2_OVERRUN:
-               stats->rx.errop.l2_overruns++;
-               break;
-       case CQ_RX_ERROP_L2_PFCS:
-               stats->rx.errop.l2_pfcs++;
-               break;
-       case CQ_RX_ERROP_L2_PUNY:
-               stats->rx.errop.l2_puny++;
+               stats->rx_prel2_errs++;
                break;
        case CQ_RX_ERROP_L2_MAL:
-               stats->rx.errop.l2_hdr_malformed++;
+               stats->rx_l2_hdr_malformed++;
                break;
        case CQ_RX_ERROP_L2_OVERSIZE:
-               stats->rx.errop.l2_oversize++;
+               stats->rx_oversize++;
                break;
        case CQ_RX_ERROP_L2_UNDERSIZE:
-               stats->rx.errop.l2_undersize++;
+               stats->rx_undersize++;
                break;
        case CQ_RX_ERROP_L2_LENMISM:
-               stats->rx.errop.l2_len_mismatch++;
+               stats->rx_l2_len_mismatch++;
                break;
        case CQ_RX_ERROP_L2_PCLP:
-               stats->rx.errop.l2_pclp++;
+               stats->rx_l2_pclp++;
                break;
        case CQ_RX_ERROP_IP_NOT:
-               stats->rx.errop.non_ip++;
+               stats->rx_ip_ver_errs++;
                break;
        case CQ_RX_ERROP_IP_CSUM_ERR:
-               stats->rx.errop.ip_csum_err++;
+               stats->rx_ip_csum_errs++;
                break;
        case CQ_RX_ERROP_IP_MAL:
-               stats->rx.errop.ip_hdr_malformed++;
+               stats->rx_ip_hdr_malformed++;
                break;
        case CQ_RX_ERROP_IP_MALD:
-               stats->rx.errop.ip_payload_malformed++;
+               stats->rx_ip_payload_malformed++;
                break;
        case CQ_RX_ERROP_IP_HOP:
-               stats->rx.errop.ip_hop_errs++;
-               break;
-       case CQ_RX_ERROP_L3_ICRC:
-               stats->rx.errop.l3_icrc_errs++;
+               stats->rx_ip_ttl_errs++;
                break;
        case CQ_RX_ERROP_L3_PCLP:
-               stats->rx.errop.l3_pclp++;
+               stats->rx_l3_pclp++;
                break;
        case CQ_RX_ERROP_L4_MAL:
-               stats->rx.errop.l4_malformed++;
+               stats->rx_l4_malformed++;
                break;
        case CQ_RX_ERROP_L4_CHK:
-               stats->rx.errop.l4_csum_errs++;
+               stats->rx_l4_csum_errs++;
                break;
        case CQ_RX_ERROP_UDP_LEN:
-               stats->rx.errop.udp_len_err++;
+               stats->rx_udp_len_errs++;
                break;
        case CQ_RX_ERROP_L4_PORT:
-               stats->rx.errop.bad_l4_port++;
+               stats->rx_l4_port_errs++;
                break;
        case CQ_RX_ERROP_TCP_FLAG:
-               stats->rx.errop.bad_tcp_flag++;
+               stats->rx_tcp_flag_errs++;
                break;
        case CQ_RX_ERROP_TCP_OFFSET:
-               stats->rx.errop.tcp_offset_errs++;
+               stats->rx_tcp_offset_errs++;
                break;
        case CQ_RX_ERROP_L4_PCLP:
-               stats->rx.errop.l4_pclp++;
+               stats->rx_l4_pclp++;
                break;
        case CQ_RX_ERROP_RBDR_TRUNC:
-               stats->rx.errop.pkt_truncated++;
+               stats->rx_truncated_pkts++;
                break;
        }