8 #include <linux/types.h>
10 #include <linux/pci.h>
12 #include <linux/netdevice.h>
13 #include <linux/ethtool.h>
23 #define QLC_SIZEOF(m) FIELD_SIZEOF(struct qlcnic_adapter, m)
24 #define QLC_OFF(m) offsetof(struct qlcnic_adapter, m)
26 static const struct qlcnic_stats qlcnic_gstrings_stats[] = {
66 "rx multicast frames",
67 "rx broadcast frames",
73 "tx multicast frames",
74 "tx broadcast frames",
89 "mac_tx_lt_127b_pkts",
90 "mac_tx_lt_255b_pkts",
91 "mac_tx_lt_511b_pkts",
92 "mac_tx_lt_1023b_pkts",
93 "mac_tx_lt_1518b_pkts",
94 "mac_tx_gt_1518b_pkts",
101 "mac_rx_lt_64b_pkts",
102 "mac_rx_lt_127b_pkts",
103 "mac_rx_lt_255b_pkts",
104 "mac_rx_lt_511b_pkts",
105 "mac_rx_lt_1023b_pkts",
106 "mac_rx_lt_1518b_pkts",
107 "mac_rx_gt_1518b_pkts",
108 "mac_rx_length_error",
109 "mac_rx_length_small",
110 "mac_rx_length_large",
117 #define QLCNIC_STATS_LEN ARRAY_SIZE(qlcnic_gstrings_stats)
118 #define QLCNIC_MAC_STATS_LEN ARRAY_SIZE(qlcnic_mac_stats_strings)
119 #define QLCNIC_DEVICE_STATS_LEN ARRAY_SIZE(qlcnic_device_gstrings_stats)
120 #define QLCNIC_TOTAL_STATS_LEN QLCNIC_STATS_LEN + QLCNIC_MAC_STATS_LEN
123 "Register_Test_on_offline",
124 "Link_Test_on_offline",
125 "Interrupt_Test_offline",
126 "Internal_Loopback_offline",
127 "External_Loopback_offline"
130 #define QLCNIC_TEST_LEN ARRAY_SIZE(qlcnic_gstrings_test)
132 #define QLCNIC_RING_REGS_COUNT 20
133 #define QLCNIC_RING_REGS_LEN (QLCNIC_RING_REGS_COUNT * sizeof(u32))
134 #define QLCNIC_MAX_EEPROM_LEN 1024
136 static const u32 diag_registers[] = {
158 #define QLCNIC_MGMT_API_VERSION 2
159 #define QLCNIC_DEV_INFO_SIZE 1
160 #define QLCNIC_ETHTOOL_REGS_VER 2
176 u32 fw_major, fw_minor, fw_build;
182 "%d.%d.%d", fw_major, fw_minor, fw_build);
195 int check_sfp_module = 0;
211 ethtool_cmd_speed_set(ecmd, adapter->
link_speed);
228 ethtool_cmd_speed_set(ecmd, adapter->
link_speed);
244 switch (adapter->
ahw->board_type) {
272 check_sfp_module = netif_running(dev) &&
287 check_sfp_module = netif_running(dev) &&
298 dev_err(&adapter->
pdev->dev,
"Unsupported board model %d\n",
299 adapter->
ahw->board_type);
303 if (check_sfp_module) {
341 switch (ethtool_cmd_speed(ecmd)) {
362 adapter->
link_speed = ethtool_cmd_speed(ecmd);
366 if (!netif_running(dev))
382 memset(p, 0, qlcnic_get_regs_len(dev));
390 regs_buff[i] =
QLCRD32(adapter, diag_registers[
j]);
395 regs_buff[i++] = 0xFFEFCDAB;
399 regs_buff[i++] =
readl(adapter->
tx_ring->crb_cmd_producer);
431 if (eeprom->
len == 0)
435 ((adapter->
pdev)->device << 16);
465 num_desc =
max(val, min);
466 num_desc =
min(num_desc, max);
469 if (val != num_desc) {
487 num_rxd = qlcnic_validate_ringparam(ring->
rx_pending,
494 num_txd = qlcnic_validate_ringparam(ring->
tx_pending,
508 static void qlcnic_get_channels(
struct net_device *dev,
521 static int qlcnic_set_channels(
struct net_device *dev,
536 netdev_info(dev,
"allocated 0x%x sds rings\n",
581 dev_err(&netdev->
dev,
"Unknown board type: %x\n",
582 adapter->
ahw->port_type);
587 qlcnic_set_pauseparam(
struct net_device *netdev,
659 dev_err(&netdev->
dev,
"Unknown board type: %x\n",
660 adapter->
ahw->port_type);
665 static int qlcnic_reg_test(
struct net_device *dev)
671 if ((data_read & 0xffff) != adapter->
pdev->vendor)
677 static int qlcnic_get_sset_count(
struct net_device *dev,
int sset)
692 static int qlcnic_irq_test(
struct net_device *netdev)
729 #define QLCNIC_ILB_PKT_SIZE 64
730 #define QLCNIC_NUM_ILB_PKT 16
731 #define QLCNIC_ILB_MAX_RCV_LOOP 10
733 static void qlcnic_create_loopback_buff(
unsigned char *
data,
u8 mac[])
735 unsigned char random_data[] = {0xa8, 0x06, 0x45, 0x00};
748 qlcnic_create_loopback_buff(buff, mac);
757 int i, loop,
cnt = 0;
761 qlcnic_create_loopback_buff(skb->
data, adapter->
mac_addr);
779 "LB Test: packet #%d was not received\n", i + 1);
787 "WARNING: Please make sure external"
788 "loopback connector is plugged in\n");
795 static int qlcnic_loopback_test(
struct net_device *netdev,
u8 mode)
804 netdev_info(netdev,
"Firmware is not loopback test capable\n");
808 QLCDB(adapter, DRV,
"%s loopback test in progress\n",
811 netdev_warn(netdev,
"Loopback test not supported for non "
812 "privilege function\n");
823 sds_ring = &adapter->
recv_ctx->sds_rings[0];
834 netdev_info(netdev,
"firmware didnt respond to loopback"
835 " configure request\n");
844 ret = qlcnic_do_lb_test(adapter, mode);
863 data[0] = qlcnic_reg_test(dev);
867 data[1] = (
u64) qlcnic_test_link(dev);
872 data[2] = qlcnic_irq_test(dev);
896 memcpy(data, *qlcnic_gstrings_test,
902 qlcnic_gstrings_stats[index].stat_string,
907 qlcnic_mac_stats_strings[j],
914 qlcnic_device_gstrings_stats[i],
921 qlcnic_fill_stats(
int *index,
u64 *data,
void *
stats,
int type)
983 qlcnic_get_ethtool_stats(
struct net_device *dev,
994 qlcnic_gstrings_stats[index].stat_offset;
1024 static int qlcnic_set_led(
struct net_device *dev,
1032 netdev_warn(dev,
"LED test not supported for non "
1033 "privilege function\n");
1051 if (adapter->
nic_ops->config_led(adapter, 1, 0xf) == 0) {
1057 "Failed to set LED blink state.\n");
1072 if (adapter->
nic_ops->config_led(adapter, 0, 0xf))
1074 "Failed to reset LED blink state.\n");
1101 if (wol_cfg & (1
UL << adapter->
portnum))
1105 if (wol_cfg & (1
UL << adapter->
portnum))
1119 if (!(wol_cfg & (1 << adapter->
portnum)))
1138 static int qlcnic_set_intr_coalesce(
struct net_device *netdev,
1176 adapter->
ahw->coal.rx_time_us =
1178 adapter->
ahw->coal.rx_packets =
1181 adapter->
ahw->coal.flag = 0;
1183 adapter->
ahw->coal.rx_packets =
1192 static int qlcnic_get_intr_coalesce(
struct net_device *netdev,
1213 static void qlcnic_set_msglevel(
struct net_device *netdev,
u32 msglvl)
1227 netdev_err(adapter->
netdev,
"FW Dump not supported\n");
1255 netdev_err(netdev,
"FW Dump not supported\n");
1259 if (!fw_dump->
clr) {
1260 netdev_info(netdev,
"Dump not available\n");
1267 for (i = 0; i < copy_sz/
sizeof(
u32); i++)
1272 dump->
len = copy_sz + fw_dump->
size;
1279 netdev_info(netdev,
"extracted the FW dump Successfully\n");
1291 switch (val->
flag) {
1294 netdev_err(netdev,
"FW dump not supported\n");
1298 netdev_info(netdev,
"FW dump not enabled\n");
1303 "Previous dump not cleared, not forcing dump\n");
1306 netdev_info(netdev,
"Forcing a FW dump\n");
1311 netdev_info(netdev,
"Disabling FW dump\n");
1317 netdev_err(netdev,
"FW dump not supported\n");
1321 netdev_info(netdev,
"Enabling FW dump\n");
1326 netdev_info(netdev,
"Forcing a FW reset\n");
1334 netdev_info(netdev,
"Device in FAILED state\n");
1338 netdev_err(netdev,
"FW dump not supported\n");
1341 for (i = 0; i <
ARRAY_SIZE(FW_DUMP_LEVELS); i++) {
1342 if (val->
flag == FW_DUMP_LEVELS[i]) {
1345 netdev_info(netdev,
"Driver mask changed to: 0x%x\n",
1350 netdev_info(netdev,
"Invalid dump level: 0x%x\n", val->
flag);
1357 .get_settings = qlcnic_get_settings,
1358 .set_settings = qlcnic_set_settings,
1359 .get_drvinfo = qlcnic_get_drvinfo,
1360 .get_regs_len = qlcnic_get_regs_len,
1361 .get_regs = qlcnic_get_regs,
1363 .get_eeprom_len = qlcnic_get_eeprom_len,
1364 .get_eeprom = qlcnic_get_eeprom,
1365 .get_ringparam = qlcnic_get_ringparam,
1366 .set_ringparam = qlcnic_set_ringparam,
1367 .get_channels = qlcnic_get_channels,
1368 .set_channels = qlcnic_set_channels,
1369 .get_pauseparam = qlcnic_get_pauseparam,
1370 .set_pauseparam = qlcnic_set_pauseparam,
1371 .get_wol = qlcnic_get_wol,
1372 .set_wol = qlcnic_set_wol,
1373 .self_test = qlcnic_diag_test,
1374 .get_strings = qlcnic_get_strings,
1375 .get_ethtool_stats = qlcnic_get_ethtool_stats,
1376 .get_sset_count = qlcnic_get_sset_count,
1377 .get_coalesce = qlcnic_get_intr_coalesce,
1378 .set_coalesce = qlcnic_set_intr_coalesce,
1379 .set_phys_id = qlcnic_set_led,
1380 .set_msglevel = qlcnic_set_msglevel,
1381 .get_msglevel = qlcnic_get_msglevel,
1382 .get_dump_flag = qlcnic_get_dump_flag,
1383 .get_dump_data = qlcnic_get_dump_data,
1384 .set_dump = qlcnic_set_dump,
1388 .get_settings = qlcnic_get_settings,
1389 .get_drvinfo = qlcnic_get_drvinfo,
1390 .set_msglevel = qlcnic_set_msglevel,
1391 .get_msglevel = qlcnic_get_msglevel,