]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
crypto: octeontx2 - add timeout for load_fvc completion poll
authorBharat Bhushan <bbhushan2@marvell.com>
Thu, 22 May 2025 10:06:24 +0000 (15:36 +0530)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 13 Jun 2025 09:26:16 +0000 (17:26 +0800)
Adds timeout to exit from possible infinite loop, which polls
on CPT instruction(load_fvc) completion.

Signed-off-by: Srujana Challa <schalla@marvell.com>
Signed-off-by: Bharat Bhushan <bbhushan2@marvell.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/marvell/octeontx2/otx2_cptpf_ucode.c

index 78367849c3d5512a94223c00a7828353bbf8d1f5..9095dea2748d5e894d443fc469dbe039eb810b63 100644 (file)
@@ -1494,6 +1494,7 @@ int otx2_cpt_discover_eng_capabilities(struct otx2_cptpf_dev *cptpf)
        dma_addr_t rptr_baddr;
        struct pci_dev *pdev;
        u32 len, compl_rlen;
+       int timeout = 10000;
        int ret, etype;
        void *rptr;
 
@@ -1554,16 +1555,27 @@ int otx2_cpt_discover_eng_capabilities(struct otx2_cptpf_dev *cptpf)
                                                         etype);
                otx2_cpt_fill_inst(&inst, &iq_cmd, rptr_baddr);
                lfs->ops->send_cmd(&inst, 1, &cptpf->lfs.lf[0]);
+               timeout = 10000;
 
                while (lfs->ops->cpt_get_compcode(result) ==
-                                               OTX2_CPT_COMPLETION_CODE_INIT)
+                                               OTX2_CPT_COMPLETION_CODE_INIT) {
                        cpu_relax();
+                       udelay(1);
+                       timeout--;
+                       if (!timeout) {
+                               ret = -ENODEV;
+                               cptpf->is_eng_caps_discovered = false;
+                               dev_warn(&pdev->dev, "Timeout on CPT load_fvc completion poll\n");
+                               goto error_no_response;
+                       }
+               }
 
                cptpf->eng_caps[etype].u = be64_to_cpup(rptr);
        }
-       dma_unmap_single(&pdev->dev, rptr_baddr, len, DMA_BIDIRECTIONAL);
        cptpf->is_eng_caps_discovered = true;
 
+error_no_response:
+       dma_unmap_single(&pdev->dev, rptr_baddr, len, DMA_BIDIRECTIONAL);
 free_result:
        kfree(result);
 lf_cleanup: