Merge tag 'bitmap-for-5.19-rc1' of https://github.com/norov/linux
[platform/kernel/linux-starfive.git] / drivers / net / ethernet / marvell / octeontx2 / nic / otx2_pf.c
index 184e227..9106c35 100644 (file)
@@ -1254,6 +1254,7 @@ static irqreturn_t otx2_cq_intr_handler(int irq, void *cq_irq)
        otx2_write64(pf, NIX_LF_CINTX_ENA_W1C(qidx), BIT_ULL(0));
 
        /* Schedule NAPI */
+       pf->napi_events++;
        napi_schedule_irqoff(&cq_poll->napi);
 
        return IRQ_HANDLED;
@@ -1267,6 +1268,7 @@ static void otx2_disable_napi(struct otx2_nic *pf)
 
        for (qidx = 0; qidx < pf->hw.cint_cnt; qidx++) {
                cq_poll = &qset->napi[qidx];
+               cancel_work_sync(&cq_poll->dim.work);
                napi_disable(&cq_poll->napi);
                netif_napi_del(&cq_poll->napi);
        }
@@ -1546,6 +1548,24 @@ static void otx2_do_set_rx_mode(struct otx2_nic *pf)
        mutex_unlock(&pf->mbox.lock);
 }
 
+static void otx2_dim_work(struct work_struct *w)
+{
+       struct dim_cq_moder cur_moder;
+       struct otx2_cq_poll *cq_poll;
+       struct otx2_nic *pfvf;
+       struct dim *dim;
+
+       dim = container_of(w, struct dim, work);
+       cur_moder = net_dim_get_rx_moderation(dim->mode, dim->profile_ix);
+       cq_poll = container_of(dim, struct otx2_cq_poll, dim);
+       pfvf = (struct otx2_nic *)cq_poll->dev;
+       pfvf->hw.cq_time_wait = (cur_moder.usec > CQ_TIMER_THRESH_MAX) ?
+               CQ_TIMER_THRESH_MAX : cur_moder.usec;
+       pfvf->hw.cq_ecount_wait = (cur_moder.pkts > NAPI_POLL_WEIGHT) ?
+               NAPI_POLL_WEIGHT : cur_moder.pkts;
+       dim->state = DIM_START_MEASURE;
+}
+
 int otx2_open(struct net_device *netdev)
 {
        struct otx2_nic *pf = netdev_priv(netdev);
@@ -1612,6 +1632,8 @@ int otx2_open(struct net_device *netdev)
                        cq_poll->cq_ids[CQ_XDP] = CINT_INVALID_CQ;
 
                cq_poll->dev = (void *)pf;
+               cq_poll->dim.mode = DIM_CQ_PERIOD_MODE_START_FROM_CQE;
+               INIT_WORK(&cq_poll->dim.work, otx2_dim_work);
                netif_napi_add(netdev, &cq_poll->napi,
                               otx2_napi_handler, NAPI_POLL_WEIGHT);
                napi_enable(&cq_poll->napi);
@@ -1718,7 +1740,6 @@ err_free_cints:
        vec = pci_irq_vector(pf->pdev,
                             pf->hw.nix_msixoff + NIX_LF_QINT_VEC_START);
        otx2_write64(pf, NIX_LF_QINTX_ENA_W1C(0), BIT_ULL(0));
-       synchronize_irq(vec);
        free_irq(vec, pf);
 err_disable_napi:
        otx2_disable_napi(pf);
@@ -1762,7 +1783,6 @@ int otx2_stop(struct net_device *netdev)
        vec = pci_irq_vector(pf->pdev,
                             pf->hw.nix_msixoff + NIX_LF_QINT_VEC_START);
        otx2_write64(pf, NIX_LF_QINTX_ENA_W1C(0), BIT_ULL(0));
-       synchronize_irq(vec);
        free_irq(vec, pf);
 
        /* Cleanup CQ NAPI and IRQ */
@@ -1796,8 +1816,7 @@ int otx2_stop(struct net_device *netdev)
        kfree(qset->rq);
        kfree(qset->napi);
        /* Do not clear RQ/SQ ringsize settings */
-       memset((void *)qset + offsetof(struct otx2_qset, sqe_cnt), 0,
-              sizeof(*qset) - offsetof(struct otx2_qset, sqe_cnt));
+       memset_startat(qset, 0, sqe_cnt);
        return 0;
 }
 EXPORT_SYMBOL(otx2_stop);
@@ -2704,7 +2723,7 @@ static int otx2_probe(struct pci_dev *pdev, const struct pci_device_id *id)
 
        netdev->hw_features |= NETIF_F_LOOPBACK | NETIF_F_RXALL;
 
-       netif_set_gso_max_segs(netdev, OTX2_MAX_GSO_SEGS);
+       netif_set_tso_max_segs(netdev, OTX2_MAX_GSO_SEGS);
        netdev->watchdog_timeo = OTX2_TX_TIMEOUT;
 
        netdev->netdev_ops = &otx2_netdev_ops;