From: f.fainelli@gmail.com (Florian Fainelli)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH net-next 5/8] net: ethernet: annapurna: add statistics helper
Date: Fri, 3 Feb 2017 11:34:10 -0800 [thread overview]
Message-ID: <ee80d905-8d48-9e46-17ef-bc4242052172@gmail.com> (raw)
In-Reply-To: <20170203181216.30214-6-antoine.tenart@free-electrons.com>
On 02/03/2017 10:12 AM, Antoine Tenart wrote:
> Add the ndo_get_stats64() helper in the Annapurna Labs Alpine Ethernet
> driver.
> ---
> drivers/net/ethernet/annapurna/al_eth.c | 36 ++++
> drivers/net/ethernet/annapurna/al_hw_eth.h | 9 +
> drivers/net/ethernet/annapurna/al_hw_eth_main.c | 225 ++++++++++++++++++++++++
> 3 files changed, 270 insertions(+)
>
> diff --git a/drivers/net/ethernet/annapurna/al_eth.c b/drivers/net/ethernet/annapurna/al_eth.c
> index 779a885de014..8dd84f66b5d1 100644
> --- a/drivers/net/ethernet/annapurna/al_eth.c
> +++ b/drivers/net/ethernet/annapurna/al_eth.c
> @@ -2388,6 +2388,41 @@ static void al_eth_set_msglevel(struct net_device *netdev, u32 value)
> adapter->msg_enable = value;
> }
>
> +static void al_eth_get_stats64(struct net_device *netdev,
> + struct rtnl_link_stats64 *stats)
> +{
> + struct al_eth_adapter *adapter = netdev_priv(netdev);
> + struct al_eth_mac_stats *mac_stats = &adapter->mac_stats;
> +
> + if (!adapter->up)
> + return NULL;
> +
> + al_eth_mac_stats_get(&adapter->hw_adapter, mac_stats);
Are not you missing a reader synchronization here? Something like what
drivers/net/ethernet/realtek/8139too.c does for instance, especially if
this driver runs on ARM where you won't get "atomic" 64-bit reads (you
could, but it's more complicated).
> +
> + stats->rx_packets = mac_stats->aFramesReceivedOK; /* including pause frames */
> + stats->tx_packets = mac_stats->aFramesTransmittedOK; /* including pause frames */
> + stats->rx_bytes = mac_stats->aOctetsReceivedOK;
> + stats->tx_bytes = mac_stats->aOctetsTransmittedOK;
> + stats->rx_dropped = 0;
> + stats->multicast = mac_stats->ifInMulticastPkts;
> + stats->collisions = 0;
Are these free running counters, or read on clear, or?
> +
> + stats->rx_length_errors = (mac_stats->etherStatsUndersizePkts + /* good but short */
> + mac_stats->etherStatsFragments + /* short and bad*/
> + mac_stats->etherStatsJabbers + /* with crc errors */
> + mac_stats->etherStatsOversizePkts);
> + stats->rx_crc_errors = mac_stats->aFrameCheckSequenceErrors;
> + stats->rx_frame_errors = mac_stats->aAlignmentErrors;
> + stats->rx_fifo_errors = mac_stats->etherStatsDropEvents;
> + stats->rx_missed_errors = 0;
> + stats->tx_window_errors = 0;
> +
> + stats->rx_errors = mac_stats->ifInErrors;
> + stats->tx_errors = mac_stats->ifOutErrors;
> +
> + return stats;
> +}
> +
> static void al_eth_get_drvinfo(struct net_device *dev,
> struct ethtool_drvinfo *info)
> {
> @@ -2763,6 +2798,7 @@ static const struct net_device_ops al_eth_netdev_ops = {
> .ndo_stop = al_eth_close,
> .ndo_start_xmit = al_eth_start_xmit,
> .ndo_select_queue = al_eth_select_queue,
> + .ndo_get_stats64 = al_eth_get_stats64,
> .ndo_do_ioctl = al_eth_ioctl,
> .ndo_tx_timeout = al_eth_tx_timeout,
> .ndo_change_mtu = al_eth_change_mtu,
> diff --git a/drivers/net/ethernet/annapurna/al_hw_eth.h b/drivers/net/ethernet/annapurna/al_hw_eth.h
> index b2fc58793b3a..a44f3f200838 100644
> --- a/drivers/net/ethernet/annapurna/al_hw_eth.h
> +++ b/drivers/net/ethernet/annapurna/al_hw_eth.h
> @@ -982,6 +982,15 @@ struct al_eth_mac_stats {
> };
>
> /*
> + * get mac statistics
> + * @param adapter pointer to the private structure.
> + * @param stats pointer to structure that will be filled with statistics.
> + *
> + * @return return 0 on success. otherwise on failure.
> + */
> +int al_eth_mac_stats_get(struct al_hw_eth_adapter *adapter, struct al_eth_mac_stats *stats);
> +
> +/*
> * perform Function Level Reset RMN
> *
> * Addressing RMN: 714
> diff --git a/drivers/net/ethernet/annapurna/al_hw_eth_main.c b/drivers/net/ethernet/annapurna/al_hw_eth_main.c
> index abb9ffd09fbf..dac0c1e2a941 100644
> --- a/drivers/net/ethernet/annapurna/al_hw_eth_main.c
> +++ b/drivers/net/ethernet/annapurna/al_hw_eth_main.c
> @@ -2639,6 +2639,231 @@ int al_eth_flow_control_config(struct al_hw_eth_adapter *adapter,
> return 0;
> }
>
> +/* get statistics */
> +int al_eth_mac_stats_get(struct al_hw_eth_adapter *adapter, struct al_eth_mac_stats *stats)
> +{
> + WARN_ON(!stats);
> +
> + memset(stats, 0, sizeof(struct al_eth_mac_stats));
> +
> + if (AL_ETH_IS_1G_MAC(adapter->mac_mode)) {
> + struct al_eth_mac_1g_stats __iomem *reg_stats =
> + &adapter->mac_regs_base->mac_1g.stats;
> +
> + stats->ifInUcastPkts = readl(®_stats->ifInUcastPkts);
> + stats->ifInMulticastPkts = readl(®_stats->ifInMulticastPkts);
> + stats->ifInBroadcastPkts = readl(®_stats->ifInBroadcastPkts);
> + stats->etherStatsPkts = readl(®_stats->etherStatsPkts);
> + stats->ifOutUcastPkts = readl(®_stats->ifOutUcastPkts);
> + stats->ifOutMulticastPkts = readl(®_stats->ifOutMulticastPkts);
> + stats->ifOutBroadcastPkts = readl(®_stats->ifOutBroadcastPkts);
> + stats->ifInErrors = readl(®_stats->ifInErrors);
> + stats->ifOutErrors = readl(®_stats->ifOutErrors);
> + stats->aFramesReceivedOK = readl(®_stats->aFramesReceivedOK);
> + stats->aFramesTransmittedOK = readl(®_stats->aFramesTransmittedOK);
> + stats->aOctetsReceivedOK = readl(®_stats->aOctetsReceivedOK);
> + stats->aOctetsTransmittedOK = readl(®_stats->aOctetsTransmittedOK);
> + stats->etherStatsUndersizePkts = readl(®_stats->etherStatsUndersizePkts);
> + stats->etherStatsFragments = readl(®_stats->etherStatsFragments);
> + stats->etherStatsJabbers = readl(®_stats->etherStatsJabbers);
> + stats->etherStatsOversizePkts = readl(®_stats->etherStatsOversizePkts);
> + stats->aFrameCheckSequenceErrors =
> + readl(®_stats->aFrameCheckSequenceErrors);
> + stats->aAlignmentErrors = readl(®_stats->aAlignmentErrors);
> + stats->etherStatsDropEvents = readl(®_stats->etherStatsDropEvents);
> + stats->aPAUSEMACCtrlFramesTransmitted =
> + readl(®_stats->aPAUSEMACCtrlFramesTransmitted);
> + stats->aPAUSEMACCtrlFramesReceived =
> + readl(®_stats->aPAUSEMACCtrlFramesReceived);
> + stats->aFrameTooLongErrors = 0; /* N/A */
> + stats->aInRangeLengthErrors = 0; /* N/A */
> + stats->VLANTransmittedOK = 0; /* N/A */
> + stats->VLANReceivedOK = 0; /* N/A */
> + stats->etherStatsOctets = readl(®_stats->etherStatsOctets);
> + stats->etherStatsPkts64Octets = readl(®_stats->etherStatsPkts64Octets);
> + stats->etherStatsPkts65to127Octets =
> + readl(®_stats->etherStatsPkts65to127Octets);
> + stats->etherStatsPkts128to255Octets =
> + readl(®_stats->etherStatsPkts128to255Octets);
> + stats->etherStatsPkts256to511Octets =
> + readl(®_stats->etherStatsPkts256to511Octets);
> + stats->etherStatsPkts512to1023Octets =
> + readl(®_stats->etherStatsPkts512to1023Octets);
> + stats->etherStatsPkts1024to1518Octets =
> + readl(®_stats->etherStatsPkts1024to1518Octets);
> + stats->etherStatsPkts1519toX = readl(®_stats->etherStatsPkts1519toX);
> + } else if (AL_ETH_IS_10G_MAC(adapter->mac_mode) || AL_ETH_IS_25G_MAC(adapter->mac_mode)) {
> + if (adapter->rev_id < AL_ETH_REV_ID_3) {
> + struct al_eth_mac_10g_stats_v2 __iomem *reg_stats =
> + &adapter->mac_regs_base->mac_10g.stats.v2;
> + u64 octets;
> +
Using a structure to describe HW register is really ugly here, can't you
either come up with separate functions per generation of the hardware,
or even indirection tables with register offsets? Most statistics read
seem to be identical between generations of the HW, but their location
might differ.
> + stats->ifInUcastPkts = readl(®_stats->ifInUcastPkts);
> + stats->ifInMulticastPkts = readl(®_stats->ifInMulticastPkts);
> + stats->ifInBroadcastPkts = readl(®_stats->ifInBroadcastPkts);
> + stats->etherStatsPkts = readl(®_stats->etherStatsPkts);
> + stats->ifOutUcastPkts = readl(®_stats->ifOutUcastPkts);
> + stats->ifOutMulticastPkts = readl(®_stats->ifOutMulticastPkts);
> + stats->ifOutBroadcastPkts = readl(®_stats->ifOutBroadcastPkts);
> + stats->ifInErrors = readl(®_stats->ifInErrors);
> + stats->ifOutErrors = readl(®_stats->ifOutErrors);
> + stats->aFramesReceivedOK = readl(®_stats->aFramesReceivedOK);
> + stats->aFramesTransmittedOK = readl(®_stats->aFramesTransmittedOK);
> +
> + /* aOctetsReceivedOK = ifInOctets - 18 * aFramesReceivedOK - 4 * VLANReceivedOK */
> + octets = readl(®_stats->ifInOctetsL);
> + octets |= (u64)(readl(®_stats->ifInOctetsH)) << 32;
> + octets -= 18 * stats->aFramesReceivedOK;
> + octets -= 4 * readl(®_stats->VLANReceivedOK);
> + stats->aOctetsReceivedOK = octets;
> +
> + /* aOctetsTransmittedOK = ifOutOctets - 18 * aFramesTransmittedOK - 4 * VLANTransmittedOK */
What's that 18 for? Ethernet header + VLAN header? If so, express it
with appropriate constants
> + octets = readl(®_stats->ifOutOctetsL);
> + octets |= (u64)(readl(®_stats->ifOutOctetsH)) << 32;
upper_32_bits()
> + octets -= 18 * stats->aFramesTransmittedOK;
What's that 18 for? Ethernet header + VLAN header? If so, express it
with appropriate constants
> + octets -= 4 * readl(®_stats->VLANTransmittedOK);
4 = ETH_VLAN_HLEN
> + stats->aOctetsTransmittedOK = octets;
> +
--
Florian
WARNING: multiple messages have this Message-ID (diff)
From: Florian Fainelli <f.fainelli@gmail.com>
To: Antoine Tenart <antoine.tenart@free-electrons.com>,
netdev@vger.kernel.org, davem@davemloft.net,
linux-arm-kernel@lists.infradead.org
Cc: tsahee@annapurnalabs.com, rshitrit@annapurnalabs.com,
saeed@annapurnalabs.com, barak@annapurnalabs.com,
talz@annapurnalabs.com, thomas.petazzoni@free-electrons.com,
arnd@arndb.de
Subject: Re: [PATCH net-next 5/8] net: ethernet: annapurna: add statistics helper
Date: Fri, 3 Feb 2017 11:34:10 -0800 [thread overview]
Message-ID: <ee80d905-8d48-9e46-17ef-bc4242052172@gmail.com> (raw)
In-Reply-To: <20170203181216.30214-6-antoine.tenart@free-electrons.com>
On 02/03/2017 10:12 AM, Antoine Tenart wrote:
> Add the ndo_get_stats64() helper in the Annapurna Labs Alpine Ethernet
> driver.
> ---
> drivers/net/ethernet/annapurna/al_eth.c | 36 ++++
> drivers/net/ethernet/annapurna/al_hw_eth.h | 9 +
> drivers/net/ethernet/annapurna/al_hw_eth_main.c | 225 ++++++++++++++++++++++++
> 3 files changed, 270 insertions(+)
>
> diff --git a/drivers/net/ethernet/annapurna/al_eth.c b/drivers/net/ethernet/annapurna/al_eth.c
> index 779a885de014..8dd84f66b5d1 100644
> --- a/drivers/net/ethernet/annapurna/al_eth.c
> +++ b/drivers/net/ethernet/annapurna/al_eth.c
> @@ -2388,6 +2388,41 @@ static void al_eth_set_msglevel(struct net_device *netdev, u32 value)
> adapter->msg_enable = value;
> }
>
> +static void al_eth_get_stats64(struct net_device *netdev,
> + struct rtnl_link_stats64 *stats)
> +{
> + struct al_eth_adapter *adapter = netdev_priv(netdev);
> + struct al_eth_mac_stats *mac_stats = &adapter->mac_stats;
> +
> + if (!adapter->up)
> + return NULL;
> +
> + al_eth_mac_stats_get(&adapter->hw_adapter, mac_stats);
Are not you missing a reader synchronization here? Something like what
drivers/net/ethernet/realtek/8139too.c does for instance, especially if
this driver runs on ARM where you won't get "atomic" 64-bit reads (you
could, but it's more complicated).
> +
> + stats->rx_packets = mac_stats->aFramesReceivedOK; /* including pause frames */
> + stats->tx_packets = mac_stats->aFramesTransmittedOK; /* including pause frames */
> + stats->rx_bytes = mac_stats->aOctetsReceivedOK;
> + stats->tx_bytes = mac_stats->aOctetsTransmittedOK;
> + stats->rx_dropped = 0;
> + stats->multicast = mac_stats->ifInMulticastPkts;
> + stats->collisions = 0;
Are these free running counters, or read on clear, or?
> +
> + stats->rx_length_errors = (mac_stats->etherStatsUndersizePkts + /* good but short */
> + mac_stats->etherStatsFragments + /* short and bad*/
> + mac_stats->etherStatsJabbers + /* with crc errors */
> + mac_stats->etherStatsOversizePkts);
> + stats->rx_crc_errors = mac_stats->aFrameCheckSequenceErrors;
> + stats->rx_frame_errors = mac_stats->aAlignmentErrors;
> + stats->rx_fifo_errors = mac_stats->etherStatsDropEvents;
> + stats->rx_missed_errors = 0;
> + stats->tx_window_errors = 0;
> +
> + stats->rx_errors = mac_stats->ifInErrors;
> + stats->tx_errors = mac_stats->ifOutErrors;
> +
> + return stats;
> +}
> +
> static void al_eth_get_drvinfo(struct net_device *dev,
> struct ethtool_drvinfo *info)
> {
> @@ -2763,6 +2798,7 @@ static const struct net_device_ops al_eth_netdev_ops = {
> .ndo_stop = al_eth_close,
> .ndo_start_xmit = al_eth_start_xmit,
> .ndo_select_queue = al_eth_select_queue,
> + .ndo_get_stats64 = al_eth_get_stats64,
> .ndo_do_ioctl = al_eth_ioctl,
> .ndo_tx_timeout = al_eth_tx_timeout,
> .ndo_change_mtu = al_eth_change_mtu,
> diff --git a/drivers/net/ethernet/annapurna/al_hw_eth.h b/drivers/net/ethernet/annapurna/al_hw_eth.h
> index b2fc58793b3a..a44f3f200838 100644
> --- a/drivers/net/ethernet/annapurna/al_hw_eth.h
> +++ b/drivers/net/ethernet/annapurna/al_hw_eth.h
> @@ -982,6 +982,15 @@ struct al_eth_mac_stats {
> };
>
> /*
> + * get mac statistics
> + * @param adapter pointer to the private structure.
> + * @param stats pointer to structure that will be filled with statistics.
> + *
> + * @return return 0 on success. otherwise on failure.
> + */
> +int al_eth_mac_stats_get(struct al_hw_eth_adapter *adapter, struct al_eth_mac_stats *stats);
> +
> +/*
> * perform Function Level Reset RMN
> *
> * Addressing RMN: 714
> diff --git a/drivers/net/ethernet/annapurna/al_hw_eth_main.c b/drivers/net/ethernet/annapurna/al_hw_eth_main.c
> index abb9ffd09fbf..dac0c1e2a941 100644
> --- a/drivers/net/ethernet/annapurna/al_hw_eth_main.c
> +++ b/drivers/net/ethernet/annapurna/al_hw_eth_main.c
> @@ -2639,6 +2639,231 @@ int al_eth_flow_control_config(struct al_hw_eth_adapter *adapter,
> return 0;
> }
>
> +/* get statistics */
> +int al_eth_mac_stats_get(struct al_hw_eth_adapter *adapter, struct al_eth_mac_stats *stats)
> +{
> + WARN_ON(!stats);
> +
> + memset(stats, 0, sizeof(struct al_eth_mac_stats));
> +
> + if (AL_ETH_IS_1G_MAC(adapter->mac_mode)) {
> + struct al_eth_mac_1g_stats __iomem *reg_stats =
> + &adapter->mac_regs_base->mac_1g.stats;
> +
> + stats->ifInUcastPkts = readl(®_stats->ifInUcastPkts);
> + stats->ifInMulticastPkts = readl(®_stats->ifInMulticastPkts);
> + stats->ifInBroadcastPkts = readl(®_stats->ifInBroadcastPkts);
> + stats->etherStatsPkts = readl(®_stats->etherStatsPkts);
> + stats->ifOutUcastPkts = readl(®_stats->ifOutUcastPkts);
> + stats->ifOutMulticastPkts = readl(®_stats->ifOutMulticastPkts);
> + stats->ifOutBroadcastPkts = readl(®_stats->ifOutBroadcastPkts);
> + stats->ifInErrors = readl(®_stats->ifInErrors);
> + stats->ifOutErrors = readl(®_stats->ifOutErrors);
> + stats->aFramesReceivedOK = readl(®_stats->aFramesReceivedOK);
> + stats->aFramesTransmittedOK = readl(®_stats->aFramesTransmittedOK);
> + stats->aOctetsReceivedOK = readl(®_stats->aOctetsReceivedOK);
> + stats->aOctetsTransmittedOK = readl(®_stats->aOctetsTransmittedOK);
> + stats->etherStatsUndersizePkts = readl(®_stats->etherStatsUndersizePkts);
> + stats->etherStatsFragments = readl(®_stats->etherStatsFragments);
> + stats->etherStatsJabbers = readl(®_stats->etherStatsJabbers);
> + stats->etherStatsOversizePkts = readl(®_stats->etherStatsOversizePkts);
> + stats->aFrameCheckSequenceErrors =
> + readl(®_stats->aFrameCheckSequenceErrors);
> + stats->aAlignmentErrors = readl(®_stats->aAlignmentErrors);
> + stats->etherStatsDropEvents = readl(®_stats->etherStatsDropEvents);
> + stats->aPAUSEMACCtrlFramesTransmitted =
> + readl(®_stats->aPAUSEMACCtrlFramesTransmitted);
> + stats->aPAUSEMACCtrlFramesReceived =
> + readl(®_stats->aPAUSEMACCtrlFramesReceived);
> + stats->aFrameTooLongErrors = 0; /* N/A */
> + stats->aInRangeLengthErrors = 0; /* N/A */
> + stats->VLANTransmittedOK = 0; /* N/A */
> + stats->VLANReceivedOK = 0; /* N/A */
> + stats->etherStatsOctets = readl(®_stats->etherStatsOctets);
> + stats->etherStatsPkts64Octets = readl(®_stats->etherStatsPkts64Octets);
> + stats->etherStatsPkts65to127Octets =
> + readl(®_stats->etherStatsPkts65to127Octets);
> + stats->etherStatsPkts128to255Octets =
> + readl(®_stats->etherStatsPkts128to255Octets);
> + stats->etherStatsPkts256to511Octets =
> + readl(®_stats->etherStatsPkts256to511Octets);
> + stats->etherStatsPkts512to1023Octets =
> + readl(®_stats->etherStatsPkts512to1023Octets);
> + stats->etherStatsPkts1024to1518Octets =
> + readl(®_stats->etherStatsPkts1024to1518Octets);
> + stats->etherStatsPkts1519toX = readl(®_stats->etherStatsPkts1519toX);
> + } else if (AL_ETH_IS_10G_MAC(adapter->mac_mode) || AL_ETH_IS_25G_MAC(adapter->mac_mode)) {
> + if (adapter->rev_id < AL_ETH_REV_ID_3) {
> + struct al_eth_mac_10g_stats_v2 __iomem *reg_stats =
> + &adapter->mac_regs_base->mac_10g.stats.v2;
> + u64 octets;
> +
Using a structure to describe HW register is really ugly here, can't you
either come up with separate functions per generation of the hardware,
or even indirection tables with register offsets? Most statistics read
seem to be identical between generations of the HW, but their location
might differ.
> + stats->ifInUcastPkts = readl(®_stats->ifInUcastPkts);
> + stats->ifInMulticastPkts = readl(®_stats->ifInMulticastPkts);
> + stats->ifInBroadcastPkts = readl(®_stats->ifInBroadcastPkts);
> + stats->etherStatsPkts = readl(®_stats->etherStatsPkts);
> + stats->ifOutUcastPkts = readl(®_stats->ifOutUcastPkts);
> + stats->ifOutMulticastPkts = readl(®_stats->ifOutMulticastPkts);
> + stats->ifOutBroadcastPkts = readl(®_stats->ifOutBroadcastPkts);
> + stats->ifInErrors = readl(®_stats->ifInErrors);
> + stats->ifOutErrors = readl(®_stats->ifOutErrors);
> + stats->aFramesReceivedOK = readl(®_stats->aFramesReceivedOK);
> + stats->aFramesTransmittedOK = readl(®_stats->aFramesTransmittedOK);
> +
> + /* aOctetsReceivedOK = ifInOctets - 18 * aFramesReceivedOK - 4 * VLANReceivedOK */
> + octets = readl(®_stats->ifInOctetsL);
> + octets |= (u64)(readl(®_stats->ifInOctetsH)) << 32;
> + octets -= 18 * stats->aFramesReceivedOK;
> + octets -= 4 * readl(®_stats->VLANReceivedOK);
> + stats->aOctetsReceivedOK = octets;
> +
> + /* aOctetsTransmittedOK = ifOutOctets - 18 * aFramesTransmittedOK - 4 * VLANTransmittedOK */
What's that 18 for? Ethernet header + VLAN header? If so, express it
with appropriate constants
> + octets = readl(®_stats->ifOutOctetsL);
> + octets |= (u64)(readl(®_stats->ifOutOctetsH)) << 32;
upper_32_bits()
> + octets -= 18 * stats->aFramesTransmittedOK;
What's that 18 for? Ethernet header + VLAN header? If so, express it
with appropriate constants
> + octets -= 4 * readl(®_stats->VLANTransmittedOK);
4 = ETH_VLAN_HLEN
> + stats->aOctetsTransmittedOK = octets;
> +
--
Florian
next prev parent reply other threads:[~2017-02-03 19:34 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-02-03 18:12 [PATCH net-next 0/8] ARM: Alpine: Ethernet support Antoine Tenart
2017-02-03 18:12 ` Antoine Tenart
2017-02-03 18:12 ` [PATCH net-next 1/8] alpine: add I/O fabric interrupt controller (iofic) helpers Antoine Tenart
2017-02-03 18:12 ` Antoine Tenart
2017-02-03 18:12 ` [PATCH net-next 2/8] soc: alpine: add udma helpers Antoine Tenart
2017-02-03 18:12 ` Antoine Tenart
2017-02-03 18:12 ` [PATCH net-next 3/8] pci: add Annapurna Labs PCI id Antoine Tenart
2017-02-03 18:12 ` Antoine Tenart
2017-02-03 18:12 ` [PATCH net-next 4/8] net: ethernet: add the Alpine Ethernet driver Antoine Tenart
2017-02-03 20:58 ` Andrew Lunn
2017-02-03 20:58 ` Andrew Lunn
2017-08-07 7:39 ` Chocron, Jonathan
2017-08-07 7:39 ` Chocron, Jonathan
2017-08-27 13:47 ` Chocron, Jonathan
2017-08-27 13:47 ` Chocron, Jonathan
2017-08-28 18:09 ` Andrew Lunn
2017-08-28 18:09 ` Andrew Lunn
2017-11-02 16:05 ` Chocron, Jonathan
2017-11-02 16:05 ` Chocron, Jonathan
2017-11-02 18:19 ` Florian Fainelli
2017-11-02 18:19 ` Florian Fainelli
2017-11-05 12:29 ` BSHARA, Said
2017-11-05 12:29 ` BSHARA, Said
2017-11-05 15:22 ` Andrew Lunn
2017-11-05 15:22 ` Andrew Lunn
2017-02-03 18:12 ` [PATCH net-next 5/8] net: ethernet: annapurna: add statistics helper Antoine Tenart
2017-02-03 18:12 ` Antoine Tenart
2017-02-03 19:34 ` Florian Fainelli [this message]
2017-02-03 19:34 ` Florian Fainelli
2017-02-03 21:24 ` kbuild test robot
2017-02-03 21:24 ` kbuild test robot
2017-02-03 18:12 ` [PATCH net-next 6/8] net: ethernet: annapurna: add wol helpers to the Alpine driver Antoine Tenart
2017-02-03 18:12 ` Antoine Tenart
2017-02-03 18:21 ` Sergei Shtylyov
2017-02-03 18:21 ` Sergei Shtylyov
2017-02-06 11:35 ` David Laight
2017-02-06 11:35 ` David Laight
2017-02-06 12:02 ` Sergei Shtylyov
2017-02-06 12:02 ` Sergei Shtylyov
2017-02-10 10:12 ` Antoine Tenart
2017-02-10 10:12 ` Antoine Tenart
2017-02-03 18:12 ` [PATCH net-next 7/8] net: ethernet: annapurna: add eee " Antoine Tenart
2017-02-03 18:12 ` Antoine Tenart
2017-02-03 19:01 ` Florian Fainelli
2017-02-03 19:01 ` Florian Fainelli
2017-02-03 18:12 ` [PATCH net-next 8/8] net: ethernet: annapurna: add the coalesce " Antoine Tenart
2017-02-03 18:12 ` Antoine Tenart
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ee80d905-8d48-9e46-17ef-bc4242052172@gmail.com \
--to=f.fainelli@gmail.com \
--cc=linux-arm-kernel@lists.infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.