svn commit: r262429 - head/sys/dev/etherswitch/arswitch
Adrian Chadd
adrian at FreeBSD.org
Mon Feb 24 04:44:29 UTC 2014
Author: adrian
Date: Mon Feb 24 04:44:28 2014
New Revision: 262429
URL: http://svnweb.freebsd.org/changeset/base/262429
Log:
Methodize the arswitch VLAN routines.
These differ per chipset family in subtle and evil ways.
It becomes very noticable on the AR8327 where the layout is just plain
wrong.
Modified:
head/sys/dev/etherswitch/arswitch/arswitch.c
head/sys/dev/etherswitch/arswitch/arswitch_vlans.c
head/sys/dev/etherswitch/arswitch/arswitch_vlans.h
Modified: head/sys/dev/etherswitch/arswitch/arswitch.c
==============================================================================
--- head/sys/dev/etherswitch/arswitch/arswitch.c Mon Feb 24 04:43:23 2014 (r262428)
+++ head/sys/dev/etherswitch/arswitch/arswitch.c Mon Feb 24 04:44:28 2014 (r262429)
@@ -222,7 +222,7 @@ arswitch_set_vlan_mode(struct arswitch_s
};
/* Reset VLANs. */
- arswitch_reset_vlans(sc);
+ sc->hal.arswitch_vlan_init_hw(sc);
return (0);
}
@@ -274,6 +274,11 @@ arswitch_attach(device_t dev)
sc->hal.arswitch_port_init = ar8xxx_port_init;
sc->hal.arswitch_port_vlan_setup = ar8xxx_port_vlan_setup;
sc->hal.arswitch_port_vlan_get = ar8xxx_port_vlan_get;
+ sc->hal.arswitch_vlan_init_hw = ar8xxx_reset_vlans;
+ sc->hal.arswitch_vlan_getvgroup = ar8xxx_getvgroup;
+ sc->hal.arswitch_vlan_setvgroup = ar8xxx_setvgroup;
+ sc->hal.arswitch_vlan_get_pvid = ar8xxx_get_pvid;
+ sc->hal.arswitch_vlan_set_pvid = ar8xxx_set_pvid;
/*
* Attach switch related functions
@@ -538,7 +543,7 @@ ar8xxx_port_vlan_get(struct arswitch_sof
ARSWITCH_LOCK(sc);
/* Retrieve the PVID. */
- arswitch_get_pvid(sc, p->es_port, &p->es_pvid);
+ sc->hal.arswitch_vlan_get_pvid(sc, p->es_port, &p->es_pvid);
/* Port flags. */
reg = arswitch_readreg(sc->sc_dev, AR8X16_REG_PORT_CTRL(p->es_port));
@@ -602,7 +607,7 @@ ar8xxx_port_vlan_setup(struct arswitch_s
/* Set the PVID. */
if (p->es_pvid != 0)
- arswitch_set_pvid(sc, p->es_port, p->es_pvid);
+ sc->hal.arswitch_vlan_set_pvid(sc, p->es_port, p->es_pvid);
/* Mutually exclusive. */
if (p->es_flags & ETHERSWITCH_PORT_ADDTAG &&
@@ -730,6 +735,22 @@ arswitch_setconf(device_t dev, etherswit
return (0);
}
+static int
+arswitch_getvgroup(device_t dev, etherswitch_vlangroup_t *e)
+{
+ struct arswitch_softc *sc = device_get_softc(dev);
+
+ return (sc->hal.arswitch_vlan_getvgroup(sc, e));
+}
+
+static int
+arswitch_setvgroup(device_t dev, etherswitch_vlangroup_t *e)
+{
+ struct arswitch_softc *sc = device_get_softc(dev);
+
+ return (sc->hal.arswitch_vlan_setvgroup(sc, e));
+}
+
static device_method_t arswitch_methods[] = {
/* Device interface */
DEVMETHOD(device_probe, arswitch_probe),
Modified: head/sys/dev/etherswitch/arswitch/arswitch_vlans.c
==============================================================================
--- head/sys/dev/etherswitch/arswitch/arswitch_vlans.c Mon Feb 24 04:43:23 2014 (r262428)
+++ head/sys/dev/etherswitch/arswitch/arswitch_vlans.c Mon Feb 24 04:44:28 2014 (r262429)
@@ -171,7 +171,7 @@ arswitch_set_port_vlan(struct arswitch_s
* Reset vlans to default state.
*/
void
-arswitch_reset_vlans(struct arswitch_softc *sc)
+ar8xxx_reset_vlans(struct arswitch_softc *sc)
{
uint32_t ports;
int i, j;
@@ -220,7 +220,7 @@ arswitch_reset_vlans(struct arswitch_sof
sc->vid[0] = 1;
/* Set PVID for everyone. */
for (i = 0; i <= sc->numphys; i++)
- arswitch_set_pvid(sc, i, sc->vid[0]);
+ sc->hal.arswitch_vlan_set_pvid(sc, i, sc->vid[0]);
ports = 0;
for (i = 0; i <= sc->numphys; i++)
ports |= (1 << i);
@@ -259,12 +259,10 @@ arswitch_reset_vlans(struct arswitch_sof
}
int
-arswitch_getvgroup(device_t dev, etherswitch_vlangroup_t *vg)
+ar8xxx_getvgroup(struct arswitch_softc *sc, etherswitch_vlangroup_t *vg)
{
- struct arswitch_softc *sc;
int err;
- sc = device_get_softc(dev);
ARSWITCH_LOCK_ASSERT(sc, MA_NOTOWNED);
if (vg->es_vlangroup > sc->info.es_nvlangroups)
@@ -305,12 +303,10 @@ arswitch_getvgroup(device_t dev, ethersw
}
int
-arswitch_setvgroup(device_t dev, etherswitch_vlangroup_t *vg)
+ar8xxx_setvgroup(struct arswitch_softc *sc, etherswitch_vlangroup_t *vg)
{
- struct arswitch_softc *sc;
int err, vid;
- sc = device_get_softc(dev);
ARSWITCH_LOCK_ASSERT(sc, MA_NOTOWNED);
/* Check VLAN mode. */
@@ -362,7 +358,7 @@ arswitch_setvgroup(device_t dev, ethersw
}
int
-arswitch_get_pvid(struct arswitch_softc *sc, int port, int *pvid)
+ar8xxx_get_pvid(struct arswitch_softc *sc, int port, int *pvid)
{
uint32_t reg;
@@ -373,7 +369,7 @@ arswitch_get_pvid(struct arswitch_softc
}
int
-arswitch_set_pvid(struct arswitch_softc *sc, int port, int pvid)
+ar8xxx_set_pvid(struct arswitch_softc *sc, int port, int pvid)
{
ARSWITCH_LOCK_ASSERT(sc, MA_OWNED);
Modified: head/sys/dev/etherswitch/arswitch/arswitch_vlans.h
==============================================================================
--- head/sys/dev/etherswitch/arswitch/arswitch_vlans.h Mon Feb 24 04:43:23 2014 (r262428)
+++ head/sys/dev/etherswitch/arswitch/arswitch_vlans.h Mon Feb 24 04:44:28 2014 (r262429)
@@ -29,10 +29,10 @@
#ifndef __ARSWITCH_VLANS_H__
#define __ARSWITCH_VLANS_H__
-void arswitch_reset_vlans(struct arswitch_softc *);
-int arswitch_getvgroup(device_t, etherswitch_vlangroup_t *);
-int arswitch_setvgroup(device_t, etherswitch_vlangroup_t *);
-int arswitch_get_pvid(struct arswitch_softc *, int, int *);
-int arswitch_set_pvid(struct arswitch_softc *, int, int);
+void ar8xxx_reset_vlans(struct arswitch_softc *);
+int ar8xxx_getvgroup(struct arswitch_softc *, etherswitch_vlangroup_t *);
+int ar8xxx_setvgroup(struct arswitch_softc *, etherswitch_vlangroup_t *);
+int ar8xxx_get_pvid(struct arswitch_softc *, int, int *);
+int ar8xxx_set_pvid(struct arswitch_softc *, int, int);
#endif /* __ARSWITCH_VLANS_H__ */
More information about the svn-src-head
mailing list