* [PATCH 0/3] r8169: extend PCI core and switch to device-managed functions in probe
@ 2017-12-09 23:30 Heiner Kallweit
2017-12-09 23:43 ` [PATCH 1/3] PCI: introduce a device-managed version of pci_set_mwi Heiner Kallweit
` (2 more replies)
0 siblings, 3 replies; 6+ messages in thread
From: Heiner Kallweit @ 2017-12-09 23:30 UTC (permalink / raw)
To: Realtek linux nic maintainers, Bjorn Helgaas
Cc: netdev@vger.kernel.org, linux-pci@vger.kernel.org
Probe error path and remove callback can be significantly simplified
by using device-managed functions. To be able to do this in the r8169
driver we need a device-managed version of pci_set_mwi first.
Heiner Kallweit (3):
PCI: introduce device-managed version of pci_set_mwi
r8169: switch to device-managed functions in probe
r8169: remove netif_napi_del in probe error path
drivers/net/ethernet/realtek/r8169.c | 87 +++++++++---------------------------
drivers/pci/pci.c | 29 ++++++++++++
include/linux/pci.h | 1 +
3 files changed, 50 insertions(+), 67 deletions(-)
--
2.15.1
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH 1/3] PCI: introduce a device-managed version of pci_set_mwi
2017-12-09 23:30 [PATCH 0/3] r8169: extend PCI core and switch to device-managed functions in probe Heiner Kallweit
@ 2017-12-09 23:43 ` Heiner Kallweit
2017-12-11 18:49 ` David Miller
2017-12-11 23:00 ` Bjorn Helgaas
2017-12-09 23:43 ` [PATCH 2/3] r8169: switch to device-managed functions in probe Heiner Kallweit
2017-12-09 23:43 ` [PATCH 3/3] r8169: remove netif_napi_del in probe error path Heiner Kallweit
2 siblings, 2 replies; 6+ messages in thread
From: Heiner Kallweit @ 2017-12-09 23:43 UTC (permalink / raw)
To: Realtek linux nic maintainers, Bjorn Helgaas
Cc: netdev@vger.kernel.org, linux-pci@vger.kernel.org
Introduce a device-managed version of pci_set_mwi. First user is the
Realtek r8169 driver.
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
---
drivers/pci/pci.c | 29 +++++++++++++++++++++++++++++
include/linux/pci.h | 1 +
2 files changed, 30 insertions(+)
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index 4a7c6864f..fc57c378d 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -1458,6 +1458,7 @@ struct pci_devres {
unsigned int pinned:1;
unsigned int orig_intx:1;
unsigned int restore_intx:1;
+ unsigned int mwi:1;
u32 region_mask;
};
@@ -1476,6 +1477,9 @@ static void pcim_release(struct device *gendev, void *res)
if (this->region_mask & (1 << i))
pci_release_region(dev, i);
+ if (this->mwi)
+ pci_clear_mwi(dev);
+
if (this->restore_intx)
pci_intx(dev, this->orig_intx);
@@ -3760,6 +3764,31 @@ int pci_set_mwi(struct pci_dev *dev)
}
EXPORT_SYMBOL(pci_set_mwi);
+/**
+ * pcim_set_mwi - Managed pci_set_mwi()
+ * @dev: the PCI device for which MWI is enabled
+ *
+ * Managed pci_set_mwi().
+ *
+ * RETURNS: An appropriate -ERRNO error value on error, or zero for success.
+ */
+int pcim_set_mwi(struct pci_dev *dev)
+{
+ struct pci_devres *dr;
+ int ret;
+
+ ret = pci_set_mwi(dev);
+ if (ret)
+ return ret;
+
+ dr = find_pci_dr(dev);
+ if (dr)
+ dr->mwi = 1;
+
+ return 0;
+}
+EXPORT_SYMBOL(pcim_set_mwi);
+
/**
* pci_try_set_mwi - enables memory-write-invalidate PCI transaction
* @dev: the PCI device for which MWI is enabled
diff --git a/include/linux/pci.h b/include/linux/pci.h
index 978aad784..0a7ac863a 100644
--- a/include/linux/pci.h
+++ b/include/linux/pci.h
@@ -1064,6 +1064,7 @@ int pci_set_pcie_reset_state(struct pci_dev *dev, enum pcie_reset_state state);
int pci_set_cacheline_size(struct pci_dev *dev);
#define HAVE_PCI_SET_MWI
int __must_check pci_set_mwi(struct pci_dev *dev);
+int __must_check pcim_set_mwi(struct pci_dev *dev);
int pci_try_set_mwi(struct pci_dev *dev);
void pci_clear_mwi(struct pci_dev *dev);
void pci_intx(struct pci_dev *dev, int enable);
--
2.15.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 2/3] r8169: switch to device-managed functions in probe
2017-12-09 23:30 [PATCH 0/3] r8169: extend PCI core and switch to device-managed functions in probe Heiner Kallweit
2017-12-09 23:43 ` [PATCH 1/3] PCI: introduce a device-managed version of pci_set_mwi Heiner Kallweit
@ 2017-12-09 23:43 ` Heiner Kallweit
2017-12-09 23:43 ` [PATCH 3/3] r8169: remove netif_napi_del in probe error path Heiner Kallweit
2 siblings, 0 replies; 6+ messages in thread
From: Heiner Kallweit @ 2017-12-09 23:43 UTC (permalink / raw)
To: Realtek linux nic maintainers, Bjorn Helgaas
Cc: netdev@vger.kernel.org, linux-pci@vger.kernel.org
Simplify probe error path and remove callback by using device-managed
functions.
rtl_disable_msi isn't needed any longer because the release callback
of pcim_enable_device does this implicitely.
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
---
drivers/net/ethernet/realtek/r8169.c | 80 +++++++++---------------------------
1 file changed, 20 insertions(+), 60 deletions(-)
diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c
index fc0d5fa65..3c7d90d3a 100644
--- a/drivers/net/ethernet/realtek/r8169.c
+++ b/drivers/net/ethernet/realtek/r8169.c
@@ -4643,16 +4643,6 @@ static void rtl8169_phy_timer(struct timer_list *t)
rtl_schedule_task(tp, RTL_FLAG_TASK_PHY_PENDING);
}
-static void rtl8169_release_board(struct pci_dev *pdev, struct net_device *dev,
- void __iomem *ioaddr)
-{
- iounmap(ioaddr);
- pci_release_regions(pdev);
- pci_clear_mwi(pdev);
- pci_disable_device(pdev);
- free_netdev(dev);
-}
-
DECLARE_RTL_COND(rtl_phy_reset_cond)
{
return tp->phy_reset_pending(tp);
@@ -4784,14 +4774,6 @@ static int rtl_tbi_ioctl(struct rtl8169_private *tp, struct mii_ioctl_data *data
return -EOPNOTSUPP;
}
-static void rtl_disable_msi(struct pci_dev *pdev, struct rtl8169_private *tp)
-{
- if (tp->features & RTL_FEATURE_MSI) {
- pci_disable_msi(pdev);
- tp->features &= ~RTL_FEATURE_MSI;
- }
-}
-
static void rtl_init_mdio_ops(struct rtl8169_private *tp)
{
struct mdio_ops *ops = &tp->mdio_ops;
@@ -8256,9 +8238,6 @@ static void rtl_remove_one(struct pci_dev *pdev)
unregister_netdev(dev);
- dma_free_coherent(&tp->pci_dev->dev, sizeof(*tp->counters),
- tp->counters, tp->counters_phys_addr);
-
rtl_release_firmware(tp);
if (pci_dev_run_wake(pdev))
@@ -8266,9 +8245,6 @@ static void rtl_remove_one(struct pci_dev *pdev)
/* restore original MAC address */
rtl_rar_set(tp, dev->perm_addr);
-
- rtl_disable_msi(pdev, tp);
- rtl8169_release_board(pdev, dev, tp->mmio_addr);
}
static const struct net_device_ops rtl_netdev_ops = {
@@ -8445,11 +8421,9 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
MODULENAME, RTL8169_VERSION);
}
- dev = alloc_etherdev(sizeof (*tp));
- if (!dev) {
- rc = -ENOMEM;
- goto out;
- }
+ dev = devm_alloc_etherdev(&pdev->dev, sizeof (*tp));
+ if (!dev)
+ return -ENOMEM;
SET_NETDEV_DEV(dev, &pdev->dev);
dev->netdev_ops = &rtl_netdev_ops;
@@ -8472,13 +8446,13 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
PCIE_LINK_STATE_CLKPM);
/* enable device (incl. PCI PM wakeup and hotplug setup) */
- rc = pci_enable_device(pdev);
+ rc = pcim_enable_device(pdev);
if (rc < 0) {
netif_err(tp, probe, dev, "enable failure\n");
- goto err_out_free_dev_1;
+ return rc;
}
- if (pci_set_mwi(pdev) < 0)
+ if (pcim_set_mwi(pdev) < 0)
netif_info(tp, probe, dev, "Mem-Wr-Inval unavailable\n");
/* make sure PCI base addr 1 is MMIO */
@@ -8486,30 +8460,28 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
netif_err(tp, probe, dev,
"region #%d not an MMIO resource, aborting\n",
region);
- rc = -ENODEV;
- goto err_out_mwi_2;
+ return -ENODEV;
}
/* check for weird/broken PCI region reporting */
if (pci_resource_len(pdev, region) < R8169_REGS_SIZE) {
netif_err(tp, probe, dev,
"Invalid PCI region size(s), aborting\n");
- rc = -ENODEV;
- goto err_out_mwi_2;
+ return -ENODEV;
}
rc = pci_request_regions(pdev, MODULENAME);
if (rc < 0) {
netif_err(tp, probe, dev, "could not request regions\n");
- goto err_out_mwi_2;
+ return rc;
}
/* ioremap MMIO region */
- ioaddr = ioremap(pci_resource_start(pdev, region), R8169_REGS_SIZE);
+ ioaddr = devm_ioremap(&pdev->dev, pci_resource_start(pdev, region),
+ R8169_REGS_SIZE);
if (!ioaddr) {
netif_err(tp, probe, dev, "cannot remap MMIO, aborting\n");
- rc = -EIO;
- goto err_out_free_res_3;
+ return -EIO;
}
tp->mmio_addr = ioaddr;
@@ -8535,7 +8507,7 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
rc = pci_set_dma_mask(pdev, DMA_BIT_MASK(32));
if (rc < 0) {
netif_err(tp, probe, dev, "DMA configuration failed\n");
- goto err_out_unmap_4;
+ return rc;
}
}
@@ -8697,8 +8669,9 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
tp->rtl_fw = RTL_FIRMWARE_UNKNOWN;
- tp->counters = dma_alloc_coherent (&pdev->dev, sizeof(*tp->counters),
- &tp->counters_phys_addr, GFP_KERNEL);
+ tp->counters = dmam_alloc_coherent (&pdev->dev, sizeof(*tp->counters),
+ &tp->counters_phys_addr,
+ GFP_KERNEL);
if (!tp->counters) {
rc = -ENOMEM;
goto err_out_msi_5;
@@ -8706,7 +8679,7 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
rc = register_netdev(dev);
if (rc < 0)
- goto err_out_cnt_6;
+ goto err_out_msi_5;
pci_set_drvdata(pdev, dev);
@@ -8735,25 +8708,12 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
netif_carrier_off(dev);
-out:
- return rc;
+ return 0;
-err_out_cnt_6:
- dma_free_coherent(&pdev->dev, sizeof(*tp->counters), tp->counters,
- tp->counters_phys_addr);
err_out_msi_5:
netif_napi_del(&tp->napi);
- rtl_disable_msi(pdev, tp);
-err_out_unmap_4:
- iounmap(ioaddr);
-err_out_free_res_3:
- pci_release_regions(pdev);
-err_out_mwi_2:
- pci_clear_mwi(pdev);
- pci_disable_device(pdev);
-err_out_free_dev_1:
- free_netdev(dev);
- goto out;
+
+ return rc;
}
static struct pci_driver rtl8169_pci_driver = {
--
2.15.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH 3/3] r8169: remove netif_napi_del in probe error path
2017-12-09 23:30 [PATCH 0/3] r8169: extend PCI core and switch to device-managed functions in probe Heiner Kallweit
2017-12-09 23:43 ` [PATCH 1/3] PCI: introduce a device-managed version of pci_set_mwi Heiner Kallweit
2017-12-09 23:43 ` [PATCH 2/3] r8169: switch to device-managed functions in probe Heiner Kallweit
@ 2017-12-09 23:43 ` Heiner Kallweit
2 siblings, 0 replies; 6+ messages in thread
From: Heiner Kallweit @ 2017-12-09 23:43 UTC (permalink / raw)
To: Realtek linux nic maintainers, Bjorn Helgaas
Cc: netdev@vger.kernel.org, linux-pci@vger.kernel.org
netif_napi_del is called implicitely by free_netdev, therefore we
don't have to do it explicitely.
When the probe error path is reached, the net_device isn't
registered yet. Therefore reordering the call to netif_napi_del
shouldn't cause any issues.
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
---
drivers/net/ethernet/realtek/r8169.c | 13 +++----------
1 file changed, 3 insertions(+), 10 deletions(-)
diff --git a/drivers/net/ethernet/realtek/r8169.c b/drivers/net/ethernet/realtek/r8169.c
index 3c7d90d3a..857f67beb 100644
--- a/drivers/net/ethernet/realtek/r8169.c
+++ b/drivers/net/ethernet/realtek/r8169.c
@@ -8672,14 +8672,12 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
tp->counters = dmam_alloc_coherent (&pdev->dev, sizeof(*tp->counters),
&tp->counters_phys_addr,
GFP_KERNEL);
- if (!tp->counters) {
- rc = -ENOMEM;
- goto err_out_msi_5;
- }
+ if (!tp->counters)
+ return -ENOMEM;
rc = register_netdev(dev);
if (rc < 0)
- goto err_out_msi_5;
+ return rc;
pci_set_drvdata(pdev, dev);
@@ -8709,11 +8707,6 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
netif_carrier_off(dev);
return 0;
-
-err_out_msi_5:
- netif_napi_del(&tp->napi);
-
- return rc;
}
static struct pci_driver rtl8169_pci_driver = {
--
2.15.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH 1/3] PCI: introduce a device-managed version of pci_set_mwi
2017-12-09 23:43 ` [PATCH 1/3] PCI: introduce a device-managed version of pci_set_mwi Heiner Kallweit
@ 2017-12-11 18:49 ` David Miller
2017-12-11 23:00 ` Bjorn Helgaas
1 sibling, 0 replies; 6+ messages in thread
From: David Miller @ 2017-12-11 18:49 UTC (permalink / raw)
To: hkallweit1; +Cc: nic_swsd, bhelgaas, netdev, linux-pci
From: Heiner Kallweit <hkallweit1@gmail.com>
Date: Sun, 10 Dec 2017 00:43:48 +0100
> Introduce a device-managed version of pci_set_mwi. First user is the
> Realtek r8169 driver.
>
> Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
Bjorn, can I get an ACK on this? And would you be OK with this going
through my tree as the patches later in this series give an example of
usage?
Thanks.
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH 1/3] PCI: introduce a device-managed version of pci_set_mwi
2017-12-09 23:43 ` [PATCH 1/3] PCI: introduce a device-managed version of pci_set_mwi Heiner Kallweit
2017-12-11 18:49 ` David Miller
@ 2017-12-11 23:00 ` Bjorn Helgaas
1 sibling, 0 replies; 6+ messages in thread
From: Bjorn Helgaas @ 2017-12-11 23:00 UTC (permalink / raw)
To: Heiner Kallweit
Cc: Realtek linux nic maintainers, Bjorn Helgaas,
netdev@vger.kernel.org, linux-pci@vger.kernel.org
On Sun, Dec 10, 2017 at 12:43:48AM +0100, Heiner Kallweit wrote:
> Introduce a device-managed version of pci_set_mwi. First user is the
> Realtek r8169 driver.
>
> Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
With the subject and changelog as follows and the code reordering below,
PCI: Add pcim_set_mwi(), a device-managed pci_set_mwi()
Add pcim_set_mwi(), a device-managed version of pci_set_mwi(). First user
is the Realtek r8169 driver.
Acked-by: Bjorn Helgaas <bhelgaas@google.com>
With these changes, feel free to merge with the series via the netdev
tree.
> ---
> drivers/pci/pci.c | 29 +++++++++++++++++++++++++++++
> include/linux/pci.h | 1 +
> 2 files changed, 30 insertions(+)
>
> diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
> index 4a7c6864f..fc57c378d 100644
> --- a/drivers/pci/pci.c
> +++ b/drivers/pci/pci.c
> @@ -1458,6 +1458,7 @@ struct pci_devres {
> unsigned int pinned:1;
> unsigned int orig_intx:1;
> unsigned int restore_intx:1;
> + unsigned int mwi:1;
> u32 region_mask;
> };
>
> @@ -1476,6 +1477,9 @@ static void pcim_release(struct device *gendev, void *res)
> if (this->region_mask & (1 << i))
> pci_release_region(dev, i);
>
> + if (this->mwi)
> + pci_clear_mwi(dev);
> +
> if (this->restore_intx)
> pci_intx(dev, this->orig_intx);
>
> @@ -3760,6 +3764,31 @@ int pci_set_mwi(struct pci_dev *dev)
> }
> EXPORT_SYMBOL(pci_set_mwi);
>
> +/**
> + * pcim_set_mwi - Managed pci_set_mwi()
> + * @dev: the PCI device for which MWI is enabled
> + *
> + * Managed pci_set_mwi().
> + *
> + * RETURNS: An appropriate -ERRNO error value on error, or zero for success.
> + */
> +int pcim_set_mwi(struct pci_dev *dev)
> +{
> + struct pci_devres *dr;
> + int ret;
> +
> + ret = pci_set_mwi(dev);
> + if (ret)
> + return ret;
> +
> + dr = find_pci_dr(dev);
> + if (dr)
> + dr->mwi = 1;
> +
> + return 0;
I would rather look up the pci_devres first, e.g.,
dr = find_pci_dr(dev);
if (!dr)
return -ENOMEM;
dr->mwi = 1;
return pci_set_mwi(dev);
That way we won't enable MWI and be unable to disable it at release-time.
> +}
> +EXPORT_SYMBOL(pcim_set_mwi);
> +
> /**
> * pci_try_set_mwi - enables memory-write-invalidate PCI transaction
> * @dev: the PCI device for which MWI is enabled
> diff --git a/include/linux/pci.h b/include/linux/pci.h
> index 978aad784..0a7ac863a 100644
> --- a/include/linux/pci.h
> +++ b/include/linux/pci.h
> @@ -1064,6 +1064,7 @@ int pci_set_pcie_reset_state(struct pci_dev *dev, enum pcie_reset_state state);
> int pci_set_cacheline_size(struct pci_dev *dev);
> #define HAVE_PCI_SET_MWI
> int __must_check pci_set_mwi(struct pci_dev *dev);
> +int __must_check pcim_set_mwi(struct pci_dev *dev);
> int pci_try_set_mwi(struct pci_dev *dev);
> void pci_clear_mwi(struct pci_dev *dev);
> void pci_intx(struct pci_dev *dev, int enable);
> --
> 2.15.1
>
>
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2017-12-11 23:00 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-12-09 23:30 [PATCH 0/3] r8169: extend PCI core and switch to device-managed functions in probe Heiner Kallweit
2017-12-09 23:43 ` [PATCH 1/3] PCI: introduce a device-managed version of pci_set_mwi Heiner Kallweit
2017-12-11 18:49 ` David Miller
2017-12-11 23:00 ` Bjorn Helgaas
2017-12-09 23:43 ` [PATCH 2/3] r8169: switch to device-managed functions in probe Heiner Kallweit
2017-12-09 23:43 ` [PATCH 3/3] r8169: remove netif_napi_del in probe error path Heiner Kallweit
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).