#define DRV_DESCRIPTION "MDIO bus multiplexer driver"
struct mdio_mux_child_bus;
struct mdio_mux_parent_bus { struct mii_bus *mii_bus; int current_child; int parent_id; void *switch_data; int (*switch_fn)(int current_child, int desired_child, void *data);
/* List of our children linked through their next fields. */ struct mdio_mux_child_bus *children;
};
/* * The parent bus' lock is used to order access to the switch_fn.
*/ staticint mdio_mux_read(struct mii_bus *bus, int phy_id, int regnum)
{ struct mdio_mux_child_bus *cb = bus->priv; struct mdio_mux_parent_bus *pb = cb->parent; int r;
mutex_lock_nested(&pb->mii_bus->mdio_lock, MDIO_MUTEX_MUX);
r = pb->switch_fn(pb->current_child, cb->bus_number, pb->switch_data); if (r) goto out;
pb->current_child = cb->bus_number;
r = pb->mii_bus->read(pb->mii_bus, phy_id, regnum);
out:
mutex_unlock(&pb->mii_bus->mdio_lock);
return r;
}
staticint mdio_mux_read_c45(struct mii_bus *bus, int phy_id, int dev_addr, int regnum)
{ struct mdio_mux_child_bus *cb = bus->priv; struct mdio_mux_parent_bus *pb = cb->parent; int r;
mutex_lock_nested(&pb->mii_bus->mdio_lock, MDIO_MUTEX_MUX);
r = pb->switch_fn(pb->current_child, cb->bus_number, pb->switch_data); if (r) goto out;
pb->current_child = cb->bus_number;
r = pb->mii_bus->read_c45(pb->mii_bus, phy_id, dev_addr, regnum);
out:
mutex_unlock(&pb->mii_bus->mdio_lock);
return r;
}
/* * The parent bus' lock is used to order access to the switch_fn.
*/ staticint mdio_mux_write(struct mii_bus *bus, int phy_id, int regnum, u16 val)
{ struct mdio_mux_child_bus *cb = bus->priv; struct mdio_mux_parent_bus *pb = cb->parent;
int r;
mutex_lock_nested(&pb->mii_bus->mdio_lock, MDIO_MUTEX_MUX);
r = pb->switch_fn(pb->current_child, cb->bus_number, pb->switch_data); if (r) goto out;
pb->current_child = cb->bus_number;
r = pb->mii_bus->write(pb->mii_bus, phy_id, regnum, val);
out:
mutex_unlock(&pb->mii_bus->mdio_lock);
return r;
}
staticint mdio_mux_write_c45(struct mii_bus *bus, int phy_id, int dev_addr, int regnum, u16 val)
{ struct mdio_mux_child_bus *cb = bus->priv; struct mdio_mux_parent_bus *pb = cb->parent;
int r;
mutex_lock_nested(&pb->mii_bus->mdio_lock, MDIO_MUTEX_MUX);
r = pb->switch_fn(pb->current_child, cb->bus_number, pb->switch_data); if (r) goto out;
pb->current_child = cb->bus_number;
r = pb->mii_bus->write_c45(pb->mii_bus, phy_id, dev_addr, regnum, val);
out:
mutex_unlock(&pb->mii_bus->mdio_lock);
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.