diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-10-22 18:34:23 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-10-22 18:34:23 -0400 |
| commit | 4848490c50c5d46d4e9749fddc374c303823bcc4 (patch) | |
| tree | f8ef23f86241789521b637fd39f80ef6f5018518 | |
| parent | d995053d045d777e78ba7eba71a6a0733f3aa726 (diff) | |
| parent | 845de8afa66550331dca164ab77fa49de930b699 (diff) | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (21 commits)
niu: VLAN_ETH_HLEN should be used to make sure that the whole MAC header was copied to the head buffer in the Vlan packets case
KS8851: Fix ks8851_set_rx_mode() for IFF_MULTICAST
KS8851: Fix MAC address write order
KS8851: Add soft reset at probe time
net: fix section mismatch in fec.c
net: Fix struct inet_timewait_sock bitfield annotation
tcp: Try to catch MSG_PEEK bug
net: Fix IP_MULTICAST_IF
bluetooth: static lock key fix
bluetooth: scheduling while atomic bug fix
tcp: fix TCP_DEFER_ACCEPT retrans calculation
tcp: reduce SYN-ACK retrans for TCP_DEFER_ACCEPT
tcp: accept socket after TCP_DEFER_ACCEPT period
Revert "tcp: fix tcp_defer_accept to consider the timeout"
AF_UNIX: Fix deadlock on connecting to shutdown socket
ethoc: clear only pending irqs
ethoc: inline regs access
vmxnet3: use dev_dbg, fix build for CONFIG_BLOCK=n
virtio_net: use dev_kfree_skb_any() in free_old_xmit_skbs()
be2net: fix support for PCI hot plug
...
| -rw-r--r-- | drivers/net/benet/be_cmds.c | 33 | ||||
| -rw-r--r-- | drivers/net/benet/be_cmds.h | 5 | ||||
| -rw-r--r-- | drivers/net/benet/be_main.c | 27 | ||||
| -rw-r--r-- | drivers/net/ethoc.c | 21 | ||||
| -rw-r--r-- | drivers/net/fec.c | 2 | ||||
| -rw-r--r-- | drivers/net/ks8851.c | 42 | ||||
| -rw-r--r-- | drivers/net/ks8851.h | 1 | ||||
| -rw-r--r-- | drivers/net/niu.c | 2 | ||||
| -rw-r--r-- | drivers/net/virtio_net.c | 2 | ||||
| -rw-r--r-- | drivers/net/vmxnet3/vmxnet3_drv.c | 27 | ||||
| -rw-r--r-- | drivers/net/vmxnet3/vmxnet3_int.h | 2 | ||||
| -rw-r--r-- | include/net/inet_timewait_sock.h | 8 | ||||
| -rw-r--r-- | net/bluetooth/hci_sysfs.c | 4 | ||||
| -rw-r--r-- | net/bluetooth/l2cap.c | 9 | ||||
| -rw-r--r-- | net/ipv4/inet_connection_sock.c | 34 | ||||
| -rw-r--r-- | net/ipv4/ip_sockglue.c | 7 | ||||
| -rw-r--r-- | net/ipv4/tcp.c | 59 | ||||
| -rw-r--r-- | net/ipv4/tcp_minisocks.c | 5 | ||||
| -rw-r--r-- | net/ipv6/ipv6_sockglue.c | 6 | ||||
| -rw-r--r-- | net/unix/af_unix.c | 2 |
20 files changed, 212 insertions, 86 deletions
diff --git a/drivers/net/benet/be_cmds.c b/drivers/net/benet/be_cmds.c index 89876ade5e33..28a0eda92680 100644 --- a/drivers/net/benet/be_cmds.c +++ b/drivers/net/benet/be_cmds.c | |||
| @@ -243,15 +243,26 @@ static int be_POST_stage_get(struct be_adapter *adapter, u16 *stage) | |||
| 243 | 243 | ||
| 244 | int be_cmd_POST(struct be_adapter *adapter) | 244 | int be_cmd_POST(struct be_adapter *adapter) |
| 245 | { | 245 | { |
| 246 | u16 stage, error; | 246 | u16 stage; |
| 247 | int status, timeout = 0; | ||
| 247 | 248 | ||
| 248 | error = be_POST_stage_get(adapter, &stage); | 249 | do { |
| 249 | if (error || stage != POST_STAGE_ARMFW_RDY) { | 250 | status = be_POST_stage_get(adapter, &stage); |
| 250 | dev_err(&adapter->pdev->dev, "POST failed.\n"); | 251 | if (status) { |
| 251 | return -1; | 252 | dev_err(&adapter->pdev->dev, "POST error; stage=0x%x\n", |
| 252 | } | 253 | stage); |
| 254 | return -1; | ||
| 255 | } else if (stage != POST_STAGE_ARMFW_RDY) { | ||
| 256 | set_current_state(TASK_INTERRUPTIBLE); | ||
| 257 | schedule_timeout(2 * HZ); | ||
| 258 | timeout += 2; | ||
| 259 | } else { | ||
| 260 | return 0; | ||
| 261 | } | ||
| 262 | } while (timeout < 20); | ||
| 253 | 263 | ||
| 254 | return 0; | 264 | dev_err(&adapter->pdev->dev, "POST timeout; stage=0x%x\n", stage); |
| 265 | return -1; | ||
| 255 | } | 266 | } |
| 256 | 267 | ||
| 257 | static inline void *embedded_payload(struct be_mcc_wrb *wrb) | 268 | static inline void *embedded_payload(struct be_mcc_wrb *wrb) |
| @@ -729,8 +740,8 @@ int be_cmd_q_destroy(struct be_adapter *adapter, struct be_queue_info *q, | |||
| 729 | /* Create an rx filtering policy configuration on an i/f | 740 | /* Create an rx filtering policy configuration on an i/f |
| 730 | * Uses mbox | 741 | * Uses mbox |
| 731 | */ | 742 | */ |
| 732 | int be_cmd_if_create(struct be_adapter *adapter, u32 flags, u8 *mac, | 743 | int be_cmd_if_create(struct be_adapter *adapter, u32 cap_flags, u32 en_flags, |
| 733 | bool pmac_invalid, u32 *if_handle, u32 *pmac_id) | 744 | u8 *mac, bool pmac_invalid, u32 *if_handle, u32 *pmac_id) |
| 734 | { | 745 | { |
| 735 | struct be_mcc_wrb *wrb; | 746 | struct be_mcc_wrb *wrb; |
| 736 | struct be_cmd_req_if_create *req; | 747 | struct be_cmd_req_if_create *req; |
| @@ -746,8 +757,8 @@ int be_cmd_if_create(struct be_adapter *adapter, u32 flags, u8 *mac, | |||
| 746 | be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, | 757 | be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON, |
| 747 | OPCODE_COMMON_NTWK_INTERFACE_CREATE, sizeof(*req)); | 758 | OPCODE_COMMON_NTWK_INTERFACE_CREATE, sizeof(*req)); |
| 748 | 759 | ||
| 749 | req->capability_flags = cpu_to_le32(flags); | 760 | req->capability_flags = cpu_to_le32(cap_flags); |
| 750 | req->enable_flags = cpu_to_le32(flags); | 761 | req->enable_flags = cpu_to_le32(en_flags); |
| 751 | req->pmac_invalid = pmac_invalid; | 762 | req->pmac_invalid = pmac_invalid; |
| 752 | if (!pmac_invalid) | 763 | if (!pmac_invalid) |
| 753 | memcpy(req->mac_addr, mac, ETH_ALEN); | 764 | memcpy(req->mac_addr, mac, ETH_ALEN); |
diff --git a/drivers/net/benet/be_cmds.h b/drivers/net/benet/be_cmds.h index a86f917f85f4..49953787e41c 100644 --- a/drivers/net/benet/be_cmds.h +++ b/drivers/net/benet/be_cmds.h | |||
| @@ -720,8 +720,9 @@ extern int be_cmd_mac_addr_query(struct be_adapter *adapter, u8 *mac_addr, | |||
| 720 | extern int be_cmd_pmac_add(struct be_adapter *adapter, u8 *mac_addr, | 720 | extern int be_cmd_pmac_add(struct be_adapter *adapter, u8 *mac_addr, |
| 721 | u32 if_id, u32 *pmac_id); | 721 | u32 if_id, u32 *pmac_id); |
| 722 | extern int be_cmd_pmac_del(struct be_adapter *adapter, u32 if_id, u32 pmac_id); | 722 | extern int be_cmd_pmac_del(struct be_adapter *adapter, u32 if_id, u32 pmac_id); |
| 723 | extern int be_cmd_if_create(struct be_adapter *adapter, u32 if_flags, u8 *mac, | 723 | extern int be_cmd_if_create(struct be_adapter *adapter, u32 cap_flags, |
| 724 | bool pmac_invalid, u32 *if_handle, u32 *pmac_id); | 724 | u32 en_flags, u8 *mac, bool pmac_invalid, |
| 725 | u32 *if_handle, u32 *pmac_id); | ||
| 725 | extern int be_cmd_if_destroy(struct be_adapter *adapter, u32 if_handle); | 726 | extern int be_cmd_if_destroy(struct be_adapter *adapter, u32 if_handle); |
| 726 | extern int be_cmd_eq_create(struct be_adapter *adapter, | 727 | extern int be_cmd_eq_create(struct be_adapter *adapter, |
| 727 | struct be_queue_info *eq, int eq_delay); | 728 | struct be_queue_info *eq, int eq_delay); |
diff --git a/drivers/net/benet/be_main.c b/drivers/net/benet/be_main.c index 6d5e81f7046f..1f941f027718 100644 --- a/drivers/net/benet/be_main.c +++ b/drivers/net/benet/be_main.c | |||
| @@ -1620,19 +1620,22 @@ static int be_open(struct net_device *netdev) | |||
| 1620 | static int be_setup(struct be_adapter *adapter) | 1620 | static int be_setup(struct be_adapter *adapter) |
| 1621 | { | 1621 | { |
| 1622 | struct net_device *netdev = adapter->netdev; | 1622 | struct net_device *netdev = adapter->netdev; |
| 1623 | u32 if_flags; | 1623 | u32 cap_flags, en_flags; |
| 1624 | int status; | 1624 | int status; |
| 1625 | 1625 | ||
| 1626 | if_flags = BE_IF_FLAGS_BROADCAST | BE_IF_FLAGS_PROMISCUOUS | | 1626 | cap_flags = BE_IF_FLAGS_UNTAGGED | BE_IF_FLAGS_BROADCAST | |
| 1627 | BE_IF_FLAGS_MCAST_PROMISCUOUS | BE_IF_FLAGS_UNTAGGED | | 1627 | BE_IF_FLAGS_MCAST_PROMISCUOUS | |
| 1628 | BE_IF_FLAGS_PASS_L3L4_ERRORS; | 1628 | BE_IF_FLAGS_PROMISCUOUS | |
| 1629 | status = be_cmd_if_create(adapter, if_flags, netdev->dev_addr, | 1629 | BE_IF_FLAGS_PASS_L3L4_ERRORS; |
| 1630 | false/* pmac_invalid */, &adapter->if_handle, | 1630 | en_flags = BE_IF_FLAGS_UNTAGGED | BE_IF_FLAGS_BROADCAST | |
| 1631 | &adapter->pmac_id); | 1631 | BE_IF_FLAGS_PASS_L3L4_ERRORS; |
| 1632 | |||
| 1633 | status = be_cmd_if_create(adapter, cap_flags, en_flags, | ||
| 1634 | netdev->dev_addr, false/* pmac_invalid */, | ||
| 1635 | &adapter->if_handle, &adapter->pmac_id); | ||
| 1632 | if (status != 0) | 1636 | if (status != 0) |
| 1633 | goto do_none; | 1637 | goto do_none; |
| 1634 | 1638 | ||
| 1635 | |||
| 1636 | status = be_tx_queues_create(adapter); | 1639 | status = be_tx_queues_create(adapter); |
| 1637 | if (status != 0) | 1640 | if (status != 0) |
| 1638 | goto if_destroy; | 1641 | goto if_destroy; |
| @@ -2055,6 +2058,10 @@ static int be_hw_up(struct be_adapter *adapter) | |||
| 2055 | if (status) | 2058 | if (status) |
| 2056 | return status; | 2059 | return status; |
| 2057 | 2060 | ||
| 2061 | status = be_cmd_reset_function(adapter); | ||
| 2062 | if (status) | ||
| 2063 | return status; | ||
| 2064 | |||
| 2058 | status = be_cmd_get_fw_ver(adapter, adapter->fw_ver); | 2065 | status = be_cmd_get_fw_ver(adapter, adapter->fw_ver); |
| 2059 | if (status) | 2066 | if (status) |
| 2060 | return status; | 2067 | return status; |
| @@ -2108,10 +2115,6 @@ static int __devinit be_probe(struct pci_dev *pdev, | |||
| 2108 | if (status) | 2115 | if (status) |
| 2109 | goto free_netdev; | 2116 | goto free_netdev; |
| 2110 | 2117 | ||
| 2111 | status = be_cmd_reset_function(adapter); | ||
| 2112 | if (status) | ||
| 2113 | goto ctrl_clean; | ||
| 2114 | |||
| 2115 | status = be_stats_init(adapter); | 2118 | status = be_stats_init(adapter); |
| 2116 | if (status) | 2119 | if (status) |
| 2117 | goto ctrl_clean; | 2120 | goto ctrl_clean; |
diff --git a/drivers/net/ethoc.c b/drivers/net/ethoc.c index 9c950bb5e90c..f7d9ac8324cb 100644 --- a/drivers/net/ethoc.c +++ b/drivers/net/ethoc.c | |||
| @@ -223,24 +223,25 @@ struct ethoc_bd { | |||
| 223 | u32 addr; | 223 | u32 addr; |
| 224 | }; | 224 | }; |
| 225 | 225 | ||
| 226 | static u32 ethoc_read(struct ethoc *dev, loff_t offset) | 226 | static inline u32 ethoc_read(struct ethoc *dev, loff_t offset) |
| 227 | { | 227 | { |
| 228 | return ioread32(dev->iobase + offset); | 228 | return ioread32(dev->iobase + offset); |
| 229 | } | 229 | } |
| 230 | 230 | ||
| 231 | static void ethoc_write(struct ethoc *dev, loff_t offset, u32 data) | 231 | static inline void ethoc_write(struct ethoc *dev, loff_t offset, u32 data) |
| 232 | { | 232 | { |
| 233 | iowrite32(data, dev->iobase + offset); | 233 | iowrite32(data, dev->iobase + offset); |
| 234 | } | 234 | } |
| 235 | 235 | ||
| 236 | static void ethoc_read_bd(struct ethoc *dev, int index, struct ethoc_bd *bd) | 236 | static inline void ethoc_read_bd(struct ethoc *dev, int index, |
| 237 | struct ethoc_bd *bd) | ||
| 237 | { | 238 | { |
| 238 | loff_t offset = ETHOC_BD_BASE + (index * sizeof(struct ethoc_bd)); | 239 | loff_t offset = ETHOC_BD_BASE + (index * sizeof(struct ethoc_bd)); |
| 239 | bd->stat = ethoc_read(dev, offset + 0); | 240 | bd->stat = ethoc_read(dev, offset + 0); |
| 240 | bd->addr = ethoc_read(dev, offset + 4); | 241 | bd->addr = ethoc_read(dev, offset + 4); |
| 241 | } | 242 | } |
| 242 | 243 | ||
| 243 | static void ethoc_write_bd(struct ethoc *dev, int index, | 244 | static inline void ethoc_write_bd(struct ethoc *dev, int index, |
| 244 | const struct ethoc_bd *bd) | 245 | const struct ethoc_bd *bd) |
| 245 | { | 246 | { |
| 246 | loff_t offset = ETHOC_BD_BASE + (index * sizeof(struct ethoc_bd)); | 247 | loff_t offset = ETHOC_BD_BASE + (index * sizeof(struct ethoc_bd)); |
| @@ -248,33 +249,33 @@ static void ethoc_write_bd(struct ethoc *dev, int index, | |||
| 248 | ethoc_write(dev, offset + 4, bd->addr); | 249 | ethoc_write(dev, offset + 4, bd->addr); |
| 249 | } | 250 | } |
| 250 | 251 | ||
| 251 | static void ethoc_enable_irq(struct ethoc *dev, u32 mask) | 252 | static inline void ethoc_enable_irq(struct ethoc *dev, u32 mask) |
| 252 | { | 253 | { |
| 253 | u32 imask = ethoc_read(dev, INT_MASK); | 254 | u32 imask = ethoc_read(dev, INT_MASK); |
| 254 | imask |= mask; | 255 | imask |= mask; |
| 255 | ethoc_write(dev, INT_MASK, imask); | 256 | ethoc_write(dev, INT_MASK, imask); |
| 256 | } | 257 | } |
| 257 | 258 | ||
| 258 | static void ethoc_disable_irq(struct ethoc *dev, u32 mask) | 259 | static inline void ethoc_disable_irq(struct ethoc *dev, u32 mask) |
| 259 | { | 260 | { |
| 260 | u32 imask = ethoc_read(dev, INT_MASK); | 261 | u32 imask = ethoc_read(dev, INT_MASK); |
| 261 | imask &= ~mask; | 262 | imask &= ~mask; |
| 262 | ethoc_write(dev, INT_MASK, imask); | 263 | ethoc_write(dev, INT_MASK, imask); |
| 263 | } | 264 | } |
| 264 | 265 | ||
| 265 | static void ethoc_ack_irq(struct ethoc *dev, u32 mask) | 266 | static inline void ethoc_ack_irq(struct ethoc *dev, u32 mask) |
| 266 | { | 267 | { |
| 267 | ethoc_write(dev, INT_SOURCE, mask); | 268 | ethoc_write(dev, INT_SOURCE, mask); |
| 268 | } | 269 | } |
| 269 | 270 | ||
| 270 | static void ethoc_enable_rx_and_tx(struct ethoc *dev) | 271 | static inline void ethoc_enable_rx_and_tx(struct ethoc *dev) |
| 271 | { | 272 | { |
| 272 | u32 mode = ethoc_read(dev, MODER); | 273 | u32 mode = ethoc_read(dev, MODER); |
| 273 | mode |= MODER_RXEN | MODER_TXEN; | 274 | mode |= MODER_RXEN | MODER_TXEN; |
| 274 | ethoc_write(dev, MODER, mode); | 275 | ethoc_write(dev, MODER, mode); |
| 275 | } | 276 | } |
| 276 | 277 | ||
| 277 | static void ethoc_disable_rx_and_tx(struct ethoc *dev) | 278 | static inline void ethoc_disable_rx_and_tx(struct ethoc *dev) |
| 278 | { | 279 | { |
| 279 | u32 mode = ethoc_read(dev, MODER); | 280 | u32 mode = ethoc_read(dev, MODER); |
| 280 | mode &= ~(MODER_RXEN | MODER_TXEN); | 281 | mode &= ~(MODER_RXEN | MODER_TXEN); |
| @@ -508,7 +509,7 @@ static irqreturn_t ethoc_interrupt(int irq, void *dev_id) | |||
| 508 | return IRQ_NONE; | 509 | return IRQ_NONE; |
| 509 | } | 510 | } |
| 510 | 511 | ||
| 511 | ethoc_ack_irq(priv, INT_MASK_ALL); | 512 | ethoc_ack_irq(priv, pending); |
| 512 | 513 | ||
| 513 | if (pending & INT_MASK_BUSY) { | 514 | if (pending & INT_MASK_BUSY) { |
| 514 | dev_err(&dev->dev, "packet dropped\n"); | 515 | dev_err(&dev->dev, "packet dropped\n"); |
diff --git a/drivers/net/fec.c b/drivers/net/fec.c index 29234380e6c6..16a1d58419d9 100644 --- a/drivers/net/fec.c +++ b/drivers/net/fec.c | |||
| @@ -1654,7 +1654,7 @@ static const struct net_device_ops fec_netdev_ops = { | |||
| 1654 | * | 1654 | * |
| 1655 | * index is only used in legacy code | 1655 | * index is only used in legacy code |
| 1656 | */ | 1656 | */ |
| 1657 | int __init fec_enet_init(struct net_device *dev, int index) | 1657 | static int fec_enet_init(struct net_device *dev, int index) |
| 1658 | { | 1658 | { |
| 1659 | struct fec_enet_private *fep = netdev_priv(dev); | 1659 | struct fec_enet_private *fep = netdev_priv(dev); |
| 1660 | struct bufdesc *cbd_base; | 1660 | struct bufdesc *cbd_base; |
diff --git a/drivers/net/ks8851.c b/drivers/net/ks8851.c index 237835864357..a23f739d222f 100644 --- a/drivers/net/ks8851.c +++ b/drivers/net/ks8851.c | |||
| @@ -171,6 +171,36 @@ static void ks8851_wrreg16(struct ks8851_net *ks, unsigned reg, unsigned val) | |||
| 171 | } | 171 | } |
| 172 | 172 | ||
| 173 | /** | 173 | /** |
| 174 | * ks8851_wrreg8 - write 8bit register value to chip | ||
| 175 | * @ks: The chip state | ||
| 176 | * @reg: The register address | ||
| 177 | * @val: The value to write | ||
| 178 | * | ||
| 179 | * Issue a write to put the value @val into the register specified in @reg. | ||
| 180 | */ | ||
| 181 | static void ks8851_wrreg8(struct ks8851_net *ks, unsigned reg, unsigned val) | ||
| 182 | { | ||
| 183 | struct spi_transfer *xfer = &ks->spi_xfer1; | ||
| 184 | struct spi_message *msg = &ks->spi_msg1; | ||
| 185 | __le16 txb[2]; | ||
| 186 | int ret; | ||
| 187 | int bit; | ||
| 188 | |||
| 189 | bit = 1 << (reg & 3); | ||
| 190 | |||
| 191 | txb[0] = cpu_to_le16(MK_OP(bit, reg) | KS_SPIOP_WR); | ||
| 192 | txb[1] = val; | ||
| 193 | |||
| 194 | xfer->tx_buf = txb; | ||
| 195 | xfer->rx_buf = NULL; | ||
| 196 | xfer->len = 3; | ||
| 197 | |||
| 198 | ret = spi_sync(ks->spidev, msg); | ||
| 199 | if (ret < 0) | ||
| 200 | ks_err(ks, "spi_sync() failed\n"); | ||
| 201 | } | ||
| 202 | |||
| 203 | /** | ||
| 174 | * ks8851_rx_1msg - select whether to use one or two messages for spi read | 204 | * ks8851_rx_1msg - select whether to use one or two messages for spi read |
| 175 | * @ks: The device structure | 205 | * @ks: The device structure |
| 176 | * | 206 | * |
| @@ -322,13 +352,12 @@ static void ks8851_soft_reset(struct ks8851_net *ks, unsigned op) | |||
| 322 | static int ks8851_write_mac_addr(struct net_device *dev) | 352 | static int ks8851_write_mac_addr(struct net_device *dev) |
| 323 | { | 353 | { |
| 324 | struct ks8851_net *ks = netdev_priv(dev); | 354 | struct ks8851_net *ks = netdev_priv(dev); |
| 325 | u16 *mcp = (u16 *)dev->dev_addr; | 355 | int i; |
| 326 | 356 | ||
| 327 | mutex_lock(&ks->lock); | 357 | mutex_lock(&ks->lock); |
| 328 | 358 | ||
| 329 | ks8851_wrreg16(ks, KS_MARL, mcp[0]); | 359 | for (i = 0; i < ETH_ALEN; i++) |
| 330 | ks8851_wrreg16(ks, KS_MARM, mcp[1]); | 360 | ks8851_wrreg8(ks, KS_MAR(i), dev->dev_addr[i]); |
| 331 | ks8851_wrreg16(ks, KS_MARH, mcp[2]); | ||
| 332 | 361 | ||
| 333 | mutex_unlock(&ks->lock); | 362 | mutex_unlock(&ks->lock); |
| 334 | 363 | ||
| @@ -951,7 +980,7 @@ static void ks8851_set_rx_mode(struct net_device *dev) | |||
| 951 | mcptr = mcptr->next; | 980 | mcptr = mcptr->next; |
| 952 | } | 981 | } |
| 953 | 982 | ||
| 954 | rxctrl.rxcr1 = RXCR1_RXME | RXCR1_RXAE | RXCR1_RXPAFMA; | 983 | rxctrl.rxcr1 = RXCR1_RXME | RXCR1_RXPAFMA; |
| 955 | } else { | 984 | } else { |
| 956 | /* just accept broadcast / unicast */ | 985 | /* just accept broadcast / unicast */ |
| 957 | rxctrl.rxcr1 = RXCR1_RXPAFMA; | 986 | rxctrl.rxcr1 = RXCR1_RXPAFMA; |
| @@ -1239,6 +1268,9 @@ static int __devinit ks8851_probe(struct spi_device *spi) | |||
| 1239 | ndev->netdev_ops = &ks8851_netdev_ops; | 1268 | ndev->netdev_ops = &ks8851_netdev_ops; |
| 1240 | ndev->irq = spi->irq; | 1269 | ndev->irq = spi->irq; |
| 1241 | 1270 | ||
| 1271 | /* issue a global soft reset to reset the device. */ | ||
| 1272 | ks8851_soft_reset(ks, GRR_GSR); | ||
| 1273 | |||
| 1242 | /* simple check for a valid chip being connected to the bus */ | 1274 | /* simple check for a valid chip being connected to the bus */ |
| 1243 | 1275 | ||
| 1244 | if ((ks8851_rdreg16(ks, KS_CIDER) & ~CIDER_REV_MASK) != CIDER_ID) { | 1276 | if ((ks8851_rdreg16(ks, KS_CIDER) & ~CIDER_REV_MASK) != CIDER_ID) { |
diff --git a/drivers/net/ks8851.h b/drivers/net/ks8851.h index 85abe147afbf..f52c312cc356 100644 --- a/drivers/net/ks8851.h +++ b/drivers/net/ks8851.h | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | #define CCR_32PIN (1 << 0) | 16 | #define CCR_32PIN (1 << 0) |
| 17 | 17 | ||
| 18 | /* MAC address registers */ | 18 | /* MAC address registers */ |
| 19 | #define KS_MAR(_m) 0x15 - (_m) | ||
| 19 | #define KS_MARL 0x10 | 20 | #define KS_MARL 0x10 |
| 20 | #define KS_MARM 0x12 | 21 | #define KS_MARM 0x12 |
| 21 | #define KS_MARH 0x14 | 22 | #define KS_MARH 0x14 |
diff --git a/drivers/net/niu.c b/drivers/net/niu.c index f9364d0678f2..d6c7ac68f6ea 100644 --- a/drivers/net/niu.c +++ b/drivers/net/niu.c | |||
| @@ -3545,7 +3545,7 @@ static int niu_process_rx_pkt(struct napi_struct *napi, struct niu *np, | |||
| 3545 | rp->rcr_index = index; | 3545 | rp->rcr_index = index; |
| 3546 | 3546 | ||
| 3547 | skb_reserve(skb, NET_IP_ALIGN); | 3547 | skb_reserve(skb, NET_IP_ALIGN); |
| 3548 | __pskb_pull_tail(skb, min(len, NIU_RXPULL_MAX)); | 3548 | __pskb_pull_tail(skb, min(len, VLAN_ETH_HLEN)); |
| 3549 | 3549 | ||
| 3550 | rp->rx_packets++; | 3550 | rp->rx_packets++; |
| 3551 | rp->rx_bytes += skb->len; | 3551 | rp->rx_bytes += skb->len; |
diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c index 8d009760277c..54bf0912b737 100644 --- a/drivers/net/virtio_net.c +++ b/drivers/net/virtio_net.c | |||
| @@ -454,7 +454,7 @@ static unsigned int free_old_xmit_skbs(struct virtnet_info *vi) | |||
| 454 | vi->dev->stats.tx_bytes += skb->len; | 454 | vi->dev->stats.tx_bytes += skb->len; |
| 455 | vi->dev->stats.tx_packets++; | 455 | vi->dev->stats.tx_packets++; |
| 456 | tot_sgs += skb_vnet_hdr(skb)->num_sg; | 456 | tot_sgs += skb_vnet_hdr(skb)->num_sg; |
| 457 | kfree_skb(skb); | 457 | dev_kfree_skb_any(skb); |
| 458 | } | 458 | } |
| 459 | return tot_sgs; | 459 | return tot_sgs; |
| 460 | } | 460 | } |
diff --git a/drivers/net/vmxnet3/vmxnet3_drv.c b/drivers/net/vmxnet3/vmxnet3_drv.c index 6a16f76f277e..004353a46af0 100644 --- a/drivers/net/vmxnet3/vmxnet3_drv.c +++ b/drivers/net/vmxnet3/vmxnet3_drv.c | |||
| @@ -481,7 +481,8 @@ vmxnet3_rq_alloc_rx_buf(struct vmxnet3_rx_queue *rq, u32 ring_idx, | |||
| 481 | } | 481 | } |
| 482 | rq->uncommitted[ring_idx] += num_allocated; | 482 | rq->uncommitted[ring_idx] += num_allocated; |
| 483 | 483 | ||
| 484 | dprintk(KERN_ERR "alloc_rx_buf: %d allocated, next2fill %u, next2comp " | 484 | dev_dbg(&adapter->netdev->dev, |
| 485 | "alloc_rx_buf: %d allocated, next2fill %u, next2comp " | ||
| 485 | "%u, uncommited %u\n", num_allocated, ring->next2fill, | 486 | "%u, uncommited %u\n", num_allocated, ring->next2fill, |
| 486 | ring->next2comp, rq->uncommitted[ring_idx]); | 487 | ring->next2comp, rq->uncommitted[ring_idx]); |
| 487 | 488 | ||
| @@ -539,7 +540,8 @@ vmxnet3_map_pkt(struct sk_buff *skb, struct vmxnet3_tx_ctx *ctx, | |||
| 539 | tbi = tq->buf_info + tq->tx_ring.next2fill; | 540 | tbi = tq->buf_info + tq->tx_ring.next2fill; |
| 540 | tbi->map_type = VMXNET3_MAP_NONE; | 541 | tbi->map_type = VMXNET3_MAP_NONE; |
| 541 | 542 | ||
| 542 | dprintk(KERN_ERR "txd[%u]: 0x%Lx 0x%x 0x%x\n", | 543 | dev_dbg(&adapter->netdev->dev, |
| 544 | "txd[%u]: 0x%Lx 0x%x 0x%x\n", | ||
| 543 | tq->tx_ring.next2fill, ctx->sop_txd->txd.addr, | 545 | tq->tx_ring.next2fill, ctx->sop_txd->txd.addr, |
| 544 | ctx->sop_txd->dword[2], ctx->sop_txd->dword[3]); | 546 | ctx->sop_txd->dword[2], ctx->sop_txd->dword[3]); |
| 545 | vmxnet3_cmd_ring_adv_next2fill(&tq->tx_ring); | 547 | vmxnet3_cmd_ring_adv_next2fill(&tq->tx_ring); |
| @@ -572,7 +574,8 @@ vmxnet3_map_pkt(struct sk_buff *skb, struct vmxnet3_tx_ctx *ctx, | |||
| 572 | gdesc->dword[2] = dw2 | buf_size; | 574 | gdesc->dword[2] = dw2 | buf_size; |
| 573 | gdesc->dword[3] = 0; | 575 | gdesc->dword[3] = 0; |
| 574 | 576 | ||
| 575 | dprintk(KERN_ERR "txd[%u]: 0x%Lx 0x%x 0x%x\n", | 577 | dev_dbg(&adapter->netdev->dev, |
| 578 | "txd[%u]: 0x%Lx 0x%x 0x%x\n", | ||
| 576 | tq->tx_ring.next2fill, gdesc->txd.addr, | 579 | tq->tx_ring.next2fill, gdesc->txd.addr, |
| 577 | gdesc->dword[2], gdesc->dword[3]); | 580 | gdesc->dword[2], gdesc->dword[3]); |
| 578 | vmxnet3_cmd_ring_adv_next2fill(&tq->tx_ring); | 581 | vmxnet3_cmd_ring_adv_next2fill(&tq->tx_ring); |
| @@ -600,7 +603,8 @@ vmxnet3_map_pkt(struct sk_buff *skb, struct vmxnet3_tx_ctx *ctx, | |||
| 600 | gdesc->dword[2] = dw2 | frag->size; | 603 | gdesc->dword[2] = dw2 | frag->size; |
| 601 | gdesc->dword[3] = 0; | 604 | gdesc->dword[3] = 0; |
| 602 | 605 | ||
| 603 | dprintk(KERN_ERR "txd[%u]: 0x%llu %u %u\n", | 606 | dev_dbg(&adapter->netdev->dev, |
| 607 | "txd[%u]: 0x%llu %u %u\n", | ||
| 604 | tq->tx_ring.next2fill, gdesc->txd.addr, | 608 | tq->tx_ring.next2fill, gdesc->txd.addr, |
| 605 | gdesc->dword[2], gdesc->dword[3]); | 609 | gdesc->dword[2], gdesc->dword[3]); |
| 606 | vmxnet3_cmd_ring_adv_next2fill(&tq->tx_ring); | 610 | vmxnet3_cmd_ring_adv_next2fill(&tq->tx_ring); |
| @@ -697,7 +701,8 @@ vmxnet3_parse_and_copy_hdr(struct sk_buff *skb, struct vmxnet3_tx_queue *tq, | |||
| 697 | tdd = tq->data_ring.base + tq->tx_ring.next2fill; | 701 | tdd = tq->data_ring.base + tq->tx_ring.next2fill; |
| 698 | 702 | ||
| 699 | memcpy(tdd->data, skb->data, ctx->copy_size); | 703 | memcpy(tdd->data, skb->data, ctx->copy_size); |
| 700 | dprintk(KERN_ERR "copy %u bytes to dataRing[%u]\n", | 704 | dev_dbg(&adapter->netdev->dev, |
| 705 | "copy %u bytes to dataRing[%u]\n", | ||
| 701 | ctx->copy_size, tq->tx_ring.next2fill); | 706 | ctx->copy_size, tq->tx_ring.next2fill); |
| 702 | return 1; | 707 | return 1; |
| 703 | 708 | ||
| @@ -808,7 +813,8 @@ vmxnet3_tq_xmit(struct sk_buff *skb, struct vmxnet3_tx_queue *tq, | |||
| 808 | 813 | ||
| 809 | if (count > vmxnet3_cmd_ring_desc_avail(&tq->tx_ring)) { | 814 | if (count > vmxnet3_cmd_ring_desc_avail(&tq->tx_ring)) { |
| 810 | tq->stats.tx_ring_full++; | 815 | tq->stats.tx_ring_full++; |
| 811 | dprintk(KERN_ERR "tx queue stopped on %s, next2comp %u" | 816 | dev_dbg(&adapter->netdev->dev, |
| 817 | "tx queue stopped on %s, next2comp %u" | ||
| 812 | " next2fill %u\n", adapter->netdev->name, | 818 | " next2fill %u\n", adapter->netdev->name, |
| 813 | tq->tx_ring.next2comp, tq->tx_ring.next2fill); | 819 | tq->tx_ring.next2comp, tq->tx_ring.next2fill); |
| 814 | 820 | ||
| @@ -853,7 +859,8 @@ vmxnet3_tq_xmit(struct sk_buff *skb, struct vmxnet3_tx_queue *tq, | |||
| 853 | 859 | ||
| 854 | /* finally flips the GEN bit of the SOP desc */ | 860 | /* finally flips the GEN bit of the SOP desc */ |
| 855 | gdesc->dword[2] ^= VMXNET3_TXD_GEN; | 861 | gdesc->dword[2] ^= VMXNET3_TXD_GEN; |
| 856 | dprintk(KERN_ERR "txd[%u]: SOP 0x%Lx 0x%x 0x%x\n", | 862 | dev_dbg(&adapter->netdev->dev, |
| 863 | "txd[%u]: SOP 0x%Lx 0x%x 0x%x\n", | ||
| 857 | (u32)((union Vmxnet3_GenericDesc *)ctx.sop_txd - | 864 | (u32)((union Vmxnet3_GenericDesc *)ctx.sop_txd - |
| 858 | tq->tx_ring.base), gdesc->txd.addr, gdesc->dword[2], | 865 | tq->tx_ring.base), gdesc->txd.addr, gdesc->dword[2], |
| 859 | gdesc->dword[3]); | 866 | gdesc->dword[3]); |
| @@ -990,7 +997,8 @@ vmxnet3_rq_rx_complete(struct vmxnet3_rx_queue *rq, | |||
| 990 | if (unlikely(rcd->len == 0)) { | 997 | if (unlikely(rcd->len == 0)) { |
| 991 | /* Pretend the rx buffer is skipped. */ | 998 | /* Pretend the rx buffer is skipped. */ |
| 992 | BUG_ON(!(rcd->sop && rcd->eop)); | 999 | BUG_ON(!(rcd->sop && rcd->eop)); |
| 993 | dprintk(KERN_ERR "rxRing[%u][%u] 0 length\n", | 1000 | dev_dbg(&adapter->netdev->dev, |
| 1001 | "rxRing[%u][%u] 0 length\n", | ||
| 994 | ring_idx, idx); | 1002 | ring_idx, idx); |
| 995 | goto rcd_done; | 1003 | goto rcd_done; |
| 996 | } | 1004 | } |
| @@ -1683,7 +1691,8 @@ vmxnet3_activate_dev(struct vmxnet3_adapter *adapter) | |||
| 1683 | int err; | 1691 | int err; |
| 1684 | u32 ret; | 1692 | u32 ret; |
| 1685 | 1693 | ||
| 1686 | dprintk(KERN_ERR "%s: skb_buf_size %d, rx_buf_per_pkt %d, ring sizes" | 1694 | dev_dbg(&adapter->netdev->dev, |
| 1695 | "%s: skb_buf_size %d, rx_buf_per_pkt %d, ring sizes" | ||
| 1687 | " %u %u %u\n", adapter->netdev->name, adapter->skb_buf_size, | 1696 | " %u %u %u\n", adapter->netdev->name, adapter->skb_buf_size, |
| 1688 | adapter->rx_buf_per_pkt, adapter->tx_queue.tx_ring.size, | 1697 | adapter->rx_buf_per_pkt, adapter->tx_queue.tx_ring.size, |
| 1689 | adapter->rx_queue.rx_ring[0].size, | 1698 | adapter->rx_queue.rx_ring[0].size, |
diff --git a/drivers/net/vmxnet3/vmxnet3_int.h b/drivers/net/vmxnet3/vmxnet3_int.h index 6bb91576e999..3c0d70d58111 100644 --- a/drivers/net/vmxnet3/vmxnet3_int.h +++ b/drivers/net/vmxnet3/vmxnet3_int.h | |||
| @@ -30,6 +30,7 @@ | |||
| 30 | #include <linux/types.h> | 30 | #include <linux/types.h> |
| 31 | #include <linux/ethtool.h> | 31 | #include <linux/ethtool.h> |
| 32 | #include <linux/delay.h> | 32 | #include <linux/delay.h> |
| 33 | #include <linux/device.h> | ||
| 33 | #include <linux/netdevice.h> | 34 | #include <linux/netdevice.h> |
| 34 | #include <linux/pci.h> | 35 | #include <linux/pci.h> |
| 35 | #include <linux/ethtool.h> | 36 | #include <linux/ethtool.h> |
| @@ -59,7 +60,6 @@ | |||
| 59 | #include <linux/if_vlan.h> | 60 | #include <linux/if_vlan.h> |
| 60 | #include <linux/if_arp.h> | 61 | #include <linux/if_arp.h> |
| 61 | #include <linux/inetdevice.h> | 62 | #include <linux/inetdevice.h> |
| 62 | #include <linux/dst.h> | ||
| 63 | 63 | ||
| 64 | #include "vmxnet3_defs.h" | 64 | #include "vmxnet3_defs.h" |
| 65 | 65 | ||
diff --git a/include/net/inet_timewait_sock.h b/include/net/inet_timewait_sock.h index b63b80fac567..f93ad90a601b 100644 --- a/include/net/inet_timewait_sock.h +++ b/include/net/inet_timewait_sock.h | |||
| @@ -130,11 +130,11 @@ struct inet_timewait_sock { | |||
| 130 | __u16 tw_num; | 130 | __u16 tw_num; |
| 131 | kmemcheck_bitfield_begin(flags); | 131 | kmemcheck_bitfield_begin(flags); |
| 132 | /* And these are ours. */ | 132 | /* And these are ours. */ |
| 133 | __u8 tw_ipv6only:1, | 133 | unsigned int tw_ipv6only : 1, |
| 134 | tw_transparent:1; | 134 | tw_transparent : 1, |
| 135 | /* 14 bits hole, try to pack */ | 135 | tw_pad : 14, /* 14 bits hole */ |
| 136 | tw_ipv6_offset : 16; | ||
| 136 | kmemcheck_bitfield_end(flags); | 137 | kmemcheck_bitfield_end(flags); |
| 137 | __u16 tw_ipv6_offset; | ||
| 138 | unsigned long tw_ttd; | 138 | unsigned long tw_ttd; |
| 139 | struct inet_bind_bucket *tw_tb; | 139 | struct inet_bind_bucket *tw_tb; |
| 140 | struct hlist_node tw_death_node; | 140 | struct hlist_node tw_death_node; |
diff --git a/net/bluetooth/hci_sysfs.c b/net/bluetooth/hci_sysfs.c index 7f939ce29801..2bc6f6a8de68 100644 --- a/net/bluetooth/hci_sysfs.c +++ b/net/bluetooth/hci_sysfs.c | |||
| @@ -92,6 +92,8 @@ static void add_conn(struct work_struct *work) | |||
| 92 | 92 | ||
| 93 | dev_set_name(&conn->dev, "%s:%d", hdev->name, conn->handle); | 93 | dev_set_name(&conn->dev, "%s:%d", hdev->name, conn->handle); |
| 94 | 94 | ||
| 95 | dev_set_drvdata(&conn->dev, conn); | ||
| 96 | |||
| 95 | if (device_add(&conn->dev) < 0) { | 97 | if (device_add(&conn->dev) < 0) { |
| 96 | BT_ERR("Failed to register connection device"); | 98 | BT_ERR("Failed to register connection device"); |
| 97 | return; | 99 | return; |
| @@ -144,8 +146,6 @@ void hci_conn_init_sysfs(struct hci_conn *conn) | |||
| 144 | conn->dev.class = bt_class; | 146 | conn->dev.class = bt_class; |
| 145 | conn->dev.parent = &hdev->dev; | 147 | conn->dev.parent = &hdev->dev; |
| 146 | 148 | ||
| 147 | dev_set_drvdata(&conn->dev, conn); | ||
| 148 | |||
| 149 | device_initialize(&conn->dev); | 149 | device_initialize(&conn->dev); |
| 150 | 150 | ||
| 151 | INIT_WORK(&conn->work_add, add_conn); | 151 | INIT_WORK(&conn->work_add, add_conn); |
diff --git a/net/bluetooth/l2cap.c b/net/bluetooth/l2cap.c index 555d9da1869b..77e9fb130adb 100644 --- a/net/bluetooth/l2cap.c +++ b/net/bluetooth/l2cap.c | |||
| @@ -555,12 +555,12 @@ static struct l2cap_conn *l2cap_conn_add(struct hci_conn *hcon, u8 status) | |||
| 555 | 555 | ||
| 556 | conn->feat_mask = 0; | 556 | conn->feat_mask = 0; |
| 557 | 557 | ||
| 558 | setup_timer(&conn->info_timer, l2cap_info_timeout, | ||
| 559 | (unsigned long) conn); | ||
| 560 | |||
| 561 | spin_lock_init(&conn->lock); | 558 | spin_lock_init(&conn->lock); |
| 562 | rwlock_init(&conn->chan_list.lock); | 559 | rwlock_init(&conn->chan_list.lock); |
| 563 | 560 | ||
| 561 | setup_timer(&conn->info_timer, l2cap_info_timeout, | ||
| 562 | (unsigned long) conn); | ||
| 563 | |||
| 564 | conn->disc_reason = 0x13; | 564 | conn->disc_reason = 0x13; |
| 565 | 565 | ||
| 566 | return conn; | 566 | return conn; |
| @@ -783,6 +783,9 @@ static void l2cap_sock_init(struct sock *sk, struct sock *parent) | |||
| 783 | /* Default config options */ | 783 | /* Default config options */ |
| 784 | pi->conf_len = 0; | 784 | pi->conf_len = 0; |
| 785 | pi->flush_to = L2CAP_DEFAULT_FLUSH_TO; | 785 | pi->flush_to = L2CAP_DEFAULT_FLUSH_TO; |
| 786 | skb_queue_head_init(TX_QUEUE(sk)); | ||
| 787 | skb_queue_head_init(SREJ_QUEUE(sk)); | ||
| 788 | INIT_LIST_HEAD(SREJ_LIST(sk)); | ||
| 786 | } | 789 | } |
| 787 | 790 | ||
| 788 | static struct proto l2cap_proto = { | 791 | static struct proto l2cap_proto = { |
diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c index 4351ca2cf0b8..537731b3bcb3 100644 --- a/net/ipv4/inet_connection_sock.c +++ b/net/ipv4/inet_connection_sock.c | |||
| @@ -446,6 +446,28 @@ extern int sysctl_tcp_synack_retries; | |||
| 446 | 446 | ||
| 447 | EXPORT_SYMBOL_GPL(inet_csk_reqsk_queue_hash_add); | 447 | EXPORT_SYMBOL_GPL(inet_csk_reqsk_queue_hash_add); |
| 448 | 448 | ||
| 449 | /* Decide when to expire the request and when to resend SYN-ACK */ | ||
| 450 | static inline void syn_ack_recalc(struct request_sock *req, const int thresh, | ||
| 451 | const int max_retries, | ||
| 452 | const u8 rskq_defer_accept, | ||
| 453 | int *expire, int *resend) | ||
| 454 | { | ||
| 455 | if (!rskq_defer_accept) { | ||
| 456 | *expire = req->retrans >= thresh; | ||
| 457 | *resend = 1; | ||
| 458 | return; | ||
| 459 | } | ||
| 460 | *expire = req->retrans >= thresh && | ||
| 461 | (!inet_rsk(req)->acked || req->retrans >= max_retries); | ||
| 462 | /* | ||
| 463 | * Do not resend while waiting for data after ACK, | ||
| 464 | * start to resend on end of deferring period to give | ||
| 465 | * last chance for data or ACK to create established socket. | ||
| 466 | */ | ||
| 467 | *resend = !inet_rsk(req)->acked || | ||
| 468 | req->retrans >= rskq_defer_accept - 1; | ||
| 469 | } | ||
| 470 | |||
| 449 | void inet_csk_reqsk_queue_prune(struct sock *parent, | 471 | void inet_csk_reqsk_queue_prune(struct sock *parent, |
| 450 | const unsigned long interval, | 472 | const unsigned long interval, |
| 451 | const unsigned long timeout, | 473 | const unsigned long timeout, |
| @@ -501,9 +523,15 @@ void inet_csk_reqsk_queue_prune(struct sock *parent, | |||
| 501 | reqp=&lopt->syn_table[i]; | 523 | reqp=&lopt->syn_table[i]; |
| 502 | while ((req = *reqp) != NULL) { | 524 | while ((req = *reqp) != NULL) { |
| 503 | if (time_after_eq(now, req->expires)) { | 525 | if (time_after_eq(now, req->expires)) { |
| 504 | if ((req->retrans < thresh || | 526 | int expire = 0, resend = 0; |
| 505 | (inet_rsk(req)->acked && req->retrans < max_retries)) | 527 | |
| 506 | && !req->rsk_ops->rtx_syn_ack(parent, req)) { | 528 | syn_ack_recalc(req, thresh, max_retries, |
| 529 | queue->rskq_defer_accept, | ||
| 530 | &expire, &resend); | ||
| 531 | if (!expire && | ||
| 532 | (!resend || | ||
| 533 | !req->rsk_ops->rtx_syn_ack(parent, req) || | ||
| 534 | inet_rsk(req)->acked)) { | ||
| 507 | unsigned long timeo; | 535 | unsigned long timeo; |
| 508 | 536 | ||
| 509 | if (req->retrans++ == 0) | 537 | if (req->retrans++ == 0) |
diff --git a/net/ipv4/ip_sockglue.c b/net/ipv4/ip_sockglue.c index 0c0b6e363a20..e982b5c1ee17 100644 --- a/net/ipv4/ip_sockglue.c +++ b/net/ipv4/ip_sockglue.c | |||
| @@ -634,17 +634,16 @@ static int do_ip_setsockopt(struct sock *sk, int level, | |||
| 634 | break; | 634 | break; |
| 635 | } | 635 | } |
| 636 | dev = ip_dev_find(sock_net(sk), mreq.imr_address.s_addr); | 636 | dev = ip_dev_find(sock_net(sk), mreq.imr_address.s_addr); |
| 637 | if (dev) { | 637 | if (dev) |
| 638 | mreq.imr_ifindex = dev->ifindex; | 638 | mreq.imr_ifindex = dev->ifindex; |
| 639 | dev_put(dev); | ||
| 640 | } | ||
| 641 | } else | 639 | } else |
| 642 | dev = __dev_get_by_index(sock_net(sk), mreq.imr_ifindex); | 640 | dev = dev_get_by_index(sock_net(sk), mreq.imr_ifindex); |
| 643 | 641 | ||
| 644 | 642 | ||
| 645 | err = -EADDRNOTAVAIL; | 643 | err = -EADDRNOTAVAIL; |
| 646 | if (!dev) | 644 | if (!dev) |
| 647 | break; | 645 | break; |
| 646 | dev_put(dev); | ||
| 648 | 647 | ||
| 649 | err = -EINVAL; | 648 | err = -EINVAL; |
| 650 | if (sk->sk_bound_dev_if && | 649 | if (sk->sk_bound_dev_if && |
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 64d0af675823..90b2e0649bfb 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
| @@ -326,6 +326,43 @@ void tcp_enter_memory_pressure(struct sock *sk) | |||
| 326 | 326 | ||
| 327 | EXPORT_SYMBOL(tcp_enter_memory_pressure); | 327 | EXPORT_SYMBOL(tcp_enter_memory_pressure); |
| 328 | 328 | ||
| 329 | /* Convert seconds to retransmits based on initial and max timeout */ | ||
| 330 | static u8 secs_to_retrans(int seconds, int timeout, int rto_max) | ||
| 331 | { | ||
| 332 | u8 res = 0; | ||
| 333 | |||
| 334 | if (seconds > 0) { | ||
| 335 | int period = timeout; | ||
| 336 | |||
| 337 | res = 1; | ||
| 338 | while (seconds > period && res < 255) { | ||
| 339 | res++; | ||
| 340 | timeout <<= 1; | ||
| 341 | if (timeout > rto_max) | ||
| 342 | timeout = rto_max; | ||
| 343 | period += timeout; | ||
| 344 | } | ||
| 345 | } | ||
| 346 | return res; | ||
| 347 | } | ||
| 348 | |||
| 349 | /* Convert retransmits to seconds based on initial and max timeout */ | ||
| 350 | static int retrans_to_secs(u8 retrans, int timeout, int rto_max) | ||
| 351 | { | ||
| 352 | int period = 0; | ||
| 353 | |||
| 354 | if (retrans > 0) { | ||
| 355 | period = timeout; | ||
| 356 | while (--retrans) { | ||
| 357 | timeout <<= 1; | ||
| 358 | if (timeout > rto_max) | ||
| 359 | timeout = rto_max; | ||
| 360 | period += timeout; | ||
| 361 | } | ||
| 362 | } | ||
| 363 | return period; | ||
| 364 | } | ||
| 365 | |||
| 329 | /* | 366 | /* |
| 330 | * Wait for a TCP event. | 367 | * Wait for a TCP event. |
| 331 | * | 368 | * |
| @@ -1405,7 +1442,9 @@ int tcp_recvmsg(struct kiocb *iocb, struct sock *sk, struct msghdr *msg, | |||
| 1405 | goto found_ok_skb; | 1442 | goto found_ok_skb; |
| 1406 | if (tcp_hdr(skb)->fin) | 1443 | if (tcp_hdr(skb)->fin) |
| 1407 | goto found_fin_ok; | 1444 | goto found_fin_ok; |
| 1408 | WARN_ON(!(flags & MSG_PEEK)); | 1445 | if (WARN_ON(!(flags & MSG_PEEK))) |
| 1446 | printk(KERN_INFO "recvmsg bug 2: copied %X " | ||
| 1447 | "seq %X\n", *seq, TCP_SKB_CB(skb)->seq); | ||
| 1409 | } | 1448 | } |
| 1410 | 1449 | ||
| 1411 | /* Well, if we have backlog, try to process it now yet. */ | 1450 | /* Well, if we have backlog, try to process it now yet. */ |
| @@ -2163,16 +2202,10 @@ static int do_tcp_setsockopt(struct sock *sk, int level, | |||
| 2163 | break; | 2202 | break; |
| 2164 | 2203 | ||
| 2165 | case TCP_DEFER_ACCEPT: | 2204 | case TCP_DEFER_ACCEPT: |
| 2166 | icsk->icsk_accept_queue.rskq_defer_accept = 0; | 2205 | /* Translate value in seconds to number of retransmits */ |
| 2167 | if (val > 0) { | 2206 | icsk->icsk_accept_queue.rskq_defer_accept = |
| 2168 | /* Translate value in seconds to number of | 2207 | secs_to_retrans(val, TCP_TIMEOUT_INIT / HZ, |
| 2169 | * retransmits */ | 2208 | TCP_RTO_MAX / HZ); |
| 2170 | while (icsk->icsk_accept_queue.rskq_defer_accept < 32 && | ||
| 2171 | val > ((TCP_TIMEOUT_INIT / HZ) << | ||
| 2172 | icsk->icsk_accept_queue.rskq_defer_accept)) | ||
| 2173 | icsk->icsk_accept_queue.rskq_defer_accept++; | ||
| 2174 | icsk->icsk_accept_queue.rskq_defer_accept++; | ||
| 2175 | } | ||
| 2176 | break; | 2209 | break; |
| 2177 | 2210 | ||
| 2178 | case TCP_WINDOW_CLAMP: | 2211 | case TCP_WINDOW_CLAMP: |
| @@ -2353,8 +2386,8 @@ static int do_tcp_getsockopt(struct sock *sk, int level, | |||
| 2353 | val = (val ? : sysctl_tcp_fin_timeout) / HZ; | 2386 | val = (val ? : sysctl_tcp_fin_timeout) / HZ; |
| 2354 | break; | 2387 | break; |
| 2355 | case TCP_DEFER_ACCEPT: | 2388 | case TCP_DEFER_ACCEPT: |
| 2356 | val = !icsk->icsk_accept_queue.rskq_defer_accept ? 0 : | 2389 | val = retrans_to_secs(icsk->icsk_accept_queue.rskq_defer_accept, |
| 2357 | ((TCP_TIMEOUT_INIT / HZ) << (icsk->icsk_accept_queue.rskq_defer_accept - 1)); | 2390 | TCP_TIMEOUT_INIT / HZ, TCP_RTO_MAX / HZ); |
| 2358 | break; | 2391 | break; |
| 2359 | case TCP_WINDOW_CLAMP: | 2392 | case TCP_WINDOW_CLAMP: |
| 2360 | val = tp->window_clamp; | 2393 | val = tp->window_clamp; |
diff --git a/net/ipv4/tcp_minisocks.c b/net/ipv4/tcp_minisocks.c index e320afea07fc..4c03598ed924 100644 --- a/net/ipv4/tcp_minisocks.c +++ b/net/ipv4/tcp_minisocks.c | |||
| @@ -641,10 +641,9 @@ struct sock *tcp_check_req(struct sock *sk, struct sk_buff *skb, | |||
| 641 | if (!(flg & TCP_FLAG_ACK)) | 641 | if (!(flg & TCP_FLAG_ACK)) |
| 642 | return NULL; | 642 | return NULL; |
| 643 | 643 | ||
| 644 | /* If TCP_DEFER_ACCEPT is set, drop bare ACK. */ | 644 | /* While TCP_DEFER_ACCEPT is active, drop bare ACK. */ |
| 645 | if (inet_csk(sk)->icsk_accept_queue.rskq_defer_accept && | 645 | if (req->retrans < inet_csk(sk)->icsk_accept_queue.rskq_defer_accept && |
| 646 | TCP_SKB_CB(skb)->end_seq == tcp_rsk(req)->rcv_isn + 1) { | 646 | TCP_SKB_CB(skb)->end_seq == tcp_rsk(req)->rcv_isn + 1) { |
| 647 | inet_csk(sk)->icsk_accept_queue.rskq_defer_accept--; | ||
| 648 | inet_rsk(req)->acked = 1; | 647 | inet_rsk(req)->acked = 1; |
| 649 | return NULL; | 648 | return NULL; |
| 650 | } | 649 | } |
diff --git a/net/ipv6/ipv6_sockglue.c b/net/ipv6/ipv6_sockglue.c index 14f54eb5a7fc..4f7aaf6996a3 100644 --- a/net/ipv6/ipv6_sockglue.c +++ b/net/ipv6/ipv6_sockglue.c | |||
| @@ -496,13 +496,17 @@ done: | |||
| 496 | goto e_inval; | 496 | goto e_inval; |
| 497 | 497 | ||
| 498 | if (val) { | 498 | if (val) { |
| 499 | struct net_device *dev; | ||
| 500 | |||
| 499 | if (sk->sk_bound_dev_if && sk->sk_bound_dev_if != val) | 501 | if (sk->sk_bound_dev_if && sk->sk_bound_dev_if != val) |
| 500 | goto e_inval; | 502 | goto e_inval; |
| 501 | 503 | ||
| 502 | if (__dev_get_by_index(net, val) == NULL) { | 504 | dev = dev_get_by_index(net, val); |
| 505 | if (!dev) { | ||
| 503 | retv = -ENODEV; | 506 | retv = -ENODEV; |
| 504 | break; | 507 | break; |
| 505 | } | 508 | } |
| 509 | dev_put(dev); | ||
| 506 | } | 510 | } |
| 507 | np->mcast_oif = val; | 511 | np->mcast_oif = val; |
| 508 | retv = 0; | 512 | retv = 0; |
diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c index 51ab497115eb..fc820cd75453 100644 --- a/net/unix/af_unix.c +++ b/net/unix/af_unix.c | |||
| @@ -1074,6 +1074,8 @@ restart: | |||
| 1074 | err = -ECONNREFUSED; | 1074 | err = -ECONNREFUSED; |
| 1075 | if (other->sk_state != TCP_LISTEN) | 1075 | if (other->sk_state != TCP_LISTEN) |
| 1076 | goto out_unlock; | 1076 | goto out_unlock; |
| 1077 | if (other->sk_shutdown & RCV_SHUTDOWN) | ||
| 1078 | goto out_unlock; | ||
| 1077 | 1079 | ||
| 1078 | if (unix_recvq_full(other)) { | 1080 | if (unix_recvq_full(other)) { |
| 1079 | err = -EAGAIN; | 1081 | err = -EAGAIN; |
