diff options
Diffstat (limited to 'drivers/net/ixgbe/ixgbe_main.c')
-rw-r--r-- | drivers/net/ixgbe/ixgbe_main.c | 200 |
1 files changed, 185 insertions, 15 deletions
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c index 40108523377f..91dde9cdab66 100644 --- a/drivers/net/ixgbe/ixgbe_main.c +++ b/drivers/net/ixgbe/ixgbe_main.c | |||
@@ -404,7 +404,7 @@ static void ixgbe_receive_skb(struct ixgbe_adapter *adapter, | |||
404 | 404 | ||
405 | if (adapter->netdev->features & NETIF_F_LRO && | 405 | if (adapter->netdev->features & NETIF_F_LRO && |
406 | skb->ip_summed == CHECKSUM_UNNECESSARY) { | 406 | skb->ip_summed == CHECKSUM_UNNECESSARY) { |
407 | if (adapter->vlgrp && is_vlan) | 407 | if (adapter->vlgrp && is_vlan && (tag != 0)) |
408 | lro_vlan_hwaccel_receive_skb(&ring->lro_mgr, skb, | 408 | lro_vlan_hwaccel_receive_skb(&ring->lro_mgr, skb, |
409 | adapter->vlgrp, tag, | 409 | adapter->vlgrp, tag, |
410 | rx_desc); | 410 | rx_desc); |
@@ -413,12 +413,12 @@ static void ixgbe_receive_skb(struct ixgbe_adapter *adapter, | |||
413 | ring->lro_used = true; | 413 | ring->lro_used = true; |
414 | } else { | 414 | } else { |
415 | if (!(adapter->flags & IXGBE_FLAG_IN_NETPOLL)) { | 415 | if (!(adapter->flags & IXGBE_FLAG_IN_NETPOLL)) { |
416 | if (adapter->vlgrp && is_vlan) | 416 | if (adapter->vlgrp && is_vlan && (tag != 0)) |
417 | vlan_hwaccel_receive_skb(skb, adapter->vlgrp, tag); | 417 | vlan_hwaccel_receive_skb(skb, adapter->vlgrp, tag); |
418 | else | 418 | else |
419 | netif_receive_skb(skb); | 419 | netif_receive_skb(skb); |
420 | } else { | 420 | } else { |
421 | if (adapter->vlgrp && is_vlan) | 421 | if (adapter->vlgrp && is_vlan && (tag != 0)) |
422 | vlan_hwaccel_rx(skb, adapter->vlgrp, tag); | 422 | vlan_hwaccel_rx(skb, adapter->vlgrp, tag); |
423 | else | 423 | else |
424 | netif_rx(skb); | 424 | netif_rx(skb); |
@@ -1670,10 +1670,12 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter) | |||
1670 | * effects of setting this bit are only that SRRCTL must be | 1670 | * effects of setting this bit are only that SRRCTL must be |
1671 | * fully programmed [0..15] | 1671 | * fully programmed [0..15] |
1672 | */ | 1672 | */ |
1673 | rdrxctl = IXGBE_READ_REG(hw, IXGBE_RDRXCTL); | 1673 | if (adapter->flags & |
1674 | rdrxctl |= IXGBE_RDRXCTL_MVMEN; | 1674 | (IXGBE_FLAG_RSS_ENABLED | IXGBE_FLAG_VMDQ_ENABLED)) { |
1675 | IXGBE_WRITE_REG(hw, IXGBE_RDRXCTL, rdrxctl); | 1675 | rdrxctl = IXGBE_READ_REG(hw, IXGBE_RDRXCTL); |
1676 | 1676 | rdrxctl |= IXGBE_RDRXCTL_MVMEN; | |
1677 | IXGBE_WRITE_REG(hw, IXGBE_RDRXCTL, rdrxctl); | ||
1678 | } | ||
1677 | 1679 | ||
1678 | if (adapter->flags & IXGBE_FLAG_RSS_ENABLED) { | 1680 | if (adapter->flags & IXGBE_FLAG_RSS_ENABLED) { |
1679 | /* Fill out redirection table */ | 1681 | /* Fill out redirection table */ |
@@ -1732,6 +1734,16 @@ static void ixgbe_vlan_rx_register(struct net_device *netdev, | |||
1732 | ixgbe_irq_disable(adapter); | 1734 | ixgbe_irq_disable(adapter); |
1733 | adapter->vlgrp = grp; | 1735 | adapter->vlgrp = grp; |
1734 | 1736 | ||
1737 | /* | ||
1738 | * For a DCB driver, always enable VLAN tag stripping so we can | ||
1739 | * still receive traffic from a DCB-enabled host even if we're | ||
1740 | * not in DCB mode. | ||
1741 | */ | ||
1742 | ctrl = IXGBE_READ_REG(&adapter->hw, IXGBE_VLNCTRL); | ||
1743 | ctrl |= IXGBE_VLNCTRL_VME; | ||
1744 | ctrl &= ~IXGBE_VLNCTRL_CFIEN; | ||
1745 | IXGBE_WRITE_REG(&adapter->hw, IXGBE_VLNCTRL, ctrl); | ||
1746 | |||
1735 | if (grp) { | 1747 | if (grp) { |
1736 | /* enable VLAN tag insert/strip */ | 1748 | /* enable VLAN tag insert/strip */ |
1737 | ctrl = IXGBE_READ_REG(&adapter->hw, IXGBE_VLNCTRL); | 1749 | ctrl = IXGBE_READ_REG(&adapter->hw, IXGBE_VLNCTRL); |
@@ -1896,6 +1908,44 @@ static void ixgbe_napi_disable_all(struct ixgbe_adapter *adapter) | |||
1896 | } | 1908 | } |
1897 | } | 1909 | } |
1898 | 1910 | ||
1911 | #ifdef CONFIG_IXGBE_DCBNL | ||
1912 | /* | ||
1913 | * ixgbe_configure_dcb - Configure DCB hardware | ||
1914 | * @adapter: ixgbe adapter struct | ||
1915 | * | ||
1916 | * This is called by the driver on open to configure the DCB hardware. | ||
1917 | * This is also called by the gennetlink interface when reconfiguring | ||
1918 | * the DCB state. | ||
1919 | */ | ||
1920 | static void ixgbe_configure_dcb(struct ixgbe_adapter *adapter) | ||
1921 | { | ||
1922 | struct ixgbe_hw *hw = &adapter->hw; | ||
1923 | u32 txdctl, vlnctrl; | ||
1924 | int i, j; | ||
1925 | |||
1926 | ixgbe_dcb_check_config(&adapter->dcb_cfg); | ||
1927 | ixgbe_dcb_calculate_tc_credits(&adapter->dcb_cfg, DCB_TX_CONFIG); | ||
1928 | ixgbe_dcb_calculate_tc_credits(&adapter->dcb_cfg, DCB_RX_CONFIG); | ||
1929 | |||
1930 | /* reconfigure the hardware */ | ||
1931 | ixgbe_dcb_hw_config(&adapter->hw, &adapter->dcb_cfg); | ||
1932 | |||
1933 | for (i = 0; i < adapter->num_tx_queues; i++) { | ||
1934 | j = adapter->tx_ring[i].reg_idx; | ||
1935 | txdctl = IXGBE_READ_REG(hw, IXGBE_TXDCTL(j)); | ||
1936 | /* PThresh workaround for Tx hang with DFP enabled. */ | ||
1937 | txdctl |= 32; | ||
1938 | IXGBE_WRITE_REG(hw, IXGBE_TXDCTL(j), txdctl); | ||
1939 | } | ||
1940 | /* Enable VLAN tag insert/strip */ | ||
1941 | vlnctrl = IXGBE_READ_REG(hw, IXGBE_VLNCTRL); | ||
1942 | vlnctrl |= IXGBE_VLNCTRL_VME | IXGBE_VLNCTRL_VFE; | ||
1943 | vlnctrl &= ~IXGBE_VLNCTRL_CFIEN; | ||
1944 | IXGBE_WRITE_REG(hw, IXGBE_VLNCTRL, vlnctrl); | ||
1945 | hw->mac.ops.set_vfta(&adapter->hw, 0, 0, true); | ||
1946 | } | ||
1947 | |||
1948 | #endif | ||
1899 | static void ixgbe_configure(struct ixgbe_adapter *adapter) | 1949 | static void ixgbe_configure(struct ixgbe_adapter *adapter) |
1900 | { | 1950 | { |
1901 | struct net_device *netdev = adapter->netdev; | 1951 | struct net_device *netdev = adapter->netdev; |
@@ -1904,6 +1954,16 @@ static void ixgbe_configure(struct ixgbe_adapter *adapter) | |||
1904 | ixgbe_set_rx_mode(netdev); | 1954 | ixgbe_set_rx_mode(netdev); |
1905 | 1955 | ||
1906 | ixgbe_restore_vlan(adapter); | 1956 | ixgbe_restore_vlan(adapter); |
1957 | #ifdef CONFIG_IXGBE_DCBNL | ||
1958 | if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) { | ||
1959 | netif_set_gso_max_size(netdev, 32768); | ||
1960 | ixgbe_configure_dcb(adapter); | ||
1961 | } else { | ||
1962 | netif_set_gso_max_size(netdev, 65536); | ||
1963 | } | ||
1964 | #else | ||
1965 | netif_set_gso_max_size(netdev, 65536); | ||
1966 | #endif | ||
1907 | 1967 | ||
1908 | ixgbe_configure_tx(adapter); | 1968 | ixgbe_configure_tx(adapter); |
1909 | ixgbe_configure_rx(adapter); | 1969 | ixgbe_configure_rx(adapter); |
@@ -1995,9 +2055,6 @@ static int ixgbe_up_complete(struct ixgbe_adapter *adapter) | |||
1995 | 2055 | ||
1996 | ixgbe_irq_enable(adapter); | 2056 | ixgbe_irq_enable(adapter); |
1997 | 2057 | ||
1998 | /* enable transmits */ | ||
1999 | netif_tx_start_all_queues(netdev); | ||
2000 | |||
2001 | /* bring the link up in the watchdog, this could race with our first | 2058 | /* bring the link up in the watchdog, this could race with our first |
2002 | * link up interrupt but shouldn't be a problem */ | 2059 | * link up interrupt but shouldn't be a problem */ |
2003 | adapter->flags |= IXGBE_FLAG_NEED_LINK_UPDATE; | 2060 | adapter->flags |= IXGBE_FLAG_NEED_LINK_UPDATE; |
@@ -2260,6 +2317,11 @@ static void ixgbe_reset_task(struct work_struct *work) | |||
2260 | struct ixgbe_adapter *adapter; | 2317 | struct ixgbe_adapter *adapter; |
2261 | adapter = container_of(work, struct ixgbe_adapter, reset_task); | 2318 | adapter = container_of(work, struct ixgbe_adapter, reset_task); |
2262 | 2319 | ||
2320 | /* If we're already down or resetting, just bail */ | ||
2321 | if (test_bit(__IXGBE_DOWN, &adapter->state) || | ||
2322 | test_bit(__IXGBE_RESETTING, &adapter->state)) | ||
2323 | return; | ||
2324 | |||
2263 | adapter->tx_timeout_count++; | 2325 | adapter->tx_timeout_count++; |
2264 | 2326 | ||
2265 | ixgbe_reinit_locked(adapter); | 2327 | ixgbe_reinit_locked(adapter); |
@@ -2269,15 +2331,31 @@ static void ixgbe_set_num_queues(struct ixgbe_adapter *adapter) | |||
2269 | { | 2331 | { |
2270 | int nrq = 1, ntq = 1; | 2332 | int nrq = 1, ntq = 1; |
2271 | int feature_mask = 0, rss_i, rss_m; | 2333 | int feature_mask = 0, rss_i, rss_m; |
2334 | int dcb_i, dcb_m; | ||
2272 | 2335 | ||
2273 | /* Number of supported queues */ | 2336 | /* Number of supported queues */ |
2274 | switch (adapter->hw.mac.type) { | 2337 | switch (adapter->hw.mac.type) { |
2275 | case ixgbe_mac_82598EB: | 2338 | case ixgbe_mac_82598EB: |
2339 | dcb_i = adapter->ring_feature[RING_F_DCB].indices; | ||
2340 | dcb_m = 0; | ||
2276 | rss_i = adapter->ring_feature[RING_F_RSS].indices; | 2341 | rss_i = adapter->ring_feature[RING_F_RSS].indices; |
2277 | rss_m = 0; | 2342 | rss_m = 0; |
2278 | feature_mask |= IXGBE_FLAG_RSS_ENABLED; | 2343 | feature_mask |= IXGBE_FLAG_RSS_ENABLED; |
2344 | feature_mask |= IXGBE_FLAG_DCB_ENABLED; | ||
2279 | 2345 | ||
2280 | switch (adapter->flags & feature_mask) { | 2346 | switch (adapter->flags & feature_mask) { |
2347 | case (IXGBE_FLAG_RSS_ENABLED | IXGBE_FLAG_DCB_ENABLED): | ||
2348 | dcb_m = 0x7 << 3; | ||
2349 | rss_i = min(8, rss_i); | ||
2350 | rss_m = 0x7; | ||
2351 | nrq = dcb_i * rss_i; | ||
2352 | ntq = min(MAX_TX_QUEUES, dcb_i * rss_i); | ||
2353 | break; | ||
2354 | case (IXGBE_FLAG_DCB_ENABLED): | ||
2355 | dcb_m = 0x7 << 3; | ||
2356 | nrq = dcb_i; | ||
2357 | ntq = dcb_i; | ||
2358 | break; | ||
2281 | case (IXGBE_FLAG_RSS_ENABLED): | 2359 | case (IXGBE_FLAG_RSS_ENABLED): |
2282 | rss_m = 0xF; | 2360 | rss_m = 0xF; |
2283 | nrq = rss_i; | 2361 | nrq = rss_i; |
@@ -2285,6 +2363,8 @@ static void ixgbe_set_num_queues(struct ixgbe_adapter *adapter) | |||
2285 | break; | 2363 | break; |
2286 | case 0: | 2364 | case 0: |
2287 | default: | 2365 | default: |
2366 | dcb_i = 0; | ||
2367 | dcb_m = 0; | ||
2288 | rss_i = 0; | 2368 | rss_i = 0; |
2289 | rss_m = 0; | 2369 | rss_m = 0; |
2290 | nrq = 1; | 2370 | nrq = 1; |
@@ -2292,6 +2372,12 @@ static void ixgbe_set_num_queues(struct ixgbe_adapter *adapter) | |||
2292 | break; | 2372 | break; |
2293 | } | 2373 | } |
2294 | 2374 | ||
2375 | /* Sanity check, we should never have zero queues */ | ||
2376 | nrq = (nrq ?:1); | ||
2377 | ntq = (ntq ?:1); | ||
2378 | |||
2379 | adapter->ring_feature[RING_F_DCB].indices = dcb_i; | ||
2380 | adapter->ring_feature[RING_F_DCB].mask = dcb_m; | ||
2295 | adapter->ring_feature[RING_F_RSS].indices = rss_i; | 2381 | adapter->ring_feature[RING_F_RSS].indices = rss_i; |
2296 | adapter->ring_feature[RING_F_RSS].mask = rss_m; | 2382 | adapter->ring_feature[RING_F_RSS].mask = rss_m; |
2297 | break; | 2383 | break; |
@@ -2343,6 +2429,7 @@ static void ixgbe_acquire_msix_vectors(struct ixgbe_adapter *adapter, | |||
2343 | adapter->flags &= ~IXGBE_FLAG_MSIX_ENABLED; | 2429 | adapter->flags &= ~IXGBE_FLAG_MSIX_ENABLED; |
2344 | kfree(adapter->msix_entries); | 2430 | kfree(adapter->msix_entries); |
2345 | adapter->msix_entries = NULL; | 2431 | adapter->msix_entries = NULL; |
2432 | adapter->flags &= ~IXGBE_FLAG_DCB_ENABLED; | ||
2346 | adapter->flags &= ~IXGBE_FLAG_RSS_ENABLED; | 2433 | adapter->flags &= ~IXGBE_FLAG_RSS_ENABLED; |
2347 | ixgbe_set_num_queues(adapter); | 2434 | ixgbe_set_num_queues(adapter); |
2348 | } else { | 2435 | } else { |
@@ -2362,15 +2449,42 @@ static void __devinit ixgbe_cache_ring_register(struct ixgbe_adapter *adapter) | |||
2362 | { | 2449 | { |
2363 | int feature_mask = 0, rss_i; | 2450 | int feature_mask = 0, rss_i; |
2364 | int i, txr_idx, rxr_idx; | 2451 | int i, txr_idx, rxr_idx; |
2452 | int dcb_i; | ||
2365 | 2453 | ||
2366 | /* Number of supported queues */ | 2454 | /* Number of supported queues */ |
2367 | switch (adapter->hw.mac.type) { | 2455 | switch (adapter->hw.mac.type) { |
2368 | case ixgbe_mac_82598EB: | 2456 | case ixgbe_mac_82598EB: |
2457 | dcb_i = adapter->ring_feature[RING_F_DCB].indices; | ||
2369 | rss_i = adapter->ring_feature[RING_F_RSS].indices; | 2458 | rss_i = adapter->ring_feature[RING_F_RSS].indices; |
2370 | txr_idx = 0; | 2459 | txr_idx = 0; |
2371 | rxr_idx = 0; | 2460 | rxr_idx = 0; |
2461 | feature_mask |= IXGBE_FLAG_DCB_ENABLED; | ||
2372 | feature_mask |= IXGBE_FLAG_RSS_ENABLED; | 2462 | feature_mask |= IXGBE_FLAG_RSS_ENABLED; |
2373 | switch (adapter->flags & feature_mask) { | 2463 | switch (adapter->flags & feature_mask) { |
2464 | case (IXGBE_FLAG_RSS_ENABLED | IXGBE_FLAG_DCB_ENABLED): | ||
2465 | for (i = 0; i < dcb_i; i++) { | ||
2466 | int j; | ||
2467 | /* Rx first */ | ||
2468 | for (j = 0; j < adapter->num_rx_queues; j++) { | ||
2469 | adapter->rx_ring[rxr_idx].reg_idx = | ||
2470 | i << 3 | j; | ||
2471 | rxr_idx++; | ||
2472 | } | ||
2473 | /* Tx now */ | ||
2474 | for (j = 0; j < adapter->num_tx_queues; j++) { | ||
2475 | adapter->tx_ring[txr_idx].reg_idx = | ||
2476 | i << 2 | (j >> 1); | ||
2477 | if (j & 1) | ||
2478 | txr_idx++; | ||
2479 | } | ||
2480 | } | ||
2481 | case (IXGBE_FLAG_DCB_ENABLED): | ||
2482 | /* the number of queues is assumed to be symmetric */ | ||
2483 | for (i = 0; i < dcb_i; i++) { | ||
2484 | adapter->rx_ring[i].reg_idx = i << 3; | ||
2485 | adapter->tx_ring[i].reg_idx = i << 2; | ||
2486 | } | ||
2487 | break; | ||
2374 | case (IXGBE_FLAG_RSS_ENABLED): | 2488 | case (IXGBE_FLAG_RSS_ENABLED): |
2375 | for (i = 0; i < adapter->num_rx_queues; i++) | 2489 | for (i = 0; i < adapter->num_rx_queues; i++) |
2376 | adapter->rx_ring[i].reg_idx = i; | 2490 | adapter->rx_ring[i].reg_idx = i; |
@@ -2395,7 +2509,7 @@ static void __devinit ixgbe_cache_ring_register(struct ixgbe_adapter *adapter) | |||
2395 | * number of queues at compile-time. The polling_netdev array is | 2509 | * number of queues at compile-time. The polling_netdev array is |
2396 | * intended for Multiqueue, but should work fine with a single queue. | 2510 | * intended for Multiqueue, but should work fine with a single queue. |
2397 | **/ | 2511 | **/ |
2398 | static int __devinit ixgbe_alloc_queues(struct ixgbe_adapter *adapter) | 2512 | static int ixgbe_alloc_queues(struct ixgbe_adapter *adapter) |
2399 | { | 2513 | { |
2400 | int i; | 2514 | int i; |
2401 | 2515 | ||
@@ -2465,6 +2579,7 @@ static int __devinit ixgbe_set_interrupt_capability(struct ixgbe_adapter | |||
2465 | adapter->msix_entries = kcalloc(v_budget, | 2579 | adapter->msix_entries = kcalloc(v_budget, |
2466 | sizeof(struct msix_entry), GFP_KERNEL); | 2580 | sizeof(struct msix_entry), GFP_KERNEL); |
2467 | if (!adapter->msix_entries) { | 2581 | if (!adapter->msix_entries) { |
2582 | adapter->flags &= ~IXGBE_FLAG_DCB_ENABLED; | ||
2468 | adapter->flags &= ~IXGBE_FLAG_RSS_ENABLED; | 2583 | adapter->flags &= ~IXGBE_FLAG_RSS_ENABLED; |
2469 | ixgbe_set_num_queues(adapter); | 2584 | ixgbe_set_num_queues(adapter); |
2470 | kfree(adapter->tx_ring); | 2585 | kfree(adapter->tx_ring); |
@@ -2505,7 +2620,7 @@ out: | |||
2505 | return err; | 2620 | return err; |
2506 | } | 2621 | } |
2507 | 2622 | ||
2508 | static void ixgbe_reset_interrupt_capability(struct ixgbe_adapter *adapter) | 2623 | void ixgbe_reset_interrupt_capability(struct ixgbe_adapter *adapter) |
2509 | { | 2624 | { |
2510 | if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED) { | 2625 | if (adapter->flags & IXGBE_FLAG_MSIX_ENABLED) { |
2511 | adapter->flags &= ~IXGBE_FLAG_MSIX_ENABLED; | 2626 | adapter->flags &= ~IXGBE_FLAG_MSIX_ENABLED; |
@@ -2529,7 +2644,7 @@ static void ixgbe_reset_interrupt_capability(struct ixgbe_adapter *adapter) | |||
2529 | * - Hardware queue count (num_*_queues) | 2644 | * - Hardware queue count (num_*_queues) |
2530 | * - defined by miscellaneous hardware support/features (RSS, etc.) | 2645 | * - defined by miscellaneous hardware support/features (RSS, etc.) |
2531 | **/ | 2646 | **/ |
2532 | static int __devinit ixgbe_init_interrupt_scheme(struct ixgbe_adapter *adapter) | 2647 | int ixgbe_init_interrupt_scheme(struct ixgbe_adapter *adapter) |
2533 | { | 2648 | { |
2534 | int err; | 2649 | int err; |
2535 | 2650 | ||
@@ -2577,6 +2692,10 @@ static int __devinit ixgbe_sw_init(struct ixgbe_adapter *adapter) | |||
2577 | struct ixgbe_hw *hw = &adapter->hw; | 2692 | struct ixgbe_hw *hw = &adapter->hw; |
2578 | struct pci_dev *pdev = adapter->pdev; | 2693 | struct pci_dev *pdev = adapter->pdev; |
2579 | unsigned int rss; | 2694 | unsigned int rss; |
2695 | #ifdef CONFIG_IXGBE_DCBNL | ||
2696 | int j; | ||
2697 | struct tc_configuration *tc; | ||
2698 | #endif | ||
2580 | 2699 | ||
2581 | /* PCI config space info */ | 2700 | /* PCI config space info */ |
2582 | 2701 | ||
@@ -2590,6 +2709,27 @@ static int __devinit ixgbe_sw_init(struct ixgbe_adapter *adapter) | |||
2590 | rss = min(IXGBE_MAX_RSS_INDICES, (int)num_online_cpus()); | 2709 | rss = min(IXGBE_MAX_RSS_INDICES, (int)num_online_cpus()); |
2591 | adapter->ring_feature[RING_F_RSS].indices = rss; | 2710 | adapter->ring_feature[RING_F_RSS].indices = rss; |
2592 | adapter->flags |= IXGBE_FLAG_RSS_ENABLED; | 2711 | adapter->flags |= IXGBE_FLAG_RSS_ENABLED; |
2712 | adapter->ring_feature[RING_F_DCB].indices = IXGBE_MAX_DCB_INDICES; | ||
2713 | |||
2714 | #ifdef CONFIG_IXGBE_DCBNL | ||
2715 | /* Configure DCB traffic classes */ | ||
2716 | for (j = 0; j < MAX_TRAFFIC_CLASS; j++) { | ||
2717 | tc = &adapter->dcb_cfg.tc_config[j]; | ||
2718 | tc->path[DCB_TX_CONFIG].bwg_id = 0; | ||
2719 | tc->path[DCB_TX_CONFIG].bwg_percent = 12 + (j & 1); | ||
2720 | tc->path[DCB_RX_CONFIG].bwg_id = 0; | ||
2721 | tc->path[DCB_RX_CONFIG].bwg_percent = 12 + (j & 1); | ||
2722 | tc->dcb_pfc = pfc_disabled; | ||
2723 | } | ||
2724 | adapter->dcb_cfg.bw_percentage[DCB_TX_CONFIG][0] = 100; | ||
2725 | adapter->dcb_cfg.bw_percentage[DCB_RX_CONFIG][0] = 100; | ||
2726 | adapter->dcb_cfg.rx_pba_cfg = pba_equal; | ||
2727 | adapter->dcb_cfg.round_robin_enable = false; | ||
2728 | adapter->dcb_set_bitmap = 0x00; | ||
2729 | ixgbe_copy_dcb_cfg(&adapter->dcb_cfg, &adapter->temp_dcb_cfg, | ||
2730 | adapter->ring_feature[RING_F_DCB].indices); | ||
2731 | |||
2732 | #endif | ||
2593 | if (hw->mac.ops.get_media_type && | 2733 | if (hw->mac.ops.get_media_type && |
2594 | (hw->mac.ops.get_media_type(hw) == ixgbe_media_type_copper)) | 2734 | (hw->mac.ops.get_media_type(hw) == ixgbe_media_type_copper)) |
2595 | adapter->flags |= IXGBE_FLAG_FAN_FAIL_CAPABLE; | 2735 | adapter->flags |= IXGBE_FLAG_FAN_FAIL_CAPABLE; |
@@ -2967,7 +3107,7 @@ static int ixgbe_close(struct net_device *netdev) | |||
2967 | * @adapter: private struct | 3107 | * @adapter: private struct |
2968 | * helper function to napi_add each possible q_vector->napi | 3108 | * helper function to napi_add each possible q_vector->napi |
2969 | */ | 3109 | */ |
2970 | static void ixgbe_napi_add_all(struct ixgbe_adapter *adapter) | 3110 | void ixgbe_napi_add_all(struct ixgbe_adapter *adapter) |
2971 | { | 3111 | { |
2972 | int q_idx, q_vectors; | 3112 | int q_idx, q_vectors; |
2973 | int (*poll)(struct napi_struct *, int); | 3113 | int (*poll)(struct napi_struct *, int); |
@@ -2988,7 +3128,7 @@ static void ixgbe_napi_add_all(struct ixgbe_adapter *adapter) | |||
2988 | } | 3128 | } |
2989 | } | 3129 | } |
2990 | 3130 | ||
2991 | static void ixgbe_napi_del_all(struct ixgbe_adapter *adapter) | 3131 | void ixgbe_napi_del_all(struct ixgbe_adapter *adapter) |
2992 | { | 3132 | { |
2993 | int q_idx; | 3133 | int q_idx; |
2994 | int q_vectors = adapter->num_msix_vectors - NON_Q_VECTORS; | 3134 | int q_vectors = adapter->num_msix_vectors - NON_Q_VECTORS; |
@@ -3109,6 +3249,18 @@ void ixgbe_update_stats(struct ixgbe_adapter *adapter) | |||
3109 | adapter->stats.mpc[i] += mpc; | 3249 | adapter->stats.mpc[i] += mpc; |
3110 | total_mpc += adapter->stats.mpc[i]; | 3250 | total_mpc += adapter->stats.mpc[i]; |
3111 | adapter->stats.rnbc[i] += IXGBE_READ_REG(hw, IXGBE_RNBC(i)); | 3251 | adapter->stats.rnbc[i] += IXGBE_READ_REG(hw, IXGBE_RNBC(i)); |
3252 | adapter->stats.qptc[i] += IXGBE_READ_REG(hw, IXGBE_QPTC(i)); | ||
3253 | adapter->stats.qbtc[i] += IXGBE_READ_REG(hw, IXGBE_QBTC(i)); | ||
3254 | adapter->stats.qprc[i] += IXGBE_READ_REG(hw, IXGBE_QPRC(i)); | ||
3255 | adapter->stats.qbrc[i] += IXGBE_READ_REG(hw, IXGBE_QBRC(i)); | ||
3256 | adapter->stats.pxonrxc[i] += IXGBE_READ_REG(hw, | ||
3257 | IXGBE_PXONRXC(i)); | ||
3258 | adapter->stats.pxontxc[i] += IXGBE_READ_REG(hw, | ||
3259 | IXGBE_PXONTXC(i)); | ||
3260 | adapter->stats.pxoffrxc[i] += IXGBE_READ_REG(hw, | ||
3261 | IXGBE_PXOFFRXC(i)); | ||
3262 | adapter->stats.pxofftxc[i] += IXGBE_READ_REG(hw, | ||
3263 | IXGBE_PXOFFTXC(i)); | ||
3112 | } | 3264 | } |
3113 | adapter->stats.gprc += IXGBE_READ_REG(hw, IXGBE_GPRC); | 3265 | adapter->stats.gprc += IXGBE_READ_REG(hw, IXGBE_GPRC); |
3114 | /* work around hardware counting issue */ | 3266 | /* work around hardware counting issue */ |
@@ -3248,6 +3400,7 @@ static void ixgbe_watchdog_task(struct work_struct *work) | |||
3248 | (FLOW_TX ? "TX" : "None")))); | 3400 | (FLOW_TX ? "TX" : "None")))); |
3249 | 3401 | ||
3250 | netif_carrier_on(netdev); | 3402 | netif_carrier_on(netdev); |
3403 | netif_tx_wake_all_queues(netdev); | ||
3251 | } else { | 3404 | } else { |
3252 | /* Force detection of hung controller */ | 3405 | /* Force detection of hung controller */ |
3253 | adapter->detect_tx_hung = true; | 3406 | adapter->detect_tx_hung = true; |
@@ -3258,6 +3411,7 @@ static void ixgbe_watchdog_task(struct work_struct *work) | |||
3258 | if (netif_carrier_ok(netdev)) { | 3411 | if (netif_carrier_ok(netdev)) { |
3259 | DPRINTK(LINK, INFO, "NIC Link is Down\n"); | 3412 | DPRINTK(LINK, INFO, "NIC Link is Down\n"); |
3260 | netif_carrier_off(netdev); | 3413 | netif_carrier_off(netdev); |
3414 | netif_tx_stop_all_queues(netdev); | ||
3261 | } | 3415 | } |
3262 | } | 3416 | } |
3263 | 3417 | ||
@@ -3604,6 +3758,14 @@ static int ixgbe_xmit_frame(struct sk_buff *skb, struct net_device *netdev) | |||
3604 | 3758 | ||
3605 | if (adapter->vlgrp && vlan_tx_tag_present(skb)) { | 3759 | if (adapter->vlgrp && vlan_tx_tag_present(skb)) { |
3606 | tx_flags |= vlan_tx_tag_get(skb); | 3760 | tx_flags |= vlan_tx_tag_get(skb); |
3761 | if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) { | ||
3762 | tx_flags &= ~IXGBE_TX_FLAGS_VLAN_PRIO_MASK; | ||
3763 | tx_flags |= (skb->queue_mapping << 13); | ||
3764 | } | ||
3765 | tx_flags <<= IXGBE_TX_FLAGS_VLAN_SHIFT; | ||
3766 | tx_flags |= IXGBE_TX_FLAGS_VLAN; | ||
3767 | } else if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) { | ||
3768 | tx_flags |= (skb->queue_mapping << 13); | ||
3607 | tx_flags <<= IXGBE_TX_FLAGS_VLAN_SHIFT; | 3769 | tx_flags <<= IXGBE_TX_FLAGS_VLAN_SHIFT; |
3608 | tx_flags |= IXGBE_TX_FLAGS_VLAN; | 3770 | tx_flags |= IXGBE_TX_FLAGS_VLAN; |
3609 | } | 3771 | } |
@@ -3878,6 +4040,13 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev, | |||
3878 | netdev->vlan_features |= NETIF_F_IP_CSUM; | 4040 | netdev->vlan_features |= NETIF_F_IP_CSUM; |
3879 | netdev->vlan_features |= NETIF_F_SG; | 4041 | netdev->vlan_features |= NETIF_F_SG; |
3880 | 4042 | ||
4043 | if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) | ||
4044 | adapter->flags &= ~IXGBE_FLAG_RSS_ENABLED; | ||
4045 | |||
4046 | #ifdef CONFIG_IXGBE_DCBNL | ||
4047 | netdev->dcbnl_ops = &dcbnl_ops; | ||
4048 | #endif | ||
4049 | |||
3881 | if (pci_using_dac) | 4050 | if (pci_using_dac) |
3882 | netdev->features |= NETIF_F_HIGHDMA; | 4051 | netdev->features |= NETIF_F_HIGHDMA; |
3883 | 4052 | ||
@@ -3946,6 +4115,7 @@ static int __devinit ixgbe_probe(struct pci_dev *pdev, | |||
3946 | } | 4115 | } |
3947 | 4116 | ||
3948 | netif_carrier_off(netdev); | 4117 | netif_carrier_off(netdev); |
4118 | netif_tx_stop_all_queues(netdev); | ||
3949 | 4119 | ||
3950 | ixgbe_napi_add_all(adapter); | 4120 | ixgbe_napi_add_all(adapter); |
3951 | 4121 | ||