svn commit: r262653 - head/sys/dev/etherswitch/arswitch
Adrian Chadd
adrian at freebsd.org
Sat Mar 1 10:09:02 UTC 2014
Source: OpenWRT; much reading of the AR8327 datasheet.
-a
On 1 March 2014 02:04, Adrian Chadd <adrian at freebsd.org> wrote:
> Author: adrian
> Date: Sat Mar 1 10:04:31 2014
> New Revision: 262653
> URL: http://svnweb.freebsd.org/changeset/base/262653
>
> Log:
> (I think!) make the AR8327 switch correctly handle traffic.
>
> This patch does four things:
>
> * it globally disables mirroring;
> * it globally sets the mirroring on each port to be disabled;
> * the initial port setup now programs a portmask for the port to allow
> transmission (forwarding) to all other ports bar itself;
> * the vlan setup path now programs the portmask for the port to
> allow transmission (forwarding) to all other ports bar itself.
>
> Before this, I hard-coded the portmask to 0x3f which would mean all
> ports (bar port 6, which currently isn't hooked up to anything.)
> This means that traffic would be duplicated back out the port it
> received it. I bet this wasn't .. optimal.
>
> In any case, this _seems_ to make DHCP from my macosx laptop
> work through this access point. I'll do some further testing
> to ensure it's actually working correctly on all my devices.
>
> Tested:
>
> * DB120, AR8327 switch
>
> Modified:
> head/sys/dev/etherswitch/arswitch/arswitch_8327.c
>
> Modified: head/sys/dev/etherswitch/arswitch/arswitch_8327.c
> ==============================================================================
> --- head/sys/dev/etherswitch/arswitch/arswitch_8327.c Sat Mar 1 04:49:55 2014 (r262652)
> +++ head/sys/dev/etherswitch/arswitch/arswitch_8327.c Sat Mar 1 10:04:31 2014 (r262653)
> @@ -665,8 +665,19 @@ ar8327_port_init(struct arswitch_softc *
> t = AR8327_PORT_VLAN1_OUT_MODE_UNTOUCH << AR8327_PORT_VLAN1_OUT_MODE_S;
> arswitch_writereg(sc->sc_dev, AR8327_REG_PORT_VLAN1(port), t);
>
> + /*
> + * This doesn't configure any ports which this port can "see".
> + * bits 0-6 control which ports a frame coming into this port
> + * can be sent out to.
> + *
> + * So by doing this, we're making it impossible to send frames out
> + * to that port.
> + */
> t = AR8327_PORT_LOOKUP_LEARN;
> t |= AR8X16_PORT_CTRL_STATE_FORWARD << AR8327_PORT_LOOKUP_STATE_S;
> +
> + /* So this allows traffic to any port except ourselves */
> + t |= (0x3f & ~(1 << port));
> arswitch_writereg(sc->sc_dev, AR8327_REG_PORT_LOOKUP(port), t);
> }
>
> @@ -695,6 +706,13 @@ ar8327_reset_vlans(struct arswitch_softc
> uint32_t mode, t;
>
> /*
> + * Disable mirroring.
> + */
> + arswitch_modifyreg(sc->sc_dev, AR8327_REG_FWD_CTRL0,
> + AR8327_FWD_CTRL0_MIRROR_PORT,
> + (0xF << AR8327_FWD_CTRL0_MIRROR_PORT_S));
> +
> + /*
> * For now, let's default to one portgroup, just so traffic
> * flows. All ports can see other ports.
> */
> @@ -713,13 +731,25 @@ ar8327_reset_vlans(struct arswitch_softc
>
> /* Set ingress = out_keep; members = 0x3f for all ports */
>
> - t = 0x3f; /* all ports */
> + t = (0x3f & ~(1 << i)); /* all ports besides us */
> t |= AR8327_PORT_LOOKUP_LEARN;
>
> /* in_port_only, forward */
> t |= AR8X16_PORT_VLAN_MODE_PORT_ONLY << AR8327_PORT_LOOKUP_IN_MODE_S;
> t |= AR8X16_PORT_CTRL_STATE_FORWARD << AR8327_PORT_LOOKUP_STATE_S;
> arswitch_writereg(sc->sc_dev, AR8327_REG_PORT_LOOKUP(i), t);
> +
> + /*
> + * Disable port mirroring entirely.
> + */
> + arswitch_modifyreg(sc->sc_dev,
> + AR8327_REG_PORT_LOOKUP(i),
> + AR8327_PORT_LOOKUP_ING_MIRROR_EN,
> + 0);
> + arswitch_modifyreg(sc->sc_dev,
> + AR8327_REG_PORT_HOL_CTRL1(i),
> + AR8327_PORT_HOL_CTRL1_EG_MIRROR_EN,
> + 0);
> }
> }
>
>
More information about the svn-src-head
mailing list