aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/rapidio/rio.c
diff options
context:
space:
mode:
authorAlexandre Bounine <alexandre.bounine@idt.com>2011-01-12 20:00:38 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2011-01-13 11:03:17 -0500
commita93192a5d245a262dc52fa426de5b20467308a77 (patch)
treef3231240286ef3d204375e047f6b2e1a8efbbcd2 /drivers/rapidio/rio.c
parente6d7202b66d99bf514c8e901db68386b1fcd6d56 (diff)
rapidio: use common destid storage for endpoints and switches
Change code to use one storage location common for switches and endpoints. This eliminates unnecessary device type checks during basic access operations. Logic that assigns destid to RIO devices stays unchanged - as before, switches use an associated destid because they do not have their own. Signed-off-by: Alexandre Bounine <alexandre.bounine@idt.com> Cc: Kumar Gala <galak@kernel.crashing.org> Cc: Matt Porter <mporter@kernel.crashing.org> Cc: Li Yang <leoli@freescale.com> Cc: Thomas Moll <thomas.moll@sysgo.com> Cc: Micha Nelissen <micha@neli.hopto.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/rapidio/rio.c')
-rw-r--r--drivers/rapidio/rio.c74
1 files changed, 22 insertions, 52 deletions
diff --git a/drivers/rapidio/rio.c b/drivers/rapidio/rio.c
index 7b5080c45569..c13289e10bb1 100644
--- a/drivers/rapidio/rio.c
+++ b/drivers/rapidio/rio.c
@@ -471,16 +471,9 @@ exit:
471 */ 471 */
472int rio_set_port_lockout(struct rio_dev *rdev, u32 pnum, int lock) 472int rio_set_port_lockout(struct rio_dev *rdev, u32 pnum, int lock)
473{ 473{
474 u8 hopcount = 0xff;
475 u16 destid = rdev->destid;
476 u32 regval; 474 u32 regval;
477 475
478 if (rdev->rswitch) { 476 rio_read_config_32(rdev,
479 destid = rdev->rswitch->destid;
480 hopcount = rdev->rswitch->hopcount;
481 }
482
483 rio_mport_read_config_32(rdev->net->hport, destid, hopcount,
484 rdev->phys_efptr + RIO_PORT_N_CTL_CSR(pnum), 477 rdev->phys_efptr + RIO_PORT_N_CTL_CSR(pnum),
485 &regval); 478 &regval);
486 if (lock) 479 if (lock)
@@ -488,7 +481,7 @@ int rio_set_port_lockout(struct rio_dev *rdev, u32 pnum, int lock)
488 else 481 else
489 regval &= ~RIO_PORT_N_CTL_LOCKOUT; 482 regval &= ~RIO_PORT_N_CTL_LOCKOUT;
490 483
491 rio_mport_write_config_32(rdev->net->hport, destid, hopcount, 484 rio_write_config_32(rdev,
492 rdev->phys_efptr + RIO_PORT_N_CTL_CSR(pnum), 485 rdev->phys_efptr + RIO_PORT_N_CTL_CSR(pnum),
493 regval); 486 regval);
494 return 0; 487 return 0;
@@ -507,7 +500,7 @@ static int
507rio_chk_dev_route(struct rio_dev *rdev, struct rio_dev **nrdev, int *npnum) 500rio_chk_dev_route(struct rio_dev *rdev, struct rio_dev **nrdev, int *npnum)
508{ 501{
509 u32 result; 502 u32 result;
510 int p_port, dstid, rc = -EIO; 503 int p_port, rc = -EIO;
511 struct rio_dev *prev = NULL; 504 struct rio_dev *prev = NULL;
512 505
513 /* Find switch with failed RIO link */ 506 /* Find switch with failed RIO link */
@@ -522,9 +515,7 @@ rio_chk_dev_route(struct rio_dev *rdev, struct rio_dev **nrdev, int *npnum)
522 if (prev == NULL) 515 if (prev == NULL)
523 goto err_out; 516 goto err_out;
524 517
525 dstid = (rdev->pef & RIO_PEF_SWITCH) ? 518 p_port = prev->rswitch->route_table[rdev->destid];
526 rdev->rswitch->destid : rdev->destid;
527 p_port = prev->rswitch->route_table[dstid];
528 519
529 if (p_port != RIO_INVALID_ROUTE) { 520 if (p_port != RIO_INVALID_ROUTE) {
530 pr_debug("RIO: link failed on [%s]-P%d\n", 521 pr_debug("RIO: link failed on [%s]-P%d\n",
@@ -567,15 +558,8 @@ rio_mport_chk_dev_access(struct rio_mport *mport, u16 destid, u8 hopcount)
567 */ 558 */
568static int rio_chk_dev_access(struct rio_dev *rdev) 559static int rio_chk_dev_access(struct rio_dev *rdev)
569{ 560{
570 u8 hopcount = 0xff; 561 return rio_mport_chk_dev_access(rdev->net->hport,
571 u16 destid = rdev->destid; 562 rdev->destid, rdev->hopcount);
572
573 if (rdev->rswitch) {
574 destid = rdev->rswitch->destid;
575 hopcount = rdev->rswitch->hopcount;
576 }
577
578 return rio_mport_chk_dev_access(rdev->net->hport, destid, hopcount);
579} 563}
580 564
581/** 565/**
@@ -588,23 +572,20 @@ static int rio_chk_dev_access(struct rio_dev *rdev)
588static int 572static int
589rio_get_input_status(struct rio_dev *rdev, int pnum, u32 *lnkresp) 573rio_get_input_status(struct rio_dev *rdev, int pnum, u32 *lnkresp)
590{ 574{
591 struct rio_mport *mport = rdev->net->hport;
592 u16 destid = rdev->rswitch->destid;
593 u8 hopcount = rdev->rswitch->hopcount;
594 u32 regval; 575 u32 regval;
595 int checkcount; 576 int checkcount;
596 577
597 if (lnkresp) { 578 if (lnkresp) {
598 /* Read from link maintenance response register 579 /* Read from link maintenance response register
599 * to clear valid bit */ 580 * to clear valid bit */
600 rio_mport_read_config_32(mport, destid, hopcount, 581 rio_read_config_32(rdev,
601 rdev->phys_efptr + RIO_PORT_N_MNT_RSP_CSR(pnum), 582 rdev->phys_efptr + RIO_PORT_N_MNT_RSP_CSR(pnum),
602 &regval); 583 &regval);
603 udelay(50); 584 udelay(50);
604 } 585 }
605 586
606 /* Issue Input-status command */ 587 /* Issue Input-status command */
607 rio_mport_write_config_32(mport, destid, hopcount, 588 rio_write_config_32(rdev,
608 rdev->phys_efptr + RIO_PORT_N_MNT_REQ_CSR(pnum), 589 rdev->phys_efptr + RIO_PORT_N_MNT_REQ_CSR(pnum),
609 RIO_MNT_REQ_CMD_IS); 590 RIO_MNT_REQ_CMD_IS);
610 591
@@ -615,7 +596,7 @@ rio_get_input_status(struct rio_dev *rdev, int pnum, u32 *lnkresp)
615 checkcount = 3; 596 checkcount = 3;
616 while (checkcount--) { 597 while (checkcount--) {
617 udelay(50); 598 udelay(50);
618 rio_mport_read_config_32(mport, destid, hopcount, 599 rio_read_config_32(rdev,
619 rdev->phys_efptr + RIO_PORT_N_MNT_RSP_CSR(pnum), 600 rdev->phys_efptr + RIO_PORT_N_MNT_RSP_CSR(pnum),
620 &regval); 601 &regval);
621 if (regval & RIO_PORT_N_MNT_RSP_RVAL) { 602 if (regval & RIO_PORT_N_MNT_RSP_RVAL) {
@@ -635,15 +616,12 @@ rio_get_input_status(struct rio_dev *rdev, int pnum, u32 *lnkresp)
635 */ 616 */
636static int rio_clr_err_stopped(struct rio_dev *rdev, u32 pnum, u32 err_status) 617static int rio_clr_err_stopped(struct rio_dev *rdev, u32 pnum, u32 err_status)
637{ 618{
638 struct rio_mport *mport = rdev->net->hport;
639 u16 destid = rdev->rswitch->destid;
640 u8 hopcount = rdev->rswitch->hopcount;
641 struct rio_dev *nextdev = rdev->rswitch->nextdev[pnum]; 619 struct rio_dev *nextdev = rdev->rswitch->nextdev[pnum];
642 u32 regval; 620 u32 regval;
643 u32 far_ackid, far_linkstat, near_ackid; 621 u32 far_ackid, far_linkstat, near_ackid;
644 622
645 if (err_status == 0) 623 if (err_status == 0)
646 rio_mport_read_config_32(mport, destid, hopcount, 624 rio_read_config_32(rdev,
647 rdev->phys_efptr + RIO_PORT_N_ERR_STS_CSR(pnum), 625 rdev->phys_efptr + RIO_PORT_N_ERR_STS_CSR(pnum),
648 &err_status); 626 &err_status);
649 627
@@ -661,7 +639,7 @@ static int rio_clr_err_stopped(struct rio_dev *rdev, u32 pnum, u32 err_status)
661 pnum, regval); 639 pnum, regval);
662 far_ackid = (regval & RIO_PORT_N_MNT_RSP_ASTAT) >> 5; 640 far_ackid = (regval & RIO_PORT_N_MNT_RSP_ASTAT) >> 5;
663 far_linkstat = regval & RIO_PORT_N_MNT_RSP_LSTAT; 641 far_linkstat = regval & RIO_PORT_N_MNT_RSP_LSTAT;
664 rio_mport_read_config_32(mport, destid, hopcount, 642 rio_read_config_32(rdev,
665 rdev->phys_efptr + RIO_PORT_N_ACK_STS_CSR(pnum), 643 rdev->phys_efptr + RIO_PORT_N_ACK_STS_CSR(pnum),
666 &regval); 644 &regval);
667 pr_debug("RIO_EM: SP%d_ACK_STS_CSR=0x%08x\n", pnum, regval); 645 pr_debug("RIO_EM: SP%d_ACK_STS_CSR=0x%08x\n", pnum, regval);
@@ -679,9 +657,8 @@ static int rio_clr_err_stopped(struct rio_dev *rdev, u32 pnum, u32 err_status)
679 /* Align near outstanding/outbound ackIDs with 657 /* Align near outstanding/outbound ackIDs with
680 * far inbound. 658 * far inbound.
681 */ 659 */
682 rio_mport_write_config_32(mport, destid, 660 rio_write_config_32(rdev,
683 hopcount, rdev->phys_efptr + 661 rdev->phys_efptr + RIO_PORT_N_ACK_STS_CSR(pnum),
684 RIO_PORT_N_ACK_STS_CSR(pnum),
685 (near_ackid << 24) | 662 (near_ackid << 24) |
686 (far_ackid << 8) | far_ackid); 663 (far_ackid << 8) | far_ackid);
687 /* Align far outstanding/outbound ackIDs with 664 /* Align far outstanding/outbound ackIDs with
@@ -698,7 +675,7 @@ static int rio_clr_err_stopped(struct rio_dev *rdev, u32 pnum, u32 err_status)
698 pr_debug("RIO_EM: Invalid nextdev pointer (NULL)\n"); 675 pr_debug("RIO_EM: Invalid nextdev pointer (NULL)\n");
699 } 676 }
700rd_err: 677rd_err:
701 rio_mport_read_config_32(mport, destid, hopcount, 678 rio_read_config_32(rdev,
702 rdev->phys_efptr + RIO_PORT_N_ERR_STS_CSR(pnum), 679 rdev->phys_efptr + RIO_PORT_N_ERR_STS_CSR(pnum),
703 &err_status); 680 &err_status);
704 pr_debug("RIO_EM: SP%d_ERR_STS_CSR=0x%08x\n", pnum, err_status); 681 pr_debug("RIO_EM: SP%d_ERR_STS_CSR=0x%08x\n", pnum, err_status);
@@ -710,7 +687,7 @@ rd_err:
710 RIO_GET_PORT_NUM(nextdev->swpinfo), NULL); 687 RIO_GET_PORT_NUM(nextdev->swpinfo), NULL);
711 udelay(50); 688 udelay(50);
712 689
713 rio_mport_read_config_32(mport, destid, hopcount, 690 rio_read_config_32(rdev,
714 rdev->phys_efptr + RIO_PORT_N_ERR_STS_CSR(pnum), 691 rdev->phys_efptr + RIO_PORT_N_ERR_STS_CSR(pnum),
715 &err_status); 692 &err_status);
716 pr_debug("RIO_EM: SP%d_ERR_STS_CSR=0x%08x\n", pnum, err_status); 693 pr_debug("RIO_EM: SP%d_ERR_STS_CSR=0x%08x\n", pnum, err_status);
@@ -730,9 +707,6 @@ rd_err:
730int rio_inb_pwrite_handler(union rio_pw_msg *pw_msg) 707int rio_inb_pwrite_handler(union rio_pw_msg *pw_msg)
731{ 708{
732 struct rio_dev *rdev; 709 struct rio_dev *rdev;
733 struct rio_mport *mport;
734 u8 hopcount;
735 u16 destid;
736 u32 err_status, em_perrdet, em_ltlerrdet; 710 u32 err_status, em_perrdet, em_ltlerrdet;
737 int rc, portnum; 711 int rc, portnum;
738 712
@@ -800,17 +774,13 @@ int rio_inb_pwrite_handler(union rio_pw_msg *pw_msg)
800 return 0; 774 return 0;
801 } 775 }
802 776
803 mport = rdev->net->hport;
804 destid = rdev->rswitch->destid;
805 hopcount = rdev->rswitch->hopcount;
806
807 /* 777 /*
808 * Process the port-write notification from switch 778 * Process the port-write notification from switch
809 */ 779 */
810 if (rdev->rswitch->em_handle) 780 if (rdev->rswitch->em_handle)
811 rdev->rswitch->em_handle(rdev, portnum); 781 rdev->rswitch->em_handle(rdev, portnum);
812 782
813 rio_mport_read_config_32(mport, destid, hopcount, 783 rio_read_config_32(rdev,
814 rdev->phys_efptr + RIO_PORT_N_ERR_STS_CSR(portnum), 784 rdev->phys_efptr + RIO_PORT_N_ERR_STS_CSR(portnum),
815 &err_status); 785 &err_status);
816 pr_debug("RIO_PW: SP%d_ERR_STS_CSR=0x%08x\n", portnum, err_status); 786 pr_debug("RIO_PW: SP%d_ERR_STS_CSR=0x%08x\n", portnum, err_status);
@@ -840,7 +810,7 @@ int rio_inb_pwrite_handler(union rio_pw_msg *pw_msg)
840 rdev->rswitch->port_ok &= ~(1 << portnum); 810 rdev->rswitch->port_ok &= ~(1 << portnum);
841 rio_set_port_lockout(rdev, portnum, 1); 811 rio_set_port_lockout(rdev, portnum, 1);
842 812
843 rio_mport_write_config_32(mport, destid, hopcount, 813 rio_write_config_32(rdev,
844 rdev->phys_efptr + 814 rdev->phys_efptr +
845 RIO_PORT_N_ACK_STS_CSR(portnum), 815 RIO_PORT_N_ACK_STS_CSR(portnum),
846 RIO_PORT_N_ACK_CLEAR); 816 RIO_PORT_N_ACK_CLEAR);
@@ -851,28 +821,28 @@ int rio_inb_pwrite_handler(union rio_pw_msg *pw_msg)
851 } 821 }
852 } 822 }
853 823
854 rio_mport_read_config_32(mport, destid, hopcount, 824 rio_read_config_32(rdev,
855 rdev->em_efptr + RIO_EM_PN_ERR_DETECT(portnum), &em_perrdet); 825 rdev->em_efptr + RIO_EM_PN_ERR_DETECT(portnum), &em_perrdet);
856 if (em_perrdet) { 826 if (em_perrdet) {
857 pr_debug("RIO_PW: RIO_EM_P%d_ERR_DETECT=0x%08x\n", 827 pr_debug("RIO_PW: RIO_EM_P%d_ERR_DETECT=0x%08x\n",
858 portnum, em_perrdet); 828 portnum, em_perrdet);
859 /* Clear EM Port N Error Detect CSR */ 829 /* Clear EM Port N Error Detect CSR */
860 rio_mport_write_config_32(mport, destid, hopcount, 830 rio_write_config_32(rdev,
861 rdev->em_efptr + RIO_EM_PN_ERR_DETECT(portnum), 0); 831 rdev->em_efptr + RIO_EM_PN_ERR_DETECT(portnum), 0);
862 } 832 }
863 833
864 rio_mport_read_config_32(mport, destid, hopcount, 834 rio_read_config_32(rdev,
865 rdev->em_efptr + RIO_EM_LTL_ERR_DETECT, &em_ltlerrdet); 835 rdev->em_efptr + RIO_EM_LTL_ERR_DETECT, &em_ltlerrdet);
866 if (em_ltlerrdet) { 836 if (em_ltlerrdet) {
867 pr_debug("RIO_PW: RIO_EM_LTL_ERR_DETECT=0x%08x\n", 837 pr_debug("RIO_PW: RIO_EM_LTL_ERR_DETECT=0x%08x\n",
868 em_ltlerrdet); 838 em_ltlerrdet);
869 /* Clear EM L/T Layer Error Detect CSR */ 839 /* Clear EM L/T Layer Error Detect CSR */
870 rio_mport_write_config_32(mport, destid, hopcount, 840 rio_write_config_32(rdev,
871 rdev->em_efptr + RIO_EM_LTL_ERR_DETECT, 0); 841 rdev->em_efptr + RIO_EM_LTL_ERR_DETECT, 0);
872 } 842 }
873 843
874 /* Clear remaining error bits and Port-Write Pending bit */ 844 /* Clear remaining error bits and Port-Write Pending bit */
875 rio_mport_write_config_32(mport, destid, hopcount, 845 rio_write_config_32(rdev,
876 rdev->phys_efptr + RIO_PORT_N_ERR_STS_CSR(portnum), 846 rdev->phys_efptr + RIO_PORT_N_ERR_STS_CSR(portnum),
877 err_status); 847 err_status);
878 848