Lines Matching +full:no +full:- +full:scan +full:- +full:on +full:- +full:init

1 // SPDX-License-Identifier: GPL-2.0-or-later
9 * Copyright 2009 - 2013 Integrated Device Technology, Inc.
17 #include <linux/init.h>
30 * struct rio_pwrite - RIO portwrite event
33 * @context: Handler specific context to pass on event
65 * rio_local_get_device_id - Get the base/extended device id for a port
69 * implementing the master port. Returns the 8/16-bit device
78 return (RIO_GET_DID(port->sys_size, result)); in rio_local_get_device_id()
83 * rio_query_mport - Query mport device attributes
93 if (!port->ops->query_mport) in rio_query_mport()
94 return -ENODATA; in rio_query_mport()
95 return port->ops->query_mport(port, mport_attr); in rio_query_mport()
100 * rio_alloc_net- Allocate and initialize a new RIO network data structure
103 * Allocates a RIO network structure, initializes per-network
106 * RIO network pointer on success or %NULL on failure.
113 INIT_LIST_HEAD(&net->node); in rio_alloc_net()
114 INIT_LIST_HEAD(&net->devices); in rio_alloc_net()
115 INIT_LIST_HEAD(&net->switches); in rio_alloc_net()
116 INIT_LIST_HEAD(&net->mports); in rio_alloc_net()
117 mport->net = net; in rio_alloc_net()
127 err = device_register(&net->dev); in rio_add_net()
131 list_add_tail(&net->node, &rio_nets); in rio_add_net()
141 if (!list_empty(&net->node)) in rio_free_net()
142 list_del(&net->node); in rio_free_net()
144 if (net->release) in rio_free_net()
145 net->release(net); in rio_free_net()
146 device_unregister(&net->dev); in rio_free_net()
151 * rio_local_set_device_id - Set the base/extended device id for a port
160 RIO_SET_DID(port->sys_size, did)); in rio_local_set_device_id()
165 * rio_add_device- Adds a RIO device to the device model
176 atomic_set(&rdev->state, RIO_DEVICE_RUNNING); in rio_add_device()
177 err = device_register(&rdev->dev); in rio_add_device()
182 list_add_tail(&rdev->global_list, &rio_devices); in rio_add_device()
183 if (rdev->net) { in rio_add_device()
184 list_add_tail(&rdev->net_list, &rdev->net->devices); in rio_add_device()
185 if (rdev->pef & RIO_PEF_SWITCH) in rio_add_device()
186 list_add_tail(&rdev->rswitch->node, in rio_add_device()
187 &rdev->net->switches); in rio_add_device()
196 * rio_del_device - removes a RIO device from the device model
206 atomic_set(&rdev->state, state); in rio_del_device()
208 list_del(&rdev->global_list); in rio_del_device()
209 if (rdev->net) { in rio_del_device()
210 list_del(&rdev->net_list); in rio_del_device()
211 if (rdev->pef & RIO_PEF_SWITCH) { in rio_del_device()
212 list_del(&rdev->rswitch->node); in rio_del_device()
213 kfree(rdev->rswitch->route_table); in rio_del_device()
217 device_unregister(&rdev->dev); in rio_del_device()
222 * rio_request_inb_mbox - request inbound mailbox service
224 * @dev_id: Device specific pointer to pass on event
230 * a callback function to the resource. Returns %0 on success.
239 int rc = -ENOSYS; in rio_request_inb_mbox()
242 if (!mport->ops->open_inb_mbox) in rio_request_inb_mbox()
250 rc = request_resource(&mport->riores[RIO_INB_MBOX_RESOURCE], in rio_request_inb_mbox()
257 mport->inb_msg[mbox].res = res; in rio_request_inb_mbox()
260 mport->inb_msg[mbox].mcback = minb; in rio_request_inb_mbox()
262 rc = mport->ops->open_inb_mbox(mport, dev_id, mbox, entries); in rio_request_inb_mbox()
264 mport->inb_msg[mbox].mcback = NULL; in rio_request_inb_mbox()
265 mport->inb_msg[mbox].res = NULL; in rio_request_inb_mbox()
270 rc = -ENOMEM; in rio_request_inb_mbox()
278 * rio_release_inb_mbox - release inbound mailbox message service
289 if (!mport->ops->close_inb_mbox || !mport->inb_msg[mbox].res) in rio_release_inb_mbox()
290 return -EINVAL; in rio_release_inb_mbox()
292 mport->ops->close_inb_mbox(mport, mbox); in rio_release_inb_mbox()
293 mport->inb_msg[mbox].mcback = NULL; in rio_release_inb_mbox()
295 rc = release_resource(mport->inb_msg[mbox].res); in rio_release_inb_mbox()
299 kfree(mport->inb_msg[mbox].res); in rio_release_inb_mbox()
300 mport->inb_msg[mbox].res = NULL; in rio_release_inb_mbox()
307 * rio_request_outb_mbox - request outbound mailbox service
309 * @dev_id: Device specific pointer to pass on event
315 * a callback function to the resource. Returns 0 on success.
323 int rc = -ENOSYS; in rio_request_outb_mbox()
326 if (!mport->ops->open_outb_mbox) in rio_request_outb_mbox()
334 rc = request_resource(&mport->riores[RIO_OUTB_MBOX_RESOURCE], in rio_request_outb_mbox()
341 mport->outb_msg[mbox].res = res; in rio_request_outb_mbox()
344 mport->outb_msg[mbox].mcback = moutb; in rio_request_outb_mbox()
346 rc = mport->ops->open_outb_mbox(mport, dev_id, mbox, entries); in rio_request_outb_mbox()
348 mport->outb_msg[mbox].mcback = NULL; in rio_request_outb_mbox()
349 mport->outb_msg[mbox].res = NULL; in rio_request_outb_mbox()
354 rc = -ENOMEM; in rio_request_outb_mbox()
362 * rio_release_outb_mbox - release outbound mailbox message service
373 if (!mport->ops->close_outb_mbox || !mport->outb_msg[mbox].res) in rio_release_outb_mbox()
374 return -EINVAL; in rio_release_outb_mbox()
376 mport->ops->close_outb_mbox(mport, mbox); in rio_release_outb_mbox()
377 mport->outb_msg[mbox].mcback = NULL; in rio_release_outb_mbox()
379 rc = release_resource(mport->outb_msg[mbox].res); in rio_release_outb_mbox()
383 kfree(mport->outb_msg[mbox].res); in rio_release_outb_mbox()
384 mport->outb_msg[mbox].res = NULL; in rio_release_outb_mbox()
391 * rio_setup_inb_dbell - bind inbound doorbell callback
393 * @dev_id: Device specific pointer to pass on event
409 return -ENOMEM; in rio_setup_inb_dbell()
411 dbell->res = res; in rio_setup_inb_dbell()
412 dbell->dinb = dinb; in rio_setup_inb_dbell()
413 dbell->dev_id = dev_id; in rio_setup_inb_dbell()
415 mutex_lock(&mport->lock); in rio_setup_inb_dbell()
416 list_add_tail(&dbell->node, &mport->dbells); in rio_setup_inb_dbell()
417 mutex_unlock(&mport->lock); in rio_setup_inb_dbell()
422 * rio_request_inb_dbell - request inbound doorbell message service
424 * @dev_id: Device specific pointer to pass on event
447 rc = request_resource(&mport->riores[RIO_DOORBELL_RESOURCE], in rio_request_inb_dbell()
457 rc = -ENOMEM; in rio_request_inb_dbell()
465 * rio_release_inb_dbell - release inbound doorbell message service
479 mutex_lock(&mport->lock); in rio_release_inb_dbell()
480 list_for_each_entry(dbell, &mport->dbells, node) { in rio_release_inb_dbell()
481 if ((dbell->res->start == start) && (dbell->res->end == end)) { in rio_release_inb_dbell()
482 list_del(&dbell->node); in rio_release_inb_dbell()
487 mutex_unlock(&mport->lock); in rio_release_inb_dbell()
491 rc = -EINVAL; in rio_release_inb_dbell()
496 rc = release_resource(dbell->res); in rio_release_inb_dbell()
507 * rio_request_outb_dbell - request outbound doorbell message range
513 * if the request has been satisfied or %NULL on failure.
524 if (request_resource(&rdev->riores[RIO_DOORBELL_RESOURCE], res) in rio_request_outb_dbell()
536 * rio_release_outb_dbell - release outbound doorbell message range
554 * rio_add_mport_pw_handler - add port-write message handler into the list
557 * @context: Handler specific context to pass on event
569 return -ENOMEM; in rio_add_mport_pw_handler()
571 pwrite->pwcback = pwcback; in rio_add_mport_pw_handler()
572 pwrite->context = context; in rio_add_mport_pw_handler()
573 mutex_lock(&mport->lock); in rio_add_mport_pw_handler()
574 list_add_tail(&pwrite->node, &mport->pwrites); in rio_add_mport_pw_handler()
575 mutex_unlock(&mport->lock); in rio_add_mport_pw_handler()
581 * rio_del_mport_pw_handler - remove port-write message handler from the list
584 * @context: Registered handler specific context to pass on event
593 int rc = -EINVAL; in rio_del_mport_pw_handler()
596 mutex_lock(&mport->lock); in rio_del_mport_pw_handler()
597 list_for_each_entry(pwrite, &mport->pwrites, node) { in rio_del_mport_pw_handler()
598 if (pwrite->pwcback == pwcback && pwrite->context == context) { in rio_del_mport_pw_handler()
599 list_del(&pwrite->node); in rio_del_mport_pw_handler()
605 mutex_unlock(&mport->lock); in rio_del_mport_pw_handler()
612 * rio_request_inb_pwrite - request inbound port-write message service for
614 * @rdev: RIO device to which register inbound port-write callback routine
615 * @pwcback: Callback routine to execute when port-write is received
617 * Binds a port-write callback function to the RapidIO device.
626 if (rdev->pwcback) in rio_request_inb_pwrite()
627 rc = -ENOMEM; in rio_request_inb_pwrite()
629 rdev->pwcback = pwcback; in rio_request_inb_pwrite()
637 * rio_release_inb_pwrite - release inbound port-write message service
639 * @rdev: RIO device which registered for inbound port-write callback
646 int rc = -ENOMEM; in rio_release_inb_pwrite()
649 if (rdev->pwcback) { in rio_release_inb_pwrite()
650 rdev->pwcback = NULL; in rio_release_inb_pwrite()
660 * rio_pw_enable - Enables/disables port-write handling by a master port
661 * @mport: Master port associated with port-write handling
666 if (mport->ops->pwenable) { in rio_pw_enable()
667 mutex_lock(&mport->lock); in rio_pw_enable()
669 if ((enable && ++mport->pwe_refcnt == 1) || in rio_pw_enable()
670 (!enable && mport->pwe_refcnt && --mport->pwe_refcnt == 0)) in rio_pw_enable()
671 mport->ops->pwenable(mport, enable); in rio_pw_enable()
672 mutex_unlock(&mport->lock); in rio_pw_enable()
678 * rio_map_inb_region -- Map inbound memory region.
685 * Return: 0 -- Success.
695 if (!mport->ops->map_inb) in rio_map_inb_region()
696 return -1; in rio_map_inb_region()
698 rc = mport->ops->map_inb(mport, local, rbase, size, rflags); in rio_map_inb_region()
705 * rio_unmap_inb_region -- Unmap the inbound memory region
712 if (!mport->ops->unmap_inb) in rio_unmap_inb_region()
715 mport->ops->unmap_inb(mport, lstart); in rio_unmap_inb_region()
721 * rio_map_outb_region -- Map outbound memory region.
729 * Return: 0 -- Success.
739 if (!mport->ops->map_outb) in rio_map_outb_region()
740 return -ENODEV; in rio_map_outb_region()
743 rc = mport->ops->map_outb(mport, destid, rbase, size, in rio_map_outb_region()
752 * rio_unmap_outb_region -- Unmap the inbound memory region
761 if (!mport->ops->unmap_outb) in rio_unmap_outb_region()
765 mport->ops->unmap_outb(mport, destid, rstart); in rio_unmap_outb_region()
771 * rio_mport_get_physefb - Helper function that returns register offset
829 * rio_get_comptag - Begin or continue searching for a RIO device by component tag
837 * @from is not %NULL, searches continue from next device on the global
846 n = from ? from->global_list.next : rio_devices.next; in rio_get_comptag()
850 if (rdev->comp_tag == comp_tag) in rio_get_comptag()
852 n = n->next; in rio_get_comptag()
862 * rio_set_port_lockout - Sets/clears LOCKOUT bit (RIO EM 1.3) for a switch port.
887 * rio_enable_rx_tx_port - enable input receiver and output transmitter of
893 * @port_num: Port (-number on switch) to enable on a far end device
895 * Returns 0 or 1 from on General Control Command and Status Register
924 return -EIO; in rio_enable_rx_tx_port()
936 return -EIO; in rio_enable_rx_tx_port()
945 * rio_chk_dev_route - Validate route to the specified device.
947 * @nrdev: Last active device on the route to rdev
948 * @npnum: nrdev's port number on the route to rdev
951 * device (and corresponding RIO port) on the route.
957 int p_port, rc = -EIO; in rio_chk_dev_route()
961 while (rdev->prev && (rdev->prev->pef & RIO_PEF_SWITCH)) { in rio_chk_dev_route()
962 if (!rio_read_config_32(rdev->prev, RIO_DEV_ID_CAR, &result)) { in rio_chk_dev_route()
963 prev = rdev->prev; in rio_chk_dev_route()
966 rdev = rdev->prev; in rio_chk_dev_route()
972 p_port = prev->rswitch->route_table[rdev->destid]; in rio_chk_dev_route()
975 pr_debug("RIO: link failed on [%s]-P%d\n", in rio_chk_dev_route()
987 * rio_mport_chk_dev_access - Validate access to the specified device.
1002 return -EIO; in rio_mport_chk_dev_access()
1011 * rio_chk_dev_access - Validate access to the specified device.
1016 return rio_mport_chk_dev_access(rdev->net->hport, in rio_chk_dev_access()
1017 rdev->destid, rdev->hopcount); in rio_chk_dev_access()
1021 * rio_get_input_status - Sends a Link-Request/Input-Status control symbol and
1022 * returns link-response (if requested).
1023 * @rdev: RIO devive to issue Input-status command
1042 /* Issue Input-status command */ in rio_get_input_status()
1052 while (checkcount--) { in rio_get_input_status()
1063 return -EIO; in rio_get_input_status()
1067 * rio_clr_err_stopped - Clears port Error-stopped states.
1076 * IDT gen3 switch driver now implements HW-specific error handler that
1081 struct rio_dev *nextdev = rdev->rswitch->nextdev[pnum]; in rio_clr_err_stopped()
1091 pr_debug("RIO_EM: servicing Output Error-Stopped state\n"); in rio_clr_err_stopped()
1093 * Send a Link-Request/Input-Status control symbol in rio_clr_err_stopped()
1096 pr_debug("RIO_EM: Input-status response timeout\n"); in rio_clr_err_stopped()
1100 pr_debug("RIO_EM: SP%d Input-status response=0x%08x\n", in rio_clr_err_stopped()
1137 RIO_GET_PORT_NUM(nextdev->swpinfo)), in rio_clr_err_stopped()
1148 pr_debug("RIO_EM: servicing Input Error-Stopped state\n"); in rio_clr_err_stopped()
1150 RIO_GET_PORT_NUM(nextdev->swpinfo), NULL); in rio_clr_err_stopped()
1163 * rio_inb_pwrite_handler - inbound port-write message handler
1164 * @mport: mport device associated with port-write
1165 * @pw_msg: pointer to inbound port-write message
1167 * Processes an inbound port-write message. Returns 0 if the request
1181 pr_debug("%s: PW to mport_%d:\n", __func__, mport->id); in rio_inb_pwrite_handler()
1184 i * 4, pw_msg->raw[i], pw_msg->raw[i + 1], in rio_inb_pwrite_handler()
1185 pw_msg->raw[i + 2], pw_msg->raw[i + 3]); in rio_inb_pwrite_handler()
1190 rdev = rio_get_comptag((pw_msg->em.comptag & RIO_CTAG_UDEVID), NULL); in rio_inb_pwrite_handler()
1192 pr_debug("RIO: Port-Write message from %s\n", rio_name(rdev)); in rio_inb_pwrite_handler()
1194 pr_debug("RIO: %s No matching device for CTag 0x%08x\n", in rio_inb_pwrite_handler()
1195 __func__, pw_msg->em.comptag); in rio_inb_pwrite_handler()
1198 /* Call a device-specific handler (if it is registered for the device). in rio_inb_pwrite_handler()
1199 * This may be the service for endpoints that send device-specific in rio_inb_pwrite_handler()
1200 * port-write messages. End-point messages expected to be handled in rio_inb_pwrite_handler()
1202 * For switches rc==0 signals that no standard processing required. in rio_inb_pwrite_handler()
1204 if (rdev && rdev->pwcback) { in rio_inb_pwrite_handler()
1205 rc = rdev->pwcback(rdev, pw_msg, 0); in rio_inb_pwrite_handler()
1210 mutex_lock(&mport->lock); in rio_inb_pwrite_handler()
1211 list_for_each_entry(pwrite, &mport->pwrites, node) in rio_inb_pwrite_handler()
1212 pwrite->pwcback(mport, pwrite->context, pw_msg, 0); in rio_inb_pwrite_handler()
1213 mutex_unlock(&mport->lock); in rio_inb_pwrite_handler()
1220 * how to do default PW handling in combination with per-mport callbacks in rio_inb_pwrite_handler()
1223 portnum = pw_msg->em.is_port & 0xFF; in rio_inb_pwrite_handler()
1230 pr_debug("RIO: device access failed - get link partner\n"); in rio_inb_pwrite_handler()
1231 /* Scan route to the device and identify failed link. in rio_inb_pwrite_handler()
1238 return -EIO; in rio_inb_pwrite_handler()
1243 /* For End-point devices processing stops here */ in rio_inb_pwrite_handler()
1244 if (!(rdev->pef & RIO_PEF_SWITCH)) in rio_inb_pwrite_handler()
1247 if (rdev->phys_efptr == 0) { in rio_inb_pwrite_handler()
1254 * Process the port-write notification from switch in rio_inb_pwrite_handler()
1256 if (rdev->rswitch->ops && rdev->rswitch->ops->em_handle) in rio_inb_pwrite_handler()
1257 rdev->rswitch->ops->em_handle(rdev, portnum); in rio_inb_pwrite_handler()
1265 if (!(rdev->rswitch->port_ok & (1 << portnum))) { in rio_inb_pwrite_handler()
1266 rdev->rswitch->port_ok |= (1 << portnum); in rio_inb_pwrite_handler()
1269 pr_debug("RIO_PW: Device Insertion on [%s]-P%d\n", in rio_inb_pwrite_handler()
1273 /* Clear error-stopped states (if reported). in rio_inb_pwrite_handler()
1274 * Depending on the link partner state, two attempts in rio_inb_pwrite_handler()
1284 if (rdev->rswitch->port_ok & (1 << portnum)) { in rio_inb_pwrite_handler()
1285 rdev->rswitch->port_ok &= ~(1 << portnum); in rio_inb_pwrite_handler()
1288 if (rdev->phys_rmap == 1) { in rio_inb_pwrite_handler()
1302 pr_debug("RIO_PW: Device Extraction on [%s]-P%d\n", in rio_inb_pwrite_handler()
1308 rdev->em_efptr + RIO_EM_PN_ERR_DETECT(portnum), &em_perrdet); in rio_inb_pwrite_handler()
1314 rdev->em_efptr + RIO_EM_PN_ERR_DETECT(portnum), 0); in rio_inb_pwrite_handler()
1318 rdev->em_efptr + RIO_EM_LTL_ERR_DETECT, &em_ltlerrdet); in rio_inb_pwrite_handler()
1324 rdev->em_efptr + RIO_EM_LTL_ERR_DETECT, 0); in rio_inb_pwrite_handler()
1327 /* Clear remaining error bits and Port-Write Pending bit */ in rio_inb_pwrite_handler()
1336 * rio_mport_get_efb - get pointer to next extended features block
1370 * rio_mport_get_feature - query for devices' extended features
1416 * rio_std_route_add_entry - Add switch route table entry using standard
1421 * @table: routing table ID (global or port-specific)
1443 * rio_std_route_get_entry - Read switch route table entry (port number)
1449 * @table: routing table ID (global or port-specific)
1472 * rio_std_route_clr_table - Clear swotch route table using standard registers
1477 * @table: routing table ID (global or port-specific)
1491 if (mport->sys_size) { in rio_std_route_clr_table()
1523 * rio_lock_device - Acquires host device lock for specified device
1527 * @wait_ms: Max wait time in msec (0 = no timeout)
1540 RIO_HOST_DID_LOCK_CSR, port->host_deviceid); in rio_lock_device()
1544 while (result != port->host_deviceid) { in rio_lock_device()
1548 return -EINVAL; in rio_lock_device()
1558 port->host_deviceid); in rio_lock_device()
1569 * rio_unlock_device - Releases host device lock for specified device
1584 port->host_deviceid); in rio_unlock_device()
1590 return -EINVAL; in rio_unlock_device()
1598 * rio_route_add_entry- Add a route entry to a switch routing table
1603 * @lock: apply a hardware lock on switch device flag (1=lock, 0=no_lock)
1612 * Returns %0 on success or %-EINVAL on failure.
1617 int rc = -EINVAL; in rio_route_add_entry()
1618 struct rio_switch_ops *ops = rdev->rswitch->ops; in rio_route_add_entry()
1621 rc = rio_lock_device(rdev->net->hport, rdev->destid, in rio_route_add_entry()
1622 rdev->hopcount, 1000); in rio_route_add_entry()
1627 spin_lock(&rdev->rswitch->lock); in rio_route_add_entry()
1629 if (!ops || !ops->add_entry) { in rio_route_add_entry()
1630 rc = rio_std_route_add_entry(rdev->net->hport, rdev->destid, in rio_route_add_entry()
1631 rdev->hopcount, table, in rio_route_add_entry()
1633 } else if (try_module_get(ops->owner)) { in rio_route_add_entry()
1634 rc = ops->add_entry(rdev->net->hport, rdev->destid, in rio_route_add_entry()
1635 rdev->hopcount, table, route_destid, in rio_route_add_entry()
1637 module_put(ops->owner); in rio_route_add_entry()
1640 spin_unlock(&rdev->rswitch->lock); in rio_route_add_entry()
1643 rio_unlock_device(rdev->net->hport, rdev->destid, in rio_route_add_entry()
1644 rdev->hopcount); in rio_route_add_entry()
1651 * rio_route_get_entry- Read an entry from a switch routing table
1656 * @lock: apply a hardware lock on switch device flag (1=lock, 0=no_lock)
1665 * Returns %0 on success or %-EINVAL on failure.
1670 int rc = -EINVAL; in rio_route_get_entry()
1671 struct rio_switch_ops *ops = rdev->rswitch->ops; in rio_route_get_entry()
1674 rc = rio_lock_device(rdev->net->hport, rdev->destid, in rio_route_get_entry()
1675 rdev->hopcount, 1000); in rio_route_get_entry()
1680 spin_lock(&rdev->rswitch->lock); in rio_route_get_entry()
1682 if (!ops || !ops->get_entry) { in rio_route_get_entry()
1683 rc = rio_std_route_get_entry(rdev->net->hport, rdev->destid, in rio_route_get_entry()
1684 rdev->hopcount, table, in rio_route_get_entry()
1686 } else if (try_module_get(ops->owner)) { in rio_route_get_entry()
1687 rc = ops->get_entry(rdev->net->hport, rdev->destid, in rio_route_get_entry()
1688 rdev->hopcount, table, route_destid, in rio_route_get_entry()
1690 module_put(ops->owner); in rio_route_get_entry()
1693 spin_unlock(&rdev->rswitch->lock); in rio_route_get_entry()
1696 rio_unlock_device(rdev->net->hport, rdev->destid, in rio_route_get_entry()
1697 rdev->hopcount); in rio_route_get_entry()
1703 * rio_route_clr_table - Clear a switch routing table
1706 * @lock: apply a hardware lock on switch device flag (1=lock, 0=no_lock)
1714 * Returns %0 on success or %-EINVAL on failure.
1718 int rc = -EINVAL; in rio_route_clr_table()
1719 struct rio_switch_ops *ops = rdev->rswitch->ops; in rio_route_clr_table()
1722 rc = rio_lock_device(rdev->net->hport, rdev->destid, in rio_route_clr_table()
1723 rdev->hopcount, 1000); in rio_route_clr_table()
1728 spin_lock(&rdev->rswitch->lock); in rio_route_clr_table()
1730 if (!ops || !ops->clr_table) { in rio_route_clr_table()
1731 rc = rio_std_route_clr_table(rdev->net->hport, rdev->destid, in rio_route_clr_table()
1732 rdev->hopcount, table); in rio_route_clr_table()
1733 } else if (try_module_get(ops->owner)) { in rio_route_clr_table()
1734 rc = ops->clr_table(rdev->net->hport, rdev->destid, in rio_route_clr_table()
1735 rdev->hopcount, table); in rio_route_clr_table()
1737 module_put(ops->owner); in rio_route_clr_table()
1740 spin_unlock(&rdev->rswitch->lock); in rio_route_clr_table()
1743 rio_unlock_device(rdev->net->hport, rdev->destid, in rio_route_clr_table()
1744 rdev->hopcount); in rio_route_clr_table()
1757 return mport == container_of(chan->device, struct rio_mport, dma); in rio_chan_filter()
1761 * rio_request_mport_dma - request RapidIO capable DMA channel associated
1778 * rio_release_dma - release specified DMA channel
1788 * rio_dma_prep_xfer - RapidIO specific wrapper
1801 * error-valued pointer or NULL if failed.
1809 if (!dchan->device->device_prep_slave_sg) { in rio_dma_prep_xfer()
1815 rio_ext.rio_addr_u = data->rio_addr_u; in rio_dma_prep_xfer()
1816 rio_ext.rio_addr = data->rio_addr; in rio_dma_prep_xfer()
1817 rio_ext.wr_type = data->wr_type; in rio_dma_prep_xfer()
1819 return dmaengine_prep_rio_sg(dchan, data->sg, data->sg_len, in rio_dma_prep_xfer()
1827 * rio_register_scan - enumeration/discovery method registration interface
1828 * @mport_id: mport device ID for which fabric scan routine has to be set
1837 * In case of RIO_MPORT_ANY skips mports with valid scan routines (no error).
1842 struct rio_scan_node *scan; in rio_register_scan() local
1849 return -EINVAL; in rio_register_scan()
1858 list_for_each_entry(scan, &rio_scans, node) { in rio_register_scan()
1859 if (scan->mport_id == mport_id) { in rio_register_scan()
1860 rc = -EBUSY; in rio_register_scan()
1866 * Allocate and initialize new scan registration node. in rio_register_scan()
1868 scan = kzalloc(sizeof(*scan), GFP_KERNEL); in rio_register_scan()
1869 if (!scan) { in rio_register_scan()
1870 rc = -ENOMEM; in rio_register_scan()
1874 scan->mport_id = mport_id; in rio_register_scan()
1875 scan->ops = scan_ops; in rio_register_scan()
1878 * Traverse the list of registered mports to attach this new scan. in rio_register_scan()
1880 * The new scan with matching mport ID overrides any previously attached in rio_register_scan()
1881 * scan assuming that old scan (if any) is the default one (based on the in rio_register_scan()
1883 * If the new scan is the global one, it will be attached only to mports in rio_register_scan()
1887 if (port->id == mport_id) { in rio_register_scan()
1888 port->nscan = scan_ops; in rio_register_scan()
1890 } else if (mport_id == RIO_MPORT_ANY && !port->nscan) in rio_register_scan()
1891 port->nscan = scan_ops; in rio_register_scan()
1894 list_add_tail(&scan->node, &rio_scans); in rio_register_scan()
1904 * rio_mport_scan - execute enumeration/discovery on the specified mport
1914 if (port->id == mport_id) in rio_mport_scan()
1918 return -ENODEV; in rio_mport_scan()
1920 if (!port->nscan) { in rio_mport_scan()
1922 return -EINVAL; in rio_mport_scan()
1925 if (!try_module_get(port->nscan->owner)) { in rio_mport_scan()
1927 return -ENODEV; in rio_mport_scan()
1932 if (port->host_deviceid >= 0) in rio_mport_scan()
1933 rc = port->nscan->enumerate(port, 0); in rio_mport_scan()
1935 rc = port->nscan->discover(port, RIO_SCAN_ENUM_NO_WAIT); in rio_mport_scan()
1937 module_put(port->nscan->owner); in rio_mport_scan()
1954 work->mport->id, work->mport->name); in disc_work_handler()
1955 if (try_module_get(work->mport->nscan->owner)) { in disc_work_handler()
1956 work->mport->nscan->discover(work->mport, 0); in disc_work_handler()
1957 module_put(work->mport->nscan->owner); in disc_work_handler()
1968 return -ENODEV; in rio_init_mports()
1972 * on any of the registered mports. in rio_init_mports()
1976 if (port->host_deviceid >= 0) { in rio_init_mports()
1977 if (port->nscan && try_module_get(port->nscan->owner)) { in rio_init_mports()
1978 port->nscan->enumerate(port, 0); in rio_init_mports()
1979 module_put(port->nscan->owner); in rio_init_mports()
2012 if (port->host_deviceid < 0 && port->nscan) { in rio_init_mports()
2034 return -1; in rio_get_hdid()
2043 return -ENODEV; in rio_mport_initialize()
2046 atomic_set(&mport->state, RIO_DEVICE_INITIALIZING); in rio_mport_initialize()
2047 mport->id = next_portid++; in rio_mport_initialize()
2048 mport->host_deviceid = rio_get_hdid(mport->id); in rio_mport_initialize()
2049 mport->nscan = NULL; in rio_mport_initialize()
2050 mutex_init(&mport->lock); in rio_mport_initialize()
2051 mport->pwe_refcnt = 0; in rio_mport_initialize()
2052 INIT_LIST_HEAD(&mport->pwrites); in rio_mport_initialize()
2060 struct rio_scan_node *scan = NULL; in rio_register_mport() local
2069 list_for_each_entry(scan, &rio_scans, node) { in rio_register_mport()
2070 if (port->id == scan->mport_id || in rio_register_mport()
2071 scan->mport_id == RIO_MPORT_ANY) { in rio_register_mport()
2072 port->nscan = scan->ops; in rio_register_mport()
2073 if (port->id == scan->mport_id) in rio_register_mport()
2078 list_add_tail(&port->node, &rio_mports); in rio_register_mport()
2081 dev_set_name(&port->dev, "rapidio%d", port->id); in rio_register_mport()
2082 port->dev.class = &rio_mport_class; in rio_register_mport()
2083 atomic_set(&port->state, RIO_DEVICE_RUNNING); in rio_register_mport()
2085 res = device_register(&port->dev); in rio_register_mport()
2087 dev_err(&port->dev, "RIO: mport%d registration failed ERR=%d\n", in rio_register_mport()
2088 port->id, res); in rio_register_mport()
2090 list_del(&port->node); in rio_register_mport()
2092 put_device(&port->dev); in rio_register_mport()
2094 dev_dbg(&port->dev, "RIO: registered mport%d\n", port->id); in rio_register_mport()
2105 if (dev->bus == &rio_bus_type) in rio_mport_cleanup_callback()
2113 * Unregister all RapidIO devices residing on this net (this will in rio_net_remove_children()
2116 device_for_each_child(&net->dev, NULL, rio_mport_cleanup_callback); in rio_net_remove_children()
2122 pr_debug("RIO: %s %s id=%d\n", __func__, port->name, port->id); in rio_unregister_mport()
2125 if (atomic_cmpxchg(&port->state, in rio_unregister_mport()
2129 __func__, port->name); in rio_unregister_mport()
2132 if (port->net && port->net->hport == port) { in rio_unregister_mport()
2133 rio_net_remove_children(port->net); in rio_unregister_mport()
2134 rio_free_net(port->net); in rio_unregister_mport()
2142 list_del(&port->node); in rio_unregister_mport()
2144 device_unregister(&port->dev); in rio_unregister_mport()