Lines Matching refs:efx

89 static inline void efx_write_buf_tbl(struct efx_nic *efx, efx_qword_t *value,  in efx_write_buf_tbl()  argument
92 efx_sram_writeq(efx, efx->membase + efx->type->buf_tbl_base, in efx_write_buf_tbl()
103 int efx_farch_test_registers(struct efx_nic *efx, in efx_farch_test_registers() argument
115 efx_reado(efx, &original, address); in efx_farch_test_registers()
126 efx_writeo(efx, &reg, address); in efx_farch_test_registers()
127 efx_reado(efx, &buf, address); in efx_farch_test_registers()
136 efx_writeo(efx, &reg, address); in efx_farch_test_registers()
137 efx_reado(efx, &buf, address); in efx_farch_test_registers()
143 efx_writeo(efx, &original, address); in efx_farch_test_registers()
149 netif_err(efx, hw, efx->net_dev, in efx_farch_test_registers()
172 efx_init_special_buffer(struct efx_nic *efx, struct efx_special_buffer *buffer) in efx_init_special_buffer() argument
185 netif_dbg(efx, probe, efx->net_dev, in efx_init_special_buffer()
192 efx_write_buf_tbl(efx, &buf_desc, index); in efx_init_special_buffer()
198 efx_fini_special_buffer(struct efx_nic *efx, struct efx_special_buffer *buffer) in efx_fini_special_buffer() argument
207 netif_dbg(efx, hw, efx->net_dev, "unmapping special buffers %d-%d\n", in efx_fini_special_buffer()
215 efx_writeo(efx, &buf_tbl_upd, FR_AZ_BUF_TBL_UPD); in efx_fini_special_buffer()
227 static int efx_alloc_special_buffer(struct efx_nic *efx, in efx_alloc_special_buffer() argument
232 struct siena_nic_data *nic_data = efx->nic_data; in efx_alloc_special_buffer()
236 if (efx_nic_alloc_buffer(efx, &buffer->buf, len, GFP_KERNEL)) in efx_alloc_special_buffer()
242 buffer->index = efx->next_buffer_table; in efx_alloc_special_buffer()
243 efx->next_buffer_table += buffer->entries; in efx_alloc_special_buffer()
245 BUG_ON(efx_siena_sriov_enabled(efx) && in efx_alloc_special_buffer()
246 nic_data->vf_buftbl_base < efx->next_buffer_table); in efx_alloc_special_buffer()
249 netif_dbg(efx, probe, efx->net_dev, in efx_alloc_special_buffer()
260 efx_free_special_buffer(struct efx_nic *efx, struct efx_special_buffer *buffer) in efx_free_special_buffer() argument
265 netif_dbg(efx, hw, efx->net_dev, in efx_free_special_buffer()
272 efx_nic_free_buffer(efx, &buffer->buf); in efx_free_special_buffer()
290 efx_writed_page(tx_queue->efx, &reg, in efx_farch_notify_tx_desc()
308 efx_writeo_page(tx_queue->efx, &reg, in efx_farch_push_tx_desc()
361 struct efx_nic *efx = tx_queue->efx; in efx_farch_tx_probe() local
365 return efx_alloc_special_buffer(efx, &tx_queue->txd, in efx_farch_tx_probe()
371 struct efx_nic *efx = tx_queue->efx; in efx_farch_tx_init() local
375 efx_init_special_buffer(efx, &tx_queue->txd); in efx_farch_tx_init()
392 if (efx_nic_rev(efx) >= EFX_REV_FALCON_B0) { in efx_farch_tx_init()
399 efx_writeo_table(efx, &reg, efx->type->txd_ptr_tbl_base, in efx_farch_tx_init()
402 if (efx_nic_rev(efx) < EFX_REV_FALCON_B0) { in efx_farch_tx_init()
406 efx_reado(efx, &reg, FR_AA_TX_CHKSM_CFG); in efx_farch_tx_init()
411 efx_writeo(efx, &reg, FR_AA_TX_CHKSM_CFG); in efx_farch_tx_init()
414 if (efx_nic_rev(efx) >= EFX_REV_FALCON_B0) { in efx_farch_tx_init()
420 efx_writeo_table(efx, &reg, FR_BZ_TX_PACE_TBL, in efx_farch_tx_init()
427 struct efx_nic *efx = tx_queue->efx; in efx_farch_flush_tx_queue() local
436 efx_writeo(efx, &tx_flush_descq, FR_AZ_TX_FLUSH_DESCQ); in efx_farch_flush_tx_queue()
441 struct efx_nic *efx = tx_queue->efx; in efx_farch_tx_fini() local
446 efx_writeo_table(efx, &tx_desc_ptr, efx->type->txd_ptr_tbl_base, in efx_farch_tx_fini()
450 efx_fini_special_buffer(efx, &tx_queue->txd); in efx_farch_tx_fini()
456 efx_free_special_buffer(tx_queue->efx, &tx_queue->txd); in efx_farch_tx_remove()
477 rx_queue->efx->type->rx_buffer_padding, in efx_farch_build_rx_desc()
487 struct efx_nic *efx = rx_queue->efx; in efx_farch_rx_write() local
501 efx_writed_page(efx, &reg, FR_AZ_RX_DESC_UPD_DWORD_P0, in efx_farch_rx_write()
507 struct efx_nic *efx = rx_queue->efx; in efx_farch_rx_probe() local
511 return efx_alloc_special_buffer(efx, &rx_queue->rxd, in efx_farch_rx_probe()
518 struct efx_nic *efx = rx_queue->efx; in efx_farch_rx_init() local
519 bool is_b0 = efx_nic_rev(efx) >= EFX_REV_FALCON_B0; in efx_farch_rx_init()
528 jumbo_en = !is_b0 || efx->rx_scatter; in efx_farch_rx_init()
530 netif_dbg(efx, hw, efx->net_dev, in efx_farch_rx_init()
538 efx_init_special_buffer(efx, &rx_queue->rxd); in efx_farch_rx_init()
555 efx_writeo_table(efx, &rx_desc_ptr, efx->type->rxd_ptr_tbl_base, in efx_farch_rx_init()
561 struct efx_nic *efx = rx_queue->efx; in efx_farch_flush_rx_queue() local
568 efx_writeo(efx, &rx_flush_descq, FR_AZ_RX_FLUSH_DESCQ); in efx_farch_flush_rx_queue()
574 struct efx_nic *efx = rx_queue->efx; in efx_farch_rx_fini() local
578 efx_writeo_table(efx, &rx_desc_ptr, efx->type->rxd_ptr_tbl_base, in efx_farch_rx_fini()
582 efx_fini_special_buffer(efx, &rx_queue->rxd); in efx_farch_rx_fini()
588 efx_free_special_buffer(rx_queue->efx, &rx_queue->rxd); in efx_farch_rx_remove()
600 static bool efx_farch_flush_wake(struct efx_nic *efx) in efx_farch_flush_wake() argument
605 return (atomic_read(&efx->active_queues) == 0 || in efx_farch_flush_wake()
606 (atomic_read(&efx->rxq_flush_outstanding) < EFX_RX_FLUSH_COUNT in efx_farch_flush_wake()
607 && atomic_read(&efx->rxq_flush_pending) > 0)); in efx_farch_flush_wake()
610 static bool efx_check_tx_flush_complete(struct efx_nic *efx) in efx_check_tx_flush_complete() argument
617 efx_for_each_channel(channel, efx) { in efx_check_tx_flush_complete()
619 efx_reado_table(efx, &txd_ptr_tbl, in efx_check_tx_flush_complete()
625 netif_dbg(efx, hw, efx->net_dev, in efx_check_tx_flush_complete()
634 netif_dbg(efx, hw, efx->net_dev, in efx_check_tx_flush_complete()
654 static int efx_farch_do_flush(struct efx_nic *efx) in efx_farch_do_flush() argument
662 efx_for_each_channel(channel, efx) { in efx_farch_do_flush()
668 atomic_inc(&efx->rxq_flush_pending); in efx_farch_do_flush()
672 while (timeout && atomic_read(&efx->active_queues) > 0) { in efx_farch_do_flush()
677 if (efx_siena_sriov_enabled(efx)) { in efx_farch_do_flush()
678 rc = efx_mcdi_flush_rxqs(efx); in efx_farch_do_flush()
687 efx_for_each_channel(channel, efx) { in efx_farch_do_flush()
689 if (atomic_read(&efx->rxq_flush_outstanding) >= in efx_farch_do_flush()
695 atomic_dec(&efx->rxq_flush_pending); in efx_farch_do_flush()
696 atomic_inc(&efx->rxq_flush_outstanding); in efx_farch_do_flush()
703 timeout = wait_event_timeout(efx->flush_wq, in efx_farch_do_flush()
704 efx_farch_flush_wake(efx), in efx_farch_do_flush()
708 if (atomic_read(&efx->active_queues) && in efx_farch_do_flush()
709 !efx_check_tx_flush_complete(efx)) { in efx_farch_do_flush()
710 netif_err(efx, hw, efx->net_dev, "failed to flush %d queues " in efx_farch_do_flush()
711 "(rx %d+%d)\n", atomic_read(&efx->active_queues), in efx_farch_do_flush()
712 atomic_read(&efx->rxq_flush_outstanding), in efx_farch_do_flush()
713 atomic_read(&efx->rxq_flush_pending)); in efx_farch_do_flush()
716 atomic_set(&efx->active_queues, 0); in efx_farch_do_flush()
717 atomic_set(&efx->rxq_flush_pending, 0); in efx_farch_do_flush()
718 atomic_set(&efx->rxq_flush_outstanding, 0); in efx_farch_do_flush()
724 int efx_farch_fini_dmaq(struct efx_nic *efx) in efx_farch_fini_dmaq() argument
732 if (efx->state != STATE_RECOVERY) { in efx_farch_fini_dmaq()
734 if (efx->pci_dev->is_busmaster) { in efx_farch_fini_dmaq()
735 efx->type->prepare_flush(efx); in efx_farch_fini_dmaq()
736 rc = efx_farch_do_flush(efx); in efx_farch_fini_dmaq()
737 efx->type->finish_flush(efx); in efx_farch_fini_dmaq()
740 efx_for_each_channel(channel, efx) { in efx_farch_fini_dmaq()
765 void efx_farch_finish_flr(struct efx_nic *efx) in efx_farch_finish_flr() argument
767 atomic_set(&efx->rxq_flush_pending, 0); in efx_farch_finish_flr()
768 atomic_set(&efx->rxq_flush_outstanding, 0); in efx_farch_finish_flr()
769 atomic_set(&efx->active_queues, 0); in efx_farch_finish_flr()
788 struct efx_nic *efx = channel->efx; in efx_farch_ev_read_ack() local
796 efx_writed(efx, &reg, in efx_farch_ev_read_ack()
797 efx->type->evq_rptr_tbl_base + in efx_farch_ev_read_ack()
802 void efx_farch_generate_event(struct efx_nic *efx, unsigned int evq, in efx_farch_generate_event() argument
814 efx_writeo(efx, &drv_ev_reg, FR_AZ_DRV_EV); in efx_farch_generate_event()
824 efx_farch_generate_event(channel->efx, channel->channel, &event); in efx_farch_magic_event()
838 struct efx_nic *efx = channel->efx; in efx_farch_handle_tx_event() local
841 if (unlikely(ACCESS_ONCE(efx->reset_pending))) in efx_farch_handle_tx_event()
859 netif_tx_lock(efx->net_dev); in efx_farch_handle_tx_event()
861 netif_tx_unlock(efx->net_dev); in efx_farch_handle_tx_event()
863 efx_schedule_reset(efx, RESET_TYPE_DMA_ERROR); in efx_farch_handle_tx_event()
865 netif_err(efx, tx_err, efx->net_dev, in efx_farch_handle_tx_event()
879 struct efx_nic *efx = rx_queue->efx; in efx_farch_handle_rx_not_ok() local
899 rx_ev_drib_nib = ((efx_nic_rev(efx) >= EFX_REV_FALCON_B0) ? in efx_farch_handle_rx_not_ok()
914 else if (!efx->loopback_selftest) { in efx_farch_handle_rx_not_ok()
927 netif_dbg(efx, rx_err, efx->net_dev, in efx_farch_handle_rx_not_ok()
958 struct efx_nic *efx = rx_queue->efx; in efx_farch_handle_rx_bad_index() local
970 netif_info(efx, rx_err, efx->net_dev, in efx_farch_handle_rx_bad_index()
974 efx_schedule_reset(efx, EFX_WORKAROUND_5676(efx) ? in efx_farch_handle_rx_bad_index()
995 struct efx_nic *efx = channel->efx; in efx_farch_handle_rx_event() local
997 if (unlikely(ACCESS_ONCE(efx->reset_pending))) in efx_farch_handle_rx_event()
1098 efx_farch_handle_tx_flush_done(struct efx_nic *efx, efx_qword_t *event) in efx_farch_handle_tx_flush_done() argument
1104 if (qid < EFX_TXQ_TYPES * efx->n_tx_channels) { in efx_farch_handle_tx_flush_done()
1105 tx_queue = efx_get_tx_queue(efx, qid / EFX_TXQ_TYPES, in efx_farch_handle_tx_flush_done()
1119 efx_farch_handle_rx_flush_done(struct efx_nic *efx, efx_qword_t *event) in efx_farch_handle_rx_flush_done() argument
1128 if (qid >= efx->n_channels) in efx_farch_handle_rx_flush_done()
1130 channel = efx_get_channel(efx, qid); in efx_farch_handle_rx_flush_done()
1136 netif_info(efx, hw, efx->net_dev, in efx_farch_handle_rx_flush_done()
1139 atomic_inc(&efx->rxq_flush_pending); in efx_farch_handle_rx_flush_done()
1144 atomic_dec(&efx->rxq_flush_outstanding); in efx_farch_handle_rx_flush_done()
1145 if (efx_farch_flush_wake(efx)) in efx_farch_handle_rx_flush_done()
1146 wake_up(&efx->flush_wq); in efx_farch_handle_rx_flush_done()
1152 struct efx_nic *efx = channel->efx; in efx_farch_handle_drain_event() local
1154 WARN_ON(atomic_read(&efx->active_queues) == 0); in efx_farch_handle_drain_event()
1155 atomic_dec(&efx->active_queues); in efx_farch_handle_drain_event()
1156 if (efx_farch_flush_wake(efx)) in efx_farch_handle_drain_event()
1157 wake_up(&efx->flush_wq); in efx_farch_handle_drain_event()
1163 struct efx_nic *efx = channel->efx; in efx_farch_handle_generated_event() local
1184 netif_dbg(efx, hw, efx->net_dev, "channel %d received " in efx_farch_handle_generated_event()
1193 struct efx_nic *efx = channel->efx; in efx_farch_handle_driver_event() local
1202 netif_vdbg(efx, hw, efx->net_dev, "channel %d TXQ %d flushed\n", in efx_farch_handle_driver_event()
1204 efx_farch_handle_tx_flush_done(efx, event); in efx_farch_handle_driver_event()
1206 efx_siena_sriov_tx_flush_done(efx, event); in efx_farch_handle_driver_event()
1210 netif_vdbg(efx, hw, efx->net_dev, "channel %d RXQ %d flushed\n", in efx_farch_handle_driver_event()
1212 efx_farch_handle_rx_flush_done(efx, event); in efx_farch_handle_driver_event()
1214 efx_siena_sriov_rx_flush_done(efx, event); in efx_farch_handle_driver_event()
1218 netif_dbg(efx, hw, efx->net_dev, in efx_farch_handle_driver_event()
1223 netif_vdbg(efx, hw, efx->net_dev, in efx_farch_handle_driver_event()
1227 netif_vdbg(efx, hw, efx->net_dev, in efx_farch_handle_driver_event()
1232 netif_vdbg(efx, hw, efx->net_dev, in efx_farch_handle_driver_event()
1237 netif_err(efx, rx_err, efx->net_dev, in efx_farch_handle_driver_event()
1240 atomic_inc(&efx->rx_reset); in efx_farch_handle_driver_event()
1241 efx_schedule_reset(efx, in efx_farch_handle_driver_event()
1242 EFX_WORKAROUND_6555(efx) ? in efx_farch_handle_driver_event()
1248 netif_err(efx, rx_err, efx->net_dev, in efx_farch_handle_driver_event()
1252 efx_schedule_reset(efx, RESET_TYPE_DMA_ERROR); in efx_farch_handle_driver_event()
1256 efx_siena_sriov_desc_fetch_err(efx, ev_sub_data); in efx_farch_handle_driver_event()
1261 netif_err(efx, tx_err, efx->net_dev, in efx_farch_handle_driver_event()
1265 efx_schedule_reset(efx, RESET_TYPE_DMA_ERROR); in efx_farch_handle_driver_event()
1269 efx_siena_sriov_desc_fetch_err(efx, ev_sub_data); in efx_farch_handle_driver_event()
1273 netif_vdbg(efx, hw, efx->net_dev, in efx_farch_handle_driver_event()
1283 struct efx_nic *efx = channel->efx; in efx_farch_ev_process() local
1303 netif_vdbg(channel->efx, intr, channel->efx->net_dev, in efx_farch_ev_process()
1323 if (tx_packets > efx->txq_entries) { in efx_farch_ev_process()
1343 if (efx->type->handle_global_event && in efx_farch_ev_process()
1344 efx->type->handle_global_event(channel, &event)) in efx_farch_ev_process()
1348 netif_err(channel->efx, hw, channel->efx->net_dev, in efx_farch_ev_process()
1363 struct efx_nic *efx = channel->efx; in efx_farch_ev_probe() local
1367 return efx_alloc_special_buffer(efx, &channel->eventq, in efx_farch_ev_probe()
1374 struct efx_nic *efx = channel->efx; in efx_farch_ev_init() local
1376 netif_dbg(efx, hw, efx->net_dev, in efx_farch_ev_init()
1381 if (efx_nic_rev(efx) >= EFX_REV_SIENA_A0) { in efx_farch_ev_init()
1386 efx_writeo_table(efx, &reg, FR_BZ_TIMER_TBL, channel->channel); in efx_farch_ev_init()
1390 efx_init_special_buffer(efx, &channel->eventq); in efx_farch_ev_init()
1400 efx_writeo_table(efx, &reg, efx->type->evq_ptr_tbl_base, in efx_farch_ev_init()
1409 struct efx_nic *efx = channel->efx; in efx_farch_ev_fini() local
1413 efx_writeo_table(efx, &reg, efx->type->evq_ptr_tbl_base, in efx_farch_ev_fini()
1415 if (efx_nic_rev(efx) >= EFX_REV_SIENA_A0) in efx_farch_ev_fini()
1416 efx_writeo_table(efx, &reg, FR_BZ_TIMER_TBL, channel->channel); in efx_farch_ev_fini()
1419 efx_fini_special_buffer(efx, &channel->eventq); in efx_farch_ev_fini()
1425 efx_free_special_buffer(channel->efx, &channel->eventq); in efx_farch_ev_remove()
1449 static inline void efx_farch_interrupts(struct efx_nic *efx, in efx_farch_interrupts() argument
1455 FRF_AZ_KER_INT_LEVE_SEL, efx->irq_level, in efx_farch_interrupts()
1458 efx_writeo(efx, &int_en_reg_ker, FR_AZ_INT_EN_KER); in efx_farch_interrupts()
1461 void efx_farch_irq_enable_master(struct efx_nic *efx) in efx_farch_irq_enable_master() argument
1463 EFX_ZERO_OWORD(*((efx_oword_t *) efx->irq_status.addr)); in efx_farch_irq_enable_master()
1466 efx_farch_interrupts(efx, true, false); in efx_farch_irq_enable_master()
1469 void efx_farch_irq_disable_master(struct efx_nic *efx) in efx_farch_irq_disable_master() argument
1472 efx_farch_interrupts(efx, false, false); in efx_farch_irq_disable_master()
1479 void efx_farch_irq_test_generate(struct efx_nic *efx) in efx_farch_irq_test_generate() argument
1481 efx_farch_interrupts(efx, true, true); in efx_farch_irq_test_generate()
1487 irqreturn_t efx_farch_fatal_interrupt(struct efx_nic *efx) in efx_farch_fatal_interrupt() argument
1489 struct falcon_nic_data *nic_data = efx->nic_data; in efx_farch_fatal_interrupt()
1490 efx_oword_t *int_ker = efx->irq_status.addr; in efx_farch_fatal_interrupt()
1494 efx_reado(efx, &fatal_intr, FR_AZ_FATAL_INTR_KER); in efx_farch_fatal_interrupt()
1497 netif_err(efx, hw, efx->net_dev, "SYSTEM ERROR "EFX_OWORD_FMT" status " in efx_farch_fatal_interrupt()
1507 efx_reado(efx, &reg, FR_AZ_MEM_STAT); in efx_farch_fatal_interrupt()
1508 netif_err(efx, hw, efx->net_dev, in efx_farch_fatal_interrupt()
1514 pci_clear_master(efx->pci_dev); in efx_farch_fatal_interrupt()
1515 if (efx_nic_is_dual_func(efx)) in efx_farch_fatal_interrupt()
1517 efx_farch_irq_disable_master(efx); in efx_farch_fatal_interrupt()
1520 if (efx->int_error_count == 0 || in efx_farch_fatal_interrupt()
1521 time_after(jiffies, efx->int_error_expire)) { in efx_farch_fatal_interrupt()
1522 efx->int_error_count = 0; in efx_farch_fatal_interrupt()
1523 efx->int_error_expire = in efx_farch_fatal_interrupt()
1526 if (++efx->int_error_count < EFX_MAX_INT_ERRORS) { in efx_farch_fatal_interrupt()
1527 netif_err(efx, hw, efx->net_dev, in efx_farch_fatal_interrupt()
1529 efx_schedule_reset(efx, RESET_TYPE_INT_ERROR); in efx_farch_fatal_interrupt()
1531 netif_err(efx, hw, efx->net_dev, in efx_farch_fatal_interrupt()
1534 efx_schedule_reset(efx, RESET_TYPE_DISABLE); in efx_farch_fatal_interrupt()
1545 struct efx_nic *efx = dev_id; in efx_farch_legacy_interrupt() local
1546 bool soft_enabled = ACCESS_ONCE(efx->irq_soft_enabled); in efx_farch_legacy_interrupt()
1547 efx_oword_t *int_ker = efx->irq_status.addr; in efx_farch_legacy_interrupt()
1555 efx_readd(efx, &reg, FR_BZ_INT_ISR0); in efx_farch_legacy_interrupt()
1562 if (EFX_DWORD_IS_ALL_ONES(reg) && efx_try_recovery(efx) && in efx_farch_legacy_interrupt()
1563 !efx->eeh_disabled_legacy_irq) { in efx_farch_legacy_interrupt()
1564 disable_irq_nosync(efx->legacy_irq); in efx_farch_legacy_interrupt()
1565 efx->eeh_disabled_legacy_irq = true; in efx_farch_legacy_interrupt()
1569 if (queues & (1U << efx->irq_level) && soft_enabled) { in efx_farch_legacy_interrupt()
1572 return efx_farch_fatal_interrupt(efx); in efx_farch_legacy_interrupt()
1573 efx->last_irq_cpu = raw_smp_processor_id(); in efx_farch_legacy_interrupt()
1577 efx->irq_zero_count = 0; in efx_farch_legacy_interrupt()
1581 efx_for_each_channel(channel, efx) { in efx_farch_legacy_interrupt()
1596 if (efx->irq_zero_count++ == 0) in efx_farch_legacy_interrupt()
1601 efx_for_each_channel(channel, efx) { in efx_farch_legacy_interrupt()
1613 netif_vdbg(efx, intr, efx->net_dev, in efx_farch_legacy_interrupt()
1630 struct efx_nic *efx = context->efx; in efx_farch_msi_interrupt() local
1631 efx_oword_t *int_ker = efx->irq_status.addr; in efx_farch_msi_interrupt()
1634 netif_vdbg(efx, intr, efx->net_dev, in efx_farch_msi_interrupt()
1638 if (!likely(ACCESS_ONCE(efx->irq_soft_enabled))) in efx_farch_msi_interrupt()
1642 if (context->index == efx->irq_level) { in efx_farch_msi_interrupt()
1645 return efx_farch_fatal_interrupt(efx); in efx_farch_msi_interrupt()
1646 efx->last_irq_cpu = raw_smp_processor_id(); in efx_farch_msi_interrupt()
1650 efx_schedule_channel_irq(efx->channel[context->index]); in efx_farch_msi_interrupt()
1658 void efx_farch_rx_push_indir_table(struct efx_nic *efx) in efx_farch_rx_push_indir_table() argument
1663 BUG_ON(efx_nic_rev(efx) < EFX_REV_FALCON_B0); in efx_farch_rx_push_indir_table()
1665 BUILD_BUG_ON(ARRAY_SIZE(efx->rx_indir_table) != in efx_farch_rx_push_indir_table()
1670 efx->rx_indir_table[i]); in efx_farch_rx_push_indir_table()
1671 efx_writed(efx, &dword, in efx_farch_rx_push_indir_table()
1686 void efx_farch_dimension_resources(struct efx_nic *efx, unsigned sram_lim_qw) in efx_farch_dimension_resources() argument
1691 struct siena_nic_data *nic_data = efx->nic_data; in efx_farch_dimension_resources()
1697 buftbl_min = ((efx->n_rx_channels * EFX_MAX_DMAQ_SIZE + in efx_farch_dimension_resources()
1698 efx->n_tx_channels * EFX_TXQ_TYPES * EFX_MAX_DMAQ_SIZE + in efx_farch_dimension_resources()
1699 efx->n_channels * EFX_MAX_EVQ_SIZE) in efx_farch_dimension_resources()
1701 vi_count = max(efx->n_channels, efx->n_tx_channels * EFX_TXQ_TYPES); in efx_farch_dimension_resources()
1704 if (efx->type->sriov_wanted) { in efx_farch_dimension_resources()
1705 if (efx->type->sriov_wanted(efx)) { in efx_farch_dimension_resources()
1718 efx_vf_size(efx)); in efx_farch_dimension_resources()
1720 (1024U - EFX_VI_BASE) >> efx->vi_scale); in efx_farch_dimension_resources()
1722 if (efx->vf_count > vf_limit) { in efx_farch_dimension_resources()
1723 netif_err(efx, probe, efx->net_dev, in efx_farch_dimension_resources()
1725 efx->vf_count, vf_limit); in efx_farch_dimension_resources()
1726 efx->vf_count = vf_limit; in efx_farch_dimension_resources()
1728 vi_count += efx->vf_count * efx_vf_size(efx); in efx_farch_dimension_resources()
1733 efx->tx_dc_base = sram_lim_qw - vi_count * TX_DC_ENTRIES; in efx_farch_dimension_resources()
1734 efx->rx_dc_base = efx->tx_dc_base - vi_count * RX_DC_ENTRIES; in efx_farch_dimension_resources()
1737 u32 efx_farch_fpga_ver(struct efx_nic *efx) in efx_farch_fpga_ver() argument
1740 efx_reado(efx, &altera_build, FR_AZ_ALTERA_BUILD); in efx_farch_fpga_ver()
1744 void efx_farch_init_common(struct efx_nic *efx) in efx_farch_init_common() argument
1749 EFX_POPULATE_OWORD_1(temp, FRF_AZ_SRM_TX_DC_BASE_ADR, efx->tx_dc_base); in efx_farch_init_common()
1750 efx_writeo(efx, &temp, FR_AZ_SRM_TX_DC_CFG); in efx_farch_init_common()
1751 EFX_POPULATE_OWORD_1(temp, FRF_AZ_SRM_RX_DC_BASE_ADR, efx->rx_dc_base); in efx_farch_init_common()
1752 efx_writeo(efx, &temp, FR_AZ_SRM_RX_DC_CFG); in efx_farch_init_common()
1757 efx_writeo(efx, &temp, FR_AZ_TX_DC_CFG); in efx_farch_init_common()
1764 efx_writeo(efx, &temp, FR_AZ_RX_DC_CFG); in efx_farch_init_common()
1766 efx_writeo(efx, &temp, FR_AZ_RX_DC_PF_WM); in efx_farch_init_common()
1771 EFX_INT_MODE_USE_MSI(efx), in efx_farch_init_common()
1772 FRF_AZ_INT_ADR_KER, efx->irq_status.dma_addr); in efx_farch_init_common()
1773 efx_writeo(efx, &temp, FR_AZ_INT_ADR_KER); in efx_farch_init_common()
1775 if (EFX_WORKAROUND_17213(efx) && !EFX_INT_MODE_USE_MSI(efx)) in efx_farch_init_common()
1777 efx->irq_level = 0x1f; in efx_farch_init_common()
1780 efx->irq_level = 0; in efx_farch_init_common()
1792 if (efx_nic_rev(efx) >= EFX_REV_SIENA_A0) in efx_farch_init_common()
1795 efx_writeo(efx, &temp, FR_AZ_FATAL_INTR_KER); in efx_farch_init_common()
1800 efx_reado(efx, &temp, FR_AZ_TX_RESERVED); in efx_farch_init_common()
1813 if (efx_nic_rev(efx) >= EFX_REV_FALCON_B0) in efx_farch_init_common()
1815 efx_writeo(efx, &temp, FR_AZ_TX_RESERVED); in efx_farch_init_common()
1817 if (efx_nic_rev(efx) >= EFX_REV_FALCON_B0) { in efx_farch_init_common()
1827 efx_writeo(efx, &temp, FR_BZ_TX_PACE); in efx_farch_init_common()
1905 efx_farch_filter_table_clear_entry(struct efx_nic *efx,
1952 static void efx_farch_filter_push_rx_config(struct efx_nic *efx) in efx_farch_filter_push_rx_config() argument
1954 struct efx_farch_filter_state *state = efx->filter_state; in efx_farch_filter_push_rx_config()
1958 efx_reado(efx, &filter_ctl, FR_BZ_RX_FILTER_CTL); in efx_farch_filter_push_rx_config()
2012 } else if (efx_nic_rev(efx) >= EFX_REV_FALCON_B0) { in efx_farch_filter_push_rx_config()
2020 efx->rx_scatter); in efx_farch_filter_push_rx_config()
2023 efx_writeo(efx, &filter_ctl, FR_BZ_RX_FILTER_CTL); in efx_farch_filter_push_rx_config()
2026 static void efx_farch_filter_push_tx_limits(struct efx_nic *efx) in efx_farch_filter_push_tx_limits() argument
2028 struct efx_farch_filter_state *state = efx->filter_state; in efx_farch_filter_push_tx_limits()
2032 efx_reado(efx, &tx_cfg, FR_AZ_TX_CFG); in efx_farch_filter_push_tx_limits()
2046 efx_writeo(efx, &tx_cfg, FR_AZ_TX_CFG); in efx_farch_filter_push_tx_limits()
2237 efx_farch_filter_init_rx_auto(struct efx_nic *efx, in efx_farch_filter_init_rx_auto() argument
2245 (efx_rss_enabled(efx) ? EFX_FILTER_FLAG_RX_RSS : 0) | in efx_farch_filter_init_rx_auto()
2246 (efx->rx_scatter ? EFX_FILTER_FLAG_RX_SCATTER : 0)); in efx_farch_filter_init_rx_auto()
2389 u32 efx_farch_filter_get_rx_id_limit(struct efx_nic *efx) in efx_farch_filter_get_rx_id_limit() argument
2391 struct efx_farch_filter_state *state = efx->filter_state; in efx_farch_filter_get_rx_id_limit()
2405 s32 efx_farch_filter_insert(struct efx_nic *efx, in efx_farch_filter_insert() argument
2409 struct efx_farch_filter_state *state = efx->filter_state; in efx_farch_filter_insert()
2425 netif_vdbg(efx, hw, efx->net_dev, in efx_farch_filter_insert()
2437 spin_lock_bh(&efx->filter_lock); in efx_farch_filter_insert()
2467 spin_lock_bh(&efx->filter_lock); in efx_farch_filter_insert()
2526 efx_farch_filter_push_rx_config(efx); in efx_farch_filter_insert()
2531 efx_farch_filter_push_tx_limits(efx); in efx_farch_filter_insert()
2533 efx_farch_filter_push_rx_config(efx); in efx_farch_filter_insert()
2536 efx_writeo(efx, &filter, in efx_farch_filter_insert()
2543 efx_farch_filter_table_clear_entry(efx, table, in efx_farch_filter_insert()
2547 netif_vdbg(efx, hw, efx->net_dev, in efx_farch_filter_insert()
2553 spin_unlock_bh(&efx->filter_lock); in efx_farch_filter_insert()
2558 efx_farch_filter_table_clear_entry(struct efx_nic *efx, in efx_farch_filter_table_clear_entry() argument
2571 efx_writeo(efx, &filter, table->offset + table->step * filter_idx); in efx_farch_filter_table_clear_entry()
2582 efx_farch_filter_push_tx_limits(efx); in efx_farch_filter_table_clear_entry()
2584 efx_farch_filter_push_rx_config(efx); in efx_farch_filter_table_clear_entry()
2588 static int efx_farch_filter_remove(struct efx_nic *efx, in efx_farch_filter_remove() argument
2600 efx_farch_filter_init_rx_auto(efx, spec); in efx_farch_filter_remove()
2601 efx_farch_filter_push_rx_config(efx); in efx_farch_filter_remove()
2603 efx_farch_filter_table_clear_entry(efx, table, filter_idx); in efx_farch_filter_remove()
2609 int efx_farch_filter_remove_safe(struct efx_nic *efx, in efx_farch_filter_remove_safe() argument
2613 struct efx_farch_filter_state *state = efx->filter_state; in efx_farch_filter_remove_safe()
2630 spin_lock_bh(&efx->filter_lock); in efx_farch_filter_remove_safe()
2631 rc = efx_farch_filter_remove(efx, table, filter_idx, priority); in efx_farch_filter_remove_safe()
2632 spin_unlock_bh(&efx->filter_lock); in efx_farch_filter_remove_safe()
2637 int efx_farch_filter_get_safe(struct efx_nic *efx, in efx_farch_filter_get_safe() argument
2641 struct efx_farch_filter_state *state = efx->filter_state; in efx_farch_filter_get_safe()
2658 spin_lock_bh(&efx->filter_lock); in efx_farch_filter_get_safe()
2668 spin_unlock_bh(&efx->filter_lock); in efx_farch_filter_get_safe()
2674 efx_farch_filter_table_clear(struct efx_nic *efx, in efx_farch_filter_table_clear() argument
2678 struct efx_farch_filter_state *state = efx->filter_state; in efx_farch_filter_table_clear()
2682 spin_lock_bh(&efx->filter_lock); in efx_farch_filter_table_clear()
2685 efx_farch_filter_remove(efx, table, in efx_farch_filter_table_clear()
2688 spin_unlock_bh(&efx->filter_lock); in efx_farch_filter_table_clear()
2691 int efx_farch_filter_clear_rx(struct efx_nic *efx, in efx_farch_filter_clear_rx() argument
2694 efx_farch_filter_table_clear(efx, EFX_FARCH_FILTER_TABLE_RX_IP, in efx_farch_filter_clear_rx()
2696 efx_farch_filter_table_clear(efx, EFX_FARCH_FILTER_TABLE_RX_MAC, in efx_farch_filter_clear_rx()
2698 efx_farch_filter_table_clear(efx, EFX_FARCH_FILTER_TABLE_RX_DEF, in efx_farch_filter_clear_rx()
2703 u32 efx_farch_filter_count_rx_used(struct efx_nic *efx, in efx_farch_filter_count_rx_used() argument
2706 struct efx_farch_filter_state *state = efx->filter_state; in efx_farch_filter_count_rx_used()
2712 spin_lock_bh(&efx->filter_lock); in efx_farch_filter_count_rx_used()
2725 spin_unlock_bh(&efx->filter_lock); in efx_farch_filter_count_rx_used()
2730 s32 efx_farch_filter_get_rx_ids(struct efx_nic *efx, in efx_farch_filter_get_rx_ids() argument
2734 struct efx_farch_filter_state *state = efx->filter_state; in efx_farch_filter_get_rx_ids()
2740 spin_lock_bh(&efx->filter_lock); in efx_farch_filter_get_rx_ids()
2759 spin_unlock_bh(&efx->filter_lock); in efx_farch_filter_get_rx_ids()
2765 void efx_farch_filter_table_restore(struct efx_nic *efx) in efx_farch_filter_table_restore() argument
2767 struct efx_farch_filter_state *state = efx->filter_state; in efx_farch_filter_table_restore()
2773 spin_lock_bh(&efx->filter_lock); in efx_farch_filter_table_restore()
2786 efx_writeo(efx, &filter, in efx_farch_filter_table_restore()
2791 efx_farch_filter_push_rx_config(efx); in efx_farch_filter_table_restore()
2792 efx_farch_filter_push_tx_limits(efx); in efx_farch_filter_table_restore()
2794 spin_unlock_bh(&efx->filter_lock); in efx_farch_filter_table_restore()
2797 void efx_farch_filter_table_remove(struct efx_nic *efx) in efx_farch_filter_table_remove() argument
2799 struct efx_farch_filter_state *state = efx->filter_state; in efx_farch_filter_table_remove()
2809 int efx_farch_filter_table_probe(struct efx_nic *efx) in efx_farch_filter_table_probe() argument
2818 efx->filter_state = state; in efx_farch_filter_table_probe()
2820 if (efx_nic_rev(efx) >= EFX_REV_FALCON_B0) { in efx_farch_filter_table_probe()
2828 if (efx_nic_rev(efx) >= EFX_REV_SIENA_A0) { in efx_farch_filter_table_probe()
2869 efx_farch_filter_init_rx_auto(efx, spec); in efx_farch_filter_table_probe()
2874 efx_farch_filter_push_rx_config(efx); in efx_farch_filter_table_probe()
2879 efx_farch_filter_table_remove(efx); in efx_farch_filter_table_probe()
2884 void efx_farch_filter_update_rx_scatter(struct efx_nic *efx) in efx_farch_filter_update_rx_scatter() argument
2886 struct efx_farch_filter_state *state = efx->filter_state; in efx_farch_filter_update_rx_scatter()
2892 spin_lock_bh(&efx->filter_lock); in efx_farch_filter_update_rx_scatter()
2902 efx->n_rx_channels) in efx_farch_filter_update_rx_scatter()
2905 if (efx->rx_scatter) in efx_farch_filter_update_rx_scatter()
2917 efx_writeo(efx, &filter, in efx_farch_filter_update_rx_scatter()
2922 efx_farch_filter_push_rx_config(efx); in efx_farch_filter_update_rx_scatter()
2924 spin_unlock_bh(&efx->filter_lock); in efx_farch_filter_update_rx_scatter()
2929 s32 efx_farch_filter_rfs_insert(struct efx_nic *efx, in efx_farch_filter_rfs_insert() argument
2932 return efx_farch_filter_insert(efx, gen_spec, true); in efx_farch_filter_rfs_insert()
2935 bool efx_farch_filter_rfs_expire_one(struct efx_nic *efx, u32 flow_id, in efx_farch_filter_rfs_expire_one() argument
2938 struct efx_farch_filter_state *state = efx->filter_state; in efx_farch_filter_rfs_expire_one()
2944 rps_may_expire_flow(efx->net_dev, table->spec[index].dmaq_id, in efx_farch_filter_rfs_expire_one()
2946 efx_farch_filter_table_clear_entry(efx, table, index); in efx_farch_filter_rfs_expire_one()
2955 void efx_farch_filter_sync_rx_mode(struct efx_nic *efx) in efx_farch_filter_sync_rx_mode() argument
2957 struct net_device *net_dev = efx->net_dev; in efx_farch_filter_sync_rx_mode()
2959 union efx_multicast_hash *mc_hash = &efx->multicast_hash; in efx_farch_filter_sync_rx_mode()
2963 if (!efx_dev_registered(efx)) in efx_farch_filter_sync_rx_mode()
2968 efx->unicast_filter = !(net_dev->flags & IFF_PROMISC); in efx_farch_filter_sync_rx_mode()