Commit 5b511916 authored by Al Viro's avatar Al Viro Committed by Jeff Garzik

dl2k: MSCR, MSSR, ESR, PHY_SCR fixes

Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
Signed-off-by: default avatarJeff Garzik <jeff@garzik.org>
parent 96d76851
...@@ -1455,8 +1455,8 @@ mii_get_media (struct net_device *dev) ...@@ -1455,8 +1455,8 @@ mii_get_media (struct net_device *dev)
{ {
__u16 negotiate; __u16 negotiate;
__u16 bmsr; __u16 bmsr;
MSCR_t mscr; __u16 mscr;
MSSR_t mssr; __u16 mssr;
int phy_addr; int phy_addr;
struct netdev_private *np; struct netdev_private *np;
...@@ -1471,13 +1471,13 @@ mii_get_media (struct net_device *dev) ...@@ -1471,13 +1471,13 @@ mii_get_media (struct net_device *dev)
} }
negotiate = mii_read (dev, phy_addr, MII_ANAR) & negotiate = mii_read (dev, phy_addr, MII_ANAR) &
mii_read (dev, phy_addr, MII_ANLPAR); mii_read (dev, phy_addr, MII_ANLPAR);
mscr.image = mii_read (dev, phy_addr, MII_MSCR); mscr = mii_read (dev, phy_addr, MII_MSCR);
mssr.image = mii_read (dev, phy_addr, MII_MSSR); mssr = mii_read (dev, phy_addr, MII_MSSR);
if (mscr.bits.media_1000BT_FD & mssr.bits.lp_1000BT_FD) { if (mscr & MII_MSCR_1000BT_FD && mssr & MII_MSSR_LP_1000BT_FD) {
np->speed = 1000; np->speed = 1000;
np->full_duplex = 1; np->full_duplex = 1;
printk (KERN_INFO "Auto 1000 Mbps, Full duplex\n"); printk (KERN_INFO "Auto 1000 Mbps, Full duplex\n");
} else if (mscr.bits.media_1000BT_HD & mssr.bits.lp_1000BT_HD) { } else if (mscr & MII_MSCR_1000BT_HD && mssr & MII_MSSR_LP_1000BT_HD) {
np->speed = 1000; np->speed = 1000;
np->full_duplex = 0; np->full_duplex = 0;
printk (KERN_INFO "Auto 1000 Mbps, Half duplex\n"); printk (KERN_INFO "Auto 1000 Mbps, Half duplex\n");
...@@ -1539,7 +1539,7 @@ mii_get_media (struct net_device *dev) ...@@ -1539,7 +1539,7 @@ mii_get_media (struct net_device *dev)
static int static int
mii_set_media (struct net_device *dev) mii_set_media (struct net_device *dev)
{ {
PHY_SCR_t pscr; __u16 pscr;
__u16 bmcr; __u16 bmcr;
__u16 bmsr; __u16 bmsr;
__u16 anar; __u16 anar;
...@@ -1572,9 +1572,9 @@ mii_set_media (struct net_device *dev) ...@@ -1572,9 +1572,9 @@ mii_set_media (struct net_device *dev)
mii_write (dev, phy_addr, MII_ANAR, anar); mii_write (dev, phy_addr, MII_ANAR, anar);
/* Enable Auto crossover */ /* Enable Auto crossover */
pscr.image = mii_read (dev, phy_addr, MII_PHY_SCR); pscr = mii_read (dev, phy_addr, MII_PHY_SCR);
pscr.bits.mdi_crossover_mode = 3; /* 11'b */ pscr |= 3 << 5; /* 11'b */
mii_write (dev, phy_addr, MII_PHY_SCR, pscr.image); mii_write (dev, phy_addr, MII_PHY_SCR, pscr);
/* Soft reset PHY */ /* Soft reset PHY */
mii_write (dev, phy_addr, MII_BMCR, MII_BMCR_RESET); mii_write (dev, phy_addr, MII_BMCR, MII_BMCR_RESET);
...@@ -1584,9 +1584,9 @@ mii_set_media (struct net_device *dev) ...@@ -1584,9 +1584,9 @@ mii_set_media (struct net_device *dev)
} else { } else {
/* Force speed setting */ /* Force speed setting */
/* 1) Disable Auto crossover */ /* 1) Disable Auto crossover */
pscr.image = mii_read (dev, phy_addr, MII_PHY_SCR); pscr = mii_read (dev, phy_addr, MII_PHY_SCR);
pscr.bits.mdi_crossover_mode = 0; pscr &= ~(3 << 5);
mii_write (dev, phy_addr, MII_PHY_SCR, pscr.image); mii_write (dev, phy_addr, MII_PHY_SCR, pscr);
/* 2) PHY Reset */ /* 2) PHY Reset */
bmcr = mii_read (dev, phy_addr, MII_BMCR); bmcr = mii_read (dev, phy_addr, MII_BMCR);
...@@ -1617,9 +1617,9 @@ mii_set_media (struct net_device *dev) ...@@ -1617,9 +1617,9 @@ mii_set_media (struct net_device *dev)
} }
#if 0 #if 0
/* Set 1000BaseT Master/Slave setting */ /* Set 1000BaseT Master/Slave setting */
mscr.image = mii_read (dev, phy_addr, MII_MSCR); mscr = mii_read (dev, phy_addr, MII_MSCR);
mscr.bits.cfg_enable = 1; mscr |= MII_MSCR_CFG_ENABLE;
mscr.bits.cfg_value = 0; mscr &= ~MII_MSCR_CFG_VALUE = 0;
#endif #endif
mii_write (dev, phy_addr, MII_BMCR, bmcr); mii_write (dev, phy_addr, MII_BMCR, bmcr);
mdelay(10); mdelay(10);
...@@ -1687,7 +1687,7 @@ static int ...@@ -1687,7 +1687,7 @@ static int
mii_set_media_pcs (struct net_device *dev) mii_set_media_pcs (struct net_device *dev)
{ {
__u16 bmcr; __u16 bmcr;
ESR_t esr; __u16 esr;
__u16 anar; __u16 anar;
int phy_addr; int phy_addr;
struct netdev_private *np; struct netdev_private *np;
...@@ -1697,13 +1697,13 @@ mii_set_media_pcs (struct net_device *dev) ...@@ -1697,13 +1697,13 @@ mii_set_media_pcs (struct net_device *dev)
/* Auto-Negotiation? */ /* Auto-Negotiation? */
if (np->an_enable) { if (np->an_enable) {
/* Advertise capabilities */ /* Advertise capabilities */
esr.image = mii_read (dev, phy_addr, PCS_ESR); esr = mii_read (dev, phy_addr, PCS_ESR);
anar = mii_read (dev, phy_addr, MII_ANAR) & anar = mii_read (dev, phy_addr, MII_ANAR) &
~PCS_ANAR_HALF_DUPLEX & ~PCS_ANAR_HALF_DUPLEX &
~PCS_ANAR_FULL_DUPLEX; ~PCS_ANAR_FULL_DUPLEX;
if (esr.bits.media_1000BT_HD | esr.bits.media_1000BX_HD) if (esr & (MII_ESR_1000BT_HD | MII_ESR_1000BX_HD))
anar |= PCS_ANAR_HALF_DUPLEX; anar |= PCS_ANAR_HALF_DUPLEX;
if (esr.bits.media_1000BT_FD | esr.bits.media_1000BX_FD) if (esr & (MII_ESR_1000BT_FD | MII_ESR_1000BX_FD))
anar |= PCS_ANAR_FULL_DUPLEX; anar |= PCS_ANAR_FULL_DUPLEX;
anar |= PCS_ANAR_PAUSE | PCS_ANAR_ASYMMETRIC; anar |= PCS_ANAR_PAUSE | PCS_ANAR_ASYMMETRIC;
mii_write (dev, phy_addr, MII_ANAR, anar); mii_write (dev, phy_addr, MII_ANAR, anar);
......
...@@ -385,19 +385,6 @@ enum _mii_aner { ...@@ -385,19 +385,6 @@ enum _mii_aner {
}; };
/* MASTER-SLAVE Control Register */ /* MASTER-SLAVE Control Register */
typedef union t_MII_MSCR {
u16 image;
struct {
u16 _bit_7_0:8; // bit 7:0
u16 media_1000BT_HD:1; // bit 8
u16 media_1000BT_FD:1; // bit 9
u16 port_type:1; // bit 10
u16 cfg_value:1; // bit 11
u16 cfg_enable:1; // bit 12
u16 test_mode:3; // bit 15:13
} bits;
} MSCR_t, *PMSCR_t;
enum _mii_mscr { enum _mii_mscr {
MII_MSCR_TEST_MODE = 0xe000, MII_MSCR_TEST_MODE = 0xe000,
MII_MSCR_CFG_ENABLE = 0x1000, MII_MSCR_CFG_ENABLE = 0x1000,
...@@ -408,20 +395,6 @@ enum _mii_mscr { ...@@ -408,20 +395,6 @@ enum _mii_mscr {
}; };
/* MASTER-SLAVE Status Register */ /* MASTER-SLAVE Status Register */
typedef union t_MII_MSSR {
u16 image;
struct {
u16 idle_err_count:8; // bit 7:0
u16 _bit_9_8:2; // bit 9:8
u16 lp_1000BT_HD:1; // bit 10
u16 lp_1000BT_FD:1; // bit 11
u16 remote_rcv_status:1; // bit 12
u16 local_rcv_status:1; // bit 13
u16 cfg_resolution:1; // bit 14
u16 cfg_fault:1; // bit 15
} bits;
} MSSR_t, *PMSSR_t;
enum _mii_mssr { enum _mii_mssr {
MII_MSSR_CFG_FAULT = 0x8000, MII_MSSR_CFG_FAULT = 0x8000,
MII_MSSR_CFG_RES = 0x4000, MII_MSSR_CFG_RES = 0x4000,
...@@ -433,17 +406,6 @@ enum _mii_mssr { ...@@ -433,17 +406,6 @@ enum _mii_mssr {
}; };
/* IEEE Extened Status Register */ /* IEEE Extened Status Register */
typedef union t_MII_ESR {
u16 image;
struct {
u16 _bit_11_0:12; // bit 11:0
u16 media_1000BT_HD:2; // bit 12
u16 media_1000BT_FD:1; // bit 13
u16 media_1000BX_HD:1; // bit 14
u16 media_1000BX_FD:1; // bit 15
} bits;
} ESR_t, *PESR_t;
enum _mii_esr { enum _mii_esr {
MII_ESR_1000BX_FD = 0x8000, MII_ESR_1000BX_FD = 0x8000,
MII_ESR_1000BX_HD = 0x4000, MII_ESR_1000BX_HD = 0x4000,
...@@ -451,6 +413,7 @@ enum _mii_esr { ...@@ -451,6 +413,7 @@ enum _mii_esr {
MII_ESR_1000BT_HD = 0x1000, MII_ESR_1000BT_HD = 0x1000,
}; };
/* PHY Specific Control Register */ /* PHY Specific Control Register */
#if 0
typedef union t_MII_PHY_SCR { typedef union t_MII_PHY_SCR {
u16 image; u16 image;
struct { struct {
...@@ -468,6 +431,7 @@ typedef union t_MII_PHY_SCR { ...@@ -468,6 +431,7 @@ typedef union t_MII_PHY_SCR {
u16 xmit_fifo_depth:2; // bit 15:14 u16 xmit_fifo_depth:2; // bit 15:14
} bits; } bits;
} PHY_SCR_t, *PPHY_SCR_t; } PHY_SCR_t, *PPHY_SCR_t;
#endif
typedef enum t_MII_ADMIN_STATUS { typedef enum t_MII_ADMIN_STATUS {
adm_reset, adm_reset,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment