diff options
Diffstat (limited to 'drivers/scsi/qla2xxx/qla_dbg.c')
-rw-r--r-- | drivers/scsi/qla2xxx/qla_dbg.c | 521 |
1 files changed, 511 insertions, 10 deletions
diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c index cdf06176354..e4c6b940993 100644 --- a/drivers/scsi/qla2xxx/qla_dbg.c +++ b/drivers/scsi/qla2xxx/qla_dbg.c | |||
@@ -11,23 +11,23 @@ | |||
11 | * ---------------------------------------------------------------------- | 11 | * ---------------------------------------------------------------------- |
12 | * | Level | Last Value Used | Holes | | 12 | * | Level | Last Value Used | Holes | |
13 | * ---------------------------------------------------------------------- | 13 | * ---------------------------------------------------------------------- |
14 | * | Module Init and Probe | 0x0116 | 0xfa | | 14 | * | Module Init and Probe | 0x011f | 0x4b,0xfa | |
15 | * | Mailbox commands | 0x112b | | | 15 | * | Mailbox commands | 0x1139 | 0x112c-0x112e | |
16 | * | Device Discovery | 0x2084 | | | 16 | * | Device Discovery | 0x2084 | | |
17 | * | Queue Command and IO tracing | 0x302f | 0x3008,0x302d, | | 17 | * | Queue Command and IO tracing | 0x302f | 0x3008 | |
18 | * | | | 0x302e | | 18 | * | | | 0x302d-0x302e | |
19 | * | DPC Thread | 0x401c | | | 19 | * | DPC Thread | 0x401c | | |
20 | * | Async Events | 0x5057 | 0x5052 | | 20 | * | Async Events | 0x5057 | 0x5052 | |
21 | * | Timer Routines | 0x6011 | 0x600e,0x600f | | 21 | * | Timer Routines | 0x6011 | 0x600e-0x600f | |
22 | * | User Space Interactions | 0x709e | 0x7018,0x702e | | 22 | * | User Space Interactions | 0x709e | 0x7018,0x702e | |
23 | * | | | 0x7039,0x7045 | | 23 | * | | | 0x7039,0x7045 | |
24 | * | Task Management | 0x803c | 0x8025-0x8026 | | 24 | * | Task Management | 0x803c | 0x8025-0x8026 | |
25 | * | | | 0x800b,0x8039 | | 25 | * | | | 0x800b,0x8039 | |
26 | * | AER/EEH | 0x900f | | | 26 | * | AER/EEH | 0x900f | | |
27 | * | Virtual Port | 0xa007 | | | 27 | * | Virtual Port | 0xa007 | | |
28 | * | ISP82XX Specific | 0xb052 | | | 28 | * | ISP82XX Specific | 0xb052 | | |
29 | * | MultiQ | 0xc00b | | | 29 | * | MultiQ | 0xc00c | | |
30 | * | Misc | 0xd00b | | | 30 | * | Misc | 0xd010 | | |
31 | * ---------------------------------------------------------------------- | 31 | * ---------------------------------------------------------------------- |
32 | */ | 32 | */ |
33 | 33 | ||
@@ -453,7 +453,7 @@ qla25xx_copy_mq(struct qla_hw_data *ha, void *ptr, uint32_t **last_chain) | |||
453 | struct qla2xxx_mq_chain *mq = ptr; | 453 | struct qla2xxx_mq_chain *mq = ptr; |
454 | struct device_reg_25xxmq __iomem *reg; | 454 | struct device_reg_25xxmq __iomem *reg; |
455 | 455 | ||
456 | if (!ha->mqenable) | 456 | if (!ha->mqenable || IS_QLA83XX(ha)) |
457 | return ptr; | 457 | return ptr; |
458 | 458 | ||
459 | mq = ptr; | 459 | mq = ptr; |
@@ -1729,6 +1729,507 @@ qla81xx_fw_dump_failed: | |||
1729 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | 1729 | spin_unlock_irqrestore(&ha->hardware_lock, flags); |
1730 | } | 1730 | } |
1731 | 1731 | ||
1732 | void | ||
1733 | qla83xx_fw_dump(scsi_qla_host_t *vha, int hardware_locked) | ||
1734 | { | ||
1735 | int rval; | ||
1736 | uint32_t cnt, reg_data; | ||
1737 | uint32_t risc_address; | ||
1738 | struct qla_hw_data *ha = vha->hw; | ||
1739 | struct device_reg_24xx __iomem *reg = &ha->iobase->isp24; | ||
1740 | uint32_t __iomem *dmp_reg; | ||
1741 | uint32_t *iter_reg; | ||
1742 | uint16_t __iomem *mbx_reg; | ||
1743 | unsigned long flags; | ||
1744 | struct qla83xx_fw_dump *fw; | ||
1745 | uint32_t ext_mem_cnt; | ||
1746 | void *nxt, *nxt_chain; | ||
1747 | uint32_t *last_chain = NULL; | ||
1748 | struct scsi_qla_host *base_vha = pci_get_drvdata(ha->pdev); | ||
1749 | |||
1750 | risc_address = ext_mem_cnt = 0; | ||
1751 | flags = 0; | ||
1752 | |||
1753 | if (!hardware_locked) | ||
1754 | spin_lock_irqsave(&ha->hardware_lock, flags); | ||
1755 | |||
1756 | if (!ha->fw_dump) { | ||
1757 | ql_log(ql_log_warn, vha, 0xd00c, | ||
1758 | "No buffer available for dump!!!\n"); | ||
1759 | goto qla83xx_fw_dump_failed; | ||
1760 | } | ||
1761 | |||
1762 | if (ha->fw_dumped) { | ||
1763 | ql_log(ql_log_warn, vha, 0xd00d, | ||
1764 | "Firmware has been previously dumped (%p) -- ignoring " | ||
1765 | "request...\n", ha->fw_dump); | ||
1766 | goto qla83xx_fw_dump_failed; | ||
1767 | } | ||
1768 | fw = &ha->fw_dump->isp.isp83; | ||
1769 | qla2xxx_prep_dump(ha, ha->fw_dump); | ||
1770 | |||
1771 | fw->host_status = htonl(RD_REG_DWORD(®->host_status)); | ||
1772 | |||
1773 | /* Pause RISC. */ | ||
1774 | rval = qla24xx_pause_risc(reg); | ||
1775 | if (rval != QLA_SUCCESS) | ||
1776 | goto qla83xx_fw_dump_failed_0; | ||
1777 | |||
1778 | WRT_REG_DWORD(®->iobase_addr, 0x6000); | ||
1779 | dmp_reg = ®->iobase_window; | ||
1780 | reg_data = RD_REG_DWORD(dmp_reg); | ||
1781 | WRT_REG_DWORD(dmp_reg, 0); | ||
1782 | |||
1783 | dmp_reg = ®->unused_4_1[0]; | ||
1784 | reg_data = RD_REG_DWORD(dmp_reg); | ||
1785 | WRT_REG_DWORD(dmp_reg, 0); | ||
1786 | |||
1787 | WRT_REG_DWORD(®->iobase_addr, 0x6010); | ||
1788 | dmp_reg = ®->unused_4_1[2]; | ||
1789 | reg_data = RD_REG_DWORD(dmp_reg); | ||
1790 | WRT_REG_DWORD(dmp_reg, 0); | ||
1791 | |||
1792 | /* select PCR and disable ecc checking and correction */ | ||
1793 | WRT_REG_DWORD(®->iobase_addr, 0x0F70); | ||
1794 | RD_REG_DWORD(®->iobase_addr); | ||
1795 | WRT_REG_DWORD(®->iobase_select, 0x60000000); /* write to F0h = PCR */ | ||
1796 | |||
1797 | /* Host/Risc registers. */ | ||
1798 | iter_reg = fw->host_risc_reg; | ||
1799 | iter_reg = qla24xx_read_window(reg, 0x7000, 16, iter_reg); | ||
1800 | iter_reg = qla24xx_read_window(reg, 0x7010, 16, iter_reg); | ||
1801 | qla24xx_read_window(reg, 0x7040, 16, iter_reg); | ||
1802 | |||
1803 | /* PCIe registers. */ | ||
1804 | WRT_REG_DWORD(®->iobase_addr, 0x7C00); | ||
1805 | RD_REG_DWORD(®->iobase_addr); | ||
1806 | WRT_REG_DWORD(®->iobase_window, 0x01); | ||
1807 | dmp_reg = ®->iobase_c4; | ||
1808 | fw->pcie_regs[0] = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1809 | fw->pcie_regs[1] = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1810 | fw->pcie_regs[2] = htonl(RD_REG_DWORD(dmp_reg)); | ||
1811 | fw->pcie_regs[3] = htonl(RD_REG_DWORD(®->iobase_window)); | ||
1812 | |||
1813 | WRT_REG_DWORD(®->iobase_window, 0x00); | ||
1814 | RD_REG_DWORD(®->iobase_window); | ||
1815 | |||
1816 | /* Host interface registers. */ | ||
1817 | dmp_reg = ®->flash_addr; | ||
1818 | for (cnt = 0; cnt < sizeof(fw->host_reg) / 4; cnt++) | ||
1819 | fw->host_reg[cnt] = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1820 | |||
1821 | /* Disable interrupts. */ | ||
1822 | WRT_REG_DWORD(®->ictrl, 0); | ||
1823 | RD_REG_DWORD(®->ictrl); | ||
1824 | |||
1825 | /* Shadow registers. */ | ||
1826 | WRT_REG_DWORD(®->iobase_addr, 0x0F70); | ||
1827 | RD_REG_DWORD(®->iobase_addr); | ||
1828 | WRT_REG_DWORD(®->iobase_select, 0xB0000000); | ||
1829 | fw->shadow_reg[0] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1830 | |||
1831 | WRT_REG_DWORD(®->iobase_select, 0xB0100000); | ||
1832 | fw->shadow_reg[1] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1833 | |||
1834 | WRT_REG_DWORD(®->iobase_select, 0xB0200000); | ||
1835 | fw->shadow_reg[2] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1836 | |||
1837 | WRT_REG_DWORD(®->iobase_select, 0xB0300000); | ||
1838 | fw->shadow_reg[3] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1839 | |||
1840 | WRT_REG_DWORD(®->iobase_select, 0xB0400000); | ||
1841 | fw->shadow_reg[4] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1842 | |||
1843 | WRT_REG_DWORD(®->iobase_select, 0xB0500000); | ||
1844 | fw->shadow_reg[5] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1845 | |||
1846 | WRT_REG_DWORD(®->iobase_select, 0xB0600000); | ||
1847 | fw->shadow_reg[6] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1848 | |||
1849 | WRT_REG_DWORD(®->iobase_select, 0xB0700000); | ||
1850 | fw->shadow_reg[7] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1851 | |||
1852 | WRT_REG_DWORD(®->iobase_select, 0xB0800000); | ||
1853 | fw->shadow_reg[8] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1854 | |||
1855 | WRT_REG_DWORD(®->iobase_select, 0xB0900000); | ||
1856 | fw->shadow_reg[9] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1857 | |||
1858 | WRT_REG_DWORD(®->iobase_select, 0xB0A00000); | ||
1859 | fw->shadow_reg[10] = htonl(RD_REG_DWORD(®->iobase_sdata)); | ||
1860 | |||
1861 | /* RISC I/O register. */ | ||
1862 | WRT_REG_DWORD(®->iobase_addr, 0x0010); | ||
1863 | fw->risc_io_reg = htonl(RD_REG_DWORD(®->iobase_window)); | ||
1864 | |||
1865 | /* Mailbox registers. */ | ||
1866 | mbx_reg = ®->mailbox0; | ||
1867 | for (cnt = 0; cnt < sizeof(fw->mailbox_reg) / 2; cnt++) | ||
1868 | fw->mailbox_reg[cnt] = htons(RD_REG_WORD(mbx_reg++)); | ||
1869 | |||
1870 | /* Transfer sequence registers. */ | ||
1871 | iter_reg = fw->xseq_gp_reg; | ||
1872 | iter_reg = qla24xx_read_window(reg, 0xBE00, 16, iter_reg); | ||
1873 | iter_reg = qla24xx_read_window(reg, 0xBE10, 16, iter_reg); | ||
1874 | iter_reg = qla24xx_read_window(reg, 0xBE20, 16, iter_reg); | ||
1875 | iter_reg = qla24xx_read_window(reg, 0xBE30, 16, iter_reg); | ||
1876 | iter_reg = qla24xx_read_window(reg, 0xBE40, 16, iter_reg); | ||
1877 | iter_reg = qla24xx_read_window(reg, 0xBE50, 16, iter_reg); | ||
1878 | iter_reg = qla24xx_read_window(reg, 0xBE60, 16, iter_reg); | ||
1879 | iter_reg = qla24xx_read_window(reg, 0xBE70, 16, iter_reg); | ||
1880 | iter_reg = qla24xx_read_window(reg, 0xBF00, 16, iter_reg); | ||
1881 | iter_reg = qla24xx_read_window(reg, 0xBF10, 16, iter_reg); | ||
1882 | iter_reg = qla24xx_read_window(reg, 0xBF20, 16, iter_reg); | ||
1883 | iter_reg = qla24xx_read_window(reg, 0xBF30, 16, iter_reg); | ||
1884 | iter_reg = qla24xx_read_window(reg, 0xBF40, 16, iter_reg); | ||
1885 | iter_reg = qla24xx_read_window(reg, 0xBF50, 16, iter_reg); | ||
1886 | iter_reg = qla24xx_read_window(reg, 0xBF60, 16, iter_reg); | ||
1887 | qla24xx_read_window(reg, 0xBF70, 16, iter_reg); | ||
1888 | |||
1889 | iter_reg = fw->xseq_0_reg; | ||
1890 | iter_reg = qla24xx_read_window(reg, 0xBFC0, 16, iter_reg); | ||
1891 | iter_reg = qla24xx_read_window(reg, 0xBFD0, 16, iter_reg); | ||
1892 | qla24xx_read_window(reg, 0xBFE0, 16, iter_reg); | ||
1893 | |||
1894 | qla24xx_read_window(reg, 0xBFF0, 16, fw->xseq_1_reg); | ||
1895 | |||
1896 | qla24xx_read_window(reg, 0xBEF0, 16, fw->xseq_2_reg); | ||
1897 | |||
1898 | /* Receive sequence registers. */ | ||
1899 | iter_reg = fw->rseq_gp_reg; | ||
1900 | iter_reg = qla24xx_read_window(reg, 0xFE00, 16, iter_reg); | ||
1901 | iter_reg = qla24xx_read_window(reg, 0xFE10, 16, iter_reg); | ||
1902 | iter_reg = qla24xx_read_window(reg, 0xFE20, 16, iter_reg); | ||
1903 | iter_reg = qla24xx_read_window(reg, 0xFE30, 16, iter_reg); | ||
1904 | iter_reg = qla24xx_read_window(reg, 0xFE40, 16, iter_reg); | ||
1905 | iter_reg = qla24xx_read_window(reg, 0xFE50, 16, iter_reg); | ||
1906 | iter_reg = qla24xx_read_window(reg, 0xFE60, 16, iter_reg); | ||
1907 | iter_reg = qla24xx_read_window(reg, 0xFE70, 16, iter_reg); | ||
1908 | iter_reg = qla24xx_read_window(reg, 0xFF00, 16, iter_reg); | ||
1909 | iter_reg = qla24xx_read_window(reg, 0xFF10, 16, iter_reg); | ||
1910 | iter_reg = qla24xx_read_window(reg, 0xFF20, 16, iter_reg); | ||
1911 | iter_reg = qla24xx_read_window(reg, 0xFF30, 16, iter_reg); | ||
1912 | iter_reg = qla24xx_read_window(reg, 0xFF40, 16, iter_reg); | ||
1913 | iter_reg = qla24xx_read_window(reg, 0xFF50, 16, iter_reg); | ||
1914 | iter_reg = qla24xx_read_window(reg, 0xFF60, 16, iter_reg); | ||
1915 | qla24xx_read_window(reg, 0xFF70, 16, iter_reg); | ||
1916 | |||
1917 | iter_reg = fw->rseq_0_reg; | ||
1918 | iter_reg = qla24xx_read_window(reg, 0xFFC0, 16, iter_reg); | ||
1919 | qla24xx_read_window(reg, 0xFFD0, 16, iter_reg); | ||
1920 | |||
1921 | qla24xx_read_window(reg, 0xFFE0, 16, fw->rseq_1_reg); | ||
1922 | qla24xx_read_window(reg, 0xFFF0, 16, fw->rseq_2_reg); | ||
1923 | qla24xx_read_window(reg, 0xFEF0, 16, fw->rseq_3_reg); | ||
1924 | |||
1925 | /* Auxiliary sequence registers. */ | ||
1926 | iter_reg = fw->aseq_gp_reg; | ||
1927 | iter_reg = qla24xx_read_window(reg, 0xB000, 16, iter_reg); | ||
1928 | iter_reg = qla24xx_read_window(reg, 0xB010, 16, iter_reg); | ||
1929 | iter_reg = qla24xx_read_window(reg, 0xB020, 16, iter_reg); | ||
1930 | iter_reg = qla24xx_read_window(reg, 0xB030, 16, iter_reg); | ||
1931 | iter_reg = qla24xx_read_window(reg, 0xB040, 16, iter_reg); | ||
1932 | iter_reg = qla24xx_read_window(reg, 0xB050, 16, iter_reg); | ||
1933 | iter_reg = qla24xx_read_window(reg, 0xB060, 16, iter_reg); | ||
1934 | iter_reg = qla24xx_read_window(reg, 0xB070, 16, iter_reg); | ||
1935 | iter_reg = qla24xx_read_window(reg, 0xB100, 16, iter_reg); | ||
1936 | iter_reg = qla24xx_read_window(reg, 0xB110, 16, iter_reg); | ||
1937 | iter_reg = qla24xx_read_window(reg, 0xB120, 16, iter_reg); | ||
1938 | iter_reg = qla24xx_read_window(reg, 0xB130, 16, iter_reg); | ||
1939 | iter_reg = qla24xx_read_window(reg, 0xB140, 16, iter_reg); | ||
1940 | iter_reg = qla24xx_read_window(reg, 0xB150, 16, iter_reg); | ||
1941 | iter_reg = qla24xx_read_window(reg, 0xB160, 16, iter_reg); | ||
1942 | qla24xx_read_window(reg, 0xB170, 16, iter_reg); | ||
1943 | |||
1944 | iter_reg = fw->aseq_0_reg; | ||
1945 | iter_reg = qla24xx_read_window(reg, 0xB0C0, 16, iter_reg); | ||
1946 | qla24xx_read_window(reg, 0xB0D0, 16, iter_reg); | ||
1947 | |||
1948 | qla24xx_read_window(reg, 0xB0E0, 16, fw->aseq_1_reg); | ||
1949 | qla24xx_read_window(reg, 0xB0F0, 16, fw->aseq_2_reg); | ||
1950 | qla24xx_read_window(reg, 0xB1F0, 16, fw->aseq_3_reg); | ||
1951 | |||
1952 | /* Command DMA registers. */ | ||
1953 | iter_reg = fw->cmd_dma_reg; | ||
1954 | iter_reg = qla24xx_read_window(reg, 0x7100, 16, iter_reg); | ||
1955 | iter_reg = qla24xx_read_window(reg, 0x7120, 16, iter_reg); | ||
1956 | iter_reg = qla24xx_read_window(reg, 0x7130, 16, iter_reg); | ||
1957 | qla24xx_read_window(reg, 0x71F0, 16, iter_reg); | ||
1958 | |||
1959 | /* Queues. */ | ||
1960 | iter_reg = fw->req0_dma_reg; | ||
1961 | iter_reg = qla24xx_read_window(reg, 0x7200, 8, iter_reg); | ||
1962 | dmp_reg = ®->iobase_q; | ||
1963 | for (cnt = 0; cnt < 7; cnt++) | ||
1964 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1965 | |||
1966 | iter_reg = fw->resp0_dma_reg; | ||
1967 | iter_reg = qla24xx_read_window(reg, 0x7300, 8, iter_reg); | ||
1968 | dmp_reg = ®->iobase_q; | ||
1969 | for (cnt = 0; cnt < 7; cnt++) | ||
1970 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1971 | |||
1972 | iter_reg = fw->req1_dma_reg; | ||
1973 | iter_reg = qla24xx_read_window(reg, 0x7400, 8, iter_reg); | ||
1974 | dmp_reg = ®->iobase_q; | ||
1975 | for (cnt = 0; cnt < 7; cnt++) | ||
1976 | *iter_reg++ = htonl(RD_REG_DWORD(dmp_reg++)); | ||
1977 | |||
1978 | /* Transmit DMA registers. */ | ||
1979 | iter_reg = fw->xmt0_dma_reg; | ||
1980 | iter_reg = qla24xx_read_window(reg, 0x7600, 16, iter_reg); | ||
1981 | qla24xx_read_window(reg, 0x7610, 16, iter_reg); | ||
1982 | |||
1983 | iter_reg = fw->xmt1_dma_reg; | ||
1984 | iter_reg = qla24xx_read_window(reg, 0x7620, 16, iter_reg); | ||
1985 | qla24xx_read_window(reg, 0x7630, 16, iter_reg); | ||
1986 | |||
1987 | iter_reg = fw->xmt2_dma_reg; | ||
1988 | iter_reg = qla24xx_read_window(reg, 0x7640, 16, iter_reg); | ||
1989 | qla24xx_read_window(reg, 0x7650, 16, iter_reg); | ||
1990 | |||
1991 | iter_reg = fw->xmt3_dma_reg; | ||
1992 | iter_reg = qla24xx_read_window(reg, 0x7660, 16, iter_reg); | ||
1993 | qla24xx_read_window(reg, 0x7670, 16, iter_reg); | ||
1994 | |||
1995 | iter_reg = fw->xmt4_dma_reg; | ||
1996 | iter_reg = qla24xx_read_window(reg, 0x7680, 16, iter_reg); | ||
1997 | qla24xx_read_window(reg, 0x7690, 16, iter_reg); | ||
1998 | |||
1999 | qla24xx_read_window(reg, 0x76A0, 16, fw->xmt_data_dma_reg); | ||
2000 | |||
2001 | /* Receive DMA registers. */ | ||
2002 | iter_reg = fw->rcvt0_data_dma_reg; | ||
2003 | iter_reg = qla24xx_read_window(reg, 0x7700, 16, iter_reg); | ||
2004 | qla24xx_read_window(reg, 0x7710, 16, iter_reg); | ||
2005 | |||
2006 | iter_reg = fw->rcvt1_data_dma_reg; | ||
2007 | iter_reg = qla24xx_read_window(reg, 0x7720, 16, iter_reg); | ||
2008 | qla24xx_read_window(reg, 0x7730, 16, iter_reg); | ||
2009 | |||
2010 | /* RISC registers. */ | ||
2011 | iter_reg = fw->risc_gp_reg; | ||
2012 | iter_reg = qla24xx_read_window(reg, 0x0F00, 16, iter_reg); | ||
2013 | iter_reg = qla24xx_read_window(reg, 0x0F10, 16, iter_reg); | ||
2014 | iter_reg = qla24xx_read_window(reg, 0x0F20, 16, iter_reg); | ||
2015 | iter_reg = qla24xx_read_window(reg, 0x0F30, 16, iter_reg); | ||
2016 | iter_reg = qla24xx_read_window(reg, 0x0F40, 16, iter_reg); | ||
2017 | iter_reg = qla24xx_read_window(reg, 0x0F50, 16, iter_reg); | ||
2018 | iter_reg = qla24xx_read_window(reg, 0x0F60, 16, iter_reg); | ||
2019 | qla24xx_read_window(reg, 0x0F70, 16, iter_reg); | ||
2020 | |||
2021 | /* Local memory controller registers. */ | ||
2022 | iter_reg = fw->lmc_reg; | ||
2023 | iter_reg = qla24xx_read_window(reg, 0x3000, 16, iter_reg); | ||
2024 | iter_reg = qla24xx_read_window(reg, 0x3010, 16, iter_reg); | ||
2025 | iter_reg = qla24xx_read_window(reg, 0x3020, 16, iter_reg); | ||
2026 | iter_reg = qla24xx_read_window(reg, 0x3030, 16, iter_reg); | ||
2027 | iter_reg = qla24xx_read_window(reg, 0x3040, 16, iter_reg); | ||
2028 | iter_reg = qla24xx_read_window(reg, 0x3050, 16, iter_reg); | ||
2029 | iter_reg = qla24xx_read_window(reg, 0x3060, 16, iter_reg); | ||
2030 | qla24xx_read_window(reg, 0x3070, 16, iter_reg); | ||
2031 | |||
2032 | /* Fibre Protocol Module registers. */ | ||
2033 | iter_reg = fw->fpm_hdw_reg; | ||
2034 | iter_reg = qla24xx_read_window(reg, 0x4000, 16, iter_reg); | ||
2035 | iter_reg = qla24xx_read_window(reg, 0x4010, 16, iter_reg); | ||
2036 | iter_reg = qla24xx_read_window(reg, 0x4020, 16, iter_reg); | ||
2037 | iter_reg = qla24xx_read_window(reg, 0x4030, 16, iter_reg); | ||
2038 | iter_reg = qla24xx_read_window(reg, 0x4040, 16, iter_reg); | ||
2039 | iter_reg = qla24xx_read_window(reg, 0x4050, 16, iter_reg); | ||
2040 | iter_reg = qla24xx_read_window(reg, 0x4060, 16, iter_reg); | ||
2041 | iter_reg = qla24xx_read_window(reg, 0x4070, 16, iter_reg); | ||
2042 | iter_reg = qla24xx_read_window(reg, 0x4080, 16, iter_reg); | ||
2043 | iter_reg = qla24xx_read_window(reg, 0x4090, 16, iter_reg); | ||
2044 | iter_reg = qla24xx_read_window(reg, 0x40A0, 16, iter_reg); | ||
2045 | iter_reg = qla24xx_read_window(reg, 0x40B0, 16, iter_reg); | ||
2046 | iter_reg = qla24xx_read_window(reg, 0x40C0, 16, iter_reg); | ||
2047 | iter_reg = qla24xx_read_window(reg, 0x40D0, 16, iter_reg); | ||
2048 | iter_reg = qla24xx_read_window(reg, 0x40E0, 16, iter_reg); | ||
2049 | qla24xx_read_window(reg, 0x40F0, 16, iter_reg); | ||
2050 | |||
2051 | /* RQ0 Array registers. */ | ||
2052 | iter_reg = fw->rq0_array_reg; | ||
2053 | iter_reg = qla24xx_read_window(reg, 0x5C00, 16, iter_reg); | ||
2054 | iter_reg = qla24xx_read_window(reg, 0x5C10, 16, iter_reg); | ||
2055 | iter_reg = qla24xx_read_window(reg, 0x5C20, 16, iter_reg); | ||
2056 | iter_reg = qla24xx_read_window(reg, 0x5C30, 16, iter_reg); | ||
2057 | iter_reg = qla24xx_read_window(reg, 0x5C40, 16, iter_reg); | ||
2058 | iter_reg = qla24xx_read_window(reg, 0x5C50, 16, iter_reg); | ||
2059 | iter_reg = qla24xx_read_window(reg, 0x5C60, 16, iter_reg); | ||
2060 | iter_reg = qla24xx_read_window(reg, 0x5C70, 16, iter_reg); | ||
2061 | iter_reg = qla24xx_read_window(reg, 0x5C80, 16, iter_reg); | ||
2062 | iter_reg = qla24xx_read_window(reg, 0x5C90, 16, iter_reg); | ||
2063 | iter_reg = qla24xx_read_window(reg, 0x5CA0, 16, iter_reg); | ||
2064 | iter_reg = qla24xx_read_window(reg, 0x5CB0, 16, iter_reg); | ||
2065 | iter_reg = qla24xx_read_window(reg, 0x5CC0, 16, iter_reg); | ||
2066 | iter_reg = qla24xx_read_window(reg, 0x5CD0, 16, iter_reg); | ||
2067 | iter_reg = qla24xx_read_window(reg, 0x5CE0, 16, iter_reg); | ||
2068 | qla24xx_read_window(reg, 0x5CF0, 16, iter_reg); | ||
2069 | |||
2070 | /* RQ1 Array registers. */ | ||
2071 | iter_reg = fw->rq1_array_reg; | ||
2072 | iter_reg = qla24xx_read_window(reg, 0x5D00, 16, iter_reg); | ||
2073 | iter_reg = qla24xx_read_window(reg, 0x5D10, 16, iter_reg); | ||
2074 | iter_reg = qla24xx_read_window(reg, 0x5D20, 16, iter_reg); | ||
2075 | iter_reg = qla24xx_read_window(reg, 0x5D30, 16, iter_reg); | ||
2076 | iter_reg = qla24xx_read_window(reg, 0x5D40, 16, iter_reg); | ||
2077 | iter_reg = qla24xx_read_window(reg, 0x5D50, 16, iter_reg); | ||
2078 | iter_reg = qla24xx_read_window(reg, 0x5D60, 16, iter_reg); | ||
2079 | iter_reg = qla24xx_read_window(reg, 0x5D70, 16, iter_reg); | ||
2080 | iter_reg = qla24xx_read_window(reg, 0x5D80, 16, iter_reg); | ||
2081 | iter_reg = qla24xx_read_window(reg, 0x5D90, 16, iter_reg); | ||
2082 | iter_reg = qla24xx_read_window(reg, 0x5DA0, 16, iter_reg); | ||
2083 | iter_reg = qla24xx_read_window(reg, 0x5DB0, 16, iter_reg); | ||
2084 | iter_reg = qla24xx_read_window(reg, 0x5DC0, 16, iter_reg); | ||
2085 | iter_reg = qla24xx_read_window(reg, 0x5DD0, 16, iter_reg); | ||
2086 | iter_reg = qla24xx_read_window(reg, 0x5DE0, 16, iter_reg); | ||
2087 | qla24xx_read_window(reg, 0x5DF0, 16, iter_reg); | ||
2088 | |||
2089 | /* RP0 Array registers. */ | ||
2090 | iter_reg = fw->rp0_array_reg; | ||
2091 | iter_reg = qla24xx_read_window(reg, 0x5E00, 16, iter_reg); | ||
2092 | iter_reg = qla24xx_read_window(reg, 0x5E10, 16, iter_reg); | ||
2093 | iter_reg = qla24xx_read_window(reg, 0x5E20, 16, iter_reg); | ||
2094 | iter_reg = qla24xx_read_window(reg, 0x5E30, 16, iter_reg); | ||
2095 | iter_reg = qla24xx_read_window(reg, 0x5E40, 16, iter_reg); | ||
2096 | iter_reg = qla24xx_read_window(reg, 0x5E50, 16, iter_reg); | ||
2097 | iter_reg = qla24xx_read_window(reg, 0x5E60, 16, iter_reg); | ||
2098 | iter_reg = qla24xx_read_window(reg, 0x5E70, 16, iter_reg); | ||
2099 | iter_reg = qla24xx_read_window(reg, 0x5E80, 16, iter_reg); | ||
2100 | iter_reg = qla24xx_read_window(reg, 0x5E90, 16, iter_reg); | ||
2101 | iter_reg = qla24xx_read_window(reg, 0x5EA0, 16, iter_reg); | ||
2102 | iter_reg = qla24xx_read_window(reg, 0x5EB0, 16, iter_reg); | ||
2103 | iter_reg = qla24xx_read_window(reg, 0x5EC0, 16, iter_reg); | ||
2104 | iter_reg = qla24xx_read_window(reg, 0x5ED0, 16, iter_reg); | ||
2105 | iter_reg = qla24xx_read_window(reg, 0x5EE0, 16, iter_reg); | ||
2106 | qla24xx_read_window(reg, 0x5EF0, 16, iter_reg); | ||
2107 | |||
2108 | /* RP1 Array registers. */ | ||
2109 | iter_reg = fw->rp1_array_reg; | ||
2110 | iter_reg = qla24xx_read_window(reg, 0x5F00, 16, iter_reg); | ||
2111 | iter_reg = qla24xx_read_window(reg, 0x5F10, 16, iter_reg); | ||
2112 | iter_reg = qla24xx_read_window(reg, 0x5F20, 16, iter_reg); | ||
2113 | iter_reg = qla24xx_read_window(reg, 0x5F30, 16, iter_reg); | ||
2114 | iter_reg = qla24xx_read_window(reg, 0x5F40, 16, iter_reg); | ||
2115 | iter_reg = qla24xx_read_window(reg, 0x5F50, 16, iter_reg); | ||
2116 | iter_reg = qla24xx_read_window(reg, 0x5F60, 16, iter_reg); | ||
2117 | iter_reg = qla24xx_read_window(reg, 0x5F70, 16, iter_reg); | ||
2118 | iter_reg = qla24xx_read_window(reg, 0x5F80, 16, iter_reg); | ||
2119 | iter_reg = qla24xx_read_window(reg, 0x5F90, 16, iter_reg); | ||
2120 | iter_reg = qla24xx_read_window(reg, 0x5FA0, 16, iter_reg); | ||
2121 | iter_reg = qla24xx_read_window(reg, 0x5FB0, 16, iter_reg); | ||
2122 | iter_reg = qla24xx_read_window(reg, 0x5FC0, 16, iter_reg); | ||
2123 | iter_reg = qla24xx_read_window(reg, 0x5FD0, 16, iter_reg); | ||
2124 | iter_reg = qla24xx_read_window(reg, 0x5FE0, 16, iter_reg); | ||
2125 | qla24xx_read_window(reg, 0x5FF0, 16, iter_reg); | ||
2126 | |||
2127 | iter_reg = fw->at0_array_reg; | ||
2128 | iter_reg = qla24xx_read_window(reg, 0x7080, 16, iter_reg); | ||
2129 | iter_reg = qla24xx_read_window(reg, 0x7090, 16, iter_reg); | ||
2130 | iter_reg = qla24xx_read_window(reg, 0x70A0, 16, iter_reg); | ||
2131 | iter_reg = qla24xx_read_window(reg, 0x70B0, 16, iter_reg); | ||
2132 | iter_reg = qla24xx_read_window(reg, 0x70C0, 16, iter_reg); | ||
2133 | iter_reg = qla24xx_read_window(reg, 0x70D0, 16, iter_reg); | ||
2134 | iter_reg = qla24xx_read_window(reg, 0x70E0, 16, iter_reg); | ||
2135 | qla24xx_read_window(reg, 0x70F0, 16, iter_reg); | ||
2136 | |||
2137 | /* I/O Queue Control registers. */ | ||
2138 | qla24xx_read_window(reg, 0x7800, 16, fw->queue_control_reg); | ||
2139 | |||
2140 | /* Frame Buffer registers. */ | ||
2141 | iter_reg = fw->fb_hdw_reg; | ||
2142 | iter_reg = qla24xx_read_window(reg, 0x6000, 16, iter_reg); | ||
2143 | iter_reg = qla24xx_read_window(reg, 0x6010, 16, iter_reg); | ||
2144 | iter_reg = qla24xx_read_window(reg, 0x6020, 16, iter_reg); | ||
2145 | iter_reg = qla24xx_read_window(reg, 0x6030, 16, iter_reg); | ||
2146 | iter_reg = qla24xx_read_window(reg, 0x6040, 16, iter_reg); | ||
2147 | iter_reg = qla24xx_read_window(reg, 0x6060, 16, iter_reg); | ||
2148 | iter_reg = qla24xx_read_window(reg, 0x6070, 16, iter_reg); | ||
2149 | iter_reg = qla24xx_read_window(reg, 0x6100, 16, iter_reg); | ||
2150 | iter_reg = qla24xx_read_window(reg, 0x6130, 16, iter_reg); | ||
2151 | iter_reg = qla24xx_read_window(reg, 0x6150, 16, iter_reg); | ||
2152 | iter_reg = qla24xx_read_window(reg, 0x6170, 16, iter_reg); | ||
2153 | iter_reg = qla24xx_read_window(reg, 0x6190, 16, iter_reg); | ||
2154 | iter_reg = qla24xx_read_window(reg, 0x61B0, 16, iter_reg); | ||
2155 | iter_reg = qla24xx_read_window(reg, 0x61C0, 16, iter_reg); | ||
2156 | iter_reg = qla24xx_read_window(reg, 0x6530, 16, iter_reg); | ||
2157 | iter_reg = qla24xx_read_window(reg, 0x6540, 16, iter_reg); | ||
2158 | iter_reg = qla24xx_read_window(reg, 0x6550, 16, iter_reg); | ||
2159 | iter_reg = qla24xx_read_window(reg, 0x6560, 16, iter_reg); | ||
2160 | iter_reg = qla24xx_read_window(reg, 0x6570, 16, iter_reg); | ||
2161 | iter_reg = qla24xx_read_window(reg, 0x6580, 16, iter_reg); | ||
2162 | iter_reg = qla24xx_read_window(reg, 0x6590, 16, iter_reg); | ||
2163 | iter_reg = qla24xx_read_window(reg, 0x65A0, 16, iter_reg); | ||
2164 | iter_reg = qla24xx_read_window(reg, 0x65B0, 16, iter_reg); | ||
2165 | iter_reg = qla24xx_read_window(reg, 0x65C0, 16, iter_reg); | ||
2166 | iter_reg = qla24xx_read_window(reg, 0x65D0, 16, iter_reg); | ||
2167 | iter_reg = qla24xx_read_window(reg, 0x65E0, 16, iter_reg); | ||
2168 | qla24xx_read_window(reg, 0x6F00, 16, iter_reg); | ||
2169 | |||
2170 | /* Multi queue registers */ | ||
2171 | nxt_chain = qla25xx_copy_mq(ha, (void *)ha->fw_dump + ha->chain_offset, | ||
2172 | &last_chain); | ||
2173 | |||
2174 | rval = qla24xx_soft_reset(ha); | ||
2175 | if (rval != QLA_SUCCESS) { | ||
2176 | ql_log(ql_log_warn, vha, 0xd00e, | ||
2177 | "SOFT RESET FAILED, forcing continuation of dump!!!\n"); | ||
2178 | rval = QLA_SUCCESS; | ||
2179 | |||
2180 | ql_log(ql_log_warn, vha, 0xd00f, "try a bigger hammer!!!\n"); | ||
2181 | |||
2182 | WRT_REG_DWORD(®->hccr, HCCRX_SET_RISC_RESET); | ||
2183 | RD_REG_DWORD(®->hccr); | ||
2184 | |||
2185 | WRT_REG_DWORD(®->hccr, HCCRX_REL_RISC_PAUSE); | ||
2186 | RD_REG_DWORD(®->hccr); | ||
2187 | |||
2188 | WRT_REG_DWORD(®->hccr, HCCRX_CLR_RISC_RESET); | ||
2189 | RD_REG_DWORD(®->hccr); | ||
2190 | |||
2191 | for (cnt = 30000; cnt && (RD_REG_WORD(®->mailbox0)); cnt--) | ||
2192 | udelay(5); | ||
2193 | |||
2194 | if (!cnt) { | ||
2195 | nxt = fw->code_ram; | ||
2196 | nxt += sizeof(fw->code_ram), | ||
2197 | nxt += (ha->fw_memory_size - 0x100000 + 1); | ||
2198 | goto copy_queue; | ||
2199 | } else | ||
2200 | ql_log(ql_log_warn, vha, 0xd010, | ||
2201 | "bigger hammer success?\n"); | ||
2202 | } | ||
2203 | |||
2204 | rval = qla24xx_dump_memory(ha, fw->code_ram, sizeof(fw->code_ram), | ||
2205 | &nxt); | ||
2206 | if (rval != QLA_SUCCESS) | ||
2207 | goto qla83xx_fw_dump_failed_0; | ||
2208 | |||
2209 | copy_queue: | ||
2210 | nxt = qla2xxx_copy_queues(ha, nxt); | ||
2211 | |||
2212 | nxt = qla24xx_copy_eft(ha, nxt); | ||
2213 | |||
2214 | /* Chain entries -- started with MQ. */ | ||
2215 | nxt_chain = qla25xx_copy_fce(ha, nxt_chain, &last_chain); | ||
2216 | nxt_chain = qla25xx_copy_mqueues(ha, nxt_chain, &last_chain); | ||
2217 | if (last_chain) { | ||
2218 | ha->fw_dump->version |= __constant_htonl(DUMP_CHAIN_VARIANT); | ||
2219 | *last_chain |= __constant_htonl(DUMP_CHAIN_LAST); | ||
2220 | } | ||
2221 | |||
2222 | /* Adjust valid length. */ | ||
2223 | ha->fw_dump_len = (nxt_chain - (void *)ha->fw_dump); | ||
2224 | |||
2225 | qla83xx_fw_dump_failed_0: | ||
2226 | qla2xxx_dump_post_process(base_vha, rval); | ||
2227 | |||
2228 | qla83xx_fw_dump_failed: | ||
2229 | if (!hardware_locked) | ||
2230 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | ||
2231 | } | ||
2232 | |||
1732 | /****************************************************************************/ | 2233 | /****************************************************************************/ |
1733 | /* Driver Debug Functions. */ | 2234 | /* Driver Debug Functions. */ |
1734 | /****************************************************************************/ | 2235 | /****************************************************************************/ |