rapidio: add switch locking during discovery
[linux-2.6/next.git] / drivers / rapidio / rio-scan.c
blobcbf0d5f4fba8b2d56a435d5b1ebd4b63c68ba2d8
1 /*
2 * RapidIO enumeration and discovery support
4 * Copyright 2005 MontaVista Software, Inc.
5 * Matt Porter <mporter@kernel.crashing.org>
7 * This program is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2 of the License, or (at your
10 * option) any later version.
13 #include <linux/types.h>
14 #include <linux/kernel.h>
16 #include <linux/delay.h>
17 #include <linux/dma-mapping.h>
18 #include <linux/init.h>
19 #include <linux/rio.h>
20 #include <linux/rio_drv.h>
21 #include <linux/rio_ids.h>
22 #include <linux/rio_regs.h>
23 #include <linux/module.h>
24 #include <linux/spinlock.h>
25 #include <linux/timer.h>
26 #include <linux/jiffies.h>
27 #include <linux/slab.h>
29 #include "rio.h"
31 LIST_HEAD(rio_devices);
32 static LIST_HEAD(rio_switches);
34 #define RIO_ENUM_CMPL_MAGIC 0xdeadbeef
36 static void rio_enum_timeout(unsigned long);
38 DEFINE_SPINLOCK(rio_global_list_lock);
40 static int next_destid = 0;
41 static int next_switchid = 0;
42 static int next_net = 0;
44 static struct timer_list rio_enum_timer =
45 TIMER_INITIALIZER(rio_enum_timeout, 0, 0);
47 static int rio_mport_phys_table[] = {
48 RIO_EFB_PAR_EP_ID,
49 RIO_EFB_PAR_EP_REC_ID,
50 RIO_EFB_SER_EP_ID,
51 RIO_EFB_SER_EP_REC_ID,
52 -1,
55 static int rio_sport_phys_table[] = {
56 RIO_EFB_PAR_EP_FREE_ID,
57 RIO_EFB_SER_EP_FREE_ID,
58 RIO_EFB_SER_EP_FREC_ID,
59 -1,
62 /**
63 * rio_get_device_id - Get the base/extended device id for a device
64 * @port: RIO master port
65 * @destid: Destination ID of device
66 * @hopcount: Hopcount to device
68 * Reads the base/extended device id from a device. Returns the
69 * 8/16-bit device ID.
71 static u16 rio_get_device_id(struct rio_mport *port, u16 destid, u8 hopcount)
73 u32 result;
75 rio_mport_read_config_32(port, destid, hopcount, RIO_DID_CSR, &result);
77 return RIO_GET_DID(port->sys_size, result);
80 /**
81 * rio_set_device_id - Set the base/extended device id for a device
82 * @port: RIO master port
83 * @destid: Destination ID of device
84 * @hopcount: Hopcount to device
85 * @did: Device ID value to be written
87 * Writes the base/extended device id from a device.
89 static void rio_set_device_id(struct rio_mport *port, u16 destid, u8 hopcount, u16 did)
91 rio_mport_write_config_32(port, destid, hopcount, RIO_DID_CSR,
92 RIO_SET_DID(port->sys_size, did));
95 /**
96 * rio_local_set_device_id - Set the base/extended device id for a port
97 * @port: RIO master port
98 * @did: Device ID value to be written
100 * Writes the base/extended device id from a device.
102 static void rio_local_set_device_id(struct rio_mport *port, u16 did)
104 rio_local_write_config_32(port, RIO_DID_CSR, RIO_SET_DID(port->sys_size,
105 did));
109 * rio_clear_locks- Release all host locks and signal enumeration complete
110 * @port: Master port to issue transaction
112 * Marks the component tag CSR on each device with the enumeration
113 * complete flag. When complete, it then release the host locks on
114 * each device. Returns 0 on success or %-EINVAL on failure.
116 static int rio_clear_locks(struct rio_mport *port)
118 struct rio_dev *rdev;
119 u32 result;
120 int ret = 0;
122 /* Write component tag CSR magic complete value */
123 rio_local_write_config_32(port, RIO_COMPONENT_TAG_CSR,
124 RIO_ENUM_CMPL_MAGIC);
125 list_for_each_entry(rdev, &rio_devices, global_list)
126 rio_write_config_32(rdev, RIO_COMPONENT_TAG_CSR,
127 RIO_ENUM_CMPL_MAGIC);
129 /* Release host device id locks */
130 rio_local_write_config_32(port, RIO_HOST_DID_LOCK_CSR,
131 port->host_deviceid);
132 rio_local_read_config_32(port, RIO_HOST_DID_LOCK_CSR, &result);
133 if ((result & 0xffff) != 0xffff) {
134 printk(KERN_INFO
135 "RIO: badness when releasing host lock on master port, result %8.8x\n",
136 result);
137 ret = -EINVAL;
139 list_for_each_entry(rdev, &rio_devices, global_list) {
140 rio_write_config_32(rdev, RIO_HOST_DID_LOCK_CSR,
141 port->host_deviceid);
142 rio_read_config_32(rdev, RIO_HOST_DID_LOCK_CSR, &result);
143 if ((result & 0xffff) != 0xffff) {
144 printk(KERN_INFO
145 "RIO: badness when releasing host lock on vid %4.4x did %4.4x\n",
146 rdev->vid, rdev->did);
147 ret = -EINVAL;
151 return ret;
155 * rio_enum_host- Set host lock and initialize host destination ID
156 * @port: Master port to issue transaction
158 * Sets the local host master port lock and destination ID register
159 * with the host device ID value. The host device ID value is provided
160 * by the platform. Returns %0 on success or %-1 on failure.
162 static int rio_enum_host(struct rio_mport *port)
164 u32 result;
166 /* Set master port host device id lock */
167 rio_local_write_config_32(port, RIO_HOST_DID_LOCK_CSR,
168 port->host_deviceid);
170 rio_local_read_config_32(port, RIO_HOST_DID_LOCK_CSR, &result);
171 if ((result & 0xffff) != port->host_deviceid)
172 return -1;
174 /* Set master port destid and init destid ctr */
175 rio_local_set_device_id(port, port->host_deviceid);
177 if (next_destid == port->host_deviceid)
178 next_destid++;
180 return 0;
184 * rio_device_has_destid- Test if a device contains a destination ID register
185 * @port: Master port to issue transaction
186 * @src_ops: RIO device source operations
187 * @dst_ops: RIO device destination operations
189 * Checks the provided @src_ops and @dst_ops for the necessary transaction
190 * capabilities that indicate whether or not a device will implement a
191 * destination ID register. Returns 1 if true or 0 if false.
193 static int rio_device_has_destid(struct rio_mport *port, int src_ops,
194 int dst_ops)
196 u32 mask = RIO_OPS_READ | RIO_OPS_WRITE | RIO_OPS_ATOMIC_TST_SWP | RIO_OPS_ATOMIC_INC | RIO_OPS_ATOMIC_DEC | RIO_OPS_ATOMIC_SET | RIO_OPS_ATOMIC_CLR;
198 return !!((src_ops | dst_ops) & mask);
202 * rio_release_dev- Frees a RIO device struct
203 * @dev: LDM device associated with a RIO device struct
205 * Gets the RIO device struct associated a RIO device struct.
206 * The RIO device struct is freed.
208 static void rio_release_dev(struct device *dev)
210 struct rio_dev *rdev;
212 rdev = to_rio_dev(dev);
213 kfree(rdev);
217 * rio_is_switch- Tests if a RIO device has switch capabilities
218 * @rdev: RIO device
220 * Gets the RIO device Processing Element Features register
221 * contents and tests for switch capabilities. Returns 1 if
222 * the device is a switch or 0 if it is not a switch.
223 * The RIO device struct is freed.
225 static int rio_is_switch(struct rio_dev *rdev)
227 if (rdev->pef & RIO_PEF_SWITCH)
228 return 1;
229 return 0;
233 * rio_route_set_ops- Sets routing operations for a particular vendor switch
234 * @rdev: RIO device
236 * Searches the RIO route ops table for known switch types. If the vid
237 * and did match a switch table entry, then set the add_entry() and
238 * get_entry() ops to the table entry values.
240 static void rio_route_set_ops(struct rio_dev *rdev)
242 struct rio_route_ops *cur = __start_rio_route_ops;
243 struct rio_route_ops *end = __end_rio_route_ops;
245 while (cur < end) {
246 if ((cur->vid == rdev->vid) && (cur->did == rdev->did)) {
247 pr_debug("RIO: adding routing ops for %s\n", rio_name(rdev));
248 rdev->rswitch->add_entry = cur->add_hook;
249 rdev->rswitch->get_entry = cur->get_hook;
250 rdev->rswitch->clr_table = cur->clr_hook;
251 break;
253 cur++;
256 if ((cur >= end) && (rdev->pef & RIO_PEF_STD_RT)) {
257 pr_debug("RIO: adding STD routing ops for %s\n",
258 rio_name(rdev));
259 rdev->rswitch->add_entry = rio_std_route_add_entry;
260 rdev->rswitch->get_entry = rio_std_route_get_entry;
261 rdev->rswitch->clr_table = rio_std_route_clr_table;
264 if (!rdev->rswitch->add_entry || !rdev->rswitch->get_entry)
265 printk(KERN_ERR "RIO: missing routing ops for %s\n",
266 rio_name(rdev));
270 * rio_add_device- Adds a RIO device to the device model
271 * @rdev: RIO device
273 * Adds the RIO device to the global device list and adds the RIO
274 * device to the RIO device list. Creates the generic sysfs nodes
275 * for an RIO device.
277 static int __devinit rio_add_device(struct rio_dev *rdev)
279 int err;
281 err = device_add(&rdev->dev);
282 if (err)
283 return err;
285 spin_lock(&rio_global_list_lock);
286 list_add_tail(&rdev->global_list, &rio_devices);
287 spin_unlock(&rio_global_list_lock);
289 rio_create_sysfs_dev_files(rdev);
291 return 0;
295 * rio_setup_device- Allocates and sets up a RIO device
296 * @net: RIO network
297 * @port: Master port to send transactions
298 * @destid: Current destination ID
299 * @hopcount: Current hopcount
300 * @do_enum: Enumeration/Discovery mode flag
302 * Allocates a RIO device and configures fields based on configuration
303 * space contents. If device has a destination ID register, a destination
304 * ID is either assigned in enumeration mode or read from configuration
305 * space in discovery mode. If the device has switch capabilities, then
306 * a switch is allocated and configured appropriately. Returns a pointer
307 * to a RIO device on success or NULL on failure.
310 static struct rio_dev __devinit *rio_setup_device(struct rio_net *net,
311 struct rio_mport *port, u16 destid,
312 u8 hopcount, int do_enum)
314 int ret = 0;
315 struct rio_dev *rdev;
316 struct rio_switch *rswitch = NULL;
317 int result, rdid;
319 rdev = kzalloc(sizeof(struct rio_dev), GFP_KERNEL);
320 if (!rdev)
321 return NULL;
323 rdev->net = net;
324 rio_mport_read_config_32(port, destid, hopcount, RIO_DEV_ID_CAR,
325 &result);
326 rdev->did = result >> 16;
327 rdev->vid = result & 0xffff;
328 rio_mport_read_config_32(port, destid, hopcount, RIO_DEV_INFO_CAR,
329 &rdev->device_rev);
330 rio_mport_read_config_32(port, destid, hopcount, RIO_ASM_ID_CAR,
331 &result);
332 rdev->asm_did = result >> 16;
333 rdev->asm_vid = result & 0xffff;
334 rio_mport_read_config_32(port, destid, hopcount, RIO_ASM_INFO_CAR,
335 &result);
336 rdev->asm_rev = result >> 16;
337 rio_mport_read_config_32(port, destid, hopcount, RIO_PEF_CAR,
338 &rdev->pef);
339 if (rdev->pef & RIO_PEF_EXT_FEATURES)
340 rdev->efptr = result & 0xffff;
342 rio_mport_read_config_32(port, destid, hopcount, RIO_SRC_OPS_CAR,
343 &rdev->src_ops);
344 rio_mport_read_config_32(port, destid, hopcount, RIO_DST_OPS_CAR,
345 &rdev->dst_ops);
347 if (rio_device_has_destid(port, rdev->src_ops, rdev->dst_ops)) {
348 if (do_enum) {
349 rio_set_device_id(port, destid, hopcount, next_destid);
350 rdev->destid = next_destid++;
351 if (next_destid == port->host_deviceid)
352 next_destid++;
353 } else
354 rdev->destid = rio_get_device_id(port, destid, hopcount);
355 } else
356 /* Switch device has an associated destID */
357 rdev->destid = RIO_INVALID_DESTID;
359 /* If a PE has both switch and other functions, show it as a switch */
360 if (rio_is_switch(rdev)) {
361 rio_mport_read_config_32(port, destid, hopcount,
362 RIO_SWP_INFO_CAR, &rdev->swpinfo);
363 rswitch = kzalloc(sizeof(struct rio_switch), GFP_KERNEL);
364 if (!rswitch)
365 goto cleanup;
366 rswitch->switchid = next_switchid;
367 rswitch->hopcount = hopcount;
368 rswitch->destid = destid;
369 rswitch->route_table = kzalloc(sizeof(u8)*
370 RIO_MAX_ROUTE_ENTRIES(port->sys_size),
371 GFP_KERNEL);
372 if (!rswitch->route_table)
373 goto cleanup;
374 /* Initialize switch route table */
375 for (rdid = 0; rdid < RIO_MAX_ROUTE_ENTRIES(port->sys_size);
376 rdid++)
377 rswitch->route_table[rdid] = RIO_INVALID_ROUTE;
378 rdev->rswitch = rswitch;
379 dev_set_name(&rdev->dev, "%02x:s:%04x", rdev->net->id,
380 rdev->rswitch->switchid);
381 rio_route_set_ops(rdev);
383 if (do_enum && rdev->rswitch->clr_table)
384 rdev->rswitch->clr_table(port, destid, hopcount,
385 RIO_GLOBAL_TABLE);
387 list_add_tail(&rswitch->node, &rio_switches);
389 } else
390 dev_set_name(&rdev->dev, "%02x:e:%04x", rdev->net->id,
391 rdev->destid);
393 rdev->dev.bus = &rio_bus_type;
395 device_initialize(&rdev->dev);
396 rdev->dev.release = rio_release_dev;
397 rio_dev_get(rdev);
399 rdev->dma_mask = DMA_BIT_MASK(32);
400 rdev->dev.dma_mask = &rdev->dma_mask;
401 rdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
403 if ((rdev->pef & RIO_PEF_INB_DOORBELL) &&
404 (rdev->dst_ops & RIO_DST_OPS_DOORBELL))
405 rio_init_dbell_res(&rdev->riores[RIO_DOORBELL_RESOURCE],
406 0, 0xffff);
408 ret = rio_add_device(rdev);
409 if (ret)
410 goto cleanup;
412 return rdev;
414 cleanup:
415 if (rswitch) {
416 kfree(rswitch->route_table);
417 kfree(rswitch);
419 kfree(rdev);
420 return NULL;
424 * rio_sport_is_active- Tests if a switch port has an active connection.
425 * @port: Master port to send transaction
426 * @destid: Associated destination ID for switch
427 * @hopcount: Hopcount to reach switch
428 * @sport: Switch port number
430 * Reads the port error status CSR for a particular switch port to
431 * determine if the port has an active link. Returns
432 * %PORT_N_ERR_STS_PORT_OK if the port is active or %0 if it is
433 * inactive.
435 static int
436 rio_sport_is_active(struct rio_mport *port, u16 destid, u8 hopcount, int sport)
438 u32 result;
439 u32 ext_ftr_ptr;
441 int *entry = rio_sport_phys_table;
443 do {
444 if ((ext_ftr_ptr =
445 rio_mport_get_feature(port, 0, destid, hopcount, *entry)))
447 break;
448 } while (*++entry >= 0);
450 if (ext_ftr_ptr)
451 rio_mport_read_config_32(port, destid, hopcount,
452 ext_ftr_ptr +
453 RIO_PORT_N_ERR_STS_CSR(sport),
454 &result);
456 return (result & PORT_N_ERR_STS_PORT_OK);
460 * rio_lock_device - Acquires host device lock for specified device
461 * @port: Master port to send transaction
462 * @destid: Destination ID for device/switch
463 * @hopcount: Hopcount to reach switch
464 * @wait_ms: Max wait time in msec (0 = no timeout)
466 * Attepts to acquire host device lock for specified device
467 * Returns 0 if device lock acquired or EINVAL if timeout expires.
469 static int
470 rio_lock_device(struct rio_mport *port, u16 destid, u8 hopcount, int wait_ms)
472 u32 result;
473 int tcnt = 0;
475 /* Attempt to acquire device lock */
476 rio_mport_write_config_32(port, destid, hopcount,
477 RIO_HOST_DID_LOCK_CSR, port->host_deviceid);
478 rio_mport_read_config_32(port, destid, hopcount,
479 RIO_HOST_DID_LOCK_CSR, &result);
481 while (result != port->host_deviceid) {
482 if (wait_ms != 0 && tcnt == wait_ms) {
483 pr_debug("RIO: timeout when locking device %x:%x\n",
484 destid, hopcount);
485 return -EINVAL;
488 /* Delay a bit */
489 mdelay(1);
490 tcnt++;
491 /* Try to acquire device lock again */
492 rio_mport_write_config_32(port, destid,
493 hopcount,
494 RIO_HOST_DID_LOCK_CSR,
495 port->host_deviceid);
496 rio_mport_read_config_32(port, destid,
497 hopcount,
498 RIO_HOST_DID_LOCK_CSR, &result);
501 return 0;
505 * rio_unlock_device - Releases host device lock for specified device
506 * @port: Master port to send transaction
507 * @destid: Destination ID for device/switch
508 * @hopcount: Hopcount to reach switch
510 * Returns 0 if device lock released or EINVAL if fails.
512 static int
513 rio_unlock_device(struct rio_mport *port, u16 destid, u8 hopcount)
515 u32 result;
517 /* Release device lock */
518 rio_mport_write_config_32(port, destid,
519 hopcount,
520 RIO_HOST_DID_LOCK_CSR,
521 port->host_deviceid);
522 rio_mport_read_config_32(port, destid, hopcount,
523 RIO_HOST_DID_LOCK_CSR, &result);
524 if ((result & 0xffff) != 0xffff) {
525 pr_debug("RIO: badness when releasing device lock %x:%x\n",
526 destid, hopcount);
527 return -EINVAL;
530 return 0;
534 * rio_route_add_entry- Add a route entry to a switch routing table
535 * @mport: Master port to send transaction
536 * @rswitch: Switch device
537 * @table: Routing table ID
538 * @route_destid: Destination ID to be routed
539 * @route_port: Port number to be routed
540 * @lock: lock switch device flag
542 * Calls the switch specific add_entry() method to add a route entry
543 * on a switch. The route table can be specified using the @table
544 * argument if a switch has per port routing tables or the normal
545 * use is to specific all tables (or the global table) by passing
546 * %RIO_GLOBAL_TABLE in @table. Returns %0 on success or %-EINVAL
547 * on failure.
549 static int
550 rio_route_add_entry(struct rio_mport *mport, struct rio_switch *rswitch,
551 u16 table, u16 route_destid, u8 route_port, int lock)
553 int rc;
555 if (lock) {
556 rc = rio_lock_device(mport, rswitch->destid,
557 rswitch->hopcount, 1000);
558 if (rc)
559 return rc;
562 rc = rswitch->add_entry(mport, rswitch->destid,
563 rswitch->hopcount, table,
564 route_destid, route_port);
565 if (lock)
566 rio_unlock_device(mport, rswitch->destid, rswitch->hopcount);
568 return rc;
572 * rio_route_get_entry- Read a route entry in a switch routing table
573 * @mport: Master port to send transaction
574 * @rswitch: Switch device
575 * @table: Routing table ID
576 * @route_destid: Destination ID to be routed
577 * @route_port: Pointer to read port number into
578 * @lock: lock switch device flag
580 * Calls the switch specific get_entry() method to read a route entry
581 * in a switch. The route table can be specified using the @table
582 * argument if a switch has per port routing tables or the normal
583 * use is to specific all tables (or the global table) by passing
584 * %RIO_GLOBAL_TABLE in @table. Returns %0 on success or %-EINVAL
585 * on failure.
587 static int
588 rio_route_get_entry(struct rio_mport *mport, struct rio_switch *rswitch, u16 table,
589 u16 route_destid, u8 *route_port, int lock)
591 int rc;
593 if (lock) {
594 rc = rio_lock_device(mport, rswitch->destid,
595 rswitch->hopcount, 1000);
596 if (rc)
597 return rc;
600 rc = rswitch->get_entry(mport, rswitch->destid,
601 rswitch->hopcount, table,
602 route_destid, route_port);
603 if (lock)
604 rio_unlock_device(mport, rswitch->destid, rswitch->hopcount);
606 return rc;
610 * rio_get_host_deviceid_lock- Reads the Host Device ID Lock CSR on a device
611 * @port: Master port to send transaction
612 * @hopcount: Number of hops to the device
614 * Used during enumeration to read the Host Device ID Lock CSR on a
615 * RIO device. Returns the value of the lock register.
617 static u16 rio_get_host_deviceid_lock(struct rio_mport *port, u8 hopcount)
619 u32 result;
621 rio_mport_read_config_32(port, RIO_ANY_DESTID(port->sys_size), hopcount,
622 RIO_HOST_DID_LOCK_CSR, &result);
624 return (u16) (result & 0xffff);
628 * rio_get_swpinfo_inport- Gets the ingress port number
629 * @mport: Master port to send transaction
630 * @destid: Destination ID associated with the switch
631 * @hopcount: Number of hops to the device
633 * Returns port number being used to access the switch device.
635 static u8
636 rio_get_swpinfo_inport(struct rio_mport *mport, u16 destid, u8 hopcount)
638 u32 result;
640 rio_mport_read_config_32(mport, destid, hopcount, RIO_SWP_INFO_CAR,
641 &result);
643 return (u8) (result & 0xff);
647 * rio_get_swpinfo_tports- Gets total number of ports on the switch
648 * @mport: Master port to send transaction
649 * @destid: Destination ID associated with the switch
650 * @hopcount: Number of hops to the device
652 * Returns total numbers of ports implemented by the switch device.
654 static u8 rio_get_swpinfo_tports(struct rio_mport *mport, u16 destid,
655 u8 hopcount)
657 u32 result;
659 rio_mport_read_config_32(mport, destid, hopcount, RIO_SWP_INFO_CAR,
660 &result);
662 return RIO_GET_TOTAL_PORTS(result);
666 * rio_net_add_mport- Add a master port to a RIO network
667 * @net: RIO network
668 * @port: Master port to add
670 * Adds a master port to the network list of associated master
671 * ports..
673 static void rio_net_add_mport(struct rio_net *net, struct rio_mport *port)
675 spin_lock(&rio_global_list_lock);
676 list_add_tail(&port->nnode, &net->mports);
677 spin_unlock(&rio_global_list_lock);
681 * rio_enum_peer- Recursively enumerate a RIO network through a master port
682 * @net: RIO network being enumerated
683 * @port: Master port to send transactions
684 * @hopcount: Number of hops into the network
686 * Recursively enumerates a RIO network. Transactions are sent via the
687 * master port passed in @port.
689 static int __devinit rio_enum_peer(struct rio_net *net, struct rio_mport *port,
690 u8 hopcount)
692 int port_num;
693 int num_ports;
694 int cur_destid;
695 int sw_destid;
696 int sw_inport;
697 struct rio_dev *rdev;
698 u16 destid;
699 int tmp;
701 if (rio_get_host_deviceid_lock(port, hopcount) == port->host_deviceid) {
702 pr_debug("RIO: PE already discovered by this host\n");
704 * Already discovered by this host. Add it as another
705 * master port for the current network.
707 rio_net_add_mport(net, port);
708 return 0;
711 /* Attempt to acquire device lock */
712 rio_mport_write_config_32(port, RIO_ANY_DESTID(port->sys_size),
713 hopcount,
714 RIO_HOST_DID_LOCK_CSR, port->host_deviceid);
715 while ((tmp = rio_get_host_deviceid_lock(port, hopcount))
716 < port->host_deviceid) {
717 /* Delay a bit */
718 mdelay(1);
719 /* Attempt to acquire device lock again */
720 rio_mport_write_config_32(port, RIO_ANY_DESTID(port->sys_size),
721 hopcount,
722 RIO_HOST_DID_LOCK_CSR,
723 port->host_deviceid);
726 if (rio_get_host_deviceid_lock(port, hopcount) > port->host_deviceid) {
727 pr_debug(
728 "RIO: PE locked by a higher priority host...retreating\n");
729 return -1;
732 /* Setup new RIO device */
733 rdev = rio_setup_device(net, port, RIO_ANY_DESTID(port->sys_size),
734 hopcount, 1);
735 if (rdev) {
736 /* Add device to the global and bus/net specific list. */
737 list_add_tail(&rdev->net_list, &net->devices);
738 } else
739 return -1;
741 if (rio_is_switch(rdev)) {
742 next_switchid++;
743 sw_inport = rio_get_swpinfo_inport(port,
744 RIO_ANY_DESTID(port->sys_size), hopcount);
745 rio_route_add_entry(port, rdev->rswitch, RIO_GLOBAL_TABLE,
746 port->host_deviceid, sw_inport, 0);
747 rdev->rswitch->route_table[port->host_deviceid] = sw_inport;
749 for (destid = 0; destid < next_destid; destid++) {
750 if (destid == port->host_deviceid)
751 continue;
752 rio_route_add_entry(port, rdev->rswitch, RIO_GLOBAL_TABLE,
753 destid, sw_inport, 0);
754 rdev->rswitch->route_table[destid] = sw_inport;
757 num_ports =
758 rio_get_swpinfo_tports(port, RIO_ANY_DESTID(port->sys_size),
759 hopcount);
760 pr_debug(
761 "RIO: found %s (vid %4.4x did %4.4x) with %d ports\n",
762 rio_name(rdev), rdev->vid, rdev->did, num_ports);
763 sw_destid = next_destid;
764 for (port_num = 0; port_num < num_ports; port_num++) {
765 if (sw_inport == port_num)
766 continue;
768 cur_destid = next_destid;
770 if (rio_sport_is_active
771 (port, RIO_ANY_DESTID(port->sys_size), hopcount,
772 port_num)) {
773 pr_debug(
774 "RIO: scanning device on port %d\n",
775 port_num);
776 rio_route_add_entry(port, rdev->rswitch,
777 RIO_GLOBAL_TABLE,
778 RIO_ANY_DESTID(port->sys_size),
779 port_num, 0);
781 if (rio_enum_peer(net, port, hopcount + 1) < 0)
782 return -1;
784 /* Update routing tables */
785 if (next_destid > cur_destid) {
786 for (destid = cur_destid;
787 destid < next_destid; destid++) {
788 if (destid == port->host_deviceid)
789 continue;
790 rio_route_add_entry(port, rdev->rswitch,
791 RIO_GLOBAL_TABLE,
792 destid,
793 port_num,
795 rdev->rswitch->
796 route_table[destid] =
797 port_num;
803 /* Check for empty switch */
804 if (next_destid == sw_destid) {
805 next_destid++;
806 if (next_destid == port->host_deviceid)
807 next_destid++;
810 rdev->rswitch->destid = sw_destid;
811 } else
812 pr_debug("RIO: found %s (vid %4.4x did %4.4x)\n",
813 rio_name(rdev), rdev->vid, rdev->did);
815 return 0;
819 * rio_enum_complete- Tests if enumeration of a network is complete
820 * @port: Master port to send transaction
822 * Tests the Component Tag CSR for presence of the magic enumeration
823 * complete flag. Return %1 if enumeration is complete or %0 if
824 * enumeration is incomplete.
826 static int rio_enum_complete(struct rio_mport *port)
828 u32 tag_csr;
829 int ret = 0;
831 rio_local_read_config_32(port, RIO_COMPONENT_TAG_CSR, &tag_csr);
833 if (tag_csr == RIO_ENUM_CMPL_MAGIC)
834 ret = 1;
836 return ret;
840 * rio_disc_peer- Recursively discovers a RIO network through a master port
841 * @net: RIO network being discovered
842 * @port: Master port to send transactions
843 * @destid: Current destination ID in network
844 * @hopcount: Number of hops into the network
846 * Recursively discovers a RIO network. Transactions are sent via the
847 * master port passed in @port.
849 static int __devinit
850 rio_disc_peer(struct rio_net *net, struct rio_mport *port, u16 destid,
851 u8 hopcount)
853 u8 port_num, route_port;
854 int num_ports;
855 struct rio_dev *rdev;
856 u16 ndestid;
858 /* Setup new RIO device */
859 if ((rdev = rio_setup_device(net, port, destid, hopcount, 0))) {
860 /* Add device to the global and bus/net specific list. */
861 list_add_tail(&rdev->net_list, &net->devices);
862 } else
863 return -1;
865 if (rio_is_switch(rdev)) {
866 next_switchid++;
868 /* Associated destid is how we accessed this switch */
869 rdev->rswitch->destid = destid;
871 num_ports = rio_get_swpinfo_tports(port, destid, hopcount);
872 pr_debug(
873 "RIO: found %s (vid %4.4x did %4.4x) with %d ports\n",
874 rio_name(rdev), rdev->vid, rdev->did, num_ports);
875 for (port_num = 0; port_num < num_ports; port_num++) {
876 if (rio_get_swpinfo_inport(port, destid, hopcount) ==
877 port_num)
878 continue;
880 if (rio_sport_is_active
881 (port, destid, hopcount, port_num)) {
882 pr_debug(
883 "RIO: scanning device on port %d\n",
884 port_num);
886 rio_lock_device(port, destid, hopcount, 1000);
888 for (ndestid = 0;
889 ndestid < RIO_ANY_DESTID(port->sys_size);
890 ndestid++) {
891 rio_route_get_entry(port, rdev->rswitch,
892 RIO_GLOBAL_TABLE,
893 ndestid,
894 &route_port, 0);
895 if (route_port == port_num)
896 break;
899 rio_unlock_device(port, destid, hopcount);
900 if (rio_disc_peer
901 (net, port, ndestid, hopcount + 1) < 0)
902 return -1;
905 } else
906 pr_debug("RIO: found %s (vid %4.4x did %4.4x)\n",
907 rio_name(rdev), rdev->vid, rdev->did);
909 return 0;
913 * rio_mport_is_active- Tests if master port link is active
914 * @port: Master port to test
916 * Reads the port error status CSR for the master port to
917 * determine if the port has an active link. Returns
918 * %PORT_N_ERR_STS_PORT_OK if the master port is active
919 * or %0 if it is inactive.
921 static int rio_mport_is_active(struct rio_mport *port)
923 u32 result = 0;
924 u32 ext_ftr_ptr;
925 int *entry = rio_mport_phys_table;
927 do {
928 if ((ext_ftr_ptr =
929 rio_mport_get_feature(port, 1, 0, 0, *entry)))
930 break;
931 } while (*++entry >= 0);
933 if (ext_ftr_ptr)
934 rio_local_read_config_32(port,
935 ext_ftr_ptr +
936 RIO_PORT_N_ERR_STS_CSR(port->index),
937 &result);
939 return (result & PORT_N_ERR_STS_PORT_OK);
943 * rio_alloc_net- Allocate and configure a new RIO network
944 * @port: Master port associated with the RIO network
946 * Allocates a RIO network structure, initializes per-network
947 * list heads, and adds the associated master port to the
948 * network list of associated master ports. Returns a
949 * RIO network pointer on success or %NULL on failure.
951 static struct rio_net __devinit *rio_alloc_net(struct rio_mport *port)
953 struct rio_net *net;
955 net = kzalloc(sizeof(struct rio_net), GFP_KERNEL);
956 if (net) {
957 INIT_LIST_HEAD(&net->node);
958 INIT_LIST_HEAD(&net->devices);
959 INIT_LIST_HEAD(&net->mports);
960 list_add_tail(&port->nnode, &net->mports);
961 net->hport = port;
962 net->id = next_net++;
964 return net;
968 * rio_update_route_tables- Updates route tables in switches
969 * @port: Master port associated with the RIO network
971 * For each enumerated device, ensure that each switch in a system
972 * has correct routing entries. Add routes for devices that where
973 * unknown dirung the first enumeration pass through the switch.
975 static void rio_update_route_tables(struct rio_mport *port)
977 struct rio_dev *rdev;
978 struct rio_switch *rswitch;
979 u8 sport;
980 u16 destid;
982 list_for_each_entry(rdev, &rio_devices, global_list) {
984 destid = (rio_is_switch(rdev))?rdev->rswitch->destid:rdev->destid;
986 list_for_each_entry(rswitch, &rio_switches, node) {
988 if (rio_is_switch(rdev) && (rdev->rswitch == rswitch))
989 continue;
991 if (RIO_INVALID_ROUTE == rswitch->route_table[destid]) {
992 /* Skip if destid ends in empty switch*/
993 if (rswitch->destid == destid)
994 continue;
996 sport = rio_get_swpinfo_inport(port,
997 rswitch->destid, rswitch->hopcount);
999 if (rswitch->add_entry) {
1000 rio_route_add_entry(port, rswitch,
1001 RIO_GLOBAL_TABLE, destid,
1002 sport, 0);
1003 rswitch->route_table[destid] = sport;
1011 * rio_enum_mport- Start enumeration through a master port
1012 * @mport: Master port to send transactions
1014 * Starts the enumeration process. If somebody has enumerated our
1015 * master port device, then give up. If not and we have an active
1016 * link, then start recursive peer enumeration. Returns %0 if
1017 * enumeration succeeds or %-EBUSY if enumeration fails.
1019 int __devinit rio_enum_mport(struct rio_mport *mport)
1021 struct rio_net *net = NULL;
1022 int rc = 0;
1024 printk(KERN_INFO "RIO: enumerate master port %d, %s\n", mport->id,
1025 mport->name);
1026 /* If somebody else enumerated our master port device, bail. */
1027 if (rio_enum_host(mport) < 0) {
1028 printk(KERN_INFO
1029 "RIO: master port %d device has been enumerated by a remote host\n",
1030 mport->id);
1031 rc = -EBUSY;
1032 goto out;
1035 /* If master port has an active link, allocate net and enum peers */
1036 if (rio_mport_is_active(mport)) {
1037 if (!(net = rio_alloc_net(mport))) {
1038 printk(KERN_ERR "RIO: failed to allocate new net\n");
1039 rc = -ENOMEM;
1040 goto out;
1042 if (rio_enum_peer(net, mport, 0) < 0) {
1043 /* A higher priority host won enumeration, bail. */
1044 printk(KERN_INFO
1045 "RIO: master port %d device has lost enumeration to a remote host\n",
1046 mport->id);
1047 rio_clear_locks(mport);
1048 rc = -EBUSY;
1049 goto out;
1051 rio_update_route_tables(mport);
1052 rio_clear_locks(mport);
1053 } else {
1054 printk(KERN_INFO "RIO: master port %d link inactive\n",
1055 mport->id);
1056 rc = -EINVAL;
1059 out:
1060 return rc;
1064 * rio_build_route_tables- Generate route tables from switch route entries
1066 * For each switch device, generate a route table by copying existing
1067 * route entries from the switch.
1069 static void rio_build_route_tables(void)
1071 struct rio_dev *rdev;
1072 int i;
1073 u8 sport;
1075 list_for_each_entry(rdev, &rio_devices, global_list)
1076 if (rio_is_switch(rdev)) {
1077 rio_lock_device(rdev->net->hport, rdev->rswitch->destid,
1078 rdev->rswitch->hopcount, 1000);
1079 for (i = 0;
1080 i < RIO_MAX_ROUTE_ENTRIES(rdev->net->hport->sys_size);
1081 i++) {
1082 if (rio_route_get_entry
1083 (rdev->net->hport, rdev->rswitch,
1084 RIO_GLOBAL_TABLE, i, &sport, 0) < 0)
1085 continue;
1086 rdev->rswitch->route_table[i] = sport;
1089 rio_unlock_device(rdev->net->hport,
1090 rdev->rswitch->destid,
1091 rdev->rswitch->hopcount);
1096 * rio_enum_timeout- Signal that enumeration timed out
1097 * @data: Address of timeout flag.
1099 * When the enumeration complete timer expires, set a flag that
1100 * signals to the discovery process that enumeration did not
1101 * complete in a sane amount of time.
1103 static void rio_enum_timeout(unsigned long data)
1105 /* Enumeration timed out, set flag */
1106 *(int *)data = 1;
1110 * rio_disc_mport- Start discovery through a master port
1111 * @mport: Master port to send transactions
1113 * Starts the discovery process. If we have an active link,
1114 * then wait for the signal that enumeration is complete.
1115 * When enumeration completion is signaled, start recursive
1116 * peer discovery. Returns %0 if discovery succeeds or %-EBUSY
1117 * on failure.
1119 int __devinit rio_disc_mport(struct rio_mport *mport)
1121 struct rio_net *net = NULL;
1122 int enum_timeout_flag = 0;
1124 printk(KERN_INFO "RIO: discover master port %d, %s\n", mport->id,
1125 mport->name);
1127 /* If master port has an active link, allocate net and discover peers */
1128 if (rio_mport_is_active(mport)) {
1129 if (!(net = rio_alloc_net(mport))) {
1130 printk(KERN_ERR "RIO: Failed to allocate new net\n");
1131 goto bail;
1134 pr_debug("RIO: wait for enumeration complete...");
1136 rio_enum_timer.expires =
1137 jiffies + CONFIG_RAPIDIO_DISC_TIMEOUT * HZ;
1138 rio_enum_timer.data = (unsigned long)&enum_timeout_flag;
1139 add_timer(&rio_enum_timer);
1140 while (!rio_enum_complete(mport)) {
1141 mdelay(1);
1142 if (enum_timeout_flag) {
1143 del_timer_sync(&rio_enum_timer);
1144 goto timeout;
1147 del_timer_sync(&rio_enum_timer);
1149 pr_debug("done\n");
1151 /* Read DestID assigned by enumerator */
1152 rio_local_read_config_32(mport, RIO_DID_CSR,
1153 &mport->host_deviceid);
1154 mport->host_deviceid = RIO_GET_DID(mport->sys_size,
1155 mport->host_deviceid);
1157 if (rio_disc_peer(net, mport, RIO_ANY_DESTID(mport->sys_size),
1158 0) < 0) {
1159 printk(KERN_INFO
1160 "RIO: master port %d device has failed discovery\n",
1161 mport->id);
1162 goto bail;
1165 rio_build_route_tables();
1168 return 0;
1170 timeout:
1171 pr_debug("timeout\n");
1172 bail:
1173 return -EBUSY;