Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 39ef110b authored by Mike McCormack's avatar Mike McCormack Committed by David S. Miller
Browse files

sky2: Factor out code to calculate packet sizes



Move code to calculate receive threshold and packet size out of
sky2_rx_start() so that is can be called from elsewhere easily.

Signed-off-by: default avatarMike McCormack <mikem@ring3k.org>
Acked-by: default avatarStephen Hemminger <shemminger@vyatta.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 44dde56d
Loading
Loading
Loading
Loading
+37 −20
Original line number Original line Diff line number Diff line
@@ -1049,6 +1049,40 @@ static inline struct sky2_rx_le *sky2_next_rx(struct sky2_port *sky2)
	return le;
	return le;
}
}


static unsigned sky2_get_rx_threshold(struct sky2_port* sky2)
{
	unsigned size;

	/* Space needed for frame data + headers rounded up */
	size = roundup(sky2->netdev->mtu + ETH_HLEN + VLAN_HLEN, 8);

	/* Stopping point for hardware truncation */
	return (size - 8) / sizeof(u32);
}

static unsigned sky2_get_rx_data_size(struct sky2_port* sky2)
{
	struct rx_ring_info *re;
	unsigned size;

	/* Space needed for frame data + headers rounded up */
	size = roundup(sky2->netdev->mtu + ETH_HLEN + VLAN_HLEN, 8);

	sky2->rx_nfrags = size >> PAGE_SHIFT;
	BUG_ON(sky2->rx_nfrags > ARRAY_SIZE(re->frag_addr));

	/* Compute residue after pages */
	size -= sky2->rx_nfrags << PAGE_SHIFT;

	/* Optimize to handle small packets and headers */
	if (size < copybreak)
		size = copybreak;
	if (size < ETH_HLEN)
		size = ETH_HLEN;

	return size;
}

/* Build description to hardware for one receive segment */
/* Build description to hardware for one receive segment */
static void sky2_rx_add(struct sky2_port *sky2,  u8 op,
static void sky2_rx_add(struct sky2_port *sky2,  u8 op,
			dma_addr_t map, unsigned len)
			dma_addr_t map, unsigned len)
@@ -1343,7 +1377,7 @@ static int sky2_rx_start(struct sky2_port *sky2)
	struct sky2_hw *hw = sky2->hw;
	struct sky2_hw *hw = sky2->hw;
	struct rx_ring_info *re;
	struct rx_ring_info *re;
	unsigned rxq = rxqaddr[sky2->port];
	unsigned rxq = rxqaddr[sky2->port];
	unsigned i, size, thresh;
	unsigned i, thresh;


	sky2->rx_put = sky2->rx_next = 0;
	sky2->rx_put = sky2->rx_next = 0;
	sky2_qset(hw, rxq);
	sky2_qset(hw, rxq);
@@ -1364,25 +1398,7 @@ static int sky2_rx_start(struct sky2_port *sky2)
	if (!(hw->flags & SKY2_HW_NEW_LE))
	if (!(hw->flags & SKY2_HW_NEW_LE))
		rx_set_checksum(sky2);
		rx_set_checksum(sky2);


	/* Space needed for frame data + headers rounded up */
	sky2->rx_data_size = sky2_get_rx_data_size(sky2);
	size = roundup(sky2->netdev->mtu + ETH_HLEN + VLAN_HLEN, 8);

	/* Stopping point for hardware truncation */
	thresh = (size - 8) / sizeof(u32);

	sky2->rx_nfrags = size >> PAGE_SHIFT;
	BUG_ON(sky2->rx_nfrags > ARRAY_SIZE(re->frag_addr));

	/* Compute residue after pages */
	size -= sky2->rx_nfrags << PAGE_SHIFT;

	/* Optimize to handle small packets and headers */
	if (size < copybreak)
		size = copybreak;
	if (size < ETH_HLEN)
		size = ETH_HLEN;

	sky2->rx_data_size = size;


	/* Fill Rx ring */
	/* Fill Rx ring */
	for (i = 0; i < sky2->rx_pending; i++) {
	for (i = 0; i < sky2->rx_pending; i++) {
@@ -1407,6 +1423,7 @@ static int sky2_rx_start(struct sky2_port *sky2)
	 * the register is limited to 9 bits, so if you do frames > 2052
	 * the register is limited to 9 bits, so if you do frames > 2052
	 * you better get the MTU right!
	 * you better get the MTU right!
	 */
	 */
	thresh = sky2_get_rx_threshold(sky2);
	if (thresh > 0x1ff)
	if (thresh > 0x1ff)
		sky2_write32(hw, SK_REG(sky2->port, RX_GMF_CTRL_T), RX_TRUNC_OFF);
		sky2_write32(hw, SK_REG(sky2->port, RX_GMF_CTRL_T), RX_TRUNC_OFF);
	else {
	else {