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 
10 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
11 FILE_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 */
96 struct dm96xx_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  */
116 static inline __attribute__ (( always_inline )) int
117 dm96xx_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  */
131 static inline __attribute__ (( always_inline )) int
132 dm96xx_read_register ( struct dm96xx_device *dm96xx, unsigned int offset ) {
133  uint8_t value;
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  */
151 static inline __attribute__ (( always_inline )) int
152 dm96xx_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  */
167 static inline __attribute__ (( always_inline )) int
168 dm96xx_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 __attribute__(x)
Definition: compiler.h:10
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
unsigned short uint16_t
Definition: stdint.h:11
static int dm96xx_write_registers(struct dm96xx_device *dm96xx, unsigned int offset, void *data, size_t len)
Write registers.
Definition: dm96xx.h:152
FILE_SECBOOT(PERMITTED)
struct usb_device * usb
USB device.
Definition: dm96xx.h:98
struct usb_bus * bus
USB bus.
Definition: dm96xx.h:100
FILE_LICENCE(GPL2_OR_LATER_OR_UBDL)
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
uint8_t rocr
Receive overflow counter register.
Definition: dm96xx.h:72
pseudo_bit_t value[0x00020]
Definition: arbel.h:13
uint8_t tsr[2]
Transmit status registers.
Definition: dm96xx.h:68
DM96xx interrupt data.
Definition: dm96xx.h:64
ring len
Length.
Definition: dwmac.h:231
uint16_t len
Packet length (excluding this header)
Definition: dm96xx.h:92
static int dm96xx_read_register(struct dm96xx_device *dm96xx, unsigned int offset)
Read register.
Definition: dm96xx.h:132
A USB device.
Definition: usb.h:723
static int dm96xx_write_register(struct dm96xx_device *dm96xx, unsigned int offset, uint8_t value)
Write register.
Definition: dm96xx.h:168
A USB network device.
Definition: usbnet.h:16
A network device.
Definition: netdevice.h:353
unsigned char uint8_t
Definition: stdint.h:10
#define DM96XX_WRITE_REGISTER
Write register(s)
Definition: dm96xx.h:23
uint8_t txc
Transmit packet counter.
Definition: dm96xx.h:76
uint8_t rsr
Receive status register.
Definition: dm96xx.h:70
DM96xx receive header.
Definition: dm96xx.h:82
USB network devices.
struct net_device * netdev
Network device.
Definition: dm96xx.h:102
DM96xx transmit header.
Definition: dm96xx.h:90
Universal Serial Bus (USB)
#define DM96XX_READ_REGISTER
Read register(s)
Definition: dm96xx.h:18
A DM96xx network device.
Definition: dm96xx.h:96
uint8_t data[48]
Additional event data.
Definition: ena.h:22
uint8_t rxc
Receive packet counter.
Definition: dm96xx.h:74
uint8_t rsr
Packet status.
Definition: dm96xx.h:84
uint16_t offset
Offset to command line.
Definition: bzimage.h:8
uint8_t gpr
General purpose register.
Definition: dm96xx.h:78
#define DM96XX_WRITE1_REGISTER
Write single register.
Definition: dm96xx.h:28
uint8_t nsr
Network status register.
Definition: dm96xx.h:66
uint16_t len
Packet length (excluding this header, including CRC)
Definition: dm96xx.h:86
#define NULL
NULL pointer (VOID *)
Definition: Base.h:322
A USB bus.
Definition: usb.h:966
struct usbnet_device usbnet
USB network device.
Definition: dm96xx.h:104
static int dm96xx_read_registers(struct dm96xx_device *dm96xx, unsigned int offset, void *data, size_t len)
Read registers.
Definition: dm96xx.h:117