|
|
|
@ -440,39 +440,39 @@ static int get_state(struct ip175c_state *state)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (REG_SUPP(state->regs->VLAN_LOOKUP_REG)) {
|
|
|
|
|
for (j=0; j<MAX_PORTS; j++) {
|
|
|
|
|
state->ports[j].shareports = 0; // initialize them in case.
|
|
|
|
|
}
|
|
|
|
|
for (j=0; j<state->regs->NUM_PORTS; j++) {
|
|
|
|
|
reg addr;
|
|
|
|
|
const bitnum *bit_lookup = (j%2==0)?
|
|
|
|
|
state->regs->VLAN_LOOKUP_EVEN_BIT:
|
|
|
|
|
state->regs->VLAN_LOOKUP_ODD_BIT;
|
|
|
|
|
addr = state->regs->VLAN_LOOKUP_REG;
|
|
|
|
|
if (state->regs->SIMPLE_VLAN_REGISTERS) {
|
|
|
|
|
addr.m += j;
|
|
|
|
|
} else {
|
|
|
|
|
switch (j) {
|
|
|
|
|
case 0:
|
|
|
|
|
case 1:
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
case 3:
|
|
|
|
|
addr.m+=1;
|
|
|
|
|
break;
|
|
|
|
|
case 4:
|
|
|
|
|
addr.m+=2;
|
|
|
|
|
break;
|
|
|
|
|
case 5:
|
|
|
|
|
addr = state->regs->VLAN_LOOKUP_REG_5;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
for (j=0; j<MAX_PORTS; j++) {
|
|
|
|
|
state->ports[j].shareports = 0; // initialize them in case.
|
|
|
|
|
}
|
|
|
|
|
for (j=0; j<state->regs->NUM_PORTS; j++) {
|
|
|
|
|
reg addr;
|
|
|
|
|
const bitnum *bit_lookup = (j%2==0)?
|
|
|
|
|
state->regs->VLAN_LOOKUP_EVEN_BIT:
|
|
|
|
|
state->regs->VLAN_LOOKUP_ODD_BIT;
|
|
|
|
|
addr = state->regs->VLAN_LOOKUP_REG;
|
|
|
|
|
if (state->regs->SIMPLE_VLAN_REGISTERS) {
|
|
|
|
|
addr.m += j;
|
|
|
|
|
} else {
|
|
|
|
|
switch (j) {
|
|
|
|
|
case 0:
|
|
|
|
|
case 1:
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
case 3:
|
|
|
|
|
addr.m+=1;
|
|
|
|
|
break;
|
|
|
|
|
case 4:
|
|
|
|
|
addr.m+=2;
|
|
|
|
|
break;
|
|
|
|
|
case 5:
|
|
|
|
|
addr = state->regs->VLAN_LOOKUP_REG_5;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (REG_SUPP(addr)) {
|
|
|
|
|
GET_PORT_BITS(state, state->ports[j].shareports, addr, bit_lookup);
|
|
|
|
|
if (REG_SUPP(addr)) {
|
|
|
|
|
GET_PORT_BITS(state, state->ports[j].shareports, addr, bit_lookup);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
for (j=0; j<MAX_PORTS; j++) {
|
|
|
|
|
state->ports[j].shareports = 0xff;
|
|
|
|
@ -568,57 +568,57 @@ static int update_state(struct ip175c_state *state)
|
|
|
|
|
state->regs->REMOVE_TAG_REG, state->regs->REMOVE_TAG_BIT);
|
|
|
|
|
|
|
|
|
|
if (REG_SUPP(state->regs->VLAN_LOOKUP_REG)) {
|
|
|
|
|
for (j=0; j<state->regs->NUM_PORTS; j++) {
|
|
|
|
|
reg addr;
|
|
|
|
|
const bitnum *bit_lookup = (j%2==0)?
|
|
|
|
|
state->regs->VLAN_LOOKUP_EVEN_BIT:
|
|
|
|
|
state->regs->VLAN_LOOKUP_ODD_BIT;
|
|
|
|
|
|
|
|
|
|
// duplicate code -- sorry
|
|
|
|
|
addr = state->regs->VLAN_LOOKUP_REG;
|
|
|
|
|
if (state->regs->SIMPLE_VLAN_REGISTERS) {
|
|
|
|
|
addr.m += j;
|
|
|
|
|
} else {
|
|
|
|
|
switch (j) {
|
|
|
|
|
case 0:
|
|
|
|
|
case 1:
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
case 3:
|
|
|
|
|
addr.m+=1;
|
|
|
|
|
break;
|
|
|
|
|
case 4:
|
|
|
|
|
addr.m+=2;
|
|
|
|
|
break;
|
|
|
|
|
case 5:
|
|
|
|
|
addr = state->regs->VLAN_LOOKUP_REG_5;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
addr.m = -1; // shouldn't get here, but...
|
|
|
|
|
break;
|
|
|
|
|
for (j=0; j<state->regs->NUM_PORTS; j++) {
|
|
|
|
|
reg addr;
|
|
|
|
|
const bitnum *bit_lookup = (j%2==0)?
|
|
|
|
|
state->regs->VLAN_LOOKUP_EVEN_BIT:
|
|
|
|
|
state->regs->VLAN_LOOKUP_ODD_BIT;
|
|
|
|
|
|
|
|
|
|
// duplicate code -- sorry
|
|
|
|
|
addr = state->regs->VLAN_LOOKUP_REG;
|
|
|
|
|
if (state->regs->SIMPLE_VLAN_REGISTERS) {
|
|
|
|
|
addr.m += j;
|
|
|
|
|
} else {
|
|
|
|
|
switch (j) {
|
|
|
|
|
case 0:
|
|
|
|
|
case 1:
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
case 3:
|
|
|
|
|
addr.m+=1;
|
|
|
|
|
break;
|
|
|
|
|
case 4:
|
|
|
|
|
addr.m+=2;
|
|
|
|
|
break;
|
|
|
|
|
case 5:
|
|
|
|
|
addr = state->regs->VLAN_LOOKUP_REG_5;
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
addr.m = -1; // shouldn't get here, but...
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//printf("shareports for %d is %02X\n",j,state->ports[j].shareports);
|
|
|
|
|
if (REG_SUPP(addr)) {
|
|
|
|
|
SET_PORT_BITS(state, state->ports[j].shareports, addr, bit_lookup);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
//printf("shareports for %d is %02X\n",j,state->ports[j].shareports);
|
|
|
|
|
if (REG_SUPP(addr)) {
|
|
|
|
|
SET_PORT_BITS(state, state->ports[j].shareports, addr, bit_lookup);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (REG_SUPP(state->regs->TAG_VLAN_MASK_REG)) {
|
|
|
|
|
for (j=0; j<MAX_VLANS; j++) {
|
|
|
|
|
reg addr = state->regs->TAG_VLAN_MASK_REG;
|
|
|
|
|
const bitnum *bit_lookup = (j%2==0)?
|
|
|
|
|
state->regs->TAG_VLAN_MASK_EVEN_BIT:
|
|
|
|
|
state->regs->TAG_VLAN_MASK_ODD_BIT;
|
|
|
|
|
unsigned int vlan_mask;
|
|
|
|
|
if (state->regs->SIMPLE_VLAN_REGISTERS) {
|
|
|
|
|
addr.m += j;
|
|
|
|
|
} else {
|
|
|
|
|
addr.m += j/2;
|
|
|
|
|
for (j=0; j<MAX_VLANS; j++) {
|
|
|
|
|
reg addr = state->regs->TAG_VLAN_MASK_REG;
|
|
|
|
|
const bitnum *bit_lookup = (j%2==0)?
|
|
|
|
|
state->regs->TAG_VLAN_MASK_EVEN_BIT:
|
|
|
|
|
state->regs->TAG_VLAN_MASK_ODD_BIT;
|
|
|
|
|
unsigned int vlan_mask;
|
|
|
|
|
if (state->regs->SIMPLE_VLAN_REGISTERS) {
|
|
|
|
|
addr.m += j;
|
|
|
|
|
} else {
|
|
|
|
|
addr.m += j/2;
|
|
|
|
|
}
|
|
|
|
|
vlan_mask = state->vlan_ports[j];
|
|
|
|
|
SET_PORT_BITS(state, vlan_mask, addr, bit_lookup);
|
|
|
|
|
}
|
|
|
|
|
vlan_mask = state->vlan_ports[j];
|
|
|
|
|
SET_PORT_BITS(state, vlan_mask, addr, bit_lookup);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (i=0; i<MAX_PORTS; i++) {
|
|
|
|
|