Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[SCSI] bfa: Flash Controller PLL initialization fixes

- Made changes to check the flash controller status before IOC initialization.
- Made changes to poll on the FLASH_STS_REG bit to check if the flash controller
initialization is completed during the PLL init.

Signed-off-by: Vijaya Mohan Guvva <vmohan@brocade.com>
Signed-off-by: Krishna Gudipati <kgudipat@brocade.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>

authored by

Krishna Gudipati and committed by
James Bottomley
227fab90 7ac83b1f

+136 -88
+133 -88
drivers/scsi/bfa/bfa_ioc_ct.c
··· 744 744 void 745 745 bfa_ioc_ct2_mac_reset(void __iomem *rb) 746 746 { 747 - u32 r32; 748 - 749 - bfa_ioc_ct2_sclk_init(rb); 750 - bfa_ioc_ct2_lclk_init(rb); 751 - 752 - /* 753 - * release soft reset on s_clk & l_clk 754 - */ 755 - r32 = readl((rb + CT2_APP_PLL_SCLK_CTL_REG)); 756 - writel(r32 & ~__APP_PLL_SCLK_LOGIC_SOFT_RESET, 757 - (rb + CT2_APP_PLL_SCLK_CTL_REG)); 758 - 759 - /* 760 - * release soft reset on s_clk & l_clk 761 - */ 762 - r32 = readl((rb + CT2_APP_PLL_LCLK_CTL_REG)); 763 - writel(r32 & ~__APP_PLL_LCLK_LOGIC_SOFT_RESET, 764 - (rb + CT2_APP_PLL_LCLK_CTL_REG)); 765 - 766 747 /* put port0, port1 MAC & AHB in reset */ 767 748 writel((__CSI_MAC_RESET | __CSI_MAC_AHB_RESET), 768 749 rb + CT2_CSI_MAC_CONTROL_REG(0)); ··· 751 770 rb + CT2_CSI_MAC_CONTROL_REG(1)); 752 771 } 753 772 773 + static void 774 + bfa_ioc_ct2_enable_flash(void __iomem *rb) 775 + { 776 + u32 r32; 777 + 778 + r32 = readl((rb + PSS_GPIO_OUT_REG)); 779 + writel(r32 & ~1, (rb + PSS_GPIO_OUT_REG)); 780 + r32 = readl((rb + PSS_GPIO_OE_REG)); 781 + writel(r32 | 1, (rb + PSS_GPIO_OE_REG)); 782 + } 783 + 754 784 #define CT2_NFC_MAX_DELAY 1000 755 - #define CT2_NFC_VER_VALID 0x143 785 + #define CT2_NFC_PAUSE_MAX_DELAY 4000 786 + #define CT2_NFC_VER_VALID 0x147 787 + #define CT2_NFC_STATE_RUNNING 0x20000001 756 788 #define BFA_IOC_PLL_POLL 1000000 757 789 758 790 static bfa_boolean_t ··· 778 784 return BFA_TRUE; 779 785 780 786 return BFA_FALSE; 787 + } 788 + 789 + static void 790 + bfa_ioc_ct2_nfc_halt(void __iomem *rb) 791 + { 792 + int i; 793 + 794 + writel(__HALT_NFC_CONTROLLER, rb + CT2_NFC_CSR_SET_REG); 795 + for (i = 0; i < CT2_NFC_MAX_DELAY; i++) { 796 + if (bfa_ioc_ct2_nfc_halted(rb)) 797 + break; 798 + udelay(1000); 799 + } 800 + WARN_ON(!bfa_ioc_ct2_nfc_halted(rb)); 781 801 } 782 802 783 803 static void ··· 810 802 WARN_ON(1); 811 803 } 812 804 805 + static void 806 + bfa_ioc_ct2_clk_reset(void __iomem *rb) 807 + { 808 + u32 r32; 809 + 810 + bfa_ioc_ct2_sclk_init(rb); 811 + bfa_ioc_ct2_lclk_init(rb); 812 + 813 + /* 814 + * release soft reset on s_clk & l_clk 815 + */ 816 + r32 = readl((rb + CT2_APP_PLL_SCLK_CTL_REG)); 817 + writel(r32 & ~__APP_PLL_SCLK_LOGIC_SOFT_RESET, 818 + (rb + CT2_APP_PLL_SCLK_CTL_REG)); 819 + 820 + r32 = readl((rb + CT2_APP_PLL_LCLK_CTL_REG)); 821 + writel(r32 & ~__APP_PLL_LCLK_LOGIC_SOFT_RESET, 822 + (rb + CT2_APP_PLL_LCLK_CTL_REG)); 823 + 824 + } 825 + 826 + static void 827 + bfa_ioc_ct2_nfc_clk_reset(void __iomem *rb) 828 + { 829 + u32 r32, i; 830 + 831 + r32 = readl((rb + PSS_CTL_REG)); 832 + r32 |= (__PSS_LPU0_RESET | __PSS_LPU1_RESET); 833 + writel(r32, (rb + PSS_CTL_REG)); 834 + 835 + writel(__RESET_AND_START_SCLK_LCLK_PLLS, rb + CT2_CSI_FW_CTL_SET_REG); 836 + 837 + for (i = 0; i < BFA_IOC_PLL_POLL; i++) { 838 + r32 = readl(rb + CT2_NFC_FLASH_STS_REG); 839 + 840 + if ((r32 & __FLASH_PLL_INIT_AND_RESET_IN_PROGRESS)) 841 + break; 842 + } 843 + WARN_ON(!(r32 & __FLASH_PLL_INIT_AND_RESET_IN_PROGRESS)); 844 + 845 + for (i = 0; i < BFA_IOC_PLL_POLL; i++) { 846 + r32 = readl(rb + CT2_NFC_FLASH_STS_REG); 847 + 848 + if (!(r32 & __FLASH_PLL_INIT_AND_RESET_IN_PROGRESS)) 849 + break; 850 + } 851 + WARN_ON((r32 & __FLASH_PLL_INIT_AND_RESET_IN_PROGRESS)); 852 + 853 + r32 = readl(rb + CT2_CSI_FW_CTL_REG); 854 + WARN_ON((r32 & __RESET_AND_START_SCLK_LCLK_PLLS)); 855 + } 856 + 857 + static void 858 + bfa_ioc_ct2_wait_till_nfc_running(void __iomem *rb) 859 + { 860 + u32 r32; 861 + int i; 862 + 863 + if (bfa_ioc_ct2_nfc_halted(rb)) 864 + bfa_ioc_ct2_nfc_resume(rb); 865 + for (i = 0; i < CT2_NFC_PAUSE_MAX_DELAY; i++) { 866 + r32 = readl(rb + CT2_NFC_STS_REG); 867 + if (r32 == CT2_NFC_STATE_RUNNING) 868 + return; 869 + udelay(1000); 870 + } 871 + 872 + r32 = readl(rb + CT2_NFC_STS_REG); 873 + WARN_ON(!(r32 == CT2_NFC_STATE_RUNNING)); 874 + } 875 + 813 876 bfa_status_t 814 877 bfa_ioc_ct2_pll_init(void __iomem *rb, enum bfi_asic_mode mode) 815 878 { 816 - u32 wgn, r32, nfc_ver, i; 879 + u32 wgn, r32, nfc_ver; 817 880 818 881 wgn = readl(rb + CT2_WGN_STATUS); 819 - nfc_ver = readl(rb + CT2_RSC_GPR15_REG); 820 882 821 - if ((wgn == (__A2T_AHB_LOAD | __WGN_READY)) && 822 - (nfc_ver >= CT2_NFC_VER_VALID)) { 823 - if (bfa_ioc_ct2_nfc_halted(rb)) 824 - bfa_ioc_ct2_nfc_resume(rb); 825 - 826 - writel(__RESET_AND_START_SCLK_LCLK_PLLS, 827 - rb + CT2_CSI_FW_CTL_SET_REG); 828 - 829 - for (i = 0; i < BFA_IOC_PLL_POLL; i++) { 830 - r32 = readl(rb + CT2_APP_PLL_LCLK_CTL_REG); 831 - if (r32 & __RESET_AND_START_SCLK_LCLK_PLLS) 832 - break; 833 - } 834 - 835 - WARN_ON(!(r32 & __RESET_AND_START_SCLK_LCLK_PLLS)); 836 - 837 - for (i = 0; i < BFA_IOC_PLL_POLL; i++) { 838 - r32 = readl(rb + CT2_APP_PLL_LCLK_CTL_REG); 839 - if (!(r32 & __RESET_AND_START_SCLK_LCLK_PLLS)) 840 - break; 841 - } 842 - 843 - WARN_ON(r32 & __RESET_AND_START_SCLK_LCLK_PLLS); 844 - udelay(1000); 845 - 846 - r32 = readl(rb + CT2_CSI_FW_CTL_REG); 847 - WARN_ON(r32 & __RESET_AND_START_SCLK_LCLK_PLLS); 848 - } else { 849 - writel(__HALT_NFC_CONTROLLER, rb + CT2_NFC_CSR_SET_REG); 850 - for (i = 0; i < CT2_NFC_MAX_DELAY; i++) { 851 - r32 = readl(rb + CT2_NFC_CSR_SET_REG); 852 - if (r32 & __NFC_CONTROLLER_HALTED) 853 - break; 854 - udelay(1000); 855 - } 883 + if (wgn == (__WGN_READY | __GLBL_PF_VF_CFG_RDY)) { 884 + /* 885 + * If flash is corrupted, enable flash explicitly 886 + */ 887 + bfa_ioc_ct2_clk_reset(rb); 888 + bfa_ioc_ct2_enable_flash(rb); 856 889 857 890 bfa_ioc_ct2_mac_reset(rb); 858 - bfa_ioc_ct2_sclk_init(rb); 859 - bfa_ioc_ct2_lclk_init(rb); 860 891 861 - /* 862 - * release soft reset on s_clk & l_clk 863 - */ 864 - r32 = readl(rb + CT2_APP_PLL_SCLK_CTL_REG); 865 - writel(r32 & ~__APP_PLL_SCLK_LOGIC_SOFT_RESET, 866 - (rb + CT2_APP_PLL_SCLK_CTL_REG)); 892 + bfa_ioc_ct2_clk_reset(rb); 893 + bfa_ioc_ct2_enable_flash(rb); 867 894 868 - /* 869 - * release soft reset on s_clk & l_clk 870 - */ 871 - r32 = readl(rb + CT2_APP_PLL_LCLK_CTL_REG); 872 - writel(r32 & ~__APP_PLL_LCLK_LOGIC_SOFT_RESET, 873 - (rb + CT2_APP_PLL_LCLK_CTL_REG)); 874 - } 895 + } else { 896 + nfc_ver = readl(rb + CT2_RSC_GPR15_REG); 875 897 876 - /* 877 - * Announce flash device presence, if flash was corrupted. 878 - */ 879 - if (wgn == (__WGN_READY | __GLBL_PF_VF_CFG_RDY)) { 880 - r32 = readl(rb + PSS_GPIO_OUT_REG); 881 - writel(r32 & ~1, (rb + PSS_GPIO_OUT_REG)); 882 - r32 = readl(rb + PSS_GPIO_OE_REG); 883 - writel(r32 | 1, (rb + PSS_GPIO_OE_REG)); 898 + if ((nfc_ver >= CT2_NFC_VER_VALID) && 899 + (wgn == (__A2T_AHB_LOAD | __WGN_READY))) { 900 + 901 + bfa_ioc_ct2_wait_till_nfc_running(rb); 902 + 903 + bfa_ioc_ct2_nfc_clk_reset(rb); 904 + } else { 905 + bfa_ioc_ct2_nfc_halt(rb); 906 + 907 + bfa_ioc_ct2_clk_reset(rb); 908 + bfa_ioc_ct2_mac_reset(rb); 909 + bfa_ioc_ct2_clk_reset(rb); 910 + 911 + } 884 912 } 885 913 886 914 /* 887 915 * Mask the interrupts and clear any 888 - * pending interrupts. 916 + * pending interrupts left by BIOS/EFI 889 917 */ 918 + 890 919 writel(1, (rb + CT2_LPU0_HOSTFN_MBOX0_MSK)); 891 920 writel(1, (rb + CT2_LPU1_HOSTFN_MBOX0_MSK)); 892 921 893 922 /* For first time initialization, no need to clear interrupts */ 894 923 r32 = readl(rb + HOST_SEM5_REG); 895 924 if (r32 & 0x1) { 896 - r32 = readl(rb + CT2_LPU0_HOSTFN_CMD_STAT); 925 + r32 = readl((rb + CT2_LPU0_HOSTFN_CMD_STAT)); 897 926 if (r32 == 1) { 898 - writel(1, rb + CT2_LPU0_HOSTFN_CMD_STAT); 927 + writel(1, (rb + CT2_LPU0_HOSTFN_CMD_STAT)); 899 928 readl((rb + CT2_LPU0_HOSTFN_CMD_STAT)); 900 929 } 901 - r32 = readl(rb + CT2_LPU1_HOSTFN_CMD_STAT); 930 + r32 = readl((rb + CT2_LPU1_HOSTFN_CMD_STAT)); 902 931 if (r32 == 1) { 903 - writel(1, rb + CT2_LPU1_HOSTFN_CMD_STAT); 904 - readl(rb + CT2_LPU1_HOSTFN_CMD_STAT); 932 + writel(1, (rb + CT2_LPU1_HOSTFN_CMD_STAT)); 933 + readl((rb + CT2_LPU1_HOSTFN_CMD_STAT)); 905 934 } 906 935 } 907 936 908 937 bfa_ioc_ct2_mem_init(rb); 909 938 910 - writel(BFI_IOC_UNINIT, rb + CT2_BFA_IOC0_STATE_REG); 911 - writel(BFI_IOC_UNINIT, rb + CT2_BFA_IOC1_STATE_REG); 939 + writel(BFI_IOC_UNINIT, (rb + CT2_BFA_IOC0_STATE_REG)); 940 + writel(BFI_IOC_UNINIT, (rb + CT2_BFA_IOC1_STATE_REG)); 912 941 913 942 return BFA_STATUS_OK; 914 943 }
+3
drivers/scsi/bfa/bfi_reg.h
··· 338 338 #define __A2T_AHB_LOAD 0x00000800 339 339 #define __WGN_READY 0x00000400 340 340 #define __GLBL_PF_VF_CFG_RDY 0x00000200 341 + #define CT2_NFC_STS_REG 0x00027410 341 342 #define CT2_NFC_CSR_CLR_REG 0x00027420 342 343 #define CT2_NFC_CSR_SET_REG 0x00027424 343 344 #define __HALT_NFC_CONTROLLER 0x00000002 ··· 356 355 (CT2_CSI_MAC0_CONTROL_REG + \ 357 356 (__n) * (CT2_CSI_MAC1_CONTROL_REG - CT2_CSI_MAC0_CONTROL_REG)) 358 357 358 + #define CT2_NFC_FLASH_STS_REG 0x00014834 359 + #define __FLASH_PLL_INIT_AND_RESET_IN_PROGRESS 0x00000020 359 360 /* 360 361 * Name semaphore registers based on usage 361 362 */