Skip to content

Commit 8a769c6

Browse files
committed
Merge branch 'stmmac-intel-Fixes-and-cleanups-after-dwmac-intel-split'
Andy Shevchenko says: ==================== stmmac: intel: Fixes and cleanups after dwmac-intel split Seems the split of dwmac-intel didn't go well and on top of that new functionality in the driver has not been properly tested. Patch 1 fixes a nasty kernel crash due to missed error handling. Patches 2 and 3 fix the incorrect split (clock and PCI bar handling). Patch 4 converts driver to use new PCI IRQ allocation API. The rest is a set of clean ups that may have been done in the initial submission. Series has been tested on couple of Elkhart Lake platforms with different behaviour of ethernet hardware. Changelog v3: - added the cover letter (David) - appended separate fix as a first patch - marked patches 2 and 3 with Fixes tag ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents fe4f961 + 29e0c2f commit 8a769c6

File tree

4 files changed

+68
-105
lines changed

4 files changed

+68
-105
lines changed

drivers/net/ethernet/stmicro/stmmac/Makefile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,6 @@ obj-$(CONFIG_DWMAC_GENERIC) += dwmac-generic.o
3030
stmmac-platform-objs:= stmmac_platform.o
3131
dwmac-altr-socfpga-objs := altr_tse_pcs.o dwmac-socfpga.o
3232

33-
obj-$(CONFIG_DWMAC_INTEL) += dwmac-intel.o
34-
obj-$(CONFIG_STMMAC_PCI) += stmmac-pci.o
33+
obj-$(CONFIG_STMMAC_PCI) += stmmac-pci.o
34+
obj-$(CONFIG_DWMAC_INTEL) += dwmac-intel.o
3535
stmmac-pci-objs:= stmmac_pci.o

drivers/net/ethernet/stmicro/stmmac/dwmac-intel.c

Lines changed: 63 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -83,13 +83,9 @@ static int intel_serdes_powerup(struct net_device *ndev, void *priv_data)
8383
serdes_phy_addr = intel_priv->mdio_adhoc_addr;
8484

8585
/* assert clk_req */
86-
data = mdiobus_read(priv->mii, serdes_phy_addr,
87-
SERDES_GCR0);
88-
86+
data = mdiobus_read(priv->mii, serdes_phy_addr, SERDES_GCR0);
8987
data |= SERDES_PLL_CLK;
90-
91-
mdiobus_write(priv->mii, serdes_phy_addr,
92-
SERDES_GCR0, data);
88+
mdiobus_write(priv->mii, serdes_phy_addr, SERDES_GCR0, data);
9389

9490
/* check for clk_ack assertion */
9591
data = serdes_status_poll(priv, serdes_phy_addr,
@@ -103,13 +99,9 @@ static int intel_serdes_powerup(struct net_device *ndev, void *priv_data)
10399
}
104100

105101
/* assert lane reset */
106-
data = mdiobus_read(priv->mii, serdes_phy_addr,
107-
SERDES_GCR0);
108-
102+
data = mdiobus_read(priv->mii, serdes_phy_addr, SERDES_GCR0);
109103
data |= SERDES_RST;
110-
111-
mdiobus_write(priv->mii, serdes_phy_addr,
112-
SERDES_GCR0, data);
104+
mdiobus_write(priv->mii, serdes_phy_addr, SERDES_GCR0, data);
113105

114106
/* check for assert lane reset reflection */
115107
data = serdes_status_poll(priv, serdes_phy_addr,
@@ -123,14 +115,12 @@ static int intel_serdes_powerup(struct net_device *ndev, void *priv_data)
123115
}
124116

125117
/* move power state to P0 */
126-
data = mdiobus_read(priv->mii, serdes_phy_addr,
127-
SERDES_GCR0);
118+
data = mdiobus_read(priv->mii, serdes_phy_addr, SERDES_GCR0);
128119

129120
data &= ~SERDES_PWR_ST_MASK;
130121
data |= SERDES_PWR_ST_P0 << SERDES_PWR_ST_SHIFT;
131122

132-
mdiobus_write(priv->mii, serdes_phy_addr,
133-
SERDES_GCR0, data);
123+
mdiobus_write(priv->mii, serdes_phy_addr, SERDES_GCR0, data);
134124

