struct xgbe_ring_data *rdata;
        struct xgbe_ring_desc *rdesc;
        struct xgbe_packet_data *packet = &ring->packet_data;
+       unsigned int tx_packets, tx_bytes;
        unsigned int csum, tso, vlan;
        unsigned int tso_context, vlan_context;
        unsigned int tx_set_ic;
 
        DBGPR("-->xgbe_dev_xmit\n");
 
+       tx_packets = packet->tx_packets;
+       tx_bytes = packet->tx_bytes;
+
        csum = XGMAC_GET_BITS(packet->attributes, TX_PACKET_ATTRIBUTES,
                              CSUM_ENABLE);
        tso = XGMAC_GET_BITS(packet->attributes, TX_PACKET_ATTRIBUTES,
         *     - Addition of Tx frame count to the frame count since the
         *       last interrupt was set does not exceed the frame count setting
         */
-       ring->coalesce_count += packet->tx_packets;
+       ring->coalesce_count += tx_packets;
        if (!pdata->tx_frames)
                tx_set_ic = 0;
-       else if (packet->tx_packets > pdata->tx_frames)
+       else if (tx_packets > pdata->tx_frames)
                tx_set_ic = 1;
-       else if ((ring->coalesce_count % pdata->tx_frames) <
-                packet->tx_packets)
+       else if ((ring->coalesce_count % pdata->tx_frames) < tx_packets)
                tx_set_ic = 1;
        else
                tx_set_ic = 0;
                XGMAC_SET_BITS_LE(rdesc->desc3, TX_NORMAL_DESC3, TCPHDRLEN,
                                  packet->tcp_header_len / 4);
 
-               pdata->ext_stats.tx_tso_packets += packet->tx_packets;
+               pdata->ext_stats.tx_tso_packets += tx_packets;
        } else {
                /* Enable CRC and Pad Insertion */
                XGMAC_SET_BITS_LE(rdesc->desc3, TX_NORMAL_DESC3, CPC, 0);
                XGMAC_SET_BITS_LE(rdesc->desc2, TX_NORMAL_DESC2, IC, 1);
 
        /* Save the Tx info to report back during cleanup */
-       rdata->tx.packets = packet->tx_packets;
-       rdata->tx.bytes = packet->tx_bytes;
+       rdata->tx.packets = tx_packets;
+       rdata->tx.bytes = tx_bytes;
+
+       pdata->ext_stats.txq_packets[channel->queue_index] += tx_packets;
+       pdata->ext_stats.txq_bytes[channel->queue_index] += tx_bytes;
 
        /* In case the Tx DMA engine is running, make sure everything
         * is written to the descriptor(s) before setting the OWN bit
                                       FRAME, 1);
        }
 
+       pdata->ext_stats.rxq_packets[channel->queue_index]++;
+       pdata->ext_stats.rxq_bytes[channel->queue_index] += rdata->rx.len;
+
        DBGPR("<--xgbe_dev_read: %s - descriptor=%u (cur=%d)\n", channel->name,
              ring->cur & (ring->rdesc_count - 1), ring->cur);
 
 
 
 static void xgbe_get_strings(struct net_device *netdev, u32 stringset, u8 *data)
 {
+       struct xgbe_prv_data *pdata = netdev_priv(netdev);
        int i;
 
        switch (stringset) {
                               ETH_GSTRING_LEN);
                        data += ETH_GSTRING_LEN;
                }
+               for (i = 0; i < pdata->tx_ring_count; i++) {
+                       sprintf(data, "txq_%u_packets", i);
+                       data += ETH_GSTRING_LEN;
+                       sprintf(data, "txq_%u_bytes", i);
+                       data += ETH_GSTRING_LEN;
+               }
+               for (i = 0; i < pdata->rx_ring_count; i++) {
+                       sprintf(data, "rxq_%u_packets", i);
+                       data += ETH_GSTRING_LEN;
+                       sprintf(data, "rxq_%u_bytes", i);
+                       data += ETH_GSTRING_LEN;
+               }
                break;
        }
 }
                stat = (u8 *)pdata + xgbe_gstring_stats[i].stat_offset;
                *data++ = *(u64 *)stat;
        }
+       for (i = 0; i < pdata->tx_ring_count; i++) {
+               *data++ = pdata->ext_stats.txq_packets[i];
+               *data++ = pdata->ext_stats.txq_bytes[i];
+       }
+       for (i = 0; i < pdata->rx_ring_count; i++) {
+               *data++ = pdata->ext_stats.rxq_packets[i];
+               *data++ = pdata->ext_stats.rxq_bytes[i];
+       }
 }
 
 static int xgbe_get_sset_count(struct net_device *netdev, int stringset)
 {
+       struct xgbe_prv_data *pdata = netdev_priv(netdev);
        int ret;
 
        switch (stringset) {
        case ETH_SS_STATS:
-               ret = XGBE_STATS_COUNT;
+               ret = XGBE_STATS_COUNT +
+                     (pdata->tx_ring_count * 2) +
+                     (pdata->rx_ring_count * 2);
                break;
 
        default: