Beispiel #1
0
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);
	}
}
Beispiel #3
0
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);
	}
}