bnx2x: Lock DMAE when used by statistic flow
bnx2x has several clients to its DMAE machines - all of them with the exception of the statistics flow used the same locking mechanisms to synchronize the DMAE machines' usage. Since statistics (which are periodically entered) use DMAE without taking the locks, they may erase the commands which were previously set - e.g., it may cause a VF to timeout while waiting for a PF answer on the VF-PF channel as that command header would have been overwritten by the statistics' header. This patch makes certain that all flows utilizing DMAE will use the same API, assuring that the locking scheme will be kept by all said flows. Signed-off-by: Ariel Elior <ariele@broadcom.com> Signed-off-by: Yuval Mintz <yuvalmin@broadcom.com> Signed-off-by: Eilon Greenstein <eilong@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
6b991c3763
commit
32316a46f2
|
@ -2073,7 +2073,8 @@ u32 bnx2x_dmae_opcode(struct bnx2x *bp, u8 src_type, u8 dst_type,
|
|||
|
||||
void bnx2x_prep_dmae_with_comp(struct bnx2x *bp, struct dmae_command *dmae,
|
||||
u8 src_type, u8 dst_type);
|
||||
int bnx2x_issue_dmae_with_comp(struct bnx2x *bp, struct dmae_command *dmae);
|
||||
int bnx2x_issue_dmae_with_comp(struct bnx2x *bp, struct dmae_command *dmae,
|
||||
u32 *comp);
|
||||
|
||||
/* FLR related routines */
|
||||
u32 bnx2x_flr_clnup_poll_count(struct bnx2x *bp);
|
||||
|
|
|
@ -503,9 +503,9 @@ void bnx2x_prep_dmae_with_comp(struct bnx2x *bp,
|
|||
}
|
||||
|
||||
/* issue a dmae command over the init-channel and wait for completion */
|
||||
int bnx2x_issue_dmae_with_comp(struct bnx2x *bp, struct dmae_command *dmae)
|
||||
int bnx2x_issue_dmae_with_comp(struct bnx2x *bp, struct dmae_command *dmae,
|
||||
u32 *comp)
|
||||
{
|
||||
u32 *wb_comp = bnx2x_sp(bp, wb_comp);
|
||||
int cnt = CHIP_REV_IS_SLOW(bp) ? (400000) : 4000;
|
||||
int rc = 0;
|
||||
|
||||
|
@ -518,14 +518,14 @@ int bnx2x_issue_dmae_with_comp(struct bnx2x *bp, struct dmae_command *dmae)
|
|||
spin_lock_bh(&bp->dmae_lock);
|
||||
|
||||
/* reset completion */
|
||||
*wb_comp = 0;
|
||||
*comp = 0;
|
||||
|
||||
/* post the command on the channel used for initializations */
|
||||
bnx2x_post_dmae(bp, dmae, INIT_DMAE_C(bp));
|
||||
|
||||
/* wait for completion */
|
||||
udelay(5);
|
||||
while ((*wb_comp & ~DMAE_PCI_ERR_FLAG) != DMAE_COMP_VAL) {
|
||||
while ((*comp & ~DMAE_PCI_ERR_FLAG) != DMAE_COMP_VAL) {
|
||||
|
||||
if (!cnt ||
|
||||
(bp->recovery_state != BNX2X_RECOVERY_DONE &&
|
||||
|
@ -537,7 +537,7 @@ int bnx2x_issue_dmae_with_comp(struct bnx2x *bp, struct dmae_command *dmae)
|
|||
cnt--;
|
||||
udelay(50);
|
||||
}
|
||||
if (*wb_comp & DMAE_PCI_ERR_FLAG) {
|
||||
if (*comp & DMAE_PCI_ERR_FLAG) {
|
||||
BNX2X_ERR("DMAE PCI error!\n");
|
||||
rc = DMAE_PCI_ERROR;
|
||||
}
|
||||
|
@ -574,7 +574,7 @@ void bnx2x_write_dmae(struct bnx2x *bp, dma_addr_t dma_addr, u32 dst_addr,
|
|||
dmae.len = len32;
|
||||
|
||||
/* issue the command and wait for completion */
|
||||
rc = bnx2x_issue_dmae_with_comp(bp, &dmae);
|
||||
rc = bnx2x_issue_dmae_with_comp(bp, &dmae, bnx2x_sp(bp, wb_comp));
|
||||
if (rc) {
|
||||
BNX2X_ERR("DMAE returned failure %d\n", rc);
|
||||
bnx2x_panic();
|
||||
|
@ -611,7 +611,7 @@ void bnx2x_read_dmae(struct bnx2x *bp, u32 src_addr, u32 len32)
|
|||
dmae.len = len32;
|
||||
|
||||
/* issue the command and wait for completion */
|
||||
rc = bnx2x_issue_dmae_with_comp(bp, &dmae);
|
||||
rc = bnx2x_issue_dmae_with_comp(bp, &dmae, bnx2x_sp(bp, wb_comp));
|
||||
if (rc) {
|
||||
BNX2X_ERR("DMAE returned failure %d\n", rc);
|
||||
bnx2x_panic();
|
||||
|
|
|
@ -196,7 +196,7 @@ static void bnx2x_hw_stats_post(struct bnx2x *bp)
|
|||
|
||||
} else if (bp->func_stx) {
|
||||
*stats_comp = 0;
|
||||
bnx2x_post_dmae(bp, dmae, INIT_DMAE_C(bp));
|
||||
bnx2x_issue_dmae_with_comp(bp, dmae, stats_comp);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -980,7 +980,7 @@ static int bnx2x_copy32_vf_dmae(struct bnx2x *bp, u8 from_vf,
|
|||
dmae.len = len32;
|
||||
|
||||
/* issue the command and wait for completion */
|
||||
return bnx2x_issue_dmae_with_comp(bp, &dmae);
|
||||
return bnx2x_issue_dmae_with_comp(bp, &dmae, bnx2x_sp(bp, wb_comp));
|
||||
}
|
||||
|
||||
static void bnx2x_vf_mbx_resp(struct bnx2x *bp, struct bnx2x_virtf *vf)
|
||||
|
|
Loading…
Reference in New Issue