Print this page
12011 ixgbe reports incorrect MAC_STAT_NORCVBUF
Change-Id: Ia71b5669b2bc8f6256a84b0b9c673153f327f5ab

*** 23,33 **** * Copyright(c) 2007-2010 Intel Corporation. All rights reserved. */ /* * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. ! * Copyright (c) 2017, Joyent, Inc. * Copyright 2012 Nexenta Systems, Inc. All rights reserved. * Copyright (c) 2013 Saso Kiselkov. All rights reserved. * Copyright (c) 2013 OSN Online Service Nuernberg GmbH. All rights reserved. * Copyright 2016 OmniTI Computer Consulting, Inc. All rights reserved. */ --- 23,33 ---- * Copyright(c) 2007-2010 Intel Corporation. All rights reserved. */ /* * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. ! * Copyright 2019 Joyent, Inc. * Copyright 2012 Nexenta Systems, Inc. All rights reserved. * Copyright (c) 2013 Saso Kiselkov. All rights reserved. * Copyright (c) 2013 OSN Online Service Nuernberg GmbH. All rights reserved. * Copyright 2016 OmniTI Computer Consulting, Inc. All rights reserved. */
*** 2439,2450 **** ixgbe_setup_rx(ixgbe_t *ixgbe) { ixgbe_rx_ring_t *rx_ring; struct ixgbe_hw *hw = &ixgbe->hw; uint32_t reg_val; ! uint32_t ring_mapping; ! uint32_t i, index; uint32_t psrtype_rss_bit; /* * Ensure that Rx is disabled while setting up * the Rx unit and Rx descriptor ring(s) --- 2439,2449 ---- ixgbe_setup_rx(ixgbe_t *ixgbe) { ixgbe_rx_ring_t *rx_ring; struct ixgbe_hw *hw = &ixgbe->hw; uint32_t reg_val; ! uint32_t i; uint32_t psrtype_rss_bit; /* * Ensure that Rx is disabled while setting up * the Rx unit and Rx descriptor ring(s)
*** 2546,2563 **** rx_ring = &ixgbe->rx_rings[i]; ixgbe_setup_rx_ring(rx_ring); } /* ! * Setup the per-ring statistics mapping. */ - ring_mapping = 0; for (i = 0; i < ixgbe->num_rx_rings; i++) { ! index = ixgbe->rx_rings[i].hw_index; ! ring_mapping = IXGBE_READ_REG(hw, IXGBE_RQSMR(index >> 2)); ! ring_mapping |= (i & 0xF) << (8 * (index & 0x3)); ! IXGBE_WRITE_REG(hw, IXGBE_RQSMR(index >> 2), ring_mapping); } /* * The Max Frame Size in MHADD/MAXFRS will be internally increased * by four bytes if the packet has a VLAN field, so includes MTU, --- 2545,2571 ---- rx_ring = &ixgbe->rx_rings[i]; ixgbe_setup_rx_ring(rx_ring); } /* ! * The 82598 controller gives us the RNBC (Receive No Buffer ! * Count) register to determine the number of frames dropped ! * due to no available descriptors on the destination queue. ! * However, this register was removed starting with 82599 and ! * it was replaced with the RQSMR/QPRDC registers. The nice ! * thing about the new registers is that they allow you to map ! * groups of queues to specific stat registers. The bad thing ! * is there are only 16 slots in the stat registers, so this ! * won't work when we have 32 Rx groups. Instead, we map all ! * queues to the zero slot of the stat registers, giving us a ! * global counter at QPRDC[0] (with the equivalent semantics ! * of RNBC). Perhaps future controllers will have more slots ! * and we can implement per-group counters. */ for (i = 0; i < ixgbe->num_rx_rings; i++) { ! uint32_t index = ixgbe->rx_rings[i].hw_index; ! IXGBE_WRITE_REG(hw, IXGBE_RQSMR(index >> 2), 0); } /* * The Max Frame Size in MHADD/MAXFRS will be internally increased * by four bytes if the packet has a VLAN field, so includes MTU,
*** 2708,2771 **** ixgbe_setup_tx(ixgbe_t *ixgbe) { struct ixgbe_hw *hw = &ixgbe->hw; ixgbe_tx_ring_t *tx_ring; uint32_t reg_val; - uint32_t ring_mapping; int i; for (i = 0; i < ixgbe->num_tx_rings; i++) { tx_ring = &ixgbe->tx_rings[i]; ixgbe_setup_tx_ring(tx_ring); } /* ! * Setup the per-ring statistics mapping. */ - ring_mapping = 0; for (i = 0; i < ixgbe->num_tx_rings; i++) { - ring_mapping |= (i & 0xF) << (8 * (i & 0x3)); - if ((i & 0x3) == 0x3) { switch (hw->mac.type) { case ixgbe_mac_82598EB: ! IXGBE_WRITE_REG(hw, IXGBE_TQSMR(i >> 2), ! ring_mapping); break; - case ixgbe_mac_82599EB: - case ixgbe_mac_X540: - case ixgbe_mac_X550: - case ixgbe_mac_X550EM_x: - case ixgbe_mac_X550EM_a: - IXGBE_WRITE_REG(hw, IXGBE_TQSM(i >> 2), - ring_mapping); - break; - default: break; } - - ring_mapping = 0; - } - } - if (i & 0x3) { - switch (hw->mac.type) { - case ixgbe_mac_82598EB: - IXGBE_WRITE_REG(hw, IXGBE_TQSMR(i >> 2), ring_mapping); - break; - - case ixgbe_mac_82599EB: - case ixgbe_mac_X540: - case ixgbe_mac_X550: - case ixgbe_mac_X550EM_x: - case ixgbe_mac_X550EM_a: - IXGBE_WRITE_REG(hw, IXGBE_TQSM(i >> 2), ring_mapping); - break; - - default: - break; - } } /* * Enable CRC appending and TX padding (for short tx frames) */ --- 2716,2746 ---- ixgbe_setup_tx(ixgbe_t *ixgbe) { struct ixgbe_hw *hw = &ixgbe->hw; ixgbe_tx_ring_t *tx_ring; uint32_t reg_val; int i; for (i = 0; i < ixgbe->num_tx_rings; i++) { tx_ring = &ixgbe->tx_rings[i]; ixgbe_setup_tx_ring(tx_ring); } /* ! * Setup the per-ring statistics mapping. We map all Tx queues ! * to slot 0 to stay consistent with Rx. */ for (i = 0; i < ixgbe->num_tx_rings; i++) { switch (hw->mac.type) { case ixgbe_mac_82598EB: ! IXGBE_WRITE_REG(hw, IXGBE_TQSMR(i >> 2), 0); break; default: + IXGBE_WRITE_REG(hw, IXGBE_TQSM(i >> 2), 0); break; } } /* * Enable CRC appending and TX padding (for short tx frames) */