diff options
74 files changed, 507 insertions, 331 deletions
diff --git a/Documentation/networking/ip-sysctl.txt b/Documentation/networking/ip-sysctl.txt index c7165f4cb792..fe95105992c5 100644 --- a/Documentation/networking/ip-sysctl.txt +++ b/Documentation/networking/ip-sysctl.txt | |||
| @@ -20,6 +20,15 @@ ip_no_pmtu_disc - BOOLEAN | |||
| 20 | min_pmtu - INTEGER | 20 | min_pmtu - INTEGER |
| 21 | default 562 - minimum discovered Path MTU | 21 | default 562 - minimum discovered Path MTU |
| 22 | 22 | ||
| 23 | route/max_size - INTEGER | ||
| 24 | Maximum number of routes allowed in the kernel. Increase | ||
| 25 | this when using large numbers of interfaces and/or routes. | ||
| 26 | |||
| 27 | neigh/default/gc_thresh3 - INTEGER | ||
| 28 | Maximum number of neighbor entries allowed. Increase this | ||
| 29 | when using large numbers of interfaces and when communicating | ||
| 30 | with large numbers of directly-connected peers. | ||
| 31 | |||
| 23 | mtu_expires - INTEGER | 32 | mtu_expires - INTEGER |
| 24 | Time, in seconds, that cached PMTU information is kept. | 33 | Time, in seconds, that cached PMTU information is kept. |
| 25 | 34 | ||
diff --git a/drivers/atm/solos-attrlist.c b/drivers/atm/solos-attrlist.c index 1a9332e4efe0..9a676ee30824 100644 --- a/drivers/atm/solos-attrlist.c +++ b/drivers/atm/solos-attrlist.c | |||
| @@ -1,6 +1,7 @@ | |||
| 1 | SOLOS_ATTR_RO(DriverVersion) | 1 | SOLOS_ATTR_RO(DriverVersion) |
| 2 | SOLOS_ATTR_RO(APIVersion) | 2 | SOLOS_ATTR_RO(APIVersion) |
| 3 | SOLOS_ATTR_RO(FirmwareVersion) | 3 | SOLOS_ATTR_RO(FirmwareVersion) |
| 4 | SOLOS_ATTR_RO(Version) | ||
| 4 | // SOLOS_ATTR_RO(DspVersion) | 5 | // SOLOS_ATTR_RO(DspVersion) |
| 5 | // SOLOS_ATTR_RO(CommonHandshake) | 6 | // SOLOS_ATTR_RO(CommonHandshake) |
| 6 | SOLOS_ATTR_RO(Connected) | 7 | SOLOS_ATTR_RO(Connected) |
diff --git a/drivers/atm/solos-pci.c b/drivers/atm/solos-pci.c index f46138ab38b6..2e08c996fd30 100644 --- a/drivers/atm/solos-pci.c +++ b/drivers/atm/solos-pci.c | |||
| @@ -1161,6 +1161,14 @@ static int fpga_probe(struct pci_dev *dev, const struct pci_device_id *id) | |||
| 1161 | dev_info(&dev->dev, "Solos FPGA Version %d.%02d svn-%d\n", | 1161 | dev_info(&dev->dev, "Solos FPGA Version %d.%02d svn-%d\n", |
| 1162 | major_ver, minor_ver, fpga_ver); | 1162 | major_ver, minor_ver, fpga_ver); |
| 1163 | 1163 | ||
| 1164 | if (fpga_ver < 37 && (fpga_upgrade || firmware_upgrade || | ||
| 1165 | db_fpga_upgrade || db_firmware_upgrade)) { | ||
| 1166 | dev_warn(&dev->dev, | ||
| 1167 | "FPGA too old; cannot upgrade flash. Use JTAG.\n"); | ||
| 1168 | fpga_upgrade = firmware_upgrade = 0; | ||
| 1169 | db_fpga_upgrade = db_firmware_upgrade = 0; | ||
| 1170 | } | ||
| 1171 | |||
| 1164 | if (card->fpga_version >= DMA_SUPPORTED){ | 1172 | if (card->fpga_version >= DMA_SUPPORTED){ |
| 1165 | card->using_dma = 1; | 1173 | card->using_dma = 1; |
| 1166 | } else { | 1174 | } else { |
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c index d120a5c1c093..ab3894f742c3 100644 --- a/drivers/bluetooth/btusb.c +++ b/drivers/bluetooth/btusb.c | |||
| @@ -68,6 +68,9 @@ static struct usb_device_id btusb_table[] = { | |||
| 68 | /* Apple MacBookPro6,2 */ | 68 | /* Apple MacBookPro6,2 */ |
| 69 | { USB_DEVICE(0x05ac, 0x8218) }, | 69 | { USB_DEVICE(0x05ac, 0x8218) }, |
| 70 | 70 | ||
| 71 | /* Apple MacBookAir3,1, MacBookAir3,2 */ | ||
| 72 | { USB_DEVICE(0x05ac, 0x821b) }, | ||
| 73 | |||
| 71 | /* AVM BlueFRITZ! USB v2.0 */ | 74 | /* AVM BlueFRITZ! USB v2.0 */ |
| 72 | { USB_DEVICE(0x057c, 0x3800) }, | 75 | { USB_DEVICE(0x057c, 0x3800) }, |
| 73 | 76 | ||
| @@ -1029,6 +1032,8 @@ static int btusb_probe(struct usb_interface *intf, | |||
| 1029 | 1032 | ||
| 1030 | usb_set_intfdata(intf, data); | 1033 | usb_set_intfdata(intf, data); |
| 1031 | 1034 | ||
| 1035 | usb_enable_autosuspend(interface_to_usbdev(intf)); | ||
| 1036 | |||
| 1032 | return 0; | 1037 | return 0; |
| 1033 | } | 1038 | } |
| 1034 | 1039 | ||
diff --git a/drivers/net/bnx2x/bnx2x_cmn.c b/drivers/net/bnx2x/bnx2x_cmn.c index 459614d2d7bc..94d5f59d5a6f 100644 --- a/drivers/net/bnx2x/bnx2x_cmn.c +++ b/drivers/net/bnx2x/bnx2x_cmn.c | |||
| @@ -1680,7 +1680,7 @@ static inline u32 bnx2x_xmit_type(struct bnx2x *bp, struct sk_buff *skb) | |||
| 1680 | rc = XMIT_PLAIN; | 1680 | rc = XMIT_PLAIN; |
| 1681 | 1681 | ||
| 1682 | else { | 1682 | else { |
| 1683 | if (skb->protocol == htons(ETH_P_IPV6)) { | 1683 | if (vlan_get_protocol(skb) == htons(ETH_P_IPV6)) { |
| 1684 | rc = XMIT_CSUM_V6; | 1684 | rc = XMIT_CSUM_V6; |
| 1685 | if (ipv6_hdr(skb)->nexthdr == IPPROTO_TCP) | 1685 | if (ipv6_hdr(skb)->nexthdr == IPPROTO_TCP) |
| 1686 | rc |= XMIT_CSUM_TCP; | 1686 | rc |= XMIT_CSUM_TCP; |
diff --git a/drivers/net/cxgb4vf/cxgb4vf_main.c b/drivers/net/cxgb4vf/cxgb4vf_main.c index 6de5e2e448a5..c3449bbc585a 100644 --- a/drivers/net/cxgb4vf/cxgb4vf_main.c +++ b/drivers/net/cxgb4vf/cxgb4vf_main.c | |||
| @@ -753,7 +753,9 @@ static int cxgb4vf_open(struct net_device *dev) | |||
| 753 | if (err) | 753 | if (err) |
| 754 | return err; | 754 | return err; |
| 755 | set_bit(pi->port_id, &adapter->open_device_map); | 755 | set_bit(pi->port_id, &adapter->open_device_map); |
| 756 | link_start(dev); | 756 | err = link_start(dev); |
| 757 | if (err) | ||
| 758 | return err; | ||
| 757 | netif_tx_start_all_queues(dev); | 759 | netif_tx_start_all_queues(dev); |
| 758 | return 0; | 760 | return 0; |
| 759 | } | 761 | } |
| @@ -1103,18 +1105,6 @@ static int cxgb4vf_set_mac_addr(struct net_device *dev, void *_addr) | |||
| 1103 | return 0; | 1105 | return 0; |
| 1104 | } | 1106 | } |
| 1105 | 1107 | ||
| 1106 | /* | ||
| 1107 | * Return a TX Queue on which to send the specified skb. | ||
| 1108 | */ | ||
| 1109 | static u16 cxgb4vf_select_queue(struct net_device *dev, struct sk_buff *skb) | ||
| 1110 | { | ||
| 1111 | /* | ||
| 1112 | * XXX For now just use the default hash but we probably want to | ||
| 1113 | * XXX look at other possibilities ... | ||
| 1114 | */ | ||
| 1115 | return skb_tx_hash(dev, skb); | ||
| 1116 | } | ||
| 1117 | |||
| 1118 | #ifdef CONFIG_NET_POLL_CONTROLLER | 1108 | #ifdef CONFIG_NET_POLL_CONTROLLER |
| 1119 | /* | 1109 | /* |
| 1120 | * Poll all of our receive queues. This is called outside of normal interrupt | 1110 | * Poll all of our receive queues. This is called outside of normal interrupt |
| @@ -2075,6 +2065,22 @@ static int adap_init0(struct adapter *adapter) | |||
| 2075 | } | 2065 | } |
| 2076 | 2066 | ||
| 2077 | /* | 2067 | /* |
| 2068 | * Some environments do not properly handle PCIE FLRs -- e.g. in Linux | ||
| 2069 | * 2.6.31 and later we can't call pci_reset_function() in order to | ||
| 2070 | * issue an FLR because of a self- deadlock on the device semaphore. | ||
| 2071 | * Meanwhile, the OS infrastructure doesn't issue FLRs in all the | ||
| 2072 | * cases where they're needed -- for instance, some versions of KVM | ||
| 2073 | * fail to reset "Assigned Devices" when the VM reboots. Therefore we | ||
| 2074 | * use the firmware based reset in order to reset any per function | ||
| 2075 | * state. | ||
| 2076 | */ | ||
| 2077 | err = t4vf_fw_reset(adapter); | ||
| 2078 | if (err < 0) { | ||
| 2079 | dev_err(adapter->pdev_dev, "FW reset failed: err=%d\n", err); | ||
| 2080 | return err; | ||
| 2081 | } | ||
| 2082 | |||
| 2083 | /* | ||
| 2078 | * Grab basic operational parameters. These will predominantly have | 2084 | * Grab basic operational parameters. These will predominantly have |
| 2079 | * been set up by the Physical Function Driver or will be hard coded | 2085 | * been set up by the Physical Function Driver or will be hard coded |
| 2080 | * into the adapter. We just have to live with them ... Note that | 2086 | * into the adapter. We just have to live with them ... Note that |
| @@ -2417,7 +2423,6 @@ static const struct net_device_ops cxgb4vf_netdev_ops = { | |||
| 2417 | .ndo_get_stats = cxgb4vf_get_stats, | 2423 | .ndo_get_stats = cxgb4vf_get_stats, |
| 2418 | .ndo_set_rx_mode = cxgb4vf_set_rxmode, | 2424 | .ndo_set_rx_mode = cxgb4vf_set_rxmode, |
| 2419 | .ndo_set_mac_address = cxgb4vf_set_mac_addr, | 2425 | .ndo_set_mac_address = cxgb4vf_set_mac_addr, |
| 2420 | .ndo_select_queue = cxgb4vf_select_queue, | ||
| 2421 | .ndo_validate_addr = eth_validate_addr, | 2426 | .ndo_validate_addr = eth_validate_addr, |
| 2422 | .ndo_do_ioctl = cxgb4vf_do_ioctl, | 2427 | .ndo_do_ioctl = cxgb4vf_do_ioctl, |
| 2423 | .ndo_change_mtu = cxgb4vf_change_mtu, | 2428 | .ndo_change_mtu = cxgb4vf_change_mtu, |
| @@ -2624,7 +2629,6 @@ static int __devinit cxgb4vf_pci_probe(struct pci_dev *pdev, | |||
| 2624 | netdev->do_ioctl = cxgb4vf_do_ioctl; | 2629 | netdev->do_ioctl = cxgb4vf_do_ioctl; |
| 2625 | netdev->change_mtu = cxgb4vf_change_mtu; | 2630 | netdev->change_mtu = cxgb4vf_change_mtu; |
| 2626 | netdev->set_mac_address = cxgb4vf_set_mac_addr; | 2631 | netdev->set_mac_address = cxgb4vf_set_mac_addr; |
| 2627 | netdev->select_queue = cxgb4vf_select_queue; | ||
| 2628 | #ifdef CONFIG_NET_POLL_CONTROLLER | 2632 | #ifdef CONFIG_NET_POLL_CONTROLLER |
| 2629 | netdev->poll_controller = cxgb4vf_poll_controller; | 2633 | netdev->poll_controller = cxgb4vf_poll_controller; |
| 2630 | #endif | 2634 | #endif |
| @@ -2843,6 +2847,14 @@ static struct pci_device_id cxgb4vf_pci_tbl[] = { | |||
| 2843 | CH_DEVICE(0x4800, 0), /* T440-dbg */ | 2847 | CH_DEVICE(0x4800, 0), /* T440-dbg */ |
| 2844 | CH_DEVICE(0x4801, 0), /* T420-cr */ | 2848 | CH_DEVICE(0x4801, 0), /* T420-cr */ |
| 2845 | CH_DEVICE(0x4802, 0), /* T422-cr */ | 2849 | CH_DEVICE(0x4802, 0), /* T422-cr */ |
| 2850 | CH_DEVICE(0x4803, 0), /* T440-cr */ | ||
| 2851 | CH_DEVICE(0x4804, 0), /* T420-bch */ | ||
| 2852 | CH_DEVICE(0x4805, 0), /* T440-bch */ | ||
| 2853 | CH_DEVICE(0x4806, 0), /* T460-ch */ | ||
| 2854 | CH_DEVICE(0x4807, 0), /* T420-so */ | ||
| 2855 | CH_DEVICE(0x4808, 0), /* T420-cx */ | ||
| 2856 | CH_DEVICE(0x4809, 0), /* T420-bt */ | ||
| 2857 | CH_DEVICE(0x480a, 0), /* T404-bt */ | ||
| 2846 | { 0, } | 2858 | { 0, } |
| 2847 | }; | 2859 | }; |
| 2848 | 2860 | ||
diff --git a/drivers/net/cxgb4vf/sge.c b/drivers/net/cxgb4vf/sge.c index f10864ddafbe..ecf0770bf0ff 100644 --- a/drivers/net/cxgb4vf/sge.c +++ b/drivers/net/cxgb4vf/sge.c | |||
| @@ -154,13 +154,14 @@ enum { | |||
| 154 | */ | 154 | */ |
| 155 | RX_COPY_THRES = 256, | 155 | RX_COPY_THRES = 256, |
| 156 | RX_PULL_LEN = 128, | 156 | RX_PULL_LEN = 128, |
| 157 | }; | ||
| 158 | 157 | ||
| 159 | /* | 158 | /* |
| 160 | * Can't define this in the above enum because PKTSHIFT isn't a constant in | 159 | * Main body length for sk_buffs used for RX Ethernet packets with |
| 161 | * the VF Driver ... | 160 | * fragments. Should be >= RX_PULL_LEN but possibly bigger to give |
| 162 | */ | 161 | * pskb_may_pull() some room. |
| 163 | #define RX_PKT_PULL_LEN (RX_PULL_LEN + PKTSHIFT) | 162 | */ |
| 163 | RX_SKB_LEN = 512, | ||
| 164 | }; | ||
| 164 | 165 | ||
| 165 | /* | 166 | /* |
| 166 | * Software state per TX descriptor. | 167 | * Software state per TX descriptor. |
| @@ -1355,6 +1356,67 @@ out_free: | |||
| 1355 | } | 1356 | } |
| 1356 | 1357 | ||
| 1357 | /** | 1358 | /** |
| 1359 | * t4vf_pktgl_to_skb - build an sk_buff from a packet gather list | ||
| 1360 | * @gl: the gather list | ||
| 1361 | * @skb_len: size of sk_buff main body if it carries fragments | ||
| 1362 | * @pull_len: amount of data to move to the sk_buff's main body | ||
| 1363 | * | ||
| 1364 | * Builds an sk_buff from the given packet gather list. Returns the | ||
| 1365 | * sk_buff or %NULL if sk_buff allocation failed. | ||
| 1366 | */ | ||
| 1367 | struct sk_buff *t4vf_pktgl_to_skb(const struct pkt_gl *gl, | ||
| 1368 | unsigned int skb_len, unsigned int pull_len) | ||
| 1369 | { | ||
| 1370 | struct sk_buff *skb; | ||
| 1371 | struct skb_shared_info *ssi; | ||
| 1372 | |||
| 1373 | /* | ||
| 1374 | * If the ingress packet is small enough, allocate an skb large enough | ||
| 1375 | * for all of the data and copy it inline. Otherwise, allocate an skb | ||
| 1376 | * with enough room to pull in the header and reference the rest of | ||
| 1377 | * the data via the skb fragment list. | ||
| 1378 | * | ||
| 1379 | * Below we rely on RX_COPY_THRES being less than the smallest Rx | ||
| 1380 | * buff! size, which is expected since buffers are at least | ||
| 1381 | * PAGE_SIZEd. In this case packets up to RX_COPY_THRES have only one | ||
| 1382 | * fragment. | ||
| 1383 | */ | ||
| 1384 | if (gl->tot_len <= RX_COPY_THRES) { | ||
| 1385 | /* small packets have only one fragment */ | ||
| 1386 | skb = alloc_skb(gl->tot_len, GFP_ATOMIC); | ||
| 1387 | if (unlikely(!skb)) | ||
| 1388 | goto out; | ||
| 1389 | __skb_put(skb, gl->tot_len); | ||
| 1390 | skb_copy_to_linear_data(skb, gl->va, gl->tot_len); | ||
| 1391 | } else { | ||
| 1392 | skb = alloc_skb(skb_len, GFP_ATOMIC); | ||
| 1393 | if (unlikely(!skb)) | ||
| 1394 | goto out; | ||
| 1395 | __skb_put(skb, pull_len); | ||
| 1396 | skb_copy_to_linear_data(skb, gl->va, pull_len); | ||
| 1397 | |||
| 1398 | ssi = skb_shinfo(skb); | ||
| 1399 | ssi->frags[0].page = gl->frags[0].page; | ||
| 1400 | ssi->frags[0].page_offset = gl->frags[0].page_offset + pull_len; | ||
| 1401 | ssi->frags[0].size = gl->frags[0].size - pull_len; | ||
| 1402 | if (gl->nfrags > 1) | ||
| 1403 | memcpy(&ssi->frags[1], &gl->frags[1], | ||
| 1404 | (gl->nfrags-1) * sizeof(skb_frag_t)); | ||
| 1405 | ssi->nr_frags = gl->nfrags; | ||
| 1406 | |||
| 1407 | skb->len = gl->tot_len; | ||
| 1408 | skb->data_len = skb->len - pull_len; | ||
| 1409 | skb->truesize += skb->data_len; | ||
| 1410 | |||
| 1411 | /* Get a reference for the last page, we don't own it */ | ||
| 1412 | get_page(gl->frags[gl->nfrags - 1].page); | ||
| 1413 | } | ||
| 1414 | |||
| 1415 | out: | ||
| 1416 | return skb; | ||
| 1417 | } | ||
| 1418 | |||
| 1419 | /** | ||
| 1358 | * t4vf_pktgl_free - free a packet gather list | 1420 | * t4vf_pktgl_free - free a packet gather list |
| 1359 | * @gl: the gather list | 1421 | * @gl: the gather list |
| 1360 | * | 1422 | * |
| @@ -1463,10 +1525,8 @@ int t4vf_ethrx_handler(struct sge_rspq *rspq, const __be64 *rsp, | |||
| 1463 | { | 1525 | { |
| 1464 | struct sk_buff *skb; | 1526 | struct sk_buff *skb; |
| 1465 | struct port_info *pi; | 1527 | struct port_info *pi; |
| 1466 | struct skb_shared_info *ssi; | ||
| 1467 | const struct cpl_rx_pkt *pkt = (void *)&rsp[1]; | 1528 | const struct cpl_rx_pkt *pkt = (void *)&rsp[1]; |
| 1468 | bool csum_ok = pkt->csum_calc && !pkt->err_vec; | 1529 | bool csum_ok = pkt->csum_calc && !pkt->err_vec; |
| 1469 | unsigned int len = be16_to_cpu(pkt->len); | ||
| 1470 | struct sge_eth_rxq *rxq = container_of(rspq, struct sge_eth_rxq, rspq); | 1530 | struct sge_eth_rxq *rxq = container_of(rspq, struct sge_eth_rxq, rspq); |
| 1471 | 1531 | ||
| 1472 | /* | 1532 | /* |
| @@ -1481,42 +1541,14 @@ int t4vf_ethrx_handler(struct sge_rspq *rspq, const __be64 *rsp, | |||
| 1481 | } | 1541 | } |
| 1482 | 1542 | ||
| 1483 | /* | 1543 | /* |
| 1484 | * If the ingress packet is small enough, allocate an skb large enough | 1544 | * Convert the Packet Gather List into an skb. |
| 1485 | * for all of the data and copy it inline. Otherwise, allocate an skb | ||
| 1486 | * with enough room to pull in the header and reference the rest of | ||
| 1487 | * the data via the skb fragment list. | ||
| 1488 | */ | 1545 | */ |
| 1489 | if (len <= RX_COPY_THRES) { | 1546 | skb = t4vf_pktgl_to_skb(gl, RX_SKB_LEN, RX_PULL_LEN); |
| 1490 | /* small packets have only one fragment */ | 1547 | if (unlikely(!skb)) { |
| 1491 | skb = alloc_skb(gl->frags[0].size, GFP_ATOMIC); | 1548 | t4vf_pktgl_free(gl); |
| 1492 | if (!skb) | 1549 | rxq->stats.rx_drops++; |
| 1493 | goto nomem; | 1550 | return 0; |
| 1494 | __skb_put(skb, gl->frags[0].size); | ||
| 1495 | skb_copy_to_linear_data(skb, gl->va, gl->frags[0].size); | ||
| 1496 | } else { | ||
| 1497 | skb = alloc_skb(RX_PKT_PULL_LEN, GFP_ATOMIC); | ||
| 1498 | if (!skb) | ||
| 1499 | goto nomem; | ||
| 1500 | __skb_put(skb, RX_PKT_PULL_LEN); | ||
| 1501 | skb_copy_to_linear_data(skb, gl->va, RX_PKT_PULL_LEN); | ||
| 1502 | |||
| 1503 | ssi = skb_shinfo(skb); | ||
| 1504 | ssi->frags[0].page = gl->frags[0].page; | ||
| 1505 | ssi->frags[0].page_offset = (gl->frags[0].page_offset + | ||
| 1506 | RX_PKT_PULL_LEN); | ||
| 1507 | ssi->frags[0].size = gl->frags[0].size - RX_PKT_PULL_LEN; | ||
| 1508 | if (gl->nfrags > 1) | ||
| 1509 | memcpy(&ssi->frags[1], &gl->frags[1], | ||
| 1510 | (gl->nfrags-1) * sizeof(skb_frag_t)); | ||
| 1511 | ssi->nr_frags = gl->nfrags; | ||
| 1512 | skb->len = len + PKTSHIFT; | ||
| 1513 | skb->data_len = skb->len - RX_PKT_PULL_LEN; | ||
| 1514 | skb->truesize += skb->data_len; | ||
| 1515 | |||
| 1516 | /* Get a reference for the last page, we don't own it */ | ||
| 1517 | get_page(gl->frags[gl->nfrags - 1].page); | ||
| 1518 | } | 1551 | } |
| 1519 | |||
| 1520 | __skb_pull(skb, PKTSHIFT); | 1552 | __skb_pull(skb, PKTSHIFT); |
| 1521 | skb->protocol = eth_type_trans(skb, rspq->netdev); | 1553 | skb->protocol = eth_type_trans(skb, rspq->netdev); |
| 1522 | skb_record_rx_queue(skb, rspq->idx); | 1554 | skb_record_rx_queue(skb, rspq->idx); |
| @@ -1549,11 +1581,6 @@ int t4vf_ethrx_handler(struct sge_rspq *rspq, const __be64 *rsp, | |||
| 1549 | netif_receive_skb(skb); | 1581 | netif_receive_skb(skb); |
| 1550 | 1582 | ||
| 1551 | return 0; | 1583 | return 0; |
| 1552 | |||
| 1553 | nomem: | ||
| 1554 | t4vf_pktgl_free(gl); | ||
| 1555 | rxq->stats.rx_drops++; | ||
| 1556 | return 0; | ||
| 1557 | } | 1584 | } |
| 1558 | 1585 | ||
| 1559 | /** | 1586 | /** |
| @@ -1679,6 +1706,7 @@ int process_responses(struct sge_rspq *rspq, int budget) | |||
| 1679 | } | 1706 | } |
| 1680 | len = RSPD_LEN(len); | 1707 | len = RSPD_LEN(len); |
| 1681 | } | 1708 | } |
| 1709 | gl.tot_len = len; | ||
| 1682 | 1710 | ||
| 1683 | /* | 1711 | /* |
| 1684 | * Gather packet fragments. | 1712 | * Gather packet fragments. |
diff --git a/drivers/net/cxgb4vf/t4vf_common.h b/drivers/net/cxgb4vf/t4vf_common.h index 873cb7d86c57..a65c80aed1f2 100644 --- a/drivers/net/cxgb4vf/t4vf_common.h +++ b/drivers/net/cxgb4vf/t4vf_common.h | |||
| @@ -235,6 +235,7 @@ static inline int t4vf_wr_mbox_ns(struct adapter *adapter, const void *cmd, | |||
| 235 | int __devinit t4vf_wait_dev_ready(struct adapter *); | 235 | int __devinit t4vf_wait_dev_ready(struct adapter *); |
| 236 | int __devinit t4vf_port_init(struct adapter *, int); | 236 | int __devinit t4vf_port_init(struct adapter *, int); |
| 237 | 237 | ||
| 238 | int t4vf_fw_reset(struct adapter *); | ||
| 238 | int t4vf_query_params(struct adapter *, unsigned int, const u32 *, u32 *); | 239 | int t4vf_query_params(struct adapter *, unsigned int, const u32 *, u32 *); |
| 239 | int t4vf_set_params(struct adapter *, unsigned int, const u32 *, const u32 *); | 240 | int t4vf_set_params(struct adapter *, unsigned int, const u32 *, const u32 *); |
| 240 | 241 | ||
diff --git a/drivers/net/cxgb4vf/t4vf_hw.c b/drivers/net/cxgb4vf/t4vf_hw.c index ea1c123f0cb4..e306c20dfaee 100644 --- a/drivers/net/cxgb4vf/t4vf_hw.c +++ b/drivers/net/cxgb4vf/t4vf_hw.c | |||
| @@ -326,6 +326,25 @@ int __devinit t4vf_port_init(struct adapter *adapter, int pidx) | |||
| 326 | } | 326 | } |
| 327 | 327 | ||
| 328 | /** | 328 | /** |
| 329 | * t4vf_fw_reset - issue a reset to FW | ||
| 330 | * @adapter: the adapter | ||
| 331 | * | ||
| 332 | * Issues a reset command to FW. For a Physical Function this would | ||
| 333 | * result in the Firmware reseting all of its state. For a Virtual | ||
| 334 | * Function this just resets the state associated with the VF. | ||
| 335 | */ | ||
| 336 | int t4vf_fw_reset(struct adapter *adapter) | ||
| 337 | { | ||
| 338 | struct fw_reset_cmd cmd; | ||
| 339 | |||
| 340 | memset(&cmd, 0, sizeof(cmd)); | ||
| 341 | cmd.op_to_write = cpu_to_be32(FW_CMD_OP(FW_RESET_CMD) | | ||
| 342 | FW_CMD_WRITE); | ||
| 343 | cmd.retval_len16 = cpu_to_be32(FW_LEN16(cmd)); | ||
| 344 | return t4vf_wr_mbox(adapter, &cmd, sizeof(cmd), NULL); | ||
| 345 | } | ||
| 346 | |||
| 347 | /** | ||
| 329 | * t4vf_query_params - query FW or device parameters | 348 | * t4vf_query_params - query FW or device parameters |
| 330 | * @adapter: the adapter | 349 | * @adapter: the adapter |
| 331 | * @nparams: the number of parameters | 350 | * @nparams: the number of parameters |
diff --git a/drivers/net/gianfar_ethtool.c b/drivers/net/gianfar_ethtool.c index 5c566ebc54b8..3bc8e276ba4d 100644 --- a/drivers/net/gianfar_ethtool.c +++ b/drivers/net/gianfar_ethtool.c | |||
| @@ -635,9 +635,10 @@ static int gfar_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol) | |||
| 635 | if (wol->wolopts & ~WAKE_MAGIC) | 635 | if (wol->wolopts & ~WAKE_MAGIC) |
| 636 | return -EINVAL; | 636 | return -EINVAL; |
| 637 | 637 | ||
| 638 | device_set_wakeup_enable(&dev->dev, wol->wolopts & WAKE_MAGIC); | ||
| 639 | |||
| 638 | spin_lock_irqsave(&priv->bflock, flags); | 640 | spin_lock_irqsave(&priv->bflock, flags); |
| 639 | priv->wol_en = wol->wolopts & WAKE_MAGIC ? 1 : 0; | 641 | priv->wol_en = !!device_may_wakeup(&dev->dev); |
| 640 | device_set_wakeup_enable(&dev->dev, priv->wol_en); | ||
| 641 | spin_unlock_irqrestore(&priv->bflock, flags); | 642 | spin_unlock_irqrestore(&priv->bflock, flags); |
| 642 | 643 | ||
| 643 | return 0; | 644 | return 0; |
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c index 2bd3eb4ee5a1..fbad4d819608 100644 --- a/drivers/net/ixgbe/ixgbe_main.c +++ b/drivers/net/ixgbe/ixgbe_main.c | |||
| @@ -764,8 +764,9 @@ static bool ixgbe_clean_tx_irq(struct ixgbe_q_vector *q_vector, | |||
| 764 | #ifdef IXGBE_FCOE | 764 | #ifdef IXGBE_FCOE |
| 765 | /* adjust for FCoE Sequence Offload */ | 765 | /* adjust for FCoE Sequence Offload */ |
| 766 | if ((adapter->flags & IXGBE_FLAG_FCOE_ENABLED) | 766 | if ((adapter->flags & IXGBE_FLAG_FCOE_ENABLED) |
| 767 | && (skb->protocol == htons(ETH_P_FCOE)) && | 767 | && skb_is_gso(skb) |
| 768 | skb_is_gso(skb)) { | 768 | && vlan_get_protocol(skb) == |
| 769 | htons(ETH_P_FCOE)) { | ||
| 769 | hlen = skb_transport_offset(skb) + | 770 | hlen = skb_transport_offset(skb) + |
| 770 | sizeof(struct fc_frame_header) + | 771 | sizeof(struct fc_frame_header) + |
| 771 | sizeof(struct fcoe_crc_eof); | 772 | sizeof(struct fcoe_crc_eof); |
| @@ -5823,7 +5824,7 @@ static void ixgbe_watchdog_task(struct work_struct *work) | |||
| 5823 | 5824 | ||
| 5824 | static int ixgbe_tso(struct ixgbe_adapter *adapter, | 5825 | static int ixgbe_tso(struct ixgbe_adapter *adapter, |
| 5825 | struct ixgbe_ring *tx_ring, struct sk_buff *skb, | 5826 | struct ixgbe_ring *tx_ring, struct sk_buff *skb, |
| 5826 | u32 tx_flags, u8 *hdr_len) | 5827 | u32 tx_flags, u8 *hdr_len, __be16 protocol) |
| 5827 | { | 5828 | { |
| 5828 | struct ixgbe_adv_tx_context_desc *context_desc; | 5829 | struct ixgbe_adv_tx_context_desc *context_desc; |
| 5829 | unsigned int i; | 5830 | unsigned int i; |
| @@ -5841,7 +5842,7 @@ static int ixgbe_tso(struct ixgbe_adapter *adapter, | |||
| 5841 | l4len = tcp_hdrlen(skb); | 5842 | l4len = tcp_hdrlen(skb); |
| 5842 | *hdr_len += l4len; | 5843 | *hdr_len += l4len; |
| 5843 | 5844 | ||
| 5844 | if (skb->protocol == htons(ETH_P_IP)) { | 5845 | if (protocol == htons(ETH_P_IP)) { |
| 5845 | struct iphdr *iph = ip_hdr(skb); | 5846 | struct iphdr *iph = ip_hdr(skb); |
| 5846 | iph->tot_len = 0; | 5847 | iph->tot_len = 0; |
| 5847 | iph->check = 0; | 5848 | iph->check = 0; |
| @@ -5880,7 +5881,7 @@ static int ixgbe_tso(struct ixgbe_adapter *adapter, | |||
| 5880 | type_tucmd_mlhl = (IXGBE_TXD_CMD_DEXT | | 5881 | type_tucmd_mlhl = (IXGBE_TXD_CMD_DEXT | |
| 5881 | IXGBE_ADVTXD_DTYP_CTXT); | 5882 | IXGBE_ADVTXD_DTYP_CTXT); |
| 5882 | 5883 | ||
| 5883 | if (skb->protocol == htons(ETH_P_IP)) | 5884 | if (protocol == htons(ETH_P_IP)) |
| 5884 | type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_IPV4; | 5885 | type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_IPV4; |
| 5885 | type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_L4T_TCP; | 5886 | type_tucmd_mlhl |= IXGBE_ADVTXD_TUCMD_L4T_TCP; |
| 5886 | context_desc->type_tucmd_mlhl = cpu_to_le32(type_tucmd_mlhl); | 5887 | context_desc->type_tucmd_mlhl = cpu_to_le32(type_tucmd_mlhl); |
| @@ -5906,16 +5907,10 @@ static int ixgbe_tso(struct ixgbe_adapter *adapter, | |||
| 5906 | return false; | 5907 | return false; |
| 5907 | } | 5908 | } |
| 5908 | 5909 | ||
| 5909 | static u32 ixgbe_psum(struct ixgbe_adapter *adapter, struct sk_buff *skb) | 5910 | static u32 ixgbe_psum(struct ixgbe_adapter *adapter, struct sk_buff *skb, |
| 5911 | __be16 protocol) | ||
| 5910 | { | 5912 | { |
| 5911 | u32 rtn = 0; | 5913 | u32 rtn = 0; |
| 5912 | __be16 protocol; | ||
| 5913 | |||
| 5914 | if (skb->protocol == cpu_to_be16(ETH_P_8021Q)) | ||
| 5915 | protocol = ((const struct vlan_ethhdr *)skb->data)-> | ||
| 5916 | h_vlan_encapsulated_proto; | ||
| 5917 | else | ||
| 5918 | protocol = skb->protocol; | ||
| 5919 | 5914 | ||
| 5920 | switch (protocol) { | 5915 | switch (protocol) { |
| 5921 | case cpu_to_be16(ETH_P_IP): | 5916 | case cpu_to_be16(ETH_P_IP): |
| @@ -5943,7 +5938,7 @@ static u32 ixgbe_psum(struct ixgbe_adapter *adapter, struct sk_buff *skb) | |||
| 5943 | default: | 5938 | default: |
| 5944 | if (unlikely(net_ratelimit())) | 5939 | if (unlikely(net_ratelimit())) |
| 5945 | e_warn(probe, "partial checksum but proto=%x!\n", | 5940 | e_warn(probe, "partial checksum but proto=%x!\n", |
| 5946 | skb->protocol); | 5941 | protocol); |
| 5947 | break; | 5942 | break; |
| 5948 | } | 5943 | } |
| 5949 | 5944 | ||
| @@ -5952,7 +5947,8 @@ static u32 ixgbe_psum(struct ixgbe_adapter *adapter, struct sk_buff *skb) | |||
| 5952 | 5947 | ||
| 5953 | static bool ixgbe_tx_csum(struct ixgbe_adapter *adapter, | 5948 | static bool ixgbe_tx_csum(struct ixgbe_adapter *adapter, |
| 5954 | struct ixgbe_ring *tx_ring, | 5949 | struct ixgbe_ring *tx_ring, |
| 5955 | struct sk_buff *skb, u32 tx_flags) | 5950 | struct sk_buff *skb, u32 tx_flags, |
| 5951 | __be16 protocol) | ||
| 5956 | { | 5952 | { |
| 5957 | struct ixgbe_adv_tx_context_desc *context_desc; | 5953 | struct ixgbe_adv_tx_context_desc *context_desc; |
| 5958 | unsigned int i; | 5954 | unsigned int i; |
| @@ -5981,7 +5977,7 @@ static bool ixgbe_tx_csum(struct ixgbe_adapter *adapter, | |||
| 5981 | IXGBE_ADVTXD_DTYP_CTXT); | 5977 | IXGBE_ADVTXD_DTYP_CTXT); |
| 5982 | 5978 | ||
| 5983 | if (skb->ip_summed == CHECKSUM_PARTIAL) | 5979 | if (skb->ip_summed == CHECKSUM_PARTIAL) |
| 5984 | type_tucmd_mlhl |= ixgbe_psum(adapter, skb); | 5980 | type_tucmd_mlhl |= ixgbe_psum(adapter, skb, protocol); |
| 5985 | 5981 | ||
| 5986 | context_desc->type_tucmd_mlhl = cpu_to_le32(type_tucmd_mlhl); | 5982 | context_desc->type_tucmd_mlhl = cpu_to_le32(type_tucmd_mlhl); |
| 5987 | /* use index zero for tx checksum offload */ | 5983 | /* use index zero for tx checksum offload */ |
| @@ -6179,7 +6175,7 @@ static void ixgbe_tx_queue(struct ixgbe_adapter *adapter, | |||
| 6179 | } | 6175 | } |
| 6180 | 6176 | ||
| 6181 | static void ixgbe_atr(struct ixgbe_adapter *adapter, struct sk_buff *skb, | 6177 | static void ixgbe_atr(struct ixgbe_adapter *adapter, struct sk_buff *skb, |
| 6182 | int queue, u32 tx_flags) | 6178 | int queue, u32 tx_flags, __be16 protocol) |
| 6183 | { | 6179 | { |
| 6184 | struct ixgbe_atr_input atr_input; | 6180 | struct ixgbe_atr_input atr_input; |
| 6185 | struct tcphdr *th; | 6181 | struct tcphdr *th; |
| @@ -6190,7 +6186,7 @@ static void ixgbe_atr(struct ixgbe_adapter *adapter, struct sk_buff *skb, | |||
| 6190 | u8 l4type = 0; | 6186 | u8 l4type = 0; |
| 6191 | 6187 | ||
| 6192 | /* Right now, we support IPv4 only */ | 6188 | /* Right now, we support IPv4 only */ |
| 6193 | if (skb->protocol != htons(ETH_P_IP)) | 6189 | if (protocol != htons(ETH_P_IP)) |
| 6194 | return; | 6190 | return; |
| 6195 | /* check if we're UDP or TCP */ | 6191 | /* check if we're UDP or TCP */ |
| 6196 | if (iph->protocol == IPPROTO_TCP) { | 6192 | if (iph->protocol == IPPROTO_TCP) { |
| @@ -6257,10 +6253,13 @@ static u16 ixgbe_select_queue(struct net_device *dev, struct sk_buff *skb) | |||
| 6257 | { | 6253 | { |
| 6258 | struct ixgbe_adapter *adapter = netdev_priv(dev); | 6254 | struct ixgbe_adapter *adapter = netdev_priv(dev); |
| 6259 | int txq = smp_processor_id(); | 6255 | int txq = smp_processor_id(); |
| 6260 | |||
| 6261 | #ifdef IXGBE_FCOE | 6256 | #ifdef IXGBE_FCOE |
| 6262 | if ((skb->protocol == htons(ETH_P_FCOE)) || | 6257 | __be16 protocol; |
| 6263 | (skb->protocol == htons(ETH_P_FIP))) { | 6258 | |
| 6259 | protocol = vlan_get_protocol(skb); | ||
| 6260 | |||
| 6261 | if ((protocol == htons(ETH_P_FCOE)) || | ||
| 6262 | (protocol == htons(ETH_P_FIP))) { | ||
| 6264 | if (adapter->flags & IXGBE_FLAG_FCOE_ENABLED) { | 6263 | if (adapter->flags & IXGBE_FLAG_FCOE_ENABLED) { |
| 6265 | txq &= (adapter->ring_feature[RING_F_FCOE].indices - 1); | 6264 | txq &= (adapter->ring_feature[RING_F_FCOE].indices - 1); |
| 6266 | txq += adapter->ring_feature[RING_F_FCOE].mask; | 6265 | txq += adapter->ring_feature[RING_F_FCOE].mask; |
| @@ -6303,6 +6302,9 @@ netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb, struct net_device *netdev | |||
| 6303 | int tso; | 6302 | int tso; |
| 6304 | int count = 0; | 6303 | int count = 0; |
| 6305 | unsigned int f; | 6304 | unsigned int f; |
| 6305 | __be16 protocol; | ||
| 6306 | |||
| 6307 | protocol = vlan_get_protocol(skb); | ||
| 6306 | 6308 | ||
| 6307 | if (vlan_tx_tag_present(skb)) { | 6309 | if (vlan_tx_tag_present(skb)) { |
| 6308 | tx_flags |= vlan_tx_tag_get(skb); | 6310 | tx_flags |= vlan_tx_tag_get(skb); |
| @@ -6323,8 +6325,8 @@ netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb, struct net_device *netdev | |||
| 6323 | /* for FCoE with DCB, we force the priority to what | 6325 | /* for FCoE with DCB, we force the priority to what |
| 6324 | * was specified by the switch */ | 6326 | * was specified by the switch */ |
| 6325 | if (adapter->flags & IXGBE_FLAG_FCOE_ENABLED && | 6327 | if (adapter->flags & IXGBE_FLAG_FCOE_ENABLED && |
| 6326 | (skb->protocol == htons(ETH_P_FCOE) || | 6328 | (protocol == htons(ETH_P_FCOE) || |
| 6327 | skb->protocol == htons(ETH_P_FIP))) { | 6329 | protocol == htons(ETH_P_FIP))) { |
| 6328 | #ifdef CONFIG_IXGBE_DCB | 6330 | #ifdef CONFIG_IXGBE_DCB |
| 6329 | if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) { | 6331 | if (adapter->flags & IXGBE_FLAG_DCB_ENABLED) { |
| 6330 | tx_flags &= ~(IXGBE_TX_FLAGS_VLAN_PRIO_MASK | 6332 | tx_flags &= ~(IXGBE_TX_FLAGS_VLAN_PRIO_MASK |
| @@ -6334,7 +6336,7 @@ netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb, struct net_device *netdev | |||
| 6334 | } | 6336 | } |
| 6335 | #endif | 6337 | #endif |
| 6336 | /* flag for FCoE offloads */ | 6338 | /* flag for FCoE offloads */ |
| 6337 | if (skb->protocol == htons(ETH_P_FCOE)) | 6339 | if (protocol == htons(ETH_P_FCOE)) |
| 6338 | tx_flags |= IXGBE_TX_FLAGS_FCOE; | 6340 | tx_flags |= IXGBE_TX_FLAGS_FCOE; |
| 6339 | } | 6341 | } |
| 6340 | #endif | 6342 | #endif |
| @@ -6368,9 +6370,10 @@ netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb, struct net_device *netdev | |||
| 6368 | tx_flags |= IXGBE_TX_FLAGS_FSO; | 6370 | tx_flags |= IXGBE_TX_FLAGS_FSO; |
| 6369 | #endif /* IXGBE_FCOE */ | 6371 | #endif /* IXGBE_FCOE */ |
| 6370 | } else { | 6372 | } else { |
| 6371 | if (skb->protocol == htons(ETH_P_IP)) | 6373 | if (protocol == htons(ETH_P_IP)) |
| 6372 | tx_flags |= IXGBE_TX_FLAGS_IPV4; | 6374 | tx_flags |= IXGBE_TX_FLAGS_IPV4; |
| 6373 | tso = ixgbe_tso(adapter, tx_ring, skb, tx_flags, &hdr_len); | 6375 | tso = ixgbe_tso(adapter, tx_ring, skb, tx_flags, &hdr_len, |
| 6376 | protocol); | ||
| 6374 | if (tso < 0) { | 6377 | if (tso < 0) { |
| 6375 | dev_kfree_skb_any(skb); | 6378 | dev_kfree_skb_any(skb); |
| 6376 | return NETDEV_TX_OK; | 6379 | return NETDEV_TX_OK; |
| @@ -6378,7 +6381,8 @@ netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb, struct net_device *netdev | |||
| 6378 | 6381 | ||
| 6379 | if (tso) | 6382 | if (tso) |
| 6380 | tx_flags |= IXGBE_TX_FLAGS_TSO; | 6383 | tx_flags |= IXGBE_TX_FLAGS_TSO; |
| 6381 | else if (ixgbe_tx_csum(adapter, tx_ring, skb, tx_flags) && | 6384 | else if (ixgbe_tx_csum(adapter, tx_ring, skb, tx_flags, |
| 6385 | protocol) && | ||
| 6382 | (skb->ip_summed == CHECKSUM_PARTIAL)) | 6386 | (skb->ip_summed == CHECKSUM_PARTIAL)) |
| 6383 | tx_flags |= IXGBE_TX_FLAGS_CSUM; | 6387 | tx_flags |= IXGBE_TX_FLAGS_CSUM; |
| 6384 | } | 6388 | } |
| @@ -6392,7 +6396,7 @@ netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb, struct net_device *netdev | |||
| 6392 | test_bit(__IXGBE_FDIR_INIT_DONE, | 6396 | test_bit(__IXGBE_FDIR_INIT_DONE, |
| 6393 | &tx_ring->reinit_state)) { | 6397 | &tx_ring->reinit_state)) { |
| 6394 | ixgbe_atr(adapter, skb, tx_ring->queue_index, | 6398 | ixgbe_atr(adapter, skb, tx_ring->queue_index, |
| 6395 | tx_flags); | 6399 | tx_flags, protocol); |
| 6396 | tx_ring->atr_count = 0; | 6400 | tx_ring->atr_count = 0; |
| 6397 | } | 6401 | } |
| 6398 | } | 6402 | } |
diff --git a/drivers/net/pcmcia/axnet_cs.c b/drivers/net/pcmcia/axnet_cs.c index d2e166e29dda..8a4d19e5de06 100644 --- a/drivers/net/pcmcia/axnet_cs.c +++ b/drivers/net/pcmcia/axnet_cs.c | |||
| @@ -111,13 +111,14 @@ static irqreturn_t ax_interrupt(int irq, void *dev_id); | |||
| 111 | 111 | ||
| 112 | typedef struct axnet_dev_t { | 112 | typedef struct axnet_dev_t { |
| 113 | struct pcmcia_device *p_dev; | 113 | struct pcmcia_device *p_dev; |
| 114 | caddr_t base; | 114 | caddr_t base; |
| 115 | struct timer_list watchdog; | 115 | struct timer_list watchdog; |
| 116 | int stale, fast_poll; | 116 | int stale, fast_poll; |
| 117 | u_short link_status; | 117 | u_short link_status; |
| 118 | u_char duplex_flag; | 118 | u_char duplex_flag; |
| 119 | int phy_id; | 119 | int phy_id; |
| 120 | int flags; | 120 | int flags; |
| 121 | int active_low; | ||
| 121 | } axnet_dev_t; | 122 | } axnet_dev_t; |
| 122 | 123 | ||
| 123 | static inline axnet_dev_t *PRIV(struct net_device *dev) | 124 | static inline axnet_dev_t *PRIV(struct net_device *dev) |
| @@ -322,6 +323,8 @@ static int axnet_config(struct pcmcia_device *link) | |||
| 322 | if (info->flags & IS_AX88790) | 323 | if (info->flags & IS_AX88790) |
| 323 | outb(0x10, dev->base_addr + AXNET_GPIO); /* select Internal PHY */ | 324 | outb(0x10, dev->base_addr + AXNET_GPIO); /* select Internal PHY */ |
| 324 | 325 | ||
| 326 | info->active_low = 0; | ||
| 327 | |||
| 325 | for (i = 0; i < 32; i++) { | 328 | for (i = 0; i < 32; i++) { |
| 326 | j = mdio_read(dev->base_addr + AXNET_MII_EEP, i, 1); | 329 | j = mdio_read(dev->base_addr + AXNET_MII_EEP, i, 1); |
| 327 | j2 = mdio_read(dev->base_addr + AXNET_MII_EEP, i, 2); | 330 | j2 = mdio_read(dev->base_addr + AXNET_MII_EEP, i, 2); |
| @@ -329,15 +332,18 @@ static int axnet_config(struct pcmcia_device *link) | |||
| 329 | if ((j != 0) && (j != 0xffff)) break; | 332 | if ((j != 0) && (j != 0xffff)) break; |
| 330 | } | 333 | } |
| 331 | 334 | ||
| 332 | /* Maybe PHY is in power down mode. (PPD_SET = 1) | ||
| 333 | Bit 2 of CCSR is active low. */ | ||
| 334 | if (i == 32) { | 335 | if (i == 32) { |
| 336 | /* Maybe PHY is in power down mode. (PPD_SET = 1) | ||
| 337 | Bit 2 of CCSR is active low. */ | ||
| 335 | pcmcia_write_config_byte(link, CISREG_CCSR, 0x04); | 338 | pcmcia_write_config_byte(link, CISREG_CCSR, 0x04); |
| 336 | for (i = 0; i < 32; i++) { | 339 | for (i = 0; i < 32; i++) { |
| 337 | j = mdio_read(dev->base_addr + AXNET_MII_EEP, i, 1); | 340 | j = mdio_read(dev->base_addr + AXNET_MII_EEP, i, 1); |
| 338 | j2 = mdio_read(dev->base_addr + AXNET_MII_EEP, i, 2); | 341 | j2 = mdio_read(dev->base_addr + AXNET_MII_EEP, i, 2); |
| 339 | if (j == j2) continue; | 342 | if (j == j2) continue; |
| 340 | if ((j != 0) && (j != 0xffff)) break; | 343 | if ((j != 0) && (j != 0xffff)) { |
| 344 | info->active_low = 1; | ||
| 345 | break; | ||
| 346 | } | ||
| 341 | } | 347 | } |
| 342 | } | 348 | } |
| 343 | 349 | ||
| @@ -383,8 +389,12 @@ static int axnet_suspend(struct pcmcia_device *link) | |||
| 383 | static int axnet_resume(struct pcmcia_device *link) | 389 | static int axnet_resume(struct pcmcia_device *link) |
| 384 | { | 390 | { |
| 385 | struct net_device *dev = link->priv; | 391 | struct net_device *dev = link->priv; |
| 392 | axnet_dev_t *info = PRIV(dev); | ||
| 386 | 393 | ||
| 387 | if (link->open) { | 394 | if (link->open) { |
| 395 | if (info->active_low == 1) | ||
| 396 | pcmcia_write_config_byte(link, CISREG_CCSR, 0x04); | ||
| 397 | |||
| 388 | axnet_reset_8390(dev); | 398 | axnet_reset_8390(dev); |
| 389 | AX88190_init(dev, 1); | 399 | AX88190_init(dev, 1); |
| 390 | netif_device_attach(dev); | 400 | netif_device_attach(dev); |
diff --git a/drivers/net/r8169.c b/drivers/net/r8169.c index d88ce9fb1cbd..4c4d16905efb 100644 --- a/drivers/net/r8169.c +++ b/drivers/net/r8169.c | |||
| @@ -846,10 +846,10 @@ static int rtl8169_set_wol(struct net_device *dev, struct ethtool_wolinfo *wol) | |||
| 846 | else | 846 | else |
| 847 | tp->features &= ~RTL_FEATURE_WOL; | 847 | tp->features &= ~RTL_FEATURE_WOL; |
| 848 | __rtl8169_set_wol(tp, wol->wolopts); | 848 | __rtl8169_set_wol(tp, wol->wolopts); |
| 849 | device_set_wakeup_enable(&tp->pci_dev->dev, wol->wolopts); | ||
| 850 | |||
| 851 | spin_unlock_irq(&tp->lock); | 849 | spin_unlock_irq(&tp->lock); |
| 852 | 850 | ||
| 851 | device_set_wakeup_enable(&tp->pci_dev->dev, wol->wolopts); | ||
| 852 | |||
| 853 | return 0; | 853 | return 0; |
| 854 | } | 854 | } |
| 855 | 855 | ||
| @@ -2931,7 +2931,7 @@ static const struct rtl_cfg_info { | |||
| 2931 | .hw_start = rtl_hw_start_8168, | 2931 | .hw_start = rtl_hw_start_8168, |
| 2932 | .region = 2, | 2932 | .region = 2, |
| 2933 | .align = 8, | 2933 | .align = 8, |
| 2934 | .intr_event = SYSErr | RxFIFOOver | LinkChg | RxOverflow | | 2934 | .intr_event = SYSErr | LinkChg | RxOverflow | |
| 2935 | TxErr | TxOK | RxOK | RxErr, | 2935 | TxErr | TxOK | RxOK | RxErr, |
| 2936 | .napi_event = TxErr | TxOK | RxOK | RxOverflow, | 2936 | .napi_event = TxErr | TxOK | RxOK | RxOverflow, |
| 2937 | .features = RTL_FEATURE_GMII | RTL_FEATURE_MSI, | 2937 | .features = RTL_FEATURE_GMII | RTL_FEATURE_MSI, |
| @@ -4588,7 +4588,8 @@ static irqreturn_t rtl8169_interrupt(int irq, void *dev_instance) | |||
| 4588 | } | 4588 | } |
| 4589 | 4589 | ||
| 4590 | /* Work around for rx fifo overflow */ | 4590 | /* Work around for rx fifo overflow */ |
| 4591 | if (unlikely(status & RxFIFOOver)) { | 4591 | if (unlikely(status & RxFIFOOver) && |
| 4592 | (tp->mac_version == RTL_GIGA_MAC_VER_11)) { | ||
| 4592 | netif_stop_queue(dev); | 4593 | netif_stop_queue(dev); |
| 4593 | rtl8169_tx_timeout(dev); | 4594 | rtl8169_tx_timeout(dev); |
| 4594 | break; | 4595 | break; |
diff --git a/drivers/net/skge.c b/drivers/net/skge.c index bfec2e0f5275..220e0398f1d5 100644 --- a/drivers/net/skge.c +++ b/drivers/net/skge.c | |||
| @@ -3858,7 +3858,6 @@ static struct net_device *skge_devinit(struct skge_hw *hw, int port, | |||
| 3858 | 3858 | ||
| 3859 | /* device is off until link detection */ | 3859 | /* device is off until link detection */ |
| 3860 | netif_carrier_off(dev); | 3860 | netif_carrier_off(dev); |
| 3861 | netif_stop_queue(dev); | ||
| 3862 | 3861 | ||
| 3863 | return dev; | 3862 | return dev; |
| 3864 | } | 3863 | } |
diff --git a/drivers/net/ucc_geth.c b/drivers/net/ucc_geth.c index a4c3f5708246..acbdab3d66ca 100644 --- a/drivers/net/ucc_geth.c +++ b/drivers/net/ucc_geth.c | |||
| @@ -2050,12 +2050,16 @@ static void ucc_geth_stop(struct ucc_geth_private *ugeth) | |||
| 2050 | 2050 | ||
| 2051 | ugeth_vdbg("%s: IN", __func__); | 2051 | ugeth_vdbg("%s: IN", __func__); |
| 2052 | 2052 | ||
| 2053 | /* | ||
| 2054 | * Tell the kernel the link is down. | ||
| 2055 | * Must be done before disabling the controller | ||
| 2056 | * or deadlock may happen. | ||
| 2057 | */ | ||
| 2058 | phy_stop(phydev); | ||
| 2059 | |||
| 2053 | /* Disable the controller */ | 2060 | /* Disable the controller */ |
| 2054 | ugeth_disable(ugeth, COMM_DIR_RX_AND_TX); | 2061 | ugeth_disable(ugeth, COMM_DIR_RX_AND_TX); |
| 2055 | 2062 | ||
| 2056 | /* Tell the kernel the link is down */ | ||
| 2057 | phy_stop(phydev); | ||
| 2058 | |||
| 2059 | /* Mask all interrupts */ | 2063 | /* Mask all interrupts */ |
| 2060 | out_be32(ugeth->uccf->p_uccm, 0x00000000); | 2064 | out_be32(ugeth->uccf->p_uccm, 0x00000000); |
| 2061 | 2065 | ||
| @@ -2065,9 +2069,6 @@ static void ucc_geth_stop(struct ucc_geth_private *ugeth) | |||
| 2065 | /* Disable Rx and Tx */ | 2069 | /* Disable Rx and Tx */ |
| 2066 | clrbits32(&ug_regs->maccfg1, MACCFG1_ENABLE_RX | MACCFG1_ENABLE_TX); | 2070 | clrbits32(&ug_regs->maccfg1, MACCFG1_ENABLE_RX | MACCFG1_ENABLE_TX); |
| 2067 | 2071 | ||
| 2068 | phy_disconnect(ugeth->phydev); | ||
| 2069 | ugeth->phydev = NULL; | ||
| 2070 | |||
| 2071 | ucc_geth_memclean(ugeth); | 2072 | ucc_geth_memclean(ugeth); |
| 2072 | } | 2073 | } |
| 2073 | 2074 | ||
| @@ -3550,7 +3551,10 @@ static int ucc_geth_close(struct net_device *dev) | |||
| 3550 | 3551 | ||
| 3551 | napi_disable(&ugeth->napi); | 3552 | napi_disable(&ugeth->napi); |
| 3552 | 3553 | ||
| 3554 | cancel_work_sync(&ugeth->timeout_work); | ||
| 3553 | ucc_geth_stop(ugeth); | 3555 | ucc_geth_stop(ugeth); |
| 3556 | phy_disconnect(ugeth->phydev); | ||
| 3557 | ugeth->phydev = NULL; | ||
| 3554 | 3558 | ||
| 3555 | free_irq(ugeth->ug_info->uf_info.irq, ugeth->ndev); | 3559 | free_irq(ugeth->ug_info->uf_info.irq, ugeth->ndev); |
| 3556 | 3560 | ||
| @@ -3579,8 +3583,12 @@ static void ucc_geth_timeout_work(struct work_struct *work) | |||
| 3579 | * Must reset MAC *and* PHY. This is done by reopening | 3583 | * Must reset MAC *and* PHY. This is done by reopening |
| 3580 | * the device. | 3584 | * the device. |
| 3581 | */ | 3585 | */ |
| 3582 | ucc_geth_close(dev); | 3586 | netif_tx_stop_all_queues(dev); |
| 3583 | ucc_geth_open(dev); | 3587 | ucc_geth_stop(ugeth); |
| 3588 | ucc_geth_init_mac(ugeth); | ||
| 3589 | /* Must start PHY here */ | ||
| 3590 | phy_start(ugeth->phydev); | ||
| 3591 | netif_tx_start_all_queues(dev); | ||
| 3584 | } | 3592 | } |
| 3585 | 3593 | ||
| 3586 | netif_tx_schedule_all(dev); | 3594 | netif_tx_schedule_all(dev); |
| @@ -3594,7 +3602,6 @@ static void ucc_geth_timeout(struct net_device *dev) | |||
| 3594 | { | 3602 | { |
| 3595 | struct ucc_geth_private *ugeth = netdev_priv(dev); | 3603 | struct ucc_geth_private *ugeth = netdev_priv(dev); |
| 3596 | 3604 | ||
| 3597 | netif_carrier_off(dev); | ||
| 3598 | schedule_work(&ugeth->timeout_work); | 3605 | schedule_work(&ugeth->timeout_work); |
| 3599 | } | 3606 | } |
| 3600 | 3607 | ||
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index bb6b67f6b0cc..b6d402806ae6 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c | |||
| @@ -986,9 +986,15 @@ static int virtnet_probe(struct virtio_device *vdev) | |||
| 986 | goto unregister; | 986 | goto unregister; |
| 987 | } | 987 | } |
| 988 | 988 | ||
| 989 | vi->status = VIRTIO_NET_S_LINK_UP; | 989 | /* Assume link up if device can't report link status, |
| 990 | virtnet_update_status(vi); | 990 | otherwise get link status from config. */ |
| 991 | netif_carrier_on(dev); | 991 | if (virtio_has_feature(vi->vdev, VIRTIO_NET_F_STATUS)) { |
| 992 | netif_carrier_off(dev); | ||
| 993 | virtnet_update_status(vi); | ||
| 994 | } else { | ||
| 995 | vi->status = VIRTIO_NET_S_LINK_UP; | ||
| 996 | netif_carrier_on(dev); | ||
| 997 | } | ||
| 992 | 998 | ||
| 993 | pr_debug("virtnet: registered device %s\n", dev->name); | 999 | pr_debug("virtnet: registered device %s\n", dev->name); |
| 994 | return 0; | 1000 | return 0; |
diff --git a/drivers/net/wireless/ath/ath9k/ar9002_hw.c b/drivers/net/wireless/ath/ath9k/ar9002_hw.c index a0471f2e1c7a..48261b7252d0 100644 --- a/drivers/net/wireless/ath/ath9k/ar9002_hw.c +++ b/drivers/net/wireless/ath/ath9k/ar9002_hw.c | |||
| @@ -410,6 +410,9 @@ static void ar9002_hw_configpcipowersave(struct ath_hw *ah, | |||
| 410 | val &= ~(AR_WA_BIT6 | AR_WA_BIT7); | 410 | val &= ~(AR_WA_BIT6 | AR_WA_BIT7); |
| 411 | } | 411 | } |
| 412 | 412 | ||
| 413 | if (AR_SREV_9280(ah)) | ||
| 414 | val |= AR_WA_BIT22; | ||
| 415 | |||
| 413 | if (AR_SREV_9285E_20(ah)) | 416 | if (AR_SREV_9285E_20(ah)) |
| 414 | val |= AR_WA_BIT23; | 417 | val |= AR_WA_BIT23; |
| 415 | 418 | ||
diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h index 9b8e7e3fcebd..170d44a35ccb 100644 --- a/drivers/net/wireless/ath/ath9k/ath9k.h +++ b/drivers/net/wireless/ath/ath9k/ath9k.h | |||
| @@ -675,6 +675,7 @@ static inline void ath_read_cachesize(struct ath_common *common, int *csz) | |||
| 675 | } | 675 | } |
| 676 | 676 | ||
| 677 | extern struct ieee80211_ops ath9k_ops; | 677 | extern struct ieee80211_ops ath9k_ops; |
| 678 | extern struct pm_qos_request_list ath9k_pm_qos_req; | ||
| 678 | extern int modparam_nohwcrypt; | 679 | extern int modparam_nohwcrypt; |
| 679 | extern int led_blink; | 680 | extern int led_blink; |
| 680 | 681 | ||
diff --git a/drivers/net/wireless/ath/ath9k/hif_usb.c b/drivers/net/wireless/ath/ath9k/hif_usb.c index 6576f683dba0..f7ec31b4ddd3 100644 --- a/drivers/net/wireless/ath/ath9k/hif_usb.c +++ b/drivers/net/wireless/ath/ath9k/hif_usb.c | |||
| @@ -35,6 +35,7 @@ static struct usb_device_id ath9k_hif_usb_ids[] = { | |||
| 35 | { USB_DEVICE(0x07D1, 0x3A10) }, /* Dlink Wireless 150 */ | 35 | { USB_DEVICE(0x07D1, 0x3A10) }, /* Dlink Wireless 150 */ |
| 36 | { USB_DEVICE(0x13D3, 0x3327) }, /* Azurewave */ | 36 | { USB_DEVICE(0x13D3, 0x3327) }, /* Azurewave */ |
| 37 | { USB_DEVICE(0x13D3, 0x3328) }, /* Azurewave */ | 37 | { USB_DEVICE(0x13D3, 0x3328) }, /* Azurewave */ |
| 38 | { USB_DEVICE(0x13D3, 0x3346) }, /* IMC Networks */ | ||
| 38 | { USB_DEVICE(0x04CA, 0x4605) }, /* Liteon */ | 39 | { USB_DEVICE(0x04CA, 0x4605) }, /* Liteon */ |
| 39 | { USB_DEVICE(0x083A, 0xA704) }, /* SMC Networks */ | 40 | { USB_DEVICE(0x083A, 0xA704) }, /* SMC Networks */ |
| 40 | { }, | 41 | { }, |
| @@ -540,11 +541,11 @@ static void ath9k_hif_usb_reg_in_cb(struct urb *urb) | |||
| 540 | return; | 541 | return; |
| 541 | } | 542 | } |
| 542 | 543 | ||
| 543 | usb_fill_int_urb(urb, hif_dev->udev, | 544 | usb_fill_bulk_urb(urb, hif_dev->udev, |
| 544 | usb_rcvbulkpipe(hif_dev->udev, | 545 | usb_rcvbulkpipe(hif_dev->udev, |
| 545 | USB_REG_IN_PIPE), | 546 | USB_REG_IN_PIPE), |
| 546 | nskb->data, MAX_REG_IN_BUF_SIZE, | 547 | nskb->data, MAX_REG_IN_BUF_SIZE, |
| 547 | ath9k_hif_usb_reg_in_cb, nskb, 1); | 548 | ath9k_hif_usb_reg_in_cb, nskb); |
| 548 | 549 | ||
| 549 | ret = usb_submit_urb(urb, GFP_ATOMIC); | 550 | ret = usb_submit_urb(urb, GFP_ATOMIC); |
| 550 | if (ret) { | 551 | if (ret) { |
| @@ -720,11 +721,11 @@ static int ath9k_hif_usb_alloc_reg_in_urb(struct hif_device_usb *hif_dev) | |||
| 720 | if (!skb) | 721 | if (!skb) |
| 721 | goto err; | 722 | goto err; |
| 722 | 723 | ||
| 723 | usb_fill_int_urb(hif_dev->reg_in_urb, hif_dev->udev, | 724 | usb_fill_bulk_urb(hif_dev->reg_in_urb, hif_dev->udev, |
| 724 | usb_rcvbulkpipe(hif_dev->udev, | 725 | usb_rcvbulkpipe(hif_dev->udev, |
| 725 | USB_REG_IN_PIPE), | 726 | USB_REG_IN_PIPE), |
| 726 | skb->data, MAX_REG_IN_BUF_SIZE, | 727 | skb->data, MAX_REG_IN_BUF_SIZE, |
| 727 | ath9k_hif_usb_reg_in_cb, skb, 1); | 728 | ath9k_hif_usb_reg_in_cb, skb); |
| 728 | 729 | ||
| 729 | if (usb_submit_urb(hif_dev->reg_in_urb, GFP_KERNEL) != 0) | 730 | if (usb_submit_urb(hif_dev->reg_in_urb, GFP_KERNEL) != 0) |
| 730 | goto err; | 731 | goto err; |
| @@ -843,14 +844,6 @@ static int ath9k_hif_usb_dev_init(struct hif_device_usb *hif_dev) | |||
| 843 | goto err_fw_req; | 844 | goto err_fw_req; |
| 844 | } | 845 | } |
| 845 | 846 | ||
| 846 | /* Alloc URBs */ | ||
| 847 | ret = ath9k_hif_usb_alloc_urbs(hif_dev); | ||
| 848 | if (ret) { | ||
| 849 | dev_err(&hif_dev->udev->dev, | ||
| 850 | "ath9k_htc: Unable to allocate URBs\n"); | ||
| 851 | goto err_urb; | ||
| 852 | } | ||
| 853 | |||
| 854 | /* Download firmware */ | 847 | /* Download firmware */ |
| 855 | ret = ath9k_hif_usb_download_fw(hif_dev); | 848 | ret = ath9k_hif_usb_download_fw(hif_dev); |
| 856 | if (ret) { | 849 | if (ret) { |
| @@ -866,16 +859,22 @@ static int ath9k_hif_usb_dev_init(struct hif_device_usb *hif_dev) | |||
| 866 | */ | 859 | */ |
| 867 | for (idx = 0; idx < alt->desc.bNumEndpoints; idx++) { | 860 | for (idx = 0; idx < alt->desc.bNumEndpoints; idx++) { |
| 868 | endp = &alt->endpoint[idx].desc; | 861 | endp = &alt->endpoint[idx].desc; |
| 869 | if (((endp->bEndpointAddress & USB_ENDPOINT_NUMBER_MASK) | 862 | if ((endp->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) |
| 870 | == 0x04) && | 863 | == USB_ENDPOINT_XFER_INT) { |
| 871 | ((endp->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) | ||
| 872 | == USB_ENDPOINT_XFER_INT)) { | ||
| 873 | endp->bmAttributes &= ~USB_ENDPOINT_XFERTYPE_MASK; | 864 | endp->bmAttributes &= ~USB_ENDPOINT_XFERTYPE_MASK; |
| 874 | endp->bmAttributes |= USB_ENDPOINT_XFER_BULK; | 865 | endp->bmAttributes |= USB_ENDPOINT_XFER_BULK; |
| 875 | endp->bInterval = 0; | 866 | endp->bInterval = 0; |
| 876 | } | 867 | } |
| 877 | } | 868 | } |
| 878 | 869 | ||
| 870 | /* Alloc URBs */ | ||
| 871 | ret = ath9k_hif_usb_alloc_urbs(hif_dev); | ||
| 872 | if (ret) { | ||
| 873 | dev_err(&hif_dev->udev->dev, | ||
| 874 | "ath9k_htc: Unable to allocate URBs\n"); | ||
| 875 | goto err_urb; | ||
| 876 | } | ||
| 877 | |||
| 879 | return 0; | 878 | return 0; |
| 880 | 879 | ||
| 881 | err_fw_download: | 880 | err_fw_download: |
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c index cc13ee117823..6ebc68bca91f 100644 --- a/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c | |||
| @@ -484,6 +484,7 @@ static int ath9k_hw_post_init(struct ath_hw *ah) | |||
| 484 | ath_print(ath9k_hw_common(ah), ATH_DBG_FATAL, | 484 | ath_print(ath9k_hw_common(ah), ATH_DBG_FATAL, |
| 485 | "Failed allocating banks for " | 485 | "Failed allocating banks for " |
| 486 | "external radio\n"); | 486 | "external radio\n"); |
| 487 | ath9k_hw_rf_free_ext_banks(ah); | ||
| 487 | return ecode; | 488 | return ecode; |
| 488 | } | 489 | } |
| 489 | 490 | ||
| @@ -952,9 +953,12 @@ static void ath9k_hw_set_operating_mode(struct ath_hw *ah, int opmode) | |||
| 952 | REG_SET_BIT(ah, AR_CFG, AR_CFG_AP_ADHOC_INDICATION); | 953 | REG_SET_BIT(ah, AR_CFG, AR_CFG_AP_ADHOC_INDICATION); |
| 953 | break; | 954 | break; |
| 954 | case NL80211_IFTYPE_STATION: | 955 | case NL80211_IFTYPE_STATION: |
| 955 | case NL80211_IFTYPE_MONITOR: | ||
| 956 | REG_WRITE(ah, AR_STA_ID1, val | AR_STA_ID1_KSRCH_MODE); | 956 | REG_WRITE(ah, AR_STA_ID1, val | AR_STA_ID1_KSRCH_MODE); |
| 957 | break; | 957 | break; |
| 958 | default: | ||
| 959 | if (ah->is_monitoring) | ||
| 960 | REG_WRITE(ah, AR_STA_ID1, val | AR_STA_ID1_KSRCH_MODE); | ||
| 961 | break; | ||
| 958 | } | 962 | } |
| 959 | } | 963 | } |
| 960 | 964 | ||
| @@ -1634,7 +1638,6 @@ void ath9k_hw_beaconinit(struct ath_hw *ah, u32 next_beacon, u32 beacon_period) | |||
| 1634 | 1638 | ||
| 1635 | switch (ah->opmode) { | 1639 | switch (ah->opmode) { |
| 1636 | case NL80211_IFTYPE_STATION: | 1640 | case NL80211_IFTYPE_STATION: |
| 1637 | case NL80211_IFTYPE_MONITOR: | ||
| 1638 | REG_WRITE(ah, AR_NEXT_TBTT_TIMER, TU_TO_USEC(next_beacon)); | 1641 | REG_WRITE(ah, AR_NEXT_TBTT_TIMER, TU_TO_USEC(next_beacon)); |
| 1639 | REG_WRITE(ah, AR_NEXT_DMA_BEACON_ALERT, 0xffff); | 1642 | REG_WRITE(ah, AR_NEXT_DMA_BEACON_ALERT, 0xffff); |
| 1640 | REG_WRITE(ah, AR_NEXT_SWBA, 0x7ffff); | 1643 | REG_WRITE(ah, AR_NEXT_SWBA, 0x7ffff); |
| @@ -1663,6 +1666,14 @@ void ath9k_hw_beaconinit(struct ath_hw *ah, u32 next_beacon, u32 beacon_period) | |||
| 1663 | AR_TBTT_TIMER_EN | AR_DBA_TIMER_EN | AR_SWBA_TIMER_EN; | 1666 | AR_TBTT_TIMER_EN | AR_DBA_TIMER_EN | AR_SWBA_TIMER_EN; |
| 1664 | break; | 1667 | break; |
| 1665 | default: | 1668 | default: |
| 1669 | if (ah->is_monitoring) { | ||
| 1670 | REG_WRITE(ah, AR_NEXT_TBTT_TIMER, | ||
| 1671 | TU_TO_USEC(next_beacon)); | ||
| 1672 | REG_WRITE(ah, AR_NEXT_DMA_BEACON_ALERT, 0xffff); | ||
| 1673 | REG_WRITE(ah, AR_NEXT_SWBA, 0x7ffff); | ||
| 1674 | flags |= AR_TBTT_TIMER_EN; | ||
| 1675 | break; | ||
| 1676 | } | ||
| 1666 | ath_print(ath9k_hw_common(ah), ATH_DBG_BEACON, | 1677 | ath_print(ath9k_hw_common(ah), ATH_DBG_BEACON, |
| 1667 | "%s: unsupported opmode: %d\n", | 1678 | "%s: unsupported opmode: %d\n", |
| 1668 | __func__, ah->opmode); | 1679 | __func__, ah->opmode); |
diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h index d032939768b0..d47d1b4b6002 100644 --- a/drivers/net/wireless/ath/ath9k/hw.h +++ b/drivers/net/wireless/ath/ath9k/hw.h | |||
| @@ -622,6 +622,7 @@ struct ath_hw { | |||
| 622 | 622 | ||
| 623 | bool sw_mgmt_crypto; | 623 | bool sw_mgmt_crypto; |
| 624 | bool is_pciexpress; | 624 | bool is_pciexpress; |
| 625 | bool is_monitoring; | ||
| 625 | bool need_an_top2_fixup; | 626 | bool need_an_top2_fixup; |
| 626 | u16 tx_trig_level; | 627 | u16 tx_trig_level; |
| 627 | 628 | ||
diff --git a/drivers/net/wireless/ath/ath9k/init.c b/drivers/net/wireless/ath/ath9k/init.c index 95b41db0d86b..6a0d99eff404 100644 --- a/drivers/net/wireless/ath/ath9k/init.c +++ b/drivers/net/wireless/ath/ath9k/init.c | |||
| @@ -15,6 +15,7 @@ | |||
| 15 | */ | 15 | */ |
| 16 | 16 | ||
| 17 | #include <linux/slab.h> | 17 | #include <linux/slab.h> |
| 18 | #include <linux/pm_qos_params.h> | ||
| 18 | 19 | ||
| 19 | #include "ath9k.h" | 20 | #include "ath9k.h" |
| 20 | 21 | ||
| @@ -179,6 +180,8 @@ static const struct ath_ops ath9k_common_ops = { | |||
| 179 | .write = ath9k_iowrite32, | 180 | .write = ath9k_iowrite32, |
| 180 | }; | 181 | }; |
| 181 | 182 | ||
| 183 | struct pm_qos_request_list ath9k_pm_qos_req; | ||
| 184 | |||
| 182 | /**************************/ | 185 | /**************************/ |
| 183 | /* Initialization */ | 186 | /* Initialization */ |
| 184 | /**************************/ | 187 | /**************************/ |
| @@ -756,6 +759,9 @@ int ath9k_init_device(u16 devid, struct ath_softc *sc, u16 subsysid, | |||
| 756 | ath_init_leds(sc); | 759 | ath_init_leds(sc); |
| 757 | ath_start_rfkill_poll(sc); | 760 | ath_start_rfkill_poll(sc); |
| 758 | 761 | ||
| 762 | pm_qos_add_request(&ath9k_pm_qos_req, PM_QOS_CPU_DMA_LATENCY, | ||
| 763 | PM_QOS_DEFAULT_VALUE); | ||
| 764 | |||
| 759 | return 0; | 765 | return 0; |
| 760 | 766 | ||
| 761 | error_world: | 767 | error_world: |
| @@ -811,6 +817,8 @@ void ath9k_deinit_device(struct ath_softc *sc) | |||
| 811 | 817 | ||
| 812 | ath9k_ps_wakeup(sc); | 818 | ath9k_ps_wakeup(sc); |
| 813 | 819 | ||
| 820 | pm_qos_remove_request(&ath9k_pm_qos_req); | ||
| 821 | |||
| 814 | wiphy_rfkill_stop_polling(sc->hw->wiphy); | 822 | wiphy_rfkill_stop_polling(sc->hw->wiphy); |
| 815 | ath_deinit_leds(sc); | 823 | ath_deinit_leds(sc); |
| 816 | 824 | ||
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c index b52f1cf8a603..25d3ef4c338e 100644 --- a/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c | |||
| @@ -15,6 +15,7 @@ | |||
| 15 | */ | 15 | */ |
| 16 | 16 | ||
| 17 | #include <linux/nl80211.h> | 17 | #include <linux/nl80211.h> |
| 18 | #include <linux/pm_qos_params.h> | ||
| 18 | #include "ath9k.h" | 19 | #include "ath9k.h" |
| 19 | #include "btcoex.h" | 20 | #include "btcoex.h" |
| 20 | 21 | ||
| @@ -93,11 +94,13 @@ void ath9k_ps_wakeup(struct ath_softc *sc) | |||
| 93 | { | 94 | { |
| 94 | struct ath_common *common = ath9k_hw_common(sc->sc_ah); | 95 | struct ath_common *common = ath9k_hw_common(sc->sc_ah); |
| 95 | unsigned long flags; | 96 | unsigned long flags; |
| 97 | enum ath9k_power_mode power_mode; | ||
| 96 | 98 | ||
| 97 | spin_lock_irqsave(&sc->sc_pm_lock, flags); | 99 | spin_lock_irqsave(&sc->sc_pm_lock, flags); |
| 98 | if (++sc->ps_usecount != 1) | 100 | if (++sc->ps_usecount != 1) |
| 99 | goto unlock; | 101 | goto unlock; |
| 100 | 102 | ||
| 103 | power_mode = sc->sc_ah->power_mode; | ||
| 101 | ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_AWAKE); | 104 | ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_AWAKE); |
| 102 | 105 | ||
| 103 | /* | 106 | /* |
| @@ -105,10 +108,12 @@ void ath9k_ps_wakeup(struct ath_softc *sc) | |||
| 105 | * useful data. Better clear them now so that they don't mess up | 108 | * useful data. Better clear them now so that they don't mess up |
| 106 | * survey data results. | 109 | * survey data results. |
| 107 | */ | 110 | */ |
| 108 | spin_lock(&common->cc_lock); | 111 | if (power_mode != ATH9K_PM_AWAKE) { |
| 109 | ath_hw_cycle_counters_update(common); | 112 | spin_lock(&common->cc_lock); |
| 110 | memset(&common->cc_survey, 0, sizeof(common->cc_survey)); | 113 | ath_hw_cycle_counters_update(common); |
| 111 | spin_unlock(&common->cc_lock); | 114 | memset(&common->cc_survey, 0, sizeof(common->cc_survey)); |
| 115 | spin_unlock(&common->cc_lock); | ||
| 116 | } | ||
| 112 | 117 | ||
| 113 | unlock: | 118 | unlock: |
| 114 | spin_unlock_irqrestore(&sc->sc_pm_lock, flags); | 119 | spin_unlock_irqrestore(&sc->sc_pm_lock, flags); |
| @@ -1217,6 +1222,7 @@ static int ath9k_start(struct ieee80211_hw *hw) | |||
| 1217 | ah->imask |= ATH9K_INT_CST; | 1222 | ah->imask |= ATH9K_INT_CST; |
| 1218 | 1223 | ||
| 1219 | sc->sc_flags &= ~SC_OP_INVALID; | 1224 | sc->sc_flags &= ~SC_OP_INVALID; |
| 1225 | sc->sc_ah->is_monitoring = false; | ||
| 1220 | 1226 | ||
| 1221 | /* Disable BMISS interrupt when we're not associated */ | 1227 | /* Disable BMISS interrupt when we're not associated */ |
| 1222 | ah->imask &= ~(ATH9K_INT_SWBA | ATH9K_INT_BMISS); | 1228 | ah->imask &= ~(ATH9K_INT_SWBA | ATH9K_INT_BMISS); |
| @@ -1238,6 +1244,8 @@ static int ath9k_start(struct ieee80211_hw *hw) | |||
| 1238 | ath9k_btcoex_timer_resume(sc); | 1244 | ath9k_btcoex_timer_resume(sc); |
| 1239 | } | 1245 | } |
| 1240 | 1246 | ||
| 1247 | pm_qos_update_request(&ath9k_pm_qos_req, 55); | ||
| 1248 | |||
| 1241 | mutex_unlock: | 1249 | mutex_unlock: |
| 1242 | mutex_unlock(&sc->mutex); | 1250 | mutex_unlock(&sc->mutex); |
| 1243 | 1251 | ||
| @@ -1415,6 +1423,8 @@ static void ath9k_stop(struct ieee80211_hw *hw) | |||
| 1415 | 1423 | ||
| 1416 | sc->sc_flags |= SC_OP_INVALID; | 1424 | sc->sc_flags |= SC_OP_INVALID; |
| 1417 | 1425 | ||
| 1426 | pm_qos_update_request(&ath9k_pm_qos_req, PM_QOS_DEFAULT_VALUE); | ||
| 1427 | |||
| 1418 | mutex_unlock(&sc->mutex); | 1428 | mutex_unlock(&sc->mutex); |
| 1419 | 1429 | ||
| 1420 | ath_print(common, ATH_DBG_CONFIG, "Driver halt\n"); | 1430 | ath_print(common, ATH_DBG_CONFIG, "Driver halt\n"); |
| @@ -1493,8 +1503,7 @@ static int ath9k_add_interface(struct ieee80211_hw *hw, | |||
| 1493 | ath9k_hw_set_interrupts(ah, ah->imask); | 1503 | ath9k_hw_set_interrupts(ah, ah->imask); |
| 1494 | 1504 | ||
| 1495 | if (vif->type == NL80211_IFTYPE_AP || | 1505 | if (vif->type == NL80211_IFTYPE_AP || |
| 1496 | vif->type == NL80211_IFTYPE_ADHOC || | 1506 | vif->type == NL80211_IFTYPE_ADHOC) { |
| 1497 | vif->type == NL80211_IFTYPE_MONITOR) { | ||
| 1498 | sc->sc_flags |= SC_OP_ANI_RUN; | 1507 | sc->sc_flags |= SC_OP_ANI_RUN; |
| 1499 | ath_start_ani(common); | 1508 | ath_start_ani(common); |
| 1500 | } | 1509 | } |
| @@ -1644,8 +1653,12 @@ static int ath9k_config(struct ieee80211_hw *hw, u32 changed) | |||
| 1644 | if (changed & IEEE80211_CONF_CHANGE_MONITOR) { | 1653 | if (changed & IEEE80211_CONF_CHANGE_MONITOR) { |
| 1645 | if (conf->flags & IEEE80211_CONF_MONITOR) { | 1654 | if (conf->flags & IEEE80211_CONF_MONITOR) { |
| 1646 | ath_print(common, ATH_DBG_CONFIG, | 1655 | ath_print(common, ATH_DBG_CONFIG, |
| 1647 | "HW opmode set to Monitor mode\n"); | 1656 | "Monitor mode is enabled\n"); |
| 1648 | sc->sc_ah->opmode = NL80211_IFTYPE_MONITOR; | 1657 | sc->sc_ah->is_monitoring = true; |
| 1658 | } else { | ||
| 1659 | ath_print(common, ATH_DBG_CONFIG, | ||
| 1660 | "Monitor mode is disabled\n"); | ||
| 1661 | sc->sc_ah->is_monitoring = false; | ||
| 1649 | } | 1662 | } |
| 1650 | } | 1663 | } |
| 1651 | 1664 | ||
diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c index fddb0129bb57..c76ea53c20ce 100644 --- a/drivers/net/wireless/ath/ath9k/recv.c +++ b/drivers/net/wireless/ath/ath9k/recv.c | |||
| @@ -441,7 +441,7 @@ u32 ath_calcrxfilter(struct ath_softc *sc) | |||
| 441 | */ | 441 | */ |
| 442 | if (((sc->sc_ah->opmode != NL80211_IFTYPE_AP) && | 442 | if (((sc->sc_ah->opmode != NL80211_IFTYPE_AP) && |
| 443 | (sc->rx.rxfilter & FIF_PROMISC_IN_BSS)) || | 443 | (sc->rx.rxfilter & FIF_PROMISC_IN_BSS)) || |
| 444 | (sc->sc_ah->opmode == NL80211_IFTYPE_MONITOR)) | 444 | (sc->sc_ah->is_monitoring)) |
| 445 | rfilt |= ATH9K_RX_FILTER_PROM; | 445 | rfilt |= ATH9K_RX_FILTER_PROM; |
| 446 | 446 | ||
| 447 | if (sc->rx.rxfilter & FIF_CONTROL) | 447 | if (sc->rx.rxfilter & FIF_CONTROL) |
| @@ -897,7 +897,7 @@ static bool ath9k_rx_accept(struct ath_common *common, | |||
| 897 | * decryption and MIC failures. For monitor mode, | 897 | * decryption and MIC failures. For monitor mode, |
| 898 | * we also ignore the CRC error. | 898 | * we also ignore the CRC error. |
| 899 | */ | 899 | */ |
| 900 | if (ah->opmode == NL80211_IFTYPE_MONITOR) { | 900 | if (ah->is_monitoring) { |
| 901 | if (rx_stats->rs_status & | 901 | if (rx_stats->rs_status & |
| 902 | ~(ATH9K_RXERR_DECRYPT | ATH9K_RXERR_MIC | | 902 | ~(ATH9K_RXERR_DECRYPT | ATH9K_RXERR_MIC | |
| 903 | ATH9K_RXERR_CRC)) | 903 | ATH9K_RXERR_CRC)) |
diff --git a/drivers/net/wireless/ath/ath9k/reg.h b/drivers/net/wireless/ath/ath9k/reg.h index 42976b0a01c1..fa05b711e5cd 100644 --- a/drivers/net/wireless/ath/ath9k/reg.h +++ b/drivers/net/wireless/ath/ath9k/reg.h | |||
| @@ -703,6 +703,7 @@ | |||
| 703 | #define AR_WA_RESET_EN (1 << 18) /* Sw Control to enable PCI-Reset to POR (bit 15) */ | 703 | #define AR_WA_RESET_EN (1 << 18) /* Sw Control to enable PCI-Reset to POR (bit 15) */ |
| 704 | #define AR_WA_ANALOG_SHIFT (1 << 20) | 704 | #define AR_WA_ANALOG_SHIFT (1 << 20) |
| 705 | #define AR_WA_POR_SHORT (1 << 21) /* PCI-E Phy reset control */ | 705 | #define AR_WA_POR_SHORT (1 << 21) /* PCI-E Phy reset control */ |
| 706 | #define AR_WA_BIT22 (1 << 22) | ||
| 706 | #define AR9285_WA_DEFAULT 0x004a050b | 707 | #define AR9285_WA_DEFAULT 0x004a050b |
| 707 | #define AR9280_WA_DEFAULT 0x0040073b | 708 | #define AR9280_WA_DEFAULT 0x0040073b |
| 708 | #define AR_WA_DEFAULT 0x0000073f | 709 | #define AR_WA_DEFAULT 0x0000073f |
diff --git a/drivers/net/wireless/ath/carl9170/usb.c b/drivers/net/wireless/ath/carl9170/usb.c index d8607f4c144d..3317039cd28f 100644 --- a/drivers/net/wireless/ath/carl9170/usb.c +++ b/drivers/net/wireless/ath/carl9170/usb.c | |||
| @@ -82,9 +82,11 @@ static struct usb_device_id carl9170_usb_ids[] = { | |||
| 82 | { USB_DEVICE(0x07d1, 0x3c10) }, | 82 | { USB_DEVICE(0x07d1, 0x3c10) }, |
| 83 | /* D-Link DWA 160 A2 */ | 83 | /* D-Link DWA 160 A2 */ |
| 84 | { USB_DEVICE(0x07d1, 0x3a09) }, | 84 | { USB_DEVICE(0x07d1, 0x3a09) }, |
| 85 | /* D-Link DWA 130 D */ | ||
| 86 | { USB_DEVICE(0x07d1, 0x3a0f) }, | ||
| 85 | /* Netgear WNA1000 */ | 87 | /* Netgear WNA1000 */ |
| 86 | { USB_DEVICE(0x0846, 0x9040) }, | 88 | { USB_DEVICE(0x0846, 0x9040) }, |
| 87 | /* Netgear WNDA3100 */ | 89 | /* Netgear WNDA3100 (v1) */ |
| 88 | { USB_DEVICE(0x0846, 0x9010) }, | 90 | { USB_DEVICE(0x0846, 0x9010) }, |
| 89 | /* Netgear WN111 v2 */ | 91 | /* Netgear WN111 v2 */ |
| 90 | { USB_DEVICE(0x0846, 0x9001), .driver_info = CARL9170_ONE_LED }, | 92 | { USB_DEVICE(0x0846, 0x9001), .driver_info = CARL9170_ONE_LED }, |
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index 8f8c4b73f8b9..7edf8c2fb8c7 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c | |||
| @@ -4000,7 +4000,8 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e | |||
| 4000 | * "the hard way", rather than using device's scan. | 4000 | * "the hard way", rather than using device's scan. |
| 4001 | */ | 4001 | */ |
| 4002 | if (iwl3945_mod_params.disable_hw_scan) { | 4002 | if (iwl3945_mod_params.disable_hw_scan) { |
| 4003 | IWL_ERR(priv, "sw scan support is deprecated\n"); | 4003 | dev_printk(KERN_DEBUG, &(pdev->dev), |
| 4004 | "sw scan support is deprecated\n"); | ||
| 4004 | iwl3945_hw_ops.hw_scan = NULL; | 4005 | iwl3945_hw_ops.hw_scan = NULL; |
| 4005 | } | 4006 | } |
| 4006 | 4007 | ||
diff --git a/drivers/net/wireless/libertas/cfg.c b/drivers/net/wireless/libertas/cfg.c index 5046a0005034..373930afc26b 100644 --- a/drivers/net/wireless/libertas/cfg.c +++ b/drivers/net/wireless/libertas/cfg.c | |||
| @@ -700,8 +700,9 @@ static void lbs_scan_worker(struct work_struct *work) | |||
| 700 | 700 | ||
| 701 | if (priv->scan_channel < priv->scan_req->n_channels) { | 701 | if (priv->scan_channel < priv->scan_req->n_channels) { |
| 702 | cancel_delayed_work(&priv->scan_work); | 702 | cancel_delayed_work(&priv->scan_work); |
| 703 | queue_delayed_work(priv->work_thread, &priv->scan_work, | 703 | if (!priv->stopping) |
| 704 | msecs_to_jiffies(300)); | 704 | queue_delayed_work(priv->work_thread, &priv->scan_work, |
| 705 | msecs_to_jiffies(300)); | ||
| 705 | } | 706 | } |
| 706 | 707 | ||
| 707 | /* This is the final data we are about to send */ | 708 | /* This is the final data we are about to send */ |
diff --git a/drivers/net/wireless/libertas/dev.h b/drivers/net/wireless/libertas/dev.h index f062ed583901..cb14c38caf3a 100644 --- a/drivers/net/wireless/libertas/dev.h +++ b/drivers/net/wireless/libertas/dev.h | |||
| @@ -36,6 +36,7 @@ struct lbs_private { | |||
| 36 | /* CFG80211 */ | 36 | /* CFG80211 */ |
| 37 | struct wireless_dev *wdev; | 37 | struct wireless_dev *wdev; |
| 38 | bool wiphy_registered; | 38 | bool wiphy_registered; |
| 39 | bool stopping; | ||
| 39 | struct cfg80211_scan_request *scan_req; | 40 | struct cfg80211_scan_request *scan_req; |
| 40 | u8 assoc_bss[ETH_ALEN]; | 41 | u8 assoc_bss[ETH_ALEN]; |
| 41 | u8 disassoc_reason; | 42 | u8 disassoc_reason; |
diff --git a/drivers/net/wireless/libertas/main.c b/drivers/net/wireless/libertas/main.c index 47ce5a6ba120..46b88b118c99 100644 --- a/drivers/net/wireless/libertas/main.c +++ b/drivers/net/wireless/libertas/main.c | |||
| @@ -104,6 +104,7 @@ static int lbs_dev_open(struct net_device *dev) | |||
| 104 | lbs_deb_enter(LBS_DEB_NET); | 104 | lbs_deb_enter(LBS_DEB_NET); |
| 105 | 105 | ||
| 106 | spin_lock_irq(&priv->driver_lock); | 106 | spin_lock_irq(&priv->driver_lock); |
| 107 | priv->stopping = false; | ||
| 107 | 108 | ||
| 108 | if (priv->connect_status == LBS_CONNECTED) | 109 | if (priv->connect_status == LBS_CONNECTED) |
| 109 | netif_carrier_on(dev); | 110 | netif_carrier_on(dev); |
| @@ -131,10 +132,16 @@ static int lbs_eth_stop(struct net_device *dev) | |||
| 131 | lbs_deb_enter(LBS_DEB_NET); | 132 | lbs_deb_enter(LBS_DEB_NET); |
| 132 | 133 | ||
| 133 | spin_lock_irq(&priv->driver_lock); | 134 | spin_lock_irq(&priv->driver_lock); |
| 135 | priv->stopping = true; | ||
| 134 | netif_stop_queue(dev); | 136 | netif_stop_queue(dev); |
| 135 | spin_unlock_irq(&priv->driver_lock); | 137 | spin_unlock_irq(&priv->driver_lock); |
| 136 | 138 | ||
| 137 | schedule_work(&priv->mcast_work); | 139 | schedule_work(&priv->mcast_work); |
| 140 | cancel_delayed_work_sync(&priv->scan_work); | ||
| 141 | if (priv->scan_req) { | ||
| 142 | cfg80211_scan_done(priv->scan_req, false); | ||
| 143 | priv->scan_req = NULL; | ||
| 144 | } | ||
| 138 | 145 | ||
| 139 | lbs_deb_leave(LBS_DEB_NET); | 146 | lbs_deb_leave(LBS_DEB_NET); |
| 140 | return 0; | 147 | return 0; |
diff --git a/drivers/s390/net/qeth_core.h b/drivers/s390/net/qeth_core.h index 6be43eb126b4..f47a714538db 100644 --- a/drivers/s390/net/qeth_core.h +++ b/drivers/s390/net/qeth_core.h | |||
| @@ -440,7 +440,6 @@ struct qeth_qdio_out_q { | |||
| 440 | * index of buffer to be filled by driver; state EMPTY or PACKING | 440 | * index of buffer to be filled by driver; state EMPTY or PACKING |
| 441 | */ | 441 | */ |
| 442 | int next_buf_to_fill; | 442 | int next_buf_to_fill; |
| 443 | int sync_iqdio_error; | ||
| 444 | /* | 443 | /* |
| 445 | * number of buffers that are currently filled (PRIMED) | 444 | * number of buffers that are currently filled (PRIMED) |
| 446 | * -> these buffers are hardware-owned | 445 | * -> these buffers are hardware-owned |
| @@ -695,14 +694,6 @@ struct qeth_mc_mac { | |||
| 695 | int is_vmac; | 694 | int is_vmac; |
| 696 | }; | 695 | }; |
| 697 | 696 | ||
| 698 | struct qeth_skb_data { | ||
| 699 | __u32 magic; | ||
| 700 | int count; | ||
| 701 | }; | ||
| 702 | |||
| 703 | #define QETH_SKB_MAGIC 0x71657468 | ||
| 704 | #define QETH_SIGA_CC2_RETRIES 3 | ||
| 705 | |||
| 706 | struct qeth_rx { | 697 | struct qeth_rx { |
| 707 | int b_count; | 698 | int b_count; |
| 708 | int b_index; | 699 | int b_index; |
diff --git a/drivers/s390/net/qeth_core_main.c b/drivers/s390/net/qeth_core_main.c index 764267062601..e6b2df0e73f5 100644 --- a/drivers/s390/net/qeth_core_main.c +++ b/drivers/s390/net/qeth_core_main.c | |||
| @@ -877,8 +877,8 @@ out: | |||
| 877 | return; | 877 | return; |
| 878 | } | 878 | } |
| 879 | 879 | ||
| 880 | static void __qeth_clear_output_buffer(struct qeth_qdio_out_q *queue, | 880 | static void qeth_clear_output_buffer(struct qeth_qdio_out_q *queue, |
| 881 | struct qeth_qdio_out_buffer *buf, unsigned int qeth_skip_skb) | 881 | struct qeth_qdio_out_buffer *buf) |
| 882 | { | 882 | { |
| 883 | int i; | 883 | int i; |
| 884 | struct sk_buff *skb; | 884 | struct sk_buff *skb; |
| @@ -887,13 +887,11 @@ static void __qeth_clear_output_buffer(struct qeth_qdio_out_q *queue, | |||
| 887 | if (buf->buffer->element[0].flags & 0x40) | 887 | if (buf->buffer->element[0].flags & 0x40) |
| 888 | atomic_dec(&queue->set_pci_flags_count); | 888 | atomic_dec(&queue->set_pci_flags_count); |
| 889 | 889 | ||
| 890 | if (!qeth_skip_skb) { | 890 | skb = skb_dequeue(&buf->skb_list); |
| 891 | while (skb) { | ||
| 892 | atomic_dec(&skb->users); | ||
| 893 | dev_kfree_skb_any(skb); | ||
| 891 | skb = skb_dequeue(&buf->skb_list); | 894 | skb = skb_dequeue(&buf->skb_list); |
| 892 | while (skb) { | ||
| 893 | atomic_dec(&skb->users); | ||
| 894 | dev_kfree_skb_any(skb); | ||
| 895 | skb = skb_dequeue(&buf->skb_list); | ||
| 896 | } | ||
| 897 | } | 895 | } |
| 898 | for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(queue->card); ++i) { | 896 | for (i = 0; i < QETH_MAX_BUFFER_ELEMENTS(queue->card); ++i) { |
| 899 | if (buf->buffer->element[i].addr && buf->is_header[i]) | 897 | if (buf->buffer->element[i].addr && buf->is_header[i]) |
| @@ -909,12 +907,6 @@ static void __qeth_clear_output_buffer(struct qeth_qdio_out_q *queue, | |||
| 909 | atomic_set(&buf->state, QETH_QDIO_BUF_EMPTY); | 907 | atomic_set(&buf->state, QETH_QDIO_BUF_EMPTY); |
| 910 | } | 908 | } |
| 911 | 909 | ||
| 912 | static void qeth_clear_output_buffer(struct qeth_qdio_out_q *queue, | ||
| 913 | struct qeth_qdio_out_buffer *buf) | ||
| 914 | { | ||
| 915 | __qeth_clear_output_buffer(queue, buf, 0); | ||
| 916 | } | ||
| 917 | |||
| 918 | void qeth_clear_qdio_buffers(struct qeth_card *card) | 910 | void qeth_clear_qdio_buffers(struct qeth_card *card) |
| 919 | { | 911 | { |
| 920 | int i, j; | 912 | int i, j; |
| @@ -2833,7 +2825,6 @@ static void qeth_flush_buffers(struct qeth_qdio_out_q *queue, int index, | |||
| 2833 | } | 2825 | } |
| 2834 | } | 2826 | } |
| 2835 | 2827 | ||
| 2836 | queue->sync_iqdio_error = 0; | ||
| 2837 | queue->card->dev->trans_start = jiffies; | 2828 | queue->card->dev->trans_start = jiffies; |
| 2838 | if (queue->card->options.performance_stats) { | 2829 | if (queue->card->options.performance_stats) { |
| 2839 | queue->card->perf_stats.outbound_do_qdio_cnt++; | 2830 | queue->card->perf_stats.outbound_do_qdio_cnt++; |
| @@ -2849,10 +2840,6 @@ static void qeth_flush_buffers(struct qeth_qdio_out_q *queue, int index, | |||
| 2849 | queue->card->perf_stats.outbound_do_qdio_time += | 2840 | queue->card->perf_stats.outbound_do_qdio_time += |
| 2850 | qeth_get_micros() - | 2841 | qeth_get_micros() - |
| 2851 | queue->card->perf_stats.outbound_do_qdio_start_time; | 2842 | queue->card->perf_stats.outbound_do_qdio_start_time; |
| 2852 | if (rc > 0) { | ||
| 2853 | if (!(rc & QDIO_ERROR_SIGA_BUSY)) | ||
| 2854 | queue->sync_iqdio_error = rc & 3; | ||
| 2855 | } | ||
| 2856 | if (rc) { | 2843 | if (rc) { |
| 2857 | queue->card->stats.tx_errors += count; | 2844 | queue->card->stats.tx_errors += count; |
| 2858 | /* ignore temporary SIGA errors without busy condition */ | 2845 | /* ignore temporary SIGA errors without busy condition */ |
| @@ -2916,7 +2903,7 @@ void qeth_qdio_start_poll(struct ccw_device *ccwdev, int queue, | |||
| 2916 | { | 2903 | { |
| 2917 | struct qeth_card *card = (struct qeth_card *)card_ptr; | 2904 | struct qeth_card *card = (struct qeth_card *)card_ptr; |
| 2918 | 2905 | ||
| 2919 | if (card->dev) | 2906 | if (card->dev && (card->dev->flags & IFF_UP)) |
| 2920 | napi_schedule(&card->napi); | 2907 | napi_schedule(&card->napi); |
| 2921 | } | 2908 | } |
| 2922 | EXPORT_SYMBOL_GPL(qeth_qdio_start_poll); | 2909 | EXPORT_SYMBOL_GPL(qeth_qdio_start_poll); |
| @@ -2940,7 +2927,6 @@ void qeth_qdio_output_handler(struct ccw_device *ccwdev, | |||
| 2940 | struct qeth_qdio_out_q *queue = card->qdio.out_qs[__queue]; | 2927 | struct qeth_qdio_out_q *queue = card->qdio.out_qs[__queue]; |
| 2941 | struct qeth_qdio_out_buffer *buffer; | 2928 | struct qeth_qdio_out_buffer *buffer; |
| 2942 | int i; | 2929 | int i; |
| 2943 | unsigned qeth_send_err; | ||
| 2944 | 2930 | ||
| 2945 | QETH_CARD_TEXT(card, 6, "qdouhdl"); | 2931 | QETH_CARD_TEXT(card, 6, "qdouhdl"); |
| 2946 | if (qdio_error & QDIO_ERROR_ACTIVATE_CHECK_CONDITION) { | 2932 | if (qdio_error & QDIO_ERROR_ACTIVATE_CHECK_CONDITION) { |
| @@ -2956,9 +2942,8 @@ void qeth_qdio_output_handler(struct ccw_device *ccwdev, | |||
| 2956 | } | 2942 | } |
| 2957 | for (i = first_element; i < (first_element + count); ++i) { | 2943 | for (i = first_element; i < (first_element + count); ++i) { |
| 2958 | buffer = &queue->bufs[i % QDIO_MAX_BUFFERS_PER_Q]; | 2944 | buffer = &queue->bufs[i % QDIO_MAX_BUFFERS_PER_Q]; |
| 2959 | qeth_send_err = qeth_handle_send_error(card, buffer, qdio_error); | 2945 | qeth_handle_send_error(card, buffer, qdio_error); |
| 2960 | __qeth_clear_output_buffer(queue, buffer, | 2946 | qeth_clear_output_buffer(queue, buffer); |
| 2961 | (qeth_send_err == QETH_SEND_ERROR_RETRY) ? 1 : 0); | ||
| 2962 | } | 2947 | } |
| 2963 | atomic_sub(count, &queue->used_buffers); | 2948 | atomic_sub(count, &queue->used_buffers); |
| 2964 | /* check if we need to do something on this outbound queue */ | 2949 | /* check if we need to do something on this outbound queue */ |
| @@ -3183,10 +3168,7 @@ int qeth_do_send_packet_fast(struct qeth_card *card, | |||
| 3183 | int offset, int hd_len) | 3168 | int offset, int hd_len) |
| 3184 | { | 3169 | { |
| 3185 | struct qeth_qdio_out_buffer *buffer; | 3170 | struct qeth_qdio_out_buffer *buffer; |
| 3186 | struct sk_buff *skb1; | ||
| 3187 | struct qeth_skb_data *retry_ctrl; | ||
| 3188 | int index; | 3171 | int index; |
| 3189 | int rc; | ||
| 3190 | 3172 | ||
| 3191 | /* spin until we get the queue ... */ | 3173 | /* spin until we get the queue ... */ |
| 3192 | while (atomic_cmpxchg(&queue->state, QETH_OUT_Q_UNLOCKED, | 3174 | while (atomic_cmpxchg(&queue->state, QETH_OUT_Q_UNLOCKED, |
| @@ -3205,25 +3187,6 @@ int qeth_do_send_packet_fast(struct qeth_card *card, | |||
| 3205 | atomic_set(&queue->state, QETH_OUT_Q_UNLOCKED); | 3187 | atomic_set(&queue->state, QETH_OUT_Q_UNLOCKED); |
| 3206 | qeth_fill_buffer(queue, buffer, skb, hdr, offset, hd_len); | 3188 | qeth_fill_buffer(queue, buffer, skb, hdr, offset, hd_len); |
| 3207 | qeth_flush_buffers(queue, index, 1); | 3189 | qeth_flush_buffers(queue, index, 1); |
| 3208 | if (queue->sync_iqdio_error == 2) { | ||
| 3209 | skb1 = skb_dequeue(&buffer->skb_list); | ||
| 3210 | while (skb1) { | ||
| 3211 | atomic_dec(&skb1->users); | ||
| 3212 | skb1 = skb_dequeue(&buffer->skb_list); | ||
| 3213 | } | ||
| 3214 | retry_ctrl = (struct qeth_skb_data *) &skb->cb[16]; | ||
| 3215 | if (retry_ctrl->magic != QETH_SKB_MAGIC) { | ||
| 3216 | retry_ctrl->magic = QETH_SKB_MAGIC; | ||
| 3217 | retry_ctrl->count = 0; | ||
| 3218 | } | ||
| 3219 | if (retry_ctrl->count < QETH_SIGA_CC2_RETRIES) { | ||
| 3220 | retry_ctrl->count++; | ||
| 3221 | rc = dev_queue_xmit(skb); | ||
| 3222 | } else { | ||
| 3223 | dev_kfree_skb_any(skb); | ||
| 3224 | QETH_CARD_TEXT(card, 2, "qrdrop"); | ||
| 3225 | } | ||
| 3226 | } | ||
| 3227 | return 0; | 3190 | return 0; |
| 3228 | out: | 3191 | out: |
| 3229 | atomic_set(&queue->state, QETH_OUT_Q_UNLOCKED); | 3192 | atomic_set(&queue->state, QETH_OUT_Q_UNLOCKED); |
diff --git a/include/linux/if_vlan.h b/include/linux/if_vlan.h index c2f3a72712ce..635e1faec412 100644 --- a/include/linux/if_vlan.h +++ b/include/linux/if_vlan.h | |||
| @@ -339,6 +339,31 @@ static inline int vlan_get_tag(const struct sk_buff *skb, u16 *vlan_tci) | |||
| 339 | } | 339 | } |
| 340 | } | 340 | } |
| 341 | 341 | ||
| 342 | /** | ||
| 343 | * vlan_get_protocol - get protocol EtherType. | ||
| 344 | * @skb: skbuff to query | ||
| 345 | * | ||
| 346 | * Returns the EtherType of the packet, regardless of whether it is | ||
| 347 | * vlan encapsulated (normal or hardware accelerated) or not. | ||
| 348 | */ | ||
| 349 | static inline __be16 vlan_get_protocol(const struct sk_buff *skb) | ||
| 350 | { | ||
| 351 | __be16 protocol = 0; | ||
| 352 | |||
| 353 | if (vlan_tx_tag_present(skb) || | ||
| 354 | skb->protocol != cpu_to_be16(ETH_P_8021Q)) | ||
| 355 | protocol = skb->protocol; | ||
| 356 | else { | ||
| 357 | __be16 proto, *protop; | ||
| 358 | protop = skb_header_pointer(skb, offsetof(struct vlan_ethhdr, | ||
| 359 | h_vlan_encapsulated_proto), | ||
| 360 | sizeof(proto), &proto); | ||
| 361 | if (likely(protop)) | ||
| 362 | protocol = *protop; | ||
| 363 | } | ||
| 364 | |||
| 365 | return protocol; | ||
| 366 | } | ||
| 342 | #endif /* __KERNEL__ */ | 367 | #endif /* __KERNEL__ */ |
| 343 | 368 | ||
| 344 | /* VLAN IOCTLs are found in sockios.h */ | 369 | /* VLAN IOCTLs are found in sockios.h */ |
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 072652d94d9f..d8fd2c23a1b9 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
| @@ -1554,6 +1554,11 @@ static inline void netif_tx_wake_all_queues(struct net_device *dev) | |||
| 1554 | 1554 | ||
| 1555 | static inline void netif_tx_stop_queue(struct netdev_queue *dev_queue) | 1555 | static inline void netif_tx_stop_queue(struct netdev_queue *dev_queue) |
| 1556 | { | 1556 | { |
| 1557 | if (WARN_ON(!dev_queue)) { | ||
| 1558 | printk(KERN_INFO "netif_stop_queue() cannot be called before " | ||
| 1559 | "register_netdev()"); | ||
| 1560 | return; | ||
| 1561 | } | ||
| 1557 | set_bit(__QUEUE_STATE_XOFF, &dev_queue->state); | 1562 | set_bit(__QUEUE_STATE_XOFF, &dev_queue->state); |
| 1558 | } | 1563 | } |
| 1559 | 1564 | ||
diff --git a/include/linux/netfilter.h b/include/linux/netfilter.h index 89341c32631a..03317c8d4077 100644 --- a/include/linux/netfilter.h +++ b/include/linux/netfilter.h | |||
| @@ -215,7 +215,7 @@ NF_HOOK_COND(uint8_t pf, unsigned int hook, struct sk_buff *skb, | |||
| 215 | int ret; | 215 | int ret; |
| 216 | 216 | ||
| 217 | if (!cond || | 217 | if (!cond || |
| 218 | (ret = nf_hook_thresh(pf, hook, skb, in, out, okfn, INT_MIN) == 1)) | 218 | ((ret = nf_hook_thresh(pf, hook, skb, in, out, okfn, INT_MIN)) == 1)) |
| 219 | ret = okfn(skb); | 219 | ret = okfn(skb); |
| 220 | return ret; | 220 | return ret; |
| 221 | } | 221 | } |
diff --git a/include/net/dn.h b/include/net/dn.h index e5469f7b67a3..a514a3cf4573 100644 --- a/include/net/dn.h +++ b/include/net/dn.h | |||
| @@ -225,7 +225,7 @@ extern int decnet_di_count; | |||
| 225 | extern int decnet_dr_count; | 225 | extern int decnet_dr_count; |
| 226 | extern int decnet_no_fc_max_cwnd; | 226 | extern int decnet_no_fc_max_cwnd; |
| 227 | 227 | ||
| 228 | extern int sysctl_decnet_mem[3]; | 228 | extern long sysctl_decnet_mem[3]; |
| 229 | extern int sysctl_decnet_wmem[3]; | 229 | extern int sysctl_decnet_wmem[3]; |
| 230 | extern int sysctl_decnet_rmem[3]; | 230 | extern int sysctl_decnet_rmem[3]; |
| 231 | 231 | ||
diff --git a/include/net/dst_ops.h b/include/net/dst_ops.h index 1fa5306e3e23..51665b3461b8 100644 --- a/include/net/dst_ops.h +++ b/include/net/dst_ops.h | |||
| @@ -2,6 +2,7 @@ | |||
| 2 | #define _NET_DST_OPS_H | 2 | #define _NET_DST_OPS_H |
| 3 | #include <linux/types.h> | 3 | #include <linux/types.h> |
| 4 | #include <linux/percpu_counter.h> | 4 | #include <linux/percpu_counter.h> |
| 5 | #include <linux/cache.h> | ||
| 5 | 6 | ||
| 6 | struct dst_entry; | 7 | struct dst_entry; |
| 7 | struct kmem_cachep; | 8 | struct kmem_cachep; |
diff --git a/include/net/sock.h b/include/net/sock.h index c7a736228ca2..a6338d039857 100644 --- a/include/net/sock.h +++ b/include/net/sock.h | |||
| @@ -762,7 +762,7 @@ struct proto { | |||
| 762 | 762 | ||
| 763 | /* Memory pressure */ | 763 | /* Memory pressure */ |
| 764 | void (*enter_memory_pressure)(struct sock *sk); | 764 | void (*enter_memory_pressure)(struct sock *sk); |
| 765 | atomic_t *memory_allocated; /* Current allocated memory. */ | 765 | atomic_long_t *memory_allocated; /* Current allocated memory. */ |
| 766 | struct percpu_counter *sockets_allocated; /* Current number of sockets. */ | 766 | struct percpu_counter *sockets_allocated; /* Current number of sockets. */ |
| 767 | /* | 767 | /* |
| 768 | * Pressure flag: try to collapse. | 768 | * Pressure flag: try to collapse. |
| @@ -771,7 +771,7 @@ struct proto { | |||
| 771 | * is strict, actions are advisory and have some latency. | 771 | * is strict, actions are advisory and have some latency. |
| 772 | */ | 772 | */ |
| 773 | int *memory_pressure; | 773 | int *memory_pressure; |
| 774 | int *sysctl_mem; | 774 | long *sysctl_mem; |
| 775 | int *sysctl_wmem; | 775 | int *sysctl_wmem; |
| 776 | int *sysctl_rmem; | 776 | int *sysctl_rmem; |
| 777 | int max_header; | 777 | int max_header; |
diff --git a/include/net/tcp.h b/include/net/tcp.h index 4fee0424af7e..e36c874c7fb1 100644 --- a/include/net/tcp.h +++ b/include/net/tcp.h | |||
| @@ -224,7 +224,7 @@ extern int sysctl_tcp_fack; | |||
| 224 | extern int sysctl_tcp_reordering; | 224 | extern int sysctl_tcp_reordering; |
| 225 | extern int sysctl_tcp_ecn; | 225 | extern int sysctl_tcp_ecn; |
| 226 | extern int sysctl_tcp_dsack; | 226 | extern int sysctl_tcp_dsack; |
| 227 | extern int sysctl_tcp_mem[3]; | 227 | extern long sysctl_tcp_mem[3]; |
| 228 | extern int sysctl_tcp_wmem[3]; | 228 | extern int sysctl_tcp_wmem[3]; |
| 229 | extern int sysctl_tcp_rmem[3]; | 229 | extern int sysctl_tcp_rmem[3]; |
| 230 | extern int sysctl_tcp_app_win; | 230 | extern int sysctl_tcp_app_win; |
| @@ -247,7 +247,7 @@ extern int sysctl_tcp_cookie_size; | |||
| 247 | extern int sysctl_tcp_thin_linear_timeouts; | 247 | extern int sysctl_tcp_thin_linear_timeouts; |
| 248 | extern int sysctl_tcp_thin_dupack; | 248 | extern int sysctl_tcp_thin_dupack; |
| 249 | 249 | ||
| 250 | extern atomic_t tcp_memory_allocated; | 250 | extern atomic_long_t tcp_memory_allocated; |
| 251 | extern struct percpu_counter tcp_sockets_allocated; | 251 | extern struct percpu_counter tcp_sockets_allocated; |
| 252 | extern int tcp_memory_pressure; | 252 | extern int tcp_memory_pressure; |
| 253 | 253 | ||
| @@ -280,7 +280,7 @@ static inline bool tcp_too_many_orphans(struct sock *sk, int shift) | |||
| 280 | } | 280 | } |
| 281 | 281 | ||
| 282 | if (sk->sk_wmem_queued > SOCK_MIN_SNDBUF && | 282 | if (sk->sk_wmem_queued > SOCK_MIN_SNDBUF && |
| 283 | atomic_read(&tcp_memory_allocated) > sysctl_tcp_mem[2]) | 283 | atomic_long_read(&tcp_memory_allocated) > sysctl_tcp_mem[2]) |
| 284 | return true; | 284 | return true; |
| 285 | return false; | 285 | return false; |
| 286 | } | 286 | } |
diff --git a/include/net/udp.h b/include/net/udp.h index 200b82848c9a..bb967dd59bf7 100644 --- a/include/net/udp.h +++ b/include/net/udp.h | |||
| @@ -105,10 +105,10 @@ static inline struct udp_hslot *udp_hashslot2(struct udp_table *table, | |||
| 105 | 105 | ||
| 106 | extern struct proto udp_prot; | 106 | extern struct proto udp_prot; |
| 107 | 107 | ||
| 108 | extern atomic_t udp_memory_allocated; | 108 | extern atomic_long_t udp_memory_allocated; |
| 109 | 109 | ||
| 110 | /* sysctl variables for udp */ | 110 | /* sysctl variables for udp */ |
| 111 | extern int sysctl_udp_mem[3]; | 111 | extern long sysctl_udp_mem[3]; |
| 112 | extern int sysctl_udp_rmem_min; | 112 | extern int sysctl_udp_rmem_min; |
| 113 | extern int sysctl_udp_wmem_min; | 113 | extern int sysctl_udp_wmem_min; |
| 114 | 114 | ||
diff --git a/net/ax25/af_ax25.c b/net/ax25/af_ax25.c index 26eaebf4aaa9..bb86d2932394 100644 --- a/net/ax25/af_ax25.c +++ b/net/ax25/af_ax25.c | |||
| @@ -1392,6 +1392,7 @@ static int ax25_getname(struct socket *sock, struct sockaddr *uaddr, | |||
| 1392 | ax25_cb *ax25; | 1392 | ax25_cb *ax25; |
| 1393 | int err = 0; | 1393 | int err = 0; |
| 1394 | 1394 | ||
| 1395 | memset(fsa, 0, sizeof(fsa)); | ||
| 1395 | lock_sock(sk); | 1396 | lock_sock(sk); |
| 1396 | ax25 = ax25_sk(sk); | 1397 | ax25 = ax25_sk(sk); |
| 1397 | 1398 | ||
| @@ -1403,7 +1404,6 @@ static int ax25_getname(struct socket *sock, struct sockaddr *uaddr, | |||
| 1403 | 1404 | ||
| 1404 | fsa->fsa_ax25.sax25_family = AF_AX25; | 1405 | fsa->fsa_ax25.sax25_family = AF_AX25; |
| 1405 | fsa->fsa_ax25.sax25_call = ax25->dest_addr; | 1406 | fsa->fsa_ax25.sax25_call = ax25->dest_addr; |
| 1406 | fsa->fsa_ax25.sax25_ndigis = 0; | ||
| 1407 | 1407 | ||
| 1408 | if (ax25->digipeat != NULL) { | 1408 | if (ax25->digipeat != NULL) { |
| 1409 | ndigi = ax25->digipeat->ndigi; | 1409 | ndigi = ax25->digipeat->ndigi; |
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index bfef5bae0b3a..84093b0000b9 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c | |||
| @@ -1175,6 +1175,12 @@ static inline void hci_remote_features_evt(struct hci_dev *hdev, struct sk_buff | |||
| 1175 | hci_send_cmd(hdev, | 1175 | hci_send_cmd(hdev, |
| 1176 | HCI_OP_READ_REMOTE_EXT_FEATURES, | 1176 | HCI_OP_READ_REMOTE_EXT_FEATURES, |
| 1177 | sizeof(cp), &cp); | 1177 | sizeof(cp), &cp); |
| 1178 | } else if (!ev->status && conn->out && | ||
| 1179 | conn->sec_level == BT_SECURITY_HIGH) { | ||
| 1180 | struct hci_cp_auth_requested cp; | ||
| 1181 | cp.handle = ev->handle; | ||
| 1182 | hci_send_cmd(hdev, HCI_OP_AUTH_REQUESTED, | ||
| 1183 | sizeof(cp), &cp); | ||
| 1178 | } else { | 1184 | } else { |
| 1179 | conn->state = BT_CONNECTED; | 1185 | conn->state = BT_CONNECTED; |
| 1180 | hci_proto_connect_cfm(conn, ev->status); | 1186 | hci_proto_connect_cfm(conn, ev->status); |
diff --git a/net/bluetooth/hidp/Kconfig b/net/bluetooth/hidp/Kconfig index 98fdfa1fbddd..86a91543172a 100644 --- a/net/bluetooth/hidp/Kconfig +++ b/net/bluetooth/hidp/Kconfig | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | config BT_HIDP | 1 | config BT_HIDP |
| 2 | tristate "HIDP protocol support" | 2 | tristate "HIDP protocol support" |
| 3 | depends on BT && BT_L2CAP && INPUT | 3 | depends on BT && BT_L2CAP && INPUT && HID_SUPPORT |
| 4 | select HID | 4 | select HID |
| 5 | help | 5 | help |
| 6 | HIDP (Human Interface Device Protocol) is a transport layer | 6 | HIDP (Human Interface Device Protocol) is a transport layer |
diff --git a/net/bluetooth/l2cap.c b/net/bluetooth/l2cap.c index daa7a988d9a6..cd8f6ea03841 100644 --- a/net/bluetooth/l2cap.c +++ b/net/bluetooth/l2cap.c | |||
| @@ -2421,11 +2421,11 @@ static inline int l2cap_get_conf_opt(void **ptr, int *type, int *olen, unsigned | |||
| 2421 | break; | 2421 | break; |
| 2422 | 2422 | ||
| 2423 | case 2: | 2423 | case 2: |
| 2424 | *val = __le16_to_cpu(*((__le16 *) opt->val)); | 2424 | *val = get_unaligned_le16(opt->val); |
| 2425 | break; | 2425 | break; |
| 2426 | 2426 | ||
| 2427 | case 4: | 2427 | case 4: |
| 2428 | *val = __le32_to_cpu(*((__le32 *) opt->val)); | 2428 | *val = get_unaligned_le32(opt->val); |
| 2429 | break; | 2429 | break; |
| 2430 | 2430 | ||
| 2431 | default: | 2431 | default: |
| @@ -2452,11 +2452,11 @@ static void l2cap_add_conf_opt(void **ptr, u8 type, u8 len, unsigned long val) | |||
| 2452 | break; | 2452 | break; |
| 2453 | 2453 | ||
| 2454 | case 2: | 2454 | case 2: |
| 2455 | *((__le16 *) opt->val) = cpu_to_le16(val); | 2455 | put_unaligned_le16(val, opt->val); |
| 2456 | break; | 2456 | break; |
| 2457 | 2457 | ||
| 2458 | case 4: | 2458 | case 4: |
| 2459 | *((__le32 *) opt->val) = cpu_to_le32(val); | 2459 | put_unaligned_le32(val, opt->val); |
| 2460 | break; | 2460 | break; |
| 2461 | 2461 | ||
| 2462 | default: | 2462 | default: |
diff --git a/net/bluetooth/rfcomm/core.c b/net/bluetooth/rfcomm/core.c index 39a5d87e33b4..fa642aa652bd 100644 --- a/net/bluetooth/rfcomm/core.c +++ b/net/bluetooth/rfcomm/core.c | |||
| @@ -79,7 +79,10 @@ static void rfcomm_make_uih(struct sk_buff *skb, u8 addr); | |||
| 79 | 79 | ||
| 80 | static void rfcomm_process_connect(struct rfcomm_session *s); | 80 | static void rfcomm_process_connect(struct rfcomm_session *s); |
| 81 | 81 | ||
| 82 | static struct rfcomm_session *rfcomm_session_create(bdaddr_t *src, bdaddr_t *dst, int *err); | 82 | static struct rfcomm_session *rfcomm_session_create(bdaddr_t *src, |
| 83 | bdaddr_t *dst, | ||
| 84 | u8 sec_level, | ||
| 85 | int *err); | ||
| 83 | static struct rfcomm_session *rfcomm_session_get(bdaddr_t *src, bdaddr_t *dst); | 86 | static struct rfcomm_session *rfcomm_session_get(bdaddr_t *src, bdaddr_t *dst); |
| 84 | static void rfcomm_session_del(struct rfcomm_session *s); | 87 | static void rfcomm_session_del(struct rfcomm_session *s); |
| 85 | 88 | ||
| @@ -401,7 +404,7 @@ static int __rfcomm_dlc_open(struct rfcomm_dlc *d, bdaddr_t *src, bdaddr_t *dst, | |||
| 401 | 404 | ||
| 402 | s = rfcomm_session_get(src, dst); | 405 | s = rfcomm_session_get(src, dst); |
| 403 | if (!s) { | 406 | if (!s) { |
| 404 | s = rfcomm_session_create(src, dst, &err); | 407 | s = rfcomm_session_create(src, dst, d->sec_level, &err); |
| 405 | if (!s) | 408 | if (!s) |
| 406 | return err; | 409 | return err; |
| 407 | } | 410 | } |
| @@ -679,7 +682,10 @@ static void rfcomm_session_close(struct rfcomm_session *s, int err) | |||
| 679 | rfcomm_session_put(s); | 682 | rfcomm_session_put(s); |
| 680 | } | 683 | } |
| 681 | 684 | ||
| 682 | static struct rfcomm_session *rfcomm_session_create(bdaddr_t *src, bdaddr_t *dst, int *err) | 685 | static struct rfcomm_session *rfcomm_session_create(bdaddr_t *src, |
| 686 | bdaddr_t *dst, | ||
| 687 | u8 sec_level, | ||
| 688 | int *err) | ||
| 683 | { | 689 | { |
| 684 | struct rfcomm_session *s = NULL; | 690 | struct rfcomm_session *s = NULL; |
| 685 | struct sockaddr_l2 addr; | 691 | struct sockaddr_l2 addr; |
| @@ -704,6 +710,7 @@ static struct rfcomm_session *rfcomm_session_create(bdaddr_t *src, bdaddr_t *dst | |||
| 704 | sk = sock->sk; | 710 | sk = sock->sk; |
| 705 | lock_sock(sk); | 711 | lock_sock(sk); |
| 706 | l2cap_pi(sk)->imtu = l2cap_mtu; | 712 | l2cap_pi(sk)->imtu = l2cap_mtu; |
| 713 | l2cap_pi(sk)->sec_level = sec_level; | ||
| 707 | if (l2cap_ertm) | 714 | if (l2cap_ertm) |
| 708 | l2cap_pi(sk)->mode = L2CAP_MODE_ERTM; | 715 | l2cap_pi(sk)->mode = L2CAP_MODE_ERTM; |
| 709 | release_sock(sk); | 716 | release_sock(sk); |
diff --git a/net/can/bcm.c b/net/can/bcm.c index 08ffe9e4be20..6faa8256e10c 100644 --- a/net/can/bcm.c +++ b/net/can/bcm.c | |||
| @@ -125,7 +125,7 @@ struct bcm_sock { | |||
| 125 | struct list_head tx_ops; | 125 | struct list_head tx_ops; |
| 126 | unsigned long dropped_usr_msgs; | 126 | unsigned long dropped_usr_msgs; |
| 127 | struct proc_dir_entry *bcm_proc_read; | 127 | struct proc_dir_entry *bcm_proc_read; |
| 128 | char procname [9]; /* pointer printed in ASCII with \0 */ | 128 | char procname [20]; /* pointer printed in ASCII with \0 */ |
| 129 | }; | 129 | }; |
| 130 | 130 | ||
| 131 | static inline struct bcm_sock *bcm_sk(const struct sock *sk) | 131 | static inline struct bcm_sock *bcm_sk(const struct sock *sk) |
diff --git a/net/core/dst.c b/net/core/dst.c index 8abe628b79f1..b99c7c7ffce2 100644 --- a/net/core/dst.c +++ b/net/core/dst.c | |||
| @@ -370,6 +370,7 @@ static int dst_dev_event(struct notifier_block *this, unsigned long event, | |||
| 370 | 370 | ||
| 371 | static struct notifier_block dst_dev_notifier = { | 371 | static struct notifier_block dst_dev_notifier = { |
| 372 | .notifier_call = dst_dev_event, | 372 | .notifier_call = dst_dev_event, |
| 373 | .priority = -10, /* must be called after other network notifiers */ | ||
| 373 | }; | 374 | }; |
| 374 | 375 | ||
| 375 | void __init dst_init(void) | 376 | void __init dst_init(void) |
diff --git a/net/core/filter.c b/net/core/filter.c index 7beaec36b541..23e9b2a6b4c8 100644 --- a/net/core/filter.c +++ b/net/core/filter.c | |||
| @@ -112,39 +112,41 @@ EXPORT_SYMBOL(sk_filter); | |||
| 112 | */ | 112 | */ |
| 113 | unsigned int sk_run_filter(struct sk_buff *skb, struct sock_filter *filter, int flen) | 113 | unsigned int sk_run_filter(struct sk_buff *skb, struct sock_filter *filter, int flen) |
| 114 | { | 114 | { |
| 115 | struct sock_filter *fentry; /* We walk down these */ | ||
| 116 | void *ptr; | 115 | void *ptr; |
| 117 | u32 A = 0; /* Accumulator */ | 116 | u32 A = 0; /* Accumulator */ |
| 118 | u32 X = 0; /* Index Register */ | 117 | u32 X = 0; /* Index Register */ |
| 119 | u32 mem[BPF_MEMWORDS]; /* Scratch Memory Store */ | 118 | u32 mem[BPF_MEMWORDS]; /* Scratch Memory Store */ |
| 119 | unsigned long memvalid = 0; | ||
| 120 | u32 tmp; | 120 | u32 tmp; |
| 121 | int k; | 121 | int k; |
| 122 | int pc; | 122 | int pc; |
| 123 | 123 | ||
| 124 | BUILD_BUG_ON(BPF_MEMWORDS > BITS_PER_LONG); | ||
| 124 | /* | 125 | /* |
| 125 | * Process array of filter instructions. | 126 | * Process array of filter instructions. |
| 126 | */ | 127 | */ |
| 127 | for (pc = 0; pc < flen; pc++) { | 128 | for (pc = 0; pc < flen; pc++) { |
| 128 | fentry = &filter[pc]; | 129 | const struct sock_filter *fentry = &filter[pc]; |
| 130 | u32 f_k = fentry->k; | ||
| 129 | 131 | ||
| 130 | switch (fentry->code) { | 132 | switch (fentry->code) { |
| 131 | case BPF_S_ALU_ADD_X: | 133 | case BPF_S_ALU_ADD_X: |
| 132 | A += X; | 134 | A += X; |
| 133 | continue; | 135 | continue; |
| 134 | case BPF_S_ALU_ADD_K: | 136 | case BPF_S_ALU_ADD_K: |
| 135 | A += fentry->k; | 137 | A += f_k; |
| 136 | continue; | 138 | continue; |
| 137 | case BPF_S_ALU_SUB_X: | 139 | case BPF_S_ALU_SUB_X: |
| 138 | A -= X; | 140 | A -= X; |
| 139 | continue; | 141 | continue; |
| 140 | case BPF_S_ALU_SUB_K: | 142 | case BPF_S_ALU_SUB_K: |
| 141 | A -= fentry->k; | 143 | A -= f_k; |
| 142 | continue; | 144 | continue; |
| 143 | case BPF_S_ALU_MUL_X: | 145 | case BPF_S_ALU_MUL_X: |
| 144 | A *= X; | 146 | A *= X; |
| 145 | continue; | 147 | continue; |
| 146 | case BPF_S_ALU_MUL_K: | 148 | case BPF_S_ALU_MUL_K: |
| 147 | A *= fentry->k; | 149 | A *= f_k; |
| 148 | continue; | 150 | continue; |
| 149 | case BPF_S_ALU_DIV_X: | 151 | case BPF_S_ALU_DIV_X: |
| 150 | if (X == 0) | 152 | if (X == 0) |
| @@ -152,49 +154,49 @@ unsigned int sk_run_filter(struct sk_buff *skb, struct sock_filter *filter, int | |||
| 152 | A /= X; | 154 | A /= X; |
| 153 | continue; | 155 | continue; |
| 154 | case BPF_S_ALU_DIV_K: | 156 | case BPF_S_ALU_DIV_K: |
| 155 | A /= fentry->k; | 157 | A /= f_k; |
| 156 | continue; | 158 | continue; |
| 157 | case BPF_S_ALU_AND_X: | 159 | case BPF_S_ALU_AND_X: |
| 158 | A &= X; | 160 | A &= X; |
| 159 | continue; | 161 | continue; |
| 160 | case BPF_S_ALU_AND_K: | 162 | case BPF_S_ALU_AND_K: |
| 161 | A &= fentry->k; | 163 | A &= f_k; |
| 162 | continue; | 164 | continue; |
| 163 | case BPF_S_ALU_OR_X: | 165 | case BPF_S_ALU_OR_X: |
| 164 | A |= X; | 166 | A |= X; |
| 165 | continue; | 167 | continue; |
| 166 | case BPF_S_ALU_OR_K: | 168 | case BPF_S_ALU_OR_K: |
| 167 | A |= fentry->k; | 169 | A |= f_k; |
| 168 | continue; | 170 | continue; |
| 169 | case BPF_S_ALU_LSH_X: | 171 | case BPF_S_ALU_LSH_X: |
| 170 | A <<= X; | 172 | A <<= X; |
| 171 | continue; | 173 | continue; |
| 172 | case BPF_S_ALU_LSH_K: | 174 | case BPF_S_ALU_LSH_K: |
| 173 | A <<= fentry->k; | 175 | A <<= f_k; |
| 174 | continue; | 176 | continue; |
| 175 | case BPF_S_ALU_RSH_X: | 177 | case BPF_S_ALU_RSH_X: |
| 176 | A >>= X; | 178 | A >>= X; |
| 177 | continue; | 179 | continue; |
| 178 | case BPF_S_ALU_RSH_K: | 180 | case BPF_S_ALU_RSH_K: |
| 179 | A >>= fentry->k; | 181 | A >>= f_k; |
| 180 | continue; | 182 | continue; |
| 181 | case BPF_S_ALU_NEG: | 183 | case BPF_S_ALU_NEG: |
| 182 | A = -A; | 184 | A = -A; |
| 183 | continue; | 185 | continue; |
| 184 | case BPF_S_JMP_JA: | 186 | case BPF_S_JMP_JA: |
| 185 | pc += fentry->k; | 187 | pc += f_k; |
| 186 | continue; | 188 | continue; |
| 187 | case BPF_S_JMP_JGT_K: | 189 | case BPF_S_JMP_JGT_K: |
| 188 | pc += (A > fentry->k) ? fentry->jt : fentry->jf; | 190 | pc += (A > f_k) ? fentry->jt : fentry->jf; |
| 189 | continue; | 191 | continue; |
| 190 | case BPF_S_JMP_JGE_K: | 192 | case BPF_S_JMP_JGE_K: |
| 191 | pc += (A >= fentry->k) ? fentry->jt : fentry->jf; | 193 | pc += (A >= f_k) ? fentry->jt : fentry->jf; |
| 192 | continue; | 194 | continue; |
| 193 | case BPF_S_JMP_JEQ_K: | 195 | case BPF_S_JMP_JEQ_K: |
| 194 | pc += (A == fentry->k) ? fentry->jt : fentry->jf; | 196 | pc += (A == f_k) ? fentry->jt : fentry->jf; |
| 195 | continue; | 197 | continue; |
| 196 | case BPF_S_JMP_JSET_K: | 198 | case BPF_S_JMP_JSET_K: |
| 197 | pc += (A & fentry->k) ? fentry->jt : fentry->jf; | 199 | pc += (A & f_k) ? fentry->jt : fentry->jf; |
| 198 | continue; | 200 | continue; |
| 199 | case BPF_S_JMP_JGT_X: | 201 | case BPF_S_JMP_JGT_X: |
| 200 | pc += (A > X) ? fentry->jt : fentry->jf; | 202 | pc += (A > X) ? fentry->jt : fentry->jf; |
| @@ -209,7 +211,7 @@ unsigned int sk_run_filter(struct sk_buff *skb, struct sock_filter *filter, int | |||
| 209 | pc += (A & X) ? fentry->jt : fentry->jf; | 211 | pc += (A & X) ? fentry->jt : fentry->jf; |
| 210 | continue; | 212 | continue; |
| 211 | case BPF_S_LD_W_ABS: | 213 | case BPF_S_LD_W_ABS: |
| 212 | k = fentry->k; | 214 | k = f_k; |
| 213 | load_w: | 215 | load_w: |
| 214 | ptr = load_pointer(skb, k, 4, &tmp); | 216 | ptr = load_pointer(skb, k, 4, &tmp); |
| 215 | if (ptr != NULL) { | 217 | if (ptr != NULL) { |
| @@ -218,7 +220,7 @@ load_w: | |||
| 218 | } | 220 | } |
| 219 | break; | 221 | break; |
| 220 | case BPF_S_LD_H_ABS: | 222 | case BPF_S_LD_H_ABS: |
| 221 | k = fentry->k; | 223 | k = f_k; |
| 222 | load_h: | 224 | load_h: |
| 223 | ptr = load_pointer(skb, k, 2, &tmp); | 225 | ptr = load_pointer(skb, k, 2, &tmp); |
| 224 | if (ptr != NULL) { | 226 | if (ptr != NULL) { |
| @@ -227,7 +229,7 @@ load_h: | |||
| 227 | } | 229 | } |
| 228 | break; | 230 | break; |
| 229 | case BPF_S_LD_B_ABS: | 231 | case BPF_S_LD_B_ABS: |
| 230 | k = fentry->k; | 232 | k = f_k; |
| 231 | load_b: | 233 | load_b: |
| 232 | ptr = load_pointer(skb, k, 1, &tmp); | 234 | ptr = load_pointer(skb, k, 1, &tmp); |
| 233 | if (ptr != NULL) { | 235 | if (ptr != NULL) { |
| @@ -242,32 +244,34 @@ load_b: | |||
| 242 | X = skb->len; | 244 | X = skb->len; |
| 243 | continue; | 245 | continue; |
| 244 | case BPF_S_LD_W_IND: | 246 | case BPF_S_LD_W_IND: |
| 245 | k = X + fentry->k; | 247 | k = X + f_k; |
| 246 | goto load_w; | 248 | goto load_w; |
| 247 | case BPF_S_LD_H_IND: | 249 | case BPF_S_LD_H_IND: |
| 248 | k = X + fentry->k; | 250 | k = X + f_k; |
| 249 | goto load_h; | 251 | goto load_h; |
| 250 | case BPF_S_LD_B_IND: | 252 | case BPF_S_LD_B_IND: |
| 251 | k = X + fentry->k; | 253 | k = X + f_k; |
| 252 | goto load_b; | 254 | goto load_b; |
| 253 | case BPF_S_LDX_B_MSH: | 255 | case BPF_S_LDX_B_MSH: |
| 254 | ptr = load_pointer(skb, fentry->k, 1, &tmp); | 256 | ptr = load_pointer(skb, f_k, 1, &tmp); |
| 255 | if (ptr != NULL) { | 257 | if (ptr != NULL) { |
| 256 | X = (*(u8 *)ptr & 0xf) << 2; | 258 | X = (*(u8 *)ptr & 0xf) << 2; |
| 257 | continue; | 259 | continue; |
| 258 | } | 260 | } |
| 259 | return 0; | 261 | return 0; |
| 260 | case BPF_S_LD_IMM: | 262 | case BPF_S_LD_IMM: |
| 261 | A = fentry->k; | 263 | A = f_k; |
| 262 | continue; | 264 | continue; |
| 263 | case BPF_S_LDX_IMM: | 265 | case BPF_S_LDX_IMM: |
| 264 | X = fentry->k; | 266 | X = f_k; |
| 265 | continue; | 267 | continue; |
| 266 | case BPF_S_LD_MEM: | 268 | case BPF_S_LD_MEM: |
| 267 | A = mem[fentry->k]; | 269 | A = (memvalid & (1UL << f_k)) ? |
| 270 | mem[f_k] : 0; | ||
| 268 | continue; | 271 | continue; |
| 269 | case BPF_S_LDX_MEM: | 272 | case BPF_S_LDX_MEM: |
| 270 | X = mem[fentry->k]; | 273 | X = (memvalid & (1UL << f_k)) ? |
| 274 | mem[f_k] : 0; | ||
| 271 | continue; | 275 | continue; |
| 272 | case BPF_S_MISC_TAX: | 276 | case BPF_S_MISC_TAX: |
| 273 | X = A; | 277 | X = A; |
| @@ -276,14 +280,16 @@ load_b: | |||
| 276 | A = X; | 280 | A = X; |
| 277 | continue; | 281 | continue; |
| 278 | case BPF_S_RET_K: | 282 | case BPF_S_RET_K: |
| 279 | return fentry->k; | 283 | return f_k; |
| 280 | case BPF_S_RET_A: | 284 | case BPF_S_RET_A: |
| 281 | return A; | 285 | return A; |
| 282 | case BPF_S_ST: | 286 | case BPF_S_ST: |
| 283 | mem[fentry->k] = A; | 287 | memvalid |= 1UL << f_k; |
| 288 | mem[f_k] = A; | ||
| 284 | continue; | 289 | continue; |
| 285 | case BPF_S_STX: | 290 | case BPF_S_STX: |
| 286 | mem[fentry->k] = X; | 291 | memvalid |= 1UL << f_k; |
| 292 | mem[f_k] = X; | ||
| 287 | continue; | 293 | continue; |
| 288 | default: | 294 | default: |
| 289 | WARN_ON(1); | 295 | WARN_ON(1); |
diff --git a/net/core/pktgen.c b/net/core/pktgen.c index fbce4b05a53e..33bc3823ac6f 100644 --- a/net/core/pktgen.c +++ b/net/core/pktgen.c | |||
| @@ -887,7 +887,7 @@ static ssize_t pktgen_if_write(struct file *file, | |||
| 887 | i += len; | 887 | i += len; |
| 888 | 888 | ||
| 889 | if (debug) { | 889 | if (debug) { |
| 890 | size_t copy = min(count, 1023); | 890 | size_t copy = min_t(size_t, count, 1023); |
| 891 | char tb[copy + 1]; | 891 | char tb[copy + 1]; |
| 892 | if (copy_from_user(tb, user_buffer, copy)) | 892 | if (copy_from_user(tb, user_buffer, copy)) |
| 893 | return -EFAULT; | 893 | return -EFAULT; |
| @@ -2612,8 +2612,8 @@ static struct sk_buff *fill_packet_ipv4(struct net_device *odev, | |||
| 2612 | /* Update any of the values, used when we're incrementing various | 2612 | /* Update any of the values, used when we're incrementing various |
| 2613 | * fields. | 2613 | * fields. |
| 2614 | */ | 2614 | */ |
| 2615 | queue_map = pkt_dev->cur_queue_map; | ||
| 2616 | mod_cur_headers(pkt_dev); | 2615 | mod_cur_headers(pkt_dev); |
| 2616 | queue_map = pkt_dev->cur_queue_map; | ||
| 2617 | 2617 | ||
| 2618 | datalen = (odev->hard_header_len + 16) & ~0xf; | 2618 | datalen = (odev->hard_header_len + 16) & ~0xf; |
| 2619 | 2619 | ||
| @@ -2976,8 +2976,8 @@ static struct sk_buff *fill_packet_ipv6(struct net_device *odev, | |||
| 2976 | /* Update any of the values, used when we're incrementing various | 2976 | /* Update any of the values, used when we're incrementing various |
| 2977 | * fields. | 2977 | * fields. |
| 2978 | */ | 2978 | */ |
| 2979 | queue_map = pkt_dev->cur_queue_map; | ||
| 2980 | mod_cur_headers(pkt_dev); | 2979 | mod_cur_headers(pkt_dev); |
| 2980 | queue_map = pkt_dev->cur_queue_map; | ||
| 2981 | 2981 | ||
| 2982 | skb = __netdev_alloc_skb(odev, | 2982 | skb = __netdev_alloc_skb(odev, |
| 2983 | pkt_dev->cur_pkt_size + 64 | 2983 | pkt_dev->cur_pkt_size + 64 |
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 8121268ddbdd..841c287ef40a 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
| @@ -347,16 +347,17 @@ static size_t rtnl_link_get_size(const struct net_device *dev) | |||
| 347 | if (!ops) | 347 | if (!ops) |
| 348 | return 0; | 348 | return 0; |
| 349 | 349 | ||
| 350 | size = nlmsg_total_size(sizeof(struct nlattr)) + /* IFLA_LINKINFO */ | 350 | size = nla_total_size(sizeof(struct nlattr)) + /* IFLA_LINKINFO */ |
| 351 | nlmsg_total_size(strlen(ops->kind) + 1); /* IFLA_INFO_KIND */ | 351 | nla_total_size(strlen(ops->kind) + 1); /* IFLA_INFO_KIND */ |
| 352 | 352 | ||
| 353 | if (ops->get_size) | 353 | if (ops->get_size) |
| 354 | /* IFLA_INFO_DATA + nested data */ | 354 | /* IFLA_INFO_DATA + nested data */ |
| 355 | size += nlmsg_total_size(sizeof(struct nlattr)) + | 355 | size += nla_total_size(sizeof(struct nlattr)) + |
| 356 | ops->get_size(dev); | 356 | ops->get_size(dev); |
| 357 | 357 | ||
| 358 | if (ops->get_xstats_size) | 358 | if (ops->get_xstats_size) |
| 359 | size += ops->get_xstats_size(dev); /* IFLA_INFO_XSTATS */ | 359 | /* IFLA_INFO_XSTATS */ |
| 360 | size += nla_total_size(ops->get_xstats_size(dev)); | ||
| 360 | 361 | ||
| 361 | return size; | 362 | return size; |
| 362 | } | 363 | } |
diff --git a/net/core/sock.c b/net/core/sock.c index 3eed5424e659..fb6080111461 100644 --- a/net/core/sock.c +++ b/net/core/sock.c | |||
| @@ -1653,10 +1653,10 @@ int __sk_mem_schedule(struct sock *sk, int size, int kind) | |||
| 1653 | { | 1653 | { |
| 1654 | struct proto *prot = sk->sk_prot; | 1654 | struct proto *prot = sk->sk_prot; |
| 1655 | int amt = sk_mem_pages(size); | 1655 | int amt = sk_mem_pages(size); |
| 1656 | int allocated; | 1656 | long allocated; |
| 1657 | 1657 | ||
| 1658 | sk->sk_forward_alloc += amt * SK_MEM_QUANTUM; | 1658 | sk->sk_forward_alloc += amt * SK_MEM_QUANTUM; |
| 1659 | allocated = atomic_add_return(amt, prot->memory_allocated); | 1659 | allocated = atomic_long_add_return(amt, prot->memory_allocated); |
| 1660 | 1660 | ||
| 1661 | /* Under limit. */ | 1661 | /* Under limit. */ |
| 1662 | if (allocated <= prot->sysctl_mem[0]) { | 1662 | if (allocated <= prot->sysctl_mem[0]) { |
| @@ -1714,7 +1714,7 @@ suppress_allocation: | |||
| 1714 | 1714 | ||
| 1715 | /* Alas. Undo changes. */ | 1715 | /* Alas. Undo changes. */ |
| 1716 | sk->sk_forward_alloc -= amt * SK_MEM_QUANTUM; | 1716 | sk->sk_forward_alloc -= amt * SK_MEM_QUANTUM; |
| 1717 | atomic_sub(amt, prot->memory_allocated); | 1717 | atomic_long_sub(amt, prot->memory_allocated); |
| 1718 | return 0; | 1718 | return 0; |
| 1719 | } | 1719 | } |
| 1720 | EXPORT_SYMBOL(__sk_mem_schedule); | 1720 | EXPORT_SYMBOL(__sk_mem_schedule); |
| @@ -1727,12 +1727,12 @@ void __sk_mem_reclaim(struct sock *sk) | |||
| 1727 | { | 1727 | { |
| 1728 | struct proto *prot = sk->sk_prot; | 1728 | struct proto *prot = sk->sk_prot; |
| 1729 | 1729 | ||
| 1730 | atomic_sub(sk->sk_forward_alloc >> SK_MEM_QUANTUM_SHIFT, | 1730 | atomic_long_sub(sk->sk_forward_alloc >> SK_MEM_QUANTUM_SHIFT, |
| 1731 | prot->memory_allocated); | 1731 | prot->memory_allocated); |
| 1732 | sk->sk_forward_alloc &= SK_MEM_QUANTUM - 1; | 1732 | sk->sk_forward_alloc &= SK_MEM_QUANTUM - 1; |
| 1733 | 1733 | ||
| 1734 | if (prot->memory_pressure && *prot->memory_pressure && | 1734 | if (prot->memory_pressure && *prot->memory_pressure && |
| 1735 | (atomic_read(prot->memory_allocated) < prot->sysctl_mem[0])) | 1735 | (atomic_long_read(prot->memory_allocated) < prot->sysctl_mem[0])) |
| 1736 | *prot->memory_pressure = 0; | 1736 | *prot->memory_pressure = 0; |
| 1737 | } | 1737 | } |
| 1738 | EXPORT_SYMBOL(__sk_mem_reclaim); | 1738 | EXPORT_SYMBOL(__sk_mem_reclaim); |
| @@ -2452,12 +2452,12 @@ static char proto_method_implemented(const void *method) | |||
| 2452 | 2452 | ||
| 2453 | static void proto_seq_printf(struct seq_file *seq, struct proto *proto) | 2453 | static void proto_seq_printf(struct seq_file *seq, struct proto *proto) |
| 2454 | { | 2454 | { |
| 2455 | seq_printf(seq, "%-9s %4u %6d %6d %-3s %6u %-3s %-10s " | 2455 | seq_printf(seq, "%-9s %4u %6d %6ld %-3s %6u %-3s %-10s " |
| 2456 | "%2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c\n", | 2456 | "%2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c %2c\n", |
| 2457 | proto->name, | 2457 | proto->name, |
| 2458 | proto->obj_size, | 2458 | proto->obj_size, |
| 2459 | sock_prot_inuse_get(seq_file_net(seq), proto), | 2459 | sock_prot_inuse_get(seq_file_net(seq), proto), |
| 2460 | proto->memory_allocated != NULL ? atomic_read(proto->memory_allocated) : -1, | 2460 | proto->memory_allocated != NULL ? atomic_long_read(proto->memory_allocated) : -1L, |
| 2461 | proto->memory_pressure != NULL ? *proto->memory_pressure ? "yes" : "no" : "NI", | 2461 | proto->memory_pressure != NULL ? *proto->memory_pressure ? "yes" : "no" : "NI", |
| 2462 | proto->max_header, | 2462 | proto->max_header, |
| 2463 | proto->slab == NULL ? "no" : "yes", | 2463 | proto->slab == NULL ? "no" : "yes", |
diff --git a/net/decnet/af_decnet.c b/net/decnet/af_decnet.c index d6b93d19790f..a76b78de679f 100644 --- a/net/decnet/af_decnet.c +++ b/net/decnet/af_decnet.c | |||
| @@ -155,7 +155,7 @@ static const struct proto_ops dn_proto_ops; | |||
| 155 | static DEFINE_RWLOCK(dn_hash_lock); | 155 | static DEFINE_RWLOCK(dn_hash_lock); |
| 156 | static struct hlist_head dn_sk_hash[DN_SK_HASH_SIZE]; | 156 | static struct hlist_head dn_sk_hash[DN_SK_HASH_SIZE]; |
| 157 | static struct hlist_head dn_wild_sk; | 157 | static struct hlist_head dn_wild_sk; |
| 158 | static atomic_t decnet_memory_allocated; | 158 | static atomic_long_t decnet_memory_allocated; |
| 159 | 159 | ||
| 160 | static int __dn_setsockopt(struct socket *sock, int level, int optname, char __user *optval, unsigned int optlen, int flags); | 160 | static int __dn_setsockopt(struct socket *sock, int level, int optname, char __user *optval, unsigned int optlen, int flags); |
| 161 | static int __dn_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen, int flags); | 161 | static int __dn_getsockopt(struct socket *sock, int level, int optname, char __user *optval, int __user *optlen, int flags); |
diff --git a/net/decnet/sysctl_net_decnet.c b/net/decnet/sysctl_net_decnet.c index be3eb8e23288..28f8b5e5f73b 100644 --- a/net/decnet/sysctl_net_decnet.c +++ b/net/decnet/sysctl_net_decnet.c | |||
| @@ -38,7 +38,7 @@ int decnet_log_martians = 1; | |||
| 38 | int decnet_no_fc_max_cwnd = NSP_MIN_WINDOW; | 38 | int decnet_no_fc_max_cwnd = NSP_MIN_WINDOW; |
| 39 | 39 | ||
| 40 | /* Reasonable defaults, I hope, based on tcp's defaults */ | 40 | /* Reasonable defaults, I hope, based on tcp's defaults */ |
| 41 | int sysctl_decnet_mem[3] = { 768 << 3, 1024 << 3, 1536 << 3 }; | 41 | long sysctl_decnet_mem[3] = { 768 << 3, 1024 << 3, 1536 << 3 }; |
| 42 | int sysctl_decnet_wmem[3] = { 4 * 1024, 16 * 1024, 128 * 1024 }; | 42 | int sysctl_decnet_wmem[3] = { 4 * 1024, 16 * 1024, 128 * 1024 }; |
| 43 | int sysctl_decnet_rmem[3] = { 4 * 1024, 87380, 87380 * 2 }; | 43 | int sysctl_decnet_rmem[3] = { 4 * 1024, 87380, 87380 * 2 }; |
| 44 | 44 | ||
| @@ -324,7 +324,7 @@ static ctl_table dn_table[] = { | |||
| 324 | .data = &sysctl_decnet_mem, | 324 | .data = &sysctl_decnet_mem, |
| 325 | .maxlen = sizeof(sysctl_decnet_mem), | 325 | .maxlen = sizeof(sysctl_decnet_mem), |
| 326 | .mode = 0644, | 326 | .mode = 0644, |
| 327 | .proc_handler = proc_dointvec, | 327 | .proc_handler = proc_doulongvec_minmax |
| 328 | }, | 328 | }, |
| 329 | { | 329 | { |
| 330 | .procname = "decnet_rmem", | 330 | .procname = "decnet_rmem", |
diff --git a/net/ipv4/igmp.c b/net/ipv4/igmp.c index c8877c6c7216..3c53c2d89e3b 100644 --- a/net/ipv4/igmp.c +++ b/net/ipv4/igmp.c | |||
| @@ -2306,10 +2306,8 @@ void ip_mc_drop_socket(struct sock *sk) | |||
| 2306 | 2306 | ||
| 2307 | in_dev = inetdev_by_index(net, iml->multi.imr_ifindex); | 2307 | in_dev = inetdev_by_index(net, iml->multi.imr_ifindex); |
| 2308 | (void) ip_mc_leave_src(sk, iml, in_dev); | 2308 | (void) ip_mc_leave_src(sk, iml, in_dev); |
| 2309 | if (in_dev != NULL) { | 2309 | if (in_dev != NULL) |
| 2310 | ip_mc_dec_group(in_dev, iml->multi.imr_multiaddr.s_addr); | 2310 | ip_mc_dec_group(in_dev, iml->multi.imr_multiaddr.s_addr); |
| 2311 | in_dev_put(in_dev); | ||
| 2312 | } | ||
| 2313 | /* decrease mem now to avoid the memleak warning */ | 2311 | /* decrease mem now to avoid the memleak warning */ |
| 2314 | atomic_sub(sizeof(*iml), &sk->sk_omem_alloc); | 2312 | atomic_sub(sizeof(*iml), &sk->sk_omem_alloc); |
| 2315 | call_rcu(&iml->rcu, ip_mc_socklist_reclaim); | 2313 | call_rcu(&iml->rcu, ip_mc_socklist_reclaim); |
diff --git a/net/ipv4/proc.c b/net/ipv4/proc.c index 4ae1f203f7cb..1b48eb1ed453 100644 --- a/net/ipv4/proc.c +++ b/net/ipv4/proc.c | |||
| @@ -59,13 +59,13 @@ static int sockstat_seq_show(struct seq_file *seq, void *v) | |||
| 59 | local_bh_enable(); | 59 | local_bh_enable(); |
| 60 | 60 | ||
| 61 | socket_seq_show(seq); | 61 | socket_seq_show(seq); |
| 62 | seq_printf(seq, "TCP: inuse %d orphan %d tw %d alloc %d mem %d\n", | 62 | seq_printf(seq, "TCP: inuse %d orphan %d tw %d alloc %d mem %ld\n", |
| 63 | sock_prot_inuse_get(net, &tcp_prot), orphans, | 63 | sock_prot_inuse_get(net, &tcp_prot), orphans, |
| 64 | tcp_death_row.tw_count, sockets, | 64 | tcp_death_row.tw_count, sockets, |
| 65 | atomic_read(&tcp_memory_allocated)); | 65 | atomic_long_read(&tcp_memory_allocated)); |
| 66 | seq_printf(seq, "UDP: inuse %d mem %d\n", | 66 | seq_printf(seq, "UDP: inuse %d mem %ld\n", |
| 67 | sock_prot_inuse_get(net, &udp_prot), | 67 | sock_prot_inuse_get(net, &udp_prot), |
| 68 | atomic_read(&udp_memory_allocated)); | 68 | atomic_long_read(&udp_memory_allocated)); |
| 69 | seq_printf(seq, "UDPLITE: inuse %d\n", | 69 | seq_printf(seq, "UDPLITE: inuse %d\n", |
| 70 | sock_prot_inuse_get(net, &udplite_prot)); | 70 | sock_prot_inuse_get(net, &udplite_prot)); |
| 71 | seq_printf(seq, "RAW: inuse %d\n", | 71 | seq_printf(seq, "RAW: inuse %d\n", |
diff --git a/net/ipv4/sysctl_net_ipv4.c b/net/ipv4/sysctl_net_ipv4.c index d96c1da4b17c..e91911d7aae2 100644 --- a/net/ipv4/sysctl_net_ipv4.c +++ b/net/ipv4/sysctl_net_ipv4.c | |||
| @@ -398,7 +398,7 @@ static struct ctl_table ipv4_table[] = { | |||
| 398 | .data = &sysctl_tcp_mem, | 398 | .data = &sysctl_tcp_mem, |
| 399 | .maxlen = sizeof(sysctl_tcp_mem), | 399 | .maxlen = sizeof(sysctl_tcp_mem), |
| 400 | .mode = 0644, | 400 | .mode = 0644, |
| 401 | .proc_handler = proc_dointvec | 401 | .proc_handler = proc_doulongvec_minmax |
| 402 | }, | 402 | }, |
| 403 | { | 403 | { |
| 404 | .procname = "tcp_wmem", | 404 | .procname = "tcp_wmem", |
| @@ -602,8 +602,7 @@ static struct ctl_table ipv4_table[] = { | |||
| 602 | .data = &sysctl_udp_mem, | 602 | .data = &sysctl_udp_mem, |
| 603 | .maxlen = sizeof(sysctl_udp_mem), | 603 | .maxlen = sizeof(sysctl_udp_mem), |
| 604 | .mode = 0644, | 604 | .mode = 0644, |
| 605 | .proc_handler = proc_dointvec_minmax, | 605 | .proc_handler = proc_doulongvec_minmax, |
| 606 | .extra1 = &zero | ||
| 607 | }, | 606 | }, |
| 608 | { | 607 | { |
| 609 | .procname = "udp_rmem_min", | 608 | .procname = "udp_rmem_min", |
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 1664a0590bb8..081419969485 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
| @@ -282,7 +282,7 @@ int sysctl_tcp_fin_timeout __read_mostly = TCP_FIN_TIMEOUT; | |||
| 282 | struct percpu_counter tcp_orphan_count; | 282 | struct percpu_counter tcp_orphan_count; |
| 283 | EXPORT_SYMBOL_GPL(tcp_orphan_count); | 283 | EXPORT_SYMBOL_GPL(tcp_orphan_count); |
| 284 | 284 | ||
| 285 | int sysctl_tcp_mem[3] __read_mostly; | 285 | long sysctl_tcp_mem[3] __read_mostly; |
| 286 | int sysctl_tcp_wmem[3] __read_mostly; | 286 | int sysctl_tcp_wmem[3] __read_mostly; |
| 287 | int sysctl_tcp_rmem[3] __read_mostly; | 287 | int sysctl_tcp_rmem[3] __read_mostly; |
| 288 | 288 | ||
| @@ -290,7 +290,7 @@ EXPORT_SYMBOL(sysctl_tcp_mem); | |||
| 290 | EXPORT_SYMBOL(sysctl_tcp_rmem); | 290 | EXPORT_SYMBOL(sysctl_tcp_rmem); |
| 291 | EXPORT_SYMBOL(sysctl_tcp_wmem); | 291 | EXPORT_SYMBOL(sysctl_tcp_wmem); |
| 292 | 292 | ||
| 293 | atomic_t tcp_memory_allocated; /* Current allocated memory. */ | 293 | atomic_long_t tcp_memory_allocated; /* Current allocated memory. */ |
| 294 | EXPORT_SYMBOL(tcp_memory_allocated); | 294 | EXPORT_SYMBOL(tcp_memory_allocated); |
| 295 | 295 | ||
| 296 | /* | 296 | /* |
| @@ -2246,7 +2246,7 @@ static int do_tcp_setsockopt(struct sock *sk, int level, | |||
| 2246 | /* Values greater than interface MTU won't take effect. However | 2246 | /* Values greater than interface MTU won't take effect. However |
| 2247 | * at the point when this call is done we typically don't yet | 2247 | * at the point when this call is done we typically don't yet |
| 2248 | * know which interface is going to be used */ | 2248 | * know which interface is going to be used */ |
| 2249 | if (val < 8 || val > MAX_TCP_WINDOW) { | 2249 | if (val < 64 || val > MAX_TCP_WINDOW) { |
| 2250 | err = -EINVAL; | 2250 | err = -EINVAL; |
| 2251 | break; | 2251 | break; |
| 2252 | } | 2252 | } |
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 3357f69e353d..6d8ab1c4efc3 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
| @@ -259,8 +259,11 @@ static void tcp_fixup_sndbuf(struct sock *sk) | |||
| 259 | int sndmem = tcp_sk(sk)->rx_opt.mss_clamp + MAX_TCP_HEADER + 16 + | 259 | int sndmem = tcp_sk(sk)->rx_opt.mss_clamp + MAX_TCP_HEADER + 16 + |
| 260 | sizeof(struct sk_buff); | 260 | sizeof(struct sk_buff); |
| 261 | 261 | ||
| 262 | if (sk->sk_sndbuf < 3 * sndmem) | 262 | if (sk->sk_sndbuf < 3 * sndmem) { |
| 263 | sk->sk_sndbuf = min(3 * sndmem, sysctl_tcp_wmem[2]); | 263 | sk->sk_sndbuf = 3 * sndmem; |
| 264 | if (sk->sk_sndbuf > sysctl_tcp_wmem[2]) | ||
| 265 | sk->sk_sndbuf = sysctl_tcp_wmem[2]; | ||
| 266 | } | ||
| 264 | } | 267 | } |
| 265 | 268 | ||
| 266 | /* 2. Tuning advertised window (window_clamp, rcv_ssthresh) | 269 | /* 2. Tuning advertised window (window_clamp, rcv_ssthresh) |
| @@ -396,7 +399,7 @@ static void tcp_clamp_window(struct sock *sk) | |||
| 396 | if (sk->sk_rcvbuf < sysctl_tcp_rmem[2] && | 399 | if (sk->sk_rcvbuf < sysctl_tcp_rmem[2] && |
| 397 | !(sk->sk_userlocks & SOCK_RCVBUF_LOCK) && | 400 | !(sk->sk_userlocks & SOCK_RCVBUF_LOCK) && |
| 398 | !tcp_memory_pressure && | 401 | !tcp_memory_pressure && |
| 399 | atomic_read(&tcp_memory_allocated) < sysctl_tcp_mem[0]) { | 402 | atomic_long_read(&tcp_memory_allocated) < sysctl_tcp_mem[0]) { |
| 400 | sk->sk_rcvbuf = min(atomic_read(&sk->sk_rmem_alloc), | 403 | sk->sk_rcvbuf = min(atomic_read(&sk->sk_rmem_alloc), |
| 401 | sysctl_tcp_rmem[2]); | 404 | sysctl_tcp_rmem[2]); |
| 402 | } | 405 | } |
| @@ -4861,7 +4864,7 @@ static int tcp_should_expand_sndbuf(struct sock *sk) | |||
| 4861 | return 0; | 4864 | return 0; |
| 4862 | 4865 | ||
| 4863 | /* If we are under soft global TCP memory pressure, do not expand. */ | 4866 | /* If we are under soft global TCP memory pressure, do not expand. */ |
| 4864 | if (atomic_read(&tcp_memory_allocated) >= sysctl_tcp_mem[0]) | 4867 | if (atomic_long_read(&tcp_memory_allocated) >= sysctl_tcp_mem[0]) |
| 4865 | return 0; | 4868 | return 0; |
| 4866 | 4869 | ||
| 4867 | /* If we filled the congestion window, do not expand. */ | 4870 | /* If we filled the congestion window, do not expand. */ |
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 8f8527d41682..69ccbc1dde9c 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
| @@ -415,6 +415,9 @@ void tcp_v4_err(struct sk_buff *icmp_skb, u32 info) | |||
| 415 | !icsk->icsk_backoff) | 415 | !icsk->icsk_backoff) |
| 416 | break; | 416 | break; |
| 417 | 417 | ||
| 418 | if (sock_owned_by_user(sk)) | ||
| 419 | break; | ||
| 420 | |||
| 418 | icsk->icsk_backoff--; | 421 | icsk->icsk_backoff--; |
| 419 | inet_csk(sk)->icsk_rto = __tcp_set_rto(tp) << | 422 | inet_csk(sk)->icsk_rto = __tcp_set_rto(tp) << |
| 420 | icsk->icsk_backoff; | 423 | icsk->icsk_backoff; |
| @@ -429,11 +432,6 @@ void tcp_v4_err(struct sk_buff *icmp_skb, u32 info) | |||
| 429 | if (remaining) { | 432 | if (remaining) { |
| 430 | inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS, | 433 | inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS, |
| 431 | remaining, TCP_RTO_MAX); | 434 | remaining, TCP_RTO_MAX); |
| 432 | } else if (sock_owned_by_user(sk)) { | ||
| 433 | /* RTO revert clocked out retransmission, | ||
| 434 | * but socket is locked. Will defer. */ | ||
| 435 | inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS, | ||
| 436 | HZ/20, TCP_RTO_MAX); | ||
| 437 | } else { | 435 | } else { |
| 438 | /* RTO revert clocked out retransmission. | 436 | /* RTO revert clocked out retransmission. |
| 439 | * Will retransmit now */ | 437 | * Will retransmit now */ |
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 28cb2d733a3c..5e0a3a582a59 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c | |||
| @@ -110,7 +110,7 @@ | |||
| 110 | struct udp_table udp_table __read_mostly; | 110 | struct udp_table udp_table __read_mostly; |
| 111 | EXPORT_SYMBOL(udp_table); | 111 | EXPORT_SYMBOL(udp_table); |
| 112 | 112 | ||
| 113 | int sysctl_udp_mem[3] __read_mostly; | 113 | long sysctl_udp_mem[3] __read_mostly; |
| 114 | EXPORT_SYMBOL(sysctl_udp_mem); | 114 | EXPORT_SYMBOL(sysctl_udp_mem); |
| 115 | 115 | ||
| 116 | int sysctl_udp_rmem_min __read_mostly; | 116 | int sysctl_udp_rmem_min __read_mostly; |
| @@ -119,7 +119,7 @@ EXPORT_SYMBOL(sysctl_udp_rmem_min); | |||
| 119 | int sysctl_udp_wmem_min __read_mostly; | 119 | int sysctl_udp_wmem_min __read_mostly; |
| 120 | EXPORT_SYMBOL(sysctl_udp_wmem_min); | 120 | EXPORT_SYMBOL(sysctl_udp_wmem_min); |
| 121 | 121 | ||
| 122 | atomic_t udp_memory_allocated; | 122 | atomic_long_t udp_memory_allocated; |
| 123 | EXPORT_SYMBOL(udp_memory_allocated); | 123 | EXPORT_SYMBOL(udp_memory_allocated); |
| 124 | 124 | ||
| 125 | #define MAX_UDP_PORTS 65536 | 125 | #define MAX_UDP_PORTS 65536 |
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index e048ec62d109..b41ce0f0d514 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
| @@ -2740,10 +2740,6 @@ static int addrconf_ifdown(struct net_device *dev, int how) | |||
| 2740 | /* Flag it for later restoration when link comes up */ | 2740 | /* Flag it for later restoration when link comes up */ |
| 2741 | ifa->flags |= IFA_F_TENTATIVE; | 2741 | ifa->flags |= IFA_F_TENTATIVE; |
| 2742 | ifa->state = INET6_IFADDR_STATE_DAD; | 2742 | ifa->state = INET6_IFADDR_STATE_DAD; |
| 2743 | |||
| 2744 | write_unlock_bh(&idev->lock); | ||
| 2745 | |||
| 2746 | in6_ifa_hold(ifa); | ||
| 2747 | } else { | 2743 | } else { |
| 2748 | list_del(&ifa->if_list); | 2744 | list_del(&ifa->if_list); |
| 2749 | 2745 | ||
| @@ -2758,19 +2754,15 @@ static int addrconf_ifdown(struct net_device *dev, int how) | |||
| 2758 | ifa->state = INET6_IFADDR_STATE_DEAD; | 2754 | ifa->state = INET6_IFADDR_STATE_DEAD; |
| 2759 | spin_unlock_bh(&ifa->state_lock); | 2755 | spin_unlock_bh(&ifa->state_lock); |
| 2760 | 2756 | ||
| 2761 | if (state == INET6_IFADDR_STATE_DEAD) | 2757 | if (state == INET6_IFADDR_STATE_DEAD) { |
| 2762 | goto put_ifa; | 2758 | in6_ifa_put(ifa); |
| 2759 | } else { | ||
| 2760 | __ipv6_ifa_notify(RTM_DELADDR, ifa); | ||
| 2761 | atomic_notifier_call_chain(&inet6addr_chain, | ||
| 2762 | NETDEV_DOWN, ifa); | ||
| 2763 | } | ||
| 2764 | write_lock_bh(&idev->lock); | ||
| 2763 | } | 2765 | } |
| 2764 | |||
| 2765 | __ipv6_ifa_notify(RTM_DELADDR, ifa); | ||
| 2766 | if (ifa->state == INET6_IFADDR_STATE_DEAD) | ||
| 2767 | atomic_notifier_call_chain(&inet6addr_chain, | ||
| 2768 | NETDEV_DOWN, ifa); | ||
| 2769 | |||
| 2770 | put_ifa: | ||
| 2771 | in6_ifa_put(ifa); | ||
| 2772 | |||
| 2773 | write_lock_bh(&idev->lock); | ||
| 2774 | } | 2766 | } |
| 2775 | 2767 | ||
| 2776 | list_splice(&keep_list, &idev->addr_list); | 2768 | list_splice(&keep_list, &idev->addr_list); |
diff --git a/net/ipv6/netfilter/nf_conntrack_reasm.c b/net/ipv6/netfilter/nf_conntrack_reasm.c index 3a3f129a44cb..79d43aa8fa8d 100644 --- a/net/ipv6/netfilter/nf_conntrack_reasm.c +++ b/net/ipv6/netfilter/nf_conntrack_reasm.c | |||
| @@ -286,7 +286,7 @@ found: | |||
| 286 | 286 | ||
| 287 | /* Check for overlap with preceding fragment. */ | 287 | /* Check for overlap with preceding fragment. */ |
| 288 | if (prev && | 288 | if (prev && |
| 289 | (NFCT_FRAG6_CB(prev)->offset + prev->len) - offset > 0) | 289 | (NFCT_FRAG6_CB(prev)->offset + prev->len) > offset) |
| 290 | goto discard_fq; | 290 | goto discard_fq; |
| 291 | 291 | ||
| 292 | /* Look for overlap with succeeding segment. */ | 292 | /* Look for overlap with succeeding segment. */ |
diff --git a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c index c7ba3149633f..0f2766453759 100644 --- a/net/ipv6/reassembly.c +++ b/net/ipv6/reassembly.c | |||
| @@ -349,7 +349,7 @@ found: | |||
| 349 | 349 | ||
| 350 | /* Check for overlap with preceding fragment. */ | 350 | /* Check for overlap with preceding fragment. */ |
| 351 | if (prev && | 351 | if (prev && |
| 352 | (FRAG6_CB(prev)->offset + prev->len) - offset > 0) | 352 | (FRAG6_CB(prev)->offset + prev->len) > offset) |
| 353 | goto discard_fq; | 353 | goto discard_fq; |
| 354 | 354 | ||
| 355 | /* Look for overlap with succeeding segment. */ | 355 | /* Look for overlap with succeeding segment. */ |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index fc328339be99..96455ffb76fb 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
| @@ -1945,8 +1945,12 @@ struct rt6_info *addrconf_dst_alloc(struct inet6_dev *idev, | |||
| 1945 | struct rt6_info *rt = ip6_dst_alloc(&net->ipv6.ip6_dst_ops); | 1945 | struct rt6_info *rt = ip6_dst_alloc(&net->ipv6.ip6_dst_ops); |
| 1946 | struct neighbour *neigh; | 1946 | struct neighbour *neigh; |
| 1947 | 1947 | ||
| 1948 | if (rt == NULL) | 1948 | if (rt == NULL) { |
| 1949 | if (net_ratelimit()) | ||
| 1950 | pr_warning("IPv6: Maximum number of routes reached," | ||
| 1951 | " consider increasing route/max_size.\n"); | ||
| 1949 | return ERR_PTR(-ENOMEM); | 1952 | return ERR_PTR(-ENOMEM); |
| 1953 | } | ||
| 1950 | 1954 | ||
| 1951 | dev_hold(net->loopback_dev); | 1955 | dev_hold(net->loopback_dev); |
| 1952 | in6_dev_hold(idev); | 1956 | in6_dev_hold(idev); |
diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c index f9163b12c7f1..7aa85591dbe7 100644 --- a/net/mac80211/iface.c +++ b/net/mac80211/iface.c | |||
| @@ -391,6 +391,9 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, | |||
| 391 | u32 hw_reconf_flags = 0; | 391 | u32 hw_reconf_flags = 0; |
| 392 | int i; | 392 | int i; |
| 393 | 393 | ||
| 394 | if (local->scan_sdata == sdata) | ||
| 395 | ieee80211_scan_cancel(local); | ||
| 396 | |||
| 394 | clear_bit(SDATA_STATE_RUNNING, &sdata->state); | 397 | clear_bit(SDATA_STATE_RUNNING, &sdata->state); |
| 395 | 398 | ||
| 396 | /* | 399 | /* |
| @@ -523,9 +526,6 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, | |||
| 523 | synchronize_rcu(); | 526 | synchronize_rcu(); |
| 524 | skb_queue_purge(&sdata->skb_queue); | 527 | skb_queue_purge(&sdata->skb_queue); |
| 525 | 528 | ||
| 526 | if (local->scan_sdata == sdata) | ||
| 527 | ieee80211_scan_cancel(local); | ||
| 528 | |||
| 529 | /* | 529 | /* |
| 530 | * Disable beaconing here for mesh only, AP and IBSS | 530 | * Disable beaconing here for mesh only, AP and IBSS |
| 531 | * are already taken care of. | 531 | * are already taken care of. |
diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c index 3616f27b9d46..8298e676f5a0 100644 --- a/net/packet/af_packet.c +++ b/net/packet/af_packet.c | |||
| @@ -1610,9 +1610,11 @@ static int packet_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
| 1610 | 1610 | ||
| 1611 | err = -EINVAL; | 1611 | err = -EINVAL; |
| 1612 | vnet_hdr_len = sizeof(vnet_hdr); | 1612 | vnet_hdr_len = sizeof(vnet_hdr); |
| 1613 | if ((len -= vnet_hdr_len) < 0) | 1613 | if (len < vnet_hdr_len) |
| 1614 | goto out_free; | 1614 | goto out_free; |
| 1615 | 1615 | ||
| 1616 | len -= vnet_hdr_len; | ||
| 1617 | |||
| 1616 | if (skb_is_gso(skb)) { | 1618 | if (skb_is_gso(skb)) { |
| 1617 | struct skb_shared_info *sinfo = skb_shinfo(skb); | 1619 | struct skb_shared_info *sinfo = skb_shinfo(skb); |
| 1618 | 1620 | ||
| @@ -1719,7 +1721,7 @@ static int packet_getname_spkt(struct socket *sock, struct sockaddr *uaddr, | |||
| 1719 | rcu_read_lock(); | 1721 | rcu_read_lock(); |
| 1720 | dev = dev_get_by_index_rcu(sock_net(sk), pkt_sk(sk)->ifindex); | 1722 | dev = dev_get_by_index_rcu(sock_net(sk), pkt_sk(sk)->ifindex); |
| 1721 | if (dev) | 1723 | if (dev) |
| 1722 | strlcpy(uaddr->sa_data, dev->name, 15); | 1724 | strncpy(uaddr->sa_data, dev->name, 14); |
| 1723 | else | 1725 | else |
| 1724 | memset(uaddr->sa_data, 0, 14); | 1726 | memset(uaddr->sa_data, 0, 14); |
| 1725 | rcu_read_unlock(); | 1727 | rcu_read_unlock(); |
| @@ -1742,6 +1744,7 @@ static int packet_getname(struct socket *sock, struct sockaddr *uaddr, | |||
| 1742 | sll->sll_family = AF_PACKET; | 1744 | sll->sll_family = AF_PACKET; |
| 1743 | sll->sll_ifindex = po->ifindex; | 1745 | sll->sll_ifindex = po->ifindex; |
| 1744 | sll->sll_protocol = po->num; | 1746 | sll->sll_protocol = po->num; |
| 1747 | sll->sll_pkttype = 0; | ||
| 1745 | rcu_read_lock(); | 1748 | rcu_read_lock(); |
| 1746 | dev = dev_get_by_index_rcu(sock_net(sk), po->ifindex); | 1749 | dev = dev_get_by_index_rcu(sock_net(sk), po->ifindex); |
| 1747 | if (dev) { | 1750 | if (dev) { |
diff --git a/net/rds/message.c b/net/rds/message.c index 848cff45183b..1fd3d29023d7 100644 --- a/net/rds/message.c +++ b/net/rds/message.c | |||
| @@ -249,8 +249,10 @@ struct rds_message *rds_message_map_pages(unsigned long *page_addrs, unsigned in | |||
| 249 | rm->m_inc.i_hdr.h_len = cpu_to_be32(total_len); | 249 | rm->m_inc.i_hdr.h_len = cpu_to_be32(total_len); |
| 250 | rm->data.op_nents = ceil(total_len, PAGE_SIZE); | 250 | rm->data.op_nents = ceil(total_len, PAGE_SIZE); |
| 251 | rm->data.op_sg = rds_message_alloc_sgs(rm, num_sgs); | 251 | rm->data.op_sg = rds_message_alloc_sgs(rm, num_sgs); |
| 252 | if (!rm->data.op_sg) | 252 | if (!rm->data.op_sg) { |
| 253 | rds_message_put(rm); | ||
| 253 | return ERR_PTR(-ENOMEM); | 254 | return ERR_PTR(-ENOMEM); |
| 255 | } | ||
| 254 | 256 | ||
| 255 | for (i = 0; i < rm->data.op_nents; ++i) { | 257 | for (i = 0; i < rm->data.op_nents; ++i) { |
| 256 | sg_set_page(&rm->data.op_sg[i], | 258 | sg_set_page(&rm->data.op_sg[i], |
diff --git a/net/sched/cls_basic.c b/net/sched/cls_basic.c index efd4f95fd050..f23d9155b1ef 100644 --- a/net/sched/cls_basic.c +++ b/net/sched/cls_basic.c | |||
| @@ -268,6 +268,10 @@ static int basic_dump(struct tcf_proto *tp, unsigned long fh, | |||
| 268 | goto nla_put_failure; | 268 | goto nla_put_failure; |
| 269 | 269 | ||
| 270 | nla_nest_end(skb, nest); | 270 | nla_nest_end(skb, nest); |
| 271 | |||
| 272 | if (tcf_exts_dump_stats(skb, &f->exts, &basic_ext_map) < 0) | ||
| 273 | goto nla_put_failure; | ||
| 274 | |||
| 271 | return skb->len; | 275 | return skb->len; |
| 272 | 276 | ||
| 273 | nla_put_failure: | 277 | nla_put_failure: |
diff --git a/net/sctp/protocol.c b/net/sctp/protocol.c index 1ef29c74d85e..e58f9476f29c 100644 --- a/net/sctp/protocol.c +++ b/net/sctp/protocol.c | |||
| @@ -92,7 +92,7 @@ static struct sctp_af *sctp_af_v6_specific; | |||
| 92 | struct kmem_cache *sctp_chunk_cachep __read_mostly; | 92 | struct kmem_cache *sctp_chunk_cachep __read_mostly; |
| 93 | struct kmem_cache *sctp_bucket_cachep __read_mostly; | 93 | struct kmem_cache *sctp_bucket_cachep __read_mostly; |
| 94 | 94 | ||
| 95 | int sysctl_sctp_mem[3]; | 95 | long sysctl_sctp_mem[3]; |
| 96 | int sysctl_sctp_rmem[3]; | 96 | int sysctl_sctp_rmem[3]; |
| 97 | int sysctl_sctp_wmem[3]; | 97 | int sysctl_sctp_wmem[3]; |
| 98 | 98 | ||
diff --git a/net/sctp/socket.c b/net/sctp/socket.c index e34ca9cc1167..6bd554323a34 100644 --- a/net/sctp/socket.c +++ b/net/sctp/socket.c | |||
| @@ -111,12 +111,12 @@ static void sctp_sock_migrate(struct sock *, struct sock *, | |||
| 111 | static char *sctp_hmac_alg = SCTP_COOKIE_HMAC_ALG; | 111 | static char *sctp_hmac_alg = SCTP_COOKIE_HMAC_ALG; |
| 112 | 112 | ||
| 113 | extern struct kmem_cache *sctp_bucket_cachep; | 113 | extern struct kmem_cache *sctp_bucket_cachep; |
| 114 | extern int sysctl_sctp_mem[3]; | 114 | extern long sysctl_sctp_mem[3]; |
| 115 | extern int sysctl_sctp_rmem[3]; | 115 | extern int sysctl_sctp_rmem[3]; |
| 116 | extern int sysctl_sctp_wmem[3]; | 116 | extern int sysctl_sctp_wmem[3]; |
| 117 | 117 | ||
| 118 | static int sctp_memory_pressure; | 118 | static int sctp_memory_pressure; |
| 119 | static atomic_t sctp_memory_allocated; | 119 | static atomic_long_t sctp_memory_allocated; |
| 120 | struct percpu_counter sctp_sockets_allocated; | 120 | struct percpu_counter sctp_sockets_allocated; |
| 121 | 121 | ||
| 122 | static void sctp_enter_memory_pressure(struct sock *sk) | 122 | static void sctp_enter_memory_pressure(struct sock *sk) |
diff --git a/net/sctp/sysctl.c b/net/sctp/sysctl.c index 832590bbe0c0..50cb57f0919e 100644 --- a/net/sctp/sysctl.c +++ b/net/sctp/sysctl.c | |||
| @@ -54,7 +54,7 @@ static int sack_timer_max = 500; | |||
| 54 | static int addr_scope_max = 3; /* check sctp_scope_policy_t in include/net/sctp/constants.h for max entries */ | 54 | static int addr_scope_max = 3; /* check sctp_scope_policy_t in include/net/sctp/constants.h for max entries */ |
| 55 | static int rwnd_scale_max = 16; | 55 | static int rwnd_scale_max = 16; |
| 56 | 56 | ||
| 57 | extern int sysctl_sctp_mem[3]; | 57 | extern long sysctl_sctp_mem[3]; |
| 58 | extern int sysctl_sctp_rmem[3]; | 58 | extern int sysctl_sctp_rmem[3]; |
| 59 | extern int sysctl_sctp_wmem[3]; | 59 | extern int sysctl_sctp_wmem[3]; |
| 60 | 60 | ||
| @@ -203,7 +203,7 @@ static ctl_table sctp_table[] = { | |||
| 203 | .data = &sysctl_sctp_mem, | 203 | .data = &sysctl_sctp_mem, |
| 204 | .maxlen = sizeof(sysctl_sctp_mem), | 204 | .maxlen = sizeof(sysctl_sctp_mem), |
| 205 | .mode = 0644, | 205 | .mode = 0644, |
| 206 | .proc_handler = proc_dointvec, | 206 | .proc_handler = proc_doulongvec_minmax |
| 207 | }, | 207 | }, |
| 208 | { | 208 | { |
| 209 | .procname = "sctp_rmem", | 209 | .procname = "sctp_rmem", |
diff --git a/net/tipc/socket.c b/net/tipc/socket.c index 33217fc3d697..e9f0d5004483 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c | |||
| @@ -396,6 +396,7 @@ static int get_name(struct socket *sock, struct sockaddr *uaddr, | |||
| 396 | struct sockaddr_tipc *addr = (struct sockaddr_tipc *)uaddr; | 396 | struct sockaddr_tipc *addr = (struct sockaddr_tipc *)uaddr; |
| 397 | struct tipc_sock *tsock = tipc_sk(sock->sk); | 397 | struct tipc_sock *tsock = tipc_sk(sock->sk); |
| 398 | 398 | ||
| 399 | memset(addr, 0, sizeof(*addr)); | ||
| 399 | if (peer) { | 400 | if (peer) { |
| 400 | if ((sock->state != SS_CONNECTED) && | 401 | if ((sock->state != SS_CONNECTED) && |
| 401 | ((peer != 2) || (sock->state != SS_DISCONNECTING))) | 402 | ((peer != 2) || (sock->state != SS_DISCONNECTING))) |
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index c506241f8637..4e78e3f26798 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c | |||
| @@ -224,8 +224,8 @@ static int nl80211_prepare_netdev_dump(struct sk_buff *skb, | |||
| 224 | } | 224 | } |
| 225 | 225 | ||
| 226 | *rdev = cfg80211_get_dev_from_ifindex(sock_net(skb->sk), ifidx); | 226 | *rdev = cfg80211_get_dev_from_ifindex(sock_net(skb->sk), ifidx); |
| 227 | if (IS_ERR(dev)) { | 227 | if (IS_ERR(*rdev)) { |
| 228 | err = PTR_ERR(dev); | 228 | err = PTR_ERR(*rdev); |
| 229 | goto out_rtnl; | 229 | goto out_rtnl; |
| 230 | } | 230 | } |
| 231 | 231 | ||
diff --git a/net/x25/x25_facilities.c b/net/x25/x25_facilities.c index 3a8c4c419cd4..55187c8f6420 100644 --- a/net/x25/x25_facilities.c +++ b/net/x25/x25_facilities.c | |||
| @@ -61,6 +61,8 @@ int x25_parse_facilities(struct sk_buff *skb, struct x25_facilities *facilities, | |||
| 61 | while (len > 0) { | 61 | while (len > 0) { |
| 62 | switch (*p & X25_FAC_CLASS_MASK) { | 62 | switch (*p & X25_FAC_CLASS_MASK) { |
| 63 | case X25_FAC_CLASS_A: | 63 | case X25_FAC_CLASS_A: |
| 64 | if (len < 2) | ||
| 65 | return 0; | ||
| 64 | switch (*p) { | 66 | switch (*p) { |
| 65 | case X25_FAC_REVERSE: | 67 | case X25_FAC_REVERSE: |
| 66 | if((p[1] & 0x81) == 0x81) { | 68 | if((p[1] & 0x81) == 0x81) { |
| @@ -104,6 +106,8 @@ int x25_parse_facilities(struct sk_buff *skb, struct x25_facilities *facilities, | |||
| 104 | len -= 2; | 106 | len -= 2; |
| 105 | break; | 107 | break; |
| 106 | case X25_FAC_CLASS_B: | 108 | case X25_FAC_CLASS_B: |
| 109 | if (len < 3) | ||
| 110 | return 0; | ||
| 107 | switch (*p) { | 111 | switch (*p) { |
| 108 | case X25_FAC_PACKET_SIZE: | 112 | case X25_FAC_PACKET_SIZE: |
| 109 | facilities->pacsize_in = p[1]; | 113 | facilities->pacsize_in = p[1]; |
| @@ -125,6 +129,8 @@ int x25_parse_facilities(struct sk_buff *skb, struct x25_facilities *facilities, | |||
| 125 | len -= 3; | 129 | len -= 3; |
| 126 | break; | 130 | break; |
| 127 | case X25_FAC_CLASS_C: | 131 | case X25_FAC_CLASS_C: |
| 132 | if (len < 4) | ||
| 133 | return 0; | ||
| 128 | printk(KERN_DEBUG "X.25: unknown facility %02X, " | 134 | printk(KERN_DEBUG "X.25: unknown facility %02X, " |
| 129 | "values %02X, %02X, %02X\n", | 135 | "values %02X, %02X, %02X\n", |
| 130 | p[0], p[1], p[2], p[3]); | 136 | p[0], p[1], p[2], p[3]); |
| @@ -132,6 +138,8 @@ int x25_parse_facilities(struct sk_buff *skb, struct x25_facilities *facilities, | |||
| 132 | len -= 4; | 138 | len -= 4; |
| 133 | break; | 139 | break; |
| 134 | case X25_FAC_CLASS_D: | 140 | case X25_FAC_CLASS_D: |
| 141 | if (len < p[1] + 2) | ||
| 142 | return 0; | ||
| 135 | switch (*p) { | 143 | switch (*p) { |
| 136 | case X25_FAC_CALLING_AE: | 144 | case X25_FAC_CALLING_AE: |
| 137 | if (p[1] > X25_MAX_DTE_FACIL_LEN || p[1] <= 1) | 145 | if (p[1] > X25_MAX_DTE_FACIL_LEN || p[1] <= 1) |
| @@ -149,9 +157,7 @@ int x25_parse_facilities(struct sk_buff *skb, struct x25_facilities *facilities, | |||
| 149 | break; | 157 | break; |
| 150 | default: | 158 | default: |
| 151 | printk(KERN_DEBUG "X.25: unknown facility %02X," | 159 | printk(KERN_DEBUG "X.25: unknown facility %02X," |
| 152 | "length %d, values %02X, %02X, " | 160 | "length %d\n", p[0], p[1]); |
| 153 | "%02X, %02X\n", | ||
| 154 | p[0], p[1], p[2], p[3], p[4], p[5]); | ||
| 155 | break; | 161 | break; |
| 156 | } | 162 | } |
| 157 | len -= p[1] + 2; | 163 | len -= p[1] + 2; |
