Lines Matching +full:magic +full:- +full:packet
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
8 * Cambridge Computer Laboratory under DARPA/AFRL contract FA8750-11-C-0249
83 * Depending on the channel (0 if packet transaction, 1 if register transaction)
88 * (1) SUME received a packet on one of the interfaces.
89 * (2) SUME generates an interrupt vector, bit 00001 is set (channel 0 - new RX
91 * (3) We read the length of the incoming packet and the offset along with the
95 * - First 3*sizeof(uint32_t) bytes are: lower and upper 32 bits of physical
98 * - Data will start right after, at buf_addr+3*sizeof(uint32_t). The
106 * (6) SUME generates an interrupt vector, bit 00010 is set (channel 0 -
108 * (7) SUME generates an interrupt vector, bit 00100 is set (channel 0 -
116 * (11) We forward the mbuf to the appropriate interface via ifp->if_input.
120 * (2) We get the mbuf packet data and copy it to the
124 * (4) We write the offset/last and length of the packet to the SUME registers
131 * (7) SUME generates an interrupt vector, bit 01000 is set (channel 0 -
133 * (8) SUME generates an interrupt vector, bit 10000 is set (channel 0 -
169 return (bus_space_read_4(adapter->bt, adapter->bh, offset << 2)); in read_reg()
176 bus_space_write_4(adapter->bt, adapter->bh, offset << 2, val); in write_reg()
200 * Building mbuf for packet received from SUME. We expect to receive 'len'
203 * received the packet (sport will be 1, 2, 4 or 8), the packet length (plen),
204 * and the magic word needs to be 0xcafe. When we have the packet data, we
216 uint16_t dport, plen, magic; in sume_rx_build_mbuf() local
217 device_t dev = adapter->dev; in sume_rx_build_mbuf()
219 adapter->recv[SUME_RIFFA_CHANNEL_DATA]->buf_addr + in sume_rx_build_mbuf()
226 adapter->packets_err++; in sume_rx_build_mbuf()
227 adapter->bytes_err += len; in sume_rx_build_mbuf()
231 dport = le16toh(mdata->dport); in sume_rx_build_mbuf()
232 plen = le16toh(mdata->plen); in sume_rx_build_mbuf()
233 magic = le16toh(mdata->magic); in sume_rx_build_mbuf()
236 magic != SUME_RIFFA_MAGIC) { in sume_rx_build_mbuf()
237 device_printf(dev, "corrupted packet (%zd + %d > %d || magic " in sume_rx_build_mbuf()
239 len, magic, SUME_RIFFA_MAGIC); in sume_rx_build_mbuf()
243 /* We got the packet from one of the even bits */ in sume_rx_build_mbuf()
244 np = (ffs(dport & SUME_DPORT_MASK) >> 1) - 1; in sume_rx_build_mbuf()
248 adapter->packets_err++; in sume_rx_build_mbuf()
249 adapter->bytes_err += plen; in sume_rx_build_mbuf()
252 ifp = adapter->ifp[np]; in sume_rx_build_mbuf()
254 nf_priv->stats.rx_packets++; in sume_rx_build_mbuf()
255 nf_priv->stats.rx_bytes += plen; in sume_rx_build_mbuf()
259 nf_priv->stats.ifc_down_packets++; in sume_rx_build_mbuf()
260 nf_priv->stats.ifc_down_bytes += plen; in sume_rx_build_mbuf()
264 if (adapter->sume_debug) in sume_rx_build_mbuf()
269 adapter->packets_err++; in sume_rx_build_mbuf()
270 adapter->bytes_err += plen; in sume_rx_build_mbuf()
276 m->m_pkthdr.rcvif = ifp; in sume_rx_build_mbuf()
289 * bit 0 - new transaction from SUME
290 * bit 1 - SUME received our bouncebuffer address
291 * bit 2 - SUME copied the received data to our bouncebuffer, transaction done
293 * bit 3 - SUME received our bouncebuffer address
294 * bit 4 - SUME copied the data from our bouncebuffer, transaction done
305 * our packet). Then we get the length of the sent data and go back to the
322 device_t dev = adapter->dev; in sume_intr_handler()
341 send = adapter->send[ch]; in sume_intr_handler()
342 recv = adapter->recv[ch]; in sume_intr_handler()
347 if (adapter->sume_debug) in sume_intr_handler()
349 "0x%08x\n", ch, send->state, vect); in sume_intr_handler()
350 switch (send->state) { in sume_intr_handler()
357 "vect = 0x%08x\n", ch, send->state, in sume_intr_handler()
359 send->recovery = 1; in sume_intr_handler()
362 send->state = SUME_RIFFA_CHAN_STATE_READ; in sume_intr_handler()
369 "vect = 0x%08x\n", ch, send->state, in sume_intr_handler()
371 send->recovery = 1; in sume_intr_handler()
374 send->state = SUME_RIFFA_CHAN_STATE_LEN; in sume_intr_handler()
379 send->state = in sume_intr_handler()
383 wakeup(&send->event); in sume_intr_handler()
387 "vect = 0x%08x\n", ch, send->state, in sume_intr_handler()
389 send->recovery = 1; in sume_intr_handler()
402 send->recovery) in sume_intr_handler()
405 "%d\n", ch, vect, send->state, loops); in sume_intr_handler()
410 if (adapter->sume_debug) in sume_intr_handler()
412 "0x%08x\n", ch, recv->state, vect); in sume_intr_handler()
413 switch (recv->state) { in sume_intr_handler()
418 "vect = 0x%08x\n", ch, recv->state, in sume_intr_handler()
420 recv->recovery = 1; in sume_intr_handler()
426 recv->recovery = 0; in sume_intr_handler()
429 recv->offlast = read_reg(adapter, in sume_intr_handler()
432 recv->len = read_reg(adapter, RIFFA_CHNL_REG(ch, in sume_intr_handler()
436 max_ptr = (uint32_t)((uintptr_t)recv->buf_addr in sume_intr_handler()
437 + SUME_RIFFA_OFFSET(recv->offlast) in sume_intr_handler()
438 + SUME_RIFFA_LEN(recv->len) - 1); in sume_intr_handler()
440 (uint32_t)((uintptr_t)recv->buf_addr)) in sume_intr_handler()
442 "wrap-around overflow.\n"); in sume_intr_handler()
443 if (SUME_RIFFA_OFFSET(recv->offlast) + in sume_intr_handler()
444 SUME_RIFFA_LEN(recv->len) > in sume_intr_handler()
445 adapter->sg_buf_size) in sume_intr_handler()
451 SUME_RIFFA_LEN(recv->len)); in sume_intr_handler()
453 bus_dmamap_sync(recv->ch_tag, recv->ch_map, in sume_intr_handler()
458 SUME_RIFFA_LO_ADDR(recv->buf_hw_addr)); in sume_intr_handler()
461 SUME_RIFFA_HI_ADDR(recv->buf_hw_addr)); in sume_intr_handler()
464 4 * recv->num_sg); in sume_intr_handler()
465 bus_dmamap_sync(recv->ch_tag, recv->ch_map, in sume_intr_handler()
469 recv->state = SUME_RIFFA_CHAN_STATE_READY; in sume_intr_handler()
476 "vect = 0x%08x\n", ch, recv->state, in sume_intr_handler()
478 recv->recovery = 1; in sume_intr_handler()
481 recv->state = SUME_RIFFA_CHAN_STATE_READ; in sume_intr_handler()
488 "vect = 0x%08x\n", ch, recv->state, in sume_intr_handler()
490 recv->recovery = 1; in sume_intr_handler()
496 /* Remember, len and recv->len are words. */ in sume_intr_handler()
500 recv->state = in sume_intr_handler()
503 wakeup(&recv->event); in sume_intr_handler()
507 "vect = 0x%08x\n", ch, recv->state, in sume_intr_handler()
509 recv->recovery = 1; in sume_intr_handler()
522 SUME_MSI_RXDONE)) && recv->recovery) { in sume_intr_handler()
525 "%d\n", ch, vect, recv->state, loops); in sume_intr_handler()
532 recv->recovery = 0; in sume_intr_handler()
539 ifp = m->m_pkthdr.rcvif; in sume_intr_handler()
553 if (adapter->running == 0) in sume_intr_filter()
562 device_t dev = adapter->dev; in sume_probe_riffa_pci()
568 adapter->rid = PCIR_BAR(0); in sume_probe_riffa_pci()
569 adapter->bar0_addr = bus_alloc_resource_any(dev, SYS_RES_MEMORY, in sume_probe_riffa_pci()
570 &adapter->rid, RF_ACTIVE); in sume_probe_riffa_pci()
571 if (adapter->bar0_addr == NULL) { in sume_probe_riffa_pci()
576 adapter->bt = rman_get_bustag(adapter->bar0_addr); in sume_probe_riffa_pci()
577 adapter->bh = rman_get_bushandle(adapter->bar0_addr); in sume_probe_riffa_pci()
578 adapter->bar0_len = rman_get_size(adapter->bar0_addr); in sume_probe_riffa_pci()
579 if (adapter->bar0_len != 1024) { in sume_probe_riffa_pci()
581 adapter->bar0_len); in sume_probe_riffa_pci()
593 adapter->irq.rid = 1; /* Should be 1, thus says pci_alloc_msi() */ in sume_probe_riffa_pci()
594 adapter->irq.res = bus_alloc_resource_any(dev, SYS_RES_IRQ, in sume_probe_riffa_pci()
595 &adapter->irq.rid, RF_SHAREABLE | RF_ACTIVE); in sume_probe_riffa_pci()
596 if (adapter->irq.res == NULL) { in sume_probe_riffa_pci()
602 error = bus_setup_intr(dev, adapter->irq.res, INTR_MPSAFE | in sume_probe_riffa_pci()
604 &adapter->irq.tag); in sume_probe_riffa_pci()
607 " %s: %d\n", adapter->irq.rid, "SUME_INTR", error); in sume_probe_riffa_pci()
629 adapter->num_sg = RIFFA_SG_ELEMS * ((reg >> 19) & 0xf); in sume_probe_riffa_pci()
630 adapter->sg_buf_size = RIFFA_SG_BUF_SIZE * ((reg >> 19) & 0xf); in sume_probe_riffa_pci()
688 struct nf_bb_desc *bouncebuf = (struct nf_bb_desc *) p->buf_addr; in sume_fill_bb_desc()
690 bouncebuf->lower = (p->buf_hw_addr + sizeof(struct nf_bb_desc)); in sume_fill_bb_desc()
691 bouncebuf->upper = (p->buf_hw_addr + sizeof(struct nf_bb_desc)) >> 32; in sume_fill_bb_desc()
692 bouncebuf->len = len >> 2; in sume_fill_bb_desc()
699 struct riffa_chnl_dir *send = adapter->send[SUME_RIFFA_CHANNEL_REG]; in sume_modreg_write_locked()
705 RIFFA_RX_LEN_REG_OFF), send->len); /* words */ in sume_modreg_write_locked()
708 sume_fill_bb_desc(adapter, send, SUME_RIFFA_LEN(send->len)); in sume_modreg_write_locked()
711 send->state = SUME_RIFFA_CHAN_STATE_READY; in sume_modreg_write_locked()
713 bus_dmamap_sync(send->ch_tag, send->ch_map, in sume_modreg_write_locked()
718 SUME_RIFFA_LO_ADDR(send->buf_hw_addr)); in sume_modreg_write_locked()
721 SUME_RIFFA_HI_ADDR(send->buf_hw_addr)); in sume_modreg_write_locked()
723 RIFFA_RX_SG_LEN_REG_OFF), 4 * send->num_sg); in sume_modreg_write_locked()
724 bus_dmamap_sync(send->ch_tag, send->ch_map, in sume_modreg_write_locked()
740 struct sume_adapter *adapter = nf_priv->adapter; in sume_module_reg_write()
741 struct riffa_chnl_dir *send = adapter->send[SUME_RIFFA_CHANNEL_REG]; in sume_module_reg_write()
754 if (send->state != SUME_RIFFA_CHAN_STATE_IDLE) { in sume_module_reg_write()
759 data = (struct nf_regop_data *) (send->buf_addr + in sume_module_reg_write()
761 data->addr = htole32(sifr->addr); in sume_module_reg_write()
762 data->val = htole32(sifr->val); in sume_module_reg_write()
764 data->rtag = htole32(++send->rtag); in sume_module_reg_write()
765 data->optype = htole32(optype); in sume_module_reg_write()
766 send->len = sizeof(struct nf_regop_data) / 4; /* words */ in sume_module_reg_write()
775 if (send->state != SUME_RIFFA_CHAN_STATE_LEN) in sume_module_reg_write()
776 error = msleep(&send->event, &adapter->lock, 0, in sume_module_reg_write()
781 send->state = SUME_RIFFA_CHAN_STATE_IDLE; in sume_module_reg_write()
806 struct sume_adapter *adapter = nf_priv->adapter; in sume_module_reg_read()
807 struct riffa_chnl_dir *recv = adapter->recv[SUME_RIFFA_CHANNEL_REG]; in sume_module_reg_read()
808 struct riffa_chnl_dir *send = adapter->send[SUME_RIFFA_CHANNEL_REG]; in sume_module_reg_read()
820 bus_dmamap_sync(recv->ch_tag, recv->ch_map, in sume_module_reg_read()
826 if (recv->state != SUME_RIFFA_CHAN_STATE_READ) in sume_module_reg_read()
827 error = msleep(&recv->event, &adapter->lock, 0, in sume_module_reg_read()
830 if (recv->state != SUME_RIFFA_CHAN_STATE_READ || error == EWOULDBLOCK) { in sume_module_reg_read()
832 device_printf(adapter->dev, "wait error: %d\n", error); in sume_module_reg_read()
836 bus_dmamap_sync(recv->ch_tag, recv->ch_map, in sume_module_reg_read()
844 data = (struct nf_regop_data *) (recv->buf_addr + in sume_module_reg_read()
847 if (le32toh(data->rtag) != send->rtag) in sume_module_reg_read()
848 device_printf(adapter->dev, "rtag error: 0x%08x 0x%08x\n", in sume_module_reg_read()
849 le32toh(data->rtag), send->rtag); in sume_module_reg_read()
851 sifr->val = le32toh(data->val); in sume_module_reg_read()
852 recv->state = SUME_RIFFA_CHAN_STATE_IDLE; in sume_module_reg_read()
855 send->state = SUME_RIFFA_CHAN_STATE_IDLE; in sume_module_reg_read()
886 error = ifmedia_ioctl(ifp, ifr, &nf_priv->media, cmd); in sume_if_ioctl()
932 struct ifmedia *ifm = &nf_priv->media; in sume_media_change()
934 if (IFM_TYPE(ifm->ifm_media) != IFM_ETHER) in sume_media_change()
937 if (IFM_SUBTYPE(ifm->ifm_media) == IFM_10G_SR) in sume_media_change()
940 if_setbaudrate(ifp, ifmedia_baudrate(ifm->ifm_media)); in sume_media_change()
949 struct sume_adapter *adapter = nf_priv->adapter; in sume_update_link_status()
953 sifr.addr = SUME_STATUS_ADDR(nf_priv->port); in sume_update_link_status()
961 if (!link_status && nf_priv->link_up) { in sume_update_link_status()
963 nf_priv->link_up = 0; in sume_update_link_status()
964 if (adapter->sume_debug) in sume_update_link_status()
965 device_printf(adapter->dev, "port %d link state " in sume_update_link_status()
966 "changed to DOWN\n", nf_priv->unit); in sume_update_link_status()
967 } else if (link_status && !nf_priv->link_up) { in sume_update_link_status()
968 nf_priv->link_up = 1; in sume_update_link_status()
970 if (adapter->sume_debug) in sume_update_link_status()
971 device_printf(adapter->dev, "port %d link state " in sume_update_link_status()
972 "changed to UP\n", nf_priv->unit); in sume_update_link_status()
980 struct ifmedia *ifm = &nf_priv->media; in sume_media_status()
982 if (ifm->ifm_cur->ifm_media == (IFM_ETHER | IFM_10G_SR) && in sume_media_status()
984 ifmr->ifm_active = IFM_ETHER | IFM_10G_SR; in sume_media_status()
986 ifmr->ifm_active = ifm->ifm_cur->ifm_media; in sume_media_status()
988 ifmr->ifm_status |= IFM_AVALID; in sume_media_status()
992 if (nf_priv->link_up) in sume_media_status()
993 ifmr->ifm_status |= IFM_ACTIVE; in sume_media_status()
997 * Packet to transmit. We take the packet data from the mbuf and copy it to the
999 * packet data are for metadata: sport/dport (depending on our source
1000 * interface), packet length and magic 0xcafe. We tell the SUME about the
1002 * the information about the start and length of the packet and trigger the
1010 struct sume_adapter *adapter = nf_priv->adapter; in sume_if_start_locked()
1011 struct riffa_chnl_dir *send = adapter->send[SUME_RIFFA_CHANNEL_DATA]; in sume_if_start_locked()
1016 KASSERT(mtx_owned(&adapter->lock), ("SUME lock not owned")); in sume_if_start_locked()
1017 KASSERT(send->state == SUME_RIFFA_CHAN_STATE_IDLE, in sume_if_start_locked()
1025 if (m->m_pkthdr.len > SUME_MIN_PKT_SIZE) in sume_if_start_locked()
1026 plen = m->m_pkthdr.len; in sume_if_start_locked()
1028 if (adapter->sume_debug) in sume_if_start_locked()
1029 device_printf(adapter->dev, "sending %d bytes to %s%d\n", plen, in sume_if_start_locked()
1030 SUME_ETH_DEVICE_NAME, nf_priv->unit); in sume_if_start_locked()
1032 outbuf = (uint8_t *) send->buf_addr + sizeof(struct nf_bb_desc); in sume_if_start_locked()
1036 send->recovery = 0; in sume_if_start_locked()
1039 if (m->m_pkthdr.len + sizeof(struct nf_metadata) > in sume_if_start_locked()
1040 adapter->sg_buf_size) { in sume_if_start_locked()
1041 device_printf(adapter->dev, "packet too big for bounce buffer " in sume_if_start_locked()
1042 "(%d)\n", m->m_pkthdr.len); in sume_if_start_locked()
1044 nf_priv->stats.tx_dropped++; in sume_if_start_locked()
1048 bus_dmamap_sync(send->ch_tag, send->ch_map, in sume_if_start_locked()
1052 if (m->m_pkthdr.len < SUME_MIN_PKT_SIZE) in sume_if_start_locked()
1055 m_copydata(m, 0, m->m_pkthdr.len, outbuf + sizeof(struct nf_metadata)); in sume_if_start_locked()
1056 send->len = (sizeof(struct nf_metadata) + plen + 3) / 4; in sume_if_start_locked()
1059 mdata->sport = htole16(1 << (nf_priv->port * 2 + 1)); in sume_if_start_locked()
1060 mdata->dport = htole16(1 << (nf_priv->port * 2)); in sume_if_start_locked()
1061 mdata->plen = htole16(plen); in sume_if_start_locked()
1062 mdata->magic = htole16(SUME_RIFFA_MAGIC); in sume_if_start_locked()
1063 mdata->t1 = htole32(0); in sume_if_start_locked()
1064 mdata->t2 = htole32(0); in sume_if_start_locked()
1070 RIFFA_RX_LEN_REG_OFF), send->len); in sume_if_start_locked()
1073 sume_fill_bb_desc(adapter, send, SUME_RIFFA_LEN(send->len)); in sume_if_start_locked()
1076 send->state = SUME_RIFFA_CHAN_STATE_READY; in sume_if_start_locked()
1081 SUME_RIFFA_LO_ADDR(send->buf_hw_addr)); in sume_if_start_locked()
1084 SUME_RIFFA_HI_ADDR(send->buf_hw_addr)); in sume_if_start_locked()
1086 RIFFA_RX_SG_LEN_REG_OFF), 4 * send->num_sg); in sume_if_start_locked()
1088 bus_dmamap_sync(send->ch_tag, send->ch_map, in sume_if_start_locked()
1091 nf_priv->stats.tx_packets++; in sume_if_start_locked()
1092 nf_priv->stats.tx_bytes += plen; in sume_if_start_locked()
1097 adapter->last_ifc = nf_priv->port; in sume_if_start_locked()
1100 adapter->wd_counter = 0; in sume_if_start_locked()
1109 struct sume_adapter *adapter = nf_priv->adapter; in sume_if_start()
1111 if (!adapter->running || !(if_getflags(ifp) & IFF_UP)) in sume_if_start()
1115 if (adapter->send[SUME_RIFFA_CHANNEL_DATA]->state == in sume_if_start()
1130 KASSERT(mtx_owned(&adapter->lock), ("SUME lock not owned")); in check_tx_queues()
1132 last_ifc = adapter->last_ifc; in check_tx_queues()
1136 if_t ifp = adapter->ifp[i % SUME_NPORTS]; in check_tx_queues()
1154 adapter->ifp[port] = ifp; in sume_ifp_alloc()
1157 nf_priv->adapter = adapter; in sume_ifp_alloc()
1158 nf_priv->unit = alloc_unr(unr); in sume_ifp_alloc()
1159 nf_priv->port = port; in sume_ifp_alloc()
1160 nf_priv->link_up = 0; in sume_ifp_alloc()
1162 if_initname(ifp, SUME_ETH_DEVICE_NAME, nf_priv->unit); in sume_ifp_alloc()
1170 hw_addr[ETHER_ADDR_LEN-1] = nf_priv->unit; in sume_ifp_alloc()
1173 ifmedia_init(&nf_priv->media, IFM_IMASK, sume_media_change, in sume_ifp_alloc()
1175 ifmedia_add(&nf_priv->media, IFM_ETHER | IFM_10G_SR, 0, NULL); in sume_ifp_alloc()
1176 ifmedia_set(&nf_priv->media, IFM_ETHER | IFM_10G_SR); in sume_ifp_alloc()
1199 device_t dev = adapter->dev; in sume_probe_riffa_buffer()
1216 adapter->sg_buf_size, in sume_probe_riffa_buffer()
1218 adapter->sg_buf_size, in sume_probe_riffa_buffer()
1222 &rp[ch]->ch_tag); in sume_probe_riffa_buffer()
1230 err = bus_dmamem_alloc(rp[ch]->ch_tag, (void **) in sume_probe_riffa_buffer()
1231 &rp[ch]->buf_addr, BUS_DMA_WAITOK | BUS_DMA_COHERENT | in sume_probe_riffa_buffer()
1232 BUS_DMA_ZERO, &rp[ch]->ch_map); in sume_probe_riffa_buffer()
1239 bzero(rp[ch]->buf_addr, adapter->sg_buf_size); in sume_probe_riffa_buffer()
1241 err = bus_dmamap_load(rp[ch]->ch_tag, rp[ch]->ch_map, in sume_probe_riffa_buffer()
1242 rp[ch]->buf_addr, adapter->sg_buf_size, callback_dma, in sume_probe_riffa_buffer()
1249 rp[ch]->buf_hw_addr = hw_addr; in sume_probe_riffa_buffer()
1250 rp[ch]->num_sg = 1; in sume_probe_riffa_buffer()
1251 rp[ch]->state = SUME_RIFFA_CHAN_STATE_IDLE; in sume_probe_riffa_buffer()
1253 rp[ch]->rtag = SUME_INIT_RTAG; in sume_probe_riffa_buffer()
1264 error = sume_probe_riffa_buffer(adapter, &adapter->recv, "recv"); in sume_probe_riffa_buffers()
1268 error = sume_probe_riffa_buffer(adapter, &adapter->send, "send"); in sume_probe_riffa_buffers()
1276 device_t dev = adapter->dev; in sume_sysctl_init()
1285 0, "SUME top-level tree"); in sume_sysctl_init()
1291 &adapter->sume_debug, 0, "debug int leaf"); in sume_sysctl_init()
1295 CTLFLAG_RD, &adapter->packets_err, 0, "rx errors"); in sume_sysctl_init()
1297 CTLFLAG_RD, &adapter->bytes_err, 0, "rx error bytes"); in sume_sysctl_init()
1299 for (i = SUME_NPORTS - 1; i >= 0; i--) { in sume_sysctl_init()
1300 if_t ifp = adapter->ifp[i]; in sume_sysctl_init()
1307 SUME_ETH_DEVICE_NAME, nf_priv->unit); in sume_sysctl_init()
1318 &nf_priv->stats.ifc_down_bytes, 0, "ifc_down bytes"); in sume_sysctl_init()
1321 &nf_priv->stats.ifc_down_packets, 0, "ifc_down packets"); in sume_sysctl_init()
1325 "hw_rx_packets", CTLFLAG_RD, &nf_priv->stats.hw_rx_packets, in sume_sysctl_init()
1330 "hw_tx_packets", CTLFLAG_RD, &nf_priv->stats.hw_tx_packets, in sume_sysctl_init()
1335 "rx_bytes", CTLFLAG_RD, &nf_priv->stats.rx_bytes, 0, in sume_sysctl_init()
1338 "rx_dropped", CTLFLAG_RD, &nf_priv->stats.rx_dropped, 0, in sume_sysctl_init()
1341 "rx_packets", CTLFLAG_RD, &nf_priv->stats.rx_packets, 0, in sume_sysctl_init()
1346 "tx_bytes", CTLFLAG_RD, &nf_priv->stats.tx_bytes, 0, in sume_sysctl_init()
1349 "tx_dropped", CTLFLAG_RD, &nf_priv->stats.tx_dropped, 0, in sume_sysctl_init()
1352 "tx_packets", CTLFLAG_RD, &nf_priv->stats.tx_packets, 0, in sume_sysctl_init()
1362 if (!adapter->running) in sume_local_timer()
1365 taskqueue_enqueue(adapter->tq, &adapter->stat_task); in sume_local_timer()
1368 if (adapter->send[SUME_RIFFA_CHANNEL_DATA]->state != in sume_local_timer()
1369 SUME_RIFFA_CHAN_STATE_IDLE && ++adapter->wd_counter >= 3) { in sume_local_timer()
1371 device_printf(adapter->dev, "TX stuck, resetting adapter.\n"); in sume_local_timer()
1374 adapter->send[SUME_RIFFA_CHANNEL_DATA]->state = in sume_local_timer()
1376 adapter->wd_counter = 0; in sume_local_timer()
1382 callout_reset(&adapter->timer, 1 * hz, sume_local_timer, adapter); in sume_local_timer()
1392 if_t ifp = adapter->ifp[i]; in sume_get_stats()
1401 sifr.addr = SUME_STAT_RX_ADDR(nf_priv->port); in sume_get_stats()
1405 nf_priv->stats.hw_rx_packets += sifr.val; in sume_get_stats()
1408 sifr.addr = SUME_STAT_TX_ADDR(nf_priv->port); in sume_get_stats()
1412 nf_priv->stats.hw_tx_packets += sifr.val; in sume_get_stats()
1421 adapter->dev = dev; in sume_attach()
1424 mtx_init(&adapter->lock, "Global lock", NULL, MTX_DEF); in sume_attach()
1426 adapter->running = 0; in sume_attach()
1448 adapter->running = 1; in sume_attach()
1450 callout_init(&adapter->timer, 1); in sume_attach()
1451 TASK_INIT(&adapter->stat_task, 0, sume_get_stats, adapter); in sume_attach()
1453 adapter->tq = taskqueue_create("sume_stats", M_NOWAIT, in sume_attach()
1454 taskqueue_thread_enqueue, &adapter->tq); in sume_attach()
1455 taskqueue_start_threads(&adapter->tq, 1, PI_NET, "%s stattaskq", in sume_attach()
1456 device_get_nameunit(adapter->dev)); in sume_attach()
1458 callout_reset(&adapter->timer, 1 * hz, sume_local_timer, adapter); in sume_attach()
1478 if (pp[ch]->buf_hw_addr != 0) { in sume_remove_riffa_buffer()
1479 bus_dmamem_free(pp[ch]->ch_tag, pp[ch]->buf_addr, in sume_remove_riffa_buffer()
1480 pp[ch]->ch_map); in sume_remove_riffa_buffer()
1481 pp[ch]->buf_hw_addr = 0; in sume_remove_riffa_buffer()
1491 if (adapter->send != NULL) { in sume_remove_riffa_buffers()
1492 sume_remove_riffa_buffer(adapter, adapter->send); in sume_remove_riffa_buffers()
1493 free(adapter->send, M_SUME); in sume_remove_riffa_buffers()
1494 adapter->send = NULL; in sume_remove_riffa_buffers()
1496 if (adapter->recv != NULL) { in sume_remove_riffa_buffers()
1497 sume_remove_riffa_buffer(adapter, adapter->recv); in sume_remove_riffa_buffers()
1498 free(adapter->recv, M_SUME); in sume_remove_riffa_buffers()
1499 adapter->recv = NULL; in sume_remove_riffa_buffers()
1510 KASSERT(mtx_initialized(&adapter->lock), ("SUME mutex not " in sume_detach()
1512 adapter->running = 0; in sume_detach()
1515 callout_drain(&adapter->timer); in sume_detach()
1517 if (adapter->tq) { in sume_detach()
1518 taskqueue_drain(adapter->tq, &adapter->stat_task); in sume_detach()
1519 taskqueue_free(adapter->tq); in sume_detach()
1523 if_t ifp = adapter->ifp[i]; in sume_detach()
1532 ifmedia_removeall(&nf_priv->media); in sume_detach()
1533 free_unr(unr, nf_priv->unit); in sume_detach()
1544 if (adapter->irq.tag) in sume_detach()
1545 bus_teardown_intr(dev, adapter->irq.res, adapter->irq.tag); in sume_detach()
1546 if (adapter->irq.res) in sume_detach()
1547 bus_release_resource(dev, SYS_RES_IRQ, adapter->irq.rid, in sume_detach()
1548 adapter->irq.res); in sume_detach()
1552 if (adapter->bar0_addr) in sume_detach()
1553 bus_release_resource(dev, SYS_RES_MEMORY, adapter->rid, in sume_detach()
1554 adapter->bar0_addr); in sume_detach()
1556 mtx_destroy(&adapter->lock); in sume_detach()