Commit f4f62301 authored by Heiko Schocher's avatar Heiko Schocher Committed by Jeff Garzik

fs_enet: Fix SCC Ethernet on CPM2, and crash in fs_enet_rx_napi()

Signed-off-by: default avatarHeiko Schocher <hs@denx.de>
Signed-off-by: default avatarVitaly Bordug <vitb@kernel.crashing.org>
Signed-off-by: default avatarKumar Gala <galak@kernel.crashing.org>
Signed-off-by: default avatarJeff Garzik <jgarzik@redhat.com>
parent 34a20e89
...@@ -337,6 +337,11 @@ typedef struct scc_param { ...@@ -337,6 +337,11 @@ typedef struct scc_param {
uint scc_tcrc; /* Internal */ uint scc_tcrc; /* Internal */
} sccp_t; } sccp_t;
/* Function code bits.
*/
#define SCC_EB ((u_char) 0x10) /* Set big endian byte order */
#define SCC_GBL ((u_char) 0x20) /* Snooping enabled */
/* CPM Ethernet through SCC1. /* CPM Ethernet through SCC1.
*/ */
typedef struct scc_enet { typedef struct scc_enet {
......
...@@ -792,6 +792,10 @@ static int fs_enet_open(struct net_device *dev) ...@@ -792,6 +792,10 @@ static int fs_enet_open(struct net_device *dev)
int r; int r;
int err; int err;
/* to initialize the fep->cur_rx,... */
/* not doing this, will cause a crash in fs_enet_rx_napi */
fs_init_bds(fep->ndev);
if (fep->fpi->use_napi) if (fep->fpi->use_napi)
napi_enable(&fep->napi); napi_enable(&fep->napi);
...@@ -1167,6 +1171,10 @@ static struct of_device_id fs_enet_match[] = { ...@@ -1167,6 +1171,10 @@ static struct of_device_id fs_enet_match[] = {
.compatible = "fsl,cpm1-scc-enet", .compatible = "fsl,cpm1-scc-enet",
.data = (void *)&fs_scc_ops, .data = (void *)&fs_scc_ops,
}, },
{
.compatible = "fsl,cpm2-scc-enet",
.data = (void *)&fs_scc_ops,
},
#endif #endif
#ifdef CONFIG_FS_ENET_HAS_FCC #ifdef CONFIG_FS_ENET_HAS_FCC
{ {
......
...@@ -47,7 +47,6 @@ ...@@ -47,7 +47,6 @@
#include "fs_enet.h" #include "fs_enet.h"
/*************************************************/ /*************************************************/
#if defined(CONFIG_CPM1) #if defined(CONFIG_CPM1)
/* for a 8xx __raw_xxx's are sufficient */ /* for a 8xx __raw_xxx's are sufficient */
#define __fs_out32(addr, x) __raw_writel(x, addr) #define __fs_out32(addr, x) __raw_writel(x, addr)
...@@ -62,6 +61,8 @@ ...@@ -62,6 +61,8 @@
#define __fs_out16(addr, x) out_be16(addr, x) #define __fs_out16(addr, x) out_be16(addr, x)
#define __fs_in32(addr) in_be32(addr) #define __fs_in32(addr) in_be32(addr)
#define __fs_in16(addr) in_be16(addr) #define __fs_in16(addr) in_be16(addr)
#define __fs_out8(addr, x) out_8(addr, x)
#define __fs_in8(addr) in_8(addr)
#endif #endif
/* write, read, set bits, clear bits */ /* write, read, set bits, clear bits */
...@@ -262,8 +263,13 @@ static void restart(struct net_device *dev) ...@@ -262,8 +263,13 @@ static void restart(struct net_device *dev)
/* Initialize function code registers for big-endian. /* Initialize function code registers for big-endian.
*/ */
#ifndef CONFIG_NOT_COHERENT_CACHE
W8(ep, sen_genscc.scc_rfcr, SCC_EB | SCC_GBL);
W8(ep, sen_genscc.scc_tfcr, SCC_EB | SCC_GBL);
#else
W8(ep, sen_genscc.scc_rfcr, SCC_EB); W8(ep, sen_genscc.scc_rfcr, SCC_EB);
W8(ep, sen_genscc.scc_tfcr, SCC_EB); W8(ep, sen_genscc.scc_tfcr, SCC_EB);
#endif
/* Set maximum bytes per receive buffer. /* Set maximum bytes per receive buffer.
* This appears to be an Ethernet frame size, not the buffer * This appears to be an Ethernet frame size, not the buffer
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment