mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-10-30 13:34:27 -04:00 
			
		
		
		
	Includes latest korina fixes. Signed-off-by: Roman Yeryomin <roman@advem.lv> [rewrite commit message (subject <= 50 characters)] Signed-off-by: Stijn Tintel <stijn@linux-ipv6.be>
		
			
				
	
	
		
			111 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			111 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| --- a/drivers/net/ethernet/korina.c
 | |
| +++ b/drivers/net/ethernet/korina.c
 | |
| @@ -363,59 +363,60 @@ static int korina_rx(struct net_device *
 | |
|  		if ((KORINA_RBSIZE - (u32)DMA_COUNT(rd->control)) == 0)
 | |
|  			break;
 | |
|  
 | |
| -		/* Update statistics counters */
 | |
| -		if (devcs & ETH_RX_CRC)
 | |
| -			dev->stats.rx_crc_errors++;
 | |
| -		if (devcs & ETH_RX_LOR)
 | |
| -			dev->stats.rx_length_errors++;
 | |
| -		if (devcs & ETH_RX_LE)
 | |
| -			dev->stats.rx_length_errors++;
 | |
| -		if (devcs & ETH_RX_OVR)
 | |
| -			dev->stats.rx_fifo_errors++;
 | |
| -		if (devcs & ETH_RX_CV)
 | |
| -			dev->stats.rx_frame_errors++;
 | |
| -		if (devcs & ETH_RX_CES)
 | |
| -			dev->stats.rx_length_errors++;
 | |
| -		if (devcs & ETH_RX_MP)
 | |
| -			dev->stats.multicast++;
 | |
| +		/* check that this is a whole packet
 | |
| +		 * WARNING: DMA_FD bit incorrectly set
 | |
| +		 * in Rc32434 (errata ref #077) */
 | |
| +		if (!(devcs & ETH_RX_LD))
 | |
| +			goto next;
 | |
|  
 | |
| -		if ((devcs & ETH_RX_LD) != ETH_RX_LD) {
 | |
| -			/* check that this is a whole packet
 | |
| -			 * WARNING: DMA_FD bit incorrectly set
 | |
| -			 * in Rc32434 (errata ref #077) */
 | |
| +		if (!(devcs & ETH_RX_ROK)) {
 | |
| +			/* Update statistics counters */
 | |
|  			dev->stats.rx_errors++;
 | |
|  			dev->stats.rx_dropped++;
 | |
| -		} else if ((devcs & ETH_RX_ROK)) {
 | |
| -			pkt_len = RCVPKT_LENGTH(devcs);
 | |
| +			if (devcs & ETH_RX_CRC)
 | |
| +				dev->stats.rx_crc_errors++;
 | |
| +			if (devcs & ETH_RX_LE)
 | |
| +				dev->stats.rx_length_errors++;
 | |
| +			if (devcs & ETH_RX_OVR)
 | |
| +				dev->stats.rx_fifo_errors++;
 | |
| +			if (devcs & ETH_RX_CV)
 | |
| +				dev->stats.rx_frame_errors++;
 | |
| +			if (devcs & ETH_RX_CES)
 | |
| +				dev->stats.rx_frame_errors++;
 | |
|  
 | |
| -			/* must be the (first and) last
 | |
| -			 * descriptor then */
 | |
| -			pkt_buf = (u8 *)lp->rx_skb[lp->rx_next_done]->data;
 | |
| -
 | |
| -			/* invalidate the cache */
 | |
| -			dma_cache_inv((unsigned long)pkt_buf, pkt_len - 4);
 | |
| -
 | |
| -			/* Malloc up new buffer. */
 | |
| -			skb_new = netdev_alloc_skb_ip_align(dev, KORINA_RBSIZE);
 | |
| -
 | |
| -			if (!skb_new)
 | |
| -				break;
 | |
| -			/* Do not count the CRC */
 | |
| -			skb_put(skb, pkt_len - 4);
 | |
| -			skb->protocol = eth_type_trans(skb, dev);
 | |
| -
 | |
| -			/* Pass the packet to upper layers */
 | |
| -			netif_receive_skb(skb);
 | |
| -			dev->stats.rx_packets++;
 | |
| -			dev->stats.rx_bytes += pkt_len;
 | |
| -
 | |
| -			/* Update the mcast stats */
 | |
| -			if (devcs & ETH_RX_MP)
 | |
| -				dev->stats.multicast++;
 | |
| -
 | |
| -			lp->rx_skb[lp->rx_next_done] = skb_new;
 | |
| +			goto next;
 | |
|  		}
 | |
|  
 | |
| +		pkt_len = RCVPKT_LENGTH(devcs);
 | |
| +
 | |
| +		/* must be the (first and) last
 | |
| +		 * descriptor then */
 | |
| +		pkt_buf = (u8 *)lp->rx_skb[lp->rx_next_done]->data;
 | |
| +
 | |
| +		/* invalidate the cache */
 | |
| +		dma_cache_inv((unsigned long)pkt_buf, pkt_len - 4);
 | |
| +
 | |
| +		/* Malloc up new buffer. */
 | |
| +		skb_new = netdev_alloc_skb_ip_align(dev, KORINA_RBSIZE);
 | |
| +
 | |
| +		if (!skb_new)
 | |
| +			break;
 | |
| +		/* Do not count the CRC */
 | |
| +		skb_put(skb, pkt_len - 4);
 | |
| +		skb->protocol = eth_type_trans(skb, dev);
 | |
| +
 | |
| +		/* Pass the packet to upper layers */
 | |
| +		netif_receive_skb(skb);
 | |
| +		dev->stats.rx_packets++;
 | |
| +		dev->stats.rx_bytes += pkt_len;
 | |
| +
 | |
| +		/* Update the mcast stats */
 | |
| +		if (devcs & ETH_RX_MP)
 | |
| +			dev->stats.multicast++;
 | |
| +
 | |
| +		lp->rx_skb[lp->rx_next_done] = skb_new;
 | |
| +
 | |
| +next:
 | |
|  		rd->devcs = 0;
 | |
|  
 | |
|  		/* Restore descriptor's curr_addr */
 |