void mlx4_en_calc_rx_buf(struct net_device *dev) { struct mlx4_en_priv *priv = netdev_priv(dev); int eff_mtu = dev->if_mtu + ETHER_HDR_LEN + ETHER_VLAN_ENCAP_LEN + ETH_LLC_SNAP_SIZE; int buf_size = 0; int i, frag; for (i = 0, frag = 0; buf_size < eff_mtu; frag++, i++) { /* * Allocate small to large but only as much as is needed for * the tail. */ while (i > 0 && eff_mtu - buf_size <= frag_sizes[i - 1]) i--; priv->frag_info[frag].frag_size = frag_sizes[i]; priv->frag_info[frag].frag_prefix_size = buf_size; buf_size += priv->frag_info[frag].frag_size; } priv->num_frags = frag; priv->rx_mb_size = eff_mtu; priv->log_rx_info = ROUNDUP_LOG2(priv->num_frags * sizeof(struct mbuf *)); en_dbg(DRV, priv, "Rx buffer scatter-list (effective-mtu:%d " "num_frags:%d):\n", eff_mtu, priv->num_frags); for (i = 0; i < priv->num_frags; i++) { en_dbg(DRV, priv, " frag:%d - size:%d prefix:%d\n", i, priv->frag_info[i].frag_size, priv->frag_info[i].frag_prefix_size) } }
void vnic_calc_rx_buf(struct vnic_rx_ring *ring) { int eff_mtu = VNIC_BUF_SIZE(ring->port), buf_size = 0, i = 0; if (vnic_rx_linear) { ring->num_frags = 1; return; } while (buf_size < eff_mtu) { ring->frag_info[i].frag_size = (eff_mtu > buf_size + frag_sizes[i]) ? frag_sizes[i] : eff_mtu - buf_size; ring->frag_info[i].frag_prefix_size = buf_size; if (!i) { ring->frag_info[i].frag_align = NET_IP_ALIGN; ring->frag_info[i].frag_stride = ALIGN(frag_sizes[i] + NET_IP_ALIGN, SMP_CACHE_BYTES); } else { ring->frag_info[i].frag_align = 0; ring->frag_info[i].frag_stride = ALIGN(frag_sizes[i], SMP_CACHE_BYTES); } ring->frag_info[i].last_offset = vnic_last_alloc_offset(ring, ring->frag_info[i].frag_stride, ring->frag_info[i].frag_align); buf_size += ring->frag_info[i].frag_size; i++; } ring->num_frags = i; ring->rx_skb_size = eff_mtu; ring->log_rx_info = ROUNDUP_LOG2(i * sizeof(struct skb_frag_struct)); vnic_dbg(ring->port->name, "Rx buffer scatter-list (ring %d effective-mtu:%d " "num_frags:%d):\n", ring->index ,eff_mtu, ring->num_frags); for (i = 0; i < ring->num_frags; i++) { vnic_dbg(ring->port->name, "frag:%d - size:%d prefix:%d align:%d " "stride:%d last_offset:%d\n", i, ring->frag_info[i].frag_size, ring->frag_info[i].frag_prefix_size, ring->frag_info[i].frag_align, ring->frag_info[i].frag_stride, ring->frag_info[i].last_offset); } }
void mlx4_en_calc_rx_buf(struct net_device *dev) { struct mlx4_en_priv *priv = netdev_priv(dev); int eff_mtu = dev->mtu + ETH_HLEN + VLAN_HLEN + ETH_LLC_SNAP_SIZE; int buf_size = 0; int i = 0; while (buf_size < eff_mtu) { priv->frag_info[i].frag_size = (eff_mtu > buf_size + frag_sizes[i]) ? frag_sizes[i] : eff_mtu - buf_size; priv->frag_info[i].frag_prefix_size = buf_size; if (!i) { priv->frag_info[i].frag_align = NET_IP_ALIGN; priv->frag_info[i].frag_stride = ALIGN(frag_sizes[i] + NET_IP_ALIGN, SMP_CACHE_BYTES); } else { priv->frag_info[i].frag_align = 0; priv->frag_info[i].frag_stride = ALIGN(frag_sizes[i], SMP_CACHE_BYTES); } priv->frag_info[i].last_offset = mlx4_en_last_alloc_offset( priv, priv->frag_info[i].frag_stride, priv->frag_info[i].frag_align); buf_size += priv->frag_info[i].frag_size; i++; } priv->num_frags = i; priv->rx_skb_size = eff_mtu; priv->log_rx_info = ROUNDUP_LOG2(i * sizeof(struct skb_frag_struct)); en_dbg(DRV, priv, "Rx buffer scatter-list (effective-mtu:%d " "num_frags:%d):\n", eff_mtu, priv->num_frags); for (i = 0; i < priv->num_frags; i++) { en_dbg(DRV, priv, " frag:%d - size:%d prefix:%d align:%d " "stride:%d last_offset:%d\n", i, priv->frag_info[i].frag_size, priv->frag_info[i].frag_prefix_size, priv->frag_info[i].frag_align, priv->frag_info[i].frag_stride, priv->frag_info[i].last_offset); } }