|
@@ -49,6 +49,7 @@
|
|
|
#define ROBO_VLAN_ACCESS 0x06
|
|
|
#define ROBO_VLAN_ACCESS_5365 0x08
|
|
|
#define ROBO_VLAN_READ 0x0C
|
|
|
+#define ROBO_VLAN_MAX 0xFF
|
|
|
|
|
|
|
|
|
static const u8 pae_group_addr[ETH_ALEN] =
|
|
@@ -319,7 +320,7 @@ static void * wpa_driver_roboswitch_init(void *ctx, const char *ifname)
|
|
|
{
|
|
|
struct wpa_driver_roboswitch_data *drv;
|
|
|
int len = -1, sep = -1;
|
|
|
- u16 _read, vlan = 0, vlan_read[2];
|
|
|
+ u16 vlan_max = ROBO_VLAN_MAX, vlan = 0, vlan_read[2];
|
|
|
|
|
|
drv = os_zalloc(sizeof(*drv));
|
|
|
if (drv == NULL) return NULL;
|
|
@@ -352,7 +353,7 @@ static void * wpa_driver_roboswitch_init(void *ctx, const char *ifname)
|
|
|
}
|
|
|
vlan *= 10;
|
|
|
vlan += ifname[sep] - '0';
|
|
|
- if (vlan > 255) {
|
|
|
+ if (vlan > ROBO_VLAN_MAX) {
|
|
|
wpa_printf(MSG_INFO, "%s: VLAN out of range in "
|
|
|
"interface name %s", __func__, ifname);
|
|
|
os_free(drv);
|
|
@@ -381,13 +382,17 @@ static void * wpa_driver_roboswitch_init(void *ctx, const char *ifname)
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
vlan |= 1 << 13;
|
|
|
+
|
|
|
wpa_driver_roboswitch_write(drv, ROBO_VLAN_PAGE, ROBO_VLAN_ACCESS,
|
|
|
- &vlan, 1);
|
|
|
-
|
|
|
+ &vlan_max, 1);
|
|
|
wpa_driver_roboswitch_read(drv, ROBO_VLAN_PAGE, ROBO_VLAN_ACCESS,
|
|
|
- &_read, 1);
|
|
|
- if (_read != vlan)
|
|
|
+ &vlan_max, 1);
|
|
|
+ if (vlan_max == ROBO_VLAN_MAX)
|
|
|
+ wpa_driver_roboswitch_write(drv, ROBO_VLAN_PAGE,
|
|
|
+ ROBO_VLAN_ACCESS, &vlan, 1);
|
|
|
+ else
|
|
|
wpa_driver_roboswitch_write(drv, ROBO_VLAN_PAGE,
|
|
|
ROBO_VLAN_ACCESS_5365, &vlan, 1);
|
|
|
wpa_driver_roboswitch_read(drv, ROBO_VLAN_PAGE, ROBO_VLAN_READ,
|