<div><div>diff -ruN ./rtems-libbsd/freebsd/sys/dev/mii/atphy.c ./am335x_bsp/rtems-libbsd/freebsd/sys/dev/mii/atphy.c</div><div>--- ./rtems-libbsd/freebsd/sys/dev/mii/atphy.c<span class="Apple-tab-span" style="white-space:pre">    </span>1970-01-01 08:00:00.000000000 +0800</div><div>+++ ./am335x_bsp/rtems-libbsd/freebsd/sys/dev/mii/atphy.c<span class="Apple-tab-span" style="white-space:pre"> </span>2016-07-05 10:57:44.540734400 +0800</div><div>@@ -0,0 +1,378 @@</div><div>+#include <machine/rtems-bsd-kernel-space.h></div><div>+</div><div>+/*-</div><div>+ * Copyright (c) 2008, Pyun YongHyeon <yongari@FreeBSD.org></div><div>+ * All rights reserved.</div><div>+ *</div><div>+ * Redistribution and use in source and binary forms, with or without</div><div>+ * modification, are permitted provided that the following conditions</div><div>+ * are met:</div><div>+ * 1. Redistributions of source code must retain the above copyright</div><div>+ *    notice unmodified, this list of conditions, and the following</div><div>+ *    disclaimer.</div><div>+ * 2. Redistributions in binary form must reproduce the above copyright</div><div>+ *    notice, this list of conditions and the following disclaimer in the</div><div>+ *    documentation and/or other materials provided with the distribution.</div><div>+ *</div><div>+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND</div><div>+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE</div><div>+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE</div><div>+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE</div><div>+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL</div><div>+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS</div><div>+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)</div><div>+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT</div><div>+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY</div><div>+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF</div><div>+ * SUCH DAMAGE.</div><div>+ */</div><div>+</div><div>+#include <sys/cdefs.h></div><div>+__FBSDID("$FreeBSD$");</div><div>+</div><div>+/*</div><div>+ * Driver for the Attansic/Atheros F1 10/100/1000 PHY.</div><div>+ */</div><div>+</div><div>+#include <sys/param.h></div><div>+#include <sys/systm.h></div><div>+#include <sys/kernel.h></div><div>+#include <sys/module.h></div><div>+#include <sys/socket.h></div><div>+#include <sys/bus.h></div><div>+</div><div>+#include <net/if.h></div><div>+#include <net/if_media.h></div><div>+</div><div>+#include <dev/mii/mii.h></div><div>+#include <dev/mii/miivar.h></div><div>+#include <rtems/bsd/local/miidevs.h></div><div>+</div><div>+#include <dev/mii/atphyreg.h></div><div>+</div><div>+#include <rtems/bsd/local/miibus_if.h></div><div>+</div><div>+static int atphy_probe(device_t);</div><div>+static int atphy_attach(device_t);</div><div>+</div><div>+static device_method_t atphy_methods[] = {</div><div>+<span class="Apple-tab-span" style="white-space:pre">     </span>/* Device interface. */</div><div>+<span class="Apple-tab-span" style="white-space:pre">     </span>DEVMETHOD(device_probe,<span class="Apple-tab-span" style="white-space:pre">             </span>atphy_probe),</div><div>+<span class="Apple-tab-span" style="white-space:pre">       </span>DEVMETHOD(device_attach,<span class="Apple-tab-span" style="white-space:pre">    </span>atphy_attach),</div><div>+<span class="Apple-tab-span" style="white-space:pre">      </span>DEVMETHOD(device_detach,<span class="Apple-tab-span" style="white-space:pre">    </span>mii_phy_detach),</div><div>+<span class="Apple-tab-span" style="white-space:pre">    </span>DEVMETHOD(device_shutdown,<span class="Apple-tab-span" style="white-space:pre">  </span>bus_generic_shutdown),</div><div>+<span class="Apple-tab-span" style="white-space:pre">      </span>DEVMETHOD_END</div><div>+};</div><div>+</div><div>+static devclass_t atphy_devclass;</div><div>+static driver_t atphy_driver = {</div><div>+<span class="Apple-tab-span" style="white-space:pre">    </span>"atphy",</div><div>+<span class="Apple-tab-span" style="white-space:pre">  </span>atphy_methods,</div><div>+<span class="Apple-tab-span" style="white-space:pre">      </span>sizeof(struct mii_softc)</div><div>+};</div><div>+</div><div>+DRIVER_MODULE(atphy, miibus, atphy_driver, atphy_devclass, 0, 0);</div><div>+</div><div>+static int<span class="Apple-tab-span" style="white-space:pre">       </span>atphy_service(struct mii_softc *, struct mii_data *, int);</div><div>+static void<span class="Apple-tab-span" style="white-space:pre">       </span>atphy_status(struct mii_softc *);</div><div>+static void<span class="Apple-tab-span" style="white-space:pre">        </span>atphy_reset(struct mii_softc *);</div><div>+static uint16_t<span class="Apple-tab-span" style="white-space:pre">     </span>atphy_anar(struct ifmedia_entry *);</div><div>+static int<span class="Apple-tab-span" style="white-space:pre">       </span>atphy_setmedia(struct mii_softc *, int);</div><div>+</div><div>+static const struct mii_phydesc atphys[] = {</div><div>+<span class="Apple-tab-span" style="white-space:pre">        </span>MII_PHY_DESC(xxATHEROS, F1),</div><div>+<span class="Apple-tab-span" style="white-space:pre">        </span>MII_PHY_DESC(xxATHEROS, F1_7),</div><div>+<span class="Apple-tab-span" style="white-space:pre">      </span>MII_PHY_DESC(xxATHEROS, AR8021),</div><div>+/*<span class="Apple-tab-span" style="white-space:pre">  </span>MII_PHY_DESC(xxATHEROS, AR8035),*/</div><div>+<span class="Apple-tab-span" style="white-space:pre">  </span>MII_PHY_DESC(xxATHEROS, F2),</div><div>+<span class="Apple-tab-span" style="white-space:pre">        </span>MII_PHY_END</div><div>+};</div><div>+</div><div>+static const struct mii_phy_funcs atphy_funcs = {</div><div>+<span class="Apple-tab-span" style="white-space:pre">      </span>atphy_service,</div><div>+<span class="Apple-tab-span" style="white-space:pre">      </span>atphy_status,</div><div>+<span class="Apple-tab-span" style="white-space:pre">       </span>atphy_reset</div><div>+};</div><div>+</div><div>+static int</div><div>+atphy_probe(device_t dev)</div><div>+{</div><div>+    </div><div>+<span class="Apple-tab-span" style="white-space:pre">     </span>return (mii_phy_dev_probe(dev, atphys, BUS_PROBE_DEFAULT));</div><div>+}</div><div>+</div><div>+static int</div><div>+atphy_attach(device_t dev)</div><div>+{</div><div>+</div><div>+<span class="Apple-tab-span" style="white-space:pre">   </span>mii_phy_dev_attach(dev, MIIF_NOMANPAUSE, &atphy_funcs, 1);</div><div>+<span class="Apple-tab-span" style="white-space:pre">      </span>return (0);</div><div>+}</div><div>+</div><div>+static int</div><div>+atphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)</div><div>+{</div><div>+<span class="Apple-tab-span" style="white-space:pre">   </span>struct ifmedia_entry *ife = mii->mii_media.ifm_cur;</div><div>+<span class="Apple-tab-span" style="white-space:pre">      </span>uint16_t anar, bmcr, bmsr;</div><div>+</div><div>+<span class="Apple-tab-span" style="white-space:pre">  </span>switch (cmd) {</div><div>+<span class="Apple-tab-span" style="white-space:pre">      </span>case MII_POLLSTAT:</div><div>+<span class="Apple-tab-span" style="white-space:pre">          </span>break;</div><div>+</div><div>+<span class="Apple-tab-span" style="white-space:pre">      </span>case MII_MEDIACHG:</div><div>+<span class="Apple-tab-span" style="white-space:pre">          </span>if (IFM_SUBTYPE(ife->ifm_media) == IFM_AUTO ||</div><div>+<span class="Apple-tab-span" style="white-space:pre">           </span>    IFM_SUBTYPE(ife->ifm_media) == IFM_1000_T) {</div><div>+<span class="Apple-tab-span" style="white-space:pre">                       </span>atphy_setmedia(sc, ife->ifm_media);</div><div>+<span class="Apple-tab-span" style="white-space:pre">                      </span>break;</div><div>+<span class="Apple-tab-span" style="white-space:pre">              </span>}</div><div>+</div><div>+<span class="Apple-tab-span" style="white-space:pre">           </span>bmcr = 0;</div><div>+<span class="Apple-tab-span" style="white-space:pre">           </span>switch (IFM_SUBTYPE(ife->ifm_media)) {</div><div>+<span class="Apple-tab-span" style="white-space:pre">           </span>case IFM_100_TX:</div><div>+<span class="Apple-tab-span" style="white-space:pre">                    </span>bmcr = BMCR_S100;</div><div>+<span class="Apple-tab-span" style="white-space:pre">                   </span>break;</div><div>+<span class="Apple-tab-span" style="white-space:pre">              </span>case IFM_10_T:</div><div>+<span class="Apple-tab-span" style="white-space:pre">                      </span>bmcr = BMCR_S10;</div><div>+<span class="Apple-tab-span" style="white-space:pre">                    </span>break;</div><div>+<span class="Apple-tab-span" style="white-space:pre">              </span>case IFM_NONE:</div><div>+<span class="Apple-tab-span" style="white-space:pre">                      </span>bmcr = PHY_READ(sc, MII_BMCR);</div><div>+<span class="Apple-tab-span" style="white-space:pre">                      </span>/*</div><div>+<span class="Apple-tab-span" style="white-space:pre">                  </span> * XXX</div><div>+<span class="Apple-tab-span" style="white-space:pre">                      </span> * Due to an unknown reason powering down PHY resulted</div><div>+<span class="Apple-tab-span" style="white-space:pre">                      </span> * in unexpected results such as inaccessibility of</div><div>+<span class="Apple-tab-span" style="white-space:pre">                 </span> * hardware of freshly rebooted system. Disable</div><div>+<span class="Apple-tab-span" style="white-space:pre">                     </span> * powering down PHY until I got more information for</div><div>+<span class="Apple-tab-span" style="white-space:pre">                       </span> * Attansic/Atheros PHY hardwares.</div><div>+<span class="Apple-tab-span" style="white-space:pre">                  </span> */</div><div>+<span class="Apple-tab-span" style="white-space:pre">                 </span>PHY_WRITE(sc, MII_BMCR, bmcr | BMCR_ISO);</div><div>+<span class="Apple-tab-span" style="white-space:pre">                   </span>goto done;</div><div>+<span class="Apple-tab-span" style="white-space:pre">          </span>default:</div><div>+<span class="Apple-tab-span" style="white-space:pre">                    </span>return (EINVAL);</div><div>+<span class="Apple-tab-span" style="white-space:pre">            </span>}</div><div>+</div><div>+<span class="Apple-tab-span" style="white-space:pre">           </span>anar = atphy_anar(ife);</div><div>+<span class="Apple-tab-span" style="white-space:pre">             </span>if ((ife->ifm_media & IFM_FDX) != 0) {</div><div>+<span class="Apple-tab-span" style="white-space:pre">                       </span>bmcr |= BMCR_FDX;</div><div>+<span class="Apple-tab-span" style="white-space:pre">                   </span>if ((ife->ifm_media & IFM_FLOW) != 0 ||</div><div>+<span class="Apple-tab-span" style="white-space:pre">                      </span>    (sc->mii_flags & MIIF_FORCEPAUSE) != 0)</div><div>+<span class="Apple-tab-span" style="white-space:pre">                                </span>anar |= ANAR_PAUSE_TOWARDS;</div><div>+<span class="Apple-tab-span" style="white-space:pre">         </span>}</div><div>+</div><div>+<span class="Apple-tab-span" style="white-space:pre">           </span>if ((sc->mii_extcapabilities & (EXTSR_1000TFDX |</div><div>+<span class="Apple-tab-span" style="white-space:pre">             </span>    EXTSR_1000THDX)) != 0)</div><div>+<span class="Apple-tab-span" style="white-space:pre">                        </span>PHY_WRITE(sc, MII_100T2CR, 0);</div><div>+<span class="Apple-tab-span" style="white-space:pre">              </span>PHY_WRITE(sc, MII_ANAR, anar | ANAR_CSMA);</div><div>+</div><div>+<span class="Apple-tab-span" style="white-space:pre">          </span>/*</div><div>+<span class="Apple-tab-span" style="white-space:pre">          </span> * Reset the PHY so all changes take effect.</div><div>+<span class="Apple-tab-span" style="white-space:pre">                </span> */</div><div>+<span class="Apple-tab-span" style="white-space:pre">         </span>PHY_WRITE(sc, MII_BMCR, bmcr | BMCR_RESET | BMCR_AUTOEN |</div><div>+<span class="Apple-tab-span" style="white-space:pre">           </span>    BMCR_STARTNEG);</div><div>+done:</div><div>+<span class="Apple-tab-span" style="white-space:pre">          </span>break;</div><div>+</div><div>+<span class="Apple-tab-span" style="white-space:pre">      </span>case MII_TICK:</div><div>+<span class="Apple-tab-span" style="white-space:pre">              </span>/*</div><div>+<span class="Apple-tab-span" style="white-space:pre">          </span> * Only used for autonegotiation.</div><div>+<span class="Apple-tab-span" style="white-space:pre">           </span> */</div><div>+<span class="Apple-tab-span" style="white-space:pre">         </span>if (IFM_SUBTYPE(ife->ifm_media) != IFM_AUTO) {</div><div>+<span class="Apple-tab-span" style="white-space:pre">                   </span>sc->mii_ticks = 0;</div><div>+<span class="Apple-tab-span" style="white-space:pre">                       </span>break;</div><div>+<span class="Apple-tab-span" style="white-space:pre">              </span>}</div><div>+</div><div>+<span class="Apple-tab-span" style="white-space:pre">           </span>/*</div><div>+<span class="Apple-tab-span" style="white-space:pre">          </span> * Check for link.</div><div>+<span class="Apple-tab-span" style="white-space:pre">          </span> * Read the status register twice; BMSR_LINK is latch-low.</div><div>+<span class="Apple-tab-span" style="white-space:pre">          </span> */</div><div>+<span class="Apple-tab-span" style="white-space:pre">         </span>bmsr = PHY_READ(sc, MII_BMSR) | PHY_READ(sc, MII_BMSR);</div><div>+<span class="Apple-tab-span" style="white-space:pre">             </span>if (bmsr & BMSR_LINK) {</div><div>+<span class="Apple-tab-span" style="white-space:pre">                 </span>sc->mii_ticks = 0;</div><div>+<span class="Apple-tab-span" style="white-space:pre">                       </span>break;</div><div>+<span class="Apple-tab-span" style="white-space:pre">              </span>}</div><div>+</div><div>+<span class="Apple-tab-span" style="white-space:pre">           </span>/* Announce link loss right after it happens. */</div><div>+<span class="Apple-tab-span" style="white-space:pre">            </span>if (sc->mii_ticks++ == 0)</div><div>+<span class="Apple-tab-span" style="white-space:pre">                        </span>break;</div><div>+<span class="Apple-tab-span" style="white-space:pre">              </span>if (sc->mii_ticks <= sc->mii_anegticks)</div><div>+<span class="Apple-tab-span" style="white-space:pre">                    </span>return (0);</div><div>+</div><div>+<span class="Apple-tab-span" style="white-space:pre">         </span>sc->mii_ticks = 0;</div><div>+<span class="Apple-tab-span" style="white-space:pre">               </span>atphy_setmedia(sc, ife->ifm_media);</div><div>+<span class="Apple-tab-span" style="white-space:pre">              </span>break;</div><div>+<span class="Apple-tab-span" style="white-space:pre">      </span>}</div><div>+</div><div>+<span class="Apple-tab-span" style="white-space:pre">   </span>/* Update the media status. */</div><div>+<span class="Apple-tab-span" style="white-space:pre">      </span>PHY_STATUS(sc);</div><div>+</div><div>+<span class="Apple-tab-span" style="white-space:pre">     </span>/* Callback if something changed. */</div><div>+<span class="Apple-tab-span" style="white-space:pre">        </span>mii_phy_update(sc, cmd);</div><div>+<span class="Apple-tab-span" style="white-space:pre">    </span>return (0);</div><div>+}</div><div>+</div><div>+static void</div><div>+atphy_status(struct mii_softc *sc)</div><div>+{</div><div>+<span class="Apple-tab-span" style="white-space:pre">  </span>struct mii_data *mii = sc->mii_pdata;</div><div>+<span class="Apple-tab-span" style="white-space:pre">    </span>uint32_t bmsr, bmcr, ssr;</div><div>+</div><div>+<span class="Apple-tab-span" style="white-space:pre">   </span>mii->mii_media_status = IFM_AVALID;</div><div>+<span class="Apple-tab-span" style="white-space:pre">      </span>mii->mii_media_active = IFM_ETHER;</div><div>+</div><div>+<span class="Apple-tab-span" style="white-space:pre">       </span>bmsr = PHY_READ(sc, MII_BMSR) | PHY_READ(sc, MII_BMSR);</div><div>+<span class="Apple-tab-span" style="white-space:pre">     </span>if ((bmsr & BMSR_LINK) != 0)</div><div>+<span class="Apple-tab-span" style="white-space:pre">            </span>mii->mii_media_status |= IFM_ACTIVE;</div><div>+</div><div>+<span class="Apple-tab-span" style="white-space:pre">     </span>bmcr = PHY_READ(sc, MII_BMCR);</div><div>+<span class="Apple-tab-span" style="white-space:pre">      </span>if ((bmcr & BMCR_ISO) != 0) {</div><div>+<span class="Apple-tab-span" style="white-space:pre">           </span>mii->mii_media_active |= IFM_NONE;</div><div>+<span class="Apple-tab-span" style="white-space:pre">               </span>mii->mii_media_status = 0;</div><div>+<span class="Apple-tab-span" style="white-space:pre">               </span>return;</div><div>+<span class="Apple-tab-span" style="white-space:pre">     </span>}</div><div>+</div><div>+<span class="Apple-tab-span" style="white-space:pre">   </span>if ((bmcr & BMCR_LOOP) != 0)</div><div>+<span class="Apple-tab-span" style="white-space:pre">            </span>mii->mii_media_active |= IFM_LOOP;</div><div>+</div><div>+<span class="Apple-tab-span" style="white-space:pre">       </span>ssr = PHY_READ(sc, ATPHY_SSR);</div><div>+<span class="Apple-tab-span" style="white-space:pre">      </span>if ((ssr & ATPHY_SSR_SPD_DPLX_RESOLVED) == 0) {</div><div>+<span class="Apple-tab-span" style="white-space:pre">         </span>/* Erg, still trying, I guess... */</div><div>+<span class="Apple-tab-span" style="white-space:pre">         </span>mii->mii_media_active |= IFM_NONE;</div><div>+<span class="Apple-tab-span" style="white-space:pre">               </span>return;</div><div>+<span class="Apple-tab-span" style="white-space:pre">     </span>}</div><div>+</div><div>+<span class="Apple-tab-span" style="white-space:pre">   </span>switch (ssr & ATPHY_SSR_SPEED_MASK) {</div><div>+<span class="Apple-tab-span" style="white-space:pre">   </span>case ATPHY_SSR_1000MBS:</div><div>+<span class="Apple-tab-span" style="white-space:pre">             </span>mii->mii_media_active |= IFM_1000_T;</div><div>+<span class="Apple-tab-span" style="white-space:pre">             </span>/*</div><div>+<span class="Apple-tab-span" style="white-space:pre">          </span> * atphy(4) has a valid link so reset mii_ticks.</div><div>+<span class="Apple-tab-span" style="white-space:pre">            </span> * Resetting mii_ticks is needed in order to</div><div>+<span class="Apple-tab-span" style="white-space:pre">                </span> * detect link loss after auto-negotiation.</div><div>+<span class="Apple-tab-span" style="white-space:pre">         </span> */</div><div>+<span class="Apple-tab-span" style="white-space:pre">         </span>sc->mii_ticks = 0;</div><div>+<span class="Apple-tab-span" style="white-space:pre">               </span>break;</div><div>+<span class="Apple-tab-span" style="white-space:pre">      </span>case ATPHY_SSR_100MBS:</div><div>+<span class="Apple-tab-span" style="white-space:pre">              </span>mii->mii_media_active |= IFM_100_TX;</div><div>+<span class="Apple-tab-span" style="white-space:pre">             </span>sc->mii_ticks = 0;</div><div>+<span class="Apple-tab-span" style="white-space:pre">               </span>break;</div><div>+<span class="Apple-tab-span" style="white-space:pre">      </span>case ATPHY_SSR_10MBS:</div><div>+<span class="Apple-tab-span" style="white-space:pre">               </span>mii->mii_media_active |= IFM_10_T;</div><div>+<span class="Apple-tab-span" style="white-space:pre">               </span>sc->mii_ticks = 0;</div><div>+<span class="Apple-tab-span" style="white-space:pre">               </span>break;</div><div>+<span class="Apple-tab-span" style="white-space:pre">      </span>default:</div><div>+<span class="Apple-tab-span" style="white-space:pre">            </span>mii->mii_media_active |= IFM_NONE;</div><div>+<span class="Apple-tab-span" style="white-space:pre">               </span>return;</div><div>+<span class="Apple-tab-span" style="white-space:pre">     </span>}</div><div>+</div><div>+<span class="Apple-tab-span" style="white-space:pre">   </span>if ((ssr & ATPHY_SSR_DUPLEX) != 0)</div><div>+<span class="Apple-tab-span" style="white-space:pre">              </span>mii->mii_media_active |= IFM_FDX | mii_phy_flowstatus(sc);</div><div>+<span class="Apple-tab-span" style="white-space:pre">       </span>else</div><div>+<span class="Apple-tab-span" style="white-space:pre">                </span>mii->mii_media_active |= IFM_HDX;</div><div>+<span class="Apple-tab-span" style="white-space:pre">                </span></div><div>+<span class="Apple-tab-span" style="white-space:pre">    </span>if ((IFM_SUBTYPE(mii->mii_media_active) == IFM_1000_T) &&</div><div>+<span class="Apple-tab-span" style="white-space:pre">        </span>    (PHY_READ(sc, MII_100T2SR) & GTSR_MS_RES) != 0)</div><div>+<span class="Apple-tab-span" style="white-space:pre">           </span>mii->mii_media_active |= IFM_ETH_MASTER;</div><div>+}</div><div>+</div><div>+static void</div><div>+atphy_reset(struct mii_softc *sc)</div><div>+{</div><div>+<span class="Apple-tab-span" style="white-space:pre">   </span>struct ifmedia_entry *ife = sc->mii_pdata->mii_media.ifm_cur;</div><div>+<span class="Apple-tab-span" style="white-space:pre"> </span>uint32_t reg;</div><div>+<span class="Apple-tab-span" style="white-space:pre">       </span>int i;</div><div>+<span class="Apple-tab-span" style="white-space:pre">      </span>//enable rgmii internal delay</div><div>+<span class="Apple-tab-span" style="white-space:pre">       </span>PHY_WRITE(sc, 0xd, 0x3);</div><div>+<span class="Apple-tab-span" style="white-space:pre">    </span>PHY_WRITE(sc, 0xe, 0x805d);</div><div>+<span class="Apple-tab-span" style="white-space:pre"> </span>PHY_WRITE(sc, 0xd, 0x4003);</div><div>+     </div><div>+<span class="Apple-tab-span" style="white-space:pre">     </span>reg = PHY_READ(sc, 0xe);</div><div>+<span class="Apple-tab-span" style="white-space:pre">    </span>PHY_WRITE(sc, 0xe, reg & ~(1 << 8));</div><div>+<span class="Apple-tab-span" style="white-space:pre">      </span>PHY_WRITE(sc, 0x1d,5);</div><div>+<span class="Apple-tab-span" style="white-space:pre">      </span>PHY_WRITE(sc, 0x1e, (1<<8));</div><div>+</div><div>+#if 1</div><div>+<span class="Apple-tab-span" style="white-space:pre">     </span>reg = PHY_READ(sc, ATPHY_SCR);</div><div>+<span class="Apple-tab-span" style="white-space:pre">      </span>/* Enable automatic crossover. */</div><div>+<span class="Apple-tab-span" style="white-space:pre">   </span>reg |= ATPHY_SCR_AUTO_X_MODE;</div><div>+<span class="Apple-tab-span" style="white-space:pre">       </span>/* Disable power down. */</div><div>+<span class="Apple-tab-span" style="white-space:pre">   </span>reg &= ~ATPHY_SCR_MAC_PDOWN;</div><div>+<span class="Apple-tab-span" style="white-space:pre">    </span>/* Enable CRS on Tx. */</div><div>+<span class="Apple-tab-span" style="white-space:pre">     </span>reg |= ATPHY_SCR_ASSERT_CRS_ON_TX;</div><div>+<span class="Apple-tab-span" style="white-space:pre">  </span>/* Auto correction for reversed cable polarity. */</div><div>+<span class="Apple-tab-span" style="white-space:pre">  </span>reg |= ATPHY_SCR_POLARITY_REVERSAL;</div><div>+<span class="Apple-tab-span" style="white-space:pre"> </span>PHY_WRITE(sc, ATPHY_SCR, reg);</div><div>+</div><div>+<span class="Apple-tab-span" style="white-space:pre">      </span>/* Workaround F1 bug to reset phy. */</div><div>+<span class="Apple-tab-span" style="white-space:pre">       </span>atphy_setmedia(sc, ife == NULL ? IFM_AUTO : ife->ifm_media);</div><div>+</div><div>+<span class="Apple-tab-span" style="white-space:pre">     </span>for (i = 0; i < 1000; i++) {</div><div>+<span class="Apple-tab-span" style="white-space:pre">             </span>DELAY(1);</div><div>+<span class="Apple-tab-span" style="white-space:pre">           </span>if ((PHY_READ(sc, MII_BMCR) & BMCR_RESET) == 0)</div><div>+<span class="Apple-tab-span" style="white-space:pre">                 </span>break;</div><div>+<span class="Apple-tab-span" style="white-space:pre">      </span>}</div><div>+#endif</div><div>+}</div><div>+</div><div>+static uint16_t</div><div>+atphy_anar(struct ifmedia_entry *ife)</div><div>+{</div><div>+<span class="Apple-tab-span" style="white-space:pre">       </span>uint16_t anar;</div><div>+</div><div>+<span class="Apple-tab-span" style="white-space:pre">      </span>anar = 0;</div><div>+<span class="Apple-tab-span" style="white-space:pre">   </span>switch (IFM_SUBTYPE(ife->ifm_media)) {</div><div>+<span class="Apple-tab-span" style="white-space:pre">   </span>case IFM_AUTO:</div><div>+<span class="Apple-tab-span" style="white-space:pre">              </span>anar |= ANAR_TX_FD | ANAR_TX | ANAR_10_FD | ANAR_10;</div><div>+<span class="Apple-tab-span" style="white-space:pre">                </span>return (anar);</div><div>+<span class="Apple-tab-span" style="white-space:pre">      </span>case IFM_1000_T:</div><div>+<span class="Apple-tab-span" style="white-space:pre">            </span>return (anar);</div><div>+<span class="Apple-tab-span" style="white-space:pre">      </span>case IFM_100_TX:</div><div>+<span class="Apple-tab-span" style="white-space:pre">            </span>anar |= ANAR_TX;</div><div>+<span class="Apple-tab-span" style="white-space:pre">            </span>break;</div><div>+<span class="Apple-tab-span" style="white-space:pre">      </span>case IFM_10_T:</div><div>+<span class="Apple-tab-span" style="white-space:pre">              </span>anar |= ANAR_10;</div><div>+<span class="Apple-tab-span" style="white-space:pre">            </span>break;</div><div>+<span class="Apple-tab-span" style="white-space:pre">      </span>default:</div><div>+<span class="Apple-tab-span" style="white-space:pre">            </span>return (0);</div><div>+<span class="Apple-tab-span" style="white-space:pre"> </span>}</div><div>+</div><div>+<span class="Apple-tab-span" style="white-space:pre">   </span>if ((ife->ifm_media & IFM_FDX) != 0) {</div><div>+<span class="Apple-tab-span" style="white-space:pre">               </span>if (IFM_SUBTYPE(ife->ifm_media) == IFM_100_TX)</div><div>+<span class="Apple-tab-span" style="white-space:pre">                   </span>anar |= ANAR_TX_FD;</div><div>+<span class="Apple-tab-span" style="white-space:pre">         </span>else</div><div>+<span class="Apple-tab-span" style="white-space:pre">                        </span>anar |= ANAR_10_FD;</div><div>+<span class="Apple-tab-span" style="white-space:pre"> </span>}</div><div>+</div><div>+<span class="Apple-tab-span" style="white-space:pre">   </span>return (anar);</div><div>+}</div><div>+</div><div>+static int</div><div>+atphy_setmedia(struct mii_softc *sc, int media)</div><div>+{</div><div>+<span class="Apple-tab-span" style="white-space:pre">   </span>uint16_t anar;</div><div>+</div><div>+<span class="Apple-tab-span" style="white-space:pre">      </span>anar = BMSR_MEDIA_TO_ANAR(sc->mii_capabilities) | ANAR_CSMA;</div><div>+<span class="Apple-tab-span" style="white-space:pre">     </span>if ((IFM_SUBTYPE(media) == IFM_AUTO || (media & IFM_FDX) != 0) &&</div><div>+<span class="Apple-tab-span" style="white-space:pre">       </span>    ((media & IFM_FLOW) != 0 ||</div><div>+<span class="Apple-tab-span" style="white-space:pre">       </span>    (sc->mii_flags & MIIF_FORCEPAUSE) != 0))</div><div>+<span class="Apple-tab-span" style="white-space:pre">               </span>anar |= ANAR_PAUSE_TOWARDS;</div><div>+<span class="Apple-tab-span" style="white-space:pre"> </span>PHY_WRITE(sc, MII_ANAR, anar);</div><div>+<span class="Apple-tab-span" style="white-space:pre">      </span>if ((sc->mii_extcapabilities &</div><div>+<span class="Apple-tab-span" style="white-space:pre">       </span>     (EXTSR_1000TFDX | EXTSR_1000THDX)) != 0)</div><div>+<span class="Apple-tab-span" style="white-space:pre">             </span>PHY_WRITE(sc, MII_100T2CR, GTCR_ADV_1000TFDX |</div><div>+<span class="Apple-tab-span" style="white-space:pre">              </span>    GTCR_ADV_1000THDX);</div><div>+<span class="Apple-tab-span" style="white-space:pre">   </span>else if (sc->mii_mpd_model == MII_MODEL_xxATHEROS_F1) {</div><div>+<span class="Apple-tab-span" style="white-space:pre">          </span>/*</div><div>+<span class="Apple-tab-span" style="white-space:pre">          </span> * AR8132 has 10/100 PHY and the PHY uses the same</div><div>+<span class="Apple-tab-span" style="white-space:pre">          </span> * model number of F1 gigabit PHY.  The PHY has no</div><div>+<span class="Apple-tab-span" style="white-space:pre">             </span> * ability to establish gigabit link so explicitly</div><div>+<span class="Apple-tab-span" style="white-space:pre">          </span> * disable 1000baseT configuration for the PHY.</div><div>+<span class="Apple-tab-span" style="white-space:pre">             </span> * Otherwise, there is a case that atphy(4) could</div><div>+<span class="Apple-tab-span" style="white-space:pre">           </span> * not establish a link against gigabit link partner</div><div>+<span class="Apple-tab-span" style="white-space:pre">                </span> * unless the link partner supports down-shifting.</div><div>+<span class="Apple-tab-span" style="white-space:pre">          </span> */</div><div>+<span class="Apple-tab-span" style="white-space:pre">         </span>PHY_WRITE(sc, MII_100T2CR, 0);</div><div>+<span class="Apple-tab-span" style="white-space:pre">      </span>}</div><div>+<span class="Apple-tab-span" style="white-space:pre">   </span>PHY_WRITE(sc, MII_BMCR, BMCR_RESET | BMCR_AUTOEN | BMCR_STARTNEG);</div><div>+    </div><div>+<span class="Apple-tab-span" style="white-space:pre">    </span></div><div>+</div><div>+<span class="Apple-tab-span" style="white-space:pre">    </span>return (EJUSTRETURN);</div><div>+}</div><div>diff -ruN ./rtems-libbsd/freebsd/sys/dev/mii/atphyreg.h ./am335x_bsp/rtems-libbsd/freebsd/sys/dev/mii/atphyreg.h</div><div>--- ./rtems-libbsd/freebsd/sys/dev/mii/atphyreg.h<span class="Apple-tab-span" style="white-space:pre">       </span>1970-01-01 08:00:00.000000000 +0800</div><div>+++ ./am335x_bsp/rtems-libbsd/freebsd/sys/dev/mii/atphyreg.h<span class="Apple-tab-span" style="white-space:pre">      </span>2016-03-08 14:27:47.000000000 +0800</div><div>@@ -0,0 +1,63 @@</div><div>+/*-</div><div>+ * Copyright (c) 2008, Pyun YongHyeon</div><div>+ * All rights reserved.</div><div>+ *              </div><div>+ * Redistribution and use in source and binary forms, with or without</div><div>+ * modification, are permitted provided that the following conditions</div><div>+ * are met:             </div><div>+ * 1. Redistributions of source code must retain the above copyright</div><div>+ *    notice unmodified, this list of conditions, and the following</div><div>+ *    disclaimer.  </div><div>+ * 2. Redistributions in binary form must reproduce the above copyright</div><div>+ *    notice, this list of conditions and the following disclaimer in the</div><div>+ *    documentation and/or other materials provided with the distribution.</div><div>+ *</div><div>+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND</div><div>+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE</div><div>+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE</div><div>+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE</div><div>+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL</div><div>+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS</div><div>+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)</div><div>+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT</div><div>+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY</div><div>+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF</div><div>+ * SUCH DAMAGE.</div><div>+ *</div><div>+ * $FreeBSD$</div><div>+ */</div><div>+</div><div>+#ifndef<span class="Apple-tab-span" style="white-space:pre">   </span>_DEV_MII_ATPHYREG_H_</div><div>+#define<span class="Apple-tab-span" style="white-space:pre"> </span>_DEV_MII_ATPHYREG_H_</div><div>+</div><div>+/*</div><div>+ * Registers for the Attansic/Atheros Gigabit PHY.</div><div>+ */</div><div>+</div><div>+/* Special Control Register */</div><div>+#define ATPHY_SCR<span class="Apple-tab-span" style="white-space:pre">                  </span>0x10</div><div>+#define ATPHY_SCR_JABBER_DISABLE<span class="Apple-tab-span" style="white-space:pre">        </span>0x0001</div><div>+#define ATPHY_SCR_POLARITY_REVERSAL<span class="Apple-tab-span" style="white-space:pre">   </span>0x0002</div><div>+#define ATPHY_SCR_SQE_TEST<span class="Apple-tab-span" style="white-space:pre">            </span>0x0004</div><div>+#define ATPHY_SCR_MAC_PDOWN<span class="Apple-tab-span" style="white-space:pre">           </span>0x0008</div><div>+#define ATPHY_SCR_CLK125_DISABLE<span class="Apple-tab-span" style="white-space:pre">      </span>0x0010</div><div>+#define ATPHY_SCR_MDI_MANUAL_MODE<span class="Apple-tab-span" style="white-space:pre">     </span>0x0000</div><div>+#define ATPHY_SCR_MDIX_MANUAL_MODE<span class="Apple-tab-span" style="white-space:pre">    </span>0x0020</div><div>+#define ATPHY_SCR_AUTO_X_1000T<span class="Apple-tab-span" style="white-space:pre">                </span>0x0040</div><div>+#define ATPHY_SCR_AUTO_X_MODE<span class="Apple-tab-span" style="white-space:pre">         </span>0x0060</div><div>+#define ATPHY_SCR_10BT_EXT_ENABLE<span class="Apple-tab-span" style="white-space:pre">     </span>0x0080</div><div>+#define ATPHY_SCR_MII_5BIT_ENABLE<span class="Apple-tab-span" style="white-space:pre">     </span>0x0100</div><div>+#define ATPHY_SCR_SCRAMBLER_DISABLE<span class="Apple-tab-span" style="white-space:pre">   </span>0x0200</div><div>+#define ATPHY_SCR_FORCE_LINK_GOOD<span class="Apple-tab-span" style="white-space:pre">     </span>0x0400</div><div>+#define ATPHY_SCR_ASSERT_CRS_ON_TX<span class="Apple-tab-span" style="white-space:pre">    </span>0x0800</div><div>+</div><div>+/* Special Status Register. */</div><div>+#define ATPHY_SSR<span class="Apple-tab-span" style="white-space:pre">                       </span>0x11</div><div>+#define ATPHY_SSR_SPD_DPLX_RESOLVED<span class="Apple-tab-span" style="white-space:pre">     </span>0x0800</div><div>+#define ATPHY_SSR_DUPLEX<span class="Apple-tab-span" style="white-space:pre">              </span>0x2000</div><div>+#define ATPHY_SSR_SPEED_MASK<span class="Apple-tab-span" style="white-space:pre">          </span>0xC000</div><div>+#define ATPHY_SSR_10MBS<span class="Apple-tab-span" style="white-space:pre">                       </span>0x0000</div><div>+#define ATPHY_SSR_100MBS<span class="Apple-tab-span" style="white-space:pre">              </span>0x4000</div><div>+#define ATPHY_SSR_1000MBS<span class="Apple-tab-span" style="white-space:pre">             </span>0x8000</div><div>+</div><div>+#endif<span class="Apple-tab-span" style="white-space:pre">        </span>/* _DEV_MII_ATPHYREG_H_ */</div></div><div><br></div><div><div><br></div><div><br></div><div style="font-size: 12px;font-family: Arial Narrow;padding:2px 0 2px 0;">------------------ Original ------------------</div><div style="font-size: 12px;background:#efefef;padding:8px;"><div><b>From: </b> "yao0718";<29171383@qq.com>;</div><div><b>Date: </b> Tue, Jul 5, 2016 03:11 PM</div><div><b>To: </b> "devel"<devel@rtems.org>; <wbr></div><div></div><div><b>Subject: </b> [0/6] ti cpsw driver port from freebsd for am335x </div></div><div><br></div><div><span style="font-family: 'lucida Grande', Verdana, 'Microsoft YaHei'; line-height: 23.8px;">I add cpsw driver from freebsd and modify some code for my board, my board is not beagleblack, so i am not sure it can work fine in BB board,to reduce phy find process, I  set phy address 4 and 6 for which phy address on my board,my board has two eth port ,I set dualmac when attach;</span></div><div><span style="font-family: 'lucida Grande', Verdana, 'Microsoft YaHei'; line-height: 23.8px;">can somebody test it on beaglebone and merge to beaglebone  bsp?</span></div><div><span style="font-family: 'lucida Grande', Verdana, 'Microsoft YaHei'; line-height: 23.8px;"><br></span></div></div>