Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6

+46 -31
-1
drivers/net/typhoon.c
··· 1004 1004 } 1005 1005 1006 1006 strcpy(info->driver, KBUILD_MODNAME); 1007 - strcpy(info->version, UTS_RELEASE); 1008 1007 strcpy(info->bus_info, pci_name(pci_dev)); 1009 1008 } 1010 1009
+10 -2
drivers/net/usb/mcs7830.c
··· 1 1 /* 2 - * MOSCHIP MCS7830 based USB 2.0 Ethernet Devices 2 + * MOSCHIP MCS7830 based (7730/7830/7832) USB 2.0 Ethernet Devices 3 3 * 4 4 * based on usbnet.c, asix.c and the vendor provided mcs7830 driver 5 5 * ··· 10 10 * Copyright (c) 2002-2003 TiVo Inc. 11 11 * 12 12 * Definitions gathered from MOSCHIP, Data Sheet_7830DA.pdf (thanks!). 13 + * 14 + * 2010-12-19: add 7832 USB PID ("functionality same as MCS7830"), 15 + * per active notification by manufacturer 13 16 * 14 17 * TODO: 15 18 * - support HIF_REG_CONFIG_SLEEPMODE/HIF_REG_CONFIG_TXENABLE (via autopm?) ··· 63 60 #define MCS7830_MAX_MCAST 64 64 61 65 62 #define MCS7830_VENDOR_ID 0x9710 63 + #define MCS7832_PRODUCT_ID 0x7832 66 64 #define MCS7830_PRODUCT_ID 0x7830 67 65 #define MCS7730_PRODUCT_ID 0x7730 68 66 ··· 630 626 } 631 627 632 628 static const struct driver_info moschip_info = { 633 - .description = "MOSCHIP 7830/7730 usb-NET adapter", 629 + .description = "MOSCHIP 7830/7832/7730 usb-NET adapter", 634 630 .bind = mcs7830_bind, 635 631 .rx_fixup = mcs7830_rx_fixup, 636 632 .flags = FLAG_ETHER, ··· 648 644 }; 649 645 650 646 static const struct usb_device_id products[] = { 647 + { 648 + USB_DEVICE(MCS7830_VENDOR_ID, MCS7832_PRODUCT_ID), 649 + .driver_info = (unsigned long) &moschip_info, 650 + }, 651 651 { 652 652 USB_DEVICE(MCS7830_VENDOR_ID, MCS7830_PRODUCT_ID), 653 653 .driver_info = (unsigned long) &moschip_info,
+10
include/net/ip6_route.h
··· 175 175 return rt->rt6i_flags & RTF_LOCAL; 176 176 } 177 177 178 + int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)); 179 + 180 + static inline int ip6_skb_dst_mtu(struct sk_buff *skb) 181 + { 182 + struct ipv6_pinfo *np = skb->sk ? inet6_sk(skb->sk) : NULL; 183 + 184 + return (np && np->pmtudisc == IPV6_PMTUDISC_PROBE) ? 185 + skb_dst(skb)->dev->mtu : dst_mtu(skb_dst(skb)); 186 + } 187 + 178 188 #endif 179 189 #endif
+1 -5
include/net/sch_generic.h
··· 611 611 { 612 612 struct sk_buff *n; 613 613 614 - if ((action == TC_ACT_STOLEN || action == TC_ACT_QUEUED) && 615 - !skb_shared(skb)) 616 - n = skb_get(skb); 617 - else 618 - n = skb_clone(skb, gfp_mask); 614 + n = skb_clone(skb, gfp_mask); 619 615 620 616 if (n) { 621 617 n->tc_verd = SET_TC_VERD(n->tc_verd, 0);
+2 -10
net/ipv6/ip6_output.c
··· 56 56 #include <net/checksum.h> 57 57 #include <linux/mroute6.h> 58 58 59 - static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)); 59 + int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)); 60 60 61 61 int __ip6_local_out(struct sk_buff *skb) 62 62 { ··· 143 143 ip6_dst_idev(dst), IPSTATS_MIB_OUTNOROUTES); 144 144 kfree_skb(skb); 145 145 return -EINVAL; 146 - } 147 - 148 - static inline int ip6_skb_dst_mtu(struct sk_buff *skb) 149 - { 150 - struct ipv6_pinfo *np = skb->sk ? inet6_sk(skb->sk) : NULL; 151 - 152 - return (np && np->pmtudisc == IPV6_PMTUDISC_PROBE) ? 153 - skb_dst(skb)->dev->mtu : dst_mtu(skb_dst(skb)); 154 146 } 155 147 156 148 static int ip6_finish_output(struct sk_buff *skb) ··· 593 601 return offset; 594 602 } 595 603 596 - static int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)) 604 + int ip6_fragment(struct sk_buff *skb, int (*output)(struct sk_buff *)) 597 605 { 598 606 struct sk_buff *frag; 599 607 struct rt6_info *rt = (struct rt6_info*)skb_dst(skb);
+15 -1
net/ipv6/xfrm6_output.c
··· 17 17 #include <linux/netfilter_ipv6.h> 18 18 #include <net/dst.h> 19 19 #include <net/ipv6.h> 20 + #include <net/ip6_route.h> 20 21 #include <net/xfrm.h> 21 22 22 23 int xfrm6_find_1stfragopt(struct xfrm_state *x, struct sk_buff *skb, ··· 89 88 return xfrm_output(skb); 90 89 } 91 90 91 + static int __xfrm6_output(struct sk_buff *skb) 92 + { 93 + struct dst_entry *dst = skb_dst(skb); 94 + struct xfrm_state *x = dst->xfrm; 95 + 96 + if ((x && x->props.mode == XFRM_MODE_TUNNEL) && 97 + ((skb->len > ip6_skb_dst_mtu(skb) && !skb_is_gso(skb)) || 98 + dst_allfrag(skb_dst(skb)))) { 99 + return ip6_fragment(skb, xfrm6_output_finish); 100 + } 101 + return xfrm6_output_finish(skb); 102 + } 103 + 92 104 int xfrm6_output(struct sk_buff *skb) 93 105 { 94 106 return NF_HOOK(NFPROTO_IPV6, NF_INET_POST_ROUTING, skb, NULL, 95 - skb_dst(skb)->dev, xfrm6_output_finish); 107 + skb_dst(skb)->dev, __xfrm6_output); 96 108 }
+8 -12
net/sched/sch_sfq.c
··· 270 270 /* It is difficult to believe, but ALL THE SLOTS HAVE LENGTH 1. */ 271 271 d = q->next[q->tail]; 272 272 q->next[q->tail] = q->next[d]; 273 - q->allot[q->next[d]] += q->quantum; 274 273 skb = q->qs[d].prev; 275 274 len = qdisc_pkt_len(skb); 276 275 __skb_unlink(skb, &q->qs[d]); ··· 320 321 sfq_inc(q, x); 321 322 if (q->qs[x].qlen == 1) { /* The flow is new */ 322 323 if (q->tail == SFQ_DEPTH) { /* It is the first flow */ 323 - q->tail = x; 324 324 q->next[x] = x; 325 - q->allot[x] = q->quantum; 326 325 } else { 327 326 q->next[x] = q->next[q->tail]; 328 327 q->next[q->tail] = x; 329 - q->tail = x; 330 328 } 329 + q->tail = x; 330 + q->allot[x] = q->quantum; 331 331 } 332 332 if (++sch->q.qlen <= q->limit) { 333 333 sch->bstats.bytes += qdisc_pkt_len(skb); ··· 357 359 { 358 360 struct sfq_sched_data *q = qdisc_priv(sch); 359 361 struct sk_buff *skb; 360 - sfq_index a, old_a; 362 + sfq_index a, next_a; 361 363 362 364 /* No active slots */ 363 365 if (q->tail == SFQ_DEPTH) 364 366 return NULL; 365 367 366 - a = old_a = q->next[q->tail]; 368 + a = q->next[q->tail]; 367 369 368 370 /* Grab packet */ 369 371 skb = __skb_dequeue(&q->qs[a]); ··· 374 376 /* Is the slot empty? */ 375 377 if (q->qs[a].qlen == 0) { 376 378 q->ht[q->hash[a]] = SFQ_DEPTH; 377 - a = q->next[a]; 378 - if (a == old_a) { 379 + next_a = q->next[a]; 380 + if (a == next_a) { 379 381 q->tail = SFQ_DEPTH; 380 382 return skb; 381 383 } 382 - q->next[q->tail] = a; 383 - q->allot[a] += q->quantum; 384 + q->next[q->tail] = next_a; 384 385 } else if ((q->allot[a] -= qdisc_pkt_len(skb)) <= 0) { 385 - q->tail = a; 386 - a = q->next[a]; 387 386 q->allot[a] += q->quantum; 387 + q->tail = a; 388 388 } 389 389 return skb; 390 390 }