iPXE
dm96xx.h
Go to the documentation of this file.
1#ifndef _DM96XX_H
2#define _DM96XX_H
3
4/** @file
5 *
6 * Davicom DM96xx USB Ethernet driver
7 *
8 */
9
10FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
11FILE_SECBOOT ( PERMITTED );
12
13#include <ipxe/usb.h>
14#include <ipxe/usbnet.h>
15#include <ipxe/if_ether.h>
16
17/** Read register(s) */
18#define DM96XX_READ_REGISTER \
19 ( USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE | \
20 USB_REQUEST_TYPE ( 0x00 ) )
21
22/** Write register(s) */
23#define DM96XX_WRITE_REGISTER \
24 ( USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE | \
25 USB_REQUEST_TYPE ( 0x01 ) )
26
27/** Write single register */
28#define DM96XX_WRITE1_REGISTER \
29 ( USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE | \
30 USB_REQUEST_TYPE ( 0x03 ) )
31
32/** Network control register */
33#define DM96XX_NCR 0x00
34#define DM96XX_NCR_RST 0x01 /**< Software reset */
35
36/** Network status register */
37#define DM96XX_NSR 0x01
38#define DM96XX_NSR_LINKST 0x40 /**< Link status */
39
40/** Receive control register */
41#define DM96XX_RCR 0x05
42#define DM96XX_RCR_ALL 0x08 /**< Pass all multicast */
43#define DM96XX_RCR_RUNT 0x04 /**< Pass runt packet */
44#define DM96XX_RCR_PRMSC 0x02 /**< Promiscuous mode */
45#define DM96XX_RCR_RXEN 0x01 /**< RX enable */
46
47/** Receive status register */
48#define DM96XX_RSR 0x06
49#define DM96XX_RSR_MF 0x40 /**< Multicast frame */
50
51/** PHY address registers */
52#define DM96XX_PAR 0x10
53
54/** Chip revision register */
55#define DM96XX_CHIPR 0x2c
56#define DM96XX_CHIPR_9601 0x00 /**< DM9601 */
57#define DM96XX_CHIPR_9620 0x01 /**< DM9620 */
58
59/** RX header control/status register (DM9620+ only) */
60#define DM96XX_MODE_CTL 0x91
61#define DM96XX_MODE_CTL_MODE 0x80 /**< 4-byte header mode */
62
63/** DM96xx interrupt data */
65 /** Network status register */
67 /** Transmit status registers */
69 /** Receive status register */
71 /** Receive overflow counter register */
73 /** Receive packet counter */
75 /** Transmit packet counter */
77 /** General purpose register */
79} __attribute__ (( packed ));
80
81/** DM96xx receive header */
83 /** Packet status */
85 /** Packet length (excluding this header, including CRC) */
87} __attribute__ (( packed ));
88
89/** DM96xx transmit header */
91 /** Packet length (excluding this header) */
93} __attribute__ (( packed ));
94
95/** A DM96xx network device */
97 /** USB device */
98 struct usb_device *usb;
99 /** USB bus */
100 struct usb_bus *bus;
101 /** Network device */
103 /** USB network device */
105};
106
107/**
108 * Read registers
109 *
110 * @v dm96xx DM96xx device
111 * @v offset Register offset
112 * @v data Data buffer
113 * @v len Length of data
114 * @ret rc Return status code
115 */
116static inline __attribute__ (( always_inline )) int
117dm96xx_read_registers ( struct dm96xx_device *dm96xx, unsigned int offset,
118 void *data, size_t len ) {
119
120 return usb_control ( dm96xx->usb, DM96XX_READ_REGISTER, 0, offset,
121 data, len );
122}
123
124/**
125 * Read register
126 *
127 * @v dm96xx DM96xx device
128 * @v offset Register offset
129 * @ret value Register value, or negative error
130 */
131static inline __attribute__ (( always_inline )) int
132dm96xx_read_register ( struct dm96xx_device *dm96xx, unsigned int offset ) {
134 int rc;
135
136 if ( ( rc = dm96xx_read_registers ( dm96xx, offset, &value,
137 sizeof ( value ) ) ) != 0 )
138 return rc;
139 return value;
140}
141
142/**
143 * Write registers
144 *
145 * @v dm96xx DM96xx device
146 * @v offset Register offset
147 * @v data Data buffer
148 * @v len Length of data
149 * @ret rc Return status code
150 */
151static inline __attribute__ (( always_inline )) int
152dm96xx_write_registers ( struct dm96xx_device *dm96xx, unsigned int offset,
153 void *data, size_t len ) {
154
155 return usb_control ( dm96xx->usb, DM96XX_WRITE_REGISTER, 0, offset,
156 data, len );
157}
158
159/**
160 * Write register
161 *
162 * @v dm96xx DM96xx device
163 * @v offset Register offset
164 * @v value Register value
165 * @ret rc Return status code
166 */
167static inline __attribute__ (( always_inline )) int
168dm96xx_write_register ( struct dm96xx_device *dm96xx, unsigned int offset,
169 uint8_t value ) {
170
171 return usb_control ( dm96xx->usb, DM96XX_WRITE1_REGISTER, value,
172 offset, NULL, 0 );
173}
174
175/** Reset delay (in microseconds) */
176#define DM96XX_RESET_DELAY_US 10
177
178/** Interrupt maximum fill level
179 *
180 * This is a policy decision.
181 */
182#define DM96XX_INTR_MAX_FILL 2
183
184/** Bulk IN maximum fill level
185 *
186 * This is a policy decision.
187 */
188#define DM96XX_IN_MAX_FILL 8
189
190/** Bulk IN buffer size */
191#define DM96XX_IN_MTU \
192 ( 4 /* DM96xx header */ + ETH_FRAME_LEN + \
193 4 /* possible VLAN header */ + 4 /* CRC */ )
194
195#endif /* _DM96XX_H */
#define NULL
NULL pointer (VOID *)
Definition Base.h:322
struct arbelprm_rc_send_wqe rc
Definition arbel.h:3
pseudo_bit_t value[0x00020]
Definition arbel.h:2
unsigned short uint16_t
Definition stdint.h:11
unsigned char uint8_t
Definition stdint.h:10
uint16_t offset
Offset to command line.
Definition bzimage.h:3
#define DM96XX_READ_REGISTER
Read register(s)
Definition dm96xx.h:18
static int dm96xx_read_registers(struct dm96xx_device *dm96xx, unsigned int offset, void *data, size_t len)
Read registers.
Definition dm96xx.h:117
static int dm96xx_write_register(struct dm96xx_device *dm96xx, unsigned int offset, uint8_t value)
Write register.
Definition dm96xx.h:168
#define DM96XX_WRITE_REGISTER
Write register(s)
Definition dm96xx.h:23
static int dm96xx_read_register(struct dm96xx_device *dm96xx, unsigned int offset)
Read register.
Definition dm96xx.h:132
static int dm96xx_write_registers(struct dm96xx_device *dm96xx, unsigned int offset, void *data, size_t len)
Write registers.
Definition dm96xx.h:152
#define DM96XX_WRITE1_REGISTER
Write single register.
Definition dm96xx.h:28
ring len
Length.
Definition dwmac.h:226
uint8_t data[48]
Additional event data.
Definition ena.h:11
#define FILE_LICENCE(_licence)
Declare a particular licence as applying to a file.
Definition compiler.h:896
#define FILE_SECBOOT(_status)
Declare a file's UEFI Secure Boot permission status.
Definition compiler.h:926
#define __attribute__(x)
Definition compiler.h:10
Universal Serial Bus (USB)
A DM96xx network device.
Definition dm96xx.h:96
struct net_device * netdev
Network device.
Definition dm96xx.h:102
struct usb_bus * bus
USB bus.
Definition dm96xx.h:100
struct usb_device * usb
USB device.
Definition dm96xx.h:98
struct usbnet_device usbnet
USB network device.
Definition dm96xx.h:104
DM96xx interrupt data.
Definition dm96xx.h:64
uint8_t rocr
Receive overflow counter register.
Definition dm96xx.h:72
uint8_t tsr[2]
Transmit status registers.
Definition dm96xx.h:68
uint8_t nsr
Network status register.
Definition dm96xx.h:66
uint8_t txc
Transmit packet counter.
Definition dm96xx.h:76
uint8_t rxc
Receive packet counter.
Definition dm96xx.h:74
uint8_t gpr
General purpose register.
Definition dm96xx.h:78
uint8_t rsr
Receive status register.
Definition dm96xx.h:70
DM96xx receive header.
Definition dm96xx.h:82
uint8_t rsr
Packet status.
Definition dm96xx.h:84
uint16_t len
Packet length (excluding this header, including CRC)
Definition dm96xx.h:86
DM96xx transmit header.
Definition dm96xx.h:90
uint16_t len
Packet length (excluding this header)
Definition dm96xx.h:92
A network device.
Definition netdevice.h:353
A USB bus.
Definition usb.h:966
A USB device.
Definition usb.h:723
A USB network device.
Definition usbnet.h:16
int usb_control(struct usb_device *usb, unsigned int request, unsigned int value, unsigned int index, void *data, size_t len)
Issue USB control transaction.
Definition usb.c:784
USB network devices.