ixgbe: add xstats
[dpdk.git] / drivers / net / bonding / rte_eth_bond_pmd.c
index c937e6b..989e878 100644 (file)
@@ -466,8 +466,10 @@ bond_ethdev_tx_burst_active_backup(void *queue,
 static inline uint16_t
 ether_hash(struct ether_hdr *eth_hdr)
 {
-       uint16_t *word_src_addr = (uint16_t *)eth_hdr->s_addr.addr_bytes;
-       uint16_t *word_dst_addr = (uint16_t *)eth_hdr->d_addr.addr_bytes;
+       unaligned_uint16_t *word_src_addr =
+               (unaligned_uint16_t *)eth_hdr->s_addr.addr_bytes;
+       unaligned_uint16_t *word_dst_addr =
+               (unaligned_uint16_t *)eth_hdr->d_addr.addr_bytes;
 
        return (word_src_addr[0] ^ word_dst_addr[0]) ^
                        (word_src_addr[1] ^ word_dst_addr[1]) ^
@@ -483,8 +485,10 @@ ipv4_hash(struct ipv4_hdr *ipv4_hdr)
 static inline uint32_t
 ipv6_hash(struct ipv6_hdr *ipv6_hdr)
 {
-       uint32_t *word_src_addr = (uint32_t *)&(ipv6_hdr->src_addr[0]);
-       uint32_t *word_dst_addr = (uint32_t *)&(ipv6_hdr->dst_addr[0]);
+       unaligned_uint32_t *word_src_addr =
+               (unaligned_uint32_t *)&(ipv6_hdr->src_addr[0]);
+       unaligned_uint32_t *word_dst_addr =
+               (unaligned_uint32_t *)&(ipv6_hdr->dst_addr[0]);
 
        return (word_src_addr[0] ^ word_dst_addr[0]) ^
                        (word_src_addr[1] ^ word_dst_addr[1]) ^
@@ -1357,6 +1361,11 @@ slave_configure(struct rte_eth_dev *bonded_eth_dev,
                return -1;
        }
 
+       /* If lsc interrupt is set, check initial slave's link status */
+       if (slave_eth_dev->driver->pci_drv.drv_flags & RTE_PCI_DRV_INTR_LSC)
+               bond_ethdev_lsc_event_callback(slave_eth_dev->data->port_id,
+                               RTE_ETH_EVENT_INTR_LSC, &bonded_eth_dev->data->port_id);
+
        return 0;
 }
 
@@ -1516,8 +1525,8 @@ bond_ethdev_stop(struct rte_eth_dev *eth_dev)
                bond_mode_8023ad_stop(eth_dev);
 
                /* Discard all messages to/from mode 4 state machines */
-               for (i = 0; i < internals->slave_count; i++) {
-                       port = &mode_8023ad_ports[internals->slaves[i].port_id];
+               for (i = 0; i < internals->active_slave_count; i++) {
+                       port = &mode_8023ad_ports[internals->active_slaves[i]];
 
                        RTE_VERIFY(port->rx_ring != NULL);
                        while (rte_ring_dequeue(port->rx_ring, &pkt) != -ENOENT)
@@ -1730,12 +1739,8 @@ bond_ethdev_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
 {
        struct bond_dev_private *internals = dev->data->dev_private;
        struct rte_eth_stats slave_stats;
-
        int i;
 
-       /* clear bonded stats before populating from slaves */
-       memset(stats, 0, sizeof(*stats));
-
        for (i = 0; i < internals->slave_count; i++) {
                rte_eth_stats_get(internals->slaves[i].port_id, &slave_stats);