Commit 4c88aaf3 authored by David S. Miller's avatar David S. Miller

Merge branch 'fec-new-type-device'

Andy Duan says:

====================
net: fec: add new type device

Different i.MX SOC FEC support different features like :
    - i.MX6Q/DL FEC does not support AVB and interrupt coalesc
    - i.MX6SX/i.MX7D supports AVB and interrupt coalesc
    - i.MX6UL/ULL does not support AVB, but support interrupt coalesc

Then, add new quirk flag to judge the supported features, and add new
type device for i.MX6UL.
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 2b7c4f7a a51d3ab5
...@@ -442,6 +442,8 @@ struct bufdesc_ex { ...@@ -442,6 +442,8 @@ struct bufdesc_ex {
#define FEC_QUIRK_SINGLE_MDIO (1 << 11) #define FEC_QUIRK_SINGLE_MDIO (1 << 11)
/* Controller supports RACC register */ /* Controller supports RACC register */
#define FEC_QUIRK_HAS_RACC (1 << 12) #define FEC_QUIRK_HAS_RACC (1 << 12)
/* Controller supports interrupt coalesc */
#define FEC_QUIRK_HAS_COALESCE (1 << 13)
struct bufdesc_prop { struct bufdesc_prop {
int qid; int qid;
......
...@@ -111,7 +111,13 @@ static struct platform_device_id fec_devtype[] = { ...@@ -111,7 +111,13 @@ static struct platform_device_id fec_devtype[] = {
FEC_QUIRK_HAS_BUFDESC_EX | FEC_QUIRK_HAS_CSUM | FEC_QUIRK_HAS_BUFDESC_EX | FEC_QUIRK_HAS_CSUM |
FEC_QUIRK_HAS_VLAN | FEC_QUIRK_HAS_AVB | FEC_QUIRK_HAS_VLAN | FEC_QUIRK_HAS_AVB |
FEC_QUIRK_ERR007885 | FEC_QUIRK_BUG_CAPTURE | FEC_QUIRK_ERR007885 | FEC_QUIRK_BUG_CAPTURE |
FEC_QUIRK_HAS_RACC, FEC_QUIRK_HAS_RACC | FEC_QUIRK_HAS_COALESCE,
}, {
.name = "imx6ul-fec",
.driver_data = FEC_QUIRK_ENET_MAC | FEC_QUIRK_HAS_GBIT |
FEC_QUIRK_HAS_BUFDESC_EX | FEC_QUIRK_HAS_CSUM |
FEC_QUIRK_HAS_VLAN | FEC_QUIRK_BUG_CAPTURE |
FEC_QUIRK_HAS_RACC | FEC_QUIRK_HAS_COALESCE,
}, { }, {
/* sentinel */ /* sentinel */
} }
...@@ -125,6 +131,7 @@ enum imx_fec_type { ...@@ -125,6 +131,7 @@ enum imx_fec_type {
IMX6Q_FEC, IMX6Q_FEC,
MVF600_FEC, MVF600_FEC,
IMX6SX_FEC, IMX6SX_FEC,
IMX6UL_FEC,
}; };
static const struct of_device_id fec_dt_ids[] = { static const struct of_device_id fec_dt_ids[] = {
...@@ -134,6 +141,7 @@ static const struct of_device_id fec_dt_ids[] = { ...@@ -134,6 +141,7 @@ static const struct of_device_id fec_dt_ids[] = {
{ .compatible = "fsl,imx6q-fec", .data = &fec_devtype[IMX6Q_FEC], }, { .compatible = "fsl,imx6q-fec", .data = &fec_devtype[IMX6Q_FEC], },
{ .compatible = "fsl,mvf600-fec", .data = &fec_devtype[MVF600_FEC], }, { .compatible = "fsl,mvf600-fec", .data = &fec_devtype[MVF600_FEC], },
{ .compatible = "fsl,imx6sx-fec", .data = &fec_devtype[IMX6SX_FEC], }, { .compatible = "fsl,imx6sx-fec", .data = &fec_devtype[IMX6SX_FEC], },
{ .compatible = "fsl,imx6ul-fec", .data = &fec_devtype[IMX6UL_FEC], },
{ /* sentinel */ } { /* sentinel */ }
}; };
MODULE_DEVICE_TABLE(of, fec_dt_ids); MODULE_DEVICE_TABLE(of, fec_dt_ids);
...@@ -2358,9 +2366,6 @@ static void fec_enet_itr_coal_set(struct net_device *ndev) ...@@ -2358,9 +2366,6 @@ static void fec_enet_itr_coal_set(struct net_device *ndev)
struct fec_enet_private *fep = netdev_priv(ndev); struct fec_enet_private *fep = netdev_priv(ndev);
int rx_itr, tx_itr; int rx_itr, tx_itr;
if (!(fep->quirks & FEC_QUIRK_HAS_AVB))
return;
/* Must be greater than zero to avoid unpredictable behavior */ /* Must be greater than zero to avoid unpredictable behavior */
if (!fep->rx_time_itr || !fep->rx_pkts_itr || if (!fep->rx_time_itr || !fep->rx_pkts_itr ||
!fep->tx_time_itr || !fep->tx_pkts_itr) !fep->tx_time_itr || !fep->tx_pkts_itr)
...@@ -2383,10 +2388,12 @@ static void fec_enet_itr_coal_set(struct net_device *ndev) ...@@ -2383,10 +2388,12 @@ static void fec_enet_itr_coal_set(struct net_device *ndev)
writel(tx_itr, fep->hwp + FEC_TXIC0); writel(tx_itr, fep->hwp + FEC_TXIC0);
writel(rx_itr, fep->hwp + FEC_RXIC0); writel(rx_itr, fep->hwp + FEC_RXIC0);
writel(tx_itr, fep->hwp + FEC_TXIC1); if (fep->quirks & FEC_QUIRK_HAS_AVB) {
writel(rx_itr, fep->hwp + FEC_RXIC1); writel(tx_itr, fep->hwp + FEC_TXIC1);
writel(tx_itr, fep->hwp + FEC_TXIC2); writel(rx_itr, fep->hwp + FEC_RXIC1);
writel(rx_itr, fep->hwp + FEC_RXIC2); writel(tx_itr, fep->hwp + FEC_TXIC2);
writel(rx_itr, fep->hwp + FEC_RXIC2);
}
} }
static int static int
...@@ -2394,7 +2401,7 @@ fec_enet_get_coalesce(struct net_device *ndev, struct ethtool_coalesce *ec) ...@@ -2394,7 +2401,7 @@ fec_enet_get_coalesce(struct net_device *ndev, struct ethtool_coalesce *ec)
{ {
struct fec_enet_private *fep = netdev_priv(ndev); struct fec_enet_private *fep = netdev_priv(ndev);
if (!(fep->quirks & FEC_QUIRK_HAS_AVB)) if (!(fep->quirks & FEC_QUIRK_HAS_COALESCE))
return -EOPNOTSUPP; return -EOPNOTSUPP;
ec->rx_coalesce_usecs = fep->rx_time_itr; ec->rx_coalesce_usecs = fep->rx_time_itr;
...@@ -2412,7 +2419,7 @@ fec_enet_set_coalesce(struct net_device *ndev, struct ethtool_coalesce *ec) ...@@ -2412,7 +2419,7 @@ fec_enet_set_coalesce(struct net_device *ndev, struct ethtool_coalesce *ec)
struct fec_enet_private *fep = netdev_priv(ndev); struct fec_enet_private *fep = netdev_priv(ndev);
unsigned int cycle; unsigned int cycle;
if (!(fep->quirks & FEC_QUIRK_HAS_AVB)) if (!(fep->quirks & FEC_QUIRK_HAS_COALESCE))
return -EOPNOTSUPP; return -EOPNOTSUPP;
if (ec->rx_max_coalesced_frames > 255) { if (ec->rx_max_coalesced_frames > 255) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment