~ubuntu-branches/ubuntu/wily/linux-ti-omap4/wily

« back to all changes in this revision

Viewing changes to drivers/net/ethernet/intel/igb/igb_main.c

  • Committer: Package Import Robot
  • Author(s): Tim Gardner, Tim Gardner, Andy Whitcroft, James M Leddy, Paolo Pisati, Stefan Bader, Upstream Kernel Changes, Wen-chien Jesse Sung, David Henningsson, Leann Ogasawara, Rob Herring, git at e4ward
  • Date: 2012-10-09 15:40:14 UTC
  • Revision ID: package-import@ubuntu.com-20121009154014-iktauc26lb0l5alw
Tags: 3.5.0-213.20
[ Tim Gardner ]

* rebased on Ubuntu-3.5.0-17.28

[ Andy Whitcroft ]

* [packaging] we already have a valid src_pkg_name
* [packaging] allow us to select which builds have uefi signed versions

[ James M Leddy ]

* SAUCE: input: fix weird issue of synaptics psmouse sync lost after
  resume
  - LP: #717970

[ Paolo Pisati ]

* SAUCE: omap3 clocks .dev_id = NULL
  - LP: #1061599
* [Config] omap: disable USB_[EHCI|OHCI]_HCD_PLATFORM
  - LP: #1061599
* [Config] omap: enforce USB_[EHCI|OHCI]_HCD_PLATFORM=n
  - LP: #1061599

[ Stefan Bader ]

* SAUCE: net/ipv4: Always flush route cache on unregister batch call
  - LP: #1021471

[ Upstream Kernel Changes ]

* Bluetooth: Add USB_VENDOR_AND_INTERFACE_INFO() for Broadcom/Foxconn
  - LP: #1030233

[ Wen-chien Jesse Sung ]

* SAUCE: Bluetooth: Remove rules for matching Broadcom vendor specific
  IDs
  - LP: #1030233

[ Andy Whitcroft ]

* [packaging] add custom upload for the kernel binary package

[ David Henningsson ]

* SAUCE: ALSA: hda - fix indices on boost volume on Conexant
  - LP: #1059523

[ Leann Ogasawara ]

* [Config] Build in CONFIG_X86_PCC_CPUFREQ=y
  - LP: #1061126

[ Rob Herring ]

* Revert "SAUCE: ahci_platform: add custom hard reset for Calxeda ahci
  ctrlr"
  - LP: #1059432
* Revert "SAUCE: net: calxedaxgmac: add write barriers around setting
  owner bit"
  - LP: #1059432
* Revert "SAUCE: ARM: highbank: use writel_relaxed variant for pwr
  requests"
  - LP: #1059432
* Revert "SAUCE: force DMA buffers to non-bufferable on highbank"
  - LP: #1059432
* Revert "SAUCE: input: add a key driver for highbank"
  - LP: #1059432
* [Config] Align highbank config with amd64-generic and add new configs
  - LP: #1059432
* SAUCE: net: calxedaxgmac: enable operate on 2nd frame mode
  - LP: #1059432
* SAUCE: net: calxedaxgmac: remove explicit rx dma buffer polling
  - LP: #1059432
* SAUCE: net: calxedaxgmac: use relaxed i/o accessors in rx and tx paths
  - LP: #1059432
* SAUCE: net: calxedaxgmac: drop some unnecessary register writes
  - LP: #1059432
* SAUCE: net: calxedaxgmac: rework transmit ring handling
  - LP: #1059432
* SAUCE: ARM: highbank: retry wfi on reset request
  - LP: #1059432

[ Tim Gardner ]

* [Config] TIDSPBRIDGE=m
  - LP: #1058022
* rebase to v3.5.5

[ Upstream Kernel Changes ]

* common: DMA-mapping: add DMA_ATTR_NO_KERNEL_MAPPING attribute
  - LP: #1059432
* common: DMA-mapping: add DMA_ATTR_SKIP_CPU_SYNC attribute
  - LP: #1059432
* ARM: dma-mapping: add support for DMA_ATTR_SKIP_CPU_SYNC attribute
  - LP: #1059432
* ARM: add coherent dma ops
  - LP: #1059432
* ARM: add coherent iommu dma ops
  - LP: #1059432
* ARM: highbank: add coherent DMA setup
  - LP: #1059432
* sata: add platform driver for Calxeda AHCI controller
  - LP: #1059432
