diff options
-rw-r--r-- | drivers/net/ethernet/sfc/io.h | 43 | ||||
-rw-r--r-- | drivers/net/ethernet/sfc/nic.c | 19 | ||||
-rw-r--r-- | drivers/net/ethernet/sfc/siena_sriov.c | 2 |
3 files changed, 28 insertions, 36 deletions
diff --git a/drivers/net/ethernet/sfc/io.h b/drivers/net/ethernet/sfc/io.h index 751d1ec112cc..96759aee1c6c 100644 --- a/drivers/net/ethernet/sfc/io.h +++ b/drivers/net/ethernet/sfc/io.h | |||
@@ -22,22 +22,21 @@ | |||
22 | * | 22 | * |
23 | * Notes on locking strategy: | 23 | * Notes on locking strategy: |
24 | * | 24 | * |
25 | * Most CSRs are 128-bit (oword) and therefore cannot be read or | 25 | * Many CSRs are very wide and cannot be read or written atomically. |
26 | * written atomically. Access from the host is buffered by the Bus | 26 | * Writes from the host are buffered by the Bus Interface Unit (BIU) |
27 | * Interface Unit (BIU). Whenever the host reads from the lowest | 27 | * up to 128 bits. Whenever the host writes part of such a register, |
28 | * address of such a register, or from the address of a different such | 28 | * the BIU collects the written value and does not write to the |
29 | * register, the BIU latches the register's value. Subsequent reads | 29 | * underlying register until all 4 dwords have been written. A |
30 | * from higher addresses of the same register will read the latched | 30 | * similar buffering scheme applies to host access to the NIC's 64-bit |
31 | * value. Whenever the host writes part of such a register, the BIU | 31 | * SRAM. |
32 | * collects the written value and does not write to the underlying | ||
33 | * register until all 4 dwords have been written. A similar buffering | ||
34 | * scheme applies to host access to the NIC's 64-bit SRAM. | ||
35 | * | 32 | * |
36 | * Access to different CSRs and 64-bit SRAM words must be serialised, | 33 | * Writes to different CSRs and 64-bit SRAM words must be serialised, |
37 | * since interleaved access can result in lost writes or lost | 34 | * since interleaved access can result in lost writes. We use |
38 | * information from read-to-clear fields. We use efx_nic::biu_lock | 35 | * efx_nic::biu_lock for this. |
39 | * for this. (We could use separate locks for read and write, but | 36 | * |
40 | * this is not normally a performance bottleneck.) | 37 | * We also serialise reads from 128-bit CSRs and SRAM with the same |
38 | * spinlock. This may not be necessary, but it doesn't really matter | ||
39 | * as there are no such reads on the fast path. | ||
41 | * | 40 | * |
42 | * The DMA descriptor pointers (RX_DESC_UPD and TX_DESC_UPD) are | 41 | * The DMA descriptor pointers (RX_DESC_UPD and TX_DESC_UPD) are |
43 | * 128-bit but are special-cased in the BIU to avoid the need for | 42 | * 128-bit but are special-cased in the BIU to avoid the need for |
@@ -204,20 +203,6 @@ static inline void efx_reado_table(struct efx_nic *efx, efx_oword_t *value, | |||
204 | efx_reado(efx, value, reg + index * sizeof(efx_oword_t)); | 203 | efx_reado(efx, value, reg + index * sizeof(efx_oword_t)); |
205 | } | 204 | } |
206 | 205 | ||
207 | /* Write a 32-bit CSR forming part of a table, or 32-bit SRAM */ | ||
208 | static inline void efx_writed_table(struct efx_nic *efx, efx_dword_t *value, | ||
209 | unsigned int reg, unsigned int index) | ||
210 | { | ||
211 | efx_writed(efx, value, reg + index * sizeof(efx_oword_t)); | ||
212 | } | ||
213 | |||
214 | /* Read a 32-bit CSR forming part of a table, or 32-bit SRAM */ | ||
215 | static inline void efx_readd_table(struct efx_nic *efx, efx_dword_t *value, | ||
216 | unsigned int reg, unsigned int index) | ||
217 | { | ||
218 | efx_readd(efx, value, reg + index * sizeof(efx_dword_t)); | ||
219 | } | ||
220 | |||
221 | /* Page-mapped register block size */ | 206 | /* Page-mapped register block size */ |
222 | #define EFX_PAGE_BLOCK_SIZE 0x2000 | 207 | #define EFX_PAGE_BLOCK_SIZE 0x2000 |
223 | 208 | ||
diff --git a/drivers/net/ethernet/sfc/nic.c b/drivers/net/ethernet/sfc/nic.c index e10b7ec046c3..368659d6362a 100644 --- a/drivers/net/ethernet/sfc/nic.c +++ b/drivers/net/ethernet/sfc/nic.c | |||
@@ -765,8 +765,13 @@ void efx_nic_eventq_read_ack(struct efx_channel *channel) | |||
765 | 765 | ||
766 | EFX_POPULATE_DWORD_1(reg, FRF_AZ_EVQ_RPTR, | 766 | EFX_POPULATE_DWORD_1(reg, FRF_AZ_EVQ_RPTR, |
767 | channel->eventq_read_ptr & channel->eventq_mask); | 767 | channel->eventq_read_ptr & channel->eventq_mask); |
768 | efx_writed_table(efx, ®, efx->type->evq_rptr_tbl_base, | 768 | |
769 | channel->channel); | 769 | /* For Falcon A1, EVQ_RPTR_KER is documented as having a step size |
770 | * of 4 bytes, but it is really 16 bytes just like later revisions. | ||
771 | */ | ||
772 | efx_writed(efx, ®, | ||
773 | efx->type->evq_rptr_tbl_base + | ||
774 | FR_BZ_EVQ_RPTR_STEP * channel->channel); | ||
770 | } | 775 | } |
771 | 776 | ||
772 | /* Use HW to insert a SW defined event */ | 777 | /* Use HW to insert a SW defined event */ |
@@ -1564,7 +1569,9 @@ void efx_nic_push_rx_indir_table(struct efx_nic *efx) | |||
1564 | for (i = 0; i < FR_BZ_RX_INDIRECTION_TBL_ROWS; i++) { | 1569 | for (i = 0; i < FR_BZ_RX_INDIRECTION_TBL_ROWS; i++) { |
1565 | EFX_POPULATE_DWORD_1(dword, FRF_BZ_IT_QUEUE, | 1570 | EFX_POPULATE_DWORD_1(dword, FRF_BZ_IT_QUEUE, |
1566 | efx->rx_indir_table[i]); | 1571 | efx->rx_indir_table[i]); |
1567 | efx_writed_table(efx, &dword, FR_BZ_RX_INDIRECTION_TBL, i); | 1572 | efx_writed(efx, &dword, |
1573 | FR_BZ_RX_INDIRECTION_TBL + | ||
1574 | FR_BZ_RX_INDIRECTION_TBL_STEP * i); | ||
1568 | } | 1575 | } |
1569 | } | 1576 | } |
1570 | 1577 | ||
@@ -2028,15 +2035,15 @@ void efx_nic_get_regs(struct efx_nic *efx, void *buf) | |||
2028 | 2035 | ||
2029 | for (i = 0; i < table->rows; i++) { | 2036 | for (i = 0; i < table->rows; i++) { |
2030 | switch (table->step) { | 2037 | switch (table->step) { |
2031 | case 4: /* 32-bit register or SRAM */ | 2038 | case 4: /* 32-bit SRAM */ |
2032 | efx_readd_table(efx, buf, table->offset, i); | 2039 | efx_readd(efx, buf, table->offset + 4 * i); |
2033 | break; | 2040 | break; |
2034 | case 8: /* 64-bit SRAM */ | 2041 | case 8: /* 64-bit SRAM */ |
2035 | efx_sram_readq(efx, | 2042 | efx_sram_readq(efx, |
2036 | efx->membase + table->offset, | 2043 | efx->membase + table->offset, |
2037 | buf, i); | 2044 | buf, i); |
2038 | break; | 2045 | break; |
2039 | case 16: /* 128-bit register */ | 2046 | case 16: /* 128-bit-readable register */ |
2040 | efx_reado_table(efx, buf, table->offset, i); | 2047 | efx_reado_table(efx, buf, table->offset, i); |
2041 | break; | 2048 | break; |
2042 | case 32: /* 128-bit register, interleaved */ | 2049 | case 32: /* 128-bit register, interleaved */ |
diff --git a/drivers/net/ethernet/sfc/siena_sriov.c b/drivers/net/ethernet/sfc/siena_sriov.c index 6e62a018ea32..90f8d1604f5f 100644 --- a/drivers/net/ethernet/sfc/siena_sriov.c +++ b/drivers/net/ethernet/sfc/siena_sriov.c | |||
@@ -993,7 +993,7 @@ static void efx_sriov_reset_vf(struct efx_vf *vf, struct efx_buffer *buffer) | |||
993 | FRF_AZ_EVQ_BUF_BASE_ID, buftbl); | 993 | FRF_AZ_EVQ_BUF_BASE_ID, buftbl); |
994 | efx_writeo_table(efx, ®, FR_BZ_EVQ_PTR_TBL, abs_evq); | 994 | efx_writeo_table(efx, ®, FR_BZ_EVQ_PTR_TBL, abs_evq); |
995 | EFX_POPULATE_DWORD_1(ptr, FRF_AZ_EVQ_RPTR, 0); | 995 | EFX_POPULATE_DWORD_1(ptr, FRF_AZ_EVQ_RPTR, 0); |
996 | efx_writed_table(efx, &ptr, FR_BZ_EVQ_RPTR, abs_evq); | 996 | efx_writed(efx, &ptr, FR_BZ_EVQ_RPTR + FR_BZ_EVQ_RPTR_STEP * abs_evq); |
997 | 997 | ||
998 | mutex_unlock(&vf->status_lock); | 998 | mutex_unlock(&vf->status_lock); |
999 | } | 999 | } |