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

Configure Feed

Select the types of activity you want to include in your feed.

scsi: csiostor: add support for Chelsio T6 adapters

Enable probe for T6 adapters, add code to flash T6 firmware and firmware
config file, use T6 specific macros.

Signed-off-by: Varun Prakash <varun@chelsio.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>

authored by

Varun Prakash and committed by
Martin K. Petersen
4bbd458e bfcc62ed

+88 -44
+66 -13
drivers/scsi/csiostor/csio_hw.c
··· 794 794 { 795 795 uint32_t reg; 796 796 int cnt = 6; 797 + int src_pf; 797 798 798 799 while (((reg = csio_rd_reg32(hw, PL_WHOAMI_A)) == 0xFFFFFFFF) && 799 800 (--cnt != 0)) 800 801 mdelay(100); 801 802 802 - if ((cnt == 0) && (((int32_t)(SOURCEPF_G(reg)) < 0) || 803 - (SOURCEPF_G(reg) >= CSIO_MAX_PFN))) { 803 + if (csio_is_t5(hw->pdev->device & CSIO_HW_CHIP_MASK)) 804 + src_pf = SOURCEPF_G(reg); 805 + else 806 + src_pf = T6_SOURCEPF_G(reg); 807 + 808 + if ((cnt == 0) && (((int32_t)(src_pf) < 0) || 809 + (src_pf >= CSIO_MAX_PFN))) { 804 810 csio_err(hw, "PL_WHOAMI returned 0x%x, cnt:%d\n", reg, cnt); 805 811 return -EIO; 806 812 } 807 813 808 - hw->pfn = SOURCEPF_G(reg); 814 + hw->pfn = src_pf; 809 815 810 816 return 0; 811 817 } ··· 1587 1581 unsigned int mtype = 0, maddr = 0; 1588 1582 uint32_t *cfg_data; 1589 1583 int value_to_add = 0; 1584 + const char *fw_cfg_file; 1590 1585 1591 - if (request_firmware(&cf, FW_CFG_NAME_T5, dev) < 0) { 1586 + if (csio_is_t5(pci_dev->device & CSIO_HW_CHIP_MASK)) 1587 + fw_cfg_file = FW_CFG_NAME_T5; 1588 + else 1589 + fw_cfg_file = FW_CFG_NAME_T6; 1590 + 1591 + if (request_firmware(&cf, fw_cfg_file, dev) < 0) { 1592 1592 csio_err(hw, "could not find config file %s, err: %d\n", 1593 - FW_CFG_NAME_T5, ret); 1593 + fw_cfg_file, ret); 1594 1594 return -ENOENT; 1595 1595 } 1596 1596 ··· 1635 1623 ret = csio_memory_write(hw, mtype, maddr + size, 4, &last.word); 1636 1624 } 1637 1625 if (ret == 0) { 1638 - csio_info(hw, "config file upgraded to %s\n", 1639 - FW_CFG_NAME_T5); 1640 - snprintf(path, 64, "%s%s", "/lib/firmware/", FW_CFG_NAME_T5); 1626 + csio_info(hw, "config file upgraded to %s\n", fw_cfg_file); 1627 + snprintf(path, 64, "%s%s", "/lib/firmware/", fw_cfg_file); 1641 1628 } 1642 1629 1643 1630 leave: ··· 1897 1886 .intfver_iscsi = FW_INTFVER(T5, ISCSI), 1898 1887 .intfver_fcoe = FW_INTFVER(T5, FCOE), 1899 1888 }, 1889 + }, { 1890 + .chip = CHELSIO_T6, 1891 + .fs_name = FW_CFG_NAME_T6, 1892 + .fw_mod_name = FW_FNAME_T6, 1893 + .fw_hdr = { 1894 + .chip = FW_HDR_CHIP_T6, 1895 + .fw_ver = __cpu_to_be32(FW_VERSION(T6)), 1896 + .intfver_nic = FW_INTFVER(T6, NIC), 1897 + .intfver_vnic = FW_INTFVER(T6, VNIC), 1898 + .intfver_ri = FW_INTFVER(T6, RI), 1899 + .intfver_iscsi = FW_INTFVER(T6, ISCSI), 1900 + .intfver_fcoe = FW_INTFVER(T6, FCOE), 1901 + }, 1900 1902 } 1901 1903 }; 1902 1904 ··· 2026 2002 struct device *dev = &pci_dev->dev ; 2027 2003 const u8 *fw_data = NULL; 2028 2004 unsigned int fw_size = 0; 2005 + const char *fw_bin_file; 2029 2006 2030 2007 /* This is the firmware whose headers the driver was compiled 2031 2008 * against ··· 2039 2014 return -EINVAL; 2040 2015 } 2041 2016 2042 - if (request_firmware(&fw, FW_FNAME_T5, dev) < 0) { 2017 + if (csio_is_t5(pci_dev->device & CSIO_HW_CHIP_MASK)) 2018 + fw_bin_file = FW_FNAME_T5; 2019 + else 2020 + fw_bin_file = FW_FNAME_T6; 2021 + 2022 + if (request_firmware(&fw, fw_bin_file, dev) < 0) { 2043 2023 csio_err(hw, "could not find firmware image %s, err: %d\n", 2044 - FW_FNAME_T5, ret); 2024 + fw_bin_file, ret); 2045 2025 } else { 2046 2026 fw_data = fw->data; 2047 2027 fw_size = fw->size; ··· 2271 2241 csio_hw_intr_enable(struct csio_hw *hw) 2272 2242 { 2273 2243 uint16_t vec = (uint16_t)csio_get_mb_intr_idx(csio_hw_to_mbm(hw)); 2274 - uint32_t pf = SOURCEPF_G(csio_rd_reg32(hw, PL_WHOAMI_A)); 2244 + u32 pf = 0; 2275 2245 uint32_t pl = csio_rd_reg32(hw, PL_INT_ENABLE_A); 2246 + 2247 + if (csio_is_t5(hw->pdev->device & CSIO_HW_CHIP_MASK)) 2248 + pf = SOURCEPF_G(csio_rd_reg32(hw, PL_WHOAMI_A)); 2249 + else 2250 + pf = T6_SOURCEPF_G(csio_rd_reg32(hw, PL_WHOAMI_A)); 2276 2251 2277 2252 /* 2278 2253 * Set aivec for MSI/MSIX. PCIE_PF_CFG.INTXType is set up ··· 2328 2293 void 2329 2294 csio_hw_intr_disable(struct csio_hw *hw) 2330 2295 { 2331 - uint32_t pf = SOURCEPF_G(csio_rd_reg32(hw, PL_WHOAMI_A)); 2296 + u32 pf = 0; 2297 + 2298 + if (csio_is_t5(hw->pdev->device & CSIO_HW_CHIP_MASK)) 2299 + pf = SOURCEPF_G(csio_rd_reg32(hw, PL_WHOAMI_A)); 2300 + else 2301 + pf = T6_SOURCEPF_G(csio_rd_reg32(hw, PL_WHOAMI_A)); 2332 2302 2333 2303 if (!(hw->flags & CSIO_HWF_HW_INTR_ENABLED)) 2334 2304 return; ··· 2958 2918 */ 2959 2919 static void csio_le_intr_handler(struct csio_hw *hw) 2960 2920 { 2921 + enum chip_type chip = CHELSIO_CHIP_VERSION(hw->chip_id); 2922 + 2961 2923 static struct intr_info le_intr_info[] = { 2962 2924 { LIPMISS_F, "LE LIP miss", -1, 0 }, 2963 2925 { LIP0_F, "LE 0 LIP error", -1, 0 }, ··· 2969 2927 { 0, NULL, 0, 0 } 2970 2928 }; 2971 2929 2972 - if (csio_handle_intr_status(hw, LE_DB_INT_CAUSE_A, le_intr_info)) 2930 + static struct intr_info t6_le_intr_info[] = { 2931 + { T6_LIPMISS_F, "LE LIP miss", -1, 0 }, 2932 + { T6_LIP0_F, "LE 0 LIP error", -1, 0 }, 2933 + { TCAMINTPERR_F, "LE parity error", -1, 1 }, 2934 + { T6_UNKNOWNCMD_F, "LE unknown command", -1, 1 }, 2935 + { SSRAMINTPERR_F, "LE request queue parity error", -1, 1 }, 2936 + { 0, NULL, 0, 0 } 2937 + }; 2938 + 2939 + if (csio_handle_intr_status(hw, LE_DB_INT_CAUSE_A, 2940 + (chip == CHELSIO_T5) ? 2941 + le_intr_info : t6_le_intr_info)) 2973 2942 csio_hw_fatal_err(hw); 2974 2943 } 2975 2944
+14
drivers/scsi/csiostor/csio_hw_chip.h
··· 39 39 /* Define MACRO values */ 40 40 #define CSIO_HW_T5 0x5000 41 41 #define CSIO_T5_FCOE_ASIC 0x5600 42 + #define CSIO_HW_T6 0x6000 43 + #define CSIO_T6_FCOE_ASIC 0x6600 42 44 #define CSIO_HW_CHIP_MASK 0xF000 43 45 44 46 #define T5_REGMAP_SIZE (332 * 1024) 45 47 #define FW_FNAME_T5 "cxgb4/t5fw.bin" 46 48 #define FW_CFG_NAME_T5 "cxgb4/t5-config.txt" 49 + #define FW_FNAME_T6 "cxgb4/t6fw.bin" 50 + #define FW_CFG_NAME_T6 "cxgb4/t6-config.txt" 47 51 48 52 #define CHELSIO_CHIP_CODE(version, revision) (((version) << 4) | (revision)) 49 53 #define CHELSIO_CHIP_FPGA 0x100 ··· 55 51 #define CHELSIO_CHIP_RELEASE(code) ((code) & 0xf) 56 52 57 53 #define CHELSIO_T5 0x5 54 + #define CHELSIO_T6 0x6 58 55 59 56 enum chip_type { 60 57 T5_A0 = CHELSIO_CHIP_CODE(CHELSIO_T5, 0), 61 58 T5_A1 = CHELSIO_CHIP_CODE(CHELSIO_T5, 1), 62 59 T5_FIRST_REV = T5_A0, 63 60 T5_LAST_REV = T5_A1, 61 + 62 + T6_A0 = CHELSIO_CHIP_CODE(CHELSIO_T6, 0), 63 + T6_FIRST_REV = T6_A0, 64 + T6_LAST_REV = T6_A0, 64 65 }; 65 66 66 67 static inline int csio_is_t5(uint16_t chip) 67 68 { 68 69 return (chip == CSIO_HW_T5); 70 + } 71 + 72 + static inline int csio_is_t6(uint16_t chip) 73 + { 74 + return (chip == CSIO_HW_T6); 69 75 } 70 76 71 77 /* Define MACRO DEFINITIONS */
+1 -28
drivers/scsi/csiostor/csio_hw_t5.c
··· 71 71 static void 72 72 csio_t5_pcie_intr_handler(struct csio_hw *hw) 73 73 { 74 - static struct intr_info sysbus_intr_info[] = { 75 - { RNPP_F, "RXNP array parity error", -1, 1 }, 76 - { RPCP_F, "RXPC array parity error", -1, 1 }, 77 - { RCIP_F, "RXCIF array parity error", -1, 1 }, 78 - { RCCP_F, "Rx completions control array parity error", -1, 1 }, 79 - { RFTP_F, "RXFT array parity error", -1, 1 }, 80 - { 0, NULL, 0, 0 } 81 - }; 82 - static struct intr_info pcie_port_intr_info[] = { 83 - { TPCP_F, "TXPC array parity error", -1, 1 }, 84 - { TNPP_F, "TXNP array parity error", -1, 1 }, 85 - { TFTP_F, "TXFT array parity error", -1, 1 }, 86 - { TCAP_F, "TXCA array parity error", -1, 1 }, 87 - { TCIP_F, "TXCIF array parity error", -1, 1 }, 88 - { RCAP_F, "RXCA array parity error", -1, 1 }, 89 - { OTDD_F, "outbound request TLP discarded", -1, 1 }, 90 - { RDPE_F, "Rx data parity error", -1, 1 }, 91 - { TDUE_F, "Tx uncorrectable data error", -1, 1 }, 92 - { 0, NULL, 0, 0 } 93 - }; 94 - 95 74 static struct intr_info pcie_intr_info[] = { 96 75 { MSTGRPPERR_F, "Master Response Read Queue parity error", 97 76 -1, 1 }, ··· 112 133 }; 113 134 114 135 int fat; 115 - fat = csio_handle_intr_status(hw, 116 - PCIE_CORE_UTL_SYSTEM_BUS_AGENT_STATUS_A, 117 - sysbus_intr_info) + 118 - csio_handle_intr_status(hw, 119 - PCIE_CORE_UTL_PCI_EXPRESS_PORT_STATUS_A, 120 - pcie_port_intr_info) + 121 - csio_handle_intr_status(hw, PCIE_INT_CAUSE_A, pcie_intr_info); 136 + fat = csio_handle_intr_status(hw, PCIE_INT_CAUSE_A, pcie_intr_info); 122 137 if (fat) 123 138 csio_hw_fatal_err(hw); 124 139 }
+4 -2
drivers/scsi/csiostor/csio_init.c
··· 952 952 struct csio_hw *hw; 953 953 struct csio_lnode *ln; 954 954 955 - /* probe only T5 cards */ 956 - if (!csio_is_t5((pdev->device & CSIO_HW_CHIP_MASK))) 955 + /* probe only T5 and T6 cards */ 956 + if (!csio_is_t5((pdev->device & CSIO_HW_CHIP_MASK)) && 957 + !csio_is_t6((pdev->device & CSIO_HW_CHIP_MASK))) 957 958 return -ENODEV; 958 959 959 960 rv = csio_pci_init(pdev, &bars); ··· 1254 1253 MODULE_DEVICE_TABLE(pci, csio_pci_tbl); 1255 1254 MODULE_VERSION(CSIO_DRV_VERSION); 1256 1255 MODULE_FIRMWARE(FW_FNAME_T5); 1256 + MODULE_FIRMWARE(FW_FNAME_T6);
+3 -1
drivers/scsi/csiostor/csio_wr.c
··· 480 480 481 481 flq_idx = csio_q_iq_flq_idx(hw, iq_idx); 482 482 if (flq_idx != -1) { 483 + enum chip_type chip = CHELSIO_CHIP_VERSION(hw->chip_id); 483 484 struct csio_q *flq = hw->wrm.q_arr[flq_idx]; 484 485 485 486 iqp.fl0paden = 1; 486 487 iqp.fl0packen = flq->un.fl.packen ? 1 : 0; 487 488 iqp.fl0fbmin = X_FETCHBURSTMIN_64B; 488 - iqp.fl0fbmax = X_FETCHBURSTMAX_512B; 489 + iqp.fl0fbmax = ((chip == CHELSIO_T5) ? 490 + X_FETCHBURSTMAX_512B : X_FETCHBURSTMAX_256B); 489 491 iqp.fl0size = csio_q_size(hw, flq_idx) / CSIO_QCREDIT_SZ; 490 492 iqp.fl0addr = csio_q_pstart(hw, flq_idx); 491 493 }