diff options
author | Roman Yeryomin <roman@advem.lv> | 2017-09-17 21:34:00 +0300 |
---|---|---|
committer | Stijn Tintel <stijn@linux-ipv6.be> | 2017-09-18 15:20:48 +0300 |
commit | 740a5753e510e5fbfdb3769ff1ccac3a83e3514b (patch) | |
tree | d6df8827c48aacd8d23679fc59a69a5f8ebf1f01 /target/linux/rb532/patches-4.9/107-korina-refactor-rx-descriptor-flags-processing.patch | |
parent | c4354797f7137dd4070190ed40e6054ce1a07956 (diff) | |
download | upstream-740a5753e510e5fbfdb3769ff1ccac3a83e3514b.tar.gz upstream-740a5753e510e5fbfdb3769ff1ccac3a83e3514b.tar.bz2 upstream-740a5753e510e5fbfdb3769ff1ccac3a83e3514b.zip |
rb532: add support for 4.9
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>
Diffstat (limited to 'target/linux/rb532/patches-4.9/107-korina-refactor-rx-descriptor-flags-processing.patch')
-rw-r--r-- | target/linux/rb532/patches-4.9/107-korina-refactor-rx-descriptor-flags-processing.patch | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/target/linux/rb532/patches-4.9/107-korina-refactor-rx-descriptor-flags-processing.patch b/target/linux/rb532/patches-4.9/107-korina-refactor-rx-descriptor-flags-processing.patch new file mode 100644 index 0000000000..80745f534d --- /dev/null +++ b/target/linux/rb532/patches-4.9/107-korina-refactor-rx-descriptor-flags-processing.patch @@ -0,0 +1,110 @@ +--- 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 */ |