PPC MPC860 Ethernet Bug - Full Duplex doesn't work

The code that enables Full Duplex Ethernet is in the file:

/usr/src/ddk-6.1.0/network/src/hardware/devn/ppc800/ppc800.c

It contains the code:

if( nic->flags & NIC_FLAG_FDX ) {
scc_reg->scc_psmr |= PPC800_PSMR_FDE;
}

This doesn’t obey Motorola’s specification for Full Duplex
Ethernet on the MPC860. In their manual (available online)
it says:

28.16 Full-Duplex Ethernet Support

To run full-duplex Ethernet, select loopback and full-duplex
Ethernet modes in the SCCÕs protocol-speciÞc mode register,
(PSMR[LPB, FDE] = 1). The loopback mode tells the
Ethernet controller to accept received frames without
signaling a collision. Setting PSMR[FDE] tells the
controller that it can send while receiving without
waiting for a clear line (carrier sense).

So it has to be:

if( nic->flags & NIC_FLAG_FDX ) {
scc_reg->scc_psmr |= PPC800_PSMR_FDE |
PPC800_PSMR_LBK;
}

I have a test that hammers packets at the TCP echo port
(full size packets with a preload) and measures the
theroughput.

As written the TCP/IP throughput is an utterly dismal
132 kbytes/sec over full-duplex ethernet. With this change
the speed increases to a slightly better 640 kbytes/second.

This is still way short of the theoretical 2 Mbytes/second,
and half the speed of another OS we run on the same
hardware which manages 1340 kbytes/second. It is an
MPC860P and is running at 48MHz.

And nowhere near the full-speed that Sun 3’s managed over
10 years ago running on 20MHz 68020s.

So is there anything else that needs to be changed to get
the TCP/IP/Ethernet performance up?

Tom Evans
InitialSurnameAt
tennyson.com.au

Thanks for the tip – btw, the #define in your fix should be PPC800_PSMR_LPB
not PPC800_PSMR_LBK.

“Tom Evans” <tom@nospam.invalid> wrote in message
news:3BFA02AD.488D@nospam.invalid

The code that enables Full Duplex Ethernet is in the file:

/usr/src/ddk-6.1.0/network/src/hardware/devn/ppc800/ppc800.c

It contains the code:

if( nic->flags & NIC_FLAG_FDX ) {
scc_reg->scc_psmr |= PPC800_PSMR_FDE;
}

This doesn’t obey Motorola’s specification for Full Duplex
Ethernet on the MPC860. In their manual (available online)
it says:

28.16 Full-Duplex Ethernet Support

To run full-duplex Ethernet, select loopback and full-duplex
Ethernet modes in the SCCÕs protocol-speciÞc mode register,
(PSMR[LPB, FDE] = 1). The loopback mode tells the
Ethernet controller to accept received frames without
signaling a collision. Setting PSMR[FDE] tells the
controller that it can send while receiving without
waiting for a clear line (carrier sense).

So it has to be:

if( nic->flags & NIC_FLAG_FDX ) {
scc_reg->scc_psmr |= PPC800_PSMR_FDE |
PPC800_PSMR_LBK;
}

I have a test that hammers packets at the TCP echo port
(full size packets with a preload) and measures the
theroughput.

As written the TCP/IP throughput is an utterly dismal
132 kbytes/sec over full-duplex ethernet. With this change
the speed increases to a slightly better 640 kbytes/second.

This is still way short of the theoretical 2 Mbytes/second,
and half the speed of another OS we run on the same
hardware which manages 1340 kbytes/second. It is an
MPC860P and is running at 48MHz.

And nowhere near the full-speed that Sun 3’s managed over
10 years ago running on 20MHz 68020s.

So is there anything else that needs to be changed to get
the TCP/IP/Ethernet performance up?

Tom Evans
InitialSurnameAt
tennyson.com.au

Logged and should be fixed for 6.1.1. Thanks.

chris


Tom Evans <tom@nospam.invalid> wrote:

The code that enables Full Duplex Ethernet is in the file:

/usr/src/ddk-6.1.0/network/src/hardware/devn/ppc800/ppc800.c

It contains the code:

if( nic->flags & NIC_FLAG_FDX ) {
scc_reg->scc_psmr |= PPC800_PSMR_FDE;
}

This doesn’t obey Motorola’s specification for Full Duplex
Ethernet on the MPC860. In their manual (available online)
it says:

28.16 Full-Duplex Ethernet Support

To run full-duplex Ethernet, select loopback and full-duplex
Ethernet modes in the SCC?s protocol-speci?c mode register,
(PSMR[LPB, FDE] = 1). The loopback mode tells the
Ethernet controller to accept received frames without
signaling a collision. Setting PSMR[FDE] tells the
controller that it can send while receiving without
waiting for a clear line (carrier sense).

So it has to be:

if( nic->flags & NIC_FLAG_FDX ) {
scc_reg->scc_psmr |= PPC800_PSMR_FDE |
PPC800_PSMR_LBK;
}

I have a test that hammers packets at the TCP echo port
(full size packets with a preload) and measures the
theroughput.

As written the TCP/IP throughput is an utterly dismal
132 kbytes/sec over full-duplex ethernet. With this change
the speed increases to a slightly better 640 kbytes/second.

This is still way short of the theoretical 2 Mbytes/second,
and half the speed of another OS we run on the same
hardware which manages 1340 kbytes/second. It is an
MPC860P and is running at 48MHz.

And nowhere near the full-speed that Sun 3’s managed over
10 years ago running on 20MHz 68020s.

So is there anything else that needs to be changed to get
the TCP/IP/Ethernet performance up?

Tom Evans
InitialSurnameAt
tennyson.com.au

cdm@qnx.com > “The faster I go, the behinder I get.”

Chris McKillop – Lewis Carroll –
Software Engineer, QSSL
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Chris McKillop wrote:

Logged and should be fixed for 6.1.1. Thanks.

Thanks.

You have no idea how good it is to get a quick response
like that after trying to deal with companies like
Mxxxxxxx and Rxxxxxx for years. :slight_smile:

Tom Evans
InitialSurnameAt
tennyson.com.au