/** * Issue command with parameter block and data block * * @v nii NII NIC * @v op Operation * @v cpb Command parameter block, or NULL * @v cpb_len Command parameter block length * @v db Data block, or NULL * @v db_len Data block length * @ret stat Status flags, or negative status code */ 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 ) { PXE_CDB cdb; /* Prepare command descriptor block */ memset ( &cdb, 0, sizeof ( cdb ) ); cdb.OpCode = NII_OPCODE ( op ); cdb.OpFlags = NII_OPFLAGS ( op ); cdb.CPBaddr = ( ( intptr_t ) cpb ); cdb.CPBsize = cpb_len; cdb.DBaddr = ( ( intptr_t ) db ); cdb.DBsize = db_len; cdb.IFnum = nii->nii->IfNum; /* Issue command */ DBGC2 ( nii, "NII %s issuing %02x:%04x ifnum %d%s%s\n", nii->dev.name, cdb.OpCode, cdb.OpFlags, cdb.IFnum, ( cpb ? " cpb" : "" ), ( db ? " db" : "" ) ); if ( cpb ) DBGC2_HD ( nii, cpb, cpb_len ); if ( db ) DBGC2_HD ( nii, db, db_len ); nii->issue ( ( intptr_t ) &cdb ); /* Check completion status */ if ( cdb.StatCode != PXE_STATCODE_SUCCESS ) return -cdb.StatCode; /* Return command-specific status flags */ return ( cdb.StatFlags & ~PXE_STATFLAGS_STATUS_MASK ); }
/** * Issue command with parameter block and data block * * @v nii NII NIC * @v op Operation * @v cpb Command parameter block, or NULL * @v cpb_len Command parameter block length * @v db Data block, or NULL * @v db_len Data block length * @ret stat Status flags, or negative status code */ 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 ) { PXE_CDB cdb; /* Prepare command descriptor block */ memset ( &cdb, 0, sizeof ( cdb ) ); cdb.OpCode = NII_OPCODE ( op ); cdb.OpFlags = NII_OPFLAGS ( op ); cdb.CPBaddr = ( ( intptr_t ) cpb ); cdb.CPBsize = cpb_len; cdb.DBaddr = ( ( intptr_t ) db ); cdb.DBsize = db_len; cdb.IFnum = nii->nii->IfNum; /* Issue command */ nii->issue ( ( intptr_t ) &cdb ); /* Check completion status */ if ( cdb.StatCode != PXE_STATCODE_SUCCESS ) return -cdb.StatCode; /* Return command-specific status flags */ return ( cdb.StatFlags & ~PXE_STATFLAGS_STATUS_MASK ); }