diff options
Diffstat (limited to 'drivers/net/ethernet/emulex/benet/be_main.c')
-rw-r--r-- | drivers/net/ethernet/emulex/benet/be_main.c | 54 |
1 files changed, 39 insertions, 15 deletions
diff --git a/drivers/net/ethernet/emulex/benet/be_main.c b/drivers/net/ethernet/emulex/benet/be_main.c index 4babc8a4a543..6c52a60dcdb7 100644 --- a/drivers/net/ethernet/emulex/benet/be_main.c +++ b/drivers/net/ethernet/emulex/benet/be_main.c | |||
@@ -410,6 +410,7 @@ static void populate_be_v1_stats(struct be_adapter *adapter) | |||
410 | drvs->rxpp_fifo_overflow_drop = port_stats->rxpp_fifo_overflow_drop; | 410 | drvs->rxpp_fifo_overflow_drop = port_stats->rxpp_fifo_overflow_drop; |
411 | drvs->tx_pauseframes = port_stats->tx_pauseframes; | 411 | drvs->tx_pauseframes = port_stats->tx_pauseframes; |
412 | drvs->tx_controlframes = port_stats->tx_controlframes; | 412 | drvs->tx_controlframes = port_stats->tx_controlframes; |
413 | drvs->tx_priority_pauseframes = port_stats->tx_priority_pauseframes; | ||
413 | drvs->jabber_events = port_stats->jabber_events; | 414 | drvs->jabber_events = port_stats->jabber_events; |
414 | drvs->rx_drops_no_pbuf = rxf_stats->rx_drops_no_pbuf; | 415 | drvs->rx_drops_no_pbuf = rxf_stats->rx_drops_no_pbuf; |
415 | drvs->rx_drops_no_erx_descr = rxf_stats->rx_drops_no_erx_descr; | 416 | drvs->rx_drops_no_erx_descr = rxf_stats->rx_drops_no_erx_descr; |
@@ -471,11 +472,26 @@ static void accumulate_16bit_val(u32 *acc, u16 val) | |||
471 | ACCESS_ONCE(*acc) = newacc; | 472 | ACCESS_ONCE(*acc) = newacc; |
472 | } | 473 | } |
473 | 474 | ||
475 | void populate_erx_stats(struct be_adapter *adapter, | ||
476 | struct be_rx_obj *rxo, | ||
477 | u32 erx_stat) | ||
478 | { | ||
479 | if (!BEx_chip(adapter)) | ||
480 | rx_stats(rxo)->rx_drops_no_frags = erx_stat; | ||
481 | else | ||
482 | /* below erx HW counter can actually wrap around after | ||
483 | * 65535. Driver accumulates a 32-bit value | ||
484 | */ | ||
485 | accumulate_16bit_val(&rx_stats(rxo)->rx_drops_no_frags, | ||
486 | (u16)erx_stat); | ||
487 | } | ||
488 | |||
474 | void be_parse_stats(struct be_adapter *adapter) | 489 | void be_parse_stats(struct be_adapter *adapter) |
475 | { | 490 | { |
476 | struct be_erx_stats_v1 *erx = be_erx_stats_from_cmd(adapter); | 491 | struct be_erx_stats_v1 *erx = be_erx_stats_from_cmd(adapter); |
477 | struct be_rx_obj *rxo; | 492 | struct be_rx_obj *rxo; |
478 | int i; | 493 | int i; |
494 | u32 erx_stat; | ||
479 | 495 | ||
480 | if (lancer_chip(adapter)) { | 496 | if (lancer_chip(adapter)) { |
481 | populate_lancer_stats(adapter); | 497 | populate_lancer_stats(adapter); |
@@ -488,12 +504,8 @@ void be_parse_stats(struct be_adapter *adapter) | |||
488 | 504 | ||
489 | /* as erx_v1 is longer than v0, ok to use v1 for v0 access */ | 505 | /* as erx_v1 is longer than v0, ok to use v1 for v0 access */ |
490 | for_all_rx_queues(adapter, rxo, i) { | 506 | for_all_rx_queues(adapter, rxo, i) { |
491 | /* below erx HW counter can actually wrap around after | 507 | erx_stat = erx->rx_drops_no_fragments[rxo->q.id]; |
492 | * 65535. Driver accumulates a 32-bit value | 508 | populate_erx_stats(adapter, rxo, erx_stat); |
493 | */ | ||
494 | accumulate_16bit_val(&rx_stats(rxo)->rx_drops_no_frags, | ||
495 | (u16)erx->rx_drops_no_fragments \ | ||
496 | [rxo->q.id]); | ||
497 | } | 509 | } |
498 | } | 510 | } |
499 | } | 511 | } |
@@ -2378,7 +2390,7 @@ static uint be_num_rss_want(struct be_adapter *adapter) | |||
2378 | return num; | 2390 | return num; |
2379 | } | 2391 | } |
2380 | 2392 | ||
2381 | static void be_msix_enable(struct be_adapter *adapter) | 2393 | static int be_msix_enable(struct be_adapter *adapter) |
2382 | { | 2394 | { |
2383 | #define BE_MIN_MSIX_VECTORS 1 | 2395 | #define BE_MIN_MSIX_VECTORS 1 |
2384 | int i, status, num_vec, num_roce_vec = 0; | 2396 | int i, status, num_vec, num_roce_vec = 0; |
@@ -2403,13 +2415,17 @@ static void be_msix_enable(struct be_adapter *adapter) | |||
2403 | goto done; | 2415 | goto done; |
2404 | } else if (status >= BE_MIN_MSIX_VECTORS) { | 2416 | } else if (status >= BE_MIN_MSIX_VECTORS) { |
2405 | num_vec = status; | 2417 | num_vec = status; |
2406 | if (pci_enable_msix(adapter->pdev, adapter->msix_entries, | 2418 | status = pci_enable_msix(adapter->pdev, adapter->msix_entries, |
2407 | num_vec) == 0) | 2419 | num_vec); |
2420 | if (!status) | ||
2408 | goto done; | 2421 | goto done; |
2409 | } | 2422 | } |
2410 | 2423 | ||
2411 | dev_warn(dev, "MSIx enable failed\n"); | 2424 | dev_warn(dev, "MSIx enable failed\n"); |
2412 | return; | 2425 | /* INTx is not supported in VFs, so fail probe if enable_msix fails */ |
2426 | if (!be_physfn(adapter)) | ||
2427 | return status; | ||
2428 | return 0; | ||
2413 | done: | 2429 | done: |
2414 | if (be_roce_supported(adapter)) { | 2430 | if (be_roce_supported(adapter)) { |
2415 | if (num_vec > num_roce_vec) { | 2431 | if (num_vec > num_roce_vec) { |
@@ -2423,7 +2439,7 @@ done: | |||
2423 | } else | 2439 | } else |
2424 | adapter->num_msix_vec = num_vec; | 2440 | adapter->num_msix_vec = num_vec; |
2425 | dev_info(dev, "enabled %d MSI-x vector(s)\n", adapter->num_msix_vec); | 2441 | dev_info(dev, "enabled %d MSI-x vector(s)\n", adapter->num_msix_vec); |
2426 | return; | 2442 | return 0; |
2427 | } | 2443 | } |
2428 | 2444 | ||
2429 | static inline int be_msix_vec_get(struct be_adapter *adapter, | 2445 | static inline int be_msix_vec_get(struct be_adapter *adapter, |
@@ -2536,8 +2552,11 @@ static int be_close(struct net_device *netdev) | |||
2536 | 2552 | ||
2537 | be_roce_dev_close(adapter); | 2553 | be_roce_dev_close(adapter); |
2538 | 2554 | ||
2539 | for_all_evt_queues(adapter, eqo, i) | 2555 | if (adapter->flags & BE_FLAGS_NAPI_ENABLED) { |
2540 | napi_disable(&eqo->napi); | 2556 | for_all_evt_queues(adapter, eqo, i) |
2557 | napi_disable(&eqo->napi); | ||
2558 | adapter->flags &= ~BE_FLAGS_NAPI_ENABLED; | ||
2559 | } | ||
2541 | 2560 | ||
2542 | be_async_mcc_disable(adapter); | 2561 | be_async_mcc_disable(adapter); |
2543 | 2562 | ||
@@ -2631,7 +2650,9 @@ static int be_open(struct net_device *netdev) | |||
2631 | if (status) | 2650 | if (status) |
2632 | goto err; | 2651 | goto err; |
2633 | 2652 | ||
2634 | be_irq_register(adapter); | 2653 | status = be_irq_register(adapter); |
2654 | if (status) | ||
2655 | goto err; | ||
2635 | 2656 | ||
2636 | for_all_rx_queues(adapter, rxo, i) | 2657 | for_all_rx_queues(adapter, rxo, i) |
2637 | be_cq_notify(adapter, rxo->cq.id, true, 0); | 2658 | be_cq_notify(adapter, rxo->cq.id, true, 0); |
@@ -2645,6 +2666,7 @@ static int be_open(struct net_device *netdev) | |||
2645 | napi_enable(&eqo->napi); | 2666 | napi_enable(&eqo->napi); |
2646 | be_eq_notify(adapter, eqo->q.id, true, false, 0); | 2667 | be_eq_notify(adapter, eqo->q.id, true, false, 0); |
2647 | } | 2668 | } |
2669 | adapter->flags |= BE_FLAGS_NAPI_ENABLED; | ||
2648 | 2670 | ||
2649 | status = be_cmd_link_status_query(adapter, NULL, &link_status, 0); | 2671 | status = be_cmd_link_status_query(adapter, NULL, &link_status, 0); |
2650 | if (!status) | 2672 | if (!status) |
@@ -3100,7 +3122,9 @@ static int be_setup(struct be_adapter *adapter) | |||
3100 | if (status) | 3122 | if (status) |
3101 | goto err; | 3123 | goto err; |
3102 | 3124 | ||
3103 | be_msix_enable(adapter); | 3125 | status = be_msix_enable(adapter); |
3126 | if (status) | ||
3127 | goto err; | ||
3104 | 3128 | ||
3105 | status = be_evt_queues_create(adapter); | 3129 | status = be_evt_queues_create(adapter); |
3106 | if (status) | 3130 | if (status) |