All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Guo-Fu Tseng" <cooldavid@cooldavid.org>
To: AriesLee <AriesLee@jmicron.com>, netdev@vger.kernel.org
Cc: AriesLee <AriesLeeILan@gmail.com>
Subject: Re: [PATCH 1/1]  PHY configuration for compatible issue
Date: Thu, 17 Nov 2011 15:15:28 +0800	[thread overview]
Message-ID: <20111117070537.M4900@cooldavid.org> (raw)
In-Reply-To: <1321538742-3701-1-git-send-email-AriesLee@jmicron.com>

On Thu, 17 Nov 2011 22:05:42 +0800, AriesLee wrote
> From: Aries Lee <AriesLee@jmicron.com>
> 
> To perform PHY calibration and set a different EA value by chip ID,
> Whenever the NIC chip power on, ie booting or resuming, we need to
> force HW to calibrate PHY parameter again, and also set a proper EA
> value which gathered from experiment.
> 
> That process resolve the compatible issues(NIC is unable to link
> up in some special case) in giga speed.
Thank you Aries.

Here is some suggestions after a quick review:

It would be better if you implement the read/write function
for extended-phy-register, instead of using JM_PHY_SPEC_ADDR_REG
and JM_PHY_SPEC_DATA_REG directly all the time.

There are jme_phy_on() and jme_phy_off() function in place.
Should you simply using it?

