Here my methods:
Called from Start()...
IOReturn VSPDriverPrivate::ConnectDriverQueues()
{
IOReturn ret;
ret = m_driver->ConnectQueues(&m_itBuffer, &m_rxBuffer, &m_txBuffer, nullptr, nullptr, 0, 0, 8, 8);
if (ret != kIOReturnSuccess) {
VSPLog(LOG_PREFIX, "ConnectQueues failed to allocate IF/RX/TX buffers.\n");
return ret;
}
if (m_itBuffer == nullptr) {
VSPLog(LOG_PREFIX, "Invalid interrupt buffer detected.\n");
ret = kIOReturnInvalid;
return ret;
}
if (m_rxBuffer == nullptr) {
VSPLog(LOG_PREFIX, "Invalid RX buffer detected.\n");
return kIOReturnInvalid;
}
if (m_txBuffer == nullptr) {
VSPLog(LOG_PREFIX, "Invalid TX buffer detected.\n");
return kIOReturnInvalid;
}
return kIOReturnSuccess;
}
Inside TxDataAvailable()
IOReturn VSPDriverPrivate::TxDataAvailable()
{
IOReturn ret = kIOReturnSuccess;
IOMemoryMap* map = nullptr;
VSPLog(LOG_PREFIX, "TxDataAvailable called.\n");
if (m_txBuffer == nullptr) {
return kIOReturnBadArgument;
}
// Access memory of RX IOMemoryDescriptor
ret = m_txBuffer->CreateMapping(kIOMemoryMapReadOnly, 0, 0, 0, 0, &map);
if (ret != kIOReturnSuccess) {
VSPLog(LOG_PREFIX, "TxDataAvailable: Failed to get memory map. code=%d\n", ret);
return ret;
}
// Send data to ...
const char* buffer = reinterpret_cast<char*>(map->GetAddress());
const uint64_t size = map->GetLength();
VSPLog(LOG_PREFIX, "TxDataAvailable: address=0x%llx length=%llu\n", (uint64_t) buffer, size);
VSPLog(LOG_PREFIX, "TxDataAvailable: debug TX buffer\n");
// !! Debug ....
for (uint64_t i = 0; i < size && i < 16; i++) {
VSPLog(LOG_PREFIX, "TxDataAvailable: TX> 0x%02x %c\n", buffer[i], buffer[i]);
}
// copy data to send into tx FIFO buffer
memcpy(m_fifo.tx.buffer, buffer, (size < m_fifo.tx.size ? size : m_fifo.tx.size));
// !! cleanup
OSSafeReleaseNULL(map);
return kIOReturnSuccess;
Topic:
App & System Services
SubTopic:
Core OS
Tags: