diff options
author | Sascha Hauer <s.hauer@pengutronix.de> | 2014-06-04 21:03:45 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2014-06-04 21:03:45 +0200 |
commit | a3dfea9af8d31d27b0d9957965d1056912041321 (patch) | |
tree | 3b25fbb33a1f74d69ba7fa5b350bf406cdb1596d /net | |
parent | 6331e58a2c99009587eeb2252d0c6ac9de882c1c (diff) | |
parent | 15b0abce264be775aa63dc0de9c74d39529baf84 (diff) | |
download | barebox-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.c | 71 | ||||
-rw-r--r-- | net/ifup.c | 2 | ||||
-rw-r--r-- | net/net.c | 21 |
3 files changed, 54 insertions, 40 deletions
@@ -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", ""); @@ -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); |