aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/rb532/patches-4.9/107-korina-refactor-rx-descriptor-flags-processing.patch
diff options
context:
space:
mode:
authorRoman Yeryomin <roman@advem.lv>2017-09-17 21:34:00 +0300
committerStijn Tintel <stijn@linux-ipv6.be>2017-09-18 15:20:48 +0300
commit740a5753e510e5fbfdb3769ff1ccac3a83e3514b (patch)
treed6df8827c48aacd8d23679fc59a69a5f8ebf1f01 /target/linux/rb532/patches-4.9/107-korina-refactor-rx-descriptor-flags-processing.patch
parentc4354797f7137dd4070190ed40e6054ce1a07956 (diff)
downloadupstream-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.patch110
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 */