aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/sfc
diff options
context:
space:
mode:
authorBen Hutchings <bhutchings@solarflare.com>2009-11-29 10:08:55 -0500
committerDavid S. Miller <davem@davemloft.net>2009-11-29 20:23:53 -0500
commitc1c4f453b61463df4df16f7aa5782fc0cfe05b9e (patch)
treea72b533294500e7f19ab1f67142b732471df53cb /drivers/net/sfc
parente58f69f4082f60076885798fae8f3a17ea713bf6 (diff)
sfc: Remove static PHY data and enumerations
New NICs have firmware managing the PHY, and we will discover the PHY capabilities at run-time. Replace the static data with probe() and test_name() operations. Signed-off-by: Ben Hutchings <bhutchings@solarflare.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/sfc')
-rw-r--r--drivers/net/sfc/ethtool.c18
-rw-r--r--drivers/net/sfc/falcon.c15
-rw-r--r--drivers/net/sfc/falcon.h20
-rw-r--r--drivers/net/sfc/falcon_xmac.c2
-rw-r--r--drivers/net/sfc/mdio_10g.c4
-rw-r--r--drivers/net/sfc/net_driver.h35
-rw-r--r--drivers/net/sfc/qt202x_phy.c12
-rw-r--r--drivers/net/sfc/selftest.c5
-rw-r--r--drivers/net/sfc/tenxpress.c49
9 files changed, 95 insertions, 65 deletions
diff --git a/drivers/net/sfc/ethtool.c b/drivers/net/sfc/ethtool.c
index e86cbca75ea8..4fe874052e3e 100644
--- a/drivers/net/sfc/ethtool.c
+++ b/drivers/net/sfc/ethtool.c
@@ -365,9 +365,21 @@ static int efx_ethtool_fill_self_tests(struct efx_nic *efx,
365 efx_fill_test(n++, strings, data, &tests->registers, 365 efx_fill_test(n++, strings, data, &tests->registers,
366 "core", 0, "registers", NULL); 366 "core", 0, "registers", NULL);
367 367
368 for (i = 0; i < efx->phy_op->num_tests; i++) 368 if (efx->phy_op->run_tests != NULL) {
369 efx_fill_test(n++, strings, data, &tests->phy[i], 369 EFX_BUG_ON_PARANOID(efx->phy_op->test_name == NULL);
370 "phy", 0, efx->phy_op->test_names[i], NULL); 370
371 for (i = 0; true; ++i) {
372 const char *name;
373
374 EFX_BUG_ON_PARANOID(i >= EFX_MAX_PHY_TESTS);
375 name = efx->phy_op->test_name(efx, i);
376 if (name == NULL)
377 break;
378
379 efx_fill_test(n++, strings, data, &tests->phy[i],
380 "phy", 0, name, NULL);
381 }
382 }
371 383
372 /* Loopback tests */ 384 /* Loopback tests */
373 for (mode = LOOPBACK_NONE; mode <= LOOPBACK_TEST_MAX; mode++) { 385 for (mode = LOOPBACK_NONE; mode <= LOOPBACK_TEST_MAX; mode++) {
diff --git a/drivers/net/sfc/falcon.c b/drivers/net/sfc/falcon.c
index 63e6734d8341..29d45376e4c9 100644
--- a/drivers/net/sfc/falcon.c
+++ b/drivers/net/sfc/falcon.c
@@ -2291,19 +2291,12 @@ static int falcon_probe_port(struct efx_nic *efx)
2291 return -ENODEV; 2291 return -ENODEV;
2292 } 2292 }
2293 2293
2294 if (efx->phy_op->macs & EFX_XMAC) 2294 /* Fill out MDIO structure and loopback modes */
2295 efx->loopback_modes |= ((1 << LOOPBACK_XGMII) |
2296 (1 << LOOPBACK_XGXS) |
2297 (1 << LOOPBACK_XAUI));
2298 if (efx->phy_op->macs & EFX_GMAC)
2299 efx->loopback_modes |= (1 << LOOPBACK_GMAC);
2300 efx->loopback_modes |= efx->phy_op->loopbacks;
2301
2302 /* Set up MDIO structure for PHY */
2303 efx->mdio.mmds = efx->phy_op->mmds;
2304 efx->mdio.mode_support = MDIO_SUPPORTS_C45 | MDIO_EMULATE_C22;
2305 efx->mdio.mdio_read = falcon_mdio_read; 2295 efx->mdio.mdio_read = falcon_mdio_read;
2306 efx->mdio.mdio_write = falcon_mdio_write; 2296 efx->mdio.mdio_write = falcon_mdio_write;
2297 rc = efx->phy_op->probe(efx);
2298 if (rc != 0)
2299 return rc;
2307 2300
2308 /* Initial assumption */ 2301 /* Initial assumption */
2309 efx->link_state.speed = 10000; 2302 efx->link_state.speed = 10000;
diff --git a/drivers/net/sfc/falcon.h b/drivers/net/sfc/falcon.h
index 875b58e94e8e..3085ecfaceed 100644
--- a/drivers/net/sfc/falcon.h
+++ b/drivers/net/sfc/falcon.h
@@ -38,6 +38,26 @@ static inline bool efx_nic_is_dual_func(struct efx_nic *efx)
38 return efx_nic_rev(efx) < EFX_REV_FALCON_B0; 38 return efx_nic_rev(efx) < EFX_REV_FALCON_B0;
39} 39}
40 40
41enum {
42 PHY_TYPE_NONE = 0,
43 PHY_TYPE_TXC43128 = 1,
44 PHY_TYPE_88E1111 = 2,
45 PHY_TYPE_SFX7101 = 3,
46 PHY_TYPE_QT2022C2 = 4,
47 PHY_TYPE_PM8358 = 6,
48 PHY_TYPE_SFT9001A = 8,
49 PHY_TYPE_QT2025C = 9,
50 PHY_TYPE_SFT9001B = 10,
51};
52
53#define FALCON_XMAC_LOOPBACKS \
54 ((1 << LOOPBACK_XGMII) | \
55 (1 << LOOPBACK_XGXS) | \
56 (1 << LOOPBACK_XAUI))
57
58#define FALCON_GMAC_LOOPBACKS \
59 (1 << LOOPBACK_GMAC)
60
41/** 61/**
42 * struct falcon_board_type - board operations and type information 62 * struct falcon_board_type - board operations and type information
43 * @id: Board type id, as found in NVRAM 63 * @id: Board type id, as found in NVRAM
diff --git a/drivers/net/sfc/falcon_xmac.c b/drivers/net/sfc/falcon_xmac.c
index 83da79279a95..643622df6e62 100644
--- a/drivers/net/sfc/falcon_xmac.c
+++ b/drivers/net/sfc/falcon_xmac.c
@@ -137,7 +137,7 @@ static bool falcon_xaui_link_ok(struct efx_nic *efx)
137 137
138 /* If the link is up, then check the phy side of the xaui link */ 138 /* If the link is up, then check the phy side of the xaui link */
139 if (efx->link_state.up && link_ok) 139 if (efx->link_state.up && link_ok)
140 if (efx->phy_op->mmds & (1 << MDIO_MMD_PHYXS)) 140 if (efx->mdio.mmds & (1 << MDIO_MMD_PHYXS))
141 link_ok = efx_mdio_phyxgxs_lane_sync(efx); 141 link_ok = efx_mdio_phyxgxs_lane_sync(efx);
142 142
143 return link_ok; 143 return link_ok;
diff --git a/drivers/net/sfc/mdio_10g.c b/drivers/net/sfc/mdio_10g.c
index e6ca988abbb5..20e627431d27 100644
--- a/drivers/net/sfc/mdio_10g.c
+++ b/drivers/net/sfc/mdio_10g.c
@@ -15,6 +15,7 @@
15#include "net_driver.h" 15#include "net_driver.h"
16#include "mdio_10g.h" 16#include "mdio_10g.h"
17#include "workarounds.h" 17#include "workarounds.h"
18#include "falcon.h"
18 19
19unsigned efx_mdio_id_oui(u32 id) 20unsigned efx_mdio_id_oui(u32 id)
20{ 21{
@@ -312,8 +313,7 @@ void efx_mdio_an_reconfigure(struct efx_nic *efx)
312 /* Enable and restart AN */ 313 /* Enable and restart AN */
313 reg = efx_mdio_read(efx, MDIO_MMD_AN, MDIO_CTRL1); 314 reg = efx_mdio_read(efx, MDIO_MMD_AN, MDIO_CTRL1);
314 reg |= MDIO_AN_CTRL1_ENABLE; 315 reg |= MDIO_AN_CTRL1_ENABLE;
315 if (!(EFX_WORKAROUND_15195(efx) && 316 if (!(EFX_WORKAROUND_15195(efx) && LOOPBACK_EXTERNAL(efx)))
316 LOOPBACK_MASK(efx) & efx->phy_op->loopbacks))
317 reg |= MDIO_AN_CTRL1_RESTART; 317 reg |= MDIO_AN_CTRL1_RESTART;
318 if (xnp) 318 if (xnp)
319 reg |= MDIO_AN_CTRL1_XNP; 319 reg |= MDIO_AN_CTRL1_XNP;
diff --git a/drivers/net/sfc/net_driver.h b/drivers/net/sfc/net_driver.h
index cd2debb0a552..452f83510b0d 100644
--- a/drivers/net/sfc/net_driver.h
+++ b/drivers/net/sfc/net_driver.h
@@ -428,19 +428,6 @@ enum efx_int_mode {
428}; 428};
429#define EFX_INT_MODE_USE_MSI(x) (((x)->interrupt_mode) <= EFX_INT_MODE_MSI) 429#define EFX_INT_MODE_USE_MSI(x) (((x)->interrupt_mode) <= EFX_INT_MODE_MSI)
430 430
431enum phy_type {
432 PHY_TYPE_NONE = 0,
433 PHY_TYPE_TXC43128 = 1,
434 PHY_TYPE_88E1111 = 2,
435 PHY_TYPE_SFX7101 = 3,
436 PHY_TYPE_QT2022C2 = 4,
437 PHY_TYPE_PM8358 = 6,
438 PHY_TYPE_SFT9001A = 8,
439 PHY_TYPE_QT2025C = 9,
440 PHY_TYPE_SFT9001B = 10,
441 PHY_TYPE_MAX /* Insert any new items before this */
442};
443
444#define EFX_IS10G(efx) ((efx)->link_state.speed == 10000) 431#define EFX_IS10G(efx) ((efx)->link_state.speed == 10000)
445 432
446enum nic_state { 433enum nic_state {
@@ -483,12 +470,6 @@ enum efx_fc_type {
483 EFX_FC_AUTO = 4, 470 EFX_FC_AUTO = 4,
484}; 471};
485 472
486/* Supported MAC bit-mask */
487enum efx_mac_type {
488 EFX_GMAC = 1,
489 EFX_XMAC = 2,
490};
491
492/** 473/**
493 * struct efx_link_state - Current state of the link 474 * struct efx_link_state - Current state of the link
494 * @up: Link is up 475 * @up: Link is up
@@ -524,6 +505,8 @@ struct efx_mac_operations {
524 505
525/** 506/**
526 * struct efx_phy_operations - Efx PHY operations table 507 * struct efx_phy_operations - Efx PHY operations table
508 * @probe: Probe PHY and initialise efx->mdio.mode_support, efx->mdio.mmds,
509 * efx->loopback_modes.
527 * @init: Initialise PHY 510 * @init: Initialise PHY
528 * @fini: Shut down PHY 511 * @fini: Shut down PHY
529 * @reconfigure: Reconfigure PHY (e.g. for new link parameters) 512 * @reconfigure: Reconfigure PHY (e.g. for new link parameters)
@@ -533,15 +516,12 @@ struct efx_mac_operations {
533 * @set_settings: Set ethtool settings. Serialised by the mac_lock. 516 * @set_settings: Set ethtool settings. Serialised by the mac_lock.
534 * @set_npage_adv: Set abilities advertised in (Extended) Next Page 517 * @set_npage_adv: Set abilities advertised in (Extended) Next Page
535 * (only needed where AN bit is set in mmds) 518 * (only needed where AN bit is set in mmds)
536 * @num_tests: Number of PHY-specific tests/results 519 * @test_name: Get the name of a PHY-specific test/result
537 * @test_names: Names of the tests/results
538 * @run_tests: Run tests and record results as appropriate. 520 * @run_tests: Run tests and record results as appropriate.
539 * Flags are the ethtool tests flags. 521 * Flags are the ethtool tests flags.
540 * @mmds: MMD presence mask
541 * @loopbacks: Supported loopback modes mask
542 */ 522 */
543struct efx_phy_operations { 523struct efx_phy_operations {
544 enum efx_mac_type macs; 524 int (*probe) (struct efx_nic *efx);
545 int (*init) (struct efx_nic *efx); 525 int (*init) (struct efx_nic *efx);
546 void (*fini) (struct efx_nic *efx); 526 void (*fini) (struct efx_nic *efx);
547 int (*reconfigure) (struct efx_nic *efx); 527 int (*reconfigure) (struct efx_nic *efx);
@@ -551,11 +531,8 @@ struct efx_phy_operations {
551 int (*set_settings) (struct efx_nic *efx, 531 int (*set_settings) (struct efx_nic *efx,
552 struct ethtool_cmd *ecmd); 532 struct ethtool_cmd *ecmd);
553 void (*set_npage_adv) (struct efx_nic *efx, u32); 533 void (*set_npage_adv) (struct efx_nic *efx, u32);
554 u32 num_tests; 534 const char *(*test_name) (struct efx_nic *efx, unsigned int index);
555 const char *const *test_names;
556 int (*run_tests) (struct efx_nic *efx, int *results, unsigned flags); 535 int (*run_tests) (struct efx_nic *efx, int *results, unsigned flags);
557 int mmds;
558 unsigned loopbacks;
559}; 536};
560 537
561/** 538/**
@@ -806,7 +783,7 @@ struct efx_nic {
806 struct efx_mac_operations *mac_op; 783 struct efx_mac_operations *mac_op;
807 unsigned char mac_address[ETH_ALEN]; 784 unsigned char mac_address[ETH_ALEN];
808 785
809 enum phy_type phy_type; 786 unsigned int phy_type;
810 struct mutex mdio_lock; 787 struct mutex mdio_lock;
811 struct efx_phy_operations *phy_op; 788 struct efx_phy_operations *phy_op;
812 void *phy_data; 789 void *phy_data;
diff --git a/drivers/net/sfc/qt202x_phy.c b/drivers/net/sfc/qt202x_phy.c
index 49a5ab5efb9a..22b0e89ba8f2 100644
--- a/drivers/net/sfc/qt202x_phy.c
+++ b/drivers/net/sfc/qt202x_phy.c
@@ -135,6 +135,14 @@ static int qt202x_reset_phy(struct efx_nic *efx)
135 return rc; 135 return rc;
136} 136}
137 137
138static int qt202x_phy_probe(struct efx_nic *efx)
139{
140 efx->mdio.mmds = QT202X_REQUIRED_DEVS;
141 efx->mdio.mode_support = MDIO_SUPPORTS_C45 | MDIO_EMULATE_C22;
142 efx->loopback_modes = QT202X_LOOPBACKS | FALCON_XMAC_LOOPBACKS;
143 return 0;
144}
145
138static int qt202x_phy_init(struct efx_nic *efx) 146static int qt202x_phy_init(struct efx_nic *efx)
139{ 147{
140 struct qt202x_phy_data *phy_data; 148 struct qt202x_phy_data *phy_data;
@@ -224,13 +232,11 @@ static void qt202x_phy_fini(struct efx_nic *efx)
224} 232}
225 233
226struct efx_phy_operations falcon_qt202x_phy_ops = { 234struct efx_phy_operations falcon_qt202x_phy_ops = {
227 .macs = EFX_XMAC, 235 .probe = qt202x_phy_probe,
228 .init = qt202x_phy_init, 236 .init = qt202x_phy_init,
229 .reconfigure = qt202x_phy_reconfigure, 237 .reconfigure = qt202x_phy_reconfigure,
230 .poll = qt202x_phy_poll, 238 .poll = qt202x_phy_poll,
231 .fini = qt202x_phy_fini, 239 .fini = qt202x_phy_fini,
232 .get_settings = qt202x_phy_get_settings, 240 .get_settings = qt202x_phy_get_settings,
233 .set_settings = efx_mdio_set_settings, 241 .set_settings = efx_mdio_set_settings,
234 .mmds = QT202X_REQUIRED_DEVS,
235 .loopbacks = QT202X_LOOPBACKS,
236}; 242};
diff --git a/drivers/net/sfc/selftest.c b/drivers/net/sfc/selftest.c
index 9a240536debc..16258d83b703 100644
--- a/drivers/net/sfc/selftest.c
+++ b/drivers/net/sfc/selftest.c
@@ -100,7 +100,7 @@ static int efx_test_mdio(struct efx_nic *efx, struct efx_self_tests *tests)
100 } 100 }
101 101
102 if (EFX_IS10G(efx)) { 102 if (EFX_IS10G(efx)) {
103 rc = efx_mdio_check_mmds(efx, efx->phy_op->mmds, 0); 103 rc = efx_mdio_check_mmds(efx, efx->mdio.mmds, 0);
104 if (rc) 104 if (rc)
105 goto out; 105 goto out;
106 } 106 }
@@ -253,9 +253,6 @@ static int efx_test_phy(struct efx_nic *efx, struct efx_self_tests *tests,
253 if (!efx->phy_op->run_tests) 253 if (!efx->phy_op->run_tests)
254 return 0; 254 return 0;
255 255
256 EFX_BUG_ON_PARANOID(efx->phy_op->num_tests == 0 ||
257 efx->phy_op->num_tests > EFX_MAX_PHY_TESTS);
258
259 mutex_lock(&efx->mac_lock); 256 mutex_lock(&efx->mac_lock);
260 rc = efx->phy_op->run_tests(efx, tests->phy, flags); 257 rc = efx->phy_op->run_tests(efx, tests->phy, flags);
261 mutex_unlock(&efx->mac_lock); 258 mutex_unlock(&efx->mac_lock);
diff --git a/drivers/net/sfc/tenxpress.c b/drivers/net/sfc/tenxpress.c
index 0dfb2275a158..8de97a9f2719 100644
--- a/drivers/net/sfc/tenxpress.c
+++ b/drivers/net/sfc/tenxpress.c
@@ -298,6 +298,23 @@ static int tenxpress_init(struct efx_nic *efx)
298 return 0; 298 return 0;
299} 299}
300 300
301static int sfx7101_phy_probe(struct efx_nic *efx)
302{
303 efx->mdio.mmds = TENXPRESS_REQUIRED_DEVS;
304 efx->mdio.mode_support = MDIO_SUPPORTS_C45 | MDIO_EMULATE_C22;
305 efx->loopback_modes = SFX7101_LOOPBACKS | FALCON_XMAC_LOOPBACKS;
306 return 0;
307}
308
309static int sft9001_phy_probe(struct efx_nic *efx)
310{
311 efx->mdio.mmds = TENXPRESS_REQUIRED_DEVS;
312 efx->mdio.mode_support = MDIO_SUPPORTS_C45 | MDIO_EMULATE_C22;
313 efx->loopback_modes = (SFT9001_LOOPBACKS | FALCON_XMAC_LOOPBACKS |
314 FALCON_GMAC_LOOPBACKS);
315 return 0;
316}
317
301static int tenxpress_phy_init(struct efx_nic *efx) 318static int tenxpress_phy_init(struct efx_nic *efx)
302{ 319{
303 struct tenxpress_phy_data *phy_data; 320 struct tenxpress_phy_data *phy_data;
@@ -512,7 +529,7 @@ static int tenxpress_phy_reconfigure(struct efx_nic *efx)
512 529
513 phy_mode_change = (efx->phy_mode == PHY_MODE_NORMAL && 530 phy_mode_change = (efx->phy_mode == PHY_MODE_NORMAL &&
514 phy_data->phy_mode != PHY_MODE_NORMAL); 531 phy_data->phy_mode != PHY_MODE_NORMAL);
515 loop_reset = (LOOPBACK_OUT_OF(phy_data, efx, efx->phy_op->loopbacks) || 532 loop_reset = (LOOPBACK_OUT_OF(phy_data, efx, LOOPBACKS_EXTERNAL(efx)) ||
516 LOOPBACK_CHANGED(phy_data, efx, 1 << LOOPBACK_GPHY)); 533 LOOPBACK_CHANGED(phy_data, efx, 1 << LOOPBACK_GPHY));
517 534
518 if (loop_reset || phy_mode_change) { 535 if (loop_reset || phy_mode_change) {
@@ -627,6 +644,13 @@ static const char *const sfx7101_test_names[] = {
627 "bist" 644 "bist"
628}; 645};
629 646
647static const char *sfx7101_test_name(struct efx_nic *efx, unsigned int index)
648{
649 if (index < ARRAY_SIZE(sfx7101_test_names))
650 return sfx7101_test_names[index];
651 return NULL;
652}
653
630static int 654static int
631sfx7101_run_tests(struct efx_nic *efx, int *results, unsigned flags) 655sfx7101_run_tests(struct efx_nic *efx, int *results, unsigned flags)
632{ 656{
@@ -656,6 +680,13 @@ static const char *const sft9001_test_names[] = {
656 "cable.pairD.length", 680 "cable.pairD.length",
657}; 681};
658 682
683static const char *sft9001_test_name(struct efx_nic *efx, unsigned int index)
684{
685 if (index < ARRAY_SIZE(sft9001_test_names))
686 return sft9001_test_names[index];
687 return NULL;
688}
689
659static int sft9001_run_tests(struct efx_nic *efx, int *results, unsigned flags) 690static int sft9001_run_tests(struct efx_nic *efx, int *results, unsigned flags)
660{ 691{
661 int rc = 0, rc2, i, ctrl_reg, res_reg; 692 int rc = 0, rc2, i, ctrl_reg, res_reg;
@@ -758,7 +789,7 @@ tenxpress_get_settings(struct efx_nic *efx, struct ethtool_cmd *ecmd)
758 * but doesn't advertise the correct speed. So override it */ 789 * but doesn't advertise the correct speed. So override it */
759 if (efx->loopback_mode == LOOPBACK_GPHY) 790 if (efx->loopback_mode == LOOPBACK_GPHY)
760 ecmd->speed = SPEED_1000; 791 ecmd->speed = SPEED_1000;
761 else if (LOOPBACK_MASK(efx) & efx->phy_op->loopbacks) 792 else if (LOOPBACK_EXTERNAL(efx))
762 ecmd->speed = SPEED_10000; 793 ecmd->speed = SPEED_10000;
763} 794}
764 795
@@ -788,7 +819,7 @@ static void sft9001_set_npage_adv(struct efx_nic *efx, u32 advertising)
788} 819}
789 820
790struct efx_phy_operations falcon_sfx7101_phy_ops = { 821struct efx_phy_operations falcon_sfx7101_phy_ops = {
791 .macs = EFX_XMAC, 822 .probe = sfx7101_phy_probe,
792 .init = tenxpress_phy_init, 823 .init = tenxpress_phy_init,
793 .reconfigure = tenxpress_phy_reconfigure, 824 .reconfigure = tenxpress_phy_reconfigure,
794 .poll = tenxpress_phy_poll, 825 .poll = tenxpress_phy_poll,
@@ -796,15 +827,12 @@ struct efx_phy_operations falcon_sfx7101_phy_ops = {
796 .get_settings = tenxpress_get_settings, 827 .get_settings = tenxpress_get_settings,
797 .set_settings = tenxpress_set_settings, 828 .set_settings = tenxpress_set_settings,
798 .set_npage_adv = sfx7101_set_npage_adv, 829 .set_npage_adv = sfx7101_set_npage_adv,
799 .num_tests = ARRAY_SIZE(sfx7101_test_names), 830 .test_name = sfx7101_test_name,
800 .test_names = sfx7101_test_names,
801 .run_tests = sfx7101_run_tests, 831 .run_tests = sfx7101_run_tests,
802 .mmds = TENXPRESS_REQUIRED_DEVS,
803 .loopbacks = SFX7101_LOOPBACKS,
804}; 832};
805 833
806struct efx_phy_operations falcon_sft9001_phy_ops = { 834struct efx_phy_operations falcon_sft9001_phy_ops = {
807 .macs = EFX_GMAC | EFX_XMAC, 835 .probe = sft9001_phy_probe,
808 .init = tenxpress_phy_init, 836 .init = tenxpress_phy_init,
809 .reconfigure = tenxpress_phy_reconfigure, 837 .reconfigure = tenxpress_phy_reconfigure,
810 .poll = tenxpress_phy_poll, 838 .poll = tenxpress_phy_poll,
@@ -812,9 +840,6 @@ struct efx_phy_operations falcon_sft9001_phy_ops = {
812 .get_settings = tenxpress_get_settings, 840 .get_settings = tenxpress_get_settings,
813 .set_settings = tenxpress_set_settings, 841 .set_settings = tenxpress_set_settings,
814 .set_npage_adv = sft9001_set_npage_adv, 842 .set_npage_adv = sft9001_set_npage_adv,
815 .num_tests = ARRAY_SIZE(sft9001_test_names), 843 .test_name = sft9001_test_name,
816 .test_names = sft9001_test_names,
817 .run_tests = sft9001_run_tests, 844 .run_tests = sft9001_run_tests,
818 .mmds = TENXPRESS_REQUIRED_DEVS,
819 .loopbacks = SFT9001_LOOPBACKS,
820}; 845};