📄 mac_au1000.c
字号:
pdevice->status.tx_ed_errors++;
if (status & MAC_TRANSMIT_LC_MASK)
pdevice->status.tx_lc_errors++;
if (status & MAC_TRANSMIT_EC_MASK)
pdevice->status.tx_lc_errors++;
else /* Collision Count is only valid if EC is not set */
pdevice->status.collisions +=
((status & MAC_TRANSMIT_CC_MASK) >> MAC_TRANSMIT_CC) ;
if (status & MAC_TRANSMIT_UR_MASK)
pdevice->status.tx_ur_errors++;
}
break ;
}
/* wait 1 ms */
// MAC_AU1000_wait( 1 ) ;
/* wait at most 1 second */
i++ ;
/* This corresponds to 1 second at 384MHz */
if ( i > 0x16e36000)
{
pdevice->status.tx_errors++;
pdevice->status.tx_timeout_errors++;
/* re-init driver and controller */
MAC_AU1000_init( 0, 0, NULL ) ;
return( ERROR_LAN_TXM_ERROR ) ;
}
}
return( OK ) ;
}
/************************************************************************
*
* MAC_AU1000_ctrl
* Description :
* -------------
* This service requests special service via 'ctrl'
*
*
* Parameters :
* ------------
*
* 'major', IN, major device number
* 'minor', IN, minor device number for multi device drivers
* 'p_param', INOUT, LAN variable of type, t_LAN_IO_desc.
*
*
* Return values :
* ---------------
*
* 'OK'(=0)
*
*
************************************************************************/
static
INT32 MAC_AU1000_ctrl(
UINT32 major, /* IN: major device number */
UINT32 minor, /* IN: minor device number */
t_LAN_CTRL_desc *p_param ) /* IN-OUT: */
{
t_MAC_AU1000_device *pdevice ;
/* get device context for this minor device */
pdevice = &minor_device[minor] ;
switch( p_param->command )
{
case LAN_CTRL_DISPLAY_STATISTICS:
#ifdef ETH_DEBUG
MAC_AU1000_dump_regs( pdevice ) ;
/* The below was removed. May want to add a dump of current DMA pointers */
/* MAC_AU1000_dump_packetstatus( pdevice ) ; */
#endif
MAC_AU1000_MII_status( pdevice ) ;
MAC_AU1000_dump_status( pdevice ) ;
break ;
case LAN_CTRL_STOP_CONTROLLER:
MAC_AU1000_stop( pdevice ) ;
break ;
case LAN_CTRL_START_CONTROLLER:
/* re-init driver and controller */
MAC_AU1000_init( 0, 0, NULL ) ;
break ;
default:
break ;
}
return( OK ) ;
}
/************************************************************************
*
* MAC_AU1000_dump_regs
* Description :
* -------------
* Dump all AU1000 LAN controller registers
*
*
* Parameters :
* ------------
*
* 'pdevice', IN, reference for this device context
*
*
* Return values :
* ---------------
*
* 'OK'(=0)
*
*
*
************************************************************************/
static
INT32 MAC_AU1000_dump_regs( t_MAC_AU1000_device *pdevice )
{
volatile void *pmac ;
pmac = pdevice->pAU1000CtrlRegs ;
sprintf( msg, "\n\r MAC_AU1000_dump_regs:\n\r") ;
PUTS( DEFAULT_PORT, msg ) ;
sprintf( msg, "\n\r Control Base = %08x\n\r", (UINT32) pdevice->pAU1000CtrlRegs) ;
PUTS( DEFAULT_PORT, msg ) ;
sprintf( msg, " MAC_CONTROL: 0x%08X\n\r", MACREG(pmac, MAC_CONTROL) ) ;
PUTS( DEFAULT_PORT, msg ) ;
sprintf( msg, " MAC_ADDRHI: 0x%08X\n\r", MACREG(pmac, MAC_ADDRHI) ) ;
PUTS( DEFAULT_PORT, msg ) ;
sprintf( msg, " MAC_ADDRLO: 0x%08X\n\r", MACREG(pmac, MAC_ADDRLO) ) ;
PUTS( DEFAULT_PORT, msg ) ;
sprintf( msg, " MAC_MCHASHH: 0x%08X\n\r", MACREG(pmac, MAC_MCHASHH) ) ;
PUTS( DEFAULT_PORT, msg ) ;
sprintf( msg, " MAC_MCHASHL: 0x%08X\n\r", MACREG(pmac, MAC_MCHASHL) ) ;
PUTS( DEFAULT_PORT, msg ) ;
sprintf( msg, " MAC_MIICTRL: 0x%08X\n\r", MACREG(pmac, MAC_MIICTRL) ) ;
PUTS( DEFAULT_PORT, msg ) ;
sprintf( msg, " MAC_MIIDATA: 0x%08X\n\r", MACREG(pmac, MAC_MIIDATA) ) ;
PUTS( DEFAULT_PORT, msg ) ;
sprintf( msg, " MAC_FLOWCTL: 0x%08X\n\r", MACREG(pmac, MAC_FLOWCTL) ) ;
PUTS( DEFAULT_PORT, msg ) ;
sprintf( msg, " MAC_VLAN1TG: 0x%08X\n\r", MACREG(pmac, MAC_VLAN1TG) ) ;
PUTS( DEFAULT_PORT, msg ) ;
sprintf( msg, " MAC_VLAN2TG: 0x%08X\n\r", MACREG(pmac, MAC_VLAN2TG) ) ;
PUTS( DEFAULT_PORT, msg ) ;
/* Revise: Need to add DMA registers here */
return( OK ) ;
}
/************************************************************************
*
* MAC_AU1000_dump_status
* Description :
* -------------
* Dump all AU1000 LAN controller statistics
*
*
* Parameters :
* ------------
*
* 'pdevice', IN, reference for this device context
*
*
* Return values :
* ---------------
*
* 'OK'(=0)
*
*
*
************************************************************************/
static
INT32 MAC_AU1000_dump_status( t_MAC_AU1000_device *pdevice )
{
sprintf( msg, " Packets received: %ld\n\r", pdevice->status.rx_packets ) ;
PUTS( DEFAULT_PORT, msg ) ;
sprintf( msg, " Packets transmitted: %ld\n\r", pdevice->status.tx_packets ) ;
PUTS( DEFAULT_PORT, msg ) ;
sprintf( msg, " Bytes received: %ld\n\r", pdevice->status.rx_bytes ) ;
PUTS( DEFAULT_PORT, msg ) ;
sprintf( msg, " Bytes transmitted: %ld\n\r", pdevice->status.tx_bytes ) ;
PUTS( DEFAULT_PORT, msg ) ;
sprintf( msg, " Receive errors: %ld\n\r", pdevice->status.rx_errors ) ;
PUTS( DEFAULT_PORT, msg ) ;
sprintf( msg, " Transmit errors: %ld\n\r", pdevice->status.tx_errors ) ;
PUTS( DEFAULT_PORT, msg ) ;
sprintf( msg, " Multicasts received: %ld\n\r", pdevice->status.multicast ) ;
PUTS( DEFAULT_PORT, msg ) ;
sprintf( msg, " Collisions: %ld\n\r", pdevice->status.collisions) ;
PUTS( DEFAULT_PORT, msg ) ;
#ifdef ETH_DEBUG
sprintf( msg, " rx_zero_length_errors: %ld\n\r", pdevice->status.rx_zero_length_errors ) ;
PUTS( DEFAULT_PORT, msg ) ;
sprintf( msg, " rx_buffer_length_errors: %ld\n\r", pdevice->status.rx_buffer_length_errors) ;
PUTS( DEFAULT_PORT, msg ) ;
#endif
sprintf( msg, " Receive length errors: %ld\n\r", pdevice->status.rx_length_errors ) ;
PUTS( DEFAULT_PORT, msg ) ;
sprintf( msg, " Receive CRC errors: %ld\n\r", pdevice->status.rx_cr_errors ) ;
PUTS( DEFAULT_PORT, msg ) ;
sprintf( msg, " Receive Dribble errors: %ld\n\r", pdevice->status.rx_db_errors ) ;
PUTS( DEFAULT_PORT, msg ) ;
sprintf( msg, " Receive frame length: %ld\n\r", pdevice->status.rx_fl_errors ) ;
PUTS( DEFAULT_PORT, msg ) ;
sprintf( msg, " Transmit aborted errors: %ld\n\r", pdevice->status.tx_fa_errors) ;
PUTS( DEFAULT_PORT, msg ) ;
sprintf( msg, " Transmit lost carrier errors: %ld\n\r", pdevice->status.tx_ls_errors) ;
PUTS( DEFAULT_PORT, msg ) ;
sprintf( msg, " Transmit FIFO underrun errors: %ld\n\r", pdevice->status.tx_ur_errors) ;
PUTS( DEFAULT_PORT, msg ) ;
sprintf( msg, " Transmit late collision errors: %ld\n\r", pdevice->status.tx_lc_errors) ;
PUTS( DEFAULT_PORT, msg ) ;
sprintf( msg, " Transmit timeout errors: %ld\n\r", pdevice->status.tx_ed_errors) ;
PUTS( DEFAULT_PORT, msg ) ;
} ;
/************************************************************************
*
* MAC_AU1000_MII_status
* Description :
* -------------
* Display MII status
*
*
* Parameters :
* ------------
*
* 'pdevice', IN, reference for this device context
*
*
* Return values :
* ---------------
*
* 'OK'(=0)
*
*
*
************************************************************************/
static
INT32 MAC_AU1000_MII_status( t_MAC_AU1000_device *pdevice )
{
UINT32 opmode ;
/* check link status, spin here till done */
while ( MACREG( pdevice->pAU1000CtrlRegs, MAC_MIICTRL) & MAC_MIICTRL_MBUSY_MASK) ;
/* set PHY address and read PHY Control register (This address is 0x00 so will
be read automatically */
MACREG( pdevice->pAU1000CtrlRegs, MAC_MIICTRL) = PHY_ADDRESS << MAC_MIICTRL_PHYA;
/* check link status, spin here till done */
while ( MACREG( pdevice->pAU1000CtrlRegs, MAC_MIICTRL) & MAC_MIICTRL_MBUSY_MASK);
/* check read register value */
if ( MACREG( pdevice->pAU1000CtrlRegs, MAC_MIIDATA) == PHY_CONTROL_DEFAULT)
{
sprintf( msg, " MII status: Link is up") ;
PUTS( DEFAULT_PORT, msg ) ;
}
else
{
/* link is down */
sprintf( msg, " MII status: Link is down!" ) ;
PUTS( DEFAULT_PORT, msg ) ;
}
return(OK) ;
}
/************************************************************************
*
* Bosporus specific functions for SPI configuration of switch
*
************************************************************************/
#ifdef BOSPORUS_CONFIG
#define sys_pinfunc (*(long *)0xb190002c)
#define sys_trioutclr (*(long *)0xb1900100)
#define sys_outputset (*(long *)0xb1900108)
#define sys_outputrd (*(long *)0xb1900108)
#define sys_outputclr (*(long *)0xb190010c)
#define sys_pinstate (*(long *)0xb1900110)
#define gpio2_mode (*(long *)0xb1700014)
#define gpio2_data (*(long *)0xb1700008)
#define SPIQ 0x1000
#define SCL 0x2000
#define SDA 0x4000
#define SPISEL 0x8000
#define SPI_RDBIT ((sys_pinstate & SPIQ) != 0)
int spi_shift(int val, int n)
/*
* shift n bits out from val, return bits shifted in
*/
{
int rv, databit;
rv = 0;
while( n-- > 0 )
{
databit = (val >> n ) & 1;
if( databit ) // falling clock edge, output data
{
sys_outputclr = SCL;
sys_outputset = SDA;
}
else
sys_outputclr = SCL | SDA;
delay3(2); // about 1us
sys_outputset = SCL; // rising clock edge, input data
rv = (rv << 1) | SPI_RDBIT;
delay3(2); // about 1us
}
return rv;
}
int spi_readreg(int addr)
{
int v;
spi_shift(0,2); // two clocks before select
sys_outputclr |= SPISEL; // drop select
spi_shift(3,8); // read command
spi_shift(addr,8); // register address
v = spi_shift(0,8); // read data
sys_outputset |= SPISEL; // de-select
spi_shift(0,2); // two more clocks unselected
return v;
}
void spi_writereg(int addr, int val)
{
spi_shift(0,2); // two clocks before select
sys_outputclr |= SPISEL; // drop select
spi_shift(2,8); // write command
spi_shift(addr,8); // register address
spi_shift(val,8); // write data
sys_outputset |= SPISEL; // de-select
spi_shift(0,2); // two more clocks unselected
}
void spi_dumpregs()
{
int i;
for( i = 0; i < 128; ++i )
{
if( (i % 16) == 0 )
printf("%02X: ",i);
printf("%02x ",spi_readreg(i));
if( (i % 16) == 15 )
printf("\n");
}
}
void bosporus_init_switch()
{
spi_writereg(1,1); // write the "start switch" bit
delay3(2);
spi_writereg(1,1); // write the "start switch" bit
delay3(2);
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -