iPXE
Data Structures | Macros | Functions | Variables
amd8111e.c File Reference
#include "etherboot.h"
#include "nic.h"
#include "mii.h"
#include <ipxe/pci.h>
#include <ipxe/ethernet.h>
#include "string.h"
#include "stdint.h"
#include "amd8111e.h"

Go to the source code of this file.

Data Structures

struct  amd8111e_tx_desc
 
struct  amd8111e_rx_desc
 
struct  eth_frame
 
struct  amd8111e_priv
 

Macros

#define NUM_TX_SLOTS   2
 
#define NUM_RX_SLOTS   4
 
#define TX_SLOTS_MASK   1
 
#define RX_SLOTS_MASK   3
 
#define TX_BUF_LEN   1536
 
#define RX_BUF_LEN   1536
 
#define TX_PKT_LEN_MAX   (ETH_FRAME_LEN - ETH_HLEN)
 
#define RX_PKT_LEN_MIN   60
 
#define RX_PKT_LEN_MAX   ETH_FRAME_LEN
 
#define TX_TIMEOUT   3000
 
#define TX_PROCESS_TIME   10
 
#define TX_RETRY   (TX_TIMEOUT / TX_PROCESS_TIME)
 
#define PHY_RW_RETRY   10
 
#define amd8111e   NIC_FAKE_BSS ( struct amd8111e_priv )
 

Functions

 FILE_LICENCE (GPL2_OR_LATER)
 
static void amd8111e_init_hw_default (struct amd8111e_priv *lp)
 
static int amd8111e_start (struct amd8111e_priv *lp)
 
static int amd8111e_read_phy (struct amd8111e_priv *lp, int phy_addr, int reg, u32 *val)
 
static void amd8111e_probe_ext_phy (struct amd8111e_priv *lp)
 
static void amd8111e_disable_interrupt (struct amd8111e_priv *lp)
 
static void amd8111e_enable_interrupt (struct amd8111e_priv *lp)
 
static void amd8111e_force_interrupt (struct amd8111e_priv *lp)
 
static int amd8111e_get_mac_address (struct amd8111e_priv *lp)
 
static int amd8111e_init_rx_ring (struct amd8111e_priv *lp)
 
static int amd8111e_init_tx_ring (struct amd8111e_priv *lp)
 
static int amd8111e_wait_tx_ring (struct amd8111e_priv *lp, unsigned int index)
 
static void amd8111e_wait_link (struct amd8111e_priv *lp)
 
static void amd8111e_poll_link (struct amd8111e_priv *lp)
 
static void amd8111e_restart (struct amd8111e_priv *lp)
 
static void amd8111e_transmit (struct nic *nic, const char *dst_addr, unsigned int type, unsigned int size, const char *packet)
 
static int amd8111e_poll (struct nic *nic, int retrieve)
 
static void amd8111e_disable (struct nic *nic, void *hwdev __unused)
 
static void amd8111e_irq (struct nic *nic, irq_action_t action)
 
static int amd8111e_probe (struct nic *nic, struct pci_device *pdev)
 
 PCI_DRIVER (amd8111e_driver, amd8111e_nics, PCI_NO_CLASS)
 
 DRIVER ("AMD8111E", nic_driver, pci_driver, amd8111e_driver, amd8111e_probe, amd8111e_disable, amd8111e)
 

Variables

static struct nic_operations amd8111e_operations
 
static struct pci_device_id amd8111e_nics []
 

Macro Definition Documentation

◆ NUM_TX_SLOTS

#define NUM_TX_SLOTS   2

Definition at line 45 of file amd8111e.c.

◆ NUM_RX_SLOTS

#define NUM_RX_SLOTS   4

Definition at line 46 of file amd8111e.c.

◆ TX_SLOTS_MASK

#define TX_SLOTS_MASK   1

Definition at line 47 of file amd8111e.c.

◆ RX_SLOTS_MASK

#define RX_SLOTS_MASK   3

Definition at line 48 of file amd8111e.c.

◆ TX_BUF_LEN

#define TX_BUF_LEN   1536

Definition at line 50 of file amd8111e.c.

◆ RX_BUF_LEN

#define RX_BUF_LEN   1536

Definition at line 51 of file amd8111e.c.

◆ TX_PKT_LEN_MAX

#define TX_PKT_LEN_MAX   (ETH_FRAME_LEN - ETH_HLEN)

Definition at line 53 of file amd8111e.c.

◆ RX_PKT_LEN_MIN

#define RX_PKT_LEN_MIN   60

Definition at line 54 of file amd8111e.c.

◆ RX_PKT_LEN_MAX

#define RX_PKT_LEN_MAX   ETH_FRAME_LEN

Definition at line 55 of file amd8111e.c.

◆ TX_TIMEOUT

#define TX_TIMEOUT   3000

Definition at line 57 of file amd8111e.c.

◆ TX_PROCESS_TIME

#define TX_PROCESS_TIME   10

Definition at line 58 of file amd8111e.c.

◆ TX_RETRY

#define TX_RETRY   (TX_TIMEOUT / TX_PROCESS_TIME)

Definition at line 59 of file amd8111e.c.

◆ PHY_RW_RETRY

#define PHY_RW_RETRY   10

Definition at line 61 of file amd8111e.c.

◆ amd8111e

#define amd8111e   NIC_FAKE_BSS ( struct amd8111e_priv )

Definition at line 108 of file amd8111e.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER  )

◆ amd8111e_init_hw_default()

static void amd8111e_init_hw_default ( struct amd8111e_priv lp)
static

Definition at line 136 of file amd8111e.c.

137 {
138  unsigned int reg_val;
139  void *mmio = lp->mmio;
140 
141  /* stop the chip */
142  writel(RUN, mmio + CMD0);
143 
144  /* Clear RCV_RING_BASE_ADDR */
145  writel(0, mmio + RCV_RING_BASE_ADDR0);
146 
147  /* Clear XMT_RING_BASE_ADDR */
148  writel(0, mmio + XMT_RING_BASE_ADDR0);
149  writel(0, mmio + XMT_RING_BASE_ADDR1);
150  writel(0, mmio + XMT_RING_BASE_ADDR2);
151  writel(0, mmio + XMT_RING_BASE_ADDR3);
152 
153  /* Clear CMD0 */
154  writel(CMD0_CLEAR, mmio + CMD0);
155 
156  /* Clear CMD2 */
157  writel(CMD2_CLEAR, mmio + CMD2);
158 
159  /* Clear CMD7 */
160  writel(CMD7_CLEAR, mmio + CMD7);
161 
162  /* Clear DLY_INT_A and DLY_INT_B */
163  writel(0x0, mmio + DLY_INT_A);
164  writel(0x0, mmio + DLY_INT_B);
165 
166  /* Clear FLOW_CONTROL */
167  writel(0x0, mmio + FLOW_CONTROL);
168 
169  /* Clear INT0 write 1 to clear register */
170  reg_val = readl(mmio + INT0);
171  writel(reg_val, mmio + INT0);
172 
173  /* Clear STVAL */
174  writel(0x0, mmio + STVAL);
175 
176  /* Clear INTEN0 */
177  writel(INTEN0_CLEAR, mmio + INTEN0);
178 
179  /* Clear LADRF */
180  writel(0x0, mmio + LADRF);
181 
182  /* Set SRAM_SIZE & SRAM_BOUNDARY registers */
183  writel(0x80010, mmio + SRAM_SIZE);
184 
185  /* Clear RCV_RING0_LEN */
186  writel(0x0, mmio + RCV_RING_LEN0);
187 
188  /* Clear XMT_RING0/1/2/3_LEN */
189  writel(0x0, mmio + XMT_RING_LEN0);
190  writel(0x0, mmio + XMT_RING_LEN1);
191  writel(0x0, mmio + XMT_RING_LEN2);
192  writel(0x0, mmio + XMT_RING_LEN3);
193 
194  /* Clear XMT_RING_LIMIT */
195  writel(0x0, mmio + XMT_RING_LIMIT);
196 
197  /* Clear MIB */
198  writew(MIB_CLEAR, mmio + MIB_ADDR);
199 
200  /* Clear LARF */
201  writel( 0, mmio + LADRF);
202  writel( 0, mmio + LADRF + 4);
203 
204  /* SRAM_SIZE register */
205  reg_val = readl(mmio + SRAM_SIZE);
206 
207  /* Set default value to CTRL1 Register */
208  writel(CTRL1_DEFAULT, mmio + CTRL1);
209 
210  /* To avoid PCI posting bug */
211  readl(mmio + CMD2);
212 }
#define XMT_RING_LEN2
Definition: amd8111e.h:106
void * mmio
Definition: amd8111e.c:106
#define DLY_INT_A
Definition: amd8111e.h:84
#define XMT_RING_BASE_ADDR2
Definition: amd8111e.h:94
uint32_t readl(volatile uint32_t *io_addr)
Read 32-bit dword from memory-mapped device.
#define CMD0
Definition: amd8111e.h:66
#define DLY_INT_B
Definition: amd8111e.h:85
Definition: amd8111e.h:248
#define XMT_RING_LIMIT
Definition: amd8111e.h:74
#define SRAM_SIZE
Definition: amd8111e.h:111
#define INT0
Definition: amd8111e.h:64
#define XMT_RING_BASE_ADDR0
Definition: amd8111e.h:92
void writel(uint32_t data, volatile uint32_t *io_addr)
Write 32-bit dword to memory-mapped device.
#define RCV_RING_BASE_ADDR0
Definition: amd8111e.h:97
#define RCV_RING_LEN0
Definition: amd8111e.h:109
#define CMD2
Definition: amd8111e.h:67
#define XMT_RING_LEN3
Definition: amd8111e.h:107
#define STVAL
Definition: amd8111e.h:90
#define LADRF
Definition: amd8111e.h:123
#define MIB_ADDR
Definition: amd8111e.h:62
#define writew
Definition: w89c840.c:159
#define XMT_RING_LEN1
Definition: amd8111e.h:105
#define CTRL1
Definition: amd8111e.h:71
#define CMD7
Definition: amd8111e.h:69
#define FLOW_CONTROL
Definition: amd8111e.h:87
#define XMT_RING_LEN0
Definition: amd8111e.h:104
#define XMT_RING_BASE_ADDR3
Definition: amd8111e.h:95
#define XMT_RING_BASE_ADDR1
Definition: amd8111e.h:93
#define INTEN0
Definition: amd8111e.h:65

References CMD0, CMD0_CLEAR, CMD2, CMD2_CLEAR, CMD7, CMD7_CLEAR, CTRL1, CTRL1_DEFAULT, DLY_INT_A, DLY_INT_B, FLOW_CONTROL, INT0, INTEN0, INTEN0_CLEAR, LADRF, MIB_ADDR, MIB_CLEAR, amd8111e_priv::mmio, RCV_RING_BASE_ADDR0, RCV_RING_LEN0, readl(), RUN, SRAM_SIZE, STVAL, writel(), writew, XMT_RING_BASE_ADDR0, XMT_RING_BASE_ADDR1, XMT_RING_BASE_ADDR2, XMT_RING_BASE_ADDR3, XMT_RING_LEN0, XMT_RING_LEN1, XMT_RING_LEN2, XMT_RING_LEN3, and XMT_RING_LIMIT.

Referenced by amd8111e_disable(), and amd8111e_restart().

◆ amd8111e_start()

static int amd8111e_start ( struct amd8111e_priv lp)
static

Definition at line 217 of file amd8111e.c.

218 {
219  struct nic *nic = lp->nic;
220  void *mmio = lp->mmio;
221  int i, reg_val;
222 
223  /* stop the chip */
224  writel(RUN, mmio + CMD0);
225 
226  /* AUTOPOLL0 Register *//*TBD default value is 8100 in FPS */
227  writew(0x8100 | lp->ext_phy_addr, mmio + AUTOPOLL0);
228 
229  /* enable the port manager and set auto negotiation always */
230  writel(VAL1 | EN_PMGR, mmio + CMD3 );
231  writel(XPHYANE | XPHYRST, mmio + CTRL2);
232 
233  /* set control registers */
234  reg_val = readl(mmio + CTRL1);
235  reg_val &= ~XMTSP_MASK;
236  writel(reg_val | XMTSP_128 | CACHE_ALIGN, mmio + CTRL1);
237 
238  /* initialize tx and rx ring base addresses */
245 
246  /* set default IPG to 96 */
247  writew(DEFAULT_IPG, mmio + IPG);
248  writew(DEFAULT_IPG - IFS1_DELTA, mmio + IFS1);
249 
250  /* AutoPAD transmit, Retransmit on Underflow */
251  writel(VAL0 | APAD_XMT | REX_RTRY | REX_UFLO, mmio + CMD2);
252 
253  /* JUMBO disabled */
254  writel(JUMBO, mmio + CMD3);
255 
256  /* Setting the MAC address to the device */
257  for(i = 0; i < ETH_ALEN; i++)
258  writeb(nic->node_addr[i], mmio + PADR + i);
259 
260  /* set RUN bit to start the chip, interrupt not enabled */
261  writel(VAL2 | RDMD0 | VAL0 | RUN, mmio + CMD0);
262 
263  /* To avoid PCI posting bug */
264  readl(mmio + CMD0);
265  return 0;
266 }
#define PADR
Definition: amd8111e.h:116
Definition: epic100.h:31
void * mmio
Definition: amd8111e.c:106
uint32_t readl(volatile uint32_t *io_addr)
Read 32-bit dword from memory-mapped device.
#define CMD0
Definition: amd8111e.h:66
Definition: amd8111e.h:248
#define IFS1
Definition: amd8111e.h:118
Definition: amd8111e.h:198
Definition: amd8111e.h:196
struct amd8111e_tx_desc tx_ring[NUM_TX_SLOTS]
Definition: amd8111e.c:90
void writeb(uint8_t data, volatile uint8_t *io_addr)
Write byte to memory-mapped device.
static __always_inline unsigned long virt_to_bus(volatile const void *addr)
Convert virtual address to a bus address.
Definition: io.h:183
#define XMT_RING_BASE_ADDR0
Definition: amd8111e.h:92
void writel(uint32_t data, volatile uint32_t *io_addr)
Write 32-bit dword to memory-mapped device.
#define RCV_RING_BASE_ADDR0
Definition: amd8111e.h:97
#define CTRL2
Definition: amd8111e.h:72
#define RCV_RING_LEN0
Definition: amd8111e.h:109
struct nic * nic
Definition: amd8111e.c:105
static int amd8111e_init_tx_ring(struct amd8111e_priv *lp)
Definition: amd8111e.c:414
#define CMD2
Definition: amd8111e.h:67
#define CMD3
Definition: amd8111e.h:68
#define IFS1_DELTA
Definition: amd8111e.h:572
#define NUM_TX_SLOTS
Definition: amd8111e.c:45
int ext_phy_addr
Definition: amd8111e.c:101
#define ETH_ALEN
Definition: if_ether.h:8
Definition: nic.h:49
#define NUM_RX_SLOTS
Definition: amd8111e.c:46
Definition: amd8111e.h:197
unsigned char * node_addr
Definition: nic.h:52
static int amd8111e_init_rx_ring(struct amd8111e_priv *lp)
Definition: amd8111e.c:397
#define writew
Definition: w89c840.c:159
#define CTRL1
Definition: amd8111e.h:71
#define DEFAULT_IPG
Definition: amd8111e.h:571
#define XMT_RING_LEN0
Definition: amd8111e.h:104
#define AUTOPOLL0
Definition: amd8111e.h:76
struct amd8111e_rx_desc rx_ring[NUM_RX_SLOTS]
Definition: amd8111e.c:91

References amd8111e_init_rx_ring(), amd8111e_init_tx_ring(), APAD_XMT, AUTOPOLL0, CACHE_ALIGN, CMD0, CMD2, CMD3, CTRL1, CTRL2, DEFAULT_IPG, EN_PMGR, ETH_ALEN, amd8111e_priv::ext_phy_addr, IFS1, IFS1_DELTA, IPG, JUMBO, amd8111e_priv::mmio, amd8111e_priv::nic, nic::node_addr, NUM_RX_SLOTS, NUM_TX_SLOTS, PADR, RCV_RING_BASE_ADDR0, RCV_RING_LEN0, RDMD0, readl(), REX_RTRY, REX_UFLO, RUN, amd8111e_priv::rx_ring, amd8111e_priv::tx_ring, VAL0, VAL1, VAL2, virt_to_bus(), writeb(), writel(), writew, XMT_RING_BASE_ADDR0, XMT_RING_LEN0, XMTSP_128, XMTSP_MASK, XPHYANE, and XPHYRST.

Referenced by amd8111e_restart().

◆ amd8111e_read_phy()

static int amd8111e_read_phy ( struct amd8111e_priv lp,
int  phy_addr,
int  reg,
u32 val 
)
static

Definition at line 271 of file amd8111e.c.

272 {
273  void *mmio = lp->mmio;
274  unsigned int reg_val;
275  unsigned int retry = PHY_RW_RETRY;
276 
277  reg_val = readl(mmio + PHY_ACCESS);
278  while (reg_val & PHY_CMD_ACTIVE)
279  reg_val = readl(mmio + PHY_ACCESS);
280 
281  writel(PHY_RD_CMD | ((phy_addr & 0x1f) << 21) | ((reg & 0x1f) << 16),
282  mmio + PHY_ACCESS);
283  do {
284  reg_val = readl(mmio + PHY_ACCESS);
285  udelay(30); /* It takes 30 us to read/write data */
286  } while (--retry && (reg_val & PHY_CMD_ACTIVE));
287 
288  if (reg_val & PHY_RD_ERR) {
289  *val = 0;
290  return -1;
291  }
292 
293  *val = reg_val & 0xffff;
294  return 0;
295 }
static unsigned int unsigned int reg
Definition: myson.h:162
void __asmcall int val
Definition: setjmp.h:12
void * mmio
Definition: amd8111e.c:106
uint32_t readl(volatile uint32_t *io_addr)
Read 32-bit dword from memory-mapped device.
#define PHY_ACCESS
Definition: amd8111e.h:88
void writel(uint32_t data, volatile uint32_t *io_addr)
Write 32-bit dword to memory-mapped device.
void udelay(unsigned long usecs)
Delay for a fixed number of microseconds.
Definition: timer.c:60
#define PHY_RW_RETRY
Definition: amd8111e.c:61

References amd8111e_priv::mmio, PHY_ACCESS, PHY_CMD_ACTIVE, PHY_RD_CMD, PHY_RD_ERR, PHY_RW_RETRY, readl(), reg, udelay(), val, and writel().

Referenced by amd8111e_poll_link(), amd8111e_probe_ext_phy(), and amd8111e_wait_link().

◆ amd8111e_probe_ext_phy()

static void amd8111e_probe_ext_phy ( struct amd8111e_priv lp)
static

Definition at line 325 of file amd8111e.c.

326 {
327  int i;
328 
329  lp->ext_phy_id = 0;
330  lp->ext_phy_addr = 1;
331 
332  for (i = 0x1e; i >= 0; i--) {
333  u32 id1, id2;
334 
335  if (amd8111e_read_phy(lp, i, MII_PHYSID1, &id1))
336  continue;
337  if (amd8111e_read_phy(lp, i, MII_PHYSID2, &id2))
338  continue;
339  lp->ext_phy_id = (id1 << 16) | id2;
340  lp->ext_phy_addr = i;
341  break;
342  }
343 
344  if (lp->ext_phy_id)
345  printf("Found MII PHY ID 0x%08x at address 0x%02x\n",
346  (unsigned int) lp->ext_phy_id, lp->ext_phy_addr);
347  else
348  printf("Couldn't detect MII PHY, assuming address 0x01\n");
349 }
int printf(const char *fmt,...)
Write a formatted string to the console.
Definition: vsprintf.c:464
static int amd8111e_read_phy(struct amd8111e_priv *lp, int phy_addr, int reg, u32 *val)
Definition: amd8111e.c:271
int ext_phy_addr
Definition: amd8111e.c:101
#define MII_PHYSID2
Definition: atl1e.h:874
#define MII_PHYSID1
Definition: atl1e.h:873
u32 ext_phy_id
Definition: amd8111e.c:102
uint32_t u32
Definition: stdint.h:23

References amd8111e_read_phy(), amd8111e_priv::ext_phy_addr, amd8111e_priv::ext_phy_id, MII_PHYSID1, MII_PHYSID2, and printf().

Referenced by amd8111e_restart().

◆ amd8111e_disable_interrupt()

static void amd8111e_disable_interrupt ( struct amd8111e_priv lp)
static

Definition at line 351 of file amd8111e.c.

352 {
353  void *mmio = lp->mmio;
354  unsigned int int0;
355 
356  writel(INTREN, mmio + CMD0);
357  writel(INTEN0_CLEAR, mmio + INTEN0);
358  int0 = readl(mmio + INT0);
359  writel(int0, mmio + INT0);
360  readl(mmio + INT0);
361 }
void * mmio
Definition: amd8111e.c:106
uint32_t readl(volatile uint32_t *io_addr)
Read 32-bit dword from memory-mapped device.
#define CMD0
Definition: amd8111e.h:66
#define INT0
Definition: amd8111e.h:64
void writel(uint32_t data, volatile uint32_t *io_addr)
Write 32-bit dword to memory-mapped device.
#define INTEN0
Definition: amd8111e.h:65

References CMD0, INT0, INTEN0, INTEN0_CLEAR, INTREN, amd8111e_priv::mmio, readl(), and writel().

Referenced by amd8111e_disable(), amd8111e_irq(), and amd8111e_restart().

◆ amd8111e_enable_interrupt()

static void amd8111e_enable_interrupt ( struct amd8111e_priv lp)
static

Definition at line 363 of file amd8111e.c.

364 {
365  void *mmio = lp->mmio;
366 
367  writel(VAL3 | LCINTEN | VAL1 | TINTEN0 | VAL0 | RINTEN0, mmio + INTEN0);
368  writel(VAL0 | INTREN, mmio + CMD0);
369  readl(mmio + CMD0);
370 }
Definition: amd8111e.h:195
void * mmio
Definition: amd8111e.c:106
uint32_t readl(volatile uint32_t *io_addr)
Read 32-bit dword from memory-mapped device.
#define CMD0
Definition: amd8111e.h:66
Definition: amd8111e.h:198
void writel(uint32_t data, volatile uint32_t *io_addr)
Write 32-bit dword to memory-mapped device.
Definition: amd8111e.h:197
#define INTEN0
Definition: amd8111e.h:65

References CMD0, INTEN0, INTREN, LCINTEN, amd8111e_priv::mmio, readl(), RINTEN0, TINTEN0, VAL0, VAL1, VAL3, and writel().

Referenced by amd8111e_irq().

◆ amd8111e_force_interrupt()

static void amd8111e_force_interrupt ( struct amd8111e_priv lp)
static

Definition at line 372 of file amd8111e.c.

373 {
374  void *mmio = lp->mmio;
375 
376  writel(VAL0 | UINTCMD, mmio + CMD0);
377  readl(mmio + CMD0);
378 }
void * mmio
Definition: amd8111e.c:106
uint32_t readl(volatile uint32_t *io_addr)
Read 32-bit dword from memory-mapped device.
#define CMD0
Definition: amd8111e.h:66
Definition: amd8111e.h:198
void writel(uint32_t data, volatile uint32_t *io_addr)
Write 32-bit dword to memory-mapped device.

References CMD0, amd8111e_priv::mmio, readl(), UINTCMD, VAL0, and writel().

Referenced by amd8111e_irq().

◆ amd8111e_get_mac_address()

static int amd8111e_get_mac_address ( struct amd8111e_priv lp)
static

Definition at line 380 of file amd8111e.c.

381 {
382  struct nic *nic = lp->nic;
383  void *mmio = lp->mmio;
384  int i;
385 
386  /* BIOS should have set mac address to PADR register,
387  * so we read PADR to get it.
388  */
389  for (i = 0; i < ETH_ALEN; i++)
390  nic->node_addr[i] = readb(mmio + PADR + i);
391 
392  DBG ( "Ethernet addr: %s\n", eth_ntoa ( nic->node_addr ) );
393 
394  return 0;
395 }
uint8_t readb(volatile uint8_t *io_addr)
Read byte from memory-mapped device.
#define PADR
Definition: amd8111e.h:116
void * mmio
Definition: amd8111e.c:106
struct nic * nic
Definition: amd8111e.c:105
const char * eth_ntoa(const void *ll_addr)
Transcribe Ethernet address.
Definition: ethernet.c:175
#define ETH_ALEN
Definition: if_ether.h:8
Definition: nic.h:49
unsigned char * node_addr
Definition: nic.h:52
#define DBG(...)
Print a debugging message.
Definition: compiler.h:498

References DBG, ETH_ALEN, eth_ntoa(), amd8111e_priv::mmio, amd8111e_priv::nic, nic::node_addr, PADR, and readb().

Referenced by amd8111e_restart().

◆ amd8111e_init_rx_ring()

static int amd8111e_init_rx_ring ( struct amd8111e_priv lp)
static

Definition at line 397 of file amd8111e.c.

