Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 184035
b: refs/heads/master
c: 39ef110
h: refs/heads/master
i:
  184033: e28a1ad
  184031: 7a0dece
v: v3
  • Loading branch information
Mike McCormack authored and David S. Miller committed Feb 13, 2010
1 parent edacf8a commit 09201b7
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 21 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 44dde56d37787cbad2e867a41fe87d6b0aa37fc8
refs/heads/master: 39ef110ba859f44efeb9a88d0e85316cd1bbecda
57 changes: 37 additions & 20 deletions trunk/drivers/net/sky2.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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);
Expand All @@ -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++) {
Expand All @@ -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 {
Expand Down

0 comments on commit 09201b7

Please sign in to comment.