rapidio: move rio_pw_enable into core code
[deliverable/linux.git] / drivers / rapidio / rio-scan.c
index d6a126c17c032ac0352a3fac42e4a4400937e07b..a63a380809d14c7ffaa6be198c0747f9b648193e 100644 (file)
 
 static void rio_init_em(struct rio_dev *rdev);
 
+struct rio_id_table {
+       u16 start;      /* logical minimal id */
+       u32 max;        /* max number of IDs in table */
+       spinlock_t lock;
+       unsigned long table[0];
+};
+
 static int next_destid = 0;
 static int next_comptag = 1;
 
@@ -62,7 +69,7 @@ static int rio_mport_phys_table[] = {
 static u16 rio_destid_alloc(struct rio_net *net)
 {
        int destid;
-       struct rio_id_table *idtab = &net->destid_table;
+       struct rio_id_table *idtab = (struct rio_id_table *)net->enum_data;
 
        spin_lock(&idtab->lock);
        destid = find_first_zero_bit(idtab->table, idtab->max);
@@ -88,7 +95,7 @@ static u16 rio_destid_alloc(struct rio_net *net)
 static int rio_destid_reserve(struct rio_net *net, u16 destid)
 {
        int oldbit;
-       struct rio_id_table *idtab = &net->destid_table;
+       struct rio_id_table *idtab = (struct rio_id_table *)net->enum_data;
 
        destid -= idtab->start;
        spin_lock(&idtab->lock);
@@ -106,7 +113,7 @@ static int rio_destid_reserve(struct rio_net *net, u16 destid)
  */
 static void rio_destid_free(struct rio_net *net, u16 destid)
 {
-       struct rio_id_table *idtab = &net->destid_table;
+       struct rio_id_table *idtab = (struct rio_id_table *)net->enum_data;
 
        destid -= idtab->start;
        spin_lock(&idtab->lock);
@@ -121,7 +128,7 @@ static void rio_destid_free(struct rio_net *net, u16 destid)
 static u16 rio_destid_first(struct rio_net *net)
 {
        int destid;
-       struct rio_id_table *idtab = &net->destid_table;
+       struct rio_id_table *idtab = (struct rio_id_table *)net->enum_data;
 
        spin_lock(&idtab->lock);
        destid = find_first_bit(idtab->table, idtab->max);
@@ -141,7 +148,7 @@ static u16 rio_destid_first(struct rio_net *net)
 static u16 rio_destid_next(struct rio_net *net, u16 from)
 {
        int destid;
-       struct rio_id_table *idtab = &net->destid_table;
+       struct rio_id_table *idtab = (struct rio_id_table *)net->enum_data;
 
        spin_lock(&idtab->lock);
        destid = find_next_bit(idtab->table, idtab->max, from);
@@ -186,19 +193,6 @@ static void rio_set_device_id(struct rio_mport *port, u16 destid, u8 hopcount, u
                                  RIO_SET_DID(port->sys_size, did));
 }
 
-/**
- * rio_local_set_device_id - Set the base/extended device id for a port
- * @port: RIO master port
- * @did: Device ID value to be written
- *
- * Writes the base/extended device id from a device.
- */
-static void rio_local_set_device_id(struct rio_mport *port, u16 did)
-{
-       rio_local_write_config_32(port, RIO_DID_CSR, RIO_SET_DID(port->sys_size,
-                               did));
-}
-
 /**
  * rio_clear_locks- Release all host locks and signal enumeration complete
  * @net: RIO network to run on
@@ -449,9 +443,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)*/
@@ -461,13 +452,9 @@ static struct rio_dev *rio_setup_device(struct rio_net *net,
                             rdev->comp_tag & RIO_CTAG_UDEVID);
        }
 
-       rdev->dev.parent = &port->dev;
+       rdev->dev.parent = &net->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 +467,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 +610,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 +765,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;
@@ -864,50 +849,71 @@ static int rio_mport_is_active(struct rio_mport *port)
        return result & RIO_PORT_N_ERR_STS_PORT_OK;
 }
 
-/**
- * rio_alloc_net- Allocate and configure a new RIO network
- * @port: Master port associated with the RIO network
+static void rio_scan_release_net(struct rio_net *net)
+{
+       pr_debug("RIO-SCAN: %s: net_%d\n", __func__, net->id);
+       kfree(net->enum_data);
+}
+
+static void rio_scan_release_dev(struct device *dev)
+{
+       struct rio_net *net;
+
+       net = to_rio_net(dev);
+       pr_debug("RIO-SCAN: %s: net_%d\n", __func__, net->id);
+       kfree(net);
+}
+
+/*
+ * rio_scan_alloc_net - Allocate and configure a new RIO network
+ * @mport: Master port associated with the RIO network
  * @do_enum: Enumeration/Discovery mode flag
  * @start: logical minimal start id for new net
  *
- * Allocates a RIO network structure, initializes per-network
- * list heads, and adds the associated master port to the
- * network list of associated master ports. Returns a
- * RIO network pointer on success or %NULL on failure.
+ * Allocates a new RIO network structure and initializes enumerator-specific
+ * part of it (if required).
+ * Returns a RIO network pointer on success or %NULL on failure.
  */
-static struct rio_net *rio_alloc_net(struct rio_mport *port,
-                                              int do_enum, u16 start)
+static struct rio_net *rio_scan_alloc_net(struct rio_mport *mport,
+                                         int do_enum, u16 start)
 {
        struct rio_net *net;
 
-       net = kzalloc(sizeof(struct rio_net), GFP_KERNEL);
+       net = rio_alloc_net(mport);
+
        if (net && do_enum) {
-               net->destid_table.table = kcalloc(
-                       BITS_TO_LONGS(RIO_MAX_ROUTE_ENTRIES(port->sys_size)),
-                       sizeof(long),
-                       GFP_KERNEL);
+               struct rio_id_table *idtab;
+               size_t size;
+
+               size = sizeof(struct rio_id_table) +
+                               BITS_TO_LONGS(
+                                       RIO_MAX_ROUTE_ENTRIES(mport->sys_size)
+                                       ) * sizeof(long);
+
+               idtab = kzalloc(size, GFP_KERNEL);
 
-               if (net->destid_table.table == NULL) {
+               if (idtab == NULL) {
                        pr_err("RIO: failed to allocate destID table\n");
-                       kfree(net);
+                       rio_free_net(net);
                        net = NULL;
                } else {
-                       net->destid_table.start = start;
-                       net->destid_table.max =
-                                       RIO_MAX_ROUTE_ENTRIES(port->sys_size);
-                       spin_lock_init(&net->destid_table.lock);
+                       net->enum_data = idtab;
+                       net->release = rio_scan_release_net;
+                       idtab->start = start;
+                       idtab->max = RIO_MAX_ROUTE_ENTRIES(mport->sys_size);
+                       spin_lock_init(&idtab->lock);
                }
        }
 
        if (net) {
-               INIT_LIST_HEAD(&net->node);
-               INIT_LIST_HEAD(&net->devices);
-               INIT_LIST_HEAD(&net->switches);
-               INIT_LIST_HEAD(&net->mports);
-               list_add_tail(&port->nnode, &net->mports);
-               net->hport = port;
-               net->id = port->id;
+               net->id = mport->id;
+               net->hport = mport;
+               dev_set_name(&net->dev, "rnet_%d", net->id);
+               net->dev.parent = &mport->dev;
+               net->dev.release = rio_scan_release_dev;
+               rio_add_net(net);
        }
+
        return net;
 }
 
@@ -967,17 +973,6 @@ static void rio_init_em(struct rio_dev *rdev)
        }
 }
 
-/**
- * rio_pw_enable - Enables/disables port-write handling by a master port
- * @port: Master port associated with port-write handling
- * @enable:  1=enable,  0=disable
- */
-static void rio_pw_enable(struct rio_mport *port, int enable)
-{
-       if (port->ops->pwenable)
-               port->ops->pwenable(port, enable);
-}
-
 /**
  * rio_enum_mport- Start enumeration through a master port
  * @mport: Master port to send transactions
@@ -1016,7 +1011,7 @@ static int rio_enum_mport(struct rio_mport *mport, u32 flags)
 
        /* If master port has an active link, allocate net and enum peers */
        if (rio_mport_is_active(mport)) {
-               net = rio_alloc_net(mport, 1, 0);
+               net = rio_scan_alloc_net(mport, 1, 0);
                if (!net) {
                        printk(KERN_ERR "RIO: failed to allocate new net\n");
                        rc = -ENOMEM;
@@ -1133,7 +1128,7 @@ static int rio_disc_mport(struct rio_mport *mport, u32 flags)
 enum_done:
                pr_debug("RIO: ... enumeration done\n");
 
-               net = rio_alloc_net(mport, 0, 0);
+               net = rio_scan_alloc_net(mport, 0, 0);
                if (!net) {
                        printk(KERN_ERR "RIO: Failed to allocate new net\n");
                        goto bail;
This page took 0.02958 seconds and 5 git commands to generate.