* xhci: Rate-limit XHCI_TRUST_TX_LENGTH quirk warning.
  - LP: #1039478
* agp/intel-gtt: remove dead code
  - LP: #1011440
* drm/i915: stop using dev->agp->base
  - LP: #1011440
* agp/intel-gtt: don't require the agp bridge on setup
  - LP: #1011440
* drm/i915 + agp/intel-gtt: prep work for direct setup
  - LP: #1011440
* agp/intel-gtt: move gart base addres setup
  - LP: #1011440
* drm/i915: don't use dev->agp
  - LP: #1011440
* drm/i915: disable drm agp support for !gen3 with kms enabled
  - LP: #1011440
* agp/intel-agp: remove snb+ host bridge pciids
  - LP: #1011440
* rebase to v3.5.5
  - LP: #1000424

[ git@status.e4ward.com ]

* SAUCE: input: Cypress PS/2 Trackpad fix multi-source, double-click
  - LP: #1055788

[ Tim Gardner ]

* [Config] revert '[Config] enable CONFIG_X86_X32=y'
  - LP: #1041883

[ Upstream Kernel Changes ]

* vmwgfx: corruption in vmw_event_fence_action_create()
* drm/nvd0/disp: hopefully fix selection of 6/8bpc mode on DP outputs
  - LP: #1058088
* drm/nv50-/gpio: initialise to vbios defaults during init
  - LP: #1058088
* igb: A fix to VF TX rate limit
  - LP: #1058188
* igb: Add switch case for supported hardware to igb_ptp_remove.
  - LP: #1058188
* igb: Support the get_ts_info ethtool method.
  - LP: #1058188
* igb: Streamline RSS queue and queue pairing assignment logic.
  - LP: #1058188
* igb: Update firmware info output
  - LP: #1058188
* igb: Version bump
  - LP: #1058188
* igb: reset PHY in the link_up process to recover PHY setting after
  power down.
  - LP: #1058188
* igb: Fix for failure to init on some 82576 devices.
  - LP: #1058188
* igb: correct hardware type (i210/i211) check in igb_loopback_test()
  - LP: #1058188
* igb: don't break user visible strings over multiple lines in
  igb_ethtool.c
  - LP: #1058188
* igb: add delay to allow igb loopback test to succeed on 8086:10c9
  - LP: #1058188
* igb: fix panic while dumping packets on Tx hang with IOMMU
  - LP: #1058188
* igb: Fix register defines for all non-82575 hardware
  - LP: #1058188
* e1000e: use more informative logging macros when netdev not yet
  registered
  - LP: #1058219
* e1000e: Cleanup code logic in e1000_check_for_serdes_link_82571()
  - LP: #1058219
* e1000e: Program the correct register for ITR when using MSI-X.
  - LP: #1058219
* e1000e: advertise transmit time stamping
  - LP: #1058219
* e1000e: 82571 Tx Data Corruption during Tx hang recovery
  - LP: #1058219
* e1000e: fix panic while dumping packets on Tx hang with IOMMU
  - LP: #1058219
* e1000: Combining Bitwise OR in one expression.
  - LP: #1058221
* e1000: advertise transmit time stamping
  - LP: #1058221
* e1000: Small packets may get corrupted during padding by HW
  - LP: #1058221
* sched: Fix migration thread runtime bogosity
  - LP: #1057593
* ACER: Add support for accelerometer sensor
  - LP: #1055433
* ACER: Fix Smatch double-free issue
  - LP: #1055433

[ Wen-chien Jesse Sung ]

* SAUCE: HID: ntrig: change default value of logical/physical
  width/height to 1
  - LP: #1044248

Show diffs side-by-side

added added

removed removed

Lines of Context:
59
59
#endif
60
60
#include "igb.h"
61
61
 
62
 
#define MAJ 3
63
 
#define MIN 4
64
 
#define BUILD 7
 
62
#define MAJ 4
 
63
#define MIN 0
 
64
#define BUILD 1
65
65
#define DRV_VERSION __stringify(MAJ) "." __stringify(MIN) "." \
66
66
__stringify(BUILD) "-k"
67
67
char igb_driver_name[] = "igb";
462
462
                                (u64)buffer_info->time_stamp,
463
463
                                buffer_info->skb, next_desc);
464
464
 
465
 
                        if (netif_msg_pktdata(adapter) && buffer_info->dma != 0)
 
465
                        if (netif_msg_pktdata(adapter) && buffer_info->skb)
466
466
                                print_hex_dump(KERN_INFO, "",
467
467
                                        DUMP_PREFIX_ADDRESS,
468
 
                                        16, 1, phys_to_virt(buffer_info->dma),
 
468
                                        16, 1, buffer_info->skb->data,
469
469
                                        buffer_info->length, true);
470
470
                }
471
471
        }
547
547
                                        (u64)buffer_info->dma,
548
548
                                        buffer_info->skb, next_desc);
549
549
 
550
 
                                if (netif_msg_pktdata(adapter)) {
 
550
                                if (netif_msg_pktdata(adapter) &&
 
551
                                    buffer_info->dma && buffer_info->skb) {
551
552
                                        print_hex_dump(KERN_INFO, "",
552
 
                                                DUMP_PREFIX_ADDRESS,
553
 
                                                16, 1,
554
 
                                                phys_to_virt(buffer_info->dma),
555
 
                                                IGB_RX_HDR_LEN, true);
 
553
                                                  DUMP_PREFIX_ADDRESS,
 
554
                                                  16, 1, buffer_info->skb->data,
 
555
                                                  IGB_RX_HDR_LEN, true);
556
556
                                        print_hex_dump(KERN_INFO, "",
557
557
                                          DUMP_PREFIX_ADDRESS,
558
558
                                          16, 1,
559
 
                                          phys_to_virt(
560
 
                                            buffer_info->page_dma +
561
 
                                            buffer_info->page_offset),
 
559
                                          page_address(buffer_info->page) +
 
560
                                                      buffer_info->page_offset,
562
561
                                          PAGE_SIZE/2, true);
563
562
                                }
564
563
                        }
1048
1047
        if (!(adapter->flags & IGB_FLAG_QUEUE_PAIRS))
1049
1048
                numvecs += adapter->num_tx_queues;
1050
1049
 
1051
 
        /* i210 and i211 can only have 4 MSIX vectors for rx/tx queues. */
1052
 
        if ((adapter->hw.mac.type == e1000_i210)
1053
 
                || (adapter->hw.mac.type == e1000_i211))
1054
 
                numvecs = 4;
1055
 
 
1056
1050
        /* store the number of vectors reserved for queues */
1057
1051
        adapter->num_q_vectors = numvecs;
1058
1052
 
1505
1499
 **/
1506
1500
void igb_power_up_link(struct igb_adapter *adapter)
1507
1501
{
 
1502
        igb_reset_phy(&adapter->hw);
 
1503
 
1508
1504
        if (adapter->hw.phy.media_type == e1000_media_type_copper)
1509
1505
                igb_power_up_phy_copper(&adapter->hw);
1510
1506
        else
1511
1507
                igb_power_up_serdes_link_82575(&adapter->hw);
1512
 
        igb_reset_phy(&adapter->hw);
1513
1508
}
1514
1509
 
1515
1510
/**
1821
1816
};
1822
1817
 
1823
1818
/**
 
1819
 * igb_set_fw_version - Configure version string for ethtool
 
1820
 * @adapter: adapter struct
 
1821
 *
 
1822
 **/
 
1823
void igb_set_fw_version(struct igb_adapter *adapter)
 
