Revert "sfc: Use write-combining to reduce TX latency" and follow-ups
Subsystems (2)
PATCH 1/2 Revert "sfc: Use write-combining to reduce TX latency" and follow-ups
This reverts commits 65f0b417dee94f779ce9b77102b7d73c93723b39, d88d6b05fee3cc78e5b0273eb58c31201dcc6b76, fcfa060468a4edcf776f0c1211d826d5de1668c1, 747df2258b1b9a2e25929ef496262c339c380009 and 867955f5682f7157fdafe8670804b9f8ea077bc7.
Depending on the processor model, write-combining may result in reordering that the NIC will not tolerate. This typically results in a DMA error event and reset by the driver, logged as:
sfc 0000:0e:00.0: eth2: TX DMA Q reports TX_EV_PKT_ERR. sfc 0000:0e:00.0: eth2: resetting (ALL)
---
Please queue this for 3.0.y as well.
Ben.
drivers/net/sfc/efx.c | 18 +-------------- drivers/net/sfc/io.h | 15 +++--------- drivers/net/sfc/mcdi.c | 46 +++++++++++++++------------------------- drivers/net/sfc/nic.c | 7 ------ drivers/net/sfc/nic.h | 2 - drivers/net/sfc/siena.c | 25 +++------------------ drivers/net/sfc/workarounds.h | 2 - 7 files changed, 27 insertions(+), 88 deletions(-)
drivers/net/sfc/efx.c +2 -16
@@ -1050,7 +1050,6 @@ static int efx_init_io(struct efx_nic *efx) {struct pci_dev *pci_dev = efx->pci_dev;dma_addr_t dma_mask = efx->type->max_dma_mask; -bool use_wc;int rc;netif_dbg (efx, probe, efx->net_dev,"initialising I/O\n" );
@@ -1101,21 +1100,8 @@ static int efx_init_io(struct efx_nic *efx) rc = -EIO ; goto fail3; } - -/* bug22643: If SR-IOV is enabled then tx push over a write combined -* mapping is unsafe. We need to disable write combining in this case. -* MSI is unsupported when SR-IOV is enabled, and the firmware will -* have removed the MSI capability. So write combining is safe if -* there is an MSI capability. -*/ - use_wc = (!EFX_WORKAROUND_22643 (efx) || -pci_find_capability (pci_dev,PCI_CAP_ID_MSI )); -if (use_wc) - efx->membase =ioremap_wc (efx->membase_phys, - efx->type->mem_map_size); -else - efx->membase =ioremap_nocache (efx->membase_phys, - efx->type->mem_map_size); + efx->membase =ioremap_nocache (efx->membase_phys, + efx->type->mem_map_size);if (!efx->membase) { netif_err(efx, probe, efx->net_dev, "could not map memory BAR at %llx+%x\n",
drivers/net/sfc/io.h +4 -11
@@ -48,9 +48,9 @@* replacing the low 96 bits with zero does not affect functionality. * - If the host writes to the last dword address of such a register * (i.e. the high 32 bits) the underlying register will always be -* written. If the collector and the current write together do not -* provide values for all 128 bits of the register, the low 96 bits -* will be written as zero. +* written. If the collector does not hold values for the low 96 +* bits of the register, they will be written as zero. Writing to +* the last qword does not have this effect and must not be done. * - If the host writes to the address of any other part of such a * register while the collector already holds values for some other * register, the write is discarded and the collector maintains its
@@ -103,7 +103,6 @@ static inline void efx_writeo(struct efx_nic *efx, efx_oword_t *value,_efx_writed (efx, value->u32[2 ], reg +8 );_efx_writed (efx, value->u32[3 ], reg +12 );#endif -wmb ();mmiowb ();spin_unlock_irqrestore (&efx->biu_lock, flags); }
@@ -126,7 +125,6 @@ static inline void efx_sram_writeq(struct efx_nic *efx, void __iomem *membase,__raw_writel ((__force u32 )value->u32[0 ], membase + addr);__raw_writel ((__force u32 )value->u32[1 ], membase + addr +4 );#endif -wmb ();mmiowb ();spin_unlock_irqrestore (&efx->biu_lock, flags); }
@@ -141,7 +139,6 @@ static inline void efx_writed(struct efx_nic *efx, efx_dword_t *value,/* No lock required */ _efx_writed (efx, value->u32[0 ], reg); -wmb (); }/* Read a 128-bit CSR, locking as appropriate. */
@@ -152,7 +149,6 @@ static inline void efx_reado(struct efx_nic *efx, efx_oword_t *value,spin_lock_irqsave (&efx->biu_lock, flags); value->u32[0 ] =_efx_readd (efx, reg +0 ); -rmb (); value->u32[1 ] =_efx_readd (efx, reg +4 ); value->u32[2 ] =_efx_readd (efx, reg +8 ); value->u32[3 ] =_efx_readd (efx, reg +12 );
@@ -175,7 +171,6 @@ static inline void efx_sram_readq(struct efx_nic *efx, void __iomem *membase, value->u64[0 ] = (__force __le64 )__raw_readq (membase + addr);#else value->u32[0 ] = (__force __le32 )__raw_readl (membase + addr); -rmb (); value->u32[1 ] = (__force __le32 )__raw_readl (membase + addr +4 );#endif spin_unlock_irqrestore (&efx->biu_lock, flags);
@@ -242,14 +237,12 @@ static inline void _efx_writeo_page(struct efx_nic *efx, efx_oword_t *value,#ifdef EFX_USE_QWORD_IO _efx_writeq (efx, value->u64[0 ], reg +0 ); -_efx_writeq (efx, value->u64[1 ], reg +8 );#else _efx_writed (efx, value->u32[0 ], reg +0 );_efx_writed (efx, value->u32[1 ], reg +4 ); +#endif _efx_writed (efx, value->u32[2 ], reg +8 );_efx_writed (efx, value->u32[3 ], reg +12 ); -#endif -wmb (); }#define efx_writeo_page (efx, value, reg, page) \ _efx_writeo_page(efx, value, \
drivers/net/sfc/mcdi.c +17 -29
115 lines not on this page · raw message
drivers/net/sfc/nic.c +0 -7
@@ -1936,13 +1936,6 @@ void efx_nic_get_regs(struct efx_nic *efx, void *buf) size =min_t (size_t, table->step,16 ); -if (table->offset >= efx->type->mem_map_size) { -/* No longer mapped; return dummy data */ -memcpy (buf,"\xde\xc0\xad\xde" ,4 ); - buf += table->rows * size; -continue ; - } -for (i =0 ; i < table->rows; i++) {switch (table->step) {case 4 :/* 32-bit register or SRAM */
drivers/net/sfc/nic.h +0 -2
@@ -143,12 +143,10 @@ static inline struct falcon_board *falcon_board(struct efx_nic *efx)/** * struct siena_nic_data - Siena NIC state * @mcdi: Management-Controller-to-Driver Interface -* @mcdi_smem: MCDI shared memory mapping. The mapping is always uncacheable. * @wol_filter_id: Wake-on-LAN packet filter id */ struct siena_nic_data {struct efx_mcdi_iface mcdi; -void __iomem *mcdi_smem;int wol_filter_id; };
drivers/net/sfc/siena.c +4 -21
@@ -250,26 +250,12 @@ static int siena_probe_nic(struct efx_nic *efx)efx_reado (efx, ®,FR_AZ_CS_DEBUG ); efx->net_dev->dev_id =EFX_OWORD_FIELD (reg,FRF_CZ_CS_PORT_NUM ) -1 ; -/* Initialise MCDI */ - nic_data->mcdi_smem =ioremap_nocache (efx->membase_phys + -FR_CZ_MC_TREG_SMEM , -FR_CZ_MC_TREG_SMEM_STEP * -FR_CZ_MC_TREG_SMEM_ROWS ); -if (!nic_data->mcdi_smem) { -netif_err (efx, probe, efx->net_dev, -"could not map MCDI at %llx+%x\n" , - (unsigned long long )efx->membase_phys + -FR_CZ_MC_TREG_SMEM , -FR_CZ_MC_TREG_SMEM_STEP *FR_CZ_MC_TREG_SMEM_ROWS ); - rc = -ENOMEM ; - goto fail1; - }efx_mcdi_init (efx);/* Recover from a failed assertion before probing */ rc =efx_mcdi_handle_assertion (efx);if (rc) - goto fail2; + goto fail1;/* Let the BMC know that the driver is now in charge of link and * filter settings. We must do this before we reset the NIC */
@@ -324,7 +310,6 @@ fail4: fail3:efx_mcdi_drv_attach (efx, false,NULL ); fail2: -iounmap (nic_data->mcdi_smem); fail1:kfree (efx->nic_data);return rc;
@@ -404,8 +389,6 @@ static int siena_init_nic(struct efx_nic *efx)static void siena_remove_nic (struct efx_nic *efx) { -struct siena_nic_data *nic_data = efx->nic_data; -efx_nic_free_buffer (efx, &efx->irq_status);siena_reset_hw (efx,RESET_TYPE_ALL );
@@ -415,8 +398,7 @@ static void siena_remove_nic(struct efx_nic *efx)efx_mcdi_drv_attach (efx, false,NULL );/* Tear down the private nic state */ -iounmap (nic_data->mcdi_smem); -kfree (nic_data); +kfree (efx->nic_data); efx->nic_data =NULL ; }
@@ -656,7 +638,8 @@ const struct efx_nic_type siena_a0_nic_type = { .default_mac_ops = &efx_mcdi_mac_operations, .revision = EFX_REV_SIENA_A0, - .mem_map_size = FR_CZ_MC_TREG_SMEM, /* MC_TREG_SMEM mapped separately */ + .mem_map_size = (FR_CZ_MC_TREG_SMEM + + FR_CZ_MC_TREG_SMEM_STEP * FR_CZ_MC_TREG_SMEM_ROWS), .txd_ptr_tbl_base = FR_BZ_TX_DESC_PTR_TBL, .rxd_ptr_tbl_base = FR_BZ_RX_DESC_PTR_TBL, .buf_tbl_base = FR_BZ_BUF_FULL_TBL,
drivers/net/sfc/workarounds.h +0 -2
@@ -38,8 +38,6 @@#define EFX_WORKAROUND_15783 EFX_WORKAROUND_ALWAYS/* Legacy interrupt storm when interrupt fifo fills */ #define EFX_WORKAROUND_17213 EFX_WORKAROUND_SIENA -/* Write combining and sriov=enabled are incompatible */ -#define EFX_WORKAROUND_22643 EFX_WORKAROUND_SIENA/* Spurious parity errors in TSORT buffers */ #define EFX_WORKAROUND_5129 EFX_WORKAROUND_FALCON_A
Signature · 8 lines
1.7.4.4 -- Ben Hutchings, Staff Engineer, Solarflare Not speaking for my employer; that's the marketing department's job. They asked us to note that Solarflare product names are trademarked.
From: Ben Hutchings <[email protected]>
Date: Thu, 01 Sep 2011 23:09:29 +0100
Quoted 10 lines
This reverts commits
65f0b417dee94f779ce9b77102b7d73c93723b39,d88d6b05fee3cc78e5b0273eb58c31201dcc6b76,fcfa060468a4edcf776f0c1211d826d5de1668c1,747df2258b1b9a2e25929ef496262c339c380009and867955f5682f7157fdafe8670804b9f8ea077bc7.Depending on the processor model, write-combining may result in reordering that the NIC will not tolerate. This typically results in a DMA error event and reset by the driver, logged as:
Quoted 6 lines
sfc 0000:0e:00.0: eth2: TX DMA Q reports
TX_EV_PKT_ERR. sfc 0000:0e:00.0: eth2: resetting (ALL)Signed-off-by Ben Hutchings <[email protected]>---
Please queue this for 3.0.y as well.
Applied and queued.