Commit e1762ec6 authored by Linus Torvalds's avatar Linus Torvalds

Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6

parents ef59c4e9 0cbd7825
...@@ -910,18 +910,16 @@ core99_gmac_phy_reset(struct device_node *node, long param, long value) ...@@ -910,18 +910,16 @@ core99_gmac_phy_reset(struct device_node *node, long param, long value)
macio->type != macio_intrepid) macio->type != macio_intrepid)
return -ENODEV; return -ENODEV;
printk(KERN_DEBUG "Hard reset of PHY chip ...\n");
LOCK(flags); LOCK(flags);
MACIO_OUT8(KL_GPIO_ETH_PHY_RESET, KEYLARGO_GPIO_OUTPUT_ENABLE); MACIO_OUT8(KL_GPIO_ETH_PHY_RESET, KEYLARGO_GPIO_OUTPUT_ENABLE);
(void)MACIO_IN8(KL_GPIO_ETH_PHY_RESET); (void)MACIO_IN8(KL_GPIO_ETH_PHY_RESET);
UNLOCK(flags); UNLOCK(flags);
msleep(10); mdelay(10);
LOCK(flags); LOCK(flags);
MACIO_OUT8(KL_GPIO_ETH_PHY_RESET, /*KEYLARGO_GPIO_OUTPUT_ENABLE | */ MACIO_OUT8(KL_GPIO_ETH_PHY_RESET, /*KEYLARGO_GPIO_OUTPUT_ENABLE | */
KEYLARGO_GPIO_OUTOUT_DATA); KEYLARGO_GPIO_OUTOUT_DATA);
UNLOCK(flags); UNLOCK(flags);
msleep(10); mdelay(10);
return 0; return 0;
} }
......
...@@ -1653,40 +1653,36 @@ static void gem_init_rings(struct gem *gp) ...@@ -1653,40 +1653,36 @@ static void gem_init_rings(struct gem *gp)
/* Init PHY interface and start link poll state machine */ /* Init PHY interface and start link poll state machine */
static void gem_init_phy(struct gem *gp) static void gem_init_phy(struct gem *gp)
{ {
u32 mif_cfg; u32 mifcfg;
/* Revert MIF CFG setting done on stop_phy */ /* Revert MIF CFG setting done on stop_phy */
mif_cfg = readl(gp->regs + MIF_CFG); mifcfg = readl(gp->regs + MIF_CFG);
mif_cfg &= ~(MIF_CFG_PSELECT|MIF_CFG_POLL|MIF_CFG_BBMODE|MIF_CFG_MDI1); mifcfg &= ~MIF_CFG_BBMODE;
mif_cfg |= MIF_CFG_MDI0; writel(mifcfg, gp->regs + MIF_CFG);
writel(mif_cfg, gp->regs + MIF_CFG);
writel(PCS_DMODE_MGM, gp->regs + PCS_DMODE);
writel(MAC_XIFCFG_OE, gp->regs + MAC_XIFCFG);
if (gp->pdev->vendor == PCI_VENDOR_ID_APPLE) { if (gp->pdev->vendor == PCI_VENDOR_ID_APPLE) {
int i; 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 #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 #endif
/* Some PHYs used by apple have problem getting back to us,
/* Some PHYs used by apple have problem getting back * we do an additional reset here
* to us, we do an additional reset here */
*/ phy_write(gp, MII_BMCR, BMCR_RESET);
phy_write(gp, MII_BMCR, BMCR_RESET); msleep(20);
for (i = 0; i < 50; i++) { if (phy_read(gp, MII_BMCR) != 0xffff)
if ((phy_read(gp, MII_BMCR) & BMCR_RESET) == 0)
break; 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 && if (gp->pdev->vendor == PCI_VENDOR_ID_SUN &&
...@@ -2123,7 +2119,7 @@ static void gem_reinit_chip(struct gem *gp) ...@@ -2123,7 +2119,7 @@ static void gem_reinit_chip(struct gem *gp)
/* Must be invoked with no lock held. */ /* Must be invoked with no lock held. */
static void gem_stop_phy(struct gem *gp, int wol) static void gem_stop_phy(struct gem *gp, int wol)
{ {
u32 mif_cfg; u32 mifcfg;
unsigned long flags; unsigned long flags;
/* Let the chip settle down a bit, it seems that helps /* 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) ...@@ -2134,9 +2130,9 @@ static void gem_stop_phy(struct gem *gp, int wol)
/* Make sure we aren't polling PHY status change. We /* Make sure we aren't polling PHY status change. We
* don't currently use that feature though * don't currently use that feature though
*/ */
mif_cfg = readl(gp->regs + MIF_CFG); mifcfg = readl(gp->regs + MIF_CFG);
mif_cfg &= ~MIF_CFG_POLL; mifcfg &= ~MIF_CFG_POLL;
writel(mif_cfg, gp->regs + MIF_CFG); writel(mifcfg, gp->regs + MIF_CFG);
if (wol && gp->has_wol) { if (wol && gp->has_wol) {
unsigned char *e = &gp->dev->dev_addr[0]; unsigned char *e = &gp->dev->dev_addr[0];
...@@ -2186,8 +2182,7 @@ static void gem_stop_phy(struct gem *gp, int wol) ...@@ -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 /* According to Apple, we must set the MDIO pins to this begnign
* state or we may 1) eat more current, 2) damage some PHYs * state or we may 1) eat more current, 2) damage some PHYs
*/ */
mif_cfg = 0; writel(mifcfg | MIF_CFG_BBMODE, gp->regs + MIF_CFG);
writel(mif_cfg | MIF_CFG_BBMODE, gp->regs + MIF_CFG);
writel(0, gp->regs + MIF_BBCLK); writel(0, gp->regs + MIF_BBCLK);
writel(0, gp->regs + MIF_BBDATA); writel(0, gp->regs + MIF_BBDATA);
writel(0, gp->regs + MIF_BBOENAB); writel(0, gp->regs + MIF_BBOENAB);
......
...@@ -170,8 +170,8 @@ static inline int ip_route_connect(struct rtable **rp, u32 dst, ...@@ -170,8 +170,8 @@ static inline int ip_route_connect(struct rtable **rp, u32 dst,
return ip_route_output_flow(rp, &fl, sk, 0); return ip_route_output_flow(rp, &fl, sk, 0);
} }
static inline int ip_route_newports(struct rtable **rp, u16 sport, u16 dport, static inline int ip_route_newports(struct rtable **rp, u8 protocol,
struct sock *sk) u16 sport, u16 dport, struct sock *sk)
{ {
if (sport != (*rp)->fl.fl_ip_sport || if (sport != (*rp)->fl.fl_ip_sport ||
dport != (*rp)->fl.fl_ip_dport) { dport != (*rp)->fl.fl_ip_dport) {
...@@ -180,6 +180,7 @@ static inline int ip_route_newports(struct rtable **rp, u16 sport, u16 dport, ...@@ -180,6 +180,7 @@ static inline int ip_route_newports(struct rtable **rp, u16 sport, u16 dport,
memcpy(&fl, &(*rp)->fl, sizeof(fl)); memcpy(&fl, &(*rp)->fl, sizeof(fl));
fl.fl_ip_sport = sport; fl.fl_ip_sport = sport;
fl.fl_ip_dport = dport; fl.fl_ip_dport = dport;
fl.proto = protocol;
ip_rt_put(*rp); ip_rt_put(*rp);
*rp = NULL; *rp = NULL;
return ip_route_output_flow(rp, &fl, sk, 0); return ip_route_output_flow(rp, &fl, sk, 0);
......
...@@ -104,6 +104,7 @@ static void destroy_nbp(struct net_bridge_port *p) ...@@ -104,6 +104,7 @@ static void destroy_nbp(struct net_bridge_port *p)
{ {
struct net_device *dev = p->dev; struct net_device *dev = p->dev;
dev->br_port = NULL;
p->br = NULL; p->br = NULL;
p->dev = NULL; p->dev = NULL;
dev_put(dev); dev_put(dev);
...@@ -118,13 +119,24 @@ static void destroy_nbp_rcu(struct rcu_head *head) ...@@ -118,13 +119,24 @@ static void destroy_nbp_rcu(struct rcu_head *head)
destroy_nbp(p); 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) static void del_nbp(struct net_bridge_port *p)
{ {
struct net_bridge *br = p->br; struct net_bridge *br = p->br;
struct net_device *dev = p->dev; 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); dev_set_promiscuity(dev, -1);
cancel_delayed_work(&p->carrier_check); cancel_delayed_work(&p->carrier_check);
...@@ -132,16 +144,13 @@ static void del_nbp(struct net_bridge_port *p) ...@@ -132,16 +144,13 @@ static void del_nbp(struct net_bridge_port *p)
spin_lock_bh(&br->lock); spin_lock_bh(&br->lock);
br_stp_disable_port(p); br_stp_disable_port(p);
p->deleted = 1;
spin_unlock_bh(&br->lock); spin_unlock_bh(&br->lock);
br_fdb_delete_by_port(br, p); br_fdb_delete_by_port(br, p);
list_del_rcu(&p->list); 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); call_rcu(&p->rcu, destroy_nbp_rcu);
} }
......
...@@ -68,6 +68,7 @@ struct net_bridge_port ...@@ -68,6 +68,7 @@ struct net_bridge_port
/* STP */ /* STP */
u8 priority; u8 priority;
u8 state; u8 state;
u8 deleted;
u16 port_no; u16 port_no;
unsigned char topology_change_ack; unsigned char topology_change_ack;
unsigned char config_pending; unsigned char config_pending;
......
...@@ -119,7 +119,8 @@ int dccp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) ...@@ -119,7 +119,8 @@ int dccp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
if (err != 0) if (err != 0)
goto failure; 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) if (err != 0)
goto failure; goto failure;
......
...@@ -468,6 +468,7 @@ static int dccp_v6_send_response(struct sock *sk, struct request_sock *req, ...@@ -468,6 +468,7 @@ static int dccp_v6_send_response(struct sock *sk, struct request_sock *req,
done: done:
if (opt && opt != np->opt) if (opt && opt != np->opt)
sock_kfree_s(sk, opt, opt->tot_len); sock_kfree_s(sk, opt, opt->tot_len);
dst_release(dst);
return err; return err;
} }
......
...@@ -236,7 +236,7 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) ...@@ -236,7 +236,7 @@ int tcp_v4_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
if (err) if (err)
goto failure; 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) if (err)
goto failure; goto failure;
...@@ -1845,7 +1845,6 @@ void __init tcp_v4_init(struct net_proto_family *ops) ...@@ -1845,7 +1845,6 @@ void __init tcp_v4_init(struct net_proto_family *ops)
} }
EXPORT_SYMBOL(ipv4_specific); EXPORT_SYMBOL(ipv4_specific);
EXPORT_SYMBOL(inet_bind_bucket_create);
EXPORT_SYMBOL(tcp_hashinfo); EXPORT_SYMBOL(tcp_hashinfo);
EXPORT_SYMBOL(tcp_prot); EXPORT_SYMBOL(tcp_prot);
EXPORT_SYMBOL(tcp_unhash); EXPORT_SYMBOL(tcp_unhash);
......
...@@ -515,6 +515,7 @@ static int tcp_v6_send_synack(struct sock *sk, struct request_sock *req, ...@@ -515,6 +515,7 @@ static int tcp_v6_send_synack(struct sock *sk, struct request_sock *req,
done: done:
if (opt && opt != np->opt) if (opt && opt != np->opt)
sock_kfree_s(sk, opt, opt->tot_len); sock_kfree_s(sk, opt, opt->tot_len);
dst_release(dst);
return err; return err;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment