iPXE
Functions | Variables
axge.c File Reference

Asix 10/100/1000 USB Ethernet driver. More...

#include <stdint.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <ipxe/netdevice.h>
#include <ipxe/ethernet.h>
#include <ipxe/if_ether.h>
#include <ipxe/profile.h>
#include <ipxe/usb.h>
#include "axge.h"

Go to the source code of this file.

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
static int axge_read_register (struct axge_device *axge, unsigned int offset, void *data, size_t len)
 Read register. More...
 
static int axge_read_byte (struct axge_device *axge, unsigned int offset, uint8_t *value)
 Read one-byte register. More...
 
static int axge_read_word (struct axge_device *axge, unsigned int offset, uint16_t *value)
 Read two-byte register. More...
 
static int axge_read_dword (struct axge_device *axge, unsigned int offset, uint32_t *value)
 Read four-byte register. More...
 
static int axge_write_register (struct axge_device *axge, unsigned int offset, void *data, size_t len)
 Write register. More...
 
static int axge_write_byte (struct axge_device *axge, unsigned int offset, uint8_t value)
 Write one-byte register. More...
 
static int axge_write_word (struct axge_device *axge, unsigned int offset, uint16_t value)
 Write two-byte register. More...
 
static int axge_write_dword (struct axge_device *axge, unsigned int offset, uint32_t value)
 Write one-byte register. More...
 
static int axge_check_link (struct axge_device *axge)
 Get link status. More...
 
static void axge_intr_complete (struct usb_endpoint *ep, struct io_buffer *iobuf, int rc)
 Complete interrupt transfer. More...
 
static void axge_in_complete (struct usb_endpoint *ep, struct io_buffer *iobuf, int rc)
 Complete bulk IN transfer. More...
 
static int axge_out_transmit (struct axge_device *axge, struct io_buffer *iobuf)
 Transmit packet. More...
 
static void axge_out_complete (struct usb_endpoint *ep, struct io_buffer *iobuf, int rc)
 Complete bulk OUT transfer. More...
 
static int axge_open (struct net_device *netdev)
 Open network device. More...
 
static void axge_close (struct net_device *netdev)
 Close network device. More...
 
static int axge_transmit (struct net_device *netdev, struct io_buffer *iobuf)
 Transmit packet. More...
 
static void axge_poll (struct net_device *netdev)
 Poll for completed and received packets. More...
 
static int axge_probe (struct usb_function *func, struct usb_configuration_descriptor *config)
 Probe device. More...
 
static void axge_remove (struct usb_function *func)
 Remove device. More...
 

Variables

static struct profiler axge_intr_profiler __profiler
 Interrupt completion profiler. More...
 
static struct axge_bulk_in_control axge_bicr
 Default bulk IN configuration. More...
 
static struct usb_endpoint_driver_operations axge_intr_operations
 Interrupt endpoint operations. More...
 
static struct usb_endpoint_driver_operations axge_in_operations
 Bulk IN endpoint operations. More...
 
static struct usb_endpoint_driver_operations axge_out_operations
 Bulk OUT endpoint operations. More...
 
static struct net_device_operations axge_operations
 AXGE network device operations. More...
 
static struct usb_device_id axge_ids []
 AXGE device IDs. More...
 
struct usb_driver axge_driver __usb_driver
 AXGE driver. More...
 

Detailed Description

Asix 10/100/1000 USB Ethernet driver.

Large chunks of functionality are undocumented in the available datasheets. The gaps are deduced from combinations of the Linux driver, the FreeBSD driver, and experimentation with the hardware.

Definition in file axge.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ axge_read_register()

static int axge_read_register ( struct axge_device axge,
unsigned int  offset,
void *  data,
size_t  len 
)
inlinestatic

Read register.

Parameters
asixAXGE device
offsetRegister offset
dataData buffer
lenLength of data
Return values
rcReturn status code

Definition at line 91 of file axge.c.

93  {
94 
95  return usb_control ( axge->usb, AXGE_READ_MAC_REGISTER,
96  offset, len, data, len );
97 }
struct usb_device * usb
USB device.
Definition: axge.h:140
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:753
#define AXGE_READ_MAC_REGISTER
Read MAC register.
Definition: axge.h:16
static userptr_t size_t offset
Offset of the first segment within the content.
Definition: deflate.h:259
uint32_t len
Length.
Definition: ena.h:14
struct arbelprm_port_state_change_st data
Message.
Definition: arbel.h:12

References AXGE_READ_MAC_REGISTER, data, len, offset, axge_device::usb, and usb_control().

Referenced by axge_probe(), axge_read_byte(), axge_read_dword(), and axge_read_word().

◆ axge_read_byte()

static int axge_read_byte ( struct axge_device axge,
unsigned int  offset,
uint8_t value 
)
inlinestatic

Read one-byte register.

Parameters
asixAXGE device
offsetRegister offset
valueValue to fill in
Return values
rcReturn status code

Definition at line 107 of file axge.c.

108  {
109 
110  return axge_read_register ( axge, offset, value, sizeof ( *value ) );
111 }
static userptr_t size_t offset
Offset of the first segment within the content.
Definition: deflate.h:259
pseudo_bit_t value[0x00020]
Definition: arbel.h:13
static int axge_read_register(struct axge_device *axge, unsigned int offset, void *data, size_t len)
Read register.
Definition: axge.c:91

References axge_read_register(), offset, and value.

Referenced by axge_check_link().

◆ axge_read_word()

static int axge_read_word ( struct axge_device axge,
unsigned int  offset,
uint16_t value 
)
inlinestatic

Read two-byte register.

Parameters
asixAXGE device
offsetRegister offset
valueValue to fill in
Return values
rcReturn status code

Definition at line 121 of file axge.c.

122  {
123 
124  return axge_read_register ( axge, offset, value, sizeof ( *value ) );
125 }
static userptr_t size_t offset
Offset of the first segment within the content.
Definition: deflate.h:259
pseudo_bit_t value[0x00020]
Definition: arbel.h:13
static int axge_read_register(struct axge_device *axge, unsigned int offset, void *data, size_t len)
Read register.
Definition: axge.c:91

References axge_read_register(), offset, and value.

◆ axge_read_dword()

static int axge_read_dword ( struct axge_device axge,
unsigned int  offset,
uint32_t value 
)
inlinestatic

Read four-byte register.

Parameters
asixAXGE device
offsetRegister offset
valueValue to fill in
Return values
rcReturn status code

Definition at line 135 of file axge.c.

136  {
137 
138  return axge_read_register ( axge, offset, value, sizeof ( *value ) );
139 }
static userptr_t size_t offset
Offset of the first segment within the content.
Definition: deflate.h:259
pseudo_bit_t value[0x00020]
Definition: arbel.h:13
static int axge_read_register(struct axge_device *axge, unsigned int offset, void *data, size_t len)
Read register.
Definition: axge.c:91

References axge_read_register(), offset, and value.

◆ axge_write_register()

static int axge_write_register ( struct axge_device axge,
unsigned int  offset,
void *  data,
size_t  len 
)
inlinestatic

Write register.

Parameters
asixAXGE device
offsetRegister offset
dataData buffer
lenLength of data
Return values
rcReturn status code

Definition at line 150 of file axge.c.

152  {
153 
154  return usb_control ( axge->usb, AXGE_WRITE_MAC_REGISTER,
155  offset, len, data, len );
156 }
struct usb_device * usb
USB device.
Definition: axge.h:140
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:753
static userptr_t size_t offset
Offset of the first segment within the content.
Definition: deflate.h:259
#define AXGE_WRITE_MAC_REGISTER
Write MAC register.
Definition: axge.h:21
uint32_t len
Length.
Definition: ena.h:14
struct arbelprm_port_state_change_st data
Message.
Definition: arbel.h:12

References AXGE_WRITE_MAC_REGISTER, data, len, offset, axge_device::usb, and usb_control().

Referenced by axge_open(), axge_probe(), axge_write_byte(), axge_write_dword(), and axge_write_word().

◆ axge_write_byte()

static int axge_write_byte ( struct axge_device axge,
unsigned int  offset,
uint8_t  value 
)
inlinestatic

Write one-byte register.

Parameters
asixAXGE device
offsetRegister offset
valueValue
Return values
rcReturn status code

Definition at line 166 of file axge.c.

167  {
168 
169  return axge_write_register ( axge, offset, &value, sizeof ( value ));
170 }
static userptr_t size_t offset
Offset of the first segment within the content.
Definition: deflate.h:259
pseudo_bit_t value[0x00020]
Definition: arbel.h:13
static int axge_write_register(struct axge_device *axge, unsigned int offset, void *data, size_t len)
Write register.
Definition: axge.c:150

References axge_write_register(), offset, and value.

Referenced by axge_probe().

◆ axge_write_word()

static int axge_write_word ( struct axge_device axge,
unsigned int  offset,
uint16_t  value 
)
inlinestatic

Write two-byte register.

Parameters
asixAXGE device
offsetRegister offset
valueValue
Return values
rcReturn status code

Definition at line 180 of file axge.c.

181  {
182 
183  return axge_write_register ( axge, offset, &value, sizeof ( value ));
184 }
static userptr_t size_t offset
Offset of the first segment within the content.
Definition: deflate.h:259
pseudo_bit_t value[0x00020]
Definition: arbel.h:13
static int axge_write_register(struct axge_device *axge, unsigned int offset, void *data, size_t len)
Write register.
Definition: axge.c:150

References axge_write_register(), offset, and value.

Referenced by axge_close(), axge_open(), and axge_probe().

◆ axge_write_dword()

static int axge_write_dword ( struct axge_device axge,
unsigned int  offset,
uint32_t  value 
)
inlinestatic

Write one-byte register.

Parameters
asixAXGE device
offsetRegister offset
valueValue
Return values
rcReturn status code

Definition at line 194 of file axge.c.

195  {
196 
197  return axge_write_register ( axge, offset, &value, sizeof ( value ));
198 }
static userptr_t size_t offset
Offset of the first segment within the content.
Definition: deflate.h:259
pseudo_bit_t value[0x00020]
Definition: arbel.h:13
static int axge_write_register(struct axge_device *axge, unsigned int offset, void *data, size_t len)
Write register.
Definition: axge.c:150

References axge_write_register(), offset, and value.

◆ axge_check_link()

static int axge_check_link ( struct axge_device axge)
static

Get link status.

Parameters
asixAXGE device
Return values
rcReturn status code

Definition at line 213 of file axge.c.

