[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-id: <005701cf41a4$eee0ddf0$cca299d0$@samsung.com>
Date: Sun, 16 Mar 2014 22:51:21 -0700
From: Byungho An <bh74.an@...sung.com>
To: 'Mark Rutland' <mark.rutland@....com>
Cc: netdev@...r.kernel.org, devicetree@...r.kernel.org,
linux-samsung-soc@...r.kernel.org, davem@...emloft.net,
siva.kallam@...sung.com, vipul.pandya@...sung.com,
ks.giri@...sung.com, ilho215.lee@...sung.com
Subject: RE: [PATCH V2 1/7] net: sxgbe: add basic framework for Samsung 10Gb
ethernet driver
Mark Rutland <mark.rutland@....com> :
> On Wed, Mar 12, 2014 at 01:28:00PM +0000, Byungho An wrote:
> > From: Siva Reddy <siva.kallam@...sung.com>
> >
> > This patch adds support for Samsung 10Gb ethernet driver(sxgbe).
> >
> > - sxgbe core initialization
> > - Tx and Rx support
> > - MDIO support
> > - ISRs for Tx and Rx
> > - ifconfig support to driver
> >
> > Signed-off-by: Siva Reddy Kallam <siva.kallam@...sung.com>
> > Signed-off-by: Vipul Pandya <vipul.pandya@...sung.com>
> > Signed-off-by: Girish K S <ks.giri@...sung.com>
> > Neatening-by: Joe Perches <joe@...ches.com>
> > Signed-off-by: Byungho An <bh74.an@...sung.com>
> > ---
>
> [...]
>
> > diff --git a/Documentation/devicetree/bindings/net/samsung-sxgbe.txt
> > b/Documentation/devicetree/bindings/net/samsung-sxgbe.txt
> > new file mode 100644
> > index 0000000..f2abf65
> > --- /dev/null
> > +++ b/Documentation/devicetree/bindings/net/samsung-sxgbe.txt
>
> Please split the binding into a separate patch from the code (it makes it
far
> easier for us DT guys to find that portions relevant to use).
>
> Is there any public documentation?
No.
>
> > @@ -0,0 +1,39 @@
> > +* Samsung 10G Ethernet driver (SXGBE)
> > +
> > +Required properties:
> > +- compatible: Should be "samsung,sxgbe-v2.0a"
> > +- reg: Address and length of the register set for the device
> > +- interrupt-parent: Should be the phandle for the interrupt
> > +controller
> > + that services interrupts for this device
> > +- interrupts: Should contain the SXGBE interrupts
>
> How many, in which order, what are each of them for?
total = 26, first mandatory interrupt common to all, followed by 8 tx
interrupt (which can vary based on platform), 16 rx interrupts (which can
vary based on platform) and a optional lpi interrupt
>
> > +- samsung,burst-map Program the possible bursts supported by
sxgbe
> > +- samsung,fixed-burst Program the DMA to use the fixed burst mode
> > +- samsung,adv-addr-mode program the DMA to use Enhanced address
> mode
>
> What are valid values?
>
> Units/types?
>
> Please describe what these actually do.
These will be updated in the binding document as per your review.
>
> > +- samsung,force_thresh_dma_mode Force DMA to use the threshold
> mode
> > for
> > + both tx and rx
>
> Odd formatting here.
>
> s/_/-/ in property names please.
>
> When and why should this property be set in a dt?
Addressed in the new document
>
> > +- samsung,force_sf_dma_mode Force DMA to use the Store and
> Forward
> > + mode for both tx and rx. This flag is
> > + ignored if force_thresh_dma_mode is set.
>
> Likewise, for all points.
OK.
>
> [...]
>
> > +/* Clean the tx descriptor as soon as the tx irq is received */
> > +static void sxgbe_release_tx_desc(struct sxgbe_tx_norm_desc *p) {
> > + memset(p, 0, sizeof(struct sxgbe_tx_norm_desc));
>
> You can use sizeof(*p) here.
OK.
>
> [...]
>
> > +static int sxgbe_probe_config_dt(struct platform_device *pdev,
> > + struct sxgbe_plat_data *plat,
> > + const char **mac) {
> > + struct device_node *np = pdev->dev.of_node;
> > + struct sxgbe_dma_cfg *dma_cfg;
> > + u32 phy_addr;
> > +
> > + if (!np)
> > + return -ENODEV;
> > +
> > + *mac = of_get_mac_address(np);
>
> I see that of_get_mac_address returns a *void rather than *char, but it's
> always a string of hex digits. Would it make sense to change the
> of_get_mac_address prototype to return a char* ?
This implementation is of_ specific, our driver only uses it.
>
> > + plat->interface = of_get_phy_mode(np);
> > +
> > + plat->bus_id = of_alias_get_id(np, "ethernet");
> > + if (plat->bus_id < 0)
> > + plat->bus_id = 0;
>
> This wasn't mentioned in the binding.
It doesn't need to be in the binding document, because we get the alias id
by passing the node name. Here ethernet is not a property it is the dt node
name
e.g.
ethernet@...xx {
};
>
> > +
> > + of_property_read_u32(np, "samsung,phy-addr", &plat->phy_addr);
>
> Neither was this.
OK.
>
> > +
> > + plat->mdio_bus_data = devm_kzalloc(&pdev->dev,
> > + sizeof(struct
> > sxgbe_mdio_bus_data),
> > + GFP_KERNEL);
> > +
> > + if (of_device_is_compatible(np, "samsung,sxgbe-v2.0a"))
> > + plat->pmt = 1;
>
> Only one compatible string is documented. When would this _not_ be the
> case?
Removed as it is unused
>
> [...]
>
> > +static int sxgbe_platform_probe(struct platform_device *pdev) {
> > + int ret = 0;
> > + int loop = 0;
> > + int index1, index2;
> > + struct resource *res;
> > + struct device *dev = &pdev->dev;
> > + void __iomem *addr = NULL;
> > + struct sxgbe_priv_data *priv = NULL;
> > + struct sxgbe_plat_data *plat_dat = NULL;
> > + const char *mac = NULL;
> > + int total_dma_channels = SXGBE_TX_QUEUES + SXGBE_RX_QUEUES;
> > +
> > + /* Get memory resource */
> > + res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> > + if (!res)
> > + return -ENODEV;
> > +
> > + addr = devm_ioremap_resource(dev, res);
> > + if (IS_ERR(addr))
> > + return PTR_ERR(addr);
> > +
> > + plat_dat = pdev->dev.platform_data;
>
> This is a new dt-driven driver. Why would you need additional platform
data?
> Why can this information not come from dt?
Same above.
>
> > + if (pdev->dev.of_node) {
> > + if (!plat_dat)
> > + plat_dat = devm_kzalloc(&pdev->dev,
> > + sizeof(struct
> > sxgbe_plat_data),
> > + GFP_KERNEL);
> > + if (!plat_dat)
> > + return -ENOMEM;
> > +
> > + ret = sxgbe_probe_config_dt(pdev, plat_dat, &mac);
> > + if (ret) {
> > + pr_err("%s: main dt probe failed\n", __func__);
> > + return ret;
> > + }
> > + }
> > +
> > + priv = sxgbe_dvr_probe(&(pdev->dev), plat_dat, addr);
> > + if (!priv) {
> > + pr_err("%s: main driver probe failed\n", __func__);
> > + return -ENODEV;
> > + }
> > +
> > + /* Get MAC address if available (DT) */
> > + if (mac)
> > + ether_addr_copy(priv->dev->dev_addr, mac);
> > +
> > + /* Get the SXGBE common INT information */
> > + priv->dev->irq = irq_of_parse_and_map(dev->of_node, loop++);
> > + if (priv->dev->irq <= 0) {
> > + dev_err(dev, "sxgbe common irq parsing failed\n");
> > + return -EINVAL;
> > + }
>
> So the first IRQ is assumed to be a common interrupt...
Right.
>
> > +
> > + /* Get the TX/RX IRQ numbers */
> > + for (index1 = 0, index2 = 0 ; loop < total_dma_channels; loop++)
{
> > + if (loop < SXGBE_TX_QUEUES) {
> > + (priv->txq[index1])->irq_no =
> > + irq_of_parse_and_map(dev->of_node,
> > + loop);
>
> then there's a TX IRQ for each queue, in order...
>
> > + if ((priv->txq[index1++])->irq_no <= 0) {
> > + dev_err(dev, "sxgbe tx irq parsing
> > failed\n");
> > + return -EINVAL;
> > + }
> > + } else {
> > + (priv->rxq[index2])->irq_no =
> > + irq_of_parse_and_map(dev->of_node,
> > + loop);
>
> then an RX IRQ for each queue, in order.
>
> That should be in the binding document.
taken care in the binding document.
Thanks Mark for your comments
>
> Cheers,
> Mark.
> --
> To unsubscribe from this list: send the line "unsubscribe netdev" in the
body
> of a message to majordomo@...r.kernel.org More majordomo info at
> http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Powered by blists - more mailing lists