Re: [PATCH] phy: nxp-c45: add driver for tja1103

2021-04-13 Thread Andrew Lunn
> nxp-c45-tja11xx is acceptable from my point of view.

Great. Enough bike shedding, nxp-c45-tja11xx it is.

   Andrew


Re: [PATCH] phy: nxp-c45: add driver for tja1103

2021-04-13 Thread Christian Herber

On 4/13/2021 3:57 PM, Andrew Lunn wrote:

Ok, we can agree that there will not be a perfect naming. Would it be a
possibility to rename the existing TJA11xx driver to TJA1100-1-2 or is that
unwanted?


It is generally a bad idea. It makes back porting fixing harder if the
file changes name.


If nxp-c45.c is to generic (I take from your comments that' your
conclusion), we could at least lean towards nxp-c45-bt1.c? Unfortunately,
the product naming schemes are not sufficiently methodical to have a a good
driver name based on product names.


And what does bt1 stand for?

How about nxp-c45-tja11xx.c. It is not ideal, but it does at least
give an indication of what devices it does cover, even if there is a
big overlap with nxp-tja11xx.c, in terms of pattern matching. And if
you do decide to have a major change of registers, your can call the
device tja1201 and have a new driver nxp-c45-tja12xx.

Andrew



bt1 standing for BASE-T1.

As you can see from the current situation, it could well happen that a 
future PHY is SW incompatible (right now I would say it is unlikely, but 
ok), and the device is still a TJA11xx.


nxp-c45-tja11xx is acceptable from my point of view.


Re: [PATCH] phy: nxp-c45: add driver for tja1103

2021-04-13 Thread Andrew Lunn
> Ok, we can agree that there will not be a perfect naming. Would it be a
> possibility to rename the existing TJA11xx driver to TJA1100-1-2 or is that
> unwanted?

It is generally a bad idea. It makes back porting fixing harder if the
file changes name.

> If nxp-c45.c is to generic (I take from your comments that' your
> conclusion), we could at least lean towards nxp-c45-bt1.c? Unfortunately,
> the product naming schemes are not sufficiently methodical to have a a good
> driver name based on product names.

And what does bt1 stand for?

How about nxp-c45-tja11xx.c. It is not ideal, but it does at least
give an indication of what devices it does cover, even if there is a
big overlap with nxp-tja11xx.c, in terms of pattern matching. And if
you do decide to have a major change of registers, your can call the
device tja1201 and have a new driver nxp-c45-tja12xx.

   Andrew


Re: [PATCH] phy: nxp-c45: add driver for tja1103

2021-04-13 Thread Radu Nicolae Pirea (NXP OSS)
On Mon, 2021-04-12 at 10:50 +0100, Russell King - ARM Linux admin
wrote:
> On Fri, Apr 09, 2021 at 09:41:06PM +0300, Radu Pirea (NXP OSS) wrote:
> > +#define B100T1_PMAPMD_CTL  0x0834
> > +#define B100T1_PMAPMD_CONFIG_ENBIT(15)
> > +#define B100T1_PMAPMD_MASTER   BIT(14)
> > +#define MASTER_MODE(B100T1_PMAPMD_CONFIG_EN |
> > B100T1_PMAPMD_MASTER)
> > +#define SLAVE_MODE (B100T1_PMAPMD_CONFIG_EN)
> > +
> > +#define DEVICE_CONTROL 0x0040
> > +#define DEVICE_CONTROL_RESET   BIT(15)
> > +#define DEVICE_CONTROL_CONFIG_GLOBAL_ENBIT(14)
> > +#define DEVICE_CONTROL_CONFIG_ALL_EN   BIT(13)
> > +#define RESET_POLL_NS  (250 * NSEC_PER_MSEC)
> > +
> > +#define PHY_CONTROL0x8100
> > +#define PHY_CONFIG_EN  BIT(14)
> > +#define PHY_START_OP   BIT(0)
> > +
> > +#define PHY_CONFIG 0x8108
> > +#define PHY_CONFIG_AUTOBIT(0)
> > +
> > +#define SIGNAL_QUALITY 0x8320
> > +#define SQI_VALID  BIT(14)
> > +#define SQI_MASK   GENMASK(2, 0)
> > +#define MAX_SQISQI_MASK
> > +
> > +#define CABLE_TEST 0x8330
> > +#define CABLE_TEST_ENABLE  BIT(15)
> > +#define CABLE_TEST_START   BIT(14)
> > +#define CABLE_TEST_VALID   BIT(13)
> > +#define CABLE_TEST_OK  0x00
> > +#define CABLE_TEST_SHORTED 0x01
> > +#define CABLE_TEST_OPEN0x02
> > +#define CABLE_TEST_UNKNOWN 0x07
> > +
> > +#define PORT_CONTROL   0x8040
> > +#define PORT_CONTROL_ENBIT(14)
> > +
> > +#define PORT_INFRA_CONTROL 0xAC00
> > +#define PORT_INFRA_CONTROL_EN  BIT(14)
> > +
> > +#define VND1_RXID  0xAFCC
> > +#define VND1_TXID  0xAFCD
> > +#define ID_ENABLE  BIT(15)
> > +
> > +#define ABILITIES  0xAFC4
> > +#define RGMII_ID_ABILITY   BIT(15)
> > +#define RGMII_ABILITY  BIT(14)
> > +#define RMII_ABILITY   BIT(10)
> > +#define REVMII_ABILITY BIT(9)
> > +#define MII_ABILITYBIT(8)
> > +#define SGMII_ABILITY  BIT(0)
> > +
> > +#define MII_BASIC_CONFIG   0xAFC6
> > +#define MII_BASIC_CONFIG_REV   BIT(8)
> > +#define MII_BASIC_CONFIG_SGMII 0x9
> > +#define MII_BASIC_CONFIG_RGMII 0x7
> > +#define MII_BASIC_CONFIG_RMII  0x5
> > +#define MII_BASIC_CONFIG_MII   0x4
> > +
> > +#define SYMBOL_ERROR_COUNTER   0x8350
> > +#define LINK_DROP_COUNTER  0x8352
> > +#define LINK_LOSSES_AND_FAILURES   0x8353
> > +#define R_GOOD_FRAME_CNT   0xA950
> > +#define R_BAD_FRAME_CNT0xA952
> > +#define R_RXER_FRAME_CNT   0xA954
> > +#define RX_PREAMBLE_COUNT  0xAFCE
> > +#define TX_PREAMBLE_COUNT  0xAFCF
> > +#define RX_IPG_LENGTH  0xAFD0
> > +#define TX_IPG_LENGTH  0xAFD1
> > +#define COUNTERS_ENBIT(15)
> > +
> > +#define CLK_25MHZ_PS_PERIOD4UL
> > +#define PS_PER_DEGREE  (CLK_25MHZ_PS_PERIOD / 360)
> > +#define MIN_ID_PS  8222U
> > +#define MAX_ID_PS  11300U
> 
> Maybe include some prefix as to which MMD each of these registers is
> located?
I will add the MMD as prefix. Thank you.
> 
> > +static bool nxp_c45_can_sleep(struct phy_device *phydev)
> > +{
> > +   int reg;
> > +
> > +   reg = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_STAT1);
> > +   if (reg < 0)
> > +   return false;
> > +
> > +   return !!(reg & MDIO_STAT1_LPOWERABLE);
> > +}
> 
> This looks like it could be useful as a generic helper function -
> nothing in this function is specific to this PHY.
> 
> > +static int nxp_c45_resume(struct phy_device *phydev)
> > +{
> > +   int reg;
> > +
> > +   if (!nxp_c45_can_sleep(phydev))
> > +   return -EOPNOTSUPP;
> > +
> > +   reg = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_CTRL1);
> > +   reg &= ~MDIO_CTRL1_LPOWER;
> > +   phy_write_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_CTRL1, reg);
> > +
> > +   return 0;
> > +}
> > +
> > +static int nxp_c45_suspend(struct phy_device *phydev)
> > +{
> > +   int reg;
> > +
> > +   if (!nxp_c45_can_sleep(phydev))
> > +   return -EOPNOTSUPP;
> > +
> > +   reg = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_CTRL1);
> > +   reg |= MDIO_CTRL1_LPOWER;
> > +   phy_write_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_CTRL1, reg);
> > +
> > +   return 0;
> > +}
> 
> These too look like potential generic helper functions.
That's true.
Should I implement them as genphy_c45_pma_sus

