2 * Atheros AR71xx built-in ethernet mac driver
4 * Copyright (C) 2008-2010 Gabor Juhos <juhosg@openwrt.org>
5 * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
7 * Based on Atheros' AG7100 driver
9 * This program is free software; you can redistribute it and/or modify it
10 * under the terms of the GNU General Public License version 2 as published
11 * by the Free Software Foundation.
16 static u32
ag71xx_ethtool_get_msglevel(struct net_device
*dev
)
18 struct ag71xx
*ag
= netdev_priv(dev
);
20 return ag
->msg_enable
;
23 static void ag71xx_ethtool_set_msglevel(struct net_device
*dev
, u32 msg_level
)
25 struct ag71xx
*ag
= netdev_priv(dev
);
27 ag
->msg_enable
= msg_level
;
30 static void ag71xx_ethtool_get_ringparam(struct net_device
*dev
,
31 struct ethtool_ringparam
*er
)
33 struct ag71xx
*ag
= netdev_priv(dev
);
35 er
->tx_max_pending
= AG71XX_TX_RING_SIZE_MAX
;
36 er
->rx_max_pending
= AG71XX_RX_RING_SIZE_MAX
;
37 er
->rx_mini_max_pending
= 0;
38 er
->rx_jumbo_max_pending
= 0;
40 er
->tx_pending
= BIT(ag
->tx_ring
.order
);
41 er
->rx_pending
= BIT(ag
->rx_ring
.order
);
42 er
->rx_mini_pending
= 0;
43 er
->rx_jumbo_pending
= 0;
45 if (ag
->tx_ring
.desc_split
)
46 er
->tx_pending
/= AG71XX_TX_RING_DS_PER_PKT
;
49 static int ag71xx_ethtool_set_ringparam(struct net_device
*dev
,
50 struct ethtool_ringparam
*er
)
52 struct ag71xx
*ag
= netdev_priv(dev
);
57 if (er
->rx_mini_pending
!= 0||
58 er
->rx_jumbo_pending
!= 0 ||
59 er
->rx_pending
== 0 ||
63 tx_size
= er
->tx_pending
< AG71XX_TX_RING_SIZE_MAX
?
64 er
->tx_pending
: AG71XX_TX_RING_SIZE_MAX
;
66 rx_size
= er
->rx_pending
< AG71XX_RX_RING_SIZE_MAX
?
67 er
->rx_pending
: AG71XX_RX_RING_SIZE_MAX
;
69 if (netif_running(dev
)) {
70 err
= dev
->netdev_ops
->ndo_stop(dev
);
75 if (ag
->tx_ring
.desc_split
)
76 tx_size
*= AG71XX_TX_RING_DS_PER_PKT
;
78 ag
->tx_ring
.order
= ag71xx_ring_size_order(tx_size
);
79 ag
->rx_ring
.order
= ag71xx_ring_size_order(rx_size
);
81 if (netif_running(dev
))
82 err
= dev
->netdev_ops
->ndo_open(dev
);
87 static int ag71xx_ethtool_nway_reset(struct net_device
*dev
)
89 struct ag71xx
*ag
= netdev_priv(dev
);
90 struct phy_device
*phydev
= ag
->phy_dev
;
95 return genphy_restart_aneg(phydev
);
98 struct ethtool_ops ag71xx_ethtool_ops
= {
99 .get_msglevel
= ag71xx_ethtool_get_msglevel
,
100 .set_msglevel
= ag71xx_ethtool_set_msglevel
,
101 .get_ringparam
= ag71xx_ethtool_get_ringparam
,
102 .set_ringparam
= ag71xx_ethtool_set_ringparam
,
103 .get_link_ksettings
= phy_ethtool_get_link_ksettings
,
104 .set_link_ksettings
= phy_ethtool_set_link_ksettings
,
105 .get_link
= ethtool_op_get_link
,
106 .get_ts_info
= ethtool_op_get_ts_info
,
107 .nway_reset
= ag71xx_ethtool_nway_reset
,