398 {
399  int i;
400 
401  lp->rx_idx = 0;
402 
403  /* Initilaizing receive descriptors */
404  for (i = 0; i < NUM_RX_SLOTS; i++) {
407  wmb();
409  }
410 
411  return 0;
412 }
wmb()
static __always_inline unsigned long virt_to_bus(volatile const void *addr)
Convert virtual address to a bus address.
Definition: io.h:183
unsigned long rx_idx
Definition: amd8111e.c:94
#define cpu_to_le32(value)
Definition: byteswap.h:107
#define NUM_RX_SLOTS
Definition: amd8111e.c:46
#define cpu_to_le16(value)
Definition: byteswap.h:106
#define RX_BUF_LEN
Definition: amd8111e.c:51
unsigned char rx_buf[NUM_RX_SLOTS][RX_BUF_LEN]
Definition: amd8111e.c:93
struct amd8111e_rx_desc rx_ring[NUM_RX_SLOTS]
Definition: amd8111e.c:91

References amd8111e_rx_desc::buf_len, amd8111e_rx_desc::buf_phy_addr, cpu_to_le16, cpu_to_le32, NUM_RX_SLOTS, OWN_BIT, amd8111e_priv::rx_buf, RX_BUF_LEN, amd8111e_rx_desc::rx_flags, amd8111e_priv::rx_idx, amd8111e_priv::rx_ring, virt_to_bus(), and wmb().

Referenced by amd8111e_start().

◆ amd8111e_init_tx_ring()

static int amd8111e_init_tx_ring ( struct amd8111e_priv lp)
static

Definition at line 414 of file amd8111e.c.

415 {
416  int i;
417 
418  lp->tx_idx = 0;
419  lp->tx_consistent = 1;
420 
421  /* Initializing transmit descriptors */
422  for (i = 0; i < NUM_TX_SLOTS; i++) {
423  lp->tx_ring[i].tx_flags = 0;
424  lp->tx_ring[i].buf_phy_addr = 0;
425  lp->tx_ring[i].buf_len = 0;
426  }
427 
428  return 0;
429 }
struct amd8111e_tx_desc tx_ring[NUM_TX_SLOTS]
Definition: amd8111e.c:90
unsigned long tx_idx
Definition: amd8111e.c:94
#define NUM_TX_SLOTS
Definition: amd8111e.c:45
int tx_consistent
Definition: amd8111e.c:95

References amd8111e_tx_desc::buf_len, amd8111e_tx_desc::buf_phy_addr, NUM_TX_SLOTS, amd8111e_priv::tx_consistent, amd8111e_tx_desc::tx_flags, amd8111e_priv::tx_idx, and amd8111e_priv::tx_ring.

Referenced by amd8111e_start().

◆ amd8111e_wait_tx_ring()

static int amd8111e_wait_tx_ring ( struct amd8111e_priv lp,
unsigned int  index 
)
static

Definition at line 431 of file amd8111e.c.

432 {
433  volatile u16 status;
434  int retry = TX_RETRY;
435 
437  while (--retry && (status & OWN_BIT)) {
440  }
441  if (status & OWN_BIT) {
442  printf("Error: tx slot %d timeout, stat = 0x%x\n", index, status);
443  amd8111e_restart(lp);
444  return -1;
445  }
446 
447  return 0;
448 }
uint16_t u16
Definition: stdint.h:21
int printf(const char *fmt,...)
Write a formatted string to the console.
Definition: vsprintf.c:464
long index
Definition: bigint.h:62
struct amd8111e_tx_desc tx_ring[NUM_TX_SLOTS]
Definition: amd8111e.c:90
#define le16_to_cpu(value)
Definition: byteswap.h:112
#define TX_RETRY
Definition: amd8111e.c:59
uint8_t status
Status.
Definition: ena.h:16
static void amd8111e_restart(struct amd8111e_priv *lp)
Definition: amd8111e.c:502
void mdelay(unsigned long msecs)
Delay for a fixed number of milliseconds.
Definition: timer.c:78
#define TX_PROCESS_TIME
Definition: amd8111e.c:58

References amd8111e_restart(), index, le16_to_cpu, mdelay(), OWN_BIT, printf(), status, amd8111e_tx_desc::tx_flags, TX_PROCESS_TIME, TX_RETRY, and amd8111e_priv::tx_ring.

Referenced by amd8111e_transmit().

◆ amd8111e_wait_link()

static void amd8111e_wait_link ( struct amd8111e_priv lp)
static

Definition at line 450 of file amd8111e.c.

451 {
452  unsigned int status;
453  u32 reg_val;
454 
455  do {
456  /* read phy to update STAT0 register */
457  amd8111e_read_phy(lp, lp->ext_phy_addr, MII_BMCR, &reg_val);
458  amd8111e_read_phy(lp, lp->ext_phy_addr, MII_BMSR, &reg_val);
459  amd8111e_read_phy(lp, lp->ext_phy_addr, MII_ADVERTISE, &reg_val);
460  amd8111e_read_phy(lp, lp->ext_phy_addr, MII_LPA, &reg_val);
461  status = readl(lp->mmio + STAT0);
462  } while (!(status & AUTONEG_COMPLETE) || !(status & LINK_STATS));
463 }
#define MII_ADVERTISE
Definition: atl1e.h:875
#define MII_LPA
Definition: atl1e.h:876
void * mmio
Definition: amd8111e.c:106
uint32_t readl(volatile uint32_t *io_addr)
Read 32-bit dword from memory-mapped device.
static int amd8111e_read_phy(struct amd8111e_priv *lp, int phy_addr, int reg, u32 *val)
Definition: amd8111e.c:271
#define MII_BMCR
Definition: atl1e.h:871
int ext_phy_addr
Definition: amd8111e.c:101
uint8_t status
Status.
Definition: ena.h:16
#define MII_BMSR
Definition: atl1e.h:872
#define STAT0
Definition: amd8111e.h:63
uint32_t u32
Definition: stdint.h:23

References amd8111e_read_phy(), AUTONEG_COMPLETE, amd8111e_priv::ext_phy_addr, LINK_STATS, MII_ADVERTISE, MII_BMCR, MII_BMSR, MII_LPA, amd8111e_priv::mmio, readl(), STAT0, and status.

Referenced by amd8111e_restart().

◆ amd8111e_poll_link()

static void amd8111e_poll_link ( struct amd8111e_priv lp)
static

Definition at line 465 of file amd8111e.c.

