eal/linux: add interrupt counter size for vdev
[dpdk.git] / drivers / net / sfc / base / ef10_tx.c
index 59343a3..211d265 100644 (file)
 
 #if EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD
 
+#if EFSYS_OPT_QSTATS
+#define        EFX_TX_QSTAT_INCR(_etp, _stat)                                  \
+       do {                                                            \
+               (_etp)->et_stat[_stat]++;                               \
+       _NOTE(CONSTANTCONDITION)                                        \
+       } while (B_FALSE)
+#else
 #define        EFX_TX_QSTAT_INCR(_etp, _stat)
+#endif
 
 static __checkReturn   efx_rc_t
 efx_mcdi_init_txq(
@@ -59,7 +67,7 @@ efx_mcdi_init_txq(
            EFX_TXQ_NBUFS(enp->en_nic_cfg.enc_txq_max_ndescs));
 
        npages = EFX_TXQ_NBUFS(size);
-       if (npages > MC_CMD_INIT_TXQ_IN_DMA_ADDR_MAXNUM) {
+       if (MC_CMD_INIT_TXQ_IN_LEN(npages) > sizeof (payload)) {
                rc = EINVAL;
                goto fail1;
        }
@@ -140,7 +148,7 @@ efx_mcdi_fini_txq(
 
        efx_mcdi_execute_quiet(enp, &req);
 
-       if ((req.emr_rc != 0) && (req.emr_rc != MC_CMD_ERR_EALREADY)) {
+       if (req.emr_rc != 0) {
                rc = req.emr_rc;
                goto fail1;
        }
@@ -148,7 +156,12 @@ efx_mcdi_fini_txq(
        return (0);
 
 fail1:
-       EFSYS_PROBE1(fail1, efx_rc_t, rc);
+       /*
+        * EALREADY is not an error, but indicates that the MC has rebooted and
+        * that the TXQ has already been destroyed.
+        */
+       if (rc != EALREADY)
+               EFSYS_PROBE1(fail1, efx_rc_t, rc);
 
        return (rc);
 }
@@ -274,9 +287,9 @@ ef10_tx_qpio_enable(
 fail3:
        EFSYS_PROBE(fail3);
        ef10_nic_pio_free(enp, etp->et_pio_bufnum, etp->et_pio_blknum);
-       etp->et_pio_size = 0;
 fail2:
        EFSYS_PROBE(fail2);
+       etp->et_pio_size = 0;
 fail1:
        EFSYS_PROBE1(fail1, efx_rc_t, rc);
 
@@ -427,8 +440,9 @@ ef10_tx_qpost(
                size_t offset;
                efx_qword_t qword;
 
-               /* Fragments must not span 4k boundaries. */
-               EFSYS_ASSERT(P2ROUNDUP(addr + 1, 4096) >= (addr + size));
+               /* No limitations on boundary crossing */
+               EFSYS_ASSERT(size <=
+                   etp->et_enp->en_nic_cfg.enc_tx_dma_desc_size_max);
 
                id = added++ & etp->et_mask;
                offset = id * sizeof (efx_qword_t);
@@ -543,8 +557,8 @@ ef10_tx_qdesc_dma_create(
        __in    boolean_t eop,
        __out   efx_desc_t *edp)
 {
-       /* Fragments must not span 4k boundaries. */
-       EFSYS_ASSERT(P2ROUNDUP(addr + 1, 4096) >= addr + size);
+       /* No limitations on boundary crossing */
+       EFSYS_ASSERT(size <= etp->et_enp->en_nic_cfg.enc_tx_dma_desc_size_max);
 
        EFSYS_PROBE4(tx_desc_dma_create, unsigned int, etp->et_index,
                    efsys_dma_addr_t, addr,
@@ -666,7 +680,14 @@ ef10_tx_qflush(
        return (0);
 
 fail1:
-       EFSYS_PROBE1(fail1, efx_rc_t, rc);
+       /*
+        * EALREADY is not an error, but indicates that the MC has rebooted and
+        * that the TXQ has already been destroyed. Callers need to know that
+        * the TXQ flush has completed to avoid waiting until timeout for a
+        * flush done event that will not be delivered.
+        */
+       if (rc != EALREADY)
+               EFSYS_PROBE1(fail1, efx_rc_t, rc);
 
        return (rc);
 }
@@ -680,4 +701,22 @@ ef10_tx_qenable(
        /* FIXME */
 }
 
+#if EFSYS_OPT_QSTATS
+                       void
+ef10_tx_qstats_update(
+       __in                            efx_txq_t *etp,
+       __inout_ecount(TX_NQSTATS)      efsys_stat_t *stat)
+{
+       unsigned int id;
+
+       for (id = 0; id < TX_NQSTATS; id++) {
+               efsys_stat_t *essp = &stat[id];
+
+               EFSYS_STAT_INCR(essp, etp->et_stat[id]);
+               etp->et_stat[id] = 0;
+       }
+}
+
+#endif /* EFSYS_OPT_QSTATS */
+
 #endif /* EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD */