18 #include <linux/types.h>
19 #include <linux/kernel.h>
27 #include <linux/module.h>
29 #include <linux/slab.h>
35 static unsigned char next_portid;
50 rio_local_read_config_32(port,
RIO_DID_CSR, &result);
70 void (*minb) (
struct rio_mport * mport,
void *dev_id,
int mbox,
76 if (mport->
ops->open_inb_mbox ==
NULL)
82 rio_init_mbox_res(res, mbox, mbox);
97 rc = mport->
ops->open_inb_mbox(mport, dev_id, mbox, entries);
115 if (mport->
ops->close_inb_mbox) {
116 mport->
ops->close_inb_mbox(mport, mbox);
139 void (*moutb) (
struct rio_mport * mport,
void *dev_id,
int mbox,
int slot))
144 if (mport->
ops->open_outb_mbox ==
NULL)
150 rio_init_mbox_res(res, mbox, mbox);
165 rc = mport->
ops->open_outb_mbox(mport, dev_id, mbox, entries);
183 if (mport->
ops->close_outb_mbox) {
184 mport->
ops->close_outb_mbox(mport, mbox);
250 rio_init_dbell_res(res, start, end);
261 rc = rio_setup_inb_dbell(mport, dev_id, res, dinb);
281 int rc = 0, found = 0;
285 if ((dbell->
res->start == start) && (dbell->
res->end == end)) {
325 rio_init_dbell_res(res, start, end);
419 if (!mport->
ops->map_inb)
422 rc = mport->
ops->map_inb(mport, local, rbase, size, rflags);
423 spin_unlock_irqrestore(&rio_mmap_lock, flags);
436 if (!mport->
ops->unmap_inb)
439 mport->
ops->unmap_inb(mport, lstart);
440 spin_unlock_irqrestore(&rio_mmap_lock, flags);
454 u16 destid,
u8 hopcount)
461 while (ext_ftr_ptr) {
463 rio_local_read_config_32(port, ext_ftr_ptr,
467 ext_ftr_ptr, &ftr_header);
470 switch (ftr_header) {
487 hopcount, ext_ftr_ptr);
535 rio_read_config_32(rdev,
543 rio_write_config_32(rdev,
559 rio_chk_dev_route(
struct rio_dev *rdev,
struct rio_dev **nrdev,
int *npnum)
562 int p_port, rc = -
EIO;
580 pr_debug(
"RIO: link failed on [%s]-P%d\n",
581 rio_name(prev), p_port);
586 pr_debug(
"RIO: failed to trace route to %s\n", rio_name(rdev));
618 static int rio_chk_dev_access(
struct rio_dev *rdev)
632 rio_get_input_status(
struct rio_dev *rdev,
int pnum,
u32 *lnkresp)
640 rio_read_config_32(rdev,
647 rio_write_config_32(rdev,
656 while (checkcount--) {
658 rio_read_config_32(rdev,
676 static int rio_clr_err_stopped(
struct rio_dev *rdev,
u32 pnum,
u32 err_status)
680 u32 far_ackid, far_linkstat, near_ackid;
683 rio_read_config_32(rdev,
688 pr_debug(
"RIO_EM: servicing Output Error-Stopped state\n");
692 if (rio_get_input_status(rdev, pnum, ®val)) {
693 pr_debug(
"RIO_EM: Input-status response timeout\n");
697 pr_debug(
"RIO_EM: SP%d Input-status response=0x%08x\n",
701 rio_read_config_32(rdev,
704 pr_debug(
"RIO_EM: SP%d_ACK_STS_CSR=0x%08x\n", pnum, regval);
706 pr_debug(
"RIO_EM: SP%d far_ackID=0x%02x far_linkstat=0x%02x" \
707 " near_ackID=0x%02x\n",
708 pnum, far_ackid, far_linkstat, near_ackid);
719 rio_write_config_32(rdev,
722 (far_ackid << 8) | far_ackid);
728 rio_write_config_32(nextdev,
732 (near_ackid << 8) | near_ackid);
734 pr_debug(
"RIO_EM: Invalid nextdev pointer (NULL)\n");
737 rio_read_config_32(rdev,
740 pr_debug(
"RIO_EM: SP%d_ERR_STS_CSR=0x%08x\n", pnum, err_status);
744 pr_debug(
"RIO_EM: servicing Input Error-Stopped state\n");
745 rio_get_input_status(nextdev,
749 rio_read_config_32(rdev,
752 pr_debug(
"RIO_EM: SP%d_ERR_STS_CSR=0x%08x\n", pnum, err_status);
755 return (err_status & (RIO_PORT_N_ERR_STS_PW_OUT_ES |
756 RIO_PORT_N_ERR_STS_PW_INP_ES)) ? 1 : 0;
769 u32 err_status, em_perrdet, em_ltlerrdet;
775 pr_debug(
"RIO: %s No matching device for CTag 0x%08x\n",
776 __func__, pw_msg->
em.comptag);
780 pr_debug(
"RIO: Port-Write message from %s\n", rio_name(rdev));
786 pr_debug(
"0x%02x: %08x %08x %08x %08x\n",
787 i*4, pw_msg->
raw[i], pw_msg->
raw[i + 1],
788 pw_msg->
raw[i + 2], pw_msg->
raw[i + 3]);
801 rc = rdev->
pwcback(rdev, pw_msg, 0);
806 portnum = pw_msg->
em.is_port & 0xFF;
812 if (rio_chk_dev_access(rdev)) {
813 pr_debug(
"RIO: device access failed - get link partner\n");
818 if (rio_chk_dev_route(rdev, &rdev, &portnum)) {
819 pr_err(
"RIO: Route trace for %s failed\n",
831 pr_err(
"RIO_PW: Bad switch initialization for %s\n",
840 rdev->
rswitch->em_handle(rdev, portnum);
842 rio_read_config_32(rdev,
845 pr_debug(
"RIO_PW: SP%d_ERR_STS_CSR=0x%08x\n", portnum, err_status);
849 if (!(rdev->
rswitch->port_ok & (1 << portnum))) {
850 rdev->
rswitch->port_ok |= (1 << portnum);
853 pr_debug(
"RIO_PW: Device Insertion on [%s]-P%d\n",
854 rio_name(rdev), portnum);
861 if (err_status & (RIO_PORT_N_ERR_STS_PW_OUT_ES |
862 RIO_PORT_N_ERR_STS_PW_INP_ES)) {
863 if (rio_clr_err_stopped(rdev, portnum, err_status))
864 rio_clr_err_stopped(rdev, portnum, 0);
868 if (rdev->
rswitch->port_ok & (1 << portnum)) {
869 rdev->
rswitch->port_ok &= ~(1 << portnum);
872 rio_write_config_32(rdev,
878 pr_debug(
"RIO_PW: Device Extraction on [%s]-P%d\n",
879 rio_name(rdev), portnum);
883 rio_read_config_32(rdev,
886 pr_debug(
"RIO_PW: RIO_EM_P%d_ERR_DETECT=0x%08x\n",
887 portnum, em_perrdet);
889 rio_write_config_32(rdev,
893 rio_read_config_32(rdev,
896 pr_debug(
"RIO_PW: RIO_EM_LTL_ERR_DETECT=0x%08x\n",
899 rio_write_config_32(rdev,
904 rio_write_config_32(rdev,
937 rio_local_read_config_32(port, from, ®_val);
975 u32 asm_info, ext_ftr_ptr, ftr_header;
985 while (ext_ftr_ptr) {
987 rio_local_read_config_32(port, ext_ftr_ptr,
991 ext_ftr_ptr, &ftr_header);
1112 *route_port = (
u8)result;
1129 u32 max_destid = 0xff;
1130 u32 i,
pef, id_inc = 1, ext_cfg = 0;
1145 ext_cfg = 0x80000000;
1153 for (i = 0; i <= max_destid;) {
1168 #ifdef CONFIG_RAPIDIO_DMA_ENGINE
1175 return (rdev->
net->hport ==
1203 void rio_release_dma(
struct dma_chan *dchan)
1228 struct rio_dma_ext rio_ext;
1230 if (dchan->
device->device_prep_slave_sg ==
NULL) {
1231 pr_err(
"%s: prep_rio_sg == NULL\n", __func__);
1235 rio_ext.destid = rdev->
destid;
1236 rio_ext.rio_addr_u = data->rio_addr_u;
1237 rio_ext.rio_addr = data->rio_addr;
1238 rio_ext.wr_type = data->wr_type;
1240 txd = dmaengine_prep_rio_sg(dchan, data->sg, data->sg_len,
1241 direction, flags, &rio_ext);
1249 static void rio_fixup_device(
struct rio_dev *
dev)
1258 rio_fixup_device(dev);
1275 pr_debug(
"RIO: discovery work for mport %d %s\n",
1313 pr_err(
"RIO: unable allocate rio_wq\n");
1319 pr_err(
"RIO: no memory for work struct\n");
1328 INIT_WORK(&work[n].work, disc_work_handler);
1335 pr_debug(
"RIO: destroy discovery workqueue\n");
1349 static int rio_get_hdid(
int index)
1354 return hdids[index + 1];
1357 static int rio_hdid_setup(
char *
str)
1363 __setup(
"riohdid=", rio_hdid_setup);
1368 pr_err(
"RIO: reached specified max number of mports\n");
1372 port->
id = next_portid++;