NTB: ntb_perf: Clear stale values in doorbell and command SPAD register
authorSanjay R Mehta <sanju.mehta@amd.com>
Fri, 15 Feb 2019 09:21:19 +0000 (09:21 +0000)
committerJon Mason <jdmason@kudzu.us>
Thu, 13 Jun 2019 12:58:05 +0000 (08:58 -0400)
when ntb_perf is unloaded, the command scratchpad register still
retains the last initialized value of PERF_CMD_INVAL. When ntb_perf
is re-loaded and reads peer command scratchpad register and it mis
interprets the peer state as initialized.

To avoid this, clearing the local side command scratchpad register
in perf_disable_service

Signed-off-by: Sanjay R Mehta <sanju.mehta@amd.com>
Acked-by: Allen Hubbe <allenbh@gmail.com>
Acked-by: Logan Gunthorpe <logang@deltatee.com>
Acked-by: Serge Semin <fancer.lancer@gmail.com>
Signed-off-by: Jon Mason <jdmason@kudzu.us>
drivers/ntb/test/ntb_perf.c

index 32a70b6..d028331 100644 (file)
@@ -751,6 +751,14 @@ static void perf_disable_service(struct perf_ctx *perf)
        for (pidx = 0; pidx < perf->pcnt; pidx++)
                flush_work(&perf->peers[pidx].service);
 
+       for (pidx = 0; pidx < perf->pcnt; pidx++) {
+               struct perf_peer *peer = &perf->peers[pidx];
+
+               ntb_spad_write(perf->ntb, PERF_SPAD_CMD(peer->gidx), 0);
+       }
+
+       ntb_db_clear(perf->ntb, PERF_SPAD_NOTIFY(perf->gidx));
+
        ntb_link_disable(perf->ntb);
 }