diff options
author | Andrew Vasquez <andrew.vasquez@qlogic.com> | 2007-07-19 23:37:34 -0400 |
---|---|---|
committer | James Bottomley <jejb@mulgrave.localdomain> | 2007-07-20 10:25:29 -0400 |
commit | c3a2f0dfe1cecac76950f340f540c1a887dd2500 (patch) | |
tree | be6cce05e0fba81e9bf91351aebab23918ae5115 | |
parent | af6177d88d76834b4d05499482d471d64559a6af (diff) |
[SCSI] qla2xxx: Add ISP25XX support.
Large code-reuse from ISP24xx, consolidate RISC memory
extraction routines during firmware-dump.
Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com>
Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
-rw-r--r-- | drivers/scsi/qla2xxx/qla_attr.c | 2 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_dbg.c | 1114 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_dbg.h | 38 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_def.h | 8 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_fw.h | 36 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_gbl.h | 6 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_gs.c | 10 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_init.c | 38 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_isr.c | 10 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_os.c | 70 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_sup.c | 23 |
11 files changed, 1137 insertions, 218 deletions
diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c index 362353dcb34..1612f9200a5 100644 --- a/drivers/scsi/qla2xxx/qla_attr.c +++ b/drivers/scsi/qla2xxx/qla_attr.c | |||
@@ -206,7 +206,7 @@ static struct bin_attribute sysfs_optrom_attr = { | |||
206 | .name = "optrom", | 206 | .name = "optrom", |
207 | .mode = S_IRUSR | S_IWUSR, | 207 | .mode = S_IRUSR | S_IWUSR, |
208 | }, | 208 | }, |
209 | .size = OPTROM_SIZE_24XX, | 209 | .size = 0, |
210 | .read = qla2x00_sysfs_read_optrom, | 210 | .read = qla2x00_sysfs_read_optrom, |
211 | .write = qla2x00_sysfs_write_optrom, | 211 | .write = qla2x00_sysfs_write_optrom, |
212 | }; | 212 | }; |
diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c index 996c47a6307..563d18f4ff5 100644 --- a/drivers/scsi/qla2xxx/qla_dbg.c +++ b/drivers/scsi/qla2xxx/qla_dbg.c | |||
@@ -37,6 +37,121 @@ qla2xxx_copy_queues(scsi_qla_host_t *ha, void *ptr) | |||
37 | return ptr + (ha->response_q_length * sizeof(response_t)); | 37 | return ptr + (ha->response_q_length * sizeof(response_t)); |
38 | } | 38 | } |
39 | 39 | ||
40 | static int | ||
41 | qla2xxx_dump_memory(scsi_qla_host_t *ha, uint32_t *code_ram, | ||
42 | uint32_t cram_size, uint32_t *ext_mem, void **nxt) | ||
43 | { | ||
44 | int rval; | ||
45 | uint32_t cnt, stat, timer, risc_address, ext_mem_cnt; | ||
46 | uint16_t mb[4]; | ||
47 | struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; | ||
48 | |||
49 | rval = QLA_SUCCESS; | ||
50 | risc_address = ext_mem_cnt = 0; | ||
51 | memset(mb, 0, sizeof(mb)); | ||
52 | |||
53 | /* Code RAM. */ | ||
54 | risc_address = 0x20000; | ||
55 | WRT_REG_WORD(®->mailbox0, MBC_READ_RAM_EXTENDED); | ||
56 | clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); | ||
57 | |||
58 | for (cnt = 0; cnt < cram_size / 4 && rval == QLA_SUCCESS; | ||
59 | cnt++, risc_address++) { | ||
60 | WRT_REG_WORD(®->mailbox1, LSW(risc_address)); | ||
61 | WRT_REG_WORD(®->mailbox8, MSW(risc_address)); | ||
62 | RD_REG_WORD(®->mailbox8); | ||
63 | WRT_REG_DWORD(®->hccr, HCCRX_SET_HOST_INT); | ||
64 | |||
65 | for (timer = 6000000; timer; timer--) { | ||
66 | /* Check for pending interrupts. */ | ||
67 | stat = RD_REG_DWORD(®->host_status); | ||
68 | if (stat & HSRX_RISC_INT) { | ||
69 | stat &= 0xff; | ||
70 | |||
71 | if (stat == 0x1 || stat == 0x2 || | ||
72 | stat == 0x10 || stat == 0x11) { | ||
73 | set_bit(MBX_INTERRUPT, | ||
74 | &ha->mbx_cmd_flags); | ||
75 | |||
76 | mb[0] = RD_REG_WORD(®->mailbox0); | ||
77 | mb[2] = RD_REG_WORD(®->mailbox2); | ||
78 | mb[3] = RD_REG_WORD(®->mailbox3); | ||
79 | |||
80 | WRT_REG_DWORD(®->hccr, | ||
81 | HCCRX_CLR_RISC_INT); | ||
82 | RD_REG_DWORD(®->hccr); | ||
83 | break; | ||
84 | } | ||
85 | |||
86 | /* Clear this intr; it wasn't a mailbox intr */ | ||
87 | WRT_REG_DWORD(®->hccr, HCCRX_CLR_RISC_INT); | ||
88 | RD_REG_DWORD(®->hccr); | ||
89 | } | ||
90 | udelay(5); | ||
91 | } | ||
92 | |||
93 | if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) { | ||
94 | rval = mb[0] & MBS_MASK; | ||
95 | code_ram[cnt] = htonl((mb[3] << 16) | mb[2]); | ||
96 | } else { | ||
97 | rval = QLA_FUNCTION_FAILED; | ||
98 | } | ||
99 | } | ||
100 | |||
101 | if (rval == QLA_SUCCESS) { | ||
102 | /* External Memory. */ | ||
103 | risc_address = 0x100000; | ||
104 | ext_mem_cnt = ha->fw_memory_size - 0x100000 + 1; | ||
105 | WRT_REG_WORD(®->mailbox0, MBC_READ_RAM_EXTENDED); | ||
106 | clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); | ||
107 | } | ||
108 | for (cnt = 0; cnt < ext_mem_cnt && rval == QLA_SUCCESS; | ||
109 | cnt++, risc_address++) { | ||
110 | WRT_REG_WORD(®->mailbox1, LSW(risc_address)); | ||
111 | WRT_REG_WORD(®->mailbox8, MSW(risc_address)); | ||
112 | RD_REG_WORD(®->mailbox8); | ||
113 | WRT_REG_DWORD(®->hccr, HCCRX_SET_HOST_INT); | ||
114 | |||
115 | for (timer = 6000000; timer; timer--) { | ||
116 | /* Check for pending interrupts. */ | ||
117 | stat = RD_REG_DWORD(®->host_status); | ||
118 | if (stat & HSRX_RISC_INT) { | ||
119 | stat &= 0xff; | ||
120 | |||
121 | if (stat == 0x1 || stat == 0x2 || | ||
122 | stat == 0x10 || stat == 0x11) { | ||
123 | set_bit(MBX_INTERRUPT, | ||
124 | &ha->mbx_cmd_flags); | ||
125 | |||
126 | mb[0] = RD_REG_WORD(®->mailbox0); | ||
127 | mb[2] = RD_REG_WORD(®->mailbox2); | ||
128 | mb[3] = RD_REG_WORD(®->mailbox3); | ||
129 | |||
130 | WRT_REG_DWORD(®->hccr, | ||
131 | HCCRX_CLR_RISC_INT); | ||
132 | RD_REG_DWORD(®->hccr); | ||
133 | break; | ||
134 | } | ||
135 | |||
136 | /* Clear this intr; it wasn't a mailbox intr */ | ||
137 | WRT_REG_DWORD(®->hccr, HCCRX_CLR_RISC_INT); | ||
138 | RD_REG_DWORD(®->hccr); | ||
139 | } | ||
140 | udelay(5); | ||
141 | } | ||
142 | |||
143 | if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) { | ||
144 | rval = mb[0] & MBS_MASK; | ||
145 | ext_mem[cnt] = htonl((mb[3] << 16) | mb[2]); | ||
146 | } else { | ||
147 | rval = QLA_FUNCTION_FAILED; | ||
148 | } | ||
149 | } | ||
150 | |||
151 | *nxt = rval == QLA_SUCCESS ? &ext_mem[cnt]: NULL; | ||
152 | return rval; | ||
153 | } | ||
154 | |||
40 | /** | 155 | /** |
41 | * qla2300_fw_dump() - Dumps binary data from the 2300 firmware. | 156 | * qla2300_fw_dump() - Dumps binary data from the 2300 firmware. |
42 | * @ha: HA context | 157 | * @ha: HA context |
@@ -633,11 +748,10 @@ void | |||
633 | qla24xx_fw_dump(scsi_qla_host_t *ha, int hardware_locked) | 748 | qla24xx_fw_dump(scsi_qla_host_t *ha, int hardware_locked) |
634 | { | 749 | { |
635 | int rval; | 750 | int rval; |
636 | uint32_t cnt, timer; | 751 | uint32_t cnt; |
637 | uint32_t risc_address; | 752 | uint32_t risc_address; |
638 | uint16_t mb[4], wd; | 753 | uint16_t mb0, wd; |
639 | 754 | ||
640 | uint32_t stat; | ||
641 | struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; | 755 | struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; |
642 | uint32_t __iomem *dmp_reg; | 756 | uint32_t __iomem *dmp_reg; |
643 | uint32_t *iter_reg; | 757 | uint32_t *iter_reg; |
@@ -645,10 +759,9 @@ qla24xx_fw_dump(scsi_qla_host_t *ha, int hardware_locked) | |||
645 | unsigned long flags; | 759 | unsigned long flags; |
646 | struct qla24xx_fw_dump *fw; | 760 | struct qla24xx_fw_dump *fw; |
647 | uint32_t ext_mem_cnt; | 761 | uint32_t ext_mem_cnt; |
648 | void *eft; | 762 | void *nxt; |
649 | 763 | ||
650 | risc_address = ext_mem_cnt = 0; | 764 | risc_address = ext_mem_cnt = 0; |
651 | memset(mb, 0, sizeof(mb)); | ||
652 | flags = 0; | 765 | flags = 0; |
653 | 766 | ||
654 | if (!hardware_locked) | 767 | if (!hardware_locked) |
@@ -701,250 +814,236 @@ qla24xx_fw_dump(scsi_qla_host_t *ha, int hardware_locked) | |||
701 | /* Shadow registers. */ | 814 | /* Shadow registers. */ |
702 | WRT_REG_DWORD(®->iobase_addr, 0x0F70); | 815 | WRT_REG_DWORD(®->iobase_addr, 0x0F70); |
703 | RD_REG_DWORD(®->iobase_addr); | 816 | RD_REG_DWORD(®->iobase_addr); |
704 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0); | 817 | WRT_REG_DWORD(®->iobase_select, 0xB0000000); |
705 | WRT_REG_DWORD(dmp_reg, 0xB0000000); | 818 | fw->shadow_reg[0] = htonl(RD_REG_DWORD(®->iobase_sdata)); |
706 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC); | 819 | |
707 | fw->shadow_reg[0] = htonl(RD_REG_DWORD(dmp_reg)); | 820 | WRT_REG_DWORD(®->iobase_select, 0xB0100000); |
708 | 821 | fw->shadow_reg[1] = htonl(RD_REG_DWORD(®->iobase_sdata)); | |
709 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0); | 822 | |
710 | WRT_REG_DWORD(dmp_reg, 0xB0100000); | 823 | WRT_REG_DWORD(®->iobase_select, 0xB0200000); |
711 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC); | 824 | fw->shadow_reg[2] = htonl(RD_REG_DWORD(®->iobase_sdata)); |
712 | fw->shadow_reg[1] = htonl(RD_REG_DWORD(dmp_reg)); | 825 | |
713 | 826 | WRT_REG_DWORD(®->iobase_select, 0xB0300000); | |
714 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0); | 827 | fw->shadow_reg[3] = htonl(RD_REG_DWORD(®->iobase_sdata)); |
715 | WRT_REG_DWORD(dmp_reg, 0xB0200000); | 828 | |
716 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC); | 829 | WRT_REG_DWORD(®->iobase_select, 0xB0400000); |
717 | fw->shadow_reg[2] = htonl(RD_REG_DWORD(dmp_reg)); | 830 | fw->shadow_reg[4] = htonl(RD_REG_DWORD(®->iobase_sdata)); |
718 | 831 | ||
719 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0); | 832 | WRT_REG_DWORD(®->iobase_select, 0xB0500000); |
720 | WRT_REG_DWORD(dmp_reg, 0xB0300000); | 833 | fw->shadow_reg[5] = htonl(RD_REG_DWORD(®->iobase_sdata)); |
721 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC); | 834 | |
722 | fw->shadow_reg[3] = htonl(RD_REG_DWORD(dmp_reg)); | 835 | WRT_REG_DWORD(®->iobase_select, 0xB0600000); |
723 | 836 | fw->shadow_reg[6] = htonl(RD_REG_DWORD(®->iobase_sdata)); | |
724 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0); | ||
725 | WRT_REG_DWORD(dmp_reg, 0xB0400000); | ||
726 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC); | ||
727 | fw->shadow_reg[4] = htonl(RD_REG_DWORD(dmp_reg)); | ||
728 | |||
729 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0); | ||
730 | WRT_REG_DWORD(dmp_reg, 0xB0500000); | ||
731 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC); | ||
732 | fw->shadow_reg[5] = htonl(RD_REG_DWORD(dmp_reg)); | ||
733 | |||
734 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xF0); | ||
735 | WRT_REG_DWORD(dmp_reg, 0xB0600000); | ||
736 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xFC); | ||
737 | fw->shadow_reg[6] = htonl(RD_REG_DWORD(dmp_reg)); | ||
738 | 837 | ||
739 | /* Mailbox registers. */ | 838 | /* Mailbox registers. */ |
740 | mbx_reg = (uint16_t __iomem *)((uint8_t __iomem *)reg + 0x80); | 839 | mbx_reg = ®->mailbox0; |
741 | for (cnt = 0; cnt < sizeof(fw->mailbox_reg) / 2; cnt++) | 840 | for (cnt = 0; cnt < sizeof(fw->mailbox_reg) / 2; cnt++) |
742 | fw->mailbox_reg[cnt] = htons(RD_REG_WORD(mbx_reg++)); | 841 | fw->mailbox_reg[cnt] = htons(RD_REG_WORD(mbx_reg++)); |
743 | 842 | ||
744 | /* Transfer sequence registers. */ | 843 | /* Transfer sequence registers. */ |
745 | iter_reg = fw->xseq_gp_reg; | 844 | iter_reg = fw->xseq_gp_reg; |
746 | WRT_REG_DWORD(®->iobase_addr, 0xBF00); | 845 | WRT_REG_DWORD(®->iobase_addr, 0xBF00); |
747 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 846 | dmp_reg = ®->iobase_window; |
748 | for (cnt = 0; cnt < 16; cnt++) | 847 | for (cnt = 0; cnt < 16; cnt++) |
749 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 848 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
750 | 849 | ||
751 | WRT_REG_DWORD(®->iobase_addr, 0xBF10); | 850 | WRT_REG_DWORD(®->iobase_addr, 0xBF10); |
752 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 851 | dmp_reg = ®->iobase_window; |
753 | for (cnt = 0; cnt < 16; cnt++) | 852 | for (cnt = 0; cnt < 16; cnt++) |
754 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 853 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
755 | 854 | ||
756 | WRT_REG_DWORD(®->iobase_addr, 0xBF20); | 855 | WRT_REG_DWORD(®->iobase_addr, 0xBF20); |
757 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 856 | dmp_reg = ®->iobase_window; |
758 | for (cnt = 0; cnt < 16; cnt++) | 857 | for (cnt = 0; cnt < 16; cnt++) |
759 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 858 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
760 | 859 | ||
761 | WRT_REG_DWORD(®->iobase_addr, 0xBF30); | 860 | WRT_REG_DWORD(®->iobase_addr, 0xBF30); |
762 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 861 | dmp_reg = ®->iobase_window; |
763 | for (cnt = 0; cnt < 16; cnt++) | 862 | for (cnt = 0; cnt < 16; cnt++) |
764 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 863 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
765 | 864 | ||
766 | WRT_REG_DWORD(®->iobase_addr, 0xBF40); | 865 | WRT_REG_DWORD(®->iobase_addr, 0xBF40); |
767 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 866 | dmp_reg = ®->iobase_window; |
768 | for (cnt = 0; cnt < 16; cnt++) | 867 | for (cnt = 0; cnt < 16; cnt++) |
769 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 868 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
770 | 869 | ||
771 | WRT_REG_DWORD(®->iobase_addr, 0xBF50); | 870 | WRT_REG_DWORD(®->iobase_addr, 0xBF50); |
772 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 871 | dmp_reg = ®->iobase_window; |
773 | for (cnt = 0; cnt < 16; cnt++) | 872 | for (cnt = 0; cnt < 16; cnt++) |
774 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 873 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
775 | 874 | ||
776 | WRT_REG_DWORD(®->iobase_addr, 0xBF60); | 875 | WRT_REG_DWORD(®->iobase_addr, 0xBF60); |
777 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 876 | dmp_reg = ®->iobase_window; |
778 | for (cnt = 0; cnt < 16; cnt++) | 877 | for (cnt = 0; cnt < 16; cnt++) |
779 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 878 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
780 | 879 | ||
781 | WRT_REG_DWORD(®->iobase_addr, 0xBF70); | 880 | WRT_REG_DWORD(®->iobase_addr, 0xBF70); |
782 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 881 | dmp_reg = ®->iobase_window; |
783 | for (cnt = 0; cnt < 16; cnt++) | 882 | for (cnt = 0; cnt < 16; cnt++) |
784 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 883 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
785 | 884 | ||
786 | WRT_REG_DWORD(®->iobase_addr, 0xBFE0); | 885 | WRT_REG_DWORD(®->iobase_addr, 0xBFE0); |
787 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 886 | dmp_reg = ®->iobase_window; |
788 | for (cnt = 0; cnt < sizeof(fw->xseq_0_reg) / 4; cnt++) | 887 | for (cnt = 0; cnt < sizeof(fw->xseq_0_reg) / 4; cnt++) |
789 | fw->xseq_0_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++)); | 888 | fw->xseq_0_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++)); |
790 | 889 | ||
791 | WRT_REG_DWORD(®->iobase_addr, 0xBFF0); | 890 | WRT_REG_DWORD(®->iobase_addr, 0xBFF0); |
792 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 891 | dmp_reg = ®->iobase_window; |
793 | for (cnt = 0; cnt < sizeof(fw->xseq_1_reg) / 4; cnt++) | 892 | for (cnt = 0; cnt < sizeof(fw->xseq_1_reg) / 4; cnt++) |
794 | fw->xseq_1_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++)); | 893 | fw->xseq_1_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++)); |
795 | 894 | ||
796 | /* Receive sequence registers. */ | 895 | /* Receive sequence registers. */ |
797 | iter_reg = fw->rseq_gp_reg; | 896 | iter_reg = fw->rseq_gp_reg; |
798 | WRT_REG_DWORD(®->iobase_addr, 0xFF00); | 897 | WRT_REG_DWORD(®->iobase_addr, 0xFF00); |
799 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 898 | dmp_reg = ®->iobase_window; |
800 | for (cnt = 0; cnt < 16; cnt++) | 899 | for (cnt = 0; cnt < 16; cnt++) |
801 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 900 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
802 | 901 | ||
803 | WRT_REG_DWORD(®->iobase_addr, 0xFF10); | 902 | WRT_REG_DWORD(®->iobase_addr, 0xFF10); |
804 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 903 | dmp_reg = ®->iobase_window; |
805 | for (cnt = 0; cnt < 16; cnt++) | 904 | for (cnt = 0; cnt < 16; cnt++) |
806 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 905 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
807 | 906 | ||
808 | WRT_REG_DWORD(®->iobase_addr, 0xFF20); | 907 | WRT_REG_DWORD(®->iobase_addr, 0xFF20); |
809 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 908 | dmp_reg = ®->iobase_window; |
810 | for (cnt = 0; cnt < 16; cnt++) | 909 | for (cnt = 0; cnt < 16; cnt++) |
811 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 910 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
812 | 911 | ||
813 | WRT_REG_DWORD(®->iobase_addr, 0xFF30); | 912 | WRT_REG_DWORD(®->iobase_addr, 0xFF30); |
814 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 913 | dmp_reg = ®->iobase_window; |
815 | for (cnt = 0; cnt < 16; cnt++) | 914 | for (cnt = 0; cnt < 16; cnt++) |
816 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 915 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
817 | 916 | ||
818 | WRT_REG_DWORD(®->iobase_addr, 0xFF40); | 917 | WRT_REG_DWORD(®->iobase_addr, 0xFF40); |
819 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 918 | dmp_reg = ®->iobase_window; |
820 | for (cnt = 0; cnt < 16; cnt++) | 919 | for (cnt = 0; cnt < 16; cnt++) |
821 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 920 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
822 | 921 | ||
823 | WRT_REG_DWORD(®->iobase_addr, 0xFF50); | 922 | WRT_REG_DWORD(®->iobase_addr, 0xFF50); |
824 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 923 | dmp_reg = ®->iobase_window; |
825 | for (cnt = 0; cnt < 16; cnt++) | 924 | for (cnt = 0; cnt < 16; cnt++) |
826 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 925 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
827 | 926 | ||
828 | WRT_REG_DWORD(®->iobase_addr, 0xFF60); | 927 | WRT_REG_DWORD(®->iobase_addr, 0xFF60); |
829 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 928 | dmp_reg = ®->iobase_window; |
830 | for (cnt = 0; cnt < 16; cnt++) | 929 | for (cnt = 0; cnt < 16; cnt++) |
831 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 930 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
832 | 931 | ||
833 | WRT_REG_DWORD(®->iobase_addr, 0xFF70); | 932 | WRT_REG_DWORD(®->iobase_addr, 0xFF70); |
834 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 933 | dmp_reg = ®->iobase_window; |
835 | for (cnt = 0; cnt < 16; cnt++) | 934 | for (cnt = 0; cnt < 16; cnt++) |
836 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 935 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
837 | 936 | ||
838 | WRT_REG_DWORD(®->iobase_addr, 0xFFD0); | 937 | WRT_REG_DWORD(®->iobase_addr, 0xFFD0); |
839 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 938 | dmp_reg = ®->iobase_window; |
840 | for (cnt = 0; cnt < sizeof(fw->rseq_0_reg) / 4; cnt++) | 939 | for (cnt = 0; cnt < sizeof(fw->rseq_0_reg) / 4; cnt++) |
841 | fw->rseq_0_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++)); | 940 | fw->rseq_0_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++)); |
842 | 941 | ||
843 | WRT_REG_DWORD(®->iobase_addr, 0xFFE0); | 942 | WRT_REG_DWORD(®->iobase_addr, 0xFFE0); |
844 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 943 | dmp_reg = ®->iobase_window; |
845 | for (cnt = 0; cnt < sizeof(fw->rseq_1_reg) / 4; cnt++) | 944 | for (cnt = 0; cnt < sizeof(fw->rseq_1_reg) / 4; cnt++) |
846 | fw->rseq_1_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++)); | 945 | fw->rseq_1_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++)); |
847 | 946 | ||
848 | WRT_REG_DWORD(®->iobase_addr, 0xFFF0); | 947 | WRT_REG_DWORD(®->iobase_addr, 0xFFF0); |
849 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 948 | dmp_reg = ®->iobase_window; |
850 | for (cnt = 0; cnt < sizeof(fw->rseq_2_reg) / 4; cnt++) | 949 | for (cnt = 0; cnt < sizeof(fw->rseq_2_reg) / 4; cnt++) |
851 | fw->rseq_2_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++)); | 950 | fw->rseq_2_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++)); |
852 | 951 | ||
853 | /* Command DMA registers. */ | 952 | /* Command DMA registers. */ |
854 | WRT_REG_DWORD(®->iobase_addr, 0x7100); | 953 | WRT_REG_DWORD(®->iobase_addr, 0x7100); |
855 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 954 | dmp_reg = ®->iobase_window; |
856 | for (cnt = 0; cnt < sizeof(fw->cmd_dma_reg) / 4; cnt++) | 955 | for (cnt = 0; cnt < sizeof(fw->cmd_dma_reg) / 4; cnt++) |
857 | fw->cmd_dma_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++)); | 956 | fw->cmd_dma_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++)); |
858 | 957 | ||
859 | /* Queues. */ | 958 | /* Queues. */ |
860 | iter_reg = fw->req0_dma_reg; | 959 | iter_reg = fw->req0_dma_reg; |
861 | WRT_REG_DWORD(®->iobase_addr, 0x7200); | 960 | WRT_REG_DWORD(®->iobase_addr, 0x7200); |
862 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 961 | dmp_reg = ®->iobase_window; |
863 | for (cnt = 0; cnt < 8; cnt++) | 962 | for (cnt = 0; cnt < 8; cnt++) |
864 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 963 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
865 | 964 | ||
866 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xE4); | 965 | dmp_reg = ®->iobase_q; |
867 | for (cnt = 0; cnt < 7; cnt++) | 966 | for (cnt = 0; cnt < 7; cnt++) |
868 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 967 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
869 | 968 | ||
870 | iter_reg = fw->resp0_dma_reg; | 969 | iter_reg = fw->resp0_dma_reg; |
871 | WRT_REG_DWORD(®->iobase_addr, 0x7300); | 970 | WRT_REG_DWORD(®->iobase_addr, 0x7300); |
872 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 971 | dmp_reg = ®->iobase_window; |
873 | for (cnt = 0; cnt < 8; cnt++) | 972 | for (cnt = 0; cnt < 8; cnt++) |
874 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 973 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
875 | 974 | ||
876 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xE4); | 975 | dmp_reg = ®->iobase_q; |
877 | for (cnt = 0; cnt < 7; cnt++) | 976 | for (cnt = 0; cnt < 7; cnt++) |
878 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 977 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
879 | 978 | ||
880 | iter_reg = fw->req1_dma_reg; | 979 | iter_reg = fw->req1_dma_reg; |
881 | WRT_REG_DWORD(®->iobase_addr, 0x7400); | 980 | WRT_REG_DWORD(®->iobase_addr, 0x7400); |
882 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 981 | dmp_reg = ®->iobase_window; |
883 | for (cnt = 0; cnt < 8; cnt++) | 982 | for (cnt = 0; cnt < 8; cnt++) |
884 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 983 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
885 | 984 | ||
886 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xE4); | 985 | dmp_reg = ®->iobase_q; |
887 | for (cnt = 0; cnt < 7; cnt++) | 986 | for (cnt = 0; cnt < 7; cnt++) |
888 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 987 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
889 | 988 | ||
890 | /* Transmit DMA registers. */ | 989 | /* Transmit DMA registers. */ |
891 | iter_reg = fw->xmt0_dma_reg; | 990 | iter_reg = fw->xmt0_dma_reg; |
892 | WRT_REG_DWORD(®->iobase_addr, 0x7600); | 991 | WRT_REG_DWORD(®->iobase_addr, 0x7600); |
893 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 992 | dmp_reg = ®->iobase_window; |
894 | for (cnt = 0; cnt < 16; cnt++) | 993 | for (cnt = 0; cnt < 16; cnt++) |
895 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 994 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
896 | 995 | ||
897 | WRT_REG_DWORD(®->iobase_addr, 0x7610); | 996 | WRT_REG_DWORD(®->iobase_addr, 0x7610); |
898 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 997 | dmp_reg = ®->iobase_window; |
899 | for (cnt = 0; cnt < 16; cnt++) | 998 | for (cnt = 0; cnt < 16; cnt++) |
900 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 999 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
901 | 1000 | ||
902 | iter_reg = fw->xmt1_dma_reg; | 1001 | iter_reg = fw->xmt1_dma_reg; |
903 | WRT_REG_DWORD(®->iobase_addr, 0x7620); | 1002 | WRT_REG_DWORD(®->iobase_addr, 0x7620); |
904 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1003 | dmp_reg = ®->iobase_window; |
905 | for (cnt = 0; cnt < 16; cnt++) | 1004 | for (cnt = 0; cnt < 16; cnt++) |
906 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1005 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
907 | 1006 | ||
908 | WRT_REG_DWORD(®->iobase_addr, 0x7630); | 1007 | WRT_REG_DWORD(®->iobase_addr, 0x7630); |
909 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1008 | dmp_reg = ®->iobase_window; |
910 | for (cnt = 0; cnt < 16; cnt++) | 1009 | for (cnt = 0; cnt < 16; cnt++) |
911 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1010 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
912 | 1011 | ||
913 | iter_reg = fw->xmt2_dma_reg; | 1012 | iter_reg = fw->xmt2_dma_reg; |
914 | WRT_REG_DWORD(®->iobase_addr, 0x7640); | 1013 | WRT_REG_DWORD(®->iobase_addr, 0x7640); |
915 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1014 | dmp_reg = ®->iobase_window; |
916 | for (cnt = 0; cnt < 16; cnt++) | 1015 | for (cnt = 0; cnt < 16; cnt++) |
917 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1016 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
918 | 1017 | ||
919 | WRT_REG_DWORD(®->iobase_addr, 0x7650); | 1018 | WRT_REG_DWORD(®->iobase_addr, 0x7650); |
920 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1019 | dmp_reg = ®->iobase_window; |
921 | for (cnt = 0; cnt < 16; cnt++) | 1020 | for (cnt = 0; cnt < 16; cnt++) |
922 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1021 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
923 | 1022 | ||
924 | iter_reg = fw->xmt3_dma_reg; | 1023 | iter_reg = fw->xmt3_dma_reg; |
925 | WRT_REG_DWORD(®->iobase_addr, 0x7660); | 1024 | WRT_REG_DWORD(®->iobase_addr, 0x7660); |
926 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1025 | dmp_reg = ®->iobase_window; |
927 | for (cnt = 0; cnt < 16; cnt++) | 1026 | for (cnt = 0; cnt < 16; cnt++) |
928 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1027 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
929 | 1028 | ||
930 | WRT_REG_DWORD(®->iobase_addr, 0x7670); | 1029 | WRT_REG_DWORD(®->iobase_addr, 0x7670); |
931 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1030 | dmp_reg = ®->iobase_window; |
932 | for (cnt = 0; cnt < 16; cnt++) | 1031 | for (cnt = 0; cnt < 16; cnt++) |
933 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1032 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
934 | 1033 | ||
935 | iter_reg = fw->xmt4_dma_reg; | 1034 | iter_reg = fw->xmt4_dma_reg; |
936 | WRT_REG_DWORD(®->iobase_addr, 0x7680); | 1035 | WRT_REG_DWORD(®->iobase_addr, 0x7680); |
937 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1036 | dmp_reg = ®->iobase_window; |
938 | for (cnt = 0; cnt < 16; cnt++) | 1037 | for (cnt = 0; cnt < 16; cnt++) |
939 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1038 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
940 | 1039 | ||
941 | WRT_REG_DWORD(®->iobase_addr, 0x7690); | 1040 | WRT_REG_DWORD(®->iobase_addr, 0x7690); |
942 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1041 | dmp_reg = ®->iobase_window; |
943 | for (cnt = 0; cnt < 16; cnt++) | 1042 | for (cnt = 0; cnt < 16; cnt++) |
944 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1043 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
945 | 1044 | ||
946 | WRT_REG_DWORD(®->iobase_addr, 0x76A0); | 1045 | WRT_REG_DWORD(®->iobase_addr, 0x76A0); |
947 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1046 | dmp_reg = ®->iobase_window; |
948 | for (cnt = 0; cnt < sizeof(fw->xmt_data_dma_reg) / 4; cnt++) | 1047 | for (cnt = 0; cnt < sizeof(fw->xmt_data_dma_reg) / 4; cnt++) |
949 | fw->xmt_data_dma_reg[cnt] = | 1048 | fw->xmt_data_dma_reg[cnt] = |
950 | htonl(RD_REG_DWORD(dmp_reg++)); | 1049 | htonl(RD_REG_DWORD(dmp_reg++)); |
@@ -952,221 +1051,221 @@ qla24xx_fw_dump(scsi_qla_host_t *ha, int hardware_locked) | |||
952 | /* Receive DMA registers. */ | 1051 | /* Receive DMA registers. */ |
953 | iter_reg = fw->rcvt0_data_dma_reg; | 1052 | iter_reg = fw->rcvt0_data_dma_reg; |
954 | WRT_REG_DWORD(®->iobase_addr, 0x7700); | 1053 | WRT_REG_DWORD(®->iobase_addr, 0x7700); |
955 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1054 | dmp_reg = ®->iobase_window; |
956 | for (cnt = 0; cnt < 16; cnt++) | 1055 | for (cnt = 0; cnt < 16; cnt++) |
957 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1056 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
958 | 1057 | ||
959 | WRT_REG_DWORD(®->iobase_addr, 0x7710); | 1058 | WRT_REG_DWORD(®->iobase_addr, 0x7710); |
960 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1059 | dmp_reg = ®->iobase_window; |
961 | for (cnt = 0; cnt < 16; cnt++) | 1060 | for (cnt = 0; cnt < 16; cnt++) |
962 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1061 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
963 | 1062 | ||
964 | iter_reg = fw->rcvt1_data_dma_reg; | 1063 | iter_reg = fw->rcvt1_data_dma_reg; |
965 | WRT_REG_DWORD(®->iobase_addr, 0x7720); | 1064 | WRT_REG_DWORD(®->iobase_addr, 0x7720); |
966 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1065 | dmp_reg = ®->iobase_window; |
967 | for (cnt = 0; cnt < 16; cnt++) | 1066 | for (cnt = 0; cnt < 16; cnt++) |
968 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1067 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
969 | 1068 | ||
970 | WRT_REG_DWORD(®->iobase_addr, 0x7730); | 1069 | WRT_REG_DWORD(®->iobase_addr, 0x7730); |
971 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1070 | dmp_reg = ®->iobase_window; |
972 | for (cnt = 0; cnt < 16; cnt++) | 1071 | for (cnt = 0; cnt < 16; cnt++) |
973 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1072 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
974 | 1073 | ||
975 | /* RISC registers. */ | 1074 | /* RISC registers. */ |
976 | iter_reg = fw->risc_gp_reg; | 1075 | iter_reg = fw->risc_gp_reg; |
977 | WRT_REG_DWORD(®->iobase_addr, 0x0F00); | 1076 | WRT_REG_DWORD(®->iobase_addr, 0x0F00); |
978 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1077 | dmp_reg = ®->iobase_window; |
979 | for (cnt = 0; cnt < 16; cnt++) | 1078 | for (cnt = 0; cnt < 16; cnt++) |
980 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1079 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
981 | 1080 | ||
982 | WRT_REG_DWORD(®->iobase_addr, 0x0F10); | 1081 | WRT_REG_DWORD(®->iobase_addr, 0x0F10); |
983 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1082 | dmp_reg = ®->iobase_window; |
984 | for (cnt = 0; cnt < 16; cnt++) | 1083 | for (cnt = 0; cnt < 16; cnt++) |
985 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1084 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
986 | 1085 | ||
987 | WRT_REG_DWORD(®->iobase_addr, 0x0F20); | 1086 | WRT_REG_DWORD(®->iobase_addr, 0x0F20); |
988 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1087 | dmp_reg = ®->iobase_window; |
989 | for (cnt = 0; cnt < 16; cnt++) | 1088 | for (cnt = 0; cnt < 16; cnt++) |
990 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1089 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
991 | 1090 | ||
992 | WRT_REG_DWORD(®->iobase_addr, 0x0F30); | 1091 | WRT_REG_DWORD(®->iobase_addr, 0x0F30); |
993 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1092 | dmp_reg = ®->iobase_window; |
994 | for (cnt = 0; cnt < 16; cnt++) | 1093 | for (cnt = 0; cnt < 16; cnt++) |
995 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1094 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
996 | 1095 | ||
997 | WRT_REG_DWORD(®->iobase_addr, 0x0F40); | 1096 | WRT_REG_DWORD(®->iobase_addr, 0x0F40); |
998 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1097 | dmp_reg = ®->iobase_window; |
999 | for (cnt = 0; cnt < 16; cnt++) | 1098 | for (cnt = 0; cnt < 16; cnt++) |
1000 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1099 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
1001 | 1100 | ||
1002 | WRT_REG_DWORD(®->iobase_addr, 0x0F50); | 1101 | WRT_REG_DWORD(®->iobase_addr, 0x0F50); |
1003 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1102 | dmp_reg = ®->iobase_window; |
1004 | for (cnt = 0; cnt < 16; cnt++) | 1103 | for (cnt = 0; cnt < 16; cnt++) |
1005 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1104 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
1006 | 1105 | ||
1007 | WRT_REG_DWORD(®->iobase_addr, 0x0F60); | 1106 | WRT_REG_DWORD(®->iobase_addr, 0x0F60); |
1008 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1107 | dmp_reg = ®->iobase_window; |
1009 | for (cnt = 0; cnt < 16; cnt++) | 1108 | for (cnt = 0; cnt < 16; cnt++) |
1010 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1109 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
1011 | 1110 | ||
1012 | WRT_REG_DWORD(®->iobase_addr, 0x0F70); | 1111 | WRT_REG_DWORD(®->iobase_addr, 0x0F70); |
1013 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1112 | dmp_reg = ®->iobase_window; |
1014 | for (cnt = 0; cnt < 16; cnt++) | 1113 | for (cnt = 0; cnt < 16; cnt++) |
1015 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1114 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
1016 | 1115 | ||
1017 | /* Local memory controller registers. */ | 1116 | /* Local memory controller registers. */ |
1018 | iter_reg = fw->lmc_reg; | 1117 | iter_reg = fw->lmc_reg; |
1019 | WRT_REG_DWORD(®->iobase_addr, 0x3000); | 1118 | WRT_REG_DWORD(®->iobase_addr, 0x3000); |
1020 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1119 | dmp_reg = ®->iobase_window; |
1021 | for (cnt = 0; cnt < 16; cnt++) | 1120 | for (cnt = 0; cnt < 16; cnt++) |
1022 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1121 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
1023 | 1122 | ||
1024 | WRT_REG_DWORD(®->iobase_addr, 0x3010); | 1123 | WRT_REG_DWORD(®->iobase_addr, 0x3010); |
1025 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1124 | dmp_reg = ®->iobase_window; |
1026 | for (cnt = 0; cnt < 16; cnt++) | 1125 | for (cnt = 0; cnt < 16; cnt++) |
1027 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1126 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
1028 | 1127 | ||
1029 | WRT_REG_DWORD(®->iobase_addr, 0x3020); | 1128 | WRT_REG_DWORD(®->iobase_addr, 0x3020); |
1030 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1129 | dmp_reg = ®->iobase_window; |
1031 | for (cnt = 0; cnt < 16; cnt++) | 1130 | for (cnt = 0; cnt < 16; cnt++) |
1032 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1131 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
1033 | 1132 | ||
1034 | WRT_REG_DWORD(®->iobase_addr, 0x3030); | 1133 | WRT_REG_DWORD(®->iobase_addr, 0x3030); |
1035 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1134 | dmp_reg = ®->iobase_window; |
1036 | for (cnt = 0; cnt < 16; cnt++) | 1135 | for (cnt = 0; cnt < 16; cnt++) |
1037 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1136 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
1038 | 1137 | ||
1039 | WRT_REG_DWORD(®->iobase_addr, 0x3040); | 1138 | WRT_REG_DWORD(®->iobase_addr, 0x3040); |
1040 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1139 | dmp_reg = ®->iobase_window; |
1041 | for (cnt = 0; cnt < 16; cnt++) | 1140 | for (cnt = 0; cnt < 16; cnt++) |
1042 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1141 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
1043 | 1142 | ||
1044 | WRT_REG_DWORD(®->iobase_addr, 0x3050); | 1143 | WRT_REG_DWORD(®->iobase_addr, 0x3050); |
1045 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1144 | dmp_reg = ®->iobase_window; |
1046 | for (cnt = 0; cnt < 16; cnt++) | 1145 | for (cnt = 0; cnt < 16; cnt++) |
1047 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1146 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
1048 | 1147 | ||
1049 | WRT_REG_DWORD(®->iobase_addr, 0x3060); | 1148 | WRT_REG_DWORD(®->iobase_addr, 0x3060); |
1050 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1149 | dmp_reg = ®->iobase_window; |
1051 | for (cnt = 0; cnt < 16; cnt++) | 1150 | for (cnt = 0; cnt < 16; cnt++) |
1052 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1151 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
1053 | 1152 | ||
1054 | /* Fibre Protocol Module registers. */ | 1153 | /* Fibre Protocol Module registers. */ |
1055 | iter_reg = fw->fpm_hdw_reg; | 1154 | iter_reg = fw->fpm_hdw_reg; |
1056 | WRT_REG_DWORD(®->iobase_addr, 0x4000); | 1155 | WRT_REG_DWORD(®->iobase_addr, 0x4000); |
1057 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1156 | dmp_reg = ®->iobase_window; |
1058 | for (cnt = 0; cnt < 16; cnt++) | 1157 | for (cnt = 0; cnt < 16; cnt++) |
1059 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1158 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
1060 | 1159 | ||
1061 | WRT_REG_DWORD(®->iobase_addr, 0x4010); | 1160 | WRT_REG_DWORD(®->iobase_addr, 0x4010); |
1062 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1161 | dmp_reg = ®->iobase_window; |
1063 | for (cnt = 0; cnt < 16; cnt++) | 1162 | for (cnt = 0; cnt < 16; cnt++) |
1064 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1163 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
1065 | 1164 | ||
1066 | WRT_REG_DWORD(®->iobase_addr, 0x4020); | 1165 | WRT_REG_DWORD(®->iobase_addr, 0x4020); |
1067 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1166 | dmp_reg = ®->iobase_window; |
1068 | for (cnt = 0; cnt < 16; cnt++) | 1167 | for (cnt = 0; cnt < 16; cnt++) |
1069 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1168 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
1070 | 1169 | ||
1071 | WRT_REG_DWORD(®->iobase_addr, 0x4030); | 1170 | WRT_REG_DWORD(®->iobase_addr, 0x4030); |
1072 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1171 | dmp_reg = ®->iobase_window; |
1073 | for (cnt = 0; cnt < 16; cnt++) | 1172 | for (cnt = 0; cnt < 16; cnt++) |
1074 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1173 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
1075 | 1174 | ||
1076 | WRT_REG_DWORD(®->iobase_addr, 0x4040); | 1175 | WRT_REG_DWORD(®->iobase_addr, 0x4040); |
1077 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1176 | dmp_reg = ®->iobase_window; |
1078 | for (cnt = 0; cnt < 16; cnt++) | 1177 | for (cnt = 0; cnt < 16; cnt++) |
1079 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1178 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
1080 | 1179 | ||
1081 | WRT_REG_DWORD(®->iobase_addr, 0x4050); | 1180 | WRT_REG_DWORD(®->iobase_addr, 0x4050); |
1082 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1181 | dmp_reg = ®->iobase_window; |
1083 | for (cnt = 0; cnt < 16; cnt++) | 1182 | for (cnt = 0; cnt < 16; cnt++) |
1084 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1183 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
1085 | 1184 | ||
1086 | WRT_REG_DWORD(®->iobase_addr, 0x4060); | 1185 | WRT_REG_DWORD(®->iobase_addr, 0x4060); |
1087 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1186 | dmp_reg = ®->iobase_window; |
1088 | for (cnt = 0; cnt < 16; cnt++) | 1187 | for (cnt = 0; cnt < 16; cnt++) |
1089 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1188 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
1090 | 1189 | ||
1091 | WRT_REG_DWORD(®->iobase_addr, 0x4070); | 1190 | WRT_REG_DWORD(®->iobase_addr, 0x4070); |
1092 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1191 | dmp_reg = ®->iobase_window; |
1093 | for (cnt = 0; cnt < 16; cnt++) | 1192 | for (cnt = 0; cnt < 16; cnt++) |
1094 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1193 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
1095 | 1194 | ||
1096 | WRT_REG_DWORD(®->iobase_addr, 0x4080); | 1195 | WRT_REG_DWORD(®->iobase_addr, 0x4080); |
1097 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1196 | dmp_reg = ®->iobase_window; |
1098 | for (cnt = 0; cnt < 16; cnt++) | 1197 | for (cnt = 0; cnt < 16; cnt++) |
1099 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1198 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
1100 | 1199 | ||
1101 | WRT_REG_DWORD(®->iobase_addr, 0x4090); | 1200 | WRT_REG_DWORD(®->iobase_addr, 0x4090); |
1102 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1201 | dmp_reg = ®->iobase_window; |
1103 | for (cnt = 0; cnt < 16; cnt++) | 1202 | for (cnt = 0; cnt < 16; cnt++) |
1104 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1203 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
1105 | 1204 | ||
1106 | WRT_REG_DWORD(®->iobase_addr, 0x40A0); | 1205 | WRT_REG_DWORD(®->iobase_addr, 0x40A0); |
1107 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1206 | dmp_reg = ®->iobase_window; |
1108 | for (cnt = 0; cnt < 16; cnt++) | 1207 | for (cnt = 0; cnt < 16; cnt++) |
1109 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1208 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
1110 | 1209 | ||
1111 | WRT_REG_DWORD(®->iobase_addr, 0x40B0); | 1210 | WRT_REG_DWORD(®->iobase_addr, 0x40B0); |
1112 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1211 | dmp_reg = ®->iobase_window; |
1113 | for (cnt = 0; cnt < 16; cnt++) | 1212 | for (cnt = 0; cnt < 16; cnt++) |
1114 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1213 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
1115 | 1214 | ||
1116 | /* Frame Buffer registers. */ | 1215 | /* Frame Buffer registers. */ |
1117 | iter_reg = fw->fb_hdw_reg; | 1216 | iter_reg = fw->fb_hdw_reg; |
1118 | WRT_REG_DWORD(®->iobase_addr, 0x6000); | 1217 | WRT_REG_DWORD(®->iobase_addr, 0x6000); |
1119 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1218 | dmp_reg = ®->iobase_window; |
1120 | for (cnt = 0; cnt < 16; cnt++) | 1219 | for (cnt = 0; cnt < 16; cnt++) |
1121 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1220 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
1122 | 1221 | ||
1123 | WRT_REG_DWORD(®->iobase_addr, 0x6010); | 1222 | WRT_REG_DWORD(®->iobase_addr, 0x6010); |
1124 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1223 | dmp_reg = ®->iobase_window; |
1125 | for (cnt = 0; cnt < 16; cnt++) | 1224 | for (cnt = 0; cnt < 16; cnt++) |
1126 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1225 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
1127 | 1226 | ||
1128 | WRT_REG_DWORD(®->iobase_addr, 0x6020); | 1227 | WRT_REG_DWORD(®->iobase_addr, 0x6020); |
1129 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1228 | dmp_reg = ®->iobase_window; |
1130 | for (cnt = 0; cnt < 16; cnt++) | 1229 | for (cnt = 0; cnt < 16; cnt++) |
1131 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1230 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
1132 | 1231 | ||
1133 | WRT_REG_DWORD(®->iobase_addr, 0x6030); | 1232 | WRT_REG_DWORD(®->iobase_addr, 0x6030); |
1134 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1233 | dmp_reg = ®->iobase_window; |
1135 | for (cnt = 0; cnt < 16; cnt++) | 1234 | for (cnt = 0; cnt < 16; cnt++) |
1136 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1235 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
1137 | 1236 | ||
1138 | WRT_REG_DWORD(®->iobase_addr, 0x6040); | 1237 | WRT_REG_DWORD(®->iobase_addr, 0x6040); |
1139 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1238 | dmp_reg = ®->iobase_window; |
1140 | for (cnt = 0; cnt < 16; cnt++) | 1239 | for (cnt = 0; cnt < 16; cnt++) |
1141 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1240 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
1142 | 1241 | ||
1143 | WRT_REG_DWORD(®->iobase_addr, 0x6100); | 1242 | WRT_REG_DWORD(®->iobase_addr, 0x6100); |
1144 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1243 | dmp_reg = ®->iobase_window; |
1145 | for (cnt = 0; cnt < 16; cnt++) | 1244 | for (cnt = 0; cnt < 16; cnt++) |
1146 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1245 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
1147 | 1246 | ||
1148 | WRT_REG_DWORD(®->iobase_addr, 0x6130); | 1247 | WRT_REG_DWORD(®->iobase_addr, 0x6130); |
1149 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1248 | dmp_reg = ®->iobase_window; |
1150 | for (cnt = 0; cnt < 16; cnt++) | 1249 | for (cnt = 0; cnt < 16; cnt++) |
1151 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1250 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
1152 | 1251 | ||
1153 | WRT_REG_DWORD(®->iobase_addr, 0x6150); | 1252 | WRT_REG_DWORD(®->iobase_addr, 0x6150); |
1154 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1253 | dmp_reg = ®->iobase_window; |
1155 | for (cnt = 0; cnt < 16; cnt++) | 1254 | for (cnt = 0; cnt < 16; cnt++) |
1156 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1255 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
1157 | 1256 | ||
1158 | WRT_REG_DWORD(®->iobase_addr, 0x6170); | 1257 | WRT_REG_DWORD(®->iobase_addr, 0x6170); |
1159 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1258 | dmp_reg = ®->iobase_window; |
1160 | for (cnt = 0; cnt < 16; cnt++) | 1259 | for (cnt = 0; cnt < 16; cnt++) |
1161 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1260 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
1162 | 1261 | ||
1163 | WRT_REG_DWORD(®->iobase_addr, 0x6190); | 1262 | WRT_REG_DWORD(®->iobase_addr, 0x6190); |
1164 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1263 | dmp_reg = ®->iobase_window; |
1165 | for (cnt = 0; cnt < 16; cnt++) | 1264 | for (cnt = 0; cnt < 16; cnt++) |
1166 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1265 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
1167 | 1266 | ||
1168 | WRT_REG_DWORD(®->iobase_addr, 0x61B0); | 1267 | WRT_REG_DWORD(®->iobase_addr, 0x61B0); |
1169 | dmp_reg = (uint32_t __iomem *)((uint8_t __iomem *)reg + 0xC0); | 1268 | dmp_reg = ®->iobase_window; |
1170 | for (cnt = 0; cnt < 16; cnt++) | 1269 | for (cnt = 0; cnt < 16; cnt++) |
1171 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | 1270 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); |
1172 | 1271 | ||
@@ -1187,10 +1286,10 @@ qla24xx_fw_dump(scsi_qla_host_t *ha, int hardware_locked) | |||
1187 | 1286 | ||
1188 | udelay(100); | 1287 | udelay(100); |
1189 | /* Wait for firmware to complete NVRAM accesses. */ | 1288 | /* Wait for firmware to complete NVRAM accesses. */ |
1190 | mb[0] = (uint32_t) RD_REG_WORD(®->mailbox0); | 1289 | mb0 = (uint32_t) RD_REG_WORD(®->mailbox0); |
1191 | for (cnt = 10000 ; cnt && mb[0]; cnt--) { | 1290 | for (cnt = 10000 ; cnt && mb0; cnt--) { |
1192 | udelay(5); | 1291 | udelay(5); |
1193 | mb[0] = (uint32_t) RD_REG_WORD(®->mailbox0); | 1292 | mb0 = (uint32_t) RD_REG_WORD(®->mailbox0); |
1194 | barrier(); | 1293 | barrier(); |
1195 | } | 1294 | } |
1196 | 1295 | ||
@@ -1214,110 +1313,717 @@ qla24xx_fw_dump(scsi_qla_host_t *ha, int hardware_locked) | |||
1214 | rval = QLA_FUNCTION_TIMEOUT; | 1313 | rval = QLA_FUNCTION_TIMEOUT; |
1215 | } | 1314 | } |
1216 | 1315 | ||
1217 | /* Memory. */ | 1316 | if (rval == QLA_SUCCESS) |
1317 | rval = qla2xxx_dump_memory(ha, fw->code_ram, | ||
1318 | sizeof(fw->code_ram), fw->ext_mem, &nxt); | ||
1319 | |||
1218 | if (rval == QLA_SUCCESS) { | 1320 | if (rval == QLA_SUCCESS) { |
1219 | /* Code RAM. */ | 1321 | nxt = qla2xxx_copy_queues(ha, nxt); |
1220 | risc_address = 0x20000; | 1322 | if (ha->eft) |
1221 | WRT_REG_WORD(®->mailbox0, MBC_READ_RAM_EXTENDED); | 1323 | memcpy(nxt, ha->eft, ntohl(ha->fw_dump->eft_size)); |
1222 | clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); | ||
1223 | } | 1324 | } |
1224 | for (cnt = 0; cnt < sizeof(fw->code_ram) / 4 && rval == QLA_SUCCESS; | ||
1225 | cnt++, risc_address++) { | ||
1226 | WRT_REG_WORD(®->mailbox1, LSW(risc_address)); | ||
1227 | WRT_REG_WORD(®->mailbox8, MSW(risc_address)); | ||
1228 | RD_REG_WORD(®->mailbox8); | ||
1229 | WRT_REG_DWORD(®->hccr, HCCRX_SET_HOST_INT); | ||
1230 | 1325 | ||
1231 | for (timer = 6000000; timer; timer--) { | 1326 | if (rval != QLA_SUCCESS) { |
1232 | /* Check for pending interrupts. */ | 1327 | qla_printk(KERN_WARNING, ha, |
1233 | stat = RD_REG_DWORD(®->host_status); | 1328 | "Failed to dump firmware (%x)!!!\n", rval); |
1234 | if (stat & HSRX_RISC_INT) { | 1329 | ha->fw_dumped = 0; |
1235 | stat &= 0xff; | ||
1236 | 1330 | ||
1237 | if (stat == 0x1 || stat == 0x2 || | 1331 | } else { |
1238 | stat == 0x10 || stat == 0x11) { | 1332 | qla_printk(KERN_INFO, ha, |
1239 | set_bit(MBX_INTERRUPT, | 1333 | "Firmware dump saved to temp buffer (%ld/%p).\n", |
1240 | &ha->mbx_cmd_flags); | 1334 | ha->host_no, ha->fw_dump); |
1335 | ha->fw_dumped = 1; | ||
1336 | } | ||
1241 | 1337 | ||
1242 | mb[0] = RD_REG_WORD(®->mailbox0); | 1338 | qla24xx_fw_dump_failed: |
1243 | mb[2] = RD_REG_WORD(®->mailbox2); | 1339 | if (!hardware_locked) |
1244 | mb[3] = RD_REG_WORD(®->mailbox3); | 1340 | spin_unlock_irqrestore(&ha->hardware_lock, flags); |
1341 | } | ||
1245 | 1342 | ||
1246 | WRT_REG_DWORD(®->hccr, | 1343 | void |
1247 | HCCRX_CLR_RISC_INT); | 1344 | qla25xx_fw_dump(scsi_qla_host_t *ha, int hardware_locked) |
1248 | RD_REG_DWORD(®->hccr); | 1345 | { |
1249 | break; | 1346 | int rval; |
1250 | } | 1347 | uint32_t cnt; |
1348 | uint32_t risc_address; | ||
1349 | uint16_t mb0, wd; | ||
1251 | 1350 | ||
1252 | /* Clear this intr; it wasn't a mailbox intr */ | 1351 | struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; |
1253 | WRT_REG_DWORD(®->hccr, HCCRX_CLR_RISC_INT); | 1352 | uint32_t __iomem *dmp_reg; |
1254 | RD_REG_DWORD(®->hccr); | 1353 | uint32_t *iter_reg; |
1255 | } | 1354 | uint16_t __iomem *mbx_reg; |
1256 | udelay(5); | 1355 | unsigned long flags; |
1257 | } | 1356 | struct qla25xx_fw_dump *fw; |
1357 | uint32_t ext_mem_cnt; | ||
1358 | void *nxt; | ||
1258 | 1359 | ||
1259 | if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) { | 1360 | risc_address = ext_mem_cnt = 0; |
1260 | rval = mb[0] & MBS_MASK; | 1361 | flags = 0; |
1261 | fw->code_ram[cnt] = htonl((mb[3] << 16) | mb[2]); | 1362 | |
1262 | } else { | 1363 | if (!hardware_locked) |
1263 | rval = QLA_FUNCTION_FAILED; | 1364 | spin_lock_irqsave(&ha->hardware_lock, flags); |
1365 | |||
1366 | if (!ha->fw_dump) { | ||
1367 | qla_printk(KERN_WARNING, ha, | ||
1368 | "No buffer available for dump!!!\n"); | ||
1369 | goto qla25xx_fw_dump_failed; | ||
1370 | } | ||
1371 | |||
1372 | if (ha->fw_dumped) { | ||
1373 | qla_printk(KERN_WARNING, ha, | ||
1374 | "Firmware has been previously dumped (%p) -- ignoring " | ||
1375 | "request...\n", ha->fw_dump); | ||
1376 | goto qla25xx_fw_dump_failed; | ||
1377 | } | ||
1378 | fw = &ha->fw_dump->isp.isp25; | ||
1379 | qla2xxx_prep_dump(ha, ha->fw_dump); | ||
1380 | |||
1381 | rval = QLA_SUCCESS; | ||
1382 | fw->host_status = htonl(RD_REG_DWORD(®->host_status)); | ||
1383 | |||
1384 | /* Pause RISC. */ | ||
1385 | if ((RD_REG_DWORD(®->hccr) & HCCRX_RISC_PAUSE) == 0) { | ||
1386 | WRT_REG_DWORD(®->hccr, HCCRX_SET_RISC_RESET | | ||
1387 | HCCRX_CLR_HOST_INT); | ||
1388 | RD_REG_DWORD(®->hccr); /* PCI Posting. */ | ||
1389 | WRT_REG_DWORD(®->hccr, HCCRX_SET_RISC_PAUSE); | ||
1390 | for (cnt = 30000; | ||
1391 | (RD_REG_DWORD(®->hccr) & HCCRX_RISC_PAUSE) == 0 && | ||
1392 | rval == QLA_SUCCESS; cnt--) { | ||
1393 | if (cnt) | ||
1394 | udelay(100); | ||
1395 | else | ||
1396 | rval = QLA_FUNCTION_TIMEOUT; | ||
1264 | } | 1397 | } |
1265 | } | 1398 | } |
1266 | 1399 | ||
1267 | if (rval == QLA_SUCCESS) { | 1400 | if (rval == QLA_SUCCESS) { |
1268 | /* External Memory. */ | 1401 | /* Host interface registers. */ |
1269 | risc_address = 0x100000; | 1402 | dmp_reg = (uint32_t __iomem *)(reg + 0); |
1270 | ext_mem_cnt = ha->fw_memory_size - 0x100000 + 1; | 1403 | for (cnt = 0; cnt < sizeof(fw->host_reg) / 4; cnt++) |
1271 | WRT_REG_WORD(®->mailbox0, MBC_READ_RAM_EXTENDED); | 1404 | fw->host_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++)); |
1272 | clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); | ||
1273 | } | ||
1274 | for (cnt = 0; cnt < ext_mem_cnt && rval == QLA_SUCCESS; | ||
1275 | cnt++, risc_address++) { | ||
1276 | WRT_REG_WORD(®->mailbox1, LSW(risc_address)); | ||
1277 | WRT_REG_WORD(®->mailbox8, MSW(risc_address)); | ||
1278 | RD_REG_WORD(®->mailbox8); | ||
1279 | WRT_REG_DWORD(®->hccr, HCCRX_SET_HOST_INT); | ||
1280 | 1405 | ||
1281 | for (timer = 6000000; timer; timer--) { | 1406 | /* Disable interrupts. */ |
1282 | /* Check for pending interrupts. */ | 1407 | WRT_REG_DWORD(®->ictrl, 0); |
1283 | stat = RD_REG_DWORD(®->host_status); | 1408 | RD_REG_DWORD(®->ictrl); |
1284 | if (stat & HSRX_RISC_INT) { | ||
1285 | stat &= 0xff; | ||
1286 | 1409 | ||
1287 | if (stat == 0x1 || stat == 0x2 || | 1410 | /* Shadow registers. */ |
1288 | stat == 0x10 || stat == 0x11) { | 1411 | WRT_REG_DWORD(®->iobase_addr, 0x0F70); |
1289 | set_bit(MBX_INTERRUPT, | 1412 | RD_REG_DWORD(®->iobase_addr); |
1290 | &ha->mbx_cmd_flags); | 1413 | WRT_REG_DWORD(®->iobase_select, 0xB0000000); |
1414 | fw->shadow_reg[0] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1291 | 1415 | ||
1292 | mb[0] = RD_REG_WORD(®->mailbox0); | 1416 | WRT_REG_DWORD(®->iobase_select, 0xB0100000); |
1293 | mb[2] = RD_REG_WORD(®->mailbox2); | 1417 | fw->shadow_reg[1] = htonl(RD_REG_DWORD(®->iobase_sdata)); |
1294 | mb[3] = RD_REG_WORD(®->mailbox3); | ||
1295 | 1418 | ||
1296 | WRT_REG_DWORD(®->hccr, | 1419 | WRT_REG_DWORD(®->iobase_select, 0xB0200000); |
1297 | HCCRX_CLR_RISC_INT); | 1420 | fw->shadow_reg[2] = htonl(RD_REG_DWORD(®->iobase_sdata)); |
1298 | RD_REG_DWORD(®->hccr); | ||
1299 | break; | ||
1300 | } | ||
1301 | 1421 | ||
1302 | /* Clear this intr; it wasn't a mailbox intr */ | 1422 | WRT_REG_DWORD(®->iobase_select, 0xB0300000); |
1303 | WRT_REG_DWORD(®->hccr, HCCRX_CLR_RISC_INT); | 1423 | fw->shadow_reg[3] = htonl(RD_REG_DWORD(®->iobase_sdata)); |
1304 | RD_REG_DWORD(®->hccr); | 1424 | |
1305 | } | 1425 | WRT_REG_DWORD(®->iobase_select, 0xB0400000); |
1426 | fw->shadow_reg[4] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1427 | |||
1428 | WRT_REG_DWORD(®->iobase_select, 0xB0500000); | ||
1429 | fw->shadow_reg[5] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1430 | |||
1431 | WRT_REG_DWORD(®->iobase_select, 0xB0600000); | ||
1432 | fw->shadow_reg[6] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1433 | |||
1434 | WRT_REG_DWORD(®->iobase_select, 0xB0700000); | ||
1435 | fw->shadow_reg[7] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1436 | |||
1437 | WRT_REG_DWORD(®->iobase_select, 0xB0800000); | ||
1438 | fw->shadow_reg[8] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1439 | |||
1440 | WRT_REG_DWORD(®->iobase_select, 0xB0900000); | ||
1441 | fw->shadow_reg[9] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1442 | |||
1443 | WRT_REG_DWORD(®->iobase_select, 0xB0A00000); | ||
1444 | fw->shadow_reg[10] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1445 | |||
1446 | /* RISC I/O register. */ | ||
1447 | WRT_REG_DWORD(®->iobase_addr, 0x0010); | ||
1448 | RD_REG_DWORD(®->iobase_addr); | ||
1449 | fw->risc_io_reg = htonl(RD_REG_DWORD(®->iobase_window)); | ||
1450 | |||
1451 | /* Mailbox registers. */ | ||
1452 | mbx_reg = ®->mailbox0; | ||
1453 | for (cnt = 0; cnt < sizeof(fw->mailbox_reg) / 2; cnt++) | ||
1454 | fw->mailbox_reg[cnt] = htons(RD_REG_WORD(mbx_reg++)); | ||
1455 | |||
1456 | /* Transfer sequence registers. */ | ||
1457 | iter_reg = fw->xseq_gp_reg; | ||
1458 | WRT_REG_DWORD(®->iobase_addr, 0xBF00); | ||
1459 | dmp_reg = ®->iobase_window; | ||
1460 | for (cnt = 0; cnt < 16; cnt++) | ||
1461 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1462 | |||
1463 | WRT_REG_DWORD(®->iobase_addr, 0xBF10); | ||
1464 | dmp_reg = ®->iobase_window; | ||
1465 | for (cnt = 0; cnt < 16; cnt++) | ||
1466 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1467 | |||
1468 | WRT_REG_DWORD(®->iobase_addr, 0xBF20); | ||
1469 | dmp_reg = ®->iobase_window; | ||
1470 | for (cnt = 0; cnt < 16; cnt++) | ||
1471 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1472 | |||
1473 | WRT_REG_DWORD(®->iobase_addr, 0xBF30); | ||
1474 | dmp_reg = ®->iobase_window; | ||
1475 | for (cnt = 0; cnt < 16; cnt++) | ||
1476 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1477 | |||
1478 | WRT_REG_DWORD(®->iobase_addr, 0xBF40); | ||
1479 | dmp_reg = ®->iobase_window; | ||
1480 | for (cnt = 0; cnt < 16; cnt++) | ||
1481 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1482 | |||
1483 | WRT_REG_DWORD(®->iobase_addr, 0xBF50); | ||
1484 | dmp_reg = ®->iobase_window; | ||
1485 | for (cnt = 0; cnt < 16; cnt++) | ||
1486 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1487 | |||
1488 | WRT_REG_DWORD(®->iobase_addr, 0xBF60); | ||
1489 | dmp_reg = ®->iobase_window; | ||
1490 | for (cnt = 0; cnt < 16; cnt++) | ||
1491 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1492 | |||
1493 | WRT_REG_DWORD(®->iobase_addr, 0xBF70); | ||
1494 | dmp_reg = ®->iobase_window; | ||
1495 | for (cnt = 0; cnt < 16; cnt++) | ||
1496 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1497 | |||
1498 | iter_reg = fw->xseq_0_reg; | ||
1499 | WRT_REG_DWORD(®->iobase_addr, 0xBFC0); | ||
1500 | dmp_reg = ®->iobase_window; | ||
1501 | for (cnt = 0; cnt < 16; cnt++) | ||
1502 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1503 | |||
1504 | WRT_REG_DWORD(®->iobase_addr, 0xBFD0); | ||
1505 | dmp_reg = ®->iobase_window; | ||
1506 | for (cnt = 0; cnt < 16; cnt++) | ||
1507 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1508 | |||
1509 | WRT_REG_DWORD(®->iobase_addr, 0xBFE0); | ||
1510 | dmp_reg = ®->iobase_window; | ||
1511 | for (cnt = 0; cnt < 16; cnt++) | ||
1512 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1513 | |||
1514 | WRT_REG_DWORD(®->iobase_addr, 0xBFF0); | ||
1515 | dmp_reg = ®->iobase_window; | ||
1516 | for (cnt = 0; cnt < sizeof(fw->xseq_1_reg) / 4; cnt++) | ||
1517 | fw->xseq_1_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1518 | |||
1519 | /* Receive sequence registers. */ | ||
1520 | iter_reg = fw->rseq_gp_reg; | ||
1521 | WRT_REG_DWORD(®->iobase_addr, 0xFF00); | ||
1522 | dmp_reg = ®->iobase_window; | ||
1523 | for (cnt = 0; cnt < 16; cnt++) | ||
1524 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1525 | |||
1526 | WRT_REG_DWORD(®->iobase_addr, 0xFF10); | ||
1527 | dmp_reg = ®->iobase_window; | ||
1528 | for (cnt = 0; cnt < 16; cnt++) | ||
1529 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1530 | |||
1531 | WRT_REG_DWORD(®->iobase_addr, 0xFF20); | ||
1532 | dmp_reg = ®->iobase_window; | ||
1533 | for (cnt = 0; cnt < 16; cnt++) | ||
1534 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1535 | |||
1536 | WRT_REG_DWORD(®->iobase_addr, 0xFF30); | ||
1537 | dmp_reg = ®->iobase_window; | ||
1538 | for (cnt = 0; cnt < 16; cnt++) | ||
1539 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1540 | |||
1541 | WRT_REG_DWORD(®->iobase_addr, 0xFF40); | ||
1542 | dmp_reg = ®->iobase_window; | ||
1543 | for (cnt = 0; cnt < 16; cnt++) | ||
1544 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1545 | |||
1546 | WRT_REG_DWORD(®->iobase_addr, 0xFF50); | ||
1547 | dmp_reg = ®->iobase_window; | ||
1548 | for (cnt = 0; cnt < 16; cnt++) | ||
1549 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1550 | |||
1551 | WRT_REG_DWORD(®->iobase_addr, 0xFF60); | ||
1552 | dmp_reg = ®->iobase_window; | ||
1553 | for (cnt = 0; cnt < 16; cnt++) | ||
1554 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1555 | |||
1556 | WRT_REG_DWORD(®->iobase_addr, 0xFF70); | ||
1557 | dmp_reg = ®->iobase_window; | ||
1558 | for (cnt = 0; cnt < 16; cnt++) | ||
1559 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1560 | |||
1561 | iter_reg = fw->rseq_0_reg; | ||
1562 | WRT_REG_DWORD(®->iobase_addr, 0xFFC0); | ||
1563 | dmp_reg = ®->iobase_window; | ||
1564 | for (cnt = 0; cnt < 16; cnt++) | ||
1565 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1566 | |||
1567 | WRT_REG_DWORD(®->iobase_addr, 0xFFD0); | ||
1568 | dmp_reg = ®->iobase_window; | ||
1569 | for (cnt = 0; cnt < 16; cnt++) | ||
1570 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1571 | |||
1572 | WRT_REG_DWORD(®->iobase_addr, 0xFFE0); | ||
1573 | dmp_reg = ®->iobase_window; | ||
1574 | for (cnt = 0; cnt < sizeof(fw->rseq_1_reg) / 4; cnt++) | ||
1575 | fw->rseq_1_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1576 | |||
1577 | WRT_REG_DWORD(®->iobase_addr, 0xFFF0); | ||
1578 | dmp_reg = ®->iobase_window; | ||
1579 | for (cnt = 0; cnt < sizeof(fw->rseq_2_reg) / 4; cnt++) | ||
1580 | fw->rseq_2_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1581 | |||
1582 | /* Auxiliary sequence registers. */ | ||
1583 | iter_reg = fw->aseq_gp_reg; | ||
1584 | WRT_REG_DWORD(®->iobase_addr, 0xB000); | ||
1585 | dmp_reg = ®->iobase_window; | ||
1586 | for (cnt = 0; cnt < 16; cnt++) | ||
1587 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1588 | |||
1589 | WRT_REG_DWORD(®->iobase_addr, 0xB010); | ||
1590 | dmp_reg = ®->iobase_window; | ||
1591 | for (cnt = 0; cnt < 16; cnt++) | ||
1592 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1593 | |||
1594 | WRT_REG_DWORD(®->iobase_addr, 0xB020); | ||
1595 | dmp_reg = ®->iobase_window; | ||
1596 | for (cnt = 0; cnt < 16; cnt++) | ||
1597 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1598 | |||
1599 | WRT_REG_DWORD(®->iobase_addr, 0xB030); | ||
1600 | dmp_reg = ®->iobase_window; | ||
1601 | for (cnt = 0; cnt < 16; cnt++) | ||
1602 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1603 | |||
1604 | WRT_REG_DWORD(®->iobase_addr, 0xB040); | ||
1605 | dmp_reg = ®->iobase_window; | ||
1606 | for (cnt = 0; cnt < 16; cnt++) | ||
1607 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1608 | |||
1609 | WRT_REG_DWORD(®->iobase_addr, 0xB050); | ||
1610 | dmp_reg = ®->iobase_window; | ||
1611 | for (cnt = 0; cnt < 16; cnt++) | ||
1612 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1613 | |||
1614 | WRT_REG_DWORD(®->iobase_addr, 0xB060); | ||
1615 | dmp_reg = ®->iobase_window; | ||
1616 | for (cnt = 0; cnt < 16; cnt++) | ||
1617 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1618 | |||
1619 | WRT_REG_DWORD(®->iobase_addr, 0xB070); | ||
1620 | dmp_reg = ®->iobase_window; | ||
1621 | for (cnt = 0; cnt < 16; cnt++) | ||
1622 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1623 | |||
1624 | iter_reg = fw->aseq_0_reg; | ||
1625 | WRT_REG_DWORD(®->iobase_addr, 0xB0C0); | ||
1626 | dmp_reg = ®->iobase_window; | ||
1627 | for (cnt = 0; cnt < 16; cnt++) | ||
1628 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1629 | |||
1630 | WRT_REG_DWORD(®->iobase_addr, 0xB0D0); | ||
1631 | dmp_reg = ®->iobase_window; | ||
1632 | for (cnt = 0; cnt < 16; cnt++) | ||
1633 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1634 | |||
1635 | WRT_REG_DWORD(®->iobase_addr, 0xB0E0); | ||
1636 | dmp_reg = ®->iobase_window; | ||
1637 | for (cnt = 0; cnt < sizeof(fw->aseq_1_reg) / 4; cnt++) | ||
1638 | fw->aseq_1_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1639 | |||
1640 | WRT_REG_DWORD(®->iobase_addr, 0xB0F0); | ||
1641 | dmp_reg = ®->iobase_window; | ||
1642 | for (cnt = 0; cnt < sizeof(fw->aseq_2_reg) / 4; cnt++) | ||
1643 | fw->aseq_2_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1644 | |||
1645 | /* Command DMA registers. */ | ||
1646 | WRT_REG_DWORD(®->iobase_addr, 0x7100); | ||
1647 | dmp_reg = ®->iobase_window; | ||
1648 | for (cnt = 0; cnt < sizeof(fw->cmd_dma_reg) / 4; cnt++) | ||
1649 | fw->cmd_dma_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1650 | |||
1651 | /* Queues. */ | ||
1652 | iter_reg = fw->req0_dma_reg; | ||
1653 | WRT_REG_DWORD(®->iobase_addr, 0x7200); | ||
1654 | dmp_reg = ®->iobase_window; | ||
1655 | for (cnt = 0; cnt < 8; cnt++) | ||
1656 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1657 | |||
1658 | dmp_reg = ®->iobase_q; | ||
1659 | for (cnt = 0; cnt < 7; cnt++) | ||
1660 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1661 | |||
1662 | iter_reg = fw->resp0_dma_reg; | ||
1663 | WRT_REG_DWORD(®->iobase_addr, 0x7300); | ||
1664 | dmp_reg = ®->iobase_window; | ||
1665 | for (cnt = 0; cnt < 8; cnt++) | ||
1666 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1667 | |||
1668 | dmp_reg = ®->iobase_q; | ||
1669 | for (cnt = 0; cnt < 7; cnt++) | ||
1670 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1671 | |||
1672 | iter_reg = fw->req1_dma_reg; | ||
1673 | WRT_REG_DWORD(®->iobase_addr, 0x7400); | ||
1674 | dmp_reg = ®->iobase_window; | ||
1675 | for (cnt = 0; cnt < 8; cnt++) | ||
1676 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1677 | |||
1678 | dmp_reg = ®->iobase_q; | ||
1679 | for (cnt = 0; cnt < 7; cnt++) | ||
1680 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1681 | |||
1682 | /* Transmit DMA registers. */ | ||
1683 | iter_reg = fw->xmt0_dma_reg; | ||
1684 | WRT_REG_DWORD(®->iobase_addr, 0x7600); | ||
1685 | dmp_reg = ®->iobase_window; | ||
1686 | for (cnt = 0; cnt < 16; cnt++) | ||
1687 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1688 | |||
1689 | WRT_REG_DWORD(®->iobase_addr, 0x7610); | ||
1690 | dmp_reg = ®->iobase_window; | ||
1691 | for (cnt = 0; cnt < 16; cnt++) | ||
1692 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1693 | |||
1694 | iter_reg = fw->xmt1_dma_reg; | ||
1695 | WRT_REG_DWORD(®->iobase_addr, 0x7620); | ||
1696 | dmp_reg = ®->iobase_window; | ||
1697 | for (cnt = 0; cnt < 16; cnt++) | ||
1698 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1699 | |||
1700 | WRT_REG_DWORD(®->iobase_addr, 0x7630); | ||
1701 | dmp_reg = ®->iobase_window; | ||
1702 | for (cnt = 0; cnt < 16; cnt++) | ||
1703 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1704 | |||
1705 | iter_reg = fw->xmt2_dma_reg; | ||
1706 | WRT_REG_DWORD(®->iobase_addr, 0x7640); | ||
1707 | dmp_reg = ®->iobase_window; | ||
1708 | for (cnt = 0; cnt < 16; cnt++) | ||
1709 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1710 | |||
1711 | WRT_REG_DWORD(®->iobase_addr, 0x7650); | ||
1712 | dmp_reg = ®->iobase_window; | ||
1713 | for (cnt = 0; cnt < 16; cnt++) | ||
1714 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1715 | |||
1716 | iter_reg = fw->xmt3_dma_reg; | ||
1717 | WRT_REG_DWORD(®->iobase_addr, 0x7660); | ||
1718 | dmp_reg = ®->iobase_window; | ||
1719 | for (cnt = 0; cnt < 16; cnt++) | ||
1720 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1721 | |||
1722 | WRT_REG_DWORD(®->iobase_addr, 0x7670); | ||
1723 | dmp_reg = ®->iobase_window; | ||
1724 | for (cnt = 0; cnt < 16; cnt++) | ||
1725 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1726 | |||
1727 | iter_reg = fw->xmt4_dma_reg; | ||
1728 | WRT_REG_DWORD(®->iobase_addr, 0x7680); | ||
1729 | dmp_reg = ®->iobase_window; | ||
1730 | for (cnt = 0; cnt < 16; cnt++) | ||
1731 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1732 | |||
1733 | WRT_REG_DWORD(®->iobase_addr, 0x7690); | ||
1734 | dmp_reg = ®->iobase_window; | ||
1735 | for (cnt = 0; cnt < 16; cnt++) | ||
1736 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1737 | |||
1738 | WRT_REG_DWORD(®->iobase_addr, 0x76A0); | ||
1739 | dmp_reg = ®->iobase_window; | ||
1740 | for (cnt = 0; cnt < sizeof(fw->xmt_data_dma_reg) / 4; cnt++) | ||
1741 | fw->xmt_data_dma_reg[cnt] = | ||
1742 | htonl(RD_REG_DWORD(dmp_reg++)); | ||
1743 | |||
1744 | /* Receive DMA registers. */ | ||
1745 | iter_reg = fw->rcvt0_data_dma_reg; | ||
1746 | WRT_REG_DWORD(®->iobase_addr, 0x7700); | ||
1747 | dmp_reg = ®->iobase_window; | ||
1748 | for (cnt = 0; cnt < 16; cnt++) | ||
1749 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1750 | |||
1751 | WRT_REG_DWORD(®->iobase_addr, 0x7710); | ||
1752 | dmp_reg = ®->iobase_window; | ||
1753 | for (cnt = 0; cnt < 16; cnt++) | ||
1754 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1755 | |||
1756 | iter_reg = fw->rcvt1_data_dma_reg; | ||
1757 | WRT_REG_DWORD(®->iobase_addr, 0x7720); | ||
1758 | dmp_reg = ®->iobase_window; | ||
1759 | for (cnt = 0; cnt < 16; cnt++) | ||
1760 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1761 | |||
1762 | WRT_REG_DWORD(®->iobase_addr, 0x7730); | ||
1763 | dmp_reg = ®->iobase_window; | ||
1764 | for (cnt = 0; cnt < 16; cnt++) | ||
1765 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1766 | |||
1767 | /* RISC registers. */ | ||
1768 | iter_reg = fw->risc_gp_reg; | ||
1769 | WRT_REG_DWORD(®->iobase_addr, 0x0F00); | ||
1770 | dmp_reg = ®->iobase_window; | ||
1771 | for (cnt = 0; cnt < 16; cnt++) | ||
1772 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1773 | |||
1774 | WRT_REG_DWORD(®->iobase_addr, 0x0F10); | ||
1775 | dmp_reg = ®->iobase_window; | ||
1776 | for (cnt = 0; cnt < 16; cnt++) | ||
1777 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1778 | |||
1779 | WRT_REG_DWORD(®->iobase_addr, 0x0F20); | ||
1780 | dmp_reg = ®->iobase_window; | ||
1781 | for (cnt = 0; cnt < 16; cnt++) | ||
1782 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1783 | |||
1784 | WRT_REG_DWORD(®->iobase_addr, 0x0F30); | ||
1785 | dmp_reg = ®->iobase_window; | ||
1786 | for (cnt = 0; cnt < 16; cnt++) | ||
1787 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1788 | |||
1789 | WRT_REG_DWORD(®->iobase_addr, 0x0F40); | ||
1790 | dmp_reg = ®->iobase_window; | ||
1791 | for (cnt = 0; cnt < 16; cnt++) | ||
1792 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1793 | |||
1794 | WRT_REG_DWORD(®->iobase_addr, 0x0F50); | ||
1795 | dmp_reg = ®->iobase_window; | ||
1796 | for (cnt = 0; cnt < 16; cnt++) | ||
1797 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1798 | |||
1799 | WRT_REG_DWORD(®->iobase_addr, 0x0F60); | ||
1800 | dmp_reg = ®->iobase_window; | ||
1801 | for (cnt = 0; cnt < 16; cnt++) | ||
1802 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1803 | |||
1804 | WRT_REG_DWORD(®->iobase_addr, 0x0F70); | ||
1805 | dmp_reg = ®->iobase_window; | ||
1806 | for (cnt = 0; cnt < 16; cnt++) | ||
1807 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1808 | |||
1809 | /* Local memory controller registers. */ | ||
1810 | iter_reg = fw->lmc_reg; | ||
1811 | WRT_REG_DWORD(®->iobase_addr, 0x3000); | ||
1812 | dmp_reg = ®->iobase_window; | ||
1813 | for (cnt = 0; cnt < 16; cnt++) | ||
1814 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1815 | |||
1816 | WRT_REG_DWORD(®->iobase_addr, 0x3010); | ||
1817 | dmp_reg = ®->iobase_window; | ||
1818 | for (cnt = 0; cnt < 16; cnt++) | ||
1819 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1820 | |||
1821 | WRT_REG_DWORD(®->iobase_addr, 0x3020); | ||
1822 | dmp_reg = ®->iobase_window; | ||
1823 | for (cnt = 0; cnt < 16; cnt++) | ||
1824 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1825 | |||
1826 | WRT_REG_DWORD(®->iobase_addr, 0x3030); | ||
1827 | dmp_reg = ®->iobase_window; | ||
1828 | for (cnt = 0; cnt < 16; cnt++) | ||
1829 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1830 | |||
1831 | WRT_REG_DWORD(®->iobase_addr, 0x3040); | ||
1832 | dmp_reg = ®->iobase_window; | ||
1833 | for (cnt = 0; cnt < 16; cnt++) | ||
1834 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1835 | |||
1836 | WRT_REG_DWORD(®->iobase_addr, 0x3050); | ||
1837 | dmp_reg = ®->iobase_window; | ||
1838 | for (cnt = 0; cnt < 16; cnt++) | ||
1839 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1840 | |||
1841 | WRT_REG_DWORD(®->iobase_addr, 0x3060); | ||
1842 | dmp_reg = ®->iobase_window; | ||
1843 | for (cnt = 0; cnt < 16; cnt++) | ||
1844 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1845 | |||
1846 | WRT_REG_DWORD(®->iobase_addr, 0x3070); | ||
1847 | dmp_reg = ®->iobase_window; | ||
1848 | for (cnt = 0; cnt < 16; cnt++) | ||
1849 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1850 | |||
1851 | /* Fibre Protocol Module registers. */ | ||
1852 | iter_reg = fw->fpm_hdw_reg; | ||
1853 | WRT_REG_DWORD(®->iobase_addr, 0x4000); | ||
1854 | dmp_reg = ®->iobase_window; | ||
1855 | for (cnt = 0; cnt < 16; cnt++) | ||
1856 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1857 | |||
1858 | WRT_REG_DWORD(®->iobase_addr, 0x4010); | ||
1859 | dmp_reg = ®->iobase_window; | ||
1860 | for (cnt = 0; cnt < 16; cnt++) | ||
1861 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1862 | |||
1863 | WRT_REG_DWORD(®->iobase_addr, 0x4020); | ||
1864 | dmp_reg = ®->iobase_window; | ||
1865 | for (cnt = 0; cnt < 16; cnt++) | ||
1866 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1867 | |||
1868 | WRT_REG_DWORD(®->iobase_addr, 0x4030); | ||
1869 | dmp_reg = ®->iobase_window; | ||
1870 | for (cnt = 0; cnt < 16; cnt++) | ||
1871 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1872 | |||
1873 | WRT_REG_DWORD(®->iobase_addr, 0x4040); | ||
1874 | dmp_reg = ®->iobase_window; | ||
1875 | for (cnt = 0; cnt < 16; cnt++) | ||
1876 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1877 | |||
1878 | WRT_REG_DWORD(®->iobase_addr, 0x4050); | ||
1879 | dmp_reg = ®->iobase_window; | ||
1880 | for (cnt = 0; cnt < 16; cnt++) | ||
1881 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1882 | |||
1883 | WRT_REG_DWORD(®->iobase_addr, 0x4060); | ||
1884 | dmp_reg = ®->iobase_window; | ||
1885 | for (cnt = 0; cnt < 16; cnt++) | ||
1886 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1887 | |||
1888 | WRT_REG_DWORD(®->iobase_addr, 0x4070); | ||
1889 | dmp_reg = ®->iobase_window; | ||
1890 | for (cnt = 0; cnt < 16; cnt++) | ||
1891 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1892 | |||
1893 | WRT_REG_DWORD(®->iobase_addr, 0x4080); | ||
1894 | dmp_reg = ®->iobase_window; | ||
1895 | for (cnt = 0; cnt < 16; cnt++) | ||
1896 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1897 | |||
1898 | WRT_REG_DWORD(®->iobase_addr, 0x4090); | ||
1899 | dmp_reg = ®->iobase_window; | ||
1900 | for (cnt = 0; cnt < 16; cnt++) | ||
1901 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1902 | |||
1903 | WRT_REG_DWORD(®->iobase_addr, 0x40A0); | ||
1904 | dmp_reg = ®->iobase_window; | ||
1905 | for (cnt = 0; cnt < 16; cnt++) | ||
1906 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1907 | |||
1908 | WRT_REG_DWORD(®->iobase_addr, 0x40B0); | ||
1909 | dmp_reg = ®->iobase_window; | ||
1910 | for (cnt = 0; cnt < 16; cnt++) | ||
1911 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1912 | |||
1913 | /* Frame Buffer registers. */ | ||
1914 | iter_reg = fw->fb_hdw_reg; | ||
1915 | WRT_REG_DWORD(®->iobase_addr, 0x6000); | ||
1916 | dmp_reg = ®->iobase_window; | ||
1917 | for (cnt = 0; cnt < 16; cnt++) | ||
1918 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1919 | |||
1920 | WRT_REG_DWORD(®->iobase_addr, 0x6010); | ||
1921 | dmp_reg = ®->iobase_window; | ||
1922 | for (cnt = 0; cnt < 16; cnt++) | ||
1923 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1924 | |||
1925 | WRT_REG_DWORD(®->iobase_addr, 0x6020); | ||
1926 | dmp_reg = ®->iobase_window; | ||
1927 | for (cnt = 0; cnt < 16; cnt++) | ||
1928 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1929 | |||
1930 | WRT_REG_DWORD(®->iobase_addr, 0x6030); | ||
1931 | dmp_reg = ®->iobase_window; | ||
1932 | for (cnt = 0; cnt < 16; cnt++) | ||
1933 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1934 | |||
1935 | WRT_REG_DWORD(®->iobase_addr, 0x6040); | ||
1936 | dmp_reg = ®->iobase_window; | ||
1937 | for (cnt = 0; cnt < 16; cnt++) | ||
1938 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1939 | |||
1940 | WRT_REG_DWORD(®->iobase_addr, 0x6100); | ||
1941 | dmp_reg = ®->iobase_window; | ||
1942 | for (cnt = 0; cnt < 16; cnt++) | ||
1943 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1944 | |||
1945 | WRT_REG_DWORD(®->iobase_addr, 0x6130); | ||
1946 | dmp_reg = ®->iobase_window; | ||
1947 | for (cnt = 0; cnt < 16; cnt++) | ||
1948 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1949 | |||
1950 | WRT_REG_DWORD(®->iobase_addr, 0x6150); | ||
1951 | dmp_reg = ®->iobase_window; | ||
1952 | for (cnt = 0; cnt < 16; cnt++) | ||
1953 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1954 | |||
1955 | WRT_REG_DWORD(®->iobase_addr, 0x6170); | ||
1956 | dmp_reg = ®->iobase_window; | ||
1957 | for (cnt = 0; cnt < 16; cnt++) | ||
1958 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1959 | |||
1960 | WRT_REG_DWORD(®->iobase_addr, 0x6190); | ||
1961 | dmp_reg = ®->iobase_window; | ||
1962 | for (cnt = 0; cnt < 16; cnt++) | ||
1963 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1964 | |||
1965 | WRT_REG_DWORD(®->iobase_addr, 0x61B0); | ||
1966 | dmp_reg = ®->iobase_window; | ||
1967 | for (cnt = 0; cnt < 16; cnt++) | ||
1968 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1969 | |||
1970 | WRT_REG_DWORD(®->iobase_addr, 0x6F00); | ||
1971 | dmp_reg = ®->iobase_window; | ||
1972 | for (cnt = 0; cnt < 16; cnt++) | ||
1973 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1974 | |||
1975 | /* Reset RISC. */ | ||
1976 | WRT_REG_DWORD(®->ctrl_status, | ||
1977 | CSRX_DMA_SHUTDOWN|MWB_4096_BYTES); | ||
1978 | for (cnt = 0; cnt < 30000; cnt++) { | ||
1979 | if ((RD_REG_DWORD(®->ctrl_status) & | ||
1980 | CSRX_DMA_ACTIVE) == 0) | ||
1981 | break; | ||
1982 | |||
1983 | udelay(10); | ||
1984 | } | ||
1985 | |||
1986 | WRT_REG_DWORD(®->ctrl_status, | ||
1987 | CSRX_ISP_SOFT_RESET|CSRX_DMA_SHUTDOWN|MWB_4096_BYTES); | ||
1988 | pci_read_config_word(ha->pdev, PCI_COMMAND, &wd); | ||
1989 | |||
1990 | udelay(100); | ||
1991 | /* Wait for firmware to complete NVRAM accesses. */ | ||
1992 | mb0 = (uint32_t) RD_REG_WORD(®->mailbox0); | ||
1993 | for (cnt = 10000 ; cnt && mb0; cnt--) { | ||
1306 | udelay(5); | 1994 | udelay(5); |
1995 | mb0 = (uint32_t) RD_REG_WORD(®->mailbox0); | ||
1996 | barrier(); | ||
1307 | } | 1997 | } |
1308 | 1998 | ||
1309 | if (test_and_clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags)) { | 1999 | /* Wait for soft-reset to complete. */ |
1310 | rval = mb[0] & MBS_MASK; | 2000 | for (cnt = 0; cnt < 30000; cnt++) { |
1311 | fw->ext_mem[cnt] = htonl((mb[3] << 16) | mb[2]); | 2001 | if ((RD_REG_DWORD(®->ctrl_status) & |
1312 | } else { | 2002 | CSRX_ISP_SOFT_RESET) == 0) |
1313 | rval = QLA_FUNCTION_FAILED; | 2003 | break; |
2004 | |||
2005 | udelay(10); | ||
1314 | } | 2006 | } |
2007 | WRT_REG_DWORD(®->hccr, HCCRX_CLR_RISC_RESET); | ||
2008 | RD_REG_DWORD(®->hccr); /* PCI Posting. */ | ||
1315 | } | 2009 | } |
1316 | 2010 | ||
2011 | for (cnt = 30000; RD_REG_WORD(®->mailbox0) != 0 && | ||
2012 | rval == QLA_SUCCESS; cnt--) { | ||
2013 | if (cnt) | ||
2014 | udelay(100); | ||
2015 | else | ||
2016 | rval = QLA_FUNCTION_TIMEOUT; | ||
2017 | } | ||
2018 | |||
2019 | if (rval == QLA_SUCCESS) | ||
2020 | rval = qla2xxx_dump_memory(ha, fw->code_ram, | ||
2021 | sizeof(fw->code_ram), fw->ext_mem, &nxt); | ||
2022 | |||
1317 | if (rval == QLA_SUCCESS) { | 2023 | if (rval == QLA_SUCCESS) { |
1318 | eft = qla2xxx_copy_queues(ha, &fw->ext_mem[cnt]); | 2024 | nxt = qla2xxx_copy_queues(ha, nxt); |
1319 | if (ha->eft) | 2025 | if (ha->eft) |
1320 | memcpy(eft, ha->eft, ntohl(ha->fw_dump->eft_size)); | 2026 | memcpy(nxt, ha->eft, ntohl(ha->fw_dump->eft_size)); |
1321 | } | 2027 | } |
1322 | 2028 | ||
1323 | if (rval != QLA_SUCCESS) { | 2029 | if (rval != QLA_SUCCESS) { |
@@ -1332,7 +2038,7 @@ qla24xx_fw_dump(scsi_qla_host_t *ha, int hardware_locked) | |||
1332 | ha->fw_dumped = 1; | 2038 | ha->fw_dumped = 1; |
1333 | } | 2039 | } |
1334 | 2040 | ||
1335 | qla24xx_fw_dump_failed: | 2041 | qla25xx_fw_dump_failed: |
1336 | if (!hardware_locked) | 2042 | if (!hardware_locked) |
1337 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | 2043 | spin_unlock_irqrestore(&ha->hardware_lock, flags); |
1338 | } | 2044 | } |
diff --git a/drivers/scsi/qla2xxx/qla_dbg.h b/drivers/scsi/qla2xxx/qla_dbg.h index 49dffeb7851..cca4b0d8253 100644 --- a/drivers/scsi/qla2xxx/qla_dbg.h +++ b/drivers/scsi/qla2xxx/qla_dbg.h | |||
@@ -213,6 +213,43 @@ struct qla24xx_fw_dump { | |||
213 | uint32_t ext_mem[1]; | 213 | uint32_t ext_mem[1]; |
214 | }; | 214 | }; |
215 | 215 | ||
216 | struct qla25xx_fw_dump { | ||
217 | uint32_t host_status; | ||
218 | uint32_t host_reg[32]; | ||
219 | uint32_t shadow_reg[11]; | ||
220 | uint32_t risc_io_reg; | ||
221 | uint16_t mailbox_reg[32]; | ||
222 | uint32_t xseq_gp_reg[128]; | ||
223 | uint32_t xseq_0_reg[48]; | ||
224 | uint32_t xseq_1_reg[16]; | ||
225 | uint32_t rseq_gp_reg[128]; | ||
226 | uint32_t rseq_0_reg[32]; | ||
227 | uint32_t rseq_1_reg[16]; | ||
228 | uint32_t rseq_2_reg[16]; | ||
229 | uint32_t aseq_gp_reg[128]; | ||
230 | uint32_t aseq_0_reg[32]; | ||
231 | uint32_t aseq_1_reg[16]; | ||
232 | uint32_t aseq_2_reg[16]; | ||
233 | uint32_t cmd_dma_reg[16]; | ||
234 | uint32_t req0_dma_reg[15]; | ||
235 | uint32_t resp0_dma_reg[15]; | ||
236 | uint32_t req1_dma_reg[15]; | ||
237 | uint32_t xmt0_dma_reg[32]; | ||
238 | uint32_t xmt1_dma_reg[32]; | ||
239 | uint32_t xmt2_dma_reg[32]; | ||
240 | uint32_t xmt3_dma_reg[32]; | ||
241 | uint32_t xmt4_dma_reg[32]; | ||
242 | uint32_t xmt_data_dma_reg[16]; | ||
243 | uint32_t rcvt0_data_dma_reg[32]; | ||
244 | uint32_t rcvt1_data_dma_reg[32]; | ||
245 | uint32_t risc_gp_reg[128]; | ||
246 | uint32_t lmc_reg[128]; | ||
247 | uint32_t fpm_hdw_reg[192]; | ||
248 | uint32_t fb_hdw_reg[192]; | ||
249 | uint32_t code_ram[0x2000]; | ||
250 | uint32_t ext_mem[1]; | ||
251 | }; | ||
252 | |||
216 | #define EFT_NUM_BUFFERS 4 | 253 | #define EFT_NUM_BUFFERS 4 |
217 | #define EFT_BYTES_PER_BUFFER 0x4000 | 254 | #define EFT_BYTES_PER_BUFFER 0x4000 |
218 | #define EFT_SIZE ((EFT_BYTES_PER_BUFFER) * (EFT_NUM_BUFFERS)) | 255 | #define EFT_SIZE ((EFT_BYTES_PER_BUFFER) * (EFT_NUM_BUFFERS)) |
@@ -246,5 +283,6 @@ struct qla2xxx_fw_dump { | |||
246 | struct qla2100_fw_dump isp21; | 283 | struct qla2100_fw_dump isp21; |
247 | struct qla2300_fw_dump isp23; | 284 | struct qla2300_fw_dump isp23; |
248 | struct qla24xx_fw_dump isp24; | 285 | struct qla24xx_fw_dump isp24; |
286 | struct qla25xx_fw_dump isp25; | ||
249 | } isp; | 287 | } isp; |
250 | }; | 288 | }; |
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h index 27a23966b1f..0c9f36c8a24 100644 --- a/drivers/scsi/qla2xxx/qla_def.h +++ b/drivers/scsi/qla2xxx/qla_def.h | |||
@@ -2209,6 +2209,7 @@ typedef struct scsi_qla_host { | |||
2209 | #define SWITCH_FOUND BIT_3 | 2209 | #define SWITCH_FOUND BIT_3 |
2210 | #define DFLG_NO_CABLE BIT_4 | 2210 | #define DFLG_NO_CABLE BIT_4 |
2211 | 2211 | ||
2212 | #define PCI_DEVICE_ID_QLOGIC_ISP2532 0x2532 | ||
2212 | uint32_t device_type; | 2213 | uint32_t device_type; |
2213 | #define DT_ISP2100 BIT_0 | 2214 | #define DT_ISP2100 BIT_0 |
2214 | #define DT_ISP2200 BIT_1 | 2215 | #define DT_ISP2200 BIT_1 |
@@ -2221,7 +2222,8 @@ typedef struct scsi_qla_host { | |||
2221 | #define DT_ISP2432 BIT_8 | 2222 | #define DT_ISP2432 BIT_8 |
2222 | #define DT_ISP5422 BIT_9 | 2223 | #define DT_ISP5422 BIT_9 |
2223 | #define DT_ISP5432 BIT_10 | 2224 | #define DT_ISP5432 BIT_10 |
2224 | #define DT_ISP_LAST (DT_ISP5432 << 1) | 2225 | #define DT_ISP2532 BIT_11 |
2226 | #define DT_ISP_LAST (DT_ISP2532 << 1) | ||
2225 | 2227 | ||
2226 | #define DT_IIDMA BIT_26 | 2228 | #define DT_IIDMA BIT_26 |
2227 | #define DT_FWI2 BIT_27 | 2229 | #define DT_FWI2 BIT_27 |
@@ -2242,11 +2244,13 @@ typedef struct scsi_qla_host { | |||
2242 | #define IS_QLA2432(ha) (DT_MASK(ha) & DT_ISP2432) | 2244 | #define IS_QLA2432(ha) (DT_MASK(ha) & DT_ISP2432) |
2243 | #define IS_QLA5422(ha) (DT_MASK(ha) & DT_ISP5422) | 2245 | #define IS_QLA5422(ha) (DT_MASK(ha) & DT_ISP5422) |
2244 | #define IS_QLA5432(ha) (DT_MASK(ha) & DT_ISP5432) | 2246 | #define IS_QLA5432(ha) (DT_MASK(ha) & DT_ISP5432) |
2247 | #define IS_QLA2532(ha) (DT_MASK(ha) & DT_ISP2532) | ||
2245 | 2248 | ||
2246 | #define IS_QLA23XX(ha) (IS_QLA2300(ha) || IS_QLA2312(ha) || IS_QLA2322(ha) || \ | 2249 | #define IS_QLA23XX(ha) (IS_QLA2300(ha) || IS_QLA2312(ha) || IS_QLA2322(ha) || \ |
2247 | IS_QLA6312(ha) || IS_QLA6322(ha)) | 2250 | IS_QLA6312(ha) || IS_QLA6322(ha)) |
2248 | #define IS_QLA24XX(ha) (IS_QLA2422(ha) || IS_QLA2432(ha)) | 2251 | #define IS_QLA24XX(ha) (IS_QLA2422(ha) || IS_QLA2432(ha)) |
2249 | #define IS_QLA54XX(ha) (IS_QLA5422(ha) || IS_QLA5432(ha)) | 2252 | #define IS_QLA54XX(ha) (IS_QLA5422(ha) || IS_QLA5432(ha)) |
2253 | #define IS_QLA25XX(ha) (IS_QLA2532(ha)) | ||
2250 | 2254 | ||
2251 | #define IS_IIDMA_CAPABLE(ha) ((ha)->device_type & DT_IIDMA) | 2255 | #define IS_IIDMA_CAPABLE(ha) ((ha)->device_type & DT_IIDMA) |
2252 | #define IS_FWI2_CAPABLE(ha) ((ha)->device_type & DT_FWI2) | 2256 | #define IS_FWI2_CAPABLE(ha) ((ha)->device_type & DT_FWI2) |
@@ -2310,6 +2314,7 @@ typedef struct scsi_qla_host { | |||
2310 | #define PORT_SPEED_1GB 0x00 | 2314 | #define PORT_SPEED_1GB 0x00 |
2311 | #define PORT_SPEED_2GB 0x01 | 2315 | #define PORT_SPEED_2GB 0x01 |
2312 | #define PORT_SPEED_4GB 0x03 | 2316 | #define PORT_SPEED_4GB 0x03 |
2317 | #define PORT_SPEED_8GB 0x04 | ||
2313 | uint16_t link_data_rate; /* F/W operating speed */ | 2318 | uint16_t link_data_rate; /* F/W operating speed */ |
2314 | 2319 | ||
2315 | uint8_t current_topology; | 2320 | uint8_t current_topology; |
@@ -2576,6 +2581,7 @@ typedef struct scsi_qla_host { | |||
2576 | #define OPTROM_SIZE_2300 0x20000 | 2581 | #define OPTROM_SIZE_2300 0x20000 |
2577 | #define OPTROM_SIZE_2322 0x100000 | 2582 | #define OPTROM_SIZE_2322 0x100000 |
2578 | #define OPTROM_SIZE_24XX 0x100000 | 2583 | #define OPTROM_SIZE_24XX 0x100000 |
2584 | #define OPTROM_SIZE_25XX 0x200000 | ||
2579 | 2585 | ||
2580 | #include "qla_gbl.h" | 2586 | #include "qla_gbl.h" |
2581 | #include "qla_dbg.h" | 2587 | #include "qla_dbg.h" |
diff --git a/drivers/scsi/qla2xxx/qla_fw.h b/drivers/scsi/qla2xxx/qla_fw.h index 63a11fef5d1..99fe49618d6 100644 --- a/drivers/scsi/qla2xxx/qla_fw.h +++ b/drivers/scsi/qla2xxx/qla_fw.h | |||
@@ -8,14 +8,17 @@ | |||
8 | #define __QLA_FW_H | 8 | #define __QLA_FW_H |
9 | 9 | ||
10 | #define MBS_CHECKSUM_ERROR 0x4010 | 10 | #define MBS_CHECKSUM_ERROR 0x4010 |
11 | #define MBS_INVALID_PRODUCT_KEY 0x4020 | ||
11 | 12 | ||
12 | /* | 13 | /* |
13 | * Firmware Options. | 14 | * Firmware Options. |
14 | */ | 15 | */ |
15 | #define FO1_ENABLE_PUREX BIT_10 | 16 | #define FO1_ENABLE_PUREX BIT_10 |
16 | #define FO1_DISABLE_LED_CTRL BIT_6 | 17 | #define FO1_DISABLE_LED_CTRL BIT_6 |
18 | #define FO1_ENABLE_8016 BIT_0 | ||
17 | #define FO2_ENABLE_SEL_CLASS2 BIT_5 | 19 | #define FO2_ENABLE_SEL_CLASS2 BIT_5 |
18 | #define FO3_NO_ABTS_ON_LINKDOWN BIT_14 | 20 | #define FO3_NO_ABTS_ON_LINKDOWN BIT_14 |
21 | #define FO3_HOLD_STS_IOCB BIT_12 | ||
19 | 22 | ||
20 | /* | 23 | /* |
21 | * Port Database structure definition for ISP 24xx. | 24 | * Port Database structure definition for ISP 24xx. |
@@ -341,7 +344,9 @@ struct init_cb_24xx { | |||
341 | * BIT 10 = Reserved | 344 | * BIT 10 = Reserved |
342 | * BIT 11 = Enable FC-SP Security | 345 | * BIT 11 = Enable FC-SP Security |
343 | * BIT 12 = FC Tape Enable | 346 | * BIT 12 = FC Tape Enable |
344 | * BIT 13-31 = Reserved | 347 | * BIT 13 = Reserved |
348 | * BIT 14 = Enable Target PRLI Control | ||
349 | * BIT 15-31 = Reserved | ||
345 | */ | 350 | */ |
346 | uint32_t firmware_options_2; | 351 | uint32_t firmware_options_2; |
347 | 352 | ||
@@ -363,7 +368,8 @@ struct init_cb_24xx { | |||
363 | * BIT 13 = Data Rate bit 0 | 368 | * BIT 13 = Data Rate bit 0 |
364 | * BIT 14 = Data Rate bit 1 | 369 | * BIT 14 = Data Rate bit 1 |
365 | * BIT 15 = Data Rate bit 2 | 370 | * BIT 15 = Data Rate bit 2 |
366 | * BIT 16-31 = Reserved | 371 | * BIT 16 = Enable 75 ohm Termination Select |
372 | * BIT 17-31 = Reserved | ||
367 | */ | 373 | */ |
368 | uint32_t firmware_options_3; | 374 | uint32_t firmware_options_3; |
369 | 375 | ||
@@ -435,6 +441,7 @@ struct cmd_type_7 { | |||
435 | #define TMF_LUN_RESET BIT_12 | 441 | #define TMF_LUN_RESET BIT_12 |
436 | #define TMF_CLEAR_TASK_SET BIT_10 | 442 | #define TMF_CLEAR_TASK_SET BIT_10 |
437 | #define TMF_ABORT_TASK_SET BIT_9 | 443 | #define TMF_ABORT_TASK_SET BIT_9 |
444 | #define TMF_DSD_LIST_ENABLE BIT_2 | ||
438 | #define TMF_READ_DATA BIT_1 | 445 | #define TMF_READ_DATA BIT_1 |
439 | #define TMF_WRITE_DATA BIT_0 | 446 | #define TMF_WRITE_DATA BIT_0 |
440 | 447 | ||
@@ -589,7 +596,7 @@ struct els_entry_24xx { | |||
589 | #define EST_SOFI3 (1 << 4) | 596 | #define EST_SOFI3 (1 << 4) |
590 | #define EST_SOFI2 (3 << 4) | 597 | #define EST_SOFI2 (3 << 4) |
591 | 598 | ||
592 | uint32_t rx_xchg_address[2]; /* Receive exchange address. */ | 599 | uint32_t rx_xchg_address; /* Receive exchange address. */ |
593 | uint16_t rx_dsd_count; | 600 | uint16_t rx_dsd_count; |
594 | 601 | ||
595 | uint8_t opcode; | 602 | uint8_t opcode; |
@@ -650,6 +657,7 @@ struct logio_entry_24xx { | |||
650 | 657 | ||
651 | uint16_t control_flags; /* Control flags. */ | 658 | uint16_t control_flags; /* Control flags. */ |
652 | /* Modifiers. */ | 659 | /* Modifiers. */ |
660 | #define LCF_INCLUDE_SNS BIT_10 /* Include SNS (FFFFFC) during LOGO. */ | ||
653 | #define LCF_FCP2_OVERRIDE BIT_9 /* Set/Reset word 3 of PRLI. */ | 661 | #define LCF_FCP2_OVERRIDE BIT_9 /* Set/Reset word 3 of PRLI. */ |
654 | #define LCF_CLASS_2 BIT_8 /* Enable class 2 during PLOGI. */ | 662 | #define LCF_CLASS_2 BIT_8 /* Enable class 2 during PLOGI. */ |
655 | #define LCF_FREE_NPORT BIT_7 /* Release NPORT handle after LOGO. */ | 663 | #define LCF_FREE_NPORT BIT_7 /* Release NPORT handle after LOGO. */ |
@@ -779,6 +787,15 @@ struct device_reg_24xx { | |||
779 | #define FA_RISC_CODE_ADDR 0x20000 | 787 | #define FA_RISC_CODE_ADDR 0x20000 |
780 | #define FA_RISC_CODE_SEGMENTS 2 | 788 | #define FA_RISC_CODE_SEGMENTS 2 |
781 | 789 | ||
790 | #define FA_FW_AREA_ADDR 0x40000 | ||
791 | #define FA_VPD_NVRAM_ADDR 0x48000 | ||
792 | #define FA_FEATURE_ADDR 0x4C000 | ||
793 | #define FA_FLASH_DESCR_ADDR 0x50000 | ||
794 | #define FA_HW_EVENT_ADDR 0x54000 | ||
795 | #define FA_BOOT_LOG_ADDR 0x58000 | ||
796 | #define FA_FW_DUMP0_ADDR 0x60000 | ||
797 | #define FA_FW_DUMP1_ADDR 0x70000 | ||
798 | |||
782 | uint32_t flash_data; /* Flash/NVRAM BIOS data. */ | 799 | uint32_t flash_data; /* Flash/NVRAM BIOS data. */ |
783 | 800 | ||
784 | uint32_t ctrl_status; /* Control/Status. */ | 801 | uint32_t ctrl_status; /* Control/Status. */ |
@@ -859,10 +876,13 @@ struct device_reg_24xx { | |||
859 | #define HCCRX_CLR_RISC_INT 0xA0000000 | 876 | #define HCCRX_CLR_RISC_INT 0xA0000000 |
860 | 877 | ||
861 | uint32_t gpiod; /* GPIO Data register. */ | 878 | uint32_t gpiod; /* GPIO Data register. */ |
879 | |||
862 | /* LED update mask. */ | 880 | /* LED update mask. */ |
863 | #define GPDX_LED_UPDATE_MASK (BIT_20|BIT_19|BIT_18) | 881 | #define GPDX_LED_UPDATE_MASK (BIT_20|BIT_19|BIT_18) |
864 | /* Data update mask. */ | 882 | /* Data update mask. */ |
865 | #define GPDX_DATA_UPDATE_MASK (BIT_17|BIT_16) | 883 | #define GPDX_DATA_UPDATE_MASK (BIT_17|BIT_16) |
884 | /* Data update mask. */ | ||
885 | #define GPDX_DATA_UPDATE_2_MASK (BIT_28|BIT_27|BIT_26|BIT_17|BIT_16) | ||
866 | /* LED control mask. */ | 886 | /* LED control mask. */ |
867 | #define GPDX_LED_COLOR_MASK (BIT_4|BIT_3|BIT_2) | 887 | #define GPDX_LED_COLOR_MASK (BIT_4|BIT_3|BIT_2) |
868 | /* LED bit values. Color names as | 888 | /* LED bit values. Color names as |
@@ -877,6 +897,8 @@ struct device_reg_24xx { | |||
877 | uint32_t gpioe; /* GPIO Enable register. */ | 897 | uint32_t gpioe; /* GPIO Enable register. */ |
878 | /* Enable update mask. */ | 898 | /* Enable update mask. */ |
879 | #define GPEX_ENABLE_UPDATE_MASK (BIT_17|BIT_16) | 899 | #define GPEX_ENABLE_UPDATE_MASK (BIT_17|BIT_16) |
900 | /* Enable update mask. */ | ||
901 | #define GPEX_ENABLE_UPDATE_2_MASK (BIT_28|BIT_27|BIT_26|BIT_17|BIT_16) | ||
880 | /* Enable. */ | 902 | /* Enable. */ |
881 | #define GPEX_ENABLE (BIT_1|BIT_0) | 903 | #define GPEX_ENABLE (BIT_1|BIT_0) |
882 | 904 | ||
@@ -916,6 +938,14 @@ struct device_reg_24xx { | |||
916 | uint16_t mailbox29; | 938 | uint16_t mailbox29; |
917 | uint16_t mailbox30; | 939 | uint16_t mailbox30; |
918 | uint16_t mailbox31; | 940 | uint16_t mailbox31; |
941 | |||
942 | uint32_t iobase_window; | ||
943 | uint32_t unused_4[8]; /* Gap. */ | ||
944 | uint32_t iobase_q; | ||
945 | uint32_t unused_5[2]; /* Gap. */ | ||
946 | uint32_t iobase_select; | ||
947 | uint32_t unused_6[2]; /* Gap. */ | ||
948 | uint32_t iobase_sdata; | ||
919 | }; | 949 | }; |
920 | 950 | ||
921 | /* MID Support ***************************************************************/ | 951 | /* MID Support ***************************************************************/ |
diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h index b44eff2803c..aa1e4115228 100644 --- a/drivers/scsi/qla2xxx/qla_gbl.h +++ b/drivers/scsi/qla2xxx/qla_gbl.h | |||
@@ -17,6 +17,7 @@ extern int qla2x00_initialize_adapter(scsi_qla_host_t *); | |||
17 | extern int qla2100_pci_config(struct scsi_qla_host *); | 17 | extern int qla2100_pci_config(struct scsi_qla_host *); |
18 | extern int qla2300_pci_config(struct scsi_qla_host *); | 18 | extern int qla2300_pci_config(struct scsi_qla_host *); |
19 | extern int qla24xx_pci_config(scsi_qla_host_t *); | 19 | extern int qla24xx_pci_config(scsi_qla_host_t *); |
20 | extern int qla25xx_pci_config(scsi_qla_host_t *); | ||
20 | extern void qla2x00_reset_chip(struct scsi_qla_host *); | 21 | extern void qla2x00_reset_chip(struct scsi_qla_host *); |
21 | extern void qla24xx_reset_chip(struct scsi_qla_host *); | 22 | extern void qla24xx_reset_chip(struct scsi_qla_host *); |
22 | extern int qla2x00_chip_diag(struct scsi_qla_host *); | 23 | extern int qla2x00_chip_diag(struct scsi_qla_host *); |
@@ -281,6 +282,10 @@ extern int qla2x00_write_nvram_data(scsi_qla_host_t *, uint8_t *, uint32_t, | |||
281 | uint32_t); | 282 | uint32_t); |
282 | extern int qla24xx_write_nvram_data(scsi_qla_host_t *, uint8_t *, uint32_t, | 283 | extern int qla24xx_write_nvram_data(scsi_qla_host_t *, uint8_t *, uint32_t, |
283 | uint32_t); | 284 | uint32_t); |
285 | extern uint8_t *qla25xx_read_nvram_data(scsi_qla_host_t *, uint8_t *, uint32_t, | ||
286 | uint32_t); | ||
287 | extern int qla25xx_write_nvram_data(scsi_qla_host_t *, uint8_t *, uint32_t, | ||
288 | uint32_t); | ||
284 | 289 | ||
285 | extern int qla2x00_beacon_on(struct scsi_qla_host *); | 290 | extern int qla2x00_beacon_on(struct scsi_qla_host *); |
286 | extern int qla2x00_beacon_off(struct scsi_qla_host *); | 291 | extern int qla2x00_beacon_off(struct scsi_qla_host *); |
@@ -307,6 +312,7 @@ extern int qla24xx_get_flash_version(scsi_qla_host_t *, void *); | |||
307 | extern void qla2100_fw_dump(scsi_qla_host_t *, int); | 312 | extern void qla2100_fw_dump(scsi_qla_host_t *, int); |
308 | extern void qla2300_fw_dump(scsi_qla_host_t *, int); | 313 | extern void qla2300_fw_dump(scsi_qla_host_t *, int); |
309 | extern void qla24xx_fw_dump(scsi_qla_host_t *, int); | 314 | extern void qla24xx_fw_dump(scsi_qla_host_t *, int); |
315 | extern void qla25xx_fw_dump(scsi_qla_host_t *, int); | ||
310 | extern void qla2x00_dump_regs(scsi_qla_host_t *); | 316 | extern void qla2x00_dump_regs(scsi_qla_host_t *); |
311 | extern void qla2x00_dump_buffer(uint8_t *, uint32_t); | 317 | extern void qla2x00_dump_buffer(uint8_t *, uint32_t); |
312 | extern void qla2x00_print_scsi_cmd(struct scsi_cmnd *); | 318 | extern void qla2x00_print_scsi_cmd(struct scsi_cmnd *); |
diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c index e393c848ea6..b06cbb8580d 100644 --- a/drivers/scsi/qla2xxx/qla_gs.c +++ b/drivers/scsi/qla2xxx/qla_gs.c | |||
@@ -1532,7 +1532,11 @@ qla2x00_fdmi_rpa(scsi_qla_host_t *ha) | |||
1532 | eiter = (struct ct_fdmi_port_attr *) (entries + size); | 1532 | eiter = (struct ct_fdmi_port_attr *) (entries + size); |
1533 | eiter->type = __constant_cpu_to_be16(FDMI_PORT_SUPPORT_SPEED); | 1533 | eiter->type = __constant_cpu_to_be16(FDMI_PORT_SUPPORT_SPEED); |
1534 | eiter->len = __constant_cpu_to_be16(4 + 4); | 1534 | eiter->len = __constant_cpu_to_be16(4 + 4); |
1535 | if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) | 1535 | if (IS_QLA25XX(ha)) |
1536 | eiter->a.sup_speed = __constant_cpu_to_be32( | ||
1537 | FDMI_PORT_SPEED_1GB|FDMI_PORT_SPEED_2GB| | ||
1538 | FDMI_PORT_SPEED_4GB|FDMI_PORT_SPEED_8GB); | ||
1539 | else if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) | ||
1536 | eiter->a.sup_speed = __constant_cpu_to_be32( | 1540 | eiter->a.sup_speed = __constant_cpu_to_be32( |
1537 | FDMI_PORT_SPEED_1GB|FDMI_PORT_SPEED_2GB| | 1541 | FDMI_PORT_SPEED_1GB|FDMI_PORT_SPEED_2GB| |
1538 | FDMI_PORT_SPEED_4GB); | 1542 | FDMI_PORT_SPEED_4GB); |
@@ -1564,6 +1568,10 @@ qla2x00_fdmi_rpa(scsi_qla_host_t *ha) | |||
1564 | eiter->a.cur_speed = | 1568 | eiter->a.cur_speed = |
1565 | __constant_cpu_to_be32(FDMI_PORT_SPEED_4GB); | 1569 | __constant_cpu_to_be32(FDMI_PORT_SPEED_4GB); |
1566 | break; | 1570 | break; |
1571 | case PORT_SPEED_8GB: | ||
1572 | eiter->a.cur_speed = | ||
1573 | __constant_cpu_to_be32(FDMI_PORT_SPEED_8GB); | ||
1574 | break; | ||
1567 | default: | 1575 | default: |
1568 | eiter->a.cur_speed = | 1576 | eiter->a.cur_speed = |
1569 | __constant_cpu_to_be32(FDMI_PORT_SPEED_UNKNOWN); | 1577 | __constant_cpu_to_be32(FDMI_PORT_SPEED_UNKNOWN); |
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index 3c5fcf84cb0..5ec798c2bf1 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c | |||
@@ -287,6 +287,40 @@ qla24xx_pci_config(scsi_qla_host_t *ha) | |||
287 | } | 287 | } |
288 | 288 | ||
289 | /** | 289 | /** |
290 | * qla25xx_pci_config() - Setup ISP25xx PCI configuration registers. | ||
291 | * @ha: HA context | ||
292 | * | ||
293 | * Returns 0 on success. | ||
294 | */ | ||
295 | int | ||
296 | qla25xx_pci_config(scsi_qla_host_t *ha) | ||
297 | { | ||
298 | uint16_t w; | ||
299 | uint32_t d; | ||
300 | |||
301 | pci_set_master(ha->pdev); | ||
302 | pci_try_set_mwi(ha->pdev); | ||
303 | |||
304 | pci_read_config_word(ha->pdev, PCI_COMMAND, &w); | ||
305 | w |= (PCI_COMMAND_PARITY | PCI_COMMAND_SERR); | ||
306 | w &= ~PCI_COMMAND_INTX_DISABLE; | ||
307 | pci_write_config_word(ha->pdev, PCI_COMMAND, w); | ||
308 | |||
309 | /* PCIe -- adjust Maximum Read Request Size (2048). */ | ||
310 | if (pci_find_capability(ha->pdev, PCI_CAP_ID_EXP)) | ||
311 | pcie_set_readrq(ha->pdev, 2048); | ||
312 | |||
313 | /* Reset expansion ROM address decode enable */ | ||
314 | pci_read_config_dword(ha->pdev, PCI_ROM_ADDRESS, &d); | ||
315 | d &= ~PCI_ROM_ADDRESS_ENABLE; | ||
316 | pci_write_config_dword(ha->pdev, PCI_ROM_ADDRESS, d); | ||
317 | |||
318 | ha->chip_revision = ha->pdev->revision; | ||
319 | |||
320 | return QLA_SUCCESS; | ||
321 | } | ||
322 | |||
323 | /** | ||
290 | * qla2x00_isp_firmware() - Choose firmware image. | 324 | * qla2x00_isp_firmware() - Choose firmware image. |
291 | * @ha: HA context | 325 | * @ha: HA context |
292 | * | 326 | * |
@@ -717,7 +751,9 @@ qla2x00_alloc_fw_dump(scsi_qla_host_t *ha) | |||
717 | mem_size = (ha->fw_memory_size - 0x11000 + 1) * | 751 | mem_size = (ha->fw_memory_size - 0x11000 + 1) * |
718 | sizeof(uint16_t); | 752 | sizeof(uint16_t); |
719 | } else if (IS_FWI2_CAPABLE(ha)) { | 753 | } else if (IS_FWI2_CAPABLE(ha)) { |
720 | fixed_size = offsetof(struct qla24xx_fw_dump, ext_mem); | 754 | fixed_size = IS_QLA25XX(ha) ? |
755 | offsetof(struct qla25xx_fw_dump, ext_mem): | ||
756 | offsetof(struct qla24xx_fw_dump, ext_mem); | ||
721 | mem_size = (ha->fw_memory_size - 0x100000 + 1) * | 757 | mem_size = (ha->fw_memory_size - 0x100000 + 1) * |
722 | sizeof(uint32_t); | 758 | sizeof(uint32_t); |
723 | 759 | ||
diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c index 259710bc98d..b8f226ae263 100644 --- a/drivers/scsi/qla2xxx/qla_isr.c +++ b/drivers/scsi/qla2xxx/qla_isr.c | |||
@@ -247,7 +247,7 @@ void | |||
247 | qla2x00_async_event(scsi_qla_host_t *ha, uint16_t *mb) | 247 | qla2x00_async_event(scsi_qla_host_t *ha, uint16_t *mb) |
248 | { | 248 | { |
249 | #define LS_UNKNOWN 2 | 249 | #define LS_UNKNOWN 2 |
250 | static char *link_speeds[5] = { "1", "2", "?", "4", "10" }; | 250 | static char *link_speeds[5] = { "1", "2", "?", "4", "8" }; |
251 | char *link_speed; | 251 | char *link_speed; |
252 | uint16_t handle_cnt; | 252 | uint16_t handle_cnt; |
253 | uint16_t cnt; | 253 | uint16_t cnt; |
@@ -1758,11 +1758,11 @@ qla2x00_request_irqs(scsi_qla_host_t *ha) | |||
1758 | int ret; | 1758 | int ret; |
1759 | 1759 | ||
1760 | /* If possible, enable MSI-X. */ | 1760 | /* If possible, enable MSI-X. */ |
1761 | if (!IS_QLA2432(ha)) | 1761 | if (!IS_QLA2432(ha) && !IS_QLA2532(ha)) |
1762 | goto skip_msix; | 1762 | goto skip_msix; |
1763 | 1763 | ||
1764 | if (ha->chip_revision < QLA_MSIX_CHIP_REV_24XX || | 1764 | if (IS_QLA2432(ha) && (ha->chip_revision < QLA_MSIX_CHIP_REV_24XX || |
1765 | !QLA_MSIX_FW_MODE_1(ha->fw_attributes)) { | 1765 | !QLA_MSIX_FW_MODE_1(ha->fw_attributes))) { |
1766 | DEBUG2(qla_printk(KERN_WARNING, ha, | 1766 | DEBUG2(qla_printk(KERN_WARNING, ha, |
1767 | "MSI-X: Unsupported ISP2432 (0x%X, 0x%X).\n", | 1767 | "MSI-X: Unsupported ISP2432 (0x%X, 0x%X).\n", |
1768 | ha->chip_revision, ha->fw_attributes)); | 1768 | ha->chip_revision, ha->fw_attributes)); |
@@ -1781,7 +1781,7 @@ qla2x00_request_irqs(scsi_qla_host_t *ha) | |||
1781 | "MSI-X: Falling back-to INTa mode -- %d.\n", ret); | 1781 | "MSI-X: Falling back-to INTa mode -- %d.\n", ret); |
1782 | skip_msix: | 1782 | skip_msix: |
1783 | 1783 | ||
1784 | if (!IS_QLA24XX(ha)) | 1784 | if (!IS_QLA24XX(ha) && !IS_QLA2532(ha)) |
1785 | goto skip_msi; | 1785 | goto skip_msi; |
1786 | 1786 | ||
1787 | ret = pci_enable_msi(ha->pdev); | 1787 | ret = pci_enable_msi(ha->pdev); |
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index e870e7cf62f..8bdc5a2c8ee 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c | |||
@@ -265,6 +265,8 @@ qla24xx_pci_info_str(struct scsi_qla_host *ha, char *str) | |||
265 | strcpy(str, "PCIe ("); | 265 | strcpy(str, "PCIe ("); |
266 | if (lspeed == 1) | 266 | if (lspeed == 1) |
267 | strcat(str, "2.5Gb/s "); | 267 | strcat(str, "2.5Gb/s "); |
268 | else if (lspeed == 2) | ||
269 | strcat(str, "5.0Gb/s "); | ||
268 | else | 270 | else |
269 | strcat(str, "<unknown> "); | 271 | strcat(str, "<unknown> "); |
270 | snprintf(lwstr, sizeof(lwstr), "x%d)", lwidth); | 272 | snprintf(lwstr, sizeof(lwstr), "x%d)", lwidth); |
@@ -343,6 +345,12 @@ qla24xx_fw_version_str(struct scsi_qla_host *ha, char *str) | |||
343 | strcat(str, "[IP] "); | 345 | strcat(str, "[IP] "); |
344 | if (ha->fw_attributes & BIT_2) | 346 | if (ha->fw_attributes & BIT_2) |
345 | strcat(str, "[Multi-ID] "); | 347 | strcat(str, "[Multi-ID] "); |
348 | if (ha->fw_attributes & BIT_3) | ||
349 | strcat(str, "[SB-2] "); | ||
350 | if (ha->fw_attributes & BIT_4) | ||
351 | strcat(str, "[T10 CRC] "); | ||
352 | if (ha->fw_attributes & BIT_5) | ||
353 | strcat(str, "[VI] "); | ||
346 | if (ha->fw_attributes & BIT_13) | 354 | if (ha->fw_attributes & BIT_13) |
347 | strcat(str, "[Experimental]"); | 355 | strcat(str, "[Experimental]"); |
348 | return str; | 356 | return str; |
@@ -1348,6 +1356,39 @@ static struct isp_operations qla24xx_isp_ops = { | |||
1348 | .get_flash_version = qla24xx_get_flash_version, | 1356 | .get_flash_version = qla24xx_get_flash_version, |
1349 | }; | 1357 | }; |
1350 | 1358 | ||
1359 | static struct isp_operations qla25xx_isp_ops = { | ||
1360 | .pci_config = qla25xx_pci_config, | ||
1361 | .reset_chip = qla24xx_reset_chip, | ||
1362 | .chip_diag = qla24xx_chip_diag, | ||
1363 | .config_rings = qla24xx_config_rings, | ||
1364 | .reset_adapter = qla24xx_reset_adapter, | ||
1365 | .nvram_config = qla24xx_nvram_config, | ||
1366 | .update_fw_options = qla24xx_update_fw_options, | ||
1367 | .load_risc = qla24xx_load_risc, | ||
1368 | .pci_info_str = qla24xx_pci_info_str, | ||
1369 | .fw_version_str = qla24xx_fw_version_str, | ||
1370 | .intr_handler = qla24xx_intr_handler, | ||
1371 | .enable_intrs = qla24xx_enable_intrs, | ||
1372 | .disable_intrs = qla24xx_disable_intrs, | ||
1373 | .abort_command = qla24xx_abort_command, | ||
1374 | .abort_target = qla24xx_abort_target, | ||
1375 | .fabric_login = qla24xx_login_fabric, | ||
1376 | .fabric_logout = qla24xx_fabric_logout, | ||
1377 | .calc_req_entries = NULL, | ||
1378 | .build_iocbs = NULL, | ||
1379 | .prep_ms_iocb = qla24xx_prep_ms_iocb, | ||
1380 | .prep_ms_fdmi_iocb = qla24xx_prep_ms_fdmi_iocb, | ||
1381 | .read_nvram = qla25xx_read_nvram_data, | ||
1382 | .write_nvram = qla25xx_write_nvram_data, | ||
1383 | .fw_dump = qla25xx_fw_dump, | ||
1384 | .beacon_on = qla24xx_beacon_on, | ||
1385 | .beacon_off = qla24xx_beacon_off, | ||
1386 | .beacon_blink = qla24xx_beacon_blink, | ||
1387 | .read_optrom = qla24xx_read_optrom_data, | ||
1388 | .write_optrom = qla24xx_write_optrom_data, | ||
1389 | .get_flash_version = qla24xx_get_flash_version, | ||
1390 | }; | ||
1391 | |||
1351 | static inline void | 1392 | static inline void |
1352 | qla2x00_set_isp_flags(scsi_qla_host_t *ha) | 1393 | qla2x00_set_isp_flags(scsi_qla_host_t *ha) |
1353 | { | 1394 | { |
@@ -1413,6 +1454,13 @@ qla2x00_set_isp_flags(scsi_qla_host_t *ha) | |||
1413 | ha->device_type |= DT_FWI2; | 1454 | ha->device_type |= DT_FWI2; |
1414 | ha->fw_srisc_address = RISC_START_ADDRESS_2400; | 1455 | ha->fw_srisc_address = RISC_START_ADDRESS_2400; |
1415 | break; | 1456 | break; |
1457 | case PCI_DEVICE_ID_QLOGIC_ISP2532: | ||
1458 | ha->device_type |= DT_ISP2532; | ||
1459 | ha->device_type |= DT_ZIO_SUPPORTED; | ||
1460 | ha->device_type |= DT_FWI2; | ||
1461 | ha->device_type |= DT_IIDMA; | ||
1462 | ha->fw_srisc_address = RISC_START_ADDRESS_2400; | ||
1463 | break; | ||
1416 | } | 1464 | } |
1417 | } | 1465 | } |
1418 | 1466 | ||
@@ -1527,7 +1575,8 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1527 | if (pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2422 || | 1575 | if (pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2422 || |
1528 | pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2432 || | 1576 | pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2432 || |
1529 | pdev->device == PCI_DEVICE_ID_QLOGIC_ISP5422 || | 1577 | pdev->device == PCI_DEVICE_ID_QLOGIC_ISP5422 || |
1530 | pdev->device == PCI_DEVICE_ID_QLOGIC_ISP5432) | 1578 | pdev->device == PCI_DEVICE_ID_QLOGIC_ISP5432 || |
1579 | pdev->device == PCI_DEVICE_ID_QLOGIC_ISP2532) | ||
1531 | sht = &qla24xx_driver_template; | 1580 | sht = &qla24xx_driver_template; |
1532 | host = scsi_host_alloc(sht, sizeof(scsi_qla_host_t)); | 1581 | host = scsi_host_alloc(sht, sizeof(scsi_qla_host_t)); |
1533 | if (host == NULL) { | 1582 | if (host == NULL) { |
@@ -1609,6 +1658,17 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
1609 | ha->gid_list_info_size = 8; | 1658 | ha->gid_list_info_size = 8; |
1610 | ha->optrom_size = OPTROM_SIZE_24XX; | 1659 | ha->optrom_size = OPTROM_SIZE_24XX; |
1611 | ha->isp_ops = &qla24xx_isp_ops; | 1660 | ha->isp_ops = &qla24xx_isp_ops; |
1661 | } else if (IS_QLA25XX(ha)) { | ||
1662 | host->max_id = MAX_TARGETS_2200; | ||
1663 | ha->mbx_count = MAILBOX_REGISTER_COUNT; | ||
1664 | ha->request_q_length = REQUEST_ENTRY_CNT_24XX; | ||
1665 | ha->response_q_length = RESPONSE_ENTRY_CNT_2300; | ||
1666 | ha->last_loop_id = SNS_LAST_LOOP_ID_2300; | ||
1667 | ha->init_cb_size = sizeof(struct mid_init_cb_24xx); | ||
1668 | ha->mgmt_svr_loop_id = 10 + ha->vp_idx; | ||
1669 | ha->gid_list_info_size = 8; | ||
1670 | ha->optrom_size = OPTROM_SIZE_25XX; | ||
1671 | ha->isp_ops = &qla25xx_isp_ops; | ||
1612 | } | 1672 | } |
1613 | host->can_queue = ha->request_q_length + 128; | 1673 | host->can_queue = ha->request_q_length + 128; |
1614 | 1674 | ||
@@ -2665,18 +2725,20 @@ qla2x00_down_timeout(struct semaphore *sema, unsigned long timeout) | |||
2665 | 2725 | ||
2666 | /* Firmware interface routines. */ | 2726 | /* Firmware interface routines. */ |
2667 | 2727 | ||
2668 | #define FW_BLOBS 5 | 2728 | #define FW_BLOBS 6 |
2669 | #define FW_ISP21XX 0 | 2729 | #define FW_ISP21XX 0 |
2670 | #define FW_ISP22XX 1 | 2730 | #define FW_ISP22XX 1 |
2671 | #define FW_ISP2300 2 | 2731 | #define FW_ISP2300 2 |
2672 | #define FW_ISP2322 3 | 2732 | #define FW_ISP2322 3 |
2673 | #define FW_ISP24XX 4 | 2733 | #define FW_ISP24XX 4 |
2734 | #define FW_ISP25XX 5 | ||
2674 | 2735 | ||
2675 | #define FW_FILE_ISP21XX "ql2100_fw.bin" | 2736 | #define FW_FILE_ISP21XX "ql2100_fw.bin" |
2676 | #define FW_FILE_ISP22XX "ql2200_fw.bin" | 2737 | #define FW_FILE_ISP22XX "ql2200_fw.bin" |
2677 | #define FW_FILE_ISP2300 "ql2300_fw.bin" | 2738 | #define FW_FILE_ISP2300 "ql2300_fw.bin" |
2678 | #define FW_FILE_ISP2322 "ql2322_fw.bin" | 2739 | #define FW_FILE_ISP2322 "ql2322_fw.bin" |
2679 | #define FW_FILE_ISP24XX "ql2400_fw.bin" | 2740 | #define FW_FILE_ISP24XX "ql2400_fw.bin" |
2741 | #define FW_FILE_ISP25XX "ql2500_fw.bin" | ||
2680 | 2742 | ||
2681 | static DECLARE_MUTEX(qla_fw_lock); | 2743 | static DECLARE_MUTEX(qla_fw_lock); |
2682 | 2744 | ||
@@ -2686,6 +2748,7 @@ static struct fw_blob qla_fw_blobs[FW_BLOBS] = { | |||
2686 | { .name = FW_FILE_ISP2300, .segs = { 0x800, 0 }, }, | 2748 | { .name = FW_FILE_ISP2300, .segs = { 0x800, 0 }, }, |
2687 | { .name = FW_FILE_ISP2322, .segs = { 0x800, 0x1c000, 0x1e000, 0 }, }, | 2749 | { .name = FW_FILE_ISP2322, .segs = { 0x800, 0x1c000, 0x1e000, 0 }, }, |
2688 | { .name = FW_FILE_ISP24XX, }, | 2750 | { .name = FW_FILE_ISP24XX, }, |
2751 | { .name = FW_FILE_ISP25XX, }, | ||
2689 | }; | 2752 | }; |
2690 | 2753 | ||
2691 | struct fw_blob * | 2754 | struct fw_blob * |
@@ -2704,6 +2767,8 @@ qla2x00_request_firmware(scsi_qla_host_t *ha) | |||
2704 | blob = &qla_fw_blobs[FW_ISP2322]; | 2767 | blob = &qla_fw_blobs[FW_ISP2322]; |
2705 | } else if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { | 2768 | } else if (IS_QLA24XX(ha) || IS_QLA54XX(ha)) { |
2706 | blob = &qla_fw_blobs[FW_ISP24XX]; | 2769 | blob = &qla_fw_blobs[FW_ISP24XX]; |
2770 | } else if (IS_QLA25XX(ha)) { | ||
2771 | blob = &qla_fw_blobs[FW_ISP25XX]; | ||
2707 | } | 2772 | } |
2708 | 2773 | ||
2709 | down(&qla_fw_lock); | 2774 | down(&qla_fw_lock); |
@@ -2747,6 +2812,7 @@ static struct pci_device_id qla2xxx_pci_tbl[] = { | |||
2747 | { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2432) }, | 2812 | { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2432) }, |
2748 | { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP5422) }, | 2813 | { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP5422) }, |
2749 | { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP5432) }, | 2814 | { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP5432) }, |
2815 | { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, PCI_DEVICE_ID_QLOGIC_ISP2532) }, | ||
2750 | { 0 }, | 2816 | { 0 }, |
2751 | }; | 2817 | }; |
2752 | MODULE_DEVICE_TABLE(pci, qla2xxx_pci_tbl); | 2818 | MODULE_DEVICE_TABLE(pci, qla2xxx_pci_tbl); |
diff --git a/drivers/scsi/qla2xxx/qla_sup.c b/drivers/scsi/qla2xxx/qla_sup.c index aafd6046723..a925a3f179f 100644 --- a/drivers/scsi/qla2xxx/qla_sup.c +++ b/drivers/scsi/qla2xxx/qla_sup.c | |||
@@ -766,6 +766,29 @@ qla24xx_write_nvram_data(scsi_qla_host_t *ha, uint8_t *buf, uint32_t naddr, | |||
766 | return ret; | 766 | return ret; |
767 | } | 767 | } |
768 | 768 | ||
769 | uint8_t * | ||
770 | qla25xx_read_nvram_data(scsi_qla_host_t *ha, uint8_t *buf, uint32_t naddr, | ||
771 | uint32_t bytes) | ||
772 | { | ||
773 | uint32_t i; | ||
774 | uint32_t *dwptr; | ||
775 | |||
776 | /* Dword reads to flash. */ | ||
777 | dwptr = (uint32_t *)buf; | ||
778 | for (i = 0; i < bytes >> 2; i++, naddr++) | ||
779 | dwptr[i] = cpu_to_le32(qla24xx_read_flash_dword(ha, | ||
780 | flash_data_to_access_addr(FA_VPD_NVRAM_ADDR | naddr))); | ||
781 | |||
782 | return buf; | ||
783 | } | ||
784 | |||
785 | int | ||
786 | qla25xx_write_nvram_data(scsi_qla_host_t *ha, uint8_t *buf, uint32_t naddr, | ||
787 | uint32_t bytes) | ||
788 | { | ||
789 | return qla24xx_write_flash_data(ha, (uint32_t *)buf, | ||
790 | FA_VPD_NVRAM_ADDR | naddr, bytes >> 2); | ||
791 | } | ||
769 | 792 | ||
770 | static inline void | 793 | static inline void |
771 | qla2x00_flip_colors(scsi_qla_host_t *ha, uint16_t *pflags) | 794 | qla2x00_flip_colors(scsi_qla_host_t *ha, uint16_t *pflags) |