Commit 87ab2079 authored by Alex Williams's avatar Alex Williams Committed by David S. Miller
Browse files

net: nixge: Separate ctrl and dma resources



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: default avatarAlex Williams <alex.williams@ni.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 5ea25b12
Loading
Loading
Loading
Loading
+58 −16
Original line number Diff line number Diff line
@@ -105,6 +105,12 @@
#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,