forked from Minki/linux
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: Mike McCormack <mikem@ring3k.org> Acked-by: Stephen Hemminger <shemminger@vyatta.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
44dde56d37
commit
39ef110ba8
@ -1049,6 +1049,40 @@ static inline struct sky2_rx_le *sky2_next_rx(struct sky2_port *sky2)
|
||||
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 */
|
||||
static void sky2_rx_add(struct sky2_port *sky2, u8 op,
|
||||
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 rx_ring_info *re;
|
||||
unsigned rxq = rxqaddr[sky2->port];
|
||||
unsigned i, size, thresh;
|
||||
unsigned i, thresh;
|
||||
|
||||
sky2->rx_put = sky2->rx_next = 0;
|
||||
sky2_qset(hw, rxq);
|
||||
@ -1364,25 +1398,7 @@ static int sky2_rx_start(struct sky2_port *sky2)
|
||||
if (!(hw->flags & SKY2_HW_NEW_LE))
|
||||
rx_set_checksum(sky2);
|
||||
|
||||
/* Space needed for frame data + headers rounded up */
|
||||
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;
|
||||
sky2->rx_data_size = sky2_get_rx_data_size(sky2);
|
||||
|
||||
/* Fill Rx ring */
|
||||
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
|
||||
* you better get the MTU right!
|
||||
*/
|
||||
thresh = sky2_get_rx_threshold(sky2);
|
||||
if (thresh > 0x1ff)
|
||||
sky2_write32(hw, SK_REG(sky2->port, RX_GMF_CTRL_T), RX_TRUNC_OFF);
|
||||
else {
|
||||
|
Loading…
Reference in New Issue
Block a user