|
@@ -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 {
|
|
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[] = {
|
|
{ .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)
|
|
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)
|
|
|
|
|
|
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);
|
|
|
|
- writel(rx_itr, fep->hwp + FEC_RXIC1);
|
|
|
|
- writel(tx_itr, fep->hwp + FEC_TXIC2);
|
|
|
|
- writel(rx_itr, fep->hwp + FEC_RXIC2);
|
|
|
|
|
|
+ if (fep->quirks & FEC_QUIRK_HAS_AVB) {
|
|
|
|
+ writel(tx_itr, fep->hwp + FEC_TXIC1);
|
|
|
|
+ writel(rx_itr, fep->hwp + FEC_RXIC1);
|
|
|
|
+ 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)
|
|
{
|
|
{
|
|
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)
|
|
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) {
|