rapidio: rework common RIO device add/delete routines
authorAlexandre Bounine <alexandre.bounine@idt.com>
Tue, 22 Mar 2016 21:26:14 +0000 (14:26 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 22 Mar 2016 22:36:02 +0000 (15:36 -0700)
This patch moves per-net device list handling from rio-scan to common
RapidIO core and adds a matching device deletion routine.  This makes
device object creation/removal available to other implementations of
enumeration/discovery process.

Signed-off-by: Alexandre Bounine <alexandre.bounine@idt.com>
Cc: Matt Porter <mporter@kernel.crashing.org>
Cc: Aurelien Jacquiot <a-jacquiot@ti.com>
Cc: Andre van Herk <andre.van.herk@prodrive-technologies.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/rapidio/rio-scan.c
drivers/rapidio/rio.c
drivers/rapidio/rio.h

index d6a126c17c032ac0352a3fac42e4a4400937e07b..c46763185849c1aa0e1d63fce4fcd0c54d67817c 100644 (file)
@@ -449,9 +449,6 @@ static struct rio_dev *rio_setup_device(struct rio_net *net,
 
                if (do_enum)
                        rio_route_clr_table(rdev, RIO_GLOBAL_TABLE, 0);
-
-               list_add_tail(&rswitch->node, &net->switches);
-
        } else {
                if (do_enum)
                        /*Enable Input Output Port (transmitter reviever)*/
@@ -463,11 +460,7 @@ static struct rio_dev *rio_setup_device(struct rio_net *net,
 
        rdev->dev.parent = &port->dev;
        rio_attach_device(rdev);
-
-       device_initialize(&rdev->dev);
        rdev->dev.release = rio_release_dev;
-       rio_dev_get(rdev);
-
        rdev->dma_mask = DMA_BIT_MASK(32);
        rdev->dev.dma_mask = &rdev->dma_mask;
        rdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
@@ -480,6 +473,8 @@ static struct rio_dev *rio_setup_device(struct rio_net *net,
        if (ret)
                goto cleanup;
 
+       rio_dev_get(rdev);
+
        return rdev;
 
 cleanup:
@@ -621,8 +616,6 @@ static int rio_enum_peer(struct rio_net *net, struct rio_mport *port,
        rdev = rio_setup_device(net, port, RIO_ANY_DESTID(port->sys_size),
                                        hopcount, 1);
        if (rdev) {
-               /* Add device to the global and bus/net specific list. */
-               list_add_tail(&rdev->net_list, &net->devices);
                rdev->prev = prev;
                if (prev && rio_is_switch(prev))
                        prev->rswitch->nextdev[prev_port] = rdev;
@@ -778,8 +771,6 @@ rio_disc_peer(struct rio_net *net, struct rio_mport *port, u16 destid,
 
        /* Setup new RIO device */
        if ((rdev = rio_setup_device(net, port, destid, hopcount, 0))) {
-               /* Add device to the global and bus/net specific list. */
-               list_add_tail(&rdev->net_list, &net->devices);
                rdev->prev = prev;
                if (prev && rio_is_switch(prev))
                        prev->rswitch->nextdev[prev_port] = rdev;
index c72f4da8065ed32b27a1981585cd2ad957124d02..0be86f4eea5db9ee25f3a6e644a234197699f0f7 100644 (file)
@@ -96,12 +96,18 @@ int rio_add_device(struct rio_dev *rdev)
 {
        int err;
 
-       err = device_add(&rdev->dev);
+       err = device_register(&rdev->dev);
        if (err)
                return err;
 
        spin_lock(&rio_global_list_lock);
        list_add_tail(&rdev->global_list, &rio_devices);
+       if (rdev->net) {
+               list_add_tail(&rdev->net_list, &rdev->net->devices);
+               if (rdev->pef & RIO_PEF_SWITCH)
+                       list_add_tail(&rdev->rswitch->node,
+                                     &rdev->net->switches);
+       }
        spin_unlock(&rio_global_list_lock);
 
        rio_create_sysfs_dev_files(rdev);
@@ -110,6 +116,31 @@ int rio_add_device(struct rio_dev *rdev)
 }
 EXPORT_SYMBOL_GPL(rio_add_device);
 
+/*
+ * rio_del_device - removes a RIO device from the device model
+ * @rdev: RIO device
+ *
+ * Removes the RIO device to the kernel device list and subsystem's device list.
+ * Clears sysfs entries for the removed device.
+ */
+void rio_del_device(struct rio_dev *rdev)
+{
+       pr_debug("RIO: %s: removing %s\n", __func__, rio_name(rdev));
+       spin_lock(&rio_global_list_lock);
+       list_del(&rdev->global_list);
+       if (rdev->net) {
+               list_del(&rdev->net_list);
+               if (rdev->pef & RIO_PEF_SWITCH) {
+                       list_del(&rdev->rswitch->node);
+                       kfree(rdev->rswitch->route_table);
+               }
+       }
+       spin_unlock(&rio_global_list_lock);
+       rio_remove_sysfs_dev_files(rdev);
+       device_unregister(&rdev->dev);
+}
+EXPORT_SYMBOL_GPL(rio_del_device);
+
 /**
  * rio_request_inb_mbox - request inbound mailbox service
  * @mport: RIO master port from which to allocate the mailbox resource
index 2d0550e08ea204c2d9b1b1afbdb71cb6b554e4ba..da0f604a834e3670aa9032c2166b2a7ce0ec6c3b 100644 (file)
@@ -28,6 +28,7 @@ extern u32 rio_mport_get_efb(struct rio_mport *port, int local, u16 destid,
 extern int rio_mport_chk_dev_access(struct rio_mport *mport, u16 destid,
                                    u8 hopcount);
 extern int rio_create_sysfs_dev_files(struct rio_dev *rdev);
+extern void rio_remove_sysfs_dev_files(struct rio_dev *rdev);
 extern int rio_lock_device(struct rio_mport *port, u16 destid,
                        u8 hopcount, int wait_ms);
 extern int rio_unlock_device(struct rio_mport *port, u16 destid, u8 hopcount);
@@ -39,6 +40,7 @@ extern int rio_route_clr_table(struct rio_dev *rdev, u16 table, int lock);
 extern int rio_set_port_lockout(struct rio_dev *rdev, u32 pnum, int lock);
 extern struct rio_dev *rio_get_comptag(u32 comp_tag, struct rio_dev *from);
 extern int rio_add_device(struct rio_dev *rdev);
+extern void rio_del_device(struct rio_dev *rdev);
 extern int rio_enable_rx_tx_port(struct rio_mport *port, int local, u16 destid,
                                 u8 hopcount, u8 port_num);
 extern int rio_register_scan(int mport_id, struct rio_scan *scan_ops);
This page took 0.028368 seconds and 5 git commands to generate.