Lines Matching refs:adapter

103 struct adapter {  struct
146 static inline void eth_enable_rx(struct adapter* adapter) { in eth_enable_rx() argument
147 uint32_t rctl = E1000_READ_REG(&adapter->hw, E1000_RCTL); in eth_enable_rx()
148 E1000_WRITE_REG(&adapter->hw, E1000_RCTL, rctl | E1000_RCTL_EN); in eth_enable_rx()
151 static inline void eth_disable_rx(struct adapter* adapter) { in eth_disable_rx() argument
152 uint32_t rctl = E1000_READ_REG(&adapter->hw, E1000_RCTL); in eth_disable_rx()
153 E1000_WRITE_REG(&adapter->hw, E1000_RCTL, rctl & ~E1000_RCTL_EN); in eth_disable_rx()
156 static inline void eth_enable_tx(struct adapter* adapter) { in eth_enable_tx() argument
157 uint32_t tctl = E1000_READ_REG(&adapter->hw, E1000_TCTL); in eth_enable_tx()
158 E1000_WRITE_REG(&adapter->hw, E1000_TCTL, tctl | E1000_TCTL_EN); in eth_enable_tx()
161 static inline void eth_disable_tx(struct adapter* adapter) { in eth_disable_tx() argument
162 uint32_t tctl = E1000_READ_REG(&adapter->hw, E1000_TCTL); in eth_disable_tx()
163 E1000_WRITE_REG(&adapter->hw, E1000_TCTL, tctl & ~E1000_TCTL_EN); in eth_disable_tx()
166 static void reap_tx_buffers(struct adapter* adapter) { in reap_tx_buffers() argument
167 uint32_t n = adapter->tx_rd_ptr; in reap_tx_buffers()
169 struct e1000_tx_desc* desc = &adapter->txd[n]; in reap_tx_buffers()
173 … struct framebuf* frame = list_remove_head_type(&adapter->busy_frames, struct framebuf, node); in reap_tx_buffers()
178 list_add_tail(&adapter->free_frames, &frame->node); in reap_tx_buffers()
182 adapter->tx_rd_ptr = n; in reap_tx_buffers()
185 static size_t eth_tx_queued(struct adapter* adapter) { in eth_tx_queued() argument
186 reap_tx_buffers(adapter); in eth_tx_queued()
187 return ((adapter->tx_wr_ptr + ETH_TXBUF_COUNT) - adapter->tx_rd_ptr) & (ETH_TXBUF_COUNT - 1); in eth_tx_queued()
192 struct adapter* adapter = ctx; in e1000_suspend() local
193 mtx_lock(&adapter->lock); in e1000_suspend()
194 adapter->state = ETH_SUSPENDING; in e1000_suspend()
197 eth_disable_rx(adapter); in e1000_suspend()
202 if (!eth_tx_queued(adapter)) { in e1000_suspend()
205 mtx_unlock(&adapter->lock); in e1000_suspend()
208 mtx_lock(&adapter->lock); in e1000_suspend()
213 eth_disable_tx(adapter); in e1000_suspend()
214 e1000_power_down_phy(&adapter->hw); in e1000_suspend()
215 adapter->state = ETH_SUSPENDED; in e1000_suspend()
216 mtx_unlock(&adapter->lock); in e1000_suspend()
222 struct adapter* adapter = ctx; in e1000_resume() local
223 mtx_lock(&adapter->lock); in e1000_resume()
224 e1000_power_up_phy(&adapter->hw); in e1000_resume()
225 eth_enable_rx(adapter); in e1000_resume()
226 eth_enable_tx(adapter); in e1000_resume()
227 adapter->state = ETH_RUNNING; in e1000_resume()
228 mtx_unlock(&adapter->lock); in e1000_resume()
234 struct adapter* adapter = ctx; in e1000_release() local
235 e1000_reset_hw(&adapter->hw); in e1000_release()
236 pci_enable_bus_master(&adapter->osdep.pci, false); in e1000_release()
238 io_buffer_release(&adapter->buffer); in e1000_release()
239 mmio_buffer_release(&adapter->bar0_mmio); in e1000_release()
240 mmio_buffer_release(&adapter->flash_mmio); in e1000_release()
242 zx_handle_close(adapter->btih); in e1000_release()
243 zx_handle_close(adapter->irqh); in e1000_release()
244 free(adapter); in e1000_release()
254 zx_status_t (*eth_rx)(struct adapter* adapter, void** data, size_t* len);
255 void (*eth_rx_ack)(struct adapter* adapter);
256 void (*rxd_setup)(struct adapter* adapter);
259 zx_status_t igb_eth_rx(struct adapter* adapter, void** data, size_t* len) { in igb_eth_rx() argument
260 uint32_t n = adapter->rx_rd_ptr; in igb_eth_rx()
261 union e1000_adv_rx_desc* desc = (union e1000_adv_rx_desc*)&adapter->rxd[n]; in igb_eth_rx()
268 *data = adapter->rxb + ETH_RXBUF_SIZE * n; in igb_eth_rx()
274 void igb_eth_rx_ack(struct adapter* adapter) { in igb_eth_rx_ack() argument
275 uint32_t n = adapter->rx_rd_ptr; in igb_eth_rx_ack()
276 union e1000_adv_rx_desc* desc = (union e1000_adv_rx_desc*)&adapter->rxd[n]; in igb_eth_rx_ack()
279 desc->read.pkt_addr = adapter->rxb_phys + ETH_RXBUF_SIZE * n; in igb_eth_rx_ack()
280 desc->read.hdr_addr = adapter->rxh_phys + ETH_RXHDR_SIZE * n; in igb_eth_rx_ack()
283 void igb_rxd_setup(struct adapter* adapter) { in igb_rxd_setup() argument
284 union e1000_adv_rx_desc* rxd = (union e1000_adv_rx_desc*)adapter->rxd; in igb_rxd_setup()
287 rxd[n].read.pkt_addr = adapter->rxb_phys + ETH_RXBUF_SIZE * n; in igb_rxd_setup()
288 rxd[n].read.hdr_addr = adapter->rxh_phys + ETH_RXHDR_SIZE * n; in igb_rxd_setup()
297 zx_status_t em_eth_rx(struct adapter* adapter, void** data, size_t* len) { in em_eth_rx() argument
298 uint32_t n = adapter->rx_rd_ptr; in em_eth_rx()
299 union e1000_rx_desc_extended* desc = (union e1000_rx_desc_extended*)&adapter->rxd[n]; in em_eth_rx()
306 *data = adapter->rxb + ETH_RXBUF_SIZE * n; in em_eth_rx()
312 void em_eth_rx_ack(struct adapter* adapter) { in em_eth_rx_ack() argument
313 uint32_t n = adapter->rx_rd_ptr; in em_eth_rx_ack()
314 union e1000_rx_desc_extended* desc = (union e1000_rx_desc_extended*)&adapter->rxd[n]; in em_eth_rx_ack()
317 desc->read.buffer_addr = adapter->rxb_phys + ETH_RXBUF_SIZE * n; in em_eth_rx_ack()
321 void em_rxd_setup(struct adapter* adapter) { in em_rxd_setup() argument
322 union e1000_rx_desc_extended* rxd = (union e1000_rx_desc_extended*)adapter->rxd; in em_rxd_setup()
325 rxd[n].read.buffer_addr = adapter->rxb_phys + ETH_RXBUF_SIZE * n; in em_rxd_setup()
336 zx_status_t lem_eth_rx(struct adapter* adapter, void** data, size_t* len) { in lem_eth_rx() argument
337 uint32_t n = adapter->rx_rd_ptr; in lem_eth_rx()
338 struct e1000_rx_desc* desc = &adapter->rxd[n]; in lem_eth_rx()
345 *data = adapter->rxb + ETH_RXBUF_SIZE * n; in lem_eth_rx()
351 void lem_eth_rx_ack(struct adapter* adapter) { in lem_eth_rx_ack() argument
352 uint32_t n = adapter->rx_rd_ptr; in lem_eth_rx_ack()
353 struct e1000_rx_desc* desc = &adapter->rxd[n]; in lem_eth_rx_ack()
359 void lem_rxd_setup(struct adapter* adapter) { in lem_rxd_setup() argument
360 struct e1000_rx_desc* rxd = adapter->rxd; in lem_rxd_setup()
363 rxd[n].buffer_addr = adapter->rxb_phys + ETH_RXBUF_SIZE * n; in lem_rxd_setup()
374 bool e1000_status_online(struct adapter* adapter) { in e1000_status_online() argument
375 return E1000_READ_REG(&adapter->hw, E1000_STATUS) & E1000_STATUS_LU; in e1000_status_online()
379 struct adapter* adapter = arg; in e1000_irq_thread() local
380 struct e1000_hw* hw = &adapter->hw; in e1000_irq_thread()
383 r = zx_interrupt_wait(adapter->irqh, NULL); in e1000_irq_thread()
388 mtx_lock(&adapter->lock); in e1000_irq_thread()
395 while (adapter->txrx->eth_rx(adapter, &data, &len) == ZX_OK) { in e1000_irq_thread()
396 if (adapter->ifc.ops && (adapter->state == ETH_RUNNING)) { in e1000_irq_thread()
397 ethmac_ifc_recv(&adapter->ifc, data, len, 0); in e1000_irq_thread()
399 adapter->txrx->eth_rx_ack(adapter); in e1000_irq_thread()
400 uint32_t n = adapter->rx_rd_ptr; in e1000_irq_thread()
401 E1000_WRITE_REG(&adapter->hw, E1000_RDT(0), n); in e1000_irq_thread()
403 adapter->rx_rd_ptr = n; in e1000_irq_thread()
407 bool was_online = adapter->online; in e1000_irq_thread()
408 bool online = e1000_status_online(adapter); in e1000_irq_thread()
411 adapter->online = online; in e1000_irq_thread()
412 if (adapter->ifc.ops) { in e1000_irq_thread()
413 ethmac_ifc_status(&adapter->ifc, online ? ETHMAC_STATUS_ONLINE : 0); in e1000_irq_thread()
417 mtx_unlock(&adapter->lock); in e1000_irq_thread()
423 struct adapter* adapter = ctx; in e1000_query() local
431 memcpy(info->mac, adapter->hw.mac.addr, sizeof adapter->hw.mac.addr); in e1000_query()
438 struct adapter* adapter = ctx; in e1000_stop() local
439 mtx_lock(&adapter->lock); in e1000_stop()
440 adapter->ifc.ops = NULL; in e1000_stop()
441 mtx_unlock(&adapter->lock); in e1000_stop()
445 struct adapter* adapter = ctx; in e1000_start() local
448 mtx_lock(&adapter->lock); in e1000_start()
449 if (adapter->ifc.ops) { in e1000_start()
452 adapter->ifc = *ifc; in e1000_start()
453 ethmac_ifc_status(&adapter->ifc, adapter->online ? ETHMAC_STATUS_ONLINE : 0); in e1000_start()
455 mtx_unlock(&adapter->lock); in e1000_start()
460 zx_status_t eth_tx(struct adapter* adapter, const void* data, size_t len) { in eth_tx() argument
468 mtx_lock(&adapter->send_lock); in eth_tx()
470 reap_tx_buffers(adapter); in eth_tx()
473 struct framebuf* frame = list_remove_head_type(&adapter->free_frames, struct framebuf, node); in eth_tx()
479 uint32_t n = adapter->tx_wr_ptr; in eth_tx()
486 struct e1000_tx_desc* desc = &adapter->txd[n]; in eth_tx()
489 list_add_tail(&adapter->busy_frames, &frame->node); in eth_tx()
493 adapter->tx_wr_ptr = n; in eth_tx()
494 E1000_WRITE_REG(&adapter->hw, E1000_TDT(0), n); in eth_tx()
497 mtx_unlock(&adapter->send_lock); in eth_tx()
502 struct adapter* adapter = ctx; in e1000_queue_tx() local
503 if (adapter->state != ETH_RUNNING) { in e1000_queue_tx()
507 return eth_tx(adapter, netbuf->data_buffer, netbuf->data_size); in e1000_queue_tx()
522 static void e1000_identify_hardware(struct adapter* adapter) { in e1000_identify_hardware() argument
523 pci_protocol_t* pci = &adapter->osdep.pci; in e1000_identify_hardware()
526 pci_config_read16(pci, PCI_CONFIG_COMMAND, &adapter->hw.bus.pci_cmd_word); in e1000_identify_hardware()
536 adapter->hw.vendor_id = pci_info.vendor_id; in e1000_identify_hardware()
537 adapter->hw.device_id = pci_info.device_id; in e1000_identify_hardware()
538 adapter->hw.revision_id = pci_info.revision_id; in e1000_identify_hardware()
539 pci_config_read16(pci, PCI_CONFIG_SUBSYS_VENDOR_ID, &adapter->hw.subsystem_vendor_id); in e1000_identify_hardware()
540 pci_config_read16(pci, PCI_CONFIG_SUBSYS_ID, &adapter->hw.subsystem_device_id); in e1000_identify_hardware()
543 if (e1000_set_mac_type(&adapter->hw)) { in e1000_identify_hardware()
549 static zx_status_t e1000_allocate_pci_resources(struct adapter* adapter) { in e1000_allocate_pci_resources() argument
550 pci_protocol_t* pci = &adapter->osdep.pci; in e1000_allocate_pci_resources()
553 &adapter->bar0_mmio); in e1000_allocate_pci_resources()
559 adapter->osdep.membase = (uintptr_t)adapter->bar0_mmio.vaddr; in e1000_allocate_pci_resources()
560 adapter->hw.hw_addr = (u8*)&adapter->osdep.membase; in e1000_allocate_pci_resources()
564 if (adapter->hw.mac.type < em_mac_min && in e1000_allocate_pci_resources()
565 adapter->hw.mac.type > e1000_82543) { in e1000_allocate_pci_resources()
592 adapter->osdep.iobase = bar.addr; in e1000_allocate_pci_resources()
593 adapter->hw.io_base = 0; in e1000_allocate_pci_resources()
596 adapter->hw.back = &adapter->osdep; in e1000_allocate_pci_resources()
601 void e1000_setup_buffers(struct adapter* adapter, void* iomem, zx_paddr_t iophys) { in e1000_setup_buffers() argument
604 list_initialize(&adapter->free_frames); in e1000_setup_buffers()
605 list_initialize(&adapter->busy_frames); in e1000_setup_buffers()
607 adapter->rxd = iomem; in e1000_setup_buffers()
608 adapter->rxd_phys = iophys; in e1000_setup_buffers()
611 memset(adapter->rxd, 0, ETH_DRING_SIZE); in e1000_setup_buffers()
613 adapter->txd = iomem; in e1000_setup_buffers()
614 adapter->txd_phys = iophys; in e1000_setup_buffers()
617 memset(adapter->txd, 0, ETH_DRING_SIZE); in e1000_setup_buffers()
619 adapter->rxb = iomem; in e1000_setup_buffers()
620 adapter->rxb_phys = iophys; in e1000_setup_buffers()
624 adapter->rxh = iomem; in e1000_setup_buffers()
625 adapter->rxh_phys = iophys; in e1000_setup_buffers()
629 adapter->txrx->rxd_setup(adapter); in e1000_setup_buffers()
636 list_add_tail(&adapter->free_frames, &txb->node); in e1000_setup_buffers()
643 static void em_initialize_transmit_unit(struct adapter* adapter) { in em_initialize_transmit_unit() argument
644 struct e1000_hw* hw = &adapter->hw; in em_initialize_transmit_unit()
649 u64 bus_addr = adapter->txd_phys; in em_initialize_transmit_unit()
663 E1000_READ_REG(&adapter->hw, E1000_TDBAL(0)), in em_initialize_transmit_unit()
664 E1000_READ_REG(&adapter->hw, E1000_TDLEN(0))); in em_initialize_transmit_unit()
677 switch (adapter->hw.mac.type) { in em_initialize_transmit_unit()
688 if ((adapter->hw.phy.media_type == e1000_media_type_fiber) || in em_initialize_transmit_unit()
689 (adapter->hw.phy.media_type == in em_initialize_transmit_unit()
698 E1000_WRITE_REG(&adapter->hw, E1000_TIPG, tipg); in em_initialize_transmit_unit()
699 E1000_WRITE_REG(&adapter->hw, E1000_TIDV, 0); in em_initialize_transmit_unit()
701 if (adapter->hw.mac.type >= e1000_82540) in em_initialize_transmit_unit()
702 E1000_WRITE_REG(&adapter->hw, E1000_TADV, 0); in em_initialize_transmit_unit()
704 if ((adapter->hw.mac.type == e1000_82571) || in em_initialize_transmit_unit()
705 (adapter->hw.mac.type == e1000_82572)) { in em_initialize_transmit_unit()
706 tarc = E1000_READ_REG(&adapter->hw, E1000_TARC(0)); in em_initialize_transmit_unit()
708 E1000_WRITE_REG(&adapter->hw, E1000_TARC(0), tarc); in em_initialize_transmit_unit()
709 } else if (adapter->hw.mac.type == e1000_80003es2lan) { in em_initialize_transmit_unit()
711 tarc = E1000_READ_REG(&adapter->hw, E1000_TARC(0)); in em_initialize_transmit_unit()
713 E1000_WRITE_REG(&adapter->hw, E1000_TARC(0), tarc); in em_initialize_transmit_unit()
714 tarc = E1000_READ_REG(&adapter->hw, E1000_TARC(1)); in em_initialize_transmit_unit()
716 E1000_WRITE_REG(&adapter->hw, E1000_TARC(1), tarc); in em_initialize_transmit_unit()
717 } else if (adapter->hw.mac.type == e1000_82574) { in em_initialize_transmit_unit()
718 tarc = E1000_READ_REG(&adapter->hw, E1000_TARC(0)); in em_initialize_transmit_unit()
720 E1000_WRITE_REG(&adapter->hw, E1000_TARC(0), tarc); in em_initialize_transmit_unit()
724 tctl = E1000_READ_REG(&adapter->hw, E1000_TCTL); in em_initialize_transmit_unit()
729 if (adapter->hw.mac.type >= e1000_82571) in em_initialize_transmit_unit()
733 E1000_WRITE_REG(&adapter->hw, E1000_TCTL, tctl); in em_initialize_transmit_unit()
749 static void em_initialize_receive_unit(struct adapter* adapter) { in em_initialize_receive_unit() argument
750 struct e1000_hw* hw = &adapter->hw; in em_initialize_receive_unit()
778 if (adapter->hw.mac.type >= e1000_82540) { in em_initialize_receive_unit()
779 E1000_WRITE_REG(&adapter->hw, E1000_RADV, in em_initialize_receive_unit()
788 E1000_WRITE_REG(&adapter->hw, E1000_RDTR, in em_initialize_receive_unit()
826 u64 bus_addr = adapter->rxd_phys; in em_initialize_receive_unit()
827 adapter->rx_rd_ptr = 0; in em_initialize_receive_unit()
841 if (adapter->hw.mac.type == e1000_82574) { in em_initialize_receive_unit()
848 } else if (adapter->hw.mac.type >= igb_mac_min) { in em_initialize_receive_unit()
853 bus_addr = adapter->rxd_phys; in em_initialize_receive_unit()
879 } else if (adapter->hw.mac.type >= e1000_pch2lan) { in em_initialize_receive_unit()
886 if (adapter->hw.mac.type < igb_mac_min) { in em_initialize_receive_unit()
903 em_disable_promisc(struct adapter* adapter) { in em_disable_promisc() argument
906 reg_rctl = E1000_READ_REG(&adapter->hw, E1000_RCTL); in em_disable_promisc()
909 E1000_WRITE_REG(&adapter->hw, E1000_RCTL, reg_rctl); in em_disable_promisc()
913 em_if_set_promisc(struct adapter* adapter, int flags) { in em_if_set_promisc() argument
916 em_disable_promisc(adapter); in em_if_set_promisc()
918 reg_rctl = E1000_READ_REG(&adapter->hw, E1000_RCTL); in em_if_set_promisc()
922 E1000_WRITE_REG(&adapter->hw, E1000_RCTL, reg_rctl); in em_if_set_promisc()
926 E1000_WRITE_REG(&adapter->hw, E1000_RCTL, reg_rctl); in em_if_set_promisc()
934 struct adapter* adapter = calloc(1, sizeof *adapter); in e1000_bind() local
935 if (!adapter) { in e1000_bind()
939 mtx_init(&adapter->lock, mtx_plain); in e1000_bind()
940 mtx_init(&adapter->send_lock, mtx_plain); in e1000_bind()
942 zx_status_t status = device_get_protocol(dev, ZX_PROTOCOL_PCI, &adapter->osdep.pci); in e1000_bind()
948 pci_protocol_t* pci = &adapter->osdep.pci; in e1000_bind()
956 status = pci_get_bti(pci, 0, &adapter->btih); in e1000_bind()
974 status = pci_map_interrupt(pci, 0, &adapter->irqh); in e1000_bind()
980 e1000_identify_hardware(adapter); in e1000_bind()
981 status = e1000_allocate_pci_resources(adapter); in e1000_bind()
987 if (adapter->hw.mac.type >= igb_mac_min) { in e1000_bind()
988 adapter->txrx = &igb_txrx; in e1000_bind()
989 } else if (adapter->hw.mac.type >= em_mac_min) { in e1000_bind()
990 adapter->txrx = &em_txrx; in e1000_bind()
992 adapter->txrx = &lem_txrx; in e1000_bind()
995 struct e1000_hw* hw = &adapter->hw; in e1000_bind()
1010 &adapter->flash_mmio); in e1000_bind()
1016 hw->flash_address = adapter->flash_mmio.vaddr; in e1000_bind()
1017 adapter->osdep.flashbase = (uintptr_t)adapter->flash_mmio.vaddr; in e1000_bind()
1026 adapter->osdep.flashbase = adapter->osdep.membase + E1000_FLASH_BASE_ADDR; in e1000_bind()
1093 …status = io_buffer_init(&adapter->buffer, adapter->btih, ETH_ALLOC, IO_BUFFER_RW | IO_BUFFER_CONTI… in e1000_bind()
1099 … e1000_setup_buffers(adapter, io_buffer_virt(&adapter->buffer), io_buffer_phys(&adapter->buffer)); in e1000_bind()
1102 em_initialize_transmit_unit(adapter); in e1000_bind()
1105 em_initialize_receive_unit(adapter); in e1000_bind()
1108 em_if_set_promisc(adapter, IFF_PROMISC); in e1000_bind()
1111 adapter->online = e1000_status_online(adapter); in e1000_bind()
1116 .ctx = adapter, in e1000_bind()
1122 if (device_add(dev, &args, &adapter->zxdev)) { in e1000_bind()
1126 thrd_create_with_name(&adapter->thread, e1000_irq_thread, adapter, "e1000_irq_thread"); in e1000_bind()
1127 thrd_detach(adapter->thread); in e1000_bind()
1137 io_buffer_release(&adapter->buffer); in e1000_bind()
1138 if (adapter->btih) { in e1000_bind()
1139 zx_handle_close(adapter->btih); in e1000_bind()
1141 if (adapter->osdep.pci.ops) { in e1000_bind()
1142 pci_enable_bus_master(&adapter->osdep.pci, false); in e1000_bind()
1144 zx_handle_close(adapter->irqh); in e1000_bind()
1145 mmio_buffer_release(&adapter->bar0_mmio); in e1000_bind()
1146 mmio_buffer_release(&adapter->flash_mmio); in e1000_bind()
1147 free(adapter); in e1000_bind()