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 } 3095 3096 #define PCI_DEVICE_ID_MYRICOM_MYRI10GE_Z8E 0x0008 3097 3098 static struct pci_device_id myri10ge_pci_tbl[] = { 3099 {PCI_DEVICE(PCI_VENDOR_ID_MYRICOM, PCI_DEVICE_ID_MYRICOM_MYRI10GE_Z8E)}, 3100 {0}, 3101 }; 3102
··· 3094 } 3095 3096 #define PCI_DEVICE_ID_MYRICOM_MYRI10GE_Z8E 0x0008 3097 + #define PCI_DEVICE_ID_MYRICOM_MYRI10GE_Z8E_9 0x0009 3098 3099 static struct pci_device_id myri10ge_pci_tbl[] = { 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)}, 3103 {0}, 3104 }; 3105
+1
drivers/net/phy/phy.c
··· 409 410 return 0; 411 } 412 413 /** 414 * phy_start_aneg - start auto-negotiation for this PHY device
··· 409 410 return 0; 411 } 412 + EXPORT_SYMBOL(phy_mii_ioctl); 413 414 /** 415 * phy_start_aneg - start auto-negotiation for this PHY device
+256 -114
drivers/net/sky2.c
··· 51 #include "sky2.h" 52 53 #define DRV_NAME "sky2" 54 - #define DRV_VERSION "1.17" 55 #define PFX DRV_NAME " " 56 57 /* ··· 118 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4351) }, /* 88E8036 */ 119 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4352) }, /* 88E8038 */ 120 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4353) }, /* 88E8039 */ 121 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4356) }, /* 88EC033 */ 122 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4360) }, /* 88E8052 */ 123 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4361) }, /* 88E8050 */ 124 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4362) }, /* 88E8053 */ 125 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4363) }, /* 88E8055 */ 126 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4364) }, /* 88E8056 */ 127 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4366) }, /* 88EC036 */ 128 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4367) }, /* 88EC032 */ 129 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4368) }, /* 88EC034 */ ··· 150 "Extreme", /* 0xb5 */ 151 "EC", /* 0xb6 */ 152 "FE", /* 0xb7 */ 153 }; 154 155 static void sky2_set_multicast(struct net_device *dev); ··· 221 else 222 sky2_write8(hw, B2_Y2_CLK_GATE, 0); 223 224 - if (hw->chip_id == CHIP_ID_YUKON_EC_U || 225 - hw->chip_id == CHIP_ID_YUKON_EX) { 226 u32 reg; 227 228 sky2_pci_write32(hw, PCI_DEV_REG3, 0); ··· 314 struct sky2_port *sky2 = netdev_priv(hw->dev[port]); 315 u16 ctrl, ct1000, adv, pg, ledctrl, ledover, reg; 316 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)) { 321 u16 ectrl = gm_phy_read(hw, port, PHY_MARV_EXT_CTRL); 322 323 ectrl &= ~(PHY_M_EC_M_DSC_MSK | PHY_M_EC_S_DSC_MSK | ··· 335 336 ctrl = gm_phy_read(hw, port, PHY_MARV_PHY_CTRL); 337 if (sky2_is_copper(hw)) { 338 - if (hw->chip_id == CHIP_ID_YUKON_FE) { 339 /* enable automatic crossover */ 340 ctrl |= PHY_M_PC_MDI_XMODE(PHY_M_PC_ENA_AUTO) >> 1; 341 } else { ··· 347 348 /* downshift on PHY 88E1112 and 88E1149 is changed */ 349 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)) { 353 /* set downshift counter to 3x and enable downshift */ 354 ctrl &= ~PHY_M_PC_DSC_MSK; 355 ctrl |= PHY_M_PC_DSC(2) | PHY_M_PC_DOWN_S_ENA; ··· 363 gm_phy_write(hw, port, PHY_MARV_PHY_CTRL, ctrl); 364 365 /* special setup for PHY 88E1112 Fiber */ 366 - if (hw->chip_id == CHIP_ID_YUKON_XL && !sky2_is_copper(hw)) { 367 pg = gm_phy_read(hw, port, PHY_MARV_EXT_ADR); 368 369 /* Fiber: select 1000BASE-X only mode MAC Specific Ctrl Reg. */ ··· 454 455 gma_write16(hw, port, GM_GP_CTRL, reg); 456 457 - if (hw->chip_id != CHIP_ID_YUKON_FE) 458 gm_phy_write(hw, port, PHY_MARV_1000T_CTRL, ct1000); 459 460 gm_phy_write(hw, port, PHY_MARV_AUNE_ADV, adv); ··· 475 ctrl &= ~PHY_M_FELP_LED1_MSK; 476 /* change ACT LED control to blink mode */ 477 ctrl |= PHY_M_FELP_LED1_CTRL(LED_PAR_CTRL_ACT_BL); 478 gm_phy_write(hw, port, PHY_MARV_FE_LED_PAR, ctrl); 479 break; 480 ··· 564 565 /* set page register to 0 */ 566 gm_phy_write(hw, port, PHY_MARV_EXT_ADR, 0); 567 } else if (hw->chip_id != CHIP_ID_YUKON_EX) { 568 gm_phy_write(hw, port, PHY_MARV_LED_CTRL, ledctrl); 569 570 if (sky2->autoneg == AUTONEG_DISABLE || sky2->speed == SPEED_100) { ··· 691 692 static void sky2_set_tx_stfwd(struct sky2_hw *hw, unsigned port) 693 { 694 - if (hw->chip_id == CHIP_ID_YUKON_EX && hw->chip_rev != CHIP_REV_YU_EX_A0) { 695 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); 703 704 - sky2_write32(hw, SK_REG(port, TX_GMF_CTRL_T), 705 - TX_JUMBO_ENA | TX_STFW_DIS); 706 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); 713 } 714 } 715 ··· 795 /* Configure Rx MAC FIFO */ 796 sky2_write8(hw, SK_REG(port, RX_GMF_CTRL_T), GMF_RST_CLR); 797 rx_reg = GMF_OPER_ON | GMF_RX_F_FL_ON; 798 - if (hw->chip_id == CHIP_ID_YUKON_EX) 799 rx_reg |= GMF_RX_OVER_ON; 800 801 sky2_write32(hw, SK_REG(port, RX_GMF_CTRL_T), rx_reg); ··· 805 sky2_write16(hw, SK_REG(port, RX_GMF_FL_MSK), GMR_FS_ANY_ERR); 806 807 /* 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); 809 810 /* Configure Tx MAC FIFO */ 811 sky2_write8(hw, SK_REG(port, TX_GMF_CTRL_T), GMF_RST_CLR); 812 sky2_write16(hw, SK_REG(port, TX_GMF_CTRL_T), GMF_OPER_ON); 813 814 - if (hw->chip_id == CHIP_ID_YUKON_EC_U || hw->chip_id == CHIP_ID_YUKON_EX) { 815 sky2_write8(hw, SK_REG(port, RX_GMF_LP_THR), 768/8); 816 sky2_write8(hw, SK_REG(port, RX_GMF_UP_THR), 1024/8); 817 ··· 995 */ 996 static void rx_set_checksum(struct sky2_port *sky2) 997 { 998 - struct sky2_rx_le *le; 999 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; 1005 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 - 1011 } 1012 1013 /* ··· 1199 1200 sky2_prefetch_init(hw, rxq, sky2->rx_le_map, RX_LE_SIZE - 1); 1201 1202 - rx_set_checksum(sky2); 1203 1204 /* Space needed for frame data + headers rounded up */ 1205 size = roundup(sky2->netdev->mtu + ETH_HLEN + VLAN_HLEN, 8); ··· 1271 struct sky2_port *sky2 = netdev_priv(dev); 1272 struct sky2_hw *hw = sky2->hw; 1273 unsigned port = sky2->port; 1274 - u32 ramsize, imask; 1275 int cap, err = -ENOMEM; 1276 struct net_device *otherdev = hw->dev[sky2->port^1]; 1277 ··· 1326 1327 sky2_mac_init(hw, port); 1328 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) { 1334 u32 rxspace; 1335 1336 if (ramsize < 16) 1337 rxspace = ramsize / 2; ··· 1461 /* Check for TCP Segmentation Offload */ 1462 mss = skb_shinfo(skb)->gso_size; 1463 if (mss != 0) { 1464 - if (hw->chip_id != CHIP_ID_YUKON_EX) 1465 mss += ETH_HLEN + ip_hdrlen(skb) + tcp_hdrlen(skb); 1466 1467 if (mss != sky2->tx_last_mss) { 1468 le = get_tx_le(sky2); 1469 le->addr = cpu_to_le32(mss); 1470 - if (hw->chip_id == CHIP_ID_YUKON_EX) 1471 le->opcode = OP_MSS | HW_OWNER; 1472 else 1473 le->opcode = OP_LRGLEN | HW_OWNER; ··· 1495 /* Handle TCP checksum offload */ 1496 if (skb->ip_summed == CHECKSUM_PARTIAL) { 1497 /* 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) 1500 ctrl |= CALSUM; /* auto checksum */ 1501 else { 1502 const unsigned offset = skb_transport_offset(skb); ··· 1648 if (netif_msg_ifdown(sky2)) 1649 printk(KERN_INFO PFX "%s: disabling interface\n", dev->name); 1650 1651 - if (netif_carrier_ok(dev) && --hw->active == 0) 1652 - del_timer(&hw->watchdog_timer); 1653 - 1654 /* Stop more packets from being queued */ 1655 netif_stop_queue(dev); 1656 ··· 1731 1732 static u16 sky2_phy_speed(const struct sky2_hw *hw, u16 aux) 1733 { 1734 - if (!sky2_is_copper(hw)) 1735 return SPEED_1000; 1736 1737 - if (hw->chip_id == CHIP_ID_YUKON_FE) 1738 - return (aux & PHY_M_PS_SPEED_100) ? SPEED_100 : SPEED_10; 1739 1740 switch (aux & PHY_M_PS_SPEED_MSK) { 1741 case PHY_M_PS_SPEED_1000: ··· 1772 1773 netif_carrier_on(sky2->netdev); 1774 1775 - if (hw->active++ == 0) 1776 - mod_timer(&hw->watchdog_timer, jiffies + 1); 1777 - 1778 1779 /* Turn on link LED */ 1780 sky2_write8(hw, SK_REG(port, LNK_LED_REG), 1781 LINKLED_ON | LINKLED_BLINK_OFF | LINKLED_LINKSYNC_OFF); 1782 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) { 1786 u16 pg = gm_phy_read(hw, port, PHY_MARV_EXT_ADR); 1787 u16 led = PHY_M_LEDC_LOS_CTRL(1); /* link active */ 1788 ··· 1823 1824 netif_carrier_off(sky2->netdev); 1825 1826 - /* Stop watchdog if both ports are not active */ 1827 - if (--hw->active == 0) 1828 - del_timer(&hw->watchdog_timer); 1829 - 1830 - 1831 /* Turn on link LED */ 1832 sky2_write8(hw, SK_REG(port, LNK_LED_REG), LINKLED_OFF); 1833 ··· 1865 /* Since the pause result bits seem to in different positions on 1866 * different chips. look at registers. 1867 */ 1868 - if (!sky2_is_copper(hw)) { 1869 /* Shift for bits in fiber PHY */ 1870 advert &= ~(ADVERTISE_PAUSE_CAP|ADVERTISE_PAUSE_ASYM); 1871 lpa &= ~(LPA_PAUSE_CAP|LPA_PAUSE_ASYM); ··· 1976 if (new_mtu < ETH_ZLEN || new_mtu > ETH_JUMBO_MTU) 1977 return -EINVAL; 1978 1979 - if (new_mtu > ETH_DATA_LEN && hw->chip_id == CHIP_ID_YUKON_FE) 1980 return -EINVAL; 1981 1982 if (!netif_running(dev)) { ··· 1995 1996 synchronize_irq(hw->pdev->irq); 1997 1998 - if (hw->chip_id == CHIP_ID_YUKON_EC_U || hw->chip_id == CHIP_ID_YUKON_EX) 1999 sky2_set_tx_stfwd(hw, port); 2000 2001 ctl = gma_read16(hw, port, GM_GP_CTRL); ··· 2123 struct sky2_port *sky2 = netdev_priv(dev); 2124 struct rx_ring_info *re = sky2->rx_ring + sky2->rx_next; 2125 struct sk_buff *skb = NULL; 2126 2127 if (unlikely(netif_msg_rx_status(sky2))) 2128 printk(KERN_DEBUG PFX "%s: rx slot %u status 0x%x len %d\n", ··· 2144 if (!(status & GMR_FS_RX_OK)) 2145 goto resubmit; 2146 2147 - if (status >> 16 != length) 2148 goto len_mismatch; 2149 2150 if (length < copybreak) ··· 2161 /* Truncation of overlength packets 2162 causes PHY length to not match MAC length */ 2163 ++sky2->net_stats.rx_length_errors; 2164 2165 error: 2166 ++sky2->net_stats.rx_errors; ··· 2234 } 2235 2236 /* This chip reports checksum status differently */ 2237 - if (hw->chip_id == CHIP_ID_YUKON_EX) { 2238 if (sky2->rx_csum && 2239 (le->css & (CSS_ISIPV4 | CSS_ISIPV6)) && 2240 (le->css & CSS_TCPUDPCSOK)) ··· 2275 if (!sky2->rx_csum) 2276 break; 2277 2278 - if (hw->chip_id == CHIP_ID_YUKON_EX) 2279 break; 2280 2281 /* Both checksum counters are programmed to start at 2282 * the same offset, so unless there is a problem they ··· 2474 sky2_write32(hw, Q_ADDR(q, Q_CSR), BMU_CLR_IRQ_CHK); 2475 } 2476 2477 - /* Check for lost IRQ once a second */ 2478 static void sky2_watchdog(unsigned long arg) 2479 { 2480 struct sky2_hw *hw = (struct sky2_hw *) arg; 2481 2482 if (sky2_read32(hw, B0_ISRC)) { 2483 - struct net_device *dev = hw->dev[0]; 2484 - 2485 if (__netif_rx_schedule_prep(dev)) 2486 __netif_rx_schedule(dev); 2487 } 2488 2489 - if (hw->active > 0) 2490 - mod_timer(&hw->watchdog_timer, round_jiffies(jiffies + HZ)); 2491 } 2492 2493 /* Hardware/software error handling */ ··· 2636 #endif 2637 2638 /* Chip internal frequency for clock calculations */ 2639 - static inline u32 sky2_mhz(const struct sky2_hw *hw) 2640 { 2641 switch (hw->chip_id) { 2642 case CHIP_ID_YUKON_EC: 2643 case CHIP_ID_YUKON_EC_U: 2644 case CHIP_ID_YUKON_EX: 2645 - return 125; /* 125 Mhz */ 2646 case CHIP_ID_YUKON_FE: 2647 - return 100; /* 100 Mhz */ 2648 - default: /* YUKON_XL */ 2649 - return 156; /* 156 Mhz */ 2650 } 2651 } 2652 ··· 2679 sky2_write8(hw, B0_CTST, CS_RST_CLR); 2680 2681 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) { 2683 dev_err(&hw->pdev->dev, "unsupported chip type 0x%x\n", 2684 hw->chip_id); 2685 return -EOPNOTSUPP; 2686 } 2687 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 hw->pmd_type = sky2_read8(hw, B2_PMD_TYP); 2699 hw->ports = 1; 2700 t8 = sky2_read8(hw, B2_Y2_HW_RES); 2701 if ((t8 & CFG_DUAL_MAC_MSK) == CFG_DUAL_MAC_MSK) { ··· 2928 2929 sky2->wol = wol->wolopts; 2930 2931 - if (hw->chip_id == CHIP_ID_YUKON_EC_U || hw->chip_id == CHIP_ID_YUKON_EX) 2932 sky2_write32(hw, B0_CTST, sky2->wol 2933 ? Y2_HW_WOL_ON : Y2_HW_WOL_OFF); 2934 ··· 2948 | SUPPORTED_100baseT_Full 2949 | SUPPORTED_Autoneg | SUPPORTED_TP; 2950 2951 - if (hw->chip_id != CHIP_ID_YUKON_FE) 2952 modes |= SUPPORTED_1000baseT_Half 2953 | SUPPORTED_1000baseT_Full; 2954 return modes; ··· 2968 ecmd->supported = sky2_supported_modes(hw); 2969 ecmd->phy_address = PHY_ADDR_MARV; 2970 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 ecmd->port = PORT_TP; 2979 ecmd->speed = sky2->speed; 2980 } else { ··· 3923 sky2->hw = hw; 3924 sky2->msg_enable = netif_msg_init(debug, default_msg); 3925 3926 /* Auto speed and flow control */ 3927 sky2->autoneg = AUTONEG_ENABLE; 3928 sky2->flow_mode = FC_BOTH; ··· 3985 return IRQ_NONE; 3986 3987 if (status & Y2_IS_IRQ_SW) { 3988 - hw->msi = 1; 3989 wake_up(&hw->msi_wait); 3990 sky2_write8(hw, B0_CTST, CS_CL_SW_IRQ); 3991 } ··· 4013 sky2_write8(hw, B0_CTST, CS_ST_SW_IRQ); 4014 sky2_read8(hw, B0_CTST); 4015 4016 - wait_event_timeout(hw->msi_wait, hw->msi, HZ/10); 4017 4018 - if (!hw->msi) { 4019 /* MSI test failed, go back to INTx mode */ 4020 dev_info(&pdev->dev, "No interrupt generated using MSI, " 4021 "switching to INTx mode.\n"); ··· 4148 goto err_out_free_netdev; 4149 } 4150 4151 - err = request_irq(pdev->irq, sky2_intr, hw->msi ? 0 : IRQF_SHARED, 4152 dev->name, hw); 4153 if (err) { 4154 dev_err(&pdev->dev, "cannot assign irq %d\n", pdev->irq); ··· 4182 return 0; 4183 4184 err_out_unregister: 4185 - if (hw->msi) 4186 pci_disable_msi(pdev); 4187 unregister_netdev(dev); 4188 err_out_free_netdev: ··· 4231 sky2_read8(hw, B0_CTST); 4232 4233 free_irq(pdev->irq, hw); 4234 - if (hw->msi) 4235 pci_disable_msi(pdev); 4236 pci_free_consistent(pdev, STATUS_LE_BYTES, hw->st_le, hw->st_dma); 4237 pci_release_regions(pdev); ··· 4299 pci_enable_wake(pdev, PCI_D0, 0); 4300 4301 /* Re-enable all clocks */ 4302 - if (hw->chip_id == CHIP_ID_YUKON_EX || hw->chip_id == CHIP_ID_YUKON_EC_U) 4303 sky2_pci_write32(hw, PCI_DEV_REG3, 0); 4304 4305 sky2_reset(hw);
··· 51 #include "sky2.h" 52 53 #define DRV_NAME "sky2" 54 + #define DRV_VERSION "1.18" 55 #define PFX DRV_NAME " " 56 57 /* ··· 118 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4351) }, /* 88E8036 */ 119 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4352) }, /* 88E8038 */ 120 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4353) }, /* 88E8039 */ 121 + { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4354) }, /* 88E8040 */ 122 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4356) }, /* 88EC033 */ 123 + { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x435A) }, /* 88E8048 */ 124 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4360) }, /* 88E8052 */ 125 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4361) }, /* 88E8050 */ 126 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4362) }, /* 88E8053 */ 127 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4363) }, /* 88E8055 */ 128 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4364) }, /* 88E8056 */ 129 + { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4365) }, /* 88E8070 */ 130 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4366) }, /* 88EC036 */ 131 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4367) }, /* 88EC032 */ 132 { PCI_DEVICE(PCI_VENDOR_ID_MARVELL, 0x4368) }, /* 88EC034 */ ··· 147 "Extreme", /* 0xb5 */ 148 "EC", /* 0xb6 */ 149 "FE", /* 0xb7 */ 150 + "FE+", /* 0xb8 */ 151 }; 152 153 static void sky2_set_multicast(struct net_device *dev); ··· 217 else 218 sky2_write8(hw, B2_Y2_CLK_GATE, 0); 219 220 + if (hw->flags & SKY2_HW_ADV_POWER_CTL) { 221 u32 reg; 222 223 sky2_pci_write32(hw, PCI_DEV_REG3, 0); ··· 311 struct sky2_port *sky2 = netdev_priv(hw->dev[port]); 312 u16 ctrl, ct1000, adv, pg, ledctrl, ledover, reg; 313 314 + if (sky2->autoneg == AUTONEG_ENABLE && 315 + !(hw->flags & SKY2_HW_NEWER_PHY)) { 316 u16 ectrl = gm_phy_read(hw, port, PHY_MARV_EXT_CTRL); 317 318 ectrl &= ~(PHY_M_EC_M_DSC_MSK | PHY_M_EC_S_DSC_MSK | ··· 334 335 ctrl = gm_phy_read(hw, port, PHY_MARV_PHY_CTRL); 336 if (sky2_is_copper(hw)) { 337 + if (!(hw->flags & SKY2_HW_GIGABIT)) { 338 /* enable automatic crossover */ 339 ctrl |= PHY_M_PC_MDI_XMODE(PHY_M_PC_ENA_AUTO) >> 1; 340 } else { ··· 346 347 /* downshift on PHY 88E1112 and 88E1149 is changed */ 348 if (sky2->autoneg == AUTONEG_ENABLE 349 + && (hw->flags & SKY2_HW_NEWER_PHY)) { 350 /* set downshift counter to 3x and enable downshift */ 351 ctrl &= ~PHY_M_PC_DSC_MSK; 352 ctrl |= PHY_M_PC_DSC(2) | PHY_M_PC_DOWN_S_ENA; ··· 364 gm_phy_write(hw, port, PHY_MARV_PHY_CTRL, ctrl); 365 366 /* special setup for PHY 88E1112 Fiber */ 367 + if (hw->chip_id == CHIP_ID_YUKON_XL && (hw->flags & SKY2_HW_FIBRE_PHY)) { 368 pg = gm_phy_read(hw, port, PHY_MARV_EXT_ADR); 369 370 /* Fiber: select 1000BASE-X only mode MAC Specific Ctrl Reg. */ ··· 455 456 gma_write16(hw, port, GM_GP_CTRL, reg); 457 458 + if (hw->flags & SKY2_HW_GIGABIT) 459 gm_phy_write(hw, port, PHY_MARV_1000T_CTRL, ct1000); 460 461 gm_phy_write(hw, port, PHY_MARV_AUNE_ADV, adv); ··· 476 ctrl &= ~PHY_M_FELP_LED1_MSK; 477 /* change ACT LED control to blink mode */ 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 + 496 gm_phy_write(hw, port, PHY_MARV_FE_LED_PAR, ctrl); 497 break; 498 ··· 548 549 /* set page register to 0 */ 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); 556 } else if (hw->chip_id != CHIP_ID_YUKON_EX) { 557 + /* no effect on Yukon-XL */ 558 gm_phy_write(hw, port, PHY_MARV_LED_CTRL, ledctrl); 559 560 if (sky2->autoneg == AUTONEG_DISABLE || sky2->speed == SPEED_100) { ··· 669 670 static void sky2_set_tx_stfwd(struct sky2_hw *hw, unsigned port) 671 { 672 + struct net_device *dev = hw->dev[port]; 673 + 674 + if (dev->mtu <= ETH_DATA_LEN) 675 sky2_write32(hw, SK_REG(port, TX_GMF_CTRL_T), 676 + TX_JUMBO_DIS | TX_STFW_ENA); 677 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); 685 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); 691 } 692 } 693 ··· 773 /* Configure Rx MAC FIFO */ 774 sky2_write8(hw, SK_REG(port, RX_GMF_CTRL_T), GMF_RST_CLR); 775 rx_reg = GMF_OPER_ON | GMF_RX_F_FL_ON; 776 + if (hw->chip_id == CHIP_ID_YUKON_EX || 777 + hw->chip_id == CHIP_ID_YUKON_FE_P) 778 rx_reg |= GMF_RX_OVER_ON; 779 780 sky2_write32(hw, SK_REG(port, RX_GMF_CTRL_T), rx_reg); ··· 782 sky2_write16(hw, SK_REG(port, RX_GMF_FL_MSK), GMR_FS_ANY_ERR); 783 784 /* Set threshold to 0xa (64 bytes) + 1 to workaround pause bug */ 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); 791 792 /* Configure Tx MAC FIFO */ 793 sky2_write8(hw, SK_REG(port, TX_GMF_CTRL_T), GMF_RST_CLR); 794 sky2_write16(hw, SK_REG(port, TX_GMF_CTRL_T), GMF_OPER_ON); 795 796 + if (!(hw->flags & SKY2_HW_RAMBUFFER)) { 797 sky2_write8(hw, SK_REG(port, RX_GMF_LP_THR), 768/8); 798 sky2_write8(hw, SK_REG(port, RX_GMF_UP_THR), 1024/8); 799 ··· 967 */ 968 static void rx_set_checksum(struct sky2_port *sky2) 969 { 970 + struct sky2_rx_le *le = sky2_next_rx(sky2); 971 972 + le->addr = cpu_to_le32((ETH_HLEN << 16) | ETH_HLEN); 973 + le->ctrl = 0; 974 + le->opcode = OP_TCPSTART | HW_OWNER; 975 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); 979 } 980 981 /* ··· 1175 1176 sky2_prefetch_init(hw, rxq, sky2->rx_le_map, RX_LE_SIZE - 1); 1177 1178 + if (!(hw->flags & SKY2_HW_NEW_LE)) 1179 + rx_set_checksum(sky2); 1180 1181 /* Space needed for frame data + headers rounded up */ 1182 size = roundup(sky2->netdev->mtu + ETH_HLEN + VLAN_HLEN, 8); ··· 1246 struct sky2_port *sky2 = netdev_priv(dev); 1247 struct sky2_hw *hw = sky2->hw; 1248 unsigned port = sky2->port; 1249 + u32 imask; 1250 int cap, err = -ENOMEM; 1251 struct net_device *otherdev = hw->dev[sky2->port^1]; 1252 ··· 1301 1302 sky2_mac_init(hw, port); 1303 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; 1307 u32 rxspace; 1308 + 1309 + printk(KERN_DEBUG PFX "%s: ram buffer %dK\n", dev->name, ramsize); 1310 1311 if (ramsize < 16) 1312 rxspace = ramsize / 2; ··· 1436 /* Check for TCP Segmentation Offload */ 1437 mss = skb_shinfo(skb)->gso_size; 1438 if (mss != 0) { 1439 + 1440 + if (!(hw->flags & SKY2_HW_NEW_LE)) 1441 mss += ETH_HLEN + ip_hdrlen(skb) + tcp_hdrlen(skb); 1442 1443 if (mss != sky2->tx_last_mss) { 1444 le = get_tx_le(sky2); 1445 le->addr = cpu_to_le32(mss); 1446 + 1447 + if (hw->flags & SKY2_HW_NEW_LE) 1448 le->opcode = OP_MSS | HW_OWNER; 1449 else 1450 le->opcode = OP_LRGLEN | HW_OWNER; ··· 1468 /* Handle TCP checksum offload */ 1469 if (skb->ip_summed == CHECKSUM_PARTIAL) { 1470 /* On Yukon EX (some versions) encoding change. */ 1471 + if (hw->flags & SKY2_HW_AUTO_TX_SUM) 1472 ctrl |= CALSUM; /* auto checksum */ 1473 else { 1474 const unsigned offset = skb_transport_offset(skb); ··· 1622 if (netif_msg_ifdown(sky2)) 1623 printk(KERN_INFO PFX "%s: disabling interface\n", dev->name); 1624 1625 /* Stop more packets from being queued */ 1626 netif_stop_queue(dev); 1627 ··· 1708 1709 static u16 sky2_phy_speed(const struct sky2_hw *hw, u16 aux) 1710 { 1711 + if (hw->flags & SKY2_HW_FIBRE_PHY) 1712 return SPEED_1000; 1713 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 + } 1720 1721 switch (aux & PHY_M_PS_SPEED_MSK) { 1722 case PHY_M_PS_SPEED_1000: ··· 1745 1746 netif_carrier_on(sky2->netdev); 1747 1748 + mod_timer(&hw->watchdog_timer, jiffies + 1); 1749 1750 /* Turn on link LED */ 1751 sky2_write8(hw, SK_REG(port, LNK_LED_REG), 1752 LINKLED_ON | LINKLED_BLINK_OFF | LINKLED_LINKSYNC_OFF); 1753 1754 + if (hw->flags & SKY2_HW_NEWER_PHY) { 1755 u16 pg = gm_phy_read(hw, port, PHY_MARV_EXT_ADR); 1756 u16 led = PHY_M_LEDC_LOS_CTRL(1); /* link active */ 1757 ··· 1800 1801 netif_carrier_off(sky2->netdev); 1802 1803 /* Turn on link LED */ 1804 sky2_write8(hw, SK_REG(port, LNK_LED_REG), LINKLED_OFF); 1805 ··· 1847 /* Since the pause result bits seem to in different positions on 1848 * different chips. look at registers. 1849 */ 1850 + if (hw->flags & SKY2_HW_FIBRE_PHY) { 1851 /* Shift for bits in fiber PHY */ 1852 advert &= ~(ADVERTISE_PAUSE_CAP|ADVERTISE_PAUSE_ASYM); 1853 lpa &= ~(LPA_PAUSE_CAP|LPA_PAUSE_ASYM); ··· 1958 if (new_mtu < ETH_ZLEN || new_mtu > ETH_JUMBO_MTU) 1959 return -EINVAL; 1960 1961 + if (new_mtu > ETH_DATA_LEN && 1962 + (hw->chip_id == CHIP_ID_YUKON_FE || 1963 + hw->chip_id == CHIP_ID_YUKON_FE_P)) 1964 return -EINVAL; 1965 1966 if (!netif_running(dev)) { ··· 1975 1976 synchronize_irq(hw->pdev->irq); 1977 1978 + if (!(hw->flags & SKY2_HW_RAMBUFFER)) 1979 sky2_set_tx_stfwd(hw, port); 1980 1981 ctl = gma_read16(hw, port, GM_GP_CTRL); ··· 2103 struct sky2_port *sky2 = netdev_priv(dev); 2104 struct rx_ring_info *re = sky2->rx_ring + sky2->rx_next; 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 2113 2114 if (unlikely(netif_msg_rx_status(sky2))) 2115 printk(KERN_DEBUG PFX "%s: rx slot %u status 0x%x len %d\n", ··· 2117 if (!(status & GMR_FS_RX_OK)) 2118 goto resubmit; 2119 2120 + /* if length reported by DMA does not match PHY, packet was truncated */ 2121 + if (length != count) 2122 goto len_mismatch; 2123 2124 if (length < copybreak) ··· 2133 /* Truncation of overlength packets 2134 causes PHY length to not match MAC length */ 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; 2140 2141 error: 2142 ++sky2->net_stats.rx_errors; ··· 2202 } 2203 2204 /* This chip reports checksum status differently */ 2205 + if (hw->flags & SKY2_HW_NEW_LE) { 2206 if (sky2->rx_csum && 2207 (le->css & (CSS_ISIPV4 | CSS_ISIPV6)) && 2208 (le->css & CSS_TCPUDPCSOK)) ··· 2243 if (!sky2->rx_csum) 2244 break; 2245 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); 2252 break; 2253 + } 2254 2255 /* Both checksum counters are programmed to start at 2256 * the same offset, so unless there is a problem they ··· 2436 sky2_write32(hw, Q_ADDR(q, Q_CSR), BMU_CLR_IRQ_CHK); 2437 } 2438 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 + 2471 static void sky2_watchdog(unsigned long arg) 2472 { 2473 struct sky2_hw *hw = (struct sky2_hw *) arg; 2474 + struct net_device *dev; 2475 2476 + /* Check for lost IRQ once a second */ 2477 if (sky2_read32(hw, B0_ISRC)) { 2478 + dev = hw->dev[0]; 2479 if (__netif_rx_schedule_prep(dev)) 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; 2502 } 2503 2504 + mod_timer(&hw->watchdog_timer, round_jiffies(jiffies + HZ)); 2505 } 2506 2507 /* Hardware/software error handling */ ··· 2546 #endif 2547 2548 /* Chip internal frequency for clock calculations */ 2549 + static u32 sky2_mhz(const struct sky2_hw *hw) 2550 { 2551 switch (hw->chip_id) { 2552 case CHIP_ID_YUKON_EC: 2553 case CHIP_ID_YUKON_EC_U: 2554 case CHIP_ID_YUKON_EX: 2555 + return 125; 2556 + 2557 case CHIP_ID_YUKON_FE: 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(); 2568 } 2569 } 2570 ··· 2581 sky2_write8(hw, B0_CTST, CS_RST_CLR); 2582 2583 hw->chip_id = sky2_read8(hw, B2_CHIP_ID); 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: 2630 dev_err(&hw->pdev->dev, "unsupported chip type 0x%x\n", 2631 hw->chip_id); 2632 return -EOPNOTSUPP; 2633 } 2634 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 + 2640 hw->ports = 1; 2641 t8 = sky2_read8(hw, B2_Y2_HW_RES); 2642 if ((t8 & CFG_DUAL_MAC_MSK) == CFG_DUAL_MAC_MSK) { ··· 2791 2792 sky2->wol = wol->wolopts; 2793 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) 2797 sky2_write32(hw, B0_CTST, sky2->wol 2798 ? Y2_HW_WOL_ON : Y2_HW_WOL_OFF); 2799 ··· 2809 | SUPPORTED_100baseT_Full 2810 | SUPPORTED_Autoneg | SUPPORTED_TP; 2811 2812 + if (hw->flags & SKY2_HW_GIGABIT) 2813 modes |= SUPPORTED_1000baseT_Half 2814 | SUPPORTED_1000baseT_Full; 2815 return modes; ··· 2829 ecmd->supported = sky2_supported_modes(hw); 2830 ecmd->phy_address = PHY_ADDR_MARV; 2831 if (sky2_is_copper(hw)) { 2832 ecmd->port = PORT_TP; 2833 ecmd->speed = sky2->speed; 2834 } else { ··· 3791 sky2->hw = hw; 3792 sky2->msg_enable = netif_msg_init(debug, default_msg); 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 + 3801 /* Auto speed and flow control */ 3802 sky2->autoneg = AUTONEG_ENABLE; 3803 sky2->flow_mode = FC_BOTH; ··· 3846 return IRQ_NONE; 3847 3848 if (status & Y2_IS_IRQ_SW) { 3849 + hw->flags |= SKY2_HW_USE_MSI; 3850 wake_up(&hw->msi_wait); 3851 sky2_write8(hw, B0_CTST, CS_CL_SW_IRQ); 3852 } ··· 3874 sky2_write8(hw, B0_CTST, CS_ST_SW_IRQ); 3875 sky2_read8(hw, B0_CTST); 3876 3877 + wait_event_timeout(hw->msi_wait, (hw->flags & SKY2_HW_USE_MSI), HZ/10); 3878 3879 + if (!(hw->flags & SKY2_HW_USE_MSI)) { 3880 /* MSI test failed, go back to INTx mode */ 3881 dev_info(&pdev->dev, "No interrupt generated using MSI, " 3882 "switching to INTx mode.\n"); ··· 4009 goto err_out_free_netdev; 4010 } 4011 4012 + err = request_irq(pdev->irq, sky2_intr, 4013 + (hw->flags & SKY2_HW_USE_MSI) ? 0 : IRQF_SHARED, 4014 dev->name, hw); 4015 if (err) { 4016 dev_err(&pdev->dev, "cannot assign irq %d\n", pdev->irq); ··· 4042 return 0; 4043 4044 err_out_unregister: 4045 + if (hw->flags & SKY2_HW_USE_MSI) 4046 pci_disable_msi(pdev); 4047 unregister_netdev(dev); 4048 err_out_free_netdev: ··· 4091 sky2_read8(hw, B0_CTST); 4092 4093 free_irq(pdev->irq, hw); 4094 + if (hw->flags & SKY2_HW_USE_MSI) 4095 pci_disable_msi(pdev); 4096 pci_free_consistent(pdev, STATUS_LE_BYTES, hw->st_le, hw->st_dma); 4097 pci_release_regions(pdev); ··· 4159 pci_enable_wake(pdev, PCI_D0, 0); 4160 4161 /* Re-enable all clocks */ 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) 4165 sky2_pci_write32(hw, PCI_DEV_REG3, 0); 4166 4167 sky2_reset(hw);
+33 -8
drivers/net/sky2.h
··· 470 CHIP_ID_YUKON_EX = 0xb5, /* Chip ID for YUKON-2 Extreme */ 471 CHIP_ID_YUKON_EC = 0xb6, /* Chip ID for YUKON-2 EC */ 472 CHIP_ID_YUKON_FE = 0xb7, /* Chip ID for YUKON-2 FE */ 473 - 474 CHIP_REV_YU_EC_A1 = 0, /* Chip Rev. for Yukon-EC A1/A0 */ 475 CHIP_REV_YU_EC_A2 = 1, /* Chip Rev. for Yukon-EC A2 */ 476 CHIP_REV_YU_EC_A3 = 2, /* Chip Rev. for Yukon-EC A3 */ 477 - 478 CHIP_REV_YU_EC_U_A0 = 1, 479 CHIP_REV_YU_EC_U_A1 = 2, 480 CHIP_REV_YU_EC_U_B0 = 3, 481 - 482 CHIP_REV_YU_FE_A1 = 1, 483 CHIP_REV_YU_FE_A2 = 2, 484 - 485 }; 486 enum yukon_ex_rev { 487 CHIP_REV_YU_EX_A0 = 1, ··· 1674 1675 /* Receive Frame Status Encoding */ 1676 enum { 1677 - GMR_FS_LEN = 0xffff<<16, /* Bit 31..16: Rx Frame Length */ 1678 GMR_FS_VLAN = 1<<13, /* VLAN Packet */ 1679 GMR_FS_JABBER = 1<<12, /* Jabber Packet */ 1680 GMR_FS_UN_SIZE = 1<<11, /* Undersize Packet */ ··· 1735 GMF_RX_CTRL_DEF = GMF_OPER_ON | GMF_RX_F_FL_ON, 1736 }; 1737 1738 1739 /* TX_GMF_CTRL_T 32 bit Tx GMAC FIFO Control/Test */ 1740 enum { ··· 2027 u16 rx_tag; 2028 struct vlan_group *vlgrp; 2029 #endif 2030 2031 dma_addr_t rx_le_map; 2032 dma_addr_t tx_le_map; ··· 2058 void __iomem *regs; 2059 struct pci_dev *pdev; 2060 struct net_device *dev[2]; 2061 2062 u8 chip_id; 2063 u8 chip_rev; 2064 u8 pmd_type; 2065 u8 ports; 2066 - u8 active; 2067 2068 struct sky2_status_le *st_le; 2069 u32 st_idx; ··· 2079 2080 struct timer_list watchdog_timer; 2081 struct work_struct restart_work; 2082 - int msi; 2083 wait_queue_head_t msi_wait; 2084 }; 2085 2086 static inline int sky2_is_copper(const struct sky2_hw *hw) 2087 { 2088 - return !(hw->pmd_type == 'L' || hw->pmd_type == 'S' || hw->pmd_type == 'P'); 2089 } 2090 2091 /* Register accessor for memory mapped device */
··· 470 CHIP_ID_YUKON_EX = 0xb5, /* Chip ID for YUKON-2 Extreme */ 471 CHIP_ID_YUKON_EC = 0xb6, /* Chip ID for YUKON-2 EC */ 472 CHIP_ID_YUKON_FE = 0xb7, /* Chip ID for YUKON-2 FE */ 473 + CHIP_ID_YUKON_FE_P = 0xb8, /* Chip ID for YUKON-2 FE+ */ 474 + }; 475 + enum yukon_ec_rev { 476 CHIP_REV_YU_EC_A1 = 0, /* Chip Rev. for Yukon-EC A1/A0 */ 477 CHIP_REV_YU_EC_A2 = 1, /* Chip Rev. for Yukon-EC A2 */ 478 CHIP_REV_YU_EC_A3 = 2, /* Chip Rev. for Yukon-EC A3 */ 479 + }; 480 + enum yukon_ec_u_rev { 481 CHIP_REV_YU_EC_U_A0 = 1, 482 CHIP_REV_YU_EC_U_A1 = 2, 483 CHIP_REV_YU_EC_U_B0 = 3, 484 + }; 485 + enum yukon_fe_rev { 486 CHIP_REV_YU_FE_A1 = 1, 487 CHIP_REV_YU_FE_A2 = 2, 488 + }; 489 + enum yukon_fe_p_rev { 490 + CHIP_REV_YU_FE2_A0 = 0, 491 }; 492 enum yukon_ex_rev { 493 CHIP_REV_YU_EX_A0 = 1, ··· 1668 1669 /* Receive Frame Status Encoding */ 1670 enum { 1671 + GMR_FS_LEN = 0x7fff<<16, /* Bit 30..16: Rx Frame Length */ 1672 GMR_FS_VLAN = 1<<13, /* VLAN Packet */ 1673 GMR_FS_JABBER = 1<<12, /* Jabber Packet */ 1674 GMR_FS_UN_SIZE = 1<<11, /* Undersize Packet */ ··· 1729 GMF_RX_CTRL_DEF = GMF_OPER_ON | GMF_RX_F_FL_ON, 1730 }; 1731 1732 + /* TX_GMF_EA 32 bit Tx GMAC FIFO End Address */ 1733 + enum { 1734 + TX_DYN_WM_ENA = 3, /* Yukon-FE+ specific */ 1735 + }; 1736 1737 /* TX_GMF_CTRL_T 32 bit Tx GMAC FIFO Control/Test */ 1738 enum { ··· 2017 u16 rx_tag; 2018 struct vlan_group *vlgrp; 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 + 2028 2029 dma_addr_t rx_le_map; 2030 dma_addr_t tx_le_map; ··· 2040 void __iomem *regs; 2041 struct pci_dev *pdev; 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 */ 2052 2053 u8 chip_id; 2054 u8 chip_rev; 2055 u8 pmd_type; 2056 u8 ports; 2057 2058 struct sky2_status_le *st_le; 2059 u32 st_idx; ··· 2053 2054 struct timer_list watchdog_timer; 2055 struct work_struct restart_work; 2056 wait_queue_head_t msi_wait; 2057 }; 2058 2059 static inline int sky2_is_copper(const struct sky2_hw *hw) 2060 { 2061 + return !(hw->flags & SKY2_HW_FIBRE_PHY); 2062 } 2063 2064 /* Register accessor for memory mapped device */