Yes it seems the ALE changes from NetBSD don't help.
Here is an updated version of the diff from
http://marc.info/?l=openbsd-tech&m=139731502408655&w=2
Index: if_cpsw.c
===================================================================
RCS file: /cvs/src/sys/arch/armv7/omap/if_cpsw.c,v
retrieving revision 1.23
diff -u -p -r1.23 if_cpsw.c
--- if_cpsw.c 18 Aug 2014 17:56:45 -0000 1.23
+++ if_cpsw.c 6 Nov 2014 10:32:07 -0000
@@ -128,7 +128,7 @@ struct cpsw_softc {
struct arpcom sc_ac;
struct mii_data sc_mii;
-
+ bool sc_phy_has_1000t;
struct cpsw_ring_data *sc_rdp;
volatile u_int sc_txnext;
volatile u_int sc_txhead;
@@ -175,7 +175,22 @@ int cpsw_rxintr(void *);
int cpsw_txintr(void *);
int cpsw_miscintr(void *);
+#define CPSW_MAX_ALE_ENTRIES 1024
+
+int cpsw_ale_update_addresses(struct cpsw_softc *, int);
+void cpsw_ale_entry_init(uint32_t *);
+void cpsw_ale_entry_set_mac(uint32_t *, const uint8_t *);
+void cpsw_ale_entry_set_bcast_mac(uint32_t *);
+void cpsw_ale_entry_set(uint32_t *, ale_entry_filed_t, uint32_t);
+bool cpsw_ale_entry_mac_match(const uint32_t *, const uint8_t *);
+void cpsw_ale_set_outgoing_mac(struct cpsw_softc *, int, const uint8_t *);
+void cpsw_ale_read_entry(struct cpsw_softc *, uint16_t, uint32_t *);
+void cpsw_ale_write_entry(struct cpsw_softc *, uint16_t, uint32_t *);
+int cpsw_ale_remove_all_mc_entries(struct cpsw_softc *);
+int cpsw_ale_mc_entry_set(struct cpsw_softc *, uint8_t, uint8_t *);
+int cpsw_ale_update_addresses(struct cpsw_softc *, int);
void cpsw_get_mac_addr(struct cpsw_softc *);
+bool cpsw_phy_has_1000t(struct cpsw_softc * const);
struct cfattach cpsw_ca = {
sizeof(struct cpsw_softc),
@@ -286,6 +301,18 @@ cpsw_get_mac_addr(struct cpsw_softc *sc)
}
}
+bool
+cpsw_phy_has_1000t(struct cpsw_softc * const sc)
+{
+ struct ifmedia_entry *ifm;
+
+ TAILQ_FOREACH(ifm, &sc->sc_mii.mii_media.ifm_list, ifm_list) {
+ if (IFM_SUBTYPE(ifm->ifm_media) == IFM_1000_T)
+ return true;
+ }
+ return false;
+}
+
void
cpsw_attach(struct device *parent, struct device *self, void *aux)
{
@@ -393,14 +420,32 @@ cpsw_attach(struct device *parent, struc
ifmedia_init(&sc->sc_mii.mii_media, 0, cpsw_mediachange,
cpsw_mediastatus);
+
+ /* Initialize MDIO */
+ bus_space_write_4(sc->sc_bst, sc->sc_bsh, MDIOCONTROL,
+ MDIOCTL_ENABLE | MDIOCTL_FAULTENB | MDIOCTL_CLKDIV(0xff));
+ /* Clear ALE */
+ bus_space_write_4(sc->sc_bst, sc->sc_bsh, CPSW_ALE_CONTROL,
+ ALECTL_CLEAR_TABLE);
+
mii_attach(self, &sc->sc_mii, 0xffffffff,
MII_PHY_ANY, MII_OFFSET_ANY, 0);
if (LIST_FIRST(&sc->sc_mii.mii_phys) == NULL) {
printf("no PHY found!\n");
+ sc->sc_phy_has_1000t = false;
ifmedia_add(&sc->sc_mii.mii_media,
IFM_ETHER|IFM_MANUAL, 0, NULL);
ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_MANUAL);
} else {
+ sc->sc_phy_has_1000t = cpsw_phy_has_1000t(sc);
+ if (sc->sc_phy_has_1000t) {
+ printf("1000baseT PHY found. setting RGMII Mode\n");
+ /* Select Interface RGMII Mode in the Control Module */
+ sitara_cm_reg_write_4(CPSW_GMII_SEL,
+ GMIISEL_GMII2_SEL(RGMII_MODE) |
+ GMIISEL_GMII1_SEL(RGMII_MODE));
+ }
+
ifmedia_set(&sc->sc_mii.mii_media, IFM_ETHER|IFM_AUTO);
}
@@ -769,6 +814,8 @@ cpsw_init(struct ifnet *ifp)
/* Reset and init Sliver port 1 and 2 */
for (i = 0; i < 2; i++) {
+ uint32_t macctl;
+
/* Reset */
bus_space_write_4(sc->sc_bst, sc->sc_bsh,
CPSW_SL_SOFT_RESET(i), 1);
while(bus_space_read_4(sc->sc_bst, sc->sc_bsh,
CPSW_SL_SOFT_RESET(i)) & 1);
@@ -783,10 +830,13 @@ cpsw_init(struct ifnet *ifp)
bus_space_write_4(sc->sc_bst, sc->sc_bsh,
CPSW_PORT_P_SA_LO(i+1),
ac->ac_enaddr[4] | (ac->ac_enaddr[5] << 8));
- /* Set MACCONTROL for ports 0,1: FULLDUPLEX(1), GMII_EN(5),
- IFCTL_A(15), IFCTL_B(16) FIXME */
+ /* Set MACCONTROL for ports 0,1 */
+ macctl = SLMACCTL_FULLDUPLEX | SLMACCTL_GMII_EN |
+ SLMACCTL_IFCTL_A;
+ if (sc->sc_phy_has_1000t)
+ macctl |= SLMACCTL_GIG;
bus_space_write_4(sc->sc_bst, sc->sc_bsh, CPSW_SL_MACCONTROL(i),
- 1 | (1<<5) | (1<<15) | (1<<16));
+ macctl);
/* Set ALE port to forwarding(3) */
bus_space_write_4(sc->sc_bst, sc->sc_bsh,
CPSW_ALE_PORTCTL(i+1), 3);
@@ -799,6 +849,9 @@ cpsw_init(struct ifnet *ifp)
/* Set ALE port to forwarding(3) */
bus_space_write_4(sc->sc_bst, sc->sc_bsh, CPSW_ALE_PORTCTL(0), 3);
+ /* Initialize addrs */
+ cpsw_ale_update_addresses(sc, 1);
+
bus_space_write_4(sc->sc_bst, sc->sc_bsh, CPSW_SS_PTYPE, 0);
bus_space_write_4(sc->sc_bst, sc->sc_bsh, CPSW_SS_STAT_PORT_EN, 7);
@@ -1207,4 +1260,195 @@ cpsw_miscintr(void *arg)
bus_space_write_4(sc->sc_bst, sc->sc_bsh, CPSW_CPDMA_CPDMA_EOI_VECTOR,
CPSW_INTROFF_MISC);
return 1;
+}
+/*
+ * ALE support routines.
+ */
+
+void
+cpsw_ale_entry_init(uint32_t *ale_entry)
+{
+ ale_entry[0] = ale_entry[1] = ale_entry[2] = 0;
+}
+
+void
+cpsw_ale_entry_set_mac(uint32_t *ale_entry, const uint8_t *mac)
+{
+ ale_entry[0] = mac[2] << 24 | mac[3] << 16 | mac[4] << 8 | mac[5];
+ ale_entry[1] = mac[0] << 8 | mac[1];
+}
+
+void
+cpsw_ale_entry_set_bcast_mac(uint32_t *ale_entry)
+{
+ ale_entry[0] = 0xffffffff;
+ ale_entry[1] = 0x0000ffff;
+}
+
+void
+cpsw_ale_entry_set(uint32_t *ale_entry, ale_entry_filed_t field, uint32_t val)
+{
+ /* Entry type[61:60] is addr entry(1), Mcast fwd state[63:62] is fw(3)*/
+ switch (field) {
+ case ALE_ENTRY_TYPE:
+ /* [61:60] */
+ ale_entry[1] |= (val & 0x3) << 28;
+ break;
+ case ALE_MCAST_FWD_STATE:
+ /* [63:62] */
+ ale_entry[1] |= (val & 0x3) << 30;
+ break;
+ case ALE_PORT_MASK:
+ /* [68:66] */
+ ale_entry[2] |= (val & 0x7) << 2;
+ break;
+ case ALE_PORT_NUMBER:
+ /* [67:66] */
+ ale_entry[2] |= (val & 0x3) << 2;
+ break;
+ default:
+ panic("Invalid ALE entry field: %d\n", field);
+ }
+
+ return;
+}
+
+bool
+cpsw_ale_entry_mac_match(const uint32_t *ale_entry, const uint8_t *mac)
+{
+ return (((ale_entry[1] >> 8) & 0xff) == mac[0]) &&
+ (((ale_entry[1] >> 0) & 0xff) == mac[1]) &&
+ (((ale_entry[0] >>24) & 0xff) == mac[2]) &&
+ (((ale_entry[0] >>16) & 0xff) == mac[3]) &&
+ (((ale_entry[0] >> 8) & 0xff) == mac[4]) &&
+ (((ale_entry[0] >> 0) & 0xff) == mac[5]);
+}
+
+void
+cpsw_ale_set_outgoing_mac(struct cpsw_softc *sc, int port, const uint8_t *mac)
+{
+ bus_space_write_4(sc->sc_bst, sc->sc_bsh, CPSW_PORT_P_SA_HI(port),
+ mac[3] << 24 | mac[2] << 16 | mac[1] << 8 | mac[0]);
+ bus_space_write_4(sc->sc_bst, sc->sc_bsh, CPSW_PORT_P_SA_LO(port),
+ mac[5] << 8 | mac[4]);
+}
+
+void
+cpsw_ale_read_entry(struct cpsw_softc *sc, uint16_t idx, uint32_t *ale_entry)
+{
+ bus_space_write_4(sc->sc_bst, sc->sc_bsh, CPSW_ALE_TBLCTL, idx & 1023);
+ ale_entry[0] = bus_space_read_4(sc->sc_bst, sc->sc_bsh, CPSW_ALE_TBLW0);
+ ale_entry[1] = bus_space_read_4(sc->sc_bst, sc->sc_bsh, CPSW_ALE_TBLW1);
+ ale_entry[2] = bus_space_read_4(sc->sc_bst, sc->sc_bsh, CPSW_ALE_TBLW2);
+}
+
+void
+cpsw_ale_write_entry(struct cpsw_softc *sc, uint16_t idx, uint32_t *ale_entry)
+{
+ bus_space_write_4(sc->sc_bst, sc->sc_bsh, CPSW_ALE_TBLW0, ale_entry[0]);
+ bus_space_write_4(sc->sc_bst, sc->sc_bsh, CPSW_ALE_TBLW1, ale_entry[1]);
+ bus_space_write_4(sc->sc_bst, sc->sc_bsh, CPSW_ALE_TBLW2, ale_entry[2]);
+ bus_space_write_4(sc->sc_bst, sc->sc_bsh, CPSW_ALE_TBLCTL,
+ 1 << 31 | (idx & 1023));
+}
+
+int
+cpsw_ale_remove_all_mc_entries(struct cpsw_softc *sc)
+{
+ int i;
+ uint32_t ale_entry[3];
+
+ /* First two entries are link address and broadcast. */
+ for (i = 2; i < CPSW_MAX_ALE_ENTRIES; i++) {
+ cpsw_ale_read_entry(sc, i, ale_entry);
+ if (((ale_entry[1] >> 28) & 3) == 1 && /* Address entry */
+ ((ale_entry[1] >> 8) & 1) == 1) { /* MCast link addr */
+ ale_entry[0] = ale_entry[1] = ale_entry[2] = 0;
+ cpsw_ale_write_entry(sc, i, ale_entry);
+ }
+ }
+ return CPSW_MAX_ALE_ENTRIES;
+}
+
+int
+cpsw_ale_mc_entry_set(struct cpsw_softc *sc, uint8_t portmask, uint8_t *mac)
+{
+ int free_index = -1, matching_index = -1, i;
+ uint32_t ale_entry[3];
+
+ /* Find a matching entry or a free entry. */
+ for (i = 0; i < CPSW_MAX_ALE_ENTRIES; i++) {
+ cpsw_ale_read_entry(sc, i, ale_entry);
+
+ /* Entry Type[61:60] is 0 for free entry */
+ if (free_index < 0 && ((ale_entry[1] >> 28) & 3) == 0) {
+ free_index = i;
+ }
+
+ if (cpsw_ale_entry_mac_match(ale_entry, mac)) {
+ matching_index = i;
+ break;
+ }
+ }
+
+ if (matching_index < 0) {
+ if (free_index < 0)
+ return ENOMEM;
+ i = free_index;
+ }
+
+ cpsw_ale_entry_init(ale_entry);
+
+ cpsw_ale_entry_set_mac(ale_entry, mac);
+ cpsw_ale_entry_set(ale_entry, ALE_ENTRY_TYPE, ALE_TYPE_ADDRESS);
+ cpsw_ale_entry_set(ale_entry, ALE_MCAST_FWD_STATE, ALE_FWSTATE_FWONLY);
+ cpsw_ale_entry_set(ale_entry, ALE_PORT_MASK, portmask);
+
+ cpsw_ale_write_entry(sc, i, ale_entry);
+
+ return 0;
+}
+
+int
+cpsw_ale_update_addresses(struct cpsw_softc *sc, int purge)
+{
+ struct arpcom *ac = &sc->sc_ac;
+ uint8_t *mac = ac->ac_enaddr;
+ uint32_t ale_entry[3];
+ int i;
+ struct ether_multi *ifma;
+
+ cpsw_ale_entry_init(ale_entry);
+ /* Route incoming packets for our MAC address to Port 0 (host). */
+ /* For simplicity, keep this entry at table index 0 in the ALE. */
+ cpsw_ale_entry_set_mac(ale_entry, mac);
+ cpsw_ale_entry_set(ale_entry, ALE_ENTRY_TYPE, ALE_TYPE_ADDRESS);
+ cpsw_ale_entry_set(ale_entry, ALE_PORT_NUMBER, 0);
+ cpsw_ale_write_entry(sc, 0, ale_entry);
+
+ /* Set outgoing MAC Address for Ports 1 and 2. */
+ for (i = 1; i < 3; ++i)
+ cpsw_ale_set_outgoing_mac(sc, i, mac);
+
+ /* Keep the broadcast address at table entry 1. */
+ cpsw_ale_entry_init(ale_entry);
+ cpsw_ale_entry_set_bcast_mac(ale_entry);
+ cpsw_ale_entry_set(ale_entry, ALE_ENTRY_TYPE, ALE_TYPE_ADDRESS);
+ cpsw_ale_entry_set(ale_entry, ALE_MCAST_FWD_STATE, ALE_FWSTATE_FWONLY);
+ cpsw_ale_entry_set(ale_entry, ALE_PORT_MASK, ALE_PORT_MASK_ALL);
+ cpsw_ale_write_entry(sc, 1, ale_entry);
+
+ /*
+ * SIOCDELMULTI doesn't specify the particular address
+ * being removed, so we have to remove all and rebuild.
+ */
+ if (purge)
+ cpsw_ale_remove_all_mc_entries(sc);
+
+ /* Set other multicast addrs desired. */
+ LIST_FOREACH(ifma, &ac->ac_multiaddrs, enm_list) {
+ cpsw_ale_mc_entry_set(sc, ALE_PORT_MASK_ALL, ifma->enm_addrlo);
+ }
+
+ return 0;
}
Index: if_cpswreg.h
===================================================================
RCS file: /cvs/src/sys/arch/armv7/omap/if_cpswreg.h,v
retrieving revision 1.5
diff -u -p -r1.5 if_cpswreg.h
--- if_cpswreg.h 15 Nov 2013 14:31:52 -0000 1.5
+++ if_cpswreg.h 6 Nov 2014 10:32:07 -0000
@@ -39,6 +39,7 @@
#define CPSW_SS_SOFT_RESET (CPSW_SS_OFFSET + 0x08)
#define CPSW_SS_STAT_PORT_EN (CPSW_SS_OFFSET + 0x0C)
#define CPSW_SS_PTYPE (CPSW_SS_OFFSET + 0x10)
+#define CPSW_SS_RGMII_CTL (CPSW_SS_OFFSET + 0x88)
#define CPSW_PORT_OFFSET 0x0100
#define CPSW_PORT_P_TX_PRI_MAP(p) (CPSW_PORT_OFFSET + 0x118 + ((p-1) *
0x100))
@@ -47,6 +48,8 @@
#define CPSW_PORT_P_SA_LO(p) (CPSW_PORT_OFFSET + 0x120 + ((p-1) *
0x100))
#define CPSW_PORT_P_SA_HI(p) (CPSW_PORT_OFFSET + 0x124 + ((p-1) *
0x100))
+#define CPSW_GMII_SEL 0x0650
+
#define CPSW_CPDMA_OFFSET 0x0800
#define CPSW_CPDMA_TX_CONTROL (CPSW_CPDMA_OFFSET + 0x04)
#define CPSW_CPDMA_TX_TEARDOWN (CPSW_CPDMA_OFFSET + 0x08)
@@ -112,7 +115,7 @@
#define CPSW_WR_C_RX_STAT(p) (CPSW_WR_OFFSET + (0x10 * (p)) + 0x44)
#define CPSW_WR_C_TX_STAT(p) (CPSW_WR_OFFSET + (0x10 * (p)) + 0x48)
#define CPSW_WR_C_MISC_STAT(p) (CPSW_WR_OFFSET + (0x10 * (p)) + 0x4C)
-#define CPSW_MISC_HOST_PEND 0x0004
+#define CPSW_MISC_HOST_PEND 0x0004
#define CPSW_CPPI_RAM_OFFSET 0x2000
@@ -138,5 +141,83 @@ struct cpsw_cpdma_bd {
#define CPSW_INTROFF_RX 1
#define CPSW_INTROFF_TX 2
#define CPSW_INTROFF_MISC 3
+
+ /* MDIOCONTROL Register Field */
+#define MDIOCTL_IDLE (1<<31)
+#define MDIOCTL_ENABLE (1<<30)
+#define MDIOCTL_HIGHEST_USER_CHANNEL(val) ((0xf & (val)) << 24)
+#define MDIOCTL_PREAMBLE (1<<20)
+#define MDIOCTL_FAULT (1<<19)
+#define MDIOCTL_FAULTENB (1<<18)
+#define MDIOCTL_INTTESTENB (1<<17)
+#define MDIOCTL_CLKDIV(val) (0xff & (val))
+
+/* ALE Control Register Field */
+#define ALECTL_ENABLE_ALE (1<<31)
+#define ALECTL_CLEAR_TABLE (1<<30)
+#define ALECTL_AGE_OUT_NOW (1<<29)
+#define ALECTL_EN_P0_UNI_FLOOD (1<<8)
+#define ALECTL_LEARN_NO_VID (1<<7)
+#define ALECTL_EN_VID0_MODE (1<<6)
+#define ALECTL_ENABLE_OUI_DENY (1<<5)
+#define ALECTL_BYPASS (1<<4)
+#define ALECTL_RATE_LIMIT_TX (1<<3)
+#define ALECTL_VLAN_AWARE (1<<2)
+#define ALECTL_ENABLE_AUTH_MODE (1<<1)
+#define ALECTL_ENABLE_RATE_LIMIT (1<<0)
+
+/* GMII_SEL Register Field */
+#define GMIISEL_RMII2_IO_CLK_EN (1<<7)
+#define GMIISEL_RMII1_IO_CLK_EN (1<<6)
+#define GMIISEL_RGMII2_IDMODE (1<<5)
+#define GMIISEL_RGMII1_IDMODE (1<<4)
+#define GMIISEL_GMII2_SEL(val) ((0x3 & (val)) << 2)
+#define GMIISEL_GMII1_SEL(val) ((0x3 & (val)) << 0)
+#define GMII_MODE 0
+#define RMII_MODE 1
+#define RGMII_MODE 2
+
+/* Sliver MACCONTROL Register Field */
+#define SLMACCTL_RX_CMF_EN (1<<24)
+#define SLMACCTL_RX_CSF_EN (1<<23)
+#define SLMACCTL_RX_CEF_EN (1<<22)
+#define SLMACCTL_TX_SHORT_GAP_LIM_EN (1<<21)
+#define SLMACCTL_EXT_EN (1<<18)
+#define SLMACCTL_GIG_FORCE (1<<17)
+#define SLMACCTL_IFCTL_B (1<<16)
+#define SLMACCTL_IFCTL_A (1<<15)
+#define SLMACCTL_CMD_IDLE (1<<11)
+#define SLMACCTL_TX_SHORT_GAP_EN (1<<10)
+#define SLMACCTL_GIG (1<<7)
+#define SLMACCTL_TX_PACE (1<<6)
+#define SLMACCTL_GMII_EN (1<<5)
+#define SLMACCTL_TX_FLOW_EN (1<<4)
+#define SLMACCTL_RX_FLOW_EN (1<<3)
+#define SLMACCTL_MTEST (1<<2)
+#define SLMACCTL_LOOPBACK (1<<1)
+#define SLMACCTL_FULLDUPLEX (1<<0)
+
+/* ALE Address Table Entry Field */
+typedef enum {
+ ALE_ENTRY_TYPE,
+ ALE_MCAST_FWD_STATE,
+ ALE_PORT_MASK,
+ ALE_PORT_NUMBER,
+} ale_entry_filed_t;
+
+#define ALE_TYPE_FREE 0
+#define ALE_TYPE_ADDRESS 1
+#define ALE_TYPE_VLAN 2
+#define ALE_TYPE_VLAN_ADDRESS 3
+
+/*
+ * The port state(s) required for the received port on a destination address
+ * lookup in order for the multicast packet to be forwarded to the transmit
+ * port(s)
+ */
+#define ALE_FWSTATE_ALL 1 /* Blocking/Forwarding/Learning
*/
+#define ALE_FWSTATE_NOBLOCK 2 /* Forwarding/Learning */
+#define ALE_FWSTATE_FWONLY 3 /* Forwarding */
+#define ALE_PORT_MASK_ALL 7
#endif /*_IF_CPSWREG_H */
On Thu, Nov 06, 2014 at 10:07:37AM +0100, Mérindol Bernard wrote:
> Hi,
>
> Very thank for your test.
>
> I'm sad because it's not just my changes are involved.
> I think is not in ALE (but I'll make the change to set the lookup table in
> ALE), but is the interupt handling.
>
> Best regards
> Bernard
>
> > On 6 nov. 2014, at 09:55, Jonathan Gray <[email protected]> wrote:
> >
> > Here is what I see connecting from a bbb on nfs root via
> > a 100Mb switch to another host:
> >
> > tcpbench
> > tcp 5.2 Mbps
> > udp 11.6 Mbps 990 pps
> >
> > iperf
> > tcp 5.29 Mbits/sec
> > udp 1.05 Mbits/sec
> >
> > I'm not sure why udp differs here.
> >
> > Connecting from linux that was preinstalled on the emmc:
> >
> > iperf
> > tcp 92.5 Mbits/sec
> > udp 1.05 Mbits/sec
> >
> > Perhaps the switch frontend/ALE configuration is not set
> > up correctly? I'm sure you must have read a bit about that
> > when looking into adding support for the other port.
> >
> > It looks like there is not a clean seperation of registers/interrupts/dma
> > for the different ports which is annoying.
> >
> > The driver in OpenBSD does not attempt to do interrupt mitigation either.
> >
> > Though perhaps with such a large difference something more fundamental
> > like the processor cache/pmap/frequency handling could be implicated?
> >
> > On Tue, Nov 04, 2014 at 08:42:20AM +0100, Mérindol Bernard wrote:
> >> Hi Jonathan,
> >>
> >> Thank for your answer.
> >>
> >> I have re build my OpenBSD with Artheros Phy support
> >>
> >> com0: console
> >> cpsw0 at omap0: version 1.12 (0), address d4:94:a1:84:28:f2
> >> atphy0 at cpsw0 phy 0: F1 10/100/1000 PHY, rev. 4
> >> atphy1 at cpsw0 phy 1: F1 10/100/1000 PHY, rev. 4
> >> scsibus0 at sdmmc0: 2 targets, initiator 0
> >> sd0 at scsibus0 targ 1 lun 0: <SD/MMC, Drive #01, > SCSI2 0/direct fixed
> >>
> >>
> >> But the result is same. I try to install last version of NetBSD to test.
> >>
> >> If you or an other person have BeaglBoard with OpenBSD installed is it
> >> possible to send to me the result of this command.
> >>
> >> On OpenBsd
> >> nc -l 1234 > /dev/null
> >>
> >> on other host (with XXBSD example OS X);
> >> mkfile 100m CentM
> >>
> >> date;nc <@IP of your BeagleBoard> 1234 < CentM;date
> >>
> >> If you use Linux try with this command to create 100M file.
> >> dd if=/dev/zero of=CentM bs=100M count=1
> >>
> >> Thank
> >> Bernard Merindol
> >>
> >> PS: send also the result of ifconfig cpsw0
> >>
> >>
> >> On 3 nov. 2014, at 14:13, Jonathan Gray <[email protected]> wrote:
> >>>
> >>>
> >>> You have a different phy to the beaglebone boards.
> >>> It seems to be an Atheros phy that would be handled by atphy(4)
> >>> if it were added to the kernel configuration.
> >>>
> >>> I doubt that would make much of a difference though.
> >>>
> >>> rev 1.5 in NetBSD which programs the multicast filter could be
> >>> interesting
> >>>
> >>> http://cvsweb.netbsd.org/bsdweb.cgi/src/sys/arch/arm/omap/if_cpsw.c?only_with_tag=MAIN
> >>>
> >>> "Make cpsw driver work without uboot support
> >>>
> >>> On some eval boards such as BeagleBone, the cpsw device is initialized
> >>> rightly by the uboot of the boards so that the cpsw driver doesn't need
> >>> to do some initializations but works fine.
> >>>
> >>> The patch adds initializations to make the driver work solely. It also
> >>> adds support for 1000BaseT (RGMII) PHY that is equipped on some boards,
> >>> e.g., CKB-3352."
> >>>
> >>> It seems the phy might need special handling according to
> >>> http://processors.wiki.ti.com/index.php/AM335x_General_Purpose_EVM_HW_User_Guide#Gbit_Ethernet
> >>>
> >>> "Note: The GP EVM PCB does not support external delay for the clock
> >>> signals on the RGMII interface. The AR8031A PHY can be setup to use
> >>> internal clock delay mode once booting is complete. Therefore there may
> >>> be problems in function/performance when booting in Gb mode or when
> >>> running Gb Ethernet Mode before the AR8031A PHY is configured properly.
> >>> See the EVM Errata."
> >>>
> >>> Which sounds rather like the cpsw specific hack in
> >>> http://cvsweb.netbsd.org/bsdweb.cgi/~checkout~/src/sys/dev/mii/micphy.c?rev=1.3
> >>>
> >>> On Mon, Nov 03, 2014 at 12:01:39PM +0100, Mérindol Bernard wrote:
> >>>> Hi All,
> >>>>
> >>>> I works with AM335x Starter Kit from TI, I modify the cpsw driver to
> >>>> works with 2 ports (cpsw0 and cpsw1).
> >>>>
> >>>> Before this modification I have tested the performance on native driver
> >>>> with this command.
> >>>>
> >>>> on OBSD
> >>>> nc -l 1234 > /dev/null
> >>>>
> >>>>
> >>>> on host connected by switch 100Mbit/s full duplex (MAC OX 10.10)
> >>>>
> >>>> nc 192.168.169.62 1234 < CentM
> >>>>
> >>>> where CentM il file with 100MByte (created with makefile 100m CentM).
> >>>>
> >>>> On BSD5.5 or 5.6 the time for this transfert is 93s = 8,6 Mbit/s
> >>>>
> >>>> I have try the same transfert with Linux (on same board) the time is 9s
> >>>> = 89Mbit/s
> >>>>
> >>>> The performance of transfert on OBSD is poor why ?
> >>>>
> >>>> Driver ?
> >>>> Kernel ?
> >>>> Or mistake on my configuration.
> >>>>
> >>>> I need ARM card with 2 ethernets (giga) Port to configure in routing
> >>>> from port 1 to port 2. I hope 200Mbit/s (linux performance) for this
> >>>> routing.
> >>>>
> >>>> Thank for your help.
> >>>> Bernard
> >>>> _________________________________
> >>>> result of ifconfig
> >>>> # ifconfig cpsw0
> >>>> cpsw0: flags=28843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST,NOINET6> mtu
> >>>> 1500
> >>>> lladdr d4:94:a1:84:28:f2
> >>>> priority: 0
> >>>> groups: egress
> >>>> media: Ethernet 100baseTX full-duplex
> >>>> status: active
> >>>> inet 192.168.169.62 netmask 0xffffff00 broadcast 192.168.169.255
> >>>>
> >>>>
> >>>> __________________________________
> >>>> result of dmessg
> >>>> # dmesg
> >>>> OpenBSD 5.6-current (GENERIC-OMAP) #0: Tue Oct 28 01:01:45 AEDT 2014
> >>>> [email protected]:/usr/src/sys/arch/armv7/compile/GENERIC-OMAP
> >>>> real mem = 268435456 (256MB)
> >>>> avail mem = 255725568 (243MB)
> >>>> warning: no entropy supplied by boot loader
> >>>> mainbus0 at root
> >>>> cpu0 at mainbus0: ARM Cortex A8 R3 rev 2 (ARMv7 core)
> >>>> cpu0: DC enabled IC enabled WB disabled EABT branch prediction enabled
> >>>> cpu0: 32KB(64b/l,4way) I-cache, 32KB(64b/l,4way) wr-back D-cache
> >>>> omap0 at mainbus0: BeagleBone
> >>>> prcm0 at omap0 rev 0.2
> >>>> sitaracm0 at omap0: control module, rev 1.0
> >>>> intc0 at omap0 rev 5.0
> >>>> edma0 at omap0 rev 0.0
> >>>> dmtimer0 at omap0 rev 3.1
> >>>> dmtimer1 at omap0 rev 3.1
> >>>> omdog0 at omap0 rev 0.1
> >>>> omgpio0 at omap0: rev 0.1
> >>>> gpio0 at omgpio0: 32 pins
> >>>> omgpio1 at omap0: rev 0.1
> >>>> gpio1 at omgpio1: 32 pins
> >>>> omgpio2 at omap0: rev 0.1
> >>>> gpio2 at omgpio2: 32 pins
> >>>> omgpio3 at omap0: rev 0.1
> >>>> gpio3 at omgpio3: 32 pins
> >>>> omap0: device tiiic unit 0 not configured
> >>>> omap0: device tiiic unit 1 not configured
> >>>> omap0: device tiiic unit 2 not configured
> >>>> ommmc0 at omap0
> >>>> sdmmc0 at ommmc0
> >>>> ommmc1 at omap0
> >>>> sdmmc1 at ommmc1
> >>>> com0 at omap0: ti16750, 64 byte fifo
> >>>> com0: console
> >>>> cpsw0 at omap0: version 1.12 (0), address d4:94:a1:84:28:f2
> >>>> ukphy0 at cpsw0 phy 0: Generic IEEE 802.3u media interface, rev. 4: OUI
> >>>> 0x001374, model 0x0007
> >>>> ukphy1 at cpsw0 phy 1: Generic IEEE 802.3u media interface, rev. 4: OUI
> >>>> 0x001374, model 0x0007
> >>>> scsibus0 at sdmmc0: 2 targets, initiator 0
> >>>> sd0 at scsibus0 targ 1 lun 0: <SD/MMC, Drive #01, > SCSI2 0/direct fixed
> >>>> sd0: 3781MB, 512 bytes/sector, 7744512 sectors
> >>>> sdmmc1: can't enable card
> >>>> vscsi0 at root
> >>>> scsibus1 at vscsi0: 256 targets
> >>>> softraid0 at root
> >>>> scsibus2 at softraid0: 256 targets
> >>>> boot device: sd0
> >>>> root on sd0a (853680ee25c0e223.a) swap on sd0b dump on sd0b
> >>>> WARNING: CHECK AND RESET THE DATE!
> >>>>
> >>>>
> >>>> __________________________________________
> >>>> Bernard M. Merindol, Grenoble France
> >>>> [email protected] GSM: +33-6-08-75-03-52
> >>>>
> >>
> >> __________________________________________
> >> Bernard M. Merindol, Grenoble France
> >> [email protected] GSM: +33-6-08-75-03-52
> >>
>
> __________________________________________
> Bernard M. Merindol, Grenoble France
> [email protected] GSM: +33-6-08-75-03-52