IXGBE_WRITE_REG(hw, IXGBE_MFLCN, mflcn_reg);
        IXGBE_WRITE_REG(hw, IXGBE_FCCFG, fccfg_reg);
 
-       fcrth = hw->fc.high_water[packetbuf_num] << 10;
        fcrtl = hw->fc.low_water << 10;
 
        if (hw->fc.current_mode & ixgbe_fc_tx_pause) {
+               fcrth = hw->fc.high_water[packetbuf_num] << 10;
                fcrth |= IXGBE_FCRTH_FCEN;
                if (hw->fc.send_xon)
                        fcrtl |= IXGBE_FCRTL_XONE;
+       } else {
+               /*
+                * If Tx flow control is disabled, set our high water mark
+                * to Rx FIFO size minus 32 in order prevent Tx switch
+                * loopback from stalling on DMA.
+                */
+               fcrth = IXGBE_READ_REG(hw, IXGBE_RXPBSIZE(packetbuf_num)) - 32;
        }
 
        IXGBE_WRITE_REG(hw, IXGBE_FCRTH_82599(packetbuf_num), fcrth);