Re: [PATCH] phy: nxp-c45: add driver for tja1103

2021-04-13 Thread Christian Herber




On 4/13/2021 3:30 PM, Andrew Lunn wrote:

On Tue, Apr 13, 2021 at 08:56:30AM +0200, Christian Herber wrote:

Hi Andrew,

On 4/12/2021 6:52 PM, Andrew Lunn wrote:


So what you are say is, you don't care if the IP is completely
different, it all goes in one driver. So lets put this driver into
nxp-tja11xx.c. And then we avoid all the naming issues.

   Andrew



As this seems to be a key question, let me try and shed some more light on
this.
The original series of BASE-T1 PHYs includes TJA110, TJA1101, and TJA1102.
They are covered by the existing driver, which has the unfortunate naming
TJA11xx. Unfortunate, because the use of wildcards is a bit to generous.


Yes, that does happen.

Naming is difficult. But i really think nxp-c45.c is much worse. It
gives no idea at all what it supports. Or in the future, what it does
not support, and you actually need nxp-c45-ng.c.

Developers are going to look at a board, see a tja1XYZ chip, see the
nxp-tja11xx.c and enable it. Does the chip have a big C45 symbol on
it? Anything to give the idea it should use the nxp-c45 driver?

Maybe we should actually swing the complete opposite direction. Name
it npx-tja1103.c. There are lots of drivers which have a specific
name, but actually support a lot more devices. The developer sees they
have an tja1XYZ, there are two drivers which look about right, and
enable them both?

Andrew



Ok, we can agree that there will not be a perfect naming. Would it be a 
possibility to rename the existing TJA11xx driver to TJA1100-1-2 or is 
that unwanted?


I agree that it should be easy to find the right driver. Right now, 
there is another device called the SJA1110, which has a very similar IP 
integrated. It would be possible to use the driver for that device also, 
even if this is outside of the scope of this submission. Going for 
wildcards, we get to xJA11xx, which is really undesirable to me.


In the end my hope was that people will look up the correct driver 
through LKDDb or similar and will find the matching devices from there.


I am open to any suggestion that leads to users finding the right driver 
and that also work for future devices.


Using your example of an NG device: My assumption is that the things 
that change are covered by IEEE standardized registers, and thus should 
be implemented as part of generic helper functions. The things that are 
outside of the IEEE scope, e.g xMII interface configuration are generic 
and can be contained in a single driver if the registers are kept 
software compatible which we intend to do.


If nxp-c45.c is to generic (I take from your comments that' your 
conclusion), we could at least lean towards nxp-c45-bt1.c? 
Unfortunately, the product naming schemes are not sufficiently 
methodical to have a a good driver name based on product names.


Christian


Re: Re: [PATCH] phy: nxp-c45: add driver for tja1103

2021-04-13 Thread Andrew Lunn
On Tue, Apr 13, 2021 at 08:56:30AM +0200, Christian Herber wrote:
> Hi Andrew,
> 
> On 4/12/2021 6:52 PM, Andrew Lunn wrote:
> > 
> > So what you are say is, you don't care if the IP is completely
> > different, it all goes in one driver. So lets put this driver into
> > nxp-tja11xx.c. And then we avoid all the naming issues.
> > 
> >   Andrew
> > 
> 
> As this seems to be a key question, let me try and shed some more light on
> this.
> The original series of BASE-T1 PHYs includes TJA110, TJA1101, and TJA1102.
> They are covered by the existing driver, which has the unfortunate naming
> TJA11xx. Unfortunate, because the use of wildcards is a bit to generous.

Yes, that does happen.

Naming is difficult. But i really think nxp-c45.c is much worse. It
gives no idea at all what it supports. Or in the future, what it does
not support, and you actually need nxp-c45-ng.c.

Developers are going to look at a board, see a tja1XYZ chip, see the
nxp-tja11xx.c and enable it. Does the chip have a big C45 symbol on
it? Anything to give the idea it should use the nxp-c45 driver?

Maybe we should actually swing the complete opposite direction. Name
it npx-tja1103.c. There are lots of drivers which have a specific
name, but actually support a lot more devices. The developer sees they
have an tja1XYZ, there are two drivers which look about right, and
enable them both?

   Andrew


Re: Re: [PATCH] phy: nxp-c45: add driver for tja1103

2021-04-12 Thread Christian Herber

Hi Andrew,

On 4/12/2021 6:52 PM, Andrew Lunn wrote:


So what you are say is, you don't care if the IP is completely
different, it all goes in one driver. So lets put this driver into
nxp-tja11xx.c. And then we avoid all the naming issues.

  Andrew



As this seems to be a key question, let me try and shed some more light 
on this.
The original series of BASE-T1 PHYs includes TJA110, TJA1101, and 
TJA1102. They are covered by the existing driver, which has the 
unfortunate naming TJA11xx. Unfortunate, because the use of wildcards is 
a bit to generous. E.g. the naming would also include a TJA1145, which 
is a high-speed CAN transceiver. The truth is, extrapolating wildcards 
in product names doesn't work as there is not guarantee of future 
product names.
The mentioned TJA1100/1/2 are *fairly* software-compatible, which is why 
it makes sense to have a shared driver. When it gets to TJA1103, there 
is no SW compatibility, which is why we decided to create a new driver.
We want to support all future Ethernet PHY devices with this codebase, 
and that is why the naming is that generic. The common denominator of 
the devices is that they are NXP products and use clause 45 addressing. 
When you say we don't care that the IP is different, that doesn't quite 
fit. Just because the MDI is different, the register map does not need 
to change much, so it will be easy to support future PHYs also when 
using different PHY technology.
Moving the code into TJA11xx is creating more issues, as it assumes that 
the devices which are managed by the driver are always TJA... devices 
which may not be true.


