struct OperationTraits

Defined at line 103 of file ../../src/devices/lib/dev-operation/include/lib/operation/nand.h

Usage notes:

nand::Operation is a c++ wrapper around the nand_operation_t object. It provides

capabilities to interact with a nand_op buffer which is used to traverse the

nand stack. On deletion, it will automatically free itself.

nand::BorrowedOperation provides an unowned variant of nand::Operation. It adds

functionality to store and call a complete callback which isn't present in

nand::Operation. In addition, it will call the completion on destruction if it

wasn't already triggered.

nand::OperationPool provides pooling functionality for nand::Operation reuse.

nand::OperationQueue provides a queue interface for tracking nand::Operation and

nand::BorrowedOperation objects.

Available methods for both Operation and BorrowedOperation include:

nand_operation_t* operation(); // accessor for inner type.

// Takes ownership of inner type. Should only be used when transferring

// ownership to another driver.

nand_operation_t* take();

Available to Operation and BorrowedOperation if they templatize of Storage:

Storage* private_storage(); // accessor for private storage.

Available to Operation:

void Release(); // Frees the inner type.

Available to BorrowedOperation:

void Complete(zx_status_t); // Completes the operation.

////////////////////////////////////////////////////////////////////////////

Example: Basic allocation with a pool:

nand::OperationPool

<

> pool;

const size_t op_size = nand::Operation

<

>::OperationSize(parent_op_size);

for (int i = 0; i

<

kNumRequest; i++) {

std::optional

<nand

::Operation> request;

request = nand::Operation::Alloc(op_size, parent_op_size);

if (!request) return ZX_ERR_NO_MEMORY;

pool.add(*std::move(request));

}

////////////////////////////////////////////////////////////////////////////

Example: Enqueue incoming operation into a nand::OperationQueue:

class Driver {

public:

<

...>

private:

nand::BorrowedOperationQueue

<

> operations_;

const size_t parent_op_size_;

};

void Driver::NandQueue(nand_operation_t* op, nand_queue_callback completion_cb, void* cookie) {

operations_.push(nand::BorrowedOperation

<

>(op, cb, parent_req_size_));

}

////////////////////////////////////////////////////////////////////////////

Example: Using private context only visible to your driver:

struct PrivateStorage {

bool valid;

size_t count_metric;

}

using NandOperation = nand::BorrowedOperation

<PrivateStorage

>;

void Driver::NandQueue(nand_operation_t* op, nand_queue_callback completion_cb, void* cookie) {

NandOperation nand_op(op, cb, parent_req_size_));

ZX_DEBUG_ASSERT(nand_op.operation()->command == NAND_ERASE);

nand_op.private_storage()->valid = true;

nand_op.private_storage()->count_metric += 1;

<

...>

}

Public Methods

OperationType * Alloc (size_t op_size)

Defined at line 106 of file ../../src/devices/lib/dev-operation/include/lib/operation/nand.h

void Free (OperationType * op)

Defined at line 121 of file ../../src/devices/lib/dev-operation/include/lib/operation/nand.h