1 |
/* |
/* |
2 |
* Cisco C7200 (Predator) AMD Am79c971 Module. |
* Cisco router simulation platform. |
3 |
* Copyright (C) 2006 Christophe Fillot. All rights reserved. |
* Copyright (C) 2006 Christophe Fillot. All rights reserved. |
4 |
* |
* |
5 |
* AMD Am79c971 FastEthernet chip emulation. |
* AMD Am79c971 FastEthernet chip emulation. |
15 |
#include <assert.h> |
#include <assert.h> |
16 |
|
|
17 |
#include "utils.h" |
#include "utils.h" |
18 |
#include "mips64.h" |
#include "cpu.h" |
19 |
|
#include "vm.h" |
20 |
#include "dynamips.h" |
#include "dynamips.h" |
21 |
#include "memory.h" |
#include "memory.h" |
22 |
#include "device.h" |
#include "device.h" |
203 |
{ |
{ |
204 |
n_eth_hdr_t *hdr = (n_eth_hdr_t *)pkt; |
n_eth_hdr_t *hdr = (n_eth_hdr_t *)pkt; |
205 |
|
|
|
/* Ignore traffic sent by us */ |
|
|
if (!memcmp(&d->mac_addr,&hdr->saddr,N_ETH_ALEN)) |
|
|
return(FALSE); |
|
|
|
|
206 |
/* Accept systematically frames if we are running is promiscuous mode */ |
/* Accept systematically frames if we are running is promiscuous mode */ |
207 |
if (d->csr[15] & AM79C971_CSR15_PROM) |
if (d->csr[15] & AM79C971_CSR15_PROM) |
208 |
return(TRUE); |
return(TRUE); |
335 |
} |
} |
336 |
|
|
337 |
/* RDP (Register Data Port) access */ |
/* RDP (Register Data Port) access */ |
338 |
static void am79c971_rdp_access(cpu_mips_t *cpu,struct am79c971_data *d, |
static void am79c971_rdp_access(cpu_gen_t *cpu,struct am79c971_data *d, |
339 |
u_int op_type,m_uint64_t *data) |
u_int op_type,m_uint64_t *data) |
340 |
{ |
{ |
341 |
m_uint32_t mask; |
m_uint32_t mask; |
443 |
} |
} |
444 |
|
|
445 |
/* BDP (BCR Data Port) access */ |
/* BDP (BCR Data Port) access */ |
446 |
static void am79c971_bdp_access(cpu_mips_t *cpu,struct am79c971_data *d, |
static void am79c971_bdp_access(cpu_gen_t *cpu,struct am79c971_data *d, |
447 |
u_int op_type,m_uint64_t *data) |
u_int op_type,m_uint64_t *data) |
448 |
{ |
{ |
449 |
u_int mii_phy,mii_reg; |
u_int mii_phy,mii_reg; |
493 |
/* |
/* |
494 |
* dev_am79c971_access() |
* dev_am79c971_access() |
495 |
*/ |
*/ |
496 |
void *dev_am79c971_access(cpu_mips_t *cpu,struct vdevice *dev, |
void *dev_am79c971_access(cpu_gen_t *cpu,struct vdevice *dev, |
497 |
m_uint32_t offset,u_int op_size,u_int op_type, |
m_uint32_t offset,u_int op_size,u_int op_type, |
498 |
m_uint64_t *data) |
m_uint64_t *data) |
499 |
{ |
{ |
505 |
#if DEBUG_ACCESS |
#if DEBUG_ACCESS |
506 |
if (op_type == MTS_READ) { |
if (op_type == MTS_READ) { |
507 |
cpu_log(cpu,d->name,"read access to offset=0x%x, pc=0x%llx, size=%u\n", |
cpu_log(cpu,d->name,"read access to offset=0x%x, pc=0x%llx, size=%u\n", |
508 |
offset,cpu->pc,op_size); |
offset,cpu_get_pc(cpu),op_size); |
509 |
} else { |
} else { |
510 |
cpu_log(cpu,d->name,"write access to offset=0x%x, pc=0x%llx, " |
cpu_log(cpu,d->name,"write access to offset=0x%x, pc=0x%llx, " |
511 |
"val=0x%llx, size=%u\n",offset,cpu->pc,*data,op_size); |
"val=0x%llx, size=%u\n",offset,cpu_get_pc(cpu),*data,op_size); |
512 |
} |
} |
513 |
#endif |
#endif |
514 |
|
|
893 |
* |
* |
894 |
* Read a PCI register. |
* Read a PCI register. |
895 |
*/ |
*/ |
896 |
static m_uint32_t pci_am79c971_read(cpu_mips_t *cpu,struct pci_device *dev, |
static m_uint32_t pci_am79c971_read(cpu_gen_t *cpu,struct pci_device *dev, |
897 |
int reg) |
int reg) |
898 |
{ |
{ |
899 |
struct am79c971_data *d = dev->priv_data; |
struct am79c971_data *d = dev->priv_data; |
919 |
* |
* |
920 |
* Write a PCI register. |
* Write a PCI register. |
921 |
*/ |
*/ |
922 |
static void pci_am79c971_write(cpu_mips_t *cpu,struct pci_device *dev, |
static void pci_am79c971_write(cpu_gen_t *cpu,struct pci_device *dev, |
923 |
int reg,m_uint32_t value) |
int reg,m_uint32_t value) |
924 |
{ |
{ |
925 |
struct am79c971_data *d = dev->priv_data; |
struct am79c971_data *d = dev->priv_data; |