213  {
214  struct net_device *netdev = axge->netdev;
215  uint8_t plsr;
216  int rc;
217 
218  /* Read physical link status register */
219  if ( ( rc = axge_read_byte ( axge, AXGE_PLSR, &plsr ) ) != 0 ) {
220  DBGC ( axge, "AXGE %p could not read PLSR: %s\n",
221  axge, strerror ( rc ) );
222  return rc;
223  }
224 
225  /* Update link status */
226  if ( plsr & AXGE_PLSR_EPHY_ANY ) {
227  DBGC ( axge, "AXGE %p link up (PLSR %02x)\n", axge, plsr );
229  } else {
230  DBGC ( axge, "AXGE %p link down (PLSR %02x)\n", axge, plsr );
232  }
233 
234  return 0;
235 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
static int axge_read_byte(struct axge_device *axge, unsigned int offset, uint8_t *value)
Read one-byte register.
Definition: axge.c:107
#define DBGC(...)
Definition: compiler.h:505
void netdev_link_down(struct net_device *netdev)
Mark network device as having link down.
Definition: netdevice.c:186
#define AXGE_PLSR
Physical Link Status Register.
Definition: axge.h:26
struct net_device * netdev
Network device.
Definition: axge.h:144
static void netdev_link_up(struct net_device *netdev)
Mark network device as having link up.
Definition: netdevice.h:768
static struct net_device * netdev
Definition: gdbudp.c:52
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
A network device.
Definition: netdevice.h:348
unsigned char uint8_t
Definition: stdint.h:10
#define AXGE_PLSR_EPHY_ANY
Definition: axge.h:30

References AXGE_PLSR, AXGE_PLSR_EPHY_ANY, axge_read_byte(), DBGC, netdev, axge_device::netdev, netdev_link_down(), netdev_link_up(), rc, and strerror().

Referenced by axge_open(), and axge_probe().

◆ axge_intr_complete()

static void axge_intr_complete ( struct usb_endpoint ep,
struct io_buffer iobuf,
int  rc 
)
static

Complete interrupt transfer.

Parameters
epUSB endpoint
iobufI/O buffer
rcCompletion status code

Definition at line 251 of file axge.c.

252  {
253  struct axge_device *axge = container_of ( ep, struct axge_device,
254  usbnet.intr );
255  struct net_device *netdev = axge->netdev;
256  struct axge_interrupt *intr;
257  size_t len = iob_len ( iobuf );
258  unsigned int link_ok;
259 
260  /* Profile completions */
261  profile_start ( &axge_intr_profiler );
262 
263  /* Ignore packets cancelled when the endpoint closes */
264  if ( ! ep->open )
265  goto ignore;
266 
267  /* Drop packets with errors */
268  if ( rc != 0 ) {
269  DBGC ( axge, "AXGE %p interrupt failed: %s\n",
270  axge, strerror ( rc ) );
271  DBGC_HDA ( axge, 0, iobuf->data, iob_len ( iobuf ) );
272  goto error;
273  }
274 
275  /* Extract message header */
276  if ( len < sizeof ( *intr ) ) {
277  DBGC ( axge, "AXGE %p underlength interrupt:\n", axge );
278  DBGC_HDA ( axge, 0, iobuf->data, iob_len ( iobuf ) );
279  rc = -EINVAL;
280  goto error;
281  }
282  intr = iobuf->data;
283 
284  /* Check magic signature */
285  if ( intr->magic != cpu_to_le16 ( AXGE_INTR_MAGIC ) ) {
286  DBGC ( axge, "AXGE %p malformed interrupt:\n", axge );
287  DBGC_HDA ( axge, 0, iobuf->data, iob_len ( iobuf ) );
288  rc = -EINVAL;
289  goto error;
290  }
291 
292  /* Extract link status */
293  link_ok = ( intr->link & cpu_to_le16 ( AXGE_INTR_LINK_PPLS ) );
294  if ( link_ok && ! netdev_link_ok ( netdev ) ) {
295  DBGC ( axge, "AXGE %p link up\n", axge );
297  } else if ( netdev_link_ok ( netdev ) && ! link_ok ) {
298  DBGC ( axge, "AXGE %p link down\n", axge );
300  }
301 
302  /* Free I/O buffer */
303  free_iob ( iobuf );
304  profile_stop ( &axge_intr_profiler );
305 
306  return;
307 
308  error:
309  netdev_rx_err ( netdev, iob_disown ( iobuf ), rc );
310  ignore:
311  free_iob ( iobuf );
312  return;
313 }
#define EINVAL
Invalid argument.
Definition: errno.h:428
#define AXGE_INTR_MAGIC
Interrupt magic signature.
Definition: axge.h:132
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
void netdev_rx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard received packet.
Definition: netdevice.c:501
Interrupt data.
Definition: axge.h:120
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition: iobuf.c:145
struct arbelprm_completion_with_error error
Definition: arbel.h:12
#define DBGC(...)
Definition: compiler.h:505
void netdev_link_down(struct net_device *netdev)
Mark network device as having link down.
Definition: netdevice.c:186
int open
Endpoint is open.
Definition: usb.h:404
static void profile_stop(struct profiler *profiler)
Stop profiling.
Definition: profile.h:171
struct usb_endpoint intr
Interrupt endpoint.
Definition: usbnet.h:27
An AXGE network device.
Definition: axge.h:138
#define iob_disown(iobuf)
Disown an I/O buffer.
Definition: iobuf.h:208
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
uint8_t intr
Interrupts enabled.
Definition: ena.h:14
struct net_device * netdev
Network device.
Definition: axge.h:144
#define DBGC_HDA(...)
Definition: compiler.h:506
static void netdev_link_up(struct net_device *netdev)
Mark network device as having link up.
Definition: netdevice.h:768
static int netdev_link_ok(struct net_device *netdev)
Check link state of network device.
Definition: netdevice.h:630
static struct net_device * netdev
Definition: gdbudp.c:52
static void profile_start(struct profiler *profiler)
Start profiling.
Definition: profile.h:158
#define AXGE_INTR_LINK_PPLS
Link is up.
Definition: axge.h:135
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition: iobuf.h:151
A network device.
Definition: netdevice.h:348
uint32_t len
Length.
Definition: ena.h:14
void * data
Start of data.
Definition: iobuf.h:44
#define cpu_to_le16(value)
Definition: byteswap.h:106
struct usbnet_device usbnet
USB network device.
Definition: axge.h:146

References AXGE_INTR_LINK_PPLS, AXGE_INTR_MAGIC, container_of, cpu_to_le16, io_buffer::data, DBGC, DBGC_HDA, EINVAL, error, free_iob(), intr, usbnet_device::intr, iob_disown, iob_len(), len, netdev, axge_device::netdev, netdev_link_down(), netdev_link_ok(), netdev_link_up(), netdev_rx_err(), usb_endpoint::open, profile_start(), profile_stop(), rc, strerror(), and axge_device::usbnet.

◆ axge_in_complete()

static void axge_in_complete ( struct usb_endpoint ep,
struct io_buffer iobuf,
int  rc 
)
static

Complete bulk IN transfer.

Parameters
epUSB endpoint
iobufI/O buffer
rcCompletion status code

Definition at line 334 of file axge.c.

335  {
336  struct axge_device *axge = container_of ( ep, struct axge_device,
337  usbnet.in );
338  struct net_device *netdev = axge->netdev;
339  struct axge_rx_footer *ftr;
340  struct axge_rx_descriptor *desc;
341  struct io_buffer *pkt;
342  unsigned int count;
343  unsigned int offset;
344  size_t len;
345  size_t padded_len;
346 
347  /* Profile receive completions */
348  profile_start ( &axge_in_profiler );
349 
350  /* Ignore packets cancelled when the endpoint closes */
351  if ( ! ep->open )
352  goto ignore;
353 
354  /* Record USB errors against the network device */
355  if ( rc != 0 ) {
356  DBGC ( axge, "AXGE %p bulk IN failed: %s\n",
357  axge, strerror ( rc ) );
358  goto error;
359  }
360 
361  /* Sanity check */
362  if ( iob_len ( iobuf ) < sizeof ( *ftr ) ) {
363  DBGC ( axge, "AXGE %p underlength bulk IN:\n", axge );
364  DBGC_HDA ( axge, 0, iobuf->data, iob_len ( iobuf ) );
365  rc = -EINVAL;
366  goto error;
367  }
368 
369  /* Parse ftr, strip ftr and descriptors */
370  iob_unput ( iobuf, sizeof ( *ftr ) );
371  ftr = ( iobuf->data + iob_len ( iobuf ) );
372  count = le16_to_cpu ( ftr->count );
373  if ( count == 0 ) {
374  DBGC ( axge, "AXGE %p zero-packet bulk IN:\n", axge );
375  DBGC_HDA ( axge, 0, iobuf->data, iob_len ( iobuf ) );
376  goto ignore;
377  }
378  offset = le16_to_cpu ( ftr->offset );
379  if ( ( iob_len ( iobuf ) < offset ) ||
380  ( ( iob_len ( iobuf ) - offset ) < ( count * sizeof ( *desc ) ) )){
381  DBGC ( axge, "AXGE %p malformed bulk IN footer:\n", axge );
382  DBGC_HDA ( axge, 0, iobuf->data, iob_len ( iobuf ) );
383  rc = -EINVAL;
384  goto error;
385  }
386  desc = ( iobuf->data + offset );
387  iob_unput ( iobuf, ( iob_len ( iobuf ) - offset ) );
388 
389  /* Process packets */
390  for ( ; count-- ; desc++ ) {
391 
392  /* Parse descriptor */
393  len = ( le16_to_cpu ( desc->len_flags ) & AXGE_RX_LEN_MASK );
394  padded_len = ( ( len + AXGE_RX_LEN_PAD_ALIGN - 1 ) &
395  ~( AXGE_RX_LEN_PAD_ALIGN - 1 ) );
396  if ( iob_len ( iobuf ) < padded_len ) {
397  DBGC ( axge, "AXGE %p malformed bulk IN descriptor:\n",
398  axge );
399  DBGC_HDA ( axge, 0, iobuf->data, iob_len ( iobuf ) );
400  rc = -EINVAL;
401  goto error;
402  }
403 
404  /* Check for previous dropped packets */
405  if ( desc->len_flags & cpu_to_le16 ( AXGE_RX_CRC_ERROR ) )
406  netdev_rx_err ( netdev, NULL, -EIO );
407  if ( desc->len_flags & cpu_to_le16 ( AXGE_RX_DROP_ERROR ) )
409 
410  /* Allocate new I/O buffer, if applicable */
411  if ( count ) {
412 
413  /* More packets remain: allocate a new buffer */
414  pkt = alloc_iob ( AXGE_IN_RESERVE + len );
415  if ( ! pkt ) {
416  /* Record error and continue */
418  iob_pull ( iobuf, padded_len );
419  continue;
420  }
421  iob_reserve ( pkt, AXGE_IN_RESERVE );
422  memcpy ( iob_put ( pkt, len ), iobuf->data, len );
423  iob_pull ( iobuf, padded_len );
424 
425  } else {
426 
427  /* This is the last (or only) packet: use this buffer */
428  iob_unput ( iobuf, ( padded_len - len ) );
429  pkt = iob_disown ( iobuf );
430  }
431 
432  /* Hand off to network stack */
433  netdev_rx ( netdev, iob_disown ( pkt ) );
434  }
435 
436  assert ( iobuf == NULL );
437  profile_stop ( &axge_in_profiler );
438  return;
439 
440  error:
441  netdev_rx_err ( netdev, iob_disown ( iobuf ), rc );
442  ignore:
443  free_iob ( iobuf );
444 }
#define iob_pull(iobuf, len)
Definition: iobuf.h:98
#define EINVAL
Invalid argument.
Definition: errno.h:428
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define iob_put(iobuf, len)
Definition: iobuf.h:116
void netdev_rx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard received packet.
Definition: netdevice.c:501
#define AXGE_RX_DROP_ERROR
Receive packet dropped error.
Definition: axge.h:117
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition: iobuf.c:145
struct arbelprm_completion_with_error error
Definition: arbel.h:12
#define DBGC(...)
Definition: compiler.h:505
#define AXGE_IN_RESERVE
Amount of space to reserve at start of bulk IN buffers.
Definition: axge.h:172
#define AXGE_RX_CRC_ERROR
Receive packet CRC error.
Definition: axge.h:114
#define AXGE_RX_LEN_PAD_ALIGN
Receive packet length alignment.
Definition: axge.h:111
int open
Endpoint is open.
Definition: usb.h:404
static void profile_stop(struct profiler *profiler)
Stop profiling.
Definition: profile.h:171
struct io_buffer * alloc_iob(size_t len)
Allocate I/O buffer.
Definition: iobuf.c:128
An AXGE network device.
Definition: axge.h:138
#define ENOMEM
Not enough space.
Definition: errno.h:534
#define iob_disown(iobuf)
Disown an I/O buffer.
Definition: iobuf.h:208
void * memcpy(void *dest, const void *src, size_t len) __nonnull
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
struct net_device * netdev
Network device.
Definition: axge.h:144
#define DBGC_HDA(...)
Definition: compiler.h:506
static userptr_t size_t offset
Offset of the first segment within the content.
Definition: deflate.h:259
static struct net_device * netdev
Definition: gdbudp.c:52
static void profile_start(struct profiler *profiler)
Start profiling.
Definition: profile.h:158
#define iob_unput(iobuf, len)
Definition: iobuf.h:131
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition: iobuf.h:151
A network device.
Definition: netdevice.h:348
struct usb_endpoint in
Bulk IN endpoint.
Definition: usbnet.h:29
uint16_t len_flags
Length and error flags.
Definition: axge.h:104
#define le16_to_cpu(value)
Definition: byteswap.h:112
void netdev_rx(struct net_device *netdev, struct io_buffer *iobuf)
Add packet to receive queue.
Definition: netdevice.c:470
#define iob_reserve(iobuf, len)
Definition: iobuf.h:63
#define AXGE_RX_LEN_MASK
Receive packet length mask.
Definition: axge.h:108
uint32_t len
Length.
Definition: ena.h:14
#define ENOBUFS
No buffer space available.
Definition: errno.h:498
void * data
Start of data.
Definition: iobuf.h:44
#define EIO
Input/output error.
Definition: errno.h:433
uint16_t count
Number of entries.
Definition: ena.h:22
#define cpu_to_le16(value)
Definition: byteswap.h:106
Receive packet descriptor.
Definition: axge.h:100
struct usbnet_device usbnet
USB network device.
Definition: axge.h:146
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362
A persistent I/O buffer.
Definition: iobuf.h:32

References alloc_iob(), assert(), AXGE_IN_RESERVE, AXGE_RX_CRC_ERROR, AXGE_RX_DROP_ERROR, AXGE_RX_LEN_MASK, AXGE_RX_LEN_PAD_ALIGN, container_of, count, axge_rx_footer::count, cpu_to_le16, io_buffer::data, DBGC, DBGC_HDA, EINVAL, EIO, ENOBUFS, ENOMEM, error, free_iob(), usbnet_device::in, iob_disown, iob_len(), iob_pull, iob_put, iob_reserve, iob_unput, le16_to_cpu, len, axge_rx_descriptor::len_flags, memcpy(), netdev, axge_device::netdev, netdev_rx(), netdev_rx_err(), NULL, axge_rx_footer::offset, offset, usb_endpoint::open, profile_start(), profile_stop(), rc, strerror(), and axge_device::usbnet.

◆ axge_out_transmit()

static int axge_out_transmit ( struct axge_device axge,
struct io_buffer iobuf 
)
static

Transmit packet.

Parameters
asixAXGE device
iobufI/O buffer
Return values
rcReturn status code

Definition at line 458 of file axge.c.

459  {
460  struct axge_tx_header *hdr;
461  size_t len = iob_len ( iobuf );
462  int rc;
463 
464  /* Profile transmissions */
465  profile_start ( &axge_out_profiler );
466 
467  /* Prepend header */
468  if ( ( rc = iob_ensure_headroom ( iobuf, sizeof ( *hdr ) ) ) != 0 )
469  return rc;
470  hdr = iob_push ( iobuf, sizeof ( *hdr ) );
471  hdr->len = cpu_to_le32 ( len );
472  hdr->wtf = 0;
473 
474  /* Enqueue I/O buffer */
475  if ( ( rc = usb_stream ( &axge->usbnet.out, iobuf, 0 ) ) != 0 )
476  return rc;
477 
478  profile_stop ( &axge_out_profiler );
479  return 0;
480 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
#define iob_push(iobuf, len)
Definition: iobuf.h:80
int usb_stream(struct usb_endpoint *ep, struct io_buffer *iobuf, int terminate)
Enqueue USB stream transfer.
Definition: usb.c:528
static void profile_stop(struct profiler *profiler)
Stop profiling.
Definition: profile.h:171
struct usb_endpoint out
Bulk OUT endpoint.
Definition: usbnet.h:31
Transmit packet header.
Definition: axge.h:84
static void profile_start(struct profiler *profiler)
Start profiling.
Definition: profile.h:158
#define cpu_to_le32(value)
Definition: byteswap.h:107
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition: iobuf.h:151
uint32_t hdr
Message header.
Definition: intelvf.h:12
uint32_t len
Length.
Definition: ena.h:14
int iob_ensure_headroom(struct io_buffer *iobuf, size_t len)
Ensure I/O buffer has sufficient headroom.
Definition: iobuf.c:183
struct usbnet_device usbnet
USB network device.
Definition: axge.h:146

References cpu_to_le32, hdr, iob_ensure_headroom(), iob_len(), iob_push, len, usbnet_device::out, profile_start(), profile_stop(), rc, usb_stream(), and axge_device::usbnet.

Referenced by axge_transmit().

◆ axge_out_complete()

static void axge_out_complete ( struct usb_endpoint ep,
struct io_buffer iobuf,
int  rc 
)
static

Complete bulk OUT transfer.

Parameters
epUSB endpoint
iobufI/O buffer
rcCompletion status code

Definition at line 489 of file axge.c.

490  {
491  struct axge_device *axge = container_of ( ep, struct axge_device,
492  usbnet.out );
493  struct net_device *netdev = axge->netdev;
494 
495  /* Report TX completion */
496  netdev_tx_complete_err ( netdev, iobuf, rc );
497 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
An AXGE network device.
Definition: axge.h:138
struct usb_endpoint out
Bulk OUT endpoint.
Definition: usbnet.h:31
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
struct net_device * netdev
Network device.
Definition: axge.h:144
static struct net_device * netdev
Definition: gdbudp.c:52
A network device.
Definition: netdevice.h:348
void netdev_tx_complete_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Complete network transmission.
Definition: netdevice.c:395
struct usbnet_device usbnet
USB network device.
Definition: axge.h:146

References container_of, netdev, axge_device::netdev, netdev_tx_complete_err(), usbnet_device::out, rc, and axge_device::usbnet.

◆ axge_open()

static int axge_open ( struct net_device netdev)
static

Open network device.

Parameters
netdevNetwork device
Return values
rcReturn status code

Definition at line 517 of file axge.c.

517  {
518  struct axge_device *axge = netdev->priv;
519  uint16_t rcr;
520  int rc;
521 
522  /* Open USB network device */
523  if ( ( rc = usbnet_open ( &axge->usbnet ) ) != 0 ) {
524  DBGC ( axge, "AXGE %p could not open: %s\n",
525  axge, strerror ( rc ) );
526  goto err_open;
527  }
528 
529  /* Set MAC address */
530  if ( ( rc = axge_write_register ( axge, AXGE_NIDR,
531  netdev->ll_addr, ETH_ALEN ) ) !=0){
532  DBGC ( axge, "AXGE %p could not set MAC address: %s\n",
533  axge, strerror ( rc ) );
534  goto err_write_mac;
535  }
536 
537  /* Enable receiver */
540  if ( ( rc = axge_write_word ( axge, AXGE_RCR, rcr ) ) != 0 ) {
541  DBGC ( axge, "AXGE %p could not write RCR: %s\n",
542  axge, strerror ( rc ) );
543  goto err_write_rcr;
544  }
545 
546  /* Update link status */
547  axge_check_link ( axge );
548 
549  return 0;
550 
551  axge_write_word ( axge, AXGE_RCR, 0 );
552  err_write_rcr:
553  err_write_mac:
554  usbnet_close ( &axge->usbnet );
555  err_open:
556  return rc;
557 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
unsigned short uint16_t
Definition: stdint.h:11
#define AXGE_RCR
RX Control Register.
Definition: axge.h:36
#define DBGC(...)
Definition: compiler.h:505
#define AXGE_RCR_SO
Start operation.
Definition: axge.h:40
#define AXGE_RCR_PRO
Promiscuous mode.
Definition: axge.h:37
An AXGE network device.
Definition: axge.h:138
static int axge_check_link(struct axge_device *axge)
Get link status.
Definition: axge.c:213
void * priv
Driver private data.
Definition: netdevice.h:425
static struct net_device * netdev
Definition: gdbudp.c:52
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
#define ETH_ALEN
Definition: if_ether.h:8
static int axge_write_word(struct axge_device *axge, unsigned int offset, uint16_t value)
Write two-byte register.
Definition: axge.c:180
#define AXGE_NIDR
Node ID Register.
Definition: axge.h:43
#define AXGE_RCR_AMALL
Accept all multicasts.
Definition: axge.h:38
#define cpu_to_le16(value)
Definition: byteswap.h:106
uint8_t ll_addr[MAX_LL_ADDR_LEN]
Link-layer address.
Definition: netdevice.h:381
void usbnet_close(struct usbnet_device *usbnet)
Close USB network device.
Definition: usbnet.c:127
static int axge_write_register(struct axge_device *axge, unsigned int offset, void *data, size_t len)
Write register.
Definition: axge.c:150
struct usbnet_device usbnet
USB network device.
Definition: axge.h:146
#define AXGE_RCR_AB
Accept broadcasts.
Definition: axge.h:39
int usbnet_open(struct usbnet_device *usbnet)
Open USB network device.
Definition: usbnet.c:54

References axge_check_link(), AXGE_NIDR, AXGE_RCR, AXGE_RCR_AB, AXGE_RCR_AMALL, AXGE_RCR_PRO, AXGE_RCR_SO, axge_write_register(), axge_write_word(), cpu_to_le16, DBGC, ETH_ALEN, net_device::ll_addr, netdev, net_device::priv, rc, strerror(), axge_device::usbnet, usbnet_close(), and usbnet_open().

◆ axge_close()

static void axge_close ( struct net_device netdev)
static

Close network device.

Parameters
netdevNetwork device

Definition at line 564 of file axge.c.

564  {
565  struct axge_device *axge = netdev->priv;
566 
567  /* Disable receiver */
568  axge_write_word ( axge, AXGE_RCR, 0 );
569 
570  /* Close USB network device */
571  usbnet_close ( &axge->usbnet );
572 }
#define AXGE_RCR
RX Control Register.
Definition: axge.h:36
An AXGE network device.
Definition: axge.h:138
void * priv
Driver private data.
Definition: netdevice.h:425
static struct net_device * netdev
Definition: gdbudp.c:52
static int axge_write_word(struct axge_device *axge, unsigned int offset, uint16_t value)
Write two-byte register.
Definition: axge.c:180
void usbnet_close(struct usbnet_device *usbnet)
Close USB network device.
Definition: usbnet.c:127
struct usbnet_device usbnet
USB network device.
Definition: axge.h:146

References AXGE_RCR, axge_write_word(), netdev, net_device::priv, axge_device::usbnet, and usbnet_close().

◆ axge_transmit()

static int axge_transmit ( struct net_device netdev,
struct io_buffer iobuf 
)
static

Transmit packet.

Parameters
netdevNetwork device
iobufI/O buffer
Return values
rcReturn status code

Definition at line 581 of file axge.c.

582  {
583  struct axge_device *axge = netdev->priv;
584  int rc;
585 
586  /* Transmit packet */
587  if ( ( rc = axge_out_transmit ( axge, iobuf ) ) != 0 )
588  return rc;
589 
590  return 0;
591 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
An AXGE network device.
Definition: axge.h:138
static int axge_out_transmit(struct axge_device *axge, struct io_buffer *iobuf)
Transmit packet.
Definition: axge.c:458
void * priv
Driver private data.
Definition: netdevice.h:425
static struct net_device * netdev
Definition: gdbudp.c:52

References axge_out_transmit(), netdev, net_device::priv, and rc.

◆ axge_poll()

static void axge_poll ( struct net_device netdev)
static

Poll for completed and received packets.

Parameters
netdevNetwork device

Definition at line 598 of file axge.c.

598  {
599  struct axge_device *axge = netdev->priv;
600  int rc;
601 
602  /* Poll USB bus */
603  usb_poll ( axge->bus );
604 
605  /* Refill endpoints */
606  if ( ( rc = usbnet_refill ( &axge->usbnet ) ) != 0 )
607  netdev_rx_err ( netdev, NULL, rc );
608 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
void netdev_rx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard received packet.
Definition: netdevice.c:501
struct usb_bus * bus
USB bus.
Definition: axge.h:142
An AXGE network device.
Definition: axge.h:138
void * priv
Driver private data.
Definition: netdevice.h:425
static struct net_device * netdev
Definition: gdbudp.c:52
int usbnet_refill(struct usbnet_device *usbnet)
Refill USB network device bulk IN and interrupt endpoints.
Definition: usbnet.c:151
static void usb_poll(struct usb_bus *bus)
Poll USB bus.
Definition: usb.h:1049
struct usbnet_device usbnet
USB network device.
Definition: axge.h:146
#define NULL
NULL pointer (VOID *)
Definition: Base.h:362

References axge_device::bus, netdev, netdev_rx_err(), NULL, net_device::priv, rc, usb_poll(), axge_device::usbnet, and usbnet_refill().

◆ axge_probe()

static int axge_probe ( struct usb_function func,
struct usb_configuration_descriptor config 
)
static

Probe device.

Parameters
funcUSB function
configConfiguration descriptor
Return values
rcReturn status code

Definition at line 632 of file axge.c.

633  {
634  struct usb_device *usb = func->usb;
635  struct net_device *netdev;
636  struct axge_device *axge;
637  uint16_t epprcr;
638  uint16_t msr;
639  uint8_t csr;
640  int rc;
641 
642  /* Allocate and initialise structure */
643  netdev = alloc_etherdev ( sizeof ( *axge ) );
644  if ( ! netdev ) {
645  rc = -ENOMEM;
646  goto err_alloc;
647  }
649  netdev->dev = &func->dev;
650  axge = netdev->priv;
651  memset ( axge, 0, sizeof ( *axge ) );
652  axge->usb = usb;
653  axge->bus = usb->port->hub->bus;
654  axge->netdev = netdev;
655  usbnet_init ( &axge->usbnet, func, &axge_intr_operations,
657  usb_refill_init ( &axge->usbnet.intr, 0, 0, AXGE_INTR_MAX_FILL );
660  DBGC ( axge, "AXGE %p on %s\n", axge, func->name );
661 
662  /* Describe USB network device */
663  if ( ( rc = usbnet_describe ( &axge->usbnet, config ) ) != 0 ) {
664  DBGC ( axge, "AXGE %p could not describe: %s\n",
665  axge, strerror ( rc ) );
666  goto err_describe;
667  }
668 
669  /* Fetch MAC address */
670  if ( ( rc = axge_read_register ( axge, AXGE_NIDR, netdev->hw_addr,
671  ETH_ALEN ) ) != 0 ) {
672  DBGC ( axge, "AXGE %p could not fetch MAC address: %s\n",
673  axge, strerror ( rc ) );
674  goto err_read_mac;
675  }
676 
677  /* Power up PHY */
678  if ( ( rc = axge_write_word ( axge, AXGE_EPPRCR, 0 ) ) != 0 ) {
679  DBGC ( axge, "AXGE %p could not write EPPRCR: %s\n",
680  axge, strerror ( rc ) );
681  goto err_write_epprcr_off;
682  }
683  epprcr = cpu_to_le16 ( AXGE_EPPRCR_IPRL );
684  if ( ( rc = axge_write_word ( axge, AXGE_EPPRCR, epprcr ) ) != 0){
685  DBGC ( axge, "AXGE %p could not write EPPRCR: %s\n",
686  axge, strerror ( rc ) );
687  goto err_write_epprcr_on;
688  }
690 
691  /* Select clocks */
692  csr = ( AXGE_CSR_BCS | AXGE_CSR_ACS );
693  if ( ( rc = axge_write_byte ( axge, AXGE_CSR, csr ) ) != 0){
694  DBGC ( axge, "AXGE %p could not write CSR: %s\n",
695  axge, strerror ( rc ) );
696  goto err_write_csr;
697  }
699 
700  /* Configure bulk IN pipeline */
701  if ( ( rc = axge_write_register ( axge, AXGE_BICR, &axge_bicr,
702  sizeof ( axge_bicr ) ) ) != 0 ){
703  DBGC ( axge, "AXGE %p could not write BICR: %s\n",
704  axge, strerror ( rc ) );
705  goto err_write_bicr;
706  }
707 
708  /* Set medium status */
711  if ( ( rc = axge_write_word ( axge, AXGE_MSR, msr ) ) != 0 ) {
712  DBGC ( axge, "AXGE %p could not write MSR: %s\n",
713  axge, strerror ( rc ) );
714  goto err_write_msr;
715  }
716 
717  /* Register network device */
718  if ( ( rc = register_netdev ( netdev ) ) != 0 )
719  goto err_register;
720 
721  /* Update link status */
722  axge_check_link ( axge );
723 
724  usb_func_set_drvdata ( func, axge );
725  return 0;
726 
728  err_register:
729  err_write_msr:
730  err_write_bicr:
731  err_write_csr:
732  err_write_epprcr_on:
733  err_write_epprcr_off:
734  err_read_mac:
735  err_describe:
737  netdev_put ( netdev );
738  err_alloc:
739  return rc;
740 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
unsigned short uint16_t
Definition: stdint.h:11
#define AXGE_EPPRCR_IPRL
Undocumented.
Definition: axge.h:55
const char * name
Name.
Definition: usb.h:659
struct usb_device * usb
USB device.
Definition: axge.h:140
#define AXGE_EPPRCR_DELAY_MS
Delay after initialising EPPRCR.
Definition: axge.h:58
struct usb_bus * bus
USB bus.
Definition: axge.h:142
#define DBGC(...)
Definition: compiler.h:505
#define AXGE_IN_RESERVE
Amount of space to reserve at start of bulk IN buffers.
Definition: axge.h:172
#define AXGE_INTR_MAX_FILL
Interrupt maximum fill level.
Definition: axge.h:153
#define AXGE_MSR_RFC
RX flow control enable.
Definition: axge.h:49
#define AXGE_MSR
Medium Status Register.
Definition: axge.h:46
struct usb_endpoint intr
Interrupt endpoint.
Definition: usbnet.h:27
static struct axge_bulk_in_control axge_bicr
Default bulk IN configuration.
Definition: axge.c:68
static struct net_device_operations axge_operations
AXGE network device operations.
Definition: axge.c:611
An AXGE network device.
Definition: axge.h:138
static void netdev_init(struct net_device *netdev, struct net_device_operations *op)
Initialise a network device.
Definition: netdevice.h:498
#define ENOMEM
Not enough space.
Definition: errno.h:534
static int axge_check_link(struct axge_device *axge)
Get link status.
Definition: axge.c:213
struct usb_port * port
USB port.
Definition: usb.h:710
#define AXGE_CSR_DELAY_MS
Delay after initialising CSR.
Definition: axge.h:81
static void netdev_put(struct net_device *netdev)
Drop reference to network device.
Definition: netdevice.h:555
void * priv
Driver private data.
Definition: netdevice.h:425
struct net_device * netdev
Network device.
Definition: axge.h:144
#define AXGE_CSR
Clock Select Register (undocumented)
Definition: axge.h:76
static void usb_refill_init(struct usb_endpoint *ep, size_t reserve, size_t len, unsigned int max)
Initialise USB endpoint refill.
Definition: usb.h:601
static struct net_device * netdev
Definition: gdbudp.c:52
static void usb_func_set_drvdata(struct usb_function *func, void *priv)
Set USB function driver private data.
Definition: usb.h:690
void unregister_netdev(struct net_device *netdev)
Unregister network device.
Definition: netdevice.c:844
A USB device.
Definition: usb.h:706
#define AXGE_IN_MAX_FILL
Bulk IN maximum fill level.
Definition: axge.h:159
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
int register_netdev(struct net_device *netdev)
Register network device.
Definition: netdevice.c:667
A network device.
Definition: netdevice.h:348
#define AXGE_CSR_BCS
Undocumented.
Definition: axge.h:77
#define AXGE_BICR
Bulk IN Control Register (undocumented)
Definition: axge.h:61
struct usb_endpoint in
Bulk IN endpoint.
Definition: usbnet.h:29
static void netdev_nullify(struct net_device *netdev)
Stop using a network device.
Definition: netdevice.h:511
unsigned char uint8_t
Definition: stdint.h:10
#define ETH_ALEN
Definition: if_ether.h:8
struct usb_device * usb
USB device.
Definition: usb.h:661
static struct usb_endpoint_driver_operations axge_intr_operations
Interrupt endpoint operations.
Definition: axge.c:316
struct device * dev
Underlying hardware device.
Definition: netdevice.h:360
#define AXGE_MSR_GM
Gigabit mode.
Definition: axge.h:47
static int axge_write_word(struct axge_device *axge, unsigned int offset, uint16_t value)
Write two-byte register.
Definition: axge.c:180
#define AXGE_NIDR
Node ID Register.
Definition: axge.h:43
void mdelay(unsigned long msecs)
Delay for a fixed number of milliseconds.
Definition: timer.c:78
#define AXGE_CSR_ACS
Undocumented.
Definition: axge.h:78
static int axge_read_register(struct axge_device *axge, unsigned int offset, void *data, size_t len)
Read register.
Definition: axge.c:91
static void usbnet_init(struct usbnet_device *usbnet, struct usb_function *func, struct usb_endpoint_driver_operations *intr, struct usb_endpoint_driver_operations *in, struct usb_endpoint_driver_operations *out)
Initialise USB network device.
Definition: usbnet.h:44
struct usb_hub * hub
USB hub.
Definition: usb.h:798
struct net_device * alloc_etherdev(size_t priv_size)
Allocate Ethernet device.
Definition: ethernet.c:264
static struct usb_endpoint_driver_operations axge_out_operations
Bulk OUT endpoint operations.
Definition: axge.c:500
#define cpu_to_le16(value)
Definition: byteswap.h:106
static struct usb_endpoint_driver_operations axge_in_operations
Bulk IN endpoint operations.
Definition: axge.c:447
#define AXGE_EPPRCR
Ethernet PHY Power and Reset Control Register.
Definition: axge.h:54
int usbnet_describe(struct usbnet_device *usbnet, struct usb_configuration_descriptor *config)
Describe USB network device interfaces.
Definition: usbnet.c:277
#define AXGE_MSR_TFC
TX flow control enable.
Definition: axge.h:50
struct device dev
Generic device.
Definition: usb.h:665
static int axge_write_register(struct axge_device *axge, unsigned int offset, void *data, size_t len)
Write register.
Definition: axge.c:150
struct usb_bus * bus
USB bus.
Definition: usb.h:828
static int axge_write_byte(struct axge_device *axge, unsigned int offset, uint8_t value)
Write one-byte register.
Definition: axge.c:166
struct usbnet_device usbnet
USB network device.
Definition: axge.h:146
#define AXGE_IN_MTU
Bulk IN buffer size.
Definition: axge.h:165
uint8_t hw_addr[MAX_HW_ADDR_LEN]
Hardware address.
Definition: netdevice.h:375
#define AXGE_MSR_FD
Full duplex.
Definition: axge.h:48
#define AXGE_MSR_RE
Receive enable.
Definition: axge.h:51
void * memset(void *dest, int character, size_t len) __nonnull

References alloc_etherdev(), axge_bicr, AXGE_BICR, axge_check_link(), AXGE_CSR, AXGE_CSR_ACS, AXGE_CSR_BCS, AXGE_CSR_DELAY_MS, AXGE_EPPRCR, AXGE_EPPRCR_DELAY_MS, AXGE_EPPRCR_IPRL, AXGE_IN_MAX_FILL, AXGE_IN_MTU, axge_in_operations, AXGE_IN_RESERVE, AXGE_INTR_MAX_FILL, axge_intr_operations, AXGE_MSR, AXGE_MSR_FD, AXGE_MSR_GM, AXGE_MSR_RE, AXGE_MSR_RFC, AXGE_MSR_TFC, AXGE_NIDR, axge_operations, axge_out_operations, axge_read_register(), axge_write_byte(), axge_write_register(), axge_write_word(), axge_device::bus, usb_hub::bus, cpu_to_le16, DBGC, net_device::dev, usb_function::dev, ENOMEM, ETH_ALEN, usb_port::hub, net_device::hw_addr, usbnet_device::in, usbnet_device::intr, mdelay(), memset(), usb_function::name, netdev, axge_device::netdev, netdev_init(), netdev_nullify(), netdev_put(), usb_device::port, net_device::priv, rc, register_netdev(), strerror(), unregister_netdev(), axge_device::usb, usb_function::usb, usb_func_set_drvdata(), usb_refill_init(), axge_device::usbnet, usbnet_describe(), and usbnet_init().

◆ axge_remove()

static void axge_remove ( struct usb_function func)
static

Remove device.

Parameters
funcUSB function

Definition at line 747 of file axge.c.

747  {
748  struct axge_device *axge = usb_func_get_drvdata ( func );
749  struct net_device *netdev = axge->netdev;
750 
753  netdev_put ( netdev );
754 }
static void * usb_func_get_drvdata(struct usb_function *func)
Get USB function driver private data.
Definition: usb.h:701
An AXGE network device.
Definition: axge.h:138
static void netdev_put(struct net_device *netdev)
Drop reference to network device.
Definition: netdevice.h:555
struct net_device * netdev
Network device.
Definition: axge.h:144
static struct net_device * netdev
Definition: gdbudp.c:52
void unregister_netdev(struct net_device *netdev)
Unregister network device.
Definition: netdevice.c:844
A network device.
Definition: netdevice.h:348
static void netdev_nullify(struct net_device *netdev)
Stop using a network device.
Definition: netdevice.h:511

References netdev, axge_device::netdev, netdev_nullify(), netdev_put(), unregister_netdev(), and usb_func_get_drvdata().

Variable Documentation

◆ __profiler

struct profiler axge_out_profiler __profiler
static
Initial value:
=
{ .name = "axge.intr" }

Interrupt completion profiler.

Bulk OUT profiler.

Bulk IN completion profiler.

Definition at line 47 of file axge.c.

◆ axge_bicr

struct axge_bulk_in_control axge_bicr
static
Initial value:
= {
.ctrl = 7,
.timer = cpu_to_le16 ( 0 ),
.size = 0,
.ifg = 0,
}
#define cpu_to_le16(value)
Definition: byteswap.h:106

Default bulk IN configuration.

The Linux and FreeBSD drivers have set of magic constants which are chosen based on both the Ethernet and USB link speeds.

Experimentation shows that setting the "timer" value to zero seems to prevent the device from ever coalescing multiple packets into a single bulk IN transfer. This allows us to get away with using a 2kB receive I/O buffer and a zerocopy receive path.

Definition at line 68 of file axge.c.

Referenced by axge_probe().

◆ axge_intr_operations

struct usb_endpoint_driver_operations axge_intr_operations
static
Initial value:
= {
.complete = axge_intr_complete,
}
static void axge_intr_complete(struct usb_endpoint *ep, struct io_buffer *iobuf, int rc)
Complete interrupt transfer.
Definition: axge.c:251

Interrupt endpoint operations.

Definition at line 316 of file axge.c.

Referenced by axge_probe().

◆ axge_in_operations

struct usb_endpoint_driver_operations axge_in_operations
static
Initial value:
= {
.complete = axge_in_complete,
}
static void axge_in_complete(struct usb_endpoint *ep, struct io_buffer *iobuf, int rc)
Complete bulk IN transfer.
Definition: axge.c:334

Bulk IN endpoint operations.

Definition at line 447 of file axge.c.

Referenced by axge_probe().

◆ axge_out_operations

struct usb_endpoint_driver_operations axge_out_operations
static
Initial value:
= {
.complete = axge_out_complete,
}
static void axge_out_complete(struct usb_endpoint *ep, struct io_buffer *iobuf, int rc)
Complete bulk OUT transfer.
Definition: axge.c:489

Bulk OUT endpoint operations.

Definition at line 500 of file axge.c.

Referenced by axge_probe().

◆ axge_operations

struct net_device_operations axge_operations
static
Initial value:
= {
.open = axge_open,
.close = axge_close,
.transmit = axge_transmit,
.poll = axge_poll,
}
static void axge_close(struct net_device *netdev)
Close network device.
Definition: axge.c:564
static void axge_poll(struct net_device *netdev)
Poll for completed and received packets.
Definition: axge.c:598
static int axge_open(struct net_device *netdev)
Open network device.
Definition: axge.c:517
static int axge_transmit(struct net_device *netdev, struct io_buffer *iobuf)
Transmit packet.
Definition: axge.c:581

AXGE network device operations.

Definition at line 611 of file axge.c.

Referenced by axge_probe().

◆ axge_ids

struct usb_device_id axge_ids[]
static

AXGE device IDs.

Definition at line 757 of file axge.c.

◆ __usb_driver

struct usb_driver axge_driver __usb_driver
Initial value:
= {
.ids = axge_ids,
.id_count = ( sizeof ( axge_ids ) / sizeof ( axge_ids[0] ) ),
.score = USB_SCORE_NORMAL,
.probe = axge_probe,
.remove = axge_remove,
}
static void axge_remove(struct usb_function *func)
Remove device.
Definition: axge.c:747
#define USB_CLASS_ID(base, subclass, protocol)
Construct USB class ID.
Definition: usb.h:1345
static int axge_probe(struct usb_function *func, struct usb_configuration_descriptor *config)
Probe device.
Definition: axge.c:632
Normal driver.
Definition: usb.h:1406
#define USB_ANY_ID
Match-anything ID.
Definition: usb.h:1329
static struct usb_device_id axge_ids[]
AXGE device IDs.
Definition: axge.c:757

AXGE driver.

Definition at line 791 of file axge.c.