Christian


Re: [PATCH] phy: nxp-c45: add driver for tja1103

2021-04-12 Thread Andrew Lunn
> +static const struct nxp_c45_phy_stats nxp_c45_hw_stats[] = {
> + { "phy_symbol_error_cnt", MDIO_MMD_VEND1, SYMBOL_ERROR_COUNTER, 0, 
> GENMASK(15, 0) },
> + { "phy_link_status_drop_cnt", MDIO_MMD_VEND1, LINK_DROP_COUNTER, 8, 
> GENMASK(13, 8) },
> + { "phy_link_availability_drop_cnt", MDIO_MMD_VEND1, LINK_DROP_COUNTER, 
> 0, GENMASK(5, 0) },

netdev tries to keep with the old 80 character limit. Please wrap the
long lines.

> +static void nxp_c45_set_delays(struct phy_device *phydev)
> +{
> + struct nxp_c45_phy *priv = phydev->priv;
> + u64 tx_delay = priv->tx_delay;
> + u64 rx_delay = priv->rx_delay;
> + u64 degree;
> +
> + if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID ||
> + phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID) {
> + degree = tx_delay / PS_PER_DEGREE;
> + phy_write_mmd(phydev, MDIO_MMD_VEND1, VND1_TXID,
> +   ID_ENABLE | nxp_c45_get_phase_shift(degree));
> + }

You are missing an else clause. You need to ensure the delay is 0 if
delays are not required. You have no idea what the bootloader has
done.

> +static int nxp_c45_get_delays(struct phy_device *phydev)
> +{
> + struct nxp_c45_phy *priv = phydev->priv;
> + int ret;
> +
> + if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID ||
> + phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID) {
> + ret = device_property_read_u32(&phydev->mdio.dev, 
> "tx-internal-delay-ps",
> +&priv->tx_delay);
> + if (ret) {
> + phydev_err(phydev, "tx-internal-delay-ps property 
> missing\n");

This is not normally mandatory. Default to 2ns if not specified in DT.

> +static int nxp_c45_set_phy_mode(struct phy_device *phydev)
> +{
> + int ret;
> +
> + ret = phy_read_mmd(phydev, MDIO_MMD_VEND1, ABILITIES);
> + phydev_dbg(phydev, "Clause 45 managed PHY abilities 0x%x\n", ret);
> +
> + switch (phydev->interface) {
> + case PHY_INTERFACE_MODE_RGMII:
> + if (!(ret & RGMII_ABILITY)) {
> + phydev_err(phydev, "rgmii mode not supported\n");
> + return -EINVAL;
> + }
> + phy_write_mmd(phydev, MDIO_MMD_VEND1, MII_BASIC_CONFIG, 
> MII_BASIC_CONFIG_RGMII);
> + break;
> + case PHY_INTERFACE_MODE_RGMII_ID:
> + case PHY_INTERFACE_MODE_RGMII_TXID:
> + case PHY_INTERFACE_MODE_RGMII_RXID:
> + if (!(ret & RGMII_ID_ABILITY)) {
> + phydev_err(phydev, "rgmii-id, rgmii-txid, rgmii-rxid 
> modes are not supported\n");
> + return -EINVAL;
> + }
> + phy_write_mmd(phydev, MDIO_MMD_VEND1, MII_BASIC_CONFIG, 
> MII_BASIC_CONFIG_RGMII);
> + ret = nxp_c45_get_delays(phydev);
> + if (ret)
> + return ret;
> +
> + nxp_c45_set_delays(phydev);
> + break;

Again, for PHY_INTERFACE_MODE_RGMII you need to ensure the hardware is
not inserting a delay.

> + case PHY_INTERFACE_MODE_SGMII:
> + if (!(ret & SGMII_ABILITY)) {
> + phydev_err(phydev, "sgmii mode not supported\n");
> + return -EINVAL;
> + }
> + phy_write_mmd(phydev, MDIO_MMD_VEND1, MII_BASIC_CONFIG, 
> MII_BASIC_CONFIG_SGMII);
> + break;

Interested. What gets reported over the inband signalling?

Andrew


Re: [PATCH] phy: nxp-c45: add driver for tja1103

2021-04-12 Thread Andrew Lunn
On Mon, Apr 12, 2021 at 05:49:04PM +0300, Radu Nicolae Pirea (NXP OSS) wrote:
> On Mon, 2021-04-12 at 16:23 +0200, Andrew Lunn wrote:
> > > It is purely a C45 device.
> > 
> > > Even if the PHY will be based on the same IP or not, if it is a C45
> > > PHY, it will be supported by this driver. We are not talking about
> > > 2 or
> > > 3 PHYs. This driver will support all future C45 PHYs. That's why we
> > > named it "NXP C45".
> > 
> > So if in future you produce C45 multi-gige PHYs, which have nothing
> > in
> > common with the T1 automative PHY, it will still be in this driver?
> Yes. C45 is robust and, if the PHY interface is standard, you can
> support Base-T, Base-T1, and so on in the same register interface.

So what you are say is, you don't care if the IP is completely
different, it all goes in one driver. So lets put this driver into
nxp-tja11xx.c. And then we avoid all the naming issues.

 Andrew


Re: [PATCH] phy: nxp-c45: add driver for tja1103

2021-04-12 Thread Radu Nicolae Pirea (NXP OSS)
On Mon, 2021-04-12 at 16:23 +0200, Andrew Lunn wrote:
> > It is purely a C45 device.
> 
> > Even if the PHY will be based on the same IP or not, if it is a C45
> > PHY, it will be supported by this driver. We are not talking about
> > 2 or
> > 3 PHYs. This driver will support all future C45 PHYs. That's why we
> > named it "NXP C45".
> 
> So if in future you produce C45 multi-gige PHYs, which have nothing
> in
> common with the T1 automative PHY, it will still be in this driver?
Yes. C45 is robust and, if the PHY interface is standard, you can
support Base-T, Base-T1, and so on in the same register interface.
> 
>    Andrew




Re: [PATCH] phy: nxp-c45: add driver for tja1103

2021-04-12 Thread Andrew Lunn
> It is purely a C45 device.

> Even if the PHY will be based on the same IP or not, if it is a C45
> PHY, it will be supported by this driver. We are not talking about 2 or
> 3 PHYs. This driver will support all future C45 PHYs. That's why we
> named it "NXP C45".

So if in future you produce C45 multi-gige PHYs, which have nothing in
common with the T1 automative PHY, it will still be in this driver?

   Andrew


Re: [PATCH] phy: nxp-c45: add driver for tja1103

2021-04-12 Thread Radu Nicolae Pirea (NXP OSS)
On Mon, 2021-04-12 at 14:57 +0200, Andrew Lunn wrote:
> On Mon, Apr 12, 2021 at 01:02:07PM +0300, Radu Nicolae Pirea (NXP
> OSS) wrote:
> > On Fri, 2021-04-09 at 21:36 +0200, Andrew Lunn wrote:
> > > On Fri, Apr 09, 2021 at 09:41:06PM +0300, Radu Pirea (NXP OSS)
> > > wrote:
> > > > Add driver for tja1103 driver and for future NXP C45 PHYs.
> > > 
> > > So apart from c45 vs c22, how does this differ to nxp-tja11xx.c?
> > > Do we really want two different drivers for the same hardware? 
> > > Can we combine them somehow?
> > It looks like the PHYs are the same hardware, but that's not
> > entirely
> > true. Just the naming is the same. TJA1103 is using a different IP
> > and
> > is having timestamping support(I will add it later).
> 
> Is the IP very different? You often see different generations of a
> PHY
> supported by the same driver, if the generations are similar.
Yes. It's very different. I know what you mean, but that's not the
case. That's why we decided to write a new driver from scratch.
> 
> Does it support C22 or it is purely a C45 device?
It is purely a C45 device.
> 
> > TJA is also not an Ethernet PHY series, but a general prefix for
> > media
> > interfaces including also CAN, LIN, etc.
> > > 
> > > > +config NXP_C45_PHY
> > > > +   tristate "NXP C45 PHYs"
> > > 
> > > This is also very vague. So in the future it will support PHYs
> > > other
> > > than the TJA series?
> > Yes, in the future this driver will support other PHYs too.
> 
> Based on the same IP? 
> Or different IP? Are we talking about 2 more
> PHYs, so like the nxp-tja11xx.c will support 3 PHYs. And then the
> tja1106 will come along and need a new driver?
> What will you call
> that?
>  I just don't like 'NXP C45 PHYs", it gives no clue as to what it
> actually supports, and it gives you problems when you need to add yet
> another driver.
Even if the PHY will be based on the same IP or not, if it is a C45
PHY, it will be supported by this driver. We are not talking about 2 or
3 PHYs. This driver will support all future C45 PHYs. That's why we
named it "NXP C45".
> 
> At minimum, there needs to be a patch to add tja1102 to the help for
> the nxp-tja11xx.c driver. And this driver needs to list tja1103.
I will make the changes then.
Thank you.
> 
>     Andrew




Re: [PATCH] phy: nxp-c45: add driver for tja1103

2021-04-12 Thread Andrew Lunn
On Mon, Apr 12, 2021 at 01:02:07PM +0300, Radu Nicolae Pirea (NXP OSS) wrote:
> On Fri, 2021-04-09 at 21:36 +0200, Andrew Lunn wrote:
> > On Fri, Apr 09, 2021 at 09:41:06PM +0300, Radu Pirea (NXP OSS) wrote:
> > > Add driver for tja1103 driver and for future NXP C45 PHYs.
> > 
> > So apart from c45 vs c22, how does this differ to nxp-tja11xx.c?
> > Do we really want two different drivers for the same hardware? 
> > Can we combine them somehow?
> It looks like the PHYs are the same hardware, but that's not entirely
> true. Just the naming is the same. TJA1103 is using a different IP and
> is having timestamping support(I will add it later).

Is the IP very different? You often see different generations of a PHY
supported by the same driver, if the generations are similar.

Does it support C22 or it is purely a C45 device?

> TJA is also not an Ethernet PHY series, but a general prefix for media
> interfaces including also CAN, LIN, etc.
> > 
> > > +config NXP_C45_PHY
> > > +   tristate "NXP C45 PHYs"
> > 
> > This is also very vague. So in the future it will support PHYs other
> > than the TJA series?
> Yes, in the future this driver will support other PHYs too.

Based on the same IP? Or different IP? Are we talking about 2 more
PHYs, so like the nxp-tja11xx.c will support 3 PHYs. And then the
tja1106 will come along and need a new driver? What will you call
that? I just don't like 'NXP C45 PHYs", it gives no clue as to what it
actually supports, and it gives you problems when you need to add yet
another driver.

At minimum, there needs to be a patch to add tja1102 to the help for
the nxp-tja11xx.c driver. And this driver needs to list tja1103.

Andrew


Re: [PATCH] phy: nxp-c45: add driver for tja1103

2021-04-12 Thread Radu Nicolae Pirea (NXP OSS)
On Fri, 2021-04-09 at 21:36 +0200, Andrew Lunn wrote:
> On Fri, Apr 09, 2021 at 09:41:06PM +0300, Radu Pirea (NXP OSS) wrote:
> > Add driver for tja1103 driver and for future NXP C45 PHYs.
> 
> So apart from c45 vs c22, how does this differ to nxp-tja11xx.c?
> Do we really want two different drivers for the same hardware? 
> Can we combine them somehow?
It looks like the PHYs are the same hardware, but that's not entirely
true. Just the naming is the same. TJA1103 is using a different IP and
is having timestamping support(I will add it later).
TJA is also not an Ethernet PHY series, but a general prefix for media
interfaces including also CAN, LIN, etc.
> 
> > +config NXP_C45_PHY
> > +   tristate "NXP C45 PHYs"
> 
> This is also very vague. So in the future it will support PHYs other
> than the TJA series?
Yes, in the future this driver will support other PHYs too.
> 
>  Andrew




Re: [PATCH] phy: nxp-c45: add driver for tja1103

2021-04-12 Thread Russell King - ARM Linux admin
On Fri, Apr 09, 2021 at 09:41:06PM +0300, Radu Pirea (NXP OSS) wrote:
> +#define B100T1_PMAPMD_CTL0x0834
> +#define B100T1_PMAPMD_CONFIG_EN  BIT(15)
> +#define B100T1_PMAPMD_MASTER BIT(14)
> +#define MASTER_MODE  (B100T1_PMAPMD_CONFIG_EN | 
> B100T1_PMAPMD_MASTER)
> +#define SLAVE_MODE   (B100T1_PMAPMD_CONFIG_EN)
> +
> +#define DEVICE_CONTROL   0x0040
> +#define DEVICE_CONTROL_RESET BIT(15)
> +#define DEVICE_CONTROL_CONFIG_GLOBAL_EN  BIT(14)
> +#define DEVICE_CONTROL_CONFIG_ALL_EN BIT(13)
> +#define RESET_POLL_NS(250 * NSEC_PER_MSEC)
> +
> +#define PHY_CONTROL  0x8100
> +#define PHY_CONFIG_ENBIT(14)
> +#define PHY_START_OP BIT(0)
> +
> +#define PHY_CONFIG   0x8108
> +#define PHY_CONFIG_AUTO  BIT(0)
> +
> +#define SIGNAL_QUALITY   0x8320
> +#define SQI_VALIDBIT(14)
> +#define SQI_MASK GENMASK(2, 0)
> +#define MAX_SQI  SQI_MASK
> +
> +#define CABLE_TEST   0x8330
> +#define CABLE_TEST_ENABLEBIT(15)
> +#define CABLE_TEST_START BIT(14)
> +#define CABLE_TEST_VALID BIT(13)
> +#define CABLE_TEST_OK0x00
> +#define CABLE_TEST_SHORTED   0x01
> +#define CABLE_TEST_OPEN  0x02
> +#define CABLE_TEST_UNKNOWN   0x07
> +
> +#define PORT_CONTROL 0x8040
> +#define PORT_CONTROL_EN  BIT(14)
> +
> +#define PORT_INFRA_CONTROL   0xAC00
> +#define PORT_INFRA_CONTROL_ENBIT(14)
> +
> +#define VND1_RXID0xAFCC
> +#define VND1_TXID0xAFCD
> +#define ID_ENABLEBIT(15)
> +
> +#define ABILITIES0xAFC4
> +#define RGMII_ID_ABILITY BIT(15)
> +#define RGMII_ABILITYBIT(14)
> +#define RMII_ABILITY BIT(10)
> +#define REVMII_ABILITY   BIT(9)
> +#define MII_ABILITY  BIT(8)
> +#define SGMII_ABILITYBIT(0)
> +
> +#define MII_BASIC_CONFIG 0xAFC6
> +#define MII_BASIC_CONFIG_REV BIT(8)
> +#define MII_BASIC_CONFIG_SGMII   0x9
> +#define MII_BASIC_CONFIG_RGMII   0x7
> +#define MII_BASIC_CONFIG_RMII0x5
> +#define MII_BASIC_CONFIG_MII 0x4
> +
> +#define SYMBOL_ERROR_COUNTER 0x8350
> +#define LINK_DROP_COUNTER0x8352
> +#define LINK_LOSSES_AND_FAILURES 0x8353
> +#define R_GOOD_FRAME_CNT 0xA950
> +#define R_BAD_FRAME_CNT  0xA952
> +#define R_RXER_FRAME_CNT 0xA954
> +#define RX_PREAMBLE_COUNT0xAFCE
> +#define TX_PREAMBLE_COUNT0xAFCF
> +#define RX_IPG_LENGTH0xAFD0
> +#define TX_IPG_LENGTH0xAFD1
> +#define COUNTERS_EN  BIT(15)
> +
> +#define CLK_25MHZ_PS_PERIOD  4UL
> +#define PS_PER_DEGREE(CLK_25MHZ_PS_PERIOD / 360)
> +#define MIN_ID_PS8222U
> +#define MAX_ID_PS11300U

Maybe include some prefix as to which MMD each of these registers is
located?

> +static bool nxp_c45_can_sleep(struct phy_device *phydev)
> +{
> + int reg;
> +
> + reg = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_STAT1);
> + if (reg < 0)
> + return false;
> +
> + return !!(reg & MDIO_STAT1_LPOWERABLE);
> +}

This looks like it could be useful as a generic helper function -
nothing in this function is specific to this PHY.

> +static int nxp_c45_resume(struct phy_device *phydev)
> +{
> + int reg;
> +
> + if (!nxp_c45_can_sleep(phydev))
> + return -EOPNOTSUPP;
> +
> + reg = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_CTRL1);
> + reg &= ~MDIO_CTRL1_LPOWER;
> + phy_write_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_CTRL1, reg);
> +
> + return 0;
> +}
> +
> +static int nxp_c45_suspend(struct phy_device *phydev)
> +{
> + int reg;
> +
> + if (!nxp_c45_can_sleep(phydev))
> + return -EOPNOTSUPP;
> +
> + reg = phy_read_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_CTRL1);
> + reg |= MDIO_CTRL1_LPOWER;
> + phy_write_mmd(phydev, MDIO_MMD_PMAPMD, MDIO_CTRL1, reg);
> +
> + return 0;
> +}

These too look like potential generic helper functions.

-- 
RMK's Patch system: https://www.armlinux.org.uk/developer/patches/
FTTP is here! 40Mbps down 10Mbps up. Decent connectivity at last!


Re: [PATCH] phy: nxp-c45: add driver for tja1103

2021-04-12 Thread Radu Nicolae Pirea (NXP OSS)
On Fri, 2021-04-09 at 21:18 +0200, Heiner Kallweit wrote:
> On 09.04.2021 20:41, Radu Pirea (NXP OSS) wrote:
> > Add driver for tja1103 driver and for future NXP C45 PHYs.
> > 
> > Signed-off-by: Radu Pirea (NXP OSS)
> > 
> > ---
> >  MAINTAINERS   |   6 +
> >  drivers/net/phy/Kconfig   |   6 +
> >  drivers/net/phy/Makefile  |   1 +
> >  drivers/net/phy/nxp-c45.c | 622
> > ++
> >  4 files changed, 635 insertions(+)
> >  create mode 100644 drivers/net/phy/nxp-c45.c
> > 
> > diff --git a/MAINTAINERS b/MAINTAINERS
> > index a008b70f3c16..082a5eca8913 100644
> > --- a/MAINTAINERS
> > +++ b/MAINTAINERS
> > @@ -12518,6 +12518,12 @@ F: drivers/nvmem/
> >  F: include/linux/nvmem-consumer.h
> >  F: include/linux/nvmem-provider.h
> >  
> > +NXP C45 PHY DRIVER
> > +M: Radu Pirea 
> > +L: net...@vger.kernel.org
> > +S: Maintained
> > +F: drivers/net/phy/nxp-c45.c
> > +
> >  NXP FSPI DRIVER
> >  M: Ashish Kumar 
> >  R: Yogesh Gaur 
> > diff --git a/drivers/net/phy/Kconfig b/drivers/net/phy/Kconfig
> > index 698bea312adc..fd2da80b5339 100644
> > --- a/drivers/net/phy/Kconfig
> > +++ b/drivers/net/phy/Kconfig
> > @@ -228,6 +228,12 @@ config NATIONAL_PHY
> > help
> >   Currently supports the DP83865 PHY.
> >  
> > +config NXP_C45_PHY
> > +   tristate "NXP C45 PHYs"
> > +   help
> > + Enable support for NXP C45 PHYs.
> > + Currently supports only the TJA1103 PHY.
> > +
> >  config NXP_TJA11XX_PHY
> > tristate "NXP TJA11xx PHYs support"
> > depends on HWMON
> > diff --git a/drivers/net/phy/Makefile b/drivers/net/phy/Makefile
> > index a13e402074cf..a18f095748b5 100644
> > --- a/drivers/net/phy/Makefile
> > +++ b/drivers/net/phy/Makefile
> > @@ -70,6 +70,7 @@ obj-$(CONFIG_MICROCHIP_PHY)   += microchip.o
> >  obj-$(CONFIG_MICROCHIP_T1_PHY) += microchip_t1.o
> >  obj-$(CONFIG_MICROSEMI_PHY)+= mscc/
> >  obj-$(CONFIG_NATIONAL_PHY) += national.o
> > +obj-$(CONFIG_NXP_C45_PHY)  += nxp-c45.o
> >  obj-$(CONFIG_NXP_TJA11XX_PHY)  += nxp-tja11xx.o
> >  obj-$(CONFIG_QSEMI_PHY)+= qsemi.o
> >  obj-$(CONFIG_REALTEK_PHY)  += realtek.o
> > diff --git a/drivers/net/phy/nxp-c45.c b/drivers/net/phy/nxp-c45.c
> > new file mode 100644
> > index ..2961799f7d05
> > --- /dev/null
> > +++ b/drivers/net/phy/nxp-c45.c
> > @@ -0,0 +1,622 @@
> > +// SPDX-License-Identifier: GPL-2.0
> > +/* NXP C45 PHY driver
> > + * Copyright (C) 2021 NXP
> > + * Copyright (C) 2021 Radu Pirea 
> > + */
> > +
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +#include 
> > +
> > +#define PHY_ID_BASE_T1 0x001BB010
> > +
> > +#define B100T1_PMAPMD_CTL  0x0834
> > +#define B100T1_PMAPMD_CONFIG_ENBIT(15)
> > +#define B100T1_PMAPMD_MASTER   BIT(14)
> > +#define MASTER_MODE(B100T1_PMAPMD_CONFIG_EN |
> > B100T1_PMAPMD_MASTER)
> > +#define SLAVE_MODE (B100T1_PMAPMD_CONFIG_EN)
> > +
> > +#define DEVICE_CONTROL 0x0040
> > +#define DEVICE_CONTROL_RESET   BIT(15)
> > +#define DEVICE_CONTROL_CONFIG_GLOBAL_ENBIT(14)
> > +#define DEVICE_CONTROL_CONFIG_ALL_EN   BIT(13)
> > +#define RESET_POLL_NS  (250 * NSEC_PER_MSEC)
> > +
> > +#define PHY_CONTROL0x8100
> > +#define PHY_CONFIG_EN  BIT(14)
> > +#define PHY_START_OP   BIT(0)
> > +
> > +#define PHY_CONFIG 0x8108
> > +#define PHY_CONFIG_AUTOBIT(0)
> > +
> > +#define SIGNAL_QUALITY 0x8320
> > +#define SQI_VALID  BIT(14)
> > +#define SQI_MASK   GENMASK(2, 0)
> > +#define MAX_SQISQI_MASK
> > +
> > +#define CABLE_TEST 0x8330
> > +#define CABLE_TEST_ENABLE  BIT(15)
> > +#define CABLE_TEST_START   BIT(14)
> > +#define CABLE_TEST_VALID   BIT(13)
> > +#define CABLE_TEST_OK  0x00
> > +#define CABLE_TEST_SHORTED 0x01
> > +#define CABLE_TEST_OPEN0x02
> > +#define CABLE_TEST_UNKNOWN 0x07
> > +
> > +#define PORT_CONTROL   0x8040
> > +#define PORT_CONTROL_ENBIT(14)
> > +
> > +#define PORT_INFRA_CONTROL 0xAC00
> > +#define PORT_INFRA_CONTROL_EN  BIT(14)
> > +
> > +#define VND1_RXID  0xAFCC
> > +#define VND1_TXID  0xAFCD
> > +#define ID_ENABLE  BIT(15)
> > +
> > +#define ABILITIES  0xAFC4
> > +#define RGMII_ID_ABILITY   BIT(15)
> > +#define RGMII_ABILITY  BIT(14)
> > +#define RMII_ABILITY   BIT(10)
> > +#define REVMII_ABILITY BIT(9)
> > +#define MII_ABILITY 

Re: [PATCH] phy: nxp-c45: add driver for tja1103

2021-04-10 Thread kernel test robot
Hi "Radu,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on linus/master]
[also build test ERROR on v5.12-rc6 next-20210409]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:
https://github.com/0day-ci/linux/commits/Radu-Pirea-NXP-OSS/phy-nxp-c45-add-driver-for-tja1103/20210410-024203
base:   https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git 
17e7124aad766b3f158943acb51467f86220afe9
config: arm-allyesconfig (attached as .config)
compiler: arm-linux-gnueabi-gcc (GCC) 9.3.0
reproduce (this is a W=1 build):
wget 
https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O 
~/bin/make.cross
chmod +x ~/bin/make.cross
# 
https://github.com/0day-ci/linux/commit/436e508ba7a4bbe24891acf430d7722ed1f5e128
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review 
Radu-Pirea-NXP-OSS/phy-nxp-c45-add-driver-for-tja1103/20210410-024203
git checkout 436e508ba7a4bbe24891acf430d7722ed1f5e128
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-9.3.0 make.cross ARCH=arm 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot 

All errors (new ones prefixed by >>):

   arm-linux-gnueabi-ld: drivers/net/phy/nxp-c45.o: in function 
`nxp_c45_config_init':
>> nxp-c45.c:(.text+0xe2c): undefined reference to `__aeabi_uldivmod'
>> arm-linux-gnueabi-ld: nxp-c45.c:(.text+0xe64): undefined reference to 
>> `__aeabi_uldivmod'
   arm-linux-gnueabi-ld: nxp-c45.c:(.text+0xec0): undefined reference to 
`__aeabi_uldivmod'
   arm-linux-gnueabi-ld: nxp-c45.c:(.text+0xef8): undefined reference to 
`__aeabi_uldivmod'

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-...@lists.01.org


.config.gz
Description: application/gzip


Re: [PATCH] phy: nxp-c45: add driver for tja1103

2021-04-09 Thread Andrew Lunn
On Fri, Apr 09, 2021 at 09:41:06PM +0300, Radu Pirea (NXP OSS) wrote:
> Add driver for tja1103 driver and for future NXP C45 PHYs.

So apart from c45 vs c22, how does this differ to nxp-tja11xx.c?

Do we really want two different drivers for the same hardware? 
Can we combine them somehow?

> +config NXP_C45_PHY
> + tristate "NXP C45 PHYs"

This is also very vague. So in the future it will support PHYs other
than the TJA series?

 Andrew


Re: [PATCH] phy: nxp-c45: add driver for tja1103

2021-04-09 Thread Jakub Kicinski
On Fri,  9 Apr 2021 21:41:06 +0300 Radu Pirea (NXP OSS) wrote:
> Add driver for tja1103 driver and for future NXP C45 PHYs.
> 
> Signed-off-by: Radu Pirea (NXP OSS) 

drivers/net/phy/nxp-c45: struct mdio_device_id is 8 bytes.  The last of 1 is:
0x10 0xb0 0x1b 0x00 0xf0 0xff 0xff 0xff 
FATAL: modpost: drivers/net/phy/nxp-c45: struct mdio_device_id is not 
terminated with a NULL entry!
make[2]: *** [Module.symvers] Error 1
make[1]: *** [modules] Error 2
make: *** [__sub-make] Error 2


Re: [PATCH] phy: nxp-c45: add driver for tja1103

2021-04-09 Thread Heiner Kallweit
On 09.04.2021 20:41, Radu Pirea (NXP OSS) wrote:
> Add driver for tja1103 driver and for future NXP C45 PHYs.
> 
> Signed-off-by: Radu Pirea (NXP OSS) 
> ---
>  MAINTAINERS   |   6 +
>  drivers/net/phy/Kconfig   |   6 +
>  drivers/net/phy/Makefile  |   1 +
>  drivers/net/phy/nxp-c45.c | 622 ++
>  4 files changed, 635 insertions(+)
>  create mode 100644 drivers/net/phy/nxp-c45.c
> 
> diff --git a/MAINTAINERS b/MAINTAINERS
> index a008b70f3c16..082a5eca8913 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -12518,6 +12518,12 @@ F:   drivers/nvmem/
>  F:   include/linux/nvmem-consumer.h
>  F:   include/linux/nvmem-provider.h
>  
> +NXP C45 PHY DRIVER
> +M:   Radu Pirea 
> +L:   net...@vger.kernel.org
> +S:   Maintained
> +F:   drivers/net/phy/nxp-c45.c
> +
>  NXP FSPI DRIVER
>  M:   Ashish Kumar 
>  R:   Yogesh Gaur 
> diff --git a/drivers/net/phy/Kconfig b/drivers/net/phy/Kconfig
> index 698bea312adc..fd2da80b5339 100644
> --- a/drivers/net/phy/Kconfig
> +++ b/drivers/net/phy/Kconfig
> @@ -228,6 +228,12 @@ config NATIONAL_PHY
>   help
> Currently supports the DP83865 PHY.
>  
> +config NXP_C45_PHY
> + tristate "NXP C45 PHYs"
> + help
> +   Enable support for NXP C45 PHYs.
> +   Currently supports only the TJA1103 PHY.
> +
>  config NXP_TJA11XX_PHY
>   tristate "NXP TJA11xx PHYs support"
>   depends on HWMON
> diff --git a/drivers/net/phy/Makefile b/drivers/net/phy/Makefile
> index a13e402074cf..a18f095748b5 100644
> --- a/drivers/net/phy/Makefile
> +++ b/drivers/net/phy/Makefile
> @@ -70,6 +70,7 @@ obj-$(CONFIG_MICROCHIP_PHY) += microchip.o
>  obj-$(CONFIG_MICROCHIP_T1_PHY)   += microchip_t1.o
>  obj-$(CONFIG_MICROSEMI_PHY)  += mscc/
>  obj-$(CONFIG_NATIONAL_PHY)   += national.o
> +obj-$(CONFIG_NXP_C45_PHY)+= nxp-c45.o
>  obj-$(CONFIG_NXP_TJA11XX_PHY)+= nxp-tja11xx.o
>  obj-$(CONFIG_QSEMI_PHY)  += qsemi.o
>  obj-$(CONFIG_REALTEK_PHY)+= realtek.o
> diff --git a/drivers/net/phy/nxp-c45.c b/drivers/net/phy/nxp-c45.c
> new file mode 100644
> index ..2961799f7d05
> --- /dev/null
> +++ b/drivers/net/phy/nxp-c45.c
> @@ -0,0 +1,622 @@
> +// SPDX-License-Identifier: GPL-2.0
> +/* NXP C45 PHY driver
> + * Copyright (C) 2021 NXP
> + * Copyright (C) 2021 Radu Pirea 
> + */
> +
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +#include 
> +
> +#define PHY_ID_BASE_T1   0x001BB010
> +
> +#define B100T1_PMAPMD_CTL0x0834
> +#define B100T1_PMAPMD_CONFIG_EN  BIT(15)
> +#define B100T1_PMAPMD_MASTER BIT(14)
> +#define MASTER_MODE  (B100T1_PMAPMD_CONFIG_EN | 
> B100T1_PMAPMD_MASTER)
> +#define SLAVE_MODE   (B100T1_PMAPMD_CONFIG_EN)
> +
> +#define DEVICE_CONTROL   0x0040
> +#define DEVICE_CONTROL_RESET BIT(15)
> +#define DEVICE_CONTROL_CONFIG_GLOBAL_EN  BIT(14)
> +#define DEVICE_CONTROL_CONFIG_ALL_EN BIT(13)
> +#define RESET_POLL_NS(250 * NSEC_PER_MSEC)
> +
> +#define PHY_CONTROL  0x8100
> +#define PHY_CONFIG_ENBIT(14)
> +#define PHY_START_OP BIT(0)
> +
> +#define PHY_CONFIG   0x8108
> +#define PHY_CONFIG_AUTO  BIT(0)
> +
> +#define SIGNAL_QUALITY   0x8320
> +#define SQI_VALIDBIT(14)
> +#define SQI_MASK GENMASK(2, 0)
> +#define MAX_SQI  SQI_MASK
> +
> +#define CABLE_TEST   0x8330
> +#define CABLE_TEST_ENABLEBIT(15)
> +#define CABLE_TEST_START BIT(14)
> +#define CABLE_TEST_VALID BIT(13)
> +#define CABLE_TEST_OK0x00
> +#define CABLE_TEST_SHORTED   0x01
> +#define CABLE_TEST_OPEN  0x02
> +#define CABLE_TEST_UNKNOWN   0x07
> +
> +#define PORT_CONTROL 0x8040
> +#define PORT_CONTROL_EN  BIT(14)
> +
> +#define PORT_INFRA_CONTROL   0xAC00
> +#define PORT_INFRA_CONTROL_ENBIT(14)
> +
> +#define VND1_RXID0xAFCC
> +#define VND1_TXID0xAFCD
> +#define ID_ENABLEBIT(15)
> +
> +#define ABILITIES0xAFC4
> +#define RGMII_ID_ABILITY BIT(15)
> +#define RGMII_ABILITYBIT(14)
> +#define RMII_ABILITY BIT(10)
> +#define REVMII_ABILITY   BIT(9)
> +#define MII_ABILITY  BIT(8)
> +#define SGMII_ABILITYBIT(0)
> +
> +#define MII_BASIC_CONFIG 0xAFC6
> +#define MII_BASIC_CONFIG_REV BIT(8)
> +#define MII_BASIC_CONFIG_SGMII   0x9
> +#define MII_BASIC_CONFIG_RGMII   0x7
> +#define MII_BASIC_CONFIG_RMII0x5
> +#define MII_BASIC_CONFIG_MII 0x4
> +
> 

[PATCH] phy: nxp-c45: add driver for tja1103

2021-04-09 Thread Radu Pirea (NXP OSS)
Add driver for tja1103 driver and for future NXP C45 PHYs.

Signed-off-by: Radu Pirea (NXP OSS) 
---
 MAINTAINERS   |   6 +
 drivers/net/phy/Kconfig   |   6 +
 drivers/net/phy/Makefile  |   1 +
 drivers/net/phy/nxp-c45.c | 622 ++
 4 files changed, 635 insertions(+)
 create mode 100644 drivers/net/phy/nxp-c45.c

diff --git a/MAINTAINERS b/MAINTAINERS
index a008b70f3c16..082a5eca8913 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -12518,6 +12518,12 @@ F: drivers/nvmem/
 F: include/linux/nvmem-consumer.h
 F: include/linux/nvmem-provider.h
 
+NXP C45 PHY DRIVER
+M: Radu Pirea 
+L: net...@vger.kernel.org
+S: Maintained
+F: drivers/net/phy/nxp-c45.c
+
 NXP FSPI DRIVER
 M: Ashish Kumar 
 R: Yogesh Gaur 
diff --git a/drivers/net/phy/Kconfig b/drivers/net/phy/Kconfig
index 698bea312adc..fd2da80b5339 100644
--- a/drivers/net/phy/Kconfig
+++ b/drivers/net/phy/Kconfig
@@ -228,6 +228,12 @@ config NATIONAL_PHY
help
  Currently supports the DP83865 PHY.
 
+config NXP_C45_PHY
+   tristate "NXP C45 PHYs"
+   help
+ Enable support for NXP C45 PHYs.
+ Currently supports only the TJA1103 PHY.
+
 config NXP_TJA11XX_PHY
tristate "NXP TJA11xx PHYs support"
depends on HWMON
diff --git a/drivers/net/phy/Makefile b/drivers/net/phy/Makefile
index a13e402074cf..a18f095748b5 100644
--- a/drivers/net/phy/Makefile
+++ b/drivers/net/phy/Makefile
@@ -70,6 +70,7 @@ obj-$(CONFIG_MICROCHIP_PHY)   += microchip.o
 obj-$(CONFIG_MICROCHIP_T1_PHY) += microchip_t1.o
 obj-$(CONFIG_MICROSEMI_PHY)+= mscc/
 obj-$(CONFIG_NATIONAL_PHY) += national.o
+obj-$(CONFIG_NXP_C45_PHY)  += nxp-c45.o
 obj-$(CONFIG_NXP_TJA11XX_PHY)  += nxp-tja11xx.o
 obj-$(CONFIG_QSEMI_PHY)+= qsemi.o
 obj-$(CONFIG_REALTEK_PHY)  += realtek.o
diff --git a/drivers/net/phy/nxp-c45.c b/drivers/net/phy/nxp-c45.c
new file mode 100644
index ..2961799f7d05
--- /dev/null
+++ b/drivers/net/phy/nxp-c45.c
@@ -0,0 +1,622 @@
+// SPDX-License-Identifier: GPL-2.0
+/* NXP C45 PHY driver
+ * Copyright (C) 2021 NXP
+ * Copyright (C) 2021 Radu Pirea 
+ */
+
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+#include 
+
+#define PHY_ID_BASE_T1 0x001BB010
+
+#define B100T1_PMAPMD_CTL  0x0834
+#define B100T1_PMAPMD_CONFIG_ENBIT(15)
+#define B100T1_PMAPMD_MASTER   BIT(14)
+#define MASTER_MODE(B100T1_PMAPMD_CONFIG_EN | 
B100T1_PMAPMD_MASTER)
+#define SLAVE_MODE (B100T1_PMAPMD_CONFIG_EN)
+
+#define DEVICE_CONTROL 0x0040
+#define DEVICE_CONTROL_RESET   BIT(15)
+#define DEVICE_CONTROL_CONFIG_GLOBAL_ENBIT(14)
+#define DEVICE_CONTROL_CONFIG_ALL_EN   BIT(13)
+#define RESET_POLL_NS  (250 * NSEC_PER_MSEC)
+
+#define PHY_CONTROL0x8100
+#define PHY_CONFIG_EN  BIT(14)
+#define PHY_START_OP   BIT(0)
+
+#define PHY_CONFIG 0x8108
+#define PHY_CONFIG_AUTOBIT(0)
+
+#define SIGNAL_QUALITY 0x8320
+#define SQI_VALID  BIT(14)
+#define SQI_MASK   GENMASK(2, 0)
+#define MAX_SQISQI_MASK
+
+#define CABLE_TEST 0x8330
+#define CABLE_TEST_ENABLE  BIT(15)
+#define CABLE_TEST_START   BIT(14)
+#define CABLE_TEST_VALID   BIT(13)
+#define CABLE_TEST_OK  0x00
+#define CABLE_TEST_SHORTED 0x01
+#define CABLE_TEST_OPEN0x02
+#define CABLE_TEST_UNKNOWN 0x07
+
+#define PORT_CONTROL   0x8040
+#define PORT_CONTROL_ENBIT(14)
+
+#define PORT_INFRA_CONTROL 0xAC00
+#define PORT_INFRA_CONTROL_EN  BIT(14)
+
+#define VND1_RXID  0xAFCC
+#define VND1_TXID  0xAFCD
+#define ID_ENABLE  BIT(15)
+
+#define ABILITIES  0xAFC4
+#define RGMII_ID_ABILITY   BIT(15)
+#define RGMII_ABILITY  BIT(14)
+#define RMII_ABILITY   BIT(10)
+#define REVMII_ABILITY BIT(9)
+#define MII_ABILITYBIT(8)
+#define SGMII_ABILITY  BIT(0)
+
+#define MII_BASIC_CONFIG   0xAFC6
+#define MII_BASIC_CONFIG_REV   BIT(8)
+#define MII_BASIC_CONFIG_SGMII 0x9
+#define MII_BASIC_CONFIG_RGMII 0x7
+#define MII_BASIC_CONFIG_RMII  0x5
+#define MII_BASIC_CONFIG_MII   0x4
+
+#define SYMBOL_ERROR_COUNTER   0x8350
+#define LINK_DROP_COUNTER  0x8352
+#define LINK_LOSSES_AND_FAILURES   0x8353
+#define R_GOOD_FRAME_CNT   0xA950
+#define R_BAD_FRAME_CNT0xA952
+#define R_RXER_FRAME_CNT   0xA954
+#define RX_PRE