net: stmmac: flow_ctrl functions adapted to mtl
This patch adapts flow_ctrl function to prepare it for multiple queues. Signed-off-by: Joao Pinto <jpinto@synopsys.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
d43042f4da
commit
29feff3900
|
@ -476,7 +476,7 @@ struct stmmac_ops {
|
|||
void (*set_filter)(struct mac_device_info *hw, struct net_device *dev);
|
||||
/* Flow control setting */
|
||||
void (*flow_ctrl)(struct mac_device_info *hw, unsigned int duplex,
|
||||
unsigned int fc, unsigned int pause_time);
|
||||
unsigned int fc, unsigned int pause_time, u32 tx_cnt);
|
||||
/* Set power management mode (e.g. magic frame) */
|
||||
void (*pmt)(struct mac_device_info *hw, unsigned long mode);
|
||||
/* Set/Get Unicast MAC addresses */
|
||||
|
|
|
@ -216,7 +216,8 @@ static void dwmac1000_set_filter(struct mac_device_info *hw,
|
|||
|
||||
|
||||
static void dwmac1000_flow_ctrl(struct mac_device_info *hw, unsigned int duplex,
|
||||
unsigned int fc, unsigned int pause_time)
|
||||
unsigned int fc, unsigned int pause_time,
|
||||
u32 tx_cnt)
|
||||
{
|
||||
void __iomem *ioaddr = hw->pcsr;
|
||||
/* Set flow such that DZPQ in Mac Register 6 is 0,
|
||||
|
|
|
@ -131,7 +131,8 @@ static void dwmac100_set_filter(struct mac_device_info *hw,
|
|||
}
|
||||
|
||||
static void dwmac100_flow_ctrl(struct mac_device_info *hw, unsigned int duplex,
|
||||
unsigned int fc, unsigned int pause_time)
|
||||
unsigned int fc, unsigned int pause_time,
|
||||
u32 tx_cnt)
|
||||
{
|
||||
void __iomem *ioaddr = hw->pcsr;
|
||||
unsigned int flow = MAC_FLOW_CTRL_ENABLE;
|
||||
|
|
|
@ -336,11 +336,12 @@ static void dwmac4_set_filter(struct mac_device_info *hw,
|
|||
}
|
||||
|
||||
static void dwmac4_flow_ctrl(struct mac_device_info *hw, unsigned int duplex,
|
||||
unsigned int fc, unsigned int pause_time)
|
||||
unsigned int fc, unsigned int pause_time,
|
||||
u32 tx_cnt)
|
||||
{
|
||||
void __iomem *ioaddr = hw->pcsr;
|
||||
u32 channel = STMMAC_CHAN0; /* FIXME */
|
||||
unsigned int flow = 0;
|
||||
u32 queue = 0;
|
||||
|
||||
pr_debug("GMAC Flow-Control:\n");
|
||||
if (fc & FLOW_RX) {
|
||||
|
@ -350,13 +351,18 @@ static void dwmac4_flow_ctrl(struct mac_device_info *hw, unsigned int duplex,
|
|||
}
|
||||
if (fc & FLOW_TX) {
|
||||
pr_debug("\tTransmit Flow-Control ON\n");
|
||||
flow |= GMAC_TX_FLOW_CTRL_TFE;
|
||||
writel(flow, ioaddr + GMAC_QX_TX_FLOW_CTRL(channel));
|
||||
|
||||
if (duplex) {
|
||||
if (duplex)
|
||||
pr_debug("\tduplex mode: PAUSE %d\n", pause_time);
|
||||
flow |= (pause_time << GMAC_TX_FLOW_CTRL_PT_SHIFT);
|
||||
writel(flow, ioaddr + GMAC_QX_TX_FLOW_CTRL(channel));
|
||||
|
||||
for (queue = 0; queue < tx_cnt; queue++) {
|
||||
flow |= GMAC_TX_FLOW_CTRL_TFE;
|
||||
|
||||
if (duplex)
|
||||
flow |=
|
||||
(pause_time << GMAC_TX_FLOW_CTRL_PT_SHIFT);
|
||||
|
||||
writel(flow, ioaddr + GMAC_QX_TX_FLOW_CTRL(queue));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -481,6 +481,7 @@ stmmac_set_pauseparam(struct net_device *netdev,
|
|||
struct ethtool_pauseparam *pause)
|
||||
{
|
||||
struct stmmac_priv *priv = netdev_priv(netdev);
|
||||
u32 tx_cnt = priv->plat->tx_queues_to_use;
|
||||
struct phy_device *phy = netdev->phydev;
|
||||
int new_pause = FLOW_OFF;
|
||||
|
||||
|
@ -511,7 +512,7 @@ stmmac_set_pauseparam(struct net_device *netdev,
|
|||
}
|
||||
|
||||
priv->hw->mac->flow_ctrl(priv->hw, phy->duplex, priv->flow_ctrl,
|
||||
priv->pause);
|
||||
priv->pause, tx_cnt);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -672,6 +672,19 @@ static void stmmac_release_ptp(struct stmmac_priv *priv)
|
|||
stmmac_ptp_unregister(priv);
|
||||
}
|
||||
|
||||
/**
|
||||
* stmmac_mac_flow_ctrl - Configure flow control in all queues
|
||||
* @priv: driver private structure
|
||||
* Description: It is used for configuring the flow control in all queues
|
||||
*/
|
||||
static void stmmac_mac_flow_ctrl(struct stmmac_priv *priv, u32 duplex)
|
||||
{
|
||||
u32 tx_cnt = priv->plat->tx_queues_to_use;
|
||||
|
||||
priv->hw->mac->flow_ctrl(priv->hw, duplex, priv->flow_ctrl,
|
||||
priv->pause, tx_cnt);
|
||||
}
|
||||
|
||||
/**
|
||||
* stmmac_adjust_link - adjusts the link parameters
|
||||
* @dev: net device structure
|
||||
|
@ -687,7 +700,6 @@ static void stmmac_adjust_link(struct net_device *dev)
|
|||
struct phy_device *phydev = dev->phydev;
|
||||
unsigned long flags;
|
||||
int new_state = 0;
|
||||
unsigned int fc = priv->flow_ctrl, pause_time = priv->pause;
|
||||
|
||||
if (!phydev)
|
||||
return;
|
||||
|
@ -709,8 +721,7 @@ static void stmmac_adjust_link(struct net_device *dev)
|
|||
}
|
||||
/* Flow Control operation */
|
||||
if (phydev->pause)
|
||||
priv->hw->mac->flow_ctrl(priv->hw, phydev->duplex,
|
||||
fc, pause_time);
|
||||
stmmac_mac_flow_ctrl(priv, phydev->duplex);
|
||||
|
||||
if (phydev->speed != priv->speed) {
|
||||
new_state = 1;
|
||||
|
|
Loading…
Reference in New Issue