466 {
467  unsigned int status, speed;
468  u32 reg_val;
469 
470  if (!lp->link) {
471  /* read phy to update STAT0 register */
472  amd8111e_read_phy(lp, lp->ext_phy_addr, MII_BMCR, &reg_val);
473  amd8111e_read_phy(lp, lp->ext_phy_addr, MII_BMSR, &reg_val);
474  amd8111e_read_phy(lp, lp->ext_phy_addr, MII_ADVERTISE, &reg_val);
475  amd8111e_read_phy(lp, lp->ext_phy_addr, MII_LPA, &reg_val);
476  status = readl(lp->mmio + STAT0);
477 
478  if (status & LINK_STATS) {
479  lp->link = 1;
480  speed = (status & SPEED_MASK) >> 7;
481  if (speed == PHY_SPEED_100)
482  lp->speed = 1;
483  else
484  lp->speed = 0;
485  if (status & FULL_DPLX)
486  lp->duplex = 1;
487  else
488  lp->duplex = 0;
489 
490  printf("Link is up: %s Mbps %s duplex\n",
491  lp->speed ? "100" : "10", lp->duplex ? "full" : "half");
492  }
493  } else {
494  status = readl(lp->mmio + STAT0);
495  if (!(status & LINK_STATS)) {
496  lp->link = 0;
497  printf("Link is down\n");
498  }
499  }
500 }
#define MII_ADVERTISE
Definition: atl1e.h:875
#define MII_LPA
Definition: atl1e.h:876
int printf(const char *fmt,...)
Write a formatted string to the console.
Definition: vsprintf.c:464
void * mmio
Definition: amd8111e.c:106
char speed
Definition: amd8111e.c:99
uint32_t readl(volatile uint32_t *io_addr)
Read 32-bit dword from memory-mapped device.
#define PHY_SPEED_100
Definition: amd8111e.h:161
static int amd8111e_read_phy(struct amd8111e_priv *lp, int phy_addr, int reg, u32 *val)
Definition: amd8111e.c:271
#define MII_BMCR
Definition: atl1e.h:871
int ext_phy_addr
Definition: amd8111e.c:101
uint8_t status
Status.
Definition: ena.h:16
#define MII_BMSR
Definition: atl1e.h:872
#define STAT0
Definition: amd8111e.h:63
uint32_t u32
Definition: stdint.h:23

References amd8111e_read_phy(), amd8111e_priv::duplex, amd8111e_priv::ext_phy_addr, FULL_DPLX, amd8111e_priv::link, LINK_STATS, MII_ADVERTISE, MII_BMCR, MII_BMSR, MII_LPA, amd8111e_priv::mmio, PHY_SPEED_100, printf(), readl(), amd8111e_priv::speed, SPEED_MASK, STAT0, and status.

Referenced by amd8111e_poll(), and amd8111e_restart().

◆ amd8111e_restart()

static void amd8111e_restart ( struct amd8111e_priv lp)
static

Definition at line 502 of file amd8111e.c.

503 {
504  printf("\nStarting nic...\n");
509  amd8111e_start(lp);
510 
511  printf("Waiting link up...\n");
512  lp->link = 0;
513  amd8111e_wait_link(lp);
514  amd8111e_poll_link(lp);
515 }
int printf(const char *fmt,...)
Write a formatted string to the console.
Definition: vsprintf.c:464
static int amd8111e_get_mac_address(struct amd8111e_priv *lp)
Definition: amd8111e.c:380
static void amd8111e_poll_link(struct amd8111e_priv *lp)
Definition: amd8111e.c:465
static int amd8111e_start(struct amd8111e_priv *lp)
Definition: amd8111e.c:217
static void amd8111e_wait_link(struct amd8111e_priv *lp)
Definition: amd8111e.c:450
static void amd8111e_probe_ext_phy(struct amd8111e_priv *lp)
Definition: amd8111e.c:325
static void amd8111e_init_hw_default(struct amd8111e_priv *lp)
Definition: amd8111e.c:136
static void amd8111e_disable_interrupt(struct amd8111e_priv *lp)
Definition: amd8111e.c:351

References amd8111e_disable_interrupt(), amd8111e_get_mac_address(), amd8111e_init_hw_default(), amd8111e_poll_link(), amd8111e_probe_ext_phy(), amd8111e_start(), amd8111e_wait_link(), amd8111e_priv::link, and printf().

Referenced by amd8111e_probe(), and amd8111e_wait_tx_ring().

◆ amd8111e_transmit()

static void amd8111e_transmit ( struct nic nic,
const char *  dst_addr,
unsigned int  type,
unsigned int  size,
const char *  packet 
)
static

Definition at line 522 of file amd8111e.c.

524 {
525  struct amd8111e_priv *lp = nic->priv_data;
526  struct eth_frame *frame;
527  unsigned int index;
528 
529  /* check packet size */
530  if (size > TX_PKT_LEN_MAX) {
531  printf("amd8111e_transmit(): too large packet, drop\n");
532  return;
533  }
534 
535  /* get tx slot */
536  index = lp->tx_idx;
537  if (amd8111e_wait_tx_ring(lp, index))
538  return;
539 
540  /* fill frame */
541  frame = (struct eth_frame *)lp->tx_buf[index];
542  memset(frame->data, 0, TX_PKT_LEN_MAX);
543  memcpy(frame->dst_addr, dst_addr, ETH_ALEN);
544  memcpy(frame->src_addr, nic->node_addr, ETH_ALEN);
545  frame->type = htons(type);
546  memcpy(frame->data, packet, size);
547 
548  /* start xmit */
551  wmb();
552  lp->tx_ring[index].tx_flags =
554  writel(VAL1 | TDMD0, lp->mmio + CMD0);
555  readl(lp->mmio + CMD0);
556 
557  /* update slot pointer */
558  lp->tx_idx = (lp->tx_idx + 1) & TX_SLOTS_MASK;
559 }
wmb()
int printf(const char *fmt,...)
Write a formatted string to the console.
Definition: vsprintf.c:464
void * mmio
Definition: amd8111e.c:106
uint32_t type
Operating system type.
Definition: ena.h:12
uint16_t size
Buffer size.
Definition: dwmac.h:14
uint32_t readl(volatile uint32_t *io_addr)
Read 32-bit dword from memory-mapped device.
#define CMD0
Definition: amd8111e.h:66
long index
Definition: bigint.h:62
struct amd8111e_tx_desc tx_ring[NUM_TX_SLOTS]
Definition: amd8111e.c:90
unsigned long frame
Definition: xengrant.h:179
void * memcpy(void *dest, const void *src, size_t len) __nonnull
static __always_inline unsigned long virt_to_bus(volatile const void *addr)
Convert virtual address to a bus address.
Definition: io.h:183
#define ETH_HLEN
Definition: if_ether.h:9
void writel(uint32_t data, volatile uint32_t *io_addr)
Write 32-bit dword to memory-mapped device.
unsigned char tx_buf[NUM_TX_SLOTS][TX_BUF_LEN]
Definition: amd8111e.c:92
void * priv_data
Definition: nic.h:59
#define cpu_to_le32(value)
Definition: byteswap.h:107
unsigned long tx_idx
Definition: amd8111e.c:94
#define TX_SLOTS_MASK
Definition: amd8111e.c:47
#define ETH_ALEN
Definition: if_ether.h:8
Definition: nic.h:49
Definition: amd8111e.h:197
unsigned char * node_addr
Definition: nic.h:52
#define TX_PKT_LEN_MAX
Definition: amd8111e.c:53
#define cpu_to_le16(value)
Definition: byteswap.h:106
#define htons(value)
Definition: byteswap.h:135
static int amd8111e_wait_tx_ring(struct amd8111e_priv *lp, unsigned int index)
Definition: amd8111e.c:431
u8 dst_addr[ETH_ALEN]
Definition: amd8111e.c:83
void * memset(void *dest, int character, size_t len) __nonnull

