net: nixge: Separate ctrl and dma resources
authorAlex Williams <alex.williams@ni.com>
Thu, 31 Jan 2019 21:33:27 +0000 (13:33 -0800)
committerDavid S. Miller <davem@davemloft.net>
Sun, 3 Feb 2019 04:09:22 +0000 (20:09 -0800)
The DMA engine is a separate entity altogether, and this allows the DMA
controller's address to float elsewhere in the FPGA's map.

Signed-off-by: Alex Williams <alex.williams@ni.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/ni/nixge.c

index 1e408d1..73a98bd 100644 (file)
 #define NIXGE_MAX_JUMBO_FRAME_SIZE \
        (NIXGE_JUMBO_MTU + NIXGE_HDR_SIZE + NIXGE_TRL_SIZE)
 
+enum nixge_version {
+       NIXGE_V2,
+       NIXGE_V3,
+       NIXGE_VERSION_COUNT
+};
+
 struct nixge_hw_dma_bd {
        u32 next_lo;
        u32 next_hi;
@@ -1225,11 +1231,59 @@ static void *nixge_get_nvmem_address(struct device *dev)
        return mac;
 }
 
+/* Match table for of_platform binding */
+static const struct of_device_id nixge_dt_ids[] = {
+       { .compatible = "ni,xge-enet-2.00", .data = (void *)NIXGE_V2 },
+       { .compatible = "ni,xge-enet-3.00", .data = (void *)NIXGE_V3 },
+       {},
+};
+MODULE_DEVICE_TABLE(of, nixge_dt_ids);
+
+static int nixge_of_get_resources(struct platform_device *pdev)
+{
+       const struct of_device_id *of_id;
+       enum nixge_version version;
+       struct resource *ctrlres;
+       struct resource *dmares;
+       struct net_device *ndev;
+       struct nixge_priv *priv;
+
+       ndev = platform_get_drvdata(pdev);
+       priv = netdev_priv(ndev);
+       of_id = of_match_node(nixge_dt_ids, pdev->dev.of_node);
+       if (!of_id)
+               return -ENODEV;
+
+       version = (enum nixge_version)of_id->data;
+       if (version <= NIXGE_V2)
+               dmares = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+       else
+               dmares = platform_get_resource_byname(pdev, IORESOURCE_MEM,
+                                                     "dma");
+
+       priv->dma_regs = devm_ioremap_resource(&pdev->dev, dmares);
+       if (IS_ERR(priv->dma_regs)) {
+               netdev_err(ndev, "failed to map dma regs\n");
+               return PTR_ERR(priv->dma_regs);
+       }
+       if (version <= NIXGE_V2) {
+               priv->ctrl_regs = priv->dma_regs + NIXGE_REG_CTRL_OFFSET;
+       } else {
+               ctrlres = platform_get_resource_byname(pdev, IORESOURCE_MEM,
+                                                      "ctrl");
+               priv->ctrl_regs = devm_ioremap_resource(&pdev->dev, ctrlres);
+       }
+       if (IS_ERR(priv->ctrl_regs)) {
+               netdev_err(ndev, "failed to map ctrl regs\n");
+               return PTR_ERR(priv->ctrl_regs);
+       }
+       return 0;
+}
+
 static int nixge_probe(struct platform_device *pdev)
 {
        struct nixge_priv *priv;
        struct net_device *ndev;
-       struct resource *dmares;
        const u8 *mac_addr;
        int err;
 
@@ -1261,14 +1315,9 @@ static int nixge_probe(struct platform_device *pdev)
        priv->dev = &pdev->dev;
 
        netif_napi_add(ndev, &priv->napi, nixge_poll, NAPI_POLL_WEIGHT);
-
-       dmares = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-       priv->dma_regs = devm_ioremap_resource(&pdev->dev, dmares);
-       if (IS_ERR(priv->dma_regs)) {
-               netdev_err(ndev, "failed to map dma regs\n");
-               return PTR_ERR(priv->dma_regs);
-       }
-       priv->ctrl_regs = priv->dma_regs + NIXGE_REG_CTRL_OFFSET;
+       err = nixge_of_get_resources(pdev);
+       if (err)
+               return err;
        __nixge_hw_set_mac_address(ndev);
 
        priv->tx_irq = platform_get_irq_byname(pdev, "tx");
@@ -1337,13 +1386,6 @@ static int nixge_remove(struct platform_device *pdev)
        return 0;
 }
 
-/* Match table for of_platform binding */
-static const struct of_device_id nixge_dt_ids[] = {
-       { .compatible = "ni,xge-enet-2.00", },
-       {},
-};
-MODULE_DEVICE_TABLE(of, nixge_dt_ids);
-
 static struct platform_driver nixge_driver = {
        .probe          = nixge_probe,
        .remove         = nixge_remove,