sky2: Factor out code to calculate packet sizes
authorMike McCormack <mikem@ring3k.org>
Fri, 12 Feb 2010 06:58:02 +0000 (06:58 +0000)
committerDavid S. Miller <davem@davemloft.net>
Sat, 13 Feb 2010 00:21:02 +0000 (16:21 -0800)
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>
drivers/net/sky2.c

index 8a87e16e732f93702c1acaaffe1fc685636b7b42..c5de65c6f6e11b4c3f563d38df74105821b45e64 100644 (file)
@@ -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 {