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 EFX_MCDI_DECLARE_BUF(payload, MC_CMD_NVRAM_TYPES_IN_LEN,
22 MC_CMD_NVRAM_TYPES_OUT_LEN);
25 req.emr_cmd = MC_CMD_NVRAM_TYPES;
26 req.emr_in_buf = payload;
27 req.emr_in_length = MC_CMD_NVRAM_TYPES_IN_LEN;
28 req.emr_out_buf = payload;
29 req.emr_out_length = MC_CMD_NVRAM_TYPES_OUT_LEN;
31 efx_mcdi_execute(enp, &req);
33 if (req.emr_rc != 0) {
38 if (req.emr_out_length_used < MC_CMD_NVRAM_TYPES_OUT_LEN) {
43 *maskp = MCDI_OUT_DWORD(req, NVRAM_TYPES_OUT_TYPES);
50 EFSYS_PROBE1(fail1, efx_rc_t, rc);
55 #endif /* EFSYS_OPT_VPD || EFSYS_OPT_NVRAM */
57 static __checkReturn efx_rc_t
61 efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
63 efx_dword_t capabilities;
65 uint32_t nevq, nrxq, ntxq;
68 /* Siena has a fixed 8Kbyte VI window size */
69 EFX_STATIC_ASSERT(1U << EFX_VI_WINDOW_SHIFT_8K == 8192);
70 encp->enc_vi_window_shift = EFX_VI_WINDOW_SHIFT_8K;
72 /* External port identifier using one-based port numbering */
73 encp->enc_external_port = (uint8_t)enp->en_mcdi.em_emip.emi_port;
75 /* Board configuration */
76 if ((rc = efx_mcdi_get_board_cfg(enp, &board_type,
77 &capabilities, mac_addr)) != 0)
80 EFX_MAC_ADDR_COPY(encp->enc_mac_addr, mac_addr);
82 encp->enc_board_type = board_type;
85 * There is no possibility to determine the number of PFs on Siena
86 * by issuing MCDI request, and it is not an easy task to find the
87 * value based on the board type, so 'enc_hw_pf_count' is set to 1
89 encp->enc_hw_pf_count = 1;
91 /* Additional capabilities */
92 encp->enc_clk_mult = 1;
93 if (EFX_DWORD_FIELD(capabilities, MC_CMD_CAPABILITIES_TURBO)) {
94 enp->en_features |= EFX_FEATURE_TURBO;
96 if (EFX_DWORD_FIELD(capabilities,
97 MC_CMD_CAPABILITIES_TURBO_ACTIVE)) {
98 encp->enc_clk_mult = 2;
102 encp->enc_evq_timer_quantum_ns =
103 EFX_EVQ_SIENA_TIMER_QUANTUM_NS / encp->enc_clk_mult;
104 encp->enc_evq_timer_max_us = (encp->enc_evq_timer_quantum_ns <<
105 FRF_CZ_TC_TIMER_VAL_WIDTH) / 1000;
107 encp->enc_tx_desc_size = SIENA_TXQ_DESC_SIZE;
109 /* When hash header insertion is enabled, Siena inserts 16 bytes */
110 encp->enc_rx_prefix_size = 16;
112 /* Alignment for receive packet DMA buffers */
113 encp->enc_rx_buf_align_start = 1;
114 encp->enc_rx_buf_align_end = 1;
116 /* Alignment for WPTR updates */
117 encp->enc_rx_push_align = 1;
119 #if EFSYS_OPT_RX_SCALE
120 /* There is one RSS context per function */
121 encp->enc_rx_scale_max_exclusive_contexts = 1;
123 encp->enc_rx_scale_hash_alg_mask |= (1U << EFX_RX_HASHALG_LFSR);
124 encp->enc_rx_scale_hash_alg_mask |= (1U << EFX_RX_HASHALG_TOEPLITZ);
127 * It is always possible to use port numbers
128 * as the input data for hash computation.
130 encp->enc_rx_scale_l4_hash_supported = B_TRUE;
132 /* There is no support for additional RSS modes */
133 encp->enc_rx_scale_additional_modes_supported = B_FALSE;
134 #endif /* EFSYS_OPT_RX_SCALE */
136 encp->enc_tx_dma_desc_size_max = EFX_MASK32(FSF_AZ_TX_KER_BYTE_COUNT);
137 /* Fragments must not span 4k boundaries. */
138 encp->enc_tx_dma_desc_boundary = 4096;
140 /* Resource limits */
141 rc = efx_mcdi_get_resource_limits(enp, &nevq, &nrxq, &ntxq);
147 nrxq = EFX_RXQ_LIMIT_TARGET;
148 ntxq = EFX_TXQ_LIMIT_TARGET;
150 encp->enc_evq_limit = nevq;
151 encp->enc_rxq_limit = MIN(EFX_RXQ_LIMIT_TARGET, nrxq);
152 encp->enc_txq_limit = MIN(EFX_TXQ_LIMIT_TARGET, ntxq);
154 encp->enc_evq_max_nevs = SIENA_EVQ_MAXNEVS;
155 encp->enc_evq_min_nevs = SIENA_EVQ_MINNEVS;
157 encp->enc_rxq_max_ndescs = EF10_RXQ_MAXNDESCS;
158 encp->enc_rxq_min_ndescs = EF10_RXQ_MINNDESCS;
160 encp->enc_txq_max_ndescs = SIENA_TXQ_MAXNDESCS;
161 encp->enc_txq_min_ndescs = SIENA_TXQ_MINNDESCS;
163 encp->enc_buftbl_limit = SIENA_SRAM_ROWS -
164 (encp->enc_txq_limit * EFX_TXQ_DC_NDESCS(EFX_TXQ_DC_SIZE)) -
165 (encp->enc_rxq_limit * EFX_RXQ_DC_NDESCS(EFX_RXQ_DC_SIZE));
167 encp->enc_hw_tx_insert_vlan_enabled = B_FALSE;
168 encp->enc_fw_assisted_tso_enabled = B_FALSE;
169 encp->enc_fw_assisted_tso_v2_enabled = B_FALSE;
170 encp->enc_fw_assisted_tso_v2_n_contexts = 0;
171 encp->enc_allow_set_mac_with_installed_filters = B_TRUE;
172 encp->enc_rx_packed_stream_supported = B_FALSE;
173 encp->enc_rx_var_packed_stream_supported = B_FALSE;
174 encp->enc_rx_es_super_buffer_supported = B_FALSE;
175 encp->enc_fw_subvariant_no_tx_csum_supported = B_FALSE;
177 /* Siena supports two 10G ports, and 8 lanes of PCIe Gen2 */
178 encp->enc_required_pcie_bandwidth_mbps = 2 * 10000;
179 encp->enc_max_pcie_link_gen = EFX_PCIE_LINK_SPEED_GEN2;
181 encp->enc_nvram_update_verify_result_supported = B_FALSE;
183 encp->enc_mac_stats_nstats = MC_CMD_MAC_NSTATS;
185 encp->enc_filter_action_flag_supported = B_FALSE;
186 encp->enc_filter_action_mark_supported = B_FALSE;
187 encp->enc_filter_action_mark_max = 0;
194 EFSYS_PROBE1(fail1, efx_rc_t, rc);
199 static __checkReturn efx_rc_t
203 #if EFSYS_OPT_PHY_STATS
204 efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
205 #endif /* EFSYS_OPT_PHY_STATS */
208 /* Fill out fields in enp->en_port and enp->en_nic_cfg from MCDI */
209 if ((rc = efx_mcdi_get_phy_cfg(enp)) != 0)
212 #if EFSYS_OPT_PHY_STATS
213 /* Convert the MCDI statistic mask into the EFX_PHY_STAT mask */
214 siena_phy_decode_stats(enp, encp->enc_mcdi_phy_stat_mask,
215 NULL, &encp->enc_phy_stat_mask, NULL);
216 #endif /* EFSYS_OPT_PHY_STATS */
221 EFSYS_PROBE1(fail1, efx_rc_t, rc);
226 #define SIENA_BIU_MAGIC0 0x01234567
227 #define SIENA_BIU_MAGIC1 0xfedcba98
229 static __checkReturn efx_rc_t
237 * Write magic values to scratch registers 0 and 1, then
238 * verify that the values were written correctly. Interleave
239 * the accesses to ensure that the BIU is not just reading
240 * back the cached value that was last written.
242 EFX_POPULATE_OWORD_1(oword, FRF_AZ_DRIVER_DW0, SIENA_BIU_MAGIC0);
243 EFX_BAR_TBL_WRITEO(enp, FR_AZ_DRIVER_REG, 0, &oword, B_TRUE);
245 EFX_POPULATE_OWORD_1(oword, FRF_AZ_DRIVER_DW0, SIENA_BIU_MAGIC1);
246 EFX_BAR_TBL_WRITEO(enp, FR_AZ_DRIVER_REG, 1, &oword, B_TRUE);
248 EFX_BAR_TBL_READO(enp, FR_AZ_DRIVER_REG, 0, &oword, B_TRUE);
249 if (EFX_OWORD_FIELD(oword, FRF_AZ_DRIVER_DW0) != SIENA_BIU_MAGIC0) {
254 EFX_BAR_TBL_READO(enp, FR_AZ_DRIVER_REG, 1, &oword, B_TRUE);
255 if (EFX_OWORD_FIELD(oword, FRF_AZ_DRIVER_DW0) != SIENA_BIU_MAGIC1) {
261 * Perform the same test, with the values swapped. This
262 * ensures that subsequent tests don't start with the correct
263 * values already written into the scratch registers.
265 EFX_POPULATE_OWORD_1(oword, FRF_AZ_DRIVER_DW0, SIENA_BIU_MAGIC1);
266 EFX_BAR_TBL_WRITEO(enp, FR_AZ_DRIVER_REG, 0, &oword, B_TRUE);
268 EFX_POPULATE_OWORD_1(oword, FRF_AZ_DRIVER_DW0, SIENA_BIU_MAGIC0);
269 EFX_BAR_TBL_WRITEO(enp, FR_AZ_DRIVER_REG, 1, &oword, B_TRUE);
271 EFX_BAR_TBL_READO(enp, FR_AZ_DRIVER_REG, 0, &oword, B_TRUE);
272 if (EFX_OWORD_FIELD(oword, FRF_AZ_DRIVER_DW0) != SIENA_BIU_MAGIC1) {
277 EFX_BAR_TBL_READO(enp, FR_AZ_DRIVER_REG, 1, &oword, B_TRUE);
278 if (EFX_OWORD_FIELD(oword, FRF_AZ_DRIVER_DW0) != SIENA_BIU_MAGIC0) {
292 EFSYS_PROBE1(fail1, efx_rc_t, rc);
297 __checkReturn efx_rc_t
301 efx_port_t *epp = &(enp->en_port);
302 efx_nic_cfg_t *encp = &(enp->en_nic_cfg);
303 siena_link_state_t sls;
308 EFSYS_ASSERT3U(enp->en_family, ==, EFX_FAMILY_SIENA);
311 if ((rc = siena_nic_biu_test(enp)) != 0)
314 /* Clear the region register */
315 EFX_POPULATE_OWORD_4(oword,
316 FRF_AZ_ADR_REGION0, 0,
317 FRF_AZ_ADR_REGION1, (1 << 16),
318 FRF_AZ_ADR_REGION2, (2 << 16),
319 FRF_AZ_ADR_REGION3, (3 << 16));
320 EFX_BAR_WRITEO(enp, FR_AZ_ADR_REGION_REG, &oword);
322 /* Read clear any assertion state */
323 if ((rc = efx_mcdi_read_assertion(enp)) != 0)
326 /* Exit the assertion handler */
327 if ((rc = efx_mcdi_exit_assertion_handler(enp)) != 0)
330 /* Wrestle control from the BMC */
331 if ((rc = efx_mcdi_drv_attach(enp, B_TRUE)) != 0)
334 if ((rc = siena_board_cfg(enp)) != 0)
337 if ((rc = siena_phy_cfg(enp)) != 0)
340 /* Obtain the default PHY advertised capabilities */
341 if ((rc = siena_nic_reset(enp)) != 0)
343 if ((rc = siena_phy_get_link(enp, &sls)) != 0)
345 epp->ep_default_adv_cap_mask = sls.sls_adv_cap_mask;
346 epp->ep_adv_cap_mask = sls.sls_adv_cap_mask;
348 #if EFSYS_OPT_VPD || EFSYS_OPT_NVRAM
349 if ((rc = siena_nic_get_partn_mask(enp, &mask)) != 0)
351 enp->en_u.siena.enu_partn_mask = mask;
354 #if EFSYS_OPT_MAC_STATS
355 /* Wipe the MAC statistics */
356 if ((rc = efx_mcdi_mac_stats_clear(enp)) != 0)
360 #if EFSYS_OPT_LOOPBACK
361 if ((rc = efx_mcdi_get_loopback_modes(enp)) != 0)
365 #if EFSYS_OPT_MON_STATS
366 if ((rc = mcdi_mon_cfg_build(enp)) != 0)
370 encp->enc_features = enp->en_features;
374 #if EFSYS_OPT_MON_STATS
378 #if EFSYS_OPT_LOOPBACK
382 #if EFSYS_OPT_MAC_STATS
386 #if EFSYS_OPT_VPD || EFSYS_OPT_NVRAM
405 EFSYS_PROBE1(fail1, efx_rc_t, rc);
410 __checkReturn efx_rc_t
417 EFSYS_ASSERT3U(enp->en_family, ==, EFX_FAMILY_SIENA);
419 /* siena_nic_reset() is called to recover from BADASSERT failures. */
420 if ((rc = efx_mcdi_read_assertion(enp)) != 0)
422 if ((rc = efx_mcdi_exit_assertion_handler(enp)) != 0)
426 * Bug24908: ENTITY_RESET_IN_LEN is non zero but zero may be supplied
427 * for backwards compatibility with PORT_RESET_IN_LEN.
429 EFX_STATIC_ASSERT(MC_CMD_ENTITY_RESET_OUT_LEN == 0);
431 req.emr_cmd = MC_CMD_ENTITY_RESET;
432 req.emr_in_buf = NULL;
433 req.emr_in_length = 0;
434 req.emr_out_buf = NULL;
435 req.emr_out_length = 0;
437 efx_mcdi_execute(enp, &req);
439 if (req.emr_rc != 0) {
451 EFSYS_PROBE1(fail1, efx_rc_t, rc);
463 * RX_INGR_EN is always enabled on Siena, because we rely on
464 * the RX parser to be resiliant to missing SOP/EOP.
466 EFX_BAR_READO(enp, FR_AZ_RX_CFG_REG, &oword);
467 EFX_SET_OWORD_FIELD(oword, FRF_BZ_RX_INGR_EN, 1);
468 EFX_BAR_WRITEO(enp, FR_AZ_RX_CFG_REG, &oword);
470 /* Disable parsing of additional 802.1Q in Q packets */
471 EFX_BAR_READO(enp, FR_AZ_RX_FILTER_CTL_REG, &oword);
472 EFX_SET_OWORD_FIELD(oword, FRF_CZ_RX_FILTER_ALL_VLAN_ETHERTYPES, 0);
473 EFX_BAR_WRITEO(enp, FR_AZ_RX_FILTER_CTL_REG, &oword);
482 EFX_POPULATE_OWORD_1(oword, FRF_CZ_USREV_DIS, 1);
483 EFX_BAR_WRITEO(enp, FR_CZ_USR_EV_CFG, &oword);
486 __checkReturn efx_rc_t
492 EFSYS_ASSERT3U(enp->en_family, ==, EFX_FAMILY_SIENA);
494 /* Enable reporting of some events (e.g. link change) */
495 if ((rc = efx_mcdi_log_ctrl(enp)) != 0)
498 siena_sram_init(enp);
500 /* Configure Siena's RX block */
501 siena_nic_rx_cfg(enp);
503 /* Disable USR_EVents for now */
504 siena_nic_usrev_dis(enp);
506 /* bug17057: Ensure set_link is called */
507 if ((rc = siena_phy_reconfigure(enp)) != 0)
510 enp->en_nic_cfg.enc_mcdi_max_payload_length = MCDI_CTL_SDU_LEN_MAX_V1;
517 EFSYS_PROBE1(fail1, efx_rc_t, rc);
526 _NOTE(ARGUNUSED(enp))
533 #if EFSYS_OPT_MON_STATS
534 mcdi_mon_cfg_free(enp);
535 #endif /* EFSYS_OPT_MON_STATS */
536 (void) efx_mcdi_drv_attach(enp, B_FALSE);
541 static siena_register_set_t __siena_registers[] = {
542 { FR_AZ_ADR_REGION_REG_OFST, 0, 1 },
543 { FR_CZ_USR_EV_CFG_OFST, 0, 1 },
544 { FR_AZ_RX_CFG_REG_OFST, 0, 1 },
545 { FR_AZ_TX_CFG_REG_OFST, 0, 1 },
546 { FR_AZ_TX_RESERVED_REG_OFST, 0, 1 },
547 { FR_AZ_SRM_TX_DC_CFG_REG_OFST, 0, 1 },
548 { FR_AZ_RX_DC_CFG_REG_OFST, 0, 1 },
549 { FR_AZ_RX_DC_PF_WM_REG_OFST, 0, 1 },
550 { FR_AZ_DP_CTRL_REG_OFST, 0, 1 },
551 { FR_BZ_RX_RSS_TKEY_REG_OFST, 0, 1},
552 { FR_CZ_RX_RSS_IPV6_REG1_OFST, 0, 1},
553 { FR_CZ_RX_RSS_IPV6_REG2_OFST, 0, 1},
554 { FR_CZ_RX_RSS_IPV6_REG3_OFST, 0, 1}
557 static const uint32_t __siena_register_masks[] = {
558 0x0003FFFF, 0x0003FFFF, 0x0003FFFF, 0x0003FFFF,
559 0x000103FF, 0x00000000, 0x00000000, 0x00000000,
560 0xFFFFFFFE, 0xFFFFFFFF, 0x0003FFFF, 0x00000000,
561 0x7FFF0037, 0xFFFF8000, 0xFFFFFFFF, 0x03FFFFFF,
562 0xFFFEFE80, 0x1FFFFFFF, 0x020000FE, 0x007FFFFF,
563 0x001FFFFF, 0x00000000, 0x00000000, 0x00000000,
564 0x00000003, 0x00000000, 0x00000000, 0x00000000,
565 0x000003FF, 0x00000000, 0x00000000, 0x00000000,
566 0x00000FFF, 0x00000000, 0x00000000, 0x00000000,
567 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
568 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
569 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
570 0xFFFFFFFF, 0xFFFFFFFF, 0x00000007, 0x00000000
573 static siena_register_set_t __siena_tables[] = {
574 { FR_AZ_RX_FILTER_TBL0_OFST, FR_AZ_RX_FILTER_TBL0_STEP,
575 FR_AZ_RX_FILTER_TBL0_ROWS },
576 { FR_CZ_RX_MAC_FILTER_TBL0_OFST, FR_CZ_RX_MAC_FILTER_TBL0_STEP,
577 FR_CZ_RX_MAC_FILTER_TBL0_ROWS },
578 { FR_AZ_RX_DESC_PTR_TBL_OFST,
579 FR_AZ_RX_DESC_PTR_TBL_STEP, FR_CZ_RX_DESC_PTR_TBL_ROWS },
580 { FR_AZ_TX_DESC_PTR_TBL_OFST,
581 FR_AZ_TX_DESC_PTR_TBL_STEP, FR_CZ_TX_DESC_PTR_TBL_ROWS },
582 { FR_AZ_TIMER_TBL_OFST, FR_AZ_TIMER_TBL_STEP, FR_CZ_TIMER_TBL_ROWS },
583 { FR_CZ_TX_FILTER_TBL0_OFST,
584 FR_CZ_TX_FILTER_TBL0_STEP, FR_CZ_TX_FILTER_TBL0_ROWS },
585 { FR_CZ_TX_MAC_FILTER_TBL0_OFST,
586 FR_CZ_TX_MAC_FILTER_TBL0_STEP, FR_CZ_TX_MAC_FILTER_TBL0_ROWS }
589 static const uint32_t __siena_table_masks[] = {
590 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000003FF,
591 0xFFFF0FFF, 0xFFFFFFFF, 0x00000E7F, 0x00000000,
592 0xFFFFFFFE, 0x0FFFFFFF, 0x01800000, 0x00000000,
593 0xFFFFFFFE, 0x0FFFFFFF, 0x0C000000, 0x00000000,
594 0x3FFFFFFF, 0x00000000, 0x00000000, 0x00000000,
595 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x000013FF,
596 0xFFFF07FF, 0xFFFFFFFF, 0x0000007F, 0x00000000,
599 __checkReturn efx_rc_t
600 siena_nic_test_registers(
602 __in siena_register_set_t *rsp,
606 efx_oword_t original;
612 /* This function is only suitable for registers */
613 EFSYS_ASSERT(rsp->rows == 1);
615 /* bit sweep on and off */
616 EFSYS_BAR_READO(enp->en_esbp, rsp->address, &original,
618 for (bit = 0; bit < 128; bit++) {
619 /* Is this bit in the mask? */
620 if (~(rsp->mask.eo_u32[bit >> 5]) & (1 << bit))
623 /* Test this bit can be set in isolation */
625 EFX_AND_OWORD(reg, rsp->mask);
626 EFX_SET_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))) {
639 /* Test this bit can be cleared in isolation */
640 EFX_OR_OWORD(reg, rsp->mask);
641 EFX_CLEAR_OWORD_BIT(reg, bit);
643 EFSYS_BAR_WRITEO(enp->en_esbp, rsp->address, ®,
645 EFSYS_BAR_READO(enp->en_esbp, rsp->address, &buf,
648 EFX_AND_OWORD(buf, rsp->mask);
649 if (memcmp(®, &buf, sizeof (reg))) {
655 /* Restore the old value */
656 EFSYS_BAR_WRITEO(enp->en_esbp, rsp->address, &original,
668 EFSYS_PROBE1(fail1, efx_rc_t, rc);
670 /* Restore the old value */
671 EFSYS_BAR_WRITEO(enp->en_esbp, rsp->address, &original, B_TRUE);
676 __checkReturn efx_rc_t
677 siena_nic_test_tables(
679 __in siena_register_set_t *rsp,
680 __in efx_pattern_type_t pattern,
683 efx_sram_pattern_fn_t func;
685 unsigned int address;
690 EFSYS_ASSERT(pattern < EFX_PATTERN_NTYPES);
691 func = __efx_sram_pattern_fns[pattern];
695 address = rsp->address;
696 for (index = 0; index < rsp->rows; ++index) {
697 func(2 * index + 0, B_FALSE, ®.eo_qword[0]);
698 func(2 * index + 1, B_FALSE, ®.eo_qword[1]);
699 EFX_AND_OWORD(reg, rsp->mask);
700 EFSYS_BAR_WRITEO(enp->en_esbp, address, ®, B_TRUE);
702 address += rsp->step;
706 address = rsp->address;
707 for (index = 0; index < rsp->rows; ++index) {
708 func(2 * index + 0, B_FALSE, ®.eo_qword[0]);
709 func(2 * index + 1, B_FALSE, ®.eo_qword[1]);
710 EFX_AND_OWORD(reg, rsp->mask);
711 EFSYS_BAR_READO(enp->en_esbp, address, &buf, B_TRUE);
712 if (memcmp(®, &buf, sizeof (reg))) {
717 address += rsp->step;
727 EFSYS_PROBE1(fail1, efx_rc_t, rc);
733 __checkReturn efx_rc_t
734 siena_nic_register_test(
737 siena_register_set_t *rsp;
738 const uint32_t *dwordp;
743 /* Fill out the register mask entries */
744 EFX_STATIC_ASSERT(EFX_ARRAY_SIZE(__siena_register_masks)
745 == EFX_ARRAY_SIZE(__siena_registers) * 4);
747 nitems = EFX_ARRAY_SIZE(__siena_registers);
748 dwordp = __siena_register_masks;
749 for (count = 0; count < nitems; ++count) {
750 rsp = __siena_registers + count;
751 rsp->mask.eo_u32[0] = *dwordp++;
752 rsp->mask.eo_u32[1] = *dwordp++;
753 rsp->mask.eo_u32[2] = *dwordp++;
754 rsp->mask.eo_u32[3] = *dwordp++;
757 /* Fill out the register table entries */
758 EFX_STATIC_ASSERT(EFX_ARRAY_SIZE(__siena_table_masks)
759 == EFX_ARRAY_SIZE(__siena_tables) * 4);
761 nitems = EFX_ARRAY_SIZE(__siena_tables);
762 dwordp = __siena_table_masks;
763 for (count = 0; count < nitems; ++count) {
764 rsp = __siena_tables + count;
765 rsp->mask.eo_u32[0] = *dwordp++;
766 rsp->mask.eo_u32[1] = *dwordp++;
767 rsp->mask.eo_u32[2] = *dwordp++;
768 rsp->mask.eo_u32[3] = *dwordp++;
771 if ((rc = siena_nic_test_registers(enp, __siena_registers,
772 EFX_ARRAY_SIZE(__siena_registers))) != 0)
775 if ((rc = siena_nic_test_tables(enp, __siena_tables,
776 EFX_PATTERN_BYTE_ALTERNATE,
777 EFX_ARRAY_SIZE(__siena_tables))) != 0)
780 if ((rc = siena_nic_test_tables(enp, __siena_tables,
781 EFX_PATTERN_BYTE_CHANGING,
782 EFX_ARRAY_SIZE(__siena_tables))) != 0)
785 if ((rc = siena_nic_test_tables(enp, __siena_tables,
786 EFX_PATTERN_BIT_SWEEP, EFX_ARRAY_SIZE(__siena_tables))) != 0)
798 EFSYS_PROBE1(fail1, efx_rc_t, rc);
803 #endif /* EFSYS_OPT_DIAG */
805 #endif /* EFSYS_OPT_SIENA */