summaryrefslogtreecommitdiff
path: root/polux
diff options
context:
space:
mode:
Diffstat (limited to 'polux')
-rw-r--r--polux/linux-2.6.10/drivers/net/synop3504/synop3504.c107
1 files changed, 74 insertions, 33 deletions
diff --git a/polux/linux-2.6.10/drivers/net/synop3504/synop3504.c b/polux/linux-2.6.10/drivers/net/synop3504/synop3504.c
index 3a0a86e08a..b5ac4519da 100644
--- a/polux/linux-2.6.10/drivers/net/synop3504/synop3504.c
+++ b/polux/linux-2.6.10/drivers/net/synop3504/synop3504.c
@@ -115,6 +115,18 @@ typedef struct PrivateStruct
struct SynopsysMacReg macreg;
} Private;
+typedef enum synop3504_speed
+{
+ SYNOP3504_SPEED_10,
+ SYNOP3504_SPEED_100,
+} synop3504_speed;
+
+typedef enum synop3504_duplex
+{
+ SYNOP3504_DUPLEX_HALF,
+ SYNOP3504_DUPLEX_FULL,
+} synop3504_duplex;
+
static uint32_t phy_modes = ADVERTISE_10HALF | ADVERTISE_10FULL
| ADVERTISE_100HALF | ADVERTISE_100FULL;
static int eth_duplex_mode = 0;
@@ -325,49 +337,76 @@ int_handler (int int_num, void *dev_id, struct pt_regs *regs)
}
/**
- * Function : synop3504_init_mac_register
+ * Function : synop3504_hw_config_update
* Purpose : Set default options of synopsys MAC IP.
* Parameters : dev->network device structure
* Return value : error code.
*/
static void
-synop3504_init_mac_register (struct net_device *dev)
+synop3504_hw_config_update (struct net_device *dev)
{
Private *pr = (Private *) dev->priv;
Synopsys *tc = &pr->synopsys;
- uint32_t data;
- int fdx;
-
- switch (pr->OUI_model)
+ unsigned int bmcr;
+ synop3504_duplex mode = SYNOP3504_DUPLEX_FULL;
+ synop3504_speed speed = SYNOP3504_SPEED_100;
+
+ bmcr = SynopsysMiiRead (tc, MII_BMCR,
+ AUTOMATIC_PHY_RESOLUTION);
+ /* Is autoneg enabled. */
+ if (bmcr & BMCR_ANENABLE)
{
- case ICS_1893BF:
- case ICS_1893CF:
- data = SynopsysMiiRead (tc, MII_QPDSR, AUTOMATIC_PHY_RESOLUTION);
- fdx = data & QPDSR_FULLDPLX;
- break;
-
- case MICREL_KS8721:
- //using PHYCTRL instead of BMCR
- data = SynopsysMiiRead (tc, MII_PHYCTRL, AUTOMATIC_PHY_RESOLUTION);
- fdx = (data & PHYCTRL_OP_MODE) == PHYCTRL_OM_10FULL
- || (data & PHYCTRL_OP_MODE) == PHYCTRL_OM_100FULL;
- break;
-
- case VITESSE_VSC8601:
- case REALTEK_RTL8201CP:
- case ICPLUS_IP101A:
- case JVA_1893BF:
- case ICPLUS_IP175C:
- case ICPLUS_IP175D:
- default:
- /* BMCR duplex status after autonegotiation is not standard : works on
- * RTL8201CP */
- data = SynopsysMiiRead (tc, MII_BMCR, AUTOMATIC_PHY_RESOLUTION);
- fdx = data & BMCR_FULLDPLX;
- break;
+ int adv;
+ int lpa;
+ /* Get the advertise register. */
+ adv = SynopsysMiiRead (tc, MII_ADVERTISE,
+ AUTOMATIC_PHY_RESOLUTION);
+ /* Get the link partner advertise. */
+ lpa = SynopsysMiiRead (tc, MII_LPA,
+ AUTOMATIC_PHY_RESOLUTION);
+ lpa &= adv;
+ /* We can get the speed and mode.
+ * Speed and mode is on bits 5 to 9 */
+ if (lpa & LPA_100FULL)
+ {
+ speed = SYNOP3504_SPEED_100;
+ mode = SYNOP3504_DUPLEX_FULL;
+ }
+ else if (lpa & LPA_100HALF)
+ {
+ speed = SYNOP3504_SPEED_100;
+ mode = SYNOP3504_DUPLEX_HALF;
+ }
+ else if (lpa & LPA_10FULL)
+ {
+ speed = SYNOP3504_SPEED_10;
+ mode = SYNOP3504_DUPLEX_FULL;
+ }
+ else if (lpa & LPA_10HALF)
+ {
+ speed = SYNOP3504_SPEED_10;
+ mode = SYNOP3504_DUPLEX_HALF;
+ }
+ }
+ /* Auto neg is not enabled in control register. */
+ else
+ {
+ /* Mode. */
+ if (bmcr & BMCR_FULLDPLX)
+ {
+ mode = SYNOP3504_DUPLEX_FULL;
+ speed = (bmcr & BMCR_SPEED100) ? SYNOP3504_SPEED_100
+ : SYNOP3504_SPEED_10;
+ }
+ else
+ {
+ mode = SYNOP3504_DUPLEX_HALF;
+ speed = (bmcr & BMCR_SPEED100) ? SYNOP3504_SPEED_100
+ : SYNOP3504_SPEED_10;
+ }
}
- if (fdx)
+ if (mode == SYNOP3504_DUPLEX_FULL)
{
SynopsysWriteMacReg (tc, GmacConfig, GmacConfigInitFdx110);
SynopsysWriteMacReg (tc, GmacFrameFilter, GmacFrameFilterInitFdx);
@@ -381,6 +420,8 @@ synop3504_init_mac_register (struct net_device *dev)
SynopsysWriteMacReg (tc, GmacFlowControl, GmacFlowControlInitHdx);
SynopsysWriteMacReg (tc, GmacGmiiAddr, GmacGmiiAddrInitHdx);
}
+ /* Set hardware clock. */
+ synop3504_hw_set_speed (pr->minor, ((speed | mode) & 0x0008));
}
/**
@@ -1228,7 +1269,7 @@ synop3504_timer (unsigned long data)
netif_carrier_on (dev);
netif_wake_queue (dev);
//set default config into hardware
- synop3504_init_mac_register (dev);
+ synop3504_mac_config (dev);
//store the config saved before for promiscuous mode multicast....
SynopsysWriteMacReg (tc, GmacFrameFilter,
pr->macreg.GmacFrameFilter);