Commit b74ec56e authored by Alexandre Bounine's avatar Alexandre Bounine Committed by Linus Torvalds

rapidio: rework common RIO device add/delete routines

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: default avatarAlexandre 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: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent f41e2472
...@@ -449,9 +449,6 @@ static struct rio_dev *rio_setup_device(struct rio_net *net, ...@@ -449,9 +449,6 @@ static struct rio_dev *rio_setup_device(struct rio_net *net,
if (do_enum) if (do_enum)
rio_route_clr_table(rdev, RIO_GLOBAL_TABLE, 0); rio_route_clr_table(rdev, RIO_GLOBAL_TABLE, 0);
list_add_tail(&rswitch->node, &net->switches);
} else { } else {
if (do_enum) if (do_enum)
/*Enable Input Output Port (transmitter reviever)*/ /*Enable Input Output Port (transmitter reviever)*/
...@@ -463,11 +460,7 @@ static struct rio_dev *rio_setup_device(struct rio_net *net, ...@@ -463,11 +460,7 @@ static struct rio_dev *rio_setup_device(struct rio_net *net,
rdev->dev.parent = &port->dev; rdev->dev.parent = &port->dev;
rio_attach_device(rdev); rio_attach_device(rdev);
device_initialize(&rdev->dev);
rdev->dev.release = rio_release_dev; rdev->dev.release = rio_release_dev;
rio_dev_get(rdev);
rdev->dma_mask = DMA_BIT_MASK(32); rdev->dma_mask = DMA_BIT_MASK(32);
rdev->dev.dma_mask = &rdev->dma_mask; rdev->dev.dma_mask = &rdev->dma_mask;
rdev->dev.coherent_dma_mask = DMA_BIT_MASK(32); rdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
...@@ -480,6 +473,8 @@ static struct rio_dev *rio_setup_device(struct rio_net *net, ...@@ -480,6 +473,8 @@ static struct rio_dev *rio_setup_device(struct rio_net *net,
if (ret) if (ret)
goto cleanup; goto cleanup;
rio_dev_get(rdev);
return rdev; return rdev;
cleanup: cleanup:
...@@ -621,8 +616,6 @@ static int rio_enum_peer(struct rio_net *net, struct rio_mport *port, ...@@ -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), rdev = rio_setup_device(net, port, RIO_ANY_DESTID(port->sys_size),
hopcount, 1); hopcount, 1);
if (rdev) { if (rdev) {
/* Add device to the global and bus/net specific list. */
list_add_tail(&rdev->net_list, &net->devices);
rdev->prev = prev; rdev->prev = prev;
if (prev && rio_is_switch(prev)) if (prev && rio_is_switch(prev))
prev->rswitch->nextdev[prev_port] = rdev; prev->rswitch->nextdev[prev_port] = rdev;
...@@ -778,8 +771,6 @@ rio_disc_peer(struct rio_net *net, struct rio_mport *port, u16 destid, ...@@ -778,8 +771,6 @@ rio_disc_peer(struct rio_net *net, struct rio_mport *port, u16 destid,
/* Setup new RIO device */ /* Setup new RIO device */
if ((rdev = rio_setup_device(net, port, destid, hopcount, 0))) { 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; rdev->prev = prev;
if (prev && rio_is_switch(prev)) if (prev && rio_is_switch(prev))
prev->rswitch->nextdev[prev_port] = rdev; prev->rswitch->nextdev[prev_port] = rdev;
......
...@@ -96,12 +96,18 @@ int rio_add_device(struct rio_dev *rdev) ...@@ -96,12 +96,18 @@ int rio_add_device(struct rio_dev *rdev)
{ {
int err; int err;
err = device_add(&rdev->dev); err = device_register(&rdev->dev);
if (err) if (err)
return err; return err;
spin_lock(&rio_global_list_lock); spin_lock(&rio_global_list_lock);
list_add_tail(&rdev->global_list, &rio_devices); 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); spin_unlock(&rio_global_list_lock);
rio_create_sysfs_dev_files(rdev); rio_create_sysfs_dev_files(rdev);
...@@ -110,6 +116,31 @@ int rio_add_device(struct rio_dev *rdev) ...@@ -110,6 +116,31 @@ int rio_add_device(struct rio_dev *rdev)
} }
EXPORT_SYMBOL_GPL(rio_add_device); 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 * rio_request_inb_mbox - request inbound mailbox service
* @mport: RIO master port from which to allocate the mailbox resource * @mport: RIO master port from which to allocate the mailbox resource
......
...@@ -28,6 +28,7 @@ extern u32 rio_mport_get_efb(struct rio_mport *port, int local, u16 destid, ...@@ -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, extern int rio_mport_chk_dev_access(struct rio_mport *mport, u16 destid,
u8 hopcount); u8 hopcount);
extern int rio_create_sysfs_dev_files(struct rio_dev *rdev); 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, extern int rio_lock_device(struct rio_mport *port, u16 destid,
u8 hopcount, int wait_ms); u8 hopcount, int wait_ms);
extern int rio_unlock_device(struct rio_mport *port, u16 destid, u8 hopcount); 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); ...@@ -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 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 struct rio_dev *rio_get_comptag(u32 comp_tag, struct rio_dev *from);
extern int rio_add_device(struct rio_dev *rdev); 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, extern int rio_enable_rx_tx_port(struct rio_mport *port, int local, u16 destid,
u8 hopcount, u8 port_num); u8 hopcount, u8 port_num);
extern int rio_register_scan(int mport_id, struct rio_scan *scan_ops); extern int rio_register_scan(int mport_id, struct rio_scan *scan_ops);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment