SAMA5D4: Fix error in EMAC driver (plus related EMAC/GMAC drivers)

This commit is contained in:
Gregory Nutt
2014-07-01 11:22:19 -06:00
parent 96a6c725d5
commit 23e4d7db0a
5 changed files with 198 additions and 60 deletions
+6 -13
View File
@@ -2289,7 +2289,7 @@ static int sam_autonegotiate(struct sam_emac_s *priv)
/* Setup the EMAC link speed */
regval = sam_getreg(priv, SAM_EMAC_NCFGR);
regval &= (EMAC_NCFGR_SPD | EMAC_NCFGR_FD);
regval &= ~(EMAC_NCFGR_SPD | EMAC_NCFGR_FD);
if (((advertise & lpa) & MII_ADVERTISE_100BASETXFULL) != 0)
{
@@ -2658,8 +2658,6 @@ static void sam_rxreset(struct sam_emac_s *priv)
static void sam_emac_reset(struct sam_emac_s *priv)
{
uint32_t regval;
/* Disable all EMAC interrupts */
sam_putreg(priv, SAM_EMAC_IDR, EMAC_INT_ALL);
@@ -2669,10 +2667,9 @@ static void sam_emac_reset(struct sam_emac_s *priv)
sam_rxreset(priv);
sam_txreset(priv);
/* Disable RX, TX, and statistics */
/* Make sure that RX and TX are disabled; clear statistics registers */
regval = EMAC_NCR_TXEN | EMAC_NCR_RXEN | EMAC_NCR_WESTAT | EMAC_NCR_CLRSTAT;
sam_putreg(priv, SAM_EMAC_NCR, regval);
sam_putreg(priv, SAM_EMAC_NCR, EMAC_NCR_CLRSTAT);
/* Disable clocking to the EMAC peripheral */
@@ -2745,15 +2742,11 @@ static int sam_emac_configure(struct sam_emac_s *priv)
sam_emac_enableclk();
/* Disable TX, RX, interrupts, etc. */
/* Disable TX, RX, clear statistics. Disable all interrupts. */
sam_putreg(priv, SAM_EMAC_NCR, 0);
sam_putreg(priv, SAM_EMAC_NCR, EMAC_NCR_CLRSTAT);
sam_putreg(priv, SAM_EMAC_IDR, EMAC_INT_ALL);
regval = sam_getreg(priv, SAM_EMAC_NCR);
regval |= EMAC_NCR_CLRSTAT;
sam_putreg(priv, SAM_EMAC_NCR, regval);
/* Clear all status bits in the receive status register. */
regval = (EMAC_RSR_RXOVR | EMAC_RSR_REC | EMAC_RSR_BNA);
@@ -2795,7 +2788,7 @@ static int sam_emac_configure(struct sam_emac_s *priv)
sam_rxreset(priv);
sam_txreset(priv);
/* Enable Rx and Tx, plus the stats register. */
/* Enable Rx and Tx, plus the statistics registers. */
regval = sam_getreg(priv, SAM_EMAC_NCR);
regval |= (EMAC_NCR_RXEN | EMAC_NCR_TXEN | EMAC_NCR_WESTAT);
+6 -13
View File
@@ -2312,7 +2312,7 @@ static int sam_autonegotiate(struct sam_emac_s *priv)
/* Setup the EMAC link speed */
regval = sam_getreg(priv, SAM_EMAC_NCFGR);
regval &= (EMAC_NCFGR_SPD | EMAC_NCFGR_FD);
regval &= ~(EMAC_NCFGR_SPD | EMAC_NCFGR_FD);
if (((advertise & lpa) & MII_ADVERTISE_100BASETXFULL) != 0)
{
@@ -2708,8 +2708,6 @@ static void sam_rxreset(struct sam_emac_s *priv)
static void sam_emac_reset(struct sam_emac_s *priv)
{
uint32_t regval;
/* Disable all EMAC interrupts */
sam_putreg(priv, SAM_EMAC_IDR, EMAC_INT_ALL);
@@ -2719,10 +2717,9 @@ static void sam_emac_reset(struct sam_emac_s *priv)
sam_rxreset(priv);
sam_txreset(priv);
/* Disable RX, TX, and statistics */
/* Make sure that RX and TX are disabled; clear statistics registers */
regval = EMAC_NCR_TE | EMAC_NCR_RE | EMAC_NCR_WESTAT | EMAC_NCR_CLRSTAT;
sam_putreg(priv, SAM_EMAC_NCR, regval);
sam_putreg(priv, SAM_EMAC_NCR, EMAC_NCR_CLRSTAT);
/* Disable clocking to the EMAC peripheral */
@@ -2795,15 +2792,11 @@ static int sam_emac_configure(struct sam_emac_s *priv)
sam_emac_enableclk();
/* Disable TX, RX, interrupts, etc. */
/* Disable TX, RX, clear statistics. Disable all interrupts. */
sam_putreg(priv, SAM_EMAC_NCR, 0);
sam_putreg(priv, SAM_EMAC_NCR, EMAC_NCR_CLRSTAT);
sam_putreg(priv, SAM_EMAC_IDR, EMAC_INT_ALL);
regval = sam_getreg(priv, SAM_EMAC_NCR);
regval |= EMAC_NCR_CLRSTAT;
sam_putreg(priv, SAM_EMAC_NCR, regval);
/* Clear all status bits in the receive status register. */
regval = (EMAC_RSR_OVR | EMAC_RSR_REC | EMAC_RSR_BNA);
@@ -2845,7 +2838,7 @@ static int sam_emac_configure(struct sam_emac_s *priv)
sam_rxreset(priv);
sam_txreset(priv);
/* Enable Rx and Tx, plus the stats register. */
/* Enable Rx and Tx, plus the statistics registers. */
regval = sam_getreg(priv, SAM_EMAC_NCR);
regval |= (EMAC_NCR_RE | EMAC_NCR_TE | EMAC_NCR_WESTAT);
+6 -13
View File
@@ -2768,7 +2768,7 @@ static int sam_autonegotiate(struct sam_emac_s *priv)
/* Setup the EMAC link speed */
regval = sam_getreg(priv, SAM_EMAC_NCFGR_OFFSET);
regval &= (EMAC_NCFGR_SPD | EMAC_NCFGR_FD);
regval &= ~(EMAC_NCFGR_SPD | EMAC_NCFGR_FD);
if (((advertise & lpa) & MII_ADVERTISE_100BASETXFULL) != 0)
{
@@ -3317,8 +3317,6 @@ static void sam_emac_disableclk(struct sam_emac_s *priv)
static void sam_emac_reset(struct sam_emac_s *priv)
{
uint32_t regval;
/* Disable all EMAC interrupts */
sam_putreg(priv, SAM_EMAC_IDR_OFFSET, EMAC_INT_ALL);
@@ -3328,10 +3326,9 @@ static void sam_emac_reset(struct sam_emac_s *priv)
sam_rxreset(priv);
sam_txreset(priv);
/* Disable RX, TX, and statistics */
/* Make sure that RX and TX are disabled; clear statistics registers */
regval = EMAC_NCR_TXEN | EMAC_NCR_RXEN | EMAC_NCR_WESTAT | EMAC_NCR_CLRSTAT;
sam_putreg(priv, SAM_EMAC_NCR_OFFSET, regval);
sam_putreg(priv, SAM_EMAC_NCR_OFFSET, EMAC_NCR_CLRSTAT);
/* Disable clocking to the EMAC peripheral */
@@ -3404,15 +3401,11 @@ static int sam_emac_configure(struct sam_emac_s *priv)
sam_emac_enableclk(priv);
/* Disable TX, RX, interrupts, etc. */
/* Disable TX, RX, clear statistics. Disable all interrupts. */
sam_putreg(priv, SAM_EMAC_NCR_OFFSET, 0);
sam_putreg(priv, SAM_EMAC_NCR_OFFSET, EMAC_NCR_CLRSTAT);
sam_putreg(priv, SAM_EMAC_IDR_OFFSET, EMAC_INT_ALL);
regval = sam_getreg(priv, SAM_EMAC_NCR_OFFSET);
regval |= EMAC_NCR_CLRSTAT;
sam_putreg(priv, SAM_EMAC_NCR_OFFSET, regval);
/* Clear all status bits in the receive status register. */
regval = (EMAC_RSR_RXOVR | EMAC_RSR_REC | EMAC_RSR_BNA);
@@ -3454,7 +3447,7 @@ static int sam_emac_configure(struct sam_emac_s *priv)
sam_rxreset(priv);
sam_txreset(priv);
/* Enable Rx and Tx, plus the stats register. */
/* Enable Rx and Tx, plus the statistics registers. */
regval = sam_getreg(priv, SAM_EMAC_NCR_OFFSET);
regval |= (EMAC_NCR_RXEN | EMAC_NCR_TXEN | EMAC_NCR_WESTAT);
+5 -12
View File
@@ -2762,8 +2762,6 @@ static void sam_rxreset(struct sam_gmac_s *priv)
static void sam_gmac_reset(struct sam_gmac_s *priv)
{
uint32_t regval;
/* Disable all GMAC interrupts */
sam_putreg(priv, SAM_GMAC_IDR, GMAC_INT_ALL);
@@ -2773,10 +2771,9 @@ static void sam_gmac_reset(struct sam_gmac_s *priv)
sam_rxreset(priv);
sam_txreset(priv);
/* Disable RX, TX, and statistics */
/* Make sure that RX and TX are disabled; clear statistics registers */
regval = GMAC_NCR_TXEN | GMAC_NCR_RXEN | GMAC_NCR_WESTAT | GMAC_NCR_CLRSTAT;
sam_putreg(priv, SAM_GMAC_NCR, regval);
sam_putreg(priv, SAM_GMAC_NCR, GMAC_NCR_CLRSTAT);
/* Disable clocking to the GMAC peripheral */
@@ -2849,15 +2846,11 @@ static int sam_gmac_configure(struct sam_gmac_s *priv)
sam_gmac_enableclk();
/* Disable TX, RX, interrupts, etc. */
/* Disable TX, RX, clear statistics. Disable all interrupts. */
sam_putreg(priv, SAM_GMAC_NCR, 0);
sam_putreg(priv, SAM_GMAC_NCR, GMAC_NCR_CLRSTAT);
sam_putreg(priv, SAM_GMAC_IDR, GMAC_INT_ALL);
regval = sam_getreg(priv, SAM_GMAC_NCR);
regval |= GMAC_NCR_CLRSTAT;
sam_putreg(priv, SAM_GMAC_NCR, regval);
/* Clear all status bits in the receive status register. */
regval = (GMAC_RSR_RXOVR | GMAC_RSR_REC | GMAC_RSR_BNA | GMAC_RSR_HNO);
@@ -2920,7 +2913,7 @@ static int sam_gmac_configure(struct sam_gmac_s *priv)
sam_rxreset(priv);
sam_txreset(priv);
/* Enable Rx and Tx, plus the stats register. */
/* Enable Rx and Tx, plus the statistics registers. */
regval = sam_getreg(priv, SAM_GMAC_NCR);
regval |= (GMAC_NCR_RXEN | GMAC_NCR_TXEN | GMAC_NCR_WESTAT);
+175 -9
View File
@@ -121,6 +121,7 @@ CONFIG_ARMV7A_TOOLCHAIN_CODESOURCERYW=y
# CONFIG_ARMV7A_DECODEFIQ is not set
CONFIG_SDIO_DMA=y
# CONFIG_SDIO_WIDTH_D1_ONLY is not set
# CONFIG_NET_MULTICAST is not set
#
# SAMA5 Configuration Options
@@ -205,8 +206,8 @@ CONFIG_SAMA5_HSMCI0=y
CONFIG_SAMA5_XDMAC1=y
# CONFIG_SAMA5_UHPHS is not set
# CONFIG_SAMA5_UDPHS is not set
# CONFIG_SAMA5_EMACB is not set
# CONFIG_SAMA5_EMAC0 is not set
CONFIG_SAMA5_EMACB=y
CONFIG_SAMA5_EMAC0=y
# CONFIG_SAMA5_EMAC1 is not set
# CONFIG_SAMA5_LCDC is not set
# CONFIG_SAMA5_ISI is not set
@@ -223,6 +224,31 @@ CONFIG_SAMA5_PIO_IRQ=y
# CONFIG_SAMA5_PIOD_IRQ is not set
CONFIG_SAMA5_PIOE_IRQ=y
#
# EMAC device driver options
#
#
# EMAC0 device driver options
#
CONFIG_SAMA5_EMAC0_NRXBUFFERS=16
CONFIG_SAMA5_EMAC0_NTXBUFFERS=8
CONFIG_SAMA5_EMAC0_PHYADDR=1
# CONFIG_SAMA5_EMAC0_PHYINIT is not set
# CONFIG_SAMA5_EMAC0_MII is not set
CONFIG_SAMA5_EMAC0_RMII=y
CONFIG_SAMA5_EMAC0_AUTONEG=y
CONFIG_SAMA5_EMAC0_PHYSR=30
CONFIG_SAMA5_EMAC0_PHYSR_ALTCONFIG=y
CONFIG_SAMA5_EMAC0_PHYSR_ALTMODE=0x7
CONFIG_SAMA5_EMAC0_PHYSR_10HD=0x1
CONFIG_SAMA5_EMAC0_PHYSR_100HD=0x2
CONFIG_SAMA5_EMAC0_PHYSR_10FD=0x5
CONFIG_SAMA5_EMAC0_PHYSR_100FD=0x6
# CONFIG_SAMA5_EMACB_PREALLOCATE is not set
# CONFIG_SAMA5_EMACB_NBC is not set
CONFIG_SAMA5_EMAC0_ISETH0=y
#
# HSMCI device driver options
#
@@ -452,6 +478,35 @@ CONFIG_MMCSD_SDIO=y
# CONFIG_SDIO_MUXBUS is not set
CONFIG_SDIO_BLOCKSETUP=y
# CONFIG_MTD is not set
CONFIG_NETDEVICES=y
#
# General Ethernet MAC Driver Options
#
# CONFIG_NETDEV_MULTINIC is not set
#
# External Ethernet MAC Device Support
#
# CONFIG_NET_DM90x0 is not set
# CONFIG_ENC28J60 is not set
# CONFIG_ENCX24J600 is not set
# CONFIG_NET_E1000 is not set
# CONFIG_NET_SLIP is not set
# CONFIG_NET_VNET is not set
#
# External Ethernet PHY Device Support
#
# CONFIG_ETH0_PHY_NONE is not set
# CONFIG_ETH0_PHY_AM79C874 is not set
# CONFIG_ETH0_PHY_KS8721 is not set
# CONFIG_ETH0_PHY_KSZ8051 is not set
CONFIG_ETH0_PHY_KSZ8081=y
# CONFIG_ETH0_PHY_KSZ90x1 is not set
# CONFIG_ETH0_PHY_DP83848C is not set
# CONFIG_ETH0_PHY_LAN8720 is not set
# CONFIG_ETH0_PHY_DM9161 is not set
# CONFIG_PIPES is not set
# CONFIG_PM is not set
# CONFIG_POWER is not set
@@ -534,9 +589,93 @@ CONFIG_USART4_2STOP=0
#
# Networking Support
#
# CONFIG_ARCH_HAVE_NET is not set
# CONFIG_ARCH_HAVE_PHY is not set
# CONFIG_NET is not set
CONFIG_ARCH_HAVE_NET=y
CONFIG_ARCH_HAVE_PHY=y
CONFIG_NET=y
# CONFIG_NET_NOINTS is not set
# CONFIG_NET_MULTIBUFFER is not set
# CONFIG_NET_PROMISCUOUS is not set
CONFIG_NET_BUFSIZE=562
CONFIG_NET_RECEIVE_WINDOW=562
CONFIG_NET_GUARDSIZE=2
#
# Socket Support
#
CONFIG_NSOCKET_DESCRIPTORS=8
CONFIG_NET_NACTIVESOCKETS=16
CONFIG_NET_SOCKOPTS=y
# CONFIG_NET_SOLINGER is not set
#
# Network Device Operations
#
# CONFIG_NETDEV_PHY_IOCTL is not set
#
# Raw Socket Support
#
# CONFIG_NET_PKT is not set
#
# TCP/IP Networking
#
CONFIG_NET_TCP=y
# CONFIG_NET_TCPURGDATA is not set
CONFIG_NET_TCP_CONNS=8
CONFIG_NET_MAX_LISTENPORTS=20
CONFIG_NET_TCP_READAHEAD=y
CONFIG_NET_TCP_WRITE_BUFFERS=y
CONFIG_NET_TCP_NWRBCHAINS=8
CONFIG_NET_TCP_RECVDELAY=0
CONFIG_NET_TCPBACKLOG=y
# CONFIG_NET_SENDFILE is not set
#
# UDP Networking
#
CONFIG_NET_UDP=y
# CONFIG_NET_UDP_CHECKSUMS is not set
CONFIG_NET_UDP_CONNS=8
CONFIG_NET_BROADCAST=y
# CONFIG_NET_RXAVAIL is not set
#
# ICMP Networking Support
#
CONFIG_NET_ICMP=y
CONFIG_NET_ICMP_PING=y
# CONFIG_NET_PINGADDRCONF is not set
#
# IGMPv2 Client Support
#
# CONFIG_NET_IGMP is not set
#
# ARP Configuration
#
CONFIG_NET_ARP=y
CONFIG_NET_ARPTAB_SIZE=16
CONFIG_NET_ARP_IPIN=y
#
# Network I/O Buffer Support
#
CONFIG_NET_IOB=y
CONFIG_IOB_NBUFFERS=36
CONFIG_IOB_BUFSIZE=196
CONFIG_IOB_NCHAINS=8
CONFIG_IOB_THROTTLE=8
# CONFIG_NET_ARCH_INCR32 is not set
# CONFIG_NET_ARCH_CHKSUM is not set
CONFIG_NET_STATISTICS=y
#
# Routing Table Configuration
#
# CONFIG_NET_ROUTE is not set
CONFIG_NET_ETHERNET=y
#
# File Systems
@@ -556,6 +695,7 @@ CONFIG_FAT_LFN=y
CONFIG_FAT_MAXFNAME=32
# CONFIG_FS_FATTIME is not set
# CONFIG_FAT_DMAMEMORY is not set
# CONFIG_NFS is not set
# CONFIG_FS_NXFFS is not set
CONFIG_FS_ROMFS=y
# CONFIG_FS_SMARTFS is not set
@@ -680,6 +820,7 @@ CONFIG_BUILTIN_PROXY_STACKSIZE=1024
# CONFIG_EXAMPLES_MM is not set
# CONFIG_EXAMPLES_MODBUS is not set
# CONFIG_EXAMPLES_MOUNT is not set
# CONFIG_EXAMPLES_NETTEST is not set
# CONFIG_EXAMPLES_NRF24L01TERM is not set
CONFIG_EXAMPLES_NSH=y
CONFIG_EXAMPLES_NSH_CXXINITIALIZE=y
@@ -712,6 +853,7 @@ CONFIG_EXAMPLES_NSH_CXXINITIALIZE=y
# CONFIG_EXAMPLES_TIFF is not set
# CONFIG_EXAMPLES_TOUCHSCREEN is not set
# CONFIG_EXAMPLES_UDP is not set
# CONFIG_EXAMPLES_DISCOVER is not set
# CONFIG_EXAMPLES_UIP is not set
# CONFIG_EXAMPLES_USBSERIAL is not set
# CONFIG_EXAMPLES_USBTERM is not set
@@ -736,15 +878,25 @@ CONFIG_EXAMPLES_NSH_CXXINITIALIZE=y
# Networking Utilities
#
# CONFIG_NETUTILS_CODECS is not set
# CONFIG_NETUTILS_DHCPC is not set
# CONFIG_NETUTILS_DHCPD is not set
# CONFIG_NETUTILS_FTPC is not set
# CONFIG_NETUTILS_FTPD is not set
# CONFIG_NETUTILS_JSON is not set
CONFIG_NETUTILS_DNSCLIENT=y
CONFIG_NETUTILS_DNSCLIENT_ENTRIES=8
CONFIG_NETUTILS_DNSCLIENT_MAXRESPONSE=96
# CONFIG_NETUTILS_SMTP is not set
# CONFIG_NETUTILS_TFTPC is not set
CONFIG_NETUTILS_TELNETD=y
CONFIG_NETUTILS_TFTPC=y
# CONFIG_NETUTILS_THTTPD is not set
# CONFIG_NETUTILS_UIPLIB is not set
# CONFIG_NETUTILS_WEBCLIENT is not set
CONFIG_NETUTILS_UIPLIB=y
CONFIG_NETUTILS_WEBCLIENT=y
CONFIG_NSH_WGET_USERAGENT="NuttX/6.xx.x (; http://www.nuttx.org/)"
# CONFIG_NETUTILS_WEBSERVER is not set
# CONFIG_NETUTILS_NTPCLIENT is not set
# CONFIG_NETUTILS_DISCOVER is not set
# CONFIG_NETUTILS_XMLRPC is not set
#
# FreeModBus
@@ -790,6 +942,7 @@ CONFIG_NSH_BUILTIN_APPS=y
# CONFIG_NSH_DISABLE_MOUNT is not set
# CONFIG_NSH_DISABLE_MW is not set
# CONFIG_NSH_DISABLE_PS is not set
# CONFIG_NSH_DISABLE_PING is not set
# CONFIG_NSH_DISABLE_PUT is not set
# CONFIG_NSH_DISABLE_PWD is not set
# CONFIG_NSH_DISABLE_RM is not set
@@ -837,8 +990,21 @@ CONFIG_NSH_CONSOLE=y
#
# USB Trace Support
#
# CONFIG_NSH_ALTCONDEV is not set
CONFIG_NSH_ARCHINIT=y
CONFIG_NSH_TELNET=y
CONFIG_NSH_TELNETD_PORT=23
CONFIG_NSH_TELNETD_DAEMONPRIO=100
CONFIG_NSH_TELNETD_DAEMONSTACKSIZE=2048
CONFIG_NSH_TELNETD_CLIENTPRIO=100
CONFIG_NSH_TELNETD_CLIENTSTACKSIZE=2048
CONFIG_NSH_IOBUFFER_SIZE=512
# CONFIG_NSH_TELNET_LOGIN is not set
CONFIG_NSH_IPADDR=0x0a000002
CONFIG_NSH_DRIPADDR=0x0a000001
CONFIG_NSH_NETMASK=0xffffff00
# CONFIG_NSH_DNS is not set
CONFIG_NSH_NOMAC=y
CONFIG_NSH_MAX_ROUNDTRIP=20
#
# NxWidgets/NxWM