1824
{
 
1825
        struct e1000_hw *hw = &adapter->hw;
 
1826
        u16 eeprom_verh, eeprom_verl, comb_verh, comb_verl, comb_offset;
 
1827
        u16 major, build, patch, fw_version;
 
1828
        u32 etrack_id;
 
1829
 
 
1830
        hw->nvm.ops.read(hw, 5, 1, &fw_version);
 
1831
        if (adapter->hw.mac.type != e1000_i211) {
 
1832
                hw->nvm.ops.read(hw, NVM_ETRACK_WORD, 1, &eeprom_verh);
 
1833
                hw->nvm.ops.read(hw, (NVM_ETRACK_WORD + 1), 1, &eeprom_verl);
 
1834
                etrack_id = (eeprom_verh << IGB_ETRACK_SHIFT) | eeprom_verl;
 
1835
 
 
1836
                /* combo image version needs to be found */
 
1837
                hw->nvm.ops.read(hw, NVM_COMB_VER_PTR, 1, &comb_offset);
 
1838
                if ((comb_offset != 0x0) &&
 
1839
                    (comb_offset != IGB_NVM_VER_INVALID)) {
 
1840
                        hw->nvm.ops.read(hw, (NVM_COMB_VER_OFF + comb_offset
 
1841
                                         + 1), 1, &comb_verh);
 
1842
                        hw->nvm.ops.read(hw, (NVM_COMB_VER_OFF + comb_offset),
 
1843
                                         1, &comb_verl);
 
1844
 
 
1845
                        /* Only display Option Rom if it exists and is valid */
 
1846
                        if ((comb_verh && comb_verl) &&
 
1847
                            ((comb_verh != IGB_NVM_VER_INVALID) &&
 
1848
                             (comb_verl != IGB_NVM_VER_INVALID))) {
 
1849
                                major = comb_verl >> IGB_COMB_VER_SHFT;
 
1850
                                build = (comb_verl << IGB_COMB_VER_SHFT) |
 
1851
                                        (comb_verh >> IGB_COMB_VER_SHFT);
 
1852
                                patch = comb_verh & IGB_COMB_VER_MASK;
 
1853
                                snprintf(adapter->fw_version,
 
1854
                                         sizeof(adapter->fw_version),
 
1855
                                         "%d.%d%d, 0x%08x, %d.%d.%d",
 
1856
                                         (fw_version & IGB_MAJOR_MASK) >>
 
1857
                                         IGB_MAJOR_SHIFT,
 
1858
                                         (fw_version & IGB_MINOR_MASK) >>
 
1859
                                         IGB_MINOR_SHIFT,
 
1860
                                         (fw_version & IGB_BUILD_MASK),
 
1861
                                         etrack_id, major, build, patch);
 
1862
                                goto out;
 
1863
                        }
 
1864
                }
 
1865
                snprintf(adapter->fw_version, sizeof(adapter->fw_version),
 
1866
                         "%d.%d%d, 0x%08x",
 
1867
                         (fw_version & IGB_MAJOR_MASK) >> IGB_MAJOR_SHIFT,
 
1868
                         (fw_version & IGB_MINOR_MASK) >> IGB_MINOR_SHIFT,
 
1869
                         (fw_version & IGB_BUILD_MASK), etrack_id);
 
1870
        } else {
 
1871
                snprintf(adapter->fw_version, sizeof(adapter->fw_version),
 
1872
                         "%d.%d%d",
 
1873
                         (fw_version & IGB_MAJOR_MASK) >> IGB_MAJOR_SHIFT,
 
1874
                         (fw_version & IGB_MINOR_MASK) >> IGB_MINOR_SHIFT,
 
1875
                         (fw_version & IGB_BUILD_MASK));
 
1876
        }
 
1877
out:
 
1878
        return;
 
1879
}
 
1880
 
 
1881
/**
1824
1882
 * igb_probe - Device Initialization Routine
1825
1883
 * @pdev: PCI device information struct
1826
1884
 * @ent: entry in igb_pci_tbl
2030
2088
                goto err_eeprom;
2031
2089
        }
2032
2090
 
 
2091
        /* get firmware version for ethtool -i */
 
2092
        igb_set_fw_version(adapter);
 
2093
 
2033
2094
        setup_timer(&adapter->watchdog_timer, igb_watchdog,
2034
2095
                    (unsigned long) adapter);
2035
2096
        setup_timer(&adapter->phy_info_timer, igb_update_phy_info,
2338
2399
        struct e1000_hw *hw = &adapter->hw;
2339
2400
        struct net_device *netdev = adapter->netdev;
2340
2401
        struct pci_dev *pdev = adapter->pdev;
 
2402
        u32 max_rss_queues;
2341
2403
 
2342
2404
        pci_read_config_word(pdev, PCI_COMMAND, &hw->bus.pci_cmd_word);
2343
2405
 
2370
2432
                } else
2371
2433
                        adapter->vfs_allocated_count = max_vfs;
2372
2434
                break;
2373
 
        case e1000_i210:
2374
 
        case e1000_i211:
2375
 
                adapter->vfs_allocated_count = 0;
2376
 
                break;
2377
2435
        default:
2378
2436
                break;
2379
2437
        }
2380
2438
#endif /* CONFIG_PCI_IOV */
2381
 
        switch (hw->mac.type) {
2382
 
        case e1000_i210:
2383
 
                adapter->rss_queues = min_t(u32, IGB_MAX_RX_QUEUES_I210,
2384
 
                        num_online_cpus());
2385
 
                break;
2386
 
        case e1000_i211:
2387
 
                adapter->rss_queues = min_t(u32, IGB_MAX_RX_QUEUES_I211,
2388
 
                        num_online_cpus());
2389
 
                break;
2390
 
        default:
2391
 
                adapter->rss_queues = min_t(u32, IGB_MAX_RX_QUEUES,
2392
 
                num_online_cpus());
2393
 
                break;
2394
 
        }
