mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-10-29 13:48:21 +00:00
io: use isr->priv
This commit is contained in:
@@ -294,18 +294,15 @@ static void nvme_dpc(context_t *, dpcarg_t arg) {
|
||||
spinlock_release(&pair->lock);
|
||||
}
|
||||
|
||||
static hashtable_t irqtable;
|
||||
|
||||
static void nvme_irq(isr_t *isr, context_t *context) {
|
||||
void *v;
|
||||
__assert(hashtable_get(&irqtable, &v, &isr->id, sizeof(isr->id)) == 0);
|
||||
queuepair_t *pair = v;
|
||||
queuepair_t *pair = isr->priv;
|
||||
dpc_enqueue(&pair->dpc, nvme_dpc, pair);
|
||||
}
|
||||
|
||||
static isr_t *msixnewisrforqueue(queuepair_t *queuepair) {
|
||||
isr_t *isr = interrupt_allocate(nvme_irq, ARCH_EOI, IPL_DISK);
|
||||
__assert(isr);
|
||||
__assert(hashtable_set(&irqtable, queuepair, &isr->id, sizeof(isr->id), true) == 0);
|
||||
isr->priv = queuepair;
|
||||
return isr;
|
||||
}
|
||||
|
||||
@@ -764,7 +761,6 @@ static void initcontroller(pcienum_t *e) {
|
||||
}
|
||||
|
||||
void nvme_init() {
|
||||
__assert(hashtable_init(&irqtable, 10) == 0);
|
||||
int i = 0;
|
||||
for (;;) {
|
||||
pcienum_t *e = pci_getenum(PCI_CLASS_STORAGE, PCI_SUBCLASS_STORAGE_NVM, -1, -1, -1, -1, i++);
|
||||
|
||||
@@ -34,8 +34,6 @@ typedef struct {
|
||||
#define HEADER_TYPE_READ 0
|
||||
#define HEADER_TYPE_WRITE 1
|
||||
|
||||
static hashtable_t inttable; // int id -> vioblkdev
|
||||
|
||||
static void vioblk_dpc(context_t *context, dpcarg_t arg) {
|
||||
vioblkdev_t *blkdev = arg;
|
||||
volatile viobuffer_t *buffers = VIO_QUEUE_BUFFERS(&blkdev->queue);
|
||||
@@ -55,9 +53,7 @@ static void vioblk_dpc(context_t *context, dpcarg_t arg) {
|
||||
}
|
||||
|
||||
static void vioblk_irq(isr_t *isr, context_t *context) {
|
||||
void *v;
|
||||
__assert(hashtable_get(&inttable, &v, &isr->id, sizeof(isr->id)) == 0);
|
||||
vioblkdev_t *blkdev = v;
|
||||
vioblkdev_t *blkdev = isr->priv;
|
||||
dpc_enqueue(&blkdev->queuedpc, vioblk_dpc, blkdev);
|
||||
}
|
||||
|
||||
@@ -176,9 +172,9 @@ int vioblk_newdevice(viodevice_t *viodevice) {
|
||||
|
||||
isr_t *isr = interrupt_allocate(vioblk_irq, ARCH_EOI, IPL_DISK);
|
||||
__assert(isr);
|
||||
isr->priv = blkdev;
|
||||
pci_msixadd(viodevice->e, 0, INTERRUPT_IDTOVECTOR(isr->id), 0, 0);
|
||||
pci_msixsetmask(viodevice->e, 0);
|
||||
__assert(hashtable_set(&inttable, blkdev, &isr->id, sizeof(isr->id), true) == 0);
|
||||
|
||||
// initialize queue
|
||||
size_t size = min(QUEUE_MAX_SIZE, virtio_queuesize(viodevice, 0));
|
||||
@@ -205,7 +201,3 @@ int vioblk_newdevice(viodevice_t *viodevice) {
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void vioblk_init() {
|
||||
__assert(hashtable_init(&inttable, 10) == 0);
|
||||
}
|
||||
|
||||
@@ -38,8 +38,6 @@ typedef struct {
|
||||
uint16_t buffercount;
|
||||
} __attribute__((packed)) vioframe_t;
|
||||
|
||||
static hashtable_t irqtable; // isr id -> netdev
|
||||
|
||||
static void rx_dpc(context_t *context, dpcarg_t arg) {
|
||||
vionetdev_t *netdev = arg;
|
||||
volatile viobuffer_t *buffers = VIO_QUEUE_BUFFERS(&netdev->rxqueue);
|
||||
@@ -54,9 +52,7 @@ static void rx_dpc(context_t *context, dpcarg_t arg) {
|
||||
}
|
||||
|
||||
static void rx_irq(isr_t *isr, context_t *context) {
|
||||
void *v;
|
||||
__assert(hashtable_get(&irqtable, &v, &isr->id, sizeof(isr->id)) == 0);
|
||||
vionetdev_t *netdev = v;
|
||||
vionetdev_t *netdev = isr->priv;
|
||||
dpc_enqueue(&netdev->txdpc, rx_dpc, netdev);
|
||||
}
|
||||
|
||||
@@ -77,9 +73,7 @@ static void tx_dpc(context_t *context, dpcarg_t arg) {
|
||||
}
|
||||
|
||||
static void tx_irq(isr_t *isr, context_t *context) {
|
||||
void *v;
|
||||
__assert(hashtable_get(&irqtable, &v, &isr->id, sizeof(isr->id)) == 0);
|
||||
vionetdev_t *netdev = v;
|
||||
vionetdev_t *netdev = isr->priv;
|
||||
dpc_enqueue(&netdev->txdpc, tx_dpc, netdev);
|
||||
}
|
||||
|
||||
@@ -196,12 +190,13 @@ int vionet_newdevice(viodevice_t *viodevice) {
|
||||
isr_t *rxisr = interrupt_allocate(rx_irq, ARCH_EOI, IPL_NET);
|
||||
__assert(rxisr);
|
||||
pci_msixadd(viodevice->e, 0, INTERRUPT_IDTOVECTOR(rxisr->id), 1, 0);
|
||||
__assert(hashtable_set(&irqtable, netdev, &rxisr->id, sizeof(rxisr->id), true) == 0);
|
||||
rxisr->priv = netdev;
|
||||
|
||||
isr_t *txisr = interrupt_allocate(tx_irq, ARCH_EOI, IPL_NET);
|
||||
__assert(txisr);
|
||||
pci_msixadd(viodevice->e, 1, INTERRUPT_IDTOVECTOR(txisr->id), 1, 0);
|
||||
__assert(hashtable_set(&irqtable, netdev, &txisr->id, sizeof(txisr->id), true) == 0);
|
||||
txisr->priv = netdev;
|
||||
|
||||
pci_msixsetmask(viodevice->e, 0);
|
||||
|
||||
virtio_enablequeue(viodevice, 0);
|
||||
@@ -236,7 +231,3 @@ int vionet_newdevice(viodevice_t *viodevice) {
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void vionet_init() {
|
||||
__assert(hashtable_init(&irqtable, 20) == 0);
|
||||
}
|
||||
|
||||
@@ -166,9 +166,6 @@ static void virtio_newdevice(pcienum_t *e) {
|
||||
}
|
||||
|
||||
void virtio_init() {
|
||||
vioblk_init();
|
||||
vionet_init();
|
||||
|
||||
for (int dev = VIRTIO_DEVICE_MIN; dev <= VIRTIO_DEVICE_MAX; ++dev) {
|
||||
int i = 0;
|
||||
for (;;) {
|
||||
|
||||
Reference in New Issue
Block a user