Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts: arch/s390/net/bpf_jit_comp.c drivers/net/ethernet/ti/netcp_ethss.c net/bridge/br_multicast.c net/ipv4/ip_fragment.c All four conflicts were cases of simple overlapping changes. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -2097,11 +2097,28 @@ static void gbe_port_config(struct gbe_priv *gbe_dev, struct gbe_slave *slave,
|
||||
writel(slave->mac_control, GBE_REG_ADDR(slave, emac_regs, mac_control));
|
||||
}
|
||||
|
||||
static void gbe_sgmii_rtreset(struct gbe_priv *priv,
|
||||
struct gbe_slave *slave, bool set)
|
||||
{
|
||||
void __iomem *sgmii_port_regs;
|
||||
|
||||
if (SLAVE_LINK_IS_XGMII(slave))
|
||||
return;
|
||||
|
||||
if ((priv->ss_version == GBE_SS_VERSION_14) && (slave->slave_num >= 2))
|
||||
sgmii_port_regs = priv->sgmii_port34_regs;
|
||||
else
|
||||
sgmii_port_regs = priv->sgmii_port_regs;
|
||||
|
||||
netcp_sgmii_rtreset(sgmii_port_regs, slave->slave_num, set);
|
||||
}
|
||||
|
||||
static void gbe_slave_stop(struct gbe_intf *intf)
|
||||
{
|
||||
struct gbe_priv *gbe_dev = intf->gbe_dev;
|
||||
struct gbe_slave *slave = intf->slave;
|
||||
|
||||
gbe_sgmii_rtreset(gbe_dev, slave, true);
|
||||
gbe_port_reset(slave);
|
||||
/* Disable forwarding */
|
||||
cpsw_ale_control_set(gbe_dev->ale, slave->port_num,
|
||||
@@ -2143,6 +2160,7 @@ static int gbe_slave_open(struct gbe_intf *gbe_intf)
|
||||
|
||||
gbe_sgmii_config(priv, slave);
|
||||
gbe_port_reset(slave);
|
||||
gbe_sgmii_rtreset(priv, slave, false);
|
||||
gbe_port_config(priv, slave, priv->rx_packet_max);
|
||||
gbe_set_slave_mac(slave, gbe_intf);
|
||||
/* enable forwarding */
|
||||
@@ -2687,10 +2705,9 @@ static void free_secondary_ports(struct gbe_priv *gbe_dev)
|
||||
{
|
||||
struct gbe_slave *slave;
|
||||
|
||||
for (;;) {
|
||||
while (!list_empty(&gbe_dev->secondary_slaves)) {
|
||||
slave = first_sec_slave(gbe_dev);
|
||||
if (!slave)
|
||||
break;
|
||||
|
||||
if (slave->phy)
|
||||
phy_disconnect(slave->phy);
|
||||
list_del(&slave->slave_list);
|
||||
@@ -3073,14 +3090,13 @@ static int gbe_probe(struct netcp_device *netcp_device, struct device *dev,
|
||||
&gbe_dev->dma_chan_name);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "missing \"tx-channel\" parameter\n");
|
||||
ret = -ENODEV;
|
||||
goto quit;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!strcmp(node->name, "gbe")) {
|
||||
ret = get_gbe_resource_version(gbe_dev, node);
|
||||
if (ret)
|
||||
goto quit;
|
||||
return ret;
|
||||
|
||||
dev_dbg(dev, "ss_version: 0x%08x\n", gbe_dev->ss_version);
|
||||
|
||||
@@ -3091,22 +3107,20 @@ static int gbe_probe(struct netcp_device *netcp_device, struct device *dev,
|
||||
else
|
||||
ret = -ENODEV;
|
||||
|
||||
if (ret)
|
||||
goto quit;
|
||||
} else if (!strcmp(node->name, "xgbe")) {
|
||||
ret = set_xgbe_ethss10_priv(gbe_dev, node);
|
||||
if (ret)
|
||||
goto quit;
|
||||
return ret;
|
||||
ret = netcp_xgbe_serdes_init(gbe_dev->xgbe_serdes_regs,
|
||||
gbe_dev->ss_regs);
|
||||
if (ret)
|
||||
goto quit;
|
||||
} else {
|
||||
dev_err(dev, "unknown GBE node(%s)\n", node->name);
|
||||
ret = -ENODEV;
|
||||
goto quit;
|
||||
}
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
interfaces = of_get_child_by_name(node, "interfaces");
|
||||
if (!interfaces)
|
||||
dev_err(dev, "could not find interfaces\n");
|
||||
@@ -3114,11 +3128,11 @@ static int gbe_probe(struct netcp_device *netcp_device, struct device *dev,
|
||||
ret = netcp_txpipe_init(&gbe_dev->tx_pipe, netcp_device,
|
||||
gbe_dev->dma_chan_name, gbe_dev->tx_queue_id);
|
||||
if (ret)
|
||||
goto quit;
|
||||
return ret;
|
||||
|
||||
ret = netcp_txpipe_open(&gbe_dev->tx_pipe);
|
||||
if (ret)
|
||||
goto quit;
|
||||
return ret;
|
||||
|
||||
/* Create network interfaces */
|
||||
INIT_LIST_HEAD(&gbe_dev->gbe_intf_head);
|
||||
@@ -3133,6 +3147,7 @@ static int gbe_probe(struct netcp_device *netcp_device, struct device *dev,
|
||||
if (gbe_dev->num_slaves >= gbe_dev->max_num_slaves)
|
||||
break;
|
||||
}
|
||||
of_node_put(interfaces);
|
||||
|
||||
if (!gbe_dev->num_slaves)
|
||||
dev_warn(dev, "No network interface configured\n");
|
||||
@@ -3145,9 +3160,10 @@ static int gbe_probe(struct netcp_device *netcp_device, struct device *dev,
|
||||
of_node_put(secondary_ports);
|
||||
|
||||
if (!gbe_dev->num_slaves) {
|
||||
dev_err(dev, "No network interface or secondary ports configured\n");
|
||||
dev_err(dev,
|
||||
"No network interface or secondary ports configured\n");
|
||||
ret = -ENODEV;
|
||||
goto quit;
|
||||
goto free_sec_ports;
|
||||
}
|
||||
|
||||
memset(&ale_params, 0, sizeof(ale_params));
|
||||
@@ -3161,7 +3177,7 @@ static int gbe_probe(struct netcp_device *netcp_device, struct device *dev,
|
||||
if (!gbe_dev->ale) {
|
||||
dev_err(gbe_dev->dev, "error initializing ale engine\n");
|
||||
ret = -ENODEV;
|
||||
goto quit;
|
||||
goto free_sec_ports;
|
||||
} else {
|
||||
dev_dbg(gbe_dev->dev, "Created a gbe ale engine\n");
|
||||
}
|
||||
@@ -3186,16 +3202,8 @@ static int gbe_probe(struct netcp_device *netcp_device, struct device *dev,
|
||||
*inst_priv = gbe_dev;
|
||||
return 0;
|
||||
|
||||
quit:
|
||||
if (gbe_dev->hw_stats)
|
||||
devm_kfree(dev, gbe_dev->hw_stats);
|
||||
if (gbe_dev->hw_stats_prev)
|
||||
devm_kfree(dev, gbe_dev->hw_stats_prev);
|
||||
cpsw_ale_destroy(gbe_dev->ale);
|
||||
if (gbe_dev->ss_regs)
|
||||
devm_iounmap(dev, gbe_dev->ss_regs);
|
||||
of_node_put(interfaces);
|
||||
devm_kfree(dev, gbe_dev);
|
||||
free_sec_ports:
|
||||
free_secondary_ports(gbe_dev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -3268,12 +3276,9 @@ static int gbe_remove(struct netcp_device *netcp_device, void *inst_priv)
|
||||
free_secondary_ports(gbe_dev);
|
||||
|
||||
if (!list_empty(&gbe_dev->gbe_intf_head))
|
||||
dev_alert(gbe_dev->dev, "unreleased ethss interfaces present\n");
|
||||
dev_alert(gbe_dev->dev,
|
||||
"unreleased ethss interfaces present\n");
|
||||
|
||||
devm_kfree(gbe_dev->dev, gbe_dev->hw_stats);
|
||||
devm_iounmap(gbe_dev->dev, gbe_dev->ss_regs);
|
||||
memset(gbe_dev, 0x00, sizeof(*gbe_dev));
|
||||
devm_kfree(gbe_dev->dev, gbe_dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user