xref: /openbmc/u-boot/api/api_net.c (revision 6f94fa21cc7552dae9bf452e12eaa85c8897fcbb)
1  /*
2   * (C) Copyright 2007 Semihalf
3   *
4   * Written by: Rafal Jaworowski <raj@semihalf.com>
5   *
6   * SPDX-License-Identifier:	GPL-2.0+
7   */
8  
9  #include <config.h>
10  #include <common.h>
11  #include <net.h>
12  #include <linux/types.h>
13  #include <api_public.h>
14  
15  DECLARE_GLOBAL_DATA_PTR;
16  
17  #define DEBUG
18  #undef DEBUG
19  
20  #ifdef DEBUG
21  #define debugf(fmt, args...) do { printf("%s(): ", __func__); printf(fmt, ##args); } while (0)
22  #else
23  #define debugf(fmt, args...)
24  #endif
25  
26  #define errf(fmt, args...) do { printf("ERROR @ %s(): ", __func__); printf(fmt, ##args); } while (0)
27  
28  #if defined(CONFIG_CMD_NET) && !defined(CONFIG_DM_ETH)
29  
30  static int dev_valid_net(void *cookie)
31  {
32  	return ((void *)eth_get_dev() == cookie) ? 1 : 0;
33  }
34  
35  int dev_open_net(void *cookie)
36  {
37  	if (!dev_valid_net(cookie))
38  		return API_ENODEV;
39  
40  	if (eth_init() < 0)
41  		return API_EIO;
42  
43  	return 0;
44  }
45  
46  int dev_close_net(void *cookie)
47  {
48  	if (!dev_valid_net(cookie))
49  		return API_ENODEV;
50  
51  	eth_halt();
52  	return 0;
53  }
54  
55  /*
56   * There can only be one active eth interface at a time - use what is
57   * currently set to eth_current
58   */
59  int dev_enum_net(struct device_info *di)
60  {
61  	struct eth_device *eth_current = eth_get_dev();
62  
63  	di->type = DEV_TYP_NET;
64  	di->cookie = (void *)eth_current;
65  	if (di->cookie == NULL)
66  		return 0;
67  
68  	memcpy(di->di_net.hwaddr, eth_current->enetaddr, 6);
69  
70  	debugf("device found, returning cookie 0x%08x\n",
71  		(u_int32_t)di->cookie);
72  
73  	return 1;
74  }
75  
76  int dev_write_net(void *cookie, void *buf, int len)
77  {
78  	/* XXX verify that cookie points to a valid net device??? */
79  
80  	return eth_send(buf, len);
81  }
82  
83  int dev_read_net(void *cookie, void *buf, int len)
84  {
85  	/* XXX verify that cookie points to a valid net device??? */
86  
87  	return eth_receive(buf, len);
88  }
89  
90  #else
91  
92  int dev_open_net(void *cookie)
93  {
94  	return API_ENODEV;
95  }
96  
97  int dev_close_net(void *cookie)
98  {
99  	return API_ENODEV;
100  }
101  
102  int dev_enum_net(struct device_info *di)
103  {
104  	return 0;
105  }
106  
107  int dev_write_net(void *cookie, void *buf, int len)
108  {
109  	return API_ENODEV;
110  }
111  
112  int dev_read_net(void *cookie, void *buf, int len)
113  {
114  	return API_ENODEV;
115  }
116  
117  #endif
118