|
|
|
@ -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++) { |
|
|
|
|