Merge branch 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6

* 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6:
sky2: version 1.18
sky2: receive FIFO checking
sky2: fe+ chip support
sky2: reorganize chip revision features
sky2: ethtool speed report bug
sky2: fix VLAN receive processing (resend)
phy: export phy_mii_ioctl
myri10ge: Add support for PCI device id 9

+293 -122
+3
drivers/net/myri10ge/myri10ge.c
··· 3094 3094 } 3095 3095 3096 3096 #define PCI_DEVICE_ID_MYRICOM_MYRI10GE_Z8E 0x0008 3097 + #define PCI_DEVICE_ID_MYRICOM_MYRI10GE_Z8E_9 0x0009 3097 3098 3098 3099 static struct pci_device_id myri10ge_pci_tbl[] = { 3099 3100 {PCI_DEVICE(PCI_VENDOR_ID_MYRICOM, PCI_DEVICE_ID_MYRICOM_MYRI10GE_Z8E)}, 3101 + {PCI_DEVICE 3102 + (PCI_VENDOR_ID_MYRICOM, PCI_DEVICE_ID_MYRICOM_MYRI10GE_Z8E_9)}, 3100 3103 {0}, 3101 3104 }; 3102 3105
+1
drivers/net/phy/phy.c
··· 409 409 410 410 return 0; 411 411 } 412 + EXPORT_SYMBOL(phy_mii_ioctl); 412 413 413 414 /** 414 415 * phy_start_aneg - start auto-negotiation for this PHY device
+256 -114
drivers/net/sky2.c
··· 51 51 #include "sky2.h" 52 52 53 53 #define DRV_NAME "sky2" 54 - #define DRV_VERSION "1.17" 54 + #define DRV_VERSION "1.18" 55 55 #define PFX DRV_NAME " " 56 56 57 57 /* ··· 118 118 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4351) }, /* 88E8036 */ 119 119 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4352) }, /* 88E8038 */ 120 120 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4353) }, /* 88E8039 */ 121 + { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4354) }, /* 88E8040 */ 121 122 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4356) }, /* 88EC033 */ 123 + { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x435A) }, /* 88E8048 */ 122 124 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4360) }, /* 88E8052 */ 123 125 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4361) }, /* 88E8050 */ 124 126 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4362) }, /* 88E8053 */ 125 127 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4363) }, /* 88E8055 */ 126 128 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4364) }, /* 88E8056 */ 129 + { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4365) }, /* 88E8070 */ 127 130 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4366) }, /* 88EC036 */ 128 131 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4367) }, /* 88EC032 */ 129 132 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4368) }, /* 88EC034 */ ··· 150 147 "Extreme", /* 0xb5 */ 151 148 "EC", /* 0xb6 */ 152 149 "FE", /* 0xb7 */ 150 + "FE+", /* 0xb8 */ 153 151 }; 154 152 155 153 static void sky2_set_multicast(struct net_device *dev); ··· 221 217 else 222 218 sky2_write8(hw, B2_Y2_CLK_GATE, 0); 223 219 224 - if (hw->chip_id == CHIP_ID_YUKON_EC_U || 225 - hw->chip_id == CHIP_ID_YUKON_EX) { 220 + if (hw->flags & SKY2_HW_ADV_POWER_CTL) { 226 221 u32 reg; 227 222 228 223 sky2_pci_write32(hw, PCI_DEV_REG3, 0); ··· 314 311 struct sky2_port *sky2 = netdev_priv(hw->dev[port]); 315 312 u16 ctrl, ct1000, adv, pg, ledctrl, ledover, reg; 316 313 317 - if (sky2->autoneg == AUTONEG_ENABLE 318 - && !(hw->chip_id == CHIP_ID_YUKON_XL 319 - || hw->chip_id == CHIP_ID_YUKON_EC_U 320 - || hw->chip_id == CHIP_ID_YUKON_EX)) { 314 + if (sky2->autoneg == AUTONEG_ENABLE && 315 + !(hw->flags & SKY2_HW_NEWER_PHY)) { 321 316 u16 ectrl = gm_phy_read(hw, port, PHY_MARV_EXT_CTRL); 322 317 323 318 ectrl &= ~(PHY_M_EC_M_DSC_MSK | PHY_M_EC_S_DSC_MSK | ··· 335 334 336 335 ctrl = gm_phy_read(hw, port, PHY_MARV_PHY_CTRL); 337 336 if (sky2_is_copper(hw)) { 338 - if (hw->chip_id == CHIP_ID_YUKON_FE) { 337 + if (!(hw->flags & SKY2_HW_GIGABIT)) { 339 338 /* enable automatic crossover */ 340 339 ctrl |= PHY_M_PC_MDI_XMODE(PHY_M_PC_ENA_AUTO) >> 1; 341 340 } else { ··· 347 346 348 347 /* downshift on PHY 88E1112 and 88E1149 is changed */ 349 348 if (sky2->autoneg == AUTONEG_ENABLE 350 - && (hw->chip_id == CHIP_ID_YUKON_XL 351 - || hw->chip_id == CHIP_ID_YUKON_EC_U 352 - || hw->chip_id == CHIP_ID_YUKON_EX)) { 349 + && (hw->flags & SKY2_HW_NEWER_PHY)) { 353 350 /* set downshift counter to 3x and enable downshift */ 354 351 ctrl &= ~PHY_M_PC_DSC_MSK; 355 352 ctrl |= PHY_M_PC_DSC(2) | PHY_M_PC_DOWN_S_ENA; ··· 363 364 gm_phy_write(hw, port, PHY_MARV_PHY_CTRL, ctrl); 364 365 365 366 /* special setup for PHY 88E1112 Fiber */ 366 - if (hw->chip_id == CHIP_ID_YUKON_XL && !sky2_is_copper(hw)) { 367 + if (hw->chip_id == CHIP_ID_YUKON_XL && (hw->flags & SKY2_HW_FIBRE_PHY)) { 367 368 pg = gm_phy_read(hw, port, PHY_MARV_EXT_ADR); 368 369 369 370 /* Fiber: select 1000BASE-X only mode MAC Specific Ctrl Reg. */ ··· 454 455 455 456 gma_write16(hw, port, GM_GP_CTRL, reg); 456 457 457 - if (hw->chip_id != CHIP_ID_YUKON_FE) 458 + if (hw->flags & SKY2_HW_GIGABIT) 458 459 gm_phy_write(hw, port, PHY_MARV_1000T_CTRL, ct1000); 459 460 460 461 gm_phy_write(hw, port, PHY_MARV_AUNE_ADV, adv); ··· 475 476 ctrl &= ~PHY_M_FELP_LED1_MSK; 476 477 /* change ACT LED control to blink mode */ 477 478 ctrl |= PHY_M_FELP_LED1_CTRL(LED_PAR_CTRL_ACT_BL); 479 + gm_phy_write(hw, port, PHY_MARV_FE_LED_PAR, ctrl); 480 + break; 481 + 482 + case CHIP_ID_YUKON_FE_P: 483 + /* Enable Link Partner Next Page */ 484 + ctrl = gm_phy_read(hw, port, PHY_MARV_PHY_CTRL); 485 + ctrl |= PHY_M_PC_ENA_LIP_NP; 486 + 487 + /* disable Energy Detect and enable scrambler */ 488 + ctrl &= ~(PHY_M_PC_ENA_ENE_DT | PHY_M_PC_DIS_SCRAMB); 489 + gm_phy_write(hw, port, PHY_MARV_PHY_CTRL, ctrl); 490 + 491 + /* set LED2 -> ACT, LED1 -> LINK, LED0 -> SPEED */ 492 + ctrl = PHY_M_FELP_LED2_CTRL(LED_PAR_CTRL_ACT_BL) | 493 + PHY_M_FELP_LED1_CTRL(LED_PAR_CTRL_LINK) | 494 + PHY_M_FELP_LED0_CTRL(LED_PAR_CTRL_SPEED); 495 + 478 496 gm_phy_write(hw, port, PHY_MARV_FE_LED_PAR, ctrl); 479 497 break; 480 498 ··· 564 548 565 549 /* set page register to 0 */ 566 550 gm_phy_write(hw, port, PHY_MARV_EXT_ADR, 0); 551 + } else if (hw->chip_id == CHIP_ID_YUKON_FE_P && 552 + hw->chip_rev == CHIP_REV_YU_FE2_A0) { 553 + /* apply workaround for integrated resistors calibration */ 554 + gm_phy_write(hw, port, PHY_MARV_PAGE_ADDR, 17); 555 + gm_phy_write(hw, port, PHY_MARV_PAGE_DATA, 0x3f60); 567 556 } else if (hw->chip_id != CHIP_ID_YUKON_EX) { 557 + /* no effect on Yukon-XL */ 568 558 gm_phy_write(hw, port, PHY_MARV_LED_CTRL, ledctrl); 569 559 570 560 if (sky2->autoneg == AUTONEG_DISABLE || sky2->speed == SPEED_100) { ··· 691 669 692 670 static void sky2_set_tx_stfwd(struct sky2_hw *hw, unsigned port) 693 671 { 694 - if (hw->chip_id == CHIP_ID_YUKON_EX && hw->chip_rev != CHIP_REV_YU_EX_A0) { 672 + struct net_device *dev = hw->dev[port]; 673 + 674 + if (dev->mtu <= ETH_DATA_LEN) 695 675 sky2_write32(hw, SK_REG(port, TX_GMF_CTRL_T), 696 - TX_STFW_ENA | 697 - (hw->dev[port]->mtu > ETH_DATA_LEN) ? TX_JUMBO_ENA : TX_JUMBO_DIS); 698 - } else { 699 - if (hw->dev[port]->mtu > ETH_DATA_LEN) { 700 - /* set Tx GMAC FIFO Almost Empty Threshold */ 701 - sky2_write32(hw, SK_REG(port, TX_GMF_AE_THR), 702 - (ECU_JUMBO_WM << 16) | ECU_AE_THR); 676 + TX_JUMBO_DIS | TX_STFW_ENA); 703 677 704 - sky2_write32(hw, SK_REG(port, TX_GMF_CTRL_T), 705 - TX_JUMBO_ENA | TX_STFW_DIS); 678 + else if (hw->chip_id != CHIP_ID_YUKON_EC_U) 679 + sky2_write32(hw, SK_REG(port, TX_GMF_CTRL_T), 680 + TX_STFW_ENA | TX_JUMBO_ENA); 681 + else { 682 + /* set Tx GMAC FIFO Almost Empty Threshold */ 683 + sky2_write32(hw, SK_REG(port, TX_GMF_AE_THR), 684 + (ECU_JUMBO_WM << 16) | ECU_AE_THR); 706 685 707 - /* Can't do offload because of lack of store/forward */ 708 - hw->dev[port]->features &= ~(NETIF_F_TSO | NETIF_F_SG 709 - | NETIF_F_ALL_CSUM); 710 - } else 711 - sky2_write32(hw, SK_REG(port, TX_GMF_CTRL_T), 712 - TX_JUMBO_DIS | TX_STFW_ENA); 686 + sky2_write32(hw, SK_REG(port, TX_GMF_CTRL_T), 687 + TX_JUMBO_ENA | TX_STFW_DIS); 688 + 689 + /* Can't do offload because of lack of store/forward */ 690 + dev->features &= ~(NETIF_F_TSO | NETIF_F_SG | NETIF_F_ALL_CSUM); 713 691 } 714 692 } 715 693 ··· 795 773 /* Configure Rx MAC FIFO */ 796 774 sky2_write8(hw, SK_REG(port, RX_GMF_CTRL_T), GMF_RST_CLR); 797 775 rx_reg = GMF_OPER_ON | GMF_RX_F_FL_ON; 798 - if (hw->chip_id == CHIP_ID_YUKON_EX) 776 + if (hw->chip_id == CHIP_ID_YUKON_EX || 777 + hw->chip_id == CHIP_ID_YUKON_FE_P) 799 778 rx_reg |= GMF_RX_OVER_ON; 800 779 801 780 sky2_write32(hw, SK_REG(port, RX_GMF_CTRL_T), rx_reg); ··· 805 782 sky2_write16(hw, SK_REG(port, RX_GMF_FL_MSK), GMR_FS_ANY_ERR); 806 783 807 784 /* Set threshold to 0xa (64 bytes) + 1 to workaround pause bug */ 808 - sky2_write16(hw, SK_REG(port, RX_GMF_FL_THR), RX_GMF_FL_THR_DEF+1); 785 + reg = RX_GMF_FL_THR_DEF + 1; 786 + /* Another magic mystery workaround from sk98lin */ 787 + if (hw->chip_id == CHIP_ID_YUKON_FE_P && 788 + hw->chip_rev == CHIP_REV_YU_FE2_A0) 789 + reg = 0x178; 790 + sky2_write16(hw, SK_REG(port, RX_GMF_FL_THR), reg); 809 791 810 792 /* Configure Tx MAC FIFO */ 811 793 sky2_write8(hw, SK_REG(port, TX_GMF_CTRL_T), GMF_RST_CLR); 812 794 sky2_write16(hw, SK_REG(port, TX_GMF_CTRL_T), GMF_OPER_ON); 813 795 814 - if (hw->chip_id == CHIP_ID_YUKON_EC_U || hw->chip_id == CHIP_ID_YUKON_EX) { 796 + if (!(hw->flags & SKY2_HW_RAMBUFFER)) { 815 797 sky2_write8(hw, SK_REG(port, RX_GMF_LP_THR), 768/8); 816 798 sky2_write8(hw, SK_REG(port, RX_GMF_UP_THR), 1024/8); 817 799 ··· 995 967 */ 996 968 static void rx_set_checksum(struct sky2_port *sky2) 997 969 { 998 - struct sky2_rx_le *le; 970 + struct sky2_rx_le *le = sky2_next_rx(sky2); 999 971 1000 - if (sky2->hw->chip_id != CHIP_ID_YUKON_EX) { 1001 - le = sky2_next_rx(sky2); 1002 - le->addr = cpu_to_le32((ETH_HLEN << 16) | ETH_HLEN); 1003 - le->ctrl = 0; 1004 - le->opcode = OP_TCPSTART | HW_OWNER; 972 + le->addr = cpu_to_le32((ETH_HLEN << 16) | ETH_HLEN); 973 + le->ctrl = 0; 974 + le->opcode = OP_TCPSTART | HW_OWNER; 1005 975 1006 - sky2_write32(sky2->hw, 1007 - Q_ADDR(rxqaddr[sky2->port], Q_CSR), 1008 - sky2->rx_csum ? BMU_ENA_RX_CHKSUM : BMU_DIS_RX_CHKSUM); 1009 - } 1010 - 976 + sky2_write32(sky2->hw, 977 + Q_ADDR(rxqaddr[sky2->port], Q_CSR), 978 + sky2->rx_csum ? BMU_ENA_RX_CHKSUM : BMU_DIS_RX_CHKSUM); 1011 979 } 1012 980 1013 981 /* ··· 1199 1175 1200 1176 sky2_prefetch_init(hw, rxq, sky2->rx_le_map, RX_LE_SIZE - 1); 1201 1177 1202 - rx_set_checksum(sky2); 1178 + if (!(hw->flags & SKY2_HW_NEW_LE)) 1179 + rx_set_checksum(sky2); 1203 1180 1204 1181 /* Space needed for frame data + headers rounded up */ 1205 1182 size = roundup(sky2->netdev->mtu + ETH_HLEN + VLAN_HLEN, 8); ··· 1271 1246 struct sky2_port *sky2 = netdev_priv(dev); 1272 1247 struct sky2_hw *hw = sky2->hw; 1273 1248 unsigned port = sky2->port; 1274 - u32 ramsize, imask; 1249 + u32 imask; 1275 1250 int cap, err = -ENOMEM; 1276 1251 struct net_device *otherdev = hw->dev[sky2->port^1]; 1277 1252 ··· 1326 1301 1327 1302 sky2_mac_init(hw, port); 1328 1303 1329 - /* Register is number of 4K blocks on internal RAM buffer. */ 1330 - ramsize = sky2_read8(hw, B2_E_0) * 4; 1331 - printk(KERN_INFO PFX "%s: ram buffer %dK\n", dev->name, ramsize); 1332 - 1333 - if (ramsize > 0) { 1304 + if (hw->flags & SKY2_HW_RAMBUFFER) { 1305 + /* Register is number of 4K blocks on internal RAM buffer. */ 1306 + u32 ramsize = sky2_read8(hw, B2_E_0) * 4; 1334 1307 u32 rxspace; 1308 + 1309 + printk(KERN_DEBUG PFX "%s: ram buffer %dK\n", dev->name, ramsize); 1335 1310 1336 1311 if (ramsize < 16) 1337 1312 rxspace = ramsize / 2; ··· 1461 1436 /* Check for TCP Segmentation Offload */ 1462 1437 mss = skb_shinfo(skb)->gso_size; 1463 1438 if (mss != 0) { 1464 - if (hw->chip_id != CHIP_ID_YUKON_EX) 1439 + 1440 + if (!(hw->flags & SKY2_HW_NEW_LE)) 1465 1441 mss += ETH_HLEN + ip_hdrlen(skb) + tcp_hdrlen(skb); 1466 1442 1467 1443 if (mss != sky2->tx_last_mss) { 1468 1444 le = get_tx_le(sky2); 1469 1445 le->addr = cpu_to_le32(mss); 1470 - if (hw->chip_id == CHIP_ID_YUKON_EX) 1446 + 1447 + if (hw->flags & SKY2_HW_NEW_LE) 1471 1448 le->opcode = OP_MSS | HW_OWNER; 1472 1449 else 1473 1450 le->opcode = OP_LRGLEN | HW_OWNER; ··· 1495 1468 /* Handle TCP checksum offload */ 1496 1469 if (skb->ip_summed == CHECKSUM_PARTIAL) { 1497 1470 /* On Yukon EX (some versions) encoding change. */ 1498 - if (hw->chip_id == CHIP_ID_YUKON_EX 1499 - && hw->chip_rev != CHIP_REV_YU_EX_B0) 1471 + if (hw->flags & SKY2_HW_AUTO_TX_SUM) 1500 1472 ctrl |= CALSUM; /* auto checksum */ 1501 1473 else { 1502 1474 const unsigned offset = skb_transport_offset(skb); ··· 1648 1622 if (netif_msg_ifdown(sky2)) 1649 1623 printk(KERN_INFO PFX "%s: disabling interface\n", dev->name); 1650 1624 1651 - if (netif_carrier_ok(dev) && --hw->active == 0) 1652 - del_timer(&hw->watchdog_timer); 1653 - 1654 1625 /* Stop more packets from being queued */ 1655 1626 netif_stop_queue(dev); 1656 1627 ··· 1731 1708 1732 1709 static u16 sky2_phy_speed(const struct sky2_hw *hw, u16 aux) 1733 1710 { 1734 - if (!sky2_is_copper(hw)) 1711 + if (hw->flags & SKY2_HW_FIBRE_PHY) 1735 1712 return SPEED_1000; 1736 1713 1737 - if (hw->chip_id == CHIP_ID_YUKON_FE) 1738 - return (aux & PHY_M_PS_SPEED_100) ? SPEED_100 : SPEED_10; 1714 + if (!(hw->flags & SKY2_HW_GIGABIT)) { 1715 + if (aux & PHY_M_PS_SPEED_100) 1716 + return SPEED_100; 1717 + else 1718 + return SPEED_10; 1719 + } 1739 1720 1740 1721 switch (aux & PHY_M_PS_SPEED_MSK) { 1741 1722 case PHY_M_PS_SPEED_1000: ··· 1772 1745 1773 1746 netif_carrier_on(sky2->netdev); 1774 1747 1775 - if (hw->active++ == 0) 1776 - mod_timer(&hw->watchdog_timer, jiffies + 1); 1777 - 1748 + mod_timer(&hw->watchdog_timer, jiffies + 1); 1778 1749 1779 1750 /* Turn on link LED */ 1780 1751 sky2_write8(hw, SK_REG(port, LNK_LED_REG), 1781 1752 LINKLED_ON | LINKLED_BLINK_OFF | LINKLED_LINKSYNC_OFF); 1782 1753 1783 - if (hw->chip_id == CHIP_ID_YUKON_XL 1784 - || hw->chip_id == CHIP_ID_YUKON_EC_U 1785 - || hw->chip_id == CHIP_ID_YUKON_EX) { 1754 + if (hw->flags & SKY2_HW_NEWER_PHY) { 1786 1755 u16 pg = gm_phy_read(hw, port, PHY_MARV_EXT_ADR); 1787 1756 u16 led = PHY_M_LEDC_LOS_CTRL(1); /* link active */ 1788 1757 ··· 1823 1800 1824 1801 netif_carrier_off(sky2->netdev); 1825 1802 1826 - /* Stop watchdog if both ports are not active */ 1827 - if (--hw->active == 0) 1828 - del_timer(&hw->watchdog_timer); 1829 - 1830 - 1831 1803 /* Turn on link LED */ 1832 1804 sky2_write8(hw, SK_REG(port, LNK_LED_REG), LINKLED_OFF); 1833 1805 ··· 1865 1847 /* Since the pause result bits seem to in different positions on 1866 1848 * different chips. look at registers. 1867 1849 */ 1868 - if (!sky2_is_copper(hw)) { 1850 + if (hw->flags & SKY2_HW_FIBRE_PHY) { 1869 1851 /* Shift for bits in fiber PHY */ 1870 1852 advert &= ~(ADVERTISE_PAUSE_CAP|ADVERTISE_PAUSE_ASYM); 1871 1853 lpa &= ~(LPA_PAUSE_CAP|LPA_PAUSE_ASYM); ··· 1976 1958 if (new_mtu < ETH_ZLEN || new_mtu > ETH_JUMBO_MTU) 1977 1959 return -EINVAL; 1978 1960 1979 - if (new_mtu > ETH_DATA_LEN && hw->chip_id == CHIP_ID_YUKON_FE) 1961 + if (new_mtu > ETH_DATA_LEN && 1962 + (hw->chip_id == CHIP_ID_YUKON_FE || 1963 + hw->chip_id == CHIP_ID_YUKON_FE_P)) 1980 1964 return -EINVAL; 1981 1965 1982 1966 if (!netif_running(dev)) { ··· 1995 1975 1996 1976 synchronize_irq(hw->pdev->irq); 1997 1977 1998 - if (hw->chip_id == CHIP_ID_YUKON_EC_U || hw->chip_id == CHIP_ID_YUKON_EX) 1978 + if (!(hw->flags & SKY2_HW_RAMBUFFER)) 1999 1979 sky2_set_tx_stfwd(hw, port); 2000 1980 2001 1981 ctl = gma_read16(hw, port, GM_GP_CTRL); ··· 2123 2103 struct sky2_port *sky2 = netdev_priv(dev); 2124 2104 struct rx_ring_info *re = sky2->rx_ring + sky2->rx_next; 2125 2105 struct sk_buff *skb = NULL; 2106 + u16 count = (status & GMR_FS_LEN) >> 16; 2107 + 2108 + #ifdef SKY2_VLAN_TAG_USED 2109 + /* Account for vlan tag */ 2110 + if (sky2->vlgrp && (status & GMR_FS_VLAN)) 2111 + count -= VLAN_HLEN; 2112 + #endif 2126 2113 2127 2114 if (unlikely(netif_msg_rx_status(sky2))) 2128 2115 printk(KERN_DEBUG PFX "%s: rx slot %u status 0x%x len %d\n", ··· 2144 2117 if (!(status & GMR_FS_RX_OK)) 2145 2118 goto resubmit; 2146 2119 2147 - if (status >> 16 != length) 2120 + /* if length reported by DMA does not match PHY, packet was truncated */ 2121 + if (length != count) 2148 2122 goto len_mismatch; 2149 2123 2150 2124 if (length < copybreak) ··· 2161 2133 /* Truncation of overlength packets 2162 2134 causes PHY length to not match MAC length */ 2163 2135 ++sky2->net_stats.rx_length_errors; 2136 + if (netif_msg_rx_err(sky2) && net_ratelimit()) 2137 + pr_info(PFX "%s: rx length mismatch: length %d status %#x\n", 2138 + dev->name, length, status); 2139 + goto resubmit; 2164 2140 2165 2141 error: 2166 2142 ++sky2->net_stats.rx_errors; ··· 2234 2202 } 2235 2203 2236 2204 /* This chip reports checksum status differently */ 2237 - if (hw->chip_id == CHIP_ID_YUKON_EX) { 2205 + if (hw->flags & SKY2_HW_NEW_LE) { 2238 2206 if (sky2->rx_csum && 2239 2207 (le->css & (CSS_ISIPV4 | CSS_ISIPV6)) && 2240 2208 (le->css & CSS_TCPUDPCSOK)) ··· 2275 2243 if (!sky2->rx_csum) 2276 2244 break; 2277 2245 2278 - if (hw->chip_id == CHIP_ID_YUKON_EX) 2246 + /* If this happens then driver assuming wrong format */ 2247 + if (unlikely(hw->flags & SKY2_HW_NEW_LE)) { 2248 + if (net_ratelimit()) 2249 + printk(KERN_NOTICE "%s: unexpected" 2250 + " checksum status\n", 2251 + dev->name); 2279 2252 break; 2253 + } 2280 2254 2281 2255 /* Both checksum counters are programmed to start at 2282 2256 * the same offset, so unless there is a problem they ··· 2474 2436 sky2_write32(hw, Q_ADDR(q, Q_CSR), BMU_CLR_IRQ_CHK); 2475 2437 } 2476 2438 2477 - /* Check for lost IRQ once a second */ 2439 + static int sky2_rx_hung(struct net_device *dev) 2440 + { 2441 + struct sky2_port *sky2 = netdev_priv(dev); 2442 + struct sky2_hw *hw = sky2->hw; 2443 + unsigned port = sky2->port; 2444 + unsigned rxq = rxqaddr[port]; 2445 + u32 mac_rp = sky2_read32(hw, SK_REG(port, RX_GMF_RP)); 2446 + u8 mac_lev = sky2_read8(hw, SK_REG(port, RX_GMF_RLEV)); 2447 + u8 fifo_rp = sky2_read8(hw, Q_ADDR(rxq, Q_RP)); 2448 + u8 fifo_lev = sky2_read8(hw, Q_ADDR(rxq, Q_RL)); 2449 + 2450 + /* If idle and MAC or PCI is stuck */ 2451 + if (sky2->check.last == dev->last_rx && 2452 + ((mac_rp == sky2->check.mac_rp && 2453 + mac_lev != 0 && mac_lev >= sky2->check.mac_lev) || 2454 + /* Check if the PCI RX hang */ 2455 + (fifo_rp == sky2->check.fifo_rp && 2456 + fifo_lev != 0 && fifo_lev >= sky2->check.fifo_lev))) { 2457 + printk(KERN_DEBUG PFX "%s: hung mac %d:%d fifo %d (%d:%d)\n", 2458 + dev->name, mac_lev, mac_rp, fifo_lev, fifo_rp, 2459 + sky2_read8(hw, Q_ADDR(rxq, Q_WP))); 2460 + return 1; 2461 + } else { 2462 + sky2->check.last = dev->last_rx; 2463 + sky2->check.mac_rp = mac_rp; 2464 + sky2->check.mac_lev = mac_lev; 2465 + sky2->check.fifo_rp = fifo_rp; 2466 + sky2->check.fifo_lev = fifo_lev; 2467 + return 0; 2468 + } 2469 + } 2470 + 2478 2471 static void sky2_watchdog(unsigned long arg) 2479 2472 { 2480 2473 struct sky2_hw *hw = (struct sky2_hw *) arg; 2474 + struct net_device *dev; 2481 2475 2476 + /* Check for lost IRQ once a second */ 2482 2477 if (sky2_read32(hw, B0_ISRC)) { 2483 - struct net_device *dev = hw->dev[0]; 2484 - 2478 + dev = hw->dev[0]; 2485 2479 if (__netif_rx_schedule_prep(dev)) 2486 2480 __netif_rx_schedule(dev); 2481 + } else { 2482 + int i, active = 0; 2483 + 2484 + for (i = 0; i < hw->ports; i++) { 2485 + dev = hw->dev[i]; 2486 + if (!netif_running(dev)) 2487 + continue; 2488 + ++active; 2489 + 2490 + /* For chips with Rx FIFO, check if stuck */ 2491 + if ((hw->flags & SKY2_HW_RAMBUFFER) && 2492 + sky2_rx_hung(dev)) { 2493 + pr_info(PFX "%s: receiver hang detected\n", 2494 + dev->name); 2495 + schedule_work(&hw->restart_work); 2496 + return; 2497 + } 2498 + } 2499 + 2500 + if (active == 0) 2501 + return; 2487 2502 } 2488 2503 2489 - if (hw->active > 0) 2490 - mod_timer(&hw->watchdog_timer, round_jiffies(jiffies + HZ)); 2504 + mod_timer(&hw->watchdog_timer, round_jiffies(jiffies + HZ)); 2491 2505 } 2492 2506 2493 2507 /* Hardware/software error handling */ ··· 2636 2546 #endif 2637 2547 2638 2548 /* Chip internal frequency for clock calculations */ 2639 - static inline u32 sky2_mhz(const struct sky2_hw *hw) 2549 + static u32 sky2_mhz(const struct sky2_hw *hw) 2640 2550 { 2641 2551 switch (hw->chip_id) { 2642 2552 case CHIP_ID_YUKON_EC: 2643 2553 case CHIP_ID_YUKON_EC_U: 2644 2554 case CHIP_ID_YUKON_EX: 2645 - return 125; /* 125 Mhz */ 2555 + return 125; 2556 + 2646 2557 case CHIP_ID_YUKON_FE: 2647 - return 100; /* 100 Mhz */ 2648 - default: /* YUKON_XL */ 2649 - return 156; /* 156 Mhz */ 2558 + return 100; 2559 + 2560 + case CHIP_ID_YUKON_FE_P: 2561 + return 50; 2562 + 2563 + case CHIP_ID_YUKON_XL: 2564 + return 156; 2565 + 2566 + default: 2567 + BUG(); 2650 2568 } 2651 2569 } 2652 2570 ··· 2679 2581 sky2_write8(hw, B0_CTST, CS_RST_CLR); 2680 2582 2681 2583 hw->chip_id = sky2_read8(hw, B2_CHIP_ID); 2682 - if (hw->chip_id < CHIP_ID_YUKON_XL || hw->chip_id > CHIP_ID_YUKON_FE) { 2584 + hw->chip_rev = (sky2_read8(hw, B2_MAC_CFG) & CFG_CHIP_R_MSK) >> 4; 2585 + 2586 + switch(hw->chip_id) { 2587 + case CHIP_ID_YUKON_XL: 2588 + hw->flags = SKY2_HW_GIGABIT 2589 + | SKY2_HW_NEWER_PHY 2590 + | SKY2_HW_RAMBUFFER; 2591 + break; 2592 + 2593 + case CHIP_ID_YUKON_EC_U: 2594 + hw->flags = SKY2_HW_GIGABIT 2595 + | SKY2_HW_NEWER_PHY 2596 + | SKY2_HW_ADV_POWER_CTL; 2597 + break; 2598 + 2599 + case CHIP_ID_YUKON_EX: 2600 + hw->flags = SKY2_HW_GIGABIT 2601 + | SKY2_HW_NEWER_PHY 2602 + | SKY2_HW_NEW_LE 2603 + | SKY2_HW_ADV_POWER_CTL; 2604 + 2605 + /* New transmit checksum */ 2606 + if (hw->chip_rev != CHIP_REV_YU_EX_B0) 2607 + hw->flags |= SKY2_HW_AUTO_TX_SUM; 2608 + break; 2609 + 2610 + case CHIP_ID_YUKON_EC: 2611 + /* This rev is really old, and requires untested workarounds */ 2612 + if (hw->chip_rev == CHIP_REV_YU_EC_A1) { 2613 + dev_err(&hw->pdev->dev, "unsupported revision Yukon-EC rev A1\n"); 2614 + return -EOPNOTSUPP; 2615 + } 2616 + hw->flags = SKY2_HW_GIGABIT | SKY2_HW_RAMBUFFER; 2617 + break; 2618 + 2619 + case CHIP_ID_YUKON_FE: 2620 + hw->flags = SKY2_HW_RAMBUFFER; 2621 + break; 2622 + 2623 + case CHIP_ID_YUKON_FE_P: 2624 + hw->flags = SKY2_HW_NEWER_PHY 2625 + | SKY2_HW_NEW_LE 2626 + | SKY2_HW_AUTO_TX_SUM 2627 + | SKY2_HW_ADV_POWER_CTL; 2628 + break; 2629 + default: 2683 2630 dev_err(&hw->pdev->dev, "unsupported chip type 0x%x\n", 2684 2631 hw->chip_id); 2685 2632 return -EOPNOTSUPP; 2686 2633 } 2687 2634 2688 - hw->chip_rev = (sky2_read8(hw, B2_MAC_CFG) & CFG_CHIP_R_MSK) >> 4; 2689 - 2690 - /* This rev is really old, and requires untested workarounds */ 2691 - if (hw->chip_id == CHIP_ID_YUKON_EC && hw->chip_rev == CHIP_REV_YU_EC_A1) { 2692 - dev_err(&hw->pdev->dev, "unsupported revision Yukon-%s (0x%x) rev %d\n", 2693 - yukon2_name[hw->chip_id - CHIP_ID_YUKON_XL], 2694 - hw->chip_id, hw->chip_rev); 2695 - return -EOPNOTSUPP; 2696 - } 2697 - 2698 2635 hw->pmd_type = sky2_read8(hw, B2_PMD_TYP); 2636 + if (hw->pmd_type == 'L' || hw->pmd_type == 'S' || hw->pmd_type == 'P') 2637 + hw->flags |= SKY2_HW_FIBRE_PHY; 2638 + 2639 + 2699 2640 hw->ports = 1; 2700 2641 t8 = sky2_read8(hw, B2_Y2_HW_RES); 2701 2642 if ((t8 & CFG_DUAL_MAC_MSK) == CFG_DUAL_MAC_MSK) { ··· 2928 2791 2929 2792 sky2->wol = wol->wolopts; 2930 2793 2931 - if (hw->chip_id == CHIP_ID_YUKON_EC_U || hw->chip_id == CHIP_ID_YUKON_EX) 2794 + if (hw->chip_id == CHIP_ID_YUKON_EC_U || 2795 + hw->chip_id == CHIP_ID_YUKON_EX || 2796 + hw->chip_id == CHIP_ID_YUKON_FE_P) 2932 2797 sky2_write32(hw, B0_CTST, sky2->wol 2933 2798 ? Y2_HW_WOL_ON : Y2_HW_WOL_OFF); 2934 2799 ··· 2948 2809 | SUPPORTED_100baseT_Full 2949 2810 | SUPPORTED_Autoneg | SUPPORTED_TP; 2950 2811 2951 - if (hw->chip_id != CHIP_ID_YUKON_FE) 2812 + if (hw->flags & SKY2_HW_GIGABIT) 2952 2813 modes |= SUPPORTED_1000baseT_Half 2953 2814 | SUPPORTED_1000baseT_Full; 2954 2815 return modes; ··· 2968 2829 ecmd->supported = sky2_supported_modes(hw); 2969 2830 ecmd->phy_address = PHY_ADDR_MARV; 2970 2831 if (sky2_is_copper(hw)) { 2971 - ecmd->supported = SUPPORTED_10baseT_Half 2972 - | SUPPORTED_10baseT_Full 2973 - | SUPPORTED_100baseT_Half 2974 - | SUPPORTED_100baseT_Full 2975 - | SUPPORTED_1000baseT_Half 2976 - | SUPPORTED_1000baseT_Full 2977 - | SUPPORTED_Autoneg | SUPPORTED_TP; 2978 2832 ecmd->port = PORT_TP; 2979 2833 ecmd->speed = sky2->speed; 2980 2834 } else { ··· 3923 3791 sky2->hw = hw; 3924 3792 sky2->msg_enable = netif_msg_init(debug, default_msg); 3925 3793 3794 + /* This chip has hardware problems that generates 3795 + * bogus PHY receive status so by default shut up the message. 3796 + */ 3797 + if (hw->chip_id == CHIP_ID_YUKON_FE_P && 3798 + hw->chip_rev == CHIP_REV_YU_FE2_A0) 3799 + sky2->msg_enable &= ~NETIF_MSG_RX_ERR; 3800 + 3926 3801 /* Auto speed and flow control */ 3927 3802 sky2->autoneg = AUTONEG_ENABLE; 3928 3803 sky2->flow_mode = FC_BOTH; ··· 3985 3846 return IRQ_NONE; 3986 3847 3987 3848 if (status & Y2_IS_IRQ_SW) { 3988 - hw->msi = 1; 3849 + hw->flags |= SKY2_HW_USE_MSI; 3989 3850 wake_up(&hw->msi_wait); 3990 3851 sky2_write8(hw, B0_CTST, CS_CL_SW_IRQ); 3991 3852 } ··· 4013 3874 sky2_write8(hw, B0_CTST, CS_ST_SW_IRQ); 4014 3875 sky2_read8(hw, B0_CTST); 4015 3876 4016 - wait_event_timeout(hw->msi_wait, hw->msi, HZ/10); 3877 + wait_event_timeout(hw->msi_wait, (hw->flags & SKY2_HW_USE_MSI), HZ/10); 4017 3878 4018 - if (!hw->msi) { 3879 + if (!(hw->flags & SKY2_HW_USE_MSI)) { 4019 3880 /* MSI test failed, go back to INTx mode */ 4020 3881 dev_info(&pdev->dev, "No interrupt generated using MSI, " 4021 3882 "switching to INTx mode.\n"); ··· 4148 4009 goto err_out_free_netdev; 4149 4010 } 4150 4011 4151 - err = request_irq(pdev->irq, sky2_intr, hw->msi ? 0 : IRQF_SHARED, 4012 + err = request_irq(pdev->irq, sky2_intr, 4013 + (hw->flags & SKY2_HW_USE_MSI) ? 0 : IRQF_SHARED, 4152 4014 dev->name, hw); 4153 4015 if (err) { 4154 4016 dev_err(&pdev->dev, "cannot assign irq %d\n", pdev->irq); ··· 4182 4042 return 0; 4183 4043 4184 4044 err_out_unregister: 4185 - if (hw->msi) 4045 + if (hw->flags & SKY2_HW_USE_MSI) 4186 4046 pci_disable_msi(pdev); 4187 4047 unregister_netdev(dev); 4188 4048 err_out_free_netdev: ··· 4231 4091 sky2_read8(hw, B0_CTST); 4232 4092 4233 4093 free_irq(pdev->irq, hw); 4234 - if (hw->msi) 4094 + if (hw->flags & SKY2_HW_USE_MSI) 4235 4095 pci_disable_msi(pdev); 4236 4096 pci_free_consistent(pdev, STATUS_LE_BYTES, hw->st_le, hw->st_dma); 4237 4097 pci_release_regions(pdev); ··· 4299 4159 pci_enable_wake(pdev, PCI_D0, 0); 4300 4160 4301 4161 /* Re-enable all clocks */ 4302 - if (hw->chip_id == CHIP_ID_YUKON_EX || hw->chip_id == CHIP_ID_YUKON_EC_U) 4162 + if (hw->chip_id == CHIP_ID_YUKON_EX || 4163 + hw->chip_id == CHIP_ID_YUKON_EC_U || 4164 + hw->chip_id == CHIP_ID_YUKON_FE_P) 4303 4165 sky2_pci_write32(hw, PCI_DEV_REG3, 0); 4304 4166 4305 4167 sky2_reset(hw);
+33 -8
drivers/net/sky2.h
··· 470 470 CHIP_ID_YUKON_EX = 0xb5, /* Chip ID for YUKON-2 Extreme */ 471 471 CHIP_ID_YUKON_EC = 0xb6, /* Chip ID for YUKON-2 EC */ 472 472 CHIP_ID_YUKON_FE = 0xb7, /* Chip ID for YUKON-2 FE */ 473 - 473 + CHIP_ID_YUKON_FE_P = 0xb8, /* Chip ID for YUKON-2 FE+ */ 474 + }; 475 + enum yukon_ec_rev { 474 476 CHIP_REV_YU_EC_A1 = 0, /* Chip Rev. for Yukon-EC A1/A0 */ 475 477 CHIP_REV_YU_EC_A2 = 1, /* Chip Rev. for Yukon-EC A2 */ 476 478 CHIP_REV_YU_EC_A3 = 2, /* Chip Rev. for Yukon-EC A3 */ 477 - 479 + }; 480 + enum yukon_ec_u_rev { 478 481 CHIP_REV_YU_EC_U_A0 = 1, 479 482 CHIP_REV_YU_EC_U_A1 = 2, 480 483 CHIP_REV_YU_EC_U_B0 = 3, 481 - 484 + }; 485 + enum yukon_fe_rev { 482 486 CHIP_REV_YU_FE_A1 = 1, 483 487 CHIP_REV_YU_FE_A2 = 2, 484 - 488 + }; 489 + enum yukon_fe_p_rev { 490 + CHIP_REV_YU_FE2_A0 = 0, 485 491 }; 486 492 enum yukon_ex_rev { 487 493 CHIP_REV_YU_EX_A0 = 1, ··· 1674 1668 1675 1669 /* Receive Frame Status Encoding */ 1676 1670 enum { 1677 - GMR_FS_LEN = 0xffff<<16, /* Bit 31..16: Rx Frame Length */ 1671 + GMR_FS_LEN = 0x7fff<<16, /* Bit 30..16: Rx Frame Length */ 1678 1672 GMR_FS_VLAN = 1<<13, /* VLAN Packet */ 1679 1673 GMR_FS_JABBER = 1<<12, /* Jabber Packet */ 1680 1674 GMR_FS_UN_SIZE = 1<<11, /* Undersize Packet */ ··· 1735 1729 GMF_RX_CTRL_DEF = GMF_OPER_ON | GMF_RX_F_FL_ON, 1736 1730 }; 1737 1731 1732 + /* TX_GMF_EA 32 bit Tx GMAC FIFO End Address */ 1733 + enum { 1734 + TX_DYN_WM_ENA = 3, /* Yukon-FE+ specific */ 1735 + }; 1738 1736 1739 1737 /* TX_GMF_CTRL_T 32 bit Tx GMAC FIFO Control/Test */ 1740 1738 enum { ··· 2027 2017 u16 rx_tag; 2028 2018 struct vlan_group *vlgrp; 2029 2019 #endif 2020 + struct { 2021 + unsigned long last; 2022 + u32 mac_rp; 2023 + u8 mac_lev; 2024 + u8 fifo_rp; 2025 + u8 fifo_lev; 2026 + } check; 2027 + 2030 2028 2031 2029 dma_addr_t rx_le_map; 2032 2030 dma_addr_t tx_le_map; ··· 2058 2040 void __iomem *regs; 2059 2041 struct pci_dev *pdev; 2060 2042 struct net_device *dev[2]; 2043 + unsigned long flags; 2044 + #define SKY2_HW_USE_MSI 0x00000001 2045 + #define SKY2_HW_FIBRE_PHY 0x00000002 2046 + #define SKY2_HW_GIGABIT 0x00000004 2047 + #define SKY2_HW_NEWER_PHY 0x00000008 2048 + #define SKY2_HW_RAMBUFFER 0x00000010 /* chip has RAM FIFO */ 2049 + #define SKY2_HW_NEW_LE 0x00000020 /* new LSOv2 format */ 2050 + #define SKY2_HW_AUTO_TX_SUM 0x00000040 /* new IP decode for Tx */ 2051 + #define SKY2_HW_ADV_POWER_CTL 0x00000080 /* additional PHY power regs */ 2061 2052 2062 2053 u8 chip_id; 2063 2054 u8 chip_rev; 2064 2055 u8 pmd_type; 2065 2056 u8 ports; 2066 - u8 active; 2067 2057 2068 2058 struct sky2_status_le *st_le; 2069 2059 u32 st_idx; ··· 2079 2053 2080 2054 struct timer_list watchdog_timer; 2081 2055 struct work_struct restart_work; 2082 - int msi; 2083 2056 wait_queue_head_t msi_wait; 2084 2057 }; 2085 2058 2086 2059 static inline int sky2_is_copper(const struct sky2_hw *hw) 2087 2060 { 2088 - return !(hw->pmd_type == 'L' || hw->pmd_type == 'S' || hw->pmd_type == 'P'); 2061 + return !(hw->flags & SKY2_HW_FIBRE_PHY); 2089 2062 } 2090 2063 2091 2064 /* Register accessor for memory mapped device */