• Home
  • Raw
  • Download

Lines Matching +full:function +full:- +full:enumerator

9  * - Added Port-Write/Error Management initialization and handling
13 * - Added Input- Output- enable functionality, to allow full communication
25 #include <linux/dma-mapping.h>
53 * rio_destid_alloc - Allocate next available destID for given network
63 struct rio_id_table *idtab = (struct rio_id_table *)net->enum_data; in rio_destid_alloc()
65 spin_lock(&idtab->lock); in rio_destid_alloc()
66 destid = find_first_zero_bit(idtab->table, idtab->max); in rio_destid_alloc()
68 if (destid < idtab->max) { in rio_destid_alloc()
69 set_bit(destid, idtab->table); in rio_destid_alloc()
70 destid += idtab->start; in rio_destid_alloc()
74 spin_unlock(&idtab->lock); in rio_destid_alloc()
79 * rio_destid_reserve - Reserve the specified destID
89 struct rio_id_table *idtab = (struct rio_id_table *)net->enum_data; in rio_destid_reserve()
91 destid -= idtab->start; in rio_destid_reserve()
92 spin_lock(&idtab->lock); in rio_destid_reserve()
93 oldbit = test_and_set_bit(destid, idtab->table); in rio_destid_reserve()
94 spin_unlock(&idtab->lock); in rio_destid_reserve()
99 * rio_destid_free - free a previously allocated destID
107 struct rio_id_table *idtab = (struct rio_id_table *)net->enum_data; in rio_destid_free()
109 destid -= idtab->start; in rio_destid_free()
110 spin_lock(&idtab->lock); in rio_destid_free()
111 clear_bit(destid, idtab->table); in rio_destid_free()
112 spin_unlock(&idtab->lock); in rio_destid_free()
116 * rio_destid_first - return first destID in use
122 struct rio_id_table *idtab = (struct rio_id_table *)net->enum_data; in rio_destid_first()
124 spin_lock(&idtab->lock); in rio_destid_first()
125 destid = find_first_bit(idtab->table, idtab->max); in rio_destid_first()
126 if (destid >= idtab->max) in rio_destid_first()
129 destid += idtab->start; in rio_destid_first()
130 spin_unlock(&idtab->lock); in rio_destid_first()
135 * rio_destid_next - return next destID in use
142 struct rio_id_table *idtab = (struct rio_id_table *)net->enum_data; in rio_destid_next()
144 spin_lock(&idtab->lock); in rio_destid_next()
145 destid = find_next_bit(idtab->table, idtab->max, from); in rio_destid_next()
146 if (destid >= idtab->max) in rio_destid_next()
149 destid += idtab->start; in rio_destid_next()
150 spin_unlock(&idtab->lock); in rio_destid_next()
155 * rio_get_device_id - Get the base/extended device id for a device
161 * 8/16-bit device ID.
169 return RIO_GET_DID(port->sys_size, result); in rio_get_device_id()
173 * rio_set_device_id - Set the base/extended device id for a device
184 RIO_SET_DID(port->sys_size, did)); in rio_set_device_id()
188 * rio_clear_locks- Release all host locks and signal enumeration complete
193 * each device. Returns 0 on success or %-EINVAL on failure.
197 struct rio_mport *port = net->hport; in rio_clear_locks()
204 port->host_deviceid); in rio_clear_locks()
210 ret = -EINVAL; in rio_clear_locks()
212 list_for_each_entry(rdev, &net->devices, net_list) { in rio_clear_locks()
214 port->host_deviceid); in rio_clear_locks()
219 rdev->vid, rdev->did); in rio_clear_locks()
220 ret = -EINVAL; in rio_clear_locks()
225 rdev->phys_efptr + RIO_PORT_GEN_CTL_CSR, in rio_clear_locks()
229 rdev->phys_efptr + RIO_PORT_GEN_CTL_CSR, in rio_clear_locks()
237 * rio_enum_host- Set host lock and initialize host destination ID
242 * by the platform. Returns %0 on success or %-1 on failure.
250 port->host_deviceid); in rio_enum_host()
253 if ((result & 0xffff) != port->host_deviceid) in rio_enum_host()
254 return -1; in rio_enum_host()
257 rio_local_set_device_id(port, port->host_deviceid); in rio_enum_host()
262 * rio_device_has_destid- Test if a device contains a destination ID register
280 * rio_release_dev- Frees a RIO device struct
295 * rio_is_switch- Tests if a RIO device has switch capabilities
305 if (rdev->pef & RIO_PEF_SWITCH) in rio_is_switch()
311 * rio_setup_device- Allocates and sets up a RIO device
347 sizeof(rswitch->nextdev[0])) + sizeof(*rswitch); in rio_setup_device()
355 rdev->net = net; in rio_setup_device()
356 rdev->pef = result; in rio_setup_device()
357 rdev->swpinfo = swpinfo; in rio_setup_device()
360 rdev->did = result >> 16; in rio_setup_device()
361 rdev->vid = result & 0xffff; in rio_setup_device()
363 &rdev->device_rev); in rio_setup_device()
366 rdev->asm_did = result >> 16; in rio_setup_device()
367 rdev->asm_vid = result & 0xffff; in rio_setup_device()
370 rdev->asm_rev = result >> 16; in rio_setup_device()
371 if (rdev->pef & RIO_PEF_EXT_FEATURES) { in rio_setup_device()
372 rdev->efptr = result & 0xffff; in rio_setup_device()
373 rdev->phys_efptr = rio_mport_get_physefb(port, 0, destid, in rio_setup_device()
374 hopcount, &rdev->phys_rmap); in rio_setup_device()
376 __func__, rdev->phys_rmap); in rio_setup_device()
378 rdev->em_efptr = rio_mport_get_feature(port, 0, destid, in rio_setup_device()
380 if (!rdev->em_efptr) in rio_setup_device()
381 rdev->em_efptr = rio_mport_get_feature(port, 0, destid, in rio_setup_device()
386 &rdev->src_ops); in rio_setup_device()
388 &rdev->dst_ops); in rio_setup_device()
398 rdev->comp_tag = next_comptag++; in rio_setup_device()
399 rdev->do_enum = true; in rio_setup_device()
403 &rdev->comp_tag); in rio_setup_device()
406 if (rio_device_has_destid(port, rdev->src_ops, rdev->dst_ops)) { in rio_setup_device()
409 rdev->destid = next_destid; in rio_setup_device()
412 rdev->destid = rio_get_device_id(port, destid, hopcount); in rio_setup_device()
414 rdev->hopcount = 0xff; in rio_setup_device()
419 rdev->destid = destid; in rio_setup_device()
420 rdev->hopcount = hopcount; in rio_setup_device()
425 rswitch = rdev->rswitch; in rio_setup_device()
426 rswitch->port_ok = 0; in rio_setup_device()
427 spin_lock_init(&rswitch->lock); in rio_setup_device()
428 rswitch->route_table = in rio_setup_device()
429 kzalloc(RIO_MAX_ROUTE_ENTRIES(port->sys_size), in rio_setup_device()
431 if (!rswitch->route_table) in rio_setup_device()
434 for (rdid = 0; rdid < RIO_MAX_ROUTE_ENTRIES(port->sys_size); in rio_setup_device()
436 rswitch->route_table[rdid] = RIO_INVALID_ROUTE; in rio_setup_device()
437 dev_set_name(&rdev->dev, "%02x:s:%04x", rdev->net->id, in rio_setup_device()
438 rdev->comp_tag & RIO_CTAG_UDEVID); in rio_setup_device()
447 dev_set_name(&rdev->dev, "%02x:e:%04x", rdev->net->id, in rio_setup_device()
448 rdev->comp_tag & RIO_CTAG_UDEVID); in rio_setup_device()
451 rdev->dev.parent = &net->dev; in rio_setup_device()
453 rdev->dev.release = rio_release_dev; in rio_setup_device()
454 rdev->dma_mask = DMA_BIT_MASK(32); in rio_setup_device()
455 rdev->dev.dma_mask = &rdev->dma_mask; in rio_setup_device()
456 rdev->dev.coherent_dma_mask = DMA_BIT_MASK(32); in rio_setup_device()
458 if (rdev->dst_ops & RIO_DST_OPS_DOORBELL) in rio_setup_device()
459 rio_init_dbell_res(&rdev->riores[RIO_DOORBELL_RESOURCE], in rio_setup_device()
472 kfree(rswitch->route_table); in rio_setup_device()
479 * rio_sport_is_active- Tests if a switch port has an active connection.
500 * rio_get_host_deviceid_lock- Reads the Host Device ID Lock CSR on a device
511 rio_mport_read_config_32(port, RIO_ANY_DESTID(port->sys_size), hopcount, in rio_get_host_deviceid_lock()
518 * rio_enum_peer- Recursively enumerate a RIO network through a master port
536 RIO_ANY_DESTID(port->sys_size), hopcount)) { in rio_enum_peer()
538 return -1; in rio_enum_peer()
541 if (rio_get_host_deviceid_lock(port, hopcount) == port->host_deviceid) { in rio_enum_peer()
547 rio_mport_read_config_32(port, RIO_ANY_DESTID(port->sys_size), in rio_enum_peer()
556 prev->rswitch->nextdev[prev_port] = rdev; in rio_enum_peer()
564 rio_mport_write_config_32(port, RIO_ANY_DESTID(port->sys_size), in rio_enum_peer()
566 RIO_HOST_DID_LOCK_CSR, port->host_deviceid); in rio_enum_peer()
568 < port->host_deviceid) { in rio_enum_peer()
572 rio_mport_write_config_32(port, RIO_ANY_DESTID(port->sys_size), in rio_enum_peer()
575 port->host_deviceid); in rio_enum_peer()
578 if (rio_get_host_deviceid_lock(port, hopcount) > port->host_deviceid) { in rio_enum_peer()
581 return -1; in rio_enum_peer()
585 rdev = rio_setup_device(net, port, RIO_ANY_DESTID(port->sys_size), in rio_enum_peer()
588 rdev->prev = prev; in rio_enum_peer()
590 prev->rswitch->nextdev[prev_port] = rdev; in rio_enum_peer()
592 return -1; in rio_enum_peer()
601 sw_inport = RIO_GET_PORT_NUM(rdev->swpinfo); in rio_enum_peer()
603 port->host_deviceid, sw_inport, 0); in rio_enum_peer()
604 rdev->rswitch->route_table[port->host_deviceid] = sw_inport; in rio_enum_peer()
608 if (destid != port->host_deviceid) { in rio_enum_peer()
611 rdev->rswitch->route_table[destid] = sw_inport; in rio_enum_peer()
617 rio_name(rdev), rdev->vid, rdev->did, in rio_enum_peer()
618 RIO_GET_TOTAL_PORTS(rdev->swpinfo)); in rio_enum_peer()
621 port_num < RIO_GET_TOTAL_PORTS(rdev->swpinfo); in rio_enum_peer()
625 RIO_ANY_DESTID(port->sys_size), in rio_enum_peer()
627 rdev->rswitch->port_ok |= (1 << port_num); in rio_enum_peer()
638 RIO_ANY_DESTID(port->sys_size), in rio_enum_peer()
640 rdev->rswitch->port_ok |= (1 << port_num); in rio_enum_peer()
642 RIO_ANY_DESTID(port->sys_size), in rio_enum_peer()
647 return -1; in rio_enum_peer()
654 if (destid != port->host_deviceid) { in rio_enum_peer()
660 rdev->rswitch-> in rio_enum_peer()
672 if (rdev->em_efptr) in rio_enum_peer()
675 rdev->rswitch->port_ok &= ~(1 << port_num); in rio_enum_peer()
679 /* Direct Port-write messages to the enumeratiing host */ in rio_enum_peer()
680 if ((rdev->src_ops & RIO_SRC_OPS_PORT_WRITE) && in rio_enum_peer()
681 (rdev->em_efptr)) { in rio_enum_peer()
683 rdev->em_efptr + RIO_EM_PW_TGT_DEVID, in rio_enum_peer()
684 (port->host_deviceid << 16) | in rio_enum_peer()
685 (port->sys_size << 15)); in rio_enum_peer()
694 rdev->destid = sw_destid; in rio_enum_peer()
697 rio_name(rdev), rdev->vid, rdev->did); in rio_enum_peer()
703 * rio_enum_complete- Tests if enumeration of a network is complete
706 * Tests the PGCCSR discovered bit for non-zero value (enumeration
714 rio_local_read_config_32(port, port->phys_efptr + RIO_PORT_GEN_CTL_CSR, in rio_enum_complete()
720 * rio_disc_peer- Recursively discovers a RIO network through a master port
741 rdev->prev = prev; in rio_disc_peer()
743 prev->rswitch->nextdev[prev_port] = rdev; in rio_disc_peer()
745 return -1; in rio_disc_peer()
749 rdev->destid = destid; in rio_disc_peer()
753 rio_name(rdev), rdev->vid, rdev->did, in rio_disc_peer()
754 RIO_GET_TOTAL_PORTS(rdev->swpinfo)); in rio_disc_peer()
756 port_num < RIO_GET_TOTAL_PORTS(rdev->swpinfo); in rio_disc_peer()
758 if (RIO_GET_PORT_NUM(rdev->swpinfo) == port_num) in rio_disc_peer()
769 ndestid < RIO_ANY_DESTID(port->sys_size); in rio_disc_peer()
779 if (ndestid == RIO_ANY_DESTID(port->sys_size)) in rio_disc_peer()
784 return -1; in rio_disc_peer()
789 rio_name(rdev), rdev->vid, rdev->did); in rio_disc_peer()
795 * rio_mport_is_active- Tests if master port link is active
808 port->phys_efptr + in rio_mport_is_active()
809 RIO_PORT_N_ERR_STS_CSR(port->index, port->phys_rmap), in rio_mport_is_active()
816 pr_debug("RIO-SCAN: %s: net_%d\n", __func__, net->id); in rio_scan_release_net()
817 kfree(net->enum_data); in rio_scan_release_net()
825 pr_debug("RIO-SCAN: %s: net_%d\n", __func__, net->id); in rio_scan_release_dev()
830 * rio_scan_alloc_net - Allocate and configure a new RIO network
835 * Allocates a new RIO network structure and initializes enumerator-specific
852 RIO_MAX_ROUTE_ENTRIES(mport->sys_size) in rio_scan_alloc_net()
862 net->enum_data = idtab; in rio_scan_alloc_net()
863 net->release = rio_scan_release_net; in rio_scan_alloc_net()
864 idtab->start = start; in rio_scan_alloc_net()
865 idtab->max = RIO_MAX_ROUTE_ENTRIES(mport->sys_size); in rio_scan_alloc_net()
866 spin_lock_init(&idtab->lock); in rio_scan_alloc_net()
871 net->id = mport->id; in rio_scan_alloc_net()
872 net->hport = mport; in rio_scan_alloc_net()
873 dev_set_name(&net->dev, "rnet_%d", net->id); in rio_scan_alloc_net()
874 net->dev.parent = &mport->dev; in rio_scan_alloc_net()
875 net->dev.release = rio_scan_release_dev; in rio_scan_alloc_net()
883 * rio_update_route_tables- Updates route tables in switches
897 list_for_each_entry(rdev, &net->devices, net_list) { in rio_update_route_tables()
899 destid = rdev->destid; in rio_update_route_tables()
901 list_for_each_entry(rswitch, &net->switches, node) { in rio_update_route_tables()
903 if (rio_is_switch(rdev) && (rdev->rswitch == rswitch)) in rio_update_route_tables()
906 if (RIO_INVALID_ROUTE == rswitch->route_table[destid]) { in rio_update_route_tables()
910 if (swrdev->destid == destid) in rio_update_route_tables()
913 sport = RIO_GET_PORT_NUM(swrdev->swpinfo); in rio_update_route_tables()
917 rswitch->route_table[destid] = sport; in rio_update_route_tables()
924 * rio_init_em - Initializes RIO Error Management (for switches)
927 * For each enumerated switch, call device-specific error management
932 if (rio_is_switch(rdev) && (rdev->em_efptr) && in rio_init_em()
933 rdev->rswitch->ops && rdev->rswitch->ops->em_init) { in rio_init_em()
934 rdev->rswitch->ops->em_init(rdev); in rio_init_em()
939 * rio_enum_mport- Start enumeration through a master port
946 * enumeration succeeds or %-EBUSY if enumeration fails.
953 printk(KERN_INFO "RIO: enumerate master port %d, %s\n", mport->id, in rio_enum_mport()
954 mport->name); in rio_enum_mport()
962 if (mport->nnode.next || mport->nnode.prev) in rio_enum_mport()
963 return -EBUSY; in rio_enum_mport()
969 mport->id); in rio_enum_mport()
970 rc = -EBUSY; in rio_enum_mport()
979 rc = -ENOMEM; in rio_enum_mport()
984 rio_destid_reserve(net, mport->host_deviceid); in rio_enum_mport()
999 mport->id); in rio_enum_mport()
1001 rc = -EBUSY; in rio_enum_mport()
1011 mport->id); in rio_enum_mport()
1012 rc = -EINVAL; in rio_enum_mport()
1020 * rio_build_route_tables- Generate route tables from switch route entries
1033 list_for_each_entry(rswitch, &net->switches, node) { in rio_build_route_tables()
1036 rio_lock_device(net->hport, rdev->destid, in rio_build_route_tables()
1037 rdev->hopcount, 1000); in rio_build_route_tables()
1039 i < RIO_MAX_ROUTE_ENTRIES(net->hport->sys_size); in rio_build_route_tables()
1044 rswitch->route_table[i] = sport; in rio_build_route_tables()
1047 rio_unlock_device(net->hport, rdev->destid, rdev->hopcount); in rio_build_route_tables()
1052 * rio_disc_mport- Start discovery through a master port
1060 * peer discovery. Returns %0 if discovery succeeds or %-EBUSY
1068 printk(KERN_INFO "RIO: discover master port %d, %s\n", mport->id, in rio_disc_mport()
1069 mport->name); in rio_disc_mport()
1076 return -EAGAIN; in rio_disc_mport()
1088 mport->id, mport->name); in rio_disc_mport()
1099 /* Read DestID assigned by enumerator */ in rio_disc_mport()
1101 &mport->host_deviceid); in rio_disc_mport()
1102 mport->host_deviceid = RIO_GET_DID(mport->sys_size, in rio_disc_mport()
1103 mport->host_deviceid); in rio_disc_mport()
1105 if (rio_disc_peer(net, mport, RIO_ANY_DESTID(mport->sys_size), in rio_disc_mport()
1109 mport->id); in rio_disc_mport()
1118 return -EBUSY; in rio_disc_mport()
1135 * When this enumeration/discovery method is loaded as a module this function
1140 * Returns 0 for success or -EIO if unable to register itself.
1149 return -EIO; in rio_basic_attach()