diff options
| -rw-r--r-- | arch/ia64/hp/sim/Kconfig | 1 | ||||
| -rw-r--r-- | drivers/net/e1000e/ich8lan.c | 9 | ||||
| -rw-r--r-- | drivers/net/sungem.c | 144 | ||||
| -rw-r--r-- | include/linux/netdevice.h | 7 | ||||
| -rw-r--r-- | net/core/netpoll.c | 2 | ||||
| -rw-r--r-- | net/ipv4/netfilter/nf_nat_rule.c | 2 | ||||
| -rw-r--r-- | net/ipv4/tcp_vegas.c | 80 | ||||
| -rw-r--r-- | net/ipv6/ndisc.c | 7 | ||||
| -rw-r--r-- | net/netlabel/netlabel_unlabeled.c | 38 | ||||
| -rw-r--r-- | net/phonet/pep-gprs.c | 27 | ||||
| -rw-r--r-- | net/sched/sch_netem.c | 3 |
11 files changed, 164 insertions, 156 deletions
diff --git a/arch/ia64/hp/sim/Kconfig b/arch/ia64/hp/sim/Kconfig index f92306bbedb8..8d513a8c5266 100644 --- a/arch/ia64/hp/sim/Kconfig +++ b/arch/ia64/hp/sim/Kconfig | |||
| @@ -4,6 +4,7 @@ menu "HP Simulator drivers" | |||
| 4 | 4 | ||
| 5 | config HP_SIMETH | 5 | config HP_SIMETH |
| 6 | bool "Simulated Ethernet " | 6 | bool "Simulated Ethernet " |
| 7 | depends on NET | ||
| 7 | 8 | ||
| 8 | config HP_SIMSERIAL | 9 | config HP_SIMSERIAL |
| 9 | bool "Simulated serial driver support" | 10 | bool "Simulated serial driver support" |
diff --git a/drivers/net/e1000e/ich8lan.c b/drivers/net/e1000e/ich8lan.c index 523b9716a543..d115a6d30f29 100644 --- a/drivers/net/e1000e/ich8lan.c +++ b/drivers/net/e1000e/ich8lan.c | |||
| @@ -1893,12 +1893,17 @@ static s32 e1000_reset_hw_ich8lan(struct e1000_hw *hw) | |||
| 1893 | ctrl |= E1000_CTRL_PHY_RST; | 1893 | ctrl |= E1000_CTRL_PHY_RST; |
| 1894 | } | 1894 | } |
| 1895 | ret_val = e1000_acquire_swflag_ich8lan(hw); | 1895 | ret_val = e1000_acquire_swflag_ich8lan(hw); |
| 1896 | /* Whether or not the swflag was acquired, we need to reset the part */ | ||
| 1896 | hw_dbg(hw, "Issuing a global reset to ich8lan"); | 1897 | hw_dbg(hw, "Issuing a global reset to ich8lan"); |
| 1897 | ew32(CTRL, (ctrl | E1000_CTRL_RST)); | 1898 | ew32(CTRL, (ctrl | E1000_CTRL_RST)); |
| 1898 | msleep(20); | 1899 | msleep(20); |
| 1899 | 1900 | ||
| 1900 | /* release the swflag because it is not reset by hardware reset */ | 1901 | if (!ret_val) { |
| 1901 | e1000_release_swflag_ich8lan(hw); | 1902 | /* release the swflag because it is not reset by |
| 1903 | * hardware reset | ||
| 1904 | */ | ||
| 1905 | e1000_release_swflag_ich8lan(hw); | ||
| 1906 | } | ||
| 1902 | 1907 | ||
| 1903 | ret_val = e1000e_get_auto_rd_done(hw); | 1908 | ret_val = e1000e_get_auto_rd_done(hw); |
| 1904 | if (ret_val) { | 1909 | if (ret_val) { |
diff --git a/drivers/net/sungem.c b/drivers/net/sungem.c index 1349e419673c..fed7eba65ead 100644 --- a/drivers/net/sungem.c +++ b/drivers/net/sungem.c | |||
| @@ -1142,6 +1142,70 @@ static int gem_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 1142 | return NETDEV_TX_OK; | 1142 | return NETDEV_TX_OK; |
| 1143 | } | 1143 | } |
| 1144 | 1144 | ||
| 1145 | static void gem_pcs_reset(struct gem *gp) | ||
| 1146 | { | ||
| 1147 | int limit; | ||
| 1148 | u32 val; | ||
| 1149 | |||
| 1150 | /* Reset PCS unit. */ | ||
| 1151 | val = readl(gp->regs + PCS_MIICTRL); | ||
| 1152 | val |= PCS_MIICTRL_RST; | ||
| 1153 | writel(val, gp->regs + PCS_MIICTRL); | ||
| 1154 | |||
| 1155 | limit = 32; | ||
| 1156 | while (readl(gp->regs + PCS_MIICTRL) & PCS_MIICTRL_RST) { | ||
| 1157 | udelay(100); | ||
| 1158 | if (limit-- <= 0) | ||
| 1159 | break; | ||
| 1160 | } | ||
| 1161 | if (limit <= 0) | ||
| 1162 | printk(KERN_WARNING "%s: PCS reset bit would not clear.\n", | ||
| 1163 | gp->dev->name); | ||
| 1164 | } | ||
| 1165 | |||
| 1166 | static void gem_pcs_reinit_adv(struct gem *gp) | ||
| 1167 | { | ||
| 1168 | u32 val; | ||
| 1169 | |||
| 1170 | /* Make sure PCS is disabled while changing advertisement | ||
| 1171 | * configuration. | ||
| 1172 | */ | ||
| 1173 | val = readl(gp->regs + PCS_CFG); | ||
| 1174 | val &= ~(PCS_CFG_ENABLE | PCS_CFG_TO); | ||
| 1175 | writel(val, gp->regs + PCS_CFG); | ||
| 1176 | |||
| 1177 | /* Advertise all capabilities except assymetric | ||
| 1178 | * pause. | ||
| 1179 | */ | ||
| 1180 | val = readl(gp->regs + PCS_MIIADV); | ||
| 1181 | val |= (PCS_MIIADV_FD | PCS_MIIADV_HD | | ||
| 1182 | PCS_MIIADV_SP | PCS_MIIADV_AP); | ||
| 1183 | writel(val, gp->regs + PCS_MIIADV); | ||
| 1184 | |||
| 1185 | /* Enable and restart auto-negotiation, disable wrapback/loopback, | ||
| 1186 | * and re-enable PCS. | ||
| 1187 | */ | ||
| 1188 | val = readl(gp->regs + PCS_MIICTRL); | ||
| 1189 | val |= (PCS_MIICTRL_RAN | PCS_MIICTRL_ANE); | ||
| 1190 | val &= ~PCS_MIICTRL_WB; | ||
| 1191 | writel(val, gp->regs + PCS_MIICTRL); | ||
| 1192 | |||
| 1193 | val = readl(gp->regs + PCS_CFG); | ||
| 1194 | val |= PCS_CFG_ENABLE; | ||
| 1195 | writel(val, gp->regs + PCS_CFG); | ||
| 1196 | |||
| 1197 | /* Make sure serialink loopback is off. The meaning | ||
| 1198 | * of this bit is logically inverted based upon whether | ||
| 1199 | * you are in Serialink or SERDES mode. | ||
| 1200 | */ | ||
| 1201 | val = readl(gp->regs + PCS_SCTRL); | ||
| 1202 | if (gp->phy_type == phy_serialink) | ||
| 1203 | val &= ~PCS_SCTRL_LOOP; | ||
| 1204 | else | ||
| 1205 | val |= PCS_SCTRL_LOOP; | ||
| 1206 | writel(val, gp->regs + PCS_SCTRL); | ||
| 1207 | } | ||
| 1208 | |||
| 1145 | #define STOP_TRIES 32 | 1209 | #define STOP_TRIES 32 |
| 1146 | 1210 | ||
| 1147 | /* Must be invoked under gp->lock and gp->tx_lock. */ | 1211 | /* Must be invoked under gp->lock and gp->tx_lock. */ |
| @@ -1168,6 +1232,9 @@ static void gem_reset(struct gem *gp) | |||
| 1168 | 1232 | ||
| 1169 | if (limit <= 0) | 1233 | if (limit <= 0) |
| 1170 | printk(KERN_ERR "%s: SW reset is ghetto.\n", gp->dev->name); | 1234 | printk(KERN_ERR "%s: SW reset is ghetto.\n", gp->dev->name); |
| 1235 | |||
| 1236 | if (gp->phy_type == phy_serialink || gp->phy_type == phy_serdes) | ||
| 1237 | gem_pcs_reinit_adv(gp); | ||
| 1171 | } | 1238 | } |
| 1172 | 1239 | ||
| 1173 | /* Must be invoked under gp->lock and gp->tx_lock. */ | 1240 | /* Must be invoked under gp->lock and gp->tx_lock. */ |
| @@ -1324,7 +1391,7 @@ static int gem_set_link_modes(struct gem *gp) | |||
| 1324 | gp->phy_type == phy_serdes) { | 1391 | gp->phy_type == phy_serdes) { |
| 1325 | u32 pcs_lpa = readl(gp->regs + PCS_MIILP); | 1392 | u32 pcs_lpa = readl(gp->regs + PCS_MIILP); |
| 1326 | 1393 | ||
| 1327 | if (pcs_lpa & PCS_MIIADV_FD) | 1394 | if ((pcs_lpa & PCS_MIIADV_FD) || gp->phy_type == phy_serdes) |
| 1328 | full_duplex = 1; | 1395 | full_duplex = 1; |
| 1329 | speed = SPEED_1000; | 1396 | speed = SPEED_1000; |
| 1330 | } | 1397 | } |
| @@ -1488,6 +1555,9 @@ static void gem_link_timer(unsigned long data) | |||
| 1488 | val = readl(gp->regs + PCS_MIISTAT); | 1555 | val = readl(gp->regs + PCS_MIISTAT); |
| 1489 | 1556 | ||
| 1490 | if ((val & PCS_MIISTAT_LS) != 0) { | 1557 | if ((val & PCS_MIISTAT_LS) != 0) { |
| 1558 | if (gp->lstate == link_up) | ||
| 1559 | goto restart; | ||
| 1560 | |||
| 1491 | gp->lstate = link_up; | 1561 | gp->lstate = link_up; |
| 1492 | netif_carrier_on(gp->dev); | 1562 | netif_carrier_on(gp->dev); |
| 1493 | (void)gem_set_link_modes(gp); | 1563 | (void)gem_set_link_modes(gp); |
| @@ -1708,61 +1778,8 @@ static void gem_init_phy(struct gem *gp) | |||
| 1708 | if (gp->phy_mii.def && gp->phy_mii.def->ops->init) | 1778 | if (gp->phy_mii.def && gp->phy_mii.def->ops->init) |
| 1709 | gp->phy_mii.def->ops->init(&gp->phy_mii); | 1779 | gp->phy_mii.def->ops->init(&gp->phy_mii); |
| 1710 | } else { | 1780 | } else { |
| 1711 | u32 val; | 1781 | gem_pcs_reset(gp); |
| 1712 | int limit; | 1782 | gem_pcs_reinit_adv(gp); |
| 1713 | |||
| 1714 | /* Reset PCS unit. */ | ||
| 1715 | val = readl(gp->regs + PCS_MIICTRL); | ||
| 1716 | val |= PCS_MIICTRL_RST; | ||
| 1717 | writel(val, gp->regs + PCS_MIICTRL); | ||
| 1718 | |||
| 1719 | limit = 32; | ||
| 1720 | while (readl(gp->regs + PCS_MIICTRL) & PCS_MIICTRL_RST) { | ||
| 1721 | udelay(100); | ||
| 1722 | if (limit-- <= 0) | ||
| 1723 | break; | ||
| 1724 | } | ||
| 1725 | if (limit <= 0) | ||
| 1726 | printk(KERN_WARNING "%s: PCS reset bit would not clear.\n", | ||
| 1727 | gp->dev->name); | ||
| 1728 | |||
| 1729 | /* Make sure PCS is disabled while changing advertisement | ||
| 1730 | * configuration. | ||
| 1731 | */ | ||
| 1732 | val = readl(gp->regs + PCS_CFG); | ||
| 1733 | val &= ~(PCS_CFG_ENABLE | PCS_CFG_TO); | ||
| 1734 | writel(val, gp->regs + PCS_CFG); | ||
| 1735 | |||
| 1736 | /* Advertise all capabilities except assymetric | ||
| 1737 | * pause. | ||
| 1738 | */ | ||
| 1739 | val = readl(gp->regs + PCS_MIIADV); | ||
| 1740 | val |= (PCS_MIIADV_FD | PCS_MIIADV_HD | | ||
| 1741 | PCS_MIIADV_SP | PCS_MIIADV_AP); | ||
| 1742 | writel(val, gp->regs + PCS_MIIADV); | ||
| 1743 | |||
| 1744 | /* Enable and restart auto-negotiation, disable wrapback/loopback, | ||
| 1745 | * and re-enable PCS. | ||
| 1746 | */ | ||
| 1747 | val = readl(gp->regs + PCS_MIICTRL); | ||
| 1748 | val |= (PCS_MIICTRL_RAN | PCS_MIICTRL_ANE); | ||
| 1749 | val &= ~PCS_MIICTRL_WB; | ||
| 1750 | writel(val, gp->regs + PCS_MIICTRL); | ||
| 1751 | |||
| 1752 | val = readl(gp->regs + PCS_CFG); | ||
| 1753 | val |= PCS_CFG_ENABLE; | ||
| 1754 | writel(val, gp->regs + PCS_CFG); | ||
| 1755 | |||
| 1756 | /* Make sure serialink loopback is off. The meaning | ||
| 1757 | * of this bit is logically inverted based upon whether | ||
| 1758 | * you are in Serialink or SERDES mode. | ||
| 1759 | */ | ||
| 1760 | val = readl(gp->regs + PCS_SCTRL); | ||
| 1761 | if (gp->phy_type == phy_serialink) | ||
| 1762 | val &= ~PCS_SCTRL_LOOP; | ||
| 1763 | else | ||
| 1764 | val |= PCS_SCTRL_LOOP; | ||
| 1765 | writel(val, gp->regs + PCS_SCTRL); | ||
| 1766 | } | 1783 | } |
| 1767 | 1784 | ||
| 1768 | /* Default aneg parameters */ | 1785 | /* Default aneg parameters */ |
| @@ -2680,6 +2697,21 @@ static int gem_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) | |||
| 2680 | cmd->speed = 0; | 2697 | cmd->speed = 0; |
| 2681 | cmd->duplex = cmd->port = cmd->phy_address = | 2698 | cmd->duplex = cmd->port = cmd->phy_address = |
| 2682 | cmd->transceiver = cmd->autoneg = 0; | 2699 | cmd->transceiver = cmd->autoneg = 0; |
| 2700 | |||
| 2701 | /* serdes means usually a Fibre connector, with most fixed */ | ||
| 2702 | if (gp->phy_type == phy_serdes) { | ||
| 2703 | cmd->port = PORT_FIBRE; | ||
| 2704 | cmd->supported = (SUPPORTED_1000baseT_Half | | ||
| 2705 | SUPPORTED_1000baseT_Full | | ||
| 2706 | SUPPORTED_FIBRE | SUPPORTED_Autoneg | | ||
| 2707 | SUPPORTED_Pause | SUPPORTED_Asym_Pause); | ||
| 2708 | cmd->advertising = cmd->supported; | ||
| 2709 | cmd->transceiver = XCVR_INTERNAL; | ||
| 2710 | if (gp->lstate == link_up) | ||
| 2711 | cmd->speed = SPEED_1000; | ||
| 2712 | cmd->duplex = DUPLEX_FULL; | ||
| 2713 | cmd->autoneg = 1; | ||
| 2714 | } | ||
| 2683 | } | 2715 | } |
| 2684 | cmd->maxtxpkt = cmd->maxrxpkt = 0; | 2716 | cmd->maxtxpkt = cmd->maxrxpkt = 0; |
| 2685 | 2717 | ||
diff --git a/include/linux/netdevice.h b/include/linux/netdevice.h index 9d77b1d7dca8..e26f54952892 100644 --- a/include/linux/netdevice.h +++ b/include/linux/netdevice.h | |||
| @@ -319,6 +319,7 @@ enum | |||
| 319 | { | 319 | { |
| 320 | NAPI_STATE_SCHED, /* Poll is scheduled */ | 320 | NAPI_STATE_SCHED, /* Poll is scheduled */ |
| 321 | NAPI_STATE_DISABLE, /* Disable pending */ | 321 | NAPI_STATE_DISABLE, /* Disable pending */ |
| 322 | NAPI_STATE_NPSVC, /* Netpoll - don't dequeue from poll_list */ | ||
| 322 | }; | 323 | }; |
| 323 | 324 | ||
| 324 | extern void __napi_schedule(struct napi_struct *n); | 325 | extern void __napi_schedule(struct napi_struct *n); |
| @@ -1497,6 +1498,12 @@ static inline void netif_rx_complete(struct net_device *dev, | |||
| 1497 | { | 1498 | { |
| 1498 | unsigned long flags; | 1499 | unsigned long flags; |
| 1499 | 1500 | ||
| 1501 | /* | ||
| 1502 | * don't let napi dequeue from the cpu poll list | ||
| 1503 | * just in case its running on a different cpu | ||
| 1504 | */ | ||
| 1505 | if (unlikely(test_bit(NAPI_STATE_NPSVC, &napi->state))) | ||
| 1506 | return; | ||
| 1500 | local_irq_save(flags); | 1507 | local_irq_save(flags); |
| 1501 | __netif_rx_complete(dev, napi); | 1508 | __netif_rx_complete(dev, napi); |
| 1502 | local_irq_restore(flags); | 1509 | local_irq_restore(flags); |
diff --git a/net/core/netpoll.c b/net/core/netpoll.c index 6c7af390be0a..dadac6281f20 100644 --- a/net/core/netpoll.c +++ b/net/core/netpoll.c | |||
| @@ -133,9 +133,11 @@ static int poll_one_napi(struct netpoll_info *npinfo, | |||
| 133 | 133 | ||
| 134 | npinfo->rx_flags |= NETPOLL_RX_DROP; | 134 | npinfo->rx_flags |= NETPOLL_RX_DROP; |
| 135 | atomic_inc(&trapped); | 135 | atomic_inc(&trapped); |
| 136 | set_bit(NAPI_STATE_NPSVC, &napi->state); | ||
| 136 | 137 | ||
| 137 | work = napi->poll(napi, budget); | 138 | work = napi->poll(napi, budget); |
| 138 | 139 | ||
| 140 | clear_bit(NAPI_STATE_NPSVC, &napi->state); | ||
| 139 | atomic_dec(&trapped); | 141 | atomic_dec(&trapped); |
| 140 | npinfo->rx_flags &= ~NETPOLL_RX_DROP; | 142 | npinfo->rx_flags &= ~NETPOLL_RX_DROP; |
| 141 | 143 | ||
diff --git a/net/ipv4/netfilter/nf_nat_rule.c b/net/ipv4/netfilter/nf_nat_rule.c index bea54a685109..8d489e746b21 100644 --- a/net/ipv4/netfilter/nf_nat_rule.c +++ b/net/ipv4/netfilter/nf_nat_rule.c | |||
| @@ -61,7 +61,7 @@ static struct | |||
| 61 | static struct xt_table nat_table = { | 61 | static struct xt_table nat_table = { |
| 62 | .name = "nat", | 62 | .name = "nat", |
| 63 | .valid_hooks = NAT_VALID_HOOKS, | 63 | .valid_hooks = NAT_VALID_HOOKS, |
| 64 | .lock = __RW_LOCK_UNLOCKED(__nat_table.lock), | 64 | .lock = __RW_LOCK_UNLOCKED(nat_table.lock), |
| 65 | .me = THIS_MODULE, | 65 | .me = THIS_MODULE, |
| 66 | .af = AF_INET, | 66 | .af = AF_INET, |
| 67 | }; | 67 | }; |
diff --git a/net/ipv4/tcp_vegas.c b/net/ipv4/tcp_vegas.c index 7cd22262de3a..a453aac91bd3 100644 --- a/net/ipv4/tcp_vegas.c +++ b/net/ipv4/tcp_vegas.c | |||
| @@ -40,18 +40,14 @@ | |||
| 40 | 40 | ||
| 41 | #include "tcp_vegas.h" | 41 | #include "tcp_vegas.h" |
| 42 | 42 | ||
| 43 | /* Default values of the Vegas variables, in fixed-point representation | 43 | static int alpha = 2; |
| 44 | * with V_PARAM_SHIFT bits to the right of the binary point. | 44 | static int beta = 4; |
| 45 | */ | 45 | static int gamma = 1; |
| 46 | #define V_PARAM_SHIFT 1 | ||
| 47 | static int alpha = 2<<V_PARAM_SHIFT; | ||
| 48 | static int beta = 4<<V_PARAM_SHIFT; | ||
| 49 | static int gamma = 1<<V_PARAM_SHIFT; | ||
| 50 | 46 | ||
| 51 | module_param(alpha, int, 0644); | 47 | module_param(alpha, int, 0644); |
| 52 | MODULE_PARM_DESC(alpha, "lower bound of packets in network (scale by 2)"); | 48 | MODULE_PARM_DESC(alpha, "lower bound of packets in network"); |
| 53 | module_param(beta, int, 0644); | 49 | module_param(beta, int, 0644); |
| 54 | MODULE_PARM_DESC(beta, "upper bound of packets in network (scale by 2)"); | 50 | MODULE_PARM_DESC(beta, "upper bound of packets in network"); |
| 55 | module_param(gamma, int, 0644); | 51 | module_param(gamma, int, 0644); |
| 56 | MODULE_PARM_DESC(gamma, "limit on increase (scale by 2)"); | 52 | MODULE_PARM_DESC(gamma, "limit on increase (scale by 2)"); |
| 57 | 53 | ||
| @@ -172,49 +168,13 @@ static void tcp_vegas_cong_avoid(struct sock *sk, u32 ack, u32 in_flight) | |||
| 172 | return; | 168 | return; |
| 173 | } | 169 | } |
| 174 | 170 | ||
| 175 | /* The key players are v_beg_snd_una and v_beg_snd_nxt. | ||
| 176 | * | ||
| 177 | * These are so named because they represent the approximate values | ||
| 178 | * of snd_una and snd_nxt at the beginning of the current RTT. More | ||
| 179 | * precisely, they represent the amount of data sent during the RTT. | ||
| 180 | * At the end of the RTT, when we receive an ACK for v_beg_snd_nxt, | ||
| 181 | * we will calculate that (v_beg_snd_nxt - v_beg_snd_una) outstanding | ||
| 182 | * bytes of data have been ACKed during the course of the RTT, giving | ||
| 183 | * an "actual" rate of: | ||
| 184 | * | ||
| 185 | * (v_beg_snd_nxt - v_beg_snd_una) / (rtt duration) | ||
| 186 | * | ||
| 187 | * Unfortunately, v_beg_snd_una is not exactly equal to snd_una, | ||
| 188 | * because delayed ACKs can cover more than one segment, so they | ||
| 189 | * don't line up nicely with the boundaries of RTTs. | ||
| 190 | * | ||
| 191 | * Another unfortunate fact of life is that delayed ACKs delay the | ||
| 192 | * advance of the left edge of our send window, so that the number | ||
| 193 | * of bytes we send in an RTT is often less than our cwnd will allow. | ||
| 194 | * So we keep track of our cwnd separately, in v_beg_snd_cwnd. | ||
| 195 | */ | ||
| 196 | |||
| 197 | if (after(ack, vegas->beg_snd_nxt)) { | 171 | if (after(ack, vegas->beg_snd_nxt)) { |
| 198 | /* Do the Vegas once-per-RTT cwnd adjustment. */ | 172 | /* Do the Vegas once-per-RTT cwnd adjustment. */ |
| 199 | u32 old_wnd, old_snd_cwnd; | ||
| 200 | |||
| 201 | |||
| 202 | /* Here old_wnd is essentially the window of data that was | ||
| 203 | * sent during the previous RTT, and has all | ||
| 204 | * been acknowledged in the course of the RTT that ended | ||
| 205 | * with the ACK we just received. Likewise, old_snd_cwnd | ||
| 206 | * is the cwnd during the previous RTT. | ||
| 207 | */ | ||
| 208 | old_wnd = (vegas->beg_snd_nxt - vegas->beg_snd_una) / | ||
| 209 | tp->mss_cache; | ||
| 210 | old_snd_cwnd = vegas->beg_snd_cwnd; | ||
| 211 | 173 | ||
| 212 | /* Save the extent of the current window so we can use this | 174 | /* Save the extent of the current window so we can use this |
| 213 | * at the end of the next RTT. | 175 | * at the end of the next RTT. |
| 214 | */ | 176 | */ |
| 215 | vegas->beg_snd_una = vegas->beg_snd_nxt; | ||
| 216 | vegas->beg_snd_nxt = tp->snd_nxt; | 177 | vegas->beg_snd_nxt = tp->snd_nxt; |
| 217 | vegas->beg_snd_cwnd = tp->snd_cwnd; | ||
| 218 | 178 | ||
| 219 | /* We do the Vegas calculations only if we got enough RTT | 179 | /* We do the Vegas calculations only if we got enough RTT |
| 220 | * samples that we can be reasonably sure that we got | 180 | * samples that we can be reasonably sure that we got |
| @@ -252,22 +212,14 @@ static void tcp_vegas_cong_avoid(struct sock *sk, u32 ack, u32 in_flight) | |||
| 252 | * | 212 | * |
| 253 | * This is: | 213 | * This is: |
| 254 | * (actual rate in segments) * baseRTT | 214 | * (actual rate in segments) * baseRTT |
| 255 | * We keep it as a fixed point number with | ||
| 256 | * V_PARAM_SHIFT bits to the right of the binary point. | ||
| 257 | */ | 215 | */ |
| 258 | target_cwnd = ((u64)old_wnd * vegas->baseRTT); | 216 | target_cwnd = tp->snd_cwnd * vegas->baseRTT / rtt; |
| 259 | target_cwnd <<= V_PARAM_SHIFT; | ||
| 260 | do_div(target_cwnd, rtt); | ||
| 261 | 217 | ||
| 262 | /* Calculate the difference between the window we had, | 218 | /* Calculate the difference between the window we had, |
| 263 | * and the window we would like to have. This quantity | 219 | * and the window we would like to have. This quantity |
| 264 | * is the "Diff" from the Arizona Vegas papers. | 220 | * is the "Diff" from the Arizona Vegas papers. |
| 265 | * | ||
| 266 | * Again, this is a fixed point number with | ||
| 267 | * V_PARAM_SHIFT bits to the right of the binary | ||
| 268 | * point. | ||
| 269 | */ | 221 | */ |
| 270 | diff = (old_wnd << V_PARAM_SHIFT) - target_cwnd; | 222 | diff = tp->snd_cwnd * (rtt-vegas->baseRTT) / vegas->baseRTT; |
| 271 | 223 | ||
| 272 | if (diff > gamma && tp->snd_ssthresh > 2 ) { | 224 | if (diff > gamma && tp->snd_ssthresh > 2 ) { |
| 273 | /* Going too fast. Time to slow down | 225 | /* Going too fast. Time to slow down |
| @@ -282,16 +234,13 @@ static void tcp_vegas_cong_avoid(struct sock *sk, u32 ack, u32 in_flight) | |||
| 282 | * truncation robs us of full link | 234 | * truncation robs us of full link |
| 283 | * utilization. | 235 | * utilization. |
| 284 | */ | 236 | */ |
| 285 | tp->snd_cwnd = min(tp->snd_cwnd, | 237 | tp->snd_cwnd = min(tp->snd_cwnd, (u32)target_cwnd+1); |
| 286 | ((u32)target_cwnd >> | ||
| 287 | V_PARAM_SHIFT)+1); | ||
| 288 | 238 | ||
| 289 | } else if (tp->snd_cwnd <= tp->snd_ssthresh) { | 239 | } else if (tp->snd_cwnd <= tp->snd_ssthresh) { |
| 290 | /* Slow start. */ | 240 | /* Slow start. */ |
| 291 | tcp_slow_start(tp); | 241 | tcp_slow_start(tp); |
| 292 | } else { | 242 | } else { |
| 293 | /* Congestion avoidance. */ | 243 | /* Congestion avoidance. */ |
| 294 | u32 next_snd_cwnd; | ||
| 295 | 244 | ||
| 296 | /* Figure out where we would like cwnd | 245 | /* Figure out where we would like cwnd |
| 297 | * to be. | 246 | * to be. |
| @@ -300,26 +249,17 @@ static void tcp_vegas_cong_avoid(struct sock *sk, u32 ack, u32 in_flight) | |||
| 300 | /* The old window was too fast, so | 249 | /* The old window was too fast, so |
| 301 | * we slow down. | 250 | * we slow down. |
| 302 | */ | 251 | */ |
| 303 | next_snd_cwnd = old_snd_cwnd - 1; | 252 | tp->snd_cwnd--; |
| 304 | } else if (diff < alpha) { | 253 | } else if (diff < alpha) { |
| 305 | /* We don't have enough extra packets | 254 | /* We don't have enough extra packets |
| 306 | * in the network, so speed up. | 255 | * in the network, so speed up. |
| 307 | */ | 256 | */ |
| 308 | next_snd_cwnd = old_snd_cwnd + 1; | 257 | tp->snd_cwnd++; |
| 309 | } else { | 258 | } else { |
| 310 | /* Sending just as fast as we | 259 | /* Sending just as fast as we |
| 311 | * should be. | 260 | * should be. |
| 312 | */ | 261 | */ |
| 313 | next_snd_cwnd = old_snd_cwnd; | ||
| 314 | } | 262 | } |
| 315 | |||
| 316 | /* Adjust cwnd upward or downward, toward the | ||
| 317 | * desired value. | ||
| 318 | */ | ||
| 319 | if (next_snd_cwnd > tp->snd_cwnd) | ||
| 320 | tp->snd_cwnd++; | ||
| 321 | else if (next_snd_cwnd < tp->snd_cwnd) | ||
| 322 | tp->snd_cwnd--; | ||
| 323 | } | 263 | } |
| 324 | 264 | ||
| 325 | if (tp->snd_cwnd < 2) | 265 | if (tp->snd_cwnd < 2) |
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c index 172438320eec..d0f54d18e19b 100644 --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c | |||
| @@ -912,8 +912,13 @@ static void ndisc_recv_na(struct sk_buff *skb) | |||
| 912 | is invalid, but ndisc specs say nothing | 912 | is invalid, but ndisc specs say nothing |
| 913 | about it. It could be misconfiguration, or | 913 | about it. It could be misconfiguration, or |
| 914 | an smart proxy agent tries to help us :-) | 914 | an smart proxy agent tries to help us :-) |
| 915 | |||
| 916 | We should not print the error if NA has been | ||
| 917 | received from loopback - it is just our own | ||
| 918 | unsolicited advertisement. | ||
| 915 | */ | 919 | */ |
| 916 | ND_PRINTK1(KERN_WARNING | 920 | if (skb->pkt_type != PACKET_LOOPBACK) |
| 921 | ND_PRINTK1(KERN_WARNING | ||
| 917 | "ICMPv6 NA: someone advertises our address on %s!\n", | 922 | "ICMPv6 NA: someone advertises our address on %s!\n", |
| 918 | ifp->idev->dev->name); | 923 | ifp->idev->dev->name); |
| 919 | in6_ifa_put(ifp); | 924 | in6_ifa_put(ifp); |
diff --git a/net/netlabel/netlabel_unlabeled.c b/net/netlabel/netlabel_unlabeled.c index 90c8506a0aac..8c0308032178 100644 --- a/net/netlabel/netlabel_unlabeled.c +++ b/net/netlabel/netlabel_unlabeled.c | |||
| @@ -562,7 +562,6 @@ static int netlbl_unlhsh_remove_addr4(struct net *net, | |||
| 562 | const struct in_addr *mask, | 562 | const struct in_addr *mask, |
| 563 | struct netlbl_audit *audit_info) | 563 | struct netlbl_audit *audit_info) |
| 564 | { | 564 | { |
| 565 | int ret_val = 0; | ||
| 566 | struct netlbl_af4list *list_entry; | 565 | struct netlbl_af4list *list_entry; |
| 567 | struct netlbl_unlhsh_addr4 *entry; | 566 | struct netlbl_unlhsh_addr4 *entry; |
| 568 | struct audit_buffer *audit_buf; | 567 | struct audit_buffer *audit_buf; |
| @@ -577,7 +576,7 @@ static int netlbl_unlhsh_remove_addr4(struct net *net, | |||
| 577 | if (list_entry != NULL) | 576 | if (list_entry != NULL) |
| 578 | entry = netlbl_unlhsh_addr4_entry(list_entry); | 577 | entry = netlbl_unlhsh_addr4_entry(list_entry); |
| 579 | else | 578 | else |
| 580 | ret_val = -ENOENT; | 579 | entry = NULL; |
| 581 | 580 | ||
| 582 | audit_buf = netlbl_audit_start_common(AUDIT_MAC_UNLBL_STCDEL, | 581 | audit_buf = netlbl_audit_start_common(AUDIT_MAC_UNLBL_STCDEL, |
| 583 | audit_info); | 582 | audit_info); |
| @@ -588,19 +587,21 @@ static int netlbl_unlhsh_remove_addr4(struct net *net, | |||
| 588 | addr->s_addr, mask->s_addr); | 587 | addr->s_addr, mask->s_addr); |
| 589 | if (dev != NULL) | 588 | if (dev != NULL) |
| 590 | dev_put(dev); | 589 | dev_put(dev); |
| 591 | if (entry && security_secid_to_secctx(entry->secid, | 590 | if (entry != NULL && |
| 592 | &secctx, | 591 | security_secid_to_secctx(entry->secid, |
| 593 | &secctx_len) == 0) { | 592 | &secctx, &secctx_len) == 0) { |
| 594 | audit_log_format(audit_buf, " sec_obj=%s", secctx); | 593 | audit_log_format(audit_buf, " sec_obj=%s", secctx); |
| 595 | security_release_secctx(secctx, secctx_len); | 594 | security_release_secctx(secctx, secctx_len); |
| 596 | } | 595 | } |
| 597 | audit_log_format(audit_buf, " res=%u", ret_val == 0 ? 1 : 0); | 596 | audit_log_format(audit_buf, " res=%u", entry != NULL ? 1 : 0); |
| 598 | audit_log_end(audit_buf); | 597 | audit_log_end(audit_buf); |
| 599 | } | 598 | } |
| 600 | 599 | ||
| 601 | if (ret_val == 0) | 600 | if (entry == NULL) |
| 602 | call_rcu(&entry->rcu, netlbl_unlhsh_free_addr4); | 601 | return -ENOENT; |
| 603 | return ret_val; | 602 | |
| 603 | call_rcu(&entry->rcu, netlbl_unlhsh_free_addr4); | ||
| 604 | return 0; | ||
| 604 | } | 605 | } |
| 605 | 606 | ||
| 606 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) | 607 | #if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) |
| @@ -624,7 +625,6 @@ static int netlbl_unlhsh_remove_addr6(struct net *net, | |||
| 624 | const struct in6_addr *mask, | 625 | const struct in6_addr *mask, |
| 625 | struct netlbl_audit *audit_info) | 626 | struct netlbl_audit *audit_info) |
| 626 | { | 627 | { |
| 627 | int ret_val = 0; | ||
| 628 | struct netlbl_af6list *list_entry; | 628 | struct netlbl_af6list *list_entry; |
| 629 | struct netlbl_unlhsh_addr6 *entry; | 629 | struct netlbl_unlhsh_addr6 *entry; |
| 630 | struct audit_buffer *audit_buf; | 630 | struct audit_buffer *audit_buf; |
| @@ -638,7 +638,7 @@ static int netlbl_unlhsh_remove_addr6(struct net *net, | |||
| 638 | if (list_entry != NULL) | 638 | if (list_entry != NULL) |
| 639 | entry = netlbl_unlhsh_addr6_entry(list_entry); | 639 | entry = netlbl_unlhsh_addr6_entry(list_entry); |
| 640 | else | 640 | else |
| 641 | ret_val = -ENOENT; | 641 | entry = NULL; |
| 642 | 642 | ||
| 643 | audit_buf = netlbl_audit_start_common(AUDIT_MAC_UNLBL_STCDEL, | 643 | audit_buf = netlbl_audit_start_common(AUDIT_MAC_UNLBL_STCDEL, |
| 644 | audit_info); | 644 | audit_info); |
| @@ -649,19 +649,21 @@ static int netlbl_unlhsh_remove_addr6(struct net *net, | |||
| 649 | addr, mask); | 649 | addr, mask); |
| 650 | if (dev != NULL) | 650 | if (dev != NULL) |
| 651 | dev_put(dev); | 651 | dev_put(dev); |
| 652 | if (entry && security_secid_to_secctx(entry->secid, | 652 | if (entry != NULL && |
| 653 | &secctx, | 653 | security_secid_to_secctx(entry->secid, |
| 654 | &secctx_len) == 0) { | 654 | &secctx, &secctx_len) == 0) { |
| 655 | audit_log_format(audit_buf, " sec_obj=%s", secctx); | 655 | audit_log_format(audit_buf, " sec_obj=%s", secctx); |
| 656 | security_release_secctx(secctx, secctx_len); | 656 | security_release_secctx(secctx, secctx_len); |
| 657 | } | 657 | } |
| 658 | audit_log_format(audit_buf, " res=%u", ret_val == 0 ? 1 : 0); | 658 | audit_log_format(audit_buf, " res=%u", entry != NULL ? 1 : 0); |
| 659 | audit_log_end(audit_buf); | 659 | audit_log_end(audit_buf); |
| 660 | } | 660 | } |
| 661 | 661 | ||
| 662 | if (ret_val == 0) | 662 | if (entry == NULL) |
| 663 | call_rcu(&entry->rcu, netlbl_unlhsh_free_addr6); | 663 | return -ENOENT; |
| 664 | return ret_val; | 664 | |
| 665 | call_rcu(&entry->rcu, netlbl_unlhsh_free_addr6); | ||
| 666 | return 0; | ||
| 665 | } | 667 | } |
| 666 | #endif /* IPv6 */ | 668 | #endif /* IPv6 */ |
| 667 | 669 | ||
diff --git a/net/phonet/pep-gprs.c b/net/phonet/pep-gprs.c index 9978afbd9f2a..803eeef0aa85 100644 --- a/net/phonet/pep-gprs.c +++ b/net/phonet/pep-gprs.c | |||
| @@ -155,12 +155,13 @@ static void gprs_data_ready(struct sock *sk, int len) | |||
| 155 | static void gprs_write_space(struct sock *sk) | 155 | static void gprs_write_space(struct sock *sk) |
| 156 | { | 156 | { |
| 157 | struct gprs_dev *dev = sk->sk_user_data; | 157 | struct gprs_dev *dev = sk->sk_user_data; |
| 158 | struct net_device *net = dev->net; | ||
| 158 | unsigned credits = pep_writeable(sk); | 159 | unsigned credits = pep_writeable(sk); |
| 159 | 160 | ||
| 160 | spin_lock_bh(&dev->tx_lock); | 161 | spin_lock_bh(&dev->tx_lock); |
| 161 | dev->tx_max = credits; | 162 | dev->tx_max = credits; |
| 162 | if (credits > skb_queue_len(&dev->tx_queue)) | 163 | if (credits > skb_queue_len(&dev->tx_queue) && netif_running(net)) |
| 163 | netif_wake_queue(dev->net); | 164 | netif_wake_queue(net); |
| 164 | spin_unlock_bh(&dev->tx_lock); | 165 | spin_unlock_bh(&dev->tx_lock); |
| 165 | } | 166 | } |
| 166 | 167 | ||
| @@ -168,6 +169,23 @@ static void gprs_write_space(struct sock *sk) | |||
| 168 | * Network device callbacks | 169 | * Network device callbacks |
| 169 | */ | 170 | */ |
| 170 | 171 | ||
| 172 | static int gprs_open(struct net_device *dev) | ||
| 173 | { | ||
| 174 | struct gprs_dev *gp = netdev_priv(dev); | ||
| 175 | |||
| 176 | gprs_write_space(gp->sk); | ||
| 177 | return 0; | ||
| 178 | } | ||
| 179 | |||
| 180 | static int gprs_close(struct net_device *dev) | ||
| 181 | { | ||
| 182 | struct gprs_dev *gp = netdev_priv(dev); | ||
| 183 | |||
| 184 | netif_stop_queue(dev); | ||
| 185 | flush_work(&gp->tx_work); | ||
| 186 | return 0; | ||
| 187 | } | ||
| 188 | |||
| 171 | static int gprs_xmit(struct sk_buff *skb, struct net_device *net) | 189 | static int gprs_xmit(struct sk_buff *skb, struct net_device *net) |
| 172 | { | 190 | { |
| 173 | struct gprs_dev *dev = netdev_priv(net); | 191 | struct gprs_dev *dev = netdev_priv(net); |
| @@ -254,6 +272,8 @@ static void gprs_setup(struct net_device *net) | |||
| 254 | net->tx_queue_len = 10; | 272 | net->tx_queue_len = 10; |
| 255 | 273 | ||
| 256 | net->destructor = free_netdev; | 274 | net->destructor = free_netdev; |
| 275 | net->open = gprs_open; | ||
| 276 | net->stop = gprs_close; | ||
| 257 | net->hard_start_xmit = gprs_xmit; /* mandatory */ | 277 | net->hard_start_xmit = gprs_xmit; /* mandatory */ |
| 258 | net->change_mtu = gprs_set_mtu; | 278 | net->change_mtu = gprs_set_mtu; |
| 259 | net->get_stats = gprs_get_stats; | 279 | net->get_stats = gprs_get_stats; |
| @@ -318,7 +338,6 @@ int gprs_attach(struct sock *sk) | |||
| 318 | dev->sk = sk; | 338 | dev->sk = sk; |
| 319 | 339 | ||
| 320 | printk(KERN_DEBUG"%s: attached\n", net->name); | 340 | printk(KERN_DEBUG"%s: attached\n", net->name); |
| 321 | gprs_write_space(sk); /* kick off TX */ | ||
| 322 | return net->ifindex; | 341 | return net->ifindex; |
| 323 | 342 | ||
| 324 | out_rel: | 343 | out_rel: |
| @@ -341,7 +360,5 @@ void gprs_detach(struct sock *sk) | |||
| 341 | 360 | ||
| 342 | printk(KERN_DEBUG"%s: detached\n", net->name); | 361 | printk(KERN_DEBUG"%s: detached\n", net->name); |
| 343 | unregister_netdev(net); | 362 | unregister_netdev(net); |
| 344 | flush_scheduled_work(); | ||
| 345 | sock_put(sk); | 363 | sock_put(sk); |
| 346 | skb_queue_purge(&dev->tx_queue); | ||
| 347 | } | 364 | } |
diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c index a11959908d9a..98402f0efa47 100644 --- a/net/sched/sch_netem.c +++ b/net/sched/sch_netem.c | |||
| @@ -46,9 +46,6 @@ | |||
| 46 | layering other disciplines. It does not need to do bandwidth | 46 | layering other disciplines. It does not need to do bandwidth |
| 47 | control either since that can be handled by using token | 47 | control either since that can be handled by using token |
| 48 | bucket or other rate control. | 48 | bucket or other rate control. |
| 49 | |||
| 50 | The simulator is limited by the Linux timer resolution | ||
| 51 | and will create packet bursts on the HZ boundary (1ms). | ||
| 52 | */ | 49 | */ |
| 53 | 50 | ||
| 54 | struct netem_sched_data { | 51 | struct netem_sched_data { |
