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;
|
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 {
|
||||||
|
Loading…
Reference in New Issue
Block a user