Lines Matching +full:rx +full:- +full:tx
1 /* SPDX-License-Identifier: GPL-2.0+ */
42 netif_err(adapter, drv, adapter->netdev, in pci11x1x_strap_get_status()
55 adapter->is_sgmii_en = true; in pci11x1x_strap_get_status()
57 adapter->is_sgmii_en = false; in pci11x1x_strap_get_status()
62 adapter->is_sgmii_en = true; in pci11x1x_strap_get_status()
64 adapter->is_sgmii_en = false; in pci11x1x_strap_get_status()
66 adapter->is_sgmii_en = false; in pci11x1x_strap_get_status()
69 netif_dbg(adapter, drv, adapter->netdev, in pci11x1x_strap_get_status()
70 "SGMII I/F %sable\n", adapter->is_sgmii_en ? "En" : "Dis"); in pci11x1x_strap_get_status()
75 struct lan743x_csr *csr = &adapter->csr; in is_pci11x1x_chip()
76 u32 id_rev = csr->id_rev; in is_pci11x1x_chip()
87 pci_release_selected_regions(adapter->pdev, in lan743x_pci_cleanup()
88 pci_select_bars(adapter->pdev, in lan743x_pci_cleanup()
90 pci_disable_device(adapter->pdev); in lan743x_pci_cleanup()
99 adapter->pdev = pdev; in lan743x_pci_init()
104 netif_info(adapter, probe, adapter->netdev, in lan743x_pci_init()
106 pdev->vendor, pdev->device); in lan743x_pci_init()
119 pci_disable_device(adapter->pdev); in lan743x_pci_init()
127 return ioread32(&adapter->csr.csr_address[offset]); in lan743x_csr_read()
133 iowrite32(data, &adapter->csr.csr_address[offset]); in lan743x_csr_write()
176 struct lan743x_csr *csr = &adapter->csr; in lan743x_csr_init()
179 bar_start = pci_resource_start(adapter->pdev, 0); in lan743x_csr_init()
180 bar_length = pci_resource_len(adapter->pdev, 0); in lan743x_csr_init()
181 csr->csr_address = devm_ioremap(&adapter->pdev->dev, in lan743x_csr_init()
183 if (!csr->csr_address) in lan743x_csr_init()
184 return -ENOMEM; in lan743x_csr_init()
186 csr->id_rev = lan743x_csr_read(adapter, ID_REV); in lan743x_csr_init()
187 csr->fpga_rev = lan743x_csr_read(adapter, FPGA_REV); in lan743x_csr_init()
188 netif_info(adapter, probe, adapter->netdev, in lan743x_csr_init()
190 csr->id_rev, FPGA_REV_GET_MAJOR_(csr->fpga_rev), in lan743x_csr_init()
191 FPGA_REV_GET_MINOR_(csr->fpga_rev)); in lan743x_csr_init()
192 if (!ID_REV_IS_VALID_CHIP_ID_(csr->id_rev)) in lan743x_csr_init()
193 return -ENODEV; in lan743x_csr_init()
195 csr->flags = LAN743X_CSR_FLAG_SUPPORTS_INTR_AUTO_SET_CLR; in lan743x_csr_init()
196 switch (csr->id_rev & ID_REV_CHIP_REV_MASK_) { in lan743x_csr_init()
198 csr->flags |= LAN743X_CSR_FLAG_IS_A0; in lan743x_csr_init()
199 csr->flags &= ~LAN743X_CSR_FLAG_SUPPORTS_INTR_AUTO_SET_CLR; in lan743x_csr_init()
202 csr->flags |= LAN743X_CSR_FLAG_IS_B0; in lan743x_csr_init()
211 struct lan743x_intr *intr = &adapter->intr; in lan743x_intr_software_isr()
213 /* disable the interrupt to prevent repeated re-triggering */ in lan743x_intr_software_isr()
215 intr->software_isr_flag = true; in lan743x_intr_software_isr()
216 wake_up(&intr->software_isr_wq); in lan743x_intr_software_isr()
221 struct lan743x_tx *tx = context; in lan743x_tx_isr() local
222 struct lan743x_adapter *adapter = tx->adapter; in lan743x_tx_isr()
228 INT_BIT_DMA_TX_(tx->channel_number)); in lan743x_tx_isr()
231 if (int_sts & INT_BIT_DMA_TX_(tx->channel_number)) { in lan743x_tx_isr()
232 u32 ioc_bit = DMAC_INT_BIT_TX_IOC_(tx->channel_number); in lan743x_tx_isr()
249 napi_schedule(&tx->napi); in lan743x_tx_isr()
257 INT_BIT_DMA_TX_(tx->channel_number)); in lan743x_tx_isr()
262 struct lan743x_rx *rx = context; in lan743x_rx_isr() local
263 struct lan743x_adapter *adapter = rx->adapter; in lan743x_rx_isr()
268 INT_BIT_DMA_RX_(rx->channel_number)); in lan743x_rx_isr()
271 if (int_sts & INT_BIT_DMA_RX_(rx->channel_number)) { in lan743x_rx_isr()
272 u32 rx_frame_bit = DMAC_INT_BIT_RXFRM_(rx->channel_number); in lan743x_rx_isr()
289 napi_schedule(&rx->napi); in lan743x_rx_isr()
297 INT_BIT_DMA_RX_(rx->channel_number)); in lan743x_rx_isr()
312 lan743x_rx_isr(&adapter->rx[channel], in lan743x_intr_shared_isr()
319 for (channel = 0; channel < adapter->used_tx_channels; in lan743x_intr_shared_isr()
324 lan743x_tx_isr(&adapter->tx[channel], in lan743x_intr_shared_isr()
347 struct lan743x_adapter *adapter = vector->adapter; in lan743x_intr_entry_isr()
352 if (vector->flags & LAN743X_VECTOR_FLAG_SOURCE_STATUS_READ) { in lan743x_intr_entry_isr()
354 } else if (vector->flags & in lan743x_intr_entry_isr()
360 int_sts = vector->int_mask | INT_BIT_MAS_; in lan743x_intr_entry_isr()
366 if (vector->flags & LAN743X_VECTOR_FLAG_VECTOR_ENABLE_ISR_CLEAR) in lan743x_intr_entry_isr()
370 INT_VEC_EN_(vector->vector_index)); in lan743x_intr_entry_isr()
372 if (vector->flags & LAN743X_VECTOR_FLAG_MASTER_ENABLE_CLEAR) in lan743x_intr_entry_isr()
376 if (vector->flags & LAN743X_VECTOR_FLAG_SOURCE_ENABLE_CHECK) { in lan743x_intr_entry_isr()
380 int_enables = vector->int_mask; in lan743x_intr_entry_isr()
384 int_sts &= vector->int_mask; in lan743x_intr_entry_isr()
386 if (vector->handler) { in lan743x_intr_entry_isr()
387 vector->handler(vector->context, in lan743x_intr_entry_isr()
388 int_sts, vector->flags); in lan743x_intr_entry_isr()
392 vector->int_mask); in lan743x_intr_entry_isr()
397 if (vector->flags & LAN743X_VECTOR_FLAG_MASTER_ENABLE_SET) in lan743x_intr_entry_isr()
401 if (vector->flags & LAN743X_VECTOR_FLAG_VECTOR_ENABLE_ISR_SET) in lan743x_intr_entry_isr()
405 INT_VEC_EN_(vector->vector_index)); in lan743x_intr_entry_isr()
412 struct lan743x_intr *intr = &adapter->intr; in lan743x_intr_test_isr()
415 intr->software_isr_flag = false; in lan743x_intr_test_isr()
421 ret = wait_event_timeout(intr->software_isr_wq, in lan743x_intr_test_isr()
422 intr->software_isr_flag, in lan743x_intr_test_isr()
428 return ret > 0 ? 0 : -ENODEV; in lan743x_intr_test_isr()
437 struct lan743x_vector *vector = &adapter->intr.vector_list in lan743x_intr_register_isr()
441 vector->adapter = adapter; in lan743x_intr_register_isr()
442 vector->flags = flags; in lan743x_intr_register_isr()
443 vector->vector_index = vector_index; in lan743x_intr_register_isr()
444 vector->int_mask = int_mask; in lan743x_intr_register_isr()
445 vector->handler = handler; in lan743x_intr_register_isr()
446 vector->context = context; in lan743x_intr_register_isr()
448 ret = request_irq(vector->irq, in lan743x_intr_register_isr()
453 vector->handler = NULL; in lan743x_intr_register_isr()
454 vector->context = NULL; in lan743x_intr_register_isr()
455 vector->int_mask = 0; in lan743x_intr_register_isr()
456 vector->flags = 0; in lan743x_intr_register_isr()
464 struct lan743x_vector *vector = &adapter->intr.vector_list in lan743x_intr_unregister_isr()
467 free_irq(vector->irq, vector); in lan743x_intr_unregister_isr()
468 vector->handler = NULL; in lan743x_intr_unregister_isr()
469 vector->context = NULL; in lan743x_intr_unregister_isr()
470 vector->int_mask = 0; in lan743x_intr_unregister_isr()
471 vector->flags = 0; in lan743x_intr_unregister_isr()
479 for (index = 0; index < adapter->max_vector_count; index++) { in lan743x_intr_get_vector_flags()
480 if (adapter->intr.vector_list[index].int_mask & int_mask) in lan743x_intr_get_vector_flags()
481 return adapter->intr.vector_list[index].flags; in lan743x_intr_get_vector_flags()
488 struct lan743x_intr *intr = &adapter->intr; in lan743x_intr_close()
492 if (adapter->is_pci11x1x) in lan743x_intr_close()
497 for (index = 0; index < intr->number_of_vectors; index++) { in lan743x_intr_close()
498 if (intr->flags & INTR_FLAG_IRQ_REQUESTED(index)) { in lan743x_intr_close()
500 intr->flags &= ~INTR_FLAG_IRQ_REQUESTED(index); in lan743x_intr_close()
504 if (intr->flags & INTR_FLAG_MSI_ENABLED) { in lan743x_intr_close()
505 pci_disable_msi(adapter->pdev); in lan743x_intr_close()
506 intr->flags &= ~INTR_FLAG_MSI_ENABLED; in lan743x_intr_close()
509 if (intr->flags & INTR_FLAG_MSIX_ENABLED) { in lan743x_intr_close()
510 pci_disable_msix(adapter->pdev); in lan743x_intr_close()
511 intr->flags &= ~INTR_FLAG_MSIX_ENABLED; in lan743x_intr_close()
518 struct lan743x_intr *intr = &adapter->intr; in lan743x_intr_open()
524 int ret = -ENODEV; in lan743x_intr_open()
528 intr->number_of_vectors = 0; in lan743x_intr_open()
531 max_vector_count = adapter->max_vector_count; in lan743x_intr_open()
536 used_tx_channels = adapter->used_tx_channels; in lan743x_intr_open()
537 ret = pci_enable_msix_range(adapter->pdev, in lan743x_intr_open()
543 intr->flags |= INTR_FLAG_MSIX_ENABLED; in lan743x_intr_open()
544 intr->number_of_vectors = ret; in lan743x_intr_open()
545 intr->using_vectors = true; in lan743x_intr_open()
546 for (index = 0; index < intr->number_of_vectors; index++) in lan743x_intr_open()
547 intr->vector_list[index].irq = msix_entries in lan743x_intr_open()
549 netif_info(adapter, ifup, adapter->netdev, in lan743x_intr_open()
551 intr->number_of_vectors); in lan743x_intr_open()
555 if (!intr->number_of_vectors) { in lan743x_intr_open()
556 if (!(adapter->csr.flags & LAN743X_CSR_FLAG_IS_A0)) { in lan743x_intr_open()
557 if (!pci_enable_msi(adapter->pdev)) { in lan743x_intr_open()
558 intr->flags |= INTR_FLAG_MSI_ENABLED; in lan743x_intr_open()
559 intr->number_of_vectors = 1; in lan743x_intr_open()
560 intr->using_vectors = true; in lan743x_intr_open()
561 intr->vector_list[0].irq = in lan743x_intr_open()
562 adapter->pdev->irq; in lan743x_intr_open()
563 netif_info(adapter, ifup, adapter->netdev, in lan743x_intr_open()
565 intr->number_of_vectors); in lan743x_intr_open()
571 if (!intr->number_of_vectors) { in lan743x_intr_open()
572 intr->number_of_vectors = 1; in lan743x_intr_open()
573 intr->using_vectors = false; in lan743x_intr_open()
574 intr->vector_list[0].irq = intr->irq; in lan743x_intr_open()
575 netif_info(adapter, ifup, adapter->netdev, in lan743x_intr_open()
591 if (intr->using_vectors) { in lan743x_intr_open()
600 if (adapter->csr.flags & LAN743X_CSR_FLAG_SUPPORTS_INTR_AUTO_SET_CLR) { in lan743x_intr_open()
609 init_waitqueue_head(&intr->software_isr_wq); in lan743x_intr_open()
617 intr->flags |= INTR_FLAG_IRQ_REQUESTED(0); in lan743x_intr_open()
619 if (intr->using_vectors) in lan743x_intr_open()
623 if (!(adapter->csr.flags & LAN743X_CSR_FLAG_IS_A0)) { in lan743x_intr_open()
632 if (adapter->is_pci11x1x) { in lan743x_intr_open()
650 if (intr->number_of_vectors > 1) { in lan743x_intr_open()
651 int number_of_tx_vectors = intr->number_of_vectors - 1; in lan743x_intr_open()
662 if (adapter->csr.flags & in lan743x_intr_open()
674 /* map TX interrupt to vector */ in lan743x_intr_open()
678 /* Remove TX interrupt from shared mask */ in lan743x_intr_open()
679 intr->vector_list[0].int_mask &= ~int_bit; in lan743x_intr_open()
682 &adapter->tx[index]); in lan743x_intr_open()
685 intr->flags |= INTR_FLAG_IRQ_REQUESTED(vector); in lan743x_intr_open()
692 if ((intr->number_of_vectors - used_tx_channels) > 1) { in lan743x_intr_open()
693 int number_of_rx_vectors = intr->number_of_vectors - in lan743x_intr_open()
694 used_tx_channels - 1; in lan743x_intr_open()
706 if (adapter->csr.flags & in lan743x_intr_open()
718 /* map RX interrupt to vector */ in lan743x_intr_open()
728 /* Remove RX interrupt from shared mask */ in lan743x_intr_open()
729 intr->vector_list[0].int_mask &= ~int_bit; in lan743x_intr_open()
732 &adapter->rx[index]); in lan743x_intr_open()
735 intr->flags |= INTR_FLAG_IRQ_REQUESTED(vector); in lan743x_intr_open()
756 return -EIO; in lan743x_dp_write()
769 return -EIO; in lan743x_dp_write()
803 struct lan743x_adapter *adapter = bus->priv; in lan743x_mdiobus_read_c22()
826 struct lan743x_adapter *adapter = bus->priv; in lan743x_mdiobus_write_c22()
868 struct lan743x_adapter *adapter = bus->priv; in lan743x_mdiobus_read_c45()
901 struct lan743x_adapter *adapter = bus->priv; in lan743x_mdiobus_write_c45()
936 netif_err(adapter, drv, adapter->netdev, in lan743x_sgmii_wait_till_not_busy()
949 netif_err(adapter, probe, adapter->netdev, in lan743x_sgmii_read()
951 return -EINVAL; in lan743x_sgmii_read()
954 mutex_lock(&adapter->sgmii_rw_lock); in lan743x_sgmii_read()
967 mutex_unlock(&adapter->sgmii_rw_lock); in lan743x_sgmii_read()
979 netif_err(adapter, probe, adapter->netdev, in lan743x_sgmii_write()
981 return -EINVAL; in lan743x_sgmii_write()
983 mutex_lock(&adapter->sgmii_rw_lock); in lan743x_sgmii_write()
991 mutex_unlock(&adapter->sgmii_rw_lock); in lan743x_sgmii_write()
1026 lsd = -EINVAL; in lan743x_get_lsd()
1083 enum lan743x_sgmii_lsd lsd = adapter->sgmii_lsd; in lan743x_serdes_clock_and_aneg_update()
1117 /* In order for Auto-Negotiation to operate properly at in lan743x_serdes_clock_and_aneg_update()
1163 return -ETIMEDOUT; in lan743x_pcs_seq_state()
1173 /* SGMII/1000/2500BASE-X PCS power down */ in lan743x_pcs_power_reset()
1187 /* SGMII/1000/2500BASE-X PCS power up */ in lan743x_pcs_power_reset()
1210 ether_addr_copy(adapter->mac_address, addr); in lan743x_mac_set_address()
1211 netif_info(adapter, drv, adapter->netdev, in lan743x_mac_set_address()
1223 netdev = adapter->netdev; in lan743x_mac_init()
1231 if (!is_valid_ether_addr(adapter->mac_address)) { in lan743x_mac_init()
1234 adapter->mac_address[0] = mac_addr_lo & 0xFF; in lan743x_mac_init()
1235 adapter->mac_address[1] = (mac_addr_lo >> 8) & 0xFF; in lan743x_mac_init()
1236 adapter->mac_address[2] = (mac_addr_lo >> 16) & 0xFF; in lan743x_mac_init()
1237 adapter->mac_address[3] = (mac_addr_lo >> 24) & 0xFF; in lan743x_mac_init()
1238 adapter->mac_address[4] = mac_addr_hi & 0xFF; in lan743x_mac_init()
1239 adapter->mac_address[5] = (mac_addr_hi >> 8) & 0xFF; in lan743x_mac_init()
1244 } else if (!is_valid_ether_addr(adapter->mac_address)) { in lan743x_mac_init()
1249 eth_random_addr(adapter->mac_address); in lan743x_mac_init()
1251 lan743x_mac_set_address(adapter, adapter->mac_address); in lan743x_mac_init()
1252 eth_hw_addr_set(netdev, adapter->mac_address); in lan743x_mac_init()
1355 id_rev = adapter->csr.id_rev & ID_REV_ID_MASK_; in lan743x_phy_interface_select()
1357 if (adapter->is_pci11x1x && adapter->is_sgmii_en) in lan743x_phy_interface_select()
1358 adapter->phy_interface = PHY_INTERFACE_MODE_SGMII; in lan743x_phy_interface_select()
1360 adapter->phy_interface = PHY_INTERFACE_MODE_GMII; in lan743x_phy_interface_select()
1362 adapter->phy_interface = PHY_INTERFACE_MODE_MII; in lan743x_phy_interface_select()
1364 adapter->phy_interface = PHY_INTERFACE_MODE_RGMII; in lan743x_phy_interface_select()
1366 netif_dbg(adapter, drv, adapter->netdev, in lan743x_phy_interface_select()
1367 "selected phy interface: 0x%X\n", adapter->phy_interface); in lan743x_phy_interface_select()
1395 mac_addr = adapter->mac_address; in lan743x_rfe_update_mac_address()
1410 struct net_device *netdev = adapter->netdev; in lan743x_rfe_set_multicast()
1419 if (netdev->flags & IFF_PROMISC) { in lan743x_rfe_set_multicast()
1422 if (netdev->flags & IFF_ALLMULTI) in lan743x_rfe_set_multicast()
1426 if (netdev->features & NETIF_F_RXCSUM) in lan743x_rfe_set_multicast()
1441 data = ha->addr[3]; in lan743x_rfe_set_multicast()
1442 data = ha->addr[2] | (data << 8); in lan743x_rfe_set_multicast()
1443 data = ha->addr[1] | (data << 8); in lan743x_rfe_set_multicast()
1444 data = ha->addr[0] | (data << 8); in lan743x_rfe_set_multicast()
1447 data = ha->addr[5]; in lan743x_rfe_set_multicast()
1448 data = ha->addr[4] | (data << 8); in lan743x_rfe_set_multicast()
1453 u32 bitnum = (ether_crc(ETH_ALEN, ha->addr) >> in lan743x_rfe_set_multicast()
1489 return -EPERM; in lan743x_dmac_init()
1491 if (!(adapter->csr.flags & LAN743X_CSR_FLAG_IS_A0)) in lan743x_dmac_init()
1532 timeout--; in lan743x_dmac_tx_wait_till_stopped()
1535 result = -ENODEV; in lan743x_dmac_tx_wait_till_stopped()
1561 timeout--; in lan743x_dmac_rx_wait_till_stopped()
1564 result = -ENODEV; in lan743x_dmac_rx_wait_till_stopped()
1568 static void lan743x_tx_release_desc(struct lan743x_tx *tx, in lan743x_tx_release_desc() argument
1576 descriptor = &tx->ring_cpu_ptr[descriptor_index]; in lan743x_tx_release_desc()
1577 buffer_info = &tx->buffer_info[descriptor_index]; in lan743x_tx_release_desc()
1578 if (!(buffer_info->flags & TX_BUFFER_INFO_FLAG_ACTIVE)) in lan743x_tx_release_desc()
1581 descriptor_type = le32_to_cpu(descriptor->data0) & in lan743x_tx_release_desc()
1589 if (buffer_info->dma_ptr) { in lan743x_tx_release_desc()
1590 if (buffer_info->flags & in lan743x_tx_release_desc()
1592 dma_unmap_page(&tx->adapter->pdev->dev, in lan743x_tx_release_desc()
1593 buffer_info->dma_ptr, in lan743x_tx_release_desc()
1594 buffer_info->buffer_length, in lan743x_tx_release_desc()
1597 dma_unmap_single(&tx->adapter->pdev->dev, in lan743x_tx_release_desc()
1598 buffer_info->dma_ptr, in lan743x_tx_release_desc()
1599 buffer_info->buffer_length, in lan743x_tx_release_desc()
1602 buffer_info->dma_ptr = 0; in lan743x_tx_release_desc()
1603 buffer_info->buffer_length = 0; in lan743x_tx_release_desc()
1605 if (!buffer_info->skb) in lan743x_tx_release_desc()
1608 if (!(buffer_info->flags & TX_BUFFER_INFO_FLAG_TIMESTAMP_REQUESTED)) { in lan743x_tx_release_desc()
1609 dev_kfree_skb_any(buffer_info->skb); in lan743x_tx_release_desc()
1614 lan743x_ptp_unrequest_tx_timestamp(tx->adapter); in lan743x_tx_release_desc()
1615 dev_kfree_skb_any(buffer_info->skb); in lan743x_tx_release_desc()
1617 ignore_sync = (buffer_info->flags & in lan743x_tx_release_desc()
1619 lan743x_ptp_tx_timestamp_skb(tx->adapter, in lan743x_tx_release_desc()
1620 buffer_info->skb, ignore_sync); in lan743x_tx_release_desc()
1624 buffer_info->skb = NULL; in lan743x_tx_release_desc()
1627 buffer_info->flags &= ~TX_BUFFER_INFO_FLAG_ACTIVE; in lan743x_tx_release_desc()
1634 static int lan743x_tx_next_index(struct lan743x_tx *tx, int index) in lan743x_tx_next_index() argument
1636 return ((++index) % tx->ring_size); in lan743x_tx_next_index()
1639 static void lan743x_tx_release_completed_descriptors(struct lan743x_tx *tx) in lan743x_tx_release_completed_descriptors() argument
1641 while (le32_to_cpu(*tx->head_cpu_ptr) != (tx->last_head)) { in lan743x_tx_release_completed_descriptors()
1642 lan743x_tx_release_desc(tx, tx->last_head, false); in lan743x_tx_release_completed_descriptors()
1643 tx->last_head = lan743x_tx_next_index(tx, tx->last_head); in lan743x_tx_release_completed_descriptors()
1647 static void lan743x_tx_release_all_descriptors(struct lan743x_tx *tx) in lan743x_tx_release_all_descriptors() argument
1651 original_head = tx->last_head; in lan743x_tx_release_all_descriptors()
1653 lan743x_tx_release_desc(tx, tx->last_head, true); in lan743x_tx_release_all_descriptors()
1654 tx->last_head = lan743x_tx_next_index(tx, tx->last_head); in lan743x_tx_release_all_descriptors()
1655 } while (tx->last_head != original_head); in lan743x_tx_release_all_descriptors()
1656 memset(tx->ring_cpu_ptr, 0, in lan743x_tx_release_all_descriptors()
1657 sizeof(*tx->ring_cpu_ptr) * (tx->ring_size)); in lan743x_tx_release_all_descriptors()
1658 memset(tx->buffer_info, 0, in lan743x_tx_release_all_descriptors()
1659 sizeof(*tx->buffer_info) * (tx->ring_size)); in lan743x_tx_release_all_descriptors()
1662 static int lan743x_tx_get_desc_cnt(struct lan743x_tx *tx, in lan743x_tx_get_desc_cnt() argument
1670 nr_frags = skb_shinfo(skb)->nr_frags; in lan743x_tx_get_desc_cnt()
1675 static int lan743x_tx_get_avail_desc(struct lan743x_tx *tx) in lan743x_tx_get_avail_desc() argument
1677 int last_head = tx->last_head; in lan743x_tx_get_avail_desc()
1678 int last_tail = tx->last_tail; in lan743x_tx_get_avail_desc()
1681 return tx->ring_size - last_tail + last_head - 1; in lan743x_tx_get_avail_desc()
1683 return last_head - last_tail - 1; in lan743x_tx_get_avail_desc()
1694 channel_number = adapter->rx[index].channel_number; in lan743x_rx_cfg_b_tstamp_config()
1725 return -ERANGE; in lan743x_rx_set_tstamp_mode()
1727 adapter->rx_tstamp_filter = rx_filter; in lan743x_rx_set_tstamp_mode()
1731 void lan743x_tx_set_timestamping_mode(struct lan743x_tx *tx, in lan743x_tx_set_timestamping_mode() argument
1736 tx->ts_flags |= TX_TS_FLAG_TIMESTAMPING_ENABLED; in lan743x_tx_set_timestamping_mode()
1738 tx->ts_flags &= ~TX_TS_FLAG_TIMESTAMPING_ENABLED; in lan743x_tx_set_timestamping_mode()
1740 tx->ts_flags |= TX_TS_FLAG_ONE_STEP_SYNC; in lan743x_tx_set_timestamping_mode()
1742 tx->ts_flags &= ~TX_TS_FLAG_ONE_STEP_SYNC; in lan743x_tx_set_timestamping_mode()
1745 static int lan743x_tx_frame_start(struct lan743x_tx *tx, in lan743x_tx_frame_start() argument
1753 * assuming tx->ring_lock has already been acquired. in lan743x_tx_frame_start()
1757 struct lan743x_adapter *adapter = tx->adapter; in lan743x_tx_frame_start()
1758 struct device *dev = &adapter->pdev->dev; in lan743x_tx_frame_start()
1761 tx->frame_flags |= TX_FRAME_FLAG_IN_PROGRESS; in lan743x_tx_frame_start()
1762 tx->frame_first = tx->last_tail; in lan743x_tx_frame_start()
1763 tx->frame_tail = tx->frame_first; in lan743x_tx_frame_start()
1765 tx_descriptor = &tx->ring_cpu_ptr[tx->frame_tail]; in lan743x_tx_frame_start()
1766 buffer_info = &tx->buffer_info[tx->frame_tail]; in lan743x_tx_frame_start()
1770 return -ENOMEM; in lan743x_tx_frame_start()
1772 tx_descriptor->data1 = cpu_to_le32(DMA_ADDR_LOW32(dma_ptr)); in lan743x_tx_frame_start()
1773 tx_descriptor->data2 = cpu_to_le32(DMA_ADDR_HIGH32(dma_ptr)); in lan743x_tx_frame_start()
1774 tx_descriptor->data3 = cpu_to_le32((frame_length << 16) & in lan743x_tx_frame_start()
1777 buffer_info->skb = NULL; in lan743x_tx_frame_start()
1778 buffer_info->dma_ptr = dma_ptr; in lan743x_tx_frame_start()
1779 buffer_info->buffer_length = first_buffer_length; in lan743x_tx_frame_start()
1780 buffer_info->flags |= TX_BUFFER_INFO_FLAG_ACTIVE; in lan743x_tx_frame_start()
1782 tx->frame_data0 = (first_buffer_length & in lan743x_tx_frame_start()
1788 tx->frame_data0 |= TX_DESC_DATA0_TSE_; in lan743x_tx_frame_start()
1791 tx->frame_data0 |= TX_DESC_DATA0_ICE_ | in lan743x_tx_frame_start()
1799 static void lan743x_tx_frame_add_lso(struct lan743x_tx *tx, in lan743x_tx_frame_add_lso() argument
1804 * assuming tx->ring_lock has already been acquired. in lan743x_tx_frame_add_lso()
1810 tx->frame_data0 |= TX_DESC_DATA0_EXT_; in lan743x_tx_frame_add_lso()
1812 tx->frame_data0 |= TX_DESC_DATA0_LS_; in lan743x_tx_frame_add_lso()
1813 tx->frame_data0 |= TX_DESC_DATA0_IOC_; in lan743x_tx_frame_add_lso()
1814 tx->frame_last = tx->frame_first; in lan743x_tx_frame_add_lso()
1816 tx_descriptor = &tx->ring_cpu_ptr[tx->frame_tail]; in lan743x_tx_frame_add_lso()
1817 tx_descriptor->data0 = cpu_to_le32(tx->frame_data0); in lan743x_tx_frame_add_lso()
1820 tx->frame_tail = lan743x_tx_next_index(tx, tx->frame_tail); in lan743x_tx_frame_add_lso()
1821 tx_descriptor = &tx->ring_cpu_ptr[tx->frame_tail]; in lan743x_tx_frame_add_lso()
1822 buffer_info = &tx->buffer_info[tx->frame_tail]; in lan743x_tx_frame_add_lso()
1825 tx_descriptor->data1 = 0; in lan743x_tx_frame_add_lso()
1826 tx_descriptor->data2 = 0; in lan743x_tx_frame_add_lso()
1827 tx_descriptor->data3 = 0; in lan743x_tx_frame_add_lso()
1829 buffer_info->skb = NULL; in lan743x_tx_frame_add_lso()
1830 buffer_info->dma_ptr = 0; in lan743x_tx_frame_add_lso()
1831 buffer_info->buffer_length = 0; in lan743x_tx_frame_add_lso()
1832 buffer_info->flags |= TX_BUFFER_INFO_FLAG_ACTIVE; in lan743x_tx_frame_add_lso()
1834 tx->frame_data0 = (frame_length & TX_DESC_DATA0_EXT_PAY_LENGTH_MASK_) | in lan743x_tx_frame_add_lso()
1841 static int lan743x_tx_frame_add_fragment(struct lan743x_tx *tx, in lan743x_tx_frame_add_fragment() argument
1846 * assuming tx->ring_lock has already been acquired in lan743x_tx_frame_add_fragment()
1850 struct lan743x_adapter *adapter = tx->adapter; in lan743x_tx_frame_add_fragment()
1851 struct device *dev = &adapter->pdev->dev; in lan743x_tx_frame_add_fragment()
1860 tx_descriptor = &tx->ring_cpu_ptr[tx->frame_tail]; in lan743x_tx_frame_add_fragment()
1861 tx_descriptor->data0 = cpu_to_le32(tx->frame_data0); in lan743x_tx_frame_add_fragment()
1864 tx->frame_tail = lan743x_tx_next_index(tx, tx->frame_tail); in lan743x_tx_frame_add_fragment()
1865 tx_descriptor = &tx->ring_cpu_ptr[tx->frame_tail]; in lan743x_tx_frame_add_fragment()
1866 buffer_info = &tx->buffer_info[tx->frame_tail]; in lan743x_tx_frame_add_fragment()
1874 desc_index = tx->frame_first; in lan743x_tx_frame_add_fragment()
1875 while (desc_index != tx->frame_tail) { in lan743x_tx_frame_add_fragment()
1876 lan743x_tx_release_desc(tx, desc_index, true); in lan743x_tx_frame_add_fragment()
1877 desc_index = lan743x_tx_next_index(tx, desc_index); in lan743x_tx_frame_add_fragment()
1880 tx->frame_flags &= ~TX_FRAME_FLAG_IN_PROGRESS; in lan743x_tx_frame_add_fragment()
1881 tx->frame_first = 0; in lan743x_tx_frame_add_fragment()
1882 tx->frame_data0 = 0; in lan743x_tx_frame_add_fragment()
1883 tx->frame_tail = 0; in lan743x_tx_frame_add_fragment()
1884 tx->frame_last = 0; in lan743x_tx_frame_add_fragment()
1885 return -ENOMEM; in lan743x_tx_frame_add_fragment()
1888 tx_descriptor->data1 = cpu_to_le32(DMA_ADDR_LOW32(dma_ptr)); in lan743x_tx_frame_add_fragment()
1889 tx_descriptor->data2 = cpu_to_le32(DMA_ADDR_HIGH32(dma_ptr)); in lan743x_tx_frame_add_fragment()
1890 tx_descriptor->data3 = cpu_to_le32((frame_length << 16) & in lan743x_tx_frame_add_fragment()
1893 buffer_info->skb = NULL; in lan743x_tx_frame_add_fragment()
1894 buffer_info->dma_ptr = dma_ptr; in lan743x_tx_frame_add_fragment()
1895 buffer_info->buffer_length = fragment_length; in lan743x_tx_frame_add_fragment()
1896 buffer_info->flags |= TX_BUFFER_INFO_FLAG_ACTIVE; in lan743x_tx_frame_add_fragment()
1897 buffer_info->flags |= TX_BUFFER_INFO_FLAG_SKB_FRAGMENT; in lan743x_tx_frame_add_fragment()
1899 tx->frame_data0 = (fragment_length & TX_DESC_DATA0_BUF_LENGTH_MASK_) | in lan743x_tx_frame_add_fragment()
1907 static void lan743x_tx_frame_end(struct lan743x_tx *tx, in lan743x_tx_frame_end() argument
1913 * assuming tx->ring_lock has already been acquired in lan743x_tx_frame_end()
1917 struct lan743x_adapter *adapter = tx->adapter; in lan743x_tx_frame_end()
1921 if ((tx->frame_data0 & TX_DESC_DATA0_DTYPE_MASK_) == in lan743x_tx_frame_end()
1923 tx->frame_data0 |= TX_DESC_DATA0_LS_; in lan743x_tx_frame_end()
1924 tx->frame_data0 |= TX_DESC_DATA0_IOC_; in lan743x_tx_frame_end()
1925 tx->frame_last = tx->frame_tail; in lan743x_tx_frame_end()
1928 tx_descriptor = &tx->ring_cpu_ptr[tx->frame_last]; in lan743x_tx_frame_end()
1929 buffer_info = &tx->buffer_info[tx->frame_last]; in lan743x_tx_frame_end()
1930 buffer_info->skb = skb; in lan743x_tx_frame_end()
1932 buffer_info->flags |= TX_BUFFER_INFO_FLAG_TIMESTAMP_REQUESTED; in lan743x_tx_frame_end()
1934 buffer_info->flags |= TX_BUFFER_INFO_FLAG_IGNORE_SYNC; in lan743x_tx_frame_end()
1936 tx_descriptor = &tx->ring_cpu_ptr[tx->frame_tail]; in lan743x_tx_frame_end()
1937 tx_descriptor->data0 = cpu_to_le32(tx->frame_data0); in lan743x_tx_frame_end()
1938 tx->frame_tail = lan743x_tx_next_index(tx, tx->frame_tail); in lan743x_tx_frame_end()
1939 tx->last_tail = tx->frame_tail; in lan743x_tx_frame_end()
1943 if (tx->vector_flags & LAN743X_VECTOR_FLAG_VECTOR_ENABLE_AUTO_SET) in lan743x_tx_frame_end()
1945 if (tx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_ENABLE_AUTO_SET) in lan743x_tx_frame_end()
1949 lan743x_csr_write(adapter, TX_TAIL(tx->channel_number), in lan743x_tx_frame_end()
1950 tx_tail_flags | tx->frame_tail); in lan743x_tx_frame_end()
1951 tx->frame_flags &= ~TX_FRAME_FLAG_IN_PROGRESS; in lan743x_tx_frame_end()
1954 static netdev_tx_t lan743x_tx_xmit_frame(struct lan743x_tx *tx, in lan743x_tx_xmit_frame() argument
1970 required_number_of_descriptors = lan743x_tx_get_desc_cnt(tx, skb); in lan743x_tx_xmit_frame()
1972 spin_lock_irqsave(&tx->ring_lock, irq_flags); in lan743x_tx_xmit_frame()
1974 lan743x_tx_get_avail_desc(tx)) { in lan743x_tx_xmit_frame()
1975 if (required_number_of_descriptors > (tx->ring_size - 1)) { in lan743x_tx_xmit_frame()
1979 tx->rqd_descriptors = required_number_of_descriptors; in lan743x_tx_xmit_frame()
1981 txq = netdev_get_tx_queue(tx->adapter->netdev, in lan743x_tx_xmit_frame()
1982 tx->channel_number); in lan743x_tx_xmit_frame()
1989 if ((skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) && in lan743x_tx_xmit_frame()
1990 (tx->ts_flags & TX_TS_FLAG_TIMESTAMPING_ENABLED) && in lan743x_tx_xmit_frame()
1991 (lan743x_ptp_request_tx_timestamp(tx->adapter))) { in lan743x_tx_xmit_frame()
1992 skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS; in lan743x_tx_xmit_frame()
1994 if (tx->ts_flags & TX_TS_FLAG_ONE_STEP_SYNC) in lan743x_tx_xmit_frame()
1999 nr_frags = skb_shinfo(skb)->nr_frags; in lan743x_tx_xmit_frame()
2003 start_frame_length = max(skb_shinfo(skb)->gso_size, in lan743x_tx_xmit_frame()
2007 if (lan743x_tx_frame_start(tx, in lan743x_tx_xmit_frame()
2008 skb->data, head_length, in lan743x_tx_xmit_frame()
2011 skb->ip_summed == CHECKSUM_PARTIAL)) { in lan743x_tx_xmit_frame()
2015 tx->frame_count++; in lan743x_tx_xmit_frame()
2018 lan743x_tx_frame_add_lso(tx, frame_length, nr_frags); in lan743x_tx_xmit_frame()
2024 const skb_frag_t *frag = &(skb_shinfo(skb)->frags[j]); in lan743x_tx_xmit_frame()
2026 if (lan743x_tx_frame_add_fragment(tx, frag, frame_length)) { in lan743x_tx_xmit_frame()
2038 lan743x_tx_frame_end(tx, skb, do_timestamp, ignore_sync); in lan743x_tx_xmit_frame()
2041 spin_unlock_irqrestore(&tx->ring_lock, irq_flags); in lan743x_tx_xmit_frame()
2047 struct lan743x_tx *tx = container_of(napi, struct lan743x_tx, napi); in lan743x_tx_napi_poll() local
2048 struct lan743x_adapter *adapter = tx->adapter; in lan743x_tx_napi_poll()
2053 ioc_bit = DMAC_INT_BIT_TX_IOC_(tx->channel_number); in lan743x_tx_napi_poll()
2055 if (tx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_STATUS_W2C) in lan743x_tx_napi_poll()
2057 spin_lock_irqsave(&tx->ring_lock, irq_flags); in lan743x_tx_napi_poll()
2059 /* clean up tx ring */ in lan743x_tx_napi_poll()
2060 lan743x_tx_release_completed_descriptors(tx); in lan743x_tx_napi_poll()
2061 txq = netdev_get_tx_queue(adapter->netdev, tx->channel_number); in lan743x_tx_napi_poll()
2063 if (tx->rqd_descriptors) { in lan743x_tx_napi_poll()
2064 if (tx->rqd_descriptors <= in lan743x_tx_napi_poll()
2065 lan743x_tx_get_avail_desc(tx)) { in lan743x_tx_napi_poll()
2066 tx->rqd_descriptors = 0; in lan743x_tx_napi_poll()
2073 spin_unlock_irqrestore(&tx->ring_lock, irq_flags); in lan743x_tx_napi_poll()
2080 INT_BIT_DMA_TX_(tx->channel_number)); in lan743x_tx_napi_poll()
2087 static void lan743x_tx_ring_cleanup(struct lan743x_tx *tx) in lan743x_tx_ring_cleanup() argument
2089 if (tx->head_cpu_ptr) { in lan743x_tx_ring_cleanup()
2090 dma_free_coherent(&tx->adapter->pdev->dev, in lan743x_tx_ring_cleanup()
2091 sizeof(*tx->head_cpu_ptr), tx->head_cpu_ptr, in lan743x_tx_ring_cleanup()
2092 tx->head_dma_ptr); in lan743x_tx_ring_cleanup()
2093 tx->head_cpu_ptr = NULL; in lan743x_tx_ring_cleanup()
2094 tx->head_dma_ptr = 0; in lan743x_tx_ring_cleanup()
2096 kfree(tx->buffer_info); in lan743x_tx_ring_cleanup()
2097 tx->buffer_info = NULL; in lan743x_tx_ring_cleanup()
2099 if (tx->ring_cpu_ptr) { in lan743x_tx_ring_cleanup()
2100 dma_free_coherent(&tx->adapter->pdev->dev, in lan743x_tx_ring_cleanup()
2101 tx->ring_allocation_size, tx->ring_cpu_ptr, in lan743x_tx_ring_cleanup()
2102 tx->ring_dma_ptr); in lan743x_tx_ring_cleanup()
2103 tx->ring_allocation_size = 0; in lan743x_tx_ring_cleanup()
2104 tx->ring_cpu_ptr = NULL; in lan743x_tx_ring_cleanup()
2105 tx->ring_dma_ptr = 0; in lan743x_tx_ring_cleanup()
2107 tx->ring_size = 0; in lan743x_tx_ring_cleanup()
2110 static int lan743x_tx_ring_init(struct lan743x_tx *tx) in lan743x_tx_ring_init() argument
2115 int ret = -ENOMEM; in lan743x_tx_ring_init()
2117 tx->ring_size = LAN743X_TX_RING_SIZE; in lan743x_tx_ring_init()
2118 if (tx->ring_size & ~TX_CFG_B_TX_RING_LEN_MASK_) { in lan743x_tx_ring_init()
2119 ret = -EINVAL; in lan743x_tx_ring_init()
2122 if (dma_set_mask_and_coherent(&tx->adapter->pdev->dev, in lan743x_tx_ring_init()
2124 dev_warn(&tx->adapter->pdev->dev, in lan743x_tx_ring_init()
2126 ret = -ENOMEM; in lan743x_tx_ring_init()
2129 ring_allocation_size = ALIGN(tx->ring_size * in lan743x_tx_ring_init()
2133 cpu_ptr = dma_alloc_coherent(&tx->adapter->pdev->dev, in lan743x_tx_ring_init()
2136 ret = -ENOMEM; in lan743x_tx_ring_init()
2140 tx->ring_allocation_size = ring_allocation_size; in lan743x_tx_ring_init()
2141 tx->ring_cpu_ptr = (struct lan743x_tx_descriptor *)cpu_ptr; in lan743x_tx_ring_init()
2142 tx->ring_dma_ptr = dma_ptr; in lan743x_tx_ring_init()
2144 cpu_ptr = kcalloc(tx->ring_size, sizeof(*tx->buffer_info), GFP_KERNEL); in lan743x_tx_ring_init()
2146 ret = -ENOMEM; in lan743x_tx_ring_init()
2149 tx->buffer_info = (struct lan743x_tx_buffer_info *)cpu_ptr; in lan743x_tx_ring_init()
2151 cpu_ptr = dma_alloc_coherent(&tx->adapter->pdev->dev, in lan743x_tx_ring_init()
2152 sizeof(*tx->head_cpu_ptr), &dma_ptr, in lan743x_tx_ring_init()
2155 ret = -ENOMEM; in lan743x_tx_ring_init()
2159 tx->head_cpu_ptr = cpu_ptr; in lan743x_tx_ring_init()
2160 tx->head_dma_ptr = dma_ptr; in lan743x_tx_ring_init()
2161 if (tx->head_dma_ptr & 0x3) { in lan743x_tx_ring_init()
2162 ret = -ENOMEM; in lan743x_tx_ring_init()
2169 lan743x_tx_ring_cleanup(tx); in lan743x_tx_ring_init()
2173 static void lan743x_tx_close(struct lan743x_tx *tx) in lan743x_tx_close() argument
2175 struct lan743x_adapter *adapter = tx->adapter; in lan743x_tx_close()
2179 DMAC_CMD_STOP_T_(tx->channel_number)); in lan743x_tx_close()
2180 lan743x_dmac_tx_wait_till_stopped(adapter, tx->channel_number); in lan743x_tx_close()
2184 DMAC_INT_BIT_TX_IOC_(tx->channel_number)); in lan743x_tx_close()
2186 INT_BIT_DMA_TX_(tx->channel_number)); in lan743x_tx_close()
2187 napi_disable(&tx->napi); in lan743x_tx_close()
2188 netif_napi_del(&tx->napi); in lan743x_tx_close()
2191 FCT_TX_CTL_DIS_(tx->channel_number)); in lan743x_tx_close()
2193 FCT_TX_CTL_EN_(tx->channel_number), in lan743x_tx_close()
2196 lan743x_tx_release_all_descriptors(tx); in lan743x_tx_close()
2198 tx->rqd_descriptors = 0; in lan743x_tx_close()
2200 lan743x_tx_ring_cleanup(tx); in lan743x_tx_close()
2203 static int lan743x_tx_open(struct lan743x_tx *tx) in lan743x_tx_open() argument
2209 adapter = tx->adapter; in lan743x_tx_open()
2210 ret = lan743x_tx_ring_init(tx); in lan743x_tx_open()
2216 FCT_TX_CTL_RESET_(tx->channel_number)); in lan743x_tx_open()
2218 FCT_TX_CTL_RESET_(tx->channel_number), in lan743x_tx_open()
2223 FCT_TX_CTL_EN_(tx->channel_number)); in lan743x_tx_open()
2225 /* reset tx channel */ in lan743x_tx_open()
2227 DMAC_CMD_TX_SWR_(tx->channel_number)); in lan743x_tx_open()
2229 DMAC_CMD_TX_SWR_(tx->channel_number), in lan743x_tx_open()
2234 TX_BASE_ADDRH(tx->channel_number), in lan743x_tx_open()
2235 DMA_ADDR_HIGH32(tx->ring_dma_ptr)); in lan743x_tx_open()
2237 TX_BASE_ADDRL(tx->channel_number), in lan743x_tx_open()
2238 DMA_ADDR_LOW32(tx->ring_dma_ptr)); in lan743x_tx_open()
2241 data = lan743x_csr_read(adapter, TX_CFG_B(tx->channel_number)); in lan743x_tx_open()
2243 data |= ((tx->ring_size) & TX_CFG_B_TX_RING_LEN_MASK_); in lan743x_tx_open()
2244 if (!(adapter->csr.flags & LAN743X_CSR_FLAG_IS_A0)) in lan743x_tx_open()
2246 lan743x_csr_write(adapter, TX_CFG_B(tx->channel_number), data); in lan743x_tx_open()
2250 if (!(adapter->csr.flags & LAN743X_CSR_FLAG_IS_A0)) { in lan743x_tx_open()
2256 lan743x_csr_write(adapter, TX_CFG_A(tx->channel_number), data); in lan743x_tx_open()
2260 TX_HEAD_WRITEBACK_ADDRH(tx->channel_number), in lan743x_tx_open()
2261 DMA_ADDR_HIGH32(tx->head_dma_ptr)); in lan743x_tx_open()
2263 TX_HEAD_WRITEBACK_ADDRL(tx->channel_number), in lan743x_tx_open()
2264 DMA_ADDR_LOW32(tx->head_dma_ptr)); in lan743x_tx_open()
2267 tx->last_head = lan743x_csr_read(adapter, TX_HEAD(tx->channel_number)); in lan743x_tx_open()
2270 tx->last_tail = 0; in lan743x_tx_open()
2271 lan743x_csr_write(adapter, TX_TAIL(tx->channel_number), in lan743x_tx_open()
2272 (u32)(tx->last_tail)); in lan743x_tx_open()
2273 tx->vector_flags = lan743x_intr_get_vector_flags(adapter, in lan743x_tx_open()
2275 (tx->channel_number)); in lan743x_tx_open()
2276 netif_napi_add_tx_weight(adapter->netdev, in lan743x_tx_open()
2277 &tx->napi, lan743x_tx_napi_poll, in lan743x_tx_open()
2279 napi_enable(&tx->napi); in lan743x_tx_open()
2282 if (tx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_ENABLE_AUTO_CLEAR) in lan743x_tx_open()
2284 if (tx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_STATUS_AUTO_CLEAR) in lan743x_tx_open()
2286 if (tx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_STATUS_R2C) in lan743x_tx_open()
2288 if (tx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_ENABLE_R2C) in lan743x_tx_open()
2290 lan743x_csr_write(adapter, TX_CFG_C(tx->channel_number), data); in lan743x_tx_open()
2292 if (!(tx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_ENABLE_AUTO_SET)) in lan743x_tx_open()
2294 INT_BIT_DMA_TX_(tx->channel_number)); in lan743x_tx_open()
2296 DMAC_INT_BIT_TX_IOC_(tx->channel_number)); in lan743x_tx_open()
2300 DMAC_CMD_START_T_(tx->channel_number)); in lan743x_tx_open()
2304 static int lan743x_rx_next_index(struct lan743x_rx *rx, int index) in lan743x_rx_next_index() argument
2306 return ((++index) % rx->ring_size); in lan743x_rx_next_index()
2309 static void lan743x_rx_update_tail(struct lan743x_rx *rx, int index) in lan743x_rx_update_tail() argument
2313 lan743x_csr_write(rx->adapter, RX_TAIL(rx->channel_number), in lan743x_rx_update_tail()
2317 static int lan743x_rx_init_ring_element(struct lan743x_rx *rx, int index, in lan743x_rx_init_ring_element() argument
2320 struct net_device *netdev = rx->adapter->netdev; in lan743x_rx_init_ring_element()
2321 struct device *dev = &rx->adapter->pdev->dev; in lan743x_rx_init_ring_element()
2328 buffer_length = netdev->mtu + ETH_HLEN + ETH_FCS_LEN + RX_HEAD_PADDING; in lan743x_rx_init_ring_element()
2330 descriptor = &rx->ring_cpu_ptr[index]; in lan743x_rx_init_ring_element()
2331 buffer_info = &rx->buffer_info[index]; in lan743x_rx_init_ring_element()
2334 return -ENOMEM; in lan743x_rx_init_ring_element()
2335 dma_ptr = dma_map_single(dev, skb->data, buffer_length, DMA_FROM_DEVICE); in lan743x_rx_init_ring_element()
2338 return -ENOMEM; in lan743x_rx_init_ring_element()
2340 if (buffer_info->dma_ptr) { in lan743x_rx_init_ring_element()
2342 if (le32_to_cpu(descriptor->data0) & RX_DESC_DATA0_LS_) in lan743x_rx_init_ring_element()
2348 (le32_to_cpu(descriptor->data0)), in lan743x_rx_init_ring_element()
2349 buffer_info->buffer_length); in lan743x_rx_init_ring_element()
2351 used_length = buffer_info->buffer_length; in lan743x_rx_init_ring_element()
2352 dma_sync_single_for_cpu(dev, buffer_info->dma_ptr, in lan743x_rx_init_ring_element()
2355 dma_unmap_single_attrs(dev, buffer_info->dma_ptr, in lan743x_rx_init_ring_element()
2356 buffer_info->buffer_length, in lan743x_rx_init_ring_element()
2361 buffer_info->skb = skb; in lan743x_rx_init_ring_element()
2362 buffer_info->dma_ptr = dma_ptr; in lan743x_rx_init_ring_element()
2363 buffer_info->buffer_length = buffer_length; in lan743x_rx_init_ring_element()
2364 descriptor->data1 = cpu_to_le32(DMA_ADDR_LOW32(buffer_info->dma_ptr)); in lan743x_rx_init_ring_element()
2365 descriptor->data2 = cpu_to_le32(DMA_ADDR_HIGH32(buffer_info->dma_ptr)); in lan743x_rx_init_ring_element()
2366 descriptor->data3 = 0; in lan743x_rx_init_ring_element()
2367 descriptor->data0 = cpu_to_le32((RX_DESC_DATA0_OWN_ | in lan743x_rx_init_ring_element()
2369 lan743x_rx_update_tail(rx, index); in lan743x_rx_init_ring_element()
2374 static void lan743x_rx_reuse_ring_element(struct lan743x_rx *rx, int index) in lan743x_rx_reuse_ring_element() argument
2379 descriptor = &rx->ring_cpu_ptr[index]; in lan743x_rx_reuse_ring_element()
2380 buffer_info = &rx->buffer_info[index]; in lan743x_rx_reuse_ring_element()
2382 descriptor->data1 = cpu_to_le32(DMA_ADDR_LOW32(buffer_info->dma_ptr)); in lan743x_rx_reuse_ring_element()
2383 descriptor->data2 = cpu_to_le32(DMA_ADDR_HIGH32(buffer_info->dma_ptr)); in lan743x_rx_reuse_ring_element()
2384 descriptor->data3 = 0; in lan743x_rx_reuse_ring_element()
2385 descriptor->data0 = cpu_to_le32((RX_DESC_DATA0_OWN_ | in lan743x_rx_reuse_ring_element()
2386 ((buffer_info->buffer_length) & in lan743x_rx_reuse_ring_element()
2388 lan743x_rx_update_tail(rx, index); in lan743x_rx_reuse_ring_element()
2391 static void lan743x_rx_release_ring_element(struct lan743x_rx *rx, int index) in lan743x_rx_release_ring_element() argument
2396 descriptor = &rx->ring_cpu_ptr[index]; in lan743x_rx_release_ring_element()
2397 buffer_info = &rx->buffer_info[index]; in lan743x_rx_release_ring_element()
2401 if (buffer_info->dma_ptr) { in lan743x_rx_release_ring_element()
2402 dma_unmap_single(&rx->adapter->pdev->dev, in lan743x_rx_release_ring_element()
2403 buffer_info->dma_ptr, in lan743x_rx_release_ring_element()
2404 buffer_info->buffer_length, in lan743x_rx_release_ring_element()
2406 buffer_info->dma_ptr = 0; in lan743x_rx_release_ring_element()
2409 if (buffer_info->skb) { in lan743x_rx_release_ring_element()
2410 dev_kfree_skb(buffer_info->skb); in lan743x_rx_release_ring_element()
2411 buffer_info->skb = NULL; in lan743x_rx_release_ring_element()
2424 frame_length = max_t(int, 0, frame_length - ETH_FCS_LEN); in lan743x_rx_trim_skb()
2425 if (skb->len > frame_length) { in lan743x_rx_trim_skb()
2426 skb->tail -= skb->len - frame_length; in lan743x_rx_trim_skb()
2427 skb->len = frame_length; in lan743x_rx_trim_skb()
2432 static int lan743x_rx_process_buffer(struct lan743x_rx *rx) in lan743x_rx_process_buffer() argument
2434 int current_head_index = le32_to_cpu(*rx->head_cpu_ptr); in lan743x_rx_process_buffer()
2436 struct net_device *netdev = rx->adapter->netdev; in lan743x_rx_process_buffer()
2441 int extension_index = -1; in lan743x_rx_process_buffer()
2445 if (current_head_index < 0 || current_head_index >= rx->ring_size) in lan743x_rx_process_buffer()
2448 if (rx->last_head < 0 || rx->last_head >= rx->ring_size) in lan743x_rx_process_buffer()
2451 if (rx->last_head == current_head_index) in lan743x_rx_process_buffer()
2454 descriptor = &rx->ring_cpu_ptr[rx->last_head]; in lan743x_rx_process_buffer()
2455 if (le32_to_cpu(descriptor->data0) & RX_DESC_DATA0_OWN_) in lan743x_rx_process_buffer()
2457 buffer_info = &rx->buffer_info[rx->last_head]; in lan743x_rx_process_buffer()
2459 is_last = le32_to_cpu(descriptor->data0) & RX_DESC_DATA0_LS_; in lan743x_rx_process_buffer()
2460 is_first = le32_to_cpu(descriptor->data0) & RX_DESC_DATA0_FS_; in lan743x_rx_process_buffer()
2462 if (is_last && le32_to_cpu(descriptor->data0) & RX_DESC_DATA0_EXT_) { in lan743x_rx_process_buffer()
2464 int index = lan743x_rx_next_index(rx, rx->last_head); in lan743x_rx_process_buffer()
2469 desc_ext = &rx->ring_cpu_ptr[index]; in lan743x_rx_process_buffer()
2470 if (le32_to_cpu(desc_ext->data0) & RX_DESC_DATA0_OWN_) in lan743x_rx_process_buffer()
2473 if (!(le32_to_cpu(desc_ext->data0) & RX_DESC_DATA0_EXT_)) in lan743x_rx_process_buffer()
2478 /* Only the last buffer in a multi-buffer frame contains the total frame in lan743x_rx_process_buffer()
2485 RX_DESC_DATA0_FRAME_LENGTH_GET_(le32_to_cpu(descriptor->data0)); in lan743x_rx_process_buffer()
2486 buffer_length = buffer_info->buffer_length; in lan743x_rx_process_buffer()
2487 is_ice = le32_to_cpu(descriptor->data1) & RX_DESC_DATA1_STATUS_ICE_; in lan743x_rx_process_buffer()
2488 is_tce = le32_to_cpu(descriptor->data1) & RX_DESC_DATA1_STATUS_TCE_; in lan743x_rx_process_buffer()
2489 is_icsm = le32_to_cpu(descriptor->data1) & RX_DESC_DATA1_STATUS_ICSM_; in lan743x_rx_process_buffer()
2497 skb = buffer_info->skb; in lan743x_rx_process_buffer()
2498 if (lan743x_rx_init_ring_element(rx, rx->last_head, GFP_ATOMIC)) { in lan743x_rx_process_buffer()
2503 lan743x_rx_reuse_ring_element(rx, rx->last_head); in lan743x_rx_process_buffer()
2505 dev_kfree_skb_irq(rx->skb_head); in lan743x_rx_process_buffer()
2506 rx->skb_head = NULL; in lan743x_rx_process_buffer()
2510 /* add buffers to skb via skb->frag_list */ in lan743x_rx_process_buffer()
2513 skb_put(skb, buffer_length - RX_HEAD_PADDING); in lan743x_rx_process_buffer()
2514 if (rx->skb_head) in lan743x_rx_process_buffer()
2515 dev_kfree_skb_irq(rx->skb_head); in lan743x_rx_process_buffer()
2516 rx->skb_head = skb; in lan743x_rx_process_buffer()
2517 } else if (rx->skb_head) { in lan743x_rx_process_buffer()
2519 if (skb_shinfo(rx->skb_head)->frag_list) in lan743x_rx_process_buffer()
2520 rx->skb_tail->next = skb; in lan743x_rx_process_buffer()
2522 skb_shinfo(rx->skb_head)->frag_list = skb; in lan743x_rx_process_buffer()
2523 rx->skb_tail = skb; in lan743x_rx_process_buffer()
2524 rx->skb_head->len += skb->len; in lan743x_rx_process_buffer()
2525 rx->skb_head->data_len += skb->len; in lan743x_rx_process_buffer()
2526 rx->skb_head->truesize += skb->truesize; in lan743x_rx_process_buffer()
2540 ts_sec = le32_to_cpu(desc_ext->data1); in lan743x_rx_process_buffer()
2541 ts_nsec = (le32_to_cpu(desc_ext->data2) & in lan743x_rx_process_buffer()
2543 if (rx->skb_head) in lan743x_rx_process_buffer()
2544 skb_hwtstamps(rx->skb_head)->hwtstamp = in lan743x_rx_process_buffer()
2546 lan743x_rx_reuse_ring_element(rx, extension_index); in lan743x_rx_process_buffer()
2547 rx->last_head = extension_index; in lan743x_rx_process_buffer()
2551 if (is_last && rx->skb_head) in lan743x_rx_process_buffer()
2552 rx->skb_head = lan743x_rx_trim_skb(rx->skb_head, frame_length); in lan743x_rx_process_buffer()
2554 if (is_last && rx->skb_head) { in lan743x_rx_process_buffer()
2555 rx->skb_head->protocol = eth_type_trans(rx->skb_head, in lan743x_rx_process_buffer()
2556 rx->adapter->netdev); in lan743x_rx_process_buffer()
2557 if (rx->adapter->netdev->features & NETIF_F_RXCSUM) { in lan743x_rx_process_buffer()
2559 skb->ip_summed = CHECKSUM_UNNECESSARY; in lan743x_rx_process_buffer()
2562 rx->skb_head->len); in lan743x_rx_process_buffer()
2563 napi_gro_receive(&rx->napi, rx->skb_head); in lan743x_rx_process_buffer()
2564 rx->skb_head = NULL; in lan743x_rx_process_buffer()
2569 rx->last_tail = rx->last_head; in lan743x_rx_process_buffer()
2570 rx->last_head = lan743x_rx_next_index(rx, rx->last_head); in lan743x_rx_process_buffer()
2578 struct lan743x_rx *rx = container_of(napi, struct lan743x_rx, napi); in lan743x_rx_napi_poll() local
2579 struct lan743x_adapter *adapter = rx->adapter; in lan743x_rx_napi_poll()
2584 if (rx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_STATUS_W2C) { in lan743x_rx_napi_poll()
2587 DMAC_INT_BIT_RXFRM_(rx->channel_number)); in lan743x_rx_napi_poll()
2590 result = lan743x_rx_process_buffer(rx); in lan743x_rx_napi_poll()
2594 rx->frame_count += count; in lan743x_rx_napi_poll()
2601 /* re-arm interrupts, must write to rx tail on some chip variants */ in lan743x_rx_napi_poll()
2602 if (rx->vector_flags & LAN743X_VECTOR_FLAG_VECTOR_ENABLE_AUTO_SET) in lan743x_rx_napi_poll()
2604 if (rx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_ENABLE_AUTO_SET) { in lan743x_rx_napi_poll()
2608 INT_BIT_DMA_RX_(rx->channel_number)); in lan743x_rx_napi_poll()
2612 lan743x_csr_write(adapter, RX_TAIL(rx->channel_number), in lan743x_rx_napi_poll()
2613 rx_tail_flags | rx->last_tail); in lan743x_rx_napi_poll()
2618 static void lan743x_rx_ring_cleanup(struct lan743x_rx *rx) in lan743x_rx_ring_cleanup() argument
2620 if (rx->buffer_info && rx->ring_cpu_ptr) { in lan743x_rx_ring_cleanup()
2623 for (index = 0; index < rx->ring_size; index++) in lan743x_rx_ring_cleanup()
2624 lan743x_rx_release_ring_element(rx, index); in lan743x_rx_ring_cleanup()
2627 if (rx->head_cpu_ptr) { in lan743x_rx_ring_cleanup()
2628 dma_free_coherent(&rx->adapter->pdev->dev, in lan743x_rx_ring_cleanup()
2629 sizeof(*rx->head_cpu_ptr), rx->head_cpu_ptr, in lan743x_rx_ring_cleanup()
2630 rx->head_dma_ptr); in lan743x_rx_ring_cleanup()
2631 rx->head_cpu_ptr = NULL; in lan743x_rx_ring_cleanup()
2632 rx->head_dma_ptr = 0; in lan743x_rx_ring_cleanup()
2635 kfree(rx->buffer_info); in lan743x_rx_ring_cleanup()
2636 rx->buffer_info = NULL; in lan743x_rx_ring_cleanup()
2638 if (rx->ring_cpu_ptr) { in lan743x_rx_ring_cleanup()
2639 dma_free_coherent(&rx->adapter->pdev->dev, in lan743x_rx_ring_cleanup()
2640 rx->ring_allocation_size, rx->ring_cpu_ptr, in lan743x_rx_ring_cleanup()
2641 rx->ring_dma_ptr); in lan743x_rx_ring_cleanup()
2642 rx->ring_allocation_size = 0; in lan743x_rx_ring_cleanup()
2643 rx->ring_cpu_ptr = NULL; in lan743x_rx_ring_cleanup()
2644 rx->ring_dma_ptr = 0; in lan743x_rx_ring_cleanup()
2647 rx->ring_size = 0; in lan743x_rx_ring_cleanup()
2648 rx->last_head = 0; in lan743x_rx_ring_cleanup()
2651 static int lan743x_rx_ring_init(struct lan743x_rx *rx) in lan743x_rx_ring_init() argument
2656 int ret = -ENOMEM; in lan743x_rx_ring_init()
2659 rx->ring_size = LAN743X_RX_RING_SIZE; in lan743x_rx_ring_init()
2660 if (rx->ring_size <= 1) { in lan743x_rx_ring_init()
2661 ret = -EINVAL; in lan743x_rx_ring_init()
2664 if (rx->ring_size & ~RX_CFG_B_RX_RING_LEN_MASK_) { in lan743x_rx_ring_init()
2665 ret = -EINVAL; in lan743x_rx_ring_init()
2668 if (dma_set_mask_and_coherent(&rx->adapter->pdev->dev, in lan743x_rx_ring_init()
2670 dev_warn(&rx->adapter->pdev->dev, in lan743x_rx_ring_init()
2672 ret = -ENOMEM; in lan743x_rx_ring_init()
2675 ring_allocation_size = ALIGN(rx->ring_size * in lan743x_rx_ring_init()
2679 cpu_ptr = dma_alloc_coherent(&rx->adapter->pdev->dev, in lan743x_rx_ring_init()
2682 ret = -ENOMEM; in lan743x_rx_ring_init()
2685 rx->ring_allocation_size = ring_allocation_size; in lan743x_rx_ring_init()
2686 rx->ring_cpu_ptr = (struct lan743x_rx_descriptor *)cpu_ptr; in lan743x_rx_ring_init()
2687 rx->ring_dma_ptr = dma_ptr; in lan743x_rx_ring_init()
2689 cpu_ptr = kcalloc(rx->ring_size, sizeof(*rx->buffer_info), in lan743x_rx_ring_init()
2692 ret = -ENOMEM; in lan743x_rx_ring_init()
2695 rx->buffer_info = (struct lan743x_rx_buffer_info *)cpu_ptr; in lan743x_rx_ring_init()
2697 cpu_ptr = dma_alloc_coherent(&rx->adapter->pdev->dev, in lan743x_rx_ring_init()
2698 sizeof(*rx->head_cpu_ptr), &dma_ptr, in lan743x_rx_ring_init()
2701 ret = -ENOMEM; in lan743x_rx_ring_init()
2705 rx->head_cpu_ptr = cpu_ptr; in lan743x_rx_ring_init()
2706 rx->head_dma_ptr = dma_ptr; in lan743x_rx_ring_init()
2707 if (rx->head_dma_ptr & 0x3) { in lan743x_rx_ring_init()
2708 ret = -ENOMEM; in lan743x_rx_ring_init()
2712 rx->last_head = 0; in lan743x_rx_ring_init()
2713 for (index = 0; index < rx->ring_size; index++) { in lan743x_rx_ring_init()
2714 ret = lan743x_rx_init_ring_element(rx, index, GFP_KERNEL); in lan743x_rx_ring_init()
2721 netif_warn(rx->adapter, ifup, rx->adapter->netdev, in lan743x_rx_ring_init()
2724 lan743x_rx_ring_cleanup(rx); in lan743x_rx_ring_init()
2728 static void lan743x_rx_close(struct lan743x_rx *rx) in lan743x_rx_close() argument
2730 struct lan743x_adapter *adapter = rx->adapter; in lan743x_rx_close()
2733 FCT_RX_CTL_DIS_(rx->channel_number)); in lan743x_rx_close()
2735 FCT_RX_CTL_EN_(rx->channel_number), in lan743x_rx_close()
2739 DMAC_CMD_STOP_R_(rx->channel_number)); in lan743x_rx_close()
2740 lan743x_dmac_rx_wait_till_stopped(adapter, rx->channel_number); in lan743x_rx_close()
2743 DMAC_INT_BIT_RXFRM_(rx->channel_number)); in lan743x_rx_close()
2745 INT_BIT_DMA_RX_(rx->channel_number)); in lan743x_rx_close()
2746 napi_disable(&rx->napi); in lan743x_rx_close()
2748 netif_napi_del(&rx->napi); in lan743x_rx_close()
2750 lan743x_rx_ring_cleanup(rx); in lan743x_rx_close()
2753 static int lan743x_rx_open(struct lan743x_rx *rx) in lan743x_rx_open() argument
2755 struct lan743x_adapter *adapter = rx->adapter; in lan743x_rx_open()
2759 rx->frame_count = 0; in lan743x_rx_open()
2760 ret = lan743x_rx_ring_init(rx); in lan743x_rx_open()
2764 netif_napi_add(adapter->netdev, &rx->napi, lan743x_rx_napi_poll); in lan743x_rx_open()
2767 DMAC_CMD_RX_SWR_(rx->channel_number)); in lan743x_rx_open()
2769 DMAC_CMD_RX_SWR_(rx->channel_number), in lan743x_rx_open()
2774 RX_BASE_ADDRH(rx->channel_number), in lan743x_rx_open()
2775 DMA_ADDR_HIGH32(rx->ring_dma_ptr)); in lan743x_rx_open()
2777 RX_BASE_ADDRL(rx->channel_number), in lan743x_rx_open()
2778 DMA_ADDR_LOW32(rx->ring_dma_ptr)); in lan743x_rx_open()
2780 /* set rx write back address */ in lan743x_rx_open()
2782 RX_HEAD_WRITEBACK_ADDRH(rx->channel_number), in lan743x_rx_open()
2783 DMA_ADDR_HIGH32(rx->head_dma_ptr)); in lan743x_rx_open()
2785 RX_HEAD_WRITEBACK_ADDRL(rx->channel_number), in lan743x_rx_open()
2786 DMA_ADDR_LOW32(rx->head_dma_ptr)); in lan743x_rx_open()
2788 if (!(adapter->csr.flags & LAN743X_CSR_FLAG_IS_A0)) { in lan743x_rx_open()
2797 RX_CFG_A(rx->channel_number), data); in lan743x_rx_open()
2800 data = lan743x_csr_read(adapter, RX_CFG_B(rx->channel_number)); in lan743x_rx_open()
2807 data |= ((rx->ring_size) & RX_CFG_B_RX_RING_LEN_MASK_); in lan743x_rx_open()
2808 if (!(adapter->csr.flags & LAN743X_CSR_FLAG_IS_A0)) in lan743x_rx_open()
2811 lan743x_csr_write(adapter, RX_CFG_B(rx->channel_number), data); in lan743x_rx_open()
2812 rx->vector_flags = lan743x_intr_get_vector_flags(adapter, in lan743x_rx_open()
2814 (rx->channel_number)); in lan743x_rx_open()
2818 if (rx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_ENABLE_AUTO_CLEAR) in lan743x_rx_open()
2820 if (rx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_STATUS_AUTO_CLEAR) in lan743x_rx_open()
2822 if (rx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_STATUS_R2C) in lan743x_rx_open()
2824 if (rx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_ENABLE_R2C) in lan743x_rx_open()
2826 lan743x_csr_write(adapter, RX_CFG_C(rx->channel_number), data); in lan743x_rx_open()
2828 rx->last_tail = ((u32)(rx->ring_size - 1)); in lan743x_rx_open()
2829 lan743x_csr_write(adapter, RX_TAIL(rx->channel_number), in lan743x_rx_open()
2830 rx->last_tail); in lan743x_rx_open()
2831 rx->last_head = lan743x_csr_read(adapter, RX_HEAD(rx->channel_number)); in lan743x_rx_open()
2832 if (rx->last_head) { in lan743x_rx_open()
2833 ret = -EIO; in lan743x_rx_open()
2837 napi_enable(&rx->napi); in lan743x_rx_open()
2840 INT_BIT_DMA_RX_(rx->channel_number)); in lan743x_rx_open()
2842 DMAC_INT_BIT_RXFRM_(rx->channel_number)); in lan743x_rx_open()
2844 DMAC_INT_BIT_RXFRM_(rx->channel_number)); in lan743x_rx_open()
2846 DMAC_CMD_START_R_(rx->channel_number)); in lan743x_rx_open()
2850 FCT_RX_CTL_RESET_(rx->channel_number)); in lan743x_rx_open()
2852 FCT_RX_CTL_RESET_(rx->channel_number), in lan743x_rx_open()
2854 lan743x_csr_write(adapter, FCT_FLOW(rx->channel_number), in lan743x_rx_open()
2861 FCT_RX_CTL_EN_(rx->channel_number)); in lan743x_rx_open()
2865 netif_napi_del(&rx->napi); in lan743x_rx_open()
2866 lan743x_rx_ring_cleanup(rx); in lan743x_rx_open()
2880 netif_err(adapter, drv, adapter->netdev, in lan743x_phylink_sgmii_config()
2881 "error %d link-speed-duplex(LSD) invalid\n", ret); in lan743x_phylink_sgmii_config()
2885 adapter->sgmii_lsd = ret; in lan743x_phylink_sgmii_config()
2886 netif_dbg(adapter, drv, adapter->netdev, in lan743x_phylink_sgmii_config()
2887 "Link Speed Duplex (lsd) : 0x%X\n", adapter->sgmii_lsd); in lan743x_phylink_sgmii_config()
2896 netif_err(adapter, drv, adapter->netdev, in lan743x_phylink_sgmii_config()
2912 netif_err(adapter, drv, adapter->netdev, in lan743x_phylink_1000basex_config()
2913 "error %d link-speed-duplex(LSD) invalid\n", ret); in lan743x_phylink_1000basex_config()
2917 adapter->sgmii_lsd = ret; in lan743x_phylink_1000basex_config()
2918 netif_dbg(adapter, drv, adapter->netdev, in lan743x_phylink_1000basex_config()
2919 "Link Speed Duplex (lsd) : 0x%X\n", adapter->sgmii_lsd); in lan743x_phylink_1000basex_config()
2921 /* LINK_STATUS_SOURCE from 1000BASE-X PCS link status */ in lan743x_phylink_1000basex_config()
2928 netif_err(adapter, drv, adapter->netdev, in lan743x_phylink_1000basex_config()
2944 netif_err(adapter, drv, adapter->netdev, in lan743x_phylink_2500basex_config()
2945 "error %d link-speed-duplex(LSD) invalid\n", ret); in lan743x_phylink_2500basex_config()
2949 adapter->sgmii_lsd = ret; in lan743x_phylink_2500basex_config()
2950 netif_dbg(adapter, drv, adapter->netdev, in lan743x_phylink_2500basex_config()
2951 "Link Speed Duplex (lsd) : 0x%X\n", adapter->sgmii_lsd); in lan743x_phylink_2500basex_config()
2953 /* LINK_STATUS_SOURCE from 2500BASE-X PCS link status */ in lan743x_phylink_2500basex_config()
2960 netif_err(adapter, drv, adapter->netdev, in lan743x_phylink_2500basex_config()
2984 struct net_device *netdev = to_net_dev(config->dev); in lan743x_phylink_mac_config()
2988 switch (state->interface) { in lan743x_phylink_mac_config()
2992 netif_err(adapter, drv, adapter->netdev, in lan743x_phylink_mac_config()
2995 netif_dbg(adapter, drv, adapter->netdev, in lan743x_phylink_mac_config()
3001 netif_err(adapter, drv, adapter->netdev, in lan743x_phylink_mac_config()
3004 netif_dbg(adapter, drv, adapter->netdev, in lan743x_phylink_mac_config()
3010 netif_err(adapter, drv, adapter->netdev, in lan743x_phylink_mac_config()
3013 netif_dbg(adapter, drv, adapter->netdev, in lan743x_phylink_mac_config()
3017 netif_dbg(adapter, drv, adapter->netdev, in lan743x_phylink_mac_config()
3019 state->interface); in lan743x_phylink_mac_config()
3028 struct net_device *netdev = to_net_dev(config->dev); in lan743x_phylink_mac_link_down()
3040 struct net_device *netdev = to_net_dev(config->dev); in lan743x_phylink_mac_link_up()
3046 /* Pre-initialize register bits. in lan743x_phylink_mac_link_up()
3077 struct net_device *netdev = to_net_dev(config->dev); in lan743x_mac_disable_tx_lpi()
3086 struct net_device *netdev = to_net_dev(config->dev); in lan743x_mac_enable_tx_lpi()
3110 struct net_device *netdev = adapter->netdev; in lan743x_phylink_create()
3113 adapter->phylink_config.dev = &netdev->dev; in lan743x_phylink_create()
3114 adapter->phylink_config.type = PHYLINK_NETDEV; in lan743x_phylink_create()
3115 adapter->phylink_config.mac_managed_pm = false; in lan743x_phylink_create()
3117 adapter->phylink_config.mac_capabilities = MAC_ASYM_PAUSE | in lan743x_phylink_create()
3119 adapter->phylink_config.lpi_capabilities = MAC_100FD | MAC_1000FD; in lan743x_phylink_create()
3120 adapter->phylink_config.lpi_timer_default = in lan743x_phylink_create()
3125 switch (adapter->phy_interface) { in lan743x_phylink_create()
3128 adapter->phylink_config.supported_interfaces); in lan743x_phylink_create()
3130 adapter->phylink_config.supported_interfaces); in lan743x_phylink_create()
3132 adapter->phylink_config.supported_interfaces); in lan743x_phylink_create()
3133 adapter->phylink_config.mac_capabilities |= MAC_2500FD; in lan743x_phylink_create()
3137 adapter->phylink_config.supported_interfaces); in lan743x_phylink_create()
3141 adapter->phylink_config.supported_interfaces); in lan743x_phylink_create()
3144 phy_interface_set_rgmii(adapter->phylink_config.supported_interfaces); in lan743x_phylink_create()
3147 memcpy(adapter->phylink_config.lpi_interfaces, in lan743x_phylink_create()
3148 adapter->phylink_config.supported_interfaces, in lan743x_phylink_create()
3149 sizeof(adapter->phylink_config.lpi_interfaces)); in lan743x_phylink_create()
3151 pl = phylink_create(&adapter->phylink_config, NULL, in lan743x_phylink_create()
3152 adapter->phy_interface, &lan743x_phylink_mac_ops); in lan743x_phylink_create()
3159 adapter->phylink = pl; in lan743x_phylink_create()
3167 dn = of_parse_phandle(dn, "phy-handle", 0); in lan743x_phy_handle_exists()
3174 struct device_node *dn = adapter->pdev->dev.of_node; in lan743x_phylink_connect()
3175 struct net_device *dev = adapter->netdev; in lan743x_phylink_connect()
3180 ret = phylink_of_phy_connect(adapter->phylink, dn, 0); in lan743x_phylink_connect()
3183 phydev = phy_find_first(adapter->mdiobus); in lan743x_phylink_connect()
3186 ret = phylink_connect_phy(adapter->phylink, phydev); in lan743x_phylink_connect()
3187 } else if (((adapter->csr.id_rev & ID_REV_ID_MASK_) == in lan743x_phylink_connect()
3188 ID_REV_ID_LAN7431_) || adapter->is_pci11x1x) { in lan743x_phylink_connect()
3192 caps = adapter->phylink_config.mac_capabilities; in lan743x_phylink_connect()
3204 ret = phylink_set_fixed_link(adapter->phylink, &state); in lan743x_phylink_connect()
3211 return -ENXIO; in lan743x_phylink_connect()
3220 phylink_start(adapter->phylink); in lan743x_phylink_connect()
3227 phylink_stop(adapter->phylink); in lan743x_phylink_disconnect()
3228 phylink_disconnect_phy(adapter->phylink); in lan743x_phylink_disconnect()
3236 for (index = 0; index < adapter->used_tx_channels; index++) in lan743x_netdev_close()
3237 lan743x_tx_close(&adapter->tx[index]); in lan743x_netdev_close()
3240 lan743x_rx_close(&adapter->rx[index]); in lan743x_netdev_close()
3278 ret = lan743x_rx_open(&adapter->rx[index]); in lan743x_netdev_open()
3283 for (index = 0; index < adapter->used_tx_channels; index++) { in lan743x_netdev_open()
3284 ret = lan743x_tx_open(&adapter->tx[index]); in lan743x_netdev_open()
3289 if (netdev->phydev) in lan743x_netdev_open()
3290 phy_support_eee(netdev->phydev); in lan743x_netdev_open()
3293 if (adapter->netdev->phydev) { in lan743x_netdev_open()
3296 phy_ethtool_get_wol(netdev->phydev, &wol); in lan743x_netdev_open()
3297 adapter->phy_wol_supported = wol.supported; in lan743x_netdev_open()
3298 adapter->phy_wolopts = wol.wolopts; in lan743x_netdev_open()
3305 for (index = 0; index < adapter->used_tx_channels; index++) { in lan743x_netdev_open()
3306 if (adapter->tx[index].ring_cpu_ptr) in lan743x_netdev_open()
3307 lan743x_tx_close(&adapter->tx[index]); in lan743x_netdev_open()
3312 if (adapter->rx[index].ring_cpu_ptr) in lan743x_netdev_open()
3313 lan743x_rx_close(&adapter->rx[index]); in lan743x_netdev_open()
3316 if (adapter->phylink) in lan743x_netdev_open()
3326 netif_warn(adapter, ifup, adapter->netdev, in lan743x_netdev_open()
3337 if (adapter->is_pci11x1x) in lan743x_netdev_xmit_frame()
3338 ch = skb->queue_mapping % PCI11X1X_USED_TX_CHANNELS; in lan743x_netdev_xmit_frame()
3340 return lan743x_tx_xmit_frame(&adapter->tx[ch], skb); in lan743x_netdev_xmit_frame()
3349 return -EINVAL; in lan743x_netdev_ioctl()
3351 return phylink_mii_ioctl(adapter->phylink, ifr, cmd); in lan743x_netdev_ioctl()
3368 WRITE_ONCE(netdev->mtu, new_mtu); in lan743x_netdev_change_mtu()
3377 stats->rx_packets = lan743x_csr_read(adapter, STAT_RX_TOTAL_FRAMES); in lan743x_netdev_get_stats64()
3378 stats->tx_packets = lan743x_csr_read(adapter, STAT_TX_TOTAL_FRAMES); in lan743x_netdev_get_stats64()
3379 stats->rx_bytes = lan743x_csr_read(adapter, in lan743x_netdev_get_stats64()
3385 stats->tx_bytes = lan743x_csr_read(adapter, in lan743x_netdev_get_stats64()
3391 stats->rx_errors = lan743x_csr_read(adapter, STAT_RX_FCS_ERRORS) + in lan743x_netdev_get_stats64()
3399 stats->tx_errors = lan743x_csr_read(adapter, STAT_TX_FCS_ERRORS) + in lan743x_netdev_get_stats64()
3403 stats->rx_dropped = lan743x_csr_read(adapter, in lan743x_netdev_get_stats64()
3405 stats->tx_dropped = lan743x_csr_read(adapter, in lan743x_netdev_get_stats64()
3407 stats->multicast = lan743x_csr_read(adapter, in lan743x_netdev_get_stats64()
3411 stats->collisions = lan743x_csr_read(adapter, in lan743x_netdev_get_stats64()
3429 eth_hw_addr_set(netdev, sock_addr->sa_data); in lan743x_netdev_set_mac_address()
3430 lan743x_mac_set_address(adapter, sock_addr->sa_data); in lan743x_netdev_set_mac_address()
3455 mdiobus_unregister(adapter->mdiobus); in lan743x_mdiobus_cleanup()
3460 phylink_destroy(adapter->phylink); in lan743x_destroy_phylink()
3461 adapter->phylink = NULL; in lan743x_destroy_phylink()
3466 unregister_netdev(adapter->netdev); in lan743x_full_cleanup()
3476 u16 rev = adapter->csr.id_rev & ID_REV_CHIP_REV_MASK_; in pci11x1x_set_rfe_rd_fifo_threshold()
3492 struct lan743x_tx *tx; in lan743x_hardware_init() local
3497 adapter->is_pci11x1x = is_pci11x1x_chip(adapter); in lan743x_hardware_init()
3498 if (adapter->is_pci11x1x) { in lan743x_hardware_init()
3499 adapter->max_tx_channels = PCI11X1X_MAX_TX_CHANNELS; in lan743x_hardware_init()
3500 adapter->used_tx_channels = PCI11X1X_USED_TX_CHANNELS; in lan743x_hardware_init()
3501 adapter->max_vector_count = PCI11X1X_MAX_VECTOR_COUNT; in lan743x_hardware_init()
3503 spin_lock_init(&adapter->eth_syslock_spinlock); in lan743x_hardware_init()
3504 mutex_init(&adapter->sgmii_rw_lock); in lan743x_hardware_init()
3507 if (adapter->is_sgmii_en) { in lan743x_hardware_init()
3516 adapter->max_tx_channels = LAN743X_MAX_TX_CHANNELS; in lan743x_hardware_init()
3517 adapter->used_tx_channels = LAN743X_USED_TX_CHANNELS; in lan743x_hardware_init()
3518 adapter->max_vector_count = LAN743X_MAX_VECTOR_COUNT; in lan743x_hardware_init()
3521 adapter->intr.irq = adapter->pdev->irq; in lan743x_hardware_init()
3543 adapter->rx[index].adapter = adapter; in lan743x_hardware_init()
3544 adapter->rx[index].channel_number = index; in lan743x_hardware_init()
3547 for (index = 0; index < adapter->used_tx_channels; index++) { in lan743x_hardware_init()
3548 tx = &adapter->tx[index]; in lan743x_hardware_init()
3549 tx->adapter = adapter; in lan743x_hardware_init()
3550 tx->channel_number = index; in lan743x_hardware_init()
3551 spin_lock_init(&tx->ring_lock); in lan743x_hardware_init()
3564 adapter->mdiobus = devm_mdiobus_alloc(&adapter->pdev->dev); in lan743x_mdiobus_init()
3565 if (!(adapter->mdiobus)) { in lan743x_mdiobus_init()
3566 ret = -ENOMEM; in lan743x_mdiobus_init()
3570 adapter->mdiobus->priv = (void *)adapter; in lan743x_mdiobus_init()
3571 if (adapter->is_pci11x1x) { in lan743x_mdiobus_init()
3572 if (adapter->is_sgmii_en) { in lan743x_mdiobus_init()
3573 netif_dbg(adapter, drv, adapter->netdev, in lan743x_mdiobus_init()
3575 adapter->mdiobus->read = lan743x_mdiobus_read_c22; in lan743x_mdiobus_init()
3576 adapter->mdiobus->write = lan743x_mdiobus_write_c22; in lan743x_mdiobus_init()
3577 adapter->mdiobus->read_c45 = lan743x_mdiobus_read_c45; in lan743x_mdiobus_init()
3578 adapter->mdiobus->write_c45 = lan743x_mdiobus_write_c45; in lan743x_mdiobus_init()
3579 adapter->mdiobus->name = "lan743x-mdiobus-c45"; in lan743x_mdiobus_init()
3580 netif_dbg(adapter, drv, adapter->netdev, in lan743x_mdiobus_init()
3581 "lan743x-mdiobus-c45\n"); in lan743x_mdiobus_init()
3583 netif_dbg(adapter, drv, adapter->netdev, in lan743x_mdiobus_init()
3586 adapter->mdiobus->read = lan743x_mdiobus_read_c22; in lan743x_mdiobus_init()
3587 adapter->mdiobus->write = lan743x_mdiobus_write_c22; in lan743x_mdiobus_init()
3588 adapter->mdiobus->name = "lan743x-mdiobus"; in lan743x_mdiobus_init()
3589 netif_dbg(adapter, drv, adapter->netdev, in lan743x_mdiobus_init()
3590 "lan743x-mdiobus\n"); in lan743x_mdiobus_init()
3593 adapter->mdiobus->read = lan743x_mdiobus_read_c22; in lan743x_mdiobus_init()
3594 adapter->mdiobus->write = lan743x_mdiobus_write_c22; in lan743x_mdiobus_init()
3595 adapter->mdiobus->name = "lan743x-mdiobus"; in lan743x_mdiobus_init()
3596 netif_dbg(adapter, drv, adapter->netdev, "lan743x-mdiobus\n"); in lan743x_mdiobus_init()
3599 snprintf(adapter->mdiobus->id, MII_BUS_ID_SIZE, in lan743x_mdiobus_init()
3600 "pci-%s", pci_name(adapter->pdev)); in lan743x_mdiobus_init()
3602 if ((adapter->csr.id_rev & ID_REV_ID_MASK_) == ID_REV_ID_LAN7430_) in lan743x_mdiobus_init()
3604 adapter->mdiobus->phy_mask = ~(u32)BIT(1); in lan743x_mdiobus_init()
3607 ret = mdiobus_register(adapter->mdiobus); in lan743x_mdiobus_init()
3616 /* lan743x_pcidev_probe - Device Initialization Routine
3631 int ret = -ENODEV; in lan743x_pcidev_probe()
3633 if (id->device == PCI_DEVICE_ID_SMSC_A011 || in lan743x_pcidev_probe()
3634 id->device == PCI_DEVICE_ID_SMSC_A041) { in lan743x_pcidev_probe()
3635 netdev = devm_alloc_etherdev_mqs(&pdev->dev, in lan743x_pcidev_probe()
3640 netdev = devm_alloc_etherdev_mqs(&pdev->dev, in lan743x_pcidev_probe()
3649 SET_NETDEV_DEV(netdev, &pdev->dev); in lan743x_pcidev_probe()
3652 adapter->netdev = netdev; in lan743x_pcidev_probe()
3653 adapter->msg_enable = NETIF_MSG_DRV | NETIF_MSG_PROBE | in lan743x_pcidev_probe()
3656 netdev->max_mtu = LAN743X_MAX_FRAME_SIZE; in lan743x_pcidev_probe()
3658 of_get_mac_address(pdev->dev.of_node, adapter->mac_address); in lan743x_pcidev_probe()
3680 adapter->netdev->netdev_ops = &lan743x_netdev_ops; in lan743x_pcidev_probe()
3681 adapter->netdev->ethtool_ops = &lan743x_ethtool_ops; in lan743x_pcidev_probe()
3682 adapter->netdev->features = NETIF_F_SG | NETIF_F_TSO | in lan743x_pcidev_probe()
3684 adapter->netdev->hw_features = adapter->netdev->features; in lan743x_pcidev_probe()
3693 ret = register_netdev(adapter->netdev); in lan743x_pcidev_probe()
3716 * lan743x_pcidev_remove - Device Removal Routine
3721 * Hot-Plug event, or because the driver is going to be removed from
3741 * For instance, it is true when system goes to sleep by pm-suspend in lan743x_pcidev_shutdown()
3791 if (adapter->phy_wolopts) in lan743x_pm_set_wol()
3794 if (adapter->wolopts & WAKE_MAGIC) { in lan743x_pm_set_wol()
3799 if (adapter->wolopts & WAKE_UCAST) { in lan743x_pm_set_wol()
3805 if (adapter->wolopts & WAKE_BCAST) { in lan743x_pm_set_wol()
3811 if (adapter->wolopts & WAKE_MCAST) { in lan743x_pm_set_wol()
3841 if (adapter->wolopts & WAKE_ARP) { in lan743x_pm_set_wol()
3862 if (adapter->wolopts & WAKE_MAGICSECURE) { in lan743x_pm_set_wol()
3863 sopass = *(u32 *)adapter->sopass; in lan743x_pm_set_wol()
3865 sopass = *(u16 *)&adapter->sopass[4]; in lan743x_pm_set_wol()
3889 if (adapter->wolopts || adapter->phy_wolopts) in lan743x_pm_suspend()
3892 if (adapter->is_pci11x1x) { in lan743x_pm_suspend()
3895 adapter->hw_cfg = data; in lan743x_pm_suspend()
3921 if (adapter->is_pci11x1x) in lan743x_pm_resume()
3922 lan743x_csr_write(adapter, HW_CFG, adapter->hw_cfg); in lan743x_pm_resume()
3926 netif_err(adapter, probe, adapter->netdev, in lan743x_pm_resume()
3933 netif_dbg(adapter, drv, adapter->netdev, in lan743x_pm_resume()
3958 * For instance, it is true when system wakesup after pm-suspend in lan743x_pm_resume()