2395
 
        /* i350 cannot do RSS and SR-IOV at the same time */
2396
 
        if (hw->mac.type == e1000_i350 && adapter->vfs_allocated_count)
2397
 
                adapter->rss_queues = 1;
2398
 
 
2399
 
        /*
2400
 
         * if rss_queues > 4 or vfs are going to be allocated with rss_queues
2401
 
         * then we should combine the queues into a queue pair in order to
2402
 
         * conserve interrupts due to limited supply
2403
 
         */
2404
 
        if ((adapter->rss_queues > 4) ||
2405
 
            ((adapter->rss_queues > 1) && (adapter->vfs_allocated_count > 6)))
2406
 
                adapter->flags |= IGB_FLAG_QUEUE_PAIRS;
 
2439
 
 
2440
        /* Determine the maximum number of RSS queues supported. */
 
2441
        switch (hw->mac.type) {
 
2442
        case e1000_i211:
 
2443
                max_rss_queues = IGB_MAX_RX_QUEUES_I211;
 
2444
                break;
 
2445
        case e1000_82575:
 
2446
        case e1000_i210:
 
2447
                max_rss_queues = IGB_MAX_RX_QUEUES_82575;
 
2448
                break;
 
2449
        case e1000_i350:
 
2450
                /* I350 cannot do RSS and SR-IOV at the same time */
 
2451
                if (!!adapter->vfs_allocated_count) {
 
2452
                        max_rss_queues = 1;
 
2453
                        break;
 
2454
                }
 
2455
                /* fall through */
 
2456
        case e1000_82576:
 
2457
                if (!!adapter->vfs_allocated_count) {
 
2458
                        max_rss_queues = 2;
 
2459
                        break;
 
2460
                }
 
2461
                /* fall through */
 
2462
        case e1000_82580:
 
2463
        default:
 
2464
                max_rss_queues = IGB_MAX_RX_QUEUES;
 
2465
                break;
 
2466
        }
 
2467
 
 
2468
        adapter->rss_queues = min_t(u32, max_rss_queues, num_online_cpus());
 
2469
 
 
2470
        /* Determine if we need to pair queues. */
 
2471
        switch (hw->mac.type) {
 
2472
        case e1000_82575:
 
2473
        case e1000_i211:
 
2474
                /* Device supports enough interrupts without queue pairing. */
 
2475
                break;
 
2476
        case e1000_82576:
 
2477
                /*
 
2478
                 * If VFs are going to be allocated with RSS queues then we
 
2479
                 * should pair the queues in order to conserve interrupts due
 
2480
                 * to limited supply.
 
2481
                 */
 
2482
                if ((adapter->rss_queues > 1) &&
 
2483
                    (adapter->vfs_allocated_count > 6))
 
2484
                        adapter->flags |= IGB_FLAG_QUEUE_PAIRS;
 
2485
                /* fall through */
 
2486
        case e1000_82580:
 
2487
        case e1000_i350:
 
2488
        case e1000_i210:
 
2489
        default:
 
2490
                /*
 
2491
                 * If rss_queues > half of max_rss_queues, pair the queues in
 
2492
                 * order to conserve interrupts due to limited supply.
 
2493
                 */
 
2494
                if (adapter->rss_queues > (max_rss_queues / 2))
 
2495
                        adapter->flags |= IGB_FLAG_QUEUE_PAIRS;
 
2496
                break;
 
2497
        }
2407
2498
 
2408
2499
        /* Setup and initialize a copy of the hw vlan table array */
2409
2500
        adapter->shadow_vfta = kzalloc(sizeof(u32) *
6997
7088
        }
6998
7089
 
6999
7090
        wr32(E1000_RTTDQSEL, vf); /* vf X uses queue X */
 
7091
        /*
 
7092
         * Set global transmit compensation time to the MMW_SIZE in RTTBCNRM
 
7093
         * register. MMW_SIZE=0x014 if 9728-byte jumbo is supported.
 
7094
         */
 
7095
        wr32(E1000_RTTBCNRM, 0x14);
7000
7096
        wr32(E1000_RTTBCNRC, bcnrc_val);
7001
7097
}
7002
7098