0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117 #include <linux/module.h>
0118 #include <linux/device.h>
0119 #include <linux/pci.h>
0120 #include <linux/log2.h>
0121
0122 #include "xgbe.h"
0123 #include "xgbe-common.h"
0124
0125 static int xgbe_config_multi_msi(struct xgbe_prv_data *pdata)
0126 {
0127 unsigned int vector_count;
0128 unsigned int i, j;
0129 int ret;
0130
0131 vector_count = XGBE_MSI_BASE_COUNT;
0132 vector_count += max(pdata->rx_ring_count,
0133 pdata->tx_ring_count);
0134
0135 ret = pci_alloc_irq_vectors(pdata->pcidev, XGBE_MSI_MIN_COUNT,
0136 vector_count, PCI_IRQ_MSI | PCI_IRQ_MSIX);
0137 if (ret < 0) {
0138 dev_info(pdata->dev, "multi MSI/MSI-X enablement failed\n");
0139 return ret;
0140 }
0141
0142 pdata->isr_as_tasklet = 1;
0143 pdata->irq_count = ret;
0144
0145 pdata->dev_irq = pci_irq_vector(pdata->pcidev, 0);
0146 pdata->ecc_irq = pci_irq_vector(pdata->pcidev, 1);
0147 pdata->i2c_irq = pci_irq_vector(pdata->pcidev, 2);
0148 pdata->an_irq = pci_irq_vector(pdata->pcidev, 3);
0149
0150 for (i = XGBE_MSI_BASE_COUNT, j = 0; i < ret; i++, j++)
0151 pdata->channel_irq[j] = pci_irq_vector(pdata->pcidev, i);
0152 pdata->channel_irq_count = j;
0153
0154 pdata->per_channel_irq = 1;
0155 pdata->channel_irq_mode = XGBE_IRQ_MODE_LEVEL;
0156
0157 if (netif_msg_probe(pdata))
0158 dev_dbg(pdata->dev, "multi %s interrupts enabled\n",
0159 pdata->pcidev->msix_enabled ? "MSI-X" : "MSI");
0160
0161 return 0;
0162 }
0163
0164 static int xgbe_config_irqs(struct xgbe_prv_data *pdata)
0165 {
0166 int ret;
0167
0168 ret = xgbe_config_multi_msi(pdata);
0169 if (!ret)
0170 goto out;
0171
0172 ret = pci_alloc_irq_vectors(pdata->pcidev, 1, 1,
0173 PCI_IRQ_LEGACY | PCI_IRQ_MSI);
0174 if (ret < 0) {
0175 dev_info(pdata->dev, "single IRQ enablement failed\n");
0176 return ret;
0177 }
0178
0179 pdata->isr_as_tasklet = pdata->pcidev->msi_enabled ? 1 : 0;
0180 pdata->irq_count = 1;
0181 pdata->channel_irq_count = 1;
0182
0183 pdata->dev_irq = pci_irq_vector(pdata->pcidev, 0);
0184 pdata->ecc_irq = pci_irq_vector(pdata->pcidev, 0);
0185 pdata->i2c_irq = pci_irq_vector(pdata->pcidev, 0);
0186 pdata->an_irq = pci_irq_vector(pdata->pcidev, 0);
0187
0188 if (netif_msg_probe(pdata))
0189 dev_dbg(pdata->dev, "single %s interrupt enabled\n",
0190 pdata->pcidev->msi_enabled ? "MSI" : "legacy");
0191
0192 out:
0193 if (netif_msg_probe(pdata)) {
0194 unsigned int i;
0195
0196 dev_dbg(pdata->dev, " dev irq=%d\n", pdata->dev_irq);
0197 dev_dbg(pdata->dev, " ecc irq=%d\n", pdata->ecc_irq);
0198 dev_dbg(pdata->dev, " i2c irq=%d\n", pdata->i2c_irq);
0199 dev_dbg(pdata->dev, " an irq=%d\n", pdata->an_irq);
0200 for (i = 0; i < pdata->channel_irq_count; i++)
0201 dev_dbg(pdata->dev, " dma%u irq=%d\n",
0202 i, pdata->channel_irq[i]);
0203 }
0204
0205 return 0;
0206 }
0207
0208 static int xgbe_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
0209 {
0210 struct xgbe_prv_data *pdata;
0211 struct device *dev = &pdev->dev;
0212 void __iomem * const *iomap_table;
0213 struct pci_dev *rdev;
0214 unsigned int ma_lo, ma_hi;
0215 unsigned int reg;
0216 int bar_mask;
0217 int ret;
0218
0219 pdata = xgbe_alloc_pdata(dev);
0220 if (IS_ERR(pdata)) {
0221 ret = PTR_ERR(pdata);
0222 goto err_alloc;
0223 }
0224
0225 pdata->pcidev = pdev;
0226 pci_set_drvdata(pdev, pdata);
0227
0228
0229 pdata->vdata = (struct xgbe_version_data *)id->driver_data;
0230
0231 ret = pcim_enable_device(pdev);
0232 if (ret) {
0233 dev_err(dev, "pcim_enable_device failed\n");
0234 goto err_pci_enable;
0235 }
0236
0237
0238 bar_mask = pci_select_bars(pdev, IORESOURCE_MEM);
0239 ret = pcim_iomap_regions(pdev, bar_mask, XGBE_DRV_NAME);
0240 if (ret) {
0241 dev_err(dev, "pcim_iomap_regions failed\n");
0242 goto err_pci_enable;
0243 }
0244
0245 iomap_table = pcim_iomap_table(pdev);
0246 if (!iomap_table) {
0247 dev_err(dev, "pcim_iomap_table failed\n");
0248 ret = -ENOMEM;
0249 goto err_pci_enable;
0250 }
0251
0252 pdata->xgmac_regs = iomap_table[XGBE_XGMAC_BAR];
0253 if (!pdata->xgmac_regs) {
0254 dev_err(dev, "xgmac ioremap failed\n");
0255 ret = -ENOMEM;
0256 goto err_pci_enable;
0257 }
0258 pdata->xprop_regs = pdata->xgmac_regs + XGBE_MAC_PROP_OFFSET;
0259 pdata->xi2c_regs = pdata->xgmac_regs + XGBE_I2C_CTRL_OFFSET;
0260 if (netif_msg_probe(pdata)) {
0261 dev_dbg(dev, "xgmac_regs = %p\n", pdata->xgmac_regs);
0262 dev_dbg(dev, "xprop_regs = %p\n", pdata->xprop_regs);
0263 dev_dbg(dev, "xi2c_regs = %p\n", pdata->xi2c_regs);
0264 }
0265
0266 pdata->xpcs_regs = iomap_table[XGBE_XPCS_BAR];
0267 if (!pdata->xpcs_regs) {
0268 dev_err(dev, "xpcs ioremap failed\n");
0269 ret = -ENOMEM;
0270 goto err_pci_enable;
0271 }
0272 if (netif_msg_probe(pdata))
0273 dev_dbg(dev, "xpcs_regs = %p\n", pdata->xpcs_regs);
0274
0275
0276 rdev = pci_get_domain_bus_and_slot(0, 0, PCI_DEVFN(0, 0));
0277 if (rdev &&
0278 (rdev->vendor == PCI_VENDOR_ID_AMD) && (rdev->device == 0x15d0)) {
0279 pdata->xpcs_window_def_reg = PCS_V2_RV_WINDOW_DEF;
0280 pdata->xpcs_window_sel_reg = PCS_V2_RV_WINDOW_SELECT;
0281 } else if (rdev && (rdev->vendor == PCI_VENDOR_ID_AMD) &&
0282 (rdev->device == 0x14b5)) {
0283 pdata->xpcs_window_def_reg = PCS_V2_YC_WINDOW_DEF;
0284 pdata->xpcs_window_sel_reg = PCS_V2_YC_WINDOW_SELECT;
0285
0286
0287 pdata->vdata->an_cdr_workaround = 0;
0288 } else {
0289 pdata->xpcs_window_def_reg = PCS_V2_WINDOW_DEF;
0290 pdata->xpcs_window_sel_reg = PCS_V2_WINDOW_SELECT;
0291 }
0292 pci_dev_put(rdev);
0293
0294
0295 reg = XPCS32_IOREAD(pdata, pdata->xpcs_window_def_reg);
0296 pdata->xpcs_window = XPCS_GET_BITS(reg, PCS_V2_WINDOW_DEF, OFFSET);
0297 pdata->xpcs_window <<= 6;
0298 pdata->xpcs_window_size = XPCS_GET_BITS(reg, PCS_V2_WINDOW_DEF, SIZE);
0299 pdata->xpcs_window_size = 1 << (pdata->xpcs_window_size + 7);
0300 pdata->xpcs_window_mask = pdata->xpcs_window_size - 1;
0301 if (netif_msg_probe(pdata)) {
0302 dev_dbg(dev, "xpcs window def = %#010x\n",
0303 pdata->xpcs_window_def_reg);
0304 dev_dbg(dev, "xpcs window sel = %#010x\n",
0305 pdata->xpcs_window_sel_reg);
0306 dev_dbg(dev, "xpcs window = %#010x\n",
0307 pdata->xpcs_window);
0308 dev_dbg(dev, "xpcs window size = %#010x\n",
0309 pdata->xpcs_window_size);
0310 dev_dbg(dev, "xpcs window mask = %#010x\n",
0311 pdata->xpcs_window_mask);
0312 }
0313
0314 pci_set_master(pdev);
0315
0316
0317 XP_IOWRITE(pdata, XP_INT_EN, 0x1fffff);
0318
0319
0320 ma_lo = XP_IOREAD(pdata, XP_MAC_ADDR_LO);
0321 ma_hi = XP_IOREAD(pdata, XP_MAC_ADDR_HI);
0322 pdata->mac_addr[0] = ma_lo & 0xff;
0323 pdata->mac_addr[1] = (ma_lo >> 8) & 0xff;
0324 pdata->mac_addr[2] = (ma_lo >> 16) & 0xff;
0325 pdata->mac_addr[3] = (ma_lo >> 24) & 0xff;
0326 pdata->mac_addr[4] = ma_hi & 0xff;
0327 pdata->mac_addr[5] = (ma_hi >> 8) & 0xff;
0328 if (!XP_GET_BITS(ma_hi, XP_MAC_ADDR_HI, VALID) ||
0329 !is_valid_ether_addr(pdata->mac_addr)) {
0330 dev_err(dev, "invalid mac address\n");
0331 ret = -EINVAL;
0332 goto err_pci_enable;
0333 }
0334
0335
0336 pdata->sysclk_rate = XGBE_V2_DMA_CLOCK_FREQ;
0337 pdata->ptpclk_rate = XGBE_V2_PTP_CLOCK_FREQ;
0338
0339
0340 pdata->coherent = 1;
0341 pdata->arcr = XGBE_DMA_PCI_ARCR;
0342 pdata->awcr = XGBE_DMA_PCI_AWCR;
0343 pdata->awarcr = XGBE_DMA_PCI_AWARCR;
0344
0345
0346 pdata->pp0 = XP_IOREAD(pdata, XP_PROP_0);
0347 pdata->pp1 = XP_IOREAD(pdata, XP_PROP_1);
0348 pdata->pp2 = XP_IOREAD(pdata, XP_PROP_2);
0349 pdata->pp3 = XP_IOREAD(pdata, XP_PROP_3);
0350 pdata->pp4 = XP_IOREAD(pdata, XP_PROP_4);
0351 if (netif_msg_probe(pdata)) {
0352 dev_dbg(dev, "port property 0 = %#010x\n", pdata->pp0);
0353 dev_dbg(dev, "port property 1 = %#010x\n", pdata->pp1);
0354 dev_dbg(dev, "port property 2 = %#010x\n", pdata->pp2);
0355 dev_dbg(dev, "port property 3 = %#010x\n", pdata->pp3);
0356 dev_dbg(dev, "port property 4 = %#010x\n", pdata->pp4);
0357 }
0358
0359
0360 pdata->tx_max_channel_count = XP_GET_BITS(pdata->pp1, XP_PROP_1,
0361 MAX_TX_DMA);
0362 pdata->rx_max_channel_count = XP_GET_BITS(pdata->pp1, XP_PROP_1,
0363 MAX_RX_DMA);
0364 pdata->tx_max_q_count = XP_GET_BITS(pdata->pp1, XP_PROP_1,
0365 MAX_TX_QUEUES);
0366 pdata->rx_max_q_count = XP_GET_BITS(pdata->pp1, XP_PROP_1,
0367 MAX_RX_QUEUES);
0368 if (netif_msg_probe(pdata)) {
0369 dev_dbg(dev, "max tx/rx channel count = %u/%u\n",
0370 pdata->tx_max_channel_count,
0371 pdata->rx_max_channel_count);
0372 dev_dbg(dev, "max tx/rx hw queue count = %u/%u\n",
0373 pdata->tx_max_q_count, pdata->rx_max_q_count);
0374 }
0375
0376
0377 xgbe_set_counts(pdata);
0378
0379
0380 pdata->tx_max_fifo_size = XP_GET_BITS(pdata->pp2, XP_PROP_2,
0381 TX_FIFO_SIZE);
0382 pdata->tx_max_fifo_size *= 16384;
0383 pdata->tx_max_fifo_size = min(pdata->tx_max_fifo_size,
0384 pdata->vdata->tx_max_fifo_size);
0385 pdata->rx_max_fifo_size = XP_GET_BITS(pdata->pp2, XP_PROP_2,
0386 RX_FIFO_SIZE);
0387 pdata->rx_max_fifo_size *= 16384;
0388 pdata->rx_max_fifo_size = min(pdata->rx_max_fifo_size,
0389 pdata->vdata->rx_max_fifo_size);
0390 if (netif_msg_probe(pdata))
0391 dev_dbg(dev, "max tx/rx max fifo size = %u/%u\n",
0392 pdata->tx_max_fifo_size, pdata->rx_max_fifo_size);
0393
0394
0395 ret = xgbe_config_irqs(pdata);
0396 if (ret)
0397 goto err_pci_enable;
0398
0399
0400 ret = xgbe_config_netdev(pdata);
0401 if (ret)
0402 goto err_irq_vectors;
0403
0404 netdev_notice(pdata->netdev, "net device enabled\n");
0405
0406 return 0;
0407
0408 err_irq_vectors:
0409 pci_free_irq_vectors(pdata->pcidev);
0410
0411 err_pci_enable:
0412 xgbe_free_pdata(pdata);
0413
0414 err_alloc:
0415 dev_notice(dev, "net device not enabled\n");
0416
0417 return ret;
0418 }
0419
0420 static void xgbe_pci_remove(struct pci_dev *pdev)
0421 {
0422 struct xgbe_prv_data *pdata = pci_get_drvdata(pdev);
0423
0424 xgbe_deconfig_netdev(pdata);
0425
0426 pci_free_irq_vectors(pdata->pcidev);
0427
0428
0429 XP_IOWRITE(pdata, XP_INT_EN, 0x0);
0430
0431 xgbe_free_pdata(pdata);
0432 }
0433
0434 static int __maybe_unused xgbe_pci_suspend(struct device *dev)
0435 {
0436 struct xgbe_prv_data *pdata = dev_get_drvdata(dev);
0437 struct net_device *netdev = pdata->netdev;
0438 int ret = 0;
0439
0440 if (netif_running(netdev))
0441 ret = xgbe_powerdown(netdev, XGMAC_DRIVER_CONTEXT);
0442
0443 pdata->lpm_ctrl = XMDIO_READ(pdata, MDIO_MMD_PCS, MDIO_CTRL1);
0444 pdata->lpm_ctrl |= MDIO_CTRL1_LPOWER;
0445 XMDIO_WRITE(pdata, MDIO_MMD_PCS, MDIO_CTRL1, pdata->lpm_ctrl);
0446
0447 return ret;
0448 }
0449
0450 static int __maybe_unused xgbe_pci_resume(struct device *dev)
0451 {
0452 struct xgbe_prv_data *pdata = dev_get_drvdata(dev);
0453 struct net_device *netdev = pdata->netdev;
0454 int ret = 0;
0455
0456 XP_IOWRITE(pdata, XP_INT_EN, 0x1fffff);
0457
0458 pdata->lpm_ctrl &= ~MDIO_CTRL1_LPOWER;
0459 XMDIO_WRITE(pdata, MDIO_MMD_PCS, MDIO_CTRL1, pdata->lpm_ctrl);
0460
0461 if (netif_running(netdev)) {
0462 ret = xgbe_powerup(netdev, XGMAC_DRIVER_CONTEXT);
0463
0464
0465
0466
0467 schedule_work(&pdata->restart_work);
0468 }
0469
0470 return ret;
0471 }
0472
0473 static struct xgbe_version_data xgbe_v2a = {
0474 .init_function_ptrs_phy_impl = xgbe_init_function_ptrs_phy_v2,
0475 .xpcs_access = XGBE_XPCS_ACCESS_V2,
0476 .mmc_64bit = 1,
0477 .tx_max_fifo_size = 229376,
0478 .rx_max_fifo_size = 229376,
0479 .tx_tstamp_workaround = 1,
0480 .ecc_support = 1,
0481 .i2c_support = 1,
0482 .irq_reissue_support = 1,
0483 .tx_desc_prefetch = 5,
0484 .rx_desc_prefetch = 5,
0485 .an_cdr_workaround = 1,
0486 };
0487
0488 static struct xgbe_version_data xgbe_v2b = {
0489 .init_function_ptrs_phy_impl = xgbe_init_function_ptrs_phy_v2,
0490 .xpcs_access = XGBE_XPCS_ACCESS_V2,
0491 .mmc_64bit = 1,
0492 .tx_max_fifo_size = 65536,
0493 .rx_max_fifo_size = 65536,
0494 .tx_tstamp_workaround = 1,
0495 .ecc_support = 1,
0496 .i2c_support = 1,
0497 .irq_reissue_support = 1,
0498 .tx_desc_prefetch = 5,
0499 .rx_desc_prefetch = 5,
0500 .an_cdr_workaround = 1,
0501 };
0502
0503 static const struct pci_device_id xgbe_pci_table[] = {
0504 { PCI_VDEVICE(AMD, 0x1458),
0505 .driver_data = (kernel_ulong_t)&xgbe_v2a },
0506 { PCI_VDEVICE(AMD, 0x1459),
0507 .driver_data = (kernel_ulong_t)&xgbe_v2b },
0508
0509 { 0, }
0510 };
0511 MODULE_DEVICE_TABLE(pci, xgbe_pci_table);
0512
0513 static SIMPLE_DEV_PM_OPS(xgbe_pci_pm_ops, xgbe_pci_suspend, xgbe_pci_resume);
0514
0515 static struct pci_driver xgbe_driver = {
0516 .name = XGBE_DRV_NAME,
0517 .id_table = xgbe_pci_table,
0518 .probe = xgbe_pci_probe,
0519 .remove = xgbe_pci_remove,
0520 .driver = {
0521 .pm = &xgbe_pci_pm_ops,
0522 }
0523 };
0524
0525 int xgbe_pci_init(void)
0526 {
0527 return pci_register_driver(&xgbe_driver);
0528 }
0529
0530 void xgbe_pci_exit(void)
0531 {
0532 pci_unregister_driver(&xgbe_driver);
0533 }