diff options
Diffstat (limited to 'drivers/net/phy/marvell.c')
| -rw-r--r-- | drivers/net/phy/marvell.c | 446 | 
1 files changed, 394 insertions, 52 deletions
diff --git a/drivers/net/phy/marvell.c b/drivers/net/phy/marvell.c index f0bd1a1aba3..bd37e45c89c 100644 --- a/drivers/net/phy/marvell.c +++ b/drivers/net/phy/marvell.c @@ -7,6 +7,8 @@   *   * Copyright (c) 2004 Freescale Semiconductor, Inc.   * + * Copyright (c) 2013 Michael Stapelberg <michael@stapelberg.de> + *   * This program is free software; you can redistribute  it and/or modify it   * under  the terms of  the GNU General  Public License as published by the   * Free Software Foundation;  either version 2 of the  License, or (at your @@ -30,10 +32,13 @@  #include <linux/ethtool.h>  #include <linux/phy.h>  #include <linux/marvell_phy.h> +#include <linux/of.h> -#include <asm/io.h> +#include <linux/io.h>  #include <asm/irq.h> -#include <asm/uaccess.h> +#include <linux/uaccess.h> + +#define MII_MARVELL_PHY_PAGE		22  #define MII_M1011_IEVENT		0x13  #define MII_M1011_IEVENT_CLEAR		0x0000 @@ -77,10 +82,31 @@  #define MII_88E1318S_PHY_MSCR1_REG	16  #define MII_88E1318S_PHY_MSCR1_PAD_ODD	BIT(6) +/* Copper Specific Interrupt Enable Register */ +#define MII_88E1318S_PHY_CSIER                              0x12 +/* WOL Event Interrupt Enable */ +#define MII_88E1318S_PHY_CSIER_WOL_EIE                      BIT(7) + +/* LED Timer Control Register */ +#define MII_88E1318S_PHY_LED_PAGE                           0x03 +#define MII_88E1318S_PHY_LED_TCR                            0x12 +#define MII_88E1318S_PHY_LED_TCR_FORCE_INT                  BIT(15) +#define MII_88E1318S_PHY_LED_TCR_INTn_ENABLE                BIT(7) +#define MII_88E1318S_PHY_LED_TCR_INT_ACTIVE_LOW             BIT(11) + +/* Magic Packet MAC address registers */ +#define MII_88E1318S_PHY_MAGIC_PACKET_WORD2                 0x17 +#define MII_88E1318S_PHY_MAGIC_PACKET_WORD1                 0x18 +#define MII_88E1318S_PHY_MAGIC_PACKET_WORD0                 0x19 + +#define MII_88E1318S_PHY_WOL_PAGE                           0x11 +#define MII_88E1318S_PHY_WOL_CTRL                           0x10 +#define MII_88E1318S_PHY_WOL_CTRL_CLEAR_WOL_STATUS          BIT(12) +#define MII_88E1318S_PHY_WOL_CTRL_MAGIC_PACKET_MATCH_ENABLE BIT(14) +  #define MII_88E1121_PHY_LED_CTRL	16  #define MII_88E1121_PHY_LED_PAGE	3  #define MII_88E1121_PHY_LED_DEF		0x0030 -#define MII_88E1121_PHY_PAGE		22  #define MII_M1011_PHY_STATUS		0x11  #define MII_M1011_PHY_STATUS_1000	0x8000 @@ -90,6 +116,8 @@  #define MII_M1011_PHY_STATUS_RESOLVED	0x0800  #define MII_M1011_PHY_STATUS_LINK	0x0400 +#define MII_M1116R_CONTROL_REG_MAC	21 +  MODULE_DESCRIPTION("Marvell PHY driver");  MODULE_AUTHOR("Andy Fleming"); @@ -186,13 +214,94 @@ static int marvell_config_aneg(struct phy_device *phydev)  	return 0;  } +#ifdef CONFIG_OF_MDIO +/* + * Set and/or override some configuration registers based on the + * marvell,reg-init property stored in the of_node for the phydev. + * + * marvell,reg-init = <reg-page reg mask value>,...; + * + * There may be one or more sets of <reg-page reg mask value>: + * + * reg-page: which register bank to use. + * reg: the register. + * mask: if non-zero, ANDed with existing register value. + * value: ORed with the masked value and written to the regiser. + * + */ +static int marvell_of_reg_init(struct phy_device *phydev) +{ +	const __be32 *paddr; +	int len, i, saved_page, current_page, page_changed, ret; + +	if (!phydev->dev.of_node) +		return 0; + +	paddr = of_get_property(phydev->dev.of_node, "marvell,reg-init", &len); +	if (!paddr || len < (4 * sizeof(*paddr))) +		return 0; + +	saved_page = phy_read(phydev, MII_MARVELL_PHY_PAGE); +	if (saved_page < 0) +		return saved_page; +	page_changed = 0; +	current_page = saved_page; + +	ret = 0; +	len /= sizeof(*paddr); +	for (i = 0; i < len - 3; i += 4) { +		u16 reg_page = be32_to_cpup(paddr + i); +		u16 reg = be32_to_cpup(paddr + i + 1); +		u16 mask = be32_to_cpup(paddr + i + 2); +		u16 val_bits = be32_to_cpup(paddr + i + 3); +		int val; + +		if (reg_page != current_page) { +			current_page = reg_page; +			page_changed = 1; +			ret = phy_write(phydev, MII_MARVELL_PHY_PAGE, reg_page); +			if (ret < 0) +				goto err; +		} + +		val = 0; +		if (mask) { +			val = phy_read(phydev, reg); +			if (val < 0) { +				ret = val; +				goto err; +			} +			val &= mask; +		} +		val |= val_bits; + +		ret = phy_write(phydev, reg, val); +		if (ret < 0) +			goto err; + +	} +err: +	if (page_changed) { +		i = phy_write(phydev, MII_MARVELL_PHY_PAGE, saved_page); +		if (ret == 0) +			ret = i; +	} +	return ret; +} +#else +static int marvell_of_reg_init(struct phy_device *phydev) +{ +	return 0; +} +#endif /* CONFIG_OF_MDIO */ +  static int m88e1121_config_aneg(struct phy_device *phydev)  {  	int err, oldpage, mscr; -	oldpage = phy_read(phydev, MII_88E1121_PHY_PAGE); +	oldpage = phy_read(phydev, MII_MARVELL_PHY_PAGE); -	err = phy_write(phydev, MII_88E1121_PHY_PAGE, +	err = phy_write(phydev, MII_MARVELL_PHY_PAGE,  			MII_88E1121_PHY_MSCR_PAGE);  	if (err < 0)  		return err; @@ -218,7 +327,7 @@ static int m88e1121_config_aneg(struct phy_device *phydev)  			return err;  	} -	phy_write(phydev, MII_88E1121_PHY_PAGE, oldpage); +	phy_write(phydev, MII_MARVELL_PHY_PAGE, oldpage);  	err = phy_write(phydev, MII_BMCR, BMCR_RESET);  	if (err < 0) @@ -229,11 +338,11 @@ static int m88e1121_config_aneg(struct phy_device *phydev)  	if (err < 0)  		return err; -	oldpage = phy_read(phydev, MII_88E1121_PHY_PAGE); +	oldpage = phy_read(phydev, MII_MARVELL_PHY_PAGE); -	phy_write(phydev, MII_88E1121_PHY_PAGE, MII_88E1121_PHY_LED_PAGE); +	phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_88E1121_PHY_LED_PAGE);  	phy_write(phydev, MII_88E1121_PHY_LED_CTRL, MII_88E1121_PHY_LED_DEF); -	phy_write(phydev, MII_88E1121_PHY_PAGE, oldpage); +	phy_write(phydev, MII_MARVELL_PHY_PAGE, oldpage);  	err = genphy_config_aneg(phydev); @@ -244,9 +353,9 @@ static int m88e1318_config_aneg(struct phy_device *phydev)  {  	int err, oldpage, mscr; -	oldpage = phy_read(phydev, MII_88E1121_PHY_PAGE); +	oldpage = phy_read(phydev, MII_MARVELL_PHY_PAGE); -	err = phy_write(phydev, MII_88E1121_PHY_PAGE, +	err = phy_write(phydev, MII_MARVELL_PHY_PAGE,  			MII_88E1121_PHY_MSCR_PAGE);  	if (err < 0)  		return err; @@ -258,26 +367,77 @@ static int m88e1318_config_aneg(struct phy_device *phydev)  	if (err < 0)  		return err; -	err = phy_write(phydev, MII_88E1121_PHY_PAGE, oldpage); +	err = phy_write(phydev, MII_MARVELL_PHY_PAGE, oldpage);  	if (err < 0)  		return err;  	return m88e1121_config_aneg(phydev);  } -static int m88e1111_config_init(struct phy_device *phydev) +static int m88e1510_config_aneg(struct phy_device *phydev)  {  	int err; + +	err = m88e1318_config_aneg(phydev); +	if (err < 0) +		return err; + +	return marvell_of_reg_init(phydev); +} + +static int m88e1116r_config_init(struct phy_device *phydev) +{  	int temp; +	int err; + +	temp = phy_read(phydev, MII_BMCR); +	temp |= BMCR_RESET; +	err = phy_write(phydev, MII_BMCR, temp); +	if (err < 0) +		return err; + +	mdelay(500); + +	err = phy_write(phydev, MII_MARVELL_PHY_PAGE, 0); +	if (err < 0) +		return err; -	/* Enable Fiber/Copper auto selection */ -	temp = phy_read(phydev, MII_M1111_PHY_EXT_SR); -	temp &= ~MII_M1111_HWCFG_FIBER_COPPER_AUTO; -	phy_write(phydev, MII_M1111_PHY_EXT_SR, temp); +	temp = phy_read(phydev, MII_M1011_PHY_SCR); +	temp |= (7 << 12);	/* max number of gigabit attempts */ +	temp |= (1 << 11);	/* enable downshift */ +	temp |= MII_M1011_PHY_SCR_AUTO_CROSS; +	err = phy_write(phydev, MII_M1011_PHY_SCR, temp); +	if (err < 0) +		return err; + +	err = phy_write(phydev, MII_MARVELL_PHY_PAGE, 2); +	if (err < 0) +		return err; +	temp = phy_read(phydev, MII_M1116R_CONTROL_REG_MAC); +	temp |= (1 << 5); +	temp |= (1 << 4); +	err = phy_write(phydev, MII_M1116R_CONTROL_REG_MAC, temp); +	if (err < 0) +		return err; +	err = phy_write(phydev, MII_MARVELL_PHY_PAGE, 0); +	if (err < 0) +		return err;  	temp = phy_read(phydev, MII_BMCR);  	temp |= BMCR_RESET; -	phy_write(phydev, MII_BMCR, temp); +	err = phy_write(phydev, MII_BMCR, temp); +	if (err < 0) +		return err; + +	mdelay(500); + +	return 0; +} + +static int m88e1111_config_init(struct phy_device *phydev) +{ +	int err; +	int temp;  	if ((phydev->interface == PHY_INTERFACE_MODE_RGMII) ||  	    (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID) || @@ -368,12 +528,11 @@ static int m88e1111_config_init(struct phy_device *phydev)  			return err;  	} - -	err = phy_write(phydev, MII_BMCR, BMCR_RESET); +	err = marvell_of_reg_init(phydev);  	if (err < 0)  		return err; -	return 0; +	return phy_write(phydev, MII_BMCR, BMCR_RESET);  }  static int m88e1118_config_aneg(struct phy_device *phydev) @@ -398,7 +557,7 @@ static int m88e1118_config_init(struct phy_device *phydev)  	int err;  	/* Change address */ -	err = phy_write(phydev, 0x16, 0x0002); +	err = phy_write(phydev, MII_MARVELL_PHY_PAGE, 0x0002);  	if (err < 0)  		return err; @@ -408,7 +567,7 @@ static int m88e1118_config_init(struct phy_device *phydev)  		return err;  	/* Change address */ -	err = phy_write(phydev, 0x16, 0x0003); +	err = phy_write(phydev, MII_MARVELL_PHY_PAGE, 0x0003);  	if (err < 0)  		return err; @@ -420,16 +579,42 @@ static int m88e1118_config_init(struct phy_device *phydev)  	if (err < 0)  		return err; +	err = marvell_of_reg_init(phydev); +	if (err < 0) +		return err; +  	/* Reset address */ -	err = phy_write(phydev, 0x16, 0x0); +	err = phy_write(phydev, MII_MARVELL_PHY_PAGE, 0x0);  	if (err < 0)  		return err; -	err = phy_write(phydev, MII_BMCR, BMCR_RESET); +	return phy_write(phydev, MII_BMCR, BMCR_RESET); +} + +static int m88e1149_config_init(struct phy_device *phydev) +{ +	int err; + +	/* Change address */ +	err = phy_write(phydev, MII_MARVELL_PHY_PAGE, 0x0002);  	if (err < 0)  		return err; -	return 0; +	/* Enable 1000 Mbit */ +	err = phy_write(phydev, 0x15, 0x1048); +	if (err < 0) +		return err; + +	err = marvell_of_reg_init(phydev); +	if (err < 0) +		return err; + +	/* Reset address */ +	err = phy_write(phydev, MII_MARVELL_PHY_PAGE, 0x0); +	if (err < 0) +		return err; + +	return phy_write(phydev, MII_BMCR, BMCR_RESET);  }  static int m88e1145_config_init(struct phy_device *phydev) @@ -491,6 +676,10 @@ static int m88e1145_config_init(struct phy_device *phydev)  		}  	} +	err = marvell_of_reg_init(phydev); +	if (err < 0) +		return err; +  	return 0;  } @@ -593,6 +782,107 @@ static int m88e1121_did_interrupt(struct phy_device *phydev)  	return 0;  } +static void m88e1318_get_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol) +{ +	wol->supported = WAKE_MAGIC; +	wol->wolopts = 0; + +	if (phy_write(phydev, MII_MARVELL_PHY_PAGE, +		      MII_88E1318S_PHY_WOL_PAGE) < 0) +		return; + +	if (phy_read(phydev, MII_88E1318S_PHY_WOL_CTRL) & +	    MII_88E1318S_PHY_WOL_CTRL_MAGIC_PACKET_MATCH_ENABLE) +		wol->wolopts |= WAKE_MAGIC; + +	if (phy_write(phydev, MII_MARVELL_PHY_PAGE, 0x00) < 0) +		return; +} + +static int m88e1318_set_wol(struct phy_device *phydev, struct ethtool_wolinfo *wol) +{ +	int err, oldpage, temp; + +	oldpage = phy_read(phydev, MII_MARVELL_PHY_PAGE); + +	if (wol->wolopts & WAKE_MAGIC) { +		/* Explicitly switch to page 0x00, just to be sure */ +		err = phy_write(phydev, MII_MARVELL_PHY_PAGE, 0x00); +		if (err < 0) +			return err; + +		/* Enable the WOL interrupt */ +		temp = phy_read(phydev, MII_88E1318S_PHY_CSIER); +		temp |= MII_88E1318S_PHY_CSIER_WOL_EIE; +		err = phy_write(phydev, MII_88E1318S_PHY_CSIER, temp); +		if (err < 0) +			return err; + +		err = phy_write(phydev, MII_MARVELL_PHY_PAGE, +				MII_88E1318S_PHY_LED_PAGE); +		if (err < 0) +			return err; + +		/* Setup LED[2] as interrupt pin (active low) */ +		temp = phy_read(phydev, MII_88E1318S_PHY_LED_TCR); +		temp &= ~MII_88E1318S_PHY_LED_TCR_FORCE_INT; +		temp |= MII_88E1318S_PHY_LED_TCR_INTn_ENABLE; +		temp |= MII_88E1318S_PHY_LED_TCR_INT_ACTIVE_LOW; +		err = phy_write(phydev, MII_88E1318S_PHY_LED_TCR, temp); +		if (err < 0) +			return err; + +		err = phy_write(phydev, MII_MARVELL_PHY_PAGE, +				MII_88E1318S_PHY_WOL_PAGE); +		if (err < 0) +			return err; + +		/* Store the device address for the magic packet */ +		err = phy_write(phydev, MII_88E1318S_PHY_MAGIC_PACKET_WORD2, +				((phydev->attached_dev->dev_addr[5] << 8) | +				 phydev->attached_dev->dev_addr[4])); +		if (err < 0) +			return err; +		err = phy_write(phydev, MII_88E1318S_PHY_MAGIC_PACKET_WORD1, +				((phydev->attached_dev->dev_addr[3] << 8) | +				 phydev->attached_dev->dev_addr[2])); +		if (err < 0) +			return err; +		err = phy_write(phydev, MII_88E1318S_PHY_MAGIC_PACKET_WORD0, +				((phydev->attached_dev->dev_addr[1] << 8) | +				 phydev->attached_dev->dev_addr[0])); +		if (err < 0) +			return err; + +		/* Clear WOL status and enable magic packet matching */ +		temp = phy_read(phydev, MII_88E1318S_PHY_WOL_CTRL); +		temp |= MII_88E1318S_PHY_WOL_CTRL_CLEAR_WOL_STATUS; +		temp |= MII_88E1318S_PHY_WOL_CTRL_MAGIC_PACKET_MATCH_ENABLE; +		err = phy_write(phydev, MII_88E1318S_PHY_WOL_CTRL, temp); +		if (err < 0) +			return err; +	} else { +		err = phy_write(phydev, MII_MARVELL_PHY_PAGE, +				MII_88E1318S_PHY_WOL_PAGE); +		if (err < 0) +			return err; + +		/* Clear WOL status and disable magic packet matching */ +		temp = phy_read(phydev, MII_88E1318S_PHY_WOL_CTRL); +		temp |= MII_88E1318S_PHY_WOL_CTRL_CLEAR_WOL_STATUS; +		temp &= ~MII_88E1318S_PHY_WOL_CTRL_MAGIC_PACKET_MATCH_ENABLE; +		err = phy_write(phydev, MII_88E1318S_PHY_WOL_CTRL, temp); +		if (err < 0) +			return err; +	} + +	err = phy_write(phydev, MII_MARVELL_PHY_PAGE, oldpage); +	if (err < 0) +		return err; + +	return 0; +} +  static struct phy_driver marvell_drivers[] = {  	{  		.phy_id = MARVELL_PHY_ID_88E1101, @@ -604,6 +894,8 @@ static struct phy_driver marvell_drivers[] = {  		.read_status = &genphy_read_status,  		.ack_interrupt = &marvell_ack_interrupt,  		.config_intr = &marvell_config_intr, +		.resume = &genphy_resume, +		.suspend = &genphy_suspend,  		.driver = { .owner = THIS_MODULE },  	},  	{ @@ -617,6 +909,8 @@ static struct phy_driver marvell_drivers[] = {  		.read_status = &genphy_read_status,  		.ack_interrupt = &marvell_ack_interrupt,  		.config_intr = &marvell_config_intr, +		.resume = &genphy_resume, +		.suspend = &genphy_suspend,  		.driver = { .owner = THIS_MODULE },  	},  	{ @@ -630,6 +924,8 @@ static struct phy_driver marvell_drivers[] = {  		.read_status = &marvell_read_status,  		.ack_interrupt = &marvell_ack_interrupt,  		.config_intr = &marvell_config_intr, +		.resume = &genphy_resume, +		.suspend = &genphy_suspend,  		.driver = { .owner = THIS_MODULE },  	},  	{ @@ -643,6 +939,8 @@ static struct phy_driver marvell_drivers[] = {  		.read_status = &genphy_read_status,  		.ack_interrupt = &marvell_ack_interrupt,  		.config_intr = &marvell_config_intr, +		.resume = &genphy_resume, +		.suspend = &genphy_suspend,  		.driver = {.owner = THIS_MODULE,},  	},  	{ @@ -656,6 +954,8 @@ static struct phy_driver marvell_drivers[] = {  		.ack_interrupt = &marvell_ack_interrupt,  		.config_intr = &marvell_config_intr,  		.did_interrupt = &m88e1121_did_interrupt, +		.resume = &genphy_resume, +		.suspend = &genphy_suspend,  		.driver = { .owner = THIS_MODULE },  	},  	{ @@ -669,6 +969,10 @@ static struct phy_driver marvell_drivers[] = {  		.ack_interrupt = &marvell_ack_interrupt,  		.config_intr = &marvell_config_intr,  		.did_interrupt = &m88e1121_did_interrupt, +		.get_wol = &m88e1318_get_wol, +		.set_wol = &m88e1318_set_wol, +		.resume = &genphy_resume, +		.suspend = &genphy_suspend,  		.driver = { .owner = THIS_MODULE },  	},  	{ @@ -682,6 +986,23 @@ static struct phy_driver marvell_drivers[] = {  		.read_status = &genphy_read_status,  		.ack_interrupt = &marvell_ack_interrupt,  		.config_intr = &marvell_config_intr, +		.resume = &genphy_resume, +		.suspend = &genphy_suspend, +		.driver = { .owner = THIS_MODULE }, +	}, +	{ +		.phy_id = MARVELL_PHY_ID_88E1149R, +		.phy_id_mask = MARVELL_PHY_ID_MASK, +		.name = "Marvell 88E1149R", +		.features = PHY_GBIT_FEATURES, +		.flags = PHY_HAS_INTERRUPT, +		.config_init = &m88e1149_config_init, +		.config_aneg = &m88e1118_config_aneg, +		.read_status = &genphy_read_status, +		.ack_interrupt = &marvell_ack_interrupt, +		.config_intr = &marvell_config_intr, +		.resume = &genphy_resume, +		.suspend = &genphy_suspend,  		.driver = { .owner = THIS_MODULE },  	},  	{ @@ -695,48 +1016,69 @@ static struct phy_driver marvell_drivers[] = {  		.read_status = &genphy_read_status,  		.ack_interrupt = &marvell_ack_interrupt,  		.config_intr = &marvell_config_intr, +		.resume = &genphy_resume, +		.suspend = &genphy_suspend, +		.driver = { .owner = THIS_MODULE }, +	}, +	{ +		.phy_id = MARVELL_PHY_ID_88E1116R, +		.phy_id_mask = MARVELL_PHY_ID_MASK, +		.name = "Marvell 88E1116R", +		.features = PHY_GBIT_FEATURES, +		.flags = PHY_HAS_INTERRUPT, +		.config_init = &m88e1116r_config_init, +		.config_aneg = &genphy_config_aneg, +		.read_status = &genphy_read_status, +		.ack_interrupt = &marvell_ack_interrupt, +		.config_intr = &marvell_config_intr, +		.resume = &genphy_resume, +		.suspend = &genphy_suspend, +		.driver = { .owner = THIS_MODULE }, +	}, +	{ +		.phy_id = MARVELL_PHY_ID_88E1510, +		.phy_id_mask = MARVELL_PHY_ID_MASK, +		.name = "Marvell 88E1510", +		.features = PHY_GBIT_FEATURES, +		.flags = PHY_HAS_INTERRUPT, +		.config_aneg = &m88e1510_config_aneg, +		.read_status = &marvell_read_status, +		.ack_interrupt = &marvell_ack_interrupt, +		.config_intr = &marvell_config_intr, +		.did_interrupt = &m88e1121_did_interrupt, +		.resume = &genphy_resume, +		.suspend = &genphy_suspend,  		.driver = { .owner = THIS_MODULE },  	},  };  static int __init marvell_init(void)  { -	int ret; -	int i; - -	for (i = 0; i < ARRAY_SIZE(marvell_drivers); i++) { -		ret = phy_driver_register(&marvell_drivers[i]); - -		if (ret) { -			while (i-- > 0) -				phy_driver_unregister(&marvell_drivers[i]); -			return ret; -		} -	} - -	return 0; +	return phy_drivers_register(marvell_drivers, +		 ARRAY_SIZE(marvell_drivers));  }  static void __exit marvell_exit(void)  { -	int i; - -	for (i = 0; i < ARRAY_SIZE(marvell_drivers); i++) -		phy_driver_unregister(&marvell_drivers[i]); +	phy_drivers_unregister(marvell_drivers, +		 ARRAY_SIZE(marvell_drivers));  }  module_init(marvell_init);  module_exit(marvell_exit);  static struct mdio_device_id __maybe_unused marvell_tbl[] = { -	{ 0x01410c60, 0xfffffff0 }, -	{ 0x01410c90, 0xfffffff0 }, -	{ 0x01410cc0, 0xfffffff0 }, -	{ 0x01410e10, 0xfffffff0 }, -	{ 0x01410cb0, 0xfffffff0 }, -	{ 0x01410cd0, 0xfffffff0 }, -	{ 0x01410e30, 0xfffffff0 }, -	{ 0x01410e90, 0xfffffff0 }, +	{ MARVELL_PHY_ID_88E1101, MARVELL_PHY_ID_MASK }, +	{ MARVELL_PHY_ID_88E1112, MARVELL_PHY_ID_MASK }, +	{ MARVELL_PHY_ID_88E1111, MARVELL_PHY_ID_MASK }, +	{ MARVELL_PHY_ID_88E1118, MARVELL_PHY_ID_MASK }, +	{ MARVELL_PHY_ID_88E1121R, MARVELL_PHY_ID_MASK }, +	{ MARVELL_PHY_ID_88E1145, MARVELL_PHY_ID_MASK }, +	{ MARVELL_PHY_ID_88E1149R, MARVELL_PHY_ID_MASK }, +	{ MARVELL_PHY_ID_88E1240, MARVELL_PHY_ID_MASK }, +	{ MARVELL_PHY_ID_88E1318S, MARVELL_PHY_ID_MASK }, +	{ MARVELL_PHY_ID_88E1116R, MARVELL_PHY_ID_MASK }, +	{ MARVELL_PHY_ID_88E1510, MARVELL_PHY_ID_MASK },  	{ }  };  | 
