Better support in RoboSwitch driver
I am terribly sorry, but because of a lack of testing equipment the patch was submitted not properly tested. Because the chipset documentation is not publicly available all behaviour has to be found out by experimentation. The other day, I made some incorrect assumptions based on my findings. I do believe the attached patch does support the whole RoboSwitch line (5325, 5350, 5352, 5365 and others). It is a drop-in substitution for my previous submission.
This commit is contained in:
parent
81e59f1070
commit
94abc2f11b
1 changed files with 11 additions and 6 deletions
|
@ -49,6 +49,7 @@
|
||||||
#define ROBO_VLAN_ACCESS 0x06 /* VLAN table Access register */
|
#define ROBO_VLAN_ACCESS 0x06 /* VLAN table Access register */
|
||||||
#define ROBO_VLAN_ACCESS_5365 0x08 /* VLAN table Access register (5365) */
|
#define ROBO_VLAN_ACCESS_5365 0x08 /* VLAN table Access register (5365) */
|
||||||
#define ROBO_VLAN_READ 0x0C /* VLAN read register */
|
#define ROBO_VLAN_READ 0x0C /* VLAN read register */
|
||||||
|
#define ROBO_VLAN_MAX 0xFF /* Maximum number of VLANs */
|
||||||
|
|
||||||
|
|
||||||
static const u8 pae_group_addr[ETH_ALEN] =
|
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;
|
struct wpa_driver_roboswitch_data *drv;
|
||||||
int len = -1, sep = -1;
|
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));
|
drv = os_zalloc(sizeof(*drv));
|
||||||
if (drv == NULL) return NULL;
|
if (drv == NULL) return NULL;
|
||||||
|
@ -352,7 +353,7 @@ static void * wpa_driver_roboswitch_init(void *ctx, const char *ifname)
|
||||||
}
|
}
|
||||||
vlan *= 10;
|
vlan *= 10;
|
||||||
vlan += ifname[sep] - '0';
|
vlan += ifname[sep] - '0';
|
||||||
if (vlan > 255) {
|
if (vlan > ROBO_VLAN_MAX) {
|
||||||
wpa_printf(MSG_INFO, "%s: VLAN out of range in "
|
wpa_printf(MSG_INFO, "%s: VLAN out of range in "
|
||||||
"interface name %s", __func__, ifname);
|
"interface name %s", __func__, ifname);
|
||||||
os_free(drv);
|
os_free(drv);
|
||||||
|
@ -381,13 +382,17 @@ static void * wpa_driver_roboswitch_init(void *ctx, const char *ifname)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* set the read bit */
|
||||||
vlan |= 1 << 13;
|
vlan |= 1 << 13;
|
||||||
|
/* set and read back to see if the register can be used */
|
||||||
wpa_driver_roboswitch_write(drv, ROBO_VLAN_PAGE, ROBO_VLAN_ACCESS,
|
wpa_driver_roboswitch_write(drv, ROBO_VLAN_PAGE, ROBO_VLAN_ACCESS,
|
||||||
&vlan, 1);
|
&vlan_max, 1);
|
||||||
/* Read back: The BCM5365 uses a different register */
|
|
||||||
wpa_driver_roboswitch_read(drv, ROBO_VLAN_PAGE, ROBO_VLAN_ACCESS,
|
wpa_driver_roboswitch_read(drv, ROBO_VLAN_PAGE, ROBO_VLAN_ACCESS,
|
||||||
&_read, 1);
|
&vlan_max, 1);
|
||||||
if (_read != vlan)
|
if (vlan_max == ROBO_VLAN_MAX) /* pre-5365 */
|
||||||
|
wpa_driver_roboswitch_write(drv, ROBO_VLAN_PAGE,
|
||||||
|
ROBO_VLAN_ACCESS, &vlan, 1);
|
||||||
|
else /* 5365 uses a different register */
|
||||||
wpa_driver_roboswitch_write(drv, ROBO_VLAN_PAGE,
|
wpa_driver_roboswitch_write(drv, ROBO_VLAN_PAGE,
|
||||||
ROBO_VLAN_ACCESS_5365, &vlan, 1);
|
ROBO_VLAN_ACCESS_5365, &vlan, 1);
|
||||||
wpa_driver_roboswitch_read(drv, ROBO_VLAN_PAGE, ROBO_VLAN_READ,
|
wpa_driver_roboswitch_read(drv, ROBO_VLAN_PAGE, ROBO_VLAN_READ,
|
||||||
|
|
Loading…
Reference in a new issue