summaryrefslogtreecommitdiff
path: root/nuttx/arch/arm/src/c5471/c5471_ethernet.c
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2007-12-04 23:24:26 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2007-12-04 23:24:26 +0000
commit7bf122e61f12e81db8915f40806b69645640ea3f (patch)
tree3cde7a61f54cb47454a74099944a2dec017039c8 /nuttx/arch/arm/src/c5471/c5471_ethernet.c
parent0f15abc5e2086edf0662fb84e2ad0ca6dac72a3a (diff)
downloadpx4-nuttx-7bf122e61f12e81db8915f40806b69645640ea3f.tar.gz
px4-nuttx-7bf122e61f12e81db8915f40806b69645640ea3f.tar.bz2
px4-nuttx-7bf122e61f12e81db8915f40806b69645640ea3f.zip
Add C5471 ethernet driver debug instrumentation
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@425 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/arch/arm/src/c5471/c5471_ethernet.c')
-rw-r--r--nuttx/arch/arm/src/c5471/c5471_ethernet.c93
1 files changed, 69 insertions, 24 deletions
diff --git a/nuttx/arch/arm/src/c5471/c5471_ethernet.c b/nuttx/arch/arm/src/c5471/c5471_ethernet.c
index 91328a391..bacd03c90 100644
--- a/nuttx/arch/arm/src/c5471/c5471_ethernet.c
+++ b/nuttx/arch/arm/src/c5471/c5471_ethernet.c
@@ -329,6 +329,7 @@ struct c5471_driver_s
uint32 c_rxcrc; /* CRC errors */
uint32 c_rxunderrun; /* Underrun errors */
uint32 c_rxloc; /* Loss of carrier */
+ uint32 c_rxdropped; /* Packets dropped because of size */
#endif
/* This holds the information visible to uIP/NuttX */
@@ -513,7 +514,7 @@ static int c5471_mdrxbit (void)
}
else
{
- return 0;
+ return OK;
}
}
@@ -665,7 +666,7 @@ static int c5471_mdread (int adr, int reg)
#if (CONFIG_C5471_ETHERNET_PHY == ETHERNET_PHY_LU3X31T_T64)
static int c5471_phyinit (void)
{
- int phy_id;
+ int phyid;
int status;
/* Next, Setup GPIO pins to talk serially to the Lucent transeiver chip */
@@ -696,24 +697,25 @@ static int c5471_phyinit (void)
/* Next, Read out the chip ID */
- phy_id = (c5471_mdread(0, MD_PHY_MSB_REG) << 16) | c5471_mdread(0, MD_PHY_LSB_REG);
- if (phy_id != LU3X31_T64_PHYID)
+ phyid = (c5471_mdread(0, MD_PHY_MSB_REG) << 16) | c5471_mdread(0, MD_PHY_LSB_REG);
+ if (phyid != LU3X31_T64_PHYID)
{
- return -1;
+ ndbg("Unrecognized PHY ID: %08x\n", phyid);
+ return ERROR;
}
/* Next, Set desired network rate, 10BaseT, 100BaseT, or auto. */
#ifdef CONFIG_NET_C5471_AUTONEGOTIATION
- ndbg("Setting PHY Transceiver for Autonegotiation. (per rrload Makefile).\n");
+ ndbg("Setting PHY Transceiver for Autonegotiation\n");
c5471_mdwrite(0, MD_PHY_CONTROL_REG, MODE_AUTONEG);
#endif
#ifdef CONFIG_NET_C5471_BASET100
- ndbg("Setting PHY Transceiver for 100BaseT FullDuplex. (per rrload Makefile).\n");
+ ndbg("Setting PHY Transceiver for 100BaseT FullDuplex\n");
c5471_mdwrite(0, MD_PHY_CONTROL_REG, MODE_100MBIT_FULLDUP);
#endif
#ifdef CONFIG_NET_C5471_BASET10
- ndbg("Setting PHY Transceiver for 10BaseT FullDuplex. (per rrload Makefile).\n");
+ ndbg("Setting PHY Transceiver for 10BaseT FullDuplex\n");
c5471_mdwrite(0, MD_PHY_CONTROL_REG, MODE_10MBIT_FULLDUP);
#endif
@@ -725,15 +727,15 @@ static int c5471_phyinit (void)
static int c5471_phyinit (void)
{
- int phy_id;
+ int phyid;
int status;
/* Next, Setup GPIO pins to talk serially to the Lucent transeiver chip */
- putreg32((getreg32(GPIO_EN)|0x0000C000), GPIO_EN); /* enable gpio bits 15,14 */
- putreg32((getreg32(GPIO_CIO)&~0x00008000), GPIO_CIO); /* config gpio(15); out -> MDCLK */
- putreg32((getreg32(GPIO_CIO)|0x00004000), GPIO_CIO); /* config gpio(14); in <- MDIO */
- putreg32((getreg32(GPIO_IO)&0x000F3FFF), GPIO_IO); /* initial pin state; MDCLK = 0 */
+ putreg32((getreg32(GPIO_EN) | 0x0000C000), GPIO_EN); /* enable gpio bits 15,14 */
+ putreg32((getreg32(GPIO_CIO) & ~0x00008000), GPIO_CIO); /* config gpio(15); out -> MDCLK */
+ putreg32((getreg32(GPIO_CIO) | 0x00004000), GPIO_CIO); /* config gpio(14); in <- MDIO */
+ putreg32((getreg32(GPIO_IO) & 0x000F3FFF), GPIO_IO); /* initial pin state; MDCLK = 0 */
return 1;
}
@@ -766,6 +768,8 @@ static inline void c5471_inctxcpu(struct c5471_driver_s *c5471)
{
c5471->c_txcpudesc += 2*sizeof(uint32);
}
+
+ nvdbg("TX CPU desc: %08x\n", c5471->c_txcpudesc);
}
/****************************************************************************
@@ -787,6 +791,8 @@ static inline void c5471_incrxcpu(struct c5471_driver_s *c5471)
{
c5471->c_rxcpudesc += 2*sizeof(uint32);
}
+
+ nvdbg("RX CPU desc: %08x\n", c5471->c_txcpudesc);
}
/****************************************************************************
@@ -822,6 +828,7 @@ static int c5471_transmit(struct c5471_driver_s *c5471)
bfirstframe = TRUE;
c5471->c_lastdescstart = c5471->c_rxcpudesc;
+ nvdbg("Packet size: %d RX CPU desc: %08x\n", nbytes, c5471->c_rxcpudesc);
while (nbytes)
{
/* Verify that the hardware is ready to send another packet */
@@ -847,7 +854,7 @@ static int c5471_transmit(struct c5471_driver_s *c5471)
if (bfirstframe)
{
- putreg32((getreg32(c5471->c_rxcpudesc)|EIM_RXDESC_PADCRC), c5471->c_rxcpudesc);
+ putreg32((getreg32(c5471->c_rxcpudesc) | EIM_RXDESC_PADCRC), c5471->c_rxcpudesc);
}
if (nbytes >= EIM_PACKET_BYTES)
@@ -860,7 +867,6 @@ static int c5471_transmit(struct c5471_driver_s *c5471)
}
/* Submit ether frame bytes to the C5472 Ether Module packet memory space. */
-
/* Get the number of 16-bit values to transfer by dividing by 2 with round up. */
nshorts = (framelen + 1) >> 1;
@@ -877,6 +883,8 @@ static int c5471_transmit(struct c5471_driver_s *c5471)
putreg32(((getreg32(c5471->c_rxcpudesc) & ~EIM_RXDESC_BYTEMASK) | framelen), c5471->c_rxcpudesc);
nbytes -= framelen;
+ nvdbg("Wrote framelen: %d nbytes: %d nshorts: %d\n", framelen, nbytes, nshorts);
+
if (0 == nbytes)
{
putreg32((getreg32(c5471->c_rxcpudesc) | EIM_RXDESC_LIF), c5471->c_rxcpudesc);
@@ -1026,36 +1034,43 @@ void c5471_rxstatus(int *numbytes)
if ((rxstatus & EIM_TXDESC_RETRYERROR) != 0)
{
c5471->c_rxretries++;
+ nvdbg("c_rxretries: %d\n", c5471->c_rxretries);
}
if ((rxstatus & EIM_TXDESC_HEARTBEAT) != 0)
{
c5471->c_rxheartbeat++;
+ nvdbg("c_rxheartbeat: %d\n", c5471->c_rxheartbeat);
}
if ((rxstatus & EIM_TXDESC_LCOLLISON) != 0)
{
c5471->c_rxlcollision++;
+ nvdbg("c_rxlcollision: %d\n", c5471->c_rxlcollision);
}
if ((rxstatus & EIM_TXDESC_COLLISION) != 0)
{
c5471->c_rxcollision++;
+ nvdbg("c_rxcollision: %d\n", c5471->c_rxcollision);
}
if ((rxstatus & EIM_TXDESC_CRCERROR) != 0)
{
c5471->c_rxcrc++;
+ nvdbg("c_rxcrc: %d\n", c5471->c_rxcrc);
}
if ((rxstatus & EIM_TXDESC_UNDERRUN) != 0)
{
c5471->c_rxunderrun++;
+ nvdbg("c_rxunderrun: %d\n", c5471->c_rxunderrun);
}
if ((rxstatus & EIM_TXDESC_LOC) != 0)
{
c5471->c_rxloc++;
+ nvdbg("c_rxloc: %d\n", c5471->c_rxloc);
}
}
}
@@ -1093,6 +1108,7 @@ static void c5471_receive(struct c5471_driver_s *c5471)
* the EIM for additional packets that might be received later from the network.
*/
+ nvdbg("Reading TX CPU desc: %08x\n", c5471->c_txcpudesc);
while (bmore)
{
/* Words #0 and #1 of descriptor */
@@ -1109,11 +1125,14 @@ static void c5471_receive(struct c5471_driver_s *c5471)
/* Words #2 and #3 of descriptor */
- packetmem = (uint16*)getreg32(c5471->c_txcpudesc+1);
+ packetmem = (uint16*)getreg32(c5471->c_txcpudesc + 1);
/* Divide by 2 with round up to get the number of 16-bit words. */
nshorts = (framelen + 1) >> 1;
+ nvdbg("Reading framelen: %d packetlen: %d nshorts: %d packetment: %p\n",
+ framelen, packetlen, nshorts, packetmem);
+
for (i = 0 ; i < nshorts; i++, j++)
{
/* Check if the received packet will fit without the uIP packet buffer */
@@ -1153,6 +1172,11 @@ static void c5471_receive(struct c5471_driver_s *c5471)
packetlen -= 4;
+#ifdef CONFIG_C5471_NET_STATS
+ /* Increment the count of received packets */
+
+ c5471->c_rxpackets++;
+#endif
/* If we successfully transferred the data into the uIP buffer, then pass it on
* to uIP for processing.
@@ -1205,6 +1229,16 @@ static void c5471_receive(struct c5471_driver_s *c5471)
}
}
}
+#ifdef CONFIG_C5471_NET_STATS
+ else
+ {
+ /* Increment the count of dropped packets */
+
+ c5471->c_rxdropped++;
+ }
+#endif
+
+
}
/****************************************************************************
@@ -1262,36 +1296,43 @@ static inline void c5471_txstatus(void)
if ((txstatus & EIM_RXDESC_MISS) != 0)
{
c5471->c_txmiss++;
+ nvdbg("c_txmiss: %d\n", c5471->c_txmiss);
}
if ((txstatus & EIM_RXDESC_VLAN) != 0)
{
c5471->c_txvlan++;
+ nvdbg("c_txvlan: %d\n", c5471->c_txvlan);
}
if ((txstatus & EIM_RXDESC_LFRAME) != 0)
{
c5471->c_txlframe++;
+ nvdbg("c_txlframe: %d\n", c5471->c_txlframe);
}
if ((txstatus & EIM_RXDESC_SFRAME) != 0)
{
c5471->c_txsframe++;
+ nvdbg("c_txsframe: %d\n", c5471->c_txsframe);
}
if ((txstatus & EIM_RXDESC_CRCERROR) != 0)
{
c5471->c_txcrc++;
+ nvdbg("c_txcrc: %d\n", c5471->c_txcrc);
}
if ((txstatus & EIM_RXDESC_OVERRUN) != 0)
{
c5471->c_txoverrun++;
+ nvdbg("c_txoverrun: %d\n", c5471->c_txoverrun);
}
if ((txstatus & EIM_RXDESC_OVERRUN) != 0)
{
c5471->c_txalign++;
+ nvdbg("c_txalign: %d\n", c5471->c_txalign);
}
}
#endif
@@ -1370,11 +1411,7 @@ static int c5471_interrupt(int irq, FAR void *context)
* documentation.
*/
- #ifdef CONFIG_C5471_NET_STATS
- /* Increment the count of received packets */
-
- c5471->c_rxpackets++;
-
+#ifdef CONFIG_C5471_NET_STATS
/* Check for RX errors */
c5471_rxstatus(c5471);
@@ -1431,6 +1468,7 @@ static void c5471_txtimeout(int argc, uint32 arg, ...)
#ifdef CONFIG_C5471_NET_STATS
c5471->c_txtimeouts++;
+ nvdbg("c_txtimeouts: %d\n", c5471->c_txtimeouts);
#endif
/* Then try to restart the hardware */
@@ -1563,6 +1601,8 @@ static int c5471_ifdown(struct uip_driver_s *dev)
struct c5471_driver_s *c5471 = (struct c5471_driver_s *)dev->d_private;
irqstate_t flags;
+ ndbg("Stopping\n");
+
/* Disable the Ethernet interrupt */
flags = irqsave();
@@ -1616,6 +1656,7 @@ static int c5471_txavail(struct uip_driver_s *dev)
struct c5471_driver_s *c5471 = (struct c5471_driver_s *)dev->d_private;
irqstate_t flags;
+ ndbg("Polling\n");
flags = irqsave();
/* Ignore the notification if the interface is not yet up */
@@ -1908,17 +1949,21 @@ static void c5471_reset(struct c5471_driver_s *c5471)
static void c5471_macassign(struct c5471_driver_s *c5471)
{
struct uip_driver_s *dev = &c5471->c_dev;
+ uint8 *mptr = dev->d_mac.addr;
register uint32 tmp;
+ ndbg("MAC: %0x:%0x:%0x:%0x:%0x:%0x\n",
+ mptr[0], mptr[1], mptr[2], mptr[3], mptr[4], mptr[5]);
+
/* Set CPU port MAC address. S/W will only see incoming packets that match
* this destination address.
*/
- tmp = (((uint32)dev->d_mac.addr[0]) << 8) | ((uint32)dev->d_mac.addr[1]);
+ tmp = (((uint32)mptr[0]) << 8) | ((uint32)mptr[1]);
putreg32(tmp, EIM_CPU_DAHI);
- tmp = (((uint32)dev->d_mac.addr[2]) << 24) | (((uint32)dev->d_mac.addr[3]) << 16) |
- (((uint32)dev->d_mac.addr[4]) << 8) | ((uint32)dev->d_mac.addr[5]);
+ tmp = (((uint32)mptr[2]) << 24) | (((uint32)mptr[3]) << 16) |
+ (((uint32)mptr[4]) << 8) | ((uint32)mptr[5]);
putreg32(tmp, EIM_CPU_DALO);
#if 0