Yes, the latest diff from Patrick solves the system crash. In addition to the driver changes, syscon must be made to start before dwxe and somewhere the noisolate flag must be set. I set the noisolate flag in the ukphy driver, but I am not sure that is the correct place. Can it be done in dwxe and somehow sent to the phy?
The dtb that I am using has the following: ethernet@1c30000 { compatible = "allwinner,sun8i-h3-emac"; syscon = <0x6>; reg = <0x1c30000 0x104>; reg-names = "emac"; interrupts = <0x0 0x52 0x4>; resets = <0x2 0xc>, <0x2 0x27>; reset-names = "ahb", "ephy"; clocks = <0x2 0x1b>, <0x2 0x43>; clock-names = "ahb", "ephy"; pinctrl-names = "default"; pinctrl-0 = <0x48>; #address-cells = <0x1>; #size-cells = <0x0>; status = "okay"; phy-handle = <0x47>; phy-mode = "mii"; allwinner,leds-active-low; phandle = <0x31>; ethernet-phy@1 { reg = <0x1>; phandle = <0x47>; }; }; syscon@1c00000 { compatible = "allwinner,sun8i-h3-system-controller", "syscon"; reg = <0x1c00000 0x1000>; reg-names = "syscon"; phandle = <0x6>; }; This is the change from ver 1.3. # diff /backup/src_backup_2017-10-22/if_dwxe.c /usr/src/sys/dev/fdt/if_dwxe.c 149,153c149,153 < #define DWXE_MDIO_CMD_MDC_DIV_RATIO_M_MASK (0x7 << 20) < #define DWXE_MDIO_CMD_MDC_DIV_RATIO_M_16 (0 << 20) < #define DWXE_MDIO_CMD_MDC_DIV_RATIO_M_32 (1 << 20) < #define DWXE_MDIO_CMD_MDC_DIV_RATIO_M_64 (2 << 20) < #define DWXE_MDIO_CMD_MDC_DIV_RATIO_M_128 (3 << 20) --- > #define DWXE_MDIO_CMD_MDC_DIV_RATIO_M_MASK 0x7 > #define DWXE_MDIO_CMD_MDC_DIV_RATIO_M_16 0 > #define DWXE_MDIO_CMD_MDC_DIV_RATIO_M_32 1 > #define DWXE_MDIO_CMD_MDC_DIV_RATIO_M_64 2 > #define DWXE_MDIO_CMD_MDC_DIV_RATIO_M_128 3 238a239 > #define SYSCON_H3_EPHY_ADDR_MASK 0x1f 272a274 > int sc_phyloc; 360d361 < int phyloc = MII_PHY_ANY; 375,376c376 < phyloc = OF_getpropint(node, "reg", phyloc); < --- > sc->sc_phyloc = OF_getpropint(node, "reg", MII_PHY_ANY); 380,381c380,381 < clock_enable(faa->fa_node, "stmmaceth"); < reset_deassert(faa->fa_node, "stmmaceth"); --- > clock_enable_all(faa->fa_node); > reset_deassert_all(faa->fa_node); 389c389 < sc->sc_clk = clock_get_frequency(faa->fa_node, "stmmaceth"); --- > sc->sc_clk = clock_get_frequency(faa->fa_node, "ahb"); 427c427 < mii_attach(self, &sc->sc_mii, 0xffffffff, phyloc, --- > mii_attach(self, &sc->sc_mii, 0xffffffff, sc->sc_phyloc, 469,470c469,476 < panic("%s: setup internal phy", DEVNAME(sc)); < return; --- > syscon &= ~SYSCON_H3_EPHY_SHUTDOWN; > syscon |= SYSCON_H3_EPHY_SELECT|SYSCON_H3_EPHY_CLK_SEL; > if (OF_getproplen(sc->sc_node, "allwinner,leds-active-low") >= 0) > syscon |= SYSCON_H3_EPHY_LED_POL; > else > syscon &= ~SYSCON_H3_EPHY_LED_POL; > syscon &= ~(SYSCON_H3_EPHY_ADDR_MASK << SYSCON_H3_EPHY_ADDR_SHIFT); > syscon |= sc->sc_phyloc << SYSCON_H3_EPHY_ADDR_SHIFT; # -----Original Message----- From: owner-...@openbsd.org [mailto:owner-...@openbsd.org] On Behalf Of Stephen Graf Sent: Sunday, October 22, 2017 9:50 PM To: arm@openbsd.org; 'Patrick Wildt' <patr...@blueri.se>; 'Mark Kettenis' <mark.kette...@xs4all.nl> Subject: Re: Another step on getting dwxe to work on Allwinner H3 I just noticed Patrick's latest patch that will probably resolve this issue. I think I have to reload my sources to the most recent and test again. -----Original Message----- From: owner-...@openbsd.org [mailto:owner-...@openbsd.org] On Behalf Of Stephen Graf Sent: Saturday, October 21, 2017 10:56 PM To: arm@openbsd.org; 'Patrick Wildt' <patr...@blueri.se>; 'Mark Kettenis' <mark.kette...@xs4all.nl> Subject: Another step on getting dwxe to work on Allwinner H3 After making changes for the clock divisor shift I was able to see transactions with the media device, but the link would not start until I discovered that the media isolate bit was being set on the media reset. I put the no isolate flag in the ukphy driver and I then thought that I had a working driver. I was able to do a dhclient and get a valid ip (see below). However within a few seconds the system crashed. On other tests I was able to make it crash by doing a ping to the device from another machine or trying to connect remotely via ssh. I am confident that my dtb works and seem to have the driver communicating. The system crash is something I don't know how to handle. I know Mark says to be patient, but I think I have made significant progress and uncovered a few problems that I have been able to work around. I would appreciate some guidance on how to tackle the system crash problem. CHANGES TO ukphy.c (COPIED FROM VARIOUS OTHER PHYS) sc->mii_model = MII_MODEL(ma->mii_id2); sc->mii_pdata = mii; sc->mii_flags = ma->mii_flags; sc->mii_flags |= MIIF_NOISOLATE; CONSOLE BOOT LOG SHOWING DEBUG INFO: syscon0 at simplebus0 sxiccmu1 at simplebus0 sxipio0 at simplebus0: 94 pins sxipio1 at simplebus0: 12 pins dwxe0 at simplebus0 if_dwxe phy-handle node: 0x560. if_dwxe sc_phyloc: 0x1. if_dwxe sc_clk: 200000000 if_dwxe sc_clk div_ratio: 0x3 : address 02:81:b1:07:76:5e if_dwxe syscon is not null if_dwxe phy_mode: mii if_dwxe syscon: 0x168000 if_dwxe mii read cmd: 0x301011, data: 0x79e9 if_dwxe mii read cmd: 0x301021, data: 0x44 if_dwxe mii read cmd: 0x301031, data: 0x1400 ukphy0 at dwxe0 phy 1: Generic IEEE 802.3u media interface, rev. 0: OUI 0x001105, model 0x0000 if_dwxe mii write cmd: 0x301003, data: 0x8000 if_dwxe mii read cmd: 0x301001, data: 0x3000 if_dwxe mii read cmd: 0x301011, data: 0x79c9 if_dwxe mii read cmd: 0x3010f1, data: 0x0 Adding entry for Ethernet 10baseT <master,rxpause,txpause> Adding entry for Ethernet 10baseT <full-duplex,master,rxpause,txpause> Adding entry for Ethernet 100baseTX <master,rxpause,txpause> Adding entry for Ethernet 100baseTX <full-duplex,master,rxpause,txpause> Adding entry for Ethernet autoselect <master,rxpause,txpause> ifmedia_set: target Ethernet autoselect <master,rxpause,txpause> ifmedia_set: setting to Ethernet autoselect <master,rxpause,txpause> DHCLIENT # ifconfig dwxe0 dwxe0: flags=8802<BROADCAST,SIMPLEX,MULTICAST> mtu 1500 lladdr 02:81:b1:07:76:5e index 1 priority 0 llprio 3 media: Ethernet autoselect (100baseTX full-duplex) status: active # dhclient dwxe0 dwxe0: DHCPREQUEST to 255.255.255.255 dwxe0: DHCPACK from 192.168.1.253 (cc:5d:4e:ad:f4:0f) dwxe0: bound to 192.168.1.61 -- renewal in 43200 seconds # CONSOL LOG SHOWING CRASH if_dwxe mii read cmd: 0x301001, data: 0x3000 if_dwxe mii read cmd: 0x301041, data: 0x21e1 if_dwxe mii read cmd: 0x301051, data: 0xc5e1 if_dwxe mii read cmd: 0x301011, data: 0x79ed if_dwxe mii read cmd: 0x301011, data: 0x79ed if_dwxe mii read cmd: 0x301011, data: 0x79ed if_dwxe mii read cmd: 0x301011, data: 0x79ed if_dwxe mii read cmd: 0x301001, data: 0x3000 if_dwxe mii read cmd: 0x301041, data: 0x21e1 if_dwxe mii read cmd: 0x301051, data: 0xc5e1 Fatal kernel mode data abort: 'Alignment fault' trapframe: 0xcb1f0e40 DFSR=00000001, DFAR=c54f481e, spsr=80000013 r0 =00000221, r1 =00000018, r2 =00000046, r3 =0000002e r4 =c5517c00, r5 =c54f480e, r6 =00000001, r7 =00000000 r8 =cb1f0efc, r9 =cb1f0f00, r10=c0777d84, r11=cb1f0eec r12=cb1f0ef0, ssp=cb1f0e90, slr=c05c8d18, pc =c05c87e4 Stopped at ip_input_if+0x118: ldrls r3, [r5, #0x010] -----Original Message----- From: owner-...@openbsd.org [mailto:owner-...@openbsd.org] On Behalf Of Stephen Graf Sent: Friday, October 20, 2017 6:30 PM To: arm@openbsd.org; 'Patrick Wildt' <patr...@blueri.se> Cc: 'Mark Kettenis' <mark.kette...@xs4all.nl> Subject: dwxe on H3 correction I took another small step in my quest to get the dwxe driver working on my orange pi one (Allwinner H3). After getting syscon to start before dwxe I think I am able to get through the initializations and my dtb seems to have everything that is needed and presenting it to the driver. I now have discovered a little bug that should be fixed. The mio clock divisor definitions are made with a left shift of 20 and then when the divisors are used in mii read and write they are shifted again. I altered the defines to remove the shift: #define DWXE_MDIO_CMD_MDC_DIV_RATIO_M_SHIFT 20 //#define DWXE_MDIO_CMD_MDC_DIV_RATIO_M_MASK (0x7 << 20) //#define DWXE_MDIO_CMD_MDC_DIV_RATIO_M_16 (0 << 20) //#define DWXE_MDIO_CMD_MDC_DIV_RATIO_M_32 (1 << 20) //#define DWXE_MDIO_CMD_MDC_DIV_RATIO_M_64 (2 << 20) //#define DWXE_MDIO_CMD_MDC_DIV_RATIO_M_128 (3 << 20) #define DWXE_MDIO_CMD_MDC_DIV_RATIO_M_MASK 0x7 #define DWXE_MDIO_CMD_MDC_DIV_RATIO_M_16 0 #define DWXE_MDIO_CMD_MDC_DIV_RATIO_M_32 1 #define DWXE_MDIO_CMD_MDC_DIV_RATIO_M_64 2 #define DWXE_MDIO_CMD_MDC_DIV_RATIO_M_128 3