Lines Matching refs:efx
134 #define FALCON_XMAC_STATS_DMA_FLAG(efx) \ argument
135 (*(u32 *)((efx)->stats_buffer.addr + XgDmaDone_offset))
302 static int falcon_reset_hw(struct efx_nic *efx, enum reset_type method);
303 static void falcon_reconfigure_mac_wrapper(struct efx_nic *efx);
329 struct efx_nic *efx = (struct efx_nic *)data; in falcon_setsda() local
332 efx_reado(efx, ®, FR_AB_GPIO_CTL); in falcon_setsda()
334 efx_writeo(efx, ®, FR_AB_GPIO_CTL); in falcon_setsda()
339 struct efx_nic *efx = (struct efx_nic *)data; in falcon_setscl() local
342 efx_reado(efx, ®, FR_AB_GPIO_CTL); in falcon_setscl()
344 efx_writeo(efx, ®, FR_AB_GPIO_CTL); in falcon_setscl()
349 struct efx_nic *efx = (struct efx_nic *)data; in falcon_getsda() local
352 efx_reado(efx, ®, FR_AB_GPIO_CTL); in falcon_getsda()
358 struct efx_nic *efx = (struct efx_nic *)data; in falcon_getscl() local
361 efx_reado(efx, ®, FR_AB_GPIO_CTL); in falcon_getscl()
378 struct efx_nic *efx = channel->efx; in falcon_push_irq_moderation() local
394 efx_writed_page_locked(efx, &timer_cmd, FR_BZ_TIMER_COMMAND_P0, in falcon_push_irq_moderation()
398 static void falcon_deconfigure_mac_wrapper(struct efx_nic *efx);
400 static void falcon_prepare_flush(struct efx_nic *efx) in falcon_prepare_flush() argument
402 falcon_deconfigure_mac_wrapper(efx); in falcon_prepare_flush()
420 static inline void falcon_irq_ack_a1(struct efx_nic *efx) in falcon_irq_ack_a1() argument
425 efx_writed(efx, ®, FR_AA_INT_ACK_KER); in falcon_irq_ack_a1()
426 efx_readd(efx, ®, FR_AA_WORK_AROUND_BROKEN_PCI_READS); in falcon_irq_ack_a1()
431 struct efx_nic *efx = dev_id; in falcon_legacy_interrupt_a1() local
432 efx_oword_t *int_ker = efx->irq_status.addr; in falcon_legacy_interrupt_a1()
440 netif_vdbg(efx, intr, efx->net_dev, in falcon_legacy_interrupt_a1()
445 efx->last_irq_cpu = raw_smp_processor_id(); in falcon_legacy_interrupt_a1()
446 netif_vdbg(efx, intr, efx->net_dev, in falcon_legacy_interrupt_a1()
450 if (!likely(ACCESS_ONCE(efx->irq_soft_enabled))) in falcon_legacy_interrupt_a1()
456 return efx_farch_fatal_interrupt(efx); in falcon_legacy_interrupt_a1()
465 falcon_irq_ack_a1(efx); in falcon_legacy_interrupt_a1()
468 efx_schedule_channel_irq(efx_get_channel(efx, 0)); in falcon_legacy_interrupt_a1()
470 efx_schedule_channel_irq(efx_get_channel(efx, 1)); in falcon_legacy_interrupt_a1()
481 static void falcon_b0_rx_push_rss_config(struct efx_nic *efx) in falcon_b0_rx_push_rss_config() argument
486 memcpy(&temp, efx->rx_hash_key, sizeof(temp)); in falcon_b0_rx_push_rss_config()
487 efx_writeo(efx, &temp, FR_BZ_RX_RSS_TKEY); in falcon_b0_rx_push_rss_config()
489 efx_farch_rx_push_indir_table(efx); in falcon_b0_rx_push_rss_config()
501 static int falcon_spi_poll(struct efx_nic *efx) in falcon_spi_poll() argument
504 efx_reado(efx, ®, FR_AB_EE_SPI_HCMD); in falcon_spi_poll()
509 static int falcon_spi_wait(struct efx_nic *efx) in falcon_spi_wait() argument
519 if (!falcon_spi_poll(efx)) in falcon_spi_wait()
525 if (!falcon_spi_poll(efx)) in falcon_spi_wait()
528 netif_err(efx, hw, efx->net_dev, in falcon_spi_wait()
537 falcon_spi_cmd(struct efx_nic *efx, const struct falcon_spi_device *spi, in falcon_spi_cmd() argument
551 rc = falcon_spi_poll(efx); in falcon_spi_cmd()
558 efx_writeo(efx, ®, FR_AB_EE_SPI_HADR); in falcon_spi_cmd()
564 efx_writeo(efx, ®, FR_AB_EE_SPI_HDATA); in falcon_spi_cmd()
577 efx_writeo(efx, ®, FR_AB_EE_SPI_HCMD); in falcon_spi_cmd()
580 rc = falcon_spi_wait(efx); in falcon_spi_cmd()
586 efx_reado(efx, ®, FR_AB_EE_SPI_HDATA); in falcon_spi_cmd()
601 falcon_spi_read(struct efx_nic *efx, const struct falcon_spi_device *spi, in falcon_spi_read() argument
612 rc = falcon_spi_cmd(efx, spi, command, start + pos, NULL, in falcon_spi_read()
651 falcon_spi_wait_write(struct efx_nic *efx, const struct falcon_spi_device *spi) in falcon_spi_wait_write() argument
658 rc = falcon_spi_cmd(efx, spi, SPI_RDSR, -1, NULL, in falcon_spi_wait_write()
665 netif_err(efx, hw, efx->net_dev, in falcon_spi_wait_write()
676 falcon_spi_write(struct efx_nic *efx, const struct falcon_spi_device *spi, in falcon_spi_write() argument
685 rc = falcon_spi_cmd(efx, spi, SPI_WREN, -1, NULL, NULL, 0); in falcon_spi_write()
692 rc = falcon_spi_cmd(efx, spi, command, start + pos, in falcon_spi_write()
697 rc = falcon_spi_wait_write(efx, spi); in falcon_spi_write()
702 rc = falcon_spi_cmd(efx, spi, command, start + pos, in falcon_spi_write()
728 struct efx_nic *efx = part->common.mtd.priv; in falcon_spi_slow_wait() local
737 rc = falcon_spi_cmd(efx, spi, SPI_RDSR, -1, NULL, in falcon_spi_slow_wait()
752 falcon_spi_unlock(struct efx_nic *efx, const struct falcon_spi_device *spi) in falcon_spi_unlock() argument
759 rc = falcon_spi_cmd(efx, spi, SPI_RDSR, -1, NULL, in falcon_spi_unlock()
767 rc = falcon_spi_cmd(efx, spi, SPI_WREN, -1, NULL, NULL, 0); in falcon_spi_unlock()
770 rc = falcon_spi_cmd(efx, spi, SPI_SST_EWSR, -1, NULL, NULL, 0); in falcon_spi_unlock()
775 rc = falcon_spi_cmd(efx, spi, SPI_WRSR, -1, &status, in falcon_spi_unlock()
779 rc = falcon_spi_wait_write(efx, spi); in falcon_spi_unlock()
792 struct efx_nic *efx = part->common.mtd.priv; in falcon_spi_erase() local
804 rc = falcon_spi_unlock(efx, spi); in falcon_spi_erase()
807 rc = falcon_spi_cmd(efx, spi, SPI_WREN, -1, NULL, NULL, 0); in falcon_spi_erase()
810 rc = falcon_spi_cmd(efx, spi, spi->erase_command, start, NULL, in falcon_spi_erase()
820 rc = falcon_spi_read(efx, spi, start + pos, block_len, in falcon_spi_erase()
838 struct efx_nic *efx = part->mtd.priv; in falcon_mtd_rename() local
841 efx->name, part->type_name); in falcon_mtd_rename()
848 struct efx_nic *efx = mtd->priv; in falcon_mtd_read() local
849 struct falcon_nic_data *nic_data = efx->nic_data; in falcon_mtd_read()
855 rc = falcon_spi_read(efx, part->spi, part->offset + start, in falcon_mtd_read()
864 struct efx_nic *efx = mtd->priv; in falcon_mtd_erase() local
865 struct falcon_nic_data *nic_data = efx->nic_data; in falcon_mtd_erase()
880 struct efx_nic *efx = mtd->priv; in falcon_mtd_write() local
881 struct falcon_nic_data *nic_data = efx->nic_data; in falcon_mtd_write()
887 rc = falcon_spi_write(efx, part->spi, part->offset + start, in falcon_mtd_write()
896 struct efx_nic *efx = mtd->priv; in falcon_mtd_sync() local
897 struct falcon_nic_data *nic_data = efx->nic_data; in falcon_mtd_sync()
906 static int falcon_mtd_probe(struct efx_nic *efx) in falcon_mtd_probe() argument
908 struct falcon_nic_data *nic_data = efx->nic_data; in falcon_mtd_probe()
950 rc = efx_mtd_add(efx, &parts[0].common, n_parts, sizeof(*parts)); in falcon_mtd_probe()
966 static void falcon_setup_xaui(struct efx_nic *efx) in falcon_setup_xaui() argument
972 if (efx->phy_type == PHY_TYPE_NONE) in falcon_setup_xaui()
975 efx_reado(efx, &sdctl, FR_AB_XX_SD_CTL); in falcon_setup_xaui()
984 efx_writeo(efx, &sdctl, FR_AB_XX_SD_CTL); in falcon_setup_xaui()
995 efx_writeo(efx, &txdrv, FR_AB_XX_TXDRV_CTL); in falcon_setup_xaui()
998 int falcon_reset_xaui(struct efx_nic *efx) in falcon_reset_xaui() argument
1000 struct falcon_nic_data *nic_data = efx->nic_data; in falcon_reset_xaui()
1009 efx_writeo(efx, ®, FR_AB_XX_PWR_RST); in falcon_reset_xaui()
1013 efx_reado(efx, ®, FR_AB_XX_PWR_RST); in falcon_reset_xaui()
1016 falcon_setup_xaui(efx); in falcon_reset_xaui()
1021 netif_err(efx, hw, efx->net_dev, in falcon_reset_xaui()
1026 static void falcon_ack_status_intr(struct efx_nic *efx) in falcon_ack_status_intr() argument
1028 struct falcon_nic_data *nic_data = efx->nic_data; in falcon_ack_status_intr()
1031 if ((efx_nic_rev(efx) != EFX_REV_FALCON_B0) || LOOPBACK_INTERNAL(efx)) in falcon_ack_status_intr()
1035 if (!efx->link_state.up) in falcon_ack_status_intr()
1043 efx_reado(efx, ®, FR_AB_XM_MGT_INT_MSK); in falcon_ack_status_intr()
1046 static bool falcon_xgxs_link_ok(struct efx_nic *efx) in falcon_xgxs_link_ok() argument
1053 efx_reado(efx, ®, FR_AB_XX_CORE_STAT); in falcon_xgxs_link_ok()
1064 efx_writeo(efx, ®, FR_AB_XX_CORE_STAT); in falcon_xgxs_link_ok()
1069 static bool falcon_xmac_link_ok(struct efx_nic *efx) in falcon_xmac_link_ok() argument
1077 return (efx->loopback_mode == LOOPBACK_XGMII || in falcon_xmac_link_ok()
1078 falcon_xgxs_link_ok(efx)) && in falcon_xmac_link_ok()
1079 (!(efx->mdio.mmds & (1 << MDIO_MMD_PHYXS)) || in falcon_xmac_link_ok()
1080 LOOPBACK_INTERNAL(efx) || in falcon_xmac_link_ok()
1081 efx_mdio_phyxgxs_lane_sync(efx)); in falcon_xmac_link_ok()
1084 static void falcon_reconfigure_xmac_core(struct efx_nic *efx) in falcon_reconfigure_xmac_core() argument
1088 bool rx_fc = !!(efx->link_state.fc & EFX_FC_RX); in falcon_reconfigure_xmac_core()
1089 bool tx_fc = !!(efx->link_state.fc & EFX_FC_TX); in falcon_reconfigure_xmac_core()
1096 efx_writeo(efx, ®, FR_AB_XM_GLB_CFG); in falcon_reconfigure_xmac_core()
1106 efx_writeo(efx, ®, FR_AB_XM_TX_CFG); in falcon_reconfigure_xmac_core()
1113 FRF_AB_XM_ACPT_ALL_UCAST, !efx->unicast_filter, in falcon_reconfigure_xmac_core()
1115 efx_writeo(efx, ®, FR_AB_XM_RX_CFG); in falcon_reconfigure_xmac_core()
1118 max_frame_len = EFX_MAX_FRAME_LEN(efx->net_dev->mtu); in falcon_reconfigure_xmac_core()
1120 efx_writeo(efx, ®, FR_AB_XM_RX_PARAM); in falcon_reconfigure_xmac_core()
1124 efx_writeo(efx, ®, FR_AB_XM_TX_PARAM); in falcon_reconfigure_xmac_core()
1129 efx_writeo(efx, ®, FR_AB_XM_FC); in falcon_reconfigure_xmac_core()
1132 memcpy(®, &efx->net_dev->dev_addr[0], 4); in falcon_reconfigure_xmac_core()
1133 efx_writeo(efx, ®, FR_AB_XM_ADR_LO); in falcon_reconfigure_xmac_core()
1134 memcpy(®, &efx->net_dev->dev_addr[4], 2); in falcon_reconfigure_xmac_core()
1135 efx_writeo(efx, ®, FR_AB_XM_ADR_HI); in falcon_reconfigure_xmac_core()
1138 static void falcon_reconfigure_xgxs_core(struct efx_nic *efx) in falcon_reconfigure_xgxs_core() argument
1141 bool xgxs_loopback = (efx->loopback_mode == LOOPBACK_XGXS); in falcon_reconfigure_xgxs_core()
1142 bool xaui_loopback = (efx->loopback_mode == LOOPBACK_XAUI); in falcon_reconfigure_xgxs_core()
1143 bool xgmii_loopback = (efx->loopback_mode == LOOPBACK_XGMII); in falcon_reconfigure_xgxs_core()
1148 efx_reado(efx, ®, FR_AB_XX_CORE_STAT); in falcon_reconfigure_xgxs_core()
1152 efx_reado(efx, ®, FR_AB_XX_SD_CTL); in falcon_reconfigure_xgxs_core()
1159 falcon_reset_xaui(efx); in falcon_reconfigure_xgxs_core()
1161 efx_reado(efx, ®, FR_AB_XX_CORE_STAT); in falcon_reconfigure_xgxs_core()
1167 efx_writeo(efx, ®, FR_AB_XX_CORE_STAT); in falcon_reconfigure_xgxs_core()
1169 efx_reado(efx, ®, FR_AB_XX_SD_CTL); in falcon_reconfigure_xgxs_core()
1174 efx_writeo(efx, ®, FR_AB_XX_SD_CTL); in falcon_reconfigure_xgxs_core()
1179 static bool falcon_xmac_link_ok_retry(struct efx_nic *efx, int tries) in falcon_xmac_link_ok_retry() argument
1181 bool mac_up = falcon_xmac_link_ok(efx); in falcon_xmac_link_ok_retry()
1183 if (LOOPBACK_MASK(efx) & LOOPBACKS_EXTERNAL(efx) & LOOPBACKS_WS || in falcon_xmac_link_ok_retry()
1184 efx_phy_mode_disabled(efx->phy_mode)) in falcon_xmac_link_ok_retry()
1188 falcon_stop_nic_stats(efx); in falcon_xmac_link_ok_retry()
1191 netif_dbg(efx, hw, efx->net_dev, "bashing xaui\n"); in falcon_xmac_link_ok_retry()
1192 falcon_reset_xaui(efx); in falcon_xmac_link_ok_retry()
1195 mac_up = falcon_xmac_link_ok(efx); in falcon_xmac_link_ok_retry()
1199 falcon_start_nic_stats(efx); in falcon_xmac_link_ok_retry()
1204 static bool falcon_xmac_check_fault(struct efx_nic *efx) in falcon_xmac_check_fault() argument
1206 return !falcon_xmac_link_ok_retry(efx, 5); in falcon_xmac_check_fault()
1209 static int falcon_reconfigure_xmac(struct efx_nic *efx) in falcon_reconfigure_xmac() argument
1211 struct falcon_nic_data *nic_data = efx->nic_data; in falcon_reconfigure_xmac()
1213 efx_farch_filter_sync_rx_mode(efx); in falcon_reconfigure_xmac()
1215 falcon_reconfigure_xgxs_core(efx); in falcon_reconfigure_xmac()
1216 falcon_reconfigure_xmac_core(efx); in falcon_reconfigure_xmac()
1218 falcon_reconfigure_mac_wrapper(efx); in falcon_reconfigure_xmac()
1220 nic_data->xmac_poll_required = !falcon_xmac_link_ok_retry(efx, 5); in falcon_reconfigure_xmac()
1221 falcon_ack_status_intr(efx); in falcon_reconfigure_xmac()
1226 static void falcon_poll_xmac(struct efx_nic *efx) in falcon_poll_xmac() argument
1228 struct falcon_nic_data *nic_data = efx->nic_data; in falcon_poll_xmac()
1231 if (!efx->link_state.up || !nic_data->xmac_poll_required) in falcon_poll_xmac()
1234 nic_data->xmac_poll_required = !falcon_xmac_link_ok_retry(efx, 1); in falcon_poll_xmac()
1235 falcon_ack_status_intr(efx); in falcon_poll_xmac()
1245 static void falcon_push_multicast_hash(struct efx_nic *efx) in falcon_push_multicast_hash() argument
1247 union efx_multicast_hash *mc_hash = &efx->multicast_hash; in falcon_push_multicast_hash()
1249 WARN_ON(!mutex_is_locked(&efx->mac_lock)); in falcon_push_multicast_hash()
1251 efx_writeo(efx, &mc_hash->oword[0], FR_AB_MAC_MC_HASH_REG0); in falcon_push_multicast_hash()
1252 efx_writeo(efx, &mc_hash->oword[1], FR_AB_MAC_MC_HASH_REG1); in falcon_push_multicast_hash()
1255 static void falcon_reset_macs(struct efx_nic *efx) in falcon_reset_macs() argument
1257 struct falcon_nic_data *nic_data = efx->nic_data; in falcon_reset_macs()
1261 if (efx_nic_rev(efx) < EFX_REV_FALCON_B0) { in falcon_reset_macs()
1266 efx_writeo(efx, ®, FR_AB_XM_GLB_CFG); in falcon_reset_macs()
1269 efx_reado(efx, ®, FR_AB_XM_GLB_CFG); in falcon_reset_macs()
1276 netif_err(efx, hw, efx->net_dev, in falcon_reset_macs()
1283 efx_reado(efx, &mac_ctrl, FR_AB_MAC_CTRL); in falcon_reset_macs()
1285 efx_writeo(efx, &mac_ctrl, FR_AB_MAC_CTRL); in falcon_reset_macs()
1287 efx_reado(efx, ®, FR_AB_GLB_CTL); in falcon_reset_macs()
1291 efx_writeo(efx, ®, FR_AB_GLB_CTL); in falcon_reset_macs()
1295 efx_reado(efx, ®, FR_AB_GLB_CTL); in falcon_reset_macs()
1299 netif_dbg(efx, hw, efx->net_dev, in falcon_reset_macs()
1305 netif_err(efx, hw, efx->net_dev, "MAC reset failed\n"); in falcon_reset_macs()
1314 efx_writeo(efx, &mac_ctrl, FR_AB_MAC_CTRL); in falcon_reset_macs()
1316 falcon_setup_xaui(efx); in falcon_reset_macs()
1319 static void falcon_drain_tx_fifo(struct efx_nic *efx) in falcon_drain_tx_fifo() argument
1323 if ((efx_nic_rev(efx) < EFX_REV_FALCON_B0) || in falcon_drain_tx_fifo()
1324 (efx->loopback_mode != LOOPBACK_NONE)) in falcon_drain_tx_fifo()
1327 efx_reado(efx, ®, FR_AB_MAC_CTRL); in falcon_drain_tx_fifo()
1332 falcon_reset_macs(efx); in falcon_drain_tx_fifo()
1335 static void falcon_deconfigure_mac_wrapper(struct efx_nic *efx) in falcon_deconfigure_mac_wrapper() argument
1339 if (efx_nic_rev(efx) < EFX_REV_FALCON_B0) in falcon_deconfigure_mac_wrapper()
1343 efx_reado(efx, ®, FR_AZ_RX_CFG); in falcon_deconfigure_mac_wrapper()
1345 efx_writeo(efx, ®, FR_AZ_RX_CFG); in falcon_deconfigure_mac_wrapper()
1348 falcon_drain_tx_fifo(efx); in falcon_deconfigure_mac_wrapper()
1351 static void falcon_reconfigure_mac_wrapper(struct efx_nic *efx) in falcon_reconfigure_mac_wrapper() argument
1353 struct efx_link_state *link_state = &efx->link_state; in falcon_reconfigure_mac_wrapper()
1357 isolate = !!ACCESS_ONCE(efx->reset_pending); in falcon_reconfigure_mac_wrapper()
1373 FRF_AB_MAC_UC_PROM, !efx->unicast_filter, in falcon_reconfigure_mac_wrapper()
1378 if (efx_nic_rev(efx) >= EFX_REV_FALCON_B0) { in falcon_reconfigure_mac_wrapper()
1383 efx_writeo(efx, ®, FR_AB_MAC_CTRL); in falcon_reconfigure_mac_wrapper()
1386 falcon_push_multicast_hash(efx); in falcon_reconfigure_mac_wrapper()
1388 efx_reado(efx, ®, FR_AZ_RX_CFG); in falcon_reconfigure_mac_wrapper()
1393 if (efx_nic_rev(efx) >= EFX_REV_FALCON_B0) in falcon_reconfigure_mac_wrapper()
1395 efx_writeo(efx, ®, FR_AZ_RX_CFG); in falcon_reconfigure_mac_wrapper()
1398 static void falcon_stats_request(struct efx_nic *efx) in falcon_stats_request() argument
1400 struct falcon_nic_data *nic_data = efx->nic_data; in falcon_stats_request()
1406 FALCON_XMAC_STATS_DMA_FLAG(efx) = 0; in falcon_stats_request()
1414 efx->stats_buffer.dma_addr); in falcon_stats_request()
1415 efx_writeo(efx, ®, FR_AB_MAC_STAT_DMA); in falcon_stats_request()
1420 static void falcon_stats_complete(struct efx_nic *efx) in falcon_stats_complete() argument
1422 struct falcon_nic_data *nic_data = efx->nic_data; in falcon_stats_complete()
1428 if (FALCON_XMAC_STATS_DMA_FLAG(efx)) { in falcon_stats_complete()
1432 efx->stats_buffer.addr, true); in falcon_stats_complete()
1434 netif_err(efx, hw, efx->net_dev, in falcon_stats_complete()
1441 struct efx_nic *efx = (struct efx_nic *)context; in falcon_stats_timer_func() local
1442 struct falcon_nic_data *nic_data = efx->nic_data; in falcon_stats_timer_func()
1444 spin_lock(&efx->stats_lock); in falcon_stats_timer_func()
1446 falcon_stats_complete(efx); in falcon_stats_timer_func()
1448 falcon_stats_request(efx); in falcon_stats_timer_func()
1450 spin_unlock(&efx->stats_lock); in falcon_stats_timer_func()
1453 static bool falcon_loopback_link_poll(struct efx_nic *efx) in falcon_loopback_link_poll() argument
1455 struct efx_link_state old_state = efx->link_state; in falcon_loopback_link_poll()
1457 WARN_ON(!mutex_is_locked(&efx->mac_lock)); in falcon_loopback_link_poll()
1458 WARN_ON(!LOOPBACK_INTERNAL(efx)); in falcon_loopback_link_poll()
1460 efx->link_state.fd = true; in falcon_loopback_link_poll()
1461 efx->link_state.fc = efx->wanted_fc; in falcon_loopback_link_poll()
1462 efx->link_state.up = true; in falcon_loopback_link_poll()
1463 efx->link_state.speed = 10000; in falcon_loopback_link_poll()
1465 return !efx_link_state_equal(&efx->link_state, &old_state); in falcon_loopback_link_poll()
1468 static int falcon_reconfigure_port(struct efx_nic *efx) in falcon_reconfigure_port() argument
1472 WARN_ON(efx_nic_rev(efx) > EFX_REV_FALCON_B0); in falcon_reconfigure_port()
1478 if (LOOPBACK_INTERNAL(efx)) in falcon_reconfigure_port()
1479 falcon_loopback_link_poll(efx); in falcon_reconfigure_port()
1481 efx->phy_op->poll(efx); in falcon_reconfigure_port()
1483 falcon_stop_nic_stats(efx); in falcon_reconfigure_port()
1484 falcon_deconfigure_mac_wrapper(efx); in falcon_reconfigure_port()
1486 falcon_reset_macs(efx); in falcon_reconfigure_port()
1488 efx->phy_op->reconfigure(efx); in falcon_reconfigure_port()
1489 rc = falcon_reconfigure_xmac(efx); in falcon_reconfigure_port()
1492 falcon_start_nic_stats(efx); in falcon_reconfigure_port()
1495 efx_link_status_changed(efx); in falcon_reconfigure_port()
1507 static void falcon_a1_prepare_enable_fc_tx(struct efx_nic *efx) in falcon_a1_prepare_enable_fc_tx() argument
1510 efx_schedule_reset(efx, RESET_TYPE_INVISIBLE); in falcon_a1_prepare_enable_fc_tx()
1513 static void falcon_b0_prepare_enable_fc_tx(struct efx_nic *efx) in falcon_b0_prepare_enable_fc_tx() argument
1516 falcon_stop_nic_stats(efx); in falcon_b0_prepare_enable_fc_tx()
1517 falcon_drain_tx_fifo(efx); in falcon_b0_prepare_enable_fc_tx()
1518 falcon_reconfigure_xmac(efx); in falcon_b0_prepare_enable_fc_tx()
1519 falcon_start_nic_stats(efx); in falcon_b0_prepare_enable_fc_tx()
1530 static int falcon_gmii_wait(struct efx_nic *efx) in falcon_gmii_wait() argument
1537 efx_reado(efx, &md_stat, FR_AB_MD_STAT); in falcon_gmii_wait()
1541 netif_err(efx, hw, efx->net_dev, in falcon_gmii_wait()
1551 netif_err(efx, hw, efx->net_dev, "timed out waiting for GMII\n"); in falcon_gmii_wait()
1559 struct efx_nic *efx = netdev_priv(net_dev); in falcon_mdio_write() local
1560 struct falcon_nic_data *nic_data = efx->nic_data; in falcon_mdio_write()
1564 netif_vdbg(efx, hw, efx->net_dev, in falcon_mdio_write()
1571 rc = falcon_gmii_wait(efx); in falcon_mdio_write()
1577 efx_writeo(efx, ®, FR_AB_MD_PHY_ADR); in falcon_mdio_write()
1581 efx_writeo(efx, ®, FR_AB_MD_ID); in falcon_mdio_write()
1585 efx_writeo(efx, ®, FR_AB_MD_TXD); in falcon_mdio_write()
1590 efx_writeo(efx, ®, FR_AB_MD_CS); in falcon_mdio_write()
1593 rc = falcon_gmii_wait(efx); in falcon_mdio_write()
1599 efx_writeo(efx, ®, FR_AB_MD_CS); in falcon_mdio_write()
1612 struct efx_nic *efx = netdev_priv(net_dev); in falcon_mdio_read() local
1613 struct falcon_nic_data *nic_data = efx->nic_data; in falcon_mdio_read()
1620 rc = falcon_gmii_wait(efx); in falcon_mdio_read()
1625 efx_writeo(efx, ®, FR_AB_MD_PHY_ADR); in falcon_mdio_read()
1629 efx_writeo(efx, ®, FR_AB_MD_ID); in falcon_mdio_read()
1633 efx_writeo(efx, ®, FR_AB_MD_CS); in falcon_mdio_read()
1636 rc = falcon_gmii_wait(efx); in falcon_mdio_read()
1638 efx_reado(efx, ®, FR_AB_MD_RXD); in falcon_mdio_read()
1640 netif_vdbg(efx, hw, efx->net_dev, in falcon_mdio_read()
1648 efx_writeo(efx, ®, FR_AB_MD_CS); in falcon_mdio_read()
1650 netif_dbg(efx, hw, efx->net_dev, in falcon_mdio_read()
1661 static int falcon_probe_port(struct efx_nic *efx) in falcon_probe_port() argument
1663 struct falcon_nic_data *nic_data = efx->nic_data; in falcon_probe_port()
1666 switch (efx->phy_type) { in falcon_probe_port()
1668 efx->phy_op = &falcon_sfx7101_phy_ops; in falcon_probe_port()
1672 efx->phy_op = &falcon_qt202x_phy_ops; in falcon_probe_port()
1675 efx->phy_op = &falcon_txc_phy_ops; in falcon_probe_port()
1678 netif_err(efx, probe, efx->net_dev, "Unknown PHY type %d\n", in falcon_probe_port()
1679 efx->phy_type); in falcon_probe_port()
1685 efx->mdio.mdio_read = falcon_mdio_read; in falcon_probe_port()
1686 efx->mdio.mdio_write = falcon_mdio_write; in falcon_probe_port()
1687 rc = efx->phy_op->probe(efx); in falcon_probe_port()
1692 efx->link_state.speed = 10000; in falcon_probe_port()
1693 efx->link_state.fd = true; in falcon_probe_port()
1696 if (efx_nic_rev(efx) >= EFX_REV_FALCON_B0) in falcon_probe_port()
1697 efx->wanted_fc = EFX_FC_RX | EFX_FC_TX; in falcon_probe_port()
1699 efx->wanted_fc = EFX_FC_RX; in falcon_probe_port()
1700 if (efx->mdio.mmds & MDIO_DEVS_AN) in falcon_probe_port()
1701 efx->wanted_fc |= EFX_FC_AUTO; in falcon_probe_port()
1704 rc = efx_nic_alloc_buffer(efx, &efx->stats_buffer, in falcon_probe_port()
1708 netif_dbg(efx, probe, efx->net_dev, in falcon_probe_port()
1710 (u64)efx->stats_buffer.dma_addr, in falcon_probe_port()
1711 efx->stats_buffer.addr, in falcon_probe_port()
1712 (u64)virt_to_phys(efx->stats_buffer.addr)); in falcon_probe_port()
1717 static void falcon_remove_port(struct efx_nic *efx) in falcon_remove_port() argument
1719 efx->phy_op->remove(efx); in falcon_remove_port()
1720 efx_nic_free_buffer(efx, &efx->stats_buffer); in falcon_remove_port()
1727 struct efx_nic *efx = channel->efx; in falcon_handle_global_event() local
1728 struct falcon_nic_data *nic_data = efx->nic_data; in falcon_handle_global_event()
1736 if ((efx_nic_rev(efx) == EFX_REV_FALCON_B0) && in falcon_handle_global_event()
1742 if (efx_nic_rev(efx) <= EFX_REV_FALCON_A1 ? in falcon_handle_global_event()
1745 netif_err(efx, rx_err, efx->net_dev, in falcon_handle_global_event()
1749 atomic_inc(&efx->rx_reset); in falcon_handle_global_event()
1750 efx_schedule_reset(efx, EFX_WORKAROUND_6555(efx) ? in falcon_handle_global_event()
1765 falcon_read_nvram(struct efx_nic *efx, struct falcon_nvconfig *nvconfig_out) in falcon_read_nvram() argument
1767 struct falcon_nic_data *nic_data = efx->nic_data; in falcon_read_nvram()
1788 rc = falcon_spi_read(efx, spi, 0, FALCON_NVCONFIG_END, NULL, region); in falcon_read_nvram()
1791 netif_err(efx, hw, efx->net_dev, "Failed to read %s\n", in falcon_read_nvram()
1803 netif_err(efx, hw, efx->net_dev, in falcon_read_nvram()
1808 netif_err(efx, hw, efx->net_dev, in falcon_read_nvram()
1822 netif_err(efx, hw, efx->net_dev, in falcon_read_nvram()
1836 static int falcon_test_nvram(struct efx_nic *efx) in falcon_test_nvram() argument
1838 return falcon_read_nvram(efx, NULL); in falcon_test_nvram()
1881 falcon_b0_test_chip(struct efx_nic *efx, struct efx_self_tests *tests) in falcon_b0_test_chip() argument
1886 mutex_lock(&efx->mac_lock); in falcon_b0_test_chip()
1887 if (efx->loopback_modes) { in falcon_b0_test_chip()
1890 if (efx->loopback_modes & (1 << LOOPBACK_XGMII)) in falcon_b0_test_chip()
1891 efx->loopback_mode = LOOPBACK_XGMII; in falcon_b0_test_chip()
1893 efx->loopback_mode = __ffs(efx->loopback_modes); in falcon_b0_test_chip()
1895 __efx_reconfigure_port(efx); in falcon_b0_test_chip()
1896 mutex_unlock(&efx->mac_lock); in falcon_b0_test_chip()
1898 efx_reset_down(efx, reset_method); in falcon_b0_test_chip()
1901 efx_farch_test_registers(efx, falcon_b0_register_tests, in falcon_b0_test_chip()
1905 rc = falcon_reset_hw(efx, reset_method); in falcon_b0_test_chip()
1906 rc2 = efx_reset_up(efx, reset_method, rc == 0); in falcon_b0_test_chip()
1961 static int __falcon_reset_hw(struct efx_nic *efx, enum reset_type method) in __falcon_reset_hw() argument
1963 struct falcon_nic_data *nic_data = efx->nic_data; in __falcon_reset_hw()
1967 netif_dbg(efx, hw, efx->net_dev, "performing %s hardware reset\n", in __falcon_reset_hw()
1972 rc = pci_save_state(efx->pci_dev); in __falcon_reset_hw()
1974 netif_err(efx, drv, efx->net_dev, in __falcon_reset_hw()
1979 if (efx_nic_is_dual_func(efx)) { in __falcon_reset_hw()
1982 netif_err(efx, drv, efx->net_dev, in __falcon_reset_hw()
2008 efx_writeo(efx, &glb_ctl_reg_ker, FR_AB_GLB_CTL); in __falcon_reset_hw()
2010 netif_dbg(efx, hw, efx->net_dev, "waiting for hardware reset\n"); in __falcon_reset_hw()
2015 if (efx_nic_is_dual_func(efx)) in __falcon_reset_hw()
2017 pci_restore_state(efx->pci_dev); in __falcon_reset_hw()
2018 netif_dbg(efx, drv, efx->net_dev, in __falcon_reset_hw()
2023 efx_reado(efx, &glb_ctl_reg_ker, FR_AB_GLB_CTL); in __falcon_reset_hw()
2026 netif_err(efx, hw, efx->net_dev, in __falcon_reset_hw()
2030 netif_dbg(efx, hw, efx->net_dev, "hardware reset complete\n"); in __falcon_reset_hw()
2036 pci_restore_state(efx->pci_dev); in __falcon_reset_hw()
2042 static int falcon_reset_hw(struct efx_nic *efx, enum reset_type method) in falcon_reset_hw() argument
2044 struct falcon_nic_data *nic_data = efx->nic_data; in falcon_reset_hw()
2048 rc = __falcon_reset_hw(efx, method); in falcon_reset_hw()
2054 static void falcon_monitor(struct efx_nic *efx) in falcon_monitor() argument
2059 BUG_ON(!mutex_is_locked(&efx->mac_lock)); in falcon_monitor()
2061 rc = falcon_board(efx)->type->monitor(efx); in falcon_monitor()
2063 netif_err(efx, hw, efx->net_dev, in falcon_monitor()
2066 efx->phy_mode |= PHY_MODE_LOW_POWER; in falcon_monitor()
2067 rc = __efx_reconfigure_port(efx); in falcon_monitor()
2071 if (LOOPBACK_INTERNAL(efx)) in falcon_monitor()
2072 link_changed = falcon_loopback_link_poll(efx); in falcon_monitor()
2074 link_changed = efx->phy_op->poll(efx); in falcon_monitor()
2077 falcon_stop_nic_stats(efx); in falcon_monitor()
2078 falcon_deconfigure_mac_wrapper(efx); in falcon_monitor()
2080 falcon_reset_macs(efx); in falcon_monitor()
2081 rc = falcon_reconfigure_xmac(efx); in falcon_monitor()
2084 falcon_start_nic_stats(efx); in falcon_monitor()
2086 efx_link_status_changed(efx); in falcon_monitor()
2089 falcon_poll_xmac(efx); in falcon_monitor()
2095 static int falcon_reset_sram(struct efx_nic *efx) in falcon_reset_sram() argument
2101 efx_reado(efx, &gpio_cfg_reg_ker, FR_AB_GPIO_CTL); in falcon_reset_sram()
2104 efx_writeo(efx, &gpio_cfg_reg_ker, FR_AB_GPIO_CTL); in falcon_reset_sram()
2110 efx_writeo(efx, &srm_cfg_reg_ker, FR_AZ_SRM_CFG); in falcon_reset_sram()
2115 netif_dbg(efx, hw, efx->net_dev, in falcon_reset_sram()
2122 efx_reado(efx, &srm_cfg_reg_ker, FR_AZ_SRM_CFG); in falcon_reset_sram()
2124 netif_dbg(efx, hw, efx->net_dev, in falcon_reset_sram()
2131 netif_err(efx, hw, efx->net_dev, "timed out waiting for SRAM reset\n"); in falcon_reset_sram()
2135 static void falcon_spi_device_init(struct efx_nic *efx, in falcon_spi_device_init() argument
2161 static int falcon_probe_nvconfig(struct efx_nic *efx) in falcon_probe_nvconfig() argument
2163 struct falcon_nic_data *nic_data = efx->nic_data; in falcon_probe_nvconfig()
2171 rc = falcon_read_nvram(efx, nvconfig); in falcon_probe_nvconfig()
2175 efx->phy_type = nvconfig->board_v2.port0_phy_type; in falcon_probe_nvconfig()
2176 efx->mdio.prtad = nvconfig->board_v2.port0_phy_addr; in falcon_probe_nvconfig()
2180 efx, &nic_data->spi_flash, FFE_AB_SPI_DEVICE_FLASH, in falcon_probe_nvconfig()
2184 efx, &nic_data->spi_eeprom, FFE_AB_SPI_DEVICE_EEPROM, in falcon_probe_nvconfig()
2190 ether_addr_copy(efx->net_dev->perm_addr, nvconfig->mac_address[0]); in falcon_probe_nvconfig()
2192 netif_dbg(efx, probe, efx->net_dev, "PHY is %d phy_id %d\n", in falcon_probe_nvconfig()
2193 efx->phy_type, efx->mdio.prtad); in falcon_probe_nvconfig()
2195 rc = falcon_probe_board(efx, in falcon_probe_nvconfig()
2202 static int falcon_dimension_resources(struct efx_nic *efx) in falcon_dimension_resources() argument
2204 efx->rx_dc_base = 0x20000; in falcon_dimension_resources()
2205 efx->tx_dc_base = 0x26000; in falcon_dimension_resources()
2210 static void falcon_probe_spi_devices(struct efx_nic *efx) in falcon_probe_spi_devices() argument
2212 struct falcon_nic_data *nic_data = efx->nic_data; in falcon_probe_spi_devices()
2216 efx_reado(efx, &gpio_ctl, FR_AB_GPIO_CTL); in falcon_probe_spi_devices()
2217 efx_reado(efx, &nic_stat, FR_AB_NIC_STAT); in falcon_probe_spi_devices()
2218 efx_reado(efx, &ee_vpd_cfg, FR_AB_EE_VPD_CFG0); in falcon_probe_spi_devices()
2223 netif_dbg(efx, probe, efx->net_dev, "Booted from %s\n", in falcon_probe_spi_devices()
2230 netif_dbg(efx, probe, efx->net_dev, in falcon_probe_spi_devices()
2238 efx_writeo(efx, &ee_vpd_cfg, FR_AB_EE_VPD_CFG0); in falcon_probe_spi_devices()
2244 falcon_spi_device_init(efx, &nic_data->spi_flash, in falcon_probe_spi_devices()
2248 falcon_spi_device_init(efx, &nic_data->spi_eeprom, in falcon_probe_spi_devices()
2253 static unsigned int falcon_a1_mem_map_size(struct efx_nic *efx) in falcon_a1_mem_map_size() argument
2258 static unsigned int falcon_b0_mem_map_size(struct efx_nic *efx) in falcon_b0_mem_map_size() argument
2267 static int falcon_probe_nic(struct efx_nic *efx) in falcon_probe_nic() argument
2273 efx->primary = efx; /* only one usable function per controller */ in falcon_probe_nic()
2279 efx->nic_data = nic_data; in falcon_probe_nic()
2283 if (efx_farch_fpga_ver(efx) != 0) { in falcon_probe_nic()
2284 netif_err(efx, probe, efx->net_dev, in falcon_probe_nic()
2289 if (efx_nic_rev(efx) <= EFX_REV_FALCON_A1) { in falcon_probe_nic()
2292 u8 pci_rev = efx->pci_dev->revision; in falcon_probe_nic()
2295 netif_err(efx, probe, efx->net_dev, in falcon_probe_nic()
2299 efx_reado(efx, &nic_stat, FR_AB_NIC_STAT); in falcon_probe_nic()
2301 netif_err(efx, probe, efx->net_dev, in falcon_probe_nic()
2306 netif_err(efx, probe, efx->net_dev, in falcon_probe_nic()
2311 dev = pci_dev_get(efx->pci_dev); in falcon_probe_nic()
2315 if (dev->bus == efx->pci_dev->bus && in falcon_probe_nic()
2316 dev->devfn == efx->pci_dev->devfn + 1) { in falcon_probe_nic()
2322 netif_err(efx, probe, efx->net_dev, in falcon_probe_nic()
2330 rc = __falcon_reset_hw(efx, RESET_TYPE_ALL); in falcon_probe_nic()
2332 netif_err(efx, probe, efx->net_dev, "failed to reset NIC\n"); in falcon_probe_nic()
2337 rc = efx_nic_alloc_buffer(efx, &efx->irq_status, sizeof(efx_oword_t), in falcon_probe_nic()
2341 BUG_ON(efx->irq_status.dma_addr & 0x0f); in falcon_probe_nic()
2343 netif_dbg(efx, probe, efx->net_dev, in falcon_probe_nic()
2345 (u64)efx->irq_status.dma_addr, in falcon_probe_nic()
2346 efx->irq_status.addr, in falcon_probe_nic()
2347 (u64)virt_to_phys(efx->irq_status.addr)); in falcon_probe_nic()
2349 falcon_probe_spi_devices(efx); in falcon_probe_nic()
2352 rc = falcon_probe_nvconfig(efx); in falcon_probe_nic()
2355 netif_err(efx, probe, efx->net_dev, "NVRAM is invalid\n"); in falcon_probe_nic()
2359 efx->max_channels = (efx_nic_rev(efx) <= EFX_REV_FALCON_A1 ? 4 : in falcon_probe_nic()
2361 efx->timer_quantum_ns = 4968; /* 621 cycles */ in falcon_probe_nic()
2364 board = falcon_board(efx); in falcon_probe_nic()
2367 board->i2c_data.data = efx; in falcon_probe_nic()
2369 board->i2c_adap.dev.parent = &efx->pci_dev->dev; in falcon_probe_nic()
2376 rc = falcon_board(efx)->type->init(efx); in falcon_probe_nic()
2378 netif_err(efx, probe, efx->net_dev, in falcon_probe_nic()
2385 (unsigned long)efx); in falcon_probe_nic()
2393 efx_nic_free_buffer(efx, &efx->irq_status); in falcon_probe_nic()
2402 kfree(efx->nic_data); in falcon_probe_nic()
2406 static void falcon_init_rx_cfg(struct efx_nic *efx) in falcon_init_rx_cfg() argument
2413 efx_reado(efx, ®, FR_AZ_RX_CFG); in falcon_init_rx_cfg()
2414 if (efx_nic_rev(efx) <= EFX_REV_FALCON_A1) { in falcon_init_rx_cfg()
2450 efx_writeo(efx, ®, FR_AZ_RX_CFG); in falcon_init_rx_cfg()
2457 static int falcon_init_nic(struct efx_nic *efx) in falcon_init_nic() argument
2463 efx_reado(efx, &temp, FR_AB_NIC_STAT); in falcon_init_nic()
2465 efx_writeo(efx, &temp, FR_AB_NIC_STAT); in falcon_init_nic()
2467 rc = falcon_reset_sram(efx); in falcon_init_nic()
2474 if (EFX_WORKAROUND_5129(efx)) { in falcon_init_nic()
2475 efx_reado(efx, &temp, FR_AZ_CSR_SPARE); in falcon_init_nic()
2477 efx_writeo(efx, &temp, FR_AZ_CSR_SPARE); in falcon_init_nic()
2480 if (EFX_WORKAROUND_7244(efx)) { in falcon_init_nic()
2481 efx_reado(efx, &temp, FR_BZ_RX_FILTER_CTL); in falcon_init_nic()
2486 efx_writeo(efx, &temp, FR_BZ_RX_FILTER_CTL); in falcon_init_nic()
2493 efx_reado(efx, &temp, FR_AA_RX_SELF_RST); in falcon_init_nic()
2496 if (EFX_WORKAROUND_5583(efx)) in falcon_init_nic()
2498 efx_writeo(efx, &temp, FR_AA_RX_SELF_RST); in falcon_init_nic()
2503 efx_reado(efx, &temp, FR_AZ_TX_CFG); in falcon_init_nic()
2505 efx_writeo(efx, &temp, FR_AZ_TX_CFG); in falcon_init_nic()
2507 falcon_init_rx_cfg(efx); in falcon_init_nic()
2509 if (efx_nic_rev(efx) >= EFX_REV_FALCON_B0) { in falcon_init_nic()
2510 falcon_b0_rx_push_rss_config(efx); in falcon_init_nic()
2514 efx_writeo(efx, &temp, FR_BZ_DP_CTRL); in falcon_init_nic()
2517 efx_farch_init_common(efx); in falcon_init_nic()
2522 static void falcon_remove_nic(struct efx_nic *efx) in falcon_remove_nic() argument
2524 struct falcon_nic_data *nic_data = efx->nic_data; in falcon_remove_nic()
2525 struct falcon_board *board = falcon_board(efx); in falcon_remove_nic()
2527 board->type->fini(efx); in falcon_remove_nic()
2533 efx_nic_free_buffer(efx, &efx->irq_status); in falcon_remove_nic()
2535 __falcon_reset_hw(efx, RESET_TYPE_ALL); in falcon_remove_nic()
2544 kfree(efx->nic_data); in falcon_remove_nic()
2545 efx->nic_data = NULL; in falcon_remove_nic()
2548 static size_t falcon_describe_nic_stats(struct efx_nic *efx, u8 *names) in falcon_describe_nic_stats() argument
2554 static size_t falcon_update_nic_stats(struct efx_nic *efx, u64 *full_stats, in falcon_update_nic_stats() argument
2557 struct falcon_nic_data *nic_data = efx->nic_data; in falcon_update_nic_stats()
2562 efx_reado(efx, &cnt, FR_AZ_RX_NODESC_DROP); in falcon_update_nic_stats()
2567 FALCON_XMAC_STATS_DMA_FLAG(efx)) { in falcon_update_nic_stats()
2573 stats, efx->stats_buffer.addr, true); in falcon_update_nic_stats()
2581 efx_update_sw_stats(efx, stats); in falcon_update_nic_stats()
2612 void falcon_start_nic_stats(struct efx_nic *efx) in falcon_start_nic_stats() argument
2614 struct falcon_nic_data *nic_data = efx->nic_data; in falcon_start_nic_stats()
2616 spin_lock_bh(&efx->stats_lock); in falcon_start_nic_stats()
2618 falcon_stats_request(efx); in falcon_start_nic_stats()
2619 spin_unlock_bh(&efx->stats_lock); in falcon_start_nic_stats()
2625 static void falcon_pull_nic_stats(struct efx_nic *efx) in falcon_pull_nic_stats() argument
2630 void falcon_stop_nic_stats(struct efx_nic *efx) in falcon_stop_nic_stats() argument
2632 struct falcon_nic_data *nic_data = efx->nic_data; in falcon_stop_nic_stats()
2637 spin_lock_bh(&efx->stats_lock); in falcon_stop_nic_stats()
2639 spin_unlock_bh(&efx->stats_lock); in falcon_stop_nic_stats()
2646 if (FALCON_XMAC_STATS_DMA_FLAG(efx)) in falcon_stop_nic_stats()
2651 spin_lock_bh(&efx->stats_lock); in falcon_stop_nic_stats()
2652 falcon_stats_complete(efx); in falcon_stop_nic_stats()
2653 spin_unlock_bh(&efx->stats_lock); in falcon_stop_nic_stats()
2656 static void falcon_set_id_led(struct efx_nic *efx, enum efx_led_mode mode) in falcon_set_id_led() argument
2658 falcon_board(efx)->type->set_id_led(efx, mode); in falcon_set_id_led()
2668 static void falcon_get_wol(struct efx_nic *efx, struct ethtool_wolinfo *wol) in falcon_get_wol() argument
2675 static int falcon_set_wol(struct efx_nic *efx, u32 type) in falcon_set_wol() argument