1 |
/* |
/* |
2 |
* Cisco C3600 simulation platform. |
* Cisco router simulation platform. |
3 |
* Copyright (c) 2006 Christophe Fillot (cf@utc.fr) |
* Copyright (c) 2006 Christophe Fillot (cf@utc.fr) |
4 |
* |
* |
5 |
* NM-16ESW ethernet switch module (experimental!) |
* NM-16ESW ethernet switch module (experimental!) |
30 |
#define DEBUG_ACCESS 0 |
#define DEBUG_ACCESS 0 |
31 |
#define DEBUG_UNKNOWN 0 |
#define DEBUG_UNKNOWN 0 |
32 |
#define DEBUG_MII 0 |
#define DEBUG_MII 0 |
33 |
#define DEBUG_MEM 0 |
#define DEBUG_MEM 1 |
34 |
#define DEBUG_REG 0 |
#define DEBUG_REG 1 |
35 |
#define DEBUG_TRANSMIT 0 |
#define DEBUG_TRANSMIT 0 |
36 |
#define DEBUG_RECEIVE 0 |
#define DEBUG_RECEIVE 0 |
37 |
#define DEBUG_FORWARD 0 |
#define DEBUG_FORWARD 1 |
38 |
#define DEBUG_MIRROR 0 |
#define DEBUG_MIRROR 0 |
39 |
#define DEBUG_ARL 0 |
#define DEBUG_ARL 0 |
40 |
|
|
1395 |
switch(cmd) { |
switch(cmd) { |
1396 |
case BCM5600_SCHAN_CMD_EXEC: |
case BCM5600_SCHAN_CMD_EXEC: |
1397 |
bcm5600_handle_gen_cmd(d); |
bcm5600_handle_gen_cmd(d); |
1398 |
d->schan_cmd_res = 0xFFFFFFFF; |
d->schan_cmd_res = 0x00008002; |
1399 |
break; |
break; |
1400 |
|
|
1401 |
case BCM5600_SCHAN_CMD_READ_MII: |
case BCM5600_SCHAN_CMD_READ_MII: |
1402 |
bcm5600_mii_read(d); |
bcm5600_mii_read(d); |
1403 |
d->schan_cmd_res = 0xFFFFFFFF; |
d->schan_cmd_res = 0x00048000; |
1404 |
break; |
break; |
1405 |
|
|
1406 |
case BCM5600_SCHAN_CMD_WRITE_MII: |
case BCM5600_SCHAN_CMD_WRITE_MII: |
1407 |
bcm5600_mii_write(d); |
bcm5600_mii_write(d); |
1408 |
d->schan_cmd_res = 0xFFFFFFFF; |
d->schan_cmd_res = 0x00048000; |
1409 |
break; |
break; |
1410 |
|
|
1411 |
case BCM5600_SCHAN_CMD_LINKSCAN: |
case BCM5600_SCHAN_CMD_LINKSCAN: |
1423 |
/* |
/* |
1424 |
* dev_bcm5605_access() |
* dev_bcm5605_access() |
1425 |
*/ |
*/ |
1426 |
void *dev_bcm5605_access(cpu_mips_t *cpu,struct vdevice *dev,m_uint32_t offset, |
void *dev_bcm5605_access(cpu_gen_t *cpu,struct vdevice *dev,m_uint32_t offset, |
1427 |
u_int op_size,u_int op_type,m_uint64_t *data) |
u_int op_size,u_int op_type,m_uint64_t *data) |
1428 |
{ |
{ |
1429 |
struct nm_16esw_data *d = dev->priv_data; |
struct nm_16esw_data *d = dev->priv_data; |
1434 |
|
|
1435 |
#if DEBUG_ACCESS |
#if DEBUG_ACCESS |
1436 |
if (op_type == MTS_READ) { |
if (op_type == MTS_READ) { |
1437 |
BCM_LOG(d,"read access to offset=0x%x, pc=0x%llx\n",offset,cpu->pc); |
BCM_LOG(d,"read access to offset=0x%x, pc=0x%llx\n", |
1438 |
|
offset,cpu_get_pc(cpu)); |
1439 |
} else { |
} else { |
1440 |
BCM_LOG(d,"write access to offset=0x%x, pc=0x%llx, val=0x%llx\n", |
BCM_LOG(d,"write access to offset=0x%x, pc=0x%llx, val=0x%llx\n", |
1441 |
offset,cpu->pc,*data); |
offset,cpu_get_pc(cpu),*data); |
1442 |
} |
} |
1443 |
#endif |
#endif |
1444 |
|
|
1520 |
*data |= BCM5600_INTR_LINKSTAT_MOD; |
*data |= BCM5600_INTR_LINKSTAT_MOD; |
1521 |
d->mii_intr = FALSE; |
d->mii_intr = FALSE; |
1522 |
} |
} |
1523 |
|
|
1524 |
|
pci_dev_clear_irq(d->vm,d->pci_dev); |
1525 |
} |
} |
1526 |
break; |
break; |
1527 |
|
|
1548 |
default: |
default: |
1549 |
if (op_type == MTS_READ) { |
if (op_type == MTS_READ) { |
1550 |
BCM_LOG(d,"read from unknown addr 0x%x, pc=0x%llx (size=%u)\n", |
BCM_LOG(d,"read from unknown addr 0x%x, pc=0x%llx (size=%u)\n", |
1551 |
offset,cpu->pc,op_size); |
offset,cpu_get_pc(cpu),op_size); |
1552 |
} else { |
} else { |
1553 |
BCM_LOG(d,"write to unknown addr 0x%x, value=0x%llx, " |
BCM_LOG(d,"write to unknown addr 0x%x, value=0x%llx, " |
1554 |
"pc=0x%llx (size=%u)\n",offset,*data,cpu->pc,op_size); |
"pc=0x%llx (size=%u)\n", |
1555 |
|
offset,*data,cpu_get_pc(cpu),op_size); |
1556 |
} |
} |
1557 |
#endif |
#endif |
1558 |
} |
} |
1854 |
*/ |
*/ |
1855 |
if (dst_mac_index == -1) { |
if (dst_mac_index == -1) { |
1856 |
#if DEBUG_FORWARD |
#if DEBUG_FORWARD |
1857 |
BCM_LOG(d,"Destination MAC address unknown, flooding.\n"); |
BCM_LOG(d,"Destination MAC address " |
1858 |
|
"%2.2x%2.2x.%2.2x%2.2x.%2.2x%2.2x unknown, flooding.\n", |
1859 |
|
dst_mac->eth_addr_byte[0],dst_mac->eth_addr_byte[1], |
1860 |
|
dst_mac->eth_addr_byte[2],dst_mac->eth_addr_byte[3], |
1861 |
|
dst_mac->eth_addr_byte[4],dst_mac->eth_addr_byte[5]); |
1862 |
#endif |
#endif |
1863 |
p->egress_bitmap = p->vlan_entry[1] & BCM5600_VTABLE_PORT_BMAP_MASK; |
p->egress_bitmap = p->vlan_entry[1] & BCM5600_VTABLE_PORT_BMAP_MASK; |
1864 |
|
|
2077 |
if (!memcmp(m,"\x01\x80\xc2\x00\x00",5) && !(m->eth_addr_byte[5] & 0xF0)) |
if (!memcmp(m,"\x01\x80\xc2\x00\x00",5) && !(m->eth_addr_byte[5] & 0xF0)) |
2078 |
return(TRUE); |
return(TRUE); |
2079 |
|
|
2080 |
|
/* |
2081 |
|
* CDP: this is cleary a hack, but IOS seems to program this address |
2082 |
|
* in BPDU registers. |
2083 |
|
*/ |
2084 |
|
if (!memcmp(m,"\x01\x00\x0c\xcc\xcc\xcc",6)) |
2085 |
|
return(TRUE); |
2086 |
|
|
2087 |
return(FALSE); |
return(FALSE); |
2088 |
} |
} |
2089 |
|
|
2140 |
discard = port_entry[0] & BCM5600_PTABLE_PRT_DIS_MASK; |
discard = port_entry[0] & BCM5600_PTABLE_PRT_DIS_MASK; |
2141 |
discard >>= BCM5600_PTABLE_PRT_DIS_SHIFT; |
discard >>= BCM5600_PTABLE_PRT_DIS_SHIFT; |
2142 |
|
|
2143 |
if (discard) { |
if ((p->orig_vlan == -1) && discard) { |
2144 |
if (discard != 0x20) { |
if (discard != 0x20) { |
2145 |
printf("\n\n\n" |
printf("\n\n\n" |
2146 |
"-----------------------------------------------------------" |
"-----------------------------------------------------------" |
2376 |
} |
} |
2377 |
|
|
2378 |
/* pci_bcm5605_read() */ |
/* pci_bcm5605_read() */ |
2379 |
static m_uint32_t pci_bcm5605_read(cpu_mips_t *cpu,struct pci_device *dev, |
static m_uint32_t pci_bcm5605_read(cpu_gen_t *cpu,struct pci_device *dev, |
2380 |
int reg) |
int reg) |
2381 |
{ |
{ |
2382 |
struct nm_16esw_data *d = dev->priv_data; |
struct nm_16esw_data *d = dev->priv_data; |
2390 |
} |
} |
2391 |
|
|
2392 |
/* pci_bcm5605_write() */ |
/* pci_bcm5605_write() */ |
2393 |
static void pci_bcm5605_write(cpu_mips_t *cpu,struct pci_device *dev, |
static void pci_bcm5605_write(cpu_gen_t *cpu,struct pci_device *dev, |
2394 |
int reg,m_uint32_t value) |
int reg,m_uint32_t value) |
2395 |
{ |
{ |
2396 |
struct nm_16esw_data *d = dev->priv_data; |
struct nm_16esw_data *d = dev->priv_data; |