static void octm_init(void *arg) { struct ifnet *ifp; struct octm_softc *sc; cvmx_mgmt_port_netdevice_flags_t flags; uint64_t mac; sc = arg; ifp = sc->sc_ifp; if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) { cvmx_mgmt_port_disable(sc->sc_port); ifp->if_drv_flags &= ~IFF_DRV_RUNNING; } /* * NB: * MAC must be set before allmulti and promisc below, as * cvmx_mgmt_port_set_mac will always enable the CAM, and turning on * promiscuous mode only works with the CAM disabled. */ mac = 0; memcpy((u_int8_t *)&mac + 2, IF_LLADDR(ifp), 6); cvmx_mgmt_port_set_mac(sc->sc_port, mac); /* * This is done unconditionally, rather than only if sc_flags have * changed because of set_mac's effect on the CAM noted above. */ flags = 0; if ((ifp->if_flags & IFF_ALLMULTI) != 0) flags |= CVMX_IFF_ALLMULTI; if ((ifp->if_flags & IFF_PROMISC) != 0) flags |= CVMX_IFF_PROMISC; cvmx_mgmt_port_set_multicast_list(sc->sc_port, flags); /* XXX link state? */ if ((ifp->if_flags & IFF_UP) != 0) cvmx_mgmt_port_enable(sc->sc_port); ifp->if_drv_flags |= IFF_DRV_RUNNING; ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; }
static void octm_init(void *arg) { struct ifnet *ifp; struct octm_softc *sc; cvmx_mgmt_port_netdevice_flags_t flags; uint64_t mac; sc = arg; ifp = sc->sc_ifp; if ((ifp->if_drv_flags & IFF_DRV_RUNNING) != 0) { cvmx_mgmt_port_disable(sc->sc_port); ifp->if_drv_flags &= ~IFF_DRV_RUNNING; } if (((ifp->if_flags ^ sc->sc_flags) & (IFF_ALLMULTI | IFF_MULTICAST | IFF_PROMISC)) != 0) { flags = 0; if ((ifp->if_flags & IFF_ALLMULTI) != 0) flags |= CVMX_IFF_ALLMULTI; if ((ifp->if_flags & IFF_PROMISC) != 0) flags |= CVMX_IFF_PROMISC; cvmx_mgmt_port_set_multicast_list(sc->sc_port, flags); } mac = 0; memcpy((u_int8_t *)&mac + 2, IF_LLADDR(ifp), 6); cvmx_mgmt_port_set_mac(sc->sc_port, mac); /* XXX link state? */ if ((ifp->if_flags & IFF_UP) != 0) cvmx_mgmt_port_enable(sc->sc_port); ifp->if_drv_flags |= IFF_DRV_RUNNING; ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; }