135125
/* Check for P0 state */
136126
data = serdes_status_poll(priv, serdes_phy_addr,
@@ -159,14 +149,12 @@ static void intel_serdes_powerdown(struct net_device *ndev, void *intel_data)
159149
serdes_phy_addr = intel_priv->mdio_adhoc_addr;
160150

161151
/* move power state to P3 */
162-
data = mdiobus_read(priv->mii, serdes_phy_addr,
163-
SERDES_GCR0);
152+
data = mdiobus_read(priv->mii, serdes_phy_addr, SERDES_GCR0);
164153

165154
data &= ~SERDES_PWR_ST_MASK;
166155
data |= SERDES_PWR_ST_P3 << SERDES_PWR_ST_SHIFT;
167156

168-
mdiobus_write(priv->mii, serdes_phy_addr,
169-
SERDES_GCR0, data);
157+
mdiobus_write(priv->mii, serdes_phy_addr, SERDES_GCR0, data);
170158

171159
/* Check for P3 state */
172160
data = serdes_status_poll(priv, serdes_phy_addr,
@@ -180,13 +168,9 @@ static void intel_serdes_powerdown(struct net_device *ndev, void *intel_data)
180168
}
181169

182170
/* de-assert clk_req */
183-
data = mdiobus_read(priv->mii, serdes_phy_addr,
184-
SERDES_GCR0);
185-
171+
data = mdiobus_read(priv->mii, serdes_phy_addr, SERDES_GCR0);
186172
data &= ~SERDES_PLL_CLK;
187-
188-
mdiobus_write(priv->mii, serdes_phy_addr,
189-
SERDES_GCR0, data);
173+
mdiobus_write(priv->mii, serdes_phy_addr, SERDES_GCR0, data);
190174

191175
/* check for clk_ack de-assert */
192176
data = serdes_status_poll(priv, serdes_phy_addr,
@@ -200,13 +184,9 @@ static void intel_serdes_powerdown(struct net_device *ndev, void *intel_data)
200184
}
201185

202186
/* de-assert lane reset */
203-
data = mdiobus_read(priv->mii, serdes_phy_addr,
204-
SERDES_GCR0);
205-
187+
data = mdiobus_read(priv->mii, serdes_phy_addr, SERDES_GCR0);
206188
data &= ~SERDES_RST;
207-
208-
mdiobus_write(priv->mii, serdes_phy_addr,
209-
SERDES_GCR0, data);
189+
mdiobus_write(priv->mii, serdes_phy_addr, SERDES_GCR0, data);
210190

211191
/* check for de-assert lane reset reflection */
212192
data = serdes_status_poll(priv, serdes_phy_addr,
@@ -252,6 +232,7 @@ static void common_default_data(struct plat_stmmacenet_data *plat)
252232
static int intel_mgbe_common_data(struct pci_dev *pdev,
253233
struct plat_stmmacenet_data *plat)
254234
{
235+
int ret;
255236
int i;
256237

257238
plat->clk_csr = 5;
@@ -324,7 +305,12 @@ static int intel_mgbe_common_data(struct pci_dev *pdev,
324305
dev_warn(&pdev->dev, "Fail to register stmmac-clk\n");
325306
plat->stmmac_clk = NULL;
326307
}
327-
clk_prepare_enable(plat->stmmac_clk);
308+
309+
ret = clk_prepare_enable(plat->stmmac_clk);
310+
if (ret) {
311+
clk_unregister_fixed_rate(plat->stmmac_clk);
312+
return ret;
313+
}
328314

329315
/* Set default value for multicast hash bins */
330316
plat->multicast_filter_bins = HASH_TABLE_SIZE;
@@ -341,16 +327,11 @@ static int intel_mgbe_common_data(struct pci_dev *pdev,
341327
static int ehl_common_data(struct pci_dev *pdev,
342328
struct plat_stmmacenet_data *plat)
343329
{
344-
int ret;
345-
346330
plat->rx_queues_to_use = 8;
347331
plat->tx_queues_to_use = 8;
348332
plat->clk_ptp_rate = 200000000;
349-
ret = intel_mgbe_common_data(pdev, plat);
350-
if (ret)
351-
return ret;
352333

353-
return 0;
334+
return intel_mgbe_common_data(pdev, plat);
354335
}
355336

356337
static int ehl_sgmii_data(struct pci_dev *pdev,
@@ -366,7 +347,7 @@ static int ehl_sgmii_data(struct pci_dev *pdev,
366347
return ehl_common_data(pdev, plat);
367348
}
368349

369-
static struct stmmac_pci_info ehl_sgmii1g_pci_info = {
350+
static struct stmmac_pci_info ehl_sgmii1g_info = {
370351
.setup = ehl_sgmii_data,
371352
};
372353

@@ -380,7 +361,7 @@ static int ehl_rgmii_data(struct pci_dev *pdev,
380361
return ehl_common_data(pdev, plat);
381362
}
382363

383-
static struct stmmac_pci_info ehl_rgmii1g_pci_info = {
364+
static struct stmmac_pci_info ehl_rgmii1g_info = {
384365
.setup = ehl_rgmii_data,
385366
};
386367

@@ -399,7 +380,7 @@ static int ehl_pse0_rgmii1g_data(struct pci_dev *pdev,
399380
return ehl_pse0_common_data(pdev, plat);
400381
}
401382

402-
static struct stmmac_pci_info ehl_pse0_rgmii1g_pci_info = {
383+
static struct stmmac_pci_info ehl_pse0_rgmii1g_info = {
403384
.setup = ehl_pse0_rgmii1g_data,
404385
};
405386

@@ -412,7 +393,7 @@ static int ehl_pse0_sgmii1g_data(struct pci_dev *pdev,
412393
return ehl_pse0_common_data(pdev, plat);
413394
}
414395

415-
static struct stmmac_pci_info ehl_pse0_sgmii1g_pci_info = {
396+
static struct stmmac_pci_info ehl_pse0_sgmii1g_info = {
416397
.setup = ehl_pse0_sgmii1g_data,
417398
};
418399

@@ -431,7 +412,7 @@ static int ehl_pse1_rgmii1g_data(struct pci_dev *pdev,
431412
return ehl_pse1_common_data(pdev, plat);
432413
}
433414

434-
static struct stmmac_pci_info ehl_pse1_rgmii1g_pci_info = {
415+
static struct stmmac_pci_info ehl_pse1_rgmii1g_info = {
435416
.setup = ehl_pse1_rgmii1g_data,
436417
};
437418

@@ -444,23 +425,18 @@ static int ehl_pse1_sgmii1g_data(struct pci_dev *pdev,
444425
return ehl_pse1_common_data(pdev, plat);
445426
}
446427

447-
static struct stmmac_pci_info ehl_pse1_sgmii1g_pci_info = {
428+
static struct stmmac_pci_info ehl_pse1_sgmii1g_info = {
448429
.setup = ehl_pse1_sgmii1g_data,
449430
};
450431

451432
static int tgl_common_data(struct pci_dev *pdev,
452433
struct plat_stmmacenet_data *plat)
453434
{
454-
int ret;
455-
456435
plat->rx_queues_to_use = 6;
457436
plat->tx_queues_to_use = 4;
458437
plat->clk_ptp_rate = 200000000;
459-
ret = intel_mgbe_common_data(pdev, plat);
460-
if (ret)
461-
return ret;
462438

463-
return 0;
439+
return intel_mgbe_common_data(pdev, plat);
464440
}
465441

466442
static int tgl_sgmii_data(struct pci_dev *pdev,
@@ -474,7 +450,7 @@ static int tgl_sgmii_data(struct pci_dev *pdev,
474450
return tgl_common_data(pdev, plat);
475451
}
476452

477-
static struct stmmac_pci_info tgl_sgmii1g_pci_info = {
453+
static struct stmmac_pci_info tgl_sgmii1g_info = {
478454
.setup = tgl_sgmii_data,
479455
};
480456

@@ -577,7 +553,7 @@ static int quark_default_data(struct pci_dev *pdev,
577553
return 0;
578554
}
579555

580-
static const struct stmmac_pci_info quark_pci_info = {
556+
static const struct stmmac_pci_info quark_info = {
581557
.setup = quark_default_data,
582558
};
583559

@@ -600,11 +576,9 @@ static int intel_eth_pci_probe(struct pci_dev *pdev,
600576
struct intel_priv_data *intel_priv;
601577
struct plat_stmmacenet_data *plat;
602578
struct stmmac_resources res;
603-
int i;
604579
int ret;
605580

606-
intel_priv = devm_kzalloc(&pdev->dev, sizeof(*intel_priv),
607-
GFP_KERNEL);
581+
intel_priv = devm_kzalloc(&pdev->dev, sizeof(*intel_priv), GFP_KERNEL);
608582
if (!intel_priv)
609583
return -ENOMEM;
610584

@@ -631,15 +605,9 @@ static int intel_eth_pci_probe(struct pci_dev *pdev,
631605
return ret;
632606
}
633607

634-
/* Get the base address of device */
635-
for (i = 0; i < PCI_STD_NUM_BARS; i++) {
636-
if (pci_resource_len(pdev, i) == 0)
637-
continue;
638-
ret = pcim_iomap_regions(pdev, BIT(i), pci_name(pdev));
639-
if (ret)
640-
return ret;
641-
break;
642-
}
608+
ret = pcim_iomap_regions(pdev, BIT(0), pci_name(pdev));
609+
if (ret)
610+
return ret;
643611

644612
pci_set_master(pdev);
645613

@@ -650,14 +618,23 @@ static int intel_eth_pci_probe(struct pci_dev *pdev,
650618
if (ret)
651619
return ret;
652620

653-
pci_enable_msi(pdev);
621+
ret = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_ALL_TYPES);
622+
if (ret < 0)
623+
return ret;
654624

655625
memset(&res, 0, sizeof(res));
656-
res.addr = pcim_iomap_table(pdev)[i];
657-
res.wol_irq = pdev->irq;
658-
res.irq = pdev->irq;
626+
res.addr = pcim_iomap_table(pdev)[0];
627+
res.wol_irq = pci_irq_vector(pdev, 0);
628+
res.irq = pci_irq_vector(pdev, 0);
629+
630+
ret = stmmac_dvr_probe(&pdev->dev, plat, &res);
631+
if (ret) {
632+
pci_free_irq_vectors(pdev);
633+
clk_disable_unprepare(plat->stmmac_clk);
634+
clk_unregister_fixed_rate(plat->stmmac_clk);
635+
}
659636

660-
return stmmac_dvr_probe(&pdev->dev, plat, &res);
637+
return ret;
661638
}
662639

663640
/**
@@ -671,19 +648,15 @@ static void intel_eth_pci_remove(struct pci_dev *pdev)
671648
{
672649
struct net_device *ndev = dev_get_drvdata(&pdev->dev);
673650
struct stmmac_priv *priv = netdev_priv(ndev);
674-
int i;
675651

676652
stmmac_dvr_remove(&pdev->dev);
677653

678-
if (priv->plat->stmmac_clk)
679-
clk_unregister_fixed_rate(priv->plat->stmmac_clk);
654+
pci_free_irq_vectors(pdev);
680655

681-
for (i = 0; i < PCI_STD_NUM_BARS; i++) {
682-
if (pci_resource_len(pdev, i) == 0)
683-
continue;
684-
pcim_iounmap_regions(pdev, BIT(i));
685-
break;
686-
}
656+
clk_disable_unprepare(priv->plat->stmmac_clk);
657+
clk_unregister_fixed_rate(priv->plat->stmmac_clk);
658+
659+
pcim_iounmap_regions(pdev, BIT(0));
687660

688661
pci_disable_device(pdev);
689662
}
@@ -742,26 +715,19 @@ static SIMPLE_DEV_PM_OPS(intel_eth_pm_ops, intel_eth_pci_suspend,
742715
#define PCI_DEVICE_ID_INTEL_TGL_SGMII1G_ID 0xa0ac
743716

744717
static const struct pci_device_id intel_eth_pci_id_table[] = {
745-
{ PCI_DEVICE_DATA(INTEL, QUARK_ID, &quark_pci_info) },
746-
{ PCI_DEVICE_DATA(INTEL, EHL_RGMII1G_ID, &ehl_rgmii1g_pci_info) },
747-
{ PCI_DEVICE_DATA(INTEL, EHL_SGMII1G_ID, &ehl_sgmii1g_pci_info) },
748-
{ PCI_DEVICE_DATA(INTEL, EHL_SGMII2G5_ID, &ehl_sgmii1g_pci_info) },
749-
{ PCI_DEVICE_DATA(INTEL, EHL_PSE0_RGMII1G_ID,
750-
&ehl_pse0_rgmii1g_pci_info) },
751-
{ PCI_DEVICE_DATA(INTEL, EHL_PSE0_SGMII1G_ID,
752-
&ehl_pse0_sgmii1g_pci_info) },
753-
{ PCI_DEVICE_DATA(INTEL, EHL_PSE0_SGMII2G5_ID,
754-
&ehl_pse0_sgmii1g_pci_info) },
755-
{ PCI_DEVICE_DATA(INTEL, EHL_PSE1_RGMII1G_ID,
756-
&ehl_pse1_rgmii1g_pci_info) },
757-
{ PCI_DEVICE_DATA(INTEL, EHL_PSE1_SGMII1G_ID,
758-
&ehl_pse1_sgmii1g_pci_info) },
759-
{ PCI_DEVICE_DATA(INTEL, EHL_PSE1_SGMII2G5_ID,
760-
&ehl_pse1_sgmii1g_pci_info) },
761-
{ PCI_DEVICE_DATA(INTEL, TGL_SGMII1G_ID, &tgl_sgmii1g_pci_info) },
718+
{ PCI_DEVICE_DATA(INTEL, QUARK_ID, &quark_info) },
719+
{ PCI_DEVICE_DATA(INTEL, EHL_RGMII1G_ID, &ehl_rgmii1g_info) },
720+
{ PCI_DEVICE_DATA(INTEL, EHL_SGMII1G_ID, &ehl_sgmii1g_info) },
721+
{ PCI_DEVICE_DATA(INTEL, EHL_SGMII2G5_ID, &ehl_sgmii1g_info) },
722+
{ PCI_DEVICE_DATA(INTEL, EHL_PSE0_RGMII1G_ID, &ehl_pse0_rgmii1g_info) },
723+
{ PCI_DEVICE_DATA(INTEL, EHL_PSE0_SGMII1G_ID, &ehl_pse0_sgmii1g_info) },
724+
{ PCI_DEVICE_DATA(INTEL, EHL_PSE0_SGMII2G5_ID, &ehl_pse0_sgmii1g_info) },
725+
{ PCI_DEVICE_DATA(INTEL, EHL_PSE1_RGMII1G_ID, &ehl_pse1_rgmii1g_info) },
726+
{ PCI_DEVICE_DATA(INTEL, EHL_PSE1_SGMII1G_ID, &ehl_pse1_sgmii1g_info) },
727+
{ PCI_DEVICE_DATA(INTEL, EHL_PSE1_SGMII2G5_ID, &ehl_pse1_sgmii1g_info) },
728+
{ PCI_DEVICE_DATA(INTEL, TGL_SGMII1G_ID, &tgl_sgmii1g_info) },
762729
{}
763730
};
764-
765731
MODULE_DEVICE_TABLE(pci, intel_eth_pci_id_table);
766732

767733
static struct pci_driver intel_eth_pci_driver = {

drivers/net/ethernet/stmicro/stmmac/stmmac_main.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4991,7 +4991,7 @@ int stmmac_dvr_probe(struct device *device,
49914991
priv->plat->bsp_priv);
49924992

49934993
if (ret < 0)
4994-
return ret;
4994+
goto error_serdes_powerup;
49954995
}
49964996

49974997
#ifdef CONFIG_DEBUG_FS
@@ -5000,6 +5000,8 @@ int stmmac_dvr_probe(struct device *device,
50005000

50015001
return ret;
50025002

5003+
error_serdes_powerup:
5004+
unregister_netdev(ndev);
50035005
error_netdev_register:
50045006
phylink_destroy(priv->phylink);
50055007
error_phy_setup:

drivers/net/ethernet/stmicro/stmmac/stmmac_pci.c

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -217,15 +217,10 @@ static int stmmac_pci_probe(struct pci_dev *pdev,
217217
*/
218218
static void stmmac_pci_remove(struct pci_dev *pdev)
219219
{
220-
struct net_device *ndev = dev_get_drvdata(&pdev->dev);
221-
struct stmmac_priv *priv = netdev_priv(ndev);
222220
int i;
223221

224222
stmmac_dvr_remove(&pdev->dev);
225223

226-
if (priv->plat->stmmac_clk)
227-
clk_unregister_fixed_rate(priv->plat->stmmac_clk);
228-
229224
for (i = 0; i < PCI_STD_NUM_BARS; i++) {
230225
if (pci_resource_len(pdev, i) == 0)
231226
continue;

0 commit comments

Comments
 (0)