diff options
Diffstat (limited to 'drivers/net/ixgbe/ixgbe_common.c')
-rw-r--r-- | drivers/net/ixgbe/ixgbe_common.c | 43 |
1 files changed, 12 insertions, 31 deletions
diff --git a/drivers/net/ixgbe/ixgbe_common.c b/drivers/net/ixgbe/ixgbe_common.c index e3eca1316389..62aa2be199f1 100644 --- a/drivers/net/ixgbe/ixgbe_common.c +++ b/drivers/net/ixgbe/ixgbe_common.c | |||
@@ -1595,6 +1595,7 @@ s32 ixgbe_fc_enable_generic(struct ixgbe_hw *hw, s32 packetbuf_num) | |||
1595 | u32 mflcn_reg, fccfg_reg; | 1595 | u32 mflcn_reg, fccfg_reg; |
1596 | u32 reg; | 1596 | u32 reg; |
1597 | u32 rx_pba_size; | 1597 | u32 rx_pba_size; |
1598 | u32 fcrtl, fcrth; | ||
1598 | 1599 | ||
1599 | #ifdef CONFIG_DCB | 1600 | #ifdef CONFIG_DCB |
1600 | if (hw->fc.requested_mode == ixgbe_fc_pfc) | 1601 | if (hw->fc.requested_mode == ixgbe_fc_pfc) |
@@ -1671,41 +1672,21 @@ s32 ixgbe_fc_enable_generic(struct ixgbe_hw *hw, s32 packetbuf_num) | |||
1671 | IXGBE_WRITE_REG(hw, IXGBE_MFLCN, mflcn_reg); | 1672 | IXGBE_WRITE_REG(hw, IXGBE_MFLCN, mflcn_reg); |
1672 | IXGBE_WRITE_REG(hw, IXGBE_FCCFG, fccfg_reg); | 1673 | IXGBE_WRITE_REG(hw, IXGBE_FCCFG, fccfg_reg); |
1673 | 1674 | ||
1674 | reg = IXGBE_READ_REG(hw, IXGBE_MTQC); | 1675 | rx_pba_size = IXGBE_READ_REG(hw, IXGBE_RXPBSIZE(packetbuf_num)); |
1675 | /* Thresholds are different for link flow control when in DCB mode */ | 1676 | rx_pba_size >>= IXGBE_RXPBSIZE_SHIFT; |
1676 | if (reg & IXGBE_MTQC_RT_ENA) { | ||
1677 | rx_pba_size = IXGBE_READ_REG(hw, IXGBE_RXPBSIZE(packetbuf_num)); | ||
1678 | 1677 | ||
1679 | /* Always disable XON for LFC when in DCB mode */ | 1678 | fcrth = (rx_pba_size - hw->fc.high_water) << 10; |
1680 | reg = (rx_pba_size >> 5) & 0xFFE0; | 1679 | fcrtl = (rx_pba_size - hw->fc.low_water) << 10; |
1681 | IXGBE_WRITE_REG(hw, IXGBE_FCRTL_82599(packetbuf_num), reg); | ||
1682 | 1680 | ||
1683 | reg = (rx_pba_size >> 2) & 0xFFE0; | 1681 | if (hw->fc.current_mode & ixgbe_fc_tx_pause) { |
1684 | if (hw->fc.current_mode & ixgbe_fc_tx_pause) | 1682 | fcrth |= IXGBE_FCRTH_FCEN; |
1685 | reg |= IXGBE_FCRTH_FCEN; | 1683 | if (hw->fc.send_xon) |
1686 | IXGBE_WRITE_REG(hw, IXGBE_FCRTH_82599(packetbuf_num), reg); | 1684 | fcrtl |= IXGBE_FCRTL_XONE; |
1687 | } else { | ||
1688 | /* | ||
1689 | * Set up and enable Rx high/low water mark thresholds, | ||
1690 | * enable XON. | ||
1691 | */ | ||
1692 | if (hw->fc.current_mode & ixgbe_fc_tx_pause) { | ||
1693 | if (hw->fc.send_xon) { | ||
1694 | IXGBE_WRITE_REG(hw, | ||
1695 | IXGBE_FCRTL_82599(packetbuf_num), | ||
1696 | (hw->fc.low_water | | ||
1697 | IXGBE_FCRTL_XONE)); | ||
1698 | } else { | ||
1699 | IXGBE_WRITE_REG(hw, | ||
1700 | IXGBE_FCRTL_82599(packetbuf_num), | ||
1701 | hw->fc.low_water); | ||
1702 | } | ||
1703 | |||
1704 | IXGBE_WRITE_REG(hw, IXGBE_FCRTH_82599(packetbuf_num), | ||
1705 | (hw->fc.high_water | IXGBE_FCRTH_FCEN)); | ||
1706 | } | ||
1707 | } | 1685 | } |
1708 | 1686 | ||
1687 | IXGBE_WRITE_REG(hw, IXGBE_FCRTH_82599(packetbuf_num), fcrth); | ||
1688 | IXGBE_WRITE_REG(hw, IXGBE_FCRTL_82599(packetbuf_num), fcrtl); | ||
1689 | |||
1709 | /* Configure pause time (2 TCs per register) */ | 1690 | /* Configure pause time (2 TCs per register) */ |
1710 | reg = IXGBE_READ_REG(hw, IXGBE_FCTTV(packetbuf_num / 2)); | 1691 | reg = IXGBE_READ_REG(hw, IXGBE_FCTTV(packetbuf_num / 2)); |
1711 | if ((packetbuf_num & 1) == 0) | 1692 | if ((packetbuf_num & 1) == 0) |