iPXE
nii.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2014 Michael Brown <mbrown@fensystems.co.uk>.
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License as
6  * published by the Free Software Foundation; either version 2 of the
7  * License, or any later version.
8  *
9  * This program is distributed in the hope that it will be useful, but
10  * WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12  * General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17  * 02110-1301, USA.
18  *
19  * You can also choose to distribute this program under the terms of
20  * the Unmodified Binary Distribution Licence (as given in the file
21  * COPYING.UBDL), provided that you have satisfied its requirements.
22  */
23 
24 FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
25 FILE_SECBOOT ( PERMITTED );
26 
27 #include <string.h>
28 #include <strings.h>
29 #include <stdlib.h>
30 #include <unistd.h>
31 #include <errno.h>
32 #include <ipxe/netdevice.h>
33 #include <ipxe/ethernet.h>
34 #include <ipxe/if_ether.h>
35 #include <ipxe/umalloc.h>
36 #include <ipxe/efi/efi.h>
37 #include <ipxe/efi/efi_driver.h>
38 #include <ipxe/efi/efi_pci.h>
39 #include <ipxe/efi/efi_utils.h>
42 #include "nii.h"
43 
44 /** @file
45  *
46  * NII driver
47  *
48  */
49 
50 /* Error numbers generated by NII */
51 #define EIO_INVALID_CDB __einfo_error ( EINFO_EIO_INVALID_CDB )
52 #define EINFO_EIO_INVALID_CDB \
53  __einfo_uniqify ( EINFO_EIO, PXE_STATCODE_INVALID_CDB, \
54  "Invalid CDB" )
55 #define EIO_INVALID_CPB __einfo_error ( EINFO_EIO_INVALID_CPB )
56 #define EINFO_EIO_INVALID_CPB \
57  __einfo_uniqify ( EINFO_EIO, PXE_STATCODE_INVALID_CPB, \
58  "Invalid CPB" )
59 #define EIO_BUSY __einfo_error ( EINFO_EIO_BUSY )
60 #define EINFO_EIO_BUSY \
61  __einfo_uniqify ( EINFO_EIO, PXE_STATCODE_BUSY, \
62  "Busy" )
63 #define EIO_QUEUE_FULL __einfo_error ( EINFO_EIO_QUEUE_FULL )
64 #define EINFO_EIO_QUEUE_FULL \
65  __einfo_uniqify ( EINFO_EIO, PXE_STATCODE_QUEUE_FULL, \
66  "Queue full" )
67 #define EIO_ALREADY_STARTED __einfo_error ( EINFO_EIO_ALREADY_STARTED )
68 #define EINFO_EIO_ALREADY_STARTED \
69  __einfo_uniqify ( EINFO_EIO, PXE_STATCODE_ALREADY_STARTED, \
70  "Already started" )
71 #define EIO_NOT_STARTED __einfo_error ( EINFO_EIO_NOT_STARTED )
72 #define EINFO_EIO_NOT_STARTED \
73  __einfo_uniqify ( EINFO_EIO, PXE_STATCODE_NOT_STARTED, \
74  "Not started" )
75 #define EIO_NOT_SHUTDOWN __einfo_error ( EINFO_EIO_NOT_SHUTDOWN )
76 #define EINFO_EIO_NOT_SHUTDOWN \
77  __einfo_uniqify ( EINFO_EIO, PXE_STATCODE_NOT_SHUTDOWN, \
78  "Not shutdown" )
79 #define EIO_ALREADY_INITIALIZED __einfo_error ( EINFO_EIO_ALREADY_INITIALIZED )
80 #define EINFO_EIO_ALREADY_INITIALIZED \
81  __einfo_uniqify ( EINFO_EIO, PXE_STATCODE_ALREADY_INITIALIZED, \
82  "Already initialized" )
83 #define EIO_NOT_INITIALIZED __einfo_error ( EINFO_EIO_NOT_INITIALIZED )
84 #define EINFO_EIO_NOT_INITIALIZED \
85  __einfo_uniqify ( EINFO_EIO, PXE_STATCODE_NOT_INITIALIZED, \
86  "Not initialized" )
87 #define EIO_DEVICE_FAILURE __einfo_error ( EINFO_EIO_DEVICE_FAILURE )
88 #define EINFO_EIO_DEVICE_FAILURE \
89  __einfo_uniqify ( EINFO_EIO, PXE_STATCODE_DEVICE_FAILURE, \
90  "Device failure" )
91 #define EIO_NVDATA_FAILURE __einfo_error ( EINFO_EIO_NVDATA_FAILURE )
92 #define EINFO_EIO_NVDATA_FAILURE \
93  __einfo_uniqify ( EINFO_EIO, PXE_STATCODE_NVDATA_FAILURE, \
94  "Non-volatile data failure" )
95 #define EIO_UNSUPPORTED __einfo_error ( EINFO_EIO_UNSUPPORTED )
96 #define EINFO_EIO_UNSUPPORTED \
97  __einfo_uniqify ( EINFO_EIO, PXE_STATCODE_UNSUPPORTED, \
98  "Unsupported" )
99 #define EIO_BUFFER_FULL __einfo_error ( EINFO_EIO_BUFFER_FULL )
100 #define EINFO_EIO_BUFFER_FULL \
101  __einfo_uniqify ( EINFO_EIO, PXE_STATCODE_BUFFER_FULL, \
102  "Buffer full" )
103 #define EIO_INVALID_PARAMETER __einfo_error ( EINFO_EIO_INVALID_PARAMETER )
104 #define EINFO_EIO_INVALID_PARAMETER \
105  __einfo_uniqify ( EINFO_EIO, PXE_STATCODE_INVALID_PARAMETER, \
106  "Invalid parameter" )
107 #define EIO_INVALID_UNDI __einfo_error ( EINFO_EIO_INVALID_UNDI )
108 #define EINFO_EIO_INVALID_UNDI \
109  __einfo_uniqify ( EINFO_EIO, PXE_STATCODE_INVALID_UNDI, \
110  "Invalid UNDI" )
111 #define EIO_IPV4_NOT_SUPPORTED __einfo_error ( EINFO_EIO_IPV4_NOT_SUPPORTED )
112 #define EINFO_EIO_IPV4_NOT_SUPPORTED \
113  __einfo_uniqify ( EINFO_EIO, PXE_STATCODE_IPV4_NOT_SUPPORTED, \
114  "IPv4 not supported" )
115 #define EIO_IPV6_NOT_SUPPORTED __einfo_error ( EINFO_EIO_IPV6_NOT_SUPPORTED )
116 #define EINFO_EIO_IPV6_NOT_SUPPORTED \
117  __einfo_uniqify ( EINFO_EIO, PXE_STATCODE_IPV6_NOT_SUPPORTED, \
118  "IPv6 not supported" )
119 #define EIO_NOT_ENOUGH_MEMORY __einfo_error ( EINFO_EIO_NOT_ENOUGH_MEMORY )
120 #define EINFO_EIO_NOT_ENOUGH_MEMORY \
121  __einfo_uniqify ( EINFO_EIO, PXE_STATCODE_NOT_ENOUGH_MEMORY, \
122  "Not enough memory" )
123 #define EIO_NO_DATA __einfo_error ( EINFO_EIO_NO_DATA )
124 #define EINFO_EIO_NO_DATA \
125  __einfo_uniqify ( EINFO_EIO, PXE_STATCODE_NO_DATA, \
126  "No data" )
127 #define EIO_STAT( stat ) \
128  EUNIQ ( EINFO_EIO, -(stat), EIO_INVALID_CDB, EIO_INVALID_CPB, \
129  EIO_BUSY, EIO_QUEUE_FULL, EIO_ALREADY_STARTED, \
130  EIO_NOT_STARTED, EIO_NOT_SHUTDOWN, EIO_ALREADY_INITIALIZED, \
131  EIO_NOT_INITIALIZED, EIO_DEVICE_FAILURE, EIO_NVDATA_FAILURE, \
132  EIO_UNSUPPORTED, EIO_BUFFER_FULL, EIO_INVALID_PARAMETER, \
133  EIO_INVALID_UNDI, EIO_IPV4_NOT_SUPPORTED, \
134  EIO_IPV6_NOT_SUPPORTED, EIO_NOT_ENOUGH_MEMORY, EIO_NO_DATA )
135 
136 /** Maximum PCI BAR
137  *
138  * This is defined in <ipxe/efi/IndustryStandard/Pci22.h>, but we
139  * can't #include that since it collides with <ipxe/pci.h>.
140  */
141 #define PCI_MAX_BAR 6
142 
143 /** An NII memory mapping */
144 struct nii_mapping {
145  /** List of mappings */
146  struct list_head list;
147  /** Mapped address */
149  /** Mapping cookie created by PCI I/O protocol */
151 };
152 
153 /** An NII NIC */
154 struct nii_nic {
155  /** EFI device */
157  /** Network interface identifier protocol */
159  /** !PXE structure */
161  /** Entry point */
162  EFIAPI VOID ( * issue ) ( UINT64 cdb );
163  /** Generic device */
164  struct device dev;
165 
166  /** PCI device */
168  /** PCI I/O protocol */
170  /** Memory BAR */
171  unsigned int mem_bar;
172  /** I/O BAR */
173  unsigned int io_bar;
174 
175  /** Broadcast address */
177  /** Maximum packet length */
178  size_t mtu;
179 
180  /** Hardware transmit/receive buffer */
181  void *buffer;
182  /** Hardware transmit/receive buffer length */
183  size_t buffer_len;
184 
185  /** Saved task priority level */
187 
188  /** Media status is supported */
189  int media;
190 
191  /** Current transmit buffer */
192  struct io_buffer *txbuf;
193  /** Current receive buffer */
194  struct io_buffer *rxbuf;
195 
196  /** Mapping list */
198 };
199 
200 /** Maximum number of received packets per poll */
201 #define NII_RX_QUOTA 4
202 
203 /**
204  * Open PCI I/O protocol and identify BARs
205  *
206  * @v nii NII NIC
207  * @ret rc Return status code
208  */
209 static int nii_pci_open ( struct nii_nic *nii ) {
211  EFI_HANDLE device = nii->efidev->device;
213  union {
215  void *resource;
216  } desc;
217  int bar;
218  EFI_STATUS efirc;
219  int rc;
220 
221  /* Locate PCI I/O protocol */
223  &pci_device, 0 ) ) != 0 ) {
224  DBGC ( nii, "NII %s could not locate PCI I/O protocol: %s\n",
225  nii->dev.name, strerror ( rc ) );
226  goto err_locate;
227  }
228  nii->pci_device = pci_device;
229 
230  /* Open PCI I/O protocol
231  *
232  * We cannot open this safely as a by-driver open, since doing
233  * so would disconnect the underlying NII driver. We must
234  * therefore use an unsafe open.
235  */
237  &nii->pci_io ) ) != 0 ) {
238  DBGC ( nii, "NII %s could not open PCI I/O protocol: %s\n",
239  nii->dev.name, strerror ( rc ) );
240  goto err_open;
241  }
242 
243  /* Identify memory and I/O BARs */
244  nii->mem_bar = PCI_MAX_BAR;
245  nii->io_bar = PCI_MAX_BAR;
246  for ( bar = ( PCI_MAX_BAR - 1 ) ; bar >= 0 ; bar-- ) {
247  efirc = nii->pci_io->GetBarAttributes ( nii->pci_io, bar, NULL,
248  &desc.resource );
249  if ( efirc == EFI_UNSUPPORTED ) {
250  /* BAR not present; ignore */
251  continue;
252  }
253  if ( efirc != 0 ) {
254  rc = -EEFI ( efirc );
255  DBGC ( nii, "NII %s could not get BAR %d attributes: "
256  "%s\n", nii->dev.name, bar, strerror ( rc ) );
257  goto err_get_bar_attributes;
258  }
259  if ( desc.acpi->ResType == ACPI_ADDRESS_SPACE_TYPE_MEM ) {
260  nii->mem_bar = bar;
261  } else if ( desc.acpi->ResType == ACPI_ADDRESS_SPACE_TYPE_IO ) {
262  nii->io_bar = bar;
263  }
264  bs->FreePool ( desc.resource );
265  }
266  DBGC ( nii, "NII %s has ", nii->dev.name );
267  if ( nii->mem_bar < PCI_MAX_BAR ) {
268  DBGC ( nii, "memory BAR %d and ", nii->mem_bar );
269  } else {
270  DBGC ( nii, "no memory BAR and " );
271  }
272  if ( nii->io_bar < PCI_MAX_BAR ) {
273  DBGC ( nii, "I/O BAR %d\n", nii->io_bar );
274  } else {
275  DBGC ( nii, "no I/O BAR\n" );
276  }
277 
278  return 0;
279 
280  err_get_bar_attributes:
282  err_open:
283  err_locate:
284  return rc;
285 }
286 
287 /**
288  * Close PCI I/O protocol
289  *
290  * @v nii NII NIC
291  * @ret rc Return status code
292  */
293 static void nii_pci_close ( struct nii_nic *nii ) {
294  struct nii_mapping *map;
295  struct nii_mapping *tmp;
296 
297  /* Remove any stale mappings */
299  DBGC ( nii, "NII %s removing stale mapping %#llx\n",
300  nii->dev.name, ( ( unsigned long long ) map->addr ) );
301  nii->pci_io->Unmap ( nii->pci_io, map->mapping );
302  list_del ( &map->list );
303  free ( map );
304  }
305 
306  /* Close protocols */
308 }
309 
310 /**
311  * I/O callback
312  *
313  * @v unique_id NII NIC
314  * @v op Operations
315  * @v len Length of data
316  * @v addr Address
317  * @v data Data buffer
318  */
319 static EFIAPI VOID nii_io ( UINT64 unique_id, UINT8 op, UINT8 len, UINT64 addr,
320  UINT64 data ) {
321  struct nii_nic *nii = ( ( void * ) ( intptr_t ) unique_id );
325  unsigned int bar;
326  EFI_STATUS efirc;
327  int rc;
328 
329  /* Determine accessor and BAR */
330  if ( op & ( PXE_MEM_READ | PXE_MEM_WRITE ) ) {
331  access = &nii->pci_io->Mem;
332  bar = nii->mem_bar;
333  } else {
334  access = &nii->pci_io->Io;
335  bar = nii->io_bar;
336  }
337 
338  /* Determine operaton */
339  io = ( ( op & ( PXE_IO_WRITE | PXE_MEM_WRITE ) ) ?
340  access->Write : access->Read );
341 
342  /* Determine width */
343  width = ( fls ( len ) - 1 );
344 
345  /* Issue operation */
346  if ( ( efirc = io ( nii->pci_io, width, bar, addr, 1,
347  ( ( void * ) ( intptr_t ) data ) ) ) != 0 ) {
348  rc = -EEFI ( efirc );
349  DBGC ( nii, "NII %s I/O operation %#x failed: %s\n",
350  nii->dev.name, op, strerror ( rc ) );
351  /* No way to report failure */
352  return;
353  }
354 }
355 
356 /**
357  * Map callback
358  *
359  * @v unique_id NII NIC
360  * @v addr Address of memory to be mapped
361  * @v len Length of memory to be mapped
362  * @v dir Direction of data flow
363  * @v mapped Device mapped address to fill in
364  */
365 static EFIAPI VOID nii_map ( UINT64 unique_id, UINT64 addr, UINT32 len,
366  UINT32 dir, UINT64 mapped ) {
367  struct nii_nic *nii = ( ( void * ) ( intptr_t ) unique_id );
368  EFI_PHYSICAL_ADDRESS *phys = ( ( void * ) ( intptr_t ) mapped );
370  struct nii_mapping *map;
371  UINTN count = len;
372  EFI_STATUS efirc;
373  int rc;
374 
375  /* Return a zero mapped address on failure */
376  *phys = 0;
377 
378  /* Determine PCI mapping operation */
379  switch ( dir ) {
380  case TO_AND_FROM_DEVICE:
382  break;
383  case FROM_DEVICE:
385  break;
386  case TO_DEVICE:
388  break;
389  default:
390  DBGC ( nii, "NII %s unsupported mapping direction %d\n",
391  nii->dev.name, dir );
392  goto err_dir;
393  }
394 
395  /* Allocate a mapping record */
396  map = zalloc ( sizeof ( *map ) );
397  if ( ! map )
398  goto err_alloc;
399  map->addr = addr;
400 
401  /* Create map */
402  if ( ( efirc = nii->pci_io->Map ( nii->pci_io, op,
403  ( ( void * ) ( intptr_t ) addr ),
404  &count, phys, &map->mapping ) ) != 0){
405  rc = -EEFI ( efirc );
406  DBGC ( nii, "NII %s map operation failed: %s\n",
407  nii->dev.name, strerror ( rc ) );
408  goto err_map;
409  }
410 
411  /* Add to list of mappings */
412  list_add ( &map->list, &nii->mappings );
413  DBGC2 ( nii, "NII %s mapped %#llx+%#x->%#llx\n",
414  nii->dev.name, ( ( unsigned long long ) addr ),
415  len, ( ( unsigned long long ) *phys ) );
416  return;
417 
418  list_del ( &map->list );
419  err_map:
420  free ( map );
421  err_alloc:
422  err_dir:
423  return;
424 }
425 
426 /**
427  * Unmap callback
428  *
429  * @v unique_id NII NIC
430  * @v addr Address of mapped memory
431  * @v len Length of mapped memory
432  * @v dir Direction of data flow
433  * @v mapped Device mapped address
434  */
436  UINT32 dir __unused, UINT64 mapped ) {
437  struct nii_nic *nii = ( ( void * ) ( intptr_t ) unique_id );
438  struct nii_mapping *map;
439 
440  /* Locate mapping record */
441  list_for_each_entry ( map, &nii->mappings, list ) {
442  if ( map->addr == addr ) {
443  nii->pci_io->Unmap ( nii->pci_io, map->mapping );
444  list_del ( &map->list );
445  free ( map );
446  DBGC2 ( nii, "NII %s unmapped %#llx+%#x->%#llx\n",
447  nii->dev.name, ( ( unsigned long long ) addr ),
448  len, ( ( unsigned long long ) mapped ) );
449  return;
450  }
451  }
452 
453  DBGC ( nii, "NII %s non-existent mapping %#llx+%#x->%#llx\n",
454  nii->dev.name, ( ( unsigned long long ) addr ),
455  len, ( ( unsigned long long ) mapped ) );
456 }
457 
458 /**
459  * Sync callback
460  *
461  * @v unique_id NII NIC
462  * @v addr Address of mapped memory
463  * @v len Length of mapped memory
464  * @v dir Direction of data flow
465  * @v mapped Device mapped address
466  */
468  UINT32 len, UINT32 dir, UINT64 mapped ) {
469  const void *src;
470  void *dst;
471 
472  /* Do nothing if this is an identity mapping */
473  if ( addr == mapped )
474  return;
475 
476  /* Determine direction */
477  if ( dir == FROM_DEVICE ) {
478  src = ( ( void * ) ( intptr_t ) mapped );
479  dst = ( ( void * ) ( intptr_t ) addr );
480  } else {
481  src = ( ( void * ) ( intptr_t ) addr );
482  dst = ( ( void * ) ( intptr_t ) mapped );
483  }
484 
485  /* Copy data */
486  memcpy ( dst, src, len );
487 }
488 
489 /**
490  * Delay callback
491  *
492  * @v unique_id NII NIC
493  * @v microseconds Delay in microseconds
494  */
495 static EFIAPI VOID nii_delay ( UINT64 unique_id __unused, UINTN microseconds ) {
496 
497  udelay ( microseconds );
498 }
499 
500 /**
501  * Block callback
502  *
503  * @v unique_id NII NIC
504  * @v acquire Acquire lock
505  */
506 static EFIAPI VOID nii_block ( UINT64 unique_id, UINT32 acquire ) {
507  struct nii_nic *nii = ( ( void * ) ( intptr_t ) unique_id );
509 
510  /* This functionality (which is copied verbatim from the
511  * SnpDxe implementation of this function) appears to be
512  * totally brain-dead, since it produces no actual blocking
513  * behaviour.
514  */
515  if ( acquire ) {
516  nii->saved_tpl = bs->RaiseTPL ( TPL_NOTIFY );
517  } else {
518  bs->RestoreTPL ( nii->saved_tpl );
519  }
520 }
521 
522 /**
523  * Construct operation from opcode and flags
524  *
525  * @v opcode Opcode
526  * @v opflags Flags
527  * @ret op Operation
528  */
529 #define NII_OP( opcode, opflags ) ( (opcode) | ( (opflags) << 16 ) )
530 
531 /**
532  * Extract opcode from operation
533  *
534  * @v op Operation
535  * @ret opcode Opcode
536  */
537 #define NII_OPCODE( op ) ( (op) & 0xffff )
538 
539 /**
540  * Extract flags from operation
541  *
542  * @v op Operation
543  * @ret opflags Flags
544  */
545 #define NII_OPFLAGS( op ) ( (op) >> 16 )
546 
547 /**
548  * Issue command with parameter block and data block
549  *
550  * @v nii NII NIC
551  * @v op Operation
552  * @v cpb Command parameter block, or NULL
553  * @v cpb_len Command parameter block length
554  * @v db Data block, or NULL
555  * @v db_len Data block length
556  * @ret stat Status flags, or negative status code
557  */
558 static int nii_issue_cpb_db ( struct nii_nic *nii, unsigned int op, void *cpb,
559  size_t cpb_len, void *db, size_t db_len ) {
561  PXE_CDB cdb;
562  UINTN tpl;
563 
564  /* Prepare command descriptor block */
565  memset ( &cdb, 0, sizeof ( cdb ) );
566  cdb.OpCode = NII_OPCODE ( op );
567  cdb.OpFlags = NII_OPFLAGS ( op );
568  cdb.CPBaddr = ( ( intptr_t ) cpb );
569  cdb.CPBsize = cpb_len;
570  cdb.DBaddr = ( ( intptr_t ) db );
571  cdb.DBsize = db_len;
572  cdb.IFnum = nii->nii->IfNum;
573 
574  /* Raise task priority level */
575  tpl = bs->RaiseTPL ( efi_internal_tpl );
576 
577  /* Issue command */
578  DBGC2 ( nii, "NII %s issuing %02x:%04x ifnum %d%s%s\n",
579  nii->dev.name, cdb.OpCode, cdb.OpFlags, cdb.IFnum,
580  ( cpb ? " cpb" : "" ), ( db ? " db" : "" ) );
581  if ( cpb )
582  DBGC2_HD ( nii, cpb, cpb_len );
583  if ( db )
584  DBGC2_HD ( nii, db, db_len );
585  nii->issue ( ( intptr_t ) &cdb );
586 
587  /* Restore task priority level */
588  bs->RestoreTPL ( tpl );
589 
590  /* Check completion status */
591  if ( cdb.StatCode != PXE_STATCODE_SUCCESS )
592  return -cdb.StatCode;
593 
594  /* Return command-specific status flags */
595  return ( cdb.StatFlags & ~PXE_STATFLAGS_STATUS_MASK );
596 }
597 
598 /**
599  * Issue command with parameter block
600  *
601  * @v nii NII NIC
602  * @v op Operation
603  * @v cpb Command parameter block, or NULL
604  * @v cpb_len Command parameter block length
605  * @ret stat Status flags, or negative status code
606  */
607 static int nii_issue_cpb ( struct nii_nic *nii, unsigned int op, void *cpb,
608  size_t cpb_len ) {
609 
610  return nii_issue_cpb_db ( nii, op, cpb, cpb_len, NULL, 0 );
611 }
612 
613 /**
614  * Issue command with data block
615  *
616  * @v nii NII NIC
617  * @v op Operation
618  * @v db Data block, or NULL
619  * @v db_len Data block length
620  * @ret stat Status flags, or negative status code
621  */
622 static int nii_issue_db ( struct nii_nic *nii, unsigned int op, void *db,
623  size_t db_len ) {
624 
625  return nii_issue_cpb_db ( nii, op, NULL, 0, db, db_len );
626 }
627 
628 /**
629  * Issue command
630  *
631  *
632  * @v nii NII NIC
633  * @v op Operation
634  * @ret stat Status flags, or negative status code
635  */
636 static int nii_issue ( struct nii_nic *nii, unsigned int op ) {
637 
638  return nii_issue_cpb_db ( nii, op, NULL, 0, NULL, 0 );
639 }
640 
641 /**
642  * Start UNDI
643  *
644  * @v nii NII NIC
645  * @ret rc Return status code
646  */
647 static int nii_start_undi ( struct nii_nic *nii ) {
648  PXE_CPB_START_31 cpb;
649  int stat;
650  int rc;
651 
652  /* Construct parameter block */
653  memset ( &cpb, 0, sizeof ( cpb ) );
654  cpb.Delay = ( ( intptr_t ) nii_delay );
655  cpb.Block = ( ( intptr_t ) nii_block );
656  cpb.Mem_IO = ( ( intptr_t ) nii_io );
657  cpb.Map_Mem = ( ( intptr_t ) nii_map );
658  cpb.UnMap_Mem = ( ( intptr_t ) nii_unmap );
659  cpb.Sync_Mem = ( ( intptr_t ) nii_sync );
660  cpb.Unique_ID = ( ( intptr_t ) nii );
661 
662  /* Issue command */
663  if ( ( stat = nii_issue_cpb ( nii, PXE_OPCODE_START, &cpb,
664  sizeof ( cpb ) ) ) < 0 ) {
665  rc = -EIO_STAT ( stat );
666  DBGC ( nii, "NII %s could not start: %s\n",
667  nii->dev.name, strerror ( rc ) );
668  return rc;
669  }
670 
671  return 0;
672 }
673 
674 /**
675  * Stop UNDI
676  *
677  * @v nii NII NIC
678  */
679 static void nii_stop_undi ( struct nii_nic *nii ) {
680  int stat;
681  int rc;
682 
683  /* Issue command */
684  if ( ( stat = nii_issue ( nii, PXE_OPCODE_STOP ) ) < 0 ) {
685  rc = -EIO_STAT ( stat );
686  DBGC ( nii, "NII %s could not stop: %s\n",
687  nii->dev.name, strerror ( rc ) );
688  /* Nothing we can do about it */
689  return;
690  }
691 }
692 
693 /**
694  * Get initialisation information
695  *
696  * @v nii NII NIC
697  * @v netdev Network device to fill in
698  * @ret rc Return status code
699  */
700 static int nii_get_init_info ( struct nii_nic *nii,
701  struct net_device *netdev ) {
703  int stat;
704  int rc;
705 
706  /* Issue command */
708  sizeof ( db ) ) ) < 0 ) {
709  rc = -EIO_STAT ( stat );
710  DBGC ( nii, "NII %s could not get initialisation info: %s\n",
711  nii->dev.name, strerror ( rc ) );
712  return rc;
713  }
714 
715  /* Determine link layer protocol */
716  switch ( db.IFtype ) {
717  case PXE_IFTYPE_ETHERNET :
718  netdev->ll_protocol = &ethernet_protocol;
719  break;
720  default:
721  DBGC ( nii, "NII %s unknown interface type %#02x\n",
722  nii->dev.name, db.IFtype );
723  return -ENOTSUP;
724  }
725 
726  /* Sanity checks */
727  assert ( db.MediaHeaderLen == netdev->ll_protocol->ll_header_len );
728  assert ( db.HWaddrLen == netdev->ll_protocol->hw_addr_len );
729  assert ( db.HWaddrLen == netdev->ll_protocol->ll_addr_len );
730 
731  /* Extract parameters */
732  nii->buffer_len = db.MemoryRequired;
733  nii->mtu = ( db.FrameDataLen + db.MediaHeaderLen );
734  netdev->max_pkt_len = nii->mtu;
736 
737  return 0;
738 }
739 
740 /**
741  * Initialise UNDI
742  *
743  * @v nii NII NIC
744  * @v flags Flags
745  * @ret rc Return status code
746  */
747 static int nii_initialise_flags ( struct nii_nic *nii, unsigned int flags ) {
748  PXE_CPB_INITIALIZE cpb;
750  unsigned int op;
751  int stat;
752  int rc;
753 
754  /* Allocate memory buffer */
755  nii->buffer = umalloc ( nii->buffer_len );
756  if ( ! nii->buffer ) {
757  rc = -ENOMEM;
758  goto err_alloc;
759  }
760 
761  /* Construct parameter block */
762  memset ( &cpb, 0, sizeof ( cpb ) );
763  cpb.MemoryAddr = ( ( intptr_t ) nii->buffer );
764  cpb.MemoryLength = nii->buffer_len;
765 
766  /* Construct data block */
767  memset ( &db, 0, sizeof ( db ) );
768 
769  /* Issue command */
771  if ( ( stat = nii_issue_cpb_db ( nii, op, &cpb, sizeof ( cpb ),
772  &db, sizeof ( db ) ) ) < 0 ) {
773  rc = -EIO_STAT ( stat );
774  DBGC ( nii, "NII %s could not initialise: %s\n",
775  nii->dev.name, strerror ( rc ) );
776  goto err_initialize;
777  }
778 
779  return 0;
780 
781  err_initialize:
782  ufree ( nii->buffer );
783  err_alloc:
784  return rc;
785 }
786 
787 /**
788  * Initialise UNDI with cable detection
789  *
790  * @v nii NII NIC
791  * @ret rc Return status code
792  */
793 static int nii_initialise_cable ( struct nii_nic *nii ) {
794  unsigned int flags;
795 
796  /* Initialise UNDI */
798  return nii_initialise_flags ( nii, flags );
799 }
800 
801 /**
802  * Initialise UNDI
803  *
804  * @v nii NII NIC
805  * @ret rc Return status code
806  */
807 static int nii_initialise ( struct nii_nic *nii ) {
808  unsigned int flags;
809 
810  /* Initialise UNDI */
812  return nii_initialise_flags ( nii, flags );
813 }
814 
815 /**
816  * Shut down UNDI
817  *
818  * @v nii NII NIC
819  */
820 static void nii_shutdown ( struct nii_nic *nii ) {
821  int stat;
822  int rc;
823 
824  /* Issue command */
825  if ( ( stat = nii_issue ( nii, PXE_OPCODE_SHUTDOWN ) ) < 0 ) {
826  rc = -EIO_STAT ( stat );
827  DBGC ( nii, "NII %s could not shut down: %s\n",
828  nii->dev.name, strerror ( rc ) );
829  /* Leak memory to avoid corruption */
830  return;
831  }
832 
833  /* Free buffer */
834  ufree ( nii->buffer );
835 }
836 
837 /**
838  * Get station addresses
839  *
840  * @v nii NII NIC
841  * @v netdev Network device to fill in
842  * @ret rc Return status code
843  */
844 static int nii_get_station_address ( struct nii_nic *nii,
845  struct net_device *netdev ) {
847  unsigned int op;
848  int stat;
849  int rc;
850 
851  /* Initialise UNDI */
852  if ( ( rc = nii_initialise ( nii ) ) != 0 )
853  goto err_initialise;
854 
855  /* Issue command */
858  if ( ( stat = nii_issue_db ( nii, op, &db, sizeof ( db ) ) ) < 0 ) {
859  rc = -EIO_STAT ( stat );
860  DBGC ( nii, "NII %s could not get station address: %s\n",
861  nii->dev.name, strerror ( rc ) );
862  goto err_station_address;
863  }
864 
865  /* Copy MAC addresses */
866  memcpy ( netdev->ll_addr, db.StationAddr,
868  memcpy ( netdev->hw_addr, db.PermanentAddr,
870  memcpy ( nii->broadcast, db.BroadcastAddr,
871  sizeof ( nii->broadcast ) );
872 
873  err_station_address:
874  nii_shutdown ( nii );
875  err_initialise:
876  return rc;
877 }
878 
879 /**
880  * Set station address
881  *
882  * @v nii NII NIC
883  * @v netdev Network device
884  * @ret rc Return status code
885  */
886 static int nii_set_station_address ( struct nii_nic *nii,
887  struct net_device *netdev ) {
888  uint32_t implementation = nii->undi->Implementation;
890  unsigned int op;
891  int stat;
892  int rc;
893 
894  /* Fail if setting station address is unsupported */
896  return -ENOTSUP;
897 
898  /* Construct parameter block */
899  memset ( &cpb, 0, sizeof ( cpb ) );
902 
903  /* Issue command */
906  if ( ( stat = nii_issue_cpb ( nii, op, &cpb, sizeof ( cpb ) ) ) < 0 ) {
907  rc = -EIO_STAT ( stat );
908  DBGC ( nii, "NII %s could not set station address: %s\n",
909  nii->dev.name, strerror ( rc ) );
910  return rc;
911  }
912 
913  return 0;
914 }
915 
916 /**
917  * Set receive filters
918  *
919  * @v nii NII NIC
920  * @v flags Flags
921  * @ret rc Return status code
922  */
923 static int nii_set_rx_filters ( struct nii_nic *nii, unsigned int flags ) {
924  uint32_t implementation = nii->undi->Implementation;
925  unsigned int op;
926  int stat;
927  int rc;
928 
929  /* Construct receive filter set */
937 
938  /* Issue command */
940  if ( ( stat = nii_issue ( nii, op ) ) < 0 ) {
941  rc = -EIO_STAT ( stat );
942  DBGC ( nii, "NII %s could not %s%sable receive filters "
943  "%#04x: %s\n", nii->dev.name,
945  "en" : "" ),
947  "dis" : "" ), flags, strerror ( rc ) );
948  return rc;
949  }
950 
951  return 0;
952 }
953 
954 /**
955  * Enable receive filters
956  *
957  * @v nii NII NIC
958  * @ret rc Return status code
959  */
960 static int nii_enable_rx_filters ( struct nii_nic *nii ) {
961 
963 }
964 
965 /**
966  * Disable receive filters
967  *
968  * @v nii NII NIC
969  * @ret rc Return status code
970  */
971 static int nii_disable_rx_filters ( struct nii_nic *nii ) {
972 
974 }
975 
976 /**
977  * Transmit packet
978  *
979  * @v netdev Network device
980  * @v iobuf I/O buffer
981  * @ret rc Return status code
982  */
983 static int nii_transmit ( struct net_device *netdev,
984  struct io_buffer *iobuf ) {
985  struct nii_nic *nii = netdev->priv;
986  PXE_CPB_TRANSMIT cpb;
987  unsigned int op;
988  int stat;
989  int rc;
990 
991  /* Defer the packet if there is already a transmission in progress */
992  if ( nii->txbuf ) {
993  netdev_tx_defer ( netdev, iobuf );
994  return 0;
995  }
996 
997  /* Pad to minimum Ethernet length, to work around underlying
998  * drivers that do not correctly handle frame padding
999  * themselves.
1000  */
1001  iob_pad ( iobuf, ETH_ZLEN );
1002 
1003  /* Construct parameter block */
1004  memset ( &cpb, 0, sizeof ( cpb ) );
1005  cpb.FrameAddr = ( ( intptr_t ) iobuf->data );
1006  cpb.DataLen = iob_len ( iobuf );
1007 
1008  /* Transmit packet */
1012  if ( ( stat = nii_issue_cpb ( nii, op, &cpb, sizeof ( cpb ) ) ) < 0 ) {
1013  rc = -EIO_STAT ( stat );
1014  DBGC ( nii, "NII %s could not transmit: %s\n",
1015  nii->dev.name, strerror ( rc ) );
1016  return rc;
1017  }
1018  nii->txbuf = iobuf;
1019 
1020  return 0;
1021 }
1022 
1023 /**
1024  * Poll for completed packets
1025  *
1026  * @v netdev Network device
1027  * @v stat Status flags
1028  */
1029 static void nii_poll_tx ( struct net_device *netdev, unsigned int stat ) {
1030  struct nii_nic *nii = netdev->priv;
1031  struct io_buffer *iobuf;
1032 
1033  /* Do nothing unless we have a completion */
1035  return;
1036 
1037  /* Ignore spurious completions reported by some devices */
1038  if ( ! nii->txbuf )
1039  return;
1040 
1041  /* Complete transmission */
1042  iobuf = nii->txbuf;
1043  nii->txbuf = NULL;
1044  netdev_tx_complete ( netdev, iobuf );
1045 }
1046 
1047 /**
1048  * Poll for received packets
1049  *
1050  * @v netdev Network device
1051  */
1052 static void nii_poll_rx ( struct net_device *netdev ) {
1053  struct nii_nic *nii = netdev->priv;
1054  PXE_CPB_RECEIVE cpb;
1056  unsigned int quota;
1057  int stat;
1058  int rc;
1059 
1060  /* Retrieve up to NII_RX_QUOTA packets */
1061  for ( quota = NII_RX_QUOTA ; quota ; quota-- ) {
1062 
1063  /* Allocate buffer, if required */
1064  if ( ! nii->rxbuf ) {
1065  nii->rxbuf = alloc_iob ( nii->mtu );
1066  if ( ! nii->rxbuf ) {
1067  /* Leave for next poll */
1068  break;
1069  }
1070  }
1071 
1072  /* Construct parameter block */
1073  memset ( &cpb, 0, sizeof ( cpb ) );
1074  cpb.BufferAddr = ( ( intptr_t ) nii->rxbuf->data );
1075  cpb.BufferLen = iob_tailroom ( nii->rxbuf );
1076 
1077  /* Issue command */
1079  &cpb, sizeof ( cpb ),
1080  &db, sizeof ( db ) ) ) < 0 ) {
1081 
1082  /* PXE_STATCODE_NO_DATA is just the usual "no packet"
1083  * status indicator; ignore it.
1084  */
1085  if ( stat == -PXE_STATCODE_NO_DATA )
1086  break;
1087 
1088  /* Anything else is an error */
1089  rc = -EIO_STAT ( stat );
1090  DBGC ( nii, "NII %s could not receive: %s\n",
1091  nii->dev.name, strerror ( rc ) );
1092  netdev_rx_err ( netdev, NULL, rc );
1093  break;
1094  }
1095 
1096  /* Hand off to network stack */
1097  iob_put ( nii->rxbuf, db.FrameLen );
1098  netdev_rx ( netdev, nii->rxbuf );
1099  nii->rxbuf = NULL;
1100  }
1101 }
1102 
1103 /**
1104  * Check for link state changes
1105  *
1106  * @v netdev Network device
1107  * @v stat Status flags
1108  */
1109 static void nii_poll_link ( struct net_device *netdev, unsigned int stat ) {
1110  int no_media = ( stat & PXE_STATFLAGS_GET_STATUS_NO_MEDIA );
1111 
1112  if ( no_media && netdev_link_ok ( netdev ) ) {
1114  } else if ( ( ! no_media ) && ( ! netdev_link_ok ( netdev ) ) ) {
1115  netdev_link_up ( netdev );
1116  }
1117 }
1118 
1119 /**
1120  * Poll for completed packets
1121  *
1122  * @v netdev Network device
1123  */
1124 static void nii_poll ( struct net_device *netdev ) {
1125  struct nii_nic *nii = netdev->priv;
1127  unsigned int op;
1128  int stat;
1129  int rc;
1130 
1131  /* Construct data block */
1132  memset ( &db, 0, sizeof ( db ) );
1133 
1134  /* Get status */
1138  ( nii->media ? PXE_OPFLAGS_GET_MEDIA_STATUS : 0 ) ) );
1139  if ( ( stat = nii_issue_db ( nii, op, &db, sizeof ( db ) ) ) < 0 ) {
1140  rc = -EIO_STAT ( stat );
1141  DBGC ( nii, "NII %s could not get status: %s\n",
1142  nii->dev.name, strerror ( rc ) );
1143  return;
1144  }
1145 
1146  /* Process any TX completions */
1147  nii_poll_tx ( netdev, stat );
1148 
1149  /* Process any RX completions */
1150  nii_poll_rx ( netdev );
1151 
1152  /* Check for link state changes */
1153  if ( nii->media )
1154  nii_poll_link ( netdev, stat );
1155 }
1156 
1157 /**
1158  * Open network device
1159  *
1160  * @v netdev Network device
1161  * @ret rc Return status code
1162  */
1163 static int nii_open ( struct net_device *netdev ) {
1164  struct nii_nic *nii = netdev->priv;
1165  int rc;
1166 
1167  /* Initialise NIC
1168  *
1169  * We don't care about link state here, and would prefer to
1170  * have the NIC initialise even if no cable is present, to
1171  * match the behaviour of all other iPXE drivers.
1172  *
1173  * Some Emulex NII drivers have a bug which prevents packets
1174  * from being sent or received unless we specifically ask it
1175  * to detect cable presence during initialisation.
1176  *
1177  * Unfortunately, some other NII drivers (e.g. Mellanox) may
1178  * time out and report failure if asked to detect cable
1179  * presence during initialisation on links that are physically
1180  * slow to reach link-up.
1181  *
1182  * Attempt to work around both of these problems by first
1183  * attempting to initialise with cable presence detection,
1184  * then falling back to initialising without cable presence
1185  * detection.
1186  */
1187  if ( ( rc = nii_initialise_cable ( nii ) ) != 0 ) {
1188  DBGC ( nii, "NII %s could not initialise with cable "
1189  "detection: %s\n", nii->dev.name, strerror ( rc ) );
1190  if ( ( rc = nii_initialise ( nii ) ) != 0 ) {
1191  DBGC ( nii, "NII %s could not initialise without "
1192  "cable detection: %s\n",
1193  nii->dev.name, strerror ( rc ) );
1194  goto err_initialise;
1195  }
1196  }
1197 
1198  /* Attempt to set station address */
1199  if ( ( rc = nii_set_station_address ( nii, netdev ) ) != 0 ) {
1200  DBGC ( nii, "NII %s could not set station address: %s\n",
1201  nii->dev.name, strerror ( rc ) );
1202  /* Treat as non-fatal */
1203  }
1204 
1205  /* Disable receive filters
1206  *
1207  * We have no reason to disable receive filters here (or
1208  * anywhere), but some NII drivers have a bug which prevents
1209  * packets from being received unless we attempt to disable
1210  * the receive filters.
1211  *
1212  * Ignore any failures, since we genuinely don't care if the
1213  * NII driver cannot disable the filters.
1214  */
1216 
1217  /* Enable receive filters */
1218  if ( ( rc = nii_enable_rx_filters ( nii ) ) != 0 )
1219  goto err_enable_rx_filters;
1220 
1221  return 0;
1222 
1223  err_enable_rx_filters:
1224  nii_shutdown ( nii );
1225  err_initialise:
1226  return rc;
1227 }
1228 
1229 /**
1230  * Close network device
1231  *
1232  * @v netdev Network device
1233  */
1234 static void nii_close ( struct net_device *netdev ) {
1235  struct nii_nic *nii = netdev->priv;
1236 
1237  /* Shut down NIC */
1238  nii_shutdown ( nii );
1239 
1240  /* Discard transmit buffer, if applicable */
1241  if ( nii->txbuf ) {
1243  nii->txbuf = NULL;
1244  }
1245 
1246  /* Discard receive buffer, if applicable */
1247  if ( nii->rxbuf ) {
1248  free_iob ( nii->rxbuf );
1249  nii->rxbuf = NULL;
1250  }
1251 }
1252 
1253 /** NII network device operations */
1255  .open = nii_open,
1256  .close = nii_close,
1257  .transmit = nii_transmit,
1258  .poll = nii_poll,
1259 };
1260 
1261 /**
1262  * Exclude existing drivers
1263  *
1264  * @v device EFI device handle
1265  * @ret rc Return status code
1266  */
1269  int rc;
1270 
1271  /* Exclude existing NII protocol drivers */
1272  if ( ( rc = efi_driver_exclude ( device, protocol ) ) != 0 ) {
1273  DBGC ( device, "NII %s could not exclude drivers: %s\n",
1274  efi_handle_name ( device ), strerror ( rc ) );
1275  return rc;
1276  }
1277 
1278  return 0;
1279 }
1280 
1281 /**
1282  * Attach driver to device
1283  *
1284  * @v efidev EFI device
1285  * @ret rc Return status code
1286  */
1287 int nii_start ( struct efi_device *efidev ) {
1288  EFI_HANDLE device = efidev->device;
1289  struct net_device *netdev;
1290  struct nii_nic *nii;
1291  int rc;
1292 
1293  /* Allocate and initialise structure */
1294  netdev = alloc_netdev ( sizeof ( *nii ) );
1295  if ( ! netdev ) {
1296  rc = -ENOMEM;
1297  goto err_alloc;
1298  }
1300  nii = netdev->priv;
1301  nii->efidev = efidev;
1302  INIT_LIST_HEAD ( &nii->mappings );
1303  netdev->ll_broadcast = nii->broadcast;
1305 
1306  /* Populate underlying device information */
1307  efi_device_info ( device, "NII", &nii->dev );
1308  nii->dev.driver_name = "NII";
1309  nii->dev.parent = &efidev->dev;
1310  list_add ( &nii->dev.siblings, &efidev->dev.children );
1311  INIT_LIST_HEAD ( &nii->dev.children );
1312  netdev->dev = &nii->dev;
1313 
1314  /* Open NII protocol */
1316  &nii->nii ) ) != 0 ) {
1317  DBGC ( nii, "NII %s cannot open NII protocol: %s\n",
1318  nii->dev.name, strerror ( rc ) );
1320  goto err_open_protocol;
1321  }
1322 
1323  /* Locate UNDI and entry point */
1324  nii->undi = ( ( void * ) ( intptr_t ) nii->nii->Id );
1325  if ( ! nii->undi ) {
1326  DBGC ( nii, "NII %s has no UNDI\n", nii->dev.name );
1327  rc = -ENODEV;
1328  goto err_no_undi;
1329  }
1330  if ( nii->undi->Implementation & PXE_ROMID_IMP_HW_UNDI ) {
1331  DBGC ( nii, "NII %s is a mythical hardware UNDI\n",
1332  nii->dev.name );
1333  rc = -ENOTSUP;
1334  goto err_hw_undi;
1335  }
1336  if ( nii->undi->Implementation & PXE_ROMID_IMP_SW_VIRT_ADDR ) {
1337  nii->issue = ( ( void * ) ( intptr_t ) nii->undi->EntryPoint );
1338  } else {
1339  nii->issue = ( ( ( void * ) nii->undi ) +
1340  nii->undi->EntryPoint );
1341  }
1342  DBGC ( nii, "NII %s using UNDI v%x.%x at %p entry %p impl %#08x\n",
1343  nii->dev.name, nii->nii->MajorVer, nii->nii->MinorVer,
1344  nii->undi, nii->issue, nii->undi->Implementation );
1345 
1346  /* Open PCI I/O protocols and locate BARs */
1347  if ( ( rc = nii_pci_open ( nii ) ) != 0 )
1348  goto err_pci_open;
1349 
1350  /* Start UNDI */
1351  if ( ( rc = nii_start_undi ( nii ) ) != 0 )
1352  goto err_start_undi;
1353 
1354  /* Get initialisation information */
1355  if ( ( rc = nii_get_init_info ( nii, netdev ) ) != 0 )
1356  goto err_get_init_info;
1357 
1358  /* Get MAC addresses */
1359  if ( ( rc = nii_get_station_address ( nii, netdev ) ) != 0 )
1360  goto err_get_station_address;
1361 
1362  /* Register network device */
1363  if ( ( rc = register_netdev ( netdev ) ) != 0 )
1364  goto err_register_netdev;
1365  DBGC ( nii, "NII %s registered as %s for %s\n", nii->dev.name,
1367 
1368  /* Set initial link state (if media detection is not supported) */
1369  if ( ! nii->media )
1370  netdev_link_up ( netdev );
1371 
1372  return 0;
1373 
1375  err_register_netdev:
1376  err_get_station_address:
1377  err_get_init_info:
1378  nii_stop_undi ( nii );
1379  err_start_undi:
1380  nii_pci_close ( nii );
1381  err_pci_open:
1382  err_hw_undi:
1383  err_no_undi:
1385  err_open_protocol:
1386  list_del ( &nii->dev.siblings );
1387  netdev_nullify ( netdev );
1388  netdev_put ( netdev );
1389  err_alloc:
1390  return rc;
1391 }
1392 
1393 /**
1394  * Detach driver from device
1395  *
1396  * @v efidev EFI device
1397  */
1398 void nii_stop ( struct efi_device *efidev ) {
1399  struct net_device *netdev = efidev_get_drvdata ( efidev );
1400  struct nii_nic *nii = netdev->priv;
1402 
1403  /* Unregister network device */
1405 
1406  /* Stop UNDI */
1407  nii_stop_undi ( nii );
1408 
1409  /* Close PCI I/O protocols */
1410  nii_pci_close ( nii );
1411 
1412  /* Close NII protocol */
1414 
1415  /* Free network device */
1416  list_del ( &nii->dev.siblings );
1417  netdev_nullify ( netdev );
1418  netdev_put ( netdev );
1419 }
EFI_GUID efi_nii31_protocol_guid
Network interface identifier protocol GUID (new version)
Definition: efi_guid.c:309
static int nii_disable_rx_filters(struct nii_nic *nii)
Disable receive filters.
Definition: nii.c:971
NII driver.
EFI_TPL saved_tpl
Saved task priority level.
Definition: nii.c:186
#define NII_OPFLAGS(op)
Extract flags from operation.
Definition: nii.c:545
static __always_inline void ufree(void *ptr)
Free external memory.
Definition: umalloc.h:68
EFI_BOOT_SERVICES * BootServices
A pointer to the EFI Boot Services Table.
Definition: UefiSpec.h:2099
#define EFI_UNSUPPORTED
Enumeration of EFI_STATUS.
Definition: UefiBaseType.h:118
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
static void nii_poll_link(struct net_device *netdev, unsigned int stat)
Check for link state changes.
Definition: nii.c:1109
static void netdev_tx_complete(struct net_device *netdev, struct io_buffer *iobuf)
Complete network transmission.
Definition: netdevice.h:767
#define iob_put(iobuf, len)
Definition: iobuf.h:125
UINT64 addr
Mapped address.
Definition: nii.c:148
PXE_UINT32 BufferLen
Length of receive buffer.
Definition: UefiPxe.h:1738
void netdev_rx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard received packet.
Definition: netdevice.c:587
#define PXE_OPCODE_SHUTDOWN
Change the UNDI operational state from Initialized to Started.
Definition: UefiPxe.h:123
void netdev_tx_defer(struct net_device *netdev, struct io_buffer *iobuf)
Defer transmitted packet.
Definition: netdevice.c:413
#define EEFI(efirc)
Convert an EFI status code to an iPXE status code.
Definition: efi.h:175
static void nii_poll(struct net_device *netdev)
Poll for completed packets.
Definition: nii.c:1124
EFI_RAISE_TPL RaiseTPL
Definition: UefiSpec.h:1940
EFI_HANDLE pci_device
PCI device.
Definition: nii.c:167
PXE_UINT16 CPBsize
Definition: UefiPxe.h:879
uint8_t ll_header_len
Link-layer header length.
Definition: netdevice.h:201
uint8_t ll_addr_len
Link-layer address length.
Definition: netdevice.h:199
EFI driver interface.
uint32_t stat
Completion status.
Definition: dwmac.h:12
int(* open)(struct net_device *netdev)
Open network device.
Definition: netdevice.h:223
PXE_UINT32 MemoryLength
MemoryLength must be greater than or equal to MemoryRequired returned by the Get Init Info command.
Definition: UefiPxe.h:1255
PACKED struct @539 EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR
The common definition of QWORD, DWORD, and WORD Address Space Descriptors.
#define list_add(new, head)
Add a new entry to the head of a list.
Definition: list.h:70
128 bit buffer containing a unique identifier value.
Definition: Base.h:216
PXE_UINT16 DBsize
Definition: UefiPxe.h:880
#define PXE_OPFLAGS_RECEIVE_FILTER_DISABLE
Definition: UefiPxe.h:274
Error codes.
static int nii_issue_db(struct nii_nic *nii, unsigned int op, void *db, size_t db_len)
Issue command with data block.
Definition: nii.c:622
EFI_GUID efi_pci_io_protocol_guid
PCI I/O protocol GUID.
Definition: efi_guid.c:313
int nii_start(struct efi_device *efidev)
Attach driver to device.
Definition: nii.c:1287
static EFIAPI VOID nii_delay(UINT64 unique_id __unused, UINTN microseconds)
Delay callback.
Definition: nii.c:495
An optional protocol that is used to describe details about the software layer that is used to produc...
A read operation from system memory by a bus master.
Definition: PciIo.h:84
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition: iobuf.c:153
#define efi_open_unsafe(handle, protocol, interface)
Open protocol for unsafe persistent use.
Definition: efi.h:459
#define NII_OPCODE(op)
Extract opcode from operation.
Definition: nii.c:537
#define PXE_ROMID_IMP_BROADCAST_RX_SUPPORTED
Definition: UefiPxe.h:869
PXE_UINT32 DataLen
Length of the data portion of the frame buffer in bytes.
Definition: UefiPxe.h:1675
PXE_OPFLAGS OpFlags
Definition: UefiPxe.h:878
EFI_PCI_IO_PROTOCOL_MAP Map
Definition: PciIo.h:526
#define DBGC(...)
Definition: compiler.h:505
#define PXE_STATFLAGS_GET_STATUS_NO_TXBUFS_WRITTEN
This flag is set if no transmitted buffer addresses were written into the DB.
Definition: UefiPxe.h:572
char name[40]
Name.
Definition: device.h:79
static int nii_initialise_flags(struct nii_nic *nii, unsigned int flags)
Initialise UNDI.
Definition: nii.c:747
const uint8_t * ll_broadcast
Link-layer broadcast address.
Definition: netdevice.h:390
#define PXE_ROMID_IMP_STATION_ADDR_SETTABLE
Definition: UefiPxe.h:866
unsigned int UINT32
Definition: ProcessorBind.h:99
#define FROM_DEVICE
Definition: UefiPxe.h:1084
EFI Network Interface Identifier Protocol.
void netdev_link_down(struct net_device *netdev)
Mark network device as having link down.
Definition: netdevice.c:231
#define DBGC_EFI_OPENERS(...)
Definition: efi.h:345
#define PXE_OPCODE_INITIALIZE
Changed UNDI operational state from Started to Initialized.
Definition: UefiPxe.h:113
#define EIO_STAT(stat)
Definition: nii.c:127
EFI_HANDLE device
EFI device handle.
Definition: efi_driver.h:22
#define PXE_OPFLAGS_GET_TRANSMITTED_BUFFERS
Return list of transmitted buffers for recycling.
Definition: UefiPxe.h:365
void nii_stop(struct efi_device *efidev)
Detach driver from device.
Definition: nii.c:1398
PXE_MAC_ADDR StationAddr
If supplied and supported, the current station MAC address will be changed.
Definition: UefiPxe.h:1339
unsigned long intptr_t
Definition: stdint.h:21
int nii_exclude(EFI_HANDLE device)
Exclude existing drivers.
Definition: nii.c:1267
uint32_t implementation
Implementation.
Definition: ena.h:12
#define PXE_OPFLAGS_RECEIVE_FILTER_BROADCAST
Enable broadcast packet receiving.
Definition: UefiPxe.h:293
#define PXE_OPFLAGS_INITIALIZE_DETECT_CABLE
Definition: UefiPxe.h:214
struct io_buffer * alloc_iob(size_t len)
Allocate I/O buffer.
Definition: iobuf.c:131
EFI_TPL efi_internal_tpl
Internal task priority level.
Definition: efi_init.c:54
static EFIAPI VOID nii_sync(UINT64 unique_id __unused, UINT64 addr, UINT32 len, UINT32 dir, UINT64 mapped)
Sync callback.
Definition: nii.c:467
unsigned char UINT8
UINT64 EFI_PHYSICAL_ADDRESS
64-bit physical memory address.
Definition: UefiBaseType.h:53
ACPI 1.0b definitions from the ACPI Specification, revision 1.0b.
#define TPL_NOTIFY
Definition: UefiSpec.h:650
#define PXE_IFTYPE_ETHERNET
This information is from the ARP section of RFC 1700.
Definition: UefiPxe.h:709
PXE_SW_UNDI * undi
!PXE structure
Definition: nii.c:160
EFI utilities.
#define PXE_OPCODE_STATION_ADDRESS
Read & change station MAC address.
Definition: UefiPxe.h:138
#define ECANCELED
Operation canceled.
Definition: errno.h:344
#define ENOTSUP
Operation not supported.
Definition: errno.h:590
A doubly-linked list entry (or list head)
Definition: list.h:19
UINT64 Id
The address of the first byte of the identifying structure for this network interface.
static void nii_poll_tx(struct net_device *netdev, unsigned int stat)
Poll for completed packets.
Definition: nii.c:1029
static EFIAPI VOID nii_map(UINT64 unique_id, UINT64 addr, UINT32 len, UINT32 dir, UINT64 mapped)
Map callback.
Definition: nii.c:365
FILE_SECBOOT(PERMITTED)
#define ACPI_ADDRESS_SPACE_TYPE_MEM
Definition: Acpi10.h:101
static void nii_shutdown(struct nii_nic *nii)
Shut down UNDI.
Definition: nii.c:820
unsigned long tmp
Definition: linux_pci.h:65
static void netdev_init(struct net_device *netdev, struct net_device_operations *op)
Initialise a network device.
Definition: netdevice.h:519
struct net_device * alloc_netdev(size_t priv_len)
Allocate network device.
Definition: netdevice.c:722
#define list_del(list)
Delete an entry from a list.
Definition: list.h:120
struct ena_llq_option desc
Descriptor counts.
Definition: ena.h:20
PXE_UINT64 FrameAddr
Address of first byte of frame buffer.
Definition: UefiPxe.h:1669
PXE_UINT64 MemoryAddr
Address of first (lowest) byte of the memory buffer.
Definition: UefiPxe.h:1249
#define ENOMEM
Not enough space.
Definition: errno.h:535
An NII NIC.
Definition: nii.c:154
A hardware device.
Definition: device.h:77
void efi_close_unsafe(EFI_HANDLE handle, EFI_GUID *protocol)
Close protocol opened for unsafe persistent use.
Definition: efi_open.c:219
void * memcpy(void *dest, const void *src, size_t len) __nonnull
static signed char phys[4]
Definition: epic100.c:88
#define PXE_OPFLAGS_TRANSMIT_WHOLE
Definition: UefiPxe.h:393
#define PXE_OPCODE_TRANSMIT
Transmit packet(s).
Definition: UefiPxe.h:168
UINT64 Mem_IO
PXE_VOID Mem_IO(UINT64 UnqId, UINT8 read_write, UINT8 len, UINT64 port, UINT64 buf_addr);.
Definition: UefiPxe.h:1032
#define PXE_IO_WRITE
Definition: UefiPxe.h:1090
#define PXE_STATFLAGS_STATUS_MASK
Common StatFlags that can be returned by all commands.
Definition: UefiPxe.h:416
static int nii_set_station_address(struct nii_nic *nii, struct net_device *netdev)
Set station address.
Definition: nii.c:886
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
static void netdev_put(struct net_device *netdev)
Drop reference to network device.
Definition: netdevice.h:576
Ethernet protocol.
void efi_close_by_driver(EFI_HANDLE handle, EFI_GUID *protocol)
Close protocol opened for persistent use by a driver.
Definition: efi_open.c:279
static const void * src
Definition: string.h:48
uint8_t hw_addr_len
Hardware address length.
Definition: netdevice.h:197
static int nii_open(struct net_device *netdev)
Open network device.
Definition: nii.c:1163
static int nii_set_rx_filters(struct nii_nic *nii, unsigned int flags)
Set receive filters.
Definition: nii.c:923
void * priv
Driver private data.
Definition: netdevice.h:432
#define list_for_each_entry(pos, head, member)
Iterate over entries in a list.
Definition: list.h:432
#define __unused
Declare a variable or data structure as unused.
Definition: compiler.h:573
#define PCI_MAX_BAR
Maximum PCI BAR.
Definition: nii.c:141
EFI_STATUS(EFIAPI * EFI_PCI_IO_PROTOCOL_IO_MEM)(IN EFI_PCI_IO_PROTOCOL *This, IN EFI_PCI_IO_PROTOCOL_WIDTH Width, IN UINT8 BarIndex, IN UINT64 Offset, IN UINTN Count, IN OUT VOID *Buffer)
Enable a PCI driver to access PCI controller registers in the PCI memory or I/O space.
Definition: PciIo.h:183
static EFI_ACPI_TABLE_PROTOCOL * acpi
ACPI table protocol protocol.
Definition: efi_block.c:67
#define efi_open_by_driver(handle, protocol, interface)
Open protocol for persistent use by a driver.
Definition: efi.h:474
static void netdev_link_up(struct net_device *netdev)
Mark network device as having link up.
Definition: netdevice.h:789
ring len
Length.
Definition: dwmac.h:231
void udelay(unsigned long usecs)
Delay for a fixed number of microseconds.
Definition: timer.c:61
EFI_PCI_IO_PROTOCOL * pci_io
PCI I/O protocol.
Definition: nii.c:169
static EFIAPI VOID nii_io(UINT64 unique_id, UINT8 op, UINT8 len, UINT64 addr, UINT64 data)
I/O callback.
Definition: nii.c:319
EFI_PCI_IO_PROTOCOL_GET_BAR_ATTRIBUTES GetBarAttributes
Definition: PciIo.h:533
static int netdev_link_ok(struct net_device *netdev)
Check link state of network device.
Definition: netdevice.h:640
static struct net_device * netdev
Definition: gdbudp.c:52
EFI_PCI_IO_PROTOCOL_WIDTH
Definition: PciIo.h:31
#define PXE_OPFLAGS_GET_INTERRUPT_STATUS
UNDI Get Status.
Definition: UefiPxe.h:355
static unsigned int count
Number of entries.
Definition: dwmac.h:225
#define PXE_OPFLAGS_RECEIVE_FILTER_ENABLE
Definition: UefiPxe.h:273
#define PXE_ROMID_IMP_HW_UNDI
Implementation flags.
Definition: UefiPxe.h:853
void unregister_netdev(struct net_device *netdev)
Unregister network device.
Definition: netdevice.c:942
An NII memory mapping.
Definition: nii.c:144
static struct net_device_operations nii_operations
NII network device operations.
Definition: nii.c:1254
#define PXE_ROMID_IMP_SW_VIRT_ADDR
Definition: UefiPxe.h:854
#define list_for_each_entry_safe(pos, tmp, head, member)
Iterate over entries in a list, safe against deletion of the current entry.
Definition: list.h:459
UINT64 Map_Mem
PXE_VOID Map_Mem(UINT64 unq_id, UINT64 virtual_addr, UINT32 size, UINT32 Direction,...
Definition: UefiPxe.h:1049
unsigned int mem_bar
Memory BAR.
Definition: nii.c:171
const char * efi_handle_name(EFI_HANDLE handle)
Get name of an EFI handle.
Definition: efi_debug.c:652
PXE_UINT64 CPBaddr
Definition: UefiPxe.h:881
EFI_PCI_IO_PROTOCOL_UNMAP Unmap
Definition: PciIo.h:527
EFI_PCI_IO_PROTOCOL_IO_MEM Write
Write PCI controller registers in the PCI memory or I/O space.
Definition: PciIo.h:200
uint8_t flags
Flags.
Definition: ena.h:18
PXE_UINT64 BufferAddr
Address of first byte of receive buffer.
Definition: UefiPxe.h:1731
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:79
static void(* free)(struct refcnt *refcnt))
Definition: refcnt.h:55
#define EFIAPI
void * zalloc(size_t size)
Allocate cleared memory.
Definition: malloc.c:662
EFI Boot Services Table.
Definition: UefiSpec.h:1931
#define DBGC2_HD(...)
Definition: compiler.h:524
int media
Media status is supported.
Definition: nii.c:189
#define TO_DEVICE
Definition: UefiPxe.h:1085
#define PXE_OPFLAGS_STATION_ADDRESS_WRITE
Definition: UefiPxe.h:317
A PCI device.
Definition: pci.h:211
int register_netdev(struct net_device *netdev)
Register network device.
Definition: netdevice.c:760
PXE_MAC_ADDR broadcast
Broadcast address.
Definition: nii.c:176
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition: iobuf.h:160
static void * efidev_get_drvdata(struct efi_device *efidev)
Get EFI driver-private data.
Definition: efi_driver.h:95
static EFIAPI VOID nii_block(UINT64 unique_id, UINT32 acquire)
Block callback.
Definition: nii.c:506
uint32_t addr
Buffer address.
Definition: dwmac.h:20
User memory allocation.
#define PXE_ROMID_IMP_PROMISCUOUS_RX_SUPPORTED
Definition: UefiPxe.h:868
#define PXE_STATFLAGS_GET_STATUS_NO_MEDIA
This flag is set if there is no media detected.
Definition: UefiPxe.h:577
static int nii_initialise_cable(struct nii_nic *nii)
Initialise UNDI with cable detection.
Definition: nii.c:793
A network device.
Definition: netdevice.h:353
struct efi_device * efidev
EFI device.
Definition: nii.c:156
static size_t iob_tailroom(struct io_buffer *iobuf)
Calculate available space at end of an I/O buffer.
Definition: iobuf.h:180
#define ENODEV
No such device.
Definition: errno.h:510
int efi_driver_exclude(EFI_HANDLE device, EFI_GUID *protocol)
Try to disconnect an existing EFI driver.
Definition: efi_driver.c:438
static void netdev_nullify(struct net_device *netdev)
Stop using a network device.
Definition: netdevice.h:532
#define ACPI_ADDRESS_SPACE_TYPE_IO
Definition: Acpi10.h:102
#define PXE_OPFLAGS_TRANSMIT_DONT_BLOCK
Definition: UefiPxe.h:389
EFIAPI VOID(* issue)(UINT64 cdb)
Entry point.
Definition: nii.c:162
UINT64 UINTN
Unsigned value of native width.
static int nii_issue_cpb_db(struct nii_nic *nii, unsigned int op, void *cpb, size_t cpb_len, void *db, size_t db_len)
Issue command with parameter block and data block.
Definition: nii.c:558
#define PXE_OPFLAGS_RECEIVE_FILTER_UNICAST
Enable unicast packet receiving.
Definition: UefiPxe.h:287
#define PXE_STATFLAGS_GET_STATUS_NO_MEDIA_SUPPORTED
Definition: UefiPxe.h:444
An EFI device.
Definition: efi_driver.h:18
unsigned int io_bar
I/O BAR.
Definition: nii.c:173
static void nii_close(struct net_device *netdev)
Close network device.
Definition: nii.c:1234
#define PXE_OPCODE_STOP
Change UNDI operational state from Started to Stopped.
Definition: UefiPxe.h:98
#define PXE_OPCODE_GET_STATUS
Get & clear interrupt status.
Definition: UefiPxe.h:158
Provides both read and write access to system memory by both the processor and a bus master.
Definition: PciIo.h:93
#define ETH_ZLEN
Definition: if_ether.h:11
int efi_locate_device(EFI_HANDLE device, EFI_GUID *protocol, EFI_HANDLE *parent, unsigned int skip)
Locate parent device supporting a given protocol.
Definition: efi_utils.c:46
static int nii_issue(struct nii_nic *nii, unsigned int op)
Issue command.
Definition: nii.c:636
#define VOID
Undeclared type.
Definition: Base.h:272
struct io_buffer * txbuf
Current transmit buffer.
Definition: nii.c:192
unsigned int uint32_t
Definition: stdint.h:12
unsigned long long UINT64
Definition: ProcessorBind.h:97
EFI_FREE_POOL FreePool
Definition: UefiSpec.h:1950
EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL * nii
Network interface identifier protocol.
Definition: nii.c:158
EFI_PCI_IO_PROTOCOL_OPERATION
Definition: PciIo.h:80
static int nii_initialise(struct nii_nic *nii)
Initialise UNDI.
Definition: nii.c:807
EFI API.
static int nii_transmit(struct net_device *netdev, struct io_buffer *iobuf)
Transmit packet.
Definition: nii.c:983
Network device operations.
Definition: netdevice.h:214
void netdev_rx(struct net_device *netdev, struct io_buffer *iobuf)
Add packet to receive queue.
Definition: netdevice.c:549
struct device * dev
Underlying hardware device.
Definition: netdevice.h:365
FILE_LICENCE(GPL2_OR_LATER_OR_UBDL)
Network device management.
static int nii_enable_rx_filters(struct nii_nic *nii)
Enable receive filters.
Definition: nii.c:960
static struct dmfe_private * db
Definition: dmfe.c:177
static int nii_get_station_address(struct nii_nic *nii, struct net_device *netdev)
Get station addresses.
Definition: nii.c:844
VOID * mapping
Mapping cookie created by PCI I/O protocol.
Definition: nii.c:150
static uint16_t struct vmbus_xfer_pages_operations * op
Definition: netvsc.h:327
#define INIT_LIST_HEAD(list)
Initialise a list head.
Definition: list.h:46
void netdev_tx_complete_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Complete network transmission.
Definition: netdevice.c:471
void * buffer
Hardware transmit/receive buffer.
Definition: nii.c:181
char name[NETDEV_NAME_LEN]
Name of this network device.
Definition: netdevice.h:363
UINTN EFI_TPL
Task priority level.
Definition: UefiBaseType.h:44
#define PXE_STATCODE_NO_DATA
Definition: UefiPxe.h:625
static __always_inline int struct dma_mapping * map
Definition: dma.h:184
#define DBGC2(...)
Definition: compiler.h:522
UINT64 Delay
PXE_VOID Delay(UINT64 UnqId, UINTN microseconds);.
Definition: UefiPxe.h:991
UINT64 Sync_Mem
PXE_VOID Sync_Mem(UINT64 unq_id, UINT64 virtual, UINT32 size, UINT32 Direction, UINT64 mapped_addr);.
Definition: UefiPxe.h:1072
static int nii_start_undi(struct nii_nic *nii)
Start UNDI.
Definition: nii.c:647
EFI_PCI_IO_PROTOCOL_IO_MEM Read
Read PCI controller registers in the PCI memory or I/O space.
Definition: PciIo.h:196
void * data
Start of data.
Definition: iobuf.h:53
RETURN_STATUS EFI_STATUS
Function return status for EFI API.
Definition: UefiBaseType.h:32
struct list_head children
Devices attached to this device.
Definition: device.h:87
static __always_inline void * umalloc(size_t size)
Allocate external memory.
Definition: umalloc.h:57
struct device dev
Generic device.
Definition: nii.c:164
#define TO_AND_FROM_DEVICE
Definition: UefiPxe.h:1083
EFI driver interface.
struct list_head list
List of mappings.
Definition: nii.c:146
UINT64 Block
PXE_VOID Block(UINT64 unq_id, UINT32 enable);.
Definition: UefiPxe.h:1007
UINT64 Unique_ID
protocol driver can provide anything for this Unique_ID, UNDI remembers that as just a 64bit value as...
Definition: UefiPxe.h:1080
#define PXE_OPFLAGS_RECEIVE_FILTER_ALL_MULTICAST
Enable promiscuous multicast packet receiving.
Definition: UefiPxe.h:311
#define PXE_OPCODE_RECEIVE
Receive packet.
Definition: UefiPxe.h:173
uint8_t data[48]
Additional event data.
Definition: ena.h:22
static void nii_pci_close(struct nii_nic *nii)
Close PCI I/O protocol.
Definition: nii.c:293
static int nii_get_init_info(struct nii_nic *nii, struct net_device *netdev)
Get initialisation information.
Definition: nii.c:700
#define PXE_OPCODE_RECEIVE_FILTERS
Read & change state of packet receive filters.
Definition: UefiPxe.h:133
#define PXE_OPFLAGS_RECEIVE_FILTER_PROMISCUOUS
Enable promiscuous packet receiving.
Definition: UefiPxe.h:305
size_t buffer_len
Hardware transmit/receive buffer length.
Definition: nii.c:183
PXE_UINT8 PXE_MAC_ADDR[PXE_MAC_LENGTH]
Definition: UefiPxe.h:677
static EFIAPI VOID nii_unmap(UINT64 unique_id, UINT64 addr, UINT32 len, UINT32 dir __unused, UINT64 mapped)
Unmap callback.
Definition: nii.c:435
size_t mtu
Maximum packet length.
Definition: nii.c:178
EFI_SYSTEM_TABLE * efi_systab
uint16_t protocol
Protocol ID.
Definition: stp.h:19
A write operation from system memory by a bus master.
Definition: PciIo.h:88
static void nii_stop_undi(struct nii_nic *nii)
Stop UNDI.
Definition: nii.c:679
UINT16 IfNum
The network interface number that is being identified by this Network Interface Identifier Protocol.
#define PXE_ROMID_IMP_PROMISCUOUS_MULTICAST_RX_SUPPORTED
Definition: UefiPxe.h:867
uint8_t ll_addr[MAX_LL_ADDR_LEN]
Link-layer address.
Definition: netdevice.h:388
size_t max_pkt_len
Maximum packet length.
Definition: netdevice.h:410
EFI_RESTORE_TPL RestoreTPL
Definition: UefiSpec.h:1941
#define NII_RX_QUOTA
Maximum number of received packets per poll.
Definition: nii.c:201
static void nii_poll_rx(struct net_device *netdev)
Poll for received packets.
Definition: nii.c:1052
#define PXE_OPCODE_GET_INIT_INFO
Get UNDI initialization information.
Definition: UefiPxe.h:103
#define PXE_MEM_READ
Definition: UefiPxe.h:1091
#define PXE_OPFLAGS_STATION_ADDRESS_READ
UNDI Station Address.
Definition: UefiPxe.h:316
#define fls(x)
Find last (i.e.
Definition: strings.h:167
static void efidev_set_drvdata(struct efi_device *efidev, void *priv)
Set EFI driver-private data.
Definition: efi_driver.h:84
The EFI_PCI_IO_PROTOCOL provides the basic Memory, I/O, PCI configuration, and DMA interfaces used to...
Definition: PciIo.h:519
struct device dev
Generic device.
Definition: efi_driver.h:20
#define PXE_MEM_WRITE
Definition: UefiPxe.h:1092
uint8_t hw_addr[MAX_HW_ADDR_LEN]
Hardware address.
Definition: netdevice.h:382
#define NULL
NULL pointer (VOID *)
Definition: Base.h:322
struct list_head mappings
Mapping list.
Definition: nii.c:197
PXE_UINT16 IFnum
Definition: UefiPxe.h:885
#define PXE_OPCODE_START
Change UNDI operational state from Stopped to Started.
Definition: UefiPxe.h:93
String functions.
void iob_pad(struct io_buffer *iobuf, size_t min_len)
Pad I/O buffer.
Definition: iobpad.c:50
UINT64 UnMap_Mem
PXE_VOID UnMap_Mem(UINT64 unq_id, UINT64 virtual_addr, UINT32 size, UINT32 Direction,...
Definition: UefiPxe.h:1060
PXE_OPCODE OpCode
Definition: UefiPxe.h:877
#define PXE_OPFLAGS_GET_MEDIA_STATUS
Return current media status.
Definition: UefiPxe.h:370
Definition: efi.h:62
struct ll_protocol * ll_protocol
Link-layer protocol.
Definition: netdevice.h:373
static int nii_issue_cpb(struct nii_nic *nii, unsigned int op, void *cpb, size_t cpb_len)
Issue command with parameter block.
Definition: nii.c:607
void efi_device_info(EFI_HANDLE device, const char *prefix, struct device *dev)
Get underlying device information.
Definition: efi_utils.c:189
#define NII_OP(opcode, opflags)
Construct operation from opcode and flags.
Definition: nii.c:529
String functions.
static int nii_pci_open(struct nii_nic *nii)
Open PCI I/O protocol and identify BARs.
Definition: nii.c:209
PXE_UINT64 DBaddr
Definition: UefiPxe.h:882
#define PXE_STATCODE_SUCCESS
Common StatCodes returned by all UNDI commands, UNDI protocol functions and BC protocol functions.
Definition: UefiPxe.h:605
void * memset(void *dest, int character, size_t len) __nonnull
A persistent I/O buffer.
Definition: iobuf.h:38
struct io_buffer * rxbuf
Current receive buffer.
Definition: nii.c:194
#define PXE_OPFLAGS_INITIALIZE_DO_NOT_DETECT_CABLE
Definition: UefiPxe.h:215