References ADD_FCS_BIT, amd8111e_wait_tx_ring(), amd8111e_tx_desc::buf_len, amd8111e_tx_desc::buf_phy_addr, CMD0, cpu_to_le16, cpu_to_le32, eth_frame::dst_addr, ENP_BIT, ETH_ALEN, ETH_HLEN, frame, htons, index, LTINT_BIT, memcpy(), memset(), amd8111e_priv::mmio, nic::node_addr, OWN_BIT, printf(), nic::priv_data, readl(), size, STP_BIT, TDMD0, amd8111e_priv::tx_buf, amd8111e_tx_desc::tx_flags, amd8111e_priv::tx_idx, TX_PKT_LEN_MAX, amd8111e_priv::tx_ring, TX_SLOTS_MASK, type, VAL1, virt_to_bus(), wmb(), and writel().

◆ amd8111e_poll()

static int amd8111e_poll ( struct nic nic,
int  retrieve 
)
static

Definition at line 561 of file amd8111e.c.

562 {
563  /* return true if there's an ethernet packet ready to read */
564  /* nic->packet should contain data on return */
565  /* nic->packetlen should contain length of data */
566 
567  struct amd8111e_priv *lp = nic->priv_data;
568  u16 status, pkt_len;
569  unsigned int index, pkt_ok;
570 
571  amd8111e_poll_link(lp);
572 
573  index = lp->rx_idx;
575  pkt_len = le16_to_cpu(lp->rx_ring[index].msg_len) - 4; /* remove 4bytes FCS */
576 
577  if (status & OWN_BIT)
578  return 0;
579 
580  if (status & ERR_BIT)
581  pkt_ok = 0;
582  else if (!(status & STP_BIT))
583  pkt_ok = 0;
584  else if (!(status & ENP_BIT))
585  pkt_ok = 0;
586  else if (pkt_len < RX_PKT_LEN_MIN)
587  pkt_ok = 0;
588  else if (pkt_len > RX_PKT_LEN_MAX)
589  pkt_ok = 0;
590  else
591  pkt_ok = 1;
592 
593  if (pkt_ok) {
594  if (!retrieve)
595  return 1;
596  nic->packetlen = pkt_len;
598  }
599 
602  wmb();
604  writel(VAL2 | RDMD0, lp->mmio + CMD0);
605  readl(lp->mmio + CMD0);
606 
607  lp->rx_idx = (lp->rx_idx + 1) & RX_SLOTS_MASK;
608  return pkt_ok;
609 }
uint16_t u16
Definition: stdint.h:21
wmb()
void * mmio
Definition: amd8111e.c:106
uint32_t readl(volatile uint32_t *io_addr)
Read 32-bit dword from memory-mapped device.
#define CMD0
Definition: amd8111e.h:66
long index
Definition: bigint.h:62
Definition: amd8111e.h:196
#define RX_PKT_LEN_MIN
Definition: amd8111e.c:54
void * memcpy(void *dest, const void *src, size_t len) __nonnull
static __always_inline unsigned long virt_to_bus(volatile const void *addr)
Convert virtual address to a bus address.
Definition: io.h:183
static void amd8111e_poll_link(struct amd8111e_priv *lp)
Definition: amd8111e.c:465
unsigned long rx_idx
Definition: amd8111e.c:94
void writel(uint32_t data, volatile uint32_t *io_addr)
Write 32-bit dword to memory-mapped device.
void * priv_data
Definition: nic.h:59
#define cpu_to_le32(value)
Definition: byteswap.h:107
unsigned int packetlen
Definition: nic.h:54
#define RX_PKT_LEN_MAX
Definition: amd8111e.c:55
uint16_t pkt_len
Definition: aqc1xx.h:37
#define le16_to_cpu(value)
Definition: byteswap.h:112
Definition: nic.h:49
uint8_t status
Status.
Definition: ena.h:16
unsigned char * packet
Definition: nic.h:53
#define cpu_to_le16(value)
Definition: byteswap.h:106
#define RX_SLOTS_MASK
Definition: amd8111e.c:48
#define RX_BUF_LEN
Definition: amd8111e.c:51
unsigned char rx_buf[NUM_RX_SLOTS][RX_BUF_LEN]
Definition: amd8111e.c:93
struct amd8111e_rx_desc rx_ring[NUM_RX_SLOTS]
Definition: amd8111e.c:91

References amd8111e_poll_link(), amd8111e_rx_desc::buf_len, amd8111e_rx_desc::buf_phy_addr, CMD0, cpu_to_le16, cpu_to_le32, ENP_BIT, ERR_BIT, index, le16_to_cpu, memcpy(), amd8111e_priv::mmio, amd8111e_rx_desc::msg_len, OWN_BIT, nic::packet, nic::packetlen, pkt_len, nic::priv_data, RDMD0, readl(), amd8111e_priv::rx_buf, RX_BUF_LEN, amd8111e_rx_desc::rx_flags, amd8111e_priv::rx_idx, RX_PKT_LEN_MAX, RX_PKT_LEN_MIN, amd8111e_priv::rx_ring, RX_SLOTS_MASK, status, STP_BIT, VAL2, virt_to_bus(), wmb(), and writel().

◆ amd8111e_disable()

static void amd8111e_disable ( struct nic nic,
void *hwdev  __unused 
)
static

