cxgbe(4): make it safe to call setup_memwin repeatedly.

A repeat call will recreate the memory windows in the hardware and move
them to their last-known positions without repeating any of the software
initialization.

MFC after:	1 week
Sponsored by:	Chelsio Communications
This commit is contained in:
Navdeep Parhar 2021-03-19 12:30:57 -07:00
parent ee231b27ff
commit a1d803c162

View File

@ -3031,16 +3031,18 @@ setup_memwin(struct adapter *sc)
} }
for (i = 0, mw = &sc->memwin[0]; i < NUM_MEMWIN; i++, mw_init++, mw++) { for (i = 0, mw = &sc->memwin[0]; i < NUM_MEMWIN; i++, mw_init++, mw++) {
if (!rw_initialized(&mw->mw_lock)) {
rw_init(&mw->mw_lock, "memory window access"); rw_init(&mw->mw_lock, "memory window access");
mw->mw_base = mw_init->base; mw->mw_base = mw_init->base;
mw->mw_aperture = mw_init->aperture; mw->mw_aperture = mw_init->aperture;
mw->mw_curpos = 0; mw->mw_curpos = 0;
}
t4_write_reg(sc, t4_write_reg(sc,
PCIE_MEM_ACCESS_REG(A_PCIE_MEM_ACCESS_BASE_WIN, i), PCIE_MEM_ACCESS_REG(A_PCIE_MEM_ACCESS_BASE_WIN, i),
(mw->mw_base + bar0) | V_BIR(0) | (mw->mw_base + bar0) | V_BIR(0) |
V_WINDOW(ilog2(mw->mw_aperture) - 10)); V_WINDOW(ilog2(mw->mw_aperture) - 10));
rw_wlock(&mw->mw_lock); rw_wlock(&mw->mw_lock);
position_memwin(sc, i, 0); position_memwin(sc, i, mw->mw_curpos);
rw_wunlock(&mw->mw_lock); rw_wunlock(&mw->mw_lock);
} }