diff options
Diffstat (limited to 'drivers/net/dl2k.c')
| -rw-r--r-- | drivers/net/dl2k.c | 215 |
1 files changed, 107 insertions, 108 deletions
diff --git a/drivers/net/dl2k.c b/drivers/net/dl2k.c index 47cce9cad30f..e233d04a2132 100644 --- a/drivers/net/dl2k.c +++ b/drivers/net/dl2k.c | |||
| @@ -1316,9 +1316,10 @@ rio_ioctl (struct net_device *dev, struct ifreq *rq, int cmd) | |||
| 1316 | ("%02x:cur:%08x next:%08x status:%08x frag1:%08x frag0:%08x", | 1316 | ("%02x:cur:%08x next:%08x status:%08x frag1:%08x frag0:%08x", |
| 1317 | i, | 1317 | i, |
| 1318 | (u32) (np->tx_ring_dma + i * sizeof (*desc)), | 1318 | (u32) (np->tx_ring_dma + i * sizeof (*desc)), |
| 1319 | (u32) desc->next_desc, | 1319 | (u32)le64_to_cpu(desc->next_desc), |
| 1320 | (u32) desc->status, (u32) (desc->fraginfo >> 32), | 1320 | (u32)le64_to_cpu(desc->status), |
| 1321 | (u32) desc->fraginfo); | 1321 | (u32)(le64_to_cpu(desc->fraginfo) >> 32), |
| 1322 | (u32)le64_to_cpu(desc->fraginfo)); | ||
| 1322 | printk ("\n"); | 1323 | printk ("\n"); |
| 1323 | } | 1324 | } |
| 1324 | printk ("\n"); | 1325 | printk ("\n"); |
| @@ -1435,7 +1436,7 @@ mii_write (struct net_device *dev, int phy_addr, int reg_num, u16 data) | |||
| 1435 | static int | 1436 | static int |
| 1436 | mii_wait_link (struct net_device *dev, int wait) | 1437 | mii_wait_link (struct net_device *dev, int wait) |
| 1437 | { | 1438 | { |
| 1438 | BMSR_t bmsr; | 1439 | __u16 bmsr; |
| 1439 | int phy_addr; | 1440 | int phy_addr; |
| 1440 | struct netdev_private *np; | 1441 | struct netdev_private *np; |
| 1441 | 1442 | ||
| @@ -1443,8 +1444,8 @@ mii_wait_link (struct net_device *dev, int wait) | |||
| 1443 | phy_addr = np->phy_addr; | 1444 | phy_addr = np->phy_addr; |
| 1444 | 1445 | ||
| 1445 | do { | 1446 | do { |
| 1446 | bmsr.image = mii_read (dev, phy_addr, MII_BMSR); | 1447 | bmsr = mii_read (dev, phy_addr, MII_BMSR); |
| 1447 | if (bmsr.bits.link_status) | 1448 | if (bmsr & MII_BMSR_LINK_STATUS) |
| 1448 | return 0; | 1449 | return 0; |
| 1449 | mdelay (1); | 1450 | mdelay (1); |
| 1450 | } while (--wait > 0); | 1451 | } while (--wait > 0); |
| @@ -1453,70 +1454,72 @@ mii_wait_link (struct net_device *dev, int wait) | |||
| 1453 | static int | 1454 | static int |
| 1454 | mii_get_media (struct net_device *dev) | 1455 | mii_get_media (struct net_device *dev) |
| 1455 | { | 1456 | { |
| 1456 | ANAR_t negotiate; | 1457 | __u16 negotiate; |
| 1457 | BMSR_t bmsr; | 1458 | __u16 bmsr; |
| 1458 | BMCR_t bmcr; | 1459 | __u16 mscr; |
| 1459 | MSCR_t mscr; | 1460 | __u16 mssr; |
| 1460 | MSSR_t mssr; | ||
| 1461 | int phy_addr; | 1461 | int phy_addr; |
| 1462 | struct netdev_private *np; | 1462 | struct netdev_private *np; |
| 1463 | 1463 | ||
| 1464 | np = netdev_priv(dev); | 1464 | np = netdev_priv(dev); |
| 1465 | phy_addr = np->phy_addr; | 1465 | phy_addr = np->phy_addr; |
| 1466 | 1466 | ||
| 1467 | bmsr.image = mii_read (dev, phy_addr, MII_BMSR); | 1467 | bmsr = mii_read (dev, phy_addr, MII_BMSR); |
| 1468 | if (np->an_enable) { | 1468 | if (np->an_enable) { |
| 1469 | if (!bmsr.bits.an_complete) { | 1469 | if (!(bmsr & MII_BMSR_AN_COMPLETE)) { |
| 1470 | /* Auto-Negotiation not completed */ | 1470 | /* Auto-Negotiation not completed */ |
| 1471 | return -1; | 1471 | return -1; |
| 1472 | } | 1472 | } |
| 1473 | negotiate.image = mii_read (dev, phy_addr, MII_ANAR) & | 1473 | negotiate = mii_read (dev, phy_addr, MII_ANAR) & |
| 1474 | mii_read (dev, phy_addr, MII_ANLPAR); | 1474 | mii_read (dev, phy_addr, MII_ANLPAR); |
| 1475 | mscr.image = mii_read (dev, phy_addr, MII_MSCR); | 1475 | mscr = mii_read (dev, phy_addr, MII_MSCR); |
| 1476 | mssr.image = mii_read (dev, phy_addr, MII_MSSR); | 1476 | mssr = mii_read (dev, phy_addr, MII_MSSR); |
| 1477 | if (mscr.bits.media_1000BT_FD & mssr.bits.lp_1000BT_FD) { | 1477 | if (mscr & MII_MSCR_1000BT_FD && mssr & MII_MSSR_LP_1000BT_FD) { |
| 1478 | np->speed = 1000; | 1478 | np->speed = 1000; |
| 1479 | np->full_duplex = 1; | 1479 | np->full_duplex = 1; |
| 1480 | printk (KERN_INFO "Auto 1000 Mbps, Full duplex\n"); | 1480 | printk (KERN_INFO "Auto 1000 Mbps, Full duplex\n"); |
| 1481 | } else if (mscr.bits.media_1000BT_HD & mssr.bits.lp_1000BT_HD) { | 1481 | } else if (mscr & MII_MSCR_1000BT_HD && mssr & MII_MSSR_LP_1000BT_HD) { |
| 1482 | np->speed = 1000; | 1482 | np->speed = 1000; |
| 1483 | np->full_duplex = 0; | 1483 | np->full_duplex = 0; |
| 1484 | printk (KERN_INFO "Auto 1000 Mbps, Half duplex\n"); | 1484 | printk (KERN_INFO "Auto 1000 Mbps, Half duplex\n"); |
| 1485 | } else if (negotiate.bits.media_100BX_FD) { | 1485 | } else if (negotiate & MII_ANAR_100BX_FD) { |
| 1486 | np->speed = 100; | 1486 | np->speed = 100; |
| 1487 | np->full_duplex = 1; | 1487 | np->full_duplex = 1; |
| 1488 | printk (KERN_INFO "Auto 100 Mbps, Full duplex\n"); | 1488 | printk (KERN_INFO "Auto 100 Mbps, Full duplex\n"); |
| 1489 | } else if (negotiate.bits.media_100BX_HD) { | 1489 | } else if (negotiate & MII_ANAR_100BX_HD) { |
| 1490 | np->speed = 100; | 1490 | np->speed = 100; |
| 1491 | np->full_duplex = 0; | 1491 | np->full_duplex = 0; |
| 1492 | printk (KERN_INFO "Auto 100 Mbps, Half duplex\n"); | 1492 | printk (KERN_INFO "Auto 100 Mbps, Half duplex\n"); |
| 1493 | } else if (negotiate.bits.media_10BT_FD) { | 1493 | } else if (negotiate & MII_ANAR_10BT_FD) { |
| 1494 | np->speed = 10; | 1494 | np->speed = 10; |
| 1495 | np->full_duplex = 1; | 1495 | np->full_duplex = 1; |
| 1496 | printk (KERN_INFO "Auto 10 Mbps, Full duplex\n"); | 1496 | printk (KERN_INFO "Auto 10 Mbps, Full duplex\n"); |
| 1497 | } else if (negotiate.bits.media_10BT_HD) { | 1497 | } else if (negotiate & MII_ANAR_10BT_HD) { |
| 1498 | np->speed = 10; | 1498 | np->speed = 10; |
| 1499 | np->full_duplex = 0; | 1499 | np->full_duplex = 0; |
| 1500 | printk (KERN_INFO "Auto 10 Mbps, Half duplex\n"); | 1500 | printk (KERN_INFO "Auto 10 Mbps, Half duplex\n"); |
| 1501 | } | 1501 | } |
| 1502 | if (negotiate.bits.pause) { | 1502 | if (negotiate & MII_ANAR_PAUSE) { |
| 1503 | np->tx_flow &= 1; | 1503 | np->tx_flow &= 1; |
| 1504 | np->rx_flow &= 1; | 1504 | np->rx_flow &= 1; |
| 1505 | } else if (negotiate.bits.asymmetric) { | 1505 | } else if (negotiate & MII_ANAR_ASYMMETRIC) { |
| 1506 | np->tx_flow = 0; | 1506 | np->tx_flow = 0; |
| 1507 | np->rx_flow &= 1; | 1507 | np->rx_flow &= 1; |
| 1508 | } | 1508 | } |
| 1509 | /* else tx_flow, rx_flow = user select */ | 1509 | /* else tx_flow, rx_flow = user select */ |
| 1510 | } else { | 1510 | } else { |
| 1511 | bmcr.image = mii_read (dev, phy_addr, MII_BMCR); | 1511 | __u16 bmcr = mii_read (dev, phy_addr, MII_BMCR); |
| 1512 | if (bmcr.bits.speed100 == 1 && bmcr.bits.speed1000 == 0) { | 1512 | switch (bmcr & (MII_BMCR_SPEED_100 | MII_BMCR_SPEED_1000)) { |
| 1513 | case MII_BMCR_SPEED_1000: | ||
| 1514 | printk (KERN_INFO "Operating at 1000 Mbps, "); | ||
| 1515 | break; | ||
| 1516 | case MII_BMCR_SPEED_100: | ||
| 1513 | printk (KERN_INFO "Operating at 100 Mbps, "); | 1517 | printk (KERN_INFO "Operating at 100 Mbps, "); |
| 1514 | } else if (bmcr.bits.speed100 == 0 && bmcr.bits.speed1000 == 0) { | 1518 | break; |
| 1519 | case 0: | ||
| 1515 | printk (KERN_INFO "Operating at 10 Mbps, "); | 1520 | printk (KERN_INFO "Operating at 10 Mbps, "); |
| 1516 | } else if (bmcr.bits.speed100 == 0 && bmcr.bits.speed1000 == 1) { | ||
| 1517 | printk (KERN_INFO "Operating at 1000 Mbps, "); | ||
| 1518 | } | 1521 | } |
| 1519 | if (bmcr.bits.duplex_mode) { | 1522 | if (bmcr & MII_BMCR_DUPLEX_MODE) { |
| 1520 | printk ("Full duplex\n"); | 1523 | printk ("Full duplex\n"); |
| 1521 | } else { | 1524 | } else { |
| 1522 | printk ("Half duplex\n"); | 1525 | printk ("Half duplex\n"); |
| @@ -1537,10 +1540,10 @@ mii_get_media (struct net_device *dev) | |||
| 1537 | static int | 1540 | static int |
| 1538 | mii_set_media (struct net_device *dev) | 1541 | mii_set_media (struct net_device *dev) |
| 1539 | { | 1542 | { |
| 1540 | PHY_SCR_t pscr; | 1543 | __u16 pscr; |
| 1541 | BMCR_t bmcr; | 1544 | __u16 bmcr; |
| 1542 | BMSR_t bmsr; | 1545 | __u16 bmsr; |
| 1543 | ANAR_t anar; | 1546 | __u16 anar; |
| 1544 | int phy_addr; | 1547 | int phy_addr; |
| 1545 | struct netdev_private *np; | 1548 | struct netdev_private *np; |
| 1546 | np = netdev_priv(dev); | 1549 | np = netdev_priv(dev); |
| @@ -1549,76 +1552,77 @@ mii_set_media (struct net_device *dev) | |||
| 1549 | /* Does user set speed? */ | 1552 | /* Does user set speed? */ |
| 1550 | if (np->an_enable) { | 1553 | if (np->an_enable) { |
| 1551 | /* Advertise capabilities */ | 1554 | /* Advertise capabilities */ |
| 1552 | bmsr.image = mii_read (dev, phy_addr, MII_BMSR); | 1555 | bmsr = mii_read (dev, phy_addr, MII_BMSR); |
| 1553 | anar.image = mii_read (dev, phy_addr, MII_ANAR); | 1556 | anar = mii_read (dev, phy_addr, MII_ANAR) & |
| 1554 | anar.bits.media_100BX_FD = bmsr.bits.media_100BX_FD; | 1557 | ~MII_ANAR_100BX_FD & |
| 1555 | anar.bits.media_100BX_HD = bmsr.bits.media_100BX_HD; | 1558 | ~MII_ANAR_100BX_HD & |
| 1556 | anar.bits.media_100BT4 = bmsr.bits.media_100BT4; | 1559 | ~MII_ANAR_100BT4 & |
| 1557 | anar.bits.media_10BT_FD = bmsr.bits.media_10BT_FD; | 1560 | ~MII_ANAR_10BT_FD & |
| 1558 | anar.bits.media_10BT_HD = bmsr.bits.media_10BT_HD; | 1561 | ~MII_ANAR_10BT_HD; |
| 1559 | anar.bits.pause = 1; | 1562 | if (bmsr & MII_BMSR_100BX_FD) |
| 1560 | anar.bits.asymmetric = 1; | 1563 | anar |= MII_ANAR_100BX_FD; |
| 1561 | mii_write (dev, phy_addr, MII_ANAR, anar.image); | 1564 | if (bmsr & MII_BMSR_100BX_HD) |
| 1565 | anar |= MII_ANAR_100BX_HD; | ||
| 1566 | if (bmsr & MII_BMSR_100BT4) | ||
| 1567 | anar |= MII_ANAR_100BT4; | ||
| 1568 | if (bmsr & MII_BMSR_10BT_FD) | ||
| 1569 | anar |= MII_ANAR_10BT_FD; | ||
| 1570 | if (bmsr & MII_BMSR_10BT_HD) | ||
| 1571 | anar |= MII_ANAR_10BT_HD; | ||
| 1572 | anar |= MII_ANAR_PAUSE | MII_ANAR_ASYMMETRIC; | ||
| 1573 | mii_write (dev, phy_addr, MII_ANAR, anar); | ||
| 1562 | 1574 | ||
| 1563 | /* Enable Auto crossover */ | 1575 | /* Enable Auto crossover */ |
| 1564 | pscr.image = mii_read (dev, phy_addr, MII_PHY_SCR); | 1576 | pscr = mii_read (dev, phy_addr, MII_PHY_SCR); |
| 1565 | pscr.bits.mdi_crossover_mode = 3; /* 11'b */ | 1577 | pscr |= 3 << 5; /* 11'b */ |
| 1566 | mii_write (dev, phy_addr, MII_PHY_SCR, pscr.image); | 1578 | mii_write (dev, phy_addr, MII_PHY_SCR, pscr); |
| 1567 | 1579 | ||
| 1568 | /* Soft reset PHY */ | 1580 | /* Soft reset PHY */ |
| 1569 | mii_write (dev, phy_addr, MII_BMCR, MII_BMCR_RESET); | 1581 | mii_write (dev, phy_addr, MII_BMCR, MII_BMCR_RESET); |
| 1570 | bmcr.image = 0; | 1582 | bmcr = MII_BMCR_AN_ENABLE | MII_BMCR_RESTART_AN | MII_BMCR_RESET; |
| 1571 | bmcr.bits.an_enable = 1; | 1583 | mii_write (dev, phy_addr, MII_BMCR, bmcr); |
| 1572 | bmcr.bits.restart_an = 1; | ||
| 1573 | bmcr.bits.reset = 1; | ||
| 1574 | mii_write (dev, phy_addr, MII_BMCR, bmcr.image); | ||
| 1575 | mdelay(1); | 1584 | mdelay(1); |
| 1576 | } else { | 1585 | } else { |
| 1577 | /* Force speed setting */ | 1586 | /* Force speed setting */ |
| 1578 | /* 1) Disable Auto crossover */ | 1587 | /* 1) Disable Auto crossover */ |
| 1579 | pscr.image = mii_read (dev, phy_addr, MII_PHY_SCR); | 1588 | pscr = mii_read (dev, phy_addr, MII_PHY_SCR); |
| 1580 | pscr.bits.mdi_crossover_mode = 0; | 1589 | pscr &= ~(3 << 5); |
| 1581 | mii_write (dev, phy_addr, MII_PHY_SCR, pscr.image); | 1590 | mii_write (dev, phy_addr, MII_PHY_SCR, pscr); |
| 1582 | 1591 | ||
| 1583 | /* 2) PHY Reset */ | 1592 | /* 2) PHY Reset */ |
| 1584 | bmcr.image = mii_read (dev, phy_addr, MII_BMCR); | 1593 | bmcr = mii_read (dev, phy_addr, MII_BMCR); |
| 1585 | bmcr.bits.reset = 1; | 1594 | bmcr |= MII_BMCR_RESET; |
| 1586 | mii_write (dev, phy_addr, MII_BMCR, bmcr.image); | 1595 | mii_write (dev, phy_addr, MII_BMCR, bmcr); |
| 1587 | 1596 | ||
| 1588 | /* 3) Power Down */ | 1597 | /* 3) Power Down */ |
| 1589 | bmcr.image = 0x1940; /* must be 0x1940 */ | 1598 | bmcr = 0x1940; /* must be 0x1940 */ |
| 1590 | mii_write (dev, phy_addr, MII_BMCR, bmcr.image); | 1599 | mii_write (dev, phy_addr, MII_BMCR, bmcr); |
| 1591 | mdelay (100); /* wait a certain time */ | 1600 | mdelay (100); /* wait a certain time */ |
| 1592 | 1601 | ||
| 1593 | /* 4) Advertise nothing */ | 1602 | /* 4) Advertise nothing */ |
| 1594 | mii_write (dev, phy_addr, MII_ANAR, 0); | 1603 | mii_write (dev, phy_addr, MII_ANAR, 0); |
| 1595 | 1604 | ||
| 1596 | /* 5) Set media and Power Up */ | 1605 | /* 5) Set media and Power Up */ |
| 1597 | bmcr.image = 0; | 1606 | bmcr = MII_BMCR_POWER_DOWN; |
| 1598 | bmcr.bits.power_down = 1; | ||
| 1599 | if (np->speed == 100) { | 1607 | if (np->speed == 100) { |
| 1600 | bmcr.bits.speed100 = 1; | 1608 | bmcr |= MII_BMCR_SPEED_100; |
| 1601 | bmcr.bits.speed1000 = 0; | ||
| 1602 | printk (KERN_INFO "Manual 100 Mbps, "); | 1609 | printk (KERN_INFO "Manual 100 Mbps, "); |
| 1603 | } else if (np->speed == 10) { | 1610 | } else if (np->speed == 10) { |
| 1604 | bmcr.bits.speed100 = 0; | ||
| 1605 | bmcr.bits.speed1000 = 0; | ||
| 1606 | printk (KERN_INFO "Manual 10 Mbps, "); | 1611 | printk (KERN_INFO "Manual 10 Mbps, "); |
| 1607 | } | 1612 | } |
| 1608 | if (np->full_duplex) { | 1613 | if (np->full_duplex) { |
| 1609 | bmcr.bits.duplex_mode = 1; | 1614 | bmcr |= MII_BMCR_DUPLEX_MODE; |
| 1610 | printk ("Full duplex\n"); | 1615 | printk ("Full duplex\n"); |
| 1611 | } else { | 1616 | } else { |
| 1612 | bmcr.bits.duplex_mode = 0; | ||
| 1613 | printk ("Half duplex\n"); | 1617 | printk ("Half duplex\n"); |
| 1614 | } | 1618 | } |
| 1615 | #if 0 | 1619 | #if 0 |
| 1616 | /* Set 1000BaseT Master/Slave setting */ | 1620 | /* Set 1000BaseT Master/Slave setting */ |
| 1617 | mscr.image = mii_read (dev, phy_addr, MII_MSCR); | 1621 | mscr = mii_read (dev, phy_addr, MII_MSCR); |
| 1618 | mscr.bits.cfg_enable = 1; | 1622 | mscr |= MII_MSCR_CFG_ENABLE; |
| 1619 | mscr.bits.cfg_value = 0; | 1623 | mscr &= ~MII_MSCR_CFG_VALUE = 0; |
| 1620 | #endif | 1624 | #endif |
| 1621 | mii_write (dev, phy_addr, MII_BMCR, bmcr.image); | 1625 | mii_write (dev, phy_addr, MII_BMCR, bmcr); |
| 1622 | mdelay(10); | 1626 | mdelay(10); |
| 1623 | } | 1627 | } |
| 1624 | return 0; | 1628 | return 0; |
| @@ -1627,43 +1631,42 @@ mii_set_media (struct net_device *dev) | |||
| 1627 | static int | 1631 | static int |
| 1628 | mii_get_media_pcs (struct net_device *dev) | 1632 | mii_get_media_pcs (struct net_device *dev) |
| 1629 | { | 1633 | { |
| 1630 | ANAR_PCS_t negotiate; | 1634 | __u16 negotiate; |
| 1631 | BMSR_t bmsr; | 1635 | __u16 bmsr; |
| 1632 | BMCR_t bmcr; | ||
| 1633 | int phy_addr; | 1636 | int phy_addr; |
| 1634 | struct netdev_private *np; | 1637 | struct netdev_private *np; |
| 1635 | 1638 | ||
| 1636 | np = netdev_priv(dev); | 1639 | np = netdev_priv(dev); |
| 1637 | phy_addr = np->phy_addr; | 1640 | phy_addr = np->phy_addr; |
| 1638 | 1641 | ||
| 1639 | bmsr.image = mii_read (dev, phy_addr, PCS_BMSR); | 1642 | bmsr = mii_read (dev, phy_addr, PCS_BMSR); |
| 1640 | if (np->an_enable) { | 1643 | if (np->an_enable) { |
| 1641 | if (!bmsr.bits.an_complete) { | 1644 | if (!(bmsr & MII_BMSR_AN_COMPLETE)) { |
| 1642 | /* Auto-Negotiation not completed */ | 1645 | /* Auto-Negotiation not completed */ |
| 1643 | return -1; | 1646 | return -1; |
| 1644 | } | 1647 | } |
| 1645 | negotiate.image = mii_read (dev, phy_addr, PCS_ANAR) & | 1648 | negotiate = mii_read (dev, phy_addr, PCS_ANAR) & |
| 1646 | mii_read (dev, phy_addr, PCS_ANLPAR); | 1649 | mii_read (dev, phy_addr, PCS_ANLPAR); |
| 1647 | np->speed = 1000; | 1650 | np->speed = 1000; |
| 1648 | if (negotiate.bits.full_duplex) { | 1651 | if (negotiate & PCS_ANAR_FULL_DUPLEX) { |
| 1649 | printk (KERN_INFO "Auto 1000 Mbps, Full duplex\n"); | 1652 | printk (KERN_INFO "Auto 1000 Mbps, Full duplex\n"); |
| 1650 | np->full_duplex = 1; | 1653 | np->full_duplex = 1; |
| 1651 | } else { | 1654 | } else { |
| 1652 | printk (KERN_INFO "Auto 1000 Mbps, half duplex\n"); | 1655 | printk (KERN_INFO "Auto 1000 Mbps, half duplex\n"); |
| 1653 | np->full_duplex = 0; | 1656 | np->full_duplex = 0; |
| 1654 | } | 1657 | } |
| 1655 | if (negotiate.bits.pause) { | 1658 | if (negotiate & PCS_ANAR_PAUSE) { |
| 1656 | np->tx_flow &= 1; | 1659 | np->tx_flow &= 1; |
| 1657 | np->rx_flow &= 1; | 1660 | np->rx_flow &= 1; |
| 1658 | } else if (negotiate.bits.asymmetric) { | 1661 | } else if (negotiate & PCS_ANAR_ASYMMETRIC) { |
| 1659 | np->tx_flow = 0; | 1662 | np->tx_flow = 0; |
| 1660 | np->rx_flow &= 1; | 1663 | np->rx_flow &= 1; |
| 1661 | } | 1664 | } |
| 1662 | /* else tx_flow, rx_flow = user select */ | 1665 | /* else tx_flow, rx_flow = user select */ |
| 1663 | } else { | 1666 | } else { |
| 1664 | bmcr.image = mii_read (dev, phy_addr, PCS_BMCR); | 1667 | __u16 bmcr = mii_read (dev, phy_addr, PCS_BMCR); |
| 1665 | printk (KERN_INFO "Operating at 1000 Mbps, "); | 1668 | printk (KERN_INFO "Operating at 1000 Mbps, "); |
| 1666 | if (bmcr.bits.duplex_mode) { | 1669 | if (bmcr & MII_BMCR_DUPLEX_MODE) { |
| 1667 | printk ("Full duplex\n"); | 1670 | printk ("Full duplex\n"); |
| 1668 | } else { | 1671 | } else { |
| 1669 | printk ("Half duplex\n"); | 1672 | printk ("Half duplex\n"); |
| @@ -1684,9 +1687,9 @@ mii_get_media_pcs (struct net_device *dev) | |||
| 1684 | static int | 1687 | static int |
| 1685 | mii_set_media_pcs (struct net_device *dev) | 1688 | mii_set_media_pcs (struct net_device *dev) |
| 1686 | { | 1689 | { |
| 1687 | BMCR_t bmcr; | 1690 | __u16 bmcr; |
| 1688 | ESR_t esr; | 1691 | __u16 esr; |
| 1689 | ANAR_PCS_t anar; | 1692 | __u16 anar; |
| 1690 | int phy_addr; | 1693 | int phy_addr; |
| 1691 | struct netdev_private *np; | 1694 | struct netdev_private *np; |
| 1692 | np = netdev_priv(dev); | 1695 | np = netdev_priv(dev); |
| @@ -1695,41 +1698,37 @@ mii_set_media_pcs (struct net_device *dev) | |||
| 1695 | /* Auto-Negotiation? */ | 1698 | /* Auto-Negotiation? */ |
| 1696 | if (np->an_enable) { | 1699 | if (np->an_enable) { |
| 1697 | /* Advertise capabilities */ | 1700 | /* Advertise capabilities */ |
| 1698 | esr.image = mii_read (dev, phy_addr, PCS_ESR); | 1701 | esr = mii_read (dev, phy_addr, PCS_ESR); |
| 1699 | anar.image = mii_read (dev, phy_addr, MII_ANAR); | 1702 | anar = mii_read (dev, phy_addr, MII_ANAR) & |
| 1700 | anar.bits.half_duplex = | 1703 | ~PCS_ANAR_HALF_DUPLEX & |
| 1701 | esr.bits.media_1000BT_HD | esr.bits.media_1000BX_HD; | 1704 | ~PCS_ANAR_FULL_DUPLEX; |
| 1702 | anar.bits.full_duplex = | 1705 | if (esr & (MII_ESR_1000BT_HD | MII_ESR_1000BX_HD)) |
| 1703 | esr.bits.media_1000BT_FD | esr.bits.media_1000BX_FD; | 1706 | anar |= PCS_ANAR_HALF_DUPLEX; |
| 1704 | anar.bits.pause = 1; | 1707 | if (esr & (MII_ESR_1000BT_FD | MII_ESR_1000BX_FD)) |
| 1705 | anar.bits.asymmetric = 1; | 1708 | anar |= PCS_ANAR_FULL_DUPLEX; |
| 1706 | mii_write (dev, phy_addr, MII_ANAR, anar.image); | 1709 | anar |= PCS_ANAR_PAUSE | PCS_ANAR_ASYMMETRIC; |
| 1710 | mii_write (dev, phy_addr, MII_ANAR, anar); | ||
| 1707 | 1711 | ||
| 1708 | /* Soft reset PHY */ | 1712 | /* Soft reset PHY */ |
| 1709 | mii_write (dev, phy_addr, MII_BMCR, MII_BMCR_RESET); | 1713 | mii_write (dev, phy_addr, MII_BMCR, MII_BMCR_RESET); |
| 1710 | bmcr.image = 0; | 1714 | bmcr = MII_BMCR_AN_ENABLE | MII_BMCR_RESTART_AN | |
| 1711 | bmcr.bits.an_enable = 1; | 1715 | MII_BMCR_RESET; |
| 1712 | bmcr.bits.restart_an = 1; | 1716 | mii_write (dev, phy_addr, MII_BMCR, bmcr); |
| 1713 | bmcr.bits.reset = 1; | ||
| 1714 | mii_write (dev, phy_addr, MII_BMCR, bmcr.image); | ||
| 1715 | mdelay(1); | 1717 | mdelay(1); |
| 1716 | } else { | 1718 | } else { |
| 1717 | /* Force speed setting */ | 1719 | /* Force speed setting */ |
| 1718 | /* PHY Reset */ | 1720 | /* PHY Reset */ |
| 1719 | bmcr.image = 0; | 1721 | bmcr = MII_BMCR_RESET; |
| 1720 | bmcr.bits.reset = 1; | 1722 | mii_write (dev, phy_addr, MII_BMCR, bmcr); |
| 1721 | mii_write (dev, phy_addr, MII_BMCR, bmcr.image); | ||
| 1722 | mdelay(10); | 1723 | mdelay(10); |
| 1723 | bmcr.image = 0; | ||
| 1724 | bmcr.bits.an_enable = 0; | ||
| 1725 | if (np->full_duplex) { | 1724 | if (np->full_duplex) { |
| 1726 | bmcr.bits.duplex_mode = 1; | 1725 | bmcr = MII_BMCR_DUPLEX_MODE; |
| 1727 | printk (KERN_INFO "Manual full duplex\n"); | 1726 | printk (KERN_INFO "Manual full duplex\n"); |
| 1728 | } else { | 1727 | } else { |
| 1729 | bmcr.bits.duplex_mode = 0; | 1728 | bmcr = 0; |
| 1730 | printk (KERN_INFO "Manual half duplex\n"); | 1729 | printk (KERN_INFO "Manual half duplex\n"); |
| 1731 | } | 1730 | } |
| 1732 | mii_write (dev, phy_addr, MII_BMCR, bmcr.image); | 1731 | mii_write (dev, phy_addr, MII_BMCR, bmcr); |
| 1733 | mdelay(10); | 1732 | mdelay(10); |
| 1734 | 1733 | ||
| 1735 | /* Advertise nothing */ | 1734 | /* Advertise nothing */ |
