Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}