Voxia OS v0.0.1
Hobby Project Operating System Targeting x86-64
Loading...
Searching...
No Matches
ioforge_nic.c
Go to the documentation of this file.
2#include "ioforge/ioforge.h"
3#include "libk/serial.h"
4#include <type.h>
6#include <str.h>
7
9 struct ioforge_device* svc = &nic->service;
10 svc->type = IOFORGE_NIC;
11
12 LOG2_DEBUG("NIC", "registered NIC at 0x%x (%s)", nic, svc->name);
14}
15
16// KERNEL_API
17// struct ioforge_nic_service* IOforgeNICFindByName(char* name) {
18// struct ioforge_device* tmp = ioforge_get_root();
19// while (tmp != 0) {
20// if (tmp->type == IOFORGE_NIC) {
21// struct ioforge_nic_service* tmp_nic =
22// (struct ioforge_nic_service*) tmp;
23// if (strncmp(tmp_nic->service.name, name, strlen(name))
24// == 0) {
25// serial2_printf("found service type %d (%s)\n",
26// tmp_nic->service.type,
27// tmp_nic->service.name);
28// return tmp_nic;
29// }
30// }
31// tmp = tmp->next;
32// }
33// return 0;
34// }
35
36// untuk soft handling
39 size_t len, int rx_id) {
40 if (!nic || !buffer || len == 0)
41 return;
42
43 uint32_t head = nic->pq_head;
45 if (next != nic->pq_tail) {
46 struct pending_rx* rx = &nic->pending_queue[head];
47 rx->data = buffer;
48 rx->len = len;
49 rx->rx_id = rx_id;
50
51 __atomic_store_n(&nic->pq_head, next, __ATOMIC_RELEASE);
52 }
53}
54
56 struct pending_rx* rx) {
57 if (nic->pq_tail == nic->pq_head) {
58 return -1;
59 }
60
61 auto old = &nic->pending_queue[nic->pq_tail];
62 rx->data = old->data;
63 rx->len = old->len;
64 rx->rx_id = old->rx_id;
65
66 old->data = 0;
67 old->len = 0;
68 old->rx_id = 0;
69
70 nic->pq_tail = (nic->pq_tail + 1) % PENDING_QUEUE_SIZE;
71 return 1;
72}
73
75 struct pending_rx* rx) {
76 nic->ops.storeBufferToPool(rx->rx_id, rx->data);
77 rx->data = 0;
78 rx->len = 0;
79 rx->rx_id = 0;
80}
struct cdev * next
Definition dev.h:4
volatile uint32_t buffer[5]
Definition ehci.hpp:8
struct ioforge_device * ioforge_get_root()
void ioforge_attach(struct ioforge_device *parent, struct ioforge_device *child)
@ IOFORGE_NIC
Definition ioforge.h:16
void ioforge_clear_rx_queue(struct ioforge_nic_service *nic, struct pending_rx *rx)
Definition ioforge_nic.c:74
int ioforge_receive_pending_queue(struct ioforge_nic_service *nic, struct pending_rx *rx)
Definition ioforge_nic.c:55
void ioforge_nic_rx(struct ioforge_nic_service *nic, uint8_t *buffer, size_t len, int rx_id)
void ioforge_register_nic(struct ioforge_nic_service *nic)
#define PENDING_QUEUE_SIZE
Definition ioforge_nic.h:9
#define PENDING_QUEUE_MASK
Definition ioforge_nic.h:10
size_t len
Definition oct2bin.h:7
#define LOG2_DEBUG(mod, fmt,...)
Definition serial.h:35
char name[64]
Definition ioforge.h:30
IoForgeType type
Definition ioforge.h:31
void(* storeBufferToPool)(int rx_id, void *vaddr)
Definition ioforge_nic.h:25
struct ioforge_nic_operation ops
Definition ioforge_nic.h:60
struct ioforge_device service
Definition ioforge_nic.h:59
struct pending_rx pending_queue[128]
Definition ioforge_nic.h:62
size_t len
Definition ioforge_nic.h:42
uint8_t * data
Definition ioforge_nic.h:41
uint32_t head
Definition tty.h:10
unsigned int uint32_t
Definition type.h:19
#define KERNEL_API
Definition type.h:93
unsigned char uint8_t
Definition type.h:7