mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-10-31 22:48:21 +00:00
dpc: add dpc_prepare
This commit is contained in:
@@ -43,7 +43,8 @@ static int loopback_sendpacket(netdev_t *netdev, netdesc_t desc, mac_t targetmac
|
||||
memcpy(desc.address, ðframe, sizeof(ethframe_t));
|
||||
|
||||
dpc_t dpc = {0};
|
||||
dpc_enqueue(&dpc, rx_dpc, desc.address);
|
||||
dpc_prepare(&dpc, rx_dpc);
|
||||
dpc_enqueue(&dpc, desc.address);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -152,10 +152,10 @@ static void rtl8169_isr(isr_t *self, context_t *) {
|
||||
outw(dev->bar.address + REGISTER_IRQ_STATUS, status);
|
||||
|
||||
if (status & (REGISTER_IRQ_STATUS_TX_OK | REGISTER_IRQ_STATUS_TX_ERROR))
|
||||
dpc_enqueue(&dev->tx_dpc, rtl8169_dpc_tx, dev);
|
||||
dpc_enqueue(&dev->tx_dpc, dev);
|
||||
|
||||
if (status & (REGISTER_IRQ_STATUS_RX_OK | REGISTER_IRQ_STATUS_RX_ERROR))
|
||||
dpc_enqueue(&dev->rx_dpc, rtl8169_dpc_rx, dev);
|
||||
dpc_enqueue(&dev->rx_dpc, dev);
|
||||
|
||||
status = inw(dev->bar.address + REGISTER_IRQ_STATUS);
|
||||
}
|
||||
@@ -311,7 +311,7 @@ static void init_controller(pcienum_t *pci_enum) {
|
||||
|
||||
outb(pci_bar.address + REGISTER_COMMAND, REGISTER_COMMAND_TX_ENABLE);
|
||||
outd(pci_bar.address + REGISTER_TX_CONFIG, REGISTER_TX_CONFIG_DMA_BURST_UNLIMITED | REGISTER_TX_CONFIG_IFG_NORMAL);
|
||||
|
||||
|
||||
outw(pci_bar.address + REGISTER_RX_MAX_SIZE, 1518);
|
||||
// 128 * 0xc, enough for an ethernet MTU (while 0xb would be enough, the datasheet says that it must be larger than the max size)
|
||||
outb(pci_bar.address + REGISTER_TX_MAX_SIZE, 0xc);
|
||||
@@ -337,6 +337,9 @@ static void init_controller(pcienum_t *pci_enum) {
|
||||
SEMAPHORE_INIT(&netdev->tx_semaphore, TX_DESCRIPTOR_COUNT);
|
||||
SPINLOCK_INIT(netdev->tx_lock);
|
||||
|
||||
dpc_prepare(&netdev->tx_dpc, rtl8169_dpc_tx);
|
||||
dpc_prepare(&netdev->rx_dpc, rtl8169_dpc_rx);
|
||||
|
||||
isr->priv = netdev;
|
||||
|
||||
char name[10];
|
||||
|
||||
@@ -54,7 +54,7 @@ static void rx_dpc(context_t *context, dpcarg_t arg) {
|
||||
|
||||
static void rx_irq(isr_t *isr, context_t *context) {
|
||||
vionetdev_t *netdev = isr->priv;
|
||||
dpc_enqueue(&netdev->rxdpc, rx_dpc, netdev);
|
||||
dpc_enqueue(&netdev->rxdpc, netdev);
|
||||
}
|
||||
|
||||
static void tx_dpc(context_t *context, dpcarg_t arg) {
|
||||
@@ -75,7 +75,7 @@ static void tx_dpc(context_t *context, dpcarg_t arg) {
|
||||
|
||||
static void tx_irq(isr_t *isr, context_t *context) {
|
||||
vionetdev_t *netdev = isr->priv;
|
||||
dpc_enqueue(&netdev->txdpc, tx_dpc, netdev);
|
||||
dpc_enqueue(&netdev->txdpc, netdev);
|
||||
}
|
||||
|
||||
#define PREFIX_SIZE (sizeof(ethframe_t) + sizeof(vioframe_t))
|
||||
@@ -178,6 +178,8 @@ int vionet_newdevice(viodevice_t *viodevice) {
|
||||
netdev->netdev.allocdesc = vionet_allocdesc;
|
||||
netdev->netdev.freedesc = vionet_freedesc;
|
||||
__assert(hashtable_init(&netdev->netdev.arpcache, 30) == 0);
|
||||
dpc_prepare(&netdev->rxdpc, rx_dpc);
|
||||
dpc_prepare(&netdev->txdpc, tx_dpc);
|
||||
|
||||
// initialize queues
|
||||
size_t rxsize = min(QUEUE_MAX_SIZE, virtio_queuesize(viodevice, 0));
|
||||
|
||||
Reference in New Issue
Block a user