32/64-bit UNDI Specification
Version 1.02 12/12/00 421
Preparing the CPB
The CPB for the S/W UNDI Start command (shown below) must be filled in and the size and
address of the CPB must be given in the CDB.
#pragma pack(1)
typedef struct s_pxe_cpb_start {
// PXE_VOID Delay(PXE_UINT64 microseconds);
// UNDI will never request a delay smaller than 10 microseconds
// and will always request delays in increments of 10
// microseconds. The Delay() CallBack routine must delay between
// n and n + 10 microseconds before returning control to the
// UNDI.
// This field cannot be set to zero.
PXE_UINT64 Delay;
// PXE_VOID Block(PXE_UINT32 enable);
// UNDI may need to block multi-threaded/multi-processor access
// to critical code sections when programming or accessing the
// network device. To this end, a blocking service is needed by
// the UNDI. When UNDI needs a block, it will call Block()
// passing a non-zero value. When UNDI no longer needs a block,
// it will call Block() with a zero value. When called, if the
// Block() is already enabled, do not return control to the UNDI
// until the previous Block() is disabled.
// This field cannot be set to zero.
PXE_UINT64 Block;
// PXE_VOID Virt2Phys(PXE_UINT64 virtual, PXE_UINT64
// physical_ptr);
// UNDI will pass the virtual address of a buffer and the virtual
// address of a 64-bit physical buffer. Convert the virtual
// address to a physical address and write the result to the
// physical address buffer. If virtual and physical addresses
// are the same, just copy the virtual address to the physical
// address buffer.