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
24FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
25FILE_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 */
145 /** List of mappings */
147 /** Mapped address */
149 /** Mapping cookie created by PCI I/O protocol */
151};
152
153/** An NII NIC */
154struct 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 */
184
185 /** Saved task priority level */
187
188 /** Media status is supported */
189 int media;
190
191 /** Current transmit buffer */
193 /** Current receive buffer */
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 */
209static int nii_pci_open ( struct nii_nic *nii ) {
210 EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
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 */
293static 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 */
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 */
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 ) {
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 */
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 */
495static 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 */
506static EFIAPI VOID nii_block ( UINT64 unique_id, UINT32 acquire ) {
507 struct nii_nic *nii = ( ( void * ) ( intptr_t ) unique_id );
508 EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
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 */
558static 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 ) {
560 EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
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 */
607static 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 */
622static 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 */
636static 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 */
647static int nii_start_undi ( struct nii_nic *nii ) {
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 */
679static 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 */
700static 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 ) {
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 */
747static int nii_initialise_flags ( struct nii_nic *nii, unsigned int flags ) {
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 */
793static 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 */
807static 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 */
820static 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 */
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,
867 netdev->ll_protocol->ll_addr_len );
868 memcpy ( netdev->hw_addr, db.PermanentAddr,
869 netdev->ll_protocol->hw_addr_len );
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 */
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 ) );
900 memcpy ( cpb.StationAddr, netdev->ll_addr,
901 netdev->ll_protocol->ll_addr_len );
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 */
923static 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 */
964
965/**
966 * Disable receive filters
967 *
968 * @v nii NII NIC
969 * @ret rc Return status code
970 */
975
976/**
977 * Transmit packet
978 *
979 * @v netdev Network device
980 * @v iobuf I/O buffer
981 * @ret rc Return status code
982 */
983static int nii_transmit ( struct net_device *netdev,
984 struct io_buffer *iobuf ) {
985 struct nii_nic *nii = netdev->priv;
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 */
1029static 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 */
1052static 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 ) );
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 */
1109static 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 ) ) ) {
1116 }
1117}
1118
1119/**
1120 * Poll for completed packets
1121 *
1122 * @v netdev Network device
1123 */
1124static 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 )
1155}
1156
1157/**
1158 * Open network device
1159 *
1160 * @v netdev Network device
1161 * @ret rc Return status code
1162 */
1163static 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 */
1234static 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 */
1287int 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,
1366 netdev->name, efi_handle_name ( device ) );
1367
1368 /* Set initial link state (if media detection is not supported) */
1369 if ( ! nii->media )
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 );
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 */
1398void 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 );
1418 netdev_put ( netdev );
1419}
UINT64 UINTN
Unsigned value of native width.
unsigned long long UINT64
8-byte unsigned value.
#define EFIAPI
unsigned char UINT8
1-byte unsigned value.
unsigned int UINT32
4-byte unsigned value.
ACPI 1.0b definitions from the ACPI Specification, revision 1.0b.
#define ACPI_ADDRESS_SPACE_TYPE_IO
Definition Acpi10.h:102
PACKED struct @070126363266142000122014272037224307124317056203 EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR
The common definition of QWORD, DWORD, and WORD Address Space Descriptors.
#define ACPI_ADDRESS_SPACE_TYPE_MEM
Definition Acpi10.h:101
#define NULL
NULL pointer (VOID *)
Definition Base.h:322
#define VOID
Undeclared type.
Definition Base.h:272
EFI Network Interface Identifier Protocol.
struct _EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL
Forward reference for pure ANSI compatability.
EFI_PCI_IO_PROTOCOL_WIDTH
Definition PciIo.h:31
EFI_PCI_IO_PROTOCOL_OPERATION
Definition PciIo.h:80
@ EfiPciIoOperationBusMasterWrite
A write operation from system memory by a bus master.
Definition PciIo.h:88
@ EfiPciIoOperationBusMasterRead
A read operation from system memory by a bus master.
Definition PciIo.h:84
@ EfiPciIoOperationBusMasterCommonBuffer
Provides both read and write access to system memory by both the processor and a bus master.
Definition PciIo.h:93
struct _EFI_PCI_IO_PROTOCOL EFI_PCI_IO_PROTOCOL
Definition PciIo.h:24
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
UINT64 EFI_PHYSICAL_ADDRESS
64-bit physical memory address.
#define EFI_UNSUPPORTED
Enumeration of EFI_STATUS.
RETURN_STATUS EFI_STATUS
Function return status for EFI API.
UINTN EFI_TPL
Task priority level.
GUID EFI_GUID
128-bit buffer containing a unique identifier value.
PXE_UINT8 PXE_MAC_ADDR[PXE_MAC_LENGTH]
Definition UefiPxe.h:677
#define PXE_OPCODE_TRANSMIT
Transmit packet(s).
Definition UefiPxe.h:168
#define PXE_ROMID_IMP_PROMISCUOUS_MULTICAST_RX_SUPPORTED
Definition UefiPxe.h:867
#define PXE_OPFLAGS_RECEIVE_FILTER_UNICAST
Enable unicast packet receiving.
Definition UefiPxe.h:287
#define PXE_OPFLAGS_TRANSMIT_DONT_BLOCK
Definition UefiPxe.h:389
struct s_pxe_db_initialize PXE_DB_INITIALIZE
#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
#define PXE_STATFLAGS_GET_STATUS_NO_MEDIA_SUPPORTED
Definition UefiPxe.h:444
#define PXE_IFTYPE_ETHERNET
This information is from the ARP section of RFC 1700.
Definition UefiPxe.h:709
#define PXE_STATCODE_NO_DATA
Definition UefiPxe.h:625
struct s_pxe_dpb_station_address PXE_DB_STATION_ADDRESS
struct s_pxe_cpb_station_address PXE_CPB_STATION_ADDRESS
struct s_pxe_sw_undi PXE_SW_UNDI
struct s_pxe_cdb PXE_CDB
#define PXE_OPCODE_STATION_ADDRESS
Read & change station MAC address.
Definition UefiPxe.h:138
struct s_pxe_cpb_transmit PXE_CPB_TRANSMIT
#define PXE_MEM_READ
Definition UefiPxe.h:1091
struct s_pxe_db_get_init_info PXE_DB_GET_INIT_INFO
#define PXE_STATFLAGS_GET_STATUS_NO_MEDIA
This flag is set if there is no media detected.
Definition UefiPxe.h:577
#define FROM_DEVICE
Definition UefiPxe.h:1084
#define PXE_OPFLAGS_INITIALIZE_DO_NOT_DETECT_CABLE
Definition UefiPxe.h:215
#define TO_AND_FROM_DEVICE
Definition UefiPxe.h:1083
#define PXE_OPFLAGS_RECEIVE_FILTER_DISABLE
Definition UefiPxe.h:274
struct s_pxe_cpb_start_31 PXE_CPB_START_31
#define PXE_ROMID_IMP_STATION_ADDR_SETTABLE
Definition UefiPxe.h:866
#define TO_DEVICE
Definition UefiPxe.h:1085
#define PXE_OPFLAGS_GET_INTERRUPT_STATUS
UNDI Get Status.
Definition UefiPxe.h:355
#define PXE_OPFLAGS_GET_MEDIA_STATUS
Return current media status.
Definition UefiPxe.h:370
#define PXE_OPFLAGS_RECEIVE_FILTER_ENABLE
Definition UefiPxe.h:273
#define PXE_OPFLAGS_RECEIVE_FILTER_PROMISCUOUS
Enable promiscuous packet receiving.
Definition UefiPxe.h:305
#define PXE_OPFLAGS_GET_TRANSMITTED_BUFFERS
Return list of transmitted buffers for recycling.
Definition UefiPxe.h:365
struct s_pxe_db_get_status PXE_DB_GET_STATUS
#define PXE_OPFLAGS_STATION_ADDRESS_READ
UNDI Station Address.
Definition UefiPxe.h:316
struct s_pxe_db_receive PXE_DB_RECEIVE
#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
#define PXE_OPCODE_RECEIVE
Receive packet.
Definition UefiPxe.h:173
struct s_pxe_cpb_initialize PXE_CPB_INITIALIZE
#define PXE_ROMID_IMP_PROMISCUOUS_RX_SUPPORTED
Definition UefiPxe.h:868
#define PXE_OPCODE_INITIALIZE
Changed UNDI operational state from Started to Initialized.
Definition UefiPxe.h:113
#define PXE_ROMID_IMP_HW_UNDI
Implementation flags.
Definition UefiPxe.h:853
#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
#define PXE_OPFLAGS_TRANSMIT_WHOLE
Definition UefiPxe.h:393
#define PXE_ROMID_IMP_BROADCAST_RX_SUPPORTED
Definition UefiPxe.h:869
#define PXE_OPCODE_RECEIVE_FILTERS
Read & change state of packet receive filters.
Definition UefiPxe.h:133
#define PXE_OPFLAGS_STATION_ADDRESS_WRITE
Definition UefiPxe.h:317
#define PXE_MEM_WRITE
Definition UefiPxe.h:1092
#define PXE_OPFLAGS_RECEIVE_FILTER_ALL_MULTICAST
Enable promiscuous multicast packet receiving.
Definition UefiPxe.h:311
#define PXE_OPCODE_START
Change UNDI operational state from Stopped to Started.
Definition UefiPxe.h:93
#define PXE_OPCODE_GET_INIT_INFO
Get UNDI initialization information.
Definition UefiPxe.h:103
#define PXE_ROMID_IMP_SW_VIRT_ADDR
Definition UefiPxe.h:854
struct s_pxe_cpb_receive PXE_CPB_RECEIVE
#define PXE_STATCODE_SUCCESS
Common StatCodes returned by all UNDI commands, UNDI protocol functions and BC protocol functions.
Definition UefiPxe.h:605
#define PXE_OPCODE_SHUTDOWN
Change the UNDI operational state from Initialized to Started.
Definition UefiPxe.h:123
#define PXE_OPFLAGS_INITIALIZE_DETECT_CABLE
Definition UefiPxe.h:214
#define PXE_OPFLAGS_RECEIVE_FILTER_BROADCAST
Enable broadcast packet receiving.
Definition UefiPxe.h:293
#define TPL_NOTIFY
Definition UefiSpec.h:650
struct arbelprm_rc_send_wqe rc
Definition arbel.h:3
unsigned long intptr_t
Definition stdint.h:21
unsigned int uint32_t
Definition stdint.h:12
static const void * src
Definition string.h:48
#define assert(condition)
Assert a condition at run-time.
Definition assert.h:50
static struct dmfe_private * db
Definition dmfe.c:177
uint32_t stat
Completion status.
Definition dwmac.h:1
ring len
Length.
Definition dwmac.h:226
uint32_t addr
Buffer address.
Definition dwmac.h:9
static EFI_ACPI_TABLE_PROTOCOL * acpi
ACPI table protocol protocol.
Definition efi_block.c:67
const char * efi_handle_name(EFI_HANDLE handle)
Get name of an EFI handle.
Definition efi_debug.c:652
int efi_driver_exclude(EFI_HANDLE device, EFI_GUID *protocol)
Try to disconnect an existing EFI driver.
Definition efi_driver.c:438
EFI driver interface.
static void * efidev_get_drvdata(struct efi_device *efidev)
Get EFI driver-private data.
Definition efi_driver.h:98
static void efidev_set_drvdata(struct efi_device *efidev, void *priv)
Set EFI driver-private data.
Definition efi_driver.h:87
EFI_GUID efi_nii31_protocol_guid
Network interface identifier protocol GUID (new version)
Definition efi_guid.c:309
EFI_GUID efi_pci_io_protocol_guid
PCI I/O protocol GUID.
Definition efi_guid.c:313
EFI_TPL efi_internal_tpl
Internal task priority level.
Definition efi_init.c:54
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
void efi_close_unsafe(EFI_HANDLE handle, EFI_GUID *protocol)
Close protocol opened for unsafe persistent use.
Definition efi_open.c:219
EFI driver interface.
void efi_device_info(EFI_HANDLE device, const char *prefix, struct device *dev)
Get underlying device information.
Definition efi_utils.c:189
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
EFI utilities.
uint8_t data[48]
Additional event data.
Definition ena.h:11
uint32_t implementation
Implementation.
Definition ena.h:1
uint8_t flags
Flags.
Definition ena.h:7
struct ena_llq_option desc
Descriptor counts.
Definition ena.h:9
static signed char phys[4]
Definition epic100.c:88
Error codes.
Ethernet protocol.
static struct net_device * netdev
Definition gdbudp.c:53
#define __unused
Declare a variable or data structure as unused.
Definition compiler.h:573
#define DBGC2(...)
Definition compiler.h:522
#define DBGC2_HD(...)
Definition compiler.h:524
#define DBGC(...)
Definition compiler.h:505
static unsigned int count
Number of entries.
Definition dwmac.h:220
#define FILE_LICENCE(_licence)
Declare a particular licence as applying to a file.
Definition compiler.h:896
#define ENOMEM
Not enough space.
Definition errno.h:535
#define ENOTSUP
Operation not supported.
Definition errno.h:590
#define ECANCELED
Operation canceled.
Definition errno.h:344
#define ENODEV
No such device.
Definition errno.h:510
#define FILE_SECBOOT(_status)
Declare a file's UEFI Secure Boot permission status.
Definition compiler.h:926
#define ETH_ZLEN
Definition if_ether.h:11
EFI API.
#define efi_open_by_driver(handle, protocol, interface)
Open protocol for persistent use by a driver.
Definition efi.h:474
#define EFI_HANDLE
Definition efi.h:53
#define EEFI(efirc)
Convert an EFI status code to an iPXE status code.
Definition efi.h:175
#define efi_open_unsafe(handle, protocol, interface)
Open protocol for unsafe persistent use.
Definition efi.h:459
#define DBGC_EFI_OPENERS(...)
Definition efi.h:345
EFI_SYSTEM_TABLE * efi_systab
User memory allocation.
static __always_inline void * umalloc(size_t size)
Allocate external memory.
Definition umalloc.h:57
static __always_inline void ufree(void *ptr)
Free external memory.
Definition umalloc.h:68
String functions.
void * memcpy(void *dest, const void *src, size_t len) __nonnull
void * memset(void *dest, int character, size_t len) __nonnull
String functions.
#define fls(x)
Find last (i.e.
Definition strings.h:167
void iob_pad(struct io_buffer *iobuf, size_t min_len)
Pad I/O buffer.
Definition iobpad.c:50
void free_iob(struct io_buffer *iobuf)
Free I/O buffer.
Definition iobuf.c:153
struct io_buffer * alloc_iob(size_t len)
Allocate I/O buffer.
Definition iobuf.c:131
#define iob_put(iobuf, len)
Definition iobuf.h:125
static size_t iob_len(struct io_buffer *iobuf)
Calculate length of data in an I/O buffer.
Definition iobuf.h:160
static size_t iob_tailroom(struct io_buffer *iobuf)
Calculate available space at end of an I/O buffer.
Definition iobuf.h:180
static __always_inline int struct dma_mapping * map
Definition dma.h:184
unsigned long tmp
Definition linux_pci.h:65
#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
#define list_for_each_entry(pos, head, member)
Iterate over entries in a list.
Definition list.h:432
#define list_del(list)
Delete an entry from a list.
Definition list.h:120
#define INIT_LIST_HEAD(list)
Initialise a list head.
Definition list.h:46
#define list_add(new, head)
Add a new entry to the head of a list.
Definition list.h:70
void * zalloc(size_t size)
Allocate cleared memory.
Definition malloc.c:662
void netdev_link_down(struct net_device *netdev)
Mark network device as having link down.
Definition netdevice.c:231
void netdev_rx(struct net_device *netdev, struct io_buffer *iobuf)
Add packet to receive queue.
Definition netdevice.c:549
void unregister_netdev(struct net_device *netdev)
Unregister network device.
Definition netdevice.c:942
void netdev_tx_defer(struct net_device *netdev, struct io_buffer *iobuf)
Defer transmitted packet.
Definition netdevice.c:413
void netdev_tx_complete_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Complete network transmission.
Definition netdevice.c:471
struct net_device * alloc_netdev(size_t priv_len)
Allocate network device.
Definition netdevice.c:722
void netdev_rx_err(struct net_device *netdev, struct io_buffer *iobuf, int rc)
Discard received packet.
Definition netdevice.c:587
int register_netdev(struct net_device *netdev)
Register network device.
Definition netdevice.c:760
Network device management.
static int netdev_link_ok(struct net_device *netdev)
Check link state of network device.
Definition netdevice.h:640
static void netdev_link_up(struct net_device *netdev)
Mark network device as having link up.
Definition netdevice.h:789
static void netdev_init(struct net_device *netdev, struct net_device_operations *op)
Initialise a network device.
Definition netdevice.h:519
static void netdev_nullify(struct net_device *netdev)
Stop using a network device.
Definition netdevice.h:532
static void netdev_put(struct net_device *netdev)
Drop reference to network device.
Definition netdevice.h:576
static void netdev_tx_complete(struct net_device *netdev, struct io_buffer *iobuf)
Complete network transmission.
Definition netdevice.h:767
static uint16_t struct vmbus_xfer_pages_operations * op
Definition netvsc.h:327
static int nii_pci_open(struct nii_nic *nii)
Open PCI I/O protocol and identify BARs.
Definition nii.c:209
static void nii_shutdown(struct nii_nic *nii)
Shut down UNDI.
Definition nii.c:820
static void nii_poll(struct net_device *netdev)
Poll for completed packets.
Definition nii.c:1124
static void nii_pci_close(struct nii_nic *nii)
Close PCI I/O protocol.
Definition nii.c:293
static void nii_stop_undi(struct nii_nic *nii)
Stop UNDI.
Definition nii.c:679
static int nii_initialise_cable(struct nii_nic *nii)
Initialise UNDI with cable detection.
Definition nii.c:793
static int nii_disable_rx_filters(struct nii_nic *nii)
Disable receive filters.
Definition nii.c:971
#define PCI_MAX_BAR
Maximum PCI BAR.
Definition nii.c:141
static int nii_start_undi(struct nii_nic *nii)
Start UNDI.
Definition nii.c:647
int nii_start(struct efi_device *efidev)
Attach driver to device.
Definition nii.c:1287
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
static EFIAPI VOID nii_map(UINT64 unique_id, UINT64 addr, UINT32 len, UINT32 dir, UINT64 mapped)
Map callback.
Definition nii.c:365
static EFIAPI VOID nii_io(UINT64 unique_id, UINT8 op, UINT8 len, UINT64 addr, UINT64 data)
I/O callback.
Definition nii.c:319
static int nii_initialise(struct nii_nic *nii)
Initialise UNDI.
Definition nii.c:807
static void nii_poll_rx(struct net_device *netdev)
Poll for received packets.
Definition nii.c:1052
static int nii_initialise_flags(struct nii_nic *nii, unsigned int flags)
Initialise UNDI.
Definition nii.c:747
static EFIAPI VOID nii_block(UINT64 unique_id, UINT32 acquire)
Block callback.
Definition nii.c:506
static EFIAPI VOID nii_sync(UINT64 unique_id __unused, UINT64 addr, UINT32 len, UINT32 dir, UINT64 mapped)
Sync callback.
Definition nii.c:467
int nii_exclude(EFI_HANDLE device)
Exclude existing drivers.
Definition nii.c:1267
static EFIAPI VOID nii_delay(UINT64 unique_id __unused, UINTN microseconds)
Delay callback.
Definition nii.c:495
#define NII_OPCODE(op)
Extract opcode from operation.
Definition nii.c:537
static void nii_poll_link(struct net_device *netdev, unsigned int stat)
Check for link state changes.
Definition nii.c:1109
void nii_stop(struct efi_device *efidev)
Detach driver from device.
Definition nii.c:1398
#define NII_OP(opcode, opflags)
Construct operation from opcode and flags.
Definition nii.c:529
static void nii_poll_tx(struct net_device *netdev, unsigned int stat)
Poll for completed packets.
Definition nii.c:1029
static int nii_open(struct net_device *netdev)
Open network device.
Definition nii.c:1163
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
static struct net_device_operations nii_operations
NII network device operations.
Definition nii.c:1254
#define NII_OPFLAGS(op)
Extract flags from operation.
Definition nii.c:545
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
static int nii_transmit(struct net_device *netdev, struct io_buffer *iobuf)
Transmit packet.
Definition nii.c:983
static int nii_set_rx_filters(struct nii_nic *nii, unsigned int flags)
Set receive filters.
Definition nii.c:923
static EFIAPI VOID nii_unmap(UINT64 unique_id, UINT64 addr, UINT32 len, UINT32 dir __unused, UINT64 mapped)
Unmap callback.
Definition nii.c:435
static int nii_get_station_address(struct nii_nic *nii, struct net_device *netdev)
Get station addresses.
Definition nii.c:844
static int nii_set_station_address(struct nii_nic *nii, struct net_device *netdev)
Set station address.
Definition nii.c:886
static void nii_close(struct net_device *netdev)
Close network device.
Definition nii.c:1234
#define EIO_STAT(stat)
Definition nii.c:127
static int nii_issue(struct nii_nic *nii, unsigned int op)
Issue command.
Definition nii.c:636
static int nii_get_init_info(struct nii_nic *nii, struct net_device *netdev)
Get initialisation information.
Definition nii.c:700
static int nii_enable_rx_filters(struct nii_nic *nii)
Enable receive filters.
Definition nii.c:960
#define NII_RX_QUOTA
Maximum number of received packets per poll.
Definition nii.c:201
NII driver.
static void(* free)(struct refcnt *refcnt))
Definition refcnt.h:55
uint16_t protocol
Protocol ID.
Definition stp.h:7
char * strerror(int errno)
Retrieve string representation of error number.
Definition strerror.c:79
EFI Boot Services Table.
Definition UefiSpec.h:1931
EFI_RESTORE_TPL RestoreTPL
Definition UefiSpec.h:1941
EFI_FREE_POOL FreePool
Definition UefiSpec.h:1950
EFI_RAISE_TPL RaiseTPL
Definition UefiSpec.h:1940
EFI_PCI_IO_PROTOCOL_IO_MEM Write
Write PCI controller registers in the PCI memory or I/O space.
Definition PciIo.h:200
EFI_PCI_IO_PROTOCOL_IO_MEM Read
Read PCI controller registers in the PCI memory or I/O space.
Definition PciIo.h:196
UINT16 IfNum
The network interface number that is being identified by this Network Interface Identifier Protocol.
UINT64 Id
The address of the first byte of the identifying structure for this network interface.
EFI_PCI_IO_PROTOCOL_UNMAP Unmap
Definition PciIo.h:527
EFI_PCI_IO_PROTOCOL_GET_BAR_ATTRIBUTES GetBarAttributes
Definition PciIo.h:533
EFI_PCI_IO_PROTOCOL_MAP Map
Definition PciIo.h:526
A hardware device.
Definition device.h:77
struct list_head children
Devices attached to this device.
Definition device.h:87
char name[40]
Name.
Definition device.h:79
An EFI device.
Definition efi_driver.h:18
EFI_HANDLE device
EFI device handle.
Definition efi_driver.h:22
struct device dev
Generic device.
Definition efi_driver.h:20
A persistent I/O buffer.
Definition iobuf.h:38
void * data
Start of data.
Definition iobuf.h:53
A doubly-linked list entry (or list head)
Definition list.h:19
Network device operations.
Definition netdevice.h:214
A network device.
Definition netdevice.h:353
An NII memory mapping.
Definition nii.c:144
VOID * mapping
Mapping cookie created by PCI I/O protocol.
Definition nii.c:150
struct list_head list
List of mappings.
Definition nii.c:146
UINT64 addr
Mapped address.
Definition nii.c:148
An NII NIC.
Definition nii.c:154
struct device dev
Generic device.
Definition nii.c:164
unsigned int io_bar
I/O BAR.
Definition nii.c:173
EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL * nii
Network interface identifier protocol.
Definition nii.c:158
struct io_buffer * txbuf
Current transmit buffer.
Definition nii.c:192
PXE_SW_UNDI * undi
!PXE structure
Definition nii.c:160
PXE_MAC_ADDR broadcast
Broadcast address.
Definition nii.c:176
unsigned int mem_bar
Memory BAR.
Definition nii.c:171
int media
Media status is supported.
Definition nii.c:189
EFIAPI VOID(* issue)(UINT64 cdb)
Entry point.
Definition nii.c:162
struct io_buffer * rxbuf
Current receive buffer.
Definition nii.c:194
size_t buffer_len
Hardware transmit/receive buffer length.
Definition nii.c:183
struct efi_device * efidev
EFI device.
Definition nii.c:156
struct list_head mappings
Mapping list.
Definition nii.c:197
EFI_HANDLE pci_device
PCI device.
Definition nii.c:167
void * buffer
Hardware transmit/receive buffer.
Definition nii.c:181
EFI_TPL saved_tpl
Saved task priority level.
Definition nii.c:186
size_t mtu
Maximum packet length.
Definition nii.c:178
EFI_PCI_IO_PROTOCOL * pci_io
PCI I/O protocol.
Definition nii.c:169
A PCI device.
Definition pci.h:211
PXE_UINT64 CPBaddr
Definition UefiPxe.h:881
PXE_STATCODE StatCode
Definition UefiPxe.h:883
PXE_UINT16 DBsize
Definition UefiPxe.h:880
PXE_STATFLAGS StatFlags
Definition UefiPxe.h:884
PXE_UINT16 IFnum
Definition UefiPxe.h:885
PXE_OPFLAGS OpFlags
Definition UefiPxe.h:878
PXE_UINT64 DBaddr
Definition UefiPxe.h:882
PXE_OPCODE OpCode
Definition UefiPxe.h:877
PXE_UINT16 CPBsize
Definition UefiPxe.h:879
PXE_UINT32 MemoryLength
MemoryLength must be greater than or equal to MemoryRequired returned by the Get Init Info command.
Definition UefiPxe.h:1255
PXE_UINT64 MemoryAddr
Address of first (lowest) byte of the memory buffer.
Definition UefiPxe.h:1249
PXE_UINT32 BufferLen
Length of receive buffer.
Definition UefiPxe.h:1738
PXE_UINT64 BufferAddr
Address of first byte of receive buffer.
Definition UefiPxe.h:1731
UINT64 UnMap_Mem
PXE_VOID UnMap_Mem(UINT64 unq_id, UINT64 virtual_addr, UINT32 size, UINT32 Direction,...
Definition UefiPxe.h:1060
UINT64 Sync_Mem
PXE_VOID Sync_Mem(UINT64 unq_id, UINT64 virtual, UINT32 size, UINT32 Direction,...
Definition UefiPxe.h:1072
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
UINT64 Delay
PXE_VOID Delay(UINT64 UnqId, UINTN microseconds);.
Definition UefiPxe.h:991
UINT64 Map_Mem
PXE_VOID Map_Mem(UINT64 unq_id, UINT64 virtual_addr, UINT32 size, UINT32 Direction,...
Definition UefiPxe.h:1049
UINT64 Mem_IO
PXE_VOID Mem_IO(UINT64 UnqId, UINT8 read_write, UINT8 len, UINT64 port, UINT64 buf_addr);...
Definition UefiPxe.h:1032
UINT64 Block
PXE_VOID Block(UINT64 unq_id, UINT32 enable);.
Definition UefiPxe.h:1007
PXE_MAC_ADDR StationAddr
If supplied and supported, the current station MAC address will be changed.
Definition UefiPxe.h:1339
PXE_UINT32 DataLen
Length of the data portion of the frame buffer in bytes.
Definition UefiPxe.h:1675
PXE_UINT64 FrameAddr
Address of first byte of frame buffer.
Definition UefiPxe.h:1669
void udelay(unsigned long usecs)
Delay for a fixed number of microseconds.
Definition timer.c:61