summaryrefslogtreecommitdiff
path: root/drivers/net
diff options
context:
space:
mode:
authorClaudiu Manoil <claudiu.manoil@freescale.com>2013-07-30 11:36:49 (GMT)
committerFleming Andrew-AFLEMING <AFLEMING@freescale.com>2013-08-07 21:51:18 (GMT)
commit6b7db5dc558dcf99f781be85a688abcdf75f2869 (patch)
tree50258130c325a43c80130ce3398f427488202aa4 /drivers/net
parentb3698257aac8d5b8db58535037575812b6208f79 (diff)
downloadlinux-fsl-qoriq-6b7db5dc558dcf99f781be85a688abcdf75f2869.tar.xz
gianfar: Add ethtool -A support for pause frame
Allow Rx/Tx pause frame configuration via ethtool. The gfar devices feature link autonegotioation by default. The device is being configured with the new pause frame settings during link autonegotiation (see adjust_link()). Signed-off-by: Claudiu Manoil <claudiu.manoil@freescale.com> Change-Id: Icd0b4155ad10e6f9174ffe17c8bf5bec748f9142 Reviewed-on: http://git.am.freescale.net:8181/3651 Reviewed-by: Bucur Madalin-Cristian-B32716 <madalin.bucur@freescale.com> Reviewed-by: Fleming Andrew-AFLEMING <AFLEMING@freescale.com> Tested-by: Fleming Andrew-AFLEMING <AFLEMING@freescale.com>
Diffstat (limited to 'drivers/net')
-rw-r--r--drivers/net/ethernet/freescale/gianfar.h1
-rw-r--r--drivers/net/ethernet/freescale/gianfar_ethtool.c30
2 files changed, 31 insertions, 0 deletions
diff --git a/drivers/net/ethernet/freescale/gianfar.h b/drivers/net/ethernet/freescale/gianfar.h
index 3909ef6..e74dfeb 100644
--- a/drivers/net/ethernet/freescale/gianfar.h
+++ b/drivers/net/ethernet/freescale/gianfar.h
@@ -1446,6 +1446,7 @@ void gfar_init_sysfs(struct net_device *dev);
int gfar_set_features(struct net_device *dev, netdev_features_t features);
extern void gfar_check_rx_parser_mode(struct gfar_private *priv);
extern void gfar_vlan_mode(struct net_device *dev, netdev_features_t features);
+void gfar_configure_pause(struct gfar_private *priv, bool en);
extern const struct ethtool_ops gfar_ethtool_ops;
extern struct list_head gfar_recycle_queues;
diff --git a/drivers/net/ethernet/freescale/gianfar_ethtool.c b/drivers/net/ethernet/freescale/gianfar_ethtool.c
index 565b26d..c03c5cd 100644
--- a/drivers/net/ethernet/freescale/gianfar_ethtool.c
+++ b/drivers/net/ethernet/freescale/gianfar_ethtool.c
@@ -539,6 +539,34 @@ static int gfar_sringparam(struct net_device *dev,
return err;
}
+static void gfar_gpauseparam(struct net_device *dev,
+ struct ethtool_pauseparam *pause)
+{
+ struct gfar_private *priv = netdev_priv(dev);
+
+ pause->autoneg = AUTONEG_ENABLE;
+ if (priv->rx_pause)
+ pause->rx_pause = 1;
+ if (priv->tx_pause)
+ pause->tx_pause = 1;
+}
+
+static int gfar_spauseparam(struct net_device *dev,
+ struct ethtool_pauseparam *pause)
+{
+ struct gfar_private *priv = netdev_priv(dev);
+ struct phy_device *phydev = priv->phydev;
+
+ priv->rx_pause = !!pause->rx_pause;
+ priv->tx_pause = !!pause->tx_pause;
+
+ /* update h/w settings, if link is up */
+ if (phydev && phydev->link)
+ gfar_configure_pause(priv, !!phydev->duplex);
+
+ return 0;
+}
+
int gfar_set_features(struct net_device *dev, netdev_features_t features)
{
struct gfar_private *priv = netdev_priv(dev);
@@ -1872,6 +1900,8 @@ const struct ethtool_ops gfar_ethtool_ops = {
.set_coalesce = gfar_scoalesce,
.get_ringparam = gfar_gringparam,
.set_ringparam = gfar_sringparam,
+ .get_pauseparam = gfar_gpauseparam,
+ .set_pauseparam = gfar_spauseparam,
.get_strings = gfar_gstrings,
.get_sset_count = gfar_sset_count,
.get_ethtool_stats = gfar_fill_stats,