1 /* 2 * QLogic qlcnic NIC Driver 3 * Copyright (c) 2009-2013 QLogic Corporation 4 * 5 * See LICENSE.qlcnic for copyright and licensing details. 6 */ 7 8 #include <linux/types.h> 9 #include <linux/delay.h> 10 #include <linux/pci.h> 11 #include <linux/io.h> 12 #include <linux/netdevice.h> 13 #include <linux/ethtool.h> 14 15 #include "qlcnic.h" 16 17 struct qlcnic_stats { 18 char stat_string[ETH_GSTRING_LEN]; 19 int sizeof_stat; 20 int stat_offset; 21 }; 22 23 #define QLC_SIZEOF(m) FIELD_SIZEOF(struct qlcnic_adapter, m) 24 #define QLC_OFF(m) offsetof(struct qlcnic_adapter, m) 25 static const u32 qlcnic_fw_dump_level[] = { 26 0x3, 0x7, 0xf, 0x1f, 0x3f, 0x7f, 0xff 27 }; 28 29 static const struct qlcnic_stats qlcnic_gstrings_stats[] = { 30 {"xmit_on", QLC_SIZEOF(stats.xmit_on), QLC_OFF(stats.xmit_on)}, 31 {"xmit_off", QLC_SIZEOF(stats.xmit_off), QLC_OFF(stats.xmit_off)}, 32 {"xmit_called", QLC_SIZEOF(stats.xmitcalled), 33 QLC_OFF(stats.xmitcalled)}, 34 {"xmit_finished", QLC_SIZEOF(stats.xmitfinished), 35 QLC_OFF(stats.xmitfinished)}, 36 {"tx dma map error", QLC_SIZEOF(stats.tx_dma_map_error), 37 QLC_OFF(stats.tx_dma_map_error)}, 38 {"tx_bytes", QLC_SIZEOF(stats.txbytes), QLC_OFF(stats.txbytes)}, 39 {"tx_dropped", QLC_SIZEOF(stats.txdropped), QLC_OFF(stats.txdropped)}, 40 {"rx dma map error", QLC_SIZEOF(stats.rx_dma_map_error), 41 QLC_OFF(stats.rx_dma_map_error)}, 42 {"rx_pkts", QLC_SIZEOF(stats.rx_pkts), QLC_OFF(stats.rx_pkts)}, 43 {"rx_bytes", QLC_SIZEOF(stats.rxbytes), QLC_OFF(stats.rxbytes)}, 44 {"rx_dropped", QLC_SIZEOF(stats.rxdropped), QLC_OFF(stats.rxdropped)}, 45 {"null rxbuf", QLC_SIZEOF(stats.null_rxbuf), QLC_OFF(stats.null_rxbuf)}, 46 {"csummed", QLC_SIZEOF(stats.csummed), QLC_OFF(stats.csummed)}, 47 {"lro_pkts", QLC_SIZEOF(stats.lro_pkts), QLC_OFF(stats.lro_pkts)}, 48 {"lrobytes", QLC_SIZEOF(stats.lrobytes), QLC_OFF(stats.lrobytes)}, 49 {"lso_frames", QLC_SIZEOF(stats.lso_frames), QLC_OFF(stats.lso_frames)}, 50 {"skb_alloc_failure", QLC_SIZEOF(stats.skb_alloc_failure), 51 QLC_OFF(stats.skb_alloc_failure)}, 52 {"mac_filter_limit_overrun", QLC_SIZEOF(stats.mac_filter_limit_overrun), 53 QLC_OFF(stats.mac_filter_limit_overrun)}, 54 {"spurious intr", QLC_SIZEOF(stats.spurious_intr), 55 QLC_OFF(stats.spurious_intr)}, 56 57 }; 58 59 static const char qlcnic_device_gstrings_stats[][ETH_GSTRING_LEN] = { 60 "tx unicast frames", 61 "tx multicast frames", 62 "tx broadcast frames", 63 "tx dropped frames", 64 "tx errors", 65 "tx local frames", 66 "tx numbytes", 67 "rx unicast frames", 68 "rx multicast frames", 69 "rx broadcast frames", 70 "rx dropped frames", 71 "rx errors", 72 "rx local frames", 73 "rx numbytes", 74 }; 75 76 static const char qlcnic_83xx_tx_stats_strings[][ETH_GSTRING_LEN] = { 77 "ctx_tx_bytes", 78 "ctx_tx_pkts", 79 "ctx_tx_errors", 80 "ctx_tx_dropped_pkts", 81 "ctx_tx_num_buffers", 82 }; 83 84 static const char qlcnic_83xx_mac_stats_strings[][ETH_GSTRING_LEN] = { 85 "mac_tx_frames", 86 "mac_tx_bytes", 87 "mac_tx_mcast_pkts", 88 "mac_tx_bcast_pkts", 89 "mac_tx_pause_cnt", 90 "mac_tx_ctrl_pkt", 91 "mac_tx_lt_64b_pkts", 92 "mac_tx_lt_127b_pkts", 93 "mac_tx_lt_255b_pkts", 94 "mac_tx_lt_511b_pkts", 95 "mac_tx_lt_1023b_pkts", 96 "mac_tx_lt_1518b_pkts", 97 "mac_tx_gt_1518b_pkts", 98 "mac_rx_frames", 99 "mac_rx_bytes", 100 "mac_rx_mcast_pkts", 101 "mac_rx_bcast_pkts", 102 "mac_rx_pause_cnt", 103 "mac_rx_ctrl_pkt", 104 "mac_rx_lt_64b_pkts", 105 "mac_rx_lt_127b_pkts", 106 "mac_rx_lt_255b_pkts", 107 "mac_rx_lt_511b_pkts", 108 "mac_rx_lt_1023b_pkts", 109 "mac_rx_lt_1518b_pkts", 110 "mac_rx_gt_1518b_pkts", 111 "mac_rx_length_error", 112 "mac_rx_length_small", 113 "mac_rx_length_large", 114 "mac_rx_jabber", 115 "mac_rx_dropped", 116 "mac_crc_error", 117 "mac_align_error", 118 "eswitch_frames", 119 "eswitch_bytes", 120 "eswitch_multicast_frames", 121 "eswitch_broadcast_frames", 122 "eswitch_unicast_frames", 123 "eswitch_error_free_frames", 124 "eswitch_error_free_bytes", 125 }; 126 127 #define QLCNIC_STATS_LEN ARRAY_SIZE(qlcnic_gstrings_stats) 128 129 static const char qlcnic_tx_queue_stats_strings[][ETH_GSTRING_LEN] = { 130 "xmit_on", 131 "xmit_off", 132 "xmit_called", 133 "xmit_finished", 134 "tx_bytes", 135 }; 136 137 #define QLCNIC_TX_STATS_LEN ARRAY_SIZE(qlcnic_tx_queue_stats_strings) 138 139 static const char qlcnic_83xx_rx_stats_strings[][ETH_GSTRING_LEN] = { 140 "ctx_rx_bytes", 141 "ctx_rx_pkts", 142 "ctx_lro_pkt_cnt", 143 "ctx_ip_csum_error", 144 "ctx_rx_pkts_wo_ctx", 145 "ctx_rx_pkts_drop_wo_sds_on_card", 146 "ctx_rx_pkts_drop_wo_sds_on_host", 147 "ctx_rx_osized_pkts", 148 "ctx_rx_pkts_dropped_wo_rds", 149 "ctx_rx_unexpected_mcast_pkts", 150 "ctx_invalid_mac_address", 151 "ctx_rx_rds_ring_prim_attempted", 152 "ctx_rx_rds_ring_prim_success", 153 "ctx_num_lro_flows_added", 154 "ctx_num_lro_flows_removed", 155 "ctx_num_lro_flows_active", 156 "ctx_pkts_dropped_unknown", 157 }; 158 159 static const char qlcnic_gstrings_test[][ETH_GSTRING_LEN] = { 160 "Register_Test_on_offline", 161 "Link_Test_on_offline", 162 "Interrupt_Test_offline", 163 "Internal_Loopback_offline", 164 "External_Loopback_offline", 165 "EEPROM_Test_offline" 166 }; 167 168 #define QLCNIC_TEST_LEN ARRAY_SIZE(qlcnic_gstrings_test) 169 170 static inline int qlcnic_82xx_statistics(struct qlcnic_adapter *adapter) 171 { 172 return ARRAY_SIZE(qlcnic_gstrings_stats) + 173 ARRAY_SIZE(qlcnic_83xx_mac_stats_strings) + 174 QLCNIC_TX_STATS_LEN * adapter->drv_tx_rings; 175 } 176 177 static inline int qlcnic_83xx_statistics(struct qlcnic_adapter *adapter) 178 { 179 return ARRAY_SIZE(qlcnic_gstrings_stats) + 180 ARRAY_SIZE(qlcnic_83xx_tx_stats_strings) + 181 ARRAY_SIZE(qlcnic_83xx_mac_stats_strings) + 182 ARRAY_SIZE(qlcnic_83xx_rx_stats_strings) + 183 QLCNIC_TX_STATS_LEN * adapter->drv_tx_rings; 184 } 185 186 static int qlcnic_dev_statistics_len(struct qlcnic_adapter *adapter) 187 { 188 int len = -1; 189 190 if (qlcnic_82xx_check(adapter)) { 191 len = qlcnic_82xx_statistics(adapter); 192 if (adapter->flags & QLCNIC_ESWITCH_ENABLED) 193 len += ARRAY_SIZE(qlcnic_device_gstrings_stats); 194 } else if (qlcnic_83xx_check(adapter)) { 195 len = qlcnic_83xx_statistics(adapter); 196 } 197 198 return len; 199 } 200 201 #define QLCNIC_TX_INTR_NOT_CONFIGURED 0X78563412 202 203 #define QLCNIC_MAX_EEPROM_LEN 1024 204 205 static const u32 diag_registers[] = { 206 QLCNIC_CMDPEG_STATE, 207 QLCNIC_RCVPEG_STATE, 208 QLCNIC_FW_CAPABILITIES, 209 QLCNIC_CRB_DRV_ACTIVE, 210 QLCNIC_CRB_DEV_STATE, 211 QLCNIC_CRB_DRV_STATE, 212 QLCNIC_CRB_DRV_SCRATCH, 213 QLCNIC_CRB_DEV_PARTITION_INFO, 214 QLCNIC_CRB_DRV_IDC_VER, 215 QLCNIC_PEG_ALIVE_COUNTER, 216 QLCNIC_PEG_HALT_STATUS1, 217 QLCNIC_PEG_HALT_STATUS2, 218 -1 219 }; 220 221 222 static const u32 ext_diag_registers[] = { 223 CRB_XG_STATE_P3P, 224 ISR_INT_STATE_REG, 225 QLCNIC_CRB_PEG_NET_0+0x3c, 226 QLCNIC_CRB_PEG_NET_1+0x3c, 227 QLCNIC_CRB_PEG_NET_2+0x3c, 228 QLCNIC_CRB_PEG_NET_4+0x3c, 229 -1 230 }; 231 232 #define QLCNIC_MGMT_API_VERSION 2 233 #define QLCNIC_ETHTOOL_REGS_VER 4 234 235 static inline int qlcnic_get_ring_regs_len(struct qlcnic_adapter *adapter) 236 { 237 int ring_regs_cnt = (adapter->drv_tx_rings * 5) + 238 (adapter->max_rds_rings * 2) + 239 (adapter->drv_sds_rings * 3) + 5; 240 return ring_regs_cnt * sizeof(u32); 241 } 242 243 static int qlcnic_get_regs_len(struct net_device *dev) 244 { 245 struct qlcnic_adapter *adapter = netdev_priv(dev); 246 u32 len; 247 248 if (qlcnic_83xx_check(adapter)) 249 len = qlcnic_83xx_get_regs_len(adapter); 250 else 251 len = sizeof(ext_diag_registers) + sizeof(diag_registers); 252 253 len += ((QLCNIC_DEV_INFO_SIZE + 2) * sizeof(u32)); 254 len += qlcnic_get_ring_regs_len(adapter); 255 return len; 256 } 257 258 static int qlcnic_get_eeprom_len(struct net_device *dev) 259 { 260 return QLCNIC_FLASH_TOTAL_SIZE; 261 } 262 263 static void 264 qlcnic_get_drvinfo(struct net_device *dev, struct ethtool_drvinfo *drvinfo) 265 { 266 struct qlcnic_adapter *adapter = netdev_priv(dev); 267 u32 fw_major, fw_minor, fw_build; 268 fw_major = QLC_SHARED_REG_RD32(adapter, QLCNIC_FW_VERSION_MAJOR); 269 fw_minor = QLC_SHARED_REG_RD32(adapter, QLCNIC_FW_VERSION_MINOR); 270 fw_build = QLC_SHARED_REG_RD32(adapter, QLCNIC_FW_VERSION_SUB); 271 snprintf(drvinfo->fw_version, sizeof(drvinfo->fw_version), 272 "%d.%d.%d", fw_major, fw_minor, fw_build); 273 274 strlcpy(drvinfo->bus_info, pci_name(adapter->pdev), 275 sizeof(drvinfo->bus_info)); 276 strlcpy(drvinfo->driver, qlcnic_driver_name, sizeof(drvinfo->driver)); 277 strlcpy(drvinfo->version, QLCNIC_LINUX_VERSIONID, 278 sizeof(drvinfo->version)); 279 } 280 281 static int 282 qlcnic_get_settings(struct net_device *dev, struct ethtool_cmd *ecmd) 283 { 284 struct qlcnic_adapter *adapter = netdev_priv(dev); 285 286 if (qlcnic_82xx_check(adapter)) 287 return qlcnic_82xx_get_settings(adapter, ecmd); 288 else if (qlcnic_83xx_check(adapter)) 289 return qlcnic_83xx_get_settings(adapter, ecmd); 290 291 return -EIO; 292 } 293 294 int qlcnic_82xx_get_settings(struct qlcnic_adapter *adapter, 295 struct ethtool_cmd *ecmd) 296 { 297 struct qlcnic_hardware_context *ahw = adapter->ahw; 298 u32 speed, reg; 299 int check_sfp_module = 0, err = 0; 300 u16 pcifn = ahw->pci_func; 301 302 /* read which mode */ 303 if (adapter->ahw->port_type == QLCNIC_GBE) { 304 ecmd->supported = (SUPPORTED_10baseT_Half | 305 SUPPORTED_10baseT_Full | 306 SUPPORTED_100baseT_Half | 307 SUPPORTED_100baseT_Full | 308 SUPPORTED_1000baseT_Half | 309 SUPPORTED_1000baseT_Full); 310 311 ecmd->advertising = (ADVERTISED_100baseT_Half | 312 ADVERTISED_100baseT_Full | 313 ADVERTISED_1000baseT_Half | 314 ADVERTISED_1000baseT_Full); 315 316 ethtool_cmd_speed_set(ecmd, adapter->ahw->link_speed); 317 ecmd->duplex = adapter->ahw->link_duplex; 318 ecmd->autoneg = adapter->ahw->link_autoneg; 319 320 } else if (adapter->ahw->port_type == QLCNIC_XGBE) { 321 u32 val = 0; 322 val = QLCRD32(adapter, QLCNIC_PORT_MODE_ADDR, &err); 323 324 if (val == QLCNIC_PORT_MODE_802_3_AP) { 325 ecmd->supported = SUPPORTED_1000baseT_Full; 326 ecmd->advertising = ADVERTISED_1000baseT_Full; 327 } else { 328 ecmd->supported = SUPPORTED_10000baseT_Full; 329 ecmd->advertising = ADVERTISED_10000baseT_Full; 330 } 331 332 if (netif_running(adapter->netdev) && ahw->has_link_events) { 333 if (ahw->linkup) { 334 reg = QLCRD32(adapter, 335 P3P_LINK_SPEED_REG(pcifn), &err); 336 speed = P3P_LINK_SPEED_VAL(pcifn, reg); 337 ahw->link_speed = speed * P3P_LINK_SPEED_MHZ; 338 } 339 340 ethtool_cmd_speed_set(ecmd, ahw->link_speed); 341 ecmd->autoneg = ahw->link_autoneg; 342 ecmd->duplex = ahw->link_duplex; 343 goto skip; 344 } 345 346 ethtool_cmd_speed_set(ecmd, SPEED_UNKNOWN); 347 ecmd->duplex = DUPLEX_UNKNOWN; 348 ecmd->autoneg = AUTONEG_DISABLE; 349 } else 350 return -EIO; 351 352 skip: 353 ecmd->phy_address = adapter->ahw->physical_port; 354 ecmd->transceiver = XCVR_EXTERNAL; 355 356 switch (adapter->ahw->board_type) { 357 case QLCNIC_BRDTYPE_P3P_REF_QG: 358 case QLCNIC_BRDTYPE_P3P_4_GB: 359 case QLCNIC_BRDTYPE_P3P_4_GB_MM: 360 361 ecmd->supported |= SUPPORTED_Autoneg; 362 ecmd->advertising |= ADVERTISED_Autoneg; 363 case QLCNIC_BRDTYPE_P3P_10G_CX4: 364 case QLCNIC_BRDTYPE_P3P_10G_CX4_LP: 365 case QLCNIC_BRDTYPE_P3P_10000_BASE_T: 366 ecmd->supported |= SUPPORTED_TP; 367 ecmd->advertising |= ADVERTISED_TP; 368 ecmd->port = PORT_TP; 369 ecmd->autoneg = adapter->ahw->link_autoneg; 370 break; 371 case QLCNIC_BRDTYPE_P3P_IMEZ: 372 case QLCNIC_BRDTYPE_P3P_XG_LOM: 373 case QLCNIC_BRDTYPE_P3P_HMEZ: 374 ecmd->supported |= SUPPORTED_MII; 375 ecmd->advertising |= ADVERTISED_MII; 376 ecmd->port = PORT_MII; 377 ecmd->autoneg = AUTONEG_DISABLE; 378 break; 379 case QLCNIC_BRDTYPE_P3P_10G_SFP_PLUS: 380 case QLCNIC_BRDTYPE_P3P_10G_SFP_CT: 381 case QLCNIC_BRDTYPE_P3P_10G_SFP_QT: 382 ecmd->advertising |= ADVERTISED_TP; 383 ecmd->supported |= SUPPORTED_TP; 384 check_sfp_module = netif_running(adapter->netdev) && 385 ahw->has_link_events; 386 case QLCNIC_BRDTYPE_P3P_10G_XFP: 387 ecmd->supported |= SUPPORTED_FIBRE; 388 ecmd->advertising |= ADVERTISED_FIBRE; 389 ecmd->port = PORT_FIBRE; 390 ecmd->autoneg = AUTONEG_DISABLE; 391 break; 392 case QLCNIC_BRDTYPE_P3P_10G_TP: 393 if (adapter->ahw->port_type == QLCNIC_XGBE) { 394 ecmd->autoneg = AUTONEG_DISABLE; 395 ecmd->supported |= (SUPPORTED_FIBRE | SUPPORTED_TP); 396 ecmd->advertising |= 397 (ADVERTISED_FIBRE | ADVERTISED_TP); 398 ecmd->port = PORT_FIBRE; 399 check_sfp_module = netif_running(adapter->netdev) && 400 ahw->has_link_events; 401 } else { 402 ecmd->autoneg = AUTONEG_ENABLE; 403 ecmd->supported |= (SUPPORTED_TP | SUPPORTED_Autoneg); 404 ecmd->advertising |= 405 (ADVERTISED_TP | ADVERTISED_Autoneg); 406 ecmd->port = PORT_TP; 407 } 408 break; 409 default: 410 dev_err(&adapter->pdev->dev, "Unsupported board model %d\n", 411 adapter->ahw->board_type); 412 return -EIO; 413 } 414 415 if (check_sfp_module) { 416 switch (adapter->ahw->module_type) { 417 case LINKEVENT_MODULE_OPTICAL_UNKNOWN: 418 case LINKEVENT_MODULE_OPTICAL_SRLR: 419 case LINKEVENT_MODULE_OPTICAL_LRM: 420 case LINKEVENT_MODULE_OPTICAL_SFP_1G: 421 ecmd->port = PORT_FIBRE; 422 break; 423 case LINKEVENT_MODULE_TWINAX_UNSUPPORTED_CABLE: 424 case LINKEVENT_MODULE_TWINAX_UNSUPPORTED_CABLELEN: 425 case LINKEVENT_MODULE_TWINAX: 426 ecmd->port = PORT_TP; 427 break; 428 default: 429 ecmd->port = PORT_OTHER; 430 } 431 } 432 433 return 0; 434 } 435 436 static int qlcnic_set_port_config(struct qlcnic_adapter *adapter, 437 struct ethtool_cmd *ecmd) 438 { 439 u32 ret = 0, config = 0; 440 /* read which mode */ 441 if (ecmd->duplex) 442 config |= 0x1; 443 444 if (ecmd->autoneg) 445 config |= 0x2; 446 447 switch (ethtool_cmd_speed(ecmd)) { 448 case SPEED_10: 449 config |= (0 << 8); 450 break; 451 case SPEED_100: 452 config |= (1 << 8); 453 break; 454 case SPEED_1000: 455 config |= (10 << 8); 456 break; 457 default: 458 return -EIO; 459 } 460 461 ret = qlcnic_fw_cmd_set_port(adapter, config); 462 463 if (ret == QLCNIC_RCODE_NOT_SUPPORTED) 464 return -EOPNOTSUPP; 465 else if (ret) 466 return -EIO; 467 return ret; 468 } 469 470 static int qlcnic_set_settings(struct net_device *dev, struct ethtool_cmd *ecmd) 471 { 472 u32 ret = 0; 473 struct qlcnic_adapter *adapter = netdev_priv(dev); 474 475 if (adapter->ahw->port_type != QLCNIC_GBE) 476 return -EOPNOTSUPP; 477 478 if (qlcnic_83xx_check(adapter)) 479 ret = qlcnic_83xx_set_settings(adapter, ecmd); 480 else 481 ret = qlcnic_set_port_config(adapter, ecmd); 482 483 if (!ret) 484 return ret; 485 486 adapter->ahw->link_speed = ethtool_cmd_speed(ecmd); 487 adapter->ahw->link_duplex = ecmd->duplex; 488 adapter->ahw->link_autoneg = ecmd->autoneg; 489 490 if (!netif_running(dev)) 491 return 0; 492 493 dev->netdev_ops->ndo_stop(dev); 494 return dev->netdev_ops->ndo_open(dev); 495 } 496 497 static int qlcnic_82xx_get_registers(struct qlcnic_adapter *adapter, 498 u32 *regs_buff) 499 { 500 int i, j = 0, err = 0; 501 502 for (i = QLCNIC_DEV_INFO_SIZE + 1; diag_registers[j] != -1; j++, i++) 503 regs_buff[i] = QLC_SHARED_REG_RD32(adapter, diag_registers[j]); 504 j = 0; 505 while (ext_diag_registers[j] != -1) 506 regs_buff[i++] = QLCRD32(adapter, ext_diag_registers[j++], 507 &err); 508 return i; 509 } 510 511 static void 512 qlcnic_get_regs(struct net_device *dev, struct ethtool_regs *regs, void *p) 513 { 514 struct qlcnic_adapter *adapter = netdev_priv(dev); 515 struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx; 516 struct qlcnic_host_sds_ring *sds_ring; 517 struct qlcnic_host_rds_ring *rds_rings; 518 struct qlcnic_host_tx_ring *tx_ring; 519 u32 *regs_buff = p; 520 int ring, i = 0; 521 522 memset(p, 0, qlcnic_get_regs_len(dev)); 523 524 regs->version = (QLCNIC_ETHTOOL_REGS_VER << 24) | 525 (adapter->ahw->revision_id << 16) | (adapter->pdev)->device; 526 527 regs_buff[0] = (0xcafe0000 | (QLCNIC_DEV_INFO_SIZE & 0xffff)); 528 regs_buff[1] = QLCNIC_MGMT_API_VERSION; 529 530 if (qlcnic_82xx_check(adapter)) 531 i = qlcnic_82xx_get_registers(adapter, regs_buff); 532 else 533 i = qlcnic_83xx_get_registers(adapter, regs_buff); 534 535 if (!test_bit(__QLCNIC_DEV_UP, &adapter->state)) 536 return; 537 538 /* Marker btw regs and TX ring count */ 539 regs_buff[i++] = 0xFFEFCDAB; 540 541 regs_buff[i++] = adapter->drv_tx_rings; /* No. of TX ring */ 542 for (ring = 0; ring < adapter->drv_tx_rings; ring++) { 543 tx_ring = &adapter->tx_ring[ring]; 544 regs_buff[i++] = le32_to_cpu(*(tx_ring->hw_consumer)); 545 regs_buff[i++] = tx_ring->sw_consumer; 546 regs_buff[i++] = readl(tx_ring->crb_cmd_producer); 547 regs_buff[i++] = tx_ring->producer; 548 if (tx_ring->crb_intr_mask) 549 regs_buff[i++] = readl(tx_ring->crb_intr_mask); 550 else 551 regs_buff[i++] = QLCNIC_TX_INTR_NOT_CONFIGURED; 552 } 553 554 regs_buff[i++] = adapter->max_rds_rings; /* No. of RX ring */ 555 for (ring = 0; ring < adapter->max_rds_rings; ring++) { 556 rds_rings = &recv_ctx->rds_rings[ring]; 557 regs_buff[i++] = readl(rds_rings->crb_rcv_producer); 558 regs_buff[i++] = rds_rings->producer; 559 } 560 561 regs_buff[i++] = adapter->drv_sds_rings; /* No. of SDS ring */ 562 for (ring = 0; ring < adapter->drv_sds_rings; ring++) { 563 sds_ring = &(recv_ctx->sds_rings[ring]); 564 regs_buff[i++] = readl(sds_ring->crb_sts_consumer); 565 regs_buff[i++] = sds_ring->consumer; 566 regs_buff[i++] = readl(sds_ring->crb_intr_mask); 567 } 568 } 569 570 static u32 qlcnic_test_link(struct net_device *dev) 571 { 572 struct qlcnic_adapter *adapter = netdev_priv(dev); 573 int err = 0; 574 u32 val; 575 576 if (qlcnic_83xx_check(adapter)) { 577 val = qlcnic_83xx_test_link(adapter); 578 return (val & 1) ? 0 : 1; 579 } 580 val = QLCRD32(adapter, CRB_XG_STATE_P3P, &err); 581 if (err == -EIO) 582 return err; 583 val = XG_LINK_STATE_P3P(adapter->ahw->pci_func, val); 584 return (val == XG_LINK_UP_P3P) ? 0 : 1; 585 } 586 587 static int 588 qlcnic_get_eeprom(struct net_device *dev, struct ethtool_eeprom *eeprom, 589 u8 *bytes) 590 { 591 struct qlcnic_adapter *adapter = netdev_priv(dev); 592 int offset; 593 int ret = -1; 594 595 if (qlcnic_83xx_check(adapter)) 596 return 0; 597 if (eeprom->len == 0) 598 return -EINVAL; 599 600 eeprom->magic = (adapter->pdev)->vendor | 601 ((adapter->pdev)->device << 16); 602 offset = eeprom->offset; 603 604 if (qlcnic_82xx_check(adapter)) 605 ret = qlcnic_rom_fast_read_words(adapter, offset, bytes, 606 eeprom->len); 607 if (ret < 0) 608 return ret; 609 610 return 0; 611 } 612 613 static void 614 qlcnic_get_ringparam(struct net_device *dev, 615 struct ethtool_ringparam *ring) 616 { 617 struct qlcnic_adapter *adapter = netdev_priv(dev); 618 619 ring->rx_pending = adapter->num_rxd; 620 ring->rx_jumbo_pending = adapter->num_jumbo_rxd; 621 ring->tx_pending = adapter->num_txd; 622 623 ring->rx_max_pending = adapter->max_rxd; 624 ring->rx_jumbo_max_pending = adapter->max_jumbo_rxd; 625 ring->tx_max_pending = MAX_CMD_DESCRIPTORS; 626 } 627 628 static u32 629 qlcnic_validate_ringparam(u32 val, u32 min, u32 max, char *r_name) 630 { 631 u32 num_desc; 632 num_desc = max(val, min); 633 num_desc = min(num_desc, max); 634 num_desc = roundup_pow_of_two(num_desc); 635 636 if (val != num_desc) { 637 printk(KERN_INFO "%s: setting %s ring size %d instead of %d\n", 638 qlcnic_driver_name, r_name, num_desc, val); 639 } 640 641 return num_desc; 642 } 643 644 static int 645 qlcnic_set_ringparam(struct net_device *dev, 646 struct ethtool_ringparam *ring) 647 { 648 struct qlcnic_adapter *adapter = netdev_priv(dev); 649 u16 num_rxd, num_jumbo_rxd, num_txd; 650 651 if (ring->rx_mini_pending) 652 return -EOPNOTSUPP; 653 654 num_rxd = qlcnic_validate_ringparam(ring->rx_pending, 655 MIN_RCV_DESCRIPTORS, adapter->max_rxd, "rx"); 656 657 num_jumbo_rxd = qlcnic_validate_ringparam(ring->rx_jumbo_pending, 658 MIN_JUMBO_DESCRIPTORS, adapter->max_jumbo_rxd, 659 "rx jumbo"); 660 661 num_txd = qlcnic_validate_ringparam(ring->tx_pending, 662 MIN_CMD_DESCRIPTORS, MAX_CMD_DESCRIPTORS, "tx"); 663 664 if (num_rxd == adapter->num_rxd && num_txd == adapter->num_txd && 665 num_jumbo_rxd == adapter->num_jumbo_rxd) 666 return 0; 667 668 adapter->num_rxd = num_rxd; 669 adapter->num_jumbo_rxd = num_jumbo_rxd; 670 adapter->num_txd = num_txd; 671 672 return qlcnic_reset_context(adapter); 673 } 674 675 static int qlcnic_validate_ring_count(struct qlcnic_adapter *adapter, 676 u8 rx_ring, u8 tx_ring) 677 { 678 if (rx_ring == 0 || tx_ring == 0) 679 return -EINVAL; 680 681 if (rx_ring != 0) { 682 if (rx_ring > adapter->max_sds_rings) { 683 netdev_err(adapter->netdev, 684 "Invalid ring count, SDS ring count %d should not be greater than max %d driver sds rings.\n", 685 rx_ring, adapter->max_sds_rings); 686 return -EINVAL; 687 } 688 } 689 690 if (tx_ring != 0) { 691 if (tx_ring > adapter->max_tx_rings) { 692 netdev_err(adapter->netdev, 693 "Invalid ring count, Tx ring count %d should not be greater than max %d driver Tx rings.\n", 694 tx_ring, adapter->max_tx_rings); 695 return -EINVAL; 696 } 697 } 698 699 return 0; 700 } 701 702 static void qlcnic_get_channels(struct net_device *dev, 703 struct ethtool_channels *channel) 704 { 705 struct qlcnic_adapter *adapter = netdev_priv(dev); 706 707 channel->max_rx = adapter->max_sds_rings; 708 channel->max_tx = adapter->max_tx_rings; 709 channel->rx_count = adapter->drv_sds_rings; 710 channel->tx_count = adapter->drv_tx_rings; 711 } 712 713 static int qlcnic_set_channels(struct net_device *dev, 714 struct ethtool_channels *channel) 715 { 716 struct qlcnic_adapter *adapter = netdev_priv(dev); 717 int err; 718 719 if (channel->other_count || channel->combined_count) 720 return -EINVAL; 721 722 err = qlcnic_validate_ring_count(adapter, channel->rx_count, 723 channel->tx_count); 724 if (err) 725 return err; 726 727 if (channel->rx_count) { 728 err = qlcnic_validate_rings(adapter, channel->rx_count, 729 QLCNIC_RX_QUEUE); 730 if (err) { 731 netdev_err(dev, "Unable to configure %u SDS rings\n", 732 channel->rx_count); 733 return err; 734 } 735 } 736 737 if (channel->tx_count) { 738 err = qlcnic_validate_rings(adapter, channel->tx_count, 739 QLCNIC_TX_QUEUE); 740 if (err) { 741 netdev_err(dev, "Unable to configure %u Tx rings\n", 742 channel->tx_count); 743 return err; 744 } 745 } 746 747 err = qlcnic_setup_rings(adapter, channel->rx_count, 748 channel->tx_count); 749 netdev_info(dev, "Allocated %d SDS rings and %d Tx rings\n", 750 adapter->drv_sds_rings, adapter->drv_tx_rings); 751 752 return err; 753 } 754 755 static void 756 qlcnic_get_pauseparam(struct net_device *netdev, 757 struct ethtool_pauseparam *pause) 758 { 759 struct qlcnic_adapter *adapter = netdev_priv(netdev); 760 int port = adapter->ahw->physical_port; 761 int err = 0; 762 __u32 val; 763 764 if (qlcnic_83xx_check(adapter)) { 765 qlcnic_83xx_get_pauseparam(adapter, pause); 766 return; 767 } 768 if (adapter->ahw->port_type == QLCNIC_GBE) { 769 if ((port < 0) || (port > QLCNIC_NIU_MAX_GBE_PORTS)) 770 return; 771 /* get flow control settings */ 772 val = QLCRD32(adapter, QLCNIC_NIU_GB_MAC_CONFIG_0(port), &err); 773 if (err == -EIO) 774 return; 775 pause->rx_pause = qlcnic_gb_get_rx_flowctl(val); 776 val = QLCRD32(adapter, QLCNIC_NIU_GB_PAUSE_CTL, &err); 777 if (err == -EIO) 778 return; 779 switch (port) { 780 case 0: 781 pause->tx_pause = !(qlcnic_gb_get_gb0_mask(val)); 782 break; 783 case 1: 784 pause->tx_pause = !(qlcnic_gb_get_gb1_mask(val)); 785 break; 786 case 2: 787 pause->tx_pause = !(qlcnic_gb_get_gb2_mask(val)); 788 break; 789 case 3: 790 default: 791 pause->tx_pause = !(qlcnic_gb_get_gb3_mask(val)); 792 break; 793 } 794 } else if (adapter->ahw->port_type == QLCNIC_XGBE) { 795 if ((port < 0) || (port > QLCNIC_NIU_MAX_XG_PORTS)) 796 return; 797 pause->rx_pause = 1; 798 val = QLCRD32(adapter, QLCNIC_NIU_XG_PAUSE_CTL, &err); 799 if (err == -EIO) 800 return; 801 if (port == 0) 802 pause->tx_pause = !(qlcnic_xg_get_xg0_mask(val)); 803 else 804 pause->tx_pause = !(qlcnic_xg_get_xg1_mask(val)); 805 } else { 806 dev_err(&netdev->dev, "Unknown board type: %x\n", 807 adapter->ahw->port_type); 808 } 809 } 810 811 static int 812 qlcnic_set_pauseparam(struct net_device *netdev, 813 struct ethtool_pauseparam *pause) 814 { 815 struct qlcnic_adapter *adapter = netdev_priv(netdev); 816 int port = adapter->ahw->physical_port; 817 int err = 0; 818 __u32 val; 819 820 if (qlcnic_83xx_check(adapter)) 821 return qlcnic_83xx_set_pauseparam(adapter, pause); 822 823 /* read mode */ 824 if (adapter->ahw->port_type == QLCNIC_GBE) { 825 if ((port < 0) || (port > QLCNIC_NIU_MAX_GBE_PORTS)) 826 return -EIO; 827 /* set flow control */ 828 val = QLCRD32(adapter, QLCNIC_NIU_GB_MAC_CONFIG_0(port), &err); 829 if (err == -EIO) 830 return err; 831 832 if (pause->rx_pause) 833 qlcnic_gb_rx_flowctl(val); 834 else 835 qlcnic_gb_unset_rx_flowctl(val); 836 837 QLCWR32(adapter, QLCNIC_NIU_GB_MAC_CONFIG_0(port), 838 val); 839 QLCWR32(adapter, QLCNIC_NIU_GB_MAC_CONFIG_0(port), val); 840 /* set autoneg */ 841 val = QLCRD32(adapter, QLCNIC_NIU_GB_PAUSE_CTL, &err); 842 if (err == -EIO) 843 return err; 844 switch (port) { 845 case 0: 846 if (pause->tx_pause) 847 qlcnic_gb_unset_gb0_mask(val); 848 else 849 qlcnic_gb_set_gb0_mask(val); 850 break; 851 case 1: 852 if (pause->tx_pause) 853 qlcnic_gb_unset_gb1_mask(val); 854 else 855 qlcnic_gb_set_gb1_mask(val); 856 break; 857 case 2: 858 if (pause->tx_pause) 859 qlcnic_gb_unset_gb2_mask(val); 860 else 861 qlcnic_gb_set_gb2_mask(val); 862 break; 863 case 3: 864 default: 865 if (pause->tx_pause) 866 qlcnic_gb_unset_gb3_mask(val); 867 else 868 qlcnic_gb_set_gb3_mask(val); 869 break; 870 } 871 QLCWR32(adapter, QLCNIC_NIU_GB_PAUSE_CTL, val); 872 } else if (adapter->ahw->port_type == QLCNIC_XGBE) { 873 if (!pause->rx_pause || pause->autoneg) 874 return -EOPNOTSUPP; 875 876 if ((port < 0) || (port > QLCNIC_NIU_MAX_XG_PORTS)) 877 return -EIO; 878 879 val = QLCRD32(adapter, QLCNIC_NIU_XG_PAUSE_CTL, &err); 880 if (err == -EIO) 881 return err; 882 if (port == 0) { 883 if (pause->tx_pause) 884 qlcnic_xg_unset_xg0_mask(val); 885 else 886 qlcnic_xg_set_xg0_mask(val); 887 } else { 888 if (pause->tx_pause) 889 qlcnic_xg_unset_xg1_mask(val); 890 else 891 qlcnic_xg_set_xg1_mask(val); 892 } 893 QLCWR32(adapter, QLCNIC_NIU_XG_PAUSE_CTL, val); 894 } else { 895 dev_err(&netdev->dev, "Unknown board type: %x\n", 896 adapter->ahw->port_type); 897 } 898 return 0; 899 } 900 901 static int qlcnic_reg_test(struct net_device *dev) 902 { 903 struct qlcnic_adapter *adapter = netdev_priv(dev); 904 u32 data_read; 905 int err = 0; 906 907 if (qlcnic_83xx_check(adapter)) 908 return qlcnic_83xx_reg_test(adapter); 909 910 data_read = QLCRD32(adapter, QLCNIC_PCIX_PH_REG(0), &err); 911 if (err == -EIO) 912 return err; 913 if ((data_read & 0xffff) != adapter->pdev->vendor) 914 return 1; 915 916 return 0; 917 } 918 919 static int qlcnic_eeprom_test(struct net_device *dev) 920 { 921 struct qlcnic_adapter *adapter = netdev_priv(dev); 922 923 if (qlcnic_82xx_check(adapter)) 924 return 0; 925 926 return qlcnic_83xx_flash_test(adapter); 927 } 928 929 static int qlcnic_get_sset_count(struct net_device *dev, int sset) 930 { 931 932 struct qlcnic_adapter *adapter = netdev_priv(dev); 933 switch (sset) { 934 case ETH_SS_TEST: 935 return QLCNIC_TEST_LEN; 936 case ETH_SS_STATS: 937 return qlcnic_dev_statistics_len(adapter); 938 default: 939 return -EOPNOTSUPP; 940 } 941 } 942 943 static int qlcnic_irq_test(struct net_device *netdev) 944 { 945 struct qlcnic_adapter *adapter = netdev_priv(netdev); 946 struct qlcnic_hardware_context *ahw = adapter->ahw; 947 struct qlcnic_cmd_args cmd; 948 int ret, drv_sds_rings = adapter->drv_sds_rings; 949 int drv_tx_rings = adapter->drv_tx_rings; 950 951 if (qlcnic_83xx_check(adapter)) 952 return qlcnic_83xx_interrupt_test(netdev); 953 954 if (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state)) 955 return -EIO; 956 957 ret = qlcnic_diag_alloc_res(netdev, QLCNIC_INTERRUPT_TEST); 958 if (ret) 959 goto clear_diag_irq; 960 961 ahw->diag_cnt = 0; 962 ret = qlcnic_alloc_mbx_args(&cmd, adapter, QLCNIC_CMD_INTRPT_TEST); 963 if (ret) 964 goto free_diag_res; 965 966 cmd.req.arg[1] = ahw->pci_func; 967 ret = qlcnic_issue_cmd(adapter, &cmd); 968 if (ret) 969 goto done; 970 971 usleep_range(1000, 12000); 972 ret = !ahw->diag_cnt; 973 974 done: 975 qlcnic_free_mbx_args(&cmd); 976 977 free_diag_res: 978 qlcnic_diag_free_res(netdev, drv_sds_rings); 979 980 clear_diag_irq: 981 adapter->drv_sds_rings = drv_sds_rings; 982 adapter->drv_tx_rings = drv_tx_rings; 983 clear_bit(__QLCNIC_RESETTING, &adapter->state); 984 985 return ret; 986 } 987 988 #define QLCNIC_ILB_PKT_SIZE 64 989 #define QLCNIC_NUM_ILB_PKT 16 990 #define QLCNIC_ILB_MAX_RCV_LOOP 10 991 #define QLCNIC_LB_PKT_POLL_DELAY_MSEC 1 992 #define QLCNIC_LB_PKT_POLL_COUNT 20 993 994 static void qlcnic_create_loopback_buff(unsigned char *data, u8 mac[]) 995 { 996 unsigned char random_data[] = {0xa8, 0x06, 0x45, 0x00}; 997 998 memset(data, 0x4e, QLCNIC_ILB_PKT_SIZE); 999 1000 memcpy(data, mac, ETH_ALEN); 1001 memcpy(data + ETH_ALEN, mac, ETH_ALEN); 1002 1003 memcpy(data + 2 * ETH_ALEN, random_data, sizeof(random_data)); 1004 } 1005 1006 int qlcnic_check_loopback_buff(unsigned char *data, u8 mac[]) 1007 { 1008 unsigned char buff[QLCNIC_ILB_PKT_SIZE]; 1009 qlcnic_create_loopback_buff(buff, mac); 1010 return memcmp(data, buff, QLCNIC_ILB_PKT_SIZE); 1011 } 1012 1013 int qlcnic_do_lb_test(struct qlcnic_adapter *adapter, u8 mode) 1014 { 1015 struct qlcnic_recv_context *recv_ctx = adapter->recv_ctx; 1016 struct qlcnic_host_sds_ring *sds_ring = &recv_ctx->sds_rings[0]; 1017 struct sk_buff *skb; 1018 int i, loop, cnt = 0; 1019 1020 for (i = 0; i < QLCNIC_NUM_ILB_PKT; i++) { 1021 skb = netdev_alloc_skb(adapter->netdev, QLCNIC_ILB_PKT_SIZE); 1022 qlcnic_create_loopback_buff(skb->data, adapter->mac_addr); 1023 skb_put(skb, QLCNIC_ILB_PKT_SIZE); 1024 adapter->ahw->diag_cnt = 0; 1025 qlcnic_xmit_frame(skb, adapter->netdev); 1026 loop = 0; 1027 1028 do { 1029 msleep(QLCNIC_LB_PKT_POLL_DELAY_MSEC); 1030 qlcnic_process_rcv_ring_diag(sds_ring); 1031 if (loop++ > QLCNIC_LB_PKT_POLL_COUNT) 1032 break; 1033 } while (!adapter->ahw->diag_cnt); 1034 1035 dev_kfree_skb_any(skb); 1036 1037 if (!adapter->ahw->diag_cnt) 1038 dev_warn(&adapter->pdev->dev, 1039 "LB Test: packet #%d was not received\n", 1040 i + 1); 1041 else 1042 cnt++; 1043 } 1044 if (cnt != i) { 1045 dev_err(&adapter->pdev->dev, 1046 "LB Test: failed, TX[%d], RX[%d]\n", i, cnt); 1047 if (mode != QLCNIC_ILB_MODE) 1048 dev_warn(&adapter->pdev->dev, 1049 "WARNING: Please check loopback cable\n"); 1050 return -1; 1051 } 1052 return 0; 1053 } 1054 1055 int qlcnic_loopback_test(struct net_device *netdev, u8 mode) 1056 { 1057 struct qlcnic_adapter *adapter = netdev_priv(netdev); 1058 int drv_tx_rings = adapter->drv_tx_rings; 1059 int drv_sds_rings = adapter->drv_sds_rings; 1060 struct qlcnic_host_sds_ring *sds_ring; 1061 struct qlcnic_hardware_context *ahw = adapter->ahw; 1062 int loop = 0; 1063 int ret; 1064 1065 if (qlcnic_83xx_check(adapter)) 1066 return qlcnic_83xx_loopback_test(netdev, mode); 1067 1068 if (!(ahw->capabilities & QLCNIC_FW_CAPABILITY_MULTI_LOOPBACK)) { 1069 dev_info(&adapter->pdev->dev, 1070 "Firmware do not support loopback test\n"); 1071 return -EOPNOTSUPP; 1072 } 1073 1074 dev_warn(&adapter->pdev->dev, "%s loopback test in progress\n", 1075 mode == QLCNIC_ILB_MODE ? "internal" : "external"); 1076 if (ahw->op_mode == QLCNIC_NON_PRIV_FUNC) { 1077 dev_warn(&adapter->pdev->dev, 1078 "Loopback test not supported in nonprivileged mode\n"); 1079 return 0; 1080 } 1081 1082 if (test_and_set_bit(__QLCNIC_RESETTING, &adapter->state)) 1083 return -EBUSY; 1084 1085 ret = qlcnic_diag_alloc_res(netdev, QLCNIC_LOOPBACK_TEST); 1086 if (ret) 1087 goto clear_it; 1088 1089 sds_ring = &adapter->recv_ctx->sds_rings[0]; 1090 ret = qlcnic_set_lb_mode(adapter, mode); 1091 if (ret) 1092 goto free_res; 1093 1094 ahw->diag_cnt = 0; 1095 do { 1096 msleep(500); 1097 qlcnic_process_rcv_ring_diag(sds_ring); 1098 if (loop++ > QLCNIC_ILB_MAX_RCV_LOOP) { 1099 netdev_info(netdev, 1100 "Firmware didn't sent link up event to loopback request\n"); 1101 ret = -ETIMEDOUT; 1102 goto free_res; 1103 } else if (adapter->ahw->diag_cnt) { 1104 ret = adapter->ahw->diag_cnt; 1105 goto free_res; 1106 } 1107 } while (!QLCNIC_IS_LB_CONFIGURED(ahw->loopback_state)); 1108 1109 ret = qlcnic_do_lb_test(adapter, mode); 1110 1111 qlcnic_clear_lb_mode(adapter, mode); 1112 1113 free_res: 1114 qlcnic_diag_free_res(netdev, drv_sds_rings); 1115 1116 clear_it: 1117 adapter->drv_sds_rings = drv_sds_rings; 1118 adapter->drv_tx_rings = drv_tx_rings; 1119 clear_bit(__QLCNIC_RESETTING, &adapter->state); 1120 return ret; 1121 } 1122 1123 static void 1124 qlcnic_diag_test(struct net_device *dev, struct ethtool_test *eth_test, 1125 u64 *data) 1126 { 1127 memset(data, 0, sizeof(u64) * QLCNIC_TEST_LEN); 1128 1129 data[0] = qlcnic_reg_test(dev); 1130 if (data[0]) 1131 eth_test->flags |= ETH_TEST_FL_FAILED; 1132 1133 data[1] = (u64) qlcnic_test_link(dev); 1134 if (data[1]) 1135 eth_test->flags |= ETH_TEST_FL_FAILED; 1136 1137 if (eth_test->flags & ETH_TEST_FL_OFFLINE) { 1138 data[2] = qlcnic_irq_test(dev); 1139 if (data[2]) 1140 eth_test->flags |= ETH_TEST_FL_FAILED; 1141 1142 data[3] = qlcnic_loopback_test(dev, QLCNIC_ILB_MODE); 1143 if (data[3]) 1144 eth_test->flags |= ETH_TEST_FL_FAILED; 1145 1146 if (eth_test->flags & ETH_TEST_FL_EXTERNAL_LB) { 1147 data[4] = qlcnic_loopback_test(dev, QLCNIC_ELB_MODE); 1148 if (data[4]) 1149 eth_test->flags |= ETH_TEST_FL_FAILED; 1150 eth_test->flags |= ETH_TEST_FL_EXTERNAL_LB_DONE; 1151 } 1152 1153 data[5] = qlcnic_eeprom_test(dev); 1154 if (data[5]) 1155 eth_test->flags |= ETH_TEST_FL_FAILED; 1156 } 1157 } 1158 1159 static void 1160 qlcnic_get_strings(struct net_device *dev, u32 stringset, u8 *data) 1161 { 1162 struct qlcnic_adapter *adapter = netdev_priv(dev); 1163 int index, i, num_stats; 1164 1165 switch (stringset) { 1166 case ETH_SS_TEST: 1167 memcpy(data, *qlcnic_gstrings_test, 1168 QLCNIC_TEST_LEN * ETH_GSTRING_LEN); 1169 break; 1170 case ETH_SS_STATS: 1171 num_stats = ARRAY_SIZE(qlcnic_tx_queue_stats_strings); 1172 for (i = 0; i < adapter->drv_tx_rings; i++) { 1173 for (index = 0; index < num_stats; index++) { 1174 sprintf(data, "tx_queue_%d %s", i, 1175 qlcnic_tx_queue_stats_strings[index]); 1176 data += ETH_GSTRING_LEN; 1177 } 1178 } 1179 1180 for (index = 0; index < QLCNIC_STATS_LEN; index++) { 1181 memcpy(data + index * ETH_GSTRING_LEN, 1182 qlcnic_gstrings_stats[index].stat_string, 1183 ETH_GSTRING_LEN); 1184 } 1185 1186 if (qlcnic_83xx_check(adapter)) { 1187 num_stats = ARRAY_SIZE(qlcnic_83xx_tx_stats_strings); 1188 for (i = 0; i < num_stats; i++, index++) 1189 memcpy(data + index * ETH_GSTRING_LEN, 1190 qlcnic_83xx_tx_stats_strings[i], 1191 ETH_GSTRING_LEN); 1192 num_stats = ARRAY_SIZE(qlcnic_83xx_mac_stats_strings); 1193 for (i = 0; i < num_stats; i++, index++) 1194 memcpy(data + index * ETH_GSTRING_LEN, 1195 qlcnic_83xx_mac_stats_strings[i], 1196 ETH_GSTRING_LEN); 1197 num_stats = ARRAY_SIZE(qlcnic_83xx_rx_stats_strings); 1198 for (i = 0; i < num_stats; i++, index++) 1199 memcpy(data + index * ETH_GSTRING_LEN, 1200 qlcnic_83xx_rx_stats_strings[i], 1201 ETH_GSTRING_LEN); 1202 return; 1203 } else { 1204 num_stats = ARRAY_SIZE(qlcnic_83xx_mac_stats_strings); 1205 for (i = 0; i < num_stats; i++, index++) 1206 memcpy(data + index * ETH_GSTRING_LEN, 1207 qlcnic_83xx_mac_stats_strings[i], 1208 ETH_GSTRING_LEN); 1209 } 1210 if (!(adapter->flags & QLCNIC_ESWITCH_ENABLED)) 1211 return; 1212 num_stats = ARRAY_SIZE(qlcnic_device_gstrings_stats); 1213 for (i = 0; i < num_stats; index++, i++) { 1214 memcpy(data + index * ETH_GSTRING_LEN, 1215 qlcnic_device_gstrings_stats[i], 1216 ETH_GSTRING_LEN); 1217 } 1218 } 1219 } 1220 1221 static u64 *qlcnic_fill_stats(u64 *data, void *stats, int type) 1222 { 1223 if (type == QLCNIC_MAC_STATS) { 1224 struct qlcnic_mac_statistics *mac_stats = 1225 (struct qlcnic_mac_statistics *)stats; 1226 *data++ = QLCNIC_FILL_STATS(mac_stats->mac_tx_frames); 1227 *data++ = QLCNIC_FILL_STATS(mac_stats->mac_tx_bytes); 1228 *data++ = QLCNIC_FILL_STATS(mac_stats->mac_tx_mcast_pkts); 1229 *data++ = QLCNIC_FILL_STATS(mac_stats->mac_tx_bcast_pkts); 1230 *data++ = QLCNIC_FILL_STATS(mac_stats->mac_tx_pause_cnt); 1231 *data++ = QLCNIC_FILL_STATS(mac_stats->mac_tx_ctrl_pkt); 1232 *data++ = QLCNIC_FILL_STATS(mac_stats->mac_tx_lt_64b_pkts); 1233 *data++ = QLCNIC_FILL_STATS(mac_stats->mac_tx_lt_127b_pkts); 1234 *data++ = QLCNIC_FILL_STATS(mac_stats->mac_tx_lt_255b_pkts); 1235 *data++ = QLCNIC_FILL_STATS(mac_stats->mac_tx_lt_511b_pkts); 1236 *data++ = QLCNIC_FILL_STATS(mac_stats->mac_tx_lt_1023b_pkts); 1237 *data++ = QLCNIC_FILL_STATS(mac_stats->mac_tx_lt_1518b_pkts); 1238 *data++ = QLCNIC_FILL_STATS(mac_stats->mac_tx_gt_1518b_pkts); 1239 *data++ = QLCNIC_FILL_STATS(mac_stats->mac_rx_frames); 1240 *data++ = QLCNIC_FILL_STATS(mac_stats->mac_rx_bytes); 1241 *data++ = QLCNIC_FILL_STATS(mac_stats->mac_rx_mcast_pkts); 1242 *data++ = QLCNIC_FILL_STATS(mac_stats->mac_rx_bcast_pkts); 1243 *data++ = QLCNIC_FILL_STATS(mac_stats->mac_rx_pause_cnt); 1244 *data++ = QLCNIC_FILL_STATS(mac_stats->mac_rx_ctrl_pkt); 1245 *data++ = QLCNIC_FILL_STATS(mac_stats->mac_rx_lt_64b_pkts); 1246 *data++ = QLCNIC_FILL_STATS(mac_stats->mac_rx_lt_127b_pkts); 1247 *data++ = QLCNIC_FILL_STATS(mac_stats->mac_rx_lt_255b_pkts); 1248 *data++ = QLCNIC_FILL_STATS(mac_stats->mac_rx_lt_511b_pkts); 1249 *data++ = QLCNIC_FILL_STATS(mac_stats->mac_rx_lt_1023b_pkts); 1250 *data++ = QLCNIC_FILL_STATS(mac_stats->mac_rx_lt_1518b_pkts); 1251 *data++ = QLCNIC_FILL_STATS(mac_stats->mac_rx_gt_1518b_pkts); 1252 *data++ = QLCNIC_FILL_STATS(mac_stats->mac_rx_length_error); 1253 *data++ = QLCNIC_FILL_STATS(mac_stats->mac_rx_length_small); 1254 *data++ = QLCNIC_FILL_STATS(mac_stats->mac_rx_length_large); 1255 *data++ = QLCNIC_FILL_STATS(mac_stats->mac_rx_jabber); 1256 *data++ = QLCNIC_FILL_STATS(mac_stats->mac_rx_dropped); 1257 *data++ = QLCNIC_FILL_STATS(mac_stats->mac_rx_crc_error); 1258 *data++ = QLCNIC_FILL_STATS(mac_stats->mac_align_error); 1259 } else if (type == QLCNIC_ESW_STATS) { 1260 struct __qlcnic_esw_statistics *esw_stats = 1261 (struct __qlcnic_esw_statistics *)stats; 1262 *data++ = QLCNIC_FILL_STATS(esw_stats->unicast_frames); 1263 *data++ = QLCNIC_FILL_STATS(esw_stats->multicast_frames); 1264 *data++ = QLCNIC_FILL_STATS(esw_stats->broadcast_frames); 1265 *data++ = QLCNIC_FILL_STATS(esw_stats->dropped_frames); 1266 *data++ = QLCNIC_FILL_STATS(esw_stats->errors); 1267 *data++ = QLCNIC_FILL_STATS(esw_stats->local_frames); 1268 *data++ = QLCNIC_FILL_STATS(esw_stats->numbytes); 1269 } 1270 return data; 1271 } 1272 1273 void qlcnic_update_stats(struct qlcnic_adapter *adapter) 1274 { 1275 struct qlcnic_host_tx_ring *tx_ring; 1276 int ring; 1277 1278 for (ring = 0; ring < adapter->drv_tx_rings; ring++) { 1279 tx_ring = &adapter->tx_ring[ring]; 1280 adapter->stats.xmit_on += tx_ring->tx_stats.xmit_on; 1281 adapter->stats.xmit_off += tx_ring->tx_stats.xmit_off; 1282 adapter->stats.xmitcalled += tx_ring->tx_stats.xmit_called; 1283 adapter->stats.xmitfinished += tx_ring->tx_stats.xmit_finished; 1284 adapter->stats.txbytes += tx_ring->tx_stats.tx_bytes; 1285 } 1286 } 1287 1288 static u64 *qlcnic_fill_tx_queue_stats(u64 *data, void *stats) 1289 { 1290 struct qlcnic_host_tx_ring *tx_ring; 1291 1292 tx_ring = (struct qlcnic_host_tx_ring *)stats; 1293 1294 *data++ = QLCNIC_FILL_STATS(tx_ring->tx_stats.xmit_on); 1295 *data++ = QLCNIC_FILL_STATS(tx_ring->tx_stats.xmit_off); 1296 *data++ = QLCNIC_FILL_STATS(tx_ring->tx_stats.xmit_called); 1297 *data++ = QLCNIC_FILL_STATS(tx_ring->tx_stats.xmit_finished); 1298 *data++ = QLCNIC_FILL_STATS(tx_ring->tx_stats.tx_bytes); 1299 1300 return data; 1301 } 1302 1303 static void qlcnic_get_ethtool_stats(struct net_device *dev, 1304 struct ethtool_stats *stats, u64 *data) 1305 { 1306 struct qlcnic_adapter *adapter = netdev_priv(dev); 1307 struct qlcnic_host_tx_ring *tx_ring; 1308 struct qlcnic_esw_statistics port_stats; 1309 struct qlcnic_mac_statistics mac_stats; 1310 int index, ret, length, size, tx_size, ring; 1311 char *p; 1312 1313 tx_size = adapter->drv_tx_rings * QLCNIC_TX_STATS_LEN; 1314 1315 memset(data, 0, tx_size * sizeof(u64)); 1316 for (ring = 0, index = 0; ring < adapter->drv_tx_rings; ring++) { 1317 if (test_bit(__QLCNIC_DEV_UP, &adapter->state)) { 1318 tx_ring = &adapter->tx_ring[ring]; 1319 data = qlcnic_fill_tx_queue_stats(data, tx_ring); 1320 qlcnic_update_stats(adapter); 1321 } 1322 } 1323 1324 memset(data, 0, stats->n_stats * sizeof(u64)); 1325 length = QLCNIC_STATS_LEN; 1326 for (index = 0; index < length; index++) { 1327 p = (char *)adapter + qlcnic_gstrings_stats[index].stat_offset; 1328 size = qlcnic_gstrings_stats[index].sizeof_stat; 1329 *data++ = (size == sizeof(u64)) ? (*(u64 *)p) : ((*(u32 *)p)); 1330 } 1331 1332 if (qlcnic_83xx_check(adapter)) { 1333 if (adapter->ahw->linkup) 1334 qlcnic_83xx_get_stats(adapter, data); 1335 return; 1336 } else { 1337 /* Retrieve MAC statistics from firmware */ 1338 memset(&mac_stats, 0, sizeof(struct qlcnic_mac_statistics)); 1339 qlcnic_get_mac_stats(adapter, &mac_stats); 1340 data = qlcnic_fill_stats(data, &mac_stats, QLCNIC_MAC_STATS); 1341 } 1342 1343 if (!(adapter->flags & QLCNIC_ESWITCH_ENABLED)) 1344 return; 1345 1346 memset(&port_stats, 0, sizeof(struct qlcnic_esw_statistics)); 1347 ret = qlcnic_get_port_stats(adapter, adapter->ahw->pci_func, 1348 QLCNIC_QUERY_RX_COUNTER, &port_stats.rx); 1349 if (ret) 1350 return; 1351 1352 data = qlcnic_fill_stats(data, &port_stats.rx, QLCNIC_ESW_STATS); 1353 ret = qlcnic_get_port_stats(adapter, adapter->ahw->pci_func, 1354 QLCNIC_QUERY_TX_COUNTER, &port_stats.tx); 1355 if (ret) 1356 return; 1357 1358 qlcnic_fill_stats(data, &port_stats.tx, QLCNIC_ESW_STATS); 1359 } 1360 1361 static int qlcnic_set_led(struct net_device *dev, 1362 enum ethtool_phys_id_state state) 1363 { 1364 struct qlcnic_adapter *adapter = netdev_priv(dev); 1365 int drv_sds_rings = adapter->drv_sds_rings; 1366 int err = -EIO, active = 1; 1367 1368 if (qlcnic_83xx_check(adapter)) 1369 return qlcnic_83xx_set_led(dev, state); 1370 1371 if (adapter->ahw->op_mode == QLCNIC_NON_PRIV_FUNC) { 1372 netdev_warn(dev, "LED test not supported for non " 1373 "privilege function\n"); 1374 return -EOPNOTSUPP; 1375 } 1376 1377 switch (state) { 1378 case ETHTOOL_ID_ACTIVE: 1379 if (test_and_set_bit(__QLCNIC_LED_ENABLE, &adapter->state)) 1380 return -EBUSY; 1381 1382 if (test_bit(__QLCNIC_RESETTING, &adapter->state)) 1383 break; 1384 1385 if (!test_bit(__QLCNIC_DEV_UP, &adapter->state)) { 1386 if (qlcnic_diag_alloc_res(dev, QLCNIC_LED_TEST)) 1387 break; 1388 set_bit(__QLCNIC_DIAG_RES_ALLOC, &adapter->state); 1389 } 1390 1391 if (adapter->nic_ops->config_led(adapter, 1, 0xf) == 0) { 1392 err = 0; 1393 break; 1394 } 1395 1396 dev_err(&adapter->pdev->dev, 1397 "Failed to set LED blink state.\n"); 1398 break; 1399 1400 case ETHTOOL_ID_INACTIVE: 1401 active = 0; 1402 1403 if (test_bit(__QLCNIC_RESETTING, &adapter->state)) 1404 break; 1405 1406 if (!test_bit(__QLCNIC_DEV_UP, &adapter->state)) { 1407 if (qlcnic_diag_alloc_res(dev, QLCNIC_LED_TEST)) 1408 break; 1409 set_bit(__QLCNIC_DIAG_RES_ALLOC, &adapter->state); 1410 } 1411 1412 if (adapter->nic_ops->config_led(adapter, 0, 0xf)) 1413 dev_err(&adapter->pdev->dev, 1414 "Failed to reset LED blink state.\n"); 1415 1416 break; 1417 1418 default: 1419 return -EINVAL; 1420 } 1421 1422 if (test_and_clear_bit(__QLCNIC_DIAG_RES_ALLOC, &adapter->state)) 1423 qlcnic_diag_free_res(dev, drv_sds_rings); 1424 1425 if (!active || err) 1426 clear_bit(__QLCNIC_LED_ENABLE, &adapter->state); 1427 1428 return err; 1429 } 1430 1431 static void 1432 qlcnic_get_wol(struct net_device *dev, struct ethtool_wolinfo *wol) 1433 { 1434 struct qlcnic_adapter *adapter = netdev_priv(dev); 1435 u32 wol_cfg; 1436 int err = 0; 1437 1438 if (qlcnic_83xx_check(adapter)) 1439 return; 1440 wol->supported = 0; 1441 wol->wolopts = 0; 1442 1443 wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG_NV, &err); 1444 if (err == -EIO) 1445 return; 1446 if (wol_cfg & (1UL << adapter->portnum)) 1447 wol->supported |= WAKE_MAGIC; 1448 1449 wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG, &err); 1450 if (wol_cfg & (1UL << adapter->portnum)) 1451 wol->wolopts |= WAKE_MAGIC; 1452 } 1453 1454 static int 1455 qlcnic_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol) 1456 { 1457 struct qlcnic_adapter *adapter = netdev_priv(dev); 1458 u32 wol_cfg; 1459 int err = 0; 1460 1461 if (qlcnic_83xx_check(adapter)) 1462 return -EOPNOTSUPP; 1463 if (wol->wolopts & ~WAKE_MAGIC) 1464 return -EINVAL; 1465 1466 wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG_NV, &err); 1467 if (err == -EIO) 1468 return err; 1469 if (!(wol_cfg & (1 << adapter->portnum))) 1470 return -EOPNOTSUPP; 1471 1472 wol_cfg = QLCRD32(adapter, QLCNIC_WOL_CONFIG, &err); 1473 if (err == -EIO) 1474 return err; 1475 if (wol->wolopts & WAKE_MAGIC) 1476 wol_cfg |= 1UL << adapter->portnum; 1477 else 1478 wol_cfg &= ~(1UL << adapter->portnum); 1479 1480 QLCWR32(adapter, QLCNIC_WOL_CONFIG, wol_cfg); 1481 1482 return 0; 1483 } 1484 1485 /* 1486 * Set the coalescing parameters. Currently only normal is supported. 1487 * If rx_coalesce_usecs == 0 or rx_max_coalesced_frames == 0 then set the 1488 * firmware coalescing to default. 1489 */ 1490 static int qlcnic_set_intr_coalesce(struct net_device *netdev, 1491 struct ethtool_coalesce *ethcoal) 1492 { 1493 struct qlcnic_adapter *adapter = netdev_priv(netdev); 1494 struct qlcnic_nic_intr_coalesce *coal; 1495 u32 rx_coalesce_usecs, rx_max_frames; 1496 u32 tx_coalesce_usecs, tx_max_frames; 1497 1498 if (!test_bit(__QLCNIC_DEV_UP, &adapter->state)) 1499 return -EINVAL; 1500 1501 /* 1502 * Return Error if unsupported values or 1503 * unsupported parameters are set. 1504 */ 1505 if (ethcoal->rx_coalesce_usecs > 0xffff || 1506 ethcoal->rx_max_coalesced_frames > 0xffff || 1507 ethcoal->tx_coalesce_usecs > 0xffff || 1508 ethcoal->tx_max_coalesced_frames > 0xffff || 1509 ethcoal->rx_coalesce_usecs_irq || 1510 ethcoal->rx_max_coalesced_frames_irq || 1511 ethcoal->tx_coalesce_usecs_irq || 1512 ethcoal->tx_max_coalesced_frames_irq || 1513 ethcoal->stats_block_coalesce_usecs || 1514 ethcoal->use_adaptive_rx_coalesce || 1515 ethcoal->use_adaptive_tx_coalesce || 1516 ethcoal->pkt_rate_low || 1517 ethcoal->rx_coalesce_usecs_low || 1518 ethcoal->rx_max_coalesced_frames_low || 1519 ethcoal->tx_coalesce_usecs_low || 1520 ethcoal->tx_max_coalesced_frames_low || 1521 ethcoal->pkt_rate_high || 1522 ethcoal->rx_coalesce_usecs_high || 1523 ethcoal->rx_max_coalesced_frames_high || 1524 ethcoal->tx_coalesce_usecs_high || 1525 ethcoal->tx_max_coalesced_frames_high) 1526 return -EINVAL; 1527 1528 coal = &adapter->ahw->coal; 1529 1530 if (qlcnic_83xx_check(adapter)) { 1531 if (!ethcoal->tx_coalesce_usecs || 1532 !ethcoal->tx_max_coalesced_frames || 1533 !ethcoal->rx_coalesce_usecs || 1534 !ethcoal->rx_max_coalesced_frames) { 1535 coal->flag = QLCNIC_INTR_DEFAULT; 1536 coal->type = QLCNIC_INTR_COAL_TYPE_RX; 1537 coal->rx_time_us = QLCNIC_DEF_INTR_COALESCE_RX_TIME_US; 1538 coal->rx_packets = QLCNIC_DEF_INTR_COALESCE_RX_PACKETS; 1539 coal->tx_time_us = QLCNIC_DEF_INTR_COALESCE_TX_TIME_US; 1540 coal->tx_packets = QLCNIC_DEF_INTR_COALESCE_TX_PACKETS; 1541 } else { 1542 tx_coalesce_usecs = ethcoal->tx_coalesce_usecs; 1543 tx_max_frames = ethcoal->tx_max_coalesced_frames; 1544 rx_coalesce_usecs = ethcoal->rx_coalesce_usecs; 1545 rx_max_frames = ethcoal->rx_max_coalesced_frames; 1546 coal->flag = 0; 1547 1548 if ((coal->rx_time_us == rx_coalesce_usecs) && 1549 (coal->rx_packets == rx_max_frames)) { 1550 coal->type = QLCNIC_INTR_COAL_TYPE_TX; 1551 coal->tx_time_us = tx_coalesce_usecs; 1552 coal->tx_packets = tx_max_frames; 1553 } else if ((coal->tx_time_us == tx_coalesce_usecs) && 1554 (coal->tx_packets == tx_max_frames)) { 1555 coal->type = QLCNIC_INTR_COAL_TYPE_RX; 1556 coal->rx_time_us = rx_coalesce_usecs; 1557 coal->rx_packets = rx_max_frames; 1558 } else { 1559 coal->type = QLCNIC_INTR_COAL_TYPE_RX; 1560 coal->rx_time_us = rx_coalesce_usecs; 1561 coal->rx_packets = rx_max_frames; 1562 coal->tx_time_us = tx_coalesce_usecs; 1563 coal->tx_packets = tx_max_frames; 1564 } 1565 } 1566 } else { 1567 if (!ethcoal->rx_coalesce_usecs || 1568 !ethcoal->rx_max_coalesced_frames) { 1569 coal->flag = QLCNIC_INTR_DEFAULT; 1570 coal->rx_time_us = QLCNIC_DEF_INTR_COALESCE_RX_TIME_US; 1571 coal->rx_packets = QLCNIC_DEF_INTR_COALESCE_RX_PACKETS; 1572 } else { 1573 coal->flag = 0; 1574 coal->rx_time_us = ethcoal->rx_coalesce_usecs; 1575 coal->rx_packets = ethcoal->rx_max_coalesced_frames; 1576 } 1577 } 1578 1579 qlcnic_config_intr_coalesce(adapter); 1580 1581 return 0; 1582 } 1583 1584 static int qlcnic_get_intr_coalesce(struct net_device *netdev, 1585 struct ethtool_coalesce *ethcoal) 1586 { 1587 struct qlcnic_adapter *adapter = netdev_priv(netdev); 1588 1589 if (adapter->is_up != QLCNIC_ADAPTER_UP_MAGIC) 1590 return -EINVAL; 1591 1592 ethcoal->rx_coalesce_usecs = adapter->ahw->coal.rx_time_us; 1593 ethcoal->rx_max_coalesced_frames = adapter->ahw->coal.rx_packets; 1594 ethcoal->tx_coalesce_usecs = adapter->ahw->coal.tx_time_us; 1595 ethcoal->tx_max_coalesced_frames = adapter->ahw->coal.tx_packets; 1596 1597 return 0; 1598 } 1599 1600 static u32 qlcnic_get_msglevel(struct net_device *netdev) 1601 { 1602 struct qlcnic_adapter *adapter = netdev_priv(netdev); 1603 1604 return adapter->ahw->msg_enable; 1605 } 1606 1607 static void qlcnic_set_msglevel(struct net_device *netdev, u32 msglvl) 1608 { 1609 struct qlcnic_adapter *adapter = netdev_priv(netdev); 1610 1611 adapter->ahw->msg_enable = msglvl; 1612 } 1613 1614 int qlcnic_enable_fw_dump_state(struct qlcnic_adapter *adapter) 1615 { 1616 struct qlcnic_fw_dump *fw_dump = &adapter->ahw->fw_dump; 1617 u32 val; 1618 1619 if (qlcnic_84xx_check(adapter)) { 1620 if (qlcnic_83xx_lock_driver(adapter)) 1621 return -EBUSY; 1622 1623 val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL); 1624 val &= ~QLC_83XX_IDC_DISABLE_FW_DUMP; 1625 QLCWRX(adapter->ahw, QLC_83XX_IDC_CTRL, val); 1626 1627 qlcnic_83xx_unlock_driver(adapter); 1628 } else { 1629 fw_dump->enable = true; 1630 } 1631 1632 dev_info(&adapter->pdev->dev, "FW dump enabled\n"); 1633 1634 return 0; 1635 } 1636 1637 static int qlcnic_disable_fw_dump_state(struct qlcnic_adapter *adapter) 1638 { 1639 struct qlcnic_fw_dump *fw_dump = &adapter->ahw->fw_dump; 1640 u32 val; 1641 1642 if (qlcnic_84xx_check(adapter)) { 1643 if (qlcnic_83xx_lock_driver(adapter)) 1644 return -EBUSY; 1645 1646 val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL); 1647 val |= QLC_83XX_IDC_DISABLE_FW_DUMP; 1648 QLCWRX(adapter->ahw, QLC_83XX_IDC_CTRL, val); 1649 1650 qlcnic_83xx_unlock_driver(adapter); 1651 } else { 1652 fw_dump->enable = false; 1653 } 1654 1655 dev_info(&adapter->pdev->dev, "FW dump disabled\n"); 1656 1657 return 0; 1658 } 1659 1660 bool qlcnic_check_fw_dump_state(struct qlcnic_adapter *adapter) 1661 { 1662 struct qlcnic_fw_dump *fw_dump = &adapter->ahw->fw_dump; 1663 bool state; 1664 u32 val; 1665 1666 if (qlcnic_84xx_check(adapter)) { 1667 val = QLCRDX(adapter->ahw, QLC_83XX_IDC_CTRL); 1668 state = (val & QLC_83XX_IDC_DISABLE_FW_DUMP) ? false : true; 1669 } else { 1670 state = fw_dump->enable; 1671 } 1672 1673 return state; 1674 } 1675 1676 static int 1677 qlcnic_get_dump_flag(struct net_device *netdev, struct ethtool_dump *dump) 1678 { 1679 struct qlcnic_adapter *adapter = netdev_priv(netdev); 1680 struct qlcnic_fw_dump *fw_dump = &adapter->ahw->fw_dump; 1681 1682 if (!fw_dump->tmpl_hdr) { 1683 netdev_err(adapter->netdev, "FW Dump not supported\n"); 1684 return -ENOTSUPP; 1685 } 1686 1687 if (fw_dump->clr) 1688 dump->len = fw_dump->tmpl_hdr->size + fw_dump->size; 1689 else 1690 dump->len = 0; 1691 1692 if (!qlcnic_check_fw_dump_state(adapter)) 1693 dump->flag = ETH_FW_DUMP_DISABLE; 1694 else 1695 dump->flag = fw_dump->tmpl_hdr->drv_cap_mask; 1696 1697 dump->version = adapter->fw_version; 1698 return 0; 1699 } 1700 1701 static int 1702 qlcnic_get_dump_data(struct net_device *netdev, struct ethtool_dump *dump, 1703 void *buffer) 1704 { 1705 int i, copy_sz; 1706 u32 *hdr_ptr; 1707 __le32 *data; 1708 struct qlcnic_adapter *adapter = netdev_priv(netdev); 1709 struct qlcnic_fw_dump *fw_dump = &adapter->ahw->fw_dump; 1710 1711 if (!fw_dump->tmpl_hdr) { 1712 netdev_err(netdev, "FW Dump not supported\n"); 1713 return -ENOTSUPP; 1714 } 1715 1716 if (!fw_dump->clr) { 1717 netdev_info(netdev, "Dump not available\n"); 1718 return -EINVAL; 1719 } 1720 /* Copy template header first */ 1721 copy_sz = fw_dump->tmpl_hdr->size; 1722 hdr_ptr = (u32 *) fw_dump->tmpl_hdr; 1723 data = buffer; 1724 for (i = 0; i < copy_sz/sizeof(u32); i++) 1725 *data++ = cpu_to_le32(*hdr_ptr++); 1726 1727 /* Copy captured dump data */ 1728 memcpy(buffer + copy_sz, fw_dump->data, fw_dump->size); 1729 dump->len = copy_sz + fw_dump->size; 1730 dump->flag = fw_dump->tmpl_hdr->drv_cap_mask; 1731 1732 /* Free dump area once data has been captured */ 1733 vfree(fw_dump->data); 1734 fw_dump->data = NULL; 1735 fw_dump->clr = 0; 1736 netdev_info(netdev, "extracted the FW dump Successfully\n"); 1737 return 0; 1738 } 1739 1740 static int qlcnic_set_dump_mask(struct qlcnic_adapter *adapter, u32 mask) 1741 { 1742 struct qlcnic_fw_dump *fw_dump = &adapter->ahw->fw_dump; 1743 struct net_device *netdev = adapter->netdev; 1744 1745 if (!qlcnic_check_fw_dump_state(adapter)) { 1746 netdev_info(netdev, 1747 "Can not change driver mask to 0x%x. FW dump not enabled\n", 1748 mask); 1749 return -EOPNOTSUPP; 1750 } 1751 1752 fw_dump->tmpl_hdr->drv_cap_mask = mask; 1753 netdev_info(netdev, "Driver mask changed to: 0x%x\n", mask); 1754 return 0; 1755 } 1756 1757 static int 1758 qlcnic_set_dump(struct net_device *netdev, struct ethtool_dump *val) 1759 { 1760 struct qlcnic_adapter *adapter = netdev_priv(netdev); 1761 struct qlcnic_fw_dump *fw_dump = &adapter->ahw->fw_dump; 1762 bool valid_mask = false; 1763 int i, ret = 0; 1764 1765 switch (val->flag) { 1766 case QLCNIC_FORCE_FW_DUMP_KEY: 1767 if (!fw_dump->tmpl_hdr) { 1768 netdev_err(netdev, "FW dump not supported\n"); 1769 ret = -EOPNOTSUPP; 1770 break; 1771 } 1772 1773 if (!qlcnic_check_fw_dump_state(adapter)) { 1774 netdev_info(netdev, "FW dump not enabled\n"); 1775 ret = -EOPNOTSUPP; 1776 break; 1777 } 1778 1779 if (fw_dump->clr) { 1780 netdev_info(netdev, 1781 "Previous dump not cleared, not forcing dump\n"); 1782 break; 1783 } 1784 1785 netdev_info(netdev, "Forcing a FW dump\n"); 1786 qlcnic_dev_request_reset(adapter, val->flag); 1787 break; 1788 case QLCNIC_DISABLE_FW_DUMP: 1789 if (!fw_dump->tmpl_hdr) { 1790 netdev_err(netdev, "FW dump not supported\n"); 1791 ret = -EOPNOTSUPP; 1792 break; 1793 } 1794 1795 ret = qlcnic_disable_fw_dump_state(adapter); 1796 break; 1797 1798 case QLCNIC_ENABLE_FW_DUMP: 1799 if (!fw_dump->tmpl_hdr) { 1800 netdev_err(netdev, "FW dump not supported\n"); 1801 ret = -EOPNOTSUPP; 1802 break; 1803 } 1804 1805 ret = qlcnic_enable_fw_dump_state(adapter); 1806 break; 1807 1808 case QLCNIC_FORCE_FW_RESET: 1809 netdev_info(netdev, "Forcing a FW reset\n"); 1810 qlcnic_dev_request_reset(adapter, val->flag); 1811 adapter->flags &= ~QLCNIC_FW_RESET_OWNER; 1812 break; 1813 1814 case QLCNIC_SET_QUIESCENT: 1815 case QLCNIC_RESET_QUIESCENT: 1816 if (test_bit(__QLCNIC_MAINTENANCE_MODE, &adapter->state)) 1817 netdev_info(netdev, "Device is in non-operational state\n"); 1818 break; 1819 1820 default: 1821 if (!fw_dump->tmpl_hdr) { 1822 netdev_err(netdev, "FW dump not supported\n"); 1823 ret = -EOPNOTSUPP; 1824 break; 1825 } 1826 1827 for (i = 0; i < ARRAY_SIZE(qlcnic_fw_dump_level); i++) { 1828 if (val->flag == qlcnic_fw_dump_level[i]) { 1829 valid_mask = true; 1830 break; 1831 } 1832 } 1833 1834 if (valid_mask) { 1835 ret = qlcnic_set_dump_mask(adapter, val->flag); 1836 } else { 1837 netdev_info(netdev, "Invalid dump level: 0x%x\n", 1838 val->flag); 1839 ret = -EINVAL; 1840 } 1841 } 1842 return ret; 1843 } 1844 1845 const struct ethtool_ops qlcnic_ethtool_ops = { 1846 .get_settings = qlcnic_get_settings, 1847 .set_settings = qlcnic_set_settings, 1848 .get_drvinfo = qlcnic_get_drvinfo, 1849 .get_regs_len = qlcnic_get_regs_len, 1850 .get_regs = qlcnic_get_regs, 1851 .get_link = ethtool_op_get_link, 1852 .get_eeprom_len = qlcnic_get_eeprom_len, 1853 .get_eeprom = qlcnic_get_eeprom, 1854 .get_ringparam = qlcnic_get_ringparam, 1855 .set_ringparam = qlcnic_set_ringparam, 1856 .get_channels = qlcnic_get_channels, 1857 .set_channels = qlcnic_set_channels, 1858 .get_pauseparam = qlcnic_get_pauseparam, 1859 .set_pauseparam = qlcnic_set_pauseparam, 1860 .get_wol = qlcnic_get_wol, 1861 .set_wol = qlcnic_set_wol, 1862 .self_test = qlcnic_diag_test, 1863 .get_strings = qlcnic_get_strings, 1864 .get_ethtool_stats = qlcnic_get_ethtool_stats, 1865 .get_sset_count = qlcnic_get_sset_count, 1866 .get_coalesce = qlcnic_get_intr_coalesce, 1867 .set_coalesce = qlcnic_set_intr_coalesce, 1868 .set_phys_id = qlcnic_set_led, 1869 .set_msglevel = qlcnic_set_msglevel, 1870 .get_msglevel = qlcnic_get_msglevel, 1871 .get_dump_flag = qlcnic_get_dump_flag, 1872 .get_dump_data = qlcnic_get_dump_data, 1873 .set_dump = qlcnic_set_dump, 1874 }; 1875 1876 const struct ethtool_ops qlcnic_sriov_vf_ethtool_ops = { 1877 .get_settings = qlcnic_get_settings, 1878 .get_drvinfo = qlcnic_get_drvinfo, 1879 .get_regs_len = qlcnic_get_regs_len, 1880 .get_regs = qlcnic_get_regs, 1881 .get_link = ethtool_op_get_link, 1882 .get_eeprom_len = qlcnic_get_eeprom_len, 1883 .get_eeprom = qlcnic_get_eeprom, 1884 .get_ringparam = qlcnic_get_ringparam, 1885 .set_ringparam = qlcnic_set_ringparam, 1886 .get_channels = qlcnic_get_channels, 1887 .get_pauseparam = qlcnic_get_pauseparam, 1888 .get_wol = qlcnic_get_wol, 1889 .get_strings = qlcnic_get_strings, 1890 .get_ethtool_stats = qlcnic_get_ethtool_stats, 1891 .get_sset_count = qlcnic_get_sset_count, 1892 .get_coalesce = qlcnic_get_intr_coalesce, 1893 .set_coalesce = qlcnic_set_intr_coalesce, 1894 .set_msglevel = qlcnic_set_msglevel, 1895 .get_msglevel = qlcnic_get_msglevel, 1896 }; 1897 1898 const struct ethtool_ops qlcnic_ethtool_failed_ops = { 1899 .get_settings = qlcnic_get_settings, 1900 .get_drvinfo = qlcnic_get_drvinfo, 1901 .set_msglevel = qlcnic_set_msglevel, 1902 .get_msglevel = qlcnic_get_msglevel, 1903 .set_dump = qlcnic_set_dump, 1904 }; 1905