/*
 * Copyright 2013 Google Inc.
 *
 * See file CREDITS for list of people who contributed to this
 * project.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but without any warranty; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 * MA 02111-1307 USA
 */

#include <assert.h>
#include <stdio.h>

#include "base/time.h"
#include "drivers/net/net.h"
#include "net/ethernet.h"

ListNode net_pollers;
static ListNode net_devices;

void net_add_device(NetDevice *dev)
{
	/* Just in case, see if it has been already added. */
	NetDevice *list_dev;
	list_for_each(list_dev, net_devices, list_node)
		if (dev == list_dev) {
			printf("%s: Attemp to include the same device\n",
			       __func__);
			return;
		}

	printf("Adding net device\n");
	list_insert_after(&dev->list_node, &net_devices);
}

void net_remove_device(NetDevice *dev)
{
	list_remove(&dev->list_node);
}

void net_find_devices(void)
{
	NetPoller *net_poller;
	list_for_each(net_poller, net_pollers, list_node)
		net_poller->poll(net_poller);
}

NetDevice *net_scan_for_link(NetDevice *last)
{
	ListNode *devices = last ? &last->list_node : &net_devices;

	NetDevice *dev;
	list_for_each(dev, *devices, list_node) {
		int ready;
		if (dev->ready(dev, &ready))
			continue;
		if (ready)
			return dev;
	}
	return NULL;
}
