{
uint32_t val = s->regs[R_PHYMNTNC];
uint32_t phy_addr, reg_num;
+ CadenceGEMState *ps = s;
+ uint32_t op;
phy_addr = FIELD_EX32(val, PHYMNTNC, PHY_ADDR);
+ op = FIELD_EX32(val, PHYMNTNC, OP);
- if (phy_addr != s->phy_addr) {
- /* no phy at this address */
- if (FIELD_EX32(val, PHYMNTNC, OP) == MDIO_OP_READ) {
+ /* Switch phy to consumer interface if there is an address match */
+ if (s->phy_consumer && phy_addr == s->phy_consumer->phy_addr) {
+ ps = s->phy_consumer;
+ }
+
+ if (!s->phy_connected || phy_addr != ps->phy_addr) {
+ /* phy not connected or no phy at this address */
+ if (op == MDIO_OP_READ) {
s->regs[R_PHYMNTNC] = FIELD_DP32(val, PHYMNTNC, DATA, 0xffff);
}
return;
reg_num = FIELD_EX32(val, PHYMNTNC, REG_ADDR);
- switch (FIELD_EX32(val, PHYMNTNC, OP)) {
+ switch (op) {
case MDIO_OP_READ:
s->regs[R_PHYMNTNC] = FIELD_DP32(val, PHYMNTNC, DATA,
- gem_phy_read(s, reg_num));
+ gem_phy_read(ps, reg_num));
break;
case MDIO_OP_WRITE:
- gem_phy_write(s, reg_num, val);
+ gem_phy_write(ps, reg_num, val);
break;
default:
num_type2_screeners, 4),
DEFINE_PROP_UINT16("jumbo-max-len", CadenceGEMState,
jumbo_max_len, 10240),
+ DEFINE_PROP_BOOL("phy-connected", CadenceGEMState, phy_connected, true),
+ DEFINE_PROP_LINK("phy-consumer", CadenceGEMState, phy_consumer,
+ TYPE_CADENCE_GEM, CadenceGEMState *),
+
DEFINE_PROP_LINK("dma", CadenceGEMState, dma_mr,
TYPE_MEMORY_REGION, MemoryRegion *),
};