1 /* SPDX-License-Identifier: BSD-3-Clause
3 * Copyright (c) 2009-2018 Solarflare Communications Inc.
13 #if EFSYS_OPT_VPD || EFSYS_OPT_NVRAM
15 static __checkReturn efx_rc_t
16 siena_nic_get_partn_mask(
18 __out unsigned int *maskp)
21 uint8_t payload[MAX(MC_CMD_NVRAM_TYPES_IN_LEN,
22 MC_CMD_NVRAM_TYPES_OUT_LEN)];
25 (void) memset(payload, 0, sizeof (payload));
26 req.emr_cmd = MC_CMD_NVRAM_TYPES;
27 req.emr_in_buf = payload;
28 req.emr_in_length = MC_CMD_NVRAM_TYPES_IN_LEN;
29 req.emr_out_buf = payload;
30 req.emr_out_length = MC_CMD_NVRAM_TYPES_OUT_LEN;
32 efx_mcdi_execute(enp, &req);
34 if (req.emr_rc != 0) {
39 if (req.emr_out_length_used < MC_CMD_NVRAM_TYPES_OUT_LEN) {
44 *maskp = MCDI_OUT_DWORD(req, NVRAM_TYPES_OUT_TYPES);
51 EFSYS_PROBE1(fail1, efx_rc_t, rc);
56 #endif /* EFSYS_OPT_VPD || EFSYS_OPT_NVRAM */
58 static __checkReturn efx_rc_t
62 efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
64 efx_dword_t capabilities;
66 uint32_t nevq, nrxq, ntxq;
69 /* Siena has a fixed 8Kbyte VI window size */
70 EFX_STATIC_ASSERT(1U << EFX_VI_WINDOW_SHIFT_8K == 8192);
71 encp->enc_vi_window_shift = EFX_VI_WINDOW_SHIFT_8K;
73 /* External port identifier using one-based port numbering */
74 encp->enc_external_port = (uint8_t)enp->en_mcdi.em_emip.emi_port;
76 /* Board configuration */
77 if ((rc = efx_mcdi_get_board_cfg(enp, &board_type,
78 &capabilities, mac_addr)) != 0)
81 EFX_MAC_ADDR_COPY(encp->enc_mac_addr, mac_addr);
83 encp->enc_board_type = board_type;
86 * There is no possibility to determine the number of PFs on Siena
87 * by issuing MCDI request, and it is not an easy task to find the
88 * value based on the board type, so 'enc_hw_pf_count' is set to 1
90 encp->enc_hw_pf_count = 1;
92 /* Additional capabilities */
93 encp->enc_clk_mult = 1;
94 if (EFX_DWORD_FIELD(capabilities, MC_CMD_CAPABILITIES_TURBO)) {
95 enp->en_features |= EFX_FEATURE_TURBO;
97 if (EFX_DWORD_FIELD(capabilities,
98 MC_CMD_CAPABILITIES_TURBO_ACTIVE)) {
99 encp->enc_clk_mult = 2;
103 encp->enc_evq_timer_quantum_ns =
104 EFX_EVQ_SIENA_TIMER_QUANTUM_NS / encp->enc_clk_mult;
105 encp->enc_evq_timer_max_us = (encp->enc_evq_timer_quantum_ns <<
106 FRF_CZ_TC_TIMER_VAL_WIDTH) / 1000;
108 /* When hash header insertion is enabled, Siena inserts 16 bytes */
109 encp->enc_rx_prefix_size = 16;
111 /* Alignment for receive packet DMA buffers */
112 encp->enc_rx_buf_align_start = 1;
113 encp->enc_rx_buf_align_end = 1;
115 /* Alignment for WPTR updates */
116 encp->enc_rx_push_align = 1;
118 /* There is one RSS context per function */
119 encp->enc_rx_scale_max_exclusive_contexts = 1;
121 encp->enc_rx_scale_hash_alg_mask |= (1U << EFX_RX_HASHALG_LFSR);
122 encp->enc_rx_scale_hash_alg_mask |= (1U << EFX_RX_HASHALG_TOEPLITZ);
125 * It is always possible to use port numbers
126 * as the input data for hash computation.
128 encp->enc_rx_scale_l4_hash_supported = B_TRUE;
130 /* There is no support for additional RSS modes */
131 encp->enc_rx_scale_additional_modes_supported = B_FALSE;
133 encp->enc_tx_dma_desc_size_max = EFX_MASK32(FSF_AZ_TX_KER_BYTE_COUNT);
134 /* Fragments must not span 4k boundaries. */
135 encp->enc_tx_dma_desc_boundary = 4096;
137 /* Resource limits */
138 rc = efx_mcdi_get_resource_limits(enp, &nevq, &nrxq, &ntxq);
144 nrxq = EFX_RXQ_LIMIT_TARGET;
145 ntxq = EFX_TXQ_LIMIT_TARGET;
147 encp->enc_evq_limit = nevq;
148 encp->enc_rxq_limit = MIN(EFX_RXQ_LIMIT_TARGET, nrxq);
149 encp->enc_txq_limit = MIN(EFX_TXQ_LIMIT_TARGET, ntxq);
151 encp->enc_txq_max_ndescs = 4096;
153 encp->enc_buftbl_limit = SIENA_SRAM_ROWS -
154 (encp->enc_txq_limit * EFX_TXQ_DC_NDESCS(EFX_TXQ_DC_SIZE)) -
155 (encp->enc_rxq_limit * EFX_RXQ_DC_NDESCS(EFX_RXQ_DC_SIZE));
157 encp->enc_hw_tx_insert_vlan_enabled = B_FALSE;
158 encp->enc_fw_assisted_tso_enabled = B_FALSE;
159 encp->enc_fw_assisted_tso_v2_enabled = B_FALSE;
160 encp->enc_fw_assisted_tso_v2_n_contexts = 0;
161 encp->enc_allow_set_mac_with_installed_filters = B_TRUE;
162 encp->enc_rx_packed_stream_supported = B_FALSE;
163 encp->enc_rx_var_packed_stream_supported = B_FALSE;
164 encp->enc_fw_subvariant_no_tx_csum_supported = B_FALSE;
166 /* Siena supports two 10G ports, and 8 lanes of PCIe Gen2 */
167 encp->enc_required_pcie_bandwidth_mbps = 2 * 10000;
168 encp->enc_max_pcie_link_gen = EFX_PCIE_LINK_SPEED_GEN2;
170 encp->enc_nvram_update_verify_result_supported = B_FALSE;
172 encp->enc_mac_stats_nstats = MC_CMD_MAC_NSTATS;
179 EFSYS_PROBE1(fail1, efx_rc_t, rc);
184 static __checkReturn efx_rc_t
188 #if EFSYS_OPT_PHY_STATS
189 efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
190 #endif /* EFSYS_OPT_PHY_STATS */
193 /* Fill out fields in enp->en_port and enp->en_nic_cfg from MCDI */
194 if ((rc = efx_mcdi_get_phy_cfg(enp)) != 0)
197 #if EFSYS_OPT_PHY_STATS
198 /* Convert the MCDI statistic mask into the EFX_PHY_STAT mask */
199 siena_phy_decode_stats(enp, encp->enc_mcdi_phy_stat_mask,
200 NULL, &encp->enc_phy_stat_mask, NULL);
201 #endif /* EFSYS_OPT_PHY_STATS */
206 EFSYS_PROBE1(fail1, efx_rc_t, rc);
211 #define SIENA_BIU_MAGIC0 0x01234567
212 #define SIENA_BIU_MAGIC1 0xfedcba98
214 static __checkReturn efx_rc_t
222 * Write magic values to scratch registers 0 and 1, then
223 * verify that the values were written correctly. Interleave
224 * the accesses to ensure that the BIU is not just reading
225 * back the cached value that was last written.
227 EFX_POPULATE_OWORD_1(oword, FRF_AZ_DRIVER_DW0, SIENA_BIU_MAGIC0);
228 EFX_BAR_TBL_WRITEO(enp, FR_AZ_DRIVER_REG, 0, &oword, B_TRUE);
230 EFX_POPULATE_OWORD_1(oword, FRF_AZ_DRIVER_DW0, SIENA_BIU_MAGIC1);
231 EFX_BAR_TBL_WRITEO(enp, FR_AZ_DRIVER_REG, 1, &oword, B_TRUE);
233 EFX_BAR_TBL_READO(enp, FR_AZ_DRIVER_REG, 0, &oword, B_TRUE);
234 if (EFX_OWORD_FIELD(oword, FRF_AZ_DRIVER_DW0) != SIENA_BIU_MAGIC0) {
239 EFX_BAR_TBL_READO(enp, FR_AZ_DRIVER_REG, 1, &oword, B_TRUE);
240 if (EFX_OWORD_FIELD(oword, FRF_AZ_DRIVER_DW0) != SIENA_BIU_MAGIC1) {
246 * Perform the same test, with the values swapped. This
247 * ensures that subsequent tests don't start with the correct
248 * values already written into the scratch registers.
250 EFX_POPULATE_OWORD_1(oword, FRF_AZ_DRIVER_DW0, SIENA_BIU_MAGIC1);
251 EFX_BAR_TBL_WRITEO(enp, FR_AZ_DRIVER_REG, 0, &oword, B_TRUE);
253 EFX_POPULATE_OWORD_1(oword, FRF_AZ_DRIVER_DW0, SIENA_BIU_MAGIC0);
254 EFX_BAR_TBL_WRITEO(enp, FR_AZ_DRIVER_REG, 1, &oword, B_TRUE);
256 EFX_BAR_TBL_READO(enp, FR_AZ_DRIVER_REG, 0, &oword, B_TRUE);
257 if (EFX_OWORD_FIELD(oword, FRF_AZ_DRIVER_DW0) != SIENA_BIU_MAGIC1) {
262 EFX_BAR_TBL_READO(enp, FR_AZ_DRIVER_REG, 1, &oword, B_TRUE);
263 if (EFX_OWORD_FIELD(oword, FRF_AZ_DRIVER_DW0) != SIENA_BIU_MAGIC0) {
277 EFSYS_PROBE1(fail1, efx_rc_t, rc);
282 __checkReturn efx_rc_t
286 efx_port_t *epp = &(enp->en_port);
287 efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
288 siena_link_state_t sls;
293 EFSYS_ASSERT3U(enp->en_family, ==, EFX_FAMILY_SIENA);
296 if ((rc = siena_nic_biu_test(enp)) != 0)
299 /* Clear the region register */
300 EFX_POPULATE_OWORD_4(oword,
301 FRF_AZ_ADR_REGION0, 0,
302 FRF_AZ_ADR_REGION1, (1 << 16),
303 FRF_AZ_ADR_REGION2, (2 << 16),
304 FRF_AZ_ADR_REGION3, (3 << 16));
305 EFX_BAR_WRITEO(enp, FR_AZ_ADR_REGION_REG, &oword);
307 /* Read clear any assertion state */
308 if ((rc = efx_mcdi_read_assertion(enp)) != 0)
311 /* Exit the assertion handler */
312 if ((rc = efx_mcdi_exit_assertion_handler(enp)) != 0)
315 /* Wrestle control from the BMC */
316 if ((rc = efx_mcdi_drv_attach(enp, B_TRUE)) != 0)
319 if ((rc = siena_board_cfg(enp)) != 0)
322 if ((rc = siena_phy_cfg(enp)) != 0)
325 /* Obtain the default PHY advertised capabilities */
326 if ((rc = siena_nic_reset(enp)) != 0)
328 if ((rc = siena_phy_get_link(enp, &sls)) != 0)
330 epp->ep_default_adv_cap_mask = sls.sls_adv_cap_mask;
331 epp->ep_adv_cap_mask = sls.sls_adv_cap_mask;
333 #if EFSYS_OPT_VPD || EFSYS_OPT_NVRAM
334 if ((rc = siena_nic_get_partn_mask(enp, &mask)) != 0)
336 enp->en_u.siena.enu_partn_mask = mask;
339 #if EFSYS_OPT_MAC_STATS
340 /* Wipe the MAC statistics */
341 if ((rc = efx_mcdi_mac_stats_clear(enp)) != 0)
345 #if EFSYS_OPT_LOOPBACK
346 if ((rc = efx_mcdi_get_loopback_modes(enp)) != 0)
350 #if EFSYS_OPT_MON_STATS
351 if ((rc = mcdi_mon_cfg_build(enp)) != 0)
355 encp->enc_features = enp->en_features;
359 #if EFSYS_OPT_MON_STATS
363 #if EFSYS_OPT_LOOPBACK
367 #if EFSYS_OPT_MAC_STATS
371 #if EFSYS_OPT_VPD || EFSYS_OPT_NVRAM
390 EFSYS_PROBE1(fail1, efx_rc_t, rc);
395 __checkReturn efx_rc_t
402 EFSYS_ASSERT3U(enp->en_family, ==, EFX_FAMILY_SIENA);
404 /* siena_nic_reset() is called to recover from BADASSERT failures. */
405 if ((rc = efx_mcdi_read_assertion(enp)) != 0)
407 if ((rc = efx_mcdi_exit_assertion_handler(enp)) != 0)
411 * Bug24908: ENTITY_RESET_IN_LEN is non zero but zero may be supplied
412 * for backwards compatibility with PORT_RESET_IN_LEN.
414 EFX_STATIC_ASSERT(MC_CMD_ENTITY_RESET_OUT_LEN == 0);
416 req.emr_cmd = MC_CMD_ENTITY_RESET;
417 req.emr_in_buf = NULL;
418 req.emr_in_length = 0;
419 req.emr_out_buf = NULL;
420 req.emr_out_length = 0;
422 efx_mcdi_execute(enp, &req);
424 if (req.emr_rc != 0) {
436 EFSYS_PROBE1(fail1, efx_rc_t, rc);
448 * RX_INGR_EN is always enabled on Siena, because we rely on
449 * the RX parser to be resiliant to missing SOP/EOP.
451 EFX_BAR_READO(enp, FR_AZ_RX_CFG_REG, &oword);
452 EFX_SET_OWORD_FIELD(oword, FRF_BZ_RX_INGR_EN, 1);
453 EFX_BAR_WRITEO(enp, FR_AZ_RX_CFG_REG, &oword);
455 /* Disable parsing of additional 802.1Q in Q packets */
456 EFX_BAR_READO(enp, FR_AZ_RX_FILTER_CTL_REG, &oword);
457 EFX_SET_OWORD_FIELD(oword, FRF_CZ_RX_FILTER_ALL_VLAN_ETHERTYPES, 0);
458 EFX_BAR_WRITEO(enp, FR_AZ_RX_FILTER_CTL_REG, &oword);
467 EFX_POPULATE_OWORD_1(oword, FRF_CZ_USREV_DIS, 1);
468 EFX_BAR_WRITEO(enp, FR_CZ_USR_EV_CFG, &oword);
471 __checkReturn efx_rc_t
477 EFSYS_ASSERT3U(enp->en_family, ==, EFX_FAMILY_SIENA);
479 /* Enable reporting of some events (e.g. link change) */
480 if ((rc = efx_mcdi_log_ctrl(enp)) != 0)
483 siena_sram_init(enp);
485 /* Configure Siena's RX block */
486 siena_nic_rx_cfg(enp);
488 /* Disable USR_EVents for now */
489 siena_nic_usrev_dis(enp);
491 /* bug17057: Ensure set_link is called */
492 if ((rc = siena_phy_reconfigure(enp)) != 0)
495 enp->en_nic_cfg.enc_mcdi_max_payload_length = MCDI_CTL_SDU_LEN_MAX_V1;
502 EFSYS_PROBE1(fail1, efx_rc_t, rc);
511 _NOTE(ARGUNUSED(enp))
518 #if EFSYS_OPT_MON_STATS
519 mcdi_mon_cfg_free(enp);
520 #endif /* EFSYS_OPT_MON_STATS */
521 (void) efx_mcdi_drv_attach(enp, B_FALSE);
526 static siena_register_set_t __siena_registers[] = {
527 { FR_AZ_ADR_REGION_REG_OFST, 0, 1 },
528 { FR_CZ_USR_EV_CFG_OFST, 0, 1 },
529 { FR_AZ_RX_CFG_REG_OFST, 0, 1 },
530 { FR_AZ_TX_CFG_REG_OFST, 0, 1 },
531 { FR_AZ_TX_RESERVED_REG_OFST, 0, 1 },
532 { FR_AZ_SRM_TX_DC_CFG_REG_OFST, 0, 1 },
533 { FR_AZ_RX_DC_CFG_REG_OFST, 0, 1 },
534 { FR_AZ_RX_DC_PF_WM_REG_OFST, 0, 1 },
535 { FR_AZ_DP_CTRL_REG_OFST, 0, 1 },
536 { FR_BZ_RX_RSS_TKEY_REG_OFST, 0, 1},
537 { FR_CZ_RX_RSS_IPV6_REG1_OFST, 0, 1},
538 { FR_CZ_RX_RSS_IPV6_REG2_OFST, 0, 1},
539 { FR_CZ_RX_RSS_IPV6_REG3_OFST, 0, 1}
542 static const uint32_t __siena_register_masks[] = {
543 0x0003FFFF, 0x0003FFFF, 0x0003FFFF, 0x0003FFFF,
544 0x000103FF, 0x00000000, 0x00000000, 0x00000000,
545 0xFFFFFFFE, 0xFFFFFFFF, 0x0003FFFF, 0x00000000,
546 0x7FFF0037, 0xFFFF8000, 0xFFFFFFFF, 0x03FFFFFF,
547 0xFFFEFE80, 0x1FFFFFFF, 0x020000FE, 0x007FFFFF,
548 0x001FFFFF, 0x00000000, 0x00000000, 0x00000000,
549 0x00000003, 0x00000000, 0x00000000, 0x00000000,
550 0x000003FF, 0x00000000, 0x00000000, 0x00000000,
551 0x00000FFF, 0x00000000, 0x00000000, 0x00000000,
552 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
553 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
554 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
555 0xFFFFFFFF, 0xFFFFFFFF, 0x00000007, 0x00000000
558 static siena_register_set_t __siena_tables[] = {
559 { FR_AZ_RX_FILTER_TBL0_OFST, FR_AZ_RX_FILTER_TBL0_STEP,
560 FR_AZ_RX_FILTER_TBL0_ROWS },
561 { FR_CZ_RX_MAC_FILTER_TBL0_OFST, FR_CZ_RX_MAC_FILTER_TBL0_STEP,
562 FR_CZ_RX_MAC_FILTER_TBL0_ROWS },
563 { FR_AZ_RX_DESC_PTR_TBL_OFST,
564 FR_AZ_RX_DESC_PTR_TBL_STEP, FR_CZ_RX_DESC_PTR_TBL_ROWS },
565 { FR_AZ_TX_DESC_PTR_TBL_OFST,
566 FR_AZ_TX_DESC_PTR_TBL_STEP, FR_CZ_TX_DESC_PTR_TBL_ROWS },
567 { FR_AZ_TIMER_TBL_OFST, FR_AZ_TIMER_TBL_STEP, FR_CZ_TIMER_TBL_ROWS },
568 { FR_CZ_TX_FILTER_TBL0_OFST,
569 FR_CZ_TX_FILTER_TBL0_STEP, FR_CZ_TX_FILTER_TBL0_ROWS },
570 { FR_CZ_TX_MAC_FILTER_TBL0_OFST,
571 FR_CZ_TX_MAC_FILTER_TBL0_STEP, FR_CZ_TX_MAC_FILTER_TBL0_ROWS }
574 static const uint32_t __siena_table_masks[] = {
575 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000003FF,
576 0xFFFF0FFF, 0xFFFFFFFF, 0x00000E7F, 0x00000000,
577 0xFFFFFFFE, 0x0FFFFFFF, 0x01800000, 0x00000000,
578 0xFFFFFFFE, 0x0FFFFFFF, 0x0C000000, 0x00000000,
579 0x3FFFFFFF, 0x00000000, 0x00000000, 0x00000000,
580 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000013FF,
581 0xFFFF07FF, 0xFFFFFFFF, 0x0000007F, 0x00000000,
584 __checkReturn efx_rc_t
585 siena_nic_test_registers(
587 __in siena_register_set_t *rsp,
591 efx_oword_t original;
597 /* This function is only suitable for registers */
598 EFSYS_ASSERT(rsp->rows == 1);
600 /* bit sweep on and off */
601 EFSYS_BAR_READO(enp->en_esbp, rsp->address, &original,
603 for (bit = 0; bit < 128; bit++) {
604 /* Is this bit in the mask? */
605 if (~(rsp->mask.eo_u32[bit >> 5]) & (1 << bit))
608 /* Test this bit can be set in isolation */
610 EFX_AND_OWORD(reg, rsp->mask);
611 EFX_SET_OWORD_BIT(reg, bit);
613 EFSYS_BAR_WRITEO(enp->en_esbp, rsp->address, ®,
615 EFSYS_BAR_READO(enp->en_esbp, rsp->address, &buf,
618 EFX_AND_OWORD(buf, rsp->mask);
619 if (memcmp(®, &buf, sizeof (reg))) {
624 /* Test this bit can be cleared in isolation */
625 EFX_OR_OWORD(reg, rsp->mask);
626 EFX_CLEAR_OWORD_BIT(reg, bit);
628 EFSYS_BAR_WRITEO(enp->en_esbp, rsp->address, ®,
630 EFSYS_BAR_READO(enp->en_esbp, rsp->address, &buf,
633 EFX_AND_OWORD(buf, rsp->mask);
634 if (memcmp(®, &buf, sizeof (reg))) {
640 /* Restore the old value */
641 EFSYS_BAR_WRITEO(enp->en_esbp, rsp->address, &original,
653 EFSYS_PROBE1(fail1, efx_rc_t, rc);
655 /* Restore the old value */
656 EFSYS_BAR_WRITEO(enp->en_esbp, rsp->address, &original, B_TRUE);
661 __checkReturn efx_rc_t
662 siena_nic_test_tables(
664 __in siena_register_set_t *rsp,
665 __in efx_pattern_type_t pattern,
668 efx_sram_pattern_fn_t func;
670 unsigned int address;
675 EFSYS_ASSERT(pattern < EFX_PATTERN_NTYPES);
676 func = __efx_sram_pattern_fns[pattern];
680 address = rsp->address;
681 for (index = 0; index < rsp->rows; ++index) {
682 func(2 * index + 0, B_FALSE, ®.eo_qword[0]);
683 func(2 * index + 1, B_FALSE, ®.eo_qword[1]);
684 EFX_AND_OWORD(reg, rsp->mask);
685 EFSYS_BAR_WRITEO(enp->en_esbp, address, ®, B_TRUE);
687 address += rsp->step;
691 address = rsp->address;
692 for (index = 0; index < rsp->rows; ++index) {
693 func(2 * index + 0, B_FALSE, ®.eo_qword[0]);
694 func(2 * index + 1, B_FALSE, ®.eo_qword[1]);
695 EFX_AND_OWORD(reg, rsp->mask);
696 EFSYS_BAR_READO(enp->en_esbp, address, &buf, B_TRUE);
697 if (memcmp(®, &buf, sizeof (reg))) {
702 address += rsp->step;
712 EFSYS_PROBE1(fail1, efx_rc_t, rc);
718 __checkReturn efx_rc_t
719 siena_nic_register_test(
722 siena_register_set_t *rsp;
723 const uint32_t *dwordp;
728 /* Fill out the register mask entries */
729 EFX_STATIC_ASSERT(EFX_ARRAY_SIZE(__siena_register_masks)
730 == EFX_ARRAY_SIZE(__siena_registers) * 4);
732 nitems = EFX_ARRAY_SIZE(__siena_registers);
733 dwordp = __siena_register_masks;
734 for (count = 0; count < nitems; ++count) {
735 rsp = __siena_registers + count;
736 rsp->mask.eo_u32[0] = *dwordp++;
737 rsp->mask.eo_u32[1] = *dwordp++;
738 rsp->mask.eo_u32[2] = *dwordp++;
739 rsp->mask.eo_u32[3] = *dwordp++;
742 /* Fill out the register table entries */
743 EFX_STATIC_ASSERT(EFX_ARRAY_SIZE(__siena_table_masks)
744 == EFX_ARRAY_SIZE(__siena_tables) * 4);
746 nitems = EFX_ARRAY_SIZE(__siena_tables);
747 dwordp = __siena_table_masks;
748 for (count = 0; count < nitems; ++count) {
749 rsp = __siena_tables + count;
750 rsp->mask.eo_u32[0] = *dwordp++;
751 rsp->mask.eo_u32[1] = *dwordp++;
752 rsp->mask.eo_u32[2] = *dwordp++;
753 rsp->mask.eo_u32[3] = *dwordp++;
756 if ((rc = siena_nic_test_registers(enp, __siena_registers,
757 EFX_ARRAY_SIZE(__siena_registers))) != 0)
760 if ((rc = siena_nic_test_tables(enp, __siena_tables,
761 EFX_PATTERN_BYTE_ALTERNATE,
762 EFX_ARRAY_SIZE(__siena_tables))) != 0)
765 if ((rc = siena_nic_test_tables(enp, __siena_tables,
766 EFX_PATTERN_BYTE_CHANGING,
767 EFX_ARRAY_SIZE(__siena_tables))) != 0)
770 if ((rc = siena_nic_test_tables(enp, __siena_tables,
771 EFX_PATTERN_BIT_SWEEP, EFX_ARRAY_SIZE(__siena_tables))) != 0)
783 EFSYS_PROBE1(fail1, efx_rc_t, rc);
788 #endif /* EFSYS_OPT_DIAG */
790 #endif /* EFSYS_OPT_SIENA */