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: Alex Williams <alex.williams@ni.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Родитель
5ea25b1252
Коммит
87ab207981
|
@ -105,6 +105,12 @@
|
||||||
#define NIXGE_MAX_JUMBO_FRAME_SIZE \
|
#define NIXGE_MAX_JUMBO_FRAME_SIZE \
|
||||||
(NIXGE_JUMBO_MTU + NIXGE_HDR_SIZE + NIXGE_TRL_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 {
|
struct nixge_hw_dma_bd {
|
||||||
u32 next_lo;
|
u32 next_lo;
|
||||||
u32 next_hi;
|
u32 next_hi;
|
||||||
|
@ -1225,11 +1231,59 @@ static void *nixge_get_nvmem_address(struct device *dev)
|
||||||
return mac;
|
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)
|
static int nixge_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct nixge_priv *priv;
|
struct nixge_priv *priv;
|
||||||
struct net_device *ndev;
|
struct net_device *ndev;
|
||||||
struct resource *dmares;
|
|
||||||
const u8 *mac_addr;
|
const u8 *mac_addr;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
@ -1261,14 +1315,9 @@ static int nixge_probe(struct platform_device *pdev)
|
||||||
priv->dev = &pdev->dev;
|
priv->dev = &pdev->dev;
|
||||||
|
|
||||||
netif_napi_add(ndev, &priv->napi, nixge_poll, NAPI_POLL_WEIGHT);
|
netif_napi_add(ndev, &priv->napi, nixge_poll, NAPI_POLL_WEIGHT);
|
||||||
|
err = nixge_of_get_resources(pdev);
|
||||||
dmares = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
if (err)
|
||||||
priv->dma_regs = devm_ioremap_resource(&pdev->dev, dmares);
|
return err;
|
||||||
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;
|
|
||||||
__nixge_hw_set_mac_address(ndev);
|
__nixge_hw_set_mac_address(ndev);
|
||||||
|
|
||||||
priv->tx_irq = platform_get_irq_byname(pdev, "tx");
|
priv->tx_irq = platform_get_irq_byname(pdev, "tx");
|
||||||
|
@ -1337,13 +1386,6 @@ static int nixge_remove(struct platform_device *pdev)
|
||||||
return 0;
|
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 = {
|
static struct platform_driver nixge_driver = {
|
||||||
.probe = nixge_probe,
|
.probe = nixge_probe,
|
||||||
.remove = nixge_remove,
|
.remove = nixge_remove,
|
||||||
|
|
Загрузка…
Ссылка в новой задаче