~n-muench/ubuntu/precise/open-vm-tools/open-vm-tools.raring-precise.backport

« back to all changes in this revision

Viewing changes to modules/linux/vmxnet/vmxnet.c

  • Committer: Package Import Robot
  • Author(s): Nate Muench
  • Date: 2012-01-23 16:09:45 UTC
  • mfrom: (1.4.6) (2.4.26 sid)
  • Revision ID: package-import@ubuntu.com-20120123160945-b6s0r1vkcovucpf3
Tags: 2011.12.20-562307-0ubuntu1
* Merge latest upstream git tag. Fixes building on Precise
  (LP: #898289, LP: #905612)

* Items merged from Debian unstable:
  - debian/control:
    + open-vm-tools recommends open-vm-dkms. (LP: #598933)
    + open-vm-tools now suggests open-vm-toolbox. (LP: #604998)
  (From 2011.08.21-471295-1 release)
  - Updating maintainer and uploaders fields.
  - Removing vcs fields.
  - Removing references to Daniel's old email address.
  - Updating years in copyright file.
  - Updating to standards version 3.9.2.
  - Updating to debhelper version 8.
  - Switching to source format 3.0 (quilt).
  - Removing manual chrpath setting.
  - Removing exclusion from plugins from debhelper shlibs.
  - Rediffing kvers.patch.
  (From 2011.09.23-491607-1 release)
  - Marking binary architecture-dependend packages as linux and kfreebsd
  only.
  - Removing liburiparser-dev from build-depends as upstream dropped
  unity support.
  - Building with libproc-dev on amd64 again.
  - Dropping disabling of dnet support.
  (From 2011.09.23-491607-2 release)
  - Adding doxygen to build-depends for api documentation.
  - Adding libcunit1-dev to build-depends for test suites.
  - Minimizing rules file.
  - Adding open-vm-tools-dev package, containing only the api
    documentation for now.
  (From 2011.09.23-491607-3 release)
  - Sorting overrides in rules alphabetically.
  - Compacting copyright file.
  - Adding udev rule to set timeout for vmware scsi devices
  (From 2011.12.20-562307-1 release)
  - Adding patch to correct typo in upstreams dkms configuration

* Remaining Changes:
  - Remove Stable part of version numbering.
  - debian folder:
    + Re-added open-vm-dkms.postinst & open-vm-dkms.prerm.
      * Allows dkms modules to compile upon installation.
  - debian/control:
    + Re-add open-vm-source and make into a transitional package
      for open-vm-toolbox.
    + Return dependancies that were moved to open-vm-tools back to
      open-vm-toolbox.
  - debian/rules and debian/open-vm-toolbox.lintian-overrides:
    + Make vmware-user-suid-wrapper suid-root
  - debian/rules:
    + Added CFLAGS field with -Wno-deprecated-declarations
      * Will suppress issues with glib 2.31 or later.
    + Add line to copy vmware-xdg-detect-de into place.
    + Install vmware-user.desktop through toolbox package.
  - debian/open-vm-tools.init:
    + Re-add 'modprobe [-r] vmblock'.
    + Add 'modprobe [-r] vmxnet'.
      * Incase it's not loaded during boot.
    + Remove and re-add pcnet32 module
      * Will be done before (remove) and after (readd) vmxnet module
        is added.
      * If vmxnet doesn't exist (aka modules fail to build), pcnet32 can be
        still used for network connectivity.
      * Workaround until a better fix can be done.
  - Re-add gnome-session to debian/local/xautostart.conf
  - Manpages removed (from debian/manpages):
    + vmmemctl.9
    + vmxnet3.9
    + Remove references to manpages that have been removed.

Show diffs side-by-side

added added

removed removed

Lines of Context:
989
989
      .ndo_start_xmit = &vmxnet_start_tx,
990
990
      .ndo_stop = &vmxnet_close,
991
991
      .ndo_get_stats = &vmxnet_get_stats,
 
992
#if COMPAT_LINUX_VERSION_CHECK_LT(3, 2, 0)
992
993
      .ndo_set_multicast_list = &vmxnet_set_multicast_list,
 
994
#else
 
995
      .ndo_set_rx_mode = &vmxnet_set_multicast_list,
 
996
#endif
993
997
      .ndo_change_mtu = &vmxnet_change_mtu,
994
998
#   ifdef VMW_HAVE_POLL_CONTROLLER
995
999
      .ndo_poll_controller = vmxnet_netpoll,
2033
2037
      offset -= skb_headlen(skb);
2034
2038
 
2035
2039
      for ( ; nextFrag < skb_shinfo(skb)->nr_frags; nextFrag++){
 
2040
         int fragSize;
2036
2041
         frag = &skb_shinfo(skb)->frags[nextFrag];
 
2042
#if COMPAT_LINUX_VERSION_CHECK_LT(3, 1, 0)
 
2043
        fragSize = frag->size;
 
2044
#else
 
2045
        fragSize = skb_frag_size(frag);
 
2046
#endif
2037
2047
 
2038
2048
         // skip those frags that are completely copied
2039
 
         if (offset >= frag->size){
2040
 
            offset -= frag->size;
 
2049
         if (offset >= fragSize){
 
2050
            offset -= fragSize;
2041
2051
         } else {
2042
2052
            // map the part of the frag that is not copied
2043
2053
            dma = pci_map_page(lp->pdev,
 
2054
#if COMPAT_LINUX_VERSION_CHECK_LT(3, 1, 0)
2044
2055
                               frag->page,
 
2056
#else
 
2057
                               frag->page.p,
 
2058
#endif
2045
2059
                               frag->page_offset + offset,
2046
 
                               frag->size - offset,
 
2060
                               fragSize - offset,
2047
2061
                               PCI_DMA_TODEVICE);
2048
 
            VMXNET_FILL_SG(xre->sg.sg[nextSg], dma, frag->size - offset);
 
2062
            VMXNET_FILL_SG(xre->sg.sg[nextSg], dma, fragSize - offset);
2049
2063
            VMXNET_LOG("vmxnet_map_tx: txRing[%u].sg[%d] -> frag[%d]+%u (%uB)\n",
2050
 
                       dd->txDriverNext, nextSg, nextFrag, offset, frag->size - offset);
 
2064
                       dd->txDriverNext, nextSg, nextFrag, offset, fragSize - offset);
2051
2065
            nextSg++;
2052
2066
            nextFrag++;
2053
2067
 
2058
2072
 
2059
2073
   // map the remaining frags, we might need to use additional tx entries
2060
2074
   for ( ; nextFrag < skb_shinfo(skb)->nr_frags; nextFrag++) {
 
2075
      int fragSize;
2061
2076
      frag = &skb_shinfo(skb)->frags[nextFrag];
 
2077
#if COMPAT_LINUX_VERSION_CHECK_LT(3, 1, 0)
 
2078
      fragSize = frag->size;
 
2079
#else
 
2080
      fragSize = skb_frag_size(frag);
 
2081
#endif
 
2082
     
2062
2083
      dma = pci_map_page(lp->pdev,
 
2084
#if COMPAT_LINUX_VERSION_CHECK_LT(3, 1, 0)
2063
2085
                         frag->page,
 
2086
#else
 
2087
                         frag->page.p,
 
2088
#endif
2064
2089
                         frag->page_offset,
2065
 
                         frag->size,
 
2090
                         fragSize,
2066
2091
                         PCI_DMA_TODEVICE);
2067
2092
 
2068
2093
      if (nextSg == VMXNET2_SG_DEFAULT_LENGTH) {
2091
2116
 
2092
2117
         nextSg = 0;
2093
2118
      }
2094
 
      VMXNET_FILL_SG(xre->sg.sg[nextSg], dma, frag->size);
 
2119
      VMXNET_FILL_SG(xre->sg.sg[nextSg], dma, fragSize);
2095
2120
      VMXNET_LOG("vmxnet_map_tx: txRing[%u].sg[%d] -> frag[%d] (%uB)\n",
2096
 
                 dd->txDriverNext, nextSg, nextFrag, frag->size);
 
2121
                 dd->txDriverNext, nextSg, nextFrag, fragSize);
2097
2122
      nextSg++;
2098
2123
   }
2099
2124
 
2548
2573
         if (UNLIKELY(newPage == NULL)) {
2549
2574
            skb_shinfo(skb)->nr_frags = numFrags;
2550
2575
            skb->len += skb->data_len;
2551
 
            skb->truesize += skb->data_len;
 
2576
            skb->truesize += PAGE_SIZE;
2552
2577
 
2553
2578
            compat_dev_kfree_skb(skb, FREE_WRITE);
2554
2579
 
2558
2583
         }
2559
2584
 
2560
2585
         pci_unmap_page(pdev, rre2->paddr, PAGE_SIZE, PCI_DMA_FROMDEVICE);
 
2586
#if COMPAT_LINUX_VERSION_CHECK_LT(3, 1, 0)
2561
2587
         skb_shinfo(skb)->frags[numFrags].page = lp->rxPages[dd->rxDriverNext2];
 
2588
#else
 
2589
         __skb_frag_set_page(&skb_shinfo(skb)->frags[numFrags],
 
2590
                             lp->rxPages[dd->rxDriverNext2]);
 
2591
#endif
2562
2592
         skb_shinfo(skb)->frags[numFrags].page_offset = 0;
2563
2593
         skb_shinfo(skb)->frags[numFrags].size = rre2->actualLength;
2564
2594
         skb->data_len += rre2->actualLength;
 
2595
         skb->truesize += PAGE_SIZE;
2565
2596
         numFrags++;
2566
2597
 
2567
2598
         /* refill the buffer */
2579
2610
   VMXNET_ASSERT(numFrags > 0);
2580
2611
   skb_shinfo(skb)->nr_frags = numFrags;
2581
2612
   skb->len += skb->data_len;
2582
 
   skb->truesize += skb->data_len;
 
2613
   skb->truesize += PAGE_SIZE;
2583
2614
   VMXNET_LOG("vmxnet_rx: %dB from rxRing[%d](%dB)+rxRing2[%d, %d)(%dB)\n",
2584
2615
              skb->len, dd->rxDriverNext, skb_headlen(skb),
2585
2616
              firstFrag, dd->rxDriverNext2, skb->data_len);
3040
3071
   unsigned int ioaddr = dev->base_addr;
3041
3072
   int i;
3042
3073
 
3043
 
   if (netif_running(dev))
3044
 
      return -EBUSY;
3045
 
 
3046
3074
   memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
3047
3075
 
3048
3076
   for (i = 0; i < ETH_ALEN; i++) {