Definition at line 611 of file amd8111e.c.

612 {
613  struct amd8111e_priv *lp = nic->priv_data;
614 
615  /* disable interrupt */
617 
618  /* stop chip */
620 
621  /* unmap mmio */
622  iounmap(lp->mmio);
623 
624  /* update status */
625  lp->opened = 0;
626 }
void * mmio
Definition: amd8111e.c:106
void * priv_data
Definition: nic.h:59
char opened
Definition: amd8111e.c:97
Definition: nic.h:49
static void amd8111e_init_hw_default(struct amd8111e_priv *lp)
Definition: amd8111e.c:136
static void amd8111e_disable_interrupt(struct amd8111e_priv *lp)
Definition: amd8111e.c:351
void iounmap(volatile const void *io_addr)
Unmap I/O address.

References amd8111e_disable_interrupt(), amd8111e_init_hw_default(), iounmap(), amd8111e_priv::mmio, amd8111e_priv::opened, and nic::priv_data.

◆ amd8111e_irq()

static void amd8111e_irq ( struct nic nic,
irq_action_t  action 
)
static

Definition at line 628 of file amd8111e.c.

629 {
630  struct amd8111e_priv *lp = nic->priv_data;
631 
632  switch (action) {
633  case DISABLE:
635  break;
636  case ENABLE:
638  break;
639  case FORCE:
641  break;
642  }
643 }
static void amd8111e_force_interrupt(struct amd8111e_priv *lp)
Definition: amd8111e.c:372
Definition: nic.h:35
void * priv_data
Definition: nic.h:59
static void amd8111e_enable_interrupt(struct amd8111e_priv *lp)
Definition: amd8111e.c:363
Definition: nic.h:37
Definition: nic.h:49
static void amd8111e_disable_interrupt(struct amd8111e_priv *lp)
Definition: amd8111e.c:351
Definition: nic.h:36

References amd8111e_disable_interrupt(), amd8111e_enable_interrupt(), amd8111e_force_interrupt(), DISABLE, ENABLE, FORCE, and nic::priv_data.

◆ amd8111e_probe()

static int amd8111e_probe ( struct nic nic,
struct pci_device pdev 
)
static

Definition at line 652 of file amd8111e.c.

653 {
654  struct amd8111e_priv *lp = &amd8111e;
655  unsigned long mmio_start, mmio_len;
656 
657  nic->ioaddr = pdev->ioaddr;
658  nic->irqno = pdev->irq;
659 
660  mmio_start = pci_bar_start(pdev, PCI_BASE_ADDRESS_0);
661  mmio_len = pci_bar_size(pdev, PCI_BASE_ADDRESS_0);
662 
663  memset(lp, 0, sizeof(*lp));
664  lp->pdev = pdev;
665  lp->nic = nic;
666  lp->mmio = pci_ioremap(pdev, mmio_start, mmio_len);
667  lp->opened = 1;
669 
670  nic->priv_data = lp;
671 
672  amd8111e_restart(lp);
673 
675  return 1;
676 }
unsigned char irqno
Definition: nic.h:56
uint8_t irq
Interrupt number.
Definition: pci.h:233
void * mmio
Definition: amd8111e.c:106
unsigned long ioaddr
I/O address.
Definition: pci.h:225
unsigned long pci_bar_size(struct pci_device *pci, unsigned int reg)
Get the size of a PCI BAR.
Definition: pci.c:163
#define PCI_BASE_ADDRESS_0
Definition: pci.h:62
void adjust_pci_device(struct pci_device *pci)
Enable PCI device.
Definition: pci.c:240
struct pci_device * pdev
Definition: amd8111e.c:104
unsigned int ioaddr
Definition: nic.h:55
#define amd8111e
Definition: amd8111e.c:108
void * priv_data
Definition: nic.h:59
unsigned long pci_bar_start(struct pci_device *pci, unsigned int reg)
Find the start of a PCI BAR.
Definition: pci.c:96
struct nic * nic
Definition: amd8111e.c:105
char opened
Definition: amd8111e.c:97
static struct nic_operations amd8111e_operations
Definition: amd8111e.c:645
Definition: nic.h:49
static void amd8111e_restart(struct amd8111e_priv *lp)
Definition: amd8111e.c:502
struct nic_operations * nic_op
Definition: nic.h:50
void * pci_ioremap(struct pci_device *pci, unsigned long bus_addr, size_t len)
Map PCI bus address as an I/O address.
void * memset(void *dest, int character, size_t len) __nonnull

References adjust_pci_device(), amd8111e, amd8111e_operations, amd8111e_restart(), nic::ioaddr, pci_device::ioaddr, pci_device::irq, nic::irqno, memset(), amd8111e_priv::mmio, amd8111e_priv::nic, nic::nic_op, amd8111e_priv::opened, pci_bar_size(), pci_bar_start(), PCI_BASE_ADDRESS_0, pci_ioremap(), amd8111e_priv::pdev, and nic::priv_data.

◆ PCI_DRIVER()

PCI_DRIVER ( amd8111e_driver  ,
amd8111e_nics  ,
PCI_NO_CLASS   
)

◆ DRIVER()

DRIVER ( "AMD8111E"  ,
nic_driver  ,
pci_driver  ,
amd8111e_driver  ,
amd8111e_probe  ,
amd8111e_disable  ,
amd8111e   
)

Variable Documentation

◆ amd8111e_operations

struct nic_operations amd8111e_operations
static
Initial value:
= {
.connect = dummy_connect,
.poll = amd8111e_poll,
.transmit = amd8111e_transmit,
.irq = amd8111e_irq,
}
static int amd8111e_poll(struct nic *nic, int retrieve)
Definition: amd8111e.c:561
static void amd8111e_irq(struct nic *nic, irq_action_t action)
Definition: amd8111e.c:628
int dummy_connect(struct nic *nic __unused)
Definition: legacy.c:175
static void amd8111e_transmit(struct nic *nic, const char *dst_addr, unsigned int type, unsigned int size, const char *packet)
Definition: amd8111e.c:522

Definition at line 645 of file amd8111e.c.

Referenced by amd8111e_probe().

◆ amd8111e_nics

struct pci_device_id amd8111e_nics[]
static
Initial value:
= {
PCI_ROM(0x1022, 0x7462, "amd8111e", "AMD8111E", 0),
}
#define PCI_ROM(_vendor, _device, _name, _description, _data)
Definition: pci.h:307

Definition at line 678 of file amd8111e.c.