From: Frank Li <Frank.Li@freescale.com> To: <b38611@freescale.com>, <davem@davemloft.net>, <netdev@vger.kernel.org>, <lznuaa@gmail.com> Cc: <shawn.guo@linaro.org>, <linux-arm-kernel@lists.infradead.org>, <devicetree@vger.kernel.org>, Fugang Duan <B38611@freescale.com>, Frank Li <Frank.Li@freescale.com> Subject: [Patch net-next 03/11] net:fec: use multiqueue interface to allocate Ethernet device Date: Thu, 4 Sep 2014 04:38:09 +0800 [thread overview] Message-ID: <1409776697-1536-4-git-send-email-Frank.Li@freescale.com> (raw) In-Reply-To: <1409776697-1536-1-git-send-email-Frank.Li@freescale.com> From: Fugang Duan <B38611@freescale.com> Since i.MX6SX enet-AVB IP support multi queues, so use multi queues interface to allocate and set up an Ethernet device. Signed-off-by: Fugang Duan <B38611@freescale.com> Signed-off-by: Frank Li <Frank.Li@freescale.com> --- drivers/net/ethernet/freescale/fec.h | 9 ++++++ drivers/net/ethernet/freescale/fec_main.c | 49 ++++++++++++++++++++++++++++++- 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/freescale/fec.h b/drivers/net/ethernet/freescale/fec.h index 635772b..f77ed6f 100644 --- a/drivers/net/ethernet/freescale/fec.h +++ b/drivers/net/ethernet/freescale/fec.h @@ -233,6 +233,13 @@ struct bufdesc_ex { /* This device has up to three irqs on some platforms */ #define FEC_IRQ_NUM 3 +/* Maximum number of queues supported + * ENET with AVB IP can support up to 3 independent tx queues and rx queues. + * User can point the queue number that is less than or equal to 3. + */ +#define FEC_ENET_MAX_TX_QS 3 +#define FEC_ENET_MAX_RX_QS 3 + /* The number of Tx and Rx buffers. These are allocated from the page * pool. The code may assume these are power of two, so it it best * to keep them that size. @@ -278,6 +285,8 @@ struct fec_enet_private { bool ptp_clk_on; struct mutex ptp_clk_mutex; + int num_tx_queues; + int num_rx_queues; /* The saved address of a sent-in-place packet/buffer, for skfree(). */ unsigned char *tx_bounce[TX_RING_SIZE]; diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index ee9f04f..00fcadd 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c @@ -2573,6 +2573,39 @@ static void fec_reset_phy(struct platform_device *pdev) #endif /* CONFIG_OF */ static int +fec_enet_get_queue_num(struct platform_device *pdev, int *num_tx, int *num_rx) +{ + struct device_node *np = pdev->dev.of_node; + int err; + + if (!np || !of_device_is_available(np)) + return -ENODEV; + + /* parse the num of tx and rx queues */ + err = of_property_read_u32(np, "fsl,num_tx_queues", num_tx); + err |= of_property_read_u32(np, "fsl,num_rx_queues", num_rx); + if (err) { + *num_tx = 1; + *num_rx = 1; + return 0; + } + + if (*num_tx < 1 || *num_tx > FEC_ENET_MAX_TX_QS) { + dev_err(&pdev->dev, "num_tx(=%d) greater than MAX_TX_QS(=%d)\n", + *num_tx, FEC_ENET_MAX_TX_QS); + return -EINVAL; + } + + if (*num_rx < 1 || *num_rx > FEC_ENET_MAX_RX_QS) { + dev_err(&pdev->dev, "num_rx(=%d) greater than MAX_RX_QS(=%d)\n", + *num_rx, FEC_ENET_MAX_RX_QS); + return -EINVAL; + } + + return 0; +} + +static int fec_probe(struct platform_device *pdev) { struct fec_enet_private *fep; @@ -2583,13 +2616,23 @@ fec_probe(struct platform_device *pdev) const struct of_device_id *of_id; static int dev_id; struct device_node *np = pdev->dev.of_node, *phy_node; + int num_tx_qs = 1; + int num_rx_qs = 1; of_id = of_match_device(fec_dt_ids, &pdev->dev); if (of_id) pdev->id_entry = of_id->data; + if (pdev->id_entry && + (pdev->id_entry->driver_data & FEC_QUIRK_HAS_AVB)) { + ret = fec_enet_get_queue_num(pdev, &num_tx_qs, &num_rx_qs); + if (ret) + return ret; + } + /* Init network device */ - ndev = alloc_etherdev(sizeof(struct fec_enet_private)); + ndev = alloc_etherdev_mqs(sizeof(struct fec_enet_private), + num_tx_qs, num_rx_qs); if (!ndev) return -ENOMEM; @@ -2598,6 +2641,10 @@ fec_probe(struct platform_device *pdev) /* setup board info structure */ fep = netdev_priv(ndev); + fep->num_rx_queues = num_rx_qs; + fep->num_tx_queues = num_tx_qs; + netif_set_real_num_rx_queues(ndev, num_rx_qs); + #if !defined(CONFIG_M5272) /* default enable pause frame auto negotiation */ if (pdev->id_entry && -- 1.9.1
WARNING: multiple messages have this Message-ID (diff)
From: Frank Li <Frank.Li@freescale.com> To: b38611@freescale.com, davem@davemloft.net, netdev@vger.kernel.org, lznuaa@gmail.com Cc: shawn.guo@linaro.org, linux-arm-kernel@lists.infradead.org, devicetree@vger.kernel.org, Fugang Duan <B38611@freescale.com>, Frank Li <Frank.Li@freescale.com> Subject: [Patch net-next 03/11] net:fec: use multiqueue interface to allocate Ethernet device Date: Thu, 4 Sep 2014 04:38:09 +0800 [thread overview] Message-ID: <1409776697-1536-4-git-send-email-Frank.Li@freescale.com> (raw) In-Reply-To: <1409776697-1536-1-git-send-email-Frank.Li@freescale.com> From: Fugang Duan <B38611@freescale.com> Since i.MX6SX enet-AVB IP support multi queues, so use multi queues interface to allocate and set up an Ethernet device. Signed-off-by: Fugang Duan <B38611@freescale.com> Signed-off-by: Frank Li <Frank.Li@freescale.com> --- drivers/net/ethernet/freescale/fec.h | 9 ++++++ drivers/net/ethernet/freescale/fec_main.c | 49 ++++++++++++++++++++++++++++++- 2 files changed, 57 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/freescale/fec.h b/drivers/net/ethernet/freescale/fec.h index 635772b..f77ed6f 100644 --- a/drivers/net/ethernet/freescale/fec.h +++ b/drivers/net/ethernet/freescale/fec.h @@ -233,6 +233,13 @@ struct bufdesc_ex { /* This device has up to three irqs on some platforms */ #define FEC_IRQ_NUM 3 +/* Maximum number of queues supported + * ENET with AVB IP can support up to 3 independent tx queues and rx queues. + * User can point the queue number that is less than or equal to 3. + */ +#define FEC_ENET_MAX_TX_QS 3 +#define FEC_ENET_MAX_RX_QS 3 + /* The number of Tx and Rx buffers. These are allocated from the page * pool. The code may assume these are power of two, so it it best * to keep them that size. @@ -278,6 +285,8 @@ struct fec_enet_private { bool ptp_clk_on; struct mutex ptp_clk_mutex; + int num_tx_queues; + int num_rx_queues; /* The saved address of a sent-in-place packet/buffer, for skfree(). */ unsigned char *tx_bounce[TX_RING_SIZE]; diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c index ee9f04f..00fcadd 100644 --- a/drivers/net/ethernet/freescale/fec_main.c +++ b/drivers/net/ethernet/freescale/fec_main.c @@ -2573,6 +2573,39 @@ static void fec_reset_phy(struct platform_device *pdev) #endif /* CONFIG_OF */ static int +fec_enet_get_queue_num(struct platform_device *pdev, int *num_tx, int *num_rx) +{ + struct device_node *np = pdev->dev.of_node; + int err; + + if (!np || !of_device_is_available(np)) + return -ENODEV; + + /* parse the num of tx and rx queues */ + err = of_property_read_u32(np, "fsl,num_tx_queues", num_tx); + err |= of_property_read_u32(np, "fsl,num_rx_queues", num_rx); + if (err) { + *num_tx = 1; + *num_rx = 1; + return 0; + } + + if (*num_tx < 1 || *num_tx > FEC_ENET_MAX_TX_QS) { + dev_err(&pdev->dev, "num_tx(=%d) greater than MAX_TX_QS(=%d)\n", + *num_tx, FEC_ENET_MAX_TX_QS); + return -EINVAL; + } + + if (*num_rx < 1 || *num_rx > FEC_ENET_MAX_RX_QS) { + dev_err(&pdev->dev, "num_rx(=%d) greater than MAX_RX_QS(=%d)\n", + *num_rx, FEC_ENET_MAX_RX_QS); + return -EINVAL; + } + + return 0; +} + +static int fec_probe(struct platform_device *pdev) { struct fec_enet_private *fep; @@ -2583,13 +2616,23 @@ fec_probe(struct platform_device *pdev) const struct of_device_id *of_id; static int dev_id; struct device_node *np = pdev->dev.of_node, *phy_node; + int num_tx_qs = 1; + int num_rx_qs = 1; of_id = of_match_device(fec_dt_ids, &pdev->dev); if (of_id) pdev->id_entry = of_id->data; + if (pdev->id_entry && + (pdev->id_entry->driver_data & FEC_QUIRK_HAS_AVB)) { + ret = fec_enet_get_queue_num(pdev, &num_tx_qs, &num_rx_qs); + if (ret) + return ret; + } + /* Init network device */ - ndev = alloc_etherdev(sizeof(struct fec_enet_private)); + ndev = alloc_etherdev_mqs(sizeof(struct fec_enet_private), + num_tx_qs, num_rx_qs); if (!ndev) return -ENOMEM; @@ -2598,6 +2641,10 @@ fec_probe(struct platform_device *pdev) /* setup board info structure */ fep = netdev_priv(ndev); + fep->num_rx_queues = num_rx_qs; + fep->num_tx_queues = num_tx_qs; + netif_set_real_num_rx_queues(ndev, num_rx_qs); + #if !defined(CONFIG_M5272) /* default enable pause frame auto negotiation */ if (pdev->id_entry && -- 1.9.1
next prev parent reply other threads:[~2014-09-03 20:59 UTC|newest] Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top 2014-09-03 20:38 [Patch net-next 00/11] net: fec: imx6sx multiqueue support Frank Li 2014-09-03 20:38 ` Frank Li 2014-09-03 20:38 ` Frank Li [this message] 2014-09-03 20:38 ` [Patch net-next 03/11] net:fec: use multiqueue interface to allocate Ethernet device Frank Li 2014-09-03 21:20 ` Florian Fainelli 2014-09-03 21:20 ` Florian Fainelli [not found] ` <1409776697-1536-1-git-send-email-Frank.Li-KZfg59tc24xl57MIdRCFDg@public.gmane.org> 2014-09-03 20:38 ` [Patch net-next 01/11] net:fec: add enet refrence clock for i.MX 6SX chip Frank Li 2014-09-03 20:38 ` Frank Li 2014-09-03 20:38 ` [Patch net-next 02/11] net:fec: add enet AVB feature macro define for imx6sx Frank Li 2014-09-03 20:38 ` Frank Li 2014-09-03 20:38 ` [Patch net-next 04/11] net:fec: add multiqueue support Frank Li 2014-09-03 20:38 ` Frank Li 2014-09-03 21:27 ` Florian Fainelli 2014-09-03 21:27 ` Florian Fainelli [not found] ` <540787B9.8090504-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> 2014-09-04 3:41 ` Zhi Li 2014-09-04 3:41 ` Zhi Li 2014-09-04 4:09 ` Florian Fainelli 2014-09-04 4:09 ` Florian Fainelli 2014-09-04 14:02 ` Zhi Li 2014-09-04 14:02 ` Zhi Li 2014-09-03 20:38 ` [Patch net-next 08/11] net:fec: change FEC alignment to 64 bytes for ARM platform Frank Li 2014-09-03 20:38 ` Frank Li 2014-09-04 8:50 ` David Laight 2014-09-04 9:11 ` fugang.duan at freescale.com 2014-09-04 9:18 ` David Laight 2014-09-04 14:17 ` Zhi Li 2014-09-04 14:17 ` Zhi Li 2014-09-03 20:38 ` [Patch net-next 09/11] net:fec: remove unnessary memory copy for address alignment in .xmit() Frank Li 2014-09-03 20:38 ` Frank Li 2014-09-03 20:38 ` [Patch net-next 10/11] ARM: Documentation: Update fec dts binding doc Frank Li 2014-09-03 20:38 ` Frank Li 2014-09-03 20:38 ` [Patch net-next 05/11] net:fec: Disable enet-avb MAC instead of reset MAC Frank Li 2014-09-03 20:38 ` Frank Li 2014-09-03 20:38 ` [Patch net-next 06/11] net:fec: add enet-avb IP support Frank Li 2014-09-03 20:38 ` Frank Li 2014-09-03 20:38 ` [Patch net-next 07/11] net:fec: Add fsl,imx6sx-fec compatible strings Frank Li 2014-09-03 20:38 ` Frank Li 2014-09-03 20:38 ` [Patch net-next 11/11] ARM: dts: imx6sx: add multi-queue support enet Frank Li 2014-09-03 20:38 ` Frank Li [not found] <1409776486-1403-1-git-send-email-y> 2014-09-03 20:34 ` [Patch net-next 03/11] net:fec: use multiqueue interface to allocate Ethernet device y 2014-09-03 20:34 ` y 2014-09-03 20:34 ` y 2014-09-03 20:34 ` y
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=1409776697-1536-4-git-send-email-Frank.Li@freescale.com \ --to=frank.li@freescale.com \ --cc=b38611@freescale.com \ --cc=davem@davemloft.net \ --cc=devicetree@vger.kernel.org \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=lznuaa@gmail.com \ --cc=netdev@vger.kernel.org \ --cc=shawn.guo@linaro.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: linkBe 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.