diff options
51 files changed, 450 insertions, 296 deletions
diff --git a/drivers/isdn/i4l/isdn_ppp.c b/drivers/isdn/i4l/isdn_ppp.c index a1e760150821..61d78fa03b1a 100644 --- a/drivers/isdn/i4l/isdn_ppp.c +++ b/drivers/isdn/i4l/isdn_ppp.c | |||
| @@ -595,7 +595,7 @@ isdn_ppp_ioctl(int min, struct file *file, unsigned int cmd, unsigned long arg) | |||
| 595 | j = ipc->num / (sizeof(long) * 8); | 595 | j = ipc->num / (sizeof(long) * 8); |
| 596 | i = ipc->num % (sizeof(long) * 8); | 596 | i = ipc->num % (sizeof(long) * 8); |
| 597 | if (j < 8) | 597 | if (j < 8) |
| 598 | protos[j] |= (0x1 << i); | 598 | protos[j] |= (1UL << i); |
| 599 | ipc = ipc->next; | 599 | ipc = ipc->next; |
| 600 | } | 600 | } |
| 601 | if ((r = set_arg(argp, protos, 8 * sizeof(long)))) | 601 | if ((r = set_arg(argp, protos, 8 * sizeof(long)))) |
diff --git a/drivers/net/ethernet/intel/e1000e/e1000.h b/drivers/net/ethernet/intel/e1000e/e1000.h index cb3356c9af80..04668b47a1df 100644 --- a/drivers/net/ethernet/intel/e1000e/e1000.h +++ b/drivers/net/ethernet/intel/e1000e/e1000.h | |||
| @@ -175,13 +175,13 @@ struct e1000_info; | |||
| 175 | /* | 175 | /* |
| 176 | * in the case of WTHRESH, it appears at least the 82571/2 hardware | 176 | * in the case of WTHRESH, it appears at least the 82571/2 hardware |
| 177 | * writes back 4 descriptors when WTHRESH=5, and 3 descriptors when | 177 | * writes back 4 descriptors when WTHRESH=5, and 3 descriptors when |
| 178 | * WTHRESH=4, and since we want 64 bytes at a time written back, set | 178 | * WTHRESH=4, so a setting of 5 gives the most efficient bus |
| 179 | * it to 5 | 179 | * utilization but to avoid possible Tx stalls, set it to 1 |
| 180 | */ | 180 | */ |
| 181 | #define E1000_TXDCTL_DMA_BURST_ENABLE \ | 181 | #define E1000_TXDCTL_DMA_BURST_ENABLE \ |
| 182 | (E1000_TXDCTL_GRAN | /* set descriptor granularity */ \ | 182 | (E1000_TXDCTL_GRAN | /* set descriptor granularity */ \ |
| 183 | E1000_TXDCTL_COUNT_DESC | \ | 183 | E1000_TXDCTL_COUNT_DESC | \ |
| 184 | (5 << 16) | /* wthresh must be +1 more than desired */\ | 184 | (1 << 16) | /* wthresh must be +1 more than desired */\ |
| 185 | (1 << 8) | /* hthresh */ \ | 185 | (1 << 8) | /* hthresh */ \ |
| 186 | 0x1f) /* pthresh */ | 186 | 0x1f) /* pthresh */ |
| 187 | 187 | ||
diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c index de57a2ba6bde..f444eb0b76d8 100644 --- a/drivers/net/ethernet/intel/e1000e/netdev.c +++ b/drivers/net/ethernet/intel/e1000e/netdev.c | |||
| @@ -2831,7 +2831,7 @@ static void e1000_configure_tx(struct e1000_adapter *adapter) | |||
| 2831 | * set up some performance related parameters to encourage the | 2831 | * set up some performance related parameters to encourage the |
| 2832 | * hardware to use the bus more efficiently in bursts, depends | 2832 | * hardware to use the bus more efficiently in bursts, depends |
| 2833 | * on the tx_int_delay to be enabled, | 2833 | * on the tx_int_delay to be enabled, |
| 2834 | * wthresh = 5 ==> burst write a cacheline (64 bytes) at a time | 2834 | * wthresh = 1 ==> burst write is disabled to avoid Tx stalls |
| 2835 | * hthresh = 1 ==> prefetch when one or more available | 2835 | * hthresh = 1 ==> prefetch when one or more available |
| 2836 | * pthresh = 0x1f ==> prefetch if internal cache 31 or less | 2836 | * pthresh = 0x1f ==> prefetch if internal cache 31 or less |
| 2837 | * BEWARE: this seems to work but should be considered first if | 2837 | * BEWARE: this seems to work but should be considered first if |
diff --git a/drivers/net/ethernet/jme.c b/drivers/net/ethernet/jme.c index c911d883c27e..f8064df10cc4 100644 --- a/drivers/net/ethernet/jme.c +++ b/drivers/net/ethernet/jme.c | |||
| @@ -27,6 +27,7 @@ | |||
| 27 | #include <linux/module.h> | 27 | #include <linux/module.h> |
| 28 | #include <linux/kernel.h> | 28 | #include <linux/kernel.h> |
| 29 | #include <linux/pci.h> | 29 | #include <linux/pci.h> |
| 30 | #include <linux/pci-aspm.h> | ||
| 30 | #include <linux/netdevice.h> | 31 | #include <linux/netdevice.h> |
| 31 | #include <linux/etherdevice.h> | 32 | #include <linux/etherdevice.h> |
| 32 | #include <linux/ethtool.h> | 33 | #include <linux/ethtool.h> |
| @@ -2973,6 +2974,9 @@ jme_init_one(struct pci_dev *pdev, | |||
| 2973 | /* | 2974 | /* |
| 2974 | * set up PCI device basics | 2975 | * set up PCI device basics |
| 2975 | */ | 2976 | */ |
| 2977 | pci_disable_link_state(pdev, PCIE_LINK_STATE_L0S | PCIE_LINK_STATE_L1 | | ||
| 2978 | PCIE_LINK_STATE_CLKPM); | ||
| 2979 | |||
| 2976 | rc = pci_enable_device(pdev); | 2980 | rc = pci_enable_device(pdev); |
| 2977 | if (rc) { | 2981 | if (rc) { |
| 2978 | pr_err("Cannot enable PCI device\n"); | 2982 | pr_err("Cannot enable PCI device\n"); |
diff --git a/drivers/net/usb/cdc_eem.c b/drivers/net/usb/cdc_eem.c index 434d5af8e6fb..c81e278629ff 100644 --- a/drivers/net/usb/cdc_eem.c +++ b/drivers/net/usb/cdc_eem.c | |||
| @@ -244,8 +244,12 @@ static int eem_rx_fixup(struct usbnet *dev, struct sk_buff *skb) | |||
| 244 | * - suspend: peripheral ready to suspend | 244 | * - suspend: peripheral ready to suspend |
| 245 | * - response: suggest N millisec polling | 245 | * - response: suggest N millisec polling |
| 246 | * - response complete: suggest N sec polling | 246 | * - response complete: suggest N sec polling |
| 247 | * | ||
| 248 | * Suspend is reported and maybe heeded. | ||
| 247 | */ | 249 | */ |
| 248 | case 2: /* Suspend hint */ | 250 | case 2: /* Suspend hint */ |
| 251 | usbnet_device_suggests_idle(dev); | ||
| 252 | continue; | ||
| 249 | case 3: /* Response hint */ | 253 | case 3: /* Response hint */ |
| 250 | case 4: /* Response complete hint */ | 254 | case 4: /* Response complete hint */ |
| 251 | continue; | 255 | continue; |
diff --git a/drivers/net/usb/kaweth.c b/drivers/net/usb/kaweth.c index c75e11e1b385..afb117c16d2d 100644 --- a/drivers/net/usb/kaweth.c +++ b/drivers/net/usb/kaweth.c | |||
| @@ -424,7 +424,7 @@ static int kaweth_download_firmware(struct kaweth_device *kaweth, | |||
| 424 | 424 | ||
| 425 | netdev_dbg(kaweth->net, | 425 | netdev_dbg(kaweth->net, |
| 426 | "Downloading firmware at %p to kaweth device at %p\n", | 426 | "Downloading firmware at %p to kaweth device at %p\n", |
| 427 | fw->data, kaweth); | 427 | kaweth->firmware_buf, kaweth); |
| 428 | netdev_dbg(kaweth->net, "Firmware length: %d\n", data_len); | 428 | netdev_dbg(kaweth->net, "Firmware length: %d\n", data_len); |
| 429 | 429 | ||
| 430 | return kaweth_control(kaweth, | 430 | return kaweth_control(kaweth, |
diff --git a/drivers/net/usb/mcs7830.c b/drivers/net/usb/mcs7830.c index 03c2d8d653df..cc7e72010ac3 100644 --- a/drivers/net/usb/mcs7830.c +++ b/drivers/net/usb/mcs7830.c | |||
| @@ -117,6 +117,7 @@ enum { | |||
| 117 | struct mcs7830_data { | 117 | struct mcs7830_data { |
| 118 | u8 multi_filter[8]; | 118 | u8 multi_filter[8]; |
| 119 | u8 config; | 119 | u8 config; |
| 120 | u8 link_counter; | ||
| 120 | }; | 121 | }; |
| 121 | 122 | ||
| 122 | static const char driver_name[] = "MOSCHIP usb-ethernet driver"; | 123 | static const char driver_name[] = "MOSCHIP usb-ethernet driver"; |
| @@ -632,20 +633,31 @@ static int mcs7830_rx_fixup(struct usbnet *dev, struct sk_buff *skb) | |||
| 632 | static void mcs7830_status(struct usbnet *dev, struct urb *urb) | 633 | static void mcs7830_status(struct usbnet *dev, struct urb *urb) |
| 633 | { | 634 | { |
| 634 | u8 *buf = urb->transfer_buffer; | 635 | u8 *buf = urb->transfer_buffer; |
| 635 | bool link; | 636 | bool link, link_changed; |
| 637 | struct mcs7830_data *data = mcs7830_get_data(dev); | ||
| 636 | 638 | ||
| 637 | if (urb->actual_length < 16) | 639 | if (urb->actual_length < 16) |
| 638 | return; | 640 | return; |
| 639 | 641 | ||
| 640 | link = !(buf[1] & 0x20); | 642 | link = !(buf[1] & 0x20); |
| 641 | if (netif_carrier_ok(dev->net) != link) { | 643 | link_changed = netif_carrier_ok(dev->net) != link; |
| 642 | if (link) { | 644 | if (link_changed) { |
| 643 | netif_carrier_on(dev->net); | 645 | data->link_counter++; |
| 644 | usbnet_defer_kevent(dev, EVENT_LINK_RESET); | 646 | /* |
| 645 | } else | 647 | track link state 20 times to guard against erroneous |
| 646 | netif_carrier_off(dev->net); | 648 | link state changes reported sometimes by the chip |
| 647 | netdev_dbg(dev->net, "Link Status is: %d\n", link); | 649 | */ |
| 648 | } | 650 | if (data->link_counter > 20) { |
| 651 | data->link_counter = 0; | ||
| 652 | if (link) { | ||
| 653 | netif_carrier_on(dev->net); | ||
| 654 | usbnet_defer_kevent(dev, EVENT_LINK_RESET); | ||
| 655 | } else | ||
| 656 | netif_carrier_off(dev->net); | ||
| 657 | netdev_dbg(dev->net, "Link Status is: %d\n", link); | ||
| 658 | } | ||
| 659 | } else | ||
| 660 | data->link_counter = 0; | ||
| 649 | } | 661 | } |
| 650 | 662 | ||
| 651 | static const struct driver_info moschip_info = { | 663 | static const struct driver_info moschip_info = { |
diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c index fc9f578a1e25..f9819d10b1f9 100644 --- a/drivers/net/usb/usbnet.c +++ b/drivers/net/usb/usbnet.c | |||
| @@ -1588,10 +1588,27 @@ int usbnet_resume (struct usb_interface *intf) | |||
| 1588 | tasklet_schedule (&dev->bh); | 1588 | tasklet_schedule (&dev->bh); |
| 1589 | } | 1589 | } |
| 1590 | } | 1590 | } |
| 1591 | |||
| 1592 | if (test_and_clear_bit(EVENT_DEVICE_REPORT_IDLE, &dev->flags)) | ||
| 1593 | usb_autopm_get_interface_no_resume(intf); | ||
| 1594 | |||
| 1591 | return 0; | 1595 | return 0; |
| 1592 | } | 1596 | } |
| 1593 | EXPORT_SYMBOL_GPL(usbnet_resume); | 1597 | EXPORT_SYMBOL_GPL(usbnet_resume); |
| 1594 | 1598 | ||
| 1599 | /* | ||
| 1600 | * Either a subdriver implements manage_power, then it is assumed to always | ||
| 1601 | * be ready to be suspended or it reports the readiness to be suspended | ||
| 1602 | * explicitly | ||
| 1603 | */ | ||
| 1604 | void usbnet_device_suggests_idle(struct usbnet *dev) | ||
| 1605 | { | ||
| 1606 | if (!test_and_set_bit(EVENT_DEVICE_REPORT_IDLE, &dev->flags)) { | ||
| 1607 | dev->intf->needs_remote_wakeup = 1; | ||
| 1608 | usb_autopm_put_interface_async(dev->intf); | ||
| 1609 | } | ||
| 1610 | } | ||
| 1611 | EXPORT_SYMBOL(usbnet_device_suggests_idle); | ||
| 1595 | 1612 | ||
| 1596 | /*-------------------------------------------------------------------------*/ | 1613 | /*-------------------------------------------------------------------------*/ |
| 1597 | 1614 | ||
diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c index 8be9bf07bd39..607976c00162 100644 --- a/drivers/net/vxlan.c +++ b/drivers/net/vxlan.c | |||
| @@ -106,6 +106,8 @@ struct vxlan_dev { | |||
| 106 | __be32 gaddr; /* multicast group */ | 106 | __be32 gaddr; /* multicast group */ |
| 107 | __be32 saddr; /* source address */ | 107 | __be32 saddr; /* source address */ |
| 108 | unsigned int link; /* link to multicast over */ | 108 | unsigned int link; /* link to multicast over */ |
| 109 | __u16 port_min; /* source port range */ | ||
| 110 | __u16 port_max; | ||
| 109 | __u8 tos; /* TOS override */ | 111 | __u8 tos; /* TOS override */ |
| 110 | __u8 ttl; | 112 | __u8 ttl; |
| 111 | bool learn; | 113 | bool learn; |
| @@ -228,9 +230,9 @@ static u32 eth_hash(const unsigned char *addr) | |||
| 228 | 230 | ||
| 229 | /* only want 6 bytes */ | 231 | /* only want 6 bytes */ |
| 230 | #ifdef __BIG_ENDIAN | 232 | #ifdef __BIG_ENDIAN |
| 231 | value <<= 16; | ||
| 232 | #else | ||
| 233 | value >>= 16; | 233 | value >>= 16; |
| 234 | #else | ||
| 235 | value <<= 16; | ||
| 234 | #endif | 236 | #endif |
| 235 | return hash_64(value, FDB_HASH_BITS); | 237 | return hash_64(value, FDB_HASH_BITS); |
| 236 | } | 238 | } |
| @@ -535,7 +537,6 @@ static int vxlan_udp_encap_recv(struct sock *sk, struct sk_buff *skb) | |||
| 535 | } | 537 | } |
| 536 | 538 | ||
| 537 | __skb_pull(skb, sizeof(struct vxlanhdr)); | 539 | __skb_pull(skb, sizeof(struct vxlanhdr)); |
| 538 | skb_postpull_rcsum(skb, eth_hdr(skb), sizeof(struct vxlanhdr)); | ||
| 539 | 540 | ||
| 540 | /* Is this VNI defined? */ | 541 | /* Is this VNI defined? */ |
| 541 | vni = ntohl(vxh->vx_vni) >> 8; | 542 | vni = ntohl(vxh->vx_vni) >> 8; |
| @@ -554,7 +555,6 @@ static int vxlan_udp_encap_recv(struct sock *sk, struct sk_buff *skb) | |||
| 554 | /* Re-examine inner Ethernet packet */ | 555 | /* Re-examine inner Ethernet packet */ |
| 555 | oip = ip_hdr(skb); | 556 | oip = ip_hdr(skb); |
| 556 | skb->protocol = eth_type_trans(skb, vxlan->dev); | 557 | skb->protocol = eth_type_trans(skb, vxlan->dev); |
| 557 | skb_postpull_rcsum(skb, eth_hdr(skb), ETH_HLEN); | ||
| 558 | 558 | ||
| 559 | /* Ignore packet loops (and multicast echo) */ | 559 | /* Ignore packet loops (and multicast echo) */ |
| 560 | if (compare_ether_addr(eth_hdr(skb)->h_source, | 560 | if (compare_ether_addr(eth_hdr(skb)->h_source, |
| @@ -566,6 +566,7 @@ static int vxlan_udp_encap_recv(struct sock *sk, struct sk_buff *skb) | |||
| 566 | 566 | ||
| 567 | __skb_tunnel_rx(skb, vxlan->dev); | 567 | __skb_tunnel_rx(skb, vxlan->dev); |
| 568 | skb_reset_network_header(skb); | 568 | skb_reset_network_header(skb); |
| 569 | skb->ip_summed = CHECKSUM_NONE; | ||
| 569 | 570 | ||
| 570 | err = IP_ECN_decapsulate(oip, skb); | 571 | err = IP_ECN_decapsulate(oip, skb); |
| 571 | if (unlikely(err)) { | 572 | if (unlikely(err)) { |
| @@ -621,46 +622,89 @@ static inline u8 vxlan_ecn_encap(u8 tos, | |||
| 621 | return INET_ECN_encapsulate(tos, inner); | 622 | return INET_ECN_encapsulate(tos, inner); |
| 622 | } | 623 | } |
| 623 | 624 | ||
| 625 | static __be32 vxlan_find_dst(struct vxlan_dev *vxlan, struct sk_buff *skb) | ||
| 626 | { | ||
| 627 | const struct ethhdr *eth = (struct ethhdr *) skb->data; | ||
| 628 | const struct vxlan_fdb *f; | ||
| 629 | |||
| 630 | if (is_multicast_ether_addr(eth->h_dest)) | ||
| 631 | return vxlan->gaddr; | ||
| 632 | |||
| 633 | f = vxlan_find_mac(vxlan, eth->h_dest); | ||
| 634 | if (f) | ||
| 635 | return f->remote_ip; | ||
| 636 | else | ||
| 637 | return vxlan->gaddr; | ||
| 638 | |||
| 639 | } | ||
| 640 | |||
| 641 | static void vxlan_sock_free(struct sk_buff *skb) | ||
| 642 | { | ||
| 643 | sock_put(skb->sk); | ||
| 644 | } | ||
| 645 | |||
| 646 | /* On transmit, associate with the tunnel socket */ | ||
| 647 | static void vxlan_set_owner(struct net_device *dev, struct sk_buff *skb) | ||
| 648 | { | ||
| 649 | struct vxlan_net *vn = net_generic(dev_net(dev), vxlan_net_id); | ||
| 650 | struct sock *sk = vn->sock->sk; | ||
| 651 | |||
| 652 | skb_orphan(skb); | ||
| 653 | sock_hold(sk); | ||
| 654 | skb->sk = sk; | ||
| 655 | skb->destructor = vxlan_sock_free; | ||
| 656 | } | ||
| 657 | |||
| 658 | /* Compute source port for outgoing packet | ||
| 659 | * first choice to use L4 flow hash since it will spread | ||
| 660 | * better and maybe available from hardware | ||
| 661 | * secondary choice is to use jhash on the Ethernet header | ||
| 662 | */ | ||
| 663 | static u16 vxlan_src_port(const struct vxlan_dev *vxlan, struct sk_buff *skb) | ||
| 664 | { | ||
| 665 | unsigned int range = (vxlan->port_max - vxlan->port_min) + 1; | ||
| 666 | u32 hash; | ||
| 667 | |||
| 668 | hash = skb_get_rxhash(skb); | ||
| 669 | if (!hash) | ||
| 670 | hash = jhash(skb->data, 2 * ETH_ALEN, | ||
| 671 | (__force u32) skb->protocol); | ||
| 672 | |||
| 673 | return (((u64) hash * range) >> 32) + vxlan->port_min; | ||
| 674 | } | ||
| 675 | |||
| 624 | /* Transmit local packets over Vxlan | 676 | /* Transmit local packets over Vxlan |
| 625 | * | 677 | * |
| 626 | * Outer IP header inherits ECN and DF from inner header. | 678 | * Outer IP header inherits ECN and DF from inner header. |
| 627 | * Outer UDP destination is the VXLAN assigned port. | 679 | * Outer UDP destination is the VXLAN assigned port. |
| 628 | * source port is based on hash of flow if available | 680 | * source port is based on hash of flow |
| 629 | * otherwise use a random value | ||
| 630 | */ | 681 | */ |
| 631 | static netdev_tx_t vxlan_xmit(struct sk_buff *skb, struct net_device *dev) | 682 | static netdev_tx_t vxlan_xmit(struct sk_buff *skb, struct net_device *dev) |
| 632 | { | 683 | { |
| 633 | struct vxlan_dev *vxlan = netdev_priv(dev); | 684 | struct vxlan_dev *vxlan = netdev_priv(dev); |
| 634 | struct rtable *rt; | 685 | struct rtable *rt; |
| 635 | const struct ethhdr *eth; | ||
| 636 | const struct iphdr *old_iph; | 686 | const struct iphdr *old_iph; |
| 637 | struct iphdr *iph; | 687 | struct iphdr *iph; |
| 638 | struct vxlanhdr *vxh; | 688 | struct vxlanhdr *vxh; |
| 639 | struct udphdr *uh; | 689 | struct udphdr *uh; |
| 640 | struct flowi4 fl4; | 690 | struct flowi4 fl4; |
| 641 | struct vxlan_fdb *f; | ||
| 642 | unsigned int pkt_len = skb->len; | 691 | unsigned int pkt_len = skb->len; |
| 643 | u32 hash; | ||
| 644 | __be32 dst; | 692 | __be32 dst; |
| 693 | __u16 src_port; | ||
| 645 | __be16 df = 0; | 694 | __be16 df = 0; |
| 646 | __u8 tos, ttl; | 695 | __u8 tos, ttl; |
| 647 | int err; | 696 | int err; |
| 648 | 697 | ||
| 698 | dst = vxlan_find_dst(vxlan, skb); | ||
| 699 | if (!dst) | ||
| 700 | goto drop; | ||
| 701 | |||
| 649 | /* Need space for new headers (invalidates iph ptr) */ | 702 | /* Need space for new headers (invalidates iph ptr) */ |
| 650 | if (skb_cow_head(skb, VXLAN_HEADROOM)) | 703 | if (skb_cow_head(skb, VXLAN_HEADROOM)) |
| 651 | goto drop; | 704 | goto drop; |
| 652 | 705 | ||
| 653 | eth = (void *)skb->data; | ||
| 654 | old_iph = ip_hdr(skb); | 706 | old_iph = ip_hdr(skb); |
| 655 | 707 | ||
| 656 | if (!is_multicast_ether_addr(eth->h_dest) && | ||
| 657 | (f = vxlan_find_mac(vxlan, eth->h_dest))) | ||
| 658 | dst = f->remote_ip; | ||
| 659 | else if (vxlan->gaddr) { | ||
| 660 | dst = vxlan->gaddr; | ||
| 661 | } else | ||
| 662 | goto drop; | ||
| 663 | |||
| 664 | ttl = vxlan->ttl; | 708 | ttl = vxlan->ttl; |
| 665 | if (!ttl && IN_MULTICAST(ntohl(dst))) | 709 | if (!ttl && IN_MULTICAST(ntohl(dst))) |
| 666 | ttl = 1; | 710 | ttl = 1; |
| @@ -669,11 +713,15 @@ static netdev_tx_t vxlan_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 669 | if (tos == 1) | 713 | if (tos == 1) |
| 670 | tos = vxlan_get_dsfield(old_iph, skb); | 714 | tos = vxlan_get_dsfield(old_iph, skb); |
| 671 | 715 | ||
| 672 | hash = skb_get_rxhash(skb); | 716 | src_port = vxlan_src_port(vxlan, skb); |
| 717 | |||
| 718 | memset(&fl4, 0, sizeof(fl4)); | ||
| 719 | fl4.flowi4_oif = vxlan->link; | ||
| 720 | fl4.flowi4_tos = RT_TOS(tos); | ||
| 721 | fl4.daddr = dst; | ||
| 722 | fl4.saddr = vxlan->saddr; | ||
| 673 | 723 | ||
| 674 | rt = ip_route_output_gre(dev_net(dev), &fl4, dst, | 724 | rt = ip_route_output_key(dev_net(dev), &fl4); |
| 675 | vxlan->saddr, vxlan->vni, | ||
| 676 | RT_TOS(tos), vxlan->link); | ||
| 677 | if (IS_ERR(rt)) { | 725 | if (IS_ERR(rt)) { |
| 678 | netdev_dbg(dev, "no route to %pI4\n", &dst); | 726 | netdev_dbg(dev, "no route to %pI4\n", &dst); |
| 679 | dev->stats.tx_carrier_errors++; | 727 | dev->stats.tx_carrier_errors++; |
| @@ -702,7 +750,7 @@ static netdev_tx_t vxlan_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 702 | uh = udp_hdr(skb); | 750 | uh = udp_hdr(skb); |
| 703 | 751 | ||
| 704 | uh->dest = htons(vxlan_port); | 752 | uh->dest = htons(vxlan_port); |
| 705 | uh->source = hash ? :random32(); | 753 | uh->source = htons(src_port); |
| 706 | 754 | ||
| 707 | uh->len = htons(skb->len); | 755 | uh->len = htons(skb->len); |
| 708 | uh->check = 0; | 756 | uh->check = 0; |
| @@ -715,10 +763,12 @@ static netdev_tx_t vxlan_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 715 | iph->frag_off = df; | 763 | iph->frag_off = df; |
| 716 | iph->protocol = IPPROTO_UDP; | 764 | iph->protocol = IPPROTO_UDP; |
| 717 | iph->tos = vxlan_ecn_encap(tos, old_iph, skb); | 765 | iph->tos = vxlan_ecn_encap(tos, old_iph, skb); |
| 718 | iph->daddr = fl4.daddr; | 766 | iph->daddr = dst; |
| 719 | iph->saddr = fl4.saddr; | 767 | iph->saddr = fl4.saddr; |
| 720 | iph->ttl = ttl ? : ip4_dst_hoplimit(&rt->dst); | 768 | iph->ttl = ttl ? : ip4_dst_hoplimit(&rt->dst); |
| 721 | 769 | ||
| 770 | vxlan_set_owner(dev, skb); | ||
| 771 | |||
| 722 | /* See __IPTUNNEL_XMIT */ | 772 | /* See __IPTUNNEL_XMIT */ |
| 723 | skb->ip_summed = CHECKSUM_NONE; | 773 | skb->ip_summed = CHECKSUM_NONE; |
| 724 | ip_select_ident(iph, &rt->dst, NULL); | 774 | ip_select_ident(iph, &rt->dst, NULL); |
| @@ -928,9 +978,11 @@ static void vxlan_setup(struct net_device *dev) | |||
| 928 | { | 978 | { |
| 929 | struct vxlan_dev *vxlan = netdev_priv(dev); | 979 | struct vxlan_dev *vxlan = netdev_priv(dev); |
| 930 | unsigned h; | 980 | unsigned h; |
| 981 | int low, high; | ||
| 931 | 982 | ||
| 932 | eth_hw_addr_random(dev); | 983 | eth_hw_addr_random(dev); |
| 933 | ether_setup(dev); | 984 | ether_setup(dev); |
| 985 | dev->hard_header_len = ETH_HLEN + VXLAN_HEADROOM; | ||
| 934 | 986 | ||
| 935 | dev->netdev_ops = &vxlan_netdev_ops; | 987 | dev->netdev_ops = &vxlan_netdev_ops; |
| 936 | dev->destructor = vxlan_free; | 988 | dev->destructor = vxlan_free; |
| @@ -947,6 +999,10 @@ static void vxlan_setup(struct net_device *dev) | |||
| 947 | vxlan->age_timer.function = vxlan_cleanup; | 999 | vxlan->age_timer.function = vxlan_cleanup; |
| 948 | vxlan->age_timer.data = (unsigned long) vxlan; | 1000 | vxlan->age_timer.data = (unsigned long) vxlan; |
| 949 | 1001 | ||
| 1002 | inet_get_local_port_range(&low, &high); | ||
| 1003 | vxlan->port_min = low; | ||
| 1004 | vxlan->port_max = high; | ||
| 1005 | |||
| 950 | vxlan->dev = dev; | 1006 | vxlan->dev = dev; |
| 951 | 1007 | ||
| 952 | for (h = 0; h < FDB_HASH_SIZE; ++h) | 1008 | for (h = 0; h < FDB_HASH_SIZE; ++h) |
| @@ -963,6 +1019,7 @@ static const struct nla_policy vxlan_policy[IFLA_VXLAN_MAX + 1] = { | |||
| 963 | [IFLA_VXLAN_LEARNING] = { .type = NLA_U8 }, | 1019 | [IFLA_VXLAN_LEARNING] = { .type = NLA_U8 }, |
| 964 | [IFLA_VXLAN_AGEING] = { .type = NLA_U32 }, | 1020 | [IFLA_VXLAN_AGEING] = { .type = NLA_U32 }, |
| 965 | [IFLA_VXLAN_LIMIT] = { .type = NLA_U32 }, | 1021 | [IFLA_VXLAN_LIMIT] = { .type = NLA_U32 }, |
| 1022 | [IFLA_VXLAN_PORT_RANGE] = { .len = sizeof(struct ifla_vxlan_port_range) }, | ||
| 966 | }; | 1023 | }; |
| 967 | 1024 | ||
| 968 | static int vxlan_validate(struct nlattr *tb[], struct nlattr *data[]) | 1025 | static int vxlan_validate(struct nlattr *tb[], struct nlattr *data[]) |
| @@ -995,6 +1052,18 @@ static int vxlan_validate(struct nlattr *tb[], struct nlattr *data[]) | |||
| 995 | return -EADDRNOTAVAIL; | 1052 | return -EADDRNOTAVAIL; |
| 996 | } | 1053 | } |
| 997 | } | 1054 | } |
| 1055 | |||
| 1056 | if (data[IFLA_VXLAN_PORT_RANGE]) { | ||
| 1057 | const struct ifla_vxlan_port_range *p | ||
| 1058 | = nla_data(data[IFLA_VXLAN_PORT_RANGE]); | ||
| 1059 | |||
| 1060 | if (ntohs(p->high) < ntohs(p->low)) { | ||
| 1061 | pr_debug("port range %u .. %u not valid\n", | ||
| 1062 | ntohs(p->low), ntohs(p->high)); | ||
| 1063 | return -EINVAL; | ||
| 1064 | } | ||
| 1065 | } | ||
| 1066 | |||
| 998 | return 0; | 1067 | return 0; |
| 999 | } | 1068 | } |
| 1000 | 1069 | ||
| @@ -1021,14 +1090,18 @@ static int vxlan_newlink(struct net *net, struct net_device *dev, | |||
| 1021 | if (data[IFLA_VXLAN_LOCAL]) | 1090 | if (data[IFLA_VXLAN_LOCAL]) |
| 1022 | vxlan->saddr = nla_get_be32(data[IFLA_VXLAN_LOCAL]); | 1091 | vxlan->saddr = nla_get_be32(data[IFLA_VXLAN_LOCAL]); |
| 1023 | 1092 | ||
| 1024 | if (data[IFLA_VXLAN_LINK]) { | 1093 | if (data[IFLA_VXLAN_LINK] && |
| 1025 | vxlan->link = nla_get_u32(data[IFLA_VXLAN_LINK]); | 1094 | (vxlan->link = nla_get_u32(data[IFLA_VXLAN_LINK]))) { |
| 1095 | struct net_device *lowerdev | ||
| 1096 | = __dev_get_by_index(net, vxlan->link); | ||
| 1026 | 1097 | ||
| 1027 | if (!tb[IFLA_MTU]) { | 1098 | if (!lowerdev) { |
| 1028 | struct net_device *lowerdev; | 1099 | pr_info("ifindex %d does not exist\n", vxlan->link); |
| 1029 | lowerdev = __dev_get_by_index(net, vxlan->link); | 1100 | return -ENODEV; |
| 1030 | dev->mtu = lowerdev->mtu - VXLAN_HEADROOM; | ||
| 1031 | } | 1101 | } |
| 1102 | |||
| 1103 | if (!tb[IFLA_MTU]) | ||
| 1104 | dev->mtu = lowerdev->mtu - VXLAN_HEADROOM; | ||
| 1032 | } | 1105 | } |
| 1033 | 1106 | ||
| 1034 | if (data[IFLA_VXLAN_TOS]) | 1107 | if (data[IFLA_VXLAN_TOS]) |
| @@ -1045,6 +1118,13 @@ static int vxlan_newlink(struct net *net, struct net_device *dev, | |||
| 1045 | if (data[IFLA_VXLAN_LIMIT]) | 1118 | if (data[IFLA_VXLAN_LIMIT]) |
| 1046 | vxlan->addrmax = nla_get_u32(data[IFLA_VXLAN_LIMIT]); | 1119 | vxlan->addrmax = nla_get_u32(data[IFLA_VXLAN_LIMIT]); |
| 1047 | 1120 | ||
| 1121 | if (data[IFLA_VXLAN_PORT_RANGE]) { | ||
| 1122 | const struct ifla_vxlan_port_range *p | ||
| 1123 | = nla_data(data[IFLA_VXLAN_PORT_RANGE]); | ||
| 1124 | vxlan->port_min = ntohs(p->low); | ||
| 1125 | vxlan->port_max = ntohs(p->high); | ||
| 1126 | } | ||
| 1127 | |||
| 1048 | err = register_netdevice(dev); | 1128 | err = register_netdevice(dev); |
| 1049 | if (!err) | 1129 | if (!err) |
| 1050 | hlist_add_head_rcu(&vxlan->hlist, vni_head(net, vxlan->vni)); | 1130 | hlist_add_head_rcu(&vxlan->hlist, vni_head(net, vxlan->vni)); |
| @@ -1073,12 +1153,17 @@ static size_t vxlan_get_size(const struct net_device *dev) | |||
| 1073 | nla_total_size(sizeof(__u8)) + /* IFLA_VXLAN_LEARNING */ | 1153 | nla_total_size(sizeof(__u8)) + /* IFLA_VXLAN_LEARNING */ |
| 1074 | nla_total_size(sizeof(__u32)) + /* IFLA_VXLAN_AGEING */ | 1154 | nla_total_size(sizeof(__u32)) + /* IFLA_VXLAN_AGEING */ |
| 1075 | nla_total_size(sizeof(__u32)) + /* IFLA_VXLAN_LIMIT */ | 1155 | nla_total_size(sizeof(__u32)) + /* IFLA_VXLAN_LIMIT */ |
| 1156 | nla_total_size(sizeof(struct ifla_vxlan_port_range)) + | ||
| 1076 | 0; | 1157 | 0; |
| 1077 | } | 1158 | } |
| 1078 | 1159 | ||
| 1079 | static int vxlan_fill_info(struct sk_buff *skb, const struct net_device *dev) | 1160 | static int vxlan_fill_info(struct sk_buff *skb, const struct net_device *dev) |
| 1080 | { | 1161 | { |
| 1081 | const struct vxlan_dev *vxlan = netdev_priv(dev); | 1162 | const struct vxlan_dev *vxlan = netdev_priv(dev); |
| 1163 | struct ifla_vxlan_port_range ports = { | ||
| 1164 | .low = htons(vxlan->port_min), | ||
| 1165 | .high = htons(vxlan->port_max), | ||
| 1166 | }; | ||
| 1082 | 1167 | ||
| 1083 | if (nla_put_u32(skb, IFLA_VXLAN_ID, vxlan->vni)) | 1168 | if (nla_put_u32(skb, IFLA_VXLAN_ID, vxlan->vni)) |
| 1084 | goto nla_put_failure; | 1169 | goto nla_put_failure; |
| @@ -1099,6 +1184,9 @@ static int vxlan_fill_info(struct sk_buff *skb, const struct net_device *dev) | |||
| 1099 | nla_put_u32(skb, IFLA_VXLAN_LIMIT, vxlan->addrmax)) | 1184 | nla_put_u32(skb, IFLA_VXLAN_LIMIT, vxlan->addrmax)) |
| 1100 | goto nla_put_failure; | 1185 | goto nla_put_failure; |
| 1101 | 1186 | ||
| 1187 | if (nla_put(skb, IFLA_VXLAN_PORT_RANGE, sizeof(ports), &ports)) | ||
| 1188 | goto nla_put_failure; | ||
| 1189 | |||
| 1102 | return 0; | 1190 | return 0; |
| 1103 | 1191 | ||
| 1104 | nla_put_failure: | 1192 | nla_put_failure: |
diff --git a/drivers/net/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c index 9fd6d9a9942e..9f31cfa56cc0 100644 --- a/drivers/net/wireless/ath/ath5k/base.c +++ b/drivers/net/wireless/ath/ath5k/base.c | |||
| @@ -1804,7 +1804,7 @@ ath5k_beacon_update(struct ieee80211_hw *hw, struct ieee80211_vif *vif) | |||
| 1804 | { | 1804 | { |
| 1805 | int ret; | 1805 | int ret; |
| 1806 | struct ath5k_hw *ah = hw->priv; | 1806 | struct ath5k_hw *ah = hw->priv; |
| 1807 | struct ath5k_vif *avf = (void *)vif->drv_priv; | 1807 | struct ath5k_vif *avf; |
| 1808 | struct sk_buff *skb; | 1808 | struct sk_buff *skb; |
| 1809 | 1809 | ||
| 1810 | if (WARN_ON(!vif)) { | 1810 | if (WARN_ON(!vif)) { |
| @@ -1819,6 +1819,7 @@ ath5k_beacon_update(struct ieee80211_hw *hw, struct ieee80211_vif *vif) | |||
| 1819 | goto out; | 1819 | goto out; |
| 1820 | } | 1820 | } |
| 1821 | 1821 | ||
| 1822 | avf = (void *)vif->drv_priv; | ||
| 1822 | ath5k_txbuf_free_skb(ah, avf->bbuf); | 1823 | ath5k_txbuf_free_skb(ah, avf->bbuf); |
| 1823 | avf->bbuf->skb = skb; | 1824 | avf->bbuf->skb = skb; |
| 1824 | ret = ath5k_beacon_setup(ah, avf->bbuf); | 1825 | ret = ath5k_beacon_setup(ah, avf->bbuf); |
diff --git a/drivers/net/wireless/ath/ath9k/beacon.c b/drivers/net/wireless/ath/ath9k/beacon.c index 76f07d8c272d..1b48414dca95 100644 --- a/drivers/net/wireless/ath/ath9k/beacon.c +++ b/drivers/net/wireless/ath/ath9k/beacon.c | |||
| @@ -120,7 +120,7 @@ static void ath9k_tx_cabq(struct ieee80211_hw *hw, struct sk_buff *skb) | |||
| 120 | 120 | ||
| 121 | if (ath_tx_start(hw, skb, &txctl) != 0) { | 121 | if (ath_tx_start(hw, skb, &txctl) != 0) { |
| 122 | ath_dbg(common, XMIT, "CABQ TX failed\n"); | 122 | ath_dbg(common, XMIT, "CABQ TX failed\n"); |
| 123 | dev_kfree_skb_any(skb); | 123 | ieee80211_free_txskb(hw, skb); |
| 124 | } | 124 | } |
| 125 | } | 125 | } |
| 126 | 126 | ||
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c index f9a6ec5cf470..8e1559aba495 100644 --- a/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c | |||
| @@ -1450,9 +1450,14 @@ static bool ath9k_hw_set_reset_reg(struct ath_hw *ah, u32 type) | |||
| 1450 | REG_WRITE(ah, AR_RTC_FORCE_WAKE, | 1450 | REG_WRITE(ah, AR_RTC_FORCE_WAKE, |
| 1451 | AR_RTC_FORCE_WAKE_EN | AR_RTC_FORCE_WAKE_ON_INT); | 1451 | AR_RTC_FORCE_WAKE_EN | AR_RTC_FORCE_WAKE_ON_INT); |
| 1452 | 1452 | ||
| 1453 | if (!ah->reset_power_on) | ||
| 1454 | type = ATH9K_RESET_POWER_ON; | ||
| 1455 | |||
| 1453 | switch (type) { | 1456 | switch (type) { |
| 1454 | case ATH9K_RESET_POWER_ON: | 1457 | case ATH9K_RESET_POWER_ON: |
| 1455 | ret = ath9k_hw_set_reset_power_on(ah); | 1458 | ret = ath9k_hw_set_reset_power_on(ah); |
| 1459 | if (!ret) | ||
| 1460 | ah->reset_power_on = true; | ||
| 1456 | break; | 1461 | break; |
| 1457 | case ATH9K_RESET_WARM: | 1462 | case ATH9K_RESET_WARM: |
| 1458 | case ATH9K_RESET_COLD: | 1463 | case ATH9K_RESET_COLD: |
diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h index 566a4ce4f156..dbc1b7a4cbfd 100644 --- a/drivers/net/wireless/ath/ath9k/hw.h +++ b/drivers/net/wireless/ath/ath9k/hw.h | |||
| @@ -741,6 +741,7 @@ struct ath_hw { | |||
| 741 | u32 rfkill_polarity; | 741 | u32 rfkill_polarity; |
| 742 | u32 ah_flags; | 742 | u32 ah_flags; |
| 743 | 743 | ||
| 744 | bool reset_power_on; | ||
| 744 | bool htc_reset_init; | 745 | bool htc_reset_init; |
| 745 | 746 | ||
| 746 | enum nl80211_iftype opmode; | 747 | enum nl80211_iftype opmode; |
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c index 31ab82e3ba85..dd45edfa6bae 100644 --- a/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c | |||
| @@ -639,8 +639,7 @@ static int ath9k_start(struct ieee80211_hw *hw) | |||
| 639 | ath_err(common, | 639 | ath_err(common, |
| 640 | "Unable to reset hardware; reset status %d (freq %u MHz)\n", | 640 | "Unable to reset hardware; reset status %d (freq %u MHz)\n", |
| 641 | r, curchan->center_freq); | 641 | r, curchan->center_freq); |
| 642 | spin_unlock_bh(&sc->sc_pcu_lock); | 642 | ah->reset_power_on = false; |
| 643 | goto mutex_unlock; | ||
| 644 | } | 643 | } |
| 645 | 644 | ||
| 646 | /* Setup our intr mask. */ | 645 | /* Setup our intr mask. */ |
| @@ -665,11 +664,8 @@ static int ath9k_start(struct ieee80211_hw *hw) | |||
| 665 | clear_bit(SC_OP_INVALID, &sc->sc_flags); | 664 | clear_bit(SC_OP_INVALID, &sc->sc_flags); |
| 666 | sc->sc_ah->is_monitoring = false; | 665 | sc->sc_ah->is_monitoring = false; |
| 667 | 666 | ||
| 668 | if (!ath_complete_reset(sc, false)) { | 667 | if (!ath_complete_reset(sc, false)) |
| 669 | r = -EIO; | 668 | ah->reset_power_on = false; |
| 670 | spin_unlock_bh(&sc->sc_pcu_lock); | ||
| 671 | goto mutex_unlock; | ||
| 672 | } | ||
| 673 | 669 | ||
| 674 | if (ah->led_pin >= 0) { | 670 | if (ah->led_pin >= 0) { |
| 675 | ath9k_hw_cfg_output(ah, ah->led_pin, | 671 | ath9k_hw_cfg_output(ah, ah->led_pin, |
| @@ -688,12 +684,11 @@ static int ath9k_start(struct ieee80211_hw *hw) | |||
| 688 | if (ah->caps.pcie_lcr_extsync_en && common->bus_ops->extn_synch_en) | 684 | if (ah->caps.pcie_lcr_extsync_en && common->bus_ops->extn_synch_en) |
| 689 | common->bus_ops->extn_synch_en(common); | 685 | common->bus_ops->extn_synch_en(common); |
| 690 | 686 | ||
| 691 | mutex_unlock: | ||
| 692 | mutex_unlock(&sc->mutex); | 687 | mutex_unlock(&sc->mutex); |
| 693 | 688 | ||
| 694 | ath9k_ps_restore(sc); | 689 | ath9k_ps_restore(sc); |
| 695 | 690 | ||
| 696 | return r; | 691 | return 0; |
| 697 | } | 692 | } |
| 698 | 693 | ||
| 699 | static void ath9k_tx(struct ieee80211_hw *hw, | 694 | static void ath9k_tx(struct ieee80211_hw *hw, |
| @@ -770,7 +765,7 @@ static void ath9k_tx(struct ieee80211_hw *hw, | |||
| 770 | 765 | ||
| 771 | return; | 766 | return; |
| 772 | exit: | 767 | exit: |
| 773 | dev_kfree_skb_any(skb); | 768 | ieee80211_free_txskb(hw, skb); |
| 774 | } | 769 | } |
| 775 | 770 | ||
| 776 | static void ath9k_stop(struct ieee80211_hw *hw) | 771 | static void ath9k_stop(struct ieee80211_hw *hw) |
diff --git a/drivers/net/wireless/ath/ath9k/pci.c b/drivers/net/wireless/ath/ath9k/pci.c index 0e630a99b68b..f088f4bf9a26 100644 --- a/drivers/net/wireless/ath/ath9k/pci.c +++ b/drivers/net/wireless/ath/ath9k/pci.c | |||
| @@ -324,6 +324,10 @@ static int ath_pci_suspend(struct device *device) | |||
| 324 | static int ath_pci_resume(struct device *device) | 324 | static int ath_pci_resume(struct device *device) |
| 325 | { | 325 | { |
| 326 | struct pci_dev *pdev = to_pci_dev(device); | 326 | struct pci_dev *pdev = to_pci_dev(device); |
| 327 | struct ieee80211_hw *hw = pci_get_drvdata(pdev); | ||
| 328 | struct ath_softc *sc = hw->priv; | ||
| 329 | struct ath_hw *ah = sc->sc_ah; | ||
| 330 | struct ath_common *common = ath9k_hw_common(ah); | ||
| 327 | u32 val; | 331 | u32 val; |
| 328 | 332 | ||
| 329 | /* | 333 | /* |
| @@ -335,6 +339,9 @@ static int ath_pci_resume(struct device *device) | |||
| 335 | if ((val & 0x0000ff00) != 0) | 339 | if ((val & 0x0000ff00) != 0) |
| 336 | pci_write_config_dword(pdev, 0x40, val & 0xffff00ff); | 340 | pci_write_config_dword(pdev, 0x40, val & 0xffff00ff); |
| 337 | 341 | ||
| 342 | ath_pci_aspm_init(common); | ||
| 343 | ah->reset_power_on = false; | ||
| 344 | |||
| 338 | return 0; | 345 | return 0; |
| 339 | } | 346 | } |
| 340 | 347 | ||
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c index 36618e3a5e60..378bd70256b2 100644 --- a/drivers/net/wireless/ath/ath9k/xmit.c +++ b/drivers/net/wireless/ath/ath9k/xmit.c | |||
| @@ -66,8 +66,7 @@ static void ath_tx_update_baw(struct ath_softc *sc, struct ath_atx_tid *tid, | |||
| 66 | static struct ath_buf *ath_tx_setup_buffer(struct ath_softc *sc, | 66 | static struct ath_buf *ath_tx_setup_buffer(struct ath_softc *sc, |
| 67 | struct ath_txq *txq, | 67 | struct ath_txq *txq, |
| 68 | struct ath_atx_tid *tid, | 68 | struct ath_atx_tid *tid, |
| 69 | struct sk_buff *skb, | 69 | struct sk_buff *skb); |
| 70 | bool dequeue); | ||
| 71 | 70 | ||
| 72 | enum { | 71 | enum { |
| 73 | MCS_HT20, | 72 | MCS_HT20, |
| @@ -176,7 +175,15 @@ static void ath_tx_flush_tid(struct ath_softc *sc, struct ath_atx_tid *tid) | |||
| 176 | fi = get_frame_info(skb); | 175 | fi = get_frame_info(skb); |
| 177 | bf = fi->bf; | 176 | bf = fi->bf; |
| 178 | 177 | ||
| 179 | if (bf && fi->retries) { | 178 | if (!bf) { |
| 179 | bf = ath_tx_setup_buffer(sc, txq, tid, skb); | ||
| 180 | if (!bf) { | ||
| 181 | ieee80211_free_txskb(sc->hw, skb); | ||
| 182 | continue; | ||
| 183 | } | ||
| 184 | } | ||
| 185 | |||
| 186 | if (fi->retries) { | ||
| 180 | list_add_tail(&bf->list, &bf_head); | 187 | list_add_tail(&bf->list, &bf_head); |
| 181 | ath_tx_update_baw(sc, tid, bf->bf_state.seqno); | 188 | ath_tx_update_baw(sc, tid, bf->bf_state.seqno); |
| 182 | ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0); | 189 | ath_tx_complete_buf(sc, bf, txq, &bf_head, &ts, 0); |
| @@ -785,10 +792,13 @@ static enum ATH_AGGR_STATUS ath_tx_form_aggr(struct ath_softc *sc, | |||
| 785 | fi = get_frame_info(skb); | 792 | fi = get_frame_info(skb); |
| 786 | bf = fi->bf; | 793 | bf = fi->bf; |
| 787 | if (!fi->bf) | 794 | if (!fi->bf) |
| 788 | bf = ath_tx_setup_buffer(sc, txq, tid, skb, true); | 795 | bf = ath_tx_setup_buffer(sc, txq, tid, skb); |
| 789 | 796 | ||
| 790 | if (!bf) | 797 | if (!bf) { |
| 798 | __skb_unlink(skb, &tid->buf_q); | ||
| 799 | ieee80211_free_txskb(sc->hw, skb); | ||
| 791 | continue; | 800 | continue; |
| 801 | } | ||
| 792 | 802 | ||
| 793 | bf->bf_state.bf_type = BUF_AMPDU | BUF_AGGR; | 803 | bf->bf_state.bf_type = BUF_AMPDU | BUF_AGGR; |
| 794 | seqno = bf->bf_state.seqno; | 804 | seqno = bf->bf_state.seqno; |
| @@ -1731,9 +1741,11 @@ static void ath_tx_send_ampdu(struct ath_softc *sc, struct ath_atx_tid *tid, | |||
| 1731 | return; | 1741 | return; |
| 1732 | } | 1742 | } |
| 1733 | 1743 | ||
| 1734 | bf = ath_tx_setup_buffer(sc, txctl->txq, tid, skb, false); | 1744 | bf = ath_tx_setup_buffer(sc, txctl->txq, tid, skb); |
| 1735 | if (!bf) | 1745 | if (!bf) { |
| 1746 | ieee80211_free_txskb(sc->hw, skb); | ||
| 1736 | return; | 1747 | return; |
| 1748 | } | ||
| 1737 | 1749 | ||
| 1738 | bf->bf_state.bf_type = BUF_AMPDU; | 1750 | bf->bf_state.bf_type = BUF_AMPDU; |
| 1739 | INIT_LIST_HEAD(&bf_head); | 1751 | INIT_LIST_HEAD(&bf_head); |
| @@ -1757,11 +1769,6 @@ static void ath_tx_send_normal(struct ath_softc *sc, struct ath_txq *txq, | |||
| 1757 | struct ath_buf *bf; | 1769 | struct ath_buf *bf; |
| 1758 | 1770 | ||
| 1759 | bf = fi->bf; | 1771 | bf = fi->bf; |
| 1760 | if (!bf) | ||
| 1761 | bf = ath_tx_setup_buffer(sc, txq, tid, skb, false); | ||
| 1762 | |||
| 1763 | if (!bf) | ||
| 1764 | return; | ||
| 1765 | 1772 | ||
| 1766 | INIT_LIST_HEAD(&bf_head); | 1773 | INIT_LIST_HEAD(&bf_head); |
| 1767 | list_add_tail(&bf->list, &bf_head); | 1774 | list_add_tail(&bf->list, &bf_head); |
| @@ -1839,8 +1846,7 @@ u8 ath_txchainmask_reduction(struct ath_softc *sc, u8 chainmask, u32 rate) | |||
| 1839 | static struct ath_buf *ath_tx_setup_buffer(struct ath_softc *sc, | 1846 | static struct ath_buf *ath_tx_setup_buffer(struct ath_softc *sc, |
| 1840 | struct ath_txq *txq, | 1847 | struct ath_txq *txq, |
| 1841 | struct ath_atx_tid *tid, | 1848 | struct ath_atx_tid *tid, |
| 1842 | struct sk_buff *skb, | 1849 | struct sk_buff *skb) |
| 1843 | bool dequeue) | ||
| 1844 | { | 1850 | { |
| 1845 | struct ath_common *common = ath9k_hw_common(sc->sc_ah); | 1851 | struct ath_common *common = ath9k_hw_common(sc->sc_ah); |
| 1846 | struct ath_frame_info *fi = get_frame_info(skb); | 1852 | struct ath_frame_info *fi = get_frame_info(skb); |
| @@ -1852,7 +1858,7 @@ static struct ath_buf *ath_tx_setup_buffer(struct ath_softc *sc, | |||
| 1852 | bf = ath_tx_get_buffer(sc); | 1858 | bf = ath_tx_get_buffer(sc); |
| 1853 | if (!bf) { | 1859 | if (!bf) { |
| 1854 | ath_dbg(common, XMIT, "TX buffers are full\n"); | 1860 | ath_dbg(common, XMIT, "TX buffers are full\n"); |
| 1855 | goto error; | 1861 | return NULL; |
| 1856 | } | 1862 | } |
| 1857 | 1863 | ||
| 1858 | ATH_TXBUF_RESET(bf); | 1864 | ATH_TXBUF_RESET(bf); |
| @@ -1881,18 +1887,12 @@ static struct ath_buf *ath_tx_setup_buffer(struct ath_softc *sc, | |||
| 1881 | ath_err(ath9k_hw_common(sc->sc_ah), | 1887 | ath_err(ath9k_hw_common(sc->sc_ah), |
| 1882 | "dma_mapping_error() on TX\n"); | 1888 | "dma_mapping_error() on TX\n"); |
| 1883 | ath_tx_return_buffer(sc, bf); | 1889 | ath_tx_return_buffer(sc, bf); |
| 1884 | goto error; | 1890 | return NULL; |
| 1885 | } | 1891 | } |
| 1886 | 1892 | ||
| 1887 | fi->bf = bf; | 1893 | fi->bf = bf; |
| 1888 | 1894 | ||
| 1889 | return bf; | 1895 | return bf; |
| 1890 | |||
| 1891 | error: | ||
| 1892 | if (dequeue) | ||
| 1893 | __skb_unlink(skb, &tid->buf_q); | ||
| 1894 | dev_kfree_skb_any(skb); | ||
| 1895 | return NULL; | ||
| 1896 | } | 1896 | } |
| 1897 | 1897 | ||
| 1898 | /* FIXME: tx power */ | 1898 | /* FIXME: tx power */ |
| @@ -1921,9 +1921,14 @@ static void ath_tx_start_dma(struct ath_softc *sc, struct sk_buff *skb, | |||
| 1921 | */ | 1921 | */ |
| 1922 | ath_tx_send_ampdu(sc, tid, skb, txctl); | 1922 | ath_tx_send_ampdu(sc, tid, skb, txctl); |
| 1923 | } else { | 1923 | } else { |
| 1924 | bf = ath_tx_setup_buffer(sc, txctl->txq, tid, skb, false); | 1924 | bf = ath_tx_setup_buffer(sc, txctl->txq, tid, skb); |
| 1925 | if (!bf) | 1925 | if (!bf) { |
| 1926 | if (txctl->paprd) | ||
| 1927 | dev_kfree_skb_any(skb); | ||
| 1928 | else | ||
| 1929 | ieee80211_free_txskb(sc->hw, skb); | ||
| 1926 | return; | 1930 | return; |
| 1931 | } | ||
| 1927 | 1932 | ||
| 1928 | bf->bf_state.bfs_paprd = txctl->paprd; | 1933 | bf->bf_state.bfs_paprd = txctl->paprd; |
| 1929 | 1934 | ||
diff --git a/drivers/net/wireless/ath/carl9170/carl9170.h b/drivers/net/wireless/ath/carl9170/carl9170.h index 2aa4a59c72c8..2df17f1e49ef 100644 --- a/drivers/net/wireless/ath/carl9170/carl9170.h +++ b/drivers/net/wireless/ath/carl9170/carl9170.h | |||
| @@ -303,6 +303,7 @@ struct ar9170 { | |||
| 303 | unsigned long queue_stop_timeout[__AR9170_NUM_TXQ]; | 303 | unsigned long queue_stop_timeout[__AR9170_NUM_TXQ]; |
| 304 | unsigned long max_queue_stop_timeout[__AR9170_NUM_TXQ]; | 304 | unsigned long max_queue_stop_timeout[__AR9170_NUM_TXQ]; |
| 305 | bool needs_full_reset; | 305 | bool needs_full_reset; |
| 306 | bool force_usb_reset; | ||
| 306 | atomic_t pending_restarts; | 307 | atomic_t pending_restarts; |
| 307 | 308 | ||
| 308 | /* interface mode settings */ | 309 | /* interface mode settings */ |
diff --git a/drivers/net/wireless/ath/carl9170/main.c b/drivers/net/wireless/ath/carl9170/main.c index 67997b39aba7..25a1e2f4f738 100644 --- a/drivers/net/wireless/ath/carl9170/main.c +++ b/drivers/net/wireless/ath/carl9170/main.c | |||
| @@ -465,27 +465,26 @@ static void carl9170_restart_work(struct work_struct *work) | |||
| 465 | { | 465 | { |
| 466 | struct ar9170 *ar = container_of(work, struct ar9170, | 466 | struct ar9170 *ar = container_of(work, struct ar9170, |
| 467 | restart_work); | 467 | restart_work); |
| 468 | int err; | 468 | int err = -EIO; |
| 469 | 469 | ||
| 470 | ar->usedkeys = 0; | 470 | ar->usedkeys = 0; |
| 471 | ar->filter_state = 0; | 471 | ar->filter_state = 0; |
| 472 | carl9170_cancel_worker(ar); | 472 | carl9170_cancel_worker(ar); |
| 473 | 473 | ||
| 474 | mutex_lock(&ar->mutex); | 474 | mutex_lock(&ar->mutex); |
| 475 | err = carl9170_usb_restart(ar); | 475 | if (!ar->force_usb_reset) { |
| 476 | if (net_ratelimit()) { | 476 | err = carl9170_usb_restart(ar); |
| 477 | if (err) { | 477 | if (net_ratelimit()) { |
| 478 | dev_err(&ar->udev->dev, "Failed to restart device " | 478 | if (err) |
| 479 | " (%d).\n", err); | 479 | dev_err(&ar->udev->dev, "Failed to restart device (%d).\n", err); |
| 480 | } else { | 480 | else |
| 481 | dev_info(&ar->udev->dev, "device restarted " | 481 | dev_info(&ar->udev->dev, "device restarted successfully.\n"); |
| 482 | "successfully.\n"); | ||
| 483 | } | 482 | } |
| 484 | } | 483 | } |
| 485 | |||
| 486 | carl9170_zap_queues(ar); | 484 | carl9170_zap_queues(ar); |
| 487 | mutex_unlock(&ar->mutex); | 485 | mutex_unlock(&ar->mutex); |
| 488 | if (!err) { | 486 | |
| 487 | if (!err && !ar->force_usb_reset) { | ||
| 489 | ar->restart_counter++; | 488 | ar->restart_counter++; |
| 490 | atomic_set(&ar->pending_restarts, 0); | 489 | atomic_set(&ar->pending_restarts, 0); |
| 491 | 490 | ||
| @@ -526,10 +525,10 @@ void carl9170_restart(struct ar9170 *ar, const enum carl9170_restart_reasons r) | |||
| 526 | if (!ar->registered) | 525 | if (!ar->registered) |
| 527 | return; | 526 | return; |
| 528 | 527 | ||
| 529 | if (IS_ACCEPTING_CMD(ar) && !ar->needs_full_reset) | 528 | if (!IS_ACCEPTING_CMD(ar) || ar->needs_full_reset) |
| 530 | ieee80211_queue_work(ar->hw, &ar->restart_work); | 529 | ar->force_usb_reset = true; |
| 531 | else | 530 | |
| 532 | carl9170_usb_reset(ar); | 531 | ieee80211_queue_work(ar->hw, &ar->restart_work); |
| 533 | 532 | ||
| 534 | /* | 533 | /* |
| 535 | * At this point, the device instance might have vanished/disabled. | 534 | * At this point, the device instance might have vanished/disabled. |
diff --git a/drivers/net/wireless/mwifiex/cfg80211.c b/drivers/net/wireless/mwifiex/cfg80211.c index 2691620393ea..0679458a1bac 100644 --- a/drivers/net/wireless/mwifiex/cfg80211.c +++ b/drivers/net/wireless/mwifiex/cfg80211.c | |||
| @@ -1596,8 +1596,9 @@ done: | |||
| 1596 | } | 1596 | } |
| 1597 | } | 1597 | } |
| 1598 | 1598 | ||
| 1599 | if (mwifiex_bss_start(priv, bss, &req_ssid)) | 1599 | ret = mwifiex_bss_start(priv, bss, &req_ssid); |
| 1600 | return -EFAULT; | 1600 | if (ret) |
| 1601 | return ret; | ||
| 1601 | 1602 | ||
| 1602 | if (mode == NL80211_IFTYPE_ADHOC) { | 1603 | if (mode == NL80211_IFTYPE_ADHOC) { |
| 1603 | /* Inform the BSS information to kernel, otherwise | 1604 | /* Inform the BSS information to kernel, otherwise |
| @@ -1652,9 +1653,19 @@ done: | |||
| 1652 | "info: association to bssid %pM failed\n", | 1653 | "info: association to bssid %pM failed\n", |
| 1653 | priv->cfg_bssid); | 1654 | priv->cfg_bssid); |
| 1654 | memset(priv->cfg_bssid, 0, ETH_ALEN); | 1655 | memset(priv->cfg_bssid, 0, ETH_ALEN); |
| 1656 | |||
| 1657 | if (ret > 0) | ||
| 1658 | cfg80211_connect_result(priv->netdev, priv->cfg_bssid, | ||
| 1659 | NULL, 0, NULL, 0, ret, | ||
| 1660 | GFP_KERNEL); | ||
| 1661 | else | ||
| 1662 | cfg80211_connect_result(priv->netdev, priv->cfg_bssid, | ||
| 1663 | NULL, 0, NULL, 0, | ||
| 1664 | WLAN_STATUS_UNSPECIFIED_FAILURE, | ||
| 1665 | GFP_KERNEL); | ||
| 1655 | } | 1666 | } |
| 1656 | 1667 | ||
| 1657 | return ret; | 1668 | return 0; |
| 1658 | } | 1669 | } |
| 1659 | 1670 | ||
| 1660 | /* | 1671 | /* |
| @@ -1802,7 +1813,7 @@ mwifiex_cfg80211_scan(struct wiphy *wiphy, | |||
| 1802 | { | 1813 | { |
| 1803 | struct net_device *dev = request->wdev->netdev; | 1814 | struct net_device *dev = request->wdev->netdev; |
| 1804 | struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); | 1815 | struct mwifiex_private *priv = mwifiex_netdev_get_priv(dev); |
| 1805 | int i, offset; | 1816 | int i, offset, ret; |
| 1806 | struct ieee80211_channel *chan; | 1817 | struct ieee80211_channel *chan; |
| 1807 | struct ieee_types_header *ie; | 1818 | struct ieee_types_header *ie; |
| 1808 | 1819 | ||
| @@ -1855,8 +1866,12 @@ mwifiex_cfg80211_scan(struct wiphy *wiphy, | |||
| 1855 | 1866 | ||
| 1856 | priv->user_scan_cfg->chan_list[i].scan_time = 0; | 1867 | priv->user_scan_cfg->chan_list[i].scan_time = 0; |
| 1857 | } | 1868 | } |
| 1858 | if (mwifiex_scan_networks(priv, priv->user_scan_cfg)) | 1869 | |
| 1859 | return -EFAULT; | 1870 | ret = mwifiex_scan_networks(priv, priv->user_scan_cfg); |
| 1871 | if (ret) { | ||
| 1872 | dev_err(priv->adapter->dev, "scan failed: %d\n", ret); | ||
| 1873 | return ret; | ||
| 1874 | } | ||
| 1860 | 1875 | ||
| 1861 | if (request->ie && request->ie_len) { | 1876 | if (request->ie && request->ie_len) { |
| 1862 | for (i = 0; i < MWIFIEX_MAX_VSIE_NUM; i++) { | 1877 | for (i = 0; i < MWIFIEX_MAX_VSIE_NUM; i++) { |
diff --git a/drivers/net/wireless/mwifiex/join.c b/drivers/net/wireless/mwifiex/join.c index 82e63cee1e97..7b0858af8f5d 100644 --- a/drivers/net/wireless/mwifiex/join.c +++ b/drivers/net/wireless/mwifiex/join.c | |||
| @@ -1180,16 +1180,18 @@ int mwifiex_ret_802_11_ad_hoc(struct mwifiex_private *priv, | |||
| 1180 | struct mwifiex_adapter *adapter = priv->adapter; | 1180 | struct mwifiex_adapter *adapter = priv->adapter; |
| 1181 | struct host_cmd_ds_802_11_ad_hoc_result *adhoc_result; | 1181 | struct host_cmd_ds_802_11_ad_hoc_result *adhoc_result; |
| 1182 | struct mwifiex_bssdescriptor *bss_desc; | 1182 | struct mwifiex_bssdescriptor *bss_desc; |
| 1183 | u16 reason_code; | ||
| 1183 | 1184 | ||
| 1184 | adhoc_result = &resp->params.adhoc_result; | 1185 | adhoc_result = &resp->params.adhoc_result; |
| 1185 | 1186 | ||
| 1186 | bss_desc = priv->attempted_bss_desc; | 1187 | bss_desc = priv->attempted_bss_desc; |
| 1187 | 1188 | ||
| 1188 | /* Join result code 0 --> SUCCESS */ | 1189 | /* Join result code 0 --> SUCCESS */ |
| 1189 | if (le16_to_cpu(resp->result)) { | 1190 | reason_code = le16_to_cpu(resp->result); |
| 1191 | if (reason_code) { | ||
| 1190 | dev_err(priv->adapter->dev, "ADHOC_RESP: failed\n"); | 1192 | dev_err(priv->adapter->dev, "ADHOC_RESP: failed\n"); |
| 1191 | if (priv->media_connected) | 1193 | if (priv->media_connected) |
| 1192 | mwifiex_reset_connect_state(priv); | 1194 | mwifiex_reset_connect_state(priv, reason_code); |
| 1193 | 1195 | ||
| 1194 | memset(&priv->curr_bss_params.bss_descriptor, | 1196 | memset(&priv->curr_bss_params.bss_descriptor, |
| 1195 | 0x00, sizeof(struct mwifiex_bssdescriptor)); | 1197 | 0x00, sizeof(struct mwifiex_bssdescriptor)); |
diff --git a/drivers/net/wireless/mwifiex/main.h b/drivers/net/wireless/mwifiex/main.h index bfb3fa69805c..c2d0ab146af5 100644 --- a/drivers/net/wireless/mwifiex/main.h +++ b/drivers/net/wireless/mwifiex/main.h | |||
| @@ -847,7 +847,7 @@ int mwifiex_cmd_802_11_associate(struct mwifiex_private *priv, | |||
| 847 | struct mwifiex_bssdescriptor *bss_desc); | 847 | struct mwifiex_bssdescriptor *bss_desc); |
| 848 | int mwifiex_ret_802_11_associate(struct mwifiex_private *priv, | 848 | int mwifiex_ret_802_11_associate(struct mwifiex_private *priv, |
| 849 | struct host_cmd_ds_command *resp); | 849 | struct host_cmd_ds_command *resp); |
| 850 | void mwifiex_reset_connect_state(struct mwifiex_private *priv); | 850 | void mwifiex_reset_connect_state(struct mwifiex_private *priv, u16 reason); |
| 851 | u8 mwifiex_band_to_radio_type(u8 band); | 851 | u8 mwifiex_band_to_radio_type(u8 band); |
| 852 | int mwifiex_deauthenticate(struct mwifiex_private *priv, u8 *mac); | 852 | int mwifiex_deauthenticate(struct mwifiex_private *priv, u8 *mac); |
| 853 | int mwifiex_adhoc_start(struct mwifiex_private *priv, | 853 | int mwifiex_adhoc_start(struct mwifiex_private *priv, |
diff --git a/drivers/net/wireless/mwifiex/scan.c b/drivers/net/wireless/mwifiex/scan.c index e36a75988f87..00b658d3b6ec 100644 --- a/drivers/net/wireless/mwifiex/scan.c +++ b/drivers/net/wireless/mwifiex/scan.c | |||
| @@ -1296,7 +1296,7 @@ mwifiex_radio_type_to_band(u8 radio_type) | |||
| 1296 | int mwifiex_scan_networks(struct mwifiex_private *priv, | 1296 | int mwifiex_scan_networks(struct mwifiex_private *priv, |
| 1297 | const struct mwifiex_user_scan_cfg *user_scan_in) | 1297 | const struct mwifiex_user_scan_cfg *user_scan_in) |
| 1298 | { | 1298 | { |
| 1299 | int ret = 0; | 1299 | int ret; |
| 1300 | struct mwifiex_adapter *adapter = priv->adapter; | 1300 | struct mwifiex_adapter *adapter = priv->adapter; |
| 1301 | struct cmd_ctrl_node *cmd_node; | 1301 | struct cmd_ctrl_node *cmd_node; |
| 1302 | union mwifiex_scan_cmd_config_tlv *scan_cfg_out; | 1302 | union mwifiex_scan_cmd_config_tlv *scan_cfg_out; |
| @@ -1309,25 +1309,26 @@ int mwifiex_scan_networks(struct mwifiex_private *priv, | |||
| 1309 | unsigned long flags; | 1309 | unsigned long flags; |
| 1310 | 1310 | ||
| 1311 | if (adapter->scan_processing) { | 1311 | if (adapter->scan_processing) { |
| 1312 | dev_dbg(adapter->dev, "cmd: Scan already in process...\n"); | 1312 | dev_err(adapter->dev, "cmd: Scan already in process...\n"); |
| 1313 | return ret; | 1313 | return -EBUSY; |
| 1314 | } | 1314 | } |
| 1315 | 1315 | ||
| 1316 | spin_lock_irqsave(&adapter->mwifiex_cmd_lock, flags); | ||
| 1317 | adapter->scan_processing = true; | ||
| 1318 | spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, flags); | ||
| 1319 | |||
| 1320 | if (priv->scan_block) { | 1316 | if (priv->scan_block) { |
| 1321 | dev_dbg(adapter->dev, | 1317 | dev_err(adapter->dev, |
| 1322 | "cmd: Scan is blocked during association...\n"); | 1318 | "cmd: Scan is blocked during association...\n"); |
| 1323 | return ret; | 1319 | return -EBUSY; |
| 1324 | } | 1320 | } |
| 1325 | 1321 | ||
| 1322 | spin_lock_irqsave(&adapter->mwifiex_cmd_lock, flags); | ||
| 1323 | adapter->scan_processing = true; | ||
| 1324 | spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, flags); | ||
| 1325 | |||
| 1326 | scan_cfg_out = kzalloc(sizeof(union mwifiex_scan_cmd_config_tlv), | 1326 | scan_cfg_out = kzalloc(sizeof(union mwifiex_scan_cmd_config_tlv), |
| 1327 | GFP_KERNEL); | 1327 | GFP_KERNEL); |
| 1328 | if (!scan_cfg_out) { | 1328 | if (!scan_cfg_out) { |
| 1329 | dev_err(adapter->dev, "failed to alloc scan_cfg_out\n"); | 1329 | dev_err(adapter->dev, "failed to alloc scan_cfg_out\n"); |
| 1330 | return -ENOMEM; | 1330 | ret = -ENOMEM; |
| 1331 | goto done; | ||
| 1331 | } | 1332 | } |
| 1332 | 1333 | ||
| 1333 | buf_size = sizeof(struct mwifiex_chan_scan_param_set) * | 1334 | buf_size = sizeof(struct mwifiex_chan_scan_param_set) * |
| @@ -1336,7 +1337,8 @@ int mwifiex_scan_networks(struct mwifiex_private *priv, | |||
| 1336 | if (!scan_chan_list) { | 1337 | if (!scan_chan_list) { |
| 1337 | dev_err(adapter->dev, "failed to alloc scan_chan_list\n"); | 1338 | dev_err(adapter->dev, "failed to alloc scan_chan_list\n"); |
| 1338 | kfree(scan_cfg_out); | 1339 | kfree(scan_cfg_out); |
| 1339 | return -ENOMEM; | 1340 | ret = -ENOMEM; |
| 1341 | goto done; | ||
| 1340 | } | 1342 | } |
| 1341 | 1343 | ||
| 1342 | mwifiex_config_scan(priv, user_scan_in, &scan_cfg_out->config, | 1344 | mwifiex_config_scan(priv, user_scan_in, &scan_cfg_out->config, |
| @@ -1364,14 +1366,16 @@ int mwifiex_scan_networks(struct mwifiex_private *priv, | |||
| 1364 | spin_unlock_irqrestore(&adapter->scan_pending_q_lock, | 1366 | spin_unlock_irqrestore(&adapter->scan_pending_q_lock, |
| 1365 | flags); | 1367 | flags); |
| 1366 | } | 1368 | } |
| 1367 | } else { | ||
| 1368 | spin_lock_irqsave(&adapter->mwifiex_cmd_lock, flags); | ||
| 1369 | adapter->scan_processing = true; | ||
| 1370 | spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, flags); | ||
| 1371 | } | 1369 | } |
| 1372 | 1370 | ||
| 1373 | kfree(scan_cfg_out); | 1371 | kfree(scan_cfg_out); |
| 1374 | kfree(scan_chan_list); | 1372 | kfree(scan_chan_list); |
| 1373 | done: | ||
| 1374 | if (ret) { | ||
| 1375 | spin_lock_irqsave(&adapter->mwifiex_cmd_lock, flags); | ||
| 1376 | adapter->scan_processing = false; | ||
| 1377 | spin_unlock_irqrestore(&adapter->mwifiex_cmd_lock, flags); | ||
| 1378 | } | ||
| 1375 | return ret; | 1379 | return ret; |
| 1376 | } | 1380 | } |
| 1377 | 1381 | ||
| @@ -1430,8 +1434,8 @@ int mwifiex_check_network_compatibility(struct mwifiex_private *priv, | |||
| 1430 | ret = mwifiex_is_network_compatible(priv, bss_desc, | 1434 | ret = mwifiex_is_network_compatible(priv, bss_desc, |
| 1431 | priv->bss_mode); | 1435 | priv->bss_mode); |
| 1432 | if (ret) | 1436 | if (ret) |
| 1433 | dev_err(priv->adapter->dev, "cannot find ssid " | 1437 | dev_err(priv->adapter->dev, |
| 1434 | "%s\n", bss_desc->ssid.ssid); | 1438 | "Incompatible network settings\n"); |
| 1435 | break; | 1439 | break; |
| 1436 | default: | 1440 | default: |
| 1437 | ret = 0; | 1441 | ret = 0; |
diff --git a/drivers/net/wireless/mwifiex/sta_cmdresp.c b/drivers/net/wireless/mwifiex/sta_cmdresp.c index e380171c4c5d..09e6a267f566 100644 --- a/drivers/net/wireless/mwifiex/sta_cmdresp.c +++ b/drivers/net/wireless/mwifiex/sta_cmdresp.c | |||
| @@ -545,7 +545,7 @@ static int mwifiex_ret_802_11_deauthenticate(struct mwifiex_private *priv, | |||
| 545 | if (!memcmp(resp->params.deauth.mac_addr, | 545 | if (!memcmp(resp->params.deauth.mac_addr, |
| 546 | &priv->curr_bss_params.bss_descriptor.mac_address, | 546 | &priv->curr_bss_params.bss_descriptor.mac_address, |
| 547 | sizeof(resp->params.deauth.mac_addr))) | 547 | sizeof(resp->params.deauth.mac_addr))) |
| 548 | mwifiex_reset_connect_state(priv); | 548 | mwifiex_reset_connect_state(priv, WLAN_REASON_DEAUTH_LEAVING); |
| 549 | 549 | ||
| 550 | return 0; | 550 | return 0; |
| 551 | } | 551 | } |
| @@ -558,7 +558,7 @@ static int mwifiex_ret_802_11_deauthenticate(struct mwifiex_private *priv, | |||
| 558 | static int mwifiex_ret_802_11_ad_hoc_stop(struct mwifiex_private *priv, | 558 | static int mwifiex_ret_802_11_ad_hoc_stop(struct mwifiex_private *priv, |
| 559 | struct host_cmd_ds_command *resp) | 559 | struct host_cmd_ds_command *resp) |
| 560 | { | 560 | { |
| 561 | mwifiex_reset_connect_state(priv); | 561 | mwifiex_reset_connect_state(priv, WLAN_REASON_DEAUTH_LEAVING); |
| 562 | return 0; | 562 | return 0; |
| 563 | } | 563 | } |
| 564 | 564 | ||
diff --git a/drivers/net/wireless/mwifiex/sta_event.c b/drivers/net/wireless/mwifiex/sta_event.c index aafde30e714a..8132119e1a21 100644 --- a/drivers/net/wireless/mwifiex/sta_event.c +++ b/drivers/net/wireless/mwifiex/sta_event.c | |||
| @@ -41,7 +41,7 @@ | |||
| 41 | * - Sends a disconnect event to upper layers/applications. | 41 | * - Sends a disconnect event to upper layers/applications. |
| 42 | */ | 42 | */ |
| 43 | void | 43 | void |
| 44 | mwifiex_reset_connect_state(struct mwifiex_private *priv) | 44 | mwifiex_reset_connect_state(struct mwifiex_private *priv, u16 reason_code) |
| 45 | { | 45 | { |
| 46 | struct mwifiex_adapter *adapter = priv->adapter; | 46 | struct mwifiex_adapter *adapter = priv->adapter; |
| 47 | 47 | ||
| @@ -117,10 +117,10 @@ mwifiex_reset_connect_state(struct mwifiex_private *priv) | |||
| 117 | priv->media_connected = false; | 117 | priv->media_connected = false; |
| 118 | dev_dbg(adapter->dev, | 118 | dev_dbg(adapter->dev, |
| 119 | "info: successfully disconnected from %pM: reason code %d\n", | 119 | "info: successfully disconnected from %pM: reason code %d\n", |
| 120 | priv->cfg_bssid, WLAN_REASON_DEAUTH_LEAVING); | 120 | priv->cfg_bssid, reason_code); |
| 121 | if (priv->bss_mode == NL80211_IFTYPE_STATION) { | 121 | if (priv->bss_mode == NL80211_IFTYPE_STATION) { |
| 122 | cfg80211_disconnected(priv->netdev, WLAN_REASON_DEAUTH_LEAVING, | 122 | cfg80211_disconnected(priv->netdev, reason_code, NULL, 0, |
| 123 | NULL, 0, GFP_KERNEL); | 123 | GFP_KERNEL); |
| 124 | } | 124 | } |
| 125 | memset(priv->cfg_bssid, 0, ETH_ALEN); | 125 | memset(priv->cfg_bssid, 0, ETH_ALEN); |
| 126 | 126 | ||
| @@ -186,7 +186,7 @@ int mwifiex_process_sta_event(struct mwifiex_private *priv) | |||
| 186 | struct mwifiex_adapter *adapter = priv->adapter; | 186 | struct mwifiex_adapter *adapter = priv->adapter; |
| 187 | int ret = 0; | 187 | int ret = 0; |
| 188 | u32 eventcause = adapter->event_cause; | 188 | u32 eventcause = adapter->event_cause; |
| 189 | u16 ctrl; | 189 | u16 ctrl, reason_code; |
| 190 | 190 | ||
| 191 | switch (eventcause) { | 191 | switch (eventcause) { |
| 192 | case EVENT_DUMMY_HOST_WAKEUP_SIGNAL: | 192 | case EVENT_DUMMY_HOST_WAKEUP_SIGNAL: |
| @@ -204,22 +204,31 @@ int mwifiex_process_sta_event(struct mwifiex_private *priv) | |||
| 204 | case EVENT_DEAUTHENTICATED: | 204 | case EVENT_DEAUTHENTICATED: |
| 205 | dev_dbg(adapter->dev, "event: Deauthenticated\n"); | 205 | dev_dbg(adapter->dev, "event: Deauthenticated\n"); |
| 206 | adapter->dbg.num_event_deauth++; | 206 | adapter->dbg.num_event_deauth++; |
| 207 | if (priv->media_connected) | 207 | if (priv->media_connected) { |
| 208 | mwifiex_reset_connect_state(priv); | 208 | reason_code = |
| 209 | le16_to_cpu(*(__le16 *)adapter->event_body); | ||
| 210 | mwifiex_reset_connect_state(priv, reason_code); | ||
| 211 | } | ||
| 209 | break; | 212 | break; |
| 210 | 213 | ||
| 211 | case EVENT_DISASSOCIATED: | 214 | case EVENT_DISASSOCIATED: |
| 212 | dev_dbg(adapter->dev, "event: Disassociated\n"); | 215 | dev_dbg(adapter->dev, "event: Disassociated\n"); |
| 213 | adapter->dbg.num_event_disassoc++; | 216 | adapter->dbg.num_event_disassoc++; |
| 214 | if (priv->media_connected) | 217 | if (priv->media_connected) { |
| 215 | mwifiex_reset_connect_state(priv); | 218 | reason_code = |
| 219 | le16_to_cpu(*(__le16 *)adapter->event_body); | ||
| 220 | mwifiex_reset_connect_state(priv, reason_code); | ||
| 221 | } | ||
| 216 | break; | 222 | break; |
| 217 | 223 | ||
| 218 | case EVENT_LINK_LOST: | 224 | case EVENT_LINK_LOST: |
| 219 | dev_dbg(adapter->dev, "event: Link lost\n"); | 225 | dev_dbg(adapter->dev, "event: Link lost\n"); |
| 220 | adapter->dbg.num_event_link_lost++; | 226 | adapter->dbg.num_event_link_lost++; |
| 221 | if (priv->media_connected) | 227 | if (priv->media_connected) { |
| 222 | mwifiex_reset_connect_state(priv); | 228 | reason_code = |
| 229 | le16_to_cpu(*(__le16 *)adapter->event_body); | ||
| 230 | mwifiex_reset_connect_state(priv, reason_code); | ||
| 231 | } | ||
| 223 | break; | 232 | break; |
| 224 | 233 | ||
| 225 | case EVENT_PS_SLEEP: | 234 | case EVENT_PS_SLEEP: |
diff --git a/drivers/net/wireless/rt2x00/rt2800lib.c b/drivers/net/wireless/rt2x00/rt2800lib.c index 540c94f8505a..01dc8891070c 100644 --- a/drivers/net/wireless/rt2x00/rt2800lib.c +++ b/drivers/net/wireless/rt2x00/rt2800lib.c | |||
| @@ -2252,9 +2252,9 @@ static void rt2800_config_channel(struct rt2x00_dev *rt2x00dev, | |||
| 2252 | */ | 2252 | */ |
| 2253 | if (rt2x00_rt(rt2x00dev, RT3352)) { | 2253 | if (rt2x00_rt(rt2x00dev, RT3352)) { |
| 2254 | rt2800_bbp_write(rt2x00dev, 27, 0x0); | 2254 | rt2800_bbp_write(rt2x00dev, 27, 0x0); |
| 2255 | rt2800_bbp_write(rt2x00dev, 62, 0x26 + rt2x00dev->lna_gain); | 2255 | rt2800_bbp_write(rt2x00dev, 66, 0x26 + rt2x00dev->lna_gain); |
| 2256 | rt2800_bbp_write(rt2x00dev, 27, 0x20); | 2256 | rt2800_bbp_write(rt2x00dev, 27, 0x20); |
| 2257 | rt2800_bbp_write(rt2x00dev, 62, 0x26 + rt2x00dev->lna_gain); | 2257 | rt2800_bbp_write(rt2x00dev, 66, 0x26 + rt2x00dev->lna_gain); |
| 2258 | } else { | 2258 | } else { |
| 2259 | rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain); | 2259 | rt2800_bbp_write(rt2x00dev, 62, 0x37 - rt2x00dev->lna_gain); |
| 2260 | rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain); | 2260 | rt2800_bbp_write(rt2x00dev, 63, 0x37 - rt2x00dev->lna_gain); |
diff --git a/drivers/net/xen-netback/netback.c b/drivers/net/xen-netback/netback.c index 4ebfcf3d8a3b..f2d6b78d901d 100644 --- a/drivers/net/xen-netback/netback.c +++ b/drivers/net/xen-netback/netback.c | |||
| @@ -335,21 +335,35 @@ unsigned int xen_netbk_count_skb_slots(struct xenvif *vif, struct sk_buff *skb) | |||
| 335 | 335 | ||
| 336 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { | 336 | for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { |
| 337 | unsigned long size = skb_frag_size(&skb_shinfo(skb)->frags[i]); | 337 | unsigned long size = skb_frag_size(&skb_shinfo(skb)->frags[i]); |
| 338 | unsigned long offset = skb_shinfo(skb)->frags[i].page_offset; | ||
| 338 | unsigned long bytes; | 339 | unsigned long bytes; |
| 340 | |||
| 341 | offset &= ~PAGE_MASK; | ||
| 342 | |||
| 339 | while (size > 0) { | 343 | while (size > 0) { |
| 344 | BUG_ON(offset >= PAGE_SIZE); | ||
| 340 | BUG_ON(copy_off > MAX_BUFFER_OFFSET); | 345 | BUG_ON(copy_off > MAX_BUFFER_OFFSET); |
| 341 | 346 | ||
| 342 | if (start_new_rx_buffer(copy_off, size, 0)) { | 347 | bytes = PAGE_SIZE - offset; |
| 348 | |||
| 349 | if (bytes > size) | ||
| 350 | bytes = size; | ||
| 351 | |||
| 352 | if (start_new_rx_buffer(copy_off, bytes, 0)) { | ||
| 343 | count++; | 353 | count++; |
| 344 | copy_off = 0; | 354 | copy_off = 0; |
| 345 | } | 355 | } |
| 346 | 356 | ||
| 347 | bytes = size; | ||
| 348 | if (copy_off + bytes > MAX_BUFFER_OFFSET) | 357 | if (copy_off + bytes > MAX_BUFFER_OFFSET) |
| 349 | bytes = MAX_BUFFER_OFFSET - copy_off; | 358 | bytes = MAX_BUFFER_OFFSET - copy_off; |
| 350 | 359 | ||
| 351 | copy_off += bytes; | 360 | copy_off += bytes; |
| 361 | |||
| 362 | offset += bytes; | ||
| 352 | size -= bytes; | 363 | size -= bytes; |
| 364 | |||
| 365 | if (offset == PAGE_SIZE) | ||
| 366 | offset = 0; | ||
| 353 | } | 367 | } |
| 354 | } | 368 | } |
| 355 | return count; | 369 | return count; |
| @@ -403,14 +417,24 @@ static void netbk_gop_frag_copy(struct xenvif *vif, struct sk_buff *skb, | |||
| 403 | unsigned long bytes; | 417 | unsigned long bytes; |
| 404 | 418 | ||
| 405 | /* Data must not cross a page boundary. */ | 419 | /* Data must not cross a page boundary. */ |
| 406 | BUG_ON(size + offset > PAGE_SIZE); | 420 | BUG_ON(size + offset > PAGE_SIZE<<compound_order(page)); |
| 407 | 421 | ||
| 408 | meta = npo->meta + npo->meta_prod - 1; | 422 | meta = npo->meta + npo->meta_prod - 1; |
| 409 | 423 | ||
| 424 | /* Skip unused frames from start of page */ | ||
| 425 | page += offset >> PAGE_SHIFT; | ||
| 426 | offset &= ~PAGE_MASK; | ||
| 427 | |||
| 410 | while (size > 0) { | 428 | while (size > 0) { |
| 429 | BUG_ON(offset >= PAGE_SIZE); | ||
| 411 | BUG_ON(npo->copy_off > MAX_BUFFER_OFFSET); | 430 | BUG_ON(npo->copy_off > MAX_BUFFER_OFFSET); |
| 412 | 431 | ||
| 413 | if (start_new_rx_buffer(npo->copy_off, size, *head)) { | 432 | bytes = PAGE_SIZE - offset; |
| 433 | |||
| 434 | if (bytes > size) | ||
| 435 | bytes = size; | ||
| 436 | |||
| 437 | if (start_new_rx_buffer(npo->copy_off, bytes, *head)) { | ||
| 414 | /* | 438 | /* |
| 415 | * Netfront requires there to be some data in the head | 439 | * Netfront requires there to be some data in the head |
| 416 | * buffer. | 440 | * buffer. |
| @@ -420,7 +444,6 @@ static void netbk_gop_frag_copy(struct xenvif *vif, struct sk_buff *skb, | |||
| 420 | meta = get_next_rx_buffer(vif, npo); | 444 | meta = get_next_rx_buffer(vif, npo); |
| 421 | } | 445 | } |
| 422 | 446 | ||
| 423 | bytes = size; | ||
| 424 | if (npo->copy_off + bytes > MAX_BUFFER_OFFSET) | 447 | if (npo->copy_off + bytes > MAX_BUFFER_OFFSET) |
| 425 | bytes = MAX_BUFFER_OFFSET - npo->copy_off; | 448 | bytes = MAX_BUFFER_OFFSET - npo->copy_off; |
| 426 | 449 | ||
| @@ -453,6 +476,13 @@ static void netbk_gop_frag_copy(struct xenvif *vif, struct sk_buff *skb, | |||
| 453 | offset += bytes; | 476 | offset += bytes; |
| 454 | size -= bytes; | 477 | size -= bytes; |
| 455 | 478 | ||
| 479 | /* Next frame */ | ||
| 480 | if (offset == PAGE_SIZE && size) { | ||
| 481 | BUG_ON(!PageCompound(page)); | ||
| 482 | page++; | ||
| 483 | offset = 0; | ||
| 484 | } | ||
| 485 | |||
| 456 | /* Leave a gap for the GSO descriptor. */ | 486 | /* Leave a gap for the GSO descriptor. */ |
| 457 | if (*head && skb_shinfo(skb)->gso_size && !vif->gso_prefix) | 487 | if (*head && skb_shinfo(skb)->gso_size && !vif->gso_prefix) |
| 458 | vif->rx.req_cons++; | 488 | vif->rx.req_cons++; |
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index 36f2be4def2f..981f2132d128 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c | |||
| @@ -1551,6 +1551,9 @@ static const struct usb_device_id acm_ids[] = { | |||
| 1551 | Maybe we should define a new | 1551 | Maybe we should define a new |
| 1552 | quirk for this. */ | 1552 | quirk for this. */ |
| 1553 | }, | 1553 | }, |
| 1554 | { USB_DEVICE(0x0572, 0x1340), /* Conexant CX93010-2x UCMxx */ | ||
| 1555 | .driver_info = NO_UNION_NORMAL, | ||
| 1556 | }, | ||
| 1554 | { USB_DEVICE(0x1bbb, 0x0003), /* Alcatel OT-I650 */ | 1557 | { USB_DEVICE(0x1bbb, 0x0003), /* Alcatel OT-I650 */ |
| 1555 | .driver_info = NO_UNION_NORMAL, /* reports zero length descriptor */ | 1558 | .driver_info = NO_UNION_NORMAL, /* reports zero length descriptor */ |
| 1556 | }, | 1559 | }, |
diff --git a/include/linux/can/Kbuild b/include/linux/can/Kbuild index c62b7f1728f9..e69de29bb2d1 100644 --- a/include/linux/can/Kbuild +++ b/include/linux/can/Kbuild | |||
| @@ -1,5 +0,0 @@ | |||
| 1 | header-y += raw.h | ||
| 2 | header-y += bcm.h | ||
| 3 | header-y += gw.h | ||
| 4 | header-y += error.h | ||
| 5 | header-y += netlink.h | ||
diff --git a/include/linux/if_link.h b/include/linux/if_link.h index e4dad4ddf085..3265f332998a 100644 --- a/include/linux/if_link.h +++ b/include/linux/if_link.h | |||
| @@ -284,10 +284,16 @@ enum { | |||
| 284 | IFLA_VXLAN_LEARNING, | 284 | IFLA_VXLAN_LEARNING, |
| 285 | IFLA_VXLAN_AGEING, | 285 | IFLA_VXLAN_AGEING, |
| 286 | IFLA_VXLAN_LIMIT, | 286 | IFLA_VXLAN_LIMIT, |
| 287 | IFLA_VXLAN_PORT_RANGE, | ||
| 287 | __IFLA_VXLAN_MAX | 288 | __IFLA_VXLAN_MAX |
| 288 | }; | 289 | }; |
| 289 | #define IFLA_VXLAN_MAX (__IFLA_VXLAN_MAX - 1) | 290 | #define IFLA_VXLAN_MAX (__IFLA_VXLAN_MAX - 1) |
| 290 | 291 | ||
| 292 | struct ifla_vxlan_port_range { | ||
| 293 | __be16 low; | ||
| 294 | __be16 high; | ||
| 295 | }; | ||
| 296 | |||
| 291 | /* SR-IOV virtual function management section */ | 297 | /* SR-IOV virtual function management section */ |
| 292 | 298 | ||
| 293 | enum { | 299 | enum { |
diff --git a/include/linux/of_mdio.h b/include/linux/of_mdio.h index 6ef49b803efb..8163107b94b4 100644 --- a/include/linux/of_mdio.h +++ b/include/linux/of_mdio.h | |||
| @@ -26,32 +26,32 @@ extern struct phy_device *of_phy_connect_fixed_link(struct net_device *dev, | |||
| 26 | extern struct mii_bus *of_mdio_find_bus(struct device_node *mdio_np); | 26 | extern struct mii_bus *of_mdio_find_bus(struct device_node *mdio_np); |
| 27 | 27 | ||
| 28 | #else /* CONFIG_OF */ | 28 | #else /* CONFIG_OF */ |
| 29 | int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np) | 29 | static inline int of_mdiobus_register(struct mii_bus *mdio, struct device_node *np) |
| 30 | { | 30 | { |
| 31 | return -ENOSYS; | 31 | return -ENOSYS; |
| 32 | } | 32 | } |
| 33 | 33 | ||
| 34 | struct phy_device *of_phy_find_device(struct device_node *phy_np) | 34 | static inline struct phy_device *of_phy_find_device(struct device_node *phy_np) |
| 35 | { | 35 | { |
| 36 | return NULL; | 36 | return NULL; |
| 37 | } | 37 | } |
| 38 | 38 | ||
| 39 | struct phy_device *of_phy_connect(struct net_device *dev, | 39 | static inline struct phy_device *of_phy_connect(struct net_device *dev, |
| 40 | struct device_node *phy_np, | 40 | struct device_node *phy_np, |
| 41 | void (*hndlr)(struct net_device *), | 41 | void (*hndlr)(struct net_device *), |
| 42 | u32 flags, phy_interface_t iface) | 42 | u32 flags, phy_interface_t iface) |
| 43 | { | 43 | { |
| 44 | return NULL; | 44 | return NULL; |
| 45 | } | 45 | } |
| 46 | 46 | ||
| 47 | struct phy_device *of_phy_connect_fixed_link(struct net_device *dev, | 47 | static inline struct phy_device *of_phy_connect_fixed_link(struct net_device *dev, |
| 48 | void (*hndlr)(struct net_device *), | 48 | void (*hndlr)(struct net_device *), |
| 49 | phy_interface_t iface) | 49 | phy_interface_t iface) |
| 50 | { | 50 | { |
| 51 | return NULL; | 51 | return NULL; |
| 52 | } | 52 | } |
| 53 | 53 | ||
| 54 | struct mii_bus *of_mdio_find_bus(struct device_node *mdio_np) | 54 | static inline struct mii_bus *of_mdio_find_bus(struct device_node *mdio_np) |
| 55 | { | 55 | { |
| 56 | return NULL; | 56 | return NULL; |
| 57 | } | 57 | } |
diff --git a/include/linux/usb/usbnet.h b/include/linux/usb/usbnet.h index f87cf622317f..ddbbb7de894b 100644 --- a/include/linux/usb/usbnet.h +++ b/include/linux/usb/usbnet.h | |||
| @@ -68,6 +68,7 @@ struct usbnet { | |||
| 68 | # define EVENT_RX_PAUSED 5 | 68 | # define EVENT_RX_PAUSED 5 |
| 69 | # define EVENT_DEV_ASLEEP 6 | 69 | # define EVENT_DEV_ASLEEP 6 |
| 70 | # define EVENT_DEV_OPEN 7 | 70 | # define EVENT_DEV_OPEN 7 |
| 71 | # define EVENT_DEVICE_REPORT_IDLE 8 | ||
| 71 | }; | 72 | }; |
| 72 | 73 | ||
| 73 | static inline struct usb_driver *driver_of(struct usb_interface *intf) | 74 | static inline struct usb_driver *driver_of(struct usb_interface *intf) |
| @@ -160,6 +161,7 @@ extern int usbnet_probe(struct usb_interface *, const struct usb_device_id *); | |||
| 160 | extern int usbnet_suspend(struct usb_interface *, pm_message_t); | 161 | extern int usbnet_suspend(struct usb_interface *, pm_message_t); |
| 161 | extern int usbnet_resume(struct usb_interface *); | 162 | extern int usbnet_resume(struct usb_interface *); |
| 162 | extern void usbnet_disconnect(struct usb_interface *); | 163 | extern void usbnet_disconnect(struct usb_interface *); |
| 164 | extern void usbnet_device_suggests_idle(struct usbnet *dev); | ||
| 163 | 165 | ||
| 164 | 166 | ||
| 165 | /* Drivers that reuse some of the standard USB CDC infrastructure | 167 | /* Drivers that reuse some of the standard USB CDC infrastructure |
diff --git a/include/linux/wimax/Kbuild b/include/linux/wimax/Kbuild index 3cb4f269bb09..e69de29bb2d1 100644 --- a/include/linux/wimax/Kbuild +++ b/include/linux/wimax/Kbuild | |||
| @@ -1 +0,0 @@ | |||
| 1 | header-y += i2400m.h | ||
diff --git a/include/uapi/linux/can/Kbuild b/include/uapi/linux/can/Kbuild index aafaa5aa54d4..21c91bf25a29 100644 --- a/include/uapi/linux/can/Kbuild +++ b/include/uapi/linux/can/Kbuild | |||
| @@ -1 +1,6 @@ | |||
| 1 | # UAPI Header export list | 1 | # UAPI Header export list |
| 2 | header-y += bcm.h | ||
| 3 | header-y += error.h | ||
| 4 | header-y += gw.h | ||
| 5 | header-y += netlink.h | ||
| 6 | header-y += raw.h | ||
diff --git a/include/linux/can/bcm.h b/include/uapi/linux/can/bcm.h index 3ebe387fea4d..3ebe387fea4d 100644 --- a/include/linux/can/bcm.h +++ b/include/uapi/linux/can/bcm.h | |||
diff --git a/include/linux/can/error.h b/include/uapi/linux/can/error.h index 7b7148bded71..7b7148bded71 100644 --- a/include/linux/can/error.h +++ b/include/uapi/linux/can/error.h | |||
diff --git a/include/linux/can/gw.h b/include/uapi/linux/can/gw.h index 8e1db18c3cb6..8e1db18c3cb6 100644 --- a/include/linux/can/gw.h +++ b/include/uapi/linux/can/gw.h | |||
diff --git a/include/linux/can/netlink.h b/include/uapi/linux/can/netlink.h index 14966ddb7df1..14966ddb7df1 100644 --- a/include/linux/can/netlink.h +++ b/include/uapi/linux/can/netlink.h | |||
diff --git a/include/linux/can/raw.h b/include/uapi/linux/can/raw.h index a814062b0719..a814062b0719 100644 --- a/include/linux/can/raw.h +++ b/include/uapi/linux/can/raw.h | |||
diff --git a/include/uapi/linux/wimax/Kbuild b/include/uapi/linux/wimax/Kbuild index aafaa5aa54d4..1c97be49971f 100644 --- a/include/uapi/linux/wimax/Kbuild +++ b/include/uapi/linux/wimax/Kbuild | |||
| @@ -1 +1,2 @@ | |||
| 1 | # UAPI Header export list | 1 | # UAPI Header export list |
| 2 | header-y += i2400m.h | ||
diff --git a/include/linux/wimax/i2400m.h b/include/uapi/linux/wimax/i2400m.h index 62d356153565..62d356153565 100644 --- a/include/linux/wimax/i2400m.h +++ b/include/uapi/linux/wimax/i2400m.h | |||
diff --git a/net/bridge/br_netfilter.c b/net/bridge/br_netfilter.c index 68e8f364bbf8..fe43bc7b063f 100644 --- a/net/bridge/br_netfilter.c +++ b/net/bridge/br_netfilter.c | |||
| @@ -265,6 +265,9 @@ static int br_parse_ip_options(struct sk_buff *skb) | |||
| 265 | struct net_device *dev = skb->dev; | 265 | struct net_device *dev = skb->dev; |
| 266 | u32 len; | 266 | u32 len; |
| 267 | 267 | ||
| 268 | if (!pskb_may_pull(skb, sizeof(struct iphdr))) | ||
| 269 | goto inhdr_error; | ||
| 270 | |||
| 268 | iph = ip_hdr(skb); | 271 | iph = ip_hdr(skb); |
| 269 | opt = &(IPCB(skb)->opt); | 272 | opt = &(IPCB(skb)->opt); |
| 270 | 273 | ||
diff --git a/net/core/pktgen.c b/net/core/pktgen.c index 148e73d2c451..d1dc14c2aac4 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c | |||
| @@ -248,8 +248,8 @@ struct pktgen_dev { | |||
| 248 | int removal_mark; /* non-zero => the device is marked for | 248 | int removal_mark; /* non-zero => the device is marked for |
| 249 | * removal by worker thread */ | 249 | * removal by worker thread */ |
| 250 | 250 | ||
| 251 | int min_pkt_size; /* = ETH_ZLEN; */ | 251 | int min_pkt_size; |
| 252 | int max_pkt_size; /* = ETH_ZLEN; */ | 252 | int max_pkt_size; |
| 253 | int pkt_overhead; /* overhead for MPLS, VLANs, IPSEC etc */ | 253 | int pkt_overhead; /* overhead for MPLS, VLANs, IPSEC etc */ |
| 254 | int nfrags; | 254 | int nfrags; |
| 255 | struct page *page; | 255 | struct page *page; |
| @@ -449,8 +449,6 @@ static void pktgen_stop_all_threads_ifs(void); | |||
| 449 | static void pktgen_stop(struct pktgen_thread *t); | 449 | static void pktgen_stop(struct pktgen_thread *t); |
| 450 | static void pktgen_clear_counters(struct pktgen_dev *pkt_dev); | 450 | static void pktgen_clear_counters(struct pktgen_dev *pkt_dev); |
| 451 | 451 | ||
| 452 | static unsigned int scan_ip6(const char *s, char ip[16]); | ||
| 453 | |||
| 454 | /* Module parameters, defaults. */ | 452 | /* Module parameters, defaults. */ |
| 455 | static int pg_count_d __read_mostly = 1000; | 453 | static int pg_count_d __read_mostly = 1000; |
| 456 | static int pg_delay_d __read_mostly; | 454 | static int pg_delay_d __read_mostly; |
| @@ -702,8 +700,8 @@ static int pktgen_if_show(struct seq_file *seq, void *v) | |||
| 702 | &pkt_dev->cur_in6_saddr, | 700 | &pkt_dev->cur_in6_saddr, |
| 703 | &pkt_dev->cur_in6_daddr); | 701 | &pkt_dev->cur_in6_daddr); |
| 704 | } else | 702 | } else |
| 705 | seq_printf(seq, " cur_saddr: 0x%x cur_daddr: 0x%x\n", | 703 | seq_printf(seq, " cur_saddr: %pI4 cur_daddr: %pI4\n", |
| 706 | pkt_dev->cur_saddr, pkt_dev->cur_daddr); | 704 | &pkt_dev->cur_saddr, &pkt_dev->cur_daddr); |
| 707 | 705 | ||
| 708 | seq_printf(seq, " cur_udp_dst: %d cur_udp_src: %d\n", | 706 | seq_printf(seq, " cur_udp_dst: %d cur_udp_src: %d\n", |
| 709 | pkt_dev->cur_udp_dst, pkt_dev->cur_udp_src); | 707 | pkt_dev->cur_udp_dst, pkt_dev->cur_udp_src); |
| @@ -1299,7 +1297,7 @@ static ssize_t pktgen_if_write(struct file *file, | |||
| 1299 | return -EFAULT; | 1297 | return -EFAULT; |
| 1300 | buf[len] = 0; | 1298 | buf[len] = 0; |
| 1301 | 1299 | ||
| 1302 | scan_ip6(buf, pkt_dev->in6_daddr.s6_addr); | 1300 | in6_pton(buf, -1, pkt_dev->in6_daddr.s6_addr, -1, NULL); |
| 1303 | snprintf(buf, sizeof(buf), "%pI6c", &pkt_dev->in6_daddr); | 1301 | snprintf(buf, sizeof(buf), "%pI6c", &pkt_dev->in6_daddr); |
| 1304 | 1302 | ||
| 1305 | pkt_dev->cur_in6_daddr = pkt_dev->in6_daddr; | 1303 | pkt_dev->cur_in6_daddr = pkt_dev->in6_daddr; |
| @@ -1322,7 +1320,7 @@ static ssize_t pktgen_if_write(struct file *file, | |||
| 1322 | return -EFAULT; | 1320 | return -EFAULT; |
| 1323 | buf[len] = 0; | 1321 | buf[len] = 0; |
| 1324 | 1322 | ||
| 1325 | scan_ip6(buf, pkt_dev->min_in6_daddr.s6_addr); | 1323 | in6_pton(buf, -1, pkt_dev->min_in6_daddr.s6_addr, -1, NULL); |
| 1326 | snprintf(buf, sizeof(buf), "%pI6c", &pkt_dev->min_in6_daddr); | 1324 | snprintf(buf, sizeof(buf), "%pI6c", &pkt_dev->min_in6_daddr); |
| 1327 | 1325 | ||
| 1328 | pkt_dev->cur_in6_daddr = pkt_dev->min_in6_daddr; | 1326 | pkt_dev->cur_in6_daddr = pkt_dev->min_in6_daddr; |
| @@ -1344,7 +1342,7 @@ static ssize_t pktgen_if_write(struct file *file, | |||
| 1344 | return -EFAULT; | 1342 | return -EFAULT; |
| 1345 | buf[len] = 0; | 1343 | buf[len] = 0; |
| 1346 | 1344 | ||
| 1347 | scan_ip6(buf, pkt_dev->max_in6_daddr.s6_addr); | 1345 | in6_pton(buf, -1, pkt_dev->max_in6_daddr.s6_addr, -1, NULL); |
| 1348 | snprintf(buf, sizeof(buf), "%pI6c", &pkt_dev->max_in6_daddr); | 1346 | snprintf(buf, sizeof(buf), "%pI6c", &pkt_dev->max_in6_daddr); |
| 1349 | 1347 | ||
| 1350 | if (debug) | 1348 | if (debug) |
| @@ -1365,7 +1363,7 @@ static ssize_t pktgen_if_write(struct file *file, | |||
| 1365 | return -EFAULT; | 1363 | return -EFAULT; |
| 1366 | buf[len] = 0; | 1364 | buf[len] = 0; |
| 1367 | 1365 | ||
| 1368 | scan_ip6(buf, pkt_dev->in6_saddr.s6_addr); | 1366 | in6_pton(buf, -1, pkt_dev->in6_saddr.s6_addr, -1, NULL); |
| 1369 | snprintf(buf, sizeof(buf), "%pI6c", &pkt_dev->in6_saddr); | 1367 | snprintf(buf, sizeof(buf), "%pI6c", &pkt_dev->in6_saddr); |
| 1370 | 1368 | ||
| 1371 | pkt_dev->cur_in6_saddr = pkt_dev->in6_saddr; | 1369 | pkt_dev->cur_in6_saddr = pkt_dev->in6_saddr; |
| @@ -2036,19 +2034,17 @@ static void pktgen_setup_inject(struct pktgen_dev *pkt_dev) | |||
| 2036 | /* Set up Dest MAC */ | 2034 | /* Set up Dest MAC */ |
| 2037 | memcpy(&(pkt_dev->hh[0]), pkt_dev->dst_mac, ETH_ALEN); | 2035 | memcpy(&(pkt_dev->hh[0]), pkt_dev->dst_mac, ETH_ALEN); |
| 2038 | 2036 | ||
| 2039 | /* Set up pkt size */ | ||
| 2040 | pkt_dev->cur_pkt_size = pkt_dev->min_pkt_size; | ||
| 2041 | |||
| 2042 | if (pkt_dev->flags & F_IPV6) { | 2037 | if (pkt_dev->flags & F_IPV6) { |
| 2043 | /* | ||
| 2044 | * Skip this automatic address setting until locks or functions | ||
| 2045 | * gets exported | ||
| 2046 | */ | ||
| 2047 | |||
| 2048 | #ifdef NOTNOW | ||
| 2049 | int i, set = 0, err = 1; | 2038 | int i, set = 0, err = 1; |
| 2050 | struct inet6_dev *idev; | 2039 | struct inet6_dev *idev; |
| 2051 | 2040 | ||
| 2041 | if (pkt_dev->min_pkt_size == 0) { | ||
| 2042 | pkt_dev->min_pkt_size = 14 + sizeof(struct ipv6hdr) | ||
| 2043 | + sizeof(struct udphdr) | ||
| 2044 | + sizeof(struct pktgen_hdr) | ||
| 2045 | + pkt_dev->pkt_overhead; | ||
| 2046 | } | ||
| 2047 | |||
| 2052 | for (i = 0; i < IN6_ADDR_HSIZE; i++) | 2048 | for (i = 0; i < IN6_ADDR_HSIZE; i++) |
| 2053 | if (pkt_dev->cur_in6_saddr.s6_addr[i]) { | 2049 | if (pkt_dev->cur_in6_saddr.s6_addr[i]) { |
| 2054 | set = 1; | 2050 | set = 1; |
| @@ -2069,9 +2065,8 @@ static void pktgen_setup_inject(struct pktgen_dev *pkt_dev) | |||
| 2069 | struct inet6_ifaddr *ifp; | 2065 | struct inet6_ifaddr *ifp; |
| 2070 | 2066 | ||
| 2071 | read_lock_bh(&idev->lock); | 2067 | read_lock_bh(&idev->lock); |
| 2072 | for (ifp = idev->addr_list; ifp; | 2068 | list_for_each_entry(ifp, &idev->addr_list, if_list) { |
| 2073 | ifp = ifp->if_next) { | 2069 | if ((ifp->scope & IFA_LINK) && |
| 2074 | if (ifp->scope == IFA_LINK && | ||
| 2075 | !(ifp->flags & IFA_F_TENTATIVE)) { | 2070 | !(ifp->flags & IFA_F_TENTATIVE)) { |
| 2076 | pkt_dev->cur_in6_saddr = ifp->addr; | 2071 | pkt_dev->cur_in6_saddr = ifp->addr; |
| 2077 | err = 0; | 2072 | err = 0; |
| @@ -2084,8 +2079,14 @@ static void pktgen_setup_inject(struct pktgen_dev *pkt_dev) | |||
| 2084 | if (err) | 2079 | if (err) |
| 2085 | pr_err("ERROR: IPv6 link address not available\n"); | 2080 | pr_err("ERROR: IPv6 link address not available\n"); |
| 2086 | } | 2081 | } |
| 2087 | #endif | ||
| 2088 | } else { | 2082 | } else { |
| 2083 | if (pkt_dev->min_pkt_size == 0) { | ||
| 2084 | pkt_dev->min_pkt_size = 14 + sizeof(struct iphdr) | ||
| 2085 | + sizeof(struct udphdr) | ||
| 2086 | + sizeof(struct pktgen_hdr) | ||
| 2087 | + pkt_dev->pkt_overhead; | ||
| 2088 | } | ||
| 2089 | |||
| 2089 | pkt_dev->saddr_min = 0; | 2090 | pkt_dev->saddr_min = 0; |
| 2090 | pkt_dev->saddr_max = 0; | 2091 | pkt_dev->saddr_max = 0; |
| 2091 | if (strlen(pkt_dev->src_min) == 0) { | 2092 | if (strlen(pkt_dev->src_min) == 0) { |
| @@ -2111,6 +2112,10 @@ static void pktgen_setup_inject(struct pktgen_dev *pkt_dev) | |||
| 2111 | pkt_dev->daddr_max = in_aton(pkt_dev->dst_max); | 2112 | pkt_dev->daddr_max = in_aton(pkt_dev->dst_max); |
| 2112 | } | 2113 | } |
| 2113 | /* Initialize current values. */ | 2114 | /* Initialize current values. */ |
| 2115 | pkt_dev->cur_pkt_size = pkt_dev->min_pkt_size; | ||
| 2116 | if (pkt_dev->min_pkt_size > pkt_dev->max_pkt_size) | ||
| 2117 | pkt_dev->max_pkt_size = pkt_dev->min_pkt_size; | ||
| 2118 | |||
| 2114 | pkt_dev->cur_dst_mac_offset = 0; | 2119 | pkt_dev->cur_dst_mac_offset = 0; |
| 2115 | pkt_dev->cur_src_mac_offset = 0; | 2120 | pkt_dev->cur_src_mac_offset = 0; |
| 2116 | pkt_dev->cur_saddr = pkt_dev->saddr_min; | 2121 | pkt_dev->cur_saddr = pkt_dev->saddr_min; |
| @@ -2758,97 +2763,6 @@ static struct sk_buff *fill_packet_ipv4(struct net_device *odev, | |||
| 2758 | return skb; | 2763 | return skb; |
| 2759 | } | 2764 | } |
| 2760 | 2765 | ||
| 2761 | /* | ||
| 2762 | * scan_ip6, fmt_ip taken from dietlibc-0.21 | ||
| 2763 | * Author Felix von Leitner <felix-dietlibc@fefe.de> | ||
| 2764 | * | ||
| 2765 | * Slightly modified for kernel. | ||
| 2766 | * Should be candidate for net/ipv4/utils.c | ||
| 2767 | * --ro | ||
| 2768 | */ | ||
| 2769 | |||
| 2770 | static unsigned int scan_ip6(const char *s, char ip[16]) | ||
| 2771 | { | ||
| 2772 | unsigned int i; | ||
| 2773 | unsigned int len = 0; | ||
| 2774 | unsigned long u; | ||
| 2775 | char suffix[16]; | ||
| 2776 | unsigned int prefixlen = 0; | ||
| 2777 | unsigned int suffixlen = 0; | ||
| 2778 | __be32 tmp; | ||
| 2779 | char *pos; | ||
| 2780 | |||
| 2781 | for (i = 0; i < 16; i++) | ||
| 2782 | ip[i] = 0; | ||
| 2783 | |||
| 2784 | for (;;) { | ||
| 2785 | if (*s == ':') { | ||
| 2786 | len++; | ||
| 2787 | if (s[1] == ':') { /* Found "::", skip to part 2 */ | ||
| 2788 | s += 2; | ||
| 2789 | len++; | ||
| 2790 | break; | ||
| 2791 | } | ||
| 2792 | s++; | ||
| 2793 | } | ||
| 2794 | |||
| 2795 | u = simple_strtoul(s, &pos, 16); | ||
| 2796 | i = pos - s; | ||
| 2797 | if (!i) | ||
| 2798 | return 0; | ||
| 2799 | if (prefixlen == 12 && s[i] == '.') { | ||
| 2800 | |||
| 2801 | /* the last 4 bytes may be written as IPv4 address */ | ||
| 2802 | |||
| 2803 | tmp = in_aton(s); | ||
| 2804 | memcpy((struct in_addr *)(ip + 12), &tmp, sizeof(tmp)); | ||
| 2805 | return i + len; | ||
| 2806 | } | ||
| 2807 | ip[prefixlen++] = (u >> 8); | ||
| 2808 | ip[prefixlen++] = (u & 255); | ||
| 2809 | s += i; | ||
| 2810 | len += i; | ||
| 2811 | if (prefixlen == 16) | ||
| 2812 | return len; | ||
| 2813 | } | ||
| 2814 | |||
| 2815 | /* part 2, after "::" */ | ||
| 2816 | for (;;) { | ||
| 2817 | if (*s == ':') { | ||
| 2818 | if (suffixlen == 0) | ||
| 2819 | break; | ||
| 2820 | s++; | ||
| 2821 | len++; | ||
| 2822 | } else if (suffixlen != 0) | ||
| 2823 | break; | ||
| 2824 | |||
| 2825 | u = simple_strtol(s, &pos, 16); | ||
| 2826 | i = pos - s; | ||
| 2827 | if (!i) { | ||
| 2828 | if (*s) | ||
| 2829 | len--; | ||
| 2830 | break; | ||
| 2831 | } | ||
| 2832 | if (suffixlen + prefixlen <= 12 && s[i] == '.') { | ||
| 2833 | tmp = in_aton(s); | ||
| 2834 | memcpy((struct in_addr *)(suffix + suffixlen), &tmp, | ||
| 2835 | sizeof(tmp)); | ||
| 2836 | suffixlen += 4; | ||
| 2837 | len += strlen(s); | ||
| 2838 | break; | ||
| 2839 | } | ||
| 2840 | suffix[suffixlen++] = (u >> 8); | ||
| 2841 | suffix[suffixlen++] = (u & 255); | ||
| 2842 | s += i; | ||
| 2843 | len += i; | ||
| 2844 | if (prefixlen + suffixlen == 16) | ||
| 2845 | break; | ||
| 2846 | } | ||
| 2847 | for (i = 0; i < suffixlen; i++) | ||
| 2848 | ip[16 - suffixlen + i] = suffix[i]; | ||
| 2849 | return len; | ||
| 2850 | } | ||
| 2851 | |||
| 2852 | static struct sk_buff *fill_packet_ipv6(struct net_device *odev, | 2766 | static struct sk_buff *fill_packet_ipv6(struct net_device *odev, |
| 2853 | struct pktgen_dev *pkt_dev) | 2767 | struct pktgen_dev *pkt_dev) |
| 2854 | { | 2768 | { |
| @@ -2927,7 +2841,7 @@ static struct sk_buff *fill_packet_ipv6(struct net_device *odev, | |||
| 2927 | sizeof(struct ipv6hdr) - sizeof(struct udphdr) - | 2841 | sizeof(struct ipv6hdr) - sizeof(struct udphdr) - |
| 2928 | pkt_dev->pkt_overhead; | 2842 | pkt_dev->pkt_overhead; |
| 2929 | 2843 | ||
| 2930 | if (datalen < sizeof(struct pktgen_hdr)) { | 2844 | if (datalen < 0 || datalen < sizeof(struct pktgen_hdr)) { |
| 2931 | datalen = sizeof(struct pktgen_hdr); | 2845 | datalen = sizeof(struct pktgen_hdr); |
| 2932 | net_info_ratelimited("increased datalen to %d\n", datalen); | 2846 | net_info_ratelimited("increased datalen to %d\n", datalen); |
| 2933 | } | 2847 | } |
| @@ -3548,8 +3462,6 @@ static int pktgen_add_device(struct pktgen_thread *t, const char *ifname) | |||
| 3548 | } | 3462 | } |
| 3549 | 3463 | ||
| 3550 | pkt_dev->removal_mark = 0; | 3464 | pkt_dev->removal_mark = 0; |
| 3551 | pkt_dev->min_pkt_size = ETH_ZLEN; | ||
| 3552 | pkt_dev->max_pkt_size = ETH_ZLEN; | ||
| 3553 | pkt_dev->nfrags = 0; | 3465 | pkt_dev->nfrags = 0; |
| 3554 | pkt_dev->delay = pg_delay_d; | 3466 | pkt_dev->delay = pg_delay_d; |
| 3555 | pkt_dev->count = pg_count_d; | 3467 | pkt_dev->count = pg_count_d; |
diff --git a/net/core/utils.c b/net/core/utils.c index f5613d569c23..e3487e461939 100644 --- a/net/core/utils.c +++ b/net/core/utils.c | |||
| @@ -107,6 +107,18 @@ static inline int xdigit2bin(char c, int delim) | |||
| 107 | return IN6PTON_UNKNOWN; | 107 | return IN6PTON_UNKNOWN; |
| 108 | } | 108 | } |
| 109 | 109 | ||
| 110 | /** | ||
| 111 | * in4_pton - convert an IPv4 address from literal to binary representation | ||
| 112 | * @src: the start of the IPv4 address string | ||
| 113 | * @srclen: the length of the string, -1 means strlen(src) | ||
| 114 | * @dst: the binary (u8[4] array) representation of the IPv4 address | ||
| 115 | * @delim: the delimiter of the IPv4 address in @src, -1 means no delimiter | ||
| 116 | * @end: A pointer to the end of the parsed string will be placed here | ||
| 117 | * | ||
| 118 | * Return one on success, return zero when any error occurs | ||
| 119 | * and @end will point to the end of the parsed string. | ||
| 120 | * | ||
| 121 | */ | ||
| 110 | int in4_pton(const char *src, int srclen, | 122 | int in4_pton(const char *src, int srclen, |
| 111 | u8 *dst, | 123 | u8 *dst, |
| 112 | int delim, const char **end) | 124 | int delim, const char **end) |
| @@ -161,6 +173,18 @@ out: | |||
| 161 | } | 173 | } |
| 162 | EXPORT_SYMBOL(in4_pton); | 174 | EXPORT_SYMBOL(in4_pton); |
| 163 | 175 | ||
| 176 | /** | ||
| 177 | * in6_pton - convert an IPv6 address from literal to binary representation | ||
| 178 | * @src: the start of the IPv6 address string | ||
| 179 | * @srclen: the length of the string, -1 means strlen(src) | ||
| 180 | * @dst: the binary (u8[16] array) representation of the IPv6 address | ||
| 181 | * @delim: the delimiter of the IPv6 address in @src, -1 means no delimiter | ||
| 182 | * @end: A pointer to the end of the parsed string will be placed here | ||
| 183 | * | ||
| 184 | * Return one on success, return zero when any error occurs | ||
| 185 | * and @end will point to the end of the parsed string. | ||
| 186 | * | ||
| 187 | */ | ||
| 164 | int in6_pton(const char *src, int srclen, | 188 | int in6_pton(const char *src, int srclen, |
| 165 | u8 *dst, | 189 | u8 *dst, |
| 166 | int delim, const char **end) | 190 | int delim, const char **end) |
diff --git a/net/ipv4/ip_vti.c b/net/ipv4/ip_vti.c index 978bca4818ae..1831092f999f 100644 --- a/net/ipv4/ip_vti.c +++ b/net/ipv4/ip_vti.c | |||
| @@ -374,7 +374,7 @@ static netdev_tx_t vti_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 374 | 374 | ||
| 375 | memset(&fl4, 0, sizeof(fl4)); | 375 | memset(&fl4, 0, sizeof(fl4)); |
| 376 | flowi4_init_output(&fl4, tunnel->parms.link, | 376 | flowi4_init_output(&fl4, tunnel->parms.link, |
| 377 | htonl(tunnel->parms.i_key), RT_TOS(tos), | 377 | be32_to_cpu(tunnel->parms.i_key), RT_TOS(tos), |
| 378 | RT_SCOPE_UNIVERSE, | 378 | RT_SCOPE_UNIVERSE, |
| 379 | IPPROTO_IPIP, 0, | 379 | IPPROTO_IPIP, 0, |
| 380 | dst, tiph->saddr, 0, 0); | 380 | dst, tiph->saddr, 0, 0); |
| @@ -441,7 +441,7 @@ static int vti_tunnel_bind_dev(struct net_device *dev) | |||
| 441 | struct flowi4 fl4; | 441 | struct flowi4 fl4; |
| 442 | memset(&fl4, 0, sizeof(fl4)); | 442 | memset(&fl4, 0, sizeof(fl4)); |
| 443 | flowi4_init_output(&fl4, tunnel->parms.link, | 443 | flowi4_init_output(&fl4, tunnel->parms.link, |
| 444 | htonl(tunnel->parms.i_key), | 444 | be32_to_cpu(tunnel->parms.i_key), |
| 445 | RT_TOS(iph->tos), RT_SCOPE_UNIVERSE, | 445 | RT_TOS(iph->tos), RT_SCOPE_UNIVERSE, |
| 446 | IPPROTO_IPIP, 0, | 446 | IPPROTO_IPIP, 0, |
| 447 | iph->daddr, iph->saddr, 0, 0); | 447 | iph->daddr, iph->saddr, 0, 0); |
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index 1a0da8dc8180..432f4bb77238 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
| @@ -2220,7 +2220,7 @@ static int rt_fill_info(struct net *net, __be32 dst, __be32 src, | |||
| 2220 | goto nla_put_failure; | 2220 | goto nla_put_failure; |
| 2221 | 2221 | ||
| 2222 | if (fl4->flowi4_mark && | 2222 | if (fl4->flowi4_mark && |
| 2223 | nla_put_be32(skb, RTA_MARK, fl4->flowi4_mark)) | 2223 | nla_put_u32(skb, RTA_MARK, fl4->flowi4_mark)) |
| 2224 | goto nla_put_failure; | 2224 | goto nla_put_failure; |
| 2225 | 2225 | ||
| 2226 | error = rt->dst.error; | 2226 | error = rt->dst.error; |
diff --git a/net/ipv4/sysctl_net_ipv4.c b/net/ipv4/sysctl_net_ipv4.c index 9205e492dc9d..63d4eccc674d 100644 --- a/net/ipv4/sysctl_net_ipv4.c +++ b/net/ipv4/sysctl_net_ipv4.c | |||
| @@ -248,6 +248,8 @@ int proc_tcp_fastopen_key(ctl_table *ctl, int write, void __user *buffer, | |||
| 248 | ctxt = rcu_dereference(tcp_fastopen_ctx); | 248 | ctxt = rcu_dereference(tcp_fastopen_ctx); |
| 249 | if (ctxt) | 249 | if (ctxt) |
| 250 | memcpy(user_key, ctxt->key, TCP_FASTOPEN_KEY_LENGTH); | 250 | memcpy(user_key, ctxt->key, TCP_FASTOPEN_KEY_LENGTH); |
| 251 | else | ||
| 252 | memset(user_key, 0, sizeof(user_key)); | ||
| 251 | rcu_read_unlock(); | 253 | rcu_read_unlock(); |
| 252 | 254 | ||
| 253 | snprintf(tbl.data, tbl.maxlen, "%08x-%08x-%08x-%08x", | 255 | snprintf(tbl.data, tbl.maxlen, "%08x-%08x-%08x-%08x", |
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 75735c9a6a9d..ef998b008a57 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
| @@ -708,10 +708,11 @@ static void tcp_v4_send_reset(struct sock *sk, struct sk_buff *skb) | |||
| 708 | arg.csumoffset = offsetof(struct tcphdr, check) / 2; | 708 | arg.csumoffset = offsetof(struct tcphdr, check) / 2; |
| 709 | arg.flags = (sk && inet_sk(sk)->transparent) ? IP_REPLY_ARG_NOSRCCHECK : 0; | 709 | arg.flags = (sk && inet_sk(sk)->transparent) ? IP_REPLY_ARG_NOSRCCHECK : 0; |
| 710 | /* When socket is gone, all binding information is lost. | 710 | /* When socket is gone, all binding information is lost. |
| 711 | * routing might fail in this case. using iif for oif to | 711 | * routing might fail in this case. No choice here, if we choose to force |
| 712 | * make sure we can deliver it | 712 | * input interface, we will misroute in case of asymmetric route. |
| 713 | */ | 713 | */ |
| 714 | arg.bound_dev_if = sk ? sk->sk_bound_dev_if : inet_iif(skb); | 714 | if (sk) |
| 715 | arg.bound_dev_if = sk->sk_bound_dev_if; | ||
| 715 | 716 | ||
| 716 | net = dev_net(skb_dst(skb)->dev); | 717 | net = dev_net(skb_dst(skb)->dev); |
| 717 | arg.tos = ip_hdr(skb)->tos; | 718 | arg.tos = ip_hdr(skb)->tos; |
diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c index 49c890386ce9..26175bffbaa0 100644 --- a/net/ipv6/tcp_ipv6.c +++ b/net/ipv6/tcp_ipv6.c | |||
| @@ -877,7 +877,8 @@ static void tcp_v6_send_response(struct sk_buff *skb, u32 seq, u32 ack, u32 win, | |||
| 877 | __tcp_v6_send_check(buff, &fl6.saddr, &fl6.daddr); | 877 | __tcp_v6_send_check(buff, &fl6.saddr, &fl6.daddr); |
| 878 | 878 | ||
| 879 | fl6.flowi6_proto = IPPROTO_TCP; | 879 | fl6.flowi6_proto = IPPROTO_TCP; |
| 880 | fl6.flowi6_oif = inet6_iif(skb); | 880 | if (ipv6_addr_type(&fl6.daddr) & IPV6_ADDR_LINKLOCAL) |
| 881 | fl6.flowi6_oif = inet6_iif(skb); | ||
| 881 | fl6.fl6_dport = t1->dest; | 882 | fl6.fl6_dport = t1->dest; |
| 882 | fl6.fl6_sport = t1->source; | 883 | fl6.fl6_sport = t1->source; |
| 883 | security_skb_classify_flow(skb, flowi6_to_flowi(&fl6)); | 884 | security_skb_classify_flow(skb, flowi6_to_flowi(&fl6)); |
diff --git a/net/mac80211/mesh_sync.c b/net/mac80211/mesh_sync.c index accfa00ffcdf..a16b7b4b1e02 100644 --- a/net/mac80211/mesh_sync.c +++ b/net/mac80211/mesh_sync.c | |||
| @@ -56,7 +56,6 @@ void mesh_sync_adjust_tbtt(struct ieee80211_sub_if_data *sdata) | |||
| 56 | u64 tsfdelta; | 56 | u64 tsfdelta; |
| 57 | 57 | ||
| 58 | spin_lock_bh(&ifmsh->sync_offset_lock); | 58 | spin_lock_bh(&ifmsh->sync_offset_lock); |
| 59 | |||
| 60 | if (ifmsh->sync_offset_clockdrift_max < beacon_int_fraction) { | 59 | if (ifmsh->sync_offset_clockdrift_max < beacon_int_fraction) { |
| 61 | msync_dbg(sdata, "TBTT : max clockdrift=%lld; adjusting\n", | 60 | msync_dbg(sdata, "TBTT : max clockdrift=%lld; adjusting\n", |
| 62 | (long long) ifmsh->sync_offset_clockdrift_max); | 61 | (long long) ifmsh->sync_offset_clockdrift_max); |
| @@ -69,11 +68,11 @@ void mesh_sync_adjust_tbtt(struct ieee80211_sub_if_data *sdata) | |||
| 69 | tsfdelta = -beacon_int_fraction; | 68 | tsfdelta = -beacon_int_fraction; |
| 70 | ifmsh->sync_offset_clockdrift_max -= beacon_int_fraction; | 69 | ifmsh->sync_offset_clockdrift_max -= beacon_int_fraction; |
| 71 | } | 70 | } |
| 71 | spin_unlock_bh(&ifmsh->sync_offset_lock); | ||
| 72 | 72 | ||
| 73 | tsf = drv_get_tsf(local, sdata); | 73 | tsf = drv_get_tsf(local, sdata); |
| 74 | if (tsf != -1ULL) | 74 | if (tsf != -1ULL) |
| 75 | drv_set_tsf(local, sdata, tsf + tsfdelta); | 75 | drv_set_tsf(local, sdata, tsf + tsfdelta); |
| 76 | spin_unlock_bh(&ifmsh->sync_offset_lock); | ||
| 77 | } | 76 | } |
| 78 | 77 | ||
| 79 | static void mesh_sync_offset_rx_bcn_presp(struct ieee80211_sub_if_data *sdata, | 78 | static void mesh_sync_offset_rx_bcn_presp(struct ieee80211_sub_if_data *sdata, |
diff --git a/net/mac80211/status.c b/net/mac80211/status.c index 2ce89732d0f2..3af0cc4130f1 100644 --- a/net/mac80211/status.c +++ b/net/mac80211/status.c | |||
| @@ -34,7 +34,7 @@ void ieee80211_tx_status_irqsafe(struct ieee80211_hw *hw, | |||
| 34 | skb_queue_len(&local->skb_queue_unreliable); | 34 | skb_queue_len(&local->skb_queue_unreliable); |
| 35 | while (tmp > IEEE80211_IRQSAFE_QUEUE_LIMIT && | 35 | while (tmp > IEEE80211_IRQSAFE_QUEUE_LIMIT && |
| 36 | (skb = skb_dequeue(&local->skb_queue_unreliable))) { | 36 | (skb = skb_dequeue(&local->skb_queue_unreliable))) { |
| 37 | dev_kfree_skb_irq(skb); | 37 | ieee80211_free_txskb(hw, skb); |
| 38 | tmp--; | 38 | tmp--; |
| 39 | I802_DEBUG_INC(local->tx_status_drop); | 39 | I802_DEBUG_INC(local->tx_status_drop); |
| 40 | } | 40 | } |
| @@ -159,7 +159,7 @@ static void ieee80211_handle_filtered_frame(struct ieee80211_local *local, | |||
| 159 | "dropped TX filtered frame, queue_len=%d PS=%d @%lu\n", | 159 | "dropped TX filtered frame, queue_len=%d PS=%d @%lu\n", |
| 160 | skb_queue_len(&sta->tx_filtered[ac]), | 160 | skb_queue_len(&sta->tx_filtered[ac]), |
| 161 | !!test_sta_flag(sta, WLAN_STA_PS_STA), jiffies); | 161 | !!test_sta_flag(sta, WLAN_STA_PS_STA), jiffies); |
| 162 | dev_kfree_skb(skb); | 162 | ieee80211_free_txskb(&local->hw, skb); |
| 163 | } | 163 | } |
| 164 | 164 | ||
| 165 | static void ieee80211_check_pending_bar(struct sta_info *sta, u8 *addr, u8 tid) | 165 | static void ieee80211_check_pending_bar(struct sta_info *sta, u8 *addr, u8 tid) |
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index e0e0d1d0e830..c9bf83f36657 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c | |||
| @@ -354,7 +354,7 @@ static void purge_old_ps_buffers(struct ieee80211_local *local) | |||
| 354 | total += skb_queue_len(&sta->ps_tx_buf[ac]); | 354 | total += skb_queue_len(&sta->ps_tx_buf[ac]); |
| 355 | if (skb) { | 355 | if (skb) { |
| 356 | purged++; | 356 | purged++; |
| 357 | dev_kfree_skb(skb); | 357 | ieee80211_free_txskb(&local->hw, skb); |
| 358 | break; | 358 | break; |
| 359 | } | 359 | } |
| 360 | } | 360 | } |
| @@ -466,7 +466,7 @@ ieee80211_tx_h_unicast_ps_buf(struct ieee80211_tx_data *tx) | |||
| 466 | ps_dbg(tx->sdata, | 466 | ps_dbg(tx->sdata, |
| 467 | "STA %pM TX buffer for AC %d full - dropping oldest frame\n", | 467 | "STA %pM TX buffer for AC %d full - dropping oldest frame\n", |
| 468 | sta->sta.addr, ac); | 468 | sta->sta.addr, ac); |
| 469 | dev_kfree_skb(old); | 469 | ieee80211_free_txskb(&local->hw, old); |
| 470 | } else | 470 | } else |
| 471 | tx->local->total_ps_buffered++; | 471 | tx->local->total_ps_buffered++; |
| 472 | 472 | ||
| @@ -1103,7 +1103,7 @@ static bool ieee80211_tx_prep_agg(struct ieee80211_tx_data *tx, | |||
| 1103 | spin_unlock(&tx->sta->lock); | 1103 | spin_unlock(&tx->sta->lock); |
| 1104 | 1104 | ||
| 1105 | if (purge_skb) | 1105 | if (purge_skb) |
| 1106 | dev_kfree_skb(purge_skb); | 1106 | ieee80211_free_txskb(&tx->local->hw, purge_skb); |
| 1107 | } | 1107 | } |
| 1108 | 1108 | ||
| 1109 | /* reset session timer */ | 1109 | /* reset session timer */ |
| @@ -1214,7 +1214,7 @@ static bool ieee80211_tx_frags(struct ieee80211_local *local, | |||
| 1214 | #ifdef CONFIG_MAC80211_VERBOSE_DEBUG | 1214 | #ifdef CONFIG_MAC80211_VERBOSE_DEBUG |
| 1215 | if (WARN_ON_ONCE(q >= local->hw.queues)) { | 1215 | if (WARN_ON_ONCE(q >= local->hw.queues)) { |
| 1216 | __skb_unlink(skb, skbs); | 1216 | __skb_unlink(skb, skbs); |
| 1217 | dev_kfree_skb(skb); | 1217 | ieee80211_free_txskb(&local->hw, skb); |
| 1218 | continue; | 1218 | continue; |
| 1219 | } | 1219 | } |
| 1220 | #endif | 1220 | #endif |
| @@ -1356,7 +1356,7 @@ static int invoke_tx_handlers(struct ieee80211_tx_data *tx) | |||
| 1356 | if (unlikely(res == TX_DROP)) { | 1356 | if (unlikely(res == TX_DROP)) { |
| 1357 | I802_DEBUG_INC(tx->local->tx_handlers_drop); | 1357 | I802_DEBUG_INC(tx->local->tx_handlers_drop); |
| 1358 | if (tx->skb) | 1358 | if (tx->skb) |
| 1359 | dev_kfree_skb(tx->skb); | 1359 | ieee80211_free_txskb(&tx->local->hw, tx->skb); |
| 1360 | else | 1360 | else |
| 1361 | __skb_queue_purge(&tx->skbs); | 1361 | __skb_queue_purge(&tx->skbs); |
| 1362 | return -1; | 1362 | return -1; |
| @@ -1393,7 +1393,7 @@ static bool ieee80211_tx(struct ieee80211_sub_if_data *sdata, | |||
| 1393 | res_prepare = ieee80211_tx_prepare(sdata, &tx, skb); | 1393 | res_prepare = ieee80211_tx_prepare(sdata, &tx, skb); |
| 1394 | 1394 | ||
| 1395 | if (unlikely(res_prepare == TX_DROP)) { | 1395 | if (unlikely(res_prepare == TX_DROP)) { |
| 1396 | dev_kfree_skb(skb); | 1396 | ieee80211_free_txskb(&local->hw, skb); |
| 1397 | goto out; | 1397 | goto out; |
| 1398 | } else if (unlikely(res_prepare == TX_QUEUED)) { | 1398 | } else if (unlikely(res_prepare == TX_QUEUED)) { |
| 1399 | goto out; | 1399 | goto out; |
| @@ -1465,7 +1465,7 @@ void ieee80211_xmit(struct ieee80211_sub_if_data *sdata, struct sk_buff *skb) | |||
| 1465 | headroom = max_t(int, 0, headroom); | 1465 | headroom = max_t(int, 0, headroom); |
| 1466 | 1466 | ||
| 1467 | if (ieee80211_skb_resize(sdata, skb, headroom, may_encrypt)) { | 1467 | if (ieee80211_skb_resize(sdata, skb, headroom, may_encrypt)) { |
| 1468 | dev_kfree_skb(skb); | 1468 | ieee80211_free_txskb(&local->hw, skb); |
| 1469 | rcu_read_unlock(); | 1469 | rcu_read_unlock(); |
| 1470 | return; | 1470 | return; |
| 1471 | } | 1471 | } |
| @@ -2050,8 +2050,10 @@ netdev_tx_t ieee80211_subif_start_xmit(struct sk_buff *skb, | |||
| 2050 | head_need += IEEE80211_ENCRYPT_HEADROOM; | 2050 | head_need += IEEE80211_ENCRYPT_HEADROOM; |
| 2051 | head_need += local->tx_headroom; | 2051 | head_need += local->tx_headroom; |
| 2052 | head_need = max_t(int, 0, head_need); | 2052 | head_need = max_t(int, 0, head_need); |
| 2053 | if (ieee80211_skb_resize(sdata, skb, head_need, true)) | 2053 | if (ieee80211_skb_resize(sdata, skb, head_need, true)) { |
| 2054 | goto fail; | 2054 | ieee80211_free_txskb(&local->hw, skb); |
| 2055 | return NETDEV_TX_OK; | ||
| 2056 | } | ||
| 2055 | } | 2057 | } |
| 2056 | 2058 | ||
| 2057 | if (encaps_data) { | 2059 | if (encaps_data) { |
| @@ -2184,7 +2186,7 @@ void ieee80211_tx_pending(unsigned long data) | |||
| 2184 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); | 2186 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb); |
| 2185 | 2187 | ||
| 2186 | if (WARN_ON(!info->control.vif)) { | 2188 | if (WARN_ON(!info->control.vif)) { |
| 2187 | kfree_skb(skb); | 2189 | ieee80211_free_txskb(&local->hw, skb); |
| 2188 | continue; | 2190 | continue; |
| 2189 | } | 2191 | } |
| 2190 | 2192 | ||
