summaryrefslogtreecommitdiffstats
path: root/include/usb_ether.h
blob: 51fce4e95dc5c1caa410c7202cfa75bb08329011 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/*
 * Copyright (c) 2011 The Chromium OS Authors.
 *
 * SPDX-License-Identifier:	GPL-2.0+
 */

#ifndef __USB_ETHER_H__
#define __USB_ETHER_H__

#include <net.h>

/*
 *	IEEE 802.3 Ethernet magic constants.  The frame sizes omit the preamble
 *	and FCS/CRC (frame check sequence).
 */
#define ETH_ALEN	6		/* Octets in one ethernet addr	 */
#define ETH_HLEN	14		/* Total octets in header.	 */
#define ETH_ZLEN	60		/* Min. octets in frame sans FCS */
#define ETH_DATA_LEN	1500		/* Max. octets in payload	 */
#define ETH_FRAME_LEN	PKTSIZE_ALIGN	/* Max. octets in frame sans FCS */

/* TODO(sjg@chromium.org): Remove @pusb_dev when all boards use CONFIG_DM_ETH */
struct ueth_data {
	/* eth info */
#ifdef CONFIG_DM_ETH
	uint8_t *rxbuf;
	int rxsize;
	int rxlen;			/* Total bytes available in rxbuf */
	int rxptr;			/* Current position in rxbuf */
#else
	struct eth_device eth_dev;	/* used with eth_register */
	/* driver private */
	void *dev_priv;
#endif
	int phy_id;			/* mii phy id */

	/* usb info */
	struct usb_device *pusb_dev;	/* this usb_device */
	unsigned char	ifnum;		/* interface number */
	unsigned char	ep_in;		/* in endpoint */
	unsigned char	ep_out;		/* out ....... */
	unsigned char	ep_int;		/* interrupt . */
	unsigned char	subclass;	/* as in overview */
	unsigned char	protocol;	/* .............. */
	unsigned char	irqinterval;	/* Intervall for IRQ Pipe */
};

#ifdef CONFIG_DM_ETH
/**
 * usb_ether_register() - register a new USB ethernet device
 *
 * This selects the correct USB interface and figures out the endpoints to use.
 *
 * @dev:	USB device
 * @ss:		Place to put USB ethernet data
 * @rxsize:	Maximum size to allocate for the receive buffer
 * @return 0 if OK, -ve on error
 */
int usb_ether_register(struct udevice *dev, struct ueth_data *ueth, int rxsize);

/**
 * usb_ether_deregister() - deregister a USB ethernet device
 *
 * @ueth:	USB Ethernet device
 * @return 0
 */
int usb_ether_deregister(struct ueth_data *ueth);

/**
 * usb_ether_receive() - recieve a packet from the bulk in endpoint
 *
 * The packet is stored in the internal buffer ready for processing.
 *
 * @ueth:	USB Ethernet device
 * @rxsize:	Maximum size to receive
 * @return 0 if a packet was received, -EAGAIN if not, -ENOSPC if @rxsize is
 * larger than the size passed ot usb_ether_register(), other -ve on error
 */
int usb_ether_receive(struct ueth_data *ueth, int rxsize);

/**
 * usb_ether_get_rx_bytes() - obtain bytes from the internal packet buffer
 *
 * This should be called repeatedly to obtain packet data until it returns 0.
 * After each packet is processed, call usb_ether_advance_rxbuf() to move to
 * the next one.
 *
 * @ueth:	USB Ethernet device
 * @ptrp:	Returns a pointer to the start of the next packet if there is
 *		one available
 * @return number of bytes available, or 0 if none
 */
int usb_ether_get_rx_bytes(struct ueth_data *ueth, uint8_t **ptrp);

/**
 * usb_ether_advance_rxbuf() - Advance to the next packet in the internal buffer
 *
 * After processing the data returned by usb_ether_get_rx_bytes(), call this
 * function to move to the next packet. You must specify the number of bytes
 * you have processed in @num_bytes.
 *
 * @ueth:	USB Ethernet device
 * @num_bytes:	Number of bytes to skip, or -1 to skip all bytes
 */
void usb_ether_advance_rxbuf(struct ueth_data *ueth, int num_bytes);
#else
/*
 * Function definitions for each USB ethernet driver go here
 * (declaration is unconditional, compilation is conditional)
 */
void asix_eth_before_probe(void);
int asix_eth_probe(struct usb_device *dev, unsigned int ifnum,
		      struct ueth_data *ss);
int asix_eth_get_info(struct usb_device *dev, struct ueth_data *ss,
		      struct eth_device *eth);

void ax88179_eth_before_probe(void);
int ax88179_eth_probe(struct usb_device *dev, unsigned int ifnum,
		      struct ueth_data *ss);
int ax88179_eth_get_info(struct usb_device *dev, struct ueth_data *ss,
		      struct eth_device *eth);

void mcs7830_eth_before_probe(void);
int mcs7830_eth_probe(struct usb_device *dev, unsigned int ifnum,
		      struct ueth_data *ss);
int mcs7830_eth_get_info(struct usb_device *dev, struct ueth_data *ss,
			 struct eth_device *eth);

void smsc95xx_eth_before_probe(void);
int smsc95xx_eth_probe(struct usb_device *dev, unsigned int ifnum,
			struct ueth_data *ss);
int smsc95xx_eth_get_info(struct usb_device *dev, struct ueth_data *ss,
			struct eth_device *eth);

void r8152_eth_before_probe(void);
int r8152_eth_probe(struct usb_device *dev, unsigned int ifnum,
		    struct ueth_data *ss);
int r8152_eth_get_info(struct usb_device *dev, struct ueth_data *ss,
		       struct eth_device *eth);
#endif

#endif /* __USB_ETHER_H__ */