| 252 | |
| 253 | |
| 254 | void emac3_write(u32 addr) |
| 255 | { |
| 256 | u32 value = wswap(dev9Ru32(addr)); |
| 257 | switch (addr) |
| 258 | { |
| 259 | case SMAP_R_EMAC3_MODE0_L: |
| 260 | //DevCon.WriteLn("DEV9: SMAP: SMAP_R_EMAC3_MODE0 write %x", value); |
| 261 | value = (value & (~SMAP_E3_SOFT_RESET)) | SMAP_E3_TXMAC_IDLE | SMAP_E3_RXMAC_IDLE; |
| 262 | dev9Ru16(SMAP_R_EMAC3_STA_CTRL_H) |= SMAP_E3_PHY_OP_COMP; |
| 263 | break; |
| 264 | case SMAP_R_EMAC3_TxMODE0_L: |
| 265 | //DevCon.WriteLn("DEV9: SMAP: SMAP_R_EMAC3_TxMODE0_L write %x", value); |
| 266 | //Process TX here ? |
| 267 | if (!(value & SMAP_E3_TX_GNP_0)) |
| 268 | Console.Error("DEV9: SMAP_R_EMAC3_TxMODE0_L: SMAP_E3_TX_GNP_0 not set"); |
| 269 | |
| 270 | tx_process(); |
| 271 | value = value & ~SMAP_E3_TX_GNP_0; |
| 272 | if (value) |
| 273 | Console.Error("DEV9: SMAP_R_EMAC3_TxMODE0_L: extra bits set !"); |
| 274 | break; |
| 275 | case SMAP_R_EMAC3_TxMODE1_L: |
| 276 | //DevCon.WriteLn("DEV9: SMAP_R_EMAC3_TxMODE1_L 32bit write %x", value); |
| 277 | break; |
| 278 | case SMAP_R_EMAC3_STA_CTRL_L: |
| 279 | //DevCon.WriteLn("DEV9: SMAP: SMAP_R_EMAC3_STA_CTRL write %x", value); |
| 280 | { |
| 281 | if (value & (SMAP_E3_PHY_READ)) |
| 282 | { |
| 283 | value |= SMAP_E3_PHY_OP_COMP; |
| 284 | const int reg = value & (SMAP_E3_PHY_REG_ADDR_MSK); |
| 285 | u16 val = dev9.phyregs[reg]; |
| 286 | switch (reg) |
| 287 | { |
| 288 | case SMAP_DsPHYTER_BMSR: |
| 289 | if (has_link) |
| 290 | val |= SMAP_PHY_BMSR_LINK | SMAP_PHY_BMSR_ANCP; |
| 291 | break; |
| 292 | case SMAP_DsPHYTER_PHYSTS: |
| 293 | if (has_link) |
| 294 | val |= SMAP_PHY_STS_LINK | SMAP_PHY_STS_100M | SMAP_PHY_STS_FDX | SMAP_PHY_STS_ANCP; |
| 295 | break; |
| 296 | } |
| 297 | //DevCon.WriteLn("DEV9: phy_read %d: %x", reg, val); |
| 298 | value = (value & 0xFFFF) | (val << 16); |
| 299 | } |
| 300 | if (value & (SMAP_E3_PHY_WRITE)) |
| 301 | { |
| 302 | value |= SMAP_E3_PHY_OP_COMP; |
| 303 | int reg = value & (SMAP_E3_PHY_REG_ADDR_MSK); |
| 304 | u16 val = value >> 16; |
| 305 | if (reg == SMAP_DsPHYTER_BMCR) |
| 306 | { |
| 307 | if (val & SMAP_PHY_BMCR_RST) |
| 308 | { |
| 309 | ad_reset(); |
| 310 | } |
| 311 | val &= ~SMAP_PHY_BMCR_RST; |
no test coverage detected