/* write one word to phy or eeprom */ static int qf_share_write_word(struct usbnet *dev, int phy, u8 reg, __le16 value) { int ret, i; mutex_lock(&dev->phy_mutex); ret = qf_write(dev, EPDR, 2, &value); if (ret < 0) goto out; qf_write_reg(dev, EPAR, phy ? (reg | 0x40) : reg); qf_write_reg(dev, EPCR, phy ? 0x1a : 0x12); for (i = 0; i < QF_SHARE_TIMEOUT; i++) { u8 tmp; udelay(1); ret = qf_read_reg(dev, EPCR, &tmp); if (ret < 0) goto out; /* ready */ if ((tmp & 1) == 0) break; } if (i >= QF_SHARE_TIMEOUT) { netdev_warn(dev->net,"%s write timed out!", phy ? "phy" : "eeprom"); ret = -EIO; goto out; } qf_write_reg(dev, EPCR, 0x0); out: mutex_unlock(&dev->phy_mutex); return ret; }
/* qf9700_android read one word from phy or eeprom */ static int qf_share_read_word(struct usbnet *dev, int phy, u8 reg, __le16 *value) { int ret, i; mutex_lock(&dev->phy_mutex); qf_write_reg(dev, EPAR, phy ? (reg | 0x40) : reg); qf_write_reg(dev, EPCR, phy ? 0xc : 0x4); for (i = 0; i < QF_SHARE_TIMEOUT; i++) { u8 tmp; udelay(1); ret = qf_read_reg(dev, EPCR, &tmp); if (ret < 0) goto out; /* ready */ if ((tmp & 1) == 0) break; } if (i >= QF_SHARE_TIMEOUT) { netdev_err(dev, "%s read timed out!", phy ? "phy" : "eeprom"); ret = -EIO; goto out; } qf_write_reg(dev, EPCR, 0x0); ret = qf_read(dev, EPDR, 2, value); netdev_dbg(dev, "read shared %d 0x%02x returned 0x%04x, %d", phy, reg, *value, ret); out: mutex_unlock(&dev->phy_mutex); return ret; }