> 
> Signed-off-by: Aries Lee <AriesLee@jmicron.com>
> ---
>  drivers/net/ethernet/jme.c |  127 
> ++++++++++++++++++++++++++++++++++++++++++- drivers/net/ethernet/jme.h 
> |   19 +++++++ 2 files changed, 143 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/net/ethernet/jme.c b/drivers/net/ethernet/jme.c
> index df3ab83..bd9633d 100644
> --- a/drivers/net/ethernet/jme.c
> +++ b/drivers/net/ethernet/jme.c
> @@ -1743,6 +1743,126 @@ jme_phy_off(struct jme_adapter *jme)
>  	if (new_phy_power_ctrl(jme->chip_main_rev))
>  		jme_new_phy_off(jme);
>  }
> +static int
> +jme_phy_calibration(struct jme_adapter *jme)
> +{
> +	u32 ctrl1000, bmcr, phy_addr, phy_data;
> +
> +	/*  Turn PHY off */
> +	bmcr = jme_mdio_read(jme->dev, jme->mii_if.phy_id, MII_BMCR);
> +	bmcr |= BMCR_PDOWN;
> +	jme_mdio_write(jme->dev, jme->mii_if.phy_id, MII_BMCR, bmcr);
> +	/*  Turn PHY on */
> +	bmcr = jme_mdio_read(jme->dev, jme->mii_if.phy_id, MII_BMCR);
> +	bmcr &= ~BMCR_PDOWN;
> +	jme_mdio_write(jme->dev, jme->mii_if.phy_id, MII_BMCR, bmcr);
> +	/*  Enabel PHY test mode 1 */
> +	ctrl1000 = jme_mdio_read(jme->dev, jme->mii_if.phy_id, MII_CTRL1000);
> +	ctrl1000 &= ~PHY_GAD_TEST_MODE_MSK;
> +	ctrl1000 |= PHY_GAD_TEST_MODE_1;
> +	jme_mdio_write(jme->dev, jme->mii_if.phy_id, MII_CTRL1000, ctrl1000);
> +
> +
> +	phy_addr = JM_PHY_SPEC_REG_READ | JM_PHY_EXT_COMM_2_REG;
> +	jme_mdio_write(jme->dev, jme->mii_if.phy_id, JM_PHY_SPEC_ADDR_REG,
> +			phy_addr);
> +	phy_data = jme_mdio_read(jme->dev, jme->mii_if.phy_id,
> +			JM_PHY_SPEC_DATA_REG);
> +
> +	phy_data &= ~JM_PHY_EXT_COMM_2_CALI_MODE_0;
> +	phy_data |= JM_PHY_EXT_COMM_2_CALI_LATCH |
> +			JM_PHY_EXT_COMM_2_CALI_ENABLE;
> +
> +	phy_addr = JM_PHY_SPEC_REG_WRITE | JM_PHY_EXT_COMM_2_REG;
> +	jme_mdio_write(jme->dev, jme->mii_if.phy_id, JM_PHY_SPEC_DATA_REG,
> +			phy_data);
> +	jme_mdio_write(jme->dev, jme->mii_if.phy_id, JM_PHY_SPEC_ADDR_REG,
> +			phy_addr);
> +
> +	msleep(20);
> +
> +	phy_addr = JM_PHY_SPEC_REG_READ | JM_PHY_EXT_COMM_2_REG;
> +	jme_mdio_write(jme->dev, jme->mii_if.phy_id, JM_PHY_SPEC_ADDR_REG,
> +			phy_addr);
> +	phy_data = jme_mdio_read(jme->dev, jme->mii_if.phy_id,
> +			JM_PHY_SPEC_DATA_REG);
> +
> +	phy_data &= ~(JM_PHY_EXT_COMM_2_CALI_ENABLE |
> +			JM_PHY_EXT_COMM_2_CALI_MODE_0 |
> +			JM_PHY_EXT_COMM_2_CALI_LATCH);
> +
> +	phy_addr = JM_PHY_SPEC_REG_WRITE | JM_PHY_EXT_COMM_2_REG;
> +	jme_mdio_write(jme->dev, jme->mii_if.phy_id, JM_PHY_SPEC_DATA_REG,
> +			phy_data);
> +	jme_mdio_write(jme->dev, jme->mii_if.phy_id, JM_PHY_SPEC_ADDR_REG,
> +			phy_addr);
> +
> +	/*  Disable PHY test mode */
> +	ctrl1000 = jme_mdio_read(jme->dev, jme->mii_if.phy_id, MII_CTRL1000);
> +	ctrl1000 &= ~PHY_GAD_TEST_MODE_MSK;
> +	jme_mdio_write(jme->dev, jme->mii_if.phy_id, MII_CTRL1000, ctrl1000);
> +	return 0;
> +}
> +
> +static int
> +jme_phy_setEA(struct jme_adapter *jme)
> +{
> +	u32 phy_addr, phy_comm0 = 0, phy_comm1 = 0;
> +	u8 nic_ctrl;
> +
> +	pci_read_config_byte(jme->pdev, PCI_PRIV_SHARE_NICCTRL, &nic_ctrl);
> +	if ((nic_ctrl & 0x3) == JME_FLAG_PHYEA_ENABLE)
> +		return 0;
> +
> +	switch (jme->pdev->device) {
> +	case PCI_DEVICE_ID_JMICRON_JMC250:
> +		if (((jme->chip_main_rev == 5) &&
> +			((jme->chip_sub_rev == 0) || (jme->chip_sub_rev == 1) ||
> +			(jme->chip_sub_rev == 3))) ||
> +			(jme->chip_main_rev >= 6)) {
> +			phy_comm0 = 0x008A;
> +			phy_comm1 = 0x4109;
> +		}
> +		if ((jme->chip_main_rev == 3) &&
> +			((jme->chip_sub_rev == 1) || (jme->chip_sub_rev == 2)))
> +			phy_comm0 = 0xE088;
> +		break;
> +	case PCI_DEVICE_ID_JMICRON_JMC260:
> +		if (((jme->chip_main_rev == 5) &&
> +			((jme->chip_sub_rev == 0) || (jme->chip_sub_rev == 1) ||
> +			(jme->chip_sub_rev == 3))) ||
> +			(jme->chip_main_rev >= 6)) {
> +			phy_comm0 = 0x008A;
> +			phy_comm1 = 0x4109;
> +		}
> +		if ((jme->chip_main_rev == 3) &&
> +			((jme->chip_sub_rev == 1) || (jme->chip_sub_rev == 2)))
> +			phy_comm0 = 0xE088;
> +		if ((jme->chip_main_rev == 2) && (jme->chip_sub_rev == 0))
> +			phy_comm0 = 0x608A;
> +		if ((jme->chip_main_rev == 2) && (jme->chip_sub_rev == 2))
> +			phy_comm0 = 0x408A;
> +		break;
> +	default:
> +		return -ENODEV;
> +	}
> +	if (phy_comm0) {
> +		phy_addr = JM_PHY_SPEC_REG_WRITE | JM_PHY_EXT_COMM_0_REG;
> +		jme_mdio_write(jme->dev, jme->mii_if.phy_id,
> +				JM_PHY_SPEC_DATA_REG, phy_comm0);
> +		jme_mdio_write(jme->dev, jme->mii_if.phy_id,
> +				JM_PHY_SPEC_ADDR_REG, phy_addr);
> +	}
> +	if (phy_comm1) {
> +		phy_addr = JM_PHY_SPEC_REG_WRITE | JM_PHY_EXT_COMM_1_REG;
> +		jme_mdio_write(jme->dev, jme->mii_if.phy_id,
> +				JM_PHY_SPEC_DATA_REG, phy_comm1);
> +		jme_mdio_write(jme->dev, jme->mii_if.phy_id,
> +				JM_PHY_SPEC_ADDR_REG, phy_addr);
> +	}
> +
> +	return 0;
> +}
> 
>  static int
>  jme_open(struct net_device *netdev)
> @@ -1769,7 +1889,8 @@ jme_open(struct net_device *netdev)
>  		jme_set_settings(netdev, &jme->old_ecmd);
>  	else
>  		jme_reset_phy_processor(jme);
> -
> +	jme_phy_calibration(jme);
> +	jme_phy_setEA(jme);
>  	jme_reset_link(jme);
> 
>  	return 0;
> @@ -3184,7 +3305,8 @@ jme_resume(struct device *dev)
>  		jme_set_settings(netdev, &jme->old_ecmd);
>  	else
>  		jme_reset_phy_processor(jme);
> -
> +	jme_phy_calibration(jme);
> +	jme_phy_setEA(jme);
>  	jme_start_irq(jme);
>  	netif_device_attach(netdev);
> 
> @@ -3239,4 +3361,3 @@ MODULE_DESCRIPTION("JMicron JMC2x0 PCI Express 
> Ethernet driver"); MODULE_LICENSE("GPL"); MODULE_VERSION(DRV_VERSION); 
> MODULE_DEVICE_TABLE(pci, jme_pci_tbl);
> -
> diff --git a/drivers/net/ethernet/jme.h b/drivers/net/ethernet/jme.h
> index 02ea27c..47e47a9 100644
> --- a/drivers/net/ethernet/jme.h
> +++ b/drivers/net/ethernet/jme.h
> @@ -760,6 +760,25 @@ enum jme_rxmcs_bits {
>  				  RXMCS_CHECKSUM,
>  };
> 
> +/*	Extern PHY common register 2	*/
> +
> +#define PHY_GAD_TEST_MODE_1			0x00002000
> +#define PHY_GAD_TEST_MODE_MSK			0x0000E000
> +#define JM_PHY_SPEC_REG_READ			0x00004000
> +#define JM_PHY_SPEC_REG_WRITE			0x00008000
> +#define PHY_CALIBRATION_DELAY			20
> +#define JM_PHY_SPEC_ADDR_REG			0x1E
> +#define JM_PHY_SPEC_DATA_REG			0x1F
> +
> +#define JM_PHY_EXT_COMM_0_REG			0x30
> +#define JM_PHY_EXT_COMM_1_REG			0x31
> +#define JM_PHY_EXT_COMM_2_REG			0x32
> +#define JM_PHY_EXT_COMM_2_CALI_ENABLE		0x01
> +#define JM_PHY_EXT_COMM_2_CALI_MODE_0		0x02
> +#define JM_PHY_EXT_COMM_2_CALI_LATCH		0x10
> +#define PCI_PRIV_SHARE_NICCTRL			0xF5
> +#define JME_FLAG_PHYEA_ENABLE			0x2
> +
>  /*
>   * Wakeup Frame setup interface registers
>   */
> -- 
> 1.7.4.4
> 
> --
> To unsubscribe from this list: send the line "unsubscribe netdev" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html


Guo-Fu Tseng

  reply	other threads:[~2011-11-17  7:26 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-11-17 14:05 [PATCH 1/1] PHY configuration for compatible issue AriesLee
2011-11-17  7:15 ` Guo-Fu Tseng [this message]
2011-11-18  7:13   ` Aries Lee
2011-11-19  4:19     ` Guo-Fu Tseng
2011-11-21  2:13       ` Aries Lee
  -- strict thread matches above, loose matches on Subject: below --
2011-11-18 14:54 AriesLee
2011-11-21 10:08 AriesLee
2011-11-21  5:35 ` Guo-Fu Tseng
2011-11-21 20:20 AriesLee
2011-11-22 16:19 ` Guo-Fu Tseng
2011-11-28  0:22 ` David Miller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20111117070537.M4900@cooldavid.org \
    --to=cooldavid@cooldavid.org \
    --cc=AriesLee@jmicron.com \
    --cc=AriesLeeILan@gmail.com \
    --cc=netdev@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.