aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Rybchenko <arybchik@FreeBSD.org>2016-01-12 13:26:04 +0000
committerAndrew Rybchenko <arybchik@FreeBSD.org>2016-01-12 13:26:04 +0000
commite7119ad9ae3df4760e9bc0fac8f8066de65f718e (patch)
treed1dae373abf56213036734d58e9c2d3f7c082f4d
parentf45757caea2a0b4542bb05777ab60f21a75243cc (diff)
downloadsrc-e7119ad9ae3df4760e9bc0fac8f8066de65f718e.tar.gz
src-e7119ad9ae3df4760e9bc0fac8f8066de65f718e.zip
sfxge: change hunt specific fields of efx_nic_t to ef10
All these fields will be used in shared ef10 code, so put them in an ef10 member of a per-architecture union, rather that in the per-chip union. Submitted by: Mark Spender <mspender at solarflare.com> Reviewed by: gnn Sponsored by: Solarflare Communications, Inc. MFC after: 2 days Differential Revision: https://reviews.freebsd.org/D4865
Notes
Notes: svn path=/head/; revision=293748
-rw-r--r--sys/dev/sfxge/common/ef10_impl.h7
-rw-r--r--sys/dev/sfxge/common/efx_impl.h35
-rw-r--r--sys/dev/sfxge/common/hunt_nic.c95
-rw-r--r--sys/dev/sfxge/common/hunt_vpd.c40
-rw-r--r--sys/dev/sfxge/common/medford_impl.h2
5 files changed, 95 insertions, 84 deletions
diff --git a/sys/dev/sfxge/common/ef10_impl.h b/sys/dev/sfxge/common/ef10_impl.h
index d35de82c99b9..9b9f0aaf4b55 100644
--- a/sys/dev/sfxge/common/ef10_impl.h
+++ b/sys/dev/sfxge/common/ef10_impl.h
@@ -37,6 +37,13 @@
extern "C" {
#endif
+#if (EFSYS_OPT_HUNTINGTON && EFSYS_OPT_MEDFORD)
+#define EF10_MAX_PIOBUF_NBUFS MAX(HUNT_PIOBUF_NBUFS, MEDFORD_PIOBUF_NBUFS)
+#elif EFSYS_OPT_HUNTINGTON
+#define EF10_MAX_PIOBUF_NBUFS HUNT_PIOBUF_NBUFS
+#elif EFSYS_OPT_MEDFORD
+#define EF10_MAX_PIOBUF_NBUFS MEDFORD_PIOBUF_NBUFS
+#endif
diff --git a/sys/dev/sfxge/common/efx_impl.h b/sys/dev/sfxge/common/efx_impl.h
index b1a918bdb731..a78e28b708c0 100644
--- a/sys/dev/sfxge/common/efx_impl.h
+++ b/sys/dev/sfxge/common/efx_impl.h
@@ -672,26 +672,29 @@ struct efx_nic_s {
int enu_unused;
} siena;
#endif /* EFSYS_OPT_SIENA */
-#if EFSYS_OPT_HUNTINGTON
+ int enu_unused;
+ } en_u;
+#if (EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD)
+ union en_arch {
struct {
- int enu_vi_base;
- int enu_vi_count;
+ int ena_vi_base;
+ int ena_vi_count;
#if EFSYS_OPT_VPD
- caddr_t enu_svpd;
- size_t enu_svpd_length;
+ caddr_t ena_svpd;
+ size_t ena_svpd_length;
#endif /* EFSYS_OPT_VPD */
- efx_piobuf_handle_t enu_piobuf_handle[HUNT_PIOBUF_NBUFS];
- uint32_t enu_piobuf_count;
- uint32_t enu_pio_alloc_map[HUNT_PIOBUF_NBUFS];
- uint32_t enu_pio_write_vi_base;
+ efx_piobuf_handle_t ena_piobuf_handle[EF10_MAX_PIOBUF_NBUFS];
+ uint32_t ena_piobuf_count;
+ uint32_t ena_pio_alloc_map[EF10_MAX_PIOBUF_NBUFS];
+ uint32_t ena_pio_write_vi_base;
/* Memory BAR mapping regions */
- uint32_t enu_uc_mem_map_offset;
- size_t enu_uc_mem_map_size;
- uint32_t enu_wc_mem_map_offset;
- size_t enu_wc_mem_map_size;
- } hunt;
-#endif /* EFSYS_OPT_HUNTINGTON */
- } en_u;
+ uint32_t ena_uc_mem_map_offset;
+ size_t ena_uc_mem_map_size;
+ uint32_t ena_wc_mem_map_offset;
+ size_t ena_wc_mem_map_size;
+ } ef10;
+ } en_arch;
+#endif /* (EFSYS_OPT_HUNTINGTON || EFSYS_OPT_MEDFORD) */
};
diff --git a/sys/dev/sfxge/common/hunt_nic.c b/sys/dev/sfxge/common/hunt_nic.c
index 2869ad5dff7d..ba52d76a3327 100644
--- a/sys/dev/sfxge/common/hunt_nic.c
+++ b/sys/dev/sfxge/common/hunt_nic.c
@@ -715,30 +715,30 @@ hunt_nic_alloc_piobufs(
efx_rc_t rc;
EFSYS_ASSERT3U(max_piobuf_count, <=,
- EFX_ARRAY_SIZE(enp->en_u.hunt.enu_piobuf_handle));
+ EFX_ARRAY_SIZE(enp->en_arch.ef10.ena_piobuf_handle));
- enp->en_u.hunt.enu_piobuf_count = 0;
+ enp->en_arch.ef10.ena_piobuf_count = 0;
for (i = 0; i < max_piobuf_count; i++) {
- handlep = &enp->en_u.hunt.enu_piobuf_handle[i];
+ handlep = &enp->en_arch.ef10.ena_piobuf_handle[i];
if ((rc = efx_mcdi_alloc_piobuf(enp, handlep)) != 0)
goto fail1;
- enp->en_u.hunt.enu_pio_alloc_map[i] = 0;
- enp->en_u.hunt.enu_piobuf_count++;
+ enp->en_arch.ef10.ena_pio_alloc_map[i] = 0;
+ enp->en_arch.ef10.ena_piobuf_count++;
}
return;
fail1:
- for (i = 0; i < enp->en_u.hunt.enu_piobuf_count; i++) {
- handlep = &enp->en_u.hunt.enu_piobuf_handle[i];
+ for (i = 0; i < enp->en_arch.ef10.ena_piobuf_count; i++) {
+ handlep = &enp->en_arch.ef10.ena_piobuf_handle[i];
efx_mcdi_free_piobuf(enp, *handlep);
*handlep = EFX_PIOBUF_HANDLE_INVALID;
}
- enp->en_u.hunt.enu_piobuf_count = 0;
+ enp->en_arch.ef10.ena_piobuf_count = 0;
}
@@ -749,13 +749,13 @@ hunt_nic_free_piobufs(
efx_piobuf_handle_t *handlep;
unsigned int i;
- for (i = 0; i < enp->en_u.hunt.enu_piobuf_count; i++) {
- handlep = &enp->en_u.hunt.enu_piobuf_handle[i];
+ for (i = 0; i < enp->en_arch.ef10.ena_piobuf_count; i++) {
+ handlep = &enp->en_arch.ef10.ena_piobuf_handle[i];
efx_mcdi_free_piobuf(enp, *handlep);
*handlep = EFX_PIOBUF_HANDLE_INVALID;
}
- enp->en_u.hunt.enu_piobuf_count = 0;
+ enp->en_arch.ef10.ena_piobuf_count = 0;
}
/* Sub-allocate a block from a piobuf */
@@ -781,14 +781,14 @@ hunt_nic_pio_alloc(
EFSYS_ASSERT(sizep);
if ((edcp->edc_pio_alloc_size == 0) ||
- (enp->en_u.hunt.enu_piobuf_count == 0)) {
+ (enp->en_arch.ef10.ena_piobuf_count == 0)) {
rc = ENOMEM;
goto fail1;
}
blk_per_buf = HUNT_PIOBUF_SIZE / edcp->edc_pio_alloc_size;
- for (buf = 0; buf < enp->en_u.hunt.enu_piobuf_count; buf++) {
- uint32_t *map = &enp->en_u.hunt.enu_pio_alloc_map[buf];
+ for (buf = 0; buf < enp->en_arch.ef10.ena_piobuf_count; buf++) {
+ uint32_t *map = &enp->en_arch.ef10.ena_pio_alloc_map[buf];
if (~(*map) == 0)
continue;
@@ -805,7 +805,7 @@ hunt_nic_pio_alloc(
goto fail2;
done:
- *handlep = enp->en_u.hunt.enu_piobuf_handle[buf];
+ *handlep = enp->en_arch.ef10.ena_piobuf_handle[buf];
*bufnump = buf;
*blknump = blk;
*sizep = edcp->edc_pio_alloc_size;
@@ -831,13 +831,13 @@ hunt_nic_pio_free(
uint32_t *map;
efx_rc_t rc;
- if ((bufnum >= enp->en_u.hunt.enu_piobuf_count) ||
+ if ((bufnum >= enp->en_arch.ef10.ena_piobuf_count) ||
(blknum >= (8 * sizeof (*map)))) {
rc = EINVAL;
goto fail1;
}
- map = &enp->en_u.hunt.enu_pio_alloc_map[bufnum];
+ map = &enp->en_arch.ef10.ena_pio_alloc_map[bufnum];
if ((*map & (1u << blknum)) == 0) {
rc = ENOENT;
goto fail2;
@@ -1579,7 +1579,8 @@ hunt_nic_init(
* each VI that is using a sub-allocated block from the piobuf.
*/
min_vi_count = edcp->edc_min_vi_count;
- max_vi_count = edcp->edc_max_vi_count + enp->en_u.hunt.enu_piobuf_count;
+ max_vi_count =
+ edcp->edc_max_vi_count + enp->en_arch.ef10.ena_piobuf_count;
/* Ensure that the previously attached driver's VIs are freed */
if ((rc = efx_mcdi_free_vis(enp)) != 0)
@@ -1601,44 +1602,44 @@ hunt_nic_init(
goto fail4;
}
- enp->en_u.hunt.enu_vi_base = vi_base;
- enp->en_u.hunt.enu_vi_count = vi_count;
+ enp->en_arch.ef10.ena_vi_base = vi_base;
+ enp->en_arch.ef10.ena_vi_count = vi_count;
- if (vi_count < min_vi_count + enp->en_u.hunt.enu_piobuf_count) {
+ if (vi_count < min_vi_count + enp->en_arch.ef10.ena_piobuf_count) {
/* Not enough extra VIs to map piobufs */
hunt_nic_free_piobufs(enp);
}
- enp->en_u.hunt.enu_pio_write_vi_base =
- vi_count - enp->en_u.hunt.enu_piobuf_count;
+ enp->en_arch.ef10.ena_pio_write_vi_base =
+ vi_count - enp->en_arch.ef10.ena_piobuf_count;
/* Save UC memory mapping details */
- enp->en_u.hunt.enu_uc_mem_map_offset = 0;
- if (enp->en_u.hunt.enu_piobuf_count > 0) {
- enp->en_u.hunt.enu_uc_mem_map_size =
+ enp->en_arch.ef10.ena_uc_mem_map_offset = 0;
+ if (enp->en_arch.ef10.ena_piobuf_count > 0) {
+ enp->en_arch.ef10.ena_uc_mem_map_size =
(ER_DZ_TX_PIOBUF_STEP *
- enp->en_u.hunt.enu_pio_write_vi_base);
+ enp->en_arch.ef10.ena_pio_write_vi_base);
} else {
- enp->en_u.hunt.enu_uc_mem_map_size =
+ enp->en_arch.ef10.ena_uc_mem_map_size =
(ER_DZ_TX_PIOBUF_STEP *
- enp->en_u.hunt.enu_vi_count);
+ enp->en_arch.ef10.ena_vi_count);
}
/* Save WC memory mapping details */
- enp->en_u.hunt.enu_wc_mem_map_offset =
- enp->en_u.hunt.enu_uc_mem_map_offset +
- enp->en_u.hunt.enu_uc_mem_map_size;
+ enp->en_arch.ef10.ena_wc_mem_map_offset =
+ enp->en_arch.ef10.ena_uc_mem_map_offset +
+ enp->en_arch.ef10.ena_uc_mem_map_size;
- enp->en_u.hunt.enu_wc_mem_map_size =
+ enp->en_arch.ef10.ena_wc_mem_map_size =
(ER_DZ_TX_PIOBUF_STEP *
- enp->en_u.hunt.enu_piobuf_count);
+ enp->en_arch.ef10.ena_piobuf_count);
/* Link piobufs to extra VIs in WC mapping */
- if (enp->en_u.hunt.enu_piobuf_count > 0) {
- for (i = 0; i < enp->en_u.hunt.enu_piobuf_count; i++) {
+ if (enp->en_arch.ef10.ena_piobuf_count > 0) {
+ for (i = 0; i < enp->en_arch.ef10.ena_piobuf_count; i++) {
rc = efx_mcdi_link_piobuf(enp,
- enp->en_u.hunt.enu_pio_write_vi_base + i,
- enp->en_u.hunt.enu_piobuf_handle[i]);
+ enp->en_arch.ef10.ena_pio_write_vi_base + i,
+ enp->en_arch.ef10.ena_piobuf_handle[i]);
if (rc != 0)
break;
}
@@ -1715,7 +1716,7 @@ hunt_nic_get_vi_pool(
* Report VIs that the client driver can use.
* Do not include VIs used for PIO buffer writes.
*/
- *vi_countp = enp->en_u.hunt.enu_pio_write_vi_base;
+ *vi_countp = enp->en_arch.ef10.ena_pio_write_vi_base;
return (0);
}
@@ -1739,14 +1740,14 @@ hunt_nic_get_bar_region(
switch (region) {
case EFX_REGION_VI:
/* UC mapped memory BAR region for VI registers */
- *offsetp = enp->en_u.hunt.enu_uc_mem_map_offset;
- *sizep = enp->en_u.hunt.enu_uc_mem_map_size;
+ *offsetp = enp->en_arch.ef10.ena_uc_mem_map_offset;
+ *sizep = enp->en_arch.ef10.ena_uc_mem_map_size;
break;
case EFX_REGION_PIO_WRITE_VI:
/* WC mapped memory BAR region for piobuf writes */
- *offsetp = enp->en_u.hunt.enu_wc_mem_map_offset;
- *sizep = enp->en_u.hunt.enu_wc_mem_map_size;
+ *offsetp = enp->en_arch.ef10.ena_wc_mem_map_offset;
+ *sizep = enp->en_arch.ef10.ena_wc_mem_map_size;
break;
default:
@@ -1773,10 +1774,10 @@ hunt_nic_fini(
enp->en_vport_id = 0;
/* Unlink piobufs from extra VIs in WC mapping */
- if (enp->en_u.hunt.enu_piobuf_count > 0) {
- for (i = 0; i < enp->en_u.hunt.enu_piobuf_count; i++) {
+ if (enp->en_arch.ef10.ena_piobuf_count > 0) {
+ for (i = 0; i < enp->en_arch.ef10.ena_piobuf_count; i++) {
rc = efx_mcdi_unlink_piobuf(enp,
- enp->en_u.hunt.enu_pio_write_vi_base + i);
+ enp->en_arch.ef10.ena_pio_write_vi_base + i);
if (rc != 0)
break;
}
@@ -1785,7 +1786,7 @@ hunt_nic_fini(
hunt_nic_free_piobufs(enp);
(void) efx_mcdi_free_vis(enp);
- enp->en_u.hunt.enu_vi_count = 0;
+ enp->en_arch.ef10.ena_vi_count = 0;
}
void
diff --git a/sys/dev/sfxge/common/hunt_vpd.c b/sys/dev/sfxge/common/hunt_vpd.c
index 129167c052d8..c11f4524ef5c 100644
--- a/sys/dev/sfxge/common/hunt_vpd.c
+++ b/sys/dev/sfxge/common/hunt_vpd.c
@@ -81,8 +81,8 @@ hunt_vpd_init(
goto fail2;
}
- enp->en_u.hunt.enu_svpd = svpd;
- enp->en_u.hunt.enu_svpd_length = svpd_size;
+ enp->en_arch.ef10.ena_svpd = svpd;
+ enp->en_arch.ef10.ena_svpd_length = svpd_size;
out:
return (0);
@@ -197,7 +197,7 @@ hunt_vpd_verify(
* Verify that there is no duplication between the static and
* dynamic cfg sectors.
*/
- if (enp->en_u.hunt.enu_svpd_length == 0)
+ if (enp->en_arch.ef10.ena_svpd_length == 0)
goto done;
dcont = 0;
@@ -213,8 +213,8 @@ hunt_vpd_verify(
_NOTE(CONSTANTCONDITION)
while (1) {
if ((rc = efx_vpd_hunk_next(
- enp->en_u.hunt.enu_svpd,
- enp->en_u.hunt.enu_svpd_length, &stag, &skey,
+ enp->en_arch.ef10.ena_svpd,
+ enp->en_arch.ef10.ena_svpd_length, &stag, &skey,
NULL, NULL, &scont)) != 0)
goto fail3;
if (scont == 0)
@@ -254,14 +254,14 @@ hunt_vpd_reinit(
/*
* Only create an ID string if the dynamic cfg doesn't have one
*/
- if (enp->en_u.hunt.enu_svpd_length == 0)
+ if (enp->en_arch.ef10.ena_svpd_length == 0)
wantpid = B_TRUE;
else {
unsigned int offset;
uint8_t length;
- rc = efx_vpd_hunk_get(enp->en_u.hunt.enu_svpd,
- enp->en_u.hunt.enu_svpd_length,
+ rc = efx_vpd_hunk_get(enp->en_arch.ef10.ena_svpd,
+ enp->en_arch.ef10.ena_svpd_length,
EFX_VPD_ID, 0, &offset, &length);
if (rc == 0)
wantpid = B_FALSE;
@@ -298,13 +298,13 @@ hunt_vpd_get(
EFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON);
/* Attempt to satisfy the request from svpd first */
- if (enp->en_u.hunt.enu_svpd_length > 0) {
- if ((rc = efx_vpd_hunk_get(enp->en_u.hunt.enu_svpd,
- enp->en_u.hunt.enu_svpd_length, evvp->evv_tag,
+ if (enp->en_arch.ef10.ena_svpd_length > 0) {
+ if ((rc = efx_vpd_hunk_get(enp->en_arch.ef10.ena_svpd,
+ enp->en_arch.ef10.ena_svpd_length, evvp->evv_tag,
evvp->evv_keyword, &offset, &length)) == 0) {
evvp->evv_length = length;
memcpy(evvp->evv_value,
- enp->en_u.hunt.enu_svpd + offset, length);
+ enp->en_arch.ef10.ena_svpd + offset, length);
return (0);
} else if (rc != ENOENT)
goto fail1;
@@ -340,12 +340,12 @@ hunt_vpd_set(
EFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON);
/* If the provided (tag,keyword) exists in svpd, then it is readonly */
- if (enp->en_u.hunt.enu_svpd_length > 0) {
+ if (enp->en_arch.ef10.ena_svpd_length > 0) {
unsigned int offset;
uint8_t length;
- if ((rc = efx_vpd_hunk_get(enp->en_u.hunt.enu_svpd,
- enp->en_u.hunt.enu_svpd_length, evvp->evv_tag,
+ if ((rc = efx_vpd_hunk_get(enp->en_arch.ef10.ena_svpd,
+ enp->en_arch.ef10.ena_svpd_length, evvp->evv_tag,
evvp->evv_keyword, &offset, &length)) == 0) {
rc = EACCES;
goto fail1;
@@ -421,12 +421,12 @@ hunt_vpd_fini(
{
EFSYS_ASSERT(enp->en_family == EFX_FAMILY_HUNTINGTON);
- if (enp->en_u.hunt.enu_svpd_length > 0) {
- EFSYS_KMEM_FREE(enp->en_esip, enp->en_u.hunt.enu_svpd_length,
- enp->en_u.hunt.enu_svpd);
+ if (enp->en_arch.ef10.ena_svpd_length > 0) {
+ EFSYS_KMEM_FREE(enp->en_esip, enp->en_arch.ef10.ena_svpd_length,
+ enp->en_arch.ef10.ena_svpd);
- enp->en_u.hunt.enu_svpd = NULL;
- enp->en_u.hunt.enu_svpd_length = 0;
+ enp->en_arch.ef10.ena_svpd = NULL;
+ enp->en_arch.ef10.ena_svpd_length = 0;
}
}
diff --git a/sys/dev/sfxge/common/medford_impl.h b/sys/dev/sfxge/common/medford_impl.h
index 39f908eff114..11084dc00f68 100644
--- a/sys/dev/sfxge/common/medford_impl.h
+++ b/sys/dev/sfxge/common/medford_impl.h
@@ -37,7 +37,7 @@
extern "C" {
#endif
-
+#define MEDFORD_PIOBUF_NBUFS (16)
#ifdef __cplusplus