6#define IO_ADDR_OFFSET 0x0
7#define IO_DATA_OFFSET 0x4
10#define REG_STATUS 0x0008
11#define REG_EEPROM 0x0014
12#define REG_CTRL_EXT 0x0018
13#define REG_IMASK 0x00D0
14#define REG_RCTRL 0x0100
15#define REG_RXDESCLO 0x2800
16#define REG_RXDESCHI 0x2804
17#define REG_RXDESCLEN 0x2808
18#define REG_RXDESCHEAD 0x2810
19#define REG_RXDESCTAIL 0x2818
21#define IMS_RXT0 (1 << 7)
22#define IMS_RXO (1 << 6)
23#define IMS_RXDMT0 (1 << 4)
24#define IMS_LSC (1 << 2)
26#define IMS_RXQ0 (1 << 20)
27#define IMS_TXQ0 (1 << 22)
28#define IMS_OTHER (1 << 24)
30#define REG_TCTRL 0x0400
31#define REG_TXDESCLO 0x3800
32#define REG_TXDESCHI 0x3804
33#define REG_TXDESCLEN 0x3808
34#define REG_TXDESCHEAD 0x3810
35#define REG_TXDESCTAIL 0x3818
37#define REG_RDTR 0x2820
38#define REG_RXDCTL 0x2828
39#define REG_RADV 0x282C
40#define REG_RSRPD 0x2C00
42#define REG_TIPG 0x0410
45#define RCTL_EN (1 << 1)
46#define RCTL_SBP (1 << 2)
47#define RCTL_UPE (1 << 3)
48#define RCTL_MPE (1 << 4)
49#define RCTL_LPE (1 << 5)
50#define RCTL_LBM_NONE (0 << 6)
51#define RCTL_LBM_PHY (3 << 6)
52#define RTCL_RDMTS_HALF (0 << 8)
53#define RTCL_RDMTS_QUARTER (1 << 8)
54#define RTCL_RDMTS_EIGHTH (2 << 8)
55#define RCTL_MO_36 (0 << 12)
56#define RCTL_MO_35 (1 << 12)
57#define RCTL_MO_34 (2 << 12)
58#define RCTL_MO_32 (3 << 12)
59#define RCTL_BAM (1 << 15)
60#define RCTL_VFE (1 << 18)
61#define RCTL_CFIEN (1 << 19)
62#define RCTL_CFI (1 << 20)
63#define RCTL_DPF (1 << 22)
64#define RCTL_PMCF (1 << 23)
65#define RCTL_SECRC (1 << 26)
68#define RCTL_BSIZE_256 (3 << 16)
69#define RCTL_BSIZE_512 (2 << 16)
70#define RCTL_BSIZE_1024 (1 << 16)
71#define RCTL_BSIZE_2048 (0 << 16)
72#define RCTL_BSIZE_4096 ((3 << 16) | (1 << 25))
73#define RCTL_BSIZE_8192 ((2 << 16) | (1 << 25))
74#define RCTL_BSIZE_16384 ((1 << 16) | (1 << 25))
78#define CMD_EOP (1 << 0)
79#define CMD_IFCS (1 << 1)
80#define CMD_IC (1 << 2)
81#define CMD_RS (1 << 3)
82#define CMD_RPS (1 << 4)
83#define CMD_VLE (1 << 6)
84#define CMD_IDE (1 << 7)
88#define TCTL_EN (1 << 1)
89#define TCTL_PSP (1 << 3)
90#define TCTL_CT_SHIFT 4
91#define TCTL_COLD_SHIFT 12
92#define TCTL_SWXOFF (1 << 22)
93#define TCTL_RTLC (1 << 24)
95#define TSTA_DD (1 << 0)
96#define TSTA_EC (1 << 1)
97#define TSTA_LC (1 << 2)
98#define LSTA_TU (1 << 3)
101#define REG_ICR 0x00C0
126 return *((
volatile uint32_t*) (
device->bar[0].address + p_address));
160static const char hexmap[] =
"0123456789ABCDEF";
170 if ((rah & 0x80000000) == 0 && ral == 0) {
171 log(
"E1000",
"MAC Address tidak valid (AV bit 0) atau kosong!");
186 mac_addr[4] = (rah & 0xFFFF) & 0xFF;
187 mac_addr[5] = ((rah & 0xFFFF) >> 8) & 0xFF;
193 for (
int i = 0; i < 6; i++) {
195 *out++ =
hexmap[(
byte >> 4) & 0x0F];
196 *out++ =
hexmap[
byte & 0x0F];
201 log(
"E1000",
"MAC terbaca dari MMIO: %s", outc);
251 auto _ptr = (
uint8_t*) (IOUtils::DMAAlloc(4096, &_paddr));
275 log(
mod,
"initReceiverX: pool empty saat init! (BUG)");
318 log(
mod,
"Receiver initialized");
327 log(
"E1000",
"tx_desc addr 0x%x (0x%x)", paddr,
ptr);
355 log(
mod,
"Transmitter initialized");
359 int setup_done = __atomic_load_n(&
setup_tx_done, __ATOMIC_ACQUIRE);
360 if (setup_done == 0) {
363 asm volatile(
"pause");
370 for (
size_t i = 0; i <
count; i++) {
371 latest_item =
data[i];
388 __asm__
volatile(
"mfence" :::
"memory");
391 success = (
tx_descs[last_cur]->status & 0xff) ? 1 : 1;
407#define ICR_TXDW (1 << 0)
408#define ICR_TXQE (1 << 1)
409#define ICR_LSC (1 << 2)
410#define ICR_RXSEQ (1 << 3)
411#define ICR_RXDMT0 (1 << 4)
412#define ICR_RXO (1 << 6)
413#define ICR_RXT0 (1 << 7)
414#define ICR_MDAC (1 << 9)
415#define ICR_RXCFG (1 << 10)
416#define ICR_GPI_EN0 (1 << 11)
417#define ICR_GPI_EN1 (1 << 12)
418#define ICR_GPI_EN2 (1 << 13)
419#define ICR_GPI_EN3 (1 << 14)
428 module->receiveHandle();
437 log(
"E100 IRQ",
"link up");
442 module->receiveHandle();
451 module->receiveHandle();
455 log(
"E100 IRQ",
"RX overrun!");
456 module->receiveHandle();
474 if (++processed % 16 == 0)
491 if (++processed % 16 == 0)
495 if (last_tail != (
uint16_t) -1 && processed % 16 != 0)
529 "[E1000] storeBufferToPool: vaddr %p tidak dikenal!\n",
540 asm volatile(
"pause");
542 for (
int i = 0; i < 6; i++)
ioforge_pci_device * device
static E1000Module * getInstance()
void write(uint16_t p_address, uint32_t p_value)
boolean_t syncMacAddress()
int getMacAddress(uint8_t mac[6])
uint32_t readEeprom(uint32_t addr)
void storeBufferToPool(int rx_id, void *vaddr)
static void fireHandler()
int sendPacket(const struct data_template data[], size_t count)
uint32_t read(uint16_t p_address)
ioforge_nic_service * nic
static rx_buf_lookup_entry g_buf_lookup[1280]
static uint32_t g_buf_lookup_count
static struct e1000_tx_desc * tx_descs[64]
static void pool_push(uint8_t *vaddr, uint64_t paddr)
static struct e1000_rx_desc * rx_descs[256]
static bool pool_pop(struct rx_buffer *out)
static const char hexmap[]
static volatile int setup_tx_done
static struct e1000_rx_comp rx_comp[256]
#define E1000_NUM_TX_DESC
#define E1000_NUM_RX_DESC
#define E1000_NUM_RX_MASK
void serial2_printf(const char *fmt,...)
#define log(mod, fmt,...)
void ioforge_nic_rx(struct ioforge_nic_service *nic, uint8_t *buffer, size_t len, int rx_id)
struct rx_buffer buffers[1280]
struct xhci_slot_ctx slot