|
105 | 105 | #define NIXGE_MAX_JUMBO_FRAME_SIZE \
|
106 | 106 | (NIXGE_JUMBO_MTU + NIXGE_HDR_SIZE + NIXGE_TRL_SIZE)
|
107 | 107 |
|
| 108 | +enum nixge_version { |
| 109 | + NIXGE_V2, |
| 110 | + NIXGE_V3, |
| 111 | + NIXGE_VERSION_COUNT |
| 112 | +}; |
| 113 | + |
108 | 114 | struct nixge_hw_dma_bd {
|
109 | 115 | u32 next_lo;
|
110 | 116 | u32 next_hi;
|
@@ -1225,11 +1231,59 @@ static void *nixge_get_nvmem_address(struct device *dev)
|
1225 | 1231 | return mac;
|
1226 | 1232 | }
|
1227 | 1233 |
|
| 1234 | +/* Match table for of_platform binding */ |
| 1235 | +static const struct of_device_id nixge_dt_ids[] = { |
| 1236 | + { .compatible = "ni,xge-enet-2.00", .data = (void *)NIXGE_V2 }, |
| 1237 | + { .compatible = "ni,xge-enet-3.00", .data = (void *)NIXGE_V3 }, |
| 1238 | + {}, |
| 1239 | +}; |
| 1240 | +MODULE_DEVICE_TABLE(of, nixge_dt_ids); |
| 1241 | + |
| 1242 | +static int nixge_of_get_resources(struct platform_device *pdev) |
| 1243 | +{ |
| 1244 | + const struct of_device_id *of_id; |
| 1245 | + enum nixge_version version; |
| 1246 | + struct resource *ctrlres; |
| 1247 | + struct resource *dmares; |
| 1248 | + struct net_device *ndev; |
| 1249 | + struct nixge_priv *priv; |
| 1250 | + |
| 1251 | + ndev = platform_get_drvdata(pdev); |
| 1252 | + priv = netdev_priv(ndev); |
| 1253 | + of_id = of_match_node(nixge_dt_ids, pdev->dev.of_node); |
| 1254 | + if (!of_id) |
| 1255 | + return -ENODEV; |
| 1256 | + |
| 1257 | + version = (enum nixge_version)of_id->data; |
| 1258 | + if (version <= NIXGE_V2) |
| 1259 | + dmares = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 1260 | + else |
| 1261 | + dmares = platform_get_resource_byname(pdev, IORESOURCE_MEM, |
| 1262 | + "dma"); |
| 1263 | + |
| 1264 | + priv->dma_regs = devm_ioremap_resource(&pdev->dev, dmares); |
| 1265 | + if (IS_ERR(priv->dma_regs)) { |
| 1266 | + netdev_err(ndev, "failed to map dma regs\n"); |
| 1267 | + return PTR_ERR(priv->dma_regs); |
| 1268 | + } |
| 1269 | + if (version <= NIXGE_V2) { |
| 1270 | + priv->ctrl_regs = priv->dma_regs + NIXGE_REG_CTRL_OFFSET; |
| 1271 | + } else { |
| 1272 | + ctrlres = platform_get_resource_byname(pdev, IORESOURCE_MEM, |
| 1273 | + "ctrl"); |
| 1274 | + priv->ctrl_regs = devm_ioremap_resource(&pdev->dev, ctrlres); |
| 1275 | + } |
| 1276 | + if (IS_ERR(priv->ctrl_regs)) { |
| 1277 | + netdev_err(ndev, "failed to map ctrl regs\n"); |
| 1278 | + return PTR_ERR(priv->ctrl_regs); |
| 1279 | + } |
| 1280 | + return 0; |
| 1281 | +} |
| 1282 | + |
1228 | 1283 | static int nixge_probe(struct platform_device *pdev)
|
1229 | 1284 | {
|
1230 | 1285 | struct nixge_priv *priv;
|
1231 | 1286 | struct net_device *ndev;
|
1232 |
| - struct resource *dmares; |
1233 | 1287 | const u8 *mac_addr;
|
1234 | 1288 | int err;
|
1235 | 1289 |
|
@@ -1261,14 +1315,9 @@ static int nixge_probe(struct platform_device *pdev)
|
1261 | 1315 | priv->dev = &pdev->dev;
|
1262 | 1316 |
|
1263 | 1317 | netif_napi_add(ndev, &priv->napi, nixge_poll, NAPI_POLL_WEIGHT);
|
1264 |
| - |
1265 |
| - dmares = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
1266 |
| - priv->dma_regs = devm_ioremap_resource(&pdev->dev, dmares); |
1267 |
| - if (IS_ERR(priv->dma_regs)) { |
1268 |
| - netdev_err(ndev, "failed to map dma regs\n"); |
1269 |
| - return PTR_ERR(priv->dma_regs); |
1270 |
| - } |
1271 |
| - priv->ctrl_regs = priv->dma_regs + NIXGE_REG_CTRL_OFFSET; |
| 1318 | + err = nixge_of_get_resources(pdev); |
| 1319 | + if (err) |
| 1320 | + return err; |
1272 | 1321 | __nixge_hw_set_mac_address(ndev);
|
1273 | 1322 |
|
1274 | 1323 | priv->tx_irq = platform_get_irq_byname(pdev, "tx");
|
@@ -1337,13 +1386,6 @@ static int nixge_remove(struct platform_device *pdev)
|
1337 | 1386 | return 0;
|
1338 | 1387 | }
|
1339 | 1388 |
|
1340 |
| -/* Match table for of_platform binding */ |
1341 |
| -static const struct of_device_id nixge_dt_ids[] = { |
1342 |
| - { .compatible = "ni,xge-enet-2.00", }, |
1343 |
| - {}, |
1344 |
| -}; |
1345 |
| -MODULE_DEVICE_TABLE(of, nixge_dt_ids); |
1346 |
| - |
1347 | 1389 | static struct platform_driver nixge_driver = {
|
1348 | 1390 | .probe = nixge_probe,
|
1349 | 1391 | .remove = nixge_remove,
|
|
0 commit comments