Thread (1 message) 1 message, 1 author, 2004-06-18
DORMANTno replies

[PATCH 2.6.7-rc3-mm2 3/5] via-velocity: velocity_receive_frame diets

From: Francois Romieu <romieu@fr.zoreil.com>
Date: 2004-06-18 20:13:36

Weight loss in velocity_receive_frame():
- isolate the ip header alignment tsk from velocity_receive_frame();
- following p.30 of the datasheet, rdesc0.len includes the CRC length:
  the amount of data copied during the ip alignment can be shortened.

diff -puN drivers/net/via-velocity.c~via-velocity-40 drivers/net/via-velocity.c
--- linux-2.6.7-rc3/drivers/net/via-velocity.c~via-velocity-40	2004-06-18 21:38:59.000000000 +0200
+++ linux-2.6.7-rc3-fr/drivers/net/via-velocity.c	2004-06-18 21:58:58.000000000 +0200
@@ -1255,6 +1255,28 @@ static inline void velocity_rx_csum(stru
 }
 
 /**
+ *	velocity_iph_realign	-	IP header alignment
+ *	@vptr: velocity we are handling
+ *	@skb: network layer packet buffer
+ *	@pkt_size: received data size
+ *
+ *	Align IP header on a 2 bytes boundary. This behavior can be
+ *	configured by the user.
+ */
+static inline void velocity_iph_realign(struct velocity_info *vptr,
+					struct sk_buff *skb, int pkt_size)
+{
+	/* FIXME - memmove ? */
+	if (vptr->flags & VELOCITY_FLAGS_IP_ALIGN) {
+		int i;
+
+		for (i = pkt_size; i >= 0; i--)
+			*(skb->data + i + 2) = *(skb->data + i);
+		skb_reserve(skb, 2);
+	}
+}
+
+/**
  *	velocity_receive_frame	-	received packet processor
  *	@vptr: velocity we are handling
  *	@idx: ring index
@@ -1268,6 +1290,7 @@ static int velocity_receive_frame(struct
 	struct net_device_stats *stats = &vptr->stats;
 	struct velocity_rd_info *rd_info = &(vptr->rd_info[idx]);
 	struct rx_desc *rd = &(vptr->rd_ring[idx]);
+	int pkt_len = rd->rdesc0.len;
 	struct sk_buff *skb;
 
 	if (rd->rdesc0.RSR & (RSR_STP | RSR_EDP)) {
@@ -1287,16 +1310,9 @@ static int velocity_receive_frame(struct
 	rd_info->skb_dma = (dma_addr_t) NULL;
 	rd_info->skb = NULL;
 
-	/* FIXME - memmove ? */
-	if (vptr->flags & VELOCITY_FLAGS_IP_ALIGN) {
-		int i;
-		for (i = rd->rdesc0.len + 4; i >= 0; i--)
-			*(skb->data + i + 2) = *(skb->data + i);
-		skb->data += 2;
-		skb->tail += 2;
-	}
+	velocity_iph_realign(vptr, skb, pkt_len);
 
-	skb_put(skb, (rd->rdesc0.len - 4));
+	skb_put(skb, pkt_len - 4);
 	skb->protocol = eth_type_trans(skb, skb->dev);
 
 	/*
@@ -1316,7 +1332,7 @@ static int velocity_receive_frame(struct
 	 *	FIXME: need rx_copybreak handling
 	 */
 
-	stats->rx_bytes += skb->len;
+	stats->rx_bytes += pkt_len;
 	netif_rx(skb);
 
 	return 0;
_
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help