There was not any kind of protection against carrier driver removal.
In this way, device driver can 'get' the carrier driver when it is
using it.

Signed-off-by: Federico Vaga <federico.v...@cern.ch>
---
 drivers/ipack/carriers/tpci200.c |    3 ++-
 drivers/ipack/ipack.c            |    4 +++-
 include/linux/ipack.h            |   24 +++++++++++++++++++++++-
 3 files changed, 28 insertions(+), 3 deletions(-)

diff --git a/drivers/ipack/carriers/tpci200.c b/drivers/ipack/carriers/tpci200.c
index de5e321..9b23843 100644
--- a/drivers/ipack/carriers/tpci200.c
+++ b/drivers/ipack/carriers/tpci200.c
@@ -572,7 +572,8 @@ static int tpci200_pci_probe(struct pci_dev *pdev,
        /* Register the carrier in the industry pack bus driver */
        tpci200->info->ipack_bus = ipack_bus_register(&pdev->dev,
                                                      TPCI200_NB_SLOT,
-                                                     &tpci200_bus_ops);
+                                                     &tpci200_bus_ops,
+                                                     THIS_MODULE);
        if (!tpci200->info->ipack_bus) {
                dev_err(&pdev->dev,
                        "error registering the carrier on ipack driver\n");
diff --git a/drivers/ipack/ipack.c b/drivers/ipack/ipack.c
index d0016ba..c0e7b62 100644
--- a/drivers/ipack/ipack.c
+++ b/drivers/ipack/ipack.c
@@ -206,7 +206,8 @@ static struct bus_type ipack_bus_type = {
 };
 
 struct ipack_bus_device *ipack_bus_register(struct device *parent, int slots,
-                                           const struct ipack_bus_ops *ops)
+                                           const struct ipack_bus_ops *ops,
+                                           struct module *owner)
 {
        int bus_nr;
        struct ipack_bus_device *bus;
@@ -225,6 +226,7 @@ struct ipack_bus_device *ipack_bus_register(struct device 
*parent, int slots,
        bus->parent = parent;
        bus->slots = slots;
        bus->ops = ops;
+       bus->owner = owner;
        return bus;
 }
 EXPORT_SYMBOL_GPL(ipack_bus_register);
diff --git a/include/linux/ipack.h b/include/linux/ipack.h
index 1888e06..8bddc3f 100644
--- a/include/linux/ipack.h
+++ b/include/linux/ipack.h
@@ -172,6 +172,7 @@ struct ipack_bus_ops {
  *     @ops: bus operations for the mezzanine drivers
  */
 struct ipack_bus_device {
+       struct module *owner;
        struct device *parent;
        int slots;
        int bus_nr;
@@ -189,7 +190,8 @@ struct ipack_bus_device {
  * available bus device in ipack.
  */
 struct ipack_bus_device *ipack_bus_register(struct device *parent, int slots,
-                                           const struct ipack_bus_ops *ops);
+                                           const struct ipack_bus_ops *ops,
+                                           struct module *owner);
 
 /**
  *     ipack_bus_unregister -- unregister an ipack bus
@@ -265,3 +267,23 @@ void ipack_put_device(struct ipack_device *dev);
         .format = (_format), \
         .vendor = (vend), \
         .device = (dev)
+
+/**
+ * ipack_get_carrier - it increase the carrier ref. counter of
+ *                     the carrier module
+ * @dev: mezzanine device which wants to get the carrier
+ */
+static inline int ipack_get_carrier(struct ipack_device *dev)
+{
+       return try_module_get(dev->bus->owner);
+}
+
+/**
+ * ipack_get_carrier - it decrease the carrier ref. counter of
+ *                     the carrier module
+ * @dev: mezzanine device which wants to get the carrier
+ */
+static inline void ipack_put_carrier(struct ipack_device *dev)
+{
+       module_put(dev->bus->owner);
+}
-- 
1.7.10.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to