@ -70,10 +70,8 @@
typedef struct
typedef struct
{
{
union
union {
{
struct {
struct
{
volatile u32 HOLD : 1 ;
volatile u32 HOLD : 1 ;
volatile u32 ICpt : 1 ;
volatile u32 ICpt : 1 ;
volatile u32 IEop : 1 ;
volatile u32 IEop : 1 ;
@ -89,10 +87,8 @@ typedef struct
volatile u32 RxDataPtr ;
volatile u32 RxDataPtr ;
union
union {
{
struct {
struct
{
volatile u32 C : 1 ;
volatile u32 C : 1 ;
volatile u32 Sop : 1 ;
volatile u32 Sop : 1 ;
volatile u32 Eop : 1 ;
volatile u32 Eop : 1 ;
@ -108,10 +104,8 @@ typedef struct
typedef struct
typedef struct
{
{
union
union {
{
struct {
struct
{
volatile u32 HOLD : 1 ;
volatile u32 HOLD : 1 ;
volatile u32 Eop : 1 ;
volatile u32 Eop : 1 ;
volatile u32 Sop : 1 ;
volatile u32 Sop : 1 ;
@ -159,8 +153,7 @@ int inca_switch_initialize(bd_t * bis)
printf ( " Entered inca_switch_initialize() \n " ) ;
printf ( " Entered inca_switch_initialize() \n " ) ;
# endif
# endif
if ( ! ( dev = ( struct eth_device * ) malloc ( sizeof * dev ) ) )
if ( ! ( dev = ( struct eth_device * ) malloc ( sizeof * dev ) ) ) {
{
printf ( " Failed to allocate memory \n " ) ;
printf ( " Failed to allocate memory \n " ) ;
return 0 ;
return 0 ;
}
}
@ -229,15 +222,12 @@ static int inca_switch_init(struct eth_device *dev, bd_t * bis)
/* Check if it is the last descriptor.
/* Check if it is the last descriptor.
*/
*/
if ( i = = ( NUM_RX_DESC - 1 ) )
if ( i = = ( NUM_RX_DESC - 1 ) ) {
{
/* Let the last descriptor point to the first
/* Let the last descriptor point to the first
* one .
* one .
*/
*/
rx_desc - > nextRxDescPtr = KSEG1ADDR ( ( u32 ) rx_ring ) ;
rx_desc - > nextRxDescPtr = KSEG1ADDR ( ( u32 ) rx_ring ) ;
}
} else {
else
{
/* Set the address of the next descriptor.
/* Set the address of the next descriptor.
*/
*/
rx_desc - > nextRxDescPtr = ( u32 ) KSEG1ADDR ( & rx_ring [ i + 1 ] ) ;
rx_desc - > nextRxDescPtr = ( u32 ) KSEG1ADDR ( & rx_ring [ i + 1 ] ) ;
@ -251,8 +241,7 @@ static int inca_switch_init(struct eth_device *dev, bd_t * bis)
printf ( " tx_ring = 0x%08X 0x%08X \n " , ( u32 ) tx_ring , ( u32 ) & tx_ring [ 0 ] ) ;
printf ( " tx_ring = 0x%08X 0x%08X \n " , ( u32 ) tx_ring , ( u32 ) & tx_ring [ 0 ] ) ;
# endif
# endif
for ( i = 0 ; i < NUM_TX_DESC ; i + + )
for ( i = 0 ; i < NUM_TX_DESC ; i + + ) {
{
inca_tx_descriptor_t * tx_desc = KSEG1ADDR ( & tx_ring [ i ] ) ;
inca_tx_descriptor_t * tx_desc = KSEG1ADDR ( & tx_ring [ i ] ) ;
memset ( tx_desc , 0 , sizeof ( tx_ring [ i ] ) ) ;
memset ( tx_desc , 0 , sizeof ( tx_ring [ i ] ) ) ;
@ -263,15 +252,12 @@ static int inca_switch_init(struct eth_device *dev, bd_t * bis)
/* Check if it is the last descriptor.
/* Check if it is the last descriptor.
*/
*/
if ( i = = ( NUM_TX_DESC - 1 ) )
if ( i = = ( NUM_TX_DESC - 1 ) ) {
{
/* Let the last descriptor point to the
/* Let the last descriptor point to the
* first one .
* first one .
*/
*/
tx_desc - > nextTxDescPtr = KSEG1ADDR ( ( u32 ) tx_ring ) ;
tx_desc - > nextTxDescPtr = KSEG1ADDR ( ( u32 ) tx_ring ) ;
}
} else {
else
{
/* Set the address of the next descriptor.
/* Set the address of the next descriptor.
*/
*/
tx_desc - > nextTxDescPtr = ( u32 ) KSEG1ADDR ( & tx_ring [ i + 1 ] ) ;
tx_desc - > nextTxDescPtr = ( u32 ) KSEG1ADDR ( & tx_ring [ i + 1 ] ) ;
@ -315,9 +301,9 @@ static int inca_switch_init(struct eth_device *dev, bd_t * bis)
# endif
# endif
/* enable spanning tree forwarding, enable the CPU port */
/* enable spanning tree forwarding, enable the CPU port */
/* ST_PT:
/* ST_PT:
CPS ( CPU port status ) 0x3 ( forwarding )
* CPS ( CPU port status ) 0x3 ( forwarding )
LPS ( LAN port status ) 0x3 ( forwarding )
* LPS ( LAN port status ) 0x3 ( forwarding )
PPS ( PC port status ) 0x3 ( forwarding )
* PPS ( PC port status ) 0x3 ( forwarding )
*/
*/
SW_WRITE_REG ( INCA_IP_Switch_ST_PT , 0x3f ) ;
SW_WRITE_REG ( INCA_IP_Switch_ST_PT , 0x3f ) ;
@ -342,23 +328,19 @@ static int inca_switch_send(struct eth_device *dev, volatile void *packet,
printf ( " Entered inca_switch_send() \n " ) ;
printf ( " Entered inca_switch_send() \n " ) ;
# endif
# endif
if ( length < = 0 )
if ( length < = 0 ) {
{
printf ( " %s: bad packet size: %d \n " , dev - > name , length ) ;
printf ( " %s: bad packet size: %d \n " , dev - > name , length ) ;
goto Done ;
goto Done ;
}
}
for ( i = 0 ; tx_desc - > C = = 0 ; i + + )
for ( i = 0 ; tx_desc - > C = = 0 ; i + + ) {
{
if ( i > = TOUT_LOOP ) {
if ( i > = TOUT_LOOP )
{
printf ( " %s: tx error buffer not ready \n " , dev - > name ) ;
printf ( " %s: tx error buffer not ready \n " , dev - > name ) ;
goto Done ;
goto Done ;
}
}
}
}
if ( tx_old_hold > = 0 )
if ( tx_old_hold > = 0 ) {
{
KSEG1ADDR ( & tx_ring [ tx_old_hold ] ) - > params . field . HOLD = 1 ;
KSEG1ADDR ( & tx_ring [ tx_old_hold ] ) - > params . field . HOLD = 1 ;
}
}
tx_old_hold = tx_hold ;
tx_old_hold = tx_hold ;
@ -376,13 +358,10 @@ static int inca_switch_send(struct eth_device *dev, volatile void *packet,
tx_new = ( tx_new + 1 ) % NUM_TX_DESC ;
tx_new = ( tx_new + 1 ) % NUM_TX_DESC ;
if ( ! initialized )
if ( ! initialized ) {
{
command = INCA_IP_DMA_DMA_TXCCR0_INIT ;
command = INCA_IP_DMA_DMA_TXCCR0_INIT ;
initialized = 1 ;
initialized = 1 ;
}
} else {
else
{
command = INCA_IP_DMA_DMA_TXCCR0_HR ;
command = INCA_IP_DMA_DMA_TXCCR0_HR ;
}
}
@ -394,10 +373,8 @@ static int inca_switch_send(struct eth_device *dev, volatile void *packet,
DMA_WRITE_REG ( INCA_IP_DMA_DMA_TXCCR0 , regValue ) ;
DMA_WRITE_REG ( INCA_IP_DMA_DMA_TXCCR0 , regValue ) ;
# if 1
# if 1
for ( i = 0 ; KSEG1ADDR ( & tx_ring [ tx_hold ] ) - > C = = 0 ; i + + )
for ( i = 0 ; KSEG1ADDR ( & tx_ring [ tx_hold ] ) - > C = = 0 ; i + + ) {
{
if ( i > = TOUT_LOOP ) {
if ( i > = TOUT_LOOP )
{
printf ( " %s: tx buffer not ready \n " , dev - > name ) ;
printf ( " %s: tx buffer not ready \n " , dev - > name ) ;
goto Done ;
goto Done ;
}
}
@ -421,12 +398,10 @@ static int inca_switch_recv(struct eth_device *dev)
printf ( " Entered inca_switch_recv() \n " ) ;
printf ( " Entered inca_switch_recv() \n " ) ;
# endif
# endif
for ( ; ; )
for ( ; ; ) {
{
rx_desc = KSEG1ADDR ( & rx_ring [ rx_new ] ) ;
rx_desc = KSEG1ADDR ( & rx_ring [ rx_new ] ) ;
if ( rx_desc - > status . field . C = = 0 )
if ( rx_desc - > status . field . C = = 0 ) {
{
break ;
break ;
}
}
@ -434,8 +409,7 @@ static int inca_switch_recv(struct eth_device *dev)
rx_ring [ rx_new ] . params . field . HOLD = 1 ;
rx_ring [ rx_new ] . params . field . HOLD = 1 ;
# endif
# endif
if ( ! rx_desc - > status . field . Eop )
if ( ! rx_desc - > status . field . Eop ) {
{
printf ( " Partly received packet!!! \n " ) ;
printf ( " Partly received packet!!! \n " ) ;
break ;
break ;
}
}
@ -454,16 +428,13 @@ static int inca_switch_recv(struct eth_device *dev)
}
}
# endif
# endif
if ( length )
if ( length ) {
{
#if 0
#if 0
printf ( " Received %d bytes \n " , length ) ;
printf ( " Received %d bytes \n " , length ) ;
# endif
# endif
NetReceive ( ( void * ) KSEG1ADDR ( NetRxPackets [ rx_new ] ) ,
NetReceive ( ( void * ) KSEG1ADDR ( NetRxPackets [ rx_new ] ) ,
length - 4 ) ;
length - 4 ) ;
}
} else {
else
{
# if 1
# if 1
printf ( " Zero length!!! \n " ) ;
printf ( " Zero length!!! \n " ) ;
# endif
# endif
@ -527,63 +498,64 @@ static void inca_init_switch_chip(void)
# if 1
# if 1
/* init MDIO configuration:
/* init MDIO configuration:
MDS ( Poll speed ) : 0x01 ( 4 ms )
* MDS ( Poll speed ) : 0x01 ( 4 ms )
PHY_LAN_ADDR : 0x06
* PHY_LAN_ADDR : 0x06
PHY_PC_ADDR : 0x05
* PHY_PC_ADDR : 0x05
UEP ( Use External PHY ) : 0x00 ( Internal PHY is used )
* UEP ( Use External PHY ) : 0x00 ( Internal PHY is used )
PS ( Port Select ) : 0x00 ( PT / UMM for LAN )
* PS ( Port Select ) : 0x00 ( PT / UMM for LAN )
PT ( PHY Test ) : 0x00 ( no test mode )
* PT ( PHY Test ) : 0x00 ( no test mode )
UMM ( Use MDIO Mode ) : 0x00 ( state machine is disabled )
* UMM ( Use MDIO Mode ) : 0x00 ( state machine is disabled )
*/
*/
SW_WRITE_REG ( INCA_IP_Switch_MDIO_CFG , 0x4c50 ) ;
SW_WRITE_REG ( INCA_IP_Switch_MDIO_CFG , 0x4c50 ) ;
/* init PHY:
/* init PHY:
SL ( Auto Neg . Speed for LAN )
* SL ( Auto Neg . Speed for LAN )
SP ( Auto Neg . Speed for PC )
* SP ( Auto Neg . Speed for PC )
LL ( Link Status for LAN )
* LL ( Link Status for LAN )
LP ( Link Status for PC )
* LP ( Link Status for PC )
DL ( Duplex Status for LAN )
* DL ( Duplex Status for LAN )
DP ( Duplex Status for PC )
* DP ( Duplex Status for PC )
PL ( Auto Neg . Pause Status for LAN )
* PL ( Auto Neg . Pause Status for LAN )
PP ( Auto Neg . Pause Status for PC )
* PP ( Auto Neg . Pause Status for PC )
*/
*/
SW_WRITE_REG ( INCA_IP_Switch_EPHY , 0xff ) ;
SW_WRITE_REG ( INCA_IP_Switch_EPHY , 0xff ) ;
/* MDIO_ACC:
/* MDIO_ACC:
RA ( Request / Ack ) 0x01 ( Request )
* RA ( Request / Ack ) 0x01 ( Request )
RW ( Read / Write ) 0x01 ( Write )
* RW ( Read / Write ) 0x01 ( Write )
PHY_ADDR 0x05 ( PC )
* PHY_ADDR 0x05 ( PC )
REG_ADDR 0x00 ( PHY_BCR : basic control register )
* REG_ADDR 0x00 ( PHY_BCR : basic control register )
PHY_DATA 0x8000
* PHY_DATA 0x8000
Reset - software reset
* Reset - software reset
LB ( loop back ) - normal
* LB ( loop back ) - normal
SS ( speed select ) - 10 Mbit / s
* SS ( speed select ) - 10 Mbit / s
ANE ( auto neg . enable ) - dis able
* ANE ( auto neg . enable ) - en able
PD ( power down ) - normal
* PD ( power down ) - normal
ISO ( isolate ) - normal
* ISO ( isolate ) - normal
RAN ( restart auto neg . ) - normal
* RAN ( restart auto neg . ) - normal
DM ( duplex mode ) - half duplex
* DM ( duplex mode ) - half duplex
CT ( collision test ) - enable
* CT ( collision test ) - enable
*/
*/
SW_WRITE_REG ( INCA_IP_Switch_MDIO_ACC , 0xc0a08 000 ) ;
SW_WRITE_REG ( INCA_IP_Switch_MDIO_ACC , 0xc0a09 000 ) ;
/* MDIO_ACC:
/* MDIO_ACC:
RA ( Request / Ack ) 0x01 ( Request )
* RA ( Request / Ack ) 0x01 ( Request )
RW ( Read / Write ) 0x01 ( Write )
* RW ( Read / Write ) 0x01 ( Write )
PHY_ADDR 0x06 ( LAN )
* PHY_ADDR 0x06 ( LAN )
REG_ADDR 0x00 ( PHY_BCR : basic control register )
* REG_ADDR 0x00 ( PHY_BCR : basic control register )
PHY_DATA 0x8000
* PHY_DATA 0x8000
Reset - software reset
* Reset - software reset
LB ( loop back ) - normal
* LB ( loop back ) - normal
SS ( speed select ) - 10 Mbit / s
* SS ( speed select ) - 10 Mbit / s
ANE ( auto neg . enable ) - disable
* ANE ( auto neg . enable ) - enable
PD ( power down ) - normal
* PD ( power down ) - normal
ISO ( isolate ) - normal
* ISO ( isolate ) - normal
RAN ( restart auto neg . ) - normal
* RAN ( restart auto neg . ) - normal
DM ( duplex mode ) - half duplex
* DM ( duplex mode ) - half duplex
CT ( collision test ) - enable
* CT ( collision test ) - enable
*/
*/
SW_WRITE_REG ( INCA_IP_Switch_MDIO_ACC , 0xc0c08000 ) ;
SW_WRITE_REG ( INCA_IP_Switch_MDIO_ACC , 0xc0c09000 ) ;
# endif
# endif
/* Make sure the CPU port is disabled for now. We
/* Make sure the CPU port is disabled for now. We