1/*-
2 * Copyright (C) 2012 Emulex
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice,
--- 22 unchanged lines hidden (view full) ---
31 * Contact Information:
32 * freebsd-drivers@emulex.com
33 *
34 * Emulex
35 * 3333 Susan Street
36 * Costa Mesa, CA 92626
37 */
38
39/* $FreeBSD: head/sys/dev/oce/oce_sysctl.c 247880 2013-03-06 09:53:38Z delphij $ */
40
41/* $FreeBSD: head/sys/dev/oce/oce_sysctl.c 247880 2013-03-06 09:53:38Z delphij $ */
42
43
44#include "oce_if.h"
45
46static void copy_stats_to_sc_xe201(POCE_SOFTC sc);
47static void copy_stats_to_sc_be3(POCE_SOFTC sc);
48static void copy_stats_to_sc_be2(POCE_SOFTC sc);
49static int oce_sysctl_loopback(SYSCTL_HANDLER_ARGS);
50static int oce_be3_fwupgrade(POCE_SOFTC sc, const struct firmware *fw);
51static int oce_sys_fwupgrade(SYSCTL_HANDLER_ARGS);
52static int oce_be3_flashdata(POCE_SOFTC sc, const struct firmware
53 *fw, int num_imgs);
54static int oce_lancer_fwupgrade(POCE_SOFTC sc, const struct firmware *fw);
55static int oce_sysctl_sfp_vpd_dump(SYSCTL_HANDLER_ARGS);
56static boolean_t oce_phy_flashing_required(POCE_SOFTC sc);
57static boolean_t oce_img_flashing_required(POCE_SOFTC sc, const char *p,
58 int img_optype, uint32_t img_offset,
59 uint32_t img_size, uint32_t hdrs_size);
60static void oce_add_stats_sysctls_be3(POCE_SOFTC sc,
61 struct sysctl_ctx_list *ctx,
62 struct sysctl_oid *stats_node);
63static void oce_add_stats_sysctls_xe201(POCE_SOFTC sc,
64 struct sysctl_ctx_list *ctx,
65 struct sysctl_oid *stats_node);
66
67extern char component_revision[32];
68uint32_t sfp_vpd_dump_buffer[TRANSCEIVER_DATA_NUM_ELE];
69
70void
71oce_add_sysctls(POCE_SOFTC sc)
72{
73
74 struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(sc->dev);
75 struct sysctl_oid *tree = device_get_sysctl_tree(sc->dev);
76 struct sysctl_oid_list *child = SYSCTL_CHILDREN(tree);
77 struct sysctl_oid *stats_node;
--- 14 unchanged lines hidden (view full) ---
92
93 SYSCTL_ADD_INT(ctx, child,
94 OID_AUTO, "max_rsp_handled",
95 CTLTYPE_INT | CTLFLAG_RW,
96 &oce_max_rsp_handled,
97 sizeof(oce_max_rsp_handled),
98 "Maximum receive frames handled per interupt");
99
100 if ((sc->function_mode & FNM_FLEX10_MODE) ||
101 (sc->function_mode & FNM_UMC_MODE))
102 SYSCTL_ADD_UINT(ctx, child,
103 OID_AUTO, "speed",
104 CTLFLAG_RD,
105 &sc->qos_link_speed,
106 0,"QOS Speed");
107 else
108 SYSCTL_ADD_UINT(ctx, child,
109 OID_AUTO, "speed",
--- 11 unchanged lines hidden (view full) ---
121 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "loop_back",
122 CTLTYPE_INT | CTLFLAG_RW, (void *)sc, 0,
123 oce_sysctl_loopback, "I", "Loop Back Tests");
124
125 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "fw_upgrade",
126 CTLTYPE_STRING | CTLFLAG_RW, (void *)sc, 0,
127 oce_sys_fwupgrade, "A", "Firmware ufi file");
128
129 /*
130 * Dumps Transceiver data
131 * "sysctl dev.oce.0.sfp_vpd_dump=0"
132 * "sysctl -x dev.oce.0.sfp_vpd_dump_buffer" for hex dump
133 * "sysctl -b dev.oce.0.sfp_vpd_dump_buffer > sfp.bin" for binary dump
134 */
135 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "sfp_vpd_dump",
136 CTLTYPE_INT | CTLFLAG_RW, (void *)sc, 0, oce_sysctl_sfp_vpd_dump,
137 "I", "Initiate a sfp_vpd_dump operation");
138 SYSCTL_ADD_OPAQUE(ctx, child, OID_AUTO, "sfp_vpd_dump_buffer",
139 CTLFLAG_RD, sfp_vpd_dump_buffer,
140 TRANSCEIVER_DATA_SIZE, "IU", "Access sfp_vpd_dump buffer");
141
142 stats_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "stats",
143 CTLFLAG_RD, NULL, "Ethernet Statistics");
144
145 if (IS_BE(sc))
146 oce_add_stats_sysctls_be3(sc, ctx, stats_node);
147 else
148 oce_add_stats_sysctls_xe201(sc, ctx, stats_node);
149
150
151}
152
153
154static uint32_t
155oce_loopback_test(struct oce_softc *sc, uint8_t loopback_type)
156{
157 uint32_t status = 0;
158
159 oce_mbox_cmd_set_loopback(sc, sc->if_id, loopback_type, 1);
160 status = oce_mbox_cmd_test_loopback(sc, sc->if_id, loopback_type,
161 1500, 2, 0xabc);
162 oce_mbox_cmd_set_loopback(sc, sc->if_id, OCE_NO_LOOPBACK, 1);
163
164 return status;
165}
166
167static int
168oce_sysctl_loopback(SYSCTL_HANDLER_ARGS)
169{
170 int value = 0;
171 uint32_t status;
172 struct oce_softc *sc = (struct oce_softc *)arg1;
173
174 status = sysctl_handle_int(oidp, &value, 0, req);
--- 1139 unchanged lines hidden (view full) ---
1314 } else {
1315 rc = oce_mbox_get_pport_stats(sc, &sc->stats_mem, reset);
1316 if (!rc)
1317 copy_stats_to_sc_xe201(sc);
1318 }
1319
1320 return rc;
1321}
1322
1323static int
1324oce_sysctl_sfp_vpd_dump(SYSCTL_HANDLER_ARGS)
1325{
1326 int result = 0, error;
1327 int rc = 0;
1328 POCE_SOFTC sc = (POCE_SOFTC) arg1;
1329
1330 /* sysctl default handler */
1331 error = sysctl_handle_int(oidp, &result, 0, req);
1332 if (error || !req->newptr)
1333 return (error);
1334
1335 if(result == -1) {
1336 return EINVAL;
1337 }
1338 bzero((char *)sfp_vpd_dump_buffer, TRANSCEIVER_DATA_SIZE);
1339
1340 rc = oce_mbox_read_transrecv_data(sc, PAGE_NUM_A0);
1341 if(rc)
1342 return rc;
1343
1344 rc = oce_mbox_read_transrecv_data(sc, PAGE_NUM_A2);
1345 if(rc)
1346 return rc;
1347
1348 return rc;
1349}
2 * Copyright (C) 2012 Emulex
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 * 1. Redistributions of source code must retain the above copyright notice,
--- 22 unchanged lines hidden (view full) ---
31 * Contact Information:
32 * freebsd-drivers@emulex.com
33 *
34 * Emulex
35 * 3333 Susan Street
36 * Costa Mesa, CA 92626
37 */
38
39/* $FreeBSD: head/sys/dev/oce/oce_sysctl.c 247880 2013-03-06 09:53:38Z delphij $ */
40
41/* $FreeBSD: head/sys/dev/oce/oce_sysctl.c 247880 2013-03-06 09:53:38Z delphij $ */
42
43
44#include "oce_if.h"
45
46static void copy_stats_to_sc_xe201(POCE_SOFTC sc);
47static void copy_stats_to_sc_be3(POCE_SOFTC sc);
48static void copy_stats_to_sc_be2(POCE_SOFTC sc);
49static int oce_sysctl_loopback(SYSCTL_HANDLER_ARGS);
50static int oce_be3_fwupgrade(POCE_SOFTC sc, const struct firmware *fw);
51static int oce_sys_fwupgrade(SYSCTL_HANDLER_ARGS);
52static int oce_be3_flashdata(POCE_SOFTC sc, const struct firmware
53 *fw, int num_imgs);
54static int oce_lancer_fwupgrade(POCE_SOFTC sc, const struct firmware *fw);
55static int oce_sysctl_sfp_vpd_dump(SYSCTL_HANDLER_ARGS);
56static boolean_t oce_phy_flashing_required(POCE_SOFTC sc);
57static boolean_t oce_img_flashing_required(POCE_SOFTC sc, const char *p,
58 int img_optype, uint32_t img_offset,
59 uint32_t img_size, uint32_t hdrs_size);
60static void oce_add_stats_sysctls_be3(POCE_SOFTC sc,
61 struct sysctl_ctx_list *ctx,
62 struct sysctl_oid *stats_node);
63static void oce_add_stats_sysctls_xe201(POCE_SOFTC sc,
64 struct sysctl_ctx_list *ctx,
65 struct sysctl_oid *stats_node);
66
67extern char component_revision[32];
68uint32_t sfp_vpd_dump_buffer[TRANSCEIVER_DATA_NUM_ELE];
69
70void
71oce_add_sysctls(POCE_SOFTC sc)
72{
73
74 struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(sc->dev);
75 struct sysctl_oid *tree = device_get_sysctl_tree(sc->dev);
76 struct sysctl_oid_list *child = SYSCTL_CHILDREN(tree);
77 struct sysctl_oid *stats_node;
--- 14 unchanged lines hidden (view full) ---
92
93 SYSCTL_ADD_INT(ctx, child,
94 OID_AUTO, "max_rsp_handled",
95 CTLTYPE_INT | CTLFLAG_RW,
96 &oce_max_rsp_handled,
97 sizeof(oce_max_rsp_handled),
98 "Maximum receive frames handled per interupt");
99
100 if ((sc->function_mode & FNM_FLEX10_MODE) ||
101 (sc->function_mode & FNM_UMC_MODE))
102 SYSCTL_ADD_UINT(ctx, child,
103 OID_AUTO, "speed",
104 CTLFLAG_RD,
105 &sc->qos_link_speed,
106 0,"QOS Speed");
107 else
108 SYSCTL_ADD_UINT(ctx, child,
109 OID_AUTO, "speed",
--- 11 unchanged lines hidden (view full) ---
121 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "loop_back",
122 CTLTYPE_INT | CTLFLAG_RW, (void *)sc, 0,
123 oce_sysctl_loopback, "I", "Loop Back Tests");
124
125 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "fw_upgrade",
126 CTLTYPE_STRING | CTLFLAG_RW, (void *)sc, 0,
127 oce_sys_fwupgrade, "A", "Firmware ufi file");
128
129 /*
130 * Dumps Transceiver data
131 * "sysctl dev.oce.0.sfp_vpd_dump=0"
132 * "sysctl -x dev.oce.0.sfp_vpd_dump_buffer" for hex dump
133 * "sysctl -b dev.oce.0.sfp_vpd_dump_buffer > sfp.bin" for binary dump
134 */
135 SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "sfp_vpd_dump",
136 CTLTYPE_INT | CTLFLAG_RW, (void *)sc, 0, oce_sysctl_sfp_vpd_dump,
137 "I", "Initiate a sfp_vpd_dump operation");
138 SYSCTL_ADD_OPAQUE(ctx, child, OID_AUTO, "sfp_vpd_dump_buffer",
139 CTLFLAG_RD, sfp_vpd_dump_buffer,
140 TRANSCEIVER_DATA_SIZE, "IU", "Access sfp_vpd_dump buffer");
141
142 stats_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "stats",
143 CTLFLAG_RD, NULL, "Ethernet Statistics");
144
145 if (IS_BE(sc))
146 oce_add_stats_sysctls_be3(sc, ctx, stats_node);
147 else
148 oce_add_stats_sysctls_xe201(sc, ctx, stats_node);
149
150
151}
152
153
154static uint32_t
155oce_loopback_test(struct oce_softc *sc, uint8_t loopback_type)
156{
157 uint32_t status = 0;
158
159 oce_mbox_cmd_set_loopback(sc, sc->if_id, loopback_type, 1);
160 status = oce_mbox_cmd_test_loopback(sc, sc->if_id, loopback_type,
161 1500, 2, 0xabc);
162 oce_mbox_cmd_set_loopback(sc, sc->if_id, OCE_NO_LOOPBACK, 1);
163
164 return status;
165}
166
167static int
168oce_sysctl_loopback(SYSCTL_HANDLER_ARGS)
169{
170 int value = 0;
171 uint32_t status;
172 struct oce_softc *sc = (struct oce_softc *)arg1;
173
174 status = sysctl_handle_int(oidp, &value, 0, req);
--- 1139 unchanged lines hidden (view full) ---
1314 } else {
1315 rc = oce_mbox_get_pport_stats(sc, &sc->stats_mem, reset);
1316 if (!rc)
1317 copy_stats_to_sc_xe201(sc);
1318 }
1319
1320 return rc;
1321}
1322
1323static int
1324oce_sysctl_sfp_vpd_dump(SYSCTL_HANDLER_ARGS)
1325{
1326 int result = 0, error;
1327 int rc = 0;
1328 POCE_SOFTC sc = (POCE_SOFTC) arg1;
1329
1330 /* sysctl default handler */
1331 error = sysctl_handle_int(oidp, &result, 0, req);
1332 if (error || !req->newptr)
1333 return (error);
1334
1335 if(result == -1) {
1336 return EINVAL;
1337 }
1338 bzero((char *)sfp_vpd_dump_buffer, TRANSCEIVER_DATA_SIZE);
1339
1340 rc = oce_mbox_read_transrecv_data(sc, PAGE_NUM_A0);
1341 if(rc)
1342 return rc;
1343
1344 rc = oce_mbox_read_transrecv_data(sc, PAGE_NUM_A2);
1345 if(rc)
1346 return rc;
1347
1348 return rc;
1349}