]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
authorLinus Torvalds <torvalds@g5.osdl.org>
Wed, 1 Feb 2006 03:24:43 +0000 (19:24 -0800)
committerLinus Torvalds <torvalds@g5.osdl.org>
Wed, 1 Feb 2006 03:24:43 +0000 (19:24 -0800)
arch/powerpc/platforms/powermac/feature.c
drivers/net/sungem.c
include/net/route.h
net/bridge/br_if.c
net/bridge/br_private.h
net/dccp/ipv4.c
net/dccp/ipv6.c
net/ipv4/tcp_ipv4.c
net/ipv6/tcp_ipv6.c

index 2296f3d46ca829ac979e92a7af0393bb422d05cf..558dd06920921f04bde22e4084d0347ba73c8209 100644 (file)
@@ -910,18 +910,16 @@ core99_gmac_phy_reset(struct device_node *node, long param, long value)
            macio->type != macio_intrepid)
                return -ENODEV;
 
-       printk(KERN_DEBUG "Hard reset of PHY chip ...\n");
-
        LOCK(flags);
        MACIO_OUT8(KL_GPIO_ETH_PHY_RESET, KEYLARGO_GPIO_OUTPUT_ENABLE);
        (void)MACIO_IN8(KL_GPIO_ETH_PHY_RESET);
        UNLOCK(flags);
-       msleep(10);
+       mdelay(10);
        LOCK(flags);
        MACIO_OUT8(KL_GPIO_ETH_PHY_RESET, /*KEYLARGO_GPIO_OUTPUT_ENABLE | */
                KEYLARGO_GPIO_OUTOUT_DATA);
        UNLOCK(flags);
-       msleep(10);
+       mdelay(10);
 
        return 0;
 }
index 55f3b856236e13262387bbcd0df3d05846b86c8d..28ce47a02408e9946c2e3941c491b5313ca56db2 100644 (file)
@@ -1653,40 +1653,36 @@ static void gem_init_rings(struct gem *gp)
 /* Init PHY interface and start link poll state machine */
 static void gem_init_phy(struct gem *gp)
 {
-       u32 mif_cfg;
+       u32 mifcfg;
 
        /* Revert MIF CFG setting done on stop_phy */
-       mif_cfg = readl(gp->regs + MIF_CFG);
-       mif_cfg &= ~(MIF_CFG_PSELECT|MIF_CFG_POLL|MIF_CFG_BBMODE|MIF_CFG_MDI1);
-       mif_cfg |= MIF_CFG_MDI0;
-       writel(mif_cfg, gp->regs + MIF_CFG);
-       writel(PCS_DMODE_MGM, gp->regs + PCS_DMODE);
-       writel(MAC_XIFCFG_OE, gp->regs + MAC_XIFCFG);
+       mifcfg = readl(gp->regs + MIF_CFG);
+       mifcfg &= ~MIF_CFG_BBMODE;
+       writel(mifcfg, gp->regs + MIF_CFG);
        
        if (gp->pdev->vendor == PCI_VENDOR_ID_APPLE) {
                int i;
-               u16 ctrl;
 
+               /* Those delay sucks, the HW seem to love them though, I'll
+                * serisouly consider breaking some locks here to be able
+                * to schedule instead
+                */
+               for (i = 0; i < 3; i++) {
 #ifdef CONFIG_PPC_PMAC
-               pmac_call_feature(PMAC_FTR_GMAC_PHY_RESET, gp->of_node, 0, 0);
+                       pmac_call_feature(PMAC_FTR_GMAC_PHY_RESET, gp->of_node, 0, 0);
+                       msleep(20);
 #endif
-
-               /* Some PHYs used by apple have problem getting back
-                * to us, we do an additional reset here
-                */
-               phy_write(gp, MII_BMCR, BMCR_RESET);
-               for (i = 0; i < 50; i++) {
-                       if ((phy_read(gp, MII_BMCR) & BMCR_RESET) == 0)
+                       /* Some PHYs used by apple have problem getting back to us,
+                        * we do an additional reset here
+                        */
+                       phy_write(gp, MII_BMCR, BMCR_RESET);
+                       msleep(20);
+                       if (phy_read(gp, MII_BMCR) != 0xffff)
                                break;
-                       msleep(10);
+                       if (i == 2)
+                               printk(KERN_WARNING "%s: GMAC PHY not responding !\n",
+                                      gp->dev->name);
                }
-               if (i == 50)
-                       printk(KERN_WARNING "%s: GMAC PHY not responding !\n",
-                              gp->dev->name);
-               /* Make sure isolate is off */
-               ctrl = phy_read(gp, MII_BMCR);
-               if (ctrl & BMCR_ISOLATE)
-                       phy_write(gp, MII_BMCR, ctrl & ~BMCR_ISOLATE);
        }
 
        if (gp->pdev->vendor == PCI_VENDOR_ID_SUN &&
@@ -2123,7 +2119,7 @@ static void gem_reinit_chip(struct gem *gp)
 /* Must be invoked with no lock held. */
 static void gem_stop_phy(struct gem *gp, int wol)
 {
-       u32 mif_cfg;
+       u32 mifcfg;
        unsigned long flags;
 
        /* Let the chip settle down a bit, it seems that helps
@@ -2134,9 +2130,9 @@ static void gem_stop_phy(struct gem *gp, int wol)
        /* Make sure we aren't polling PHY status change. We
         * don't currently use that feature though
         */
-       mif_cfg = readl(gp->regs + MIF_CFG);
-       mif_cfg &= ~MIF_CFG_POLL;
-       writel(mif_cfg, gp->regs + MIF_CFG);
+       mifcfg = readl(gp->regs + MIF_CFG);
+       mifcfg &= ~MIF_CFG_POLL;
+       writel(mifcfg, gp->regs + MIF_CFG);
 
        if (wol && gp->has_wol) {
                unsigned char *e = &gp->dev->dev_addr[0];
@@ -2186,8 +2182,7 @@ static void gem_stop_phy(struct gem *gp, int wol)
                /* According to Apple, we must set the MDIO pins to this begnign
                 * state or we may 1) eat more current, 2) damage some PHYs
                 */
-               mif_cfg = 0;
-               writel(mif_cfg | MIF_CFG_BBMODE, gp->regs + MIF_CFG);
+               writel(mifcfg | MIF_CFG_BBMODE, gp->regs + MIF_CFG);
                writel(0, gp->regs + MIF_BBCLK);
                writel(0, gp->regs + MIF_BBDATA);
                writel(0, gp->regs + MIF_BBOENAB);
index e3e5436f8017929aeba0d271b7748d13c8a365b6..9c04f15090d2b6b6e75060ab56dfb69047ea5db7 100644 (file)
@@ -170,8 +170,8 @@ static inline int ip_route_connect(struct rtable **rp, u32 dst,
        return ip_route_output_flow(rp, &fl, sk, 0);
 }
 
-static inline int ip_route_newports(struct rtable **rp, u16 sport, u16 dport,
-                                   struct sock *sk)
+static inline int ip_route_newports(struct rtable **rp, u8 protocol,
+                                   u16 sport, u16 dport, struct sock *sk)
 {
        if (sport != (*rp)->fl.fl_ip_sport ||
            dport != (*rp)->fl.fl_ip_dport) {
@@ -180,6 +180,7 @@ static inline int ip_route_newports(struct rtable **rp, u16 sport, u16 dport,
                memcpy(&fl, &(*rp)->fl, sizeof(fl));
                fl.fl_ip_sport = sport;
                fl.fl_ip_dport = dport;
+               fl.proto = protocol;
                ip_rt_put(*rp);
                *rp = NULL;
                return ip_route_output_flow(rp, &fl, sk, 0);
index ba442883e877fbda4808db858f215ac9c30334df..da687c8dc6ff013e62f04b535f2a26483e4db284 100644 (file)
@@ -104,6 +104,7 @@ static void destroy_nbp(struct net_bridge_port *p)
 {
        struct net_device *dev = p->dev;
 
+       dev->br_port = NULL;
        p->br = NULL;
        p->dev = NULL;
        dev_put(dev);
@@ -118,13 +119,24 @@ static void destroy_nbp_rcu(struct rcu_head *head)
        destroy_nbp(p);
 }
 
-/* called with RTNL */
+/* Delete port(interface) from bridge is done in two steps.
+ * via RCU. First step, marks device as down. That deletes
+ * all the timers and stops new packets from flowing through.
+ *
+ * Final cleanup doesn't occur until after all CPU's finished
+ * processing packets.
+ *
+ * Protected from multiple admin operations by RTNL mutex
+ */
 static void del_nbp(struct net_bridge_port *p)
 {
        struct net_bridge *br = p->br;
        struct net_device *dev = p->dev;
 
-       dev->br_port = NULL;
+       /* Race between RTNL notify and RCU callback */
+       if (p->deleted)
+               return;
+
        dev_set_promiscuity(dev, -1);
 
        cancel_delayed_work(&p->carrier_check);
@@ -132,16 +144,13 @@ static void del_nbp(struct net_bridge_port *p)
 
        spin_lock_bh(&br->lock);
        br_stp_disable_port(p);
+       p->deleted = 1;
        spin_unlock_bh(&br->lock);
 
        br_fdb_delete_by_port(br, p);
 
        list_del_rcu(&p->list);
 
-       del_timer_sync(&p->message_age_timer);
-       del_timer_sync(&p->forward_delay_timer);
-       del_timer_sync(&p->hold_timer);
-       
        call_rcu(&p->rcu, destroy_nbp_rcu);
 }
 
index c5bd631ffcd5793d67c29009151c380b6af03cac..e330b17b6d816620f2706fc4eab15c1f4ef21481 100644 (file)
@@ -68,6 +68,7 @@ struct net_bridge_port
        /* STP */
        u8                              priority;
        u8                              state;
+       u8                              deleted;
        u16                             port_no;
        unsigned char                   topology_change_ack;
        unsigned char                   config_pending;
index 00f983226672a6c70aca4a67368cceae2d7a118b..dc0487b5bacec375dda26bbdc4515b5a5cedc621 100644 (file)
@@ -119,7 +119,8 @@ int dccp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
        if (err != 0)
                goto failure;
 
-       err = ip_route_newports(&rt, inet->sport, inet->dport, sk);
+       err = ip_route_newports(&rt, IPPROTO_DCCP, inet->sport, inet->dport,
+                               sk);
        if (err != 0)
                goto failure;
 
index df074259f9c3100581f649499dac1ae5554d1770..80c4d048869e10e2880b5dff67ea22ccd1d0e8f6 100644 (file)
@@ -468,6 +468,7 @@ static int dccp_v6_send_response(struct sock *sk, struct request_sock *req,
 done:
         if (opt && opt != np->opt)
                sock_kfree_s(sk, opt, opt->tot_len);
+       dst_release(dst);
        return err;
 }
 
index 6ea353907af5757de1abc84e6b87274afa4d26fe..233bdf2599658513c8ede17ebcc77c38bc2cac4a 100644 (file)
@@ -236,7 +236,7 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
        if (err)
                goto failure;
 
-       err = ip_route_newports(&rt, inet->sport, inet->dport, sk);
+       err = ip_route_newports(&rt, IPPROTO_TCP, inet->sport, inet->dport, sk);
        if (err)
                goto failure;
 
@@ -1845,7 +1845,6 @@ void __init tcp_v4_init(struct net_proto_family *ops)
 }
 
 EXPORT_SYMBOL(ipv4_specific);
-EXPORT_SYMBOL(inet_bind_bucket_create);
 EXPORT_SYMBOL(tcp_hashinfo);
 EXPORT_SYMBOL(tcp_prot);
 EXPORT_SYMBOL(tcp_unhash);
index 66d04004afdaec2a731d953752fb970f17121112..ca9cf6853755fc3081693334c6f8f3e70265dcac 100644 (file)
@@ -515,6 +515,7 @@ static int tcp_v6_send_synack(struct sock *sk, struct request_sock *req,
 done:
         if (opt && opt != np->opt)
                sock_kfree_s(sk, opt, opt->tot_len);
+       dst_release(dst);
        return err;
 }