summaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorSascha Hauer <s.hauer@pengutronix.de>2014-06-04 21:03:45 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2014-06-04 21:03:45 +0200
commita3dfea9af8d31d27b0d9957965d1056912041321 (patch)
tree3b25fbb33a1f74d69ba7fa5b350bf406cdb1596d /net
parent6331e58a2c99009587eeb2252d0c6ac9de882c1c (diff)
parent15b0abce264be775aa63dc0de9c74d39529baf84 (diff)
downloadbarebox-a3dfea9af8d31d27b0d9957965d1056912041321.tar.gz
barebox-a3dfea9af8d31d27b0d9957965d1056912041321.tar.xz
Merge branch 'for-next/net'
Conflicts: drivers/net/dm9k.c
Diffstat (limited to 'net')
-rw-r--r--net/eth.c71
-rw-r--r--net/ifup.c2
-rw-r--r--net/net.c21
3 files changed, 54 insertions, 40 deletions
diff --git a/net/eth.c b/net/eth.c
index 3ced3cddbe..b830f79249 100644
--- a/net/eth.c
+++ b/net/eth.c
@@ -131,11 +131,6 @@ void of_eth_register_ethaddr(struct device_node *node, const char *ethaddr)
void eth_set_current(struct eth_device *eth)
{
- if (eth_current && eth_current->active) {
- eth_current->halt(eth_current);
- eth_current->active = 0;
- }
-
eth_current = eth;
}
@@ -178,83 +173,92 @@ int eth_complete(struct string_list *sl, char *instr)
/*
* Check for link if we haven't done so for longer.
*/
-static int eth_carrier_check(int force)
+static int eth_carrier_check(struct eth_device *edev, int force)
{
int ret;
if (!IS_ENABLED(CONFIG_PHYLIB))
return 0;
- if (!eth_current->phydev)
+ if (!edev->phydev)
return 0;
if (force)
- phy_wait_aneg_done(eth_current->phydev);
+ phy_wait_aneg_done(edev->phydev);
if (force || is_timeout(last_link_check, 5 * SECOND) ||
- !eth_current->phydev->link) {
- ret = phy_update_status(eth_current->phydev);
+ !edev->phydev->link) {
+ ret = phy_update_status(edev->phydev);
if (ret)
return ret;
last_link_check = get_time_ns();
}
- return eth_current->phydev->link ? 0 : -ENETDOWN;
+ return edev->phydev->link ? 0 : -ENETDOWN;
}
/*
* Check if we have a current ethernet device and
* eventually open it if we have to.
*/
-static int eth_check_open(void)
+static int eth_check_open(struct eth_device *edev)
{
int ret;
- if (!eth_current)
- return -ENODEV;
-
- if (eth_current->active)
+ if (edev->active)
return 0;
- ret = eth_current->open(eth_current);
+ ret = edev->open(eth_current);
if (ret)
return ret;
- eth_current->active = 1;
+ edev->active = 1;
- return eth_carrier_check(1);
+ return eth_carrier_check(edev, 1);
}
-int eth_send(void *packet, int length)
+int eth_send(struct eth_device *edev, void *packet, int length)
{
int ret;
- ret = eth_check_open();
+ ret = eth_check_open(edev);
if (ret)
return ret;
- ret = eth_carrier_check(0);
+ ret = eth_carrier_check(edev, 0);
if (ret)
return ret;
led_trigger_network(LED_TRIGGER_NET_TX);
- return eth_current->send(eth_current, packet, length);
+ return edev->send(eth_current, packet, length);
}
-int eth_rx(void)
+static int __eth_rx(struct eth_device *edev)
{
int ret;
- ret = eth_check_open();
+ ret = eth_check_open(edev);
if (ret)
return ret;
- ret = eth_carrier_check(0);
+ ret = eth_carrier_check(edev, 0);
if (ret)
return ret;
- return eth_current->recv(eth_current);
+ return edev->recv(eth_current);
+}
+
+int eth_rx(void)
+{
+ struct eth_device *edev;
+
+ list_for_each_entry(edev, &netdev_list, list) {
+ if (edev->active)
+ __eth_rx(edev);
+ }
+
+ return 0;
}
static int eth_set_ethaddr(struct param_d *param, void *priv)
@@ -326,12 +330,21 @@ int eth_register(struct eth_device *edev)
}
strcpy(edev->dev.name, "eth");
- edev->dev.id = DEVICE_ID_DYNAMIC;
if (edev->parent)
edev->dev.parent = edev->parent;
- register_device(&edev->dev);
+ if (edev->dev.parent && edev->dev.parent->device_node) {
+ edev->dev.id = of_alias_get_id(edev->dev.parent->device_node, "ethernet");
+ if (edev->dev.id < 0)
+ edev->dev.id = DEVICE_ID_DYNAMIC;
+ } else {
+ edev->dev.id = DEVICE_ID_DYNAMIC;
+ }
+
+ ret = register_device(&edev->dev);
+ if (ret)
+ return ret;
dev_add_param_ip(dev, "ipaddr", NULL, NULL, &edev->ipaddr, edev);
dev_add_param_ip(dev, "serverip", NULL, NULL, &edev->serverip, edev);
diff --git a/net/ifup.c b/net/ifup.c
index 2315952eba..2e59025035 100644
--- a/net/ifup.c
+++ b/net/ifup.c
@@ -58,6 +58,8 @@ int ifup(const char *name, unsigned flags)
if (edev && edev->ipaddr && !(flags & IFUP_FLAG_FORCE))
return 0;
+ eth_set_current(edev);
+
env_push_context();
setenv("ip", "");
diff --git a/net/net.c b/net/net.c
index 00bc73a03c..07350ad8fb 100644
--- a/net/net.c
+++ b/net/net.c
@@ -241,7 +241,7 @@ static int arp_request(IPaddr_t dest, unsigned char *ether)
arp_ether = ether;
- ret = eth_send(arp_packet, ETHER_HDR_SIZE + ARP_HDR_SIZE);
+ ret = eth_send(edev, arp_packet, ETHER_HDR_SIZE + ARP_HDR_SIZE);
if (ret)
return ret;
arp_start = get_time_ns();
@@ -253,7 +253,7 @@ static int arp_request(IPaddr_t dest, unsigned char *ether)
if (is_timeout(arp_start, 3 * SECOND)) {
printf("T ");
arp_start = get_time_ns();
- ret = eth_send(arp_packet, ETHER_HDR_SIZE + ARP_HDR_SIZE);
+ ret = eth_send(edev, arp_packet, ETHER_HDR_SIZE + ARP_HDR_SIZE);
if (ret)
return ret;
retries++;
@@ -358,6 +358,7 @@ static struct net_connection *net_new(IPaddr_t dest, rx_handler_f *handler,
con = xzalloc(sizeof(*con));
con->packet = net_alloc_packet();
con->priv = ctx;
+ con->edev = edev;
memset(con->packet, 0, PKTSIZE);
con->et = (struct ethernet *)con->packet;
@@ -437,7 +438,7 @@ static int net_ip_send(struct net_connection *con, int len)
con->ip->check = 0;
con->ip->check = ~net_checksum((unsigned char *)con->ip, sizeof(struct iphdr));
- return eth_send(con->packet, ETHER_HDR_SIZE + sizeof(struct iphdr) + len);
+ return eth_send(con->edev, con->packet, ETHER_HDR_SIZE + sizeof(struct iphdr) + len);
}
int net_udp_send(struct net_connection *con, int len)
@@ -480,7 +481,7 @@ static int net_answer_arp(unsigned char *pkt, int len)
if (!packet)
return 0;
memcpy(packet, pkt, ETHER_HDR_SIZE + ARP_HDR_SIZE);
- ret = eth_send(packet, ETHER_HDR_SIZE + ARP_HDR_SIZE);
+ ret = eth_send(edev, packet, ETHER_HDR_SIZE + ARP_HDR_SIZE);
free(packet);
return ret;
@@ -497,9 +498,8 @@ static void net_bad_packet(unsigned char *pkt, int len)
#endif
}
-static int net_handle_arp(unsigned char *pkt, int len)
+static int net_handle_arp(struct eth_device *edev, unsigned char *pkt, int len)
{
- struct eth_device *edev = eth_get_current();
struct arprequest *arp;
debug("%s: got arp\n", __func__);
@@ -580,10 +580,9 @@ static int net_handle_icmp(unsigned char *pkt, int len)
return 0;
}
-static int net_handle_ip(unsigned char *pkt, int len)
+static int net_handle_ip(struct eth_device *edev, unsigned char *pkt, int len)
{
struct iphdr *ip = (struct iphdr *)(pkt + ETHER_HDR_SIZE);
- struct eth_device *edev = eth_get_current();
IPaddr_t tmp;
debug("%s\n", __func__);
@@ -619,7 +618,7 @@ bad:
return 0;
}
-int net_receive(unsigned char *pkt, int len)
+int net_receive(struct eth_device *edev, unsigned char *pkt, int len)
{
struct ethernet *et = (struct ethernet *)pkt;
int et_protlen = ntohs(et->et_protlen);
@@ -634,10 +633,10 @@ int net_receive(unsigned char *pkt, int len)
switch (et_protlen) {
case PROT_ARP:
- ret = net_handle_arp(pkt, len);
+ ret = net_handle_arp(edev, pkt, len);
break;
case PROT_IP:
- ret = net_handle_ip(pkt, len);
+ ret = net_handle_ip(edev, pkt, len);
break;
default:
debug("%s: got unknown protocol type: %d\n", __func__, et_protlen);