Lines Matching refs:pdata

172 static void xgbe_free_channels(struct xgbe_prv_data *pdata)  in xgbe_free_channels()  argument
176 for (i = 0; i < ARRAY_SIZE(pdata->channel); i++) { in xgbe_free_channels()
177 if (!pdata->channel[i]) in xgbe_free_channels()
180 kfree(pdata->channel[i]->rx_ring); in xgbe_free_channels()
181 kfree(pdata->channel[i]->tx_ring); in xgbe_free_channels()
182 kfree(pdata->channel[i]); in xgbe_free_channels()
184 pdata->channel[i] = NULL; in xgbe_free_channels()
187 pdata->channel_count = 0; in xgbe_free_channels()
190 static int xgbe_alloc_channels(struct xgbe_prv_data *pdata) in xgbe_alloc_channels() argument
198 count = max_t(unsigned int, pdata->tx_ring_count, pdata->rx_ring_count); in xgbe_alloc_channels()
201 cpu = cpumask_local_spread(i, dev_to_node(pdata->dev)); in xgbe_alloc_channels()
209 pdata->channel[i] = channel; in xgbe_alloc_channels()
212 channel->pdata = pdata; in xgbe_alloc_channels()
214 channel->dma_regs = pdata->xgmac_regs + DMA_CH_BASE + in xgbe_alloc_channels()
219 if (pdata->per_channel_irq) in xgbe_alloc_channels()
220 channel->dma_irq = pdata->channel_irq[i]; in xgbe_alloc_channels()
222 if (i < pdata->tx_ring_count) { in xgbe_alloc_channels()
233 if (i < pdata->rx_ring_count) { in xgbe_alloc_channels()
244 netif_dbg(pdata, drv, pdata->netdev, in xgbe_alloc_channels()
247 netif_dbg(pdata, drv, pdata->netdev, in xgbe_alloc_channels()
253 pdata->channel_count = count; in xgbe_alloc_channels()
258 xgbe_free_channels(pdata); in xgbe_alloc_channels()
276 struct xgbe_prv_data *pdata = channel->pdata; in xgbe_maybe_stop_tx_queue() local
279 netif_info(pdata, drv, pdata->netdev, in xgbe_maybe_stop_tx_queue()
281 netif_stop_subqueue(pdata->netdev, channel->queue_index); in xgbe_maybe_stop_tx_queue()
288 pdata->hw_if.tx_start_xmit(channel, ring); in xgbe_maybe_stop_tx_queue()
309 static void xgbe_enable_rx_tx_int(struct xgbe_prv_data *pdata, in xgbe_enable_rx_tx_int() argument
312 struct xgbe_hw_if *hw_if = &pdata->hw_if; in xgbe_enable_rx_tx_int()
327 static void xgbe_enable_rx_tx_ints(struct xgbe_prv_data *pdata) in xgbe_enable_rx_tx_ints() argument
331 for (i = 0; i < pdata->channel_count; i++) in xgbe_enable_rx_tx_ints()
332 xgbe_enable_rx_tx_int(pdata, pdata->channel[i]); in xgbe_enable_rx_tx_ints()
335 static void xgbe_disable_rx_tx_int(struct xgbe_prv_data *pdata, in xgbe_disable_rx_tx_int() argument
338 struct xgbe_hw_if *hw_if = &pdata->hw_if; in xgbe_disable_rx_tx_int()
353 static void xgbe_disable_rx_tx_ints(struct xgbe_prv_data *pdata) in xgbe_disable_rx_tx_ints() argument
357 for (i = 0; i < pdata->channel_count; i++) in xgbe_disable_rx_tx_ints()
358 xgbe_disable_rx_tx_int(pdata, pdata->channel[i]); in xgbe_disable_rx_tx_ints()
361 static bool xgbe_ecc_sec(struct xgbe_prv_data *pdata, unsigned long *period, in xgbe_ecc_sec() argument
372 dev_warn_once(pdata->dev, in xgbe_ecc_sec()
377 dev_warn_once(pdata->dev, in xgbe_ecc_sec()
386 static bool xgbe_ecc_ded(struct xgbe_prv_data *pdata, unsigned long *period, in xgbe_ecc_ded() argument
397 netdev_alert(pdata->netdev, in xgbe_ecc_ded()
408 struct xgbe_prv_data *pdata = from_tasklet(pdata, t, tasklet_ecc); in xgbe_ecc_isr_task() local
413 ecc_isr = XP_IOREAD(pdata, XP_ECC_ISR); in xgbe_ecc_isr_task()
414 ecc_isr &= XP_IOREAD(pdata, XP_ECC_IER); in xgbe_ecc_isr_task()
415 netif_dbg(pdata, intr, pdata->netdev, "ECC_ISR=%#010x\n", ecc_isr); in xgbe_ecc_isr_task()
418 stop |= xgbe_ecc_ded(pdata, &pdata->tx_ded_period, in xgbe_ecc_isr_task()
419 &pdata->tx_ded_count, "TX fifo"); in xgbe_ecc_isr_task()
423 stop |= xgbe_ecc_ded(pdata, &pdata->rx_ded_period, in xgbe_ecc_isr_task()
424 &pdata->rx_ded_count, "RX fifo"); in xgbe_ecc_isr_task()
428 stop |= xgbe_ecc_ded(pdata, &pdata->desc_ded_period, in xgbe_ecc_isr_task()
429 &pdata->desc_ded_count, in xgbe_ecc_isr_task()
434 pdata->hw_if.disable_ecc_ded(pdata); in xgbe_ecc_isr_task()
435 schedule_work(&pdata->stopdev_work); in xgbe_ecc_isr_task()
440 if (xgbe_ecc_sec(pdata, &pdata->tx_sec_period, in xgbe_ecc_isr_task()
441 &pdata->tx_sec_count, "TX fifo")) in xgbe_ecc_isr_task()
442 pdata->hw_if.disable_ecc_sec(pdata, XGBE_ECC_SEC_TX); in xgbe_ecc_isr_task()
446 if (xgbe_ecc_sec(pdata, &pdata->rx_sec_period, in xgbe_ecc_isr_task()
447 &pdata->rx_sec_count, "RX fifo")) in xgbe_ecc_isr_task()
448 pdata->hw_if.disable_ecc_sec(pdata, XGBE_ECC_SEC_RX); in xgbe_ecc_isr_task()
451 if (xgbe_ecc_sec(pdata, &pdata->desc_sec_period, in xgbe_ecc_isr_task()
452 &pdata->desc_sec_count, "descriptor cache")) in xgbe_ecc_isr_task()
453 pdata->hw_if.disable_ecc_sec(pdata, XGBE_ECC_SEC_DESC); in xgbe_ecc_isr_task()
457 XP_IOWRITE(pdata, XP_ECC_ISR, ecc_isr); in xgbe_ecc_isr_task()
460 if (pdata->vdata->irq_reissue_support) in xgbe_ecc_isr_task()
461 XP_IOWRITE(pdata, XP_INT_REISSUE_EN, 1 << 1); in xgbe_ecc_isr_task()
466 struct xgbe_prv_data *pdata = data; in xgbe_ecc_isr() local
468 if (pdata->isr_as_tasklet) in xgbe_ecc_isr()
469 tasklet_schedule(&pdata->tasklet_ecc); in xgbe_ecc_isr()
471 xgbe_ecc_isr_task(&pdata->tasklet_ecc); in xgbe_ecc_isr()
478 struct xgbe_prv_data *pdata = from_tasklet(pdata, t, tasklet_dev); in xgbe_isr_task() local
479 struct xgbe_hw_if *hw_if = &pdata->hw_if; in xgbe_isr_task()
489 dma_isr = XGMAC_IOREAD(pdata, DMA_ISR); in xgbe_isr_task()
493 netif_dbg(pdata, intr, pdata->netdev, "DMA_ISR=%#010x\n", dma_isr); in xgbe_isr_task()
495 for (i = 0; i < pdata->channel_count; i++) { in xgbe_isr_task()
499 channel = pdata->channel[i]; in xgbe_isr_task()
502 netif_dbg(pdata, intr, pdata->netdev, "DMA_CH%u_ISR=%#010x\n", in xgbe_isr_task()
509 if (!pdata->per_channel_irq && in xgbe_isr_task()
512 if (napi_schedule_prep(&pdata->napi)) { in xgbe_isr_task()
514 xgbe_disable_rx_tx_ints(pdata); in xgbe_isr_task()
517 __napi_schedule(&pdata->napi); in xgbe_isr_task()
529 pdata->ext_stats.rx_buffer_unavailable++; in xgbe_isr_task()
533 schedule_work(&pdata->restart_work); in xgbe_isr_task()
540 mac_isr = XGMAC_IOREAD(pdata, MAC_ISR); in xgbe_isr_task()
542 netif_dbg(pdata, intr, pdata->netdev, "MAC_ISR=%#010x\n", in xgbe_isr_task()
546 hw_if->tx_mmc_int(pdata); in xgbe_isr_task()
549 hw_if->rx_mmc_int(pdata); in xgbe_isr_task()
552 mac_tssr = XGMAC_IOREAD(pdata, MAC_TSSR); in xgbe_isr_task()
554 netif_dbg(pdata, intr, pdata->netdev, in xgbe_isr_task()
559 pdata->tx_tstamp = in xgbe_isr_task()
560 hw_if->get_tx_tstamp(pdata); in xgbe_isr_task()
561 queue_work(pdata->dev_workqueue, in xgbe_isr_task()
562 &pdata->tx_tstamp_work); in xgbe_isr_task()
567 mac_mdioisr = XGMAC_IOREAD(pdata, MAC_MDIOISR); in xgbe_isr_task()
569 netif_dbg(pdata, intr, pdata->netdev, in xgbe_isr_task()
574 complete(&pdata->mdio_complete); in xgbe_isr_task()
580 if (pdata->dev_irq == pdata->an_irq) in xgbe_isr_task()
581 pdata->phy_if.an_isr(pdata); in xgbe_isr_task()
584 if (pdata->vdata->ecc_support && (pdata->dev_irq == pdata->ecc_irq)) in xgbe_isr_task()
585 xgbe_ecc_isr_task(&pdata->tasklet_ecc); in xgbe_isr_task()
588 if (pdata->vdata->i2c_support && (pdata->dev_irq == pdata->i2c_irq)) in xgbe_isr_task()
589 pdata->i2c_if.i2c_isr(pdata); in xgbe_isr_task()
592 if (pdata->vdata->irq_reissue_support) { in xgbe_isr_task()
596 if (!pdata->per_channel_irq) in xgbe_isr_task()
599 XP_IOWRITE(pdata, XP_INT_REISSUE_EN, reissue_mask); in xgbe_isr_task()
605 struct xgbe_prv_data *pdata = data; in xgbe_isr() local
607 if (pdata->isr_as_tasklet) in xgbe_isr()
608 tasklet_schedule(&pdata->tasklet_dev); in xgbe_isr()
610 xgbe_isr_task(&pdata->tasklet_dev); in xgbe_isr()
618 struct xgbe_prv_data *pdata = channel->pdata; in xgbe_dma_isr() local
626 if (pdata->channel_irq_mode) in xgbe_dma_isr()
627 xgbe_disable_rx_tx_int(pdata, channel); in xgbe_dma_isr()
647 struct xgbe_prv_data *pdata = channel->pdata; in xgbe_tx_timer() local
652 napi = (pdata->per_channel_irq) ? &channel->napi : &pdata->napi; in xgbe_tx_timer()
656 if (pdata->per_channel_irq) in xgbe_tx_timer()
657 if (pdata->channel_irq_mode) in xgbe_tx_timer()
658 xgbe_disable_rx_tx_int(pdata, channel); in xgbe_tx_timer()
662 xgbe_disable_rx_tx_ints(pdata); in xgbe_tx_timer()
675 struct xgbe_prv_data *pdata = container_of(work, in xgbe_service() local
679 pdata->phy_if.phy_status(pdata); in xgbe_service()
684 struct xgbe_prv_data *pdata = from_timer(pdata, t, service_timer); in xgbe_service_timer() local
688 queue_work(pdata->dev_workqueue, &pdata->service_work); in xgbe_service_timer()
690 mod_timer(&pdata->service_timer, jiffies + HZ); in xgbe_service_timer()
692 if (!pdata->tx_usecs) in xgbe_service_timer()
695 for (i = 0; i < pdata->channel_count; i++) { in xgbe_service_timer()
696 channel = pdata->channel[i]; in xgbe_service_timer()
701 jiffies + usecs_to_jiffies(pdata->tx_usecs)); in xgbe_service_timer()
705 static void xgbe_init_timers(struct xgbe_prv_data *pdata) in xgbe_init_timers() argument
710 timer_setup(&pdata->service_timer, xgbe_service_timer, 0); in xgbe_init_timers()
712 for (i = 0; i < pdata->channel_count; i++) { in xgbe_init_timers()
713 channel = pdata->channel[i]; in xgbe_init_timers()
721 static void xgbe_start_timers(struct xgbe_prv_data *pdata) in xgbe_start_timers() argument
723 mod_timer(&pdata->service_timer, jiffies + HZ); in xgbe_start_timers()
726 static void xgbe_stop_timers(struct xgbe_prv_data *pdata) in xgbe_stop_timers() argument
731 del_timer_sync(&pdata->service_timer); in xgbe_stop_timers()
733 for (i = 0; i < pdata->channel_count; i++) { in xgbe_stop_timers()
734 channel = pdata->channel[i]; in xgbe_stop_timers()
744 void xgbe_get_all_hw_features(struct xgbe_prv_data *pdata) in xgbe_get_all_hw_features() argument
747 struct xgbe_hw_features *hw_feat = &pdata->hw_feat; in xgbe_get_all_hw_features()
749 mac_hfr0 = XGMAC_IOREAD(pdata, MAC_HWF0R); in xgbe_get_all_hw_features()
750 mac_hfr1 = XGMAC_IOREAD(pdata, MAC_HWF1R); in xgbe_get_all_hw_features()
751 mac_hfr2 = XGMAC_IOREAD(pdata, MAC_HWF2R); in xgbe_get_all_hw_features()
755 hw_feat->version = XGMAC_IOREAD(pdata, MAC_VR); in xgbe_get_all_hw_features()
844 if (netif_msg_probe(pdata)) { in xgbe_get_all_hw_features()
845 dev_dbg(pdata->dev, "Hardware features:\n"); in xgbe_get_all_hw_features()
848 dev_dbg(pdata->dev, " 1GbE support : %s\n", in xgbe_get_all_hw_features()
850 dev_dbg(pdata->dev, " VLAN hash filter : %s\n", in xgbe_get_all_hw_features()
852 dev_dbg(pdata->dev, " MDIO interface : %s\n", in xgbe_get_all_hw_features()
854 dev_dbg(pdata->dev, " Wake-up packet support : %s\n", in xgbe_get_all_hw_features()
856 dev_dbg(pdata->dev, " Magic packet support : %s\n", in xgbe_get_all_hw_features()
858 dev_dbg(pdata->dev, " Management counters : %s\n", in xgbe_get_all_hw_features()
860 dev_dbg(pdata->dev, " ARP offload : %s\n", in xgbe_get_all_hw_features()
862 dev_dbg(pdata->dev, " IEEE 1588-2008 Timestamp : %s\n", in xgbe_get_all_hw_features()
864 dev_dbg(pdata->dev, " Energy Efficient Ethernet : %s\n", in xgbe_get_all_hw_features()
866 dev_dbg(pdata->dev, " TX checksum offload : %s\n", in xgbe_get_all_hw_features()
868 dev_dbg(pdata->dev, " RX checksum offload : %s\n", in xgbe_get_all_hw_features()
870 dev_dbg(pdata->dev, " Additional MAC addresses : %u\n", in xgbe_get_all_hw_features()
872 dev_dbg(pdata->dev, " Timestamp source : %s\n", in xgbe_get_all_hw_features()
876 dev_dbg(pdata->dev, " SA/VLAN insertion : %s\n", in xgbe_get_all_hw_features()
878 dev_dbg(pdata->dev, " VXLAN/NVGRE support : %s\n", in xgbe_get_all_hw_features()
882 dev_dbg(pdata->dev, " RX fifo size : %u\n", in xgbe_get_all_hw_features()
884 dev_dbg(pdata->dev, " TX fifo size : %u\n", in xgbe_get_all_hw_features()
886 dev_dbg(pdata->dev, " IEEE 1588 high word : %s\n", in xgbe_get_all_hw_features()
888 dev_dbg(pdata->dev, " DMA width : %u\n", in xgbe_get_all_hw_features()
890 dev_dbg(pdata->dev, " Data Center Bridging : %s\n", in xgbe_get_all_hw_features()
892 dev_dbg(pdata->dev, " Split header : %s\n", in xgbe_get_all_hw_features()
894 dev_dbg(pdata->dev, " TCP Segmentation Offload : %s\n", in xgbe_get_all_hw_features()
896 dev_dbg(pdata->dev, " Debug memory interface : %s\n", in xgbe_get_all_hw_features()
898 dev_dbg(pdata->dev, " Receive Side Scaling : %s\n", in xgbe_get_all_hw_features()
900 dev_dbg(pdata->dev, " Traffic Class count : %u\n", in xgbe_get_all_hw_features()
902 dev_dbg(pdata->dev, " Hash table size : %u\n", in xgbe_get_all_hw_features()
904 dev_dbg(pdata->dev, " L3/L4 Filters : %u\n", in xgbe_get_all_hw_features()
908 dev_dbg(pdata->dev, " RX queue count : %u\n", in xgbe_get_all_hw_features()
910 dev_dbg(pdata->dev, " TX queue count : %u\n", in xgbe_get_all_hw_features()
912 dev_dbg(pdata->dev, " RX DMA channel count : %u\n", in xgbe_get_all_hw_features()
914 dev_dbg(pdata->dev, " TX DMA channel count : %u\n", in xgbe_get_all_hw_features()
916 dev_dbg(pdata->dev, " PPS outputs : %u\n", in xgbe_get_all_hw_features()
918 dev_dbg(pdata->dev, " Auxiliary snapshot inputs : %u\n", in xgbe_get_all_hw_features()
926 struct xgbe_prv_data *pdata = netdev_priv(netdev); in xgbe_vxlan_set_port() local
928 pdata->vxlan_port = be16_to_cpu(ti->port); in xgbe_vxlan_set_port()
929 pdata->hw_if.enable_vxlan(pdata); in xgbe_vxlan_set_port()
937 struct xgbe_prv_data *pdata = netdev_priv(netdev); in xgbe_vxlan_unset_port() local
939 pdata->hw_if.disable_vxlan(pdata); in xgbe_vxlan_unset_port()
940 pdata->vxlan_port = 0; in xgbe_vxlan_unset_port()
959 static void xgbe_napi_enable(struct xgbe_prv_data *pdata, unsigned int add) in xgbe_napi_enable() argument
964 if (pdata->per_channel_irq) { in xgbe_napi_enable()
965 for (i = 0; i < pdata->channel_count; i++) { in xgbe_napi_enable()
966 channel = pdata->channel[i]; in xgbe_napi_enable()
968 netif_napi_add(pdata->netdev, &channel->napi, in xgbe_napi_enable()
975 netif_napi_add(pdata->netdev, &pdata->napi, in xgbe_napi_enable()
978 napi_enable(&pdata->napi); in xgbe_napi_enable()
982 static void xgbe_napi_disable(struct xgbe_prv_data *pdata, unsigned int del) in xgbe_napi_disable() argument
987 if (pdata->per_channel_irq) { in xgbe_napi_disable()
988 for (i = 0; i < pdata->channel_count; i++) { in xgbe_napi_disable()
989 channel = pdata->channel[i]; in xgbe_napi_disable()
996 napi_disable(&pdata->napi); in xgbe_napi_disable()
999 netif_napi_del(&pdata->napi); in xgbe_napi_disable()
1003 static int xgbe_request_irqs(struct xgbe_prv_data *pdata) in xgbe_request_irqs() argument
1006 struct net_device *netdev = pdata->netdev; in xgbe_request_irqs()
1010 tasklet_setup(&pdata->tasklet_dev, xgbe_isr_task); in xgbe_request_irqs()
1011 tasklet_setup(&pdata->tasklet_ecc, xgbe_ecc_isr_task); in xgbe_request_irqs()
1013 ret = devm_request_irq(pdata->dev, pdata->dev_irq, xgbe_isr, 0, in xgbe_request_irqs()
1014 netdev_name(netdev), pdata); in xgbe_request_irqs()
1017 pdata->dev_irq); in xgbe_request_irqs()
1021 if (pdata->vdata->ecc_support && (pdata->dev_irq != pdata->ecc_irq)) { in xgbe_request_irqs()
1022 ret = devm_request_irq(pdata->dev, pdata->ecc_irq, xgbe_ecc_isr, in xgbe_request_irqs()
1023 0, pdata->ecc_name, pdata); in xgbe_request_irqs()
1026 pdata->ecc_irq); in xgbe_request_irqs()
1031 if (!pdata->per_channel_irq) in xgbe_request_irqs()
1034 for (i = 0; i < pdata->channel_count; i++) { in xgbe_request_irqs()
1035 channel = pdata->channel[i]; in xgbe_request_irqs()
1041 ret = devm_request_irq(pdata->dev, channel->dma_irq, in xgbe_request_irqs()
1058 for (i--; i < pdata->channel_count; i--) { in xgbe_request_irqs()
1059 channel = pdata->channel[i]; in xgbe_request_irqs()
1062 devm_free_irq(pdata->dev, channel->dma_irq, channel); in xgbe_request_irqs()
1065 if (pdata->vdata->ecc_support && (pdata->dev_irq != pdata->ecc_irq)) in xgbe_request_irqs()
1066 devm_free_irq(pdata->dev, pdata->ecc_irq, pdata); in xgbe_request_irqs()
1069 devm_free_irq(pdata->dev, pdata->dev_irq, pdata); in xgbe_request_irqs()
1074 static void xgbe_free_irqs(struct xgbe_prv_data *pdata) in xgbe_free_irqs() argument
1079 devm_free_irq(pdata->dev, pdata->dev_irq, pdata); in xgbe_free_irqs()
1081 tasklet_kill(&pdata->tasklet_dev); in xgbe_free_irqs()
1082 tasklet_kill(&pdata->tasklet_ecc); in xgbe_free_irqs()
1084 if (pdata->vdata->ecc_support && (pdata->dev_irq != pdata->ecc_irq)) in xgbe_free_irqs()
1085 devm_free_irq(pdata->dev, pdata->ecc_irq, pdata); in xgbe_free_irqs()
1087 if (!pdata->per_channel_irq) in xgbe_free_irqs()
1090 for (i = 0; i < pdata->channel_count; i++) { in xgbe_free_irqs()
1091 channel = pdata->channel[i]; in xgbe_free_irqs()
1094 devm_free_irq(pdata->dev, channel->dma_irq, channel); in xgbe_free_irqs()
1098 void xgbe_init_tx_coalesce(struct xgbe_prv_data *pdata) in xgbe_init_tx_coalesce() argument
1100 struct xgbe_hw_if *hw_if = &pdata->hw_if; in xgbe_init_tx_coalesce()
1104 pdata->tx_usecs = XGMAC_INIT_DMA_TX_USECS; in xgbe_init_tx_coalesce()
1105 pdata->tx_frames = XGMAC_INIT_DMA_TX_FRAMES; in xgbe_init_tx_coalesce()
1107 hw_if->config_tx_coalesce(pdata); in xgbe_init_tx_coalesce()
1112 void xgbe_init_rx_coalesce(struct xgbe_prv_data *pdata) in xgbe_init_rx_coalesce() argument
1114 struct xgbe_hw_if *hw_if = &pdata->hw_if; in xgbe_init_rx_coalesce()
1118 pdata->rx_riwt = hw_if->usec_to_riwt(pdata, XGMAC_INIT_DMA_RX_USECS); in xgbe_init_rx_coalesce()
1119 pdata->rx_usecs = XGMAC_INIT_DMA_RX_USECS; in xgbe_init_rx_coalesce()
1120 pdata->rx_frames = XGMAC_INIT_DMA_RX_FRAMES; in xgbe_init_rx_coalesce()
1122 hw_if->config_rx_coalesce(pdata); in xgbe_init_rx_coalesce()
1127 static void xgbe_free_tx_data(struct xgbe_prv_data *pdata) in xgbe_free_tx_data() argument
1129 struct xgbe_desc_if *desc_if = &pdata->desc_if; in xgbe_free_tx_data()
1136 for (i = 0; i < pdata->channel_count; i++) { in xgbe_free_tx_data()
1137 ring = pdata->channel[i]->tx_ring; in xgbe_free_tx_data()
1143 desc_if->unmap_rdata(pdata, rdata); in xgbe_free_tx_data()
1150 static void xgbe_free_rx_data(struct xgbe_prv_data *pdata) in xgbe_free_rx_data() argument
1152 struct xgbe_desc_if *desc_if = &pdata->desc_if; in xgbe_free_rx_data()
1159 for (i = 0; i < pdata->channel_count; i++) { in xgbe_free_rx_data()
1160 ring = pdata->channel[i]->rx_ring; in xgbe_free_rx_data()
1166 desc_if->unmap_rdata(pdata, rdata); in xgbe_free_rx_data()
1173 static int xgbe_phy_reset(struct xgbe_prv_data *pdata) in xgbe_phy_reset() argument
1175 pdata->phy_link = -1; in xgbe_phy_reset()
1176 pdata->phy_speed = SPEED_UNKNOWN; in xgbe_phy_reset()
1178 return pdata->phy_if.phy_reset(pdata); in xgbe_phy_reset()
1183 struct xgbe_prv_data *pdata = netdev_priv(netdev); in xgbe_powerdown() local
1184 struct xgbe_hw_if *hw_if = &pdata->hw_if; in xgbe_powerdown()
1190 (caller == XGMAC_IOCTL_CONTEXT && pdata->power_down)) { in xgbe_powerdown()
1196 spin_lock_irqsave(&pdata->lock, flags); in xgbe_powerdown()
1203 xgbe_stop_timers(pdata); in xgbe_powerdown()
1204 flush_workqueue(pdata->dev_workqueue); in xgbe_powerdown()
1206 hw_if->powerdown_tx(pdata); in xgbe_powerdown()
1207 hw_if->powerdown_rx(pdata); in xgbe_powerdown()
1209 xgbe_napi_disable(pdata, 0); in xgbe_powerdown()
1211 pdata->power_down = 1; in xgbe_powerdown()
1213 spin_unlock_irqrestore(&pdata->lock, flags); in xgbe_powerdown()
1222 struct xgbe_prv_data *pdata = netdev_priv(netdev); in xgbe_powerup() local
1223 struct xgbe_hw_if *hw_if = &pdata->hw_if; in xgbe_powerup()
1229 (caller == XGMAC_IOCTL_CONTEXT && !pdata->power_down)) { in xgbe_powerup()
1235 spin_lock_irqsave(&pdata->lock, flags); in xgbe_powerup()
1237 pdata->power_down = 0; in xgbe_powerup()
1239 xgbe_napi_enable(pdata, 0); in xgbe_powerup()
1241 hw_if->powerup_tx(pdata); in xgbe_powerup()
1242 hw_if->powerup_rx(pdata); in xgbe_powerup()
1249 xgbe_start_timers(pdata); in xgbe_powerup()
1251 spin_unlock_irqrestore(&pdata->lock, flags); in xgbe_powerup()
1258 static void xgbe_free_memory(struct xgbe_prv_data *pdata) in xgbe_free_memory() argument
1260 struct xgbe_desc_if *desc_if = &pdata->desc_if; in xgbe_free_memory()
1263 desc_if->free_ring_resources(pdata); in xgbe_free_memory()
1266 xgbe_free_channels(pdata); in xgbe_free_memory()
1269 static int xgbe_alloc_memory(struct xgbe_prv_data *pdata) in xgbe_alloc_memory() argument
1271 struct xgbe_desc_if *desc_if = &pdata->desc_if; in xgbe_alloc_memory()
1272 struct net_device *netdev = pdata->netdev; in xgbe_alloc_memory()
1275 if (pdata->new_tx_ring_count) { in xgbe_alloc_memory()
1276 pdata->tx_ring_count = pdata->new_tx_ring_count; in xgbe_alloc_memory()
1277 pdata->tx_q_count = pdata->tx_ring_count; in xgbe_alloc_memory()
1278 pdata->new_tx_ring_count = 0; in xgbe_alloc_memory()
1281 if (pdata->new_rx_ring_count) { in xgbe_alloc_memory()
1282 pdata->rx_ring_count = pdata->new_rx_ring_count; in xgbe_alloc_memory()
1283 pdata->new_rx_ring_count = 0; in xgbe_alloc_memory()
1287 pdata->rx_buf_size = xgbe_calc_rx_buf_size(netdev, netdev->mtu); in xgbe_alloc_memory()
1290 ret = xgbe_alloc_channels(pdata); in xgbe_alloc_memory()
1295 ret = desc_if->alloc_ring_resources(pdata); in xgbe_alloc_memory()
1300 xgbe_init_timers(pdata); in xgbe_alloc_memory()
1305 xgbe_free_memory(pdata); in xgbe_alloc_memory()
1310 static int xgbe_start(struct xgbe_prv_data *pdata) in xgbe_start() argument
1312 struct xgbe_hw_if *hw_if = &pdata->hw_if; in xgbe_start()
1313 struct xgbe_phy_if *phy_if = &pdata->phy_if; in xgbe_start()
1314 struct net_device *netdev = pdata->netdev; in xgbe_start()
1319 ret = netif_set_real_num_tx_queues(netdev, pdata->tx_ring_count); in xgbe_start()
1325 ret = netif_set_real_num_rx_queues(netdev, pdata->rx_ring_count); in xgbe_start()
1333 XGMAC_SET_BITS(pdata->rss_table[i], MAC_RSSDR, DMCH, in xgbe_start()
1334 i % pdata->rx_ring_count); in xgbe_start()
1336 ret = hw_if->init(pdata); in xgbe_start()
1340 xgbe_napi_enable(pdata, 1); in xgbe_start()
1342 ret = xgbe_request_irqs(pdata); in xgbe_start()
1346 ret = phy_if->phy_start(pdata); in xgbe_start()
1350 hw_if->enable_tx(pdata); in xgbe_start()
1351 hw_if->enable_rx(pdata); in xgbe_start()
1357 xgbe_start_timers(pdata); in xgbe_start()
1358 queue_work(pdata->dev_workqueue, &pdata->service_work); in xgbe_start()
1360 clear_bit(XGBE_STOPPED, &pdata->dev_state); in xgbe_start()
1365 xgbe_free_irqs(pdata); in xgbe_start()
1368 xgbe_napi_disable(pdata, 1); in xgbe_start()
1370 hw_if->exit(pdata); in xgbe_start()
1375 static void xgbe_stop(struct xgbe_prv_data *pdata) in xgbe_stop() argument
1377 struct xgbe_hw_if *hw_if = &pdata->hw_if; in xgbe_stop()
1378 struct xgbe_phy_if *phy_if = &pdata->phy_if; in xgbe_stop()
1380 struct net_device *netdev = pdata->netdev; in xgbe_stop()
1386 if (test_bit(XGBE_STOPPED, &pdata->dev_state)) in xgbe_stop()
1390 netif_carrier_off(pdata->netdev); in xgbe_stop()
1392 xgbe_stop_timers(pdata); in xgbe_stop()
1393 flush_workqueue(pdata->dev_workqueue); in xgbe_stop()
1397 hw_if->disable_tx(pdata); in xgbe_stop()
1398 hw_if->disable_rx(pdata); in xgbe_stop()
1400 phy_if->phy_stop(pdata); in xgbe_stop()
1402 xgbe_free_irqs(pdata); in xgbe_stop()
1404 xgbe_napi_disable(pdata, 1); in xgbe_stop()
1406 hw_if->exit(pdata); in xgbe_stop()
1408 for (i = 0; i < pdata->channel_count; i++) { in xgbe_stop()
1409 channel = pdata->channel[i]; in xgbe_stop()
1417 set_bit(XGBE_STOPPED, &pdata->dev_state); in xgbe_stop()
1424 struct xgbe_prv_data *pdata = container_of(work, in xgbe_stopdev() local
1430 xgbe_stop(pdata); in xgbe_stopdev()
1432 xgbe_free_tx_data(pdata); in xgbe_stopdev()
1433 xgbe_free_rx_data(pdata); in xgbe_stopdev()
1437 netdev_alert(pdata->netdev, "device stopped\n"); in xgbe_stopdev()
1440 void xgbe_full_restart_dev(struct xgbe_prv_data *pdata) in xgbe_full_restart_dev() argument
1443 if (!netif_running(pdata->netdev)) in xgbe_full_restart_dev()
1446 xgbe_stop(pdata); in xgbe_full_restart_dev()
1448 xgbe_free_memory(pdata); in xgbe_full_restart_dev()
1449 xgbe_alloc_memory(pdata); in xgbe_full_restart_dev()
1451 xgbe_start(pdata); in xgbe_full_restart_dev()
1454 void xgbe_restart_dev(struct xgbe_prv_data *pdata) in xgbe_restart_dev() argument
1457 if (!netif_running(pdata->netdev)) in xgbe_restart_dev()
1460 xgbe_stop(pdata); in xgbe_restart_dev()
1462 xgbe_free_tx_data(pdata); in xgbe_restart_dev()
1463 xgbe_free_rx_data(pdata); in xgbe_restart_dev()
1465 xgbe_start(pdata); in xgbe_restart_dev()
1470 struct xgbe_prv_data *pdata = container_of(work, in xgbe_restart() local
1476 xgbe_restart_dev(pdata); in xgbe_restart()
1483 struct xgbe_prv_data *pdata = container_of(work, in xgbe_tx_tstamp() local
1490 spin_lock_irqsave(&pdata->tstamp_lock, flags); in xgbe_tx_tstamp()
1491 if (!pdata->tx_tstamp_skb) in xgbe_tx_tstamp()
1494 if (pdata->tx_tstamp) { in xgbe_tx_tstamp()
1495 nsec = timecounter_cyc2time(&pdata->tstamp_tc, in xgbe_tx_tstamp()
1496 pdata->tx_tstamp); in xgbe_tx_tstamp()
1500 skb_tstamp_tx(pdata->tx_tstamp_skb, &hwtstamps); in xgbe_tx_tstamp()
1503 dev_kfree_skb_any(pdata->tx_tstamp_skb); in xgbe_tx_tstamp()
1505 pdata->tx_tstamp_skb = NULL; in xgbe_tx_tstamp()
1508 spin_unlock_irqrestore(&pdata->tstamp_lock, flags); in xgbe_tx_tstamp()
1511 static int xgbe_get_hwtstamp_settings(struct xgbe_prv_data *pdata, in xgbe_get_hwtstamp_settings() argument
1514 if (copy_to_user(ifreq->ifr_data, &pdata->tstamp_config, in xgbe_get_hwtstamp_settings()
1515 sizeof(pdata->tstamp_config))) in xgbe_get_hwtstamp_settings()
1521 static int xgbe_set_hwtstamp_settings(struct xgbe_prv_data *pdata, in xgbe_set_hwtstamp_settings() argument
1645 pdata->hw_if.config_tstamp(pdata, mac_tscr); in xgbe_set_hwtstamp_settings()
1647 memcpy(&pdata->tstamp_config, &config, sizeof(config)); in xgbe_set_hwtstamp_settings()
1652 static void xgbe_prep_tx_tstamp(struct xgbe_prv_data *pdata, in xgbe_prep_tx_tstamp() argument
1659 spin_lock_irqsave(&pdata->tstamp_lock, flags); in xgbe_prep_tx_tstamp()
1660 if (pdata->tx_tstamp_skb) { in xgbe_prep_tx_tstamp()
1665 pdata->tx_tstamp_skb = skb_get(skb); in xgbe_prep_tx_tstamp()
1668 spin_unlock_irqrestore(&pdata->tstamp_lock, flags); in xgbe_prep_tx_tstamp()
1761 static void xgbe_packet_info(struct xgbe_prv_data *pdata, in xgbe_packet_info() argument
1814 (pdata->tstamp_config.tx_type == HWTSTAMP_TX_ON)) in xgbe_packet_info()
1834 struct xgbe_prv_data *pdata = netdev_priv(netdev); in xgbe_open() local
1838 snprintf(pdata->an_name, sizeof(pdata->an_name) - 1, "%s-pcs", in xgbe_open()
1841 snprintf(pdata->ecc_name, sizeof(pdata->ecc_name) - 1, "%s-ecc", in xgbe_open()
1844 snprintf(pdata->i2c_name, sizeof(pdata->i2c_name) - 1, "%s-i2c", in xgbe_open()
1848 pdata->dev_workqueue = in xgbe_open()
1850 if (!pdata->dev_workqueue) { in xgbe_open()
1855 pdata->an_workqueue = in xgbe_open()
1856 create_singlethread_workqueue(pdata->an_name); in xgbe_open()
1857 if (!pdata->an_workqueue) { in xgbe_open()
1864 ret = xgbe_phy_reset(pdata); in xgbe_open()
1869 ret = clk_prepare_enable(pdata->sysclk); in xgbe_open()
1875 ret = clk_prepare_enable(pdata->ptpclk); in xgbe_open()
1881 INIT_WORK(&pdata->service_work, xgbe_service); in xgbe_open()
1882 INIT_WORK(&pdata->restart_work, xgbe_restart); in xgbe_open()
1883 INIT_WORK(&pdata->stopdev_work, xgbe_stopdev); in xgbe_open()
1884 INIT_WORK(&pdata->tx_tstamp_work, xgbe_tx_tstamp); in xgbe_open()
1886 ret = xgbe_alloc_memory(pdata); in xgbe_open()
1890 ret = xgbe_start(pdata); in xgbe_open()
1894 clear_bit(XGBE_DOWN, &pdata->dev_state); in xgbe_open()
1899 xgbe_free_memory(pdata); in xgbe_open()
1902 clk_disable_unprepare(pdata->ptpclk); in xgbe_open()
1905 clk_disable_unprepare(pdata->sysclk); in xgbe_open()
1908 destroy_workqueue(pdata->an_workqueue); in xgbe_open()
1911 destroy_workqueue(pdata->dev_workqueue); in xgbe_open()
1918 struct xgbe_prv_data *pdata = netdev_priv(netdev); in xgbe_close() local
1921 xgbe_stop(pdata); in xgbe_close()
1923 xgbe_free_memory(pdata); in xgbe_close()
1926 clk_disable_unprepare(pdata->ptpclk); in xgbe_close()
1927 clk_disable_unprepare(pdata->sysclk); in xgbe_close()
1929 destroy_workqueue(pdata->an_workqueue); in xgbe_close()
1931 destroy_workqueue(pdata->dev_workqueue); in xgbe_close()
1933 set_bit(XGBE_DOWN, &pdata->dev_state); in xgbe_close()
1940 struct xgbe_prv_data *pdata = netdev_priv(netdev); in xgbe_xmit() local
1941 struct xgbe_hw_if *hw_if = &pdata->hw_if; in xgbe_xmit()
1942 struct xgbe_desc_if *desc_if = &pdata->desc_if; in xgbe_xmit()
1951 channel = pdata->channel[skb->queue_mapping]; in xgbe_xmit()
1959 netif_err(pdata, tx_err, netdev, in xgbe_xmit()
1967 xgbe_packet_info(pdata, ring, skb, packet); in xgbe_xmit()
1976 netif_err(pdata, tx_err, netdev, in xgbe_xmit()
1988 xgbe_prep_tx_tstamp(pdata, skb, packet); in xgbe_xmit()
1996 if (netif_msg_pktdata(pdata)) in xgbe_xmit()
2010 struct xgbe_prv_data *pdata = netdev_priv(netdev); in xgbe_set_rx_mode() local
2011 struct xgbe_hw_if *hw_if = &pdata->hw_if; in xgbe_set_rx_mode()
2015 hw_if->config_rx_mode(pdata); in xgbe_set_rx_mode()
2022 struct xgbe_prv_data *pdata = netdev_priv(netdev); in xgbe_set_mac_address() local
2023 struct xgbe_hw_if *hw_if = &pdata->hw_if; in xgbe_set_mac_address()
2033 hw_if->set_mac_address(pdata, netdev->dev_addr); in xgbe_set_mac_address()
2042 struct xgbe_prv_data *pdata = netdev_priv(netdev); in xgbe_ioctl() local
2047 ret = xgbe_get_hwtstamp_settings(pdata, ifreq); in xgbe_ioctl()
2051 ret = xgbe_set_hwtstamp_settings(pdata, ifreq); in xgbe_ioctl()
2063 struct xgbe_prv_data *pdata = netdev_priv(netdev); in xgbe_change_mtu() local
2072 pdata->rx_buf_size = ret; in xgbe_change_mtu()
2075 xgbe_restart_dev(pdata); in xgbe_change_mtu()
2084 struct xgbe_prv_data *pdata = netdev_priv(netdev); in xgbe_tx_timeout() local
2087 schedule_work(&pdata->restart_work); in xgbe_tx_timeout()
2093 struct xgbe_prv_data *pdata = netdev_priv(netdev); in xgbe_get_stats64() local
2094 struct xgbe_mmc_stats *pstats = &pdata->mmc_stats; in xgbe_get_stats64()
2098 pdata->hw_if.read_mmc_stats(pdata); in xgbe_get_stats64()
2122 struct xgbe_prv_data *pdata = netdev_priv(netdev); in xgbe_vlan_rx_add_vid() local
2123 struct xgbe_hw_if *hw_if = &pdata->hw_if; in xgbe_vlan_rx_add_vid()
2127 set_bit(vid, pdata->active_vlans); in xgbe_vlan_rx_add_vid()
2128 hw_if->update_vlan_hash_table(pdata); in xgbe_vlan_rx_add_vid()
2138 struct xgbe_prv_data *pdata = netdev_priv(netdev); in xgbe_vlan_rx_kill_vid() local
2139 struct xgbe_hw_if *hw_if = &pdata->hw_if; in xgbe_vlan_rx_kill_vid()
2143 clear_bit(vid, pdata->active_vlans); in xgbe_vlan_rx_kill_vid()
2144 hw_if->update_vlan_hash_table(pdata); in xgbe_vlan_rx_kill_vid()
2154 struct xgbe_prv_data *pdata = netdev_priv(netdev); in xgbe_poll_controller() local
2160 if (pdata->per_channel_irq) { in xgbe_poll_controller()
2161 for (i = 0; i < pdata->channel_count; i++) { in xgbe_poll_controller()
2162 channel = pdata->channel[i]; in xgbe_poll_controller()
2166 disable_irq(pdata->dev_irq); in xgbe_poll_controller()
2167 xgbe_isr(pdata->dev_irq, pdata); in xgbe_poll_controller()
2168 enable_irq(pdata->dev_irq); in xgbe_poll_controller()
2178 struct xgbe_prv_data *pdata = netdev_priv(netdev); in xgbe_setup_tc() local
2188 if (tc > pdata->hw_feat.tc_cnt) in xgbe_setup_tc()
2191 pdata->num_tcs = tc; in xgbe_setup_tc()
2192 pdata->hw_if.config_tc(pdata); in xgbe_setup_tc()
2200 struct xgbe_prv_data *pdata = netdev_priv(netdev); in xgbe_fix_features() local
2205 if (!pdata->hw_feat.vxn) in xgbe_fix_features()
2243 struct xgbe_prv_data *pdata = netdev_priv(netdev); in xgbe_set_features() local
2244 struct xgbe_hw_if *hw_if = &pdata->hw_if; in xgbe_set_features()
2248 rxhash = pdata->netdev_features & NETIF_F_RXHASH; in xgbe_set_features()
2249 rxcsum = pdata->netdev_features & NETIF_F_RXCSUM; in xgbe_set_features()
2250 rxvlan = pdata->netdev_features & NETIF_F_HW_VLAN_CTAG_RX; in xgbe_set_features()
2251 rxvlan_filter = pdata->netdev_features & NETIF_F_HW_VLAN_CTAG_FILTER; in xgbe_set_features()
2254 ret = hw_if->enable_rss(pdata); in xgbe_set_features()
2256 ret = hw_if->disable_rss(pdata); in xgbe_set_features()
2261 hw_if->enable_rx_csum(pdata); in xgbe_set_features()
2263 hw_if->disable_rx_csum(pdata); in xgbe_set_features()
2266 hw_if->enable_rx_vlan_stripping(pdata); in xgbe_set_features()
2268 hw_if->disable_rx_vlan_stripping(pdata); in xgbe_set_features()
2271 hw_if->enable_rx_vlan_filtering(pdata); in xgbe_set_features()
2273 hw_if->disable_rx_vlan_filtering(pdata); in xgbe_set_features()
2275 pdata->netdev_features = features; in xgbe_set_features()
2321 struct xgbe_prv_data *pdata = channel->pdata; in xgbe_rx_refresh() local
2322 struct xgbe_hw_if *hw_if = &pdata->hw_if; in xgbe_rx_refresh()
2323 struct xgbe_desc_if *desc_if = &pdata->desc_if; in xgbe_rx_refresh()
2331 desc_if->unmap_rdata(pdata, rdata); in xgbe_rx_refresh()
2333 if (desc_if->map_rx_buffer(pdata, ring, rdata)) in xgbe_rx_refresh()
2336 hw_if->rx_desc_reset(pdata, rdata, ring->dirty); in xgbe_rx_refresh()
2351 static struct sk_buff *xgbe_create_skb(struct xgbe_prv_data *pdata, in xgbe_create_skb() argument
2366 dma_sync_single_range_for_cpu(pdata->dev, rdata->rx.hdr.dma_base, in xgbe_create_skb()
2417 struct xgbe_prv_data *pdata = channel->pdata; in xgbe_tx_poll() local
2418 struct xgbe_hw_if *hw_if = &pdata->hw_if; in xgbe_tx_poll()
2419 struct xgbe_desc_if *desc_if = &pdata->desc_if; in xgbe_tx_poll()
2423 struct net_device *netdev = pdata->netdev; in xgbe_tx_poll()
2454 if (netif_msg_tx_done(pdata)) in xgbe_tx_poll()
2455 xgbe_dump_tx_desc(pdata, ring, ring->dirty, 1, 0); in xgbe_tx_poll()
2463 desc_if->unmap_rdata(pdata, rdata); in xgbe_tx_poll()
2488 struct xgbe_prv_data *pdata = channel->pdata; in xgbe_rx_poll() local
2489 struct xgbe_hw_if *hw_if = &pdata->hw_if; in xgbe_rx_poll()
2493 struct net_device *netdev = pdata->netdev; in xgbe_rx_poll()
2511 napi = (pdata->per_channel_irq) ? &channel->napi : &pdata->napi; in xgbe_rx_poll()
2557 netif_err(pdata, rx_err, netdev, in xgbe_rx_poll()
2579 skb = xgbe_create_skb(pdata, napi, rdata, in xgbe_rx_poll()
2588 dma_sync_single_range_for_cpu(pdata->dev, in xgbe_rx_poll()
2619 netif_err(pdata, rx_err, netdev, in xgbe_rx_poll()
2625 if (netif_msg_pktdata(pdata)) in xgbe_rx_poll()
2651 nsec = timecounter_cyc2time(&pdata->tstamp_tc, in xgbe_rx_poll()
2690 struct xgbe_prv_data *pdata = channel->pdata; in xgbe_one_poll() local
2704 if (pdata->channel_irq_mode) in xgbe_one_poll()
2705 xgbe_enable_rx_tx_int(pdata, channel); in xgbe_one_poll()
2717 struct xgbe_prv_data *pdata = container_of(napi, struct xgbe_prv_data, in xgbe_all_poll() local
2727 ring_budget = budget / pdata->rx_ring_count; in xgbe_all_poll()
2731 for (i = 0; i < pdata->channel_count; i++) { in xgbe_all_poll()
2732 channel = pdata->channel[i]; in xgbe_all_poll()
2747 xgbe_enable_rx_tx_ints(pdata); in xgbe_all_poll()
2755 void xgbe_dump_tx_desc(struct xgbe_prv_data *pdata, struct xgbe_ring *ring, in xgbe_dump_tx_desc() argument
2764 netdev_dbg(pdata->netdev, in xgbe_dump_tx_desc()
2775 void xgbe_dump_rx_desc(struct xgbe_prv_data *pdata, struct xgbe_ring *ring, in xgbe_dump_rx_desc() argument
2783 netdev_dbg(pdata->netdev, in xgbe_dump_rx_desc()