aboutsummaryrefslogtreecommitdiffstats
path: root/target/linux/rb532/patches-4.14/107-korina-refactor-rx-descriptor-flags-processing.patch
diff options
context:
space:
mode:
authorRoman Yeryomin <roman@advem.lv>2018-11-25 14:55:38 +0200
committerJohn Crispin <john@phrozen.org>2018-11-26 09:31:50 +0100
commit920845357fc6f84fe1a8bcb4a504fff499bce085 (patch)
tree70690cf3ccf818a0973802d450f5af36cd6ce67a /target/linux/rb532/patches-4.14/107-korina-refactor-rx-descriptor-flags-processing.patch
parenta0d5acfbe2bd4f9423d08d88706456e0bd62d4ce (diff)
downloadupstream-920845357fc6f84fe1a8bcb4a504fff499bce085.tar.gz
upstream-920845357fc6f84fe1a8bcb4a504fff499bce085.tar.bz2
upstream-920845357fc6f84fe1a8bcb4a504fff499bce085.zip
rb532: add 4.14 support
Signed-off-by: Roman Yeryomin <roman@advem.lv>
Diffstat (limited to 'target/linux/rb532/patches-4.14/107-korina-refactor-rx-descriptor-flags-processing.patch')
-rw-r--r--target/linux/rb532/patches-4.14/107-korina-refactor-rx-descriptor-flags-processing.patch110
1 files changed, 110 insertions, 0 deletions
diff --git a/target/linux/rb532/patches-4.14/107-korina-refactor-rx-descriptor-flags-processing.patch b/target/linux/rb532/patches-4.14/107-korina-refactor-rx-descriptor-flags-processing.patch
new file mode 100644
index 0000000000..80745f534d
--- /dev/null
+++ b/target/linux/rb532/patches-4.14/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 */