ASoC: soc-compress: Send correct stream event for capture start
[firefly-linux-kernel-4.4.55.git] / drivers / rapidio / rio-scan.c
1 /*
2  * RapidIO enumeration and discovery support
3  *
4  * Copyright 2005 MontaVista Software, Inc.
5  * Matt Porter <mporter@kernel.crashing.org>
6  *
7  * Copyright 2009 Integrated Device Technology, Inc.
8  * Alex Bounine <alexandre.bounine@idt.com>
9  * - Added Port-Write/Error Management initialization and handling
10  *
11  * Copyright 2009 Sysgo AG
12  * Thomas Moll <thomas.moll@sysgo.com>
13  * - Added Input- Output- enable functionality, to allow full communication
14  *
15  * This program is free software; you can redistribute  it and/or modify it
16  * under  the terms of  the GNU General  Public License as published by the
17  * Free Software Foundation;  either version 2 of the  License, or (at your
18  * option) any later version.
19  */
20
21 #include <linux/types.h>
22 #include <linux/kernel.h>
23
24 #include <linux/delay.h>
25 #include <linux/dma-mapping.h>
26 #include <linux/init.h>
27 #include <linux/rio.h>
28 #include <linux/rio_drv.h>
29 #include <linux/rio_ids.h>
30 #include <linux/rio_regs.h>
31 #include <linux/module.h>
32 #include <linux/spinlock.h>
33 #include <linux/timer.h>
34 #include <linux/sched.h>
35 #include <linux/jiffies.h>
36 #include <linux/slab.h>
37
38 #include "rio.h"
39
40 LIST_HEAD(rio_devices);
41
42 static void rio_init_em(struct rio_dev *rdev);
43
44 DEFINE_SPINLOCK(rio_global_list_lock);
45
46 static int next_destid = 0;
47 static int next_comptag = 1;
48
49 static int rio_mport_phys_table[] = {
50         RIO_EFB_PAR_EP_ID,
51         RIO_EFB_PAR_EP_REC_ID,
52         RIO_EFB_SER_EP_ID,
53         RIO_EFB_SER_EP_REC_ID,
54         -1,
55 };
56
57
58 /**
59  * rio_destid_alloc - Allocate next available destID for given network
60  * @net: RIO network
61  *
62  * Returns next available device destination ID for the specified RIO network.
63  * Marks allocated ID as one in use.
64  * Returns RIO_INVALID_DESTID if new destID is not available.
65  */
66 static u16 rio_destid_alloc(struct rio_net *net)
67 {
68         int destid;
69         struct rio_id_table *idtab = &net->destid_table;
70
71         spin_lock(&idtab->lock);
72         destid = find_first_zero_bit(idtab->table, idtab->max);
73
74         if (destid < idtab->max) {
75                 set_bit(destid, idtab->table);
76                 destid += idtab->start;
77         } else
78                 destid = RIO_INVALID_DESTID;
79
80         spin_unlock(&idtab->lock);
81         return (u16)destid;
82 }
83
84 /**
85  * rio_destid_reserve - Reserve the specivied destID
86  * @net: RIO network
87  * @destid: destID to reserve
88  *
89  * Tries to reserve the specified destID.
90  * Returns 0 if successfull.
91  */
92 static int rio_destid_reserve(struct rio_net *net, u16 destid)
93 {
94         int oldbit;
95         struct rio_id_table *idtab = &net->destid_table;
96
97         destid -= idtab->start;
98         spin_lock(&idtab->lock);
99         oldbit = test_and_set_bit(destid, idtab->table);
100         spin_unlock(&idtab->lock);
101         return oldbit;
102 }
103
104 /**
105  * rio_destid_free - free a previously allocated destID
106  * @net: RIO network
107  * @destid: destID to free
108  *
109  * Makes the specified destID available for use.
110  */
111 static void rio_destid_free(struct rio_net *net, u16 destid)
112 {
113         struct rio_id_table *idtab = &net->destid_table;
114
115         destid -= idtab->start;
116         spin_lock(&idtab->lock);
117         clear_bit(destid, idtab->table);
118         spin_unlock(&idtab->lock);
119 }
120
121 /**
122  * rio_destid_first - return first destID in use
123  * @net: RIO network
124  */
125 static u16 rio_destid_first(struct rio_net *net)
126 {
127         int destid;
128         struct rio_id_table *idtab = &net->destid_table;
129
130         spin_lock(&idtab->lock);
131         destid = find_first_bit(idtab->table, idtab->max);
132         if (destid >= idtab->max)
133                 destid = RIO_INVALID_DESTID;
134         else
135                 destid += idtab->start;
136         spin_unlock(&idtab->lock);
137         return (u16)destid;
138 }
139
140 /**
141  * rio_destid_next - return next destID in use
142  * @net: RIO network
143  * @from: destination ID from which search shall continue
144  */
145 static u16 rio_destid_next(struct rio_net *net, u16 from)
146 {
147         int destid;
148         struct rio_id_table *idtab = &net->destid_table;
149
150         spin_lock(&idtab->lock);
151         destid = find_next_bit(idtab->table, idtab->max, from);
152         if (destid >= idtab->max)
153                 destid = RIO_INVALID_DESTID;
154         else
155                 destid += idtab->start;
156         spin_unlock(&idtab->lock);
157         return (u16)destid;
158 }
159
160 /**
161  * rio_get_device_id - Get the base/extended device id for a device
162  * @port: RIO master port
163  * @destid: Destination ID of device
164  * @hopcount: Hopcount to device
165  *
166  * Reads the base/extended device id from a device. Returns the
167  * 8/16-bit device ID.
168  */
169 static u16 rio_get_device_id(struct rio_mport *port, u16 destid, u8 hopcount)
170 {
171         u32 result;
172
173         rio_mport_read_config_32(port, destid, hopcount, RIO_DID_CSR, &result);
174
175         return RIO_GET_DID(port->sys_size, result);
176 }
177
178 /**
179  * rio_set_device_id - Set the base/extended device id for a device
180  * @port: RIO master port
181  * @destid: Destination ID of device
182  * @hopcount: Hopcount to device
183  * @did: Device ID value to be written
184  *
185  * Writes the base/extended device id from a device.
186  */
187 static void rio_set_device_id(struct rio_mport *port, u16 destid, u8 hopcount, u16 did)
188 {
189         rio_mport_write_config_32(port, destid, hopcount, RIO_DID_CSR,
190                                   RIO_SET_DID(port->sys_size, did));
191 }
192
193 /**
194  * rio_local_set_device_id - Set the base/extended device id for a port
195  * @port: RIO master port
196  * @did: Device ID value to be written
197  *
198  * Writes the base/extended device id from a device.
199  */
200 static void rio_local_set_device_id(struct rio_mport *port, u16 did)
201 {
202         rio_local_write_config_32(port, RIO_DID_CSR, RIO_SET_DID(port->sys_size,
203                                 did));
204 }
205
206 /**
207  * rio_clear_locks- Release all host locks and signal enumeration complete
208  * @net: RIO network to run on
209  *
210  * Marks the component tag CSR on each device with the enumeration
211  * complete flag. When complete, it then release the host locks on
212  * each device. Returns 0 on success or %-EINVAL on failure.
213  */
214 static int rio_clear_locks(struct rio_net *net)
215 {
216         struct rio_mport *port = net->hport;
217         struct rio_dev *rdev;
218         u32 result;
219         int ret = 0;
220
221         /* Release host device id locks */
222         rio_local_write_config_32(port, RIO_HOST_DID_LOCK_CSR,
223                                   port->host_deviceid);
224         rio_local_read_config_32(port, RIO_HOST_DID_LOCK_CSR, &result);
225         if ((result & 0xffff) != 0xffff) {
226                 printk(KERN_INFO
227                        "RIO: badness when releasing host lock on master port, result %8.8x\n",
228                        result);
229                 ret = -EINVAL;
230         }
231         list_for_each_entry(rdev, &net->devices, net_list) {
232                 rio_write_config_32(rdev, RIO_HOST_DID_LOCK_CSR,
233                                     port->host_deviceid);
234                 rio_read_config_32(rdev, RIO_HOST_DID_LOCK_CSR, &result);
235                 if ((result & 0xffff) != 0xffff) {
236                         printk(KERN_INFO
237                                "RIO: badness when releasing host lock on vid %4.4x did %4.4x\n",
238                                rdev->vid, rdev->did);
239                         ret = -EINVAL;
240                 }
241
242                 /* Mark device as discovered and enable master */
243                 rio_read_config_32(rdev,
244                                    rdev->phys_efptr + RIO_PORT_GEN_CTL_CSR,
245                                    &result);
246                 result |= RIO_PORT_GEN_DISCOVERED | RIO_PORT_GEN_MASTER;
247                 rio_write_config_32(rdev,
248                                     rdev->phys_efptr + RIO_PORT_GEN_CTL_CSR,
249                                     result);
250         }
251
252         return ret;
253 }
254
255 /**
256  * rio_enum_host- Set host lock and initialize host destination ID
257  * @port: Master port to issue transaction
258  *
259  * Sets the local host master port lock and destination ID register
260  * with the host device ID value. The host device ID value is provided
261  * by the platform. Returns %0 on success or %-1 on failure.
262  */
263 static int rio_enum_host(struct rio_mport *port)
264 {
265         u32 result;
266
267         /* Set master port host device id lock */
268         rio_local_write_config_32(port, RIO_HOST_DID_LOCK_CSR,
269                                   port->host_deviceid);
270
271         rio_local_read_config_32(port, RIO_HOST_DID_LOCK_CSR, &result);
272         if ((result & 0xffff) != port->host_deviceid)
273                 return -1;
274
275         /* Set master port destid and init destid ctr */
276         rio_local_set_device_id(port, port->host_deviceid);
277         return 0;
278 }
279
280 /**
281  * rio_device_has_destid- Test if a device contains a destination ID register
282  * @port: Master port to issue transaction
283  * @src_ops: RIO device source operations
284  * @dst_ops: RIO device destination operations
285  *
286  * Checks the provided @src_ops and @dst_ops for the necessary transaction
287  * capabilities that indicate whether or not a device will implement a
288  * destination ID register. Returns 1 if true or 0 if false.
289  */
290 static int rio_device_has_destid(struct rio_mport *port, int src_ops,
291                                  int dst_ops)
292 {
293         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;
294
295         return !!((src_ops | dst_ops) & mask);
296 }
297
298 /**
299  * rio_release_dev- Frees a RIO device struct
300  * @dev: LDM device associated with a RIO device struct
301  *
302  * Gets the RIO device struct associated a RIO device struct.
303  * The RIO device struct is freed.
304  */
305 static void rio_release_dev(struct device *dev)
306 {
307         struct rio_dev *rdev;
308
309         rdev = to_rio_dev(dev);
310         kfree(rdev);
311 }
312
313 /**
314  * rio_is_switch- Tests if a RIO device has switch capabilities
315  * @rdev: RIO device
316  *
317  * Gets the RIO device Processing Element Features register
318  * contents and tests for switch capabilities. Returns 1 if
319  * the device is a switch or 0 if it is not a switch.
320  * The RIO device struct is freed.
321  */
322 static int rio_is_switch(struct rio_dev *rdev)
323 {
324         if (rdev->pef & RIO_PEF_SWITCH)
325                 return 1;
326         return 0;
327 }
328
329 /**
330  * rio_switch_init - Sets switch operations for a particular vendor switch
331  * @rdev: RIO device
332  * @do_enum: Enumeration/Discovery mode flag
333  *
334  * Searches the RIO switch ops table for known switch types. If the vid
335  * and did match a switch table entry, then call switch initialization
336  * routine to setup switch-specific routines.
337  */
338 static void rio_switch_init(struct rio_dev *rdev, int do_enum)
339 {
340         struct rio_switch_ops *cur = __start_rio_switch_ops;
341         struct rio_switch_ops *end = __end_rio_switch_ops;
342
343         while (cur < end) {
344                 if ((cur->vid == rdev->vid) && (cur->did == rdev->did)) {
345                         pr_debug("RIO: calling init routine for %s\n",
346                                  rio_name(rdev));
347                         cur->init_hook(rdev, do_enum);
348                         break;
349                 }
350                 cur++;
351         }
352
353         if ((cur >= end) && (rdev->pef & RIO_PEF_STD_RT)) {
354                 pr_debug("RIO: adding STD routing ops for %s\n",
355                         rio_name(rdev));
356                 rdev->rswitch->add_entry = rio_std_route_add_entry;
357                 rdev->rswitch->get_entry = rio_std_route_get_entry;
358                 rdev->rswitch->clr_table = rio_std_route_clr_table;
359         }
360
361         if (!rdev->rswitch->add_entry || !rdev->rswitch->get_entry)
362                 printk(KERN_ERR "RIO: missing routing ops for %s\n",
363                        rio_name(rdev));
364 }
365
366 /**
367  * rio_add_device- Adds a RIO device to the device model
368  * @rdev: RIO device
369  *
370  * Adds the RIO device to the global device list and adds the RIO
371  * device to the RIO device list.  Creates the generic sysfs nodes
372  * for an RIO device.
373  */
374 static int rio_add_device(struct rio_dev *rdev)
375 {
376         int err;
377
378         err = device_add(&rdev->dev);
379         if (err)
380                 return err;
381
382         spin_lock(&rio_global_list_lock);
383         list_add_tail(&rdev->global_list, &rio_devices);
384         spin_unlock(&rio_global_list_lock);
385
386         rio_create_sysfs_dev_files(rdev);
387
388         return 0;
389 }
390
391 /**
392  * rio_enable_rx_tx_port - enable input receiver and output transmitter of
393  * given port
394  * @port: Master port associated with the RIO network
395  * @local: local=1 select local port otherwise a far device is reached
396  * @destid: Destination ID of the device to check host bit
397  * @hopcount: Number of hops to reach the target
398  * @port_num: Port (-number on switch) to enable on a far end device
399  *
400  * Returns 0 or 1 from on General Control Command and Status Register
401  * (EXT_PTR+0x3C)
402  */
403 inline int rio_enable_rx_tx_port(struct rio_mport *port,
404                                  int local, u16 destid,
405                                  u8 hopcount, u8 port_num) {
406 #ifdef CONFIG_RAPIDIO_ENABLE_RX_TX_PORTS
407         u32 regval;
408         u32 ext_ftr_ptr;
409
410         /*
411         * enable rx input tx output port
412         */
413         pr_debug("rio_enable_rx_tx_port(local = %d, destid = %d, hopcount = "
414                  "%d, port_num = %d)\n", local, destid, hopcount, port_num);
415
416         ext_ftr_ptr = rio_mport_get_physefb(port, local, destid, hopcount);
417
418         if (local) {
419                 rio_local_read_config_32(port, ext_ftr_ptr +
420                                 RIO_PORT_N_CTL_CSR(0),
421                                 &regval);
422         } else {
423                 if (rio_mport_read_config_32(port, destid, hopcount,
424                 ext_ftr_ptr + RIO_PORT_N_CTL_CSR(port_num), &regval) < 0)
425                         return -EIO;
426         }
427
428         if (regval & RIO_PORT_N_CTL_P_TYP_SER) {
429                 /* serial */
430                 regval = regval | RIO_PORT_N_CTL_EN_RX_SER
431                                 | RIO_PORT_N_CTL_EN_TX_SER;
432         } else {
433                 /* parallel */
434                 regval = regval | RIO_PORT_N_CTL_EN_RX_PAR
435                                 | RIO_PORT_N_CTL_EN_TX_PAR;
436         }
437
438         if (local) {
439                 rio_local_write_config_32(port, ext_ftr_ptr +
440                                           RIO_PORT_N_CTL_CSR(0), regval);
441         } else {
442                 if (rio_mport_write_config_32(port, destid, hopcount,
443                     ext_ftr_ptr + RIO_PORT_N_CTL_CSR(port_num), regval) < 0)
444                         return -EIO;
445         }
446 #endif
447         return 0;
448 }
449
450 /**
451  * rio_setup_device- Allocates and sets up a RIO device
452  * @net: RIO network
453  * @port: Master port to send transactions
454  * @destid: Current destination ID
455  * @hopcount: Current hopcount
456  * @do_enum: Enumeration/Discovery mode flag
457  *
458  * Allocates a RIO device and configures fields based on configuration
459  * space contents. If device has a destination ID register, a destination
460  * ID is either assigned in enumeration mode or read from configuration
461  * space in discovery mode.  If the device has switch capabilities, then
462  * a switch is allocated and configured appropriately. Returns a pointer
463  * to a RIO device on success or NULL on failure.
464  *
465  */
466 static struct rio_dev *rio_setup_device(struct rio_net *net,
467                                         struct rio_mport *port, u16 destid,
468                                         u8 hopcount, int do_enum)
469 {
470         int ret = 0;
471         struct rio_dev *rdev;
472         struct rio_switch *rswitch = NULL;
473         int result, rdid;
474         size_t size;
475         u32 swpinfo = 0;
476
477         size = sizeof(struct rio_dev);
478         if (rio_mport_read_config_32(port, destid, hopcount,
479                                      RIO_PEF_CAR, &result))
480                 return NULL;
481
482         if (result & (RIO_PEF_SWITCH | RIO_PEF_MULTIPORT)) {
483                 rio_mport_read_config_32(port, destid, hopcount,
484                                          RIO_SWP_INFO_CAR, &swpinfo);
485                 if (result & RIO_PEF_SWITCH) {
486                         size += (RIO_GET_TOTAL_PORTS(swpinfo) *
487                                 sizeof(rswitch->nextdev[0])) + sizeof(*rswitch);
488                 }
489         }
490
491         rdev = kzalloc(size, GFP_KERNEL);
492         if (!rdev)
493                 return NULL;
494
495         rdev->net = net;
496         rdev->pef = result;
497         rdev->swpinfo = swpinfo;
498         rio_mport_read_config_32(port, destid, hopcount, RIO_DEV_ID_CAR,
499                                  &result);
500         rdev->did = result >> 16;
501         rdev->vid = result & 0xffff;
502         rio_mport_read_config_32(port, destid, hopcount, RIO_DEV_INFO_CAR,
503                                  &rdev->device_rev);
504         rio_mport_read_config_32(port, destid, hopcount, RIO_ASM_ID_CAR,
505                                  &result);
506         rdev->asm_did = result >> 16;
507         rdev->asm_vid = result & 0xffff;
508         rio_mport_read_config_32(port, destid, hopcount, RIO_ASM_INFO_CAR,
509                                  &result);
510         rdev->asm_rev = result >> 16;
511         if (rdev->pef & RIO_PEF_EXT_FEATURES) {
512                 rdev->efptr = result & 0xffff;
513                 rdev->phys_efptr = rio_mport_get_physefb(port, 0, destid,
514                                                          hopcount);
515
516                 rdev->em_efptr = rio_mport_get_feature(port, 0, destid,
517                                                 hopcount, RIO_EFB_ERR_MGMNT);
518         }
519
520         rio_mport_read_config_32(port, destid, hopcount, RIO_SRC_OPS_CAR,
521                                  &rdev->src_ops);
522         rio_mport_read_config_32(port, destid, hopcount, RIO_DST_OPS_CAR,
523                                  &rdev->dst_ops);
524
525         if (do_enum) {
526                 /* Assign component tag to device */
527                 if (next_comptag >= 0x10000) {
528                         pr_err("RIO: Component Tag Counter Overflow\n");
529                         goto cleanup;
530                 }
531                 rio_mport_write_config_32(port, destid, hopcount,
532                                           RIO_COMPONENT_TAG_CSR, next_comptag);
533                 rdev->comp_tag = next_comptag++;
534         }  else {
535                 rio_mport_read_config_32(port, destid, hopcount,
536                                          RIO_COMPONENT_TAG_CSR,
537                                          &rdev->comp_tag);
538         }
539
540         if (rio_device_has_destid(port, rdev->src_ops, rdev->dst_ops)) {
541                 if (do_enum) {
542                         rio_set_device_id(port, destid, hopcount, next_destid);
543                         rdev->destid = next_destid;
544                         next_destid = rio_destid_alloc(net);
545                 } else
546                         rdev->destid = rio_get_device_id(port, destid, hopcount);
547
548                 rdev->hopcount = 0xff;
549         } else {
550                 /* Switch device has an associated destID which
551                  * will be adjusted later
552                  */
553                 rdev->destid = destid;
554                 rdev->hopcount = hopcount;
555         }
556
557         /* If a PE has both switch and other functions, show it as a switch */
558         if (rio_is_switch(rdev)) {
559                 rswitch = rdev->rswitch;
560                 rswitch->switchid = rdev->comp_tag & RIO_CTAG_UDEVID;
561                 rswitch->port_ok = 0;
562                 rswitch->route_table = kzalloc(sizeof(u8)*
563                                         RIO_MAX_ROUTE_ENTRIES(port->sys_size),
564                                         GFP_KERNEL);
565                 if (!rswitch->route_table)
566                         goto cleanup;
567                 /* Initialize switch route table */
568                 for (rdid = 0; rdid < RIO_MAX_ROUTE_ENTRIES(port->sys_size);
569                                 rdid++)
570                         rswitch->route_table[rdid] = RIO_INVALID_ROUTE;
571                 dev_set_name(&rdev->dev, "%02x:s:%04x", rdev->net->id,
572                              rswitch->switchid);
573                 rio_switch_init(rdev, do_enum);
574
575                 if (do_enum && rswitch->clr_table)
576                         rswitch->clr_table(port, destid, hopcount,
577                                            RIO_GLOBAL_TABLE);
578
579                 list_add_tail(&rswitch->node, &net->switches);
580
581         } else {
582                 if (do_enum)
583                         /*Enable Input Output Port (transmitter reviever)*/
584                         rio_enable_rx_tx_port(port, 0, destid, hopcount, 0);
585
586                 dev_set_name(&rdev->dev, "%02x:e:%04x", rdev->net->id,
587                              rdev->destid);
588         }
589
590         rdev->dev.bus = &rio_bus_type;
591         rdev->dev.parent = &rio_bus;
592
593         device_initialize(&rdev->dev);
594         rdev->dev.release = rio_release_dev;
595         rio_dev_get(rdev);
596
597         rdev->dma_mask = DMA_BIT_MASK(32);
598         rdev->dev.dma_mask = &rdev->dma_mask;
599         rdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
600
601         if (rdev->dst_ops & RIO_DST_OPS_DOORBELL)
602                 rio_init_dbell_res(&rdev->riores[RIO_DOORBELL_RESOURCE],
603                                    0, 0xffff);
604
605         ret = rio_add_device(rdev);
606         if (ret)
607                 goto cleanup;
608
609         return rdev;
610
611 cleanup:
612         if (rswitch)
613                 kfree(rswitch->route_table);
614
615         kfree(rdev);
616         return NULL;
617 }
618
619 /**
620  * rio_sport_is_active- Tests if a switch port has an active connection.
621  * @port: Master port to send transaction
622  * @destid: Associated destination ID for switch
623  * @hopcount: Hopcount to reach switch
624  * @sport: Switch port number
625  *
626  * Reads the port error status CSR for a particular switch port to
627  * determine if the port has an active link.  Returns
628  * %RIO_PORT_N_ERR_STS_PORT_OK if the port is active or %0 if it is
629  * inactive.
630  */
631 static int
632 rio_sport_is_active(struct rio_mport *port, u16 destid, u8 hopcount, int sport)
633 {
634         u32 result = 0;
635         u32 ext_ftr_ptr;
636
637         ext_ftr_ptr = rio_mport_get_efb(port, 0, destid, hopcount, 0);
638
639         while (ext_ftr_ptr) {
640                 rio_mport_read_config_32(port, destid, hopcount,
641                                          ext_ftr_ptr, &result);
642                 result = RIO_GET_BLOCK_ID(result);
643                 if ((result == RIO_EFB_SER_EP_FREE_ID) ||
644                     (result == RIO_EFB_SER_EP_FREE_ID_V13P) ||
645                     (result == RIO_EFB_SER_EP_FREC_ID))
646                         break;
647
648                 ext_ftr_ptr = rio_mport_get_efb(port, 0, destid, hopcount,
649                                                 ext_ftr_ptr);
650         }
651
652         if (ext_ftr_ptr)
653                 rio_mport_read_config_32(port, destid, hopcount,
654                                          ext_ftr_ptr +
655                                          RIO_PORT_N_ERR_STS_CSR(sport),
656                                          &result);
657
658         return result & RIO_PORT_N_ERR_STS_PORT_OK;
659 }
660
661 /**
662  * rio_lock_device - Acquires host device lock for specified device
663  * @port: Master port to send transaction
664  * @destid: Destination ID for device/switch
665  * @hopcount: Hopcount to reach switch
666  * @wait_ms: Max wait time in msec (0 = no timeout)
667  *
668  * Attepts to acquire host device lock for specified device
669  * Returns 0 if device lock acquired or EINVAL if timeout expires.
670  */
671 static int
672 rio_lock_device(struct rio_mport *port, u16 destid, u8 hopcount, int wait_ms)
673 {
674         u32 result;
675         int tcnt = 0;
676
677         /* Attempt to acquire device lock */
678         rio_mport_write_config_32(port, destid, hopcount,
679                                   RIO_HOST_DID_LOCK_CSR, port->host_deviceid);
680         rio_mport_read_config_32(port, destid, hopcount,
681                                  RIO_HOST_DID_LOCK_CSR, &result);
682
683         while (result != port->host_deviceid) {
684                 if (wait_ms != 0 && tcnt == wait_ms) {
685                         pr_debug("RIO: timeout when locking device %x:%x\n",
686                                 destid, hopcount);
687                         return -EINVAL;
688                 }
689
690                 /* Delay a bit */
691                 mdelay(1);
692                 tcnt++;
693                 /* Try to acquire device lock again */
694                 rio_mport_write_config_32(port, destid,
695                         hopcount,
696                         RIO_HOST_DID_LOCK_CSR,
697                         port->host_deviceid);
698                 rio_mport_read_config_32(port, destid,
699                         hopcount,
700                         RIO_HOST_DID_LOCK_CSR, &result);
701         }
702
703         return 0;
704 }
705
706 /**
707  * rio_unlock_device - Releases host device lock for specified device
708  * @port: Master port to send transaction
709  * @destid: Destination ID for device/switch
710  * @hopcount: Hopcount to reach switch
711  *
712  * Returns 0 if device lock released or EINVAL if fails.
713  */
714 static int
715 rio_unlock_device(struct rio_mport *port, u16 destid, u8 hopcount)
716 {
717         u32 result;
718
719         /* Release device lock */
720         rio_mport_write_config_32(port, destid,
721                                   hopcount,
722                                   RIO_HOST_DID_LOCK_CSR,
723                                   port->host_deviceid);
724         rio_mport_read_config_32(port, destid, hopcount,
725                 RIO_HOST_DID_LOCK_CSR, &result);
726         if ((result & 0xffff) != 0xffff) {
727                 pr_debug("RIO: badness when releasing device lock %x:%x\n",
728                          destid, hopcount);
729                 return -EINVAL;
730         }
731
732         return 0;
733 }
734
735 /**
736  * rio_route_add_entry- Add a route entry to a switch routing table
737  * @rdev: RIO device
738  * @table: Routing table ID
739  * @route_destid: Destination ID to be routed
740  * @route_port: Port number to be routed
741  * @lock: lock switch device flag
742  *
743  * Calls the switch specific add_entry() method to add a route entry
744  * on a switch. The route table can be specified using the @table
745  * argument if a switch has per port routing tables or the normal
746  * use is to specific all tables (or the global table) by passing
747  * %RIO_GLOBAL_TABLE in @table. Returns %0 on success or %-EINVAL
748  * on failure.
749  */
750 static int
751 rio_route_add_entry(struct rio_dev *rdev,
752                     u16 table, u16 route_destid, u8 route_port, int lock)
753 {
754         int rc;
755
756         if (lock) {
757                 rc = rio_lock_device(rdev->net->hport, rdev->destid,
758                                      rdev->hopcount, 1000);
759                 if (rc)
760                         return rc;
761         }
762
763         rc = rdev->rswitch->add_entry(rdev->net->hport, rdev->destid,
764                                       rdev->hopcount, table,
765                                       route_destid, route_port);
766         if (lock)
767                 rio_unlock_device(rdev->net->hport, rdev->destid,
768                                   rdev->hopcount);
769
770         return rc;
771 }
772
773 /**
774  * rio_route_get_entry- Read a route entry in a switch routing table
775  * @rdev: RIO device
776  * @table: Routing table ID
777  * @route_destid: Destination ID to be routed
778  * @route_port: Pointer to read port number into
779  * @lock: lock switch device flag
780  *
781  * Calls the switch specific get_entry() method to read a route entry
782  * in a switch. The route table can be specified using the @table
783  * argument if a switch has per port routing tables or the normal
784  * use is to specific all tables (or the global table) by passing
785  * %RIO_GLOBAL_TABLE in @table. Returns %0 on success or %-EINVAL
786  * on failure.
787  */
788 static int
789 rio_route_get_entry(struct rio_dev *rdev, u16 table,
790                     u16 route_destid, u8 *route_port, int lock)
791 {
792         int rc;
793
794         if (lock) {
795                 rc = rio_lock_device(rdev->net->hport, rdev->destid,
796                                      rdev->hopcount, 1000);
797                 if (rc)
798                         return rc;
799         }
800
801         rc = rdev->rswitch->get_entry(rdev->net->hport, rdev->destid,
802                                       rdev->hopcount, table,
803                                       route_destid, route_port);
804         if (lock)
805                 rio_unlock_device(rdev->net->hport, rdev->destid,
806                                   rdev->hopcount);
807
808         return rc;
809 }
810
811 /**
812  * rio_get_host_deviceid_lock- Reads the Host Device ID Lock CSR on a device
813  * @port: Master port to send transaction
814  * @hopcount: Number of hops to the device
815  *
816  * Used during enumeration to read the Host Device ID Lock CSR on a
817  * RIO device. Returns the value of the lock register.
818  */
819 static u16 rio_get_host_deviceid_lock(struct rio_mport *port, u8 hopcount)
820 {
821         u32 result;
822
823         rio_mport_read_config_32(port, RIO_ANY_DESTID(port->sys_size), hopcount,
824                                  RIO_HOST_DID_LOCK_CSR, &result);
825
826         return (u16) (result & 0xffff);
827 }
828
829 /**
830  * rio_enum_peer- Recursively enumerate a RIO network through a master port
831  * @net: RIO network being enumerated
832  * @port: Master port to send transactions
833  * @hopcount: Number of hops into the network
834  * @prev: Previous RIO device connected to the enumerated one
835  * @prev_port: Port on previous RIO device
836  *
837  * Recursively enumerates a RIO network.  Transactions are sent via the
838  * master port passed in @port.
839  */
840 static int rio_enum_peer(struct rio_net *net, struct rio_mport *port,
841                          u8 hopcount, struct rio_dev *prev, int prev_port)
842 {
843         struct rio_dev *rdev;
844         u32 regval;
845         int tmp;
846
847         if (rio_mport_chk_dev_access(port,
848                         RIO_ANY_DESTID(port->sys_size), hopcount)) {
849                 pr_debug("RIO: device access check failed\n");
850                 return -1;
851         }
852
853         if (rio_get_host_deviceid_lock(port, hopcount) == port->host_deviceid) {
854                 pr_debug("RIO: PE already discovered by this host\n");
855                 /*
856                  * Already discovered by this host. Add it as another
857                  * link to the existing device.
858                  */
859                 rio_mport_read_config_32(port, RIO_ANY_DESTID(port->sys_size),
860                                 hopcount, RIO_COMPONENT_TAG_CSR, &regval);
861
862                 if (regval) {
863                         rdev = rio_get_comptag((regval & 0xffff), NULL);
864
865                         if (rdev && prev && rio_is_switch(prev)) {
866                                 pr_debug("RIO: redundant path to %s\n",
867                                          rio_name(rdev));
868                                 prev->rswitch->nextdev[prev_port] = rdev;
869                         }
870                 }
871
872                 return 0;
873         }
874
875         /* Attempt to acquire device lock */
876         rio_mport_write_config_32(port, RIO_ANY_DESTID(port->sys_size),
877                                   hopcount,
878                                   RIO_HOST_DID_LOCK_CSR, port->host_deviceid);
879         while ((tmp = rio_get_host_deviceid_lock(port, hopcount))
880                < port->host_deviceid) {
881                 /* Delay a bit */
882                 mdelay(1);
883                 /* Attempt to acquire device lock again */
884                 rio_mport_write_config_32(port, RIO_ANY_DESTID(port->sys_size),
885                                           hopcount,
886                                           RIO_HOST_DID_LOCK_CSR,
887                                           port->host_deviceid);
888         }
889
890         if (rio_get_host_deviceid_lock(port, hopcount) > port->host_deviceid) {
891                 pr_debug(
892                     "RIO: PE locked by a higher priority host...retreating\n");
893                 return -1;
894         }
895
896         /* Setup new RIO device */
897         rdev = rio_setup_device(net, port, RIO_ANY_DESTID(port->sys_size),
898                                         hopcount, 1);
899         if (rdev) {
900                 /* Add device to the global and bus/net specific list. */
901                 list_add_tail(&rdev->net_list, &net->devices);
902                 rdev->prev = prev;
903                 if (prev && rio_is_switch(prev))
904                         prev->rswitch->nextdev[prev_port] = rdev;
905         } else
906                 return -1;
907
908         if (rio_is_switch(rdev)) {
909                 int sw_destid;
910                 int cur_destid;
911                 int sw_inport;
912                 u16 destid;
913                 int port_num;
914
915                 sw_inport = RIO_GET_PORT_NUM(rdev->swpinfo);
916                 rio_route_add_entry(rdev, RIO_GLOBAL_TABLE,
917                                     port->host_deviceid, sw_inport, 0);
918                 rdev->rswitch->route_table[port->host_deviceid] = sw_inport;
919
920                 destid = rio_destid_first(net);
921                 while (destid != RIO_INVALID_DESTID && destid < next_destid) {
922                         if (destid != port->host_deviceid) {
923                                 rio_route_add_entry(rdev, RIO_GLOBAL_TABLE,
924                                                     destid, sw_inport, 0);
925                                 rdev->rswitch->route_table[destid] = sw_inport;
926                         }
927                         destid = rio_destid_next(net, destid + 1);
928                 }
929                 pr_debug(
930                     "RIO: found %s (vid %4.4x did %4.4x) with %d ports\n",
931                     rio_name(rdev), rdev->vid, rdev->did,
932                     RIO_GET_TOTAL_PORTS(rdev->swpinfo));
933                 sw_destid = next_destid;
934                 for (port_num = 0;
935                      port_num < RIO_GET_TOTAL_PORTS(rdev->swpinfo);
936                      port_num++) {
937                         if (sw_inport == port_num) {
938                                 rio_enable_rx_tx_port(port, 0,
939                                               RIO_ANY_DESTID(port->sys_size),
940                                               hopcount, port_num);
941                                 rdev->rswitch->port_ok |= (1 << port_num);
942                                 continue;
943                         }
944
945                         cur_destid = next_destid;
946
947                         if (rio_sport_is_active
948                             (port, RIO_ANY_DESTID(port->sys_size), hopcount,
949                              port_num)) {
950                                 pr_debug(
951                                     "RIO: scanning device on port %d\n",
952                                     port_num);
953                                 rio_enable_rx_tx_port(port, 0,
954                                               RIO_ANY_DESTID(port->sys_size),
955                                               hopcount, port_num);
956                                 rdev->rswitch->port_ok |= (1 << port_num);
957                                 rio_route_add_entry(rdev, RIO_GLOBAL_TABLE,
958                                                 RIO_ANY_DESTID(port->sys_size),
959                                                 port_num, 0);
960
961                                 if (rio_enum_peer(net, port, hopcount + 1,
962                                                   rdev, port_num) < 0)
963                                         return -1;
964
965                                 /* Update routing tables */
966                                 destid = rio_destid_next(net, cur_destid + 1);
967                                 if (destid != RIO_INVALID_DESTID) {
968                                         for (destid = cur_destid;
969                                              destid < next_destid;) {
970                                                 if (destid != port->host_deviceid) {
971                                                         rio_route_add_entry(rdev,
972                                                                     RIO_GLOBAL_TABLE,
973                                                                     destid,
974                                                                     port_num,
975                                                                     0);
976                                                         rdev->rswitch->
977                                                                 route_table[destid] =
978                                                                 port_num;
979                                                 }
980                                                 destid = rio_destid_next(net,
981                                                                 destid + 1);
982                                         }
983                                 }
984                         } else {
985                                 /* If switch supports Error Management,
986                                  * set PORT_LOCKOUT bit for unused port
987                                  */
988                                 if (rdev->em_efptr)
989                                         rio_set_port_lockout(rdev, port_num, 1);
990
991                                 rdev->rswitch->port_ok &= ~(1 << port_num);
992                         }
993                 }
994
995                 /* Direct Port-write messages to the enumeratiing host */
996                 if ((rdev->src_ops & RIO_SRC_OPS_PORT_WRITE) &&
997                     (rdev->em_efptr)) {
998                         rio_write_config_32(rdev,
999                                         rdev->em_efptr + RIO_EM_PW_TGT_DEVID,
1000                                         (port->host_deviceid << 16) |
1001                                         (port->sys_size << 15));
1002                 }
1003
1004                 rio_init_em(rdev);
1005
1006                 /* Check for empty switch */
1007                 if (next_destid == sw_destid)
1008                         next_destid = rio_destid_alloc(net);
1009
1010                 rdev->destid = sw_destid;
1011         } else
1012                 pr_debug("RIO: found %s (vid %4.4x did %4.4x)\n",
1013                     rio_name(rdev), rdev->vid, rdev->did);
1014
1015         return 0;
1016 }
1017
1018 /**
1019  * rio_enum_complete- Tests if enumeration of a network is complete
1020  * @port: Master port to send transaction
1021  *
1022  * Tests the PGCCSR discovered bit for non-zero value (enumeration
1023  * complete flag). Return %1 if enumeration is complete or %0 if
1024  * enumeration is incomplete.
1025  */
1026 static int rio_enum_complete(struct rio_mport *port)
1027 {
1028         u32 regval;
1029
1030         rio_local_read_config_32(port, port->phys_efptr + RIO_PORT_GEN_CTL_CSR,
1031                                  &regval);
1032         return (regval & RIO_PORT_GEN_DISCOVERED) ? 1 : 0;
1033 }
1034
1035 /**
1036  * rio_disc_peer- Recursively discovers a RIO network through a master port
1037  * @net: RIO network being discovered
1038  * @port: Master port to send transactions
1039  * @destid: Current destination ID in network
1040  * @hopcount: Number of hops into the network
1041  * @prev: previous rio_dev
1042  * @prev_port: previous port number
1043  *
1044  * Recursively discovers a RIO network.  Transactions are sent via the
1045  * master port passed in @port.
1046  */
1047 static int
1048 rio_disc_peer(struct rio_net *net, struct rio_mport *port, u16 destid,
1049               u8 hopcount, struct rio_dev *prev, int prev_port)
1050 {
1051         u8 port_num, route_port;
1052         struct rio_dev *rdev;
1053         u16 ndestid;
1054
1055         /* Setup new RIO device */
1056         if ((rdev = rio_setup_device(net, port, destid, hopcount, 0))) {
1057                 /* Add device to the global and bus/net specific list. */
1058                 list_add_tail(&rdev->net_list, &net->devices);
1059                 rdev->prev = prev;
1060                 if (prev && rio_is_switch(prev))
1061                         prev->rswitch->nextdev[prev_port] = rdev;
1062         } else
1063                 return -1;
1064
1065         if (rio_is_switch(rdev)) {
1066                 /* Associated destid is how we accessed this switch */
1067                 rdev->destid = destid;
1068
1069                 pr_debug(
1070                     "RIO: found %s (vid %4.4x did %4.4x) with %d ports\n",
1071                     rio_name(rdev), rdev->vid, rdev->did,
1072                     RIO_GET_TOTAL_PORTS(rdev->swpinfo));
1073                 for (port_num = 0;
1074                      port_num < RIO_GET_TOTAL_PORTS(rdev->swpinfo);
1075                      port_num++) {
1076                         if (RIO_GET_PORT_NUM(rdev->swpinfo) == port_num)
1077                                 continue;
1078
1079                         if (rio_sport_is_active
1080                             (port, destid, hopcount, port_num)) {
1081                                 pr_debug(
1082                                     "RIO: scanning device on port %d\n",
1083                                     port_num);
1084
1085                                 rio_lock_device(port, destid, hopcount, 1000);
1086
1087                                 for (ndestid = 0;
1088                                      ndestid < RIO_ANY_DESTID(port->sys_size);
1089                                      ndestid++) {
1090                                         rio_route_get_entry(rdev,
1091                                                             RIO_GLOBAL_TABLE,
1092                                                             ndestid,
1093                                                             &route_port, 0);
1094                                         if (route_port == port_num)
1095                                                 break;
1096                                 }
1097
1098                                 if (ndestid == RIO_ANY_DESTID(port->sys_size))
1099                                         continue;
1100                                 rio_unlock_device(port, destid, hopcount);
1101                                 if (rio_disc_peer(net, port, ndestid,
1102                                         hopcount + 1, rdev, port_num) < 0)
1103                                         return -1;
1104                         }
1105                 }
1106         } else
1107                 pr_debug("RIO: found %s (vid %4.4x did %4.4x)\n",
1108                     rio_name(rdev), rdev->vid, rdev->did);
1109
1110         return 0;
1111 }
1112
1113 /**
1114  * rio_mport_is_active- Tests if master port link is active
1115  * @port: Master port to test
1116  *
1117  * Reads the port error status CSR for the master port to
1118  * determine if the port has an active link.  Returns
1119  * %RIO_PORT_N_ERR_STS_PORT_OK if the  master port is active
1120  * or %0 if it is inactive.
1121  */
1122 static int rio_mport_is_active(struct rio_mport *port)
1123 {
1124         u32 result = 0;
1125         u32 ext_ftr_ptr;
1126         int *entry = rio_mport_phys_table;
1127
1128         do {
1129                 if ((ext_ftr_ptr =
1130                      rio_mport_get_feature(port, 1, 0, 0, *entry)))
1131                         break;
1132         } while (*++entry >= 0);
1133
1134         if (ext_ftr_ptr)
1135                 rio_local_read_config_32(port,
1136                                          ext_ftr_ptr +
1137                                          RIO_PORT_N_ERR_STS_CSR(port->index),
1138                                          &result);
1139
1140         return result & RIO_PORT_N_ERR_STS_PORT_OK;
1141 }
1142
1143 /**
1144  * rio_alloc_net- Allocate and configure a new RIO network
1145  * @port: Master port associated with the RIO network
1146  * @do_enum: Enumeration/Discovery mode flag
1147  * @start: logical minimal start id for new net
1148  *
1149  * Allocates a RIO network structure, initializes per-network
1150  * list heads, and adds the associated master port to the
1151  * network list of associated master ports. Returns a
1152  * RIO network pointer on success or %NULL on failure.
1153  */
1154 static struct rio_net *rio_alloc_net(struct rio_mport *port,
1155                                                int do_enum, u16 start)
1156 {
1157         struct rio_net *net;
1158
1159         net = kzalloc(sizeof(struct rio_net), GFP_KERNEL);
1160         if (net && do_enum) {
1161                 net->destid_table.table = kcalloc(
1162                         BITS_TO_LONGS(RIO_MAX_ROUTE_ENTRIES(port->sys_size)),
1163                         sizeof(long),
1164                         GFP_KERNEL);
1165
1166                 if (net->destid_table.table == NULL) {
1167                         pr_err("RIO: failed to allocate destID table\n");
1168                         kfree(net);
1169                         net = NULL;
1170                 } else {
1171                         net->destid_table.start = start;
1172                         net->destid_table.max =
1173                                         RIO_MAX_ROUTE_ENTRIES(port->sys_size);
1174                         spin_lock_init(&net->destid_table.lock);
1175                 }
1176         }
1177
1178         if (net) {
1179                 INIT_LIST_HEAD(&net->node);
1180                 INIT_LIST_HEAD(&net->devices);
1181                 INIT_LIST_HEAD(&net->switches);
1182                 INIT_LIST_HEAD(&net->mports);
1183                 list_add_tail(&port->nnode, &net->mports);
1184                 net->hport = port;
1185                 net->id = port->id;
1186         }
1187         return net;
1188 }
1189
1190 /**
1191  * rio_update_route_tables- Updates route tables in switches
1192  * @net: RIO network to run update on
1193  *
1194  * For each enumerated device, ensure that each switch in a system
1195  * has correct routing entries. Add routes for devices that where
1196  * unknown dirung the first enumeration pass through the switch.
1197  */
1198 static void rio_update_route_tables(struct rio_net *net)
1199 {
1200         struct rio_dev *rdev, *swrdev;
1201         struct rio_switch *rswitch;
1202         u8 sport;
1203         u16 destid;
1204
1205         list_for_each_entry(rdev, &net->devices, net_list) {
1206
1207                 destid = rdev->destid;
1208
1209                 list_for_each_entry(rswitch, &net->switches, node) {
1210
1211                         if (rio_is_switch(rdev) && (rdev->rswitch == rswitch))
1212                                 continue;
1213
1214                         if (RIO_INVALID_ROUTE == rswitch->route_table[destid]) {
1215                                 swrdev = sw_to_rio_dev(rswitch);
1216
1217                                 /* Skip if destid ends in empty switch*/
1218                                 if (swrdev->destid == destid)
1219                                         continue;
1220
1221                                 sport = RIO_GET_PORT_NUM(swrdev->swpinfo);
1222
1223                                 if (rswitch->add_entry) {
1224                                         rio_route_add_entry(swrdev,
1225                                                 RIO_GLOBAL_TABLE, destid,
1226                                                 sport, 0);
1227                                         rswitch->route_table[destid] = sport;
1228                                 }
1229                         }
1230                 }
1231         }
1232 }
1233
1234 /**
1235  * rio_init_em - Initializes RIO Error Management (for switches)
1236  * @rdev: RIO device
1237  *
1238  * For each enumerated switch, call device-specific error management
1239  * initialization routine (if supplied by the switch driver).
1240  */
1241 static void rio_init_em(struct rio_dev *rdev)
1242 {
1243         if (rio_is_switch(rdev) && (rdev->em_efptr) &&
1244             (rdev->rswitch->em_init)) {
1245                 rdev->rswitch->em_init(rdev);
1246         }
1247 }
1248
1249 /**
1250  * rio_pw_enable - Enables/disables port-write handling by a master port
1251  * @port: Master port associated with port-write handling
1252  * @enable:  1=enable,  0=disable
1253  */
1254 static void rio_pw_enable(struct rio_mport *port, int enable)
1255 {
1256         if (port->ops->pwenable)
1257                 port->ops->pwenable(port, enable);
1258 }
1259
1260 /**
1261  * rio_enum_mport- Start enumeration through a master port
1262  * @mport: Master port to send transactions
1263  *
1264  * Starts the enumeration process. If somebody has enumerated our
1265  * master port device, then give up. If not and we have an active
1266  * link, then start recursive peer enumeration. Returns %0 if
1267  * enumeration succeeds or %-EBUSY if enumeration fails.
1268  */
1269 int rio_enum_mport(struct rio_mport *mport)
1270 {
1271         struct rio_net *net = NULL;
1272         int rc = 0;
1273
1274         printk(KERN_INFO "RIO: enumerate master port %d, %s\n", mport->id,
1275                mport->name);
1276         /* If somebody else enumerated our master port device, bail. */
1277         if (rio_enum_host(mport) < 0) {
1278                 printk(KERN_INFO
1279                        "RIO: master port %d device has been enumerated by a remote host\n",
1280                        mport->id);
1281                 rc = -EBUSY;
1282                 goto out;
1283         }
1284
1285         /* If master port has an active link, allocate net and enum peers */
1286         if (rio_mport_is_active(mport)) {
1287                 net = rio_alloc_net(mport, 1, 0);
1288                 if (!net) {
1289                         printk(KERN_ERR "RIO: failed to allocate new net\n");
1290                         rc = -ENOMEM;
1291                         goto out;
1292                 }
1293
1294                 /* reserve mport destID in new net */
1295                 rio_destid_reserve(net, mport->host_deviceid);
1296
1297                 /* Enable Input Output Port (transmitter reviever) */
1298                 rio_enable_rx_tx_port(mport, 1, 0, 0, 0);
1299
1300                 /* Set component tag for host */
1301                 rio_local_write_config_32(mport, RIO_COMPONENT_TAG_CSR,
1302                                           next_comptag++);
1303
1304                 next_destid = rio_destid_alloc(net);
1305
1306                 if (rio_enum_peer(net, mport, 0, NULL, 0) < 0) {
1307                         /* A higher priority host won enumeration, bail. */
1308                         printk(KERN_INFO
1309                                "RIO: master port %d device has lost enumeration to a remote host\n",
1310                                mport->id);
1311                         rio_clear_locks(net);
1312                         rc = -EBUSY;
1313                         goto out;
1314                 }
1315                 /* free the last allocated destID (unused) */
1316                 rio_destid_free(net, next_destid);
1317                 rio_update_route_tables(net);
1318                 rio_clear_locks(net);
1319                 rio_pw_enable(mport, 1);
1320         } else {
1321                 printk(KERN_INFO "RIO: master port %d link inactive\n",
1322                        mport->id);
1323                 rc = -EINVAL;
1324         }
1325
1326       out:
1327         return rc;
1328 }
1329
1330 /**
1331  * rio_build_route_tables- Generate route tables from switch route entries
1332  * @net: RIO network to run route tables scan on
1333  *
1334  * For each switch device, generate a route table by copying existing
1335  * route entries from the switch.
1336  */
1337 static void rio_build_route_tables(struct rio_net *net)
1338 {
1339         struct rio_switch *rswitch;
1340         struct rio_dev *rdev;
1341         int i;
1342         u8 sport;
1343
1344         list_for_each_entry(rswitch, &net->switches, node) {
1345                 rdev = sw_to_rio_dev(rswitch);
1346
1347                 rio_lock_device(net->hport, rdev->destid,
1348                                 rdev->hopcount, 1000);
1349                 for (i = 0;
1350                      i < RIO_MAX_ROUTE_ENTRIES(net->hport->sys_size);
1351                      i++) {
1352                         if (rio_route_get_entry(rdev, RIO_GLOBAL_TABLE,
1353                                                 i, &sport, 0) < 0)
1354                                 continue;
1355                         rswitch->route_table[i] = sport;
1356                 }
1357
1358                 rio_unlock_device(net->hport, rdev->destid, rdev->hopcount);
1359         }
1360 }
1361
1362 /**
1363  * rio_disc_mport- Start discovery through a master port
1364  * @mport: Master port to send transactions
1365  *
1366  * Starts the discovery process. If we have an active link,
1367  * then wait for the signal that enumeration is complete.
1368  * When enumeration completion is signaled, start recursive
1369  * peer discovery. Returns %0 if discovery succeeds or %-EBUSY
1370  * on failure.
1371  */
1372 int rio_disc_mport(struct rio_mport *mport)
1373 {
1374         struct rio_net *net = NULL;
1375         unsigned long to_end;
1376
1377         printk(KERN_INFO "RIO: discover master port %d, %s\n", mport->id,
1378                mport->name);
1379
1380         /* If master port has an active link, allocate net and discover peers */
1381         if (rio_mport_is_active(mport)) {
1382                 pr_debug("RIO: wait for enumeration to complete...\n");
1383
1384                 to_end = jiffies + CONFIG_RAPIDIO_DISC_TIMEOUT * HZ;
1385                 while (time_before(jiffies, to_end)) {
1386                         if (rio_enum_complete(mport))
1387                                 goto enum_done;
1388                         msleep(10);
1389                 }
1390
1391                 pr_debug("RIO: discovery timeout on mport %d %s\n",
1392                          mport->id, mport->name);
1393                 goto bail;
1394 enum_done:
1395                 pr_debug("RIO: ... enumeration done\n");
1396
1397                 net = rio_alloc_net(mport, 0, 0);
1398                 if (!net) {
1399                         printk(KERN_ERR "RIO: Failed to allocate new net\n");
1400                         goto bail;
1401                 }
1402
1403                 /* Read DestID assigned by enumerator */
1404                 rio_local_read_config_32(mport, RIO_DID_CSR,
1405                                          &mport->host_deviceid);
1406                 mport->host_deviceid = RIO_GET_DID(mport->sys_size,
1407                                                    mport->host_deviceid);
1408
1409                 if (rio_disc_peer(net, mport, RIO_ANY_DESTID(mport->sys_size),
1410                                         0, NULL, 0) < 0) {
1411                         printk(KERN_INFO
1412                                "RIO: master port %d device has failed discovery\n",
1413                                mport->id);
1414                         goto bail;
1415                 }
1416
1417                 rio_build_route_tables(net);
1418         }
1419
1420         return 0;
1421 bail:
1422         return -EBUSY;
1423 }