diff options
| author | Dave Olson <dave.olson@qlogic.com> | 2008-01-08 05:36:46 -0500 |
|---|---|---|
| committer | Roland Dreier <rolandd@cisco.com> | 2008-01-25 17:15:45 -0500 |
| commit | c4bce8032ef4368063c84d665b19804878d63e7c (patch) | |
| tree | 29b7e0b7a97747982237a98f634a97d2111d1d8a | |
| parent | 7387273307139ebf8d7f7fb3bb79d1ca48bd71d6 (diff) | |
IB/ipath: Add new chip-specific functions to older chips, consistent init
This adds the new (sometimes empty) chip-specific functions to the older
chips, and makes the initialization and related functions consistent across
all 3 chips.
Signed-off-by: Dave Olson <dave.olson@qlogic.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
| -rw-r--r-- | drivers/infiniband/hw/ipath/ipath_common.h | 10 | ||||
| -rw-r--r-- | drivers/infiniband/hw/ipath/ipath_iba6110.c | 172 | ||||
| -rw-r--r-- | drivers/infiniband/hw/ipath/ipath_iba6120.c | 163 | ||||
| -rw-r--r-- | drivers/infiniband/hw/ipath/ipath_kernel.h | 88 |
4 files changed, 407 insertions, 26 deletions
diff --git a/drivers/infiniband/hw/ipath/ipath_common.h b/drivers/infiniband/hw/ipath/ipath_common.h index aa780e7f2418..0fa43ba25b7e 100644 --- a/drivers/infiniband/hw/ipath/ipath_common.h +++ b/drivers/infiniband/hw/ipath/ipath_common.h | |||
| @@ -82,6 +82,16 @@ | |||
| 82 | #define IPATH_IB_LINK_EXTERNAL 7 /* normal, disable local loopback */ | 82 | #define IPATH_IB_LINK_EXTERNAL 7 /* normal, disable local loopback */ |
| 83 | 83 | ||
| 84 | /* | 84 | /* |
| 85 | * These 3 values (SDR and DDR may be ORed for auto-speed | ||
| 86 | * negotiation) are used for the 3rd argument to path_f_set_ib_cfg | ||
| 87 | * with cmd IPATH_IB_CFG_SPD_ENB, by direct calls or via sysfs. They | ||
| 88 | * are also the the possible values for ipath_link_speed_enabled and active | ||
| 89 | * The values were chosen to match values used within the IB spec. | ||
| 90 | */ | ||
| 91 | #define IPATH_IB_SDR 1 | ||
| 92 | #define IPATH_IB_DDR 2 | ||
| 93 | |||
| 94 | /* | ||
| 85 | * stats maintained by the driver. For now, at least, this is global | 95 | * stats maintained by the driver. For now, at least, this is global |
| 86 | * to all minor devices. | 96 | * to all minor devices. |
| 87 | */ | 97 | */ |
diff --git a/drivers/infiniband/hw/ipath/ipath_iba6110.c b/drivers/infiniband/hw/ipath/ipath_iba6110.c index ac436c630bcc..9e2ced3cdc5e 100644 --- a/drivers/infiniband/hw/ipath/ipath_iba6110.c +++ b/drivers/infiniband/hw/ipath/ipath_iba6110.c | |||
| @@ -329,6 +329,9 @@ static const struct ipath_cregs ipath_ht_cregs = { | |||
| 329 | #define INFINIPATH_HWE_HTAPLL_RFSLIP 0x1000000000000000ULL | 329 | #define INFINIPATH_HWE_HTAPLL_RFSLIP 0x1000000000000000ULL |
| 330 | #define INFINIPATH_HWE_SERDESPLLFAILED 0x2000000000000000ULL | 330 | #define INFINIPATH_HWE_SERDESPLLFAILED 0x2000000000000000ULL |
| 331 | 331 | ||
| 332 | #define IBA6110_IBCS_LINKTRAININGSTATE_MASK 0xf | ||
| 333 | #define IBA6110_IBCS_LINKSTATE_SHIFT 4 | ||
| 334 | |||
| 332 | /* kr_extstatus bits */ | 335 | /* kr_extstatus bits */ |
| 333 | #define INFINIPATH_EXTS_FREQSEL 0x2 | 336 | #define INFINIPATH_EXTS_FREQSEL 0x2 |
| 334 | #define INFINIPATH_EXTS_SERDESSEL 0x4 | 337 | #define INFINIPATH_EXTS_SERDESSEL 0x4 |
| @@ -705,7 +708,6 @@ static int ipath_ht_boardname(struct ipath_devdata *dd, char *name, | |||
| 705 | "with ID %u\n", boardrev); | 708 | "with ID %u\n", boardrev); |
| 706 | snprintf(name, namelen, "Unknown_InfiniPath_QHT7xxx_%u", | 709 | snprintf(name, namelen, "Unknown_InfiniPath_QHT7xxx_%u", |
| 707 | boardrev); | 710 | boardrev); |
| 708 | ret = 1; | ||
| 709 | break; | 711 | break; |
| 710 | } | 712 | } |
| 711 | if (n) | 713 | if (n) |
| @@ -1137,11 +1139,49 @@ static void ipath_setup_ht_setextled(struct ipath_devdata *dd, | |||
| 1137 | 1139 | ||
| 1138 | static void ipath_init_ht_variables(struct ipath_devdata *dd) | 1140 | static void ipath_init_ht_variables(struct ipath_devdata *dd) |
| 1139 | { | 1141 | { |
| 1142 | /* | ||
| 1143 | * setup the register offsets, since they are different for each | ||
| 1144 | * chip | ||
| 1145 | */ | ||
| 1146 | dd->ipath_kregs = &ipath_ht_kregs; | ||
| 1147 | dd->ipath_cregs = &ipath_ht_cregs; | ||
| 1148 | |||
| 1140 | dd->ipath_gpio_sda_num = _IPATH_GPIO_SDA_NUM; | 1149 | dd->ipath_gpio_sda_num = _IPATH_GPIO_SDA_NUM; |
| 1141 | dd->ipath_gpio_scl_num = _IPATH_GPIO_SCL_NUM; | 1150 | dd->ipath_gpio_scl_num = _IPATH_GPIO_SCL_NUM; |
| 1142 | dd->ipath_gpio_sda = IPATH_GPIO_SDA; | 1151 | dd->ipath_gpio_sda = IPATH_GPIO_SDA; |
| 1143 | dd->ipath_gpio_scl = IPATH_GPIO_SCL; | 1152 | dd->ipath_gpio_scl = IPATH_GPIO_SCL; |
| 1144 | 1153 | ||
| 1154 | /* | ||
| 1155 | * Fill in data for field-values that change in newer chips. | ||
| 1156 | * We dynamically specify only the mask for LINKTRAININGSTATE | ||
| 1157 | * and only the shift for LINKSTATE, as they are the only ones | ||
| 1158 | * that change. Also precalculate the 3 link states of interest | ||
| 1159 | * and the combined mask. | ||
| 1160 | */ | ||
| 1161 | dd->ibcs_ls_shift = IBA6110_IBCS_LINKSTATE_SHIFT; | ||
| 1162 | dd->ibcs_lts_mask = IBA6110_IBCS_LINKTRAININGSTATE_MASK; | ||
| 1163 | dd->ibcs_mask = (INFINIPATH_IBCS_LINKSTATE_MASK << | ||
| 1164 | dd->ibcs_ls_shift) | dd->ibcs_lts_mask; | ||
| 1165 | dd->ib_init = (INFINIPATH_IBCS_LT_STATE_LINKUP << | ||
| 1166 | INFINIPATH_IBCS_LINKTRAININGSTATE_SHIFT) | | ||
| 1167 | (INFINIPATH_IBCS_L_STATE_INIT << dd->ibcs_ls_shift); | ||
| 1168 | dd->ib_arm = (INFINIPATH_IBCS_LT_STATE_LINKUP << | ||
| 1169 | INFINIPATH_IBCS_LINKTRAININGSTATE_SHIFT) | | ||
| 1170 | (INFINIPATH_IBCS_L_STATE_ARM << dd->ibcs_ls_shift); | ||
| 1171 | dd->ib_active = (INFINIPATH_IBCS_LT_STATE_LINKUP << | ||
| 1172 | INFINIPATH_IBCS_LINKTRAININGSTATE_SHIFT) | | ||
| 1173 | (INFINIPATH_IBCS_L_STATE_ACTIVE << dd->ibcs_ls_shift); | ||
| 1174 | |||
| 1175 | /* | ||
| 1176 | * Fill in data for ibcc field-values that change in newer chips. | ||
| 1177 | * We dynamically specify only the mask for LINKINITCMD | ||
| 1178 | * and only the shift for LINKCMD and MAXPKTLEN, as they are | ||
| 1179 | * the only ones that change. | ||
| 1180 | */ | ||
| 1181 | dd->ibcc_lic_mask = INFINIPATH_IBCC_LINKINITCMD_MASK; | ||
| 1182 | dd->ibcc_lc_shift = INFINIPATH_IBCC_LINKCMD_SHIFT; | ||
| 1183 | dd->ibcc_mpl_shift = INFINIPATH_IBCC_MAXPKTLEN_SHIFT; | ||
| 1184 | |||
| 1145 | /* Fill in shifts for RcvCtrl. */ | 1185 | /* Fill in shifts for RcvCtrl. */ |
| 1146 | dd->ipath_r_portenable_shift = INFINIPATH_R_PORTENABLE_SHIFT; | 1186 | dd->ipath_r_portenable_shift = INFINIPATH_R_PORTENABLE_SHIFT; |
| 1147 | dd->ipath_r_intravail_shift = INFINIPATH_R_INTRAVAIL_SHIFT; | 1187 | dd->ipath_r_intravail_shift = INFINIPATH_R_INTRAVAIL_SHIFT; |
| @@ -1204,6 +1244,8 @@ static void ipath_init_ht_variables(struct ipath_devdata *dd) | |||
| 1204 | 1244 | ||
| 1205 | dd->ipath_i_rcvavail_mask = INFINIPATH_I_RCVAVAIL_MASK; | 1245 | dd->ipath_i_rcvavail_mask = INFINIPATH_I_RCVAVAIL_MASK; |
| 1206 | dd->ipath_i_rcvurg_mask = INFINIPATH_I_RCVURG_MASK; | 1246 | dd->ipath_i_rcvurg_mask = INFINIPATH_I_RCVURG_MASK; |
| 1247 | dd->ipath_i_rcvavail_shift = INFINIPATH_I_RCVAVAIL_SHIFT; | ||
| 1248 | dd->ipath_i_rcvurg_shift = INFINIPATH_I_RCVURG_SHIFT; | ||
| 1207 | 1249 | ||
| 1208 | /* | 1250 | /* |
| 1209 | * EEPROM error log 0 is TXE Parity errors. 1 is RXE Parity. | 1251 | * EEPROM error log 0 is TXE Parity errors. 1 is RXE Parity. |
| @@ -1217,9 +1259,17 @@ static void ipath_init_ht_variables(struct ipath_devdata *dd) | |||
| 1217 | INFINIPATH_HWE_RXEMEMPARITYERR_MASK << | 1259 | INFINIPATH_HWE_RXEMEMPARITYERR_MASK << |
| 1218 | INFINIPATH_HWE_RXEMEMPARITYERR_SHIFT; | 1260 | INFINIPATH_HWE_RXEMEMPARITYERR_SHIFT; |
| 1219 | 1261 | ||
| 1220 | dd->ipath_eep_st_masks[2].errs_to_log = | 1262 | dd->ipath_eep_st_masks[2].errs_to_log = INFINIPATH_E_RESET; |
| 1221 | INFINIPATH_E_INVALIDADDR | INFINIPATH_E_RESET; | ||
| 1222 | 1263 | ||
| 1264 | dd->delay_mult = 2; /* SDR, 4X, can't change */ | ||
| 1265 | |||
| 1266 | dd->ipath_link_width_supported = IB_WIDTH_1X | IB_WIDTH_4X; | ||
| 1267 | dd->ipath_link_speed_supported = IPATH_IB_SDR; | ||
| 1268 | dd->ipath_link_width_enabled = IB_WIDTH_4X; | ||
| 1269 | dd->ipath_link_speed_enabled = dd->ipath_link_speed_supported; | ||
| 1270 | /* these can't change for this chip, so set once */ | ||
| 1271 | dd->ipath_link_width_active = dd->ipath_link_width_enabled; | ||
| 1272 | dd->ipath_link_speed_active = dd->ipath_link_speed_enabled; | ||
| 1223 | } | 1273 | } |
| 1224 | 1274 | ||
| 1225 | /** | 1275 | /** |
| @@ -1281,6 +1331,9 @@ static void ipath_ht_init_hwerrors(struct ipath_devdata *dd) | |||
| 1281 | dd->ipath_hwerrmask = val; | 1331 | dd->ipath_hwerrmask = val; |
| 1282 | } | 1332 | } |
| 1283 | 1333 | ||
| 1334 | |||
| 1335 | |||
| 1336 | |||
| 1284 | /** | 1337 | /** |
| 1285 | * ipath_ht_bringup_serdes - bring up the serdes | 1338 | * ipath_ht_bringup_serdes - bring up the serdes |
| 1286 | * @dd: the infinipath device | 1339 | * @dd: the infinipath device |
| @@ -1439,6 +1492,7 @@ static void ipath_ht_put_tid(struct ipath_devdata *dd, | |||
| 1439 | pa |= lenvalid | INFINIPATH_RT_VALID; | 1492 | pa |= lenvalid | INFINIPATH_RT_VALID; |
| 1440 | } | 1493 | } |
| 1441 | } | 1494 | } |
| 1495 | |||
| 1442 | writeq(pa, tidptr); | 1496 | writeq(pa, tidptr); |
| 1443 | } | 1497 | } |
| 1444 | 1498 | ||
| @@ -1644,6 +1698,13 @@ static void ipath_ht_free_irq(struct ipath_devdata *dd) | |||
| 1644 | dd->ipath_intconfig = 0; | 1698 | dd->ipath_intconfig = 0; |
| 1645 | } | 1699 | } |
| 1646 | 1700 | ||
| 1701 | static struct ipath_message_header * | ||
| 1702 | ipath_ht_get_msgheader(struct ipath_devdata *dd, __le32 *rhf_addr) | ||
| 1703 | { | ||
| 1704 | return (struct ipath_message_header *) | ||
| 1705 | &rhf_addr[sizeof(u64) / sizeof(u32)]; | ||
| 1706 | } | ||
| 1707 | |||
| 1647 | static void ipath_ht_config_ports(struct ipath_devdata *dd, ushort cfgports) | 1708 | static void ipath_ht_config_ports(struct ipath_devdata *dd, ushort cfgports) |
| 1648 | { | 1709 | { |
| 1649 | dd->ipath_portcnt = | 1710 | dd->ipath_portcnt = |
| @@ -1757,6 +1818,90 @@ static void ipath_ht_read_counters(struct ipath_devdata *dd, | |||
| 1757 | cntrs->RxDlidFltrCnt = 0; | 1818 | cntrs->RxDlidFltrCnt = 0; |
| 1758 | } | 1819 | } |
| 1759 | 1820 | ||
| 1821 | |||
| 1822 | /* no interrupt fallback for these chips */ | ||
| 1823 | static int ipath_ht_nointr_fallback(struct ipath_devdata *dd) | ||
| 1824 | { | ||
| 1825 | return 0; | ||
| 1826 | } | ||
| 1827 | |||
| 1828 | |||
| 1829 | /* | ||
| 1830 | * reset the XGXS (between serdes and IBC). Slightly less intrusive | ||
| 1831 | * than resetting the IBC or external link state, and useful in some | ||
| 1832 | * cases to cause some retraining. To do this right, we reset IBC | ||
| 1833 | * as well. | ||
| 1834 | */ | ||
| 1835 | static void ipath_ht_xgxs_reset(struct ipath_devdata *dd) | ||
| 1836 | { | ||
| 1837 | u64 val, prev_val; | ||
| 1838 | |||
| 1839 | prev_val = ipath_read_kreg64(dd, dd->ipath_kregs->kr_xgxsconfig); | ||
| 1840 | val = prev_val | INFINIPATH_XGXS_RESET; | ||
| 1841 | prev_val &= ~INFINIPATH_XGXS_RESET; /* be sure */ | ||
| 1842 | ipath_write_kreg(dd, dd->ipath_kregs->kr_control, | ||
| 1843 | dd->ipath_control & ~INFINIPATH_C_LINKENABLE); | ||
| 1844 | ipath_write_kreg(dd, dd->ipath_kregs->kr_xgxsconfig, val); | ||
| 1845 | ipath_read_kreg32(dd, dd->ipath_kregs->kr_scratch); | ||
| 1846 | ipath_write_kreg(dd, dd->ipath_kregs->kr_xgxsconfig, prev_val); | ||
| 1847 | ipath_write_kreg(dd, dd->ipath_kregs->kr_control, | ||
| 1848 | dd->ipath_control); | ||
| 1849 | } | ||
| 1850 | |||
| 1851 | |||
| 1852 | static int ipath_ht_get_ib_cfg(struct ipath_devdata *dd, int which) | ||
| 1853 | { | ||
| 1854 | int ret; | ||
| 1855 | |||
| 1856 | switch (which) { | ||
| 1857 | case IPATH_IB_CFG_LWID: | ||
| 1858 | ret = dd->ipath_link_width_active; | ||
| 1859 | break; | ||
| 1860 | case IPATH_IB_CFG_SPD: | ||
| 1861 | ret = dd->ipath_link_speed_active; | ||
| 1862 | break; | ||
| 1863 | case IPATH_IB_CFG_LWID_ENB: | ||
| 1864 | ret = dd->ipath_link_width_enabled; | ||
| 1865 | break; | ||
| 1866 | case IPATH_IB_CFG_SPD_ENB: | ||
| 1867 | ret = dd->ipath_link_speed_enabled; | ||
| 1868 | break; | ||
| 1869 | default: | ||
| 1870 | ret = -ENOTSUPP; | ||
| 1871 | break; | ||
| 1872 | } | ||
| 1873 | return ret; | ||
| 1874 | } | ||
| 1875 | |||
| 1876 | |||
| 1877 | /* we assume range checking is already done, if needed */ | ||
| 1878 | static int ipath_ht_set_ib_cfg(struct ipath_devdata *dd, int which, u32 val) | ||
| 1879 | { | ||
| 1880 | int ret = 0; | ||
| 1881 | |||
| 1882 | if (which == IPATH_IB_CFG_LWID_ENB) | ||
| 1883 | dd->ipath_link_width_enabled = val; | ||
| 1884 | else if (which == IPATH_IB_CFG_SPD_ENB) | ||
| 1885 | dd->ipath_link_speed_enabled = val; | ||
| 1886 | else | ||
| 1887 | ret = -ENOTSUPP; | ||
| 1888 | return ret; | ||
| 1889 | } | ||
| 1890 | |||
| 1891 | |||
| 1892 | static void ipath_ht_config_jint(struct ipath_devdata *dd, u16 a, u16 b) | ||
| 1893 | { | ||
| 1894 | } | ||
| 1895 | |||
| 1896 | |||
| 1897 | static int ipath_ht_ib_updown(struct ipath_devdata *dd, int ibup, u64 ibcs) | ||
| 1898 | { | ||
| 1899 | ipath_setup_ht_setextled(dd, ipath_ib_linkstate(dd, ibcs), | ||
| 1900 | ipath_ib_linktrstate(dd, ibcs)); | ||
| 1901 | return 0; | ||
| 1902 | } | ||
| 1903 | |||
| 1904 | |||
| 1760 | /** | 1905 | /** |
| 1761 | * ipath_init_iba6110_funcs - set up the chip-specific function pointers | 1906 | * ipath_init_iba6110_funcs - set up the chip-specific function pointers |
| 1762 | * @dd: the infinipath device | 1907 | * @dd: the infinipath device |
| @@ -1781,24 +1926,19 @@ void ipath_init_iba6110_funcs(struct ipath_devdata *dd) | |||
| 1781 | dd->ipath_f_setextled = ipath_setup_ht_setextled; | 1926 | dd->ipath_f_setextled = ipath_setup_ht_setextled; |
| 1782 | dd->ipath_f_get_base_info = ipath_ht_get_base_info; | 1927 | dd->ipath_f_get_base_info = ipath_ht_get_base_info; |
| 1783 | dd->ipath_f_free_irq = ipath_ht_free_irq; | 1928 | dd->ipath_f_free_irq = ipath_ht_free_irq; |
| 1929 | dd->ipath_f_tidtemplate = ipath_ht_tidtemplate; | ||
| 1930 | dd->ipath_f_intr_fallback = ipath_ht_nointr_fallback; | ||
| 1931 | dd->ipath_f_get_msgheader = ipath_ht_get_msgheader; | ||
| 1784 | dd->ipath_f_config_ports = ipath_ht_config_ports; | 1932 | dd->ipath_f_config_ports = ipath_ht_config_ports; |
| 1785 | dd->ipath_f_read_counters = ipath_ht_read_counters; | 1933 | dd->ipath_f_read_counters = ipath_ht_read_counters; |
| 1934 | dd->ipath_f_xgxs_reset = ipath_ht_xgxs_reset; | ||
| 1935 | dd->ipath_f_get_ib_cfg = ipath_ht_get_ib_cfg; | ||
| 1936 | dd->ipath_f_set_ib_cfg = ipath_ht_set_ib_cfg; | ||
| 1937 | dd->ipath_f_config_jint = ipath_ht_config_jint; | ||
| 1938 | dd->ipath_f_ib_updown = ipath_ht_ib_updown; | ||
| 1786 | 1939 | ||
| 1787 | /* | 1940 | /* |
| 1788 | * initialize chip-specific variables | 1941 | * initialize chip-specific variables |
| 1789 | */ | 1942 | */ |
| 1790 | dd->ipath_f_tidtemplate = ipath_ht_tidtemplate; | ||
| 1791 | |||
| 1792 | /* | ||
| 1793 | * setup the register offsets, since they are different for each | ||
| 1794 | * chip | ||
| 1795 | */ | ||
| 1796 | dd->ipath_kregs = &ipath_ht_kregs; | ||
| 1797 | dd->ipath_cregs = &ipath_ht_cregs; | ||
| 1798 | |||
| 1799 | /* | ||
| 1800 | * do very early init that is needed before ipath_f_bus is | ||
| 1801 | * called | ||
| 1802 | */ | ||
| 1803 | ipath_init_ht_variables(dd); | 1943 | ipath_init_ht_variables(dd); |
| 1804 | } | 1944 | } |
diff --git a/drivers/infiniband/hw/ipath/ipath_iba6120.c b/drivers/infiniband/hw/ipath/ipath_iba6120.c index 57915fd718e2..597192e912de 100644 --- a/drivers/infiniband/hw/ipath/ipath_iba6120.c +++ b/drivers/infiniband/hw/ipath/ipath_iba6120.c | |||
| @@ -329,6 +329,9 @@ static const struct ipath_cregs ipath_pe_cregs = { | |||
| 329 | #define INFINIPATH_HWE_PCIE0PLLFAILED 0x0800000000000000ULL | 329 | #define INFINIPATH_HWE_PCIE0PLLFAILED 0x0800000000000000ULL |
| 330 | #define INFINIPATH_HWE_SERDESPLLFAILED 0x1000000000000000ULL | 330 | #define INFINIPATH_HWE_SERDESPLLFAILED 0x1000000000000000ULL |
| 331 | 331 | ||
| 332 | #define IBA6120_IBCS_LINKTRAININGSTATE_MASK 0xf | ||
| 333 | #define IBA6120_IBCS_LINKSTATE_SHIFT 4 | ||
| 334 | |||
| 332 | /* kr_extstatus bits */ | 335 | /* kr_extstatus bits */ |
| 333 | #define INFINIPATH_EXTS_FREQSEL 0x2 | 336 | #define INFINIPATH_EXTS_FREQSEL 0x2 |
| 334 | #define INFINIPATH_EXTS_SERDESSEL 0x4 | 337 | #define INFINIPATH_EXTS_SERDESSEL 0x4 |
| @@ -936,12 +939,27 @@ static int ipath_setup_pe_config(struct ipath_devdata *dd, | |||
| 936 | else | 939 | else |
| 937 | ipath_dev_err(dd, "Can't find PCI Express " | 940 | ipath_dev_err(dd, "Can't find PCI Express " |
| 938 | "capability!\n"); | 941 | "capability!\n"); |
| 942 | |||
| 943 | dd->ipath_link_width_supported = IB_WIDTH_1X | IB_WIDTH_4X; | ||
| 944 | dd->ipath_link_speed_supported = IPATH_IB_SDR; | ||
| 945 | dd->ipath_link_width_enabled = IB_WIDTH_4X; | ||
| 946 | dd->ipath_link_speed_enabled = dd->ipath_link_speed_supported; | ||
| 947 | /* these can't change for this chip, so set once */ | ||
| 948 | dd->ipath_link_width_active = dd->ipath_link_width_enabled; | ||
| 949 | dd->ipath_link_speed_active = dd->ipath_link_speed_enabled; | ||
| 939 | return 0; | 950 | return 0; |
| 940 | } | 951 | } |
| 941 | 952 | ||
| 942 | static void ipath_init_pe_variables(struct ipath_devdata *dd) | 953 | static void ipath_init_pe_variables(struct ipath_devdata *dd) |
| 943 | { | 954 | { |
| 944 | /* | 955 | /* |
| 956 | * setup the register offsets, since they are different for each | ||
| 957 | * chip | ||
| 958 | */ | ||
| 959 | dd->ipath_kregs = &ipath_pe_kregs; | ||
| 960 | dd->ipath_cregs = &ipath_pe_cregs; | ||
| 961 | |||
| 962 | /* | ||
| 945 | * bits for selecting i2c direction and values, | 963 | * bits for selecting i2c direction and values, |
| 946 | * used for I2C serial flash | 964 | * used for I2C serial flash |
| 947 | */ | 965 | */ |
| @@ -950,6 +968,37 @@ static void ipath_init_pe_variables(struct ipath_devdata *dd) | |||
| 950 | dd->ipath_gpio_sda = IPATH_GPIO_SDA; | 968 | dd->ipath_gpio_sda = IPATH_GPIO_SDA; |
| 951 | dd->ipath_gpio_scl = IPATH_GPIO_SCL; | 969 | dd->ipath_gpio_scl = IPATH_GPIO_SCL; |
| 952 | 970 | ||
| 971 | /* | ||
| 972 | * Fill in data for field-values that change in newer chips. | ||
| 973 | * We dynamically specify only the mask for LINKTRAININGSTATE | ||
| 974 | * and only the shift for LINKSTATE, as they are the only ones | ||
| 975 | * that change. Also precalculate the 3 link states of interest | ||
| 976 | * and the combined mask. | ||
| 977 | */ | ||
| 978 | dd->ibcs_ls_shift = IBA6120_IBCS_LINKSTATE_SHIFT; | ||
| 979 | dd->ibcs_lts_mask = IBA6120_IBCS_LINKTRAININGSTATE_MASK; | ||
| 980 | dd->ibcs_mask = (INFINIPATH_IBCS_LINKSTATE_MASK << | ||
| 981 | dd->ibcs_ls_shift) | dd->ibcs_lts_mask; | ||
| 982 | dd->ib_init = (INFINIPATH_IBCS_LT_STATE_LINKUP << | ||
| 983 | INFINIPATH_IBCS_LINKTRAININGSTATE_SHIFT) | | ||
| 984 | (INFINIPATH_IBCS_L_STATE_INIT << dd->ibcs_ls_shift); | ||
| 985 | dd->ib_arm = (INFINIPATH_IBCS_LT_STATE_LINKUP << | ||
| 986 | INFINIPATH_IBCS_LINKTRAININGSTATE_SHIFT) | | ||
| 987 | (INFINIPATH_IBCS_L_STATE_ARM << dd->ibcs_ls_shift); | ||
| 988 | dd->ib_active = (INFINIPATH_IBCS_LT_STATE_LINKUP << | ||
| 989 | INFINIPATH_IBCS_LINKTRAININGSTATE_SHIFT) | | ||
| 990 | (INFINIPATH_IBCS_L_STATE_ACTIVE << dd->ibcs_ls_shift); | ||
| 991 | |||
| 992 | /* | ||
| 993 | * Fill in data for ibcc field-values that change in newer chips. | ||
| 994 | * We dynamically specify only the mask for LINKINITCMD | ||
| 995 | * and only the shift for LINKCMD and MAXPKTLEN, as they are | ||
| 996 | * the only ones that change. | ||
| 997 | */ | ||
| 998 | dd->ibcc_lic_mask = INFINIPATH_IBCC_LINKINITCMD_MASK; | ||
| 999 | dd->ibcc_lc_shift = INFINIPATH_IBCC_LINKCMD_SHIFT; | ||
| 1000 | dd->ibcc_mpl_shift = INFINIPATH_IBCC_MAXPKTLEN_SHIFT; | ||
| 1001 | |||
| 953 | /* Fill in shifts for RcvCtrl. */ | 1002 | /* Fill in shifts for RcvCtrl. */ |
| 954 | dd->ipath_r_portenable_shift = INFINIPATH_R_PORTENABLE_SHIFT; | 1003 | dd->ipath_r_portenable_shift = INFINIPATH_R_PORTENABLE_SHIFT; |
| 955 | dd->ipath_r_intravail_shift = INFINIPATH_R_INTRAVAIL_SHIFT; | 1004 | dd->ipath_r_intravail_shift = INFINIPATH_R_INTRAVAIL_SHIFT; |
| @@ -1003,6 +1052,8 @@ static void ipath_init_pe_variables(struct ipath_devdata *dd) | |||
| 1003 | 1052 | ||
| 1004 | dd->ipath_i_rcvavail_mask = INFINIPATH_I_RCVAVAIL_MASK; | 1053 | dd->ipath_i_rcvavail_mask = INFINIPATH_I_RCVAVAIL_MASK; |
| 1005 | dd->ipath_i_rcvurg_mask = INFINIPATH_I_RCVURG_MASK; | 1054 | dd->ipath_i_rcvurg_mask = INFINIPATH_I_RCVURG_MASK; |
| 1055 | dd->ipath_i_rcvavail_shift = INFINIPATH_I_RCVAVAIL_SHIFT; | ||
| 1056 | dd->ipath_i_rcvurg_shift = INFINIPATH_I_RCVURG_SHIFT; | ||
| 1006 | 1057 | ||
| 1007 | /* | 1058 | /* |
| 1008 | * EEPROM error log 0 is TXE Parity errors. 1 is RXE Parity. | 1059 | * EEPROM error log 0 is TXE Parity errors. 1 is RXE Parity. |
| @@ -1024,6 +1075,7 @@ static void ipath_init_pe_variables(struct ipath_devdata *dd) | |||
| 1024 | INFINIPATH_E_INVALIDADDR | INFINIPATH_E_RESET; | 1075 | INFINIPATH_E_INVALIDADDR | INFINIPATH_E_RESET; |
| 1025 | 1076 | ||
| 1026 | 1077 | ||
| 1078 | dd->delay_mult = 2; /* SDR, 4X, can't change */ | ||
| 1027 | } | 1079 | } |
| 1028 | 1080 | ||
| 1029 | /* setup the MSI stuff again after a reset. I'd like to just call | 1081 | /* setup the MSI stuff again after a reset. I'd like to just call |
| @@ -1329,6 +1381,9 @@ static int ipath_pe_early_init(struct ipath_devdata *dd) | |||
| 1329 | */ | 1381 | */ |
| 1330 | dd->ipath_rcvhdrentsize = 24; | 1382 | dd->ipath_rcvhdrentsize = 24; |
| 1331 | dd->ipath_rcvhdrsize = IPATH_DFLT_RCVHDRSIZE; | 1383 | dd->ipath_rcvhdrsize = IPATH_DFLT_RCVHDRSIZE; |
| 1384 | dd->ipath_rhf_offset = 0; | ||
| 1385 | dd->ipath_egrtidbase = (u64 __iomem *) | ||
| 1386 | ((char __iomem *) dd->ipath_kregbase + dd->ipath_rcvegrbase); | ||
| 1332 | 1387 | ||
| 1333 | /* | 1388 | /* |
| 1334 | * To truly support a 4KB MTU (for usermode), we need to | 1389 | * To truly support a 4KB MTU (for usermode), we need to |
| @@ -1399,6 +1454,14 @@ static void ipath_pe_free_irq(struct ipath_devdata *dd) | |||
| 1399 | dd->ipath_irq = 0; | 1454 | dd->ipath_irq = 0; |
| 1400 | } | 1455 | } |
| 1401 | 1456 | ||
| 1457 | |||
| 1458 | static struct ipath_message_header * | ||
| 1459 | ipath_pe_get_msgheader(struct ipath_devdata *dd, __le32 *rhf_addr) | ||
| 1460 | { | ||
| 1461 | return (struct ipath_message_header *) | ||
| 1462 | &rhf_addr[sizeof(u64) / sizeof(u32)]; | ||
| 1463 | } | ||
| 1464 | |||
| 1402 | static void ipath_pe_config_ports(struct ipath_devdata *dd, ushort cfgports) | 1465 | static void ipath_pe_config_ports(struct ipath_devdata *dd, ushort cfgports) |
| 1403 | { | 1466 | { |
| 1404 | dd->ipath_portcnt = | 1467 | dd->ipath_portcnt = |
| @@ -1534,6 +1597,88 @@ static int ipath_pe_txe_recover(struct ipath_devdata *dd) | |||
| 1534 | return 1; | 1597 | return 1; |
| 1535 | } | 1598 | } |
| 1536 | 1599 | ||
| 1600 | /* no interrupt fallback for these chips */ | ||
| 1601 | static int ipath_pe_nointr_fallback(struct ipath_devdata *dd) | ||
| 1602 | { | ||
| 1603 | return 0; | ||
| 1604 | } | ||
| 1605 | |||
| 1606 | |||
| 1607 | /* | ||
| 1608 | * reset the XGXS (between serdes and IBC). Slightly less intrusive | ||
| 1609 | * than resetting the IBC or external link state, and useful in some | ||
| 1610 | * cases to cause some retraining. To do this right, we reset IBC | ||
| 1611 | * as well. | ||
| 1612 | */ | ||
| 1613 | static void ipath_pe_xgxs_reset(struct ipath_devdata *dd) | ||
| 1614 | { | ||
| 1615 | u64 val, prev_val; | ||
| 1616 | |||
| 1617 | prev_val = ipath_read_kreg64(dd, dd->ipath_kregs->kr_xgxsconfig); | ||
| 1618 | val = prev_val | INFINIPATH_XGXS_RESET; | ||
| 1619 | prev_val &= ~INFINIPATH_XGXS_RESET; /* be sure */ | ||
| 1620 | ipath_write_kreg(dd, dd->ipath_kregs->kr_control, | ||
| 1621 | dd->ipath_control & ~INFINIPATH_C_LINKENABLE); | ||
| 1622 | ipath_write_kreg(dd, dd->ipath_kregs->kr_xgxsconfig, val); | ||
| 1623 | ipath_read_kreg32(dd, dd->ipath_kregs->kr_scratch); | ||
| 1624 | ipath_write_kreg(dd, dd->ipath_kregs->kr_xgxsconfig, prev_val); | ||
| 1625 | ipath_write_kreg(dd, dd->ipath_kregs->kr_control, | ||
| 1626 | dd->ipath_control); | ||
| 1627 | } | ||
| 1628 | |||
| 1629 | |||
| 1630 | static int ipath_pe_get_ib_cfg(struct ipath_devdata *dd, int which) | ||
| 1631 | { | ||
| 1632 | int ret; | ||
| 1633 | |||
| 1634 | switch (which) { | ||
| 1635 | case IPATH_IB_CFG_LWID: | ||
| 1636 | ret = dd->ipath_link_width_active; | ||
| 1637 | break; | ||
| 1638 | case IPATH_IB_CFG_SPD: | ||
| 1639 | ret = dd->ipath_link_speed_active; | ||
| 1640 | break; | ||
| 1641 | case IPATH_IB_CFG_LWID_ENB: | ||
| 1642 | ret = dd->ipath_link_width_enabled; | ||
| 1643 | break; | ||
| 1644 | case IPATH_IB_CFG_SPD_ENB: | ||
| 1645 | ret = dd->ipath_link_speed_enabled; | ||
| 1646 | break; | ||
| 1647 | default: | ||
| 1648 | ret = -ENOTSUPP; | ||
| 1649 | break; | ||
| 1650 | } | ||
| 1651 | return ret; | ||
| 1652 | } | ||
| 1653 | |||
| 1654 | |||
| 1655 | /* we assume range checking is already done, if needed */ | ||
| 1656 | static int ipath_pe_set_ib_cfg(struct ipath_devdata *dd, int which, u32 val) | ||
| 1657 | { | ||
| 1658 | int ret = 0; | ||
| 1659 | |||
| 1660 | if (which == IPATH_IB_CFG_LWID_ENB) | ||
| 1661 | dd->ipath_link_width_enabled = val; | ||
| 1662 | else if (which == IPATH_IB_CFG_SPD_ENB) | ||
| 1663 | dd->ipath_link_speed_enabled = val; | ||
| 1664 | else | ||
| 1665 | ret = -ENOTSUPP; | ||
| 1666 | return ret; | ||
| 1667 | } | ||
| 1668 | |||
| 1669 | static void ipath_pe_config_jint(struct ipath_devdata *dd, u16 a, u16 b) | ||
| 1670 | { | ||
| 1671 | } | ||
| 1672 | |||
| 1673 | |||
| 1674 | static int ipath_pe_ib_updown(struct ipath_devdata *dd, int ibup, u64 ibcs) | ||
| 1675 | { | ||
| 1676 | ipath_setup_pe_setextled(dd, ipath_ib_linkstate(dd, ibcs), | ||
| 1677 | ipath_ib_linktrstate(dd, ibcs)); | ||
| 1678 | return 0; | ||
| 1679 | } | ||
| 1680 | |||
| 1681 | |||
| 1537 | /** | 1682 | /** |
| 1538 | * ipath_init_iba6120_funcs - set up the chip-specific function pointers | 1683 | * ipath_init_iba6120_funcs - set up the chip-specific function pointers |
| 1539 | * @dd: the infinipath device | 1684 | * @dd: the infinipath device |
| @@ -1554,7 +1699,7 @@ void ipath_init_iba6120_funcs(struct ipath_devdata *dd) | |||
| 1554 | dd->ipath_f_bringup_serdes = ipath_pe_bringup_serdes; | 1699 | dd->ipath_f_bringup_serdes = ipath_pe_bringup_serdes; |
| 1555 | dd->ipath_f_clear_tids = ipath_pe_clear_tids; | 1700 | dd->ipath_f_clear_tids = ipath_pe_clear_tids; |
| 1556 | /* | 1701 | /* |
| 1557 | * this may get changed after we read the chip revision, | 1702 | * _f_put_tid may get changed after we read the chip revision, |
| 1558 | * but we start with the safe version for all revs | 1703 | * but we start with the safe version for all revs |
| 1559 | */ | 1704 | */ |
| 1560 | dd->ipath_f_put_tid = ipath_pe_put_tid; | 1705 | dd->ipath_f_put_tid = ipath_pe_put_tid; |
| @@ -1562,19 +1707,19 @@ void ipath_init_iba6120_funcs(struct ipath_devdata *dd) | |||
| 1562 | dd->ipath_f_setextled = ipath_setup_pe_setextled; | 1707 | dd->ipath_f_setextled = ipath_setup_pe_setextled; |
| 1563 | dd->ipath_f_get_base_info = ipath_pe_get_base_info; | 1708 | dd->ipath_f_get_base_info = ipath_pe_get_base_info; |
| 1564 | dd->ipath_f_free_irq = ipath_pe_free_irq; | 1709 | dd->ipath_f_free_irq = ipath_pe_free_irq; |
| 1565 | |||
| 1566 | /* initialize chip-specific variables */ | ||
| 1567 | dd->ipath_f_tidtemplate = ipath_pe_tidtemplate; | 1710 | dd->ipath_f_tidtemplate = ipath_pe_tidtemplate; |
| 1711 | dd->ipath_f_intr_fallback = ipath_pe_nointr_fallback; | ||
| 1712 | dd->ipath_f_xgxs_reset = ipath_pe_xgxs_reset; | ||
| 1713 | dd->ipath_f_get_msgheader = ipath_pe_get_msgheader; | ||
| 1568 | dd->ipath_f_config_ports = ipath_pe_config_ports; | 1714 | dd->ipath_f_config_ports = ipath_pe_config_ports; |
| 1569 | dd->ipath_f_read_counters = ipath_pe_read_counters; | 1715 | dd->ipath_f_read_counters = ipath_pe_read_counters; |
| 1716 | dd->ipath_f_get_ib_cfg = ipath_pe_get_ib_cfg; | ||
| 1717 | dd->ipath_f_set_ib_cfg = ipath_pe_set_ib_cfg; | ||
| 1718 | dd->ipath_f_config_jint = ipath_pe_config_jint; | ||
| 1719 | dd->ipath_f_ib_updown = ipath_pe_ib_updown; | ||
| 1570 | 1720 | ||
| 1571 | /* | ||
| 1572 | * setup the register offsets, since they are different for each | ||
| 1573 | * chip | ||
| 1574 | */ | ||
| 1575 | dd->ipath_kregs = &ipath_pe_kregs; | ||
| 1576 | dd->ipath_cregs = &ipath_pe_cregs; | ||
| 1577 | 1721 | ||
| 1722 | /* initialize chip-specific variables */ | ||
| 1578 | ipath_init_pe_variables(dd); | 1723 | ipath_init_pe_variables(dd); |
| 1579 | } | 1724 | } |
| 1580 | 1725 | ||
diff --git a/drivers/infiniband/hw/ipath/ipath_kernel.h b/drivers/infiniband/hw/ipath/ipath_kernel.h index c0ecda35f2d9..6a5fe0157330 100644 --- a/drivers/infiniband/hw/ipath/ipath_kernel.h +++ b/drivers/infiniband/hw/ipath/ipath_kernel.h | |||
| @@ -191,6 +191,22 @@ struct ipath_skbinfo { | |||
| 191 | dma_addr_t phys; | 191 | dma_addr_t phys; |
| 192 | }; | 192 | }; |
| 193 | 193 | ||
| 194 | /* | ||
| 195 | * Possible IB config parameters for ipath_f_get/set_ib_cfg() | ||
| 196 | */ | ||
| 197 | #define IPATH_IB_CFG_LIDLMC 0 /* Get/set LID (LS16b) and Mask (MS16b) */ | ||
| 198 | #define IPATH_IB_CFG_HRTBT 1 /* Get/set Heartbeat off/enable/auto */ | ||
| 199 | #define IPATH_IB_HRTBT_ON 3 /* Heartbeat enabled, sent every 100msec */ | ||
| 200 | #define IPATH_IB_HRTBT_OFF 0 /* Heartbeat off */ | ||
| 201 | #define IPATH_IB_CFG_LWID_ENB 2 /* Get/set allowed Link-width */ | ||
| 202 | #define IPATH_IB_CFG_LWID 3 /* Get currently active Link-width */ | ||
| 203 | #define IPATH_IB_CFG_SPD_ENB 4 /* Get/set allowed Link speeds */ | ||
| 204 | #define IPATH_IB_CFG_SPD 5 /* Get current Link spd */ | ||
| 205 | #define IPATH_IB_CFG_RXPOL_ENB 6 /* Get/set Auto-RX-polarity enable */ | ||
| 206 | #define IPATH_IB_CFG_LREV_ENB 7 /* Get/set Auto-Lane-reversal enable */ | ||
| 207 | #define IPATH_IB_CFG_LINKLATENCY 8 /* Get Auto-Lane-reversal enable */ | ||
| 208 | |||
| 209 | |||
| 194 | struct ipath_devdata { | 210 | struct ipath_devdata { |
| 195 | struct list_head ipath_list; | 211 | struct list_head ipath_list; |
| 196 | 212 | ||
| @@ -231,6 +247,8 @@ struct ipath_devdata { | |||
| 231 | struct _ipath_layer ipath_layer; | 247 | struct _ipath_layer ipath_layer; |
| 232 | /* setup intr */ | 248 | /* setup intr */ |
| 233 | int (*ipath_f_intrsetup)(struct ipath_devdata *); | 249 | int (*ipath_f_intrsetup)(struct ipath_devdata *); |
| 250 | /* fallback to alternate interrupt type if possible */ | ||
| 251 | int (*ipath_f_intr_fallback)(struct ipath_devdata *); | ||
| 234 | /* setup on-chip bus config */ | 252 | /* setup on-chip bus config */ |
| 235 | int (*ipath_f_bus)(struct ipath_devdata *, struct pci_dev *); | 253 | int (*ipath_f_bus)(struct ipath_devdata *, struct pci_dev *); |
| 236 | /* hard reset chip */ | 254 | /* hard reset chip */ |
| @@ -253,9 +271,18 @@ struct ipath_devdata { | |||
| 253 | int (*ipath_f_get_base_info)(struct ipath_portdata *, void *); | 271 | int (*ipath_f_get_base_info)(struct ipath_portdata *, void *); |
| 254 | /* free irq */ | 272 | /* free irq */ |
| 255 | void (*ipath_f_free_irq)(struct ipath_devdata *); | 273 | void (*ipath_f_free_irq)(struct ipath_devdata *); |
| 274 | struct ipath_message_header *(*ipath_f_get_msgheader) | ||
| 275 | (struct ipath_devdata *, __le32 *); | ||
| 256 | void (*ipath_f_config_ports)(struct ipath_devdata *, ushort); | 276 | void (*ipath_f_config_ports)(struct ipath_devdata *, ushort); |
| 277 | int (*ipath_f_get_ib_cfg)(struct ipath_devdata *, int); | ||
| 278 | int (*ipath_f_set_ib_cfg)(struct ipath_devdata *, int, u32); | ||
| 279 | void (*ipath_f_config_jint)(struct ipath_devdata *, u16 , u16); | ||
| 257 | void (*ipath_f_read_counters)(struct ipath_devdata *, | 280 | void (*ipath_f_read_counters)(struct ipath_devdata *, |
| 258 | struct infinipath_counters *); | 281 | struct infinipath_counters *); |
| 282 | void (*ipath_f_xgxs_reset)(struct ipath_devdata *); | ||
| 283 | /* per chip actions needed for IB Link up/down changes */ | ||
| 284 | int (*ipath_f_ib_updown)(struct ipath_devdata *, int, u64); | ||
| 285 | |||
| 259 | struct ipath_ibdev *verbs_dev; | 286 | struct ipath_ibdev *verbs_dev; |
| 260 | struct timer_list verbs_timer; | 287 | struct timer_list verbs_timer; |
| 261 | /* total dwords sent (summed from counter) */ | 288 | /* total dwords sent (summed from counter) */ |
| @@ -375,6 +402,7 @@ struct ipath_devdata { | |||
| 375 | struct page **ipath_pageshadow; | 402 | struct page **ipath_pageshadow; |
| 376 | /* shadow copy of dma handles for exp tid pages */ | 403 | /* shadow copy of dma handles for exp tid pages */ |
| 377 | dma_addr_t *ipath_physshadow; | 404 | dma_addr_t *ipath_physshadow; |
| 405 | u64 __iomem *ipath_egrtidbase; | ||
| 378 | /* lock to workaround chip bug 9437 */ | 406 | /* lock to workaround chip bug 9437 */ |
| 379 | spinlock_t ipath_tid_lock; | 407 | spinlock_t ipath_tid_lock; |
| 380 | spinlock_t ipath_sendctrl_lock; | 408 | spinlock_t ipath_sendctrl_lock; |
| @@ -565,6 +593,14 @@ struct ipath_devdata { | |||
| 565 | u8 ipath_pci_cacheline; | 593 | u8 ipath_pci_cacheline; |
| 566 | /* LID mask control */ | 594 | /* LID mask control */ |
| 567 | u8 ipath_lmc; | 595 | u8 ipath_lmc; |
| 596 | /* link width supported */ | ||
| 597 | u8 ipath_link_width_supported; | ||
| 598 | /* link speed supported */ | ||
| 599 | u8 ipath_link_speed_supported; | ||
| 600 | u8 ipath_link_width_enabled; | ||
| 601 | u8 ipath_link_speed_enabled; | ||
| 602 | u8 ipath_link_width_active; | ||
| 603 | u8 ipath_link_speed_active; | ||
| 568 | /* Rx Polarity inversion (compensate for ~tx on partner) */ | 604 | /* Rx Polarity inversion (compensate for ~tx on partner) */ |
| 569 | u8 ipath_rx_pol_inv; | 605 | u8 ipath_rx_pol_inv; |
| 570 | 606 | ||
| @@ -599,6 +635,8 @@ struct ipath_devdata { | |||
| 599 | */ | 635 | */ |
| 600 | u32 ipath_i_rcvavail_mask; | 636 | u32 ipath_i_rcvavail_mask; |
| 601 | u32 ipath_i_rcvurg_mask; | 637 | u32 ipath_i_rcvurg_mask; |
| 638 | u16 ipath_i_rcvurg_shift; | ||
| 639 | u16 ipath_i_rcvavail_shift; | ||
| 602 | 640 | ||
| 603 | /* | 641 | /* |
| 604 | * Register bits for selecting i2c direction and values, used for | 642 | * Register bits for selecting i2c direction and values, used for |
| @@ -612,6 +650,29 @@ struct ipath_devdata { | |||
| 612 | /* lock for doing RMW of shadows/regs for ExtCtrl and GPIO */ | 650 | /* lock for doing RMW of shadows/regs for ExtCtrl and GPIO */ |
| 613 | spinlock_t ipath_gpio_lock; | 651 | spinlock_t ipath_gpio_lock; |
| 614 | 652 | ||
| 653 | /* | ||
| 654 | * IB link and linktraining states and masks that vary per chip in | ||
| 655 | * some way. Set at init, to avoid each IB status change interrupt | ||
| 656 | */ | ||
| 657 | u8 ibcs_ls_shift; | ||
| 658 | u8 ibcs_lts_mask; | ||
| 659 | u32 ibcs_mask; | ||
| 660 | u32 ib_init; | ||
| 661 | u32 ib_arm; | ||
| 662 | u32 ib_active; | ||
| 663 | |||
| 664 | u16 ipath_rhf_offset; /* offset of RHF within receive header entry */ | ||
| 665 | |||
| 666 | /* | ||
| 667 | * shift/mask for linkcmd, linkinitcmd, maxpktlen in ibccontol | ||
| 668 | * reg. Changes for IBA7220 | ||
| 669 | */ | ||
| 670 | u8 ibcc_lic_mask; /* LinkInitCmd */ | ||
| 671 | u8 ibcc_lc_shift; /* LinkCmd */ | ||
| 672 | u8 ibcc_mpl_shift; /* Maxpktlen */ | ||
| 673 | |||
| 674 | u8 delay_mult; | ||
| 675 | |||
| 615 | /* used to override LED behavior */ | 676 | /* used to override LED behavior */ |
| 616 | u8 ipath_led_override; /* Substituted for normal value, if non-zero */ | 677 | u8 ipath_led_override; /* Substituted for normal value, if non-zero */ |
| 617 | u16 ipath_led_override_timeoff; /* delta to next timer event */ | 678 | u16 ipath_led_override_timeoff; /* delta to next timer event */ |
| @@ -639,6 +700,10 @@ struct ipath_devdata { | |||
| 639 | * each of the counters to increment. | 700 | * each of the counters to increment. |
| 640 | */ | 701 | */ |
| 641 | struct ipath_eep_log_mask ipath_eep_st_masks[IPATH_EEP_LOG_CNT]; | 702 | struct ipath_eep_log_mask ipath_eep_st_masks[IPATH_EEP_LOG_CNT]; |
| 703 | |||
| 704 | /* interrupt mitigation reload register info */ | ||
| 705 | u16 ipath_jint_idle_ticks; /* idle clock ticks */ | ||
| 706 | u16 ipath_jint_max_packets; /* max packets across all ports */ | ||
| 642 | }; | 707 | }; |
| 643 | 708 | ||
| 644 | /* Private data for file operations */ | 709 | /* Private data for file operations */ |
| @@ -938,6 +1003,27 @@ static inline u64 ipath_read_ireg(const struct ipath_devdata *dd, ipath_kreg r) | |||
| 938 | } | 1003 | } |
| 939 | 1004 | ||
| 940 | /* | 1005 | /* |
| 1006 | * from contents of IBCStatus (or a saved copy), return linkstate | ||
| 1007 | * Report ACTIVE_DEFER as ACTIVE, because we treat them the same | ||
| 1008 | * everywhere, anyway (and should be, for almost all purposes). | ||
| 1009 | */ | ||
| 1010 | static inline u32 ipath_ib_linkstate(struct ipath_devdata *dd, u64 ibcs) | ||
| 1011 | { | ||
| 1012 | u32 state = (u32)(ibcs >> dd->ibcs_ls_shift) & | ||
| 1013 | INFINIPATH_IBCS_LINKSTATE_MASK; | ||
| 1014 | if (state == INFINIPATH_IBCS_L_STATE_ACT_DEFER) | ||
| 1015 | state = INFINIPATH_IBCS_L_STATE_ACTIVE; | ||
| 1016 | return state; | ||
| 1017 | } | ||
| 1018 | |||
| 1019 | /* from contents of IBCStatus (or a saved copy), return linktrainingstate */ | ||
| 1020 | static inline u32 ipath_ib_linktrstate(struct ipath_devdata *dd, u64 ibcs) | ||
| 1021 | { | ||
| 1022 | return (u32)(ibcs >> INFINIPATH_IBCS_LINKTRAININGSTATE_SHIFT) & | ||
| 1023 | dd->ibcs_lts_mask; | ||
| 1024 | } | ||
| 1025 | |||
| 1026 | /* | ||
| 941 | * sysfs interface. | 1027 | * sysfs interface. |
| 942 | */ | 1028 | */ |
| 943 | 1029 | ||
