diff options
author | Yi Zou <yi.zou@intel.com> | 2011-04-09 04:34:12 -0400 |
---|---|---|
committer | Jeff Kirsher <jeffrey.t.kirsher@intel.com> | 2011-04-27 05:18:04 -0400 |
commit | 7aba7b077f638deb9569e0b36256cd9ae76e468c (patch) | |
tree | 285f2bdcd12c06e371fa24d03921afdf4263b424 /drivers/net/ixgbe | |
parent | b32c8dcc33a74fb4f1e73ed2263504f5947ca76b (diff) |
ixgbe: do not clear FCoE DDP error status for received ABTS
The ddp->err is initialized to be 1 to make sure outstanding DDP context is
guaranteed to be invalidated when HW is not auto-invalidating it. However,
in case of receiving ABTS response for a DDPed I/O, the ddp->err was cleared,
bypassing the invalidating of the DDP context from upper protocol stack when
ixgbe_fcoe_ddp_put() is called. This bug is fixed here by updating the error
only when FCP_RSP is received.
Signed-off-by: Yi Zou <yi.zou@intel.com>
Tested-by: Ross Brattain <ross.b.brattain@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Diffstat (limited to 'drivers/net/ixgbe')
-rw-r--r-- | drivers/net/ixgbe/ixgbe_fcoe.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/drivers/net/ixgbe/ixgbe_fcoe.c b/drivers/net/ixgbe/ixgbe_fcoe.c index dba7d77588ef..05920726e824 100644 --- a/drivers/net/ixgbe/ixgbe_fcoe.c +++ b/drivers/net/ixgbe/ixgbe_fcoe.c | |||
@@ -416,8 +416,7 @@ int ixgbe_fcoe_ddp(struct ixgbe_adapter *adapter, | |||
416 | if (!ddp->udl) | 416 | if (!ddp->udl) |
417 | goto ddp_out; | 417 | goto ddp_out; |
418 | 418 | ||
419 | ddp->err = (fcerr | fceofe); | 419 | if (fcerr | fceofe) |
420 | if (ddp->err) | ||
421 | goto ddp_out; | 420 | goto ddp_out; |
422 | 421 | ||
423 | fcstat = (sterr & IXGBE_RXDADV_STAT_FCSTAT); | 422 | fcstat = (sterr & IXGBE_RXDADV_STAT_FCSTAT); |
@@ -428,6 +427,7 @@ int ixgbe_fcoe_ddp(struct ixgbe_adapter *adapter, | |||
428 | if (fcstat == IXGBE_RXDADV_STAT_FCSTAT_FCPRSP) { | 427 | if (fcstat == IXGBE_RXDADV_STAT_FCSTAT_FCPRSP) { |
429 | pci_unmap_sg(adapter->pdev, ddp->sgl, | 428 | pci_unmap_sg(adapter->pdev, ddp->sgl, |
430 | ddp->sgc, DMA_FROM_DEVICE); | 429 | ddp->sgc, DMA_FROM_DEVICE); |
430 | ddp->err = (fcerr | fceofe); | ||
431 | ddp->sgl = NULL; | 431 | ddp->sgl = NULL; |
432 | ddp->sgc = 0; | 432 | ddp->sgc = 0; |
433 | } | 433 | } |