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 | ||