Skip to contentSkip to conversation

pasemi_mac: two bugfixes for 2.6.24

PATCH In review Olof Johansson 2 participants 4 messages Nov 7, 2007 – Nov 8, 2007

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

cover pasemi_mac: two bugfixes for 2.6.24

Hi Jeff,

Two bugfixes for pasemi_mac for 2.6.24:

[PATCH 1/2] pasemi_mac: Don't set replace-source-address descriptor bits [PATCH 2/2] pasemi_mac: Fix CRC checks

Thanks,

-Olof

#1 lore raw

PATCH 1/2 pasemi_mac: Don't set replace-source-address descriptor bits

Don't use the "replace source address with local MAC address" bits, since it causes problems on some variations of the hardware due to an erratum.

drivers/net/pasemi_mac.c +1 -1
Index: k.org/drivers/net/pasemi_mac.c
===================================================================
@@ -1126,7 +1126,7 @@ static int pasemi_mac_start_tx(struct sk
 	unsigned long flags;
 	int i, nfrags;
 
-	dflags = XCT_MACTX_O | XCT_MACTX_ST | XCT_MACTX_SS | XCT_MACTX_CRC_PAD;
+	dflags = XCT_MACTX_O | XCT_MACTX_ST | XCT_MACTX_CRC_PAD;
 
 	if (skb->ip_summed == CHECKSUM_PARTIAL) {
 		const unsigned char *nh = skb_network_header(skb);
#2 lore raw

Re: [PATCH 1/2] pasemi_mac: Don't set replace-source-address descriptor bits

Quoted 5 lines · Olof Johansson

Don't use the "replace source address with local MAC address" bits, since it causes problems on some variations of the hardware due to an erratum.

applied 1-2

#3 lore raw

PATCH 2/2 pasemi_mac: Fix CRC checks

In reply to Olof Johansson

Make sure we don't feed packets with bad CRC up the network stack, and discount the packet length as reported from the MAC for the CRC field.

drivers/net/pasemi_mac.c +13 -3
Index: k.org/drivers/net/pasemi_mac.c
===================================================================
@@ -580,6 +580,16 @@ static int pasemi_mac_clean_rx(struct pa
 
 		len = (macrx & XCT_MACRX_LLEN_M) >> XCT_MACRX_LLEN_S;
 
+		pci_unmap_single(mac->dma_pdev, dma, len, PCI_DMA_FROMDEVICE);
+
+		if (macrx & XCT_MACRX_CRC) {
+			/* CRC error flagged */
+			mac->netdev->stats.rx_errors++;
+			mac->netdev->stats.rx_crc_errors++;
+			dev_kfree_skb_irq(skb);
+			goto next;
+		}
+
 		if (len < 256) {
 			struct sk_buff *new_skb;
 
@@ -595,11 +605,10 @@ static int pasemi_mac_clean_rx(struct pa
 		} else
 			info->skb = NULL;
 
-		pci_unmap_single(mac->dma_pdev, dma, len, PCI_DMA_FROMDEVICE);
-
 		info->dma = 0;
 
-		skb_put(skb, len);
+		/* Don't include CRC */
+		skb_put(skb, len-4);
 
 		if (likely((macrx & XCT_MACRX_HTY_M) == XCT_MACRX_HTY_IPV4_OK)) {
 			skb->ip_summed = CHECKSUM_UNNECESSARY;
@@ -614,6 +623,7 @@ static int pasemi_mac_clean_rx(struct pa
 		skb->protocol = eth_type_trans(skb, mac->netdev);
 		netif_receive_skb(skb);
 
+next:
 		RX_RING(mac, n) = 0;
 		RX_RING(mac, n+1) = 0;