sky2: Factor out code to calculate packet sizes
Subsystems (2)
PATCH 1/5 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 <[email protected]>
--- drivers/net/sky2.c | 57 +++++++++++++++++++++++++++++++++------------------ 1 files changed, 37 insertions(+), 20 deletions(-)
drivers/net/sky2.c +37 -20
@@ -1065,6 +1065,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)
@@ -1359,7 +1393,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);
@@ -1380,25 +1414,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++) {
@@ -1423,6 +1439,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 {
Signature · 1 line
1.5.6.5