ixgbe: do not clear FCoE DDP error status for received ABTS
authorYi Zou <yi.zou@intel.com>
Sat, 9 Apr 2011 08:34:12 +0000 (08:34 +0000)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Wed, 27 Apr 2011 09:18:04 +0000 (02:18 -0700)
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>
drivers/net/ixgbe/ixgbe_fcoe.c

index dba7d77588ef629bcdcc2d2b95f11d0625dc680d..05920726e8249a36618a87be3504c9e1836ea4a4 100644 (file)
@@ -416,8 +416,7 @@ int ixgbe_fcoe_ddp(struct ixgbe_adapter *adapter,
        if (!ddp->udl)
                goto ddp_out;
 
-       ddp->err = (fcerr | fceofe);
-       if (ddp->err)
+       if (fcerr | fceofe)
                goto ddp_out;
 
        fcstat = (sterr & IXGBE_RXDADV_STAT_FCSTAT);
@@ -428,6 +427,7 @@ int ixgbe_fcoe_ddp(struct ixgbe_adapter *adapter,
                if (fcstat == IXGBE_RXDADV_STAT_FCSTAT_FCPRSP) {
                        pci_unmap_sg(adapter->pdev, ddp->sgl,
                                     ddp->sgc, DMA_FROM_DEVICE);
+                       ddp->err = (fcerr | fceofe);
                        ddp->sgl = NULL;
                        ddp->sgc = 0;
                }