This patch uses the phy_id variable in b44_readphy and b44_writephy.
Signed-off-by: Matthew Martin <[email protected]>
---
--- vanilla-linux-2.6.21-git4/drivers/net/b44.c 2007-05-03 11:16:21.000000000 -0500
+++ linux-2.6.21-git4/drivers/net/b44.c 2007-05-03 17:02:39.000000000 -0500
@@ -327,45 +327,59 @@ static void b44_enable_ints(struct b44 *
bw32(bp, B44_IMASK, bp->imask);
}
-static int b44_readphy(struct b44 *bp, int reg, u32 *val)
+static int b44_readphy(struct b44 *bp, int reg, u32 *val, int phy_addr)
{
int err;
bw32(bp, B44_EMAC_ISTAT, EMAC_INT_MII);
- bw32(bp, B44_MDIO_DATA, (MDIO_DATA_SB_START |
- (MDIO_OP_READ << MDIO_DATA_OP_SHIFT) |
- (bp->phy_addr << MDIO_DATA_PMD_SHIFT) |
- (reg << MDIO_DATA_RA_SHIFT) |
- (MDIO_TA_VALID << MDIO_DATA_TA_SHIFT)));
+
+ if (!phy_addr)
+ bw32(bp, B44_MDIO_DATA, (MDIO_DATA_SB_START |
+ (MDIO_OP_READ << MDIO_DATA_OP_SHIFT) |
+ (bp->phy_addr << MDIO_DATA_PMD_SHIFT) |
+ (reg << MDIO_DATA_RA_SHIFT) |
+ (MDIO_TA_VALID << MDIO_DATA_TA_SHIFT)));
+ else
+ bw32(bp, B44_MDIO_DATA, (MDIO_DATA_SB_START |
+ (MDIO_OP_READ << MDIO_DATA_OP_SHIFT) |
+ (phy_addr << MDIO_DATA_PMD_SHIFT) |
+ (reg << MDIO_DATA_RA_SHIFT) |
+ (MDIO_TA_VALID << MDIO_DATA_TA_SHIFT)));
+
err = b44_wait_bit(bp, B44_EMAC_ISTAT, EMAC_INT_MII, 100, 0);
*val = br32(bp, B44_MDIO_DATA) & MDIO_DATA_DATA;
return err;
}
-static int b44_writephy(struct b44 *bp, int reg, u32 val)
+static int b44_writephy(struct b44 *bp, int reg, u32 val, int phy_addr)
{
bw32(bp, B44_EMAC_ISTAT, EMAC_INT_MII);
- bw32(bp, B44_MDIO_DATA, (MDIO_DATA_SB_START |
- (MDIO_OP_WRITE << MDIO_DATA_OP_SHIFT) |
- (bp->phy_addr << MDIO_DATA_PMD_SHIFT) |
- (reg << MDIO_DATA_RA_SHIFT) |
- (MDIO_TA_VALID << MDIO_DATA_TA_SHIFT) |
- (val & MDIO_DATA_DATA)));
+
+ if (!phy_addr)
+ bw32(bp, B44_MDIO_DATA, (MDIO_DATA_SB_START |
+ (MDIO_OP_WRITE << MDIO_DATA_OP_SHIFT) |
+ (bp->phy_addr << MDIO_DATA_PMD_SHIFT) |
+ (reg << MDIO_DATA_RA_SHIFT) |
+ (MDIO_TA_VALID << MDIO_DATA_TA_SHIFT) |
+ (val & MDIO_DATA_DATA)));
+ else
+ bw32(bp, B44_MDIO_DATA, (MDIO_DATA_SB_START |
+ (MDIO_OP_WRITE << MDIO_DATA_OP_SHIFT) |
+ (phy_addr << MDIO_DATA_PMD_SHIFT) |
+ (reg << MDIO_DATA_RA_SHIFT) |
+ (MDIO_TA_VALID << MDIO_DATA_TA_SHIFT) |
+ (val & MDIO_DATA_DATA)));
+
return b44_wait_bit(bp, B44_EMAC_ISTAT, EMAC_INT_MII, 100, 0);
}
/* miilib interface */
-/* FIXME FIXME: phy_id is ignored, bp->phy_addr use is unconditional
- * due to code existing before miilib use was added to this driver.
- * Someone should remove this artificial driver limitation in
- * b44_{read,write}phy. bp->phy_addr itself is fine (and needed).
- */
static int b44_mii_read(struct net_device *dev, int phy_id, int location)
{
u32 val;
struct b44 *bp = netdev_priv(dev);
- int rc = b44_readphy(bp, location, &val);
+ int rc = b44_readphy(bp, location, &val, phy_id);
if (rc)
return 0xffffffff;
return val;
@@ -375,7 +389,7 @@ static void b44_mii_write(struct net_dev
int val)
{
struct b44 *bp = netdev_priv(dev);
- b44_writephy(bp, location, val);
+ b44_writephy(bp, location, val, phy_id);
}
static int b44_phy_reset(struct b44 *bp)
@@ -383,11 +397,11 @@ static int b44_phy_reset(struct b44 *bp)
u32 val;
int err;
- err = b44_writephy(bp, MII_BMCR, BMCR_RESET);
+ err = b44_writephy(bp, MII_BMCR, BMCR_RESET, 0);
if (err)
return err;
udelay(100);
- err = b44_readphy(bp, MII_BMCR, &val);
+ err = b44_readphy(bp, MII_BMCR, &val, 0);
if (!err) {
if (val & BMCR_RESET) {
printk(KERN_ERR PFX "%s: PHY Reset would not complete.\n",
@@ -446,15 +460,15 @@ static int b44_setup_phy(struct b44 *bp)
u32 val;
int err;
- if ((err = b44_readphy(bp, B44_MII_ALEDCTRL, &val)) != 0)
+ if ((err = b44_readphy(bp, B44_MII_ALEDCTRL, &val, 0)) != 0)
goto out;
if ((err = b44_writephy(bp, B44_MII_ALEDCTRL,
- val & MII_ALEDCTRL_ALLMSK)) != 0)
+ val & MII_ALEDCTRL_ALLMSK, 0)) != 0)
goto out;
- if ((err = b44_readphy(bp, B44_MII_TLEDCTRL, &val)) != 0)
+ if ((err = b44_readphy(bp, B44_MII_TLEDCTRL, &val, 0)) != 0)
goto out;
if ((err = b44_writephy(bp, B44_MII_TLEDCTRL,
- val | MII_TLEDCTRL_ENABLE)) != 0)
+ val | MII_TLEDCTRL_ENABLE, 0)) != 0)
goto out;
if (!(bp->flags & B44_FLAG_FORCE_LINK)) {
@@ -472,22 +486,22 @@ static int b44_setup_phy(struct b44 *bp)
if (bp->flags & B44_FLAG_PAUSE_AUTO)
adv |= ADVERTISE_PAUSE_CAP | ADVERTISE_PAUSE_ASYM;
- if ((err = b44_writephy(bp, MII_ADVERTISE, adv)) != 0)
+ if ((err = b44_writephy(bp, MII_ADVERTISE, adv, 0)) != 0)
goto out;
if ((err = b44_writephy(bp, MII_BMCR, (BMCR_ANENABLE |
- BMCR_ANRESTART))) != 0)
+ BMCR_ANRESTART), 0)) != 0)
goto out;
} else {
u32 bmcr;
- if ((err = b44_readphy(bp, MII_BMCR, &bmcr)) != 0)
+ if ((err = b44_readphy(bp, MII_BMCR, &bmcr, 0)) != 0)
goto out;
bmcr &= ~(BMCR_FULLDPLX | BMCR_ANENABLE | BMCR_SPEED100);
if (bp->flags & B44_FLAG_100_BASE_T)
bmcr |= BMCR_SPEED100;
if (bp->flags & B44_FLAG_FULL_DUPLEX)
bmcr |= BMCR_FULLDPLX;
- if ((err = b44_writephy(bp, MII_BMCR, bmcr)) != 0)
+ if ((err = b44_writephy(bp, MII_BMCR, bmcr, 0)) != 0)
goto out;
/* Since we will not be negotiating there is no safe way
@@ -541,8 +555,8 @@ static void b44_check_phy(struct b44 *bp
{
u32 bmsr, aux;
- if (!b44_readphy(bp, MII_BMSR, &bmsr) &&
- !b44_readphy(bp, B44_MII_AUXCTRL, &aux) &&
+ if (!b44_readphy(bp, MII_BMSR, &bmsr, 0) &&
+ !b44_readphy(bp, B44_MII_AUXCTRL, &aux, 0) &&
(bmsr != 0xffff)) {
if (aux & MII_AUXCTRL_SPEED)
bp->flags |= B44_FLAG_100_BASE_T;
@@ -565,8 +579,8 @@ static void b44_check_phy(struct b44 *bp
bw32(bp, B44_TX_CTRL, val);
if (!(bp->flags & B44_FLAG_FORCE_LINK) &&
- !b44_readphy(bp, MII_ADVERTISE, &local_adv) &&
- !b44_readphy(bp, MII_LPA, &remote_adv))
+ !b44_readphy(bp, MII_ADVERTISE, &local_adv, 0) &&
+ !b44_readphy(bp, MII_LPA, &remote_adv, 0))
b44_set_flow_ctrl(bp, local_adv, remote_adv);
/* Link now up */
@@ -1766,12 +1780,12 @@ static int b44_nway_reset(struct net_dev
int r;
spin_lock_irq(&bp->lock);
- b44_readphy(bp, MII_BMCR, &bmcr);
- b44_readphy(bp, MII_BMCR, &bmcr);
+ b44_readphy(bp, MII_BMCR, &bmcr, 0);
+ b44_readphy(bp, MII_BMCR, &bmcr, 0);
r = -EINVAL;
if (bmcr & BMCR_ANENABLE) {
b44_writephy(bp, MII_BMCR,
- bmcr | BMCR_ANRESTART);
+ bmcr | BMCR_ANRESTART, 0);
r = 0;
}
spin_unlock_irq(&bp->lock);
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
[Index of Archives]
[Kernel Newbies]
[Netfilter]
[Bugtraq]
[Photo]
[Stuff]
[Gimp]
[Yosemite News]
[MIPS Linux]
[ARM Linux]
[Linux Security]
[Linux RAID]
[Video 4 Linux]
[Linux for the blind]
[Linux Resources]