Lines Matching +full:rx +full:- +full:tx

1 /* SPDX-License-Identifier: GPL-2.0+ */
39 netif_err(adapter, drv, adapter->netdev, in pci11x1x_strap_get_status()
52 adapter->is_sgmii_en = true; in pci11x1x_strap_get_status()
54 adapter->is_sgmii_en = false; in pci11x1x_strap_get_status()
59 adapter->is_sgmii_en = true; in pci11x1x_strap_get_status()
61 adapter->is_sgmii_en = false; in pci11x1x_strap_get_status()
63 adapter->is_sgmii_en = false; in pci11x1x_strap_get_status()
66 netif_dbg(adapter, drv, adapter->netdev, in pci11x1x_strap_get_status()
67 "SGMII I/F %sable\n", adapter->is_sgmii_en ? "En" : "Dis"); in pci11x1x_strap_get_status()
72 struct lan743x_csr *csr = &adapter->csr; in is_pci11x1x_chip()
73 u32 id_rev = csr->id_rev; in is_pci11x1x_chip()
84 pci_release_selected_regions(adapter->pdev, in lan743x_pci_cleanup()
85 pci_select_bars(adapter->pdev, in lan743x_pci_cleanup()
87 pci_disable_device(adapter->pdev); in lan743x_pci_cleanup()
96 adapter->pdev = pdev; in lan743x_pci_init()
101 netif_info(adapter, probe, adapter->netdev, in lan743x_pci_init()
103 pdev->vendor, pdev->device); in lan743x_pci_init()
116 pci_disable_device(adapter->pdev); in lan743x_pci_init()
124 return ioread32(&adapter->csr.csr_address[offset]); in lan743x_csr_read()
130 iowrite32(data, &adapter->csr.csr_address[offset]); in lan743x_csr_write()
173 struct lan743x_csr *csr = &adapter->csr; in lan743x_csr_init()
176 bar_start = pci_resource_start(adapter->pdev, 0); in lan743x_csr_init()
177 bar_length = pci_resource_len(adapter->pdev, 0); in lan743x_csr_init()
178 csr->csr_address = devm_ioremap(&adapter->pdev->dev, in lan743x_csr_init()
180 if (!csr->csr_address) in lan743x_csr_init()
181 return -ENOMEM; in lan743x_csr_init()
183 csr->id_rev = lan743x_csr_read(adapter, ID_REV); in lan743x_csr_init()
184 csr->fpga_rev = lan743x_csr_read(adapter, FPGA_REV); in lan743x_csr_init()
185 netif_info(adapter, probe, adapter->netdev, in lan743x_csr_init()
187 csr->id_rev, FPGA_REV_GET_MAJOR_(csr->fpga_rev), in lan743x_csr_init()
188 FPGA_REV_GET_MINOR_(csr->fpga_rev)); in lan743x_csr_init()
189 if (!ID_REV_IS_VALID_CHIP_ID_(csr->id_rev)) in lan743x_csr_init()
190 return -ENODEV; in lan743x_csr_init()
192 csr->flags = LAN743X_CSR_FLAG_SUPPORTS_INTR_AUTO_SET_CLR; in lan743x_csr_init()
193 switch (csr->id_rev & ID_REV_CHIP_REV_MASK_) { in lan743x_csr_init()
195 csr->flags |= LAN743X_CSR_FLAG_IS_A0; in lan743x_csr_init()
196 csr->flags &= ~LAN743X_CSR_FLAG_SUPPORTS_INTR_AUTO_SET_CLR; in lan743x_csr_init()
199 csr->flags |= LAN743X_CSR_FLAG_IS_B0; in lan743x_csr_init()
208 struct lan743x_intr *intr = &adapter->intr; in lan743x_intr_software_isr()
210 /* disable the interrupt to prevent repeated re-triggering */ in lan743x_intr_software_isr()
212 intr->software_isr_flag = true; in lan743x_intr_software_isr()
213 wake_up(&intr->software_isr_wq); in lan743x_intr_software_isr()
218 struct lan743x_tx *tx = context; in lan743x_tx_isr() local
219 struct lan743x_adapter *adapter = tx->adapter; in lan743x_tx_isr()
225 INT_BIT_DMA_TX_(tx->channel_number)); in lan743x_tx_isr()
228 if (int_sts & INT_BIT_DMA_TX_(tx->channel_number)) { in lan743x_tx_isr()
229 u32 ioc_bit = DMAC_INT_BIT_TX_IOC_(tx->channel_number); in lan743x_tx_isr()
246 napi_schedule(&tx->napi); in lan743x_tx_isr()
254 INT_BIT_DMA_TX_(tx->channel_number)); in lan743x_tx_isr()
259 struct lan743x_rx *rx = context; in lan743x_rx_isr() local
260 struct lan743x_adapter *adapter = rx->adapter; in lan743x_rx_isr()
265 INT_BIT_DMA_RX_(rx->channel_number)); in lan743x_rx_isr()
268 if (int_sts & INT_BIT_DMA_RX_(rx->channel_number)) { in lan743x_rx_isr()
269 u32 rx_frame_bit = DMAC_INT_BIT_RXFRM_(rx->channel_number); in lan743x_rx_isr()
286 napi_schedule(&rx->napi); in lan743x_rx_isr()
294 INT_BIT_DMA_RX_(rx->channel_number)); in lan743x_rx_isr()
309 lan743x_rx_isr(&adapter->rx[channel], in lan743x_intr_shared_isr()
316 for (channel = 0; channel < adapter->used_tx_channels; in lan743x_intr_shared_isr()
321 lan743x_tx_isr(&adapter->tx[channel], in lan743x_intr_shared_isr()
344 struct lan743x_adapter *adapter = vector->adapter; in lan743x_intr_entry_isr()
349 if (vector->flags & LAN743X_VECTOR_FLAG_SOURCE_STATUS_READ) { in lan743x_intr_entry_isr()
351 } else if (vector->flags & in lan743x_intr_entry_isr()
357 int_sts = vector->int_mask | INT_BIT_MAS_; in lan743x_intr_entry_isr()
363 if (vector->flags & LAN743X_VECTOR_FLAG_VECTOR_ENABLE_ISR_CLEAR) in lan743x_intr_entry_isr()
367 INT_VEC_EN_(vector->vector_index)); in lan743x_intr_entry_isr()
369 if (vector->flags & LAN743X_VECTOR_FLAG_MASTER_ENABLE_CLEAR) in lan743x_intr_entry_isr()
373 if (vector->flags & LAN743X_VECTOR_FLAG_SOURCE_ENABLE_CHECK) { in lan743x_intr_entry_isr()
377 int_enables = vector->int_mask; in lan743x_intr_entry_isr()
381 int_sts &= vector->int_mask; in lan743x_intr_entry_isr()
383 if (vector->handler) { in lan743x_intr_entry_isr()
384 vector->handler(vector->context, in lan743x_intr_entry_isr()
385 int_sts, vector->flags); in lan743x_intr_entry_isr()
389 vector->int_mask); in lan743x_intr_entry_isr()
394 if (vector->flags & LAN743X_VECTOR_FLAG_MASTER_ENABLE_SET) in lan743x_intr_entry_isr()
398 if (vector->flags & LAN743X_VECTOR_FLAG_VECTOR_ENABLE_ISR_SET) in lan743x_intr_entry_isr()
402 INT_VEC_EN_(vector->vector_index)); in lan743x_intr_entry_isr()
409 struct lan743x_intr *intr = &adapter->intr; in lan743x_intr_test_isr()
412 intr->software_isr_flag = false; in lan743x_intr_test_isr()
418 ret = wait_event_timeout(intr->software_isr_wq, in lan743x_intr_test_isr()
419 intr->software_isr_flag, in lan743x_intr_test_isr()
425 return ret > 0 ? 0 : -ENODEV; in lan743x_intr_test_isr()
434 struct lan743x_vector *vector = &adapter->intr.vector_list in lan743x_intr_register_isr()
438 vector->adapter = adapter; in lan743x_intr_register_isr()
439 vector->flags = flags; in lan743x_intr_register_isr()
440 vector->vector_index = vector_index; in lan743x_intr_register_isr()
441 vector->int_mask = int_mask; in lan743x_intr_register_isr()
442 vector->handler = handler; in lan743x_intr_register_isr()
443 vector->context = context; in lan743x_intr_register_isr()
445 ret = request_irq(vector->irq, in lan743x_intr_register_isr()
450 vector->handler = NULL; in lan743x_intr_register_isr()
451 vector->context = NULL; in lan743x_intr_register_isr()
452 vector->int_mask = 0; in lan743x_intr_register_isr()
453 vector->flags = 0; in lan743x_intr_register_isr()
461 struct lan743x_vector *vector = &adapter->intr.vector_list in lan743x_intr_unregister_isr()
464 free_irq(vector->irq, vector); in lan743x_intr_unregister_isr()
465 vector->handler = NULL; in lan743x_intr_unregister_isr()
466 vector->context = NULL; in lan743x_intr_unregister_isr()
467 vector->int_mask = 0; in lan743x_intr_unregister_isr()
468 vector->flags = 0; in lan743x_intr_unregister_isr()
476 for (index = 0; index < adapter->max_vector_count; index++) { in lan743x_intr_get_vector_flags()
477 if (adapter->intr.vector_list[index].int_mask & int_mask) in lan743x_intr_get_vector_flags()
478 return adapter->intr.vector_list[index].flags; in lan743x_intr_get_vector_flags()
485 struct lan743x_intr *intr = &adapter->intr; in lan743x_intr_close()
489 if (adapter->is_pci11x1x) in lan743x_intr_close()
494 for (index = 0; index < intr->number_of_vectors; index++) { in lan743x_intr_close()
495 if (intr->flags & INTR_FLAG_IRQ_REQUESTED(index)) { in lan743x_intr_close()
497 intr->flags &= ~INTR_FLAG_IRQ_REQUESTED(index); in lan743x_intr_close()
501 if (intr->flags & INTR_FLAG_MSI_ENABLED) { in lan743x_intr_close()
502 pci_disable_msi(adapter->pdev); in lan743x_intr_close()
503 intr->flags &= ~INTR_FLAG_MSI_ENABLED; in lan743x_intr_close()
506 if (intr->flags & INTR_FLAG_MSIX_ENABLED) { in lan743x_intr_close()
507 pci_disable_msix(adapter->pdev); in lan743x_intr_close()
508 intr->flags &= ~INTR_FLAG_MSIX_ENABLED; in lan743x_intr_close()
515 struct lan743x_intr *intr = &adapter->intr; in lan743x_intr_open()
521 int ret = -ENODEV; in lan743x_intr_open()
525 intr->number_of_vectors = 0; in lan743x_intr_open()
528 max_vector_count = adapter->max_vector_count; in lan743x_intr_open()
533 used_tx_channels = adapter->used_tx_channels; in lan743x_intr_open()
534 ret = pci_enable_msix_range(adapter->pdev, in lan743x_intr_open()
540 intr->flags |= INTR_FLAG_MSIX_ENABLED; in lan743x_intr_open()
541 intr->number_of_vectors = ret; in lan743x_intr_open()
542 intr->using_vectors = true; in lan743x_intr_open()
543 for (index = 0; index < intr->number_of_vectors; index++) in lan743x_intr_open()
544 intr->vector_list[index].irq = msix_entries in lan743x_intr_open()
546 netif_info(adapter, ifup, adapter->netdev, in lan743x_intr_open()
548 intr->number_of_vectors); in lan743x_intr_open()
552 if (!intr->number_of_vectors) { in lan743x_intr_open()
553 if (!(adapter->csr.flags & LAN743X_CSR_FLAG_IS_A0)) { in lan743x_intr_open()
554 if (!pci_enable_msi(adapter->pdev)) { in lan743x_intr_open()
555 intr->flags |= INTR_FLAG_MSI_ENABLED; in lan743x_intr_open()
556 intr->number_of_vectors = 1; in lan743x_intr_open()
557 intr->using_vectors = true; in lan743x_intr_open()
558 intr->vector_list[0].irq = in lan743x_intr_open()
559 adapter->pdev->irq; in lan743x_intr_open()
560 netif_info(adapter, ifup, adapter->netdev, in lan743x_intr_open()
562 intr->number_of_vectors); in lan743x_intr_open()
568 if (!intr->number_of_vectors) { in lan743x_intr_open()
569 intr->number_of_vectors = 1; in lan743x_intr_open()
570 intr->using_vectors = false; in lan743x_intr_open()
571 intr->vector_list[0].irq = intr->irq; in lan743x_intr_open()
572 netif_info(adapter, ifup, adapter->netdev, in lan743x_intr_open()
588 if (intr->using_vectors) { in lan743x_intr_open()
597 if (adapter->csr.flags & LAN743X_CSR_FLAG_SUPPORTS_INTR_AUTO_SET_CLR) { in lan743x_intr_open()
606 init_waitqueue_head(&intr->software_isr_wq); in lan743x_intr_open()
614 intr->flags |= INTR_FLAG_IRQ_REQUESTED(0); in lan743x_intr_open()
616 if (intr->using_vectors) in lan743x_intr_open()
620 if (!(adapter->csr.flags & LAN743X_CSR_FLAG_IS_A0)) { in lan743x_intr_open()
629 if (adapter->is_pci11x1x) { in lan743x_intr_open()
647 if (intr->number_of_vectors > 1) { in lan743x_intr_open()
648 int number_of_tx_vectors = intr->number_of_vectors - 1; in lan743x_intr_open()
659 if (adapter->csr.flags & in lan743x_intr_open()
671 /* map TX interrupt to vector */ in lan743x_intr_open()
675 /* Remove TX interrupt from shared mask */ in lan743x_intr_open()
676 intr->vector_list[0].int_mask &= ~int_bit; in lan743x_intr_open()
679 &adapter->tx[index]); in lan743x_intr_open()
682 intr->flags |= INTR_FLAG_IRQ_REQUESTED(vector); in lan743x_intr_open()
689 if ((intr->number_of_vectors - used_tx_channels) > 1) { in lan743x_intr_open()
690 int number_of_rx_vectors = intr->number_of_vectors - in lan743x_intr_open()
691 used_tx_channels - 1; in lan743x_intr_open()
703 if (adapter->csr.flags & in lan743x_intr_open()
715 /* map RX interrupt to vector */ in lan743x_intr_open()
725 /* Remove RX interrupt from shared mask */ in lan743x_intr_open()
726 intr->vector_list[0].int_mask &= ~int_bit; in lan743x_intr_open()
729 &adapter->rx[index]); in lan743x_intr_open()
732 intr->flags |= INTR_FLAG_IRQ_REQUESTED(vector); in lan743x_intr_open()
753 return -EIO; in lan743x_dp_write()
766 return -EIO; in lan743x_dp_write()
800 struct lan743x_adapter *adapter = bus->priv; in lan743x_mdiobus_read_c22()
823 struct lan743x_adapter *adapter = bus->priv; in lan743x_mdiobus_write_c22()
865 struct lan743x_adapter *adapter = bus->priv; in lan743x_mdiobus_read_c45()
898 struct lan743x_adapter *adapter = bus->priv; in lan743x_mdiobus_write_c45()
933 netif_err(adapter, drv, adapter->netdev, in lan743x_sgmii_wait_till_not_busy()
946 netif_err(adapter, probe, adapter->netdev, in lan743x_sgmii_read()
948 return -EINVAL; in lan743x_sgmii_read()
951 mutex_lock(&adapter->sgmii_rw_lock); in lan743x_sgmii_read()
964 mutex_unlock(&adapter->sgmii_rw_lock); in lan743x_sgmii_read()
976 netif_err(adapter, probe, adapter->netdev, in lan743x_sgmii_write()
978 return -EINVAL; in lan743x_sgmii_write()
980 mutex_lock(&adapter->sgmii_rw_lock); in lan743x_sgmii_write()
988 mutex_unlock(&adapter->sgmii_rw_lock); in lan743x_sgmii_write()
1063 enum lan743x_sgmii_lsd lsd = adapter->sgmii_lsd; in lan743x_sgmii_aneg_update()
1097 /* In order for Auto-Negotiation to operate properly at in lan743x_sgmii_aneg_update()
1143 return -ETIMEDOUT; in lan743x_pcs_seq_state()
1150 struct net_device *netdev = adapter->netdev; in lan743x_sgmii_config()
1151 struct phy_device *phydev = netdev->phydev; in lan743x_sgmii_config()
1157 switch (phydev->speed) { in lan743x_sgmii_config()
1159 if (phydev->master_slave_state == MASTER_SLAVE_STATE_MASTER) in lan743x_sgmii_config()
1165 if (phydev->master_slave_state == MASTER_SLAVE_STATE_MASTER) in lan743x_sgmii_config()
1171 if (phydev->duplex) in lan743x_sgmii_config()
1177 if (phydev->duplex) in lan743x_sgmii_config()
1183 netif_err(adapter, drv, adapter->netdev, in lan743x_sgmii_config()
1184 "Invalid speed %d\n", phydev->speed); in lan743x_sgmii_config()
1185 return -EINVAL; in lan743x_sgmii_config()
1188 adapter->sgmii_lsd = lsd; in lan743x_sgmii_config()
1191 netif_err(adapter, drv, adapter->netdev, in lan743x_sgmii_config()
1198 netif_err(adapter, drv, adapter->netdev, in lan743x_sgmii_config()
1204 netif_dbg(adapter, drv, adapter->netdev, in lan743x_sgmii_config()
1207 netif_dbg(adapter, drv, adapter->netdev, in lan743x_sgmii_config()
1210 /* SGMII/1000/2500BASE-X PCS power down */ in lan743x_sgmii_config()
1224 /* SGMII/1000/2500BASE-X PCS power up */ in lan743x_sgmii_config()
1251 ether_addr_copy(adapter->mac_address, addr); in lan743x_mac_set_address()
1252 netif_info(adapter, drv, adapter->netdev, in lan743x_mac_set_address()
1264 netdev = adapter->netdev; in lan743x_mac_init()
1272 if (!is_valid_ether_addr(adapter->mac_address)) { in lan743x_mac_init()
1275 adapter->mac_address[0] = mac_addr_lo & 0xFF; in lan743x_mac_init()
1276 adapter->mac_address[1] = (mac_addr_lo >> 8) & 0xFF; in lan743x_mac_init()
1277 adapter->mac_address[2] = (mac_addr_lo >> 16) & 0xFF; in lan743x_mac_init()
1278 adapter->mac_address[3] = (mac_addr_lo >> 24) & 0xFF; in lan743x_mac_init()
1279 adapter->mac_address[4] = mac_addr_hi & 0xFF; in lan743x_mac_init()
1280 adapter->mac_address[5] = (mac_addr_hi >> 8) & 0xFF; in lan743x_mac_init()
1285 } else if (!is_valid_ether_addr(adapter->mac_address)) { in lan743x_mac_init()
1290 eth_random_addr(adapter->mac_address); in lan743x_mac_init()
1292 lan743x_mac_set_address(adapter, adapter->mac_address); in lan743x_mac_init()
1293 eth_hw_addr_set(netdev, adapter->mac_address); in lan743x_mac_init()
1393 struct lan743x_phy *phy = &adapter->phy; in lan743x_phy_update_flowcontrol()
1396 if (phy->fc_autoneg) in lan743x_phy_update_flowcontrol()
1399 cap = phy->fc_request_control; in lan743x_phy_update_flowcontrol()
1414 struct phy_device *phydev = netdev->phydev; in lan743x_phy_link_status_change()
1418 if (phydev->state == PHY_RUNNING) { in lan743x_phy_link_status_change()
1425 if (phydev->duplex) in lan743x_phy_link_status_change()
1431 switch (phydev->speed) { in lan743x_phy_link_status_change()
1452 linkmode_adv_to_mii_adv_t(phydev->advertising); in lan743x_phy_link_status_change()
1454 linkmode_adv_to_mii_adv_t(phydev->lp_advertising); in lan743x_phy_link_status_change()
1458 lan743x_ptp_update_latency(adapter, phydev->speed); in lan743x_phy_link_status_change()
1459 if (phydev->interface == PHY_INTERFACE_MODE_SGMII || in lan743x_phy_link_status_change()
1460 phydev->interface == PHY_INTERFACE_MODE_1000BASEX || in lan743x_phy_link_status_change()
1461 phydev->interface == PHY_INTERFACE_MODE_2500BASEX) in lan743x_phy_link_status_change()
1468 struct net_device *netdev = adapter->netdev; in lan743x_phy_close()
1470 phy_stop(netdev->phydev); in lan743x_phy_close()
1471 phy_disconnect(netdev->phydev); in lan743x_phy_close()
1480 id_rev = adapter->csr.id_rev & ID_REV_ID_MASK_; in lan743x_phy_interface_select()
1482 if (adapter->is_pci11x1x && adapter->is_sgmii_en) in lan743x_phy_interface_select()
1483 adapter->phy_interface = PHY_INTERFACE_MODE_SGMII; in lan743x_phy_interface_select()
1485 adapter->phy_interface = PHY_INTERFACE_MODE_GMII; in lan743x_phy_interface_select()
1487 adapter->phy_interface = PHY_INTERFACE_MODE_MII; in lan743x_phy_interface_select()
1489 adapter->phy_interface = PHY_INTERFACE_MODE_RGMII; in lan743x_phy_interface_select()
1494 struct net_device *netdev = adapter->netdev; in lan743x_phy_open()
1495 struct lan743x_phy *phy = &adapter->phy; in lan743x_phy_open()
1502 int ret = -EIO; in lan743x_phy_open()
1505 phydev = of_phy_get_and_connect(netdev, adapter->pdev->dev.of_node, in lan743x_phy_open()
1510 phydev = phy_find_first(adapter->mdiobus); in lan743x_phy_open()
1512 if ((adapter->csr.id_rev & ID_REV_ID_MASK_) == in lan743x_phy_open()
1529 adapter->phy_interface); in lan743x_phy_open()
1539 phy->fc_request_control = (FLOW_CTRL_RX | FLOW_CTRL_TX); in lan743x_phy_open()
1540 phy->fc_autoneg = phydev->autoneg; in lan743x_phy_open()
1576 mac_addr = adapter->mac_address; in lan743x_rfe_update_mac_address()
1591 struct net_device *netdev = adapter->netdev; in lan743x_rfe_set_multicast()
1600 if (netdev->flags & IFF_PROMISC) { in lan743x_rfe_set_multicast()
1603 if (netdev->flags & IFF_ALLMULTI) in lan743x_rfe_set_multicast()
1607 if (netdev->features & NETIF_F_RXCSUM) in lan743x_rfe_set_multicast()
1622 data = ha->addr[3]; in lan743x_rfe_set_multicast()
1623 data = ha->addr[2] | (data << 8); in lan743x_rfe_set_multicast()
1624 data = ha->addr[1] | (data << 8); in lan743x_rfe_set_multicast()
1625 data = ha->addr[0] | (data << 8); in lan743x_rfe_set_multicast()
1628 data = ha->addr[5]; in lan743x_rfe_set_multicast()
1629 data = ha->addr[4] | (data << 8); in lan743x_rfe_set_multicast()
1634 u32 bitnum = (ether_crc(ETH_ALEN, ha->addr) >> in lan743x_rfe_set_multicast()
1670 return -EPERM; in lan743x_dmac_init()
1672 if (!(adapter->csr.flags & LAN743X_CSR_FLAG_IS_A0)) in lan743x_dmac_init()
1713 timeout--; in lan743x_dmac_tx_wait_till_stopped()
1716 result = -ENODEV; in lan743x_dmac_tx_wait_till_stopped()
1742 timeout--; in lan743x_dmac_rx_wait_till_stopped()
1745 result = -ENODEV; in lan743x_dmac_rx_wait_till_stopped()
1749 static void lan743x_tx_release_desc(struct lan743x_tx *tx, in lan743x_tx_release_desc() argument
1757 descriptor = &tx->ring_cpu_ptr[descriptor_index]; in lan743x_tx_release_desc()
1758 buffer_info = &tx->buffer_info[descriptor_index]; in lan743x_tx_release_desc()
1759 if (!(buffer_info->flags & TX_BUFFER_INFO_FLAG_ACTIVE)) in lan743x_tx_release_desc()
1762 descriptor_type = le32_to_cpu(descriptor->data0) & in lan743x_tx_release_desc()
1770 if (buffer_info->dma_ptr) { in lan743x_tx_release_desc()
1771 if (buffer_info->flags & in lan743x_tx_release_desc()
1773 dma_unmap_page(&tx->adapter->pdev->dev, in lan743x_tx_release_desc()
1774 buffer_info->dma_ptr, in lan743x_tx_release_desc()
1775 buffer_info->buffer_length, in lan743x_tx_release_desc()
1778 dma_unmap_single(&tx->adapter->pdev->dev, in lan743x_tx_release_desc()
1779 buffer_info->dma_ptr, in lan743x_tx_release_desc()
1780 buffer_info->buffer_length, in lan743x_tx_release_desc()
1783 buffer_info->dma_ptr = 0; in lan743x_tx_release_desc()
1784 buffer_info->buffer_length = 0; in lan743x_tx_release_desc()
1786 if (!buffer_info->skb) in lan743x_tx_release_desc()
1789 if (!(buffer_info->flags & TX_BUFFER_INFO_FLAG_TIMESTAMP_REQUESTED)) { in lan743x_tx_release_desc()
1790 dev_kfree_skb_any(buffer_info->skb); in lan743x_tx_release_desc()
1795 lan743x_ptp_unrequest_tx_timestamp(tx->adapter); in lan743x_tx_release_desc()
1796 dev_kfree_skb_any(buffer_info->skb); in lan743x_tx_release_desc()
1798 ignore_sync = (buffer_info->flags & in lan743x_tx_release_desc()
1800 lan743x_ptp_tx_timestamp_skb(tx->adapter, in lan743x_tx_release_desc()
1801 buffer_info->skb, ignore_sync); in lan743x_tx_release_desc()
1805 buffer_info->skb = NULL; in lan743x_tx_release_desc()
1808 buffer_info->flags &= ~TX_BUFFER_INFO_FLAG_ACTIVE; in lan743x_tx_release_desc()
1815 static int lan743x_tx_next_index(struct lan743x_tx *tx, int index) in lan743x_tx_next_index() argument
1817 return ((++index) % tx->ring_size); in lan743x_tx_next_index()
1820 static void lan743x_tx_release_completed_descriptors(struct lan743x_tx *tx) in lan743x_tx_release_completed_descriptors() argument
1822 while (le32_to_cpu(*tx->head_cpu_ptr) != (tx->last_head)) { in lan743x_tx_release_completed_descriptors()
1823 lan743x_tx_release_desc(tx, tx->last_head, false); in lan743x_tx_release_completed_descriptors()
1824 tx->last_head = lan743x_tx_next_index(tx, tx->last_head); in lan743x_tx_release_completed_descriptors()
1828 static void lan743x_tx_release_all_descriptors(struct lan743x_tx *tx) in lan743x_tx_release_all_descriptors() argument
1832 original_head = tx->last_head; in lan743x_tx_release_all_descriptors()
1834 lan743x_tx_release_desc(tx, tx->last_head, true); in lan743x_tx_release_all_descriptors()
1835 tx->last_head = lan743x_tx_next_index(tx, tx->last_head); in lan743x_tx_release_all_descriptors()
1836 } while (tx->last_head != original_head); in lan743x_tx_release_all_descriptors()
1837 memset(tx->ring_cpu_ptr, 0, in lan743x_tx_release_all_descriptors()
1838 sizeof(*tx->ring_cpu_ptr) * (tx->ring_size)); in lan743x_tx_release_all_descriptors()
1839 memset(tx->buffer_info, 0, in lan743x_tx_release_all_descriptors()
1840 sizeof(*tx->buffer_info) * (tx->ring_size)); in lan743x_tx_release_all_descriptors()
1843 static int lan743x_tx_get_desc_cnt(struct lan743x_tx *tx, in lan743x_tx_get_desc_cnt() argument
1851 nr_frags = skb_shinfo(skb)->nr_frags; in lan743x_tx_get_desc_cnt()
1856 static int lan743x_tx_get_avail_desc(struct lan743x_tx *tx) in lan743x_tx_get_avail_desc() argument
1858 int last_head = tx->last_head; in lan743x_tx_get_avail_desc()
1859 int last_tail = tx->last_tail; in lan743x_tx_get_avail_desc()
1862 return tx->ring_size - last_tail + last_head - 1; in lan743x_tx_get_avail_desc()
1864 return last_head - last_tail - 1; in lan743x_tx_get_avail_desc()
1867 void lan743x_tx_set_timestamping_mode(struct lan743x_tx *tx, in lan743x_tx_set_timestamping_mode() argument
1872 tx->ts_flags |= TX_TS_FLAG_TIMESTAMPING_ENABLED; in lan743x_tx_set_timestamping_mode()
1874 tx->ts_flags &= ~TX_TS_FLAG_TIMESTAMPING_ENABLED; in lan743x_tx_set_timestamping_mode()
1876 tx->ts_flags |= TX_TS_FLAG_ONE_STEP_SYNC; in lan743x_tx_set_timestamping_mode()
1878 tx->ts_flags &= ~TX_TS_FLAG_ONE_STEP_SYNC; in lan743x_tx_set_timestamping_mode()
1881 static int lan743x_tx_frame_start(struct lan743x_tx *tx, in lan743x_tx_frame_start() argument
1889 * assuming tx->ring_lock has already been acquired. in lan743x_tx_frame_start()
1893 struct lan743x_adapter *adapter = tx->adapter; in lan743x_tx_frame_start()
1894 struct device *dev = &adapter->pdev->dev; in lan743x_tx_frame_start()
1897 tx->frame_flags |= TX_FRAME_FLAG_IN_PROGRESS; in lan743x_tx_frame_start()
1898 tx->frame_first = tx->last_tail; in lan743x_tx_frame_start()
1899 tx->frame_tail = tx->frame_first; in lan743x_tx_frame_start()
1901 tx_descriptor = &tx->ring_cpu_ptr[tx->frame_tail]; in lan743x_tx_frame_start()
1902 buffer_info = &tx->buffer_info[tx->frame_tail]; in lan743x_tx_frame_start()
1906 return -ENOMEM; in lan743x_tx_frame_start()
1908 tx_descriptor->data1 = cpu_to_le32(DMA_ADDR_LOW32(dma_ptr)); in lan743x_tx_frame_start()
1909 tx_descriptor->data2 = cpu_to_le32(DMA_ADDR_HIGH32(dma_ptr)); in lan743x_tx_frame_start()
1910 tx_descriptor->data3 = cpu_to_le32((frame_length << 16) & in lan743x_tx_frame_start()
1913 buffer_info->skb = NULL; in lan743x_tx_frame_start()
1914 buffer_info->dma_ptr = dma_ptr; in lan743x_tx_frame_start()
1915 buffer_info->buffer_length = first_buffer_length; in lan743x_tx_frame_start()
1916 buffer_info->flags |= TX_BUFFER_INFO_FLAG_ACTIVE; in lan743x_tx_frame_start()
1918 tx->frame_data0 = (first_buffer_length & in lan743x_tx_frame_start()
1924 tx->frame_data0 |= TX_DESC_DATA0_TSE_; in lan743x_tx_frame_start()
1927 tx->frame_data0 |= TX_DESC_DATA0_ICE_ | in lan743x_tx_frame_start()
1935 static void lan743x_tx_frame_add_lso(struct lan743x_tx *tx, in lan743x_tx_frame_add_lso() argument
1940 * assuming tx->ring_lock has already been acquired. in lan743x_tx_frame_add_lso()
1946 tx->frame_data0 |= TX_DESC_DATA0_EXT_; in lan743x_tx_frame_add_lso()
1948 tx->frame_data0 |= TX_DESC_DATA0_LS_; in lan743x_tx_frame_add_lso()
1949 tx->frame_data0 |= TX_DESC_DATA0_IOC_; in lan743x_tx_frame_add_lso()
1951 tx_descriptor = &tx->ring_cpu_ptr[tx->frame_tail]; in lan743x_tx_frame_add_lso()
1952 tx_descriptor->data0 = cpu_to_le32(tx->frame_data0); in lan743x_tx_frame_add_lso()
1955 tx->frame_tail = lan743x_tx_next_index(tx, tx->frame_tail); in lan743x_tx_frame_add_lso()
1956 tx_descriptor = &tx->ring_cpu_ptr[tx->frame_tail]; in lan743x_tx_frame_add_lso()
1957 buffer_info = &tx->buffer_info[tx->frame_tail]; in lan743x_tx_frame_add_lso()
1960 tx_descriptor->data1 = 0; in lan743x_tx_frame_add_lso()
1961 tx_descriptor->data2 = 0; in lan743x_tx_frame_add_lso()
1962 tx_descriptor->data3 = 0; in lan743x_tx_frame_add_lso()
1964 buffer_info->skb = NULL; in lan743x_tx_frame_add_lso()
1965 buffer_info->dma_ptr = 0; in lan743x_tx_frame_add_lso()
1966 buffer_info->buffer_length = 0; in lan743x_tx_frame_add_lso()
1967 buffer_info->flags |= TX_BUFFER_INFO_FLAG_ACTIVE; in lan743x_tx_frame_add_lso()
1969 tx->frame_data0 = (frame_length & TX_DESC_DATA0_EXT_PAY_LENGTH_MASK_) | in lan743x_tx_frame_add_lso()
1976 static int lan743x_tx_frame_add_fragment(struct lan743x_tx *tx, in lan743x_tx_frame_add_fragment() argument
1981 * assuming tx->ring_lock has already been acquired in lan743x_tx_frame_add_fragment()
1985 struct lan743x_adapter *adapter = tx->adapter; in lan743x_tx_frame_add_fragment()
1986 struct device *dev = &adapter->pdev->dev; in lan743x_tx_frame_add_fragment()
1995 tx_descriptor = &tx->ring_cpu_ptr[tx->frame_tail]; in lan743x_tx_frame_add_fragment()
1996 tx_descriptor->data0 = cpu_to_le32(tx->frame_data0); in lan743x_tx_frame_add_fragment()
1999 tx->frame_tail = lan743x_tx_next_index(tx, tx->frame_tail); in lan743x_tx_frame_add_fragment()
2000 tx_descriptor = &tx->ring_cpu_ptr[tx->frame_tail]; in lan743x_tx_frame_add_fragment()
2001 buffer_info = &tx->buffer_info[tx->frame_tail]; in lan743x_tx_frame_add_fragment()
2009 desc_index = tx->frame_first; in lan743x_tx_frame_add_fragment()
2010 while (desc_index != tx->frame_tail) { in lan743x_tx_frame_add_fragment()
2011 lan743x_tx_release_desc(tx, desc_index, true); in lan743x_tx_frame_add_fragment()
2012 desc_index = lan743x_tx_next_index(tx, desc_index); in lan743x_tx_frame_add_fragment()
2015 tx->frame_flags &= ~TX_FRAME_FLAG_IN_PROGRESS; in lan743x_tx_frame_add_fragment()
2016 tx->frame_first = 0; in lan743x_tx_frame_add_fragment()
2017 tx->frame_data0 = 0; in lan743x_tx_frame_add_fragment()
2018 tx->frame_tail = 0; in lan743x_tx_frame_add_fragment()
2019 return -ENOMEM; in lan743x_tx_frame_add_fragment()
2022 tx_descriptor->data1 = cpu_to_le32(DMA_ADDR_LOW32(dma_ptr)); in lan743x_tx_frame_add_fragment()
2023 tx_descriptor->data2 = cpu_to_le32(DMA_ADDR_HIGH32(dma_ptr)); in lan743x_tx_frame_add_fragment()
2024 tx_descriptor->data3 = cpu_to_le32((frame_length << 16) & in lan743x_tx_frame_add_fragment()
2027 buffer_info->skb = NULL; in lan743x_tx_frame_add_fragment()
2028 buffer_info->dma_ptr = dma_ptr; in lan743x_tx_frame_add_fragment()
2029 buffer_info->buffer_length = fragment_length; in lan743x_tx_frame_add_fragment()
2030 buffer_info->flags |= TX_BUFFER_INFO_FLAG_ACTIVE; in lan743x_tx_frame_add_fragment()
2031 buffer_info->flags |= TX_BUFFER_INFO_FLAG_SKB_FRAGMENT; in lan743x_tx_frame_add_fragment()
2033 tx->frame_data0 = (fragment_length & TX_DESC_DATA0_BUF_LENGTH_MASK_) | in lan743x_tx_frame_add_fragment()
2041 static void lan743x_tx_frame_end(struct lan743x_tx *tx, in lan743x_tx_frame_end() argument
2047 * assuming tx->ring_lock has already been acquired in lan743x_tx_frame_end()
2051 struct lan743x_adapter *adapter = tx->adapter; in lan743x_tx_frame_end()
2055 if ((tx->frame_data0 & TX_DESC_DATA0_DTYPE_MASK_) == in lan743x_tx_frame_end()
2057 tx->frame_data0 |= TX_DESC_DATA0_LS_; in lan743x_tx_frame_end()
2058 tx->frame_data0 |= TX_DESC_DATA0_IOC_; in lan743x_tx_frame_end()
2061 tx_descriptor = &tx->ring_cpu_ptr[tx->frame_tail]; in lan743x_tx_frame_end()
2062 buffer_info = &tx->buffer_info[tx->frame_tail]; in lan743x_tx_frame_end()
2063 buffer_info->skb = skb; in lan743x_tx_frame_end()
2065 buffer_info->flags |= TX_BUFFER_INFO_FLAG_TIMESTAMP_REQUESTED; in lan743x_tx_frame_end()
2067 buffer_info->flags |= TX_BUFFER_INFO_FLAG_IGNORE_SYNC; in lan743x_tx_frame_end()
2069 tx_descriptor->data0 = cpu_to_le32(tx->frame_data0); in lan743x_tx_frame_end()
2070 tx->frame_tail = lan743x_tx_next_index(tx, tx->frame_tail); in lan743x_tx_frame_end()
2071 tx->last_tail = tx->frame_tail; in lan743x_tx_frame_end()
2075 if (tx->vector_flags & LAN743X_VECTOR_FLAG_VECTOR_ENABLE_AUTO_SET) in lan743x_tx_frame_end()
2077 if (tx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_ENABLE_AUTO_SET) in lan743x_tx_frame_end()
2081 lan743x_csr_write(adapter, TX_TAIL(tx->channel_number), in lan743x_tx_frame_end()
2082 tx_tail_flags | tx->frame_tail); in lan743x_tx_frame_end()
2083 tx->frame_flags &= ~TX_FRAME_FLAG_IN_PROGRESS; in lan743x_tx_frame_end()
2086 static netdev_tx_t lan743x_tx_xmit_frame(struct lan743x_tx *tx, in lan743x_tx_xmit_frame() argument
2102 required_number_of_descriptors = lan743x_tx_get_desc_cnt(tx, skb); in lan743x_tx_xmit_frame()
2104 spin_lock_irqsave(&tx->ring_lock, irq_flags); in lan743x_tx_xmit_frame()
2106 lan743x_tx_get_avail_desc(tx)) { in lan743x_tx_xmit_frame()
2107 if (required_number_of_descriptors > (tx->ring_size - 1)) { in lan743x_tx_xmit_frame()
2111 tx->rqd_descriptors = required_number_of_descriptors; in lan743x_tx_xmit_frame()
2113 txq = netdev_get_tx_queue(tx->adapter->netdev, in lan743x_tx_xmit_frame()
2114 tx->channel_number); in lan743x_tx_xmit_frame()
2121 if ((skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) && in lan743x_tx_xmit_frame()
2122 (tx->ts_flags & TX_TS_FLAG_TIMESTAMPING_ENABLED) && in lan743x_tx_xmit_frame()
2123 (lan743x_ptp_request_tx_timestamp(tx->adapter))) { in lan743x_tx_xmit_frame()
2124 skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS; in lan743x_tx_xmit_frame()
2126 if (tx->ts_flags & TX_TS_FLAG_ONE_STEP_SYNC) in lan743x_tx_xmit_frame()
2131 nr_frags = skb_shinfo(skb)->nr_frags; in lan743x_tx_xmit_frame()
2135 start_frame_length = max(skb_shinfo(skb)->gso_size, in lan743x_tx_xmit_frame()
2139 if (lan743x_tx_frame_start(tx, in lan743x_tx_xmit_frame()
2140 skb->data, head_length, in lan743x_tx_xmit_frame()
2143 skb->ip_summed == CHECKSUM_PARTIAL)) { in lan743x_tx_xmit_frame()
2147 tx->frame_count++; in lan743x_tx_xmit_frame()
2150 lan743x_tx_frame_add_lso(tx, frame_length, nr_frags); in lan743x_tx_xmit_frame()
2156 const skb_frag_t *frag = &(skb_shinfo(skb)->frags[j]); in lan743x_tx_xmit_frame()
2158 if (lan743x_tx_frame_add_fragment(tx, frag, frame_length)) { in lan743x_tx_xmit_frame()
2170 lan743x_tx_frame_end(tx, skb, do_timestamp, ignore_sync); in lan743x_tx_xmit_frame()
2173 spin_unlock_irqrestore(&tx->ring_lock, irq_flags); in lan743x_tx_xmit_frame()
2179 struct lan743x_tx *tx = container_of(napi, struct lan743x_tx, napi); in lan743x_tx_napi_poll() local
2180 struct lan743x_adapter *adapter = tx->adapter; in lan743x_tx_napi_poll()
2185 ioc_bit = DMAC_INT_BIT_TX_IOC_(tx->channel_number); in lan743x_tx_napi_poll()
2187 if (tx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_STATUS_W2C) in lan743x_tx_napi_poll()
2189 spin_lock_irqsave(&tx->ring_lock, irq_flags); in lan743x_tx_napi_poll()
2191 /* clean up tx ring */ in lan743x_tx_napi_poll()
2192 lan743x_tx_release_completed_descriptors(tx); in lan743x_tx_napi_poll()
2193 txq = netdev_get_tx_queue(adapter->netdev, tx->channel_number); in lan743x_tx_napi_poll()
2195 if (tx->rqd_descriptors) { in lan743x_tx_napi_poll()
2196 if (tx->rqd_descriptors <= in lan743x_tx_napi_poll()
2197 lan743x_tx_get_avail_desc(tx)) { in lan743x_tx_napi_poll()
2198 tx->rqd_descriptors = 0; in lan743x_tx_napi_poll()
2205 spin_unlock_irqrestore(&tx->ring_lock, irq_flags); in lan743x_tx_napi_poll()
2212 INT_BIT_DMA_TX_(tx->channel_number)); in lan743x_tx_napi_poll()
2219 static void lan743x_tx_ring_cleanup(struct lan743x_tx *tx) in lan743x_tx_ring_cleanup() argument
2221 if (tx->head_cpu_ptr) { in lan743x_tx_ring_cleanup()
2222 dma_free_coherent(&tx->adapter->pdev->dev, in lan743x_tx_ring_cleanup()
2223 sizeof(*tx->head_cpu_ptr), tx->head_cpu_ptr, in lan743x_tx_ring_cleanup()
2224 tx->head_dma_ptr); in lan743x_tx_ring_cleanup()
2225 tx->head_cpu_ptr = NULL; in lan743x_tx_ring_cleanup()
2226 tx->head_dma_ptr = 0; in lan743x_tx_ring_cleanup()
2228 kfree(tx->buffer_info); in lan743x_tx_ring_cleanup()
2229 tx->buffer_info = NULL; in lan743x_tx_ring_cleanup()
2231 if (tx->ring_cpu_ptr) { in lan743x_tx_ring_cleanup()
2232 dma_free_coherent(&tx->adapter->pdev->dev, in lan743x_tx_ring_cleanup()
2233 tx->ring_allocation_size, tx->ring_cpu_ptr, in lan743x_tx_ring_cleanup()
2234 tx->ring_dma_ptr); in lan743x_tx_ring_cleanup()
2235 tx->ring_allocation_size = 0; in lan743x_tx_ring_cleanup()
2236 tx->ring_cpu_ptr = NULL; in lan743x_tx_ring_cleanup()
2237 tx->ring_dma_ptr = 0; in lan743x_tx_ring_cleanup()
2239 tx->ring_size = 0; in lan743x_tx_ring_cleanup()
2242 static int lan743x_tx_ring_init(struct lan743x_tx *tx) in lan743x_tx_ring_init() argument
2247 int ret = -ENOMEM; in lan743x_tx_ring_init()
2249 tx->ring_size = LAN743X_TX_RING_SIZE; in lan743x_tx_ring_init()
2250 if (tx->ring_size & ~TX_CFG_B_TX_RING_LEN_MASK_) { in lan743x_tx_ring_init()
2251 ret = -EINVAL; in lan743x_tx_ring_init()
2254 if (dma_set_mask_and_coherent(&tx->adapter->pdev->dev, in lan743x_tx_ring_init()
2256 dev_warn(&tx->adapter->pdev->dev, in lan743x_tx_ring_init()
2258 ret = -ENOMEM; in lan743x_tx_ring_init()
2261 ring_allocation_size = ALIGN(tx->ring_size * in lan743x_tx_ring_init()
2265 cpu_ptr = dma_alloc_coherent(&tx->adapter->pdev->dev, in lan743x_tx_ring_init()
2268 ret = -ENOMEM; in lan743x_tx_ring_init()
2272 tx->ring_allocation_size = ring_allocation_size; in lan743x_tx_ring_init()
2273 tx->ring_cpu_ptr = (struct lan743x_tx_descriptor *)cpu_ptr; in lan743x_tx_ring_init()
2274 tx->ring_dma_ptr = dma_ptr; in lan743x_tx_ring_init()
2276 cpu_ptr = kcalloc(tx->ring_size, sizeof(*tx->buffer_info), GFP_KERNEL); in lan743x_tx_ring_init()
2278 ret = -ENOMEM; in lan743x_tx_ring_init()
2281 tx->buffer_info = (struct lan743x_tx_buffer_info *)cpu_ptr; in lan743x_tx_ring_init()
2283 cpu_ptr = dma_alloc_coherent(&tx->adapter->pdev->dev, in lan743x_tx_ring_init()
2284 sizeof(*tx->head_cpu_ptr), &dma_ptr, in lan743x_tx_ring_init()
2287 ret = -ENOMEM; in lan743x_tx_ring_init()
2291 tx->head_cpu_ptr = cpu_ptr; in lan743x_tx_ring_init()
2292 tx->head_dma_ptr = dma_ptr; in lan743x_tx_ring_init()
2293 if (tx->head_dma_ptr & 0x3) { in lan743x_tx_ring_init()
2294 ret = -ENOMEM; in lan743x_tx_ring_init()
2301 lan743x_tx_ring_cleanup(tx); in lan743x_tx_ring_init()
2305 static void lan743x_tx_close(struct lan743x_tx *tx) in lan743x_tx_close() argument
2307 struct lan743x_adapter *adapter = tx->adapter; in lan743x_tx_close()
2311 DMAC_CMD_STOP_T_(tx->channel_number)); in lan743x_tx_close()
2312 lan743x_dmac_tx_wait_till_stopped(adapter, tx->channel_number); in lan743x_tx_close()
2316 DMAC_INT_BIT_TX_IOC_(tx->channel_number)); in lan743x_tx_close()
2318 INT_BIT_DMA_TX_(tx->channel_number)); in lan743x_tx_close()
2319 napi_disable(&tx->napi); in lan743x_tx_close()
2320 netif_napi_del(&tx->napi); in lan743x_tx_close()
2323 FCT_TX_CTL_DIS_(tx->channel_number)); in lan743x_tx_close()
2325 FCT_TX_CTL_EN_(tx->channel_number), in lan743x_tx_close()
2328 lan743x_tx_release_all_descriptors(tx); in lan743x_tx_close()
2330 tx->rqd_descriptors = 0; in lan743x_tx_close()
2332 lan743x_tx_ring_cleanup(tx); in lan743x_tx_close()
2335 static int lan743x_tx_open(struct lan743x_tx *tx) in lan743x_tx_open() argument
2341 adapter = tx->adapter; in lan743x_tx_open()
2342 ret = lan743x_tx_ring_init(tx); in lan743x_tx_open()
2348 FCT_TX_CTL_RESET_(tx->channel_number)); in lan743x_tx_open()
2350 FCT_TX_CTL_RESET_(tx->channel_number), in lan743x_tx_open()
2355 FCT_TX_CTL_EN_(tx->channel_number)); in lan743x_tx_open()
2357 /* reset tx channel */ in lan743x_tx_open()
2359 DMAC_CMD_TX_SWR_(tx->channel_number)); in lan743x_tx_open()
2361 DMAC_CMD_TX_SWR_(tx->channel_number), in lan743x_tx_open()
2366 TX_BASE_ADDRH(tx->channel_number), in lan743x_tx_open()
2367 DMA_ADDR_HIGH32(tx->ring_dma_ptr)); in lan743x_tx_open()
2369 TX_BASE_ADDRL(tx->channel_number), in lan743x_tx_open()
2370 DMA_ADDR_LOW32(tx->ring_dma_ptr)); in lan743x_tx_open()
2373 data = lan743x_csr_read(adapter, TX_CFG_B(tx->channel_number)); in lan743x_tx_open()
2375 data |= ((tx->ring_size) & TX_CFG_B_TX_RING_LEN_MASK_); in lan743x_tx_open()
2376 if (!(adapter->csr.flags & LAN743X_CSR_FLAG_IS_A0)) in lan743x_tx_open()
2378 lan743x_csr_write(adapter, TX_CFG_B(tx->channel_number), data); in lan743x_tx_open()
2382 if (!(adapter->csr.flags & LAN743X_CSR_FLAG_IS_A0)) { in lan743x_tx_open()
2388 lan743x_csr_write(adapter, TX_CFG_A(tx->channel_number), data); in lan743x_tx_open()
2392 TX_HEAD_WRITEBACK_ADDRH(tx->channel_number), in lan743x_tx_open()
2393 DMA_ADDR_HIGH32(tx->head_dma_ptr)); in lan743x_tx_open()
2395 TX_HEAD_WRITEBACK_ADDRL(tx->channel_number), in lan743x_tx_open()
2396 DMA_ADDR_LOW32(tx->head_dma_ptr)); in lan743x_tx_open()
2399 tx->last_head = lan743x_csr_read(adapter, TX_HEAD(tx->channel_number)); in lan743x_tx_open()
2402 tx->last_tail = 0; in lan743x_tx_open()
2403 lan743x_csr_write(adapter, TX_TAIL(tx->channel_number), in lan743x_tx_open()
2404 (u32)(tx->last_tail)); in lan743x_tx_open()
2405 tx->vector_flags = lan743x_intr_get_vector_flags(adapter, in lan743x_tx_open()
2407 (tx->channel_number)); in lan743x_tx_open()
2408 netif_napi_add_tx_weight(adapter->netdev, in lan743x_tx_open()
2409 &tx->napi, lan743x_tx_napi_poll, in lan743x_tx_open()
2411 napi_enable(&tx->napi); in lan743x_tx_open()
2414 if (tx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_ENABLE_AUTO_CLEAR) in lan743x_tx_open()
2416 if (tx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_STATUS_AUTO_CLEAR) in lan743x_tx_open()
2418 if (tx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_STATUS_R2C) in lan743x_tx_open()
2420 if (tx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_ENABLE_R2C) in lan743x_tx_open()
2422 lan743x_csr_write(adapter, TX_CFG_C(tx->channel_number), data); in lan743x_tx_open()
2424 if (!(tx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_ENABLE_AUTO_SET)) in lan743x_tx_open()
2426 INT_BIT_DMA_TX_(tx->channel_number)); in lan743x_tx_open()
2428 DMAC_INT_BIT_TX_IOC_(tx->channel_number)); in lan743x_tx_open()
2432 DMAC_CMD_START_T_(tx->channel_number)); in lan743x_tx_open()
2436 static int lan743x_rx_next_index(struct lan743x_rx *rx, int index) in lan743x_rx_next_index() argument
2438 return ((++index) % rx->ring_size); in lan743x_rx_next_index()
2441 static void lan743x_rx_update_tail(struct lan743x_rx *rx, int index) in lan743x_rx_update_tail() argument
2445 lan743x_csr_write(rx->adapter, RX_TAIL(rx->channel_number), in lan743x_rx_update_tail()
2449 static int lan743x_rx_init_ring_element(struct lan743x_rx *rx, int index, in lan743x_rx_init_ring_element() argument
2452 struct net_device *netdev = rx->adapter->netdev; in lan743x_rx_init_ring_element()
2453 struct device *dev = &rx->adapter->pdev->dev; in lan743x_rx_init_ring_element()
2460 buffer_length = netdev->mtu + ETH_HLEN + ETH_FCS_LEN + RX_HEAD_PADDING; in lan743x_rx_init_ring_element()
2462 descriptor = &rx->ring_cpu_ptr[index]; in lan743x_rx_init_ring_element()
2463 buffer_info = &rx->buffer_info[index]; in lan743x_rx_init_ring_element()
2466 return -ENOMEM; in lan743x_rx_init_ring_element()
2467 dma_ptr = dma_map_single(dev, skb->data, buffer_length, DMA_FROM_DEVICE); in lan743x_rx_init_ring_element()
2470 return -ENOMEM; in lan743x_rx_init_ring_element()
2472 if (buffer_info->dma_ptr) { in lan743x_rx_init_ring_element()
2474 if (le32_to_cpu(descriptor->data0) & RX_DESC_DATA0_LS_) in lan743x_rx_init_ring_element()
2480 (le32_to_cpu(descriptor->data0)), in lan743x_rx_init_ring_element()
2481 buffer_info->buffer_length); in lan743x_rx_init_ring_element()
2483 used_length = buffer_info->buffer_length; in lan743x_rx_init_ring_element()
2484 dma_sync_single_for_cpu(dev, buffer_info->dma_ptr, in lan743x_rx_init_ring_element()
2487 dma_unmap_single_attrs(dev, buffer_info->dma_ptr, in lan743x_rx_init_ring_element()
2488 buffer_info->buffer_length, in lan743x_rx_init_ring_element()
2493 buffer_info->skb = skb; in lan743x_rx_init_ring_element()
2494 buffer_info->dma_ptr = dma_ptr; in lan743x_rx_init_ring_element()
2495 buffer_info->buffer_length = buffer_length; in lan743x_rx_init_ring_element()
2496 descriptor->data1 = cpu_to_le32(DMA_ADDR_LOW32(buffer_info->dma_ptr)); in lan743x_rx_init_ring_element()
2497 descriptor->data2 = cpu_to_le32(DMA_ADDR_HIGH32(buffer_info->dma_ptr)); in lan743x_rx_init_ring_element()
2498 descriptor->data3 = 0; in lan743x_rx_init_ring_element()
2499 descriptor->data0 = cpu_to_le32((RX_DESC_DATA0_OWN_ | in lan743x_rx_init_ring_element()
2501 lan743x_rx_update_tail(rx, index); in lan743x_rx_init_ring_element()
2506 static void lan743x_rx_reuse_ring_element(struct lan743x_rx *rx, int index) in lan743x_rx_reuse_ring_element() argument
2511 descriptor = &rx->ring_cpu_ptr[index]; in lan743x_rx_reuse_ring_element()
2512 buffer_info = &rx->buffer_info[index]; in lan743x_rx_reuse_ring_element()
2514 descriptor->data1 = cpu_to_le32(DMA_ADDR_LOW32(buffer_info->dma_ptr)); in lan743x_rx_reuse_ring_element()
2515 descriptor->data2 = cpu_to_le32(DMA_ADDR_HIGH32(buffer_info->dma_ptr)); in lan743x_rx_reuse_ring_element()
2516 descriptor->data3 = 0; in lan743x_rx_reuse_ring_element()
2517 descriptor->data0 = cpu_to_le32((RX_DESC_DATA0_OWN_ | in lan743x_rx_reuse_ring_element()
2518 ((buffer_info->buffer_length) & in lan743x_rx_reuse_ring_element()
2520 lan743x_rx_update_tail(rx, index); in lan743x_rx_reuse_ring_element()
2523 static void lan743x_rx_release_ring_element(struct lan743x_rx *rx, int index) in lan743x_rx_release_ring_element() argument
2528 descriptor = &rx->ring_cpu_ptr[index]; in lan743x_rx_release_ring_element()
2529 buffer_info = &rx->buffer_info[index]; in lan743x_rx_release_ring_element()
2533 if (buffer_info->dma_ptr) { in lan743x_rx_release_ring_element()
2534 dma_unmap_single(&rx->adapter->pdev->dev, in lan743x_rx_release_ring_element()
2535 buffer_info->dma_ptr, in lan743x_rx_release_ring_element()
2536 buffer_info->buffer_length, in lan743x_rx_release_ring_element()
2538 buffer_info->dma_ptr = 0; in lan743x_rx_release_ring_element()
2541 if (buffer_info->skb) { in lan743x_rx_release_ring_element()
2542 dev_kfree_skb(buffer_info->skb); in lan743x_rx_release_ring_element()
2543 buffer_info->skb = NULL; in lan743x_rx_release_ring_element()
2556 frame_length = max_t(int, 0, frame_length - ETH_FCS_LEN); in lan743x_rx_trim_skb()
2557 if (skb->len > frame_length) { in lan743x_rx_trim_skb()
2558 skb->tail -= skb->len - frame_length; in lan743x_rx_trim_skb()
2559 skb->len = frame_length; in lan743x_rx_trim_skb()
2564 static int lan743x_rx_process_buffer(struct lan743x_rx *rx) in lan743x_rx_process_buffer() argument
2566 int current_head_index = le32_to_cpu(*rx->head_cpu_ptr); in lan743x_rx_process_buffer()
2568 struct net_device *netdev = rx->adapter->netdev; in lan743x_rx_process_buffer()
2573 int extension_index = -1; in lan743x_rx_process_buffer()
2577 if (current_head_index < 0 || current_head_index >= rx->ring_size) in lan743x_rx_process_buffer()
2580 if (rx->last_head < 0 || rx->last_head >= rx->ring_size) in lan743x_rx_process_buffer()
2583 if (rx->last_head == current_head_index) in lan743x_rx_process_buffer()
2586 descriptor = &rx->ring_cpu_ptr[rx->last_head]; in lan743x_rx_process_buffer()
2587 if (le32_to_cpu(descriptor->data0) & RX_DESC_DATA0_OWN_) in lan743x_rx_process_buffer()
2589 buffer_info = &rx->buffer_info[rx->last_head]; in lan743x_rx_process_buffer()
2591 is_last = le32_to_cpu(descriptor->data0) & RX_DESC_DATA0_LS_; in lan743x_rx_process_buffer()
2592 is_first = le32_to_cpu(descriptor->data0) & RX_DESC_DATA0_FS_; in lan743x_rx_process_buffer()
2594 if (is_last && le32_to_cpu(descriptor->data0) & RX_DESC_DATA0_EXT_) { in lan743x_rx_process_buffer()
2596 int index = lan743x_rx_next_index(rx, rx->last_head); in lan743x_rx_process_buffer()
2601 desc_ext = &rx->ring_cpu_ptr[index]; in lan743x_rx_process_buffer()
2602 if (le32_to_cpu(desc_ext->data0) & RX_DESC_DATA0_OWN_) in lan743x_rx_process_buffer()
2605 if (!(le32_to_cpu(desc_ext->data0) & RX_DESC_DATA0_EXT_)) in lan743x_rx_process_buffer()
2610 /* Only the last buffer in a multi-buffer frame contains the total frame in lan743x_rx_process_buffer()
2617 RX_DESC_DATA0_FRAME_LENGTH_GET_(le32_to_cpu(descriptor->data0)); in lan743x_rx_process_buffer()
2618 buffer_length = buffer_info->buffer_length; in lan743x_rx_process_buffer()
2619 is_ice = le32_to_cpu(descriptor->data1) & RX_DESC_DATA1_STATUS_ICE_; in lan743x_rx_process_buffer()
2620 is_tce = le32_to_cpu(descriptor->data1) & RX_DESC_DATA1_STATUS_TCE_; in lan743x_rx_process_buffer()
2621 is_icsm = le32_to_cpu(descriptor->data1) & RX_DESC_DATA1_STATUS_ICSM_; in lan743x_rx_process_buffer()
2629 skb = buffer_info->skb; in lan743x_rx_process_buffer()
2630 if (lan743x_rx_init_ring_element(rx, rx->last_head, in lan743x_rx_process_buffer()
2636 lan743x_rx_reuse_ring_element(rx, rx->last_head); in lan743x_rx_process_buffer()
2638 dev_kfree_skb_irq(rx->skb_head); in lan743x_rx_process_buffer()
2639 rx->skb_head = NULL; in lan743x_rx_process_buffer()
2643 /* add buffers to skb via skb->frag_list */ in lan743x_rx_process_buffer()
2646 skb_put(skb, buffer_length - RX_HEAD_PADDING); in lan743x_rx_process_buffer()
2647 if (rx->skb_head) in lan743x_rx_process_buffer()
2648 dev_kfree_skb_irq(rx->skb_head); in lan743x_rx_process_buffer()
2649 rx->skb_head = skb; in lan743x_rx_process_buffer()
2650 } else if (rx->skb_head) { in lan743x_rx_process_buffer()
2652 if (skb_shinfo(rx->skb_head)->frag_list) in lan743x_rx_process_buffer()
2653 rx->skb_tail->next = skb; in lan743x_rx_process_buffer()
2655 skb_shinfo(rx->skb_head)->frag_list = skb; in lan743x_rx_process_buffer()
2656 rx->skb_tail = skb; in lan743x_rx_process_buffer()
2657 rx->skb_head->len += skb->len; in lan743x_rx_process_buffer()
2658 rx->skb_head->data_len += skb->len; in lan743x_rx_process_buffer()
2659 rx->skb_head->truesize += skb->truesize; in lan743x_rx_process_buffer()
2673 ts_sec = le32_to_cpu(desc_ext->data1); in lan743x_rx_process_buffer()
2674 ts_nsec = (le32_to_cpu(desc_ext->data2) & in lan743x_rx_process_buffer()
2676 if (rx->skb_head) in lan743x_rx_process_buffer()
2677 skb_hwtstamps(rx->skb_head)->hwtstamp = in lan743x_rx_process_buffer()
2679 lan743x_rx_reuse_ring_element(rx, extension_index); in lan743x_rx_process_buffer()
2680 rx->last_head = extension_index; in lan743x_rx_process_buffer()
2684 if (is_last && rx->skb_head) in lan743x_rx_process_buffer()
2685 rx->skb_head = lan743x_rx_trim_skb(rx->skb_head, frame_length); in lan743x_rx_process_buffer()
2687 if (is_last && rx->skb_head) { in lan743x_rx_process_buffer()
2688 rx->skb_head->protocol = eth_type_trans(rx->skb_head, in lan743x_rx_process_buffer()
2689 rx->adapter->netdev); in lan743x_rx_process_buffer()
2690 if (rx->adapter->netdev->features & NETIF_F_RXCSUM) { in lan743x_rx_process_buffer()
2692 skb->ip_summed = CHECKSUM_UNNECESSARY; in lan743x_rx_process_buffer()
2695 rx->skb_head->len); in lan743x_rx_process_buffer()
2696 napi_gro_receive(&rx->napi, rx->skb_head); in lan743x_rx_process_buffer()
2697 rx->skb_head = NULL; in lan743x_rx_process_buffer()
2702 rx->last_tail = rx->last_head; in lan743x_rx_process_buffer()
2703 rx->last_head = lan743x_rx_next_index(rx, rx->last_head); in lan743x_rx_process_buffer()
2711 struct lan743x_rx *rx = container_of(napi, struct lan743x_rx, napi); in lan743x_rx_napi_poll() local
2712 struct lan743x_adapter *adapter = rx->adapter; in lan743x_rx_napi_poll()
2717 if (rx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_STATUS_W2C) { in lan743x_rx_napi_poll()
2720 DMAC_INT_BIT_RXFRM_(rx->channel_number)); in lan743x_rx_napi_poll()
2723 result = lan743x_rx_process_buffer(rx); in lan743x_rx_napi_poll()
2727 rx->frame_count += count; in lan743x_rx_napi_poll()
2734 /* re-arm interrupts, must write to rx tail on some chip variants */ in lan743x_rx_napi_poll()
2735 if (rx->vector_flags & LAN743X_VECTOR_FLAG_VECTOR_ENABLE_AUTO_SET) in lan743x_rx_napi_poll()
2737 if (rx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_ENABLE_AUTO_SET) { in lan743x_rx_napi_poll()
2741 INT_BIT_DMA_RX_(rx->channel_number)); in lan743x_rx_napi_poll()
2745 lan743x_csr_write(adapter, RX_TAIL(rx->channel_number), in lan743x_rx_napi_poll()
2746 rx_tail_flags | rx->last_tail); in lan743x_rx_napi_poll()
2751 static void lan743x_rx_ring_cleanup(struct lan743x_rx *rx) in lan743x_rx_ring_cleanup() argument
2753 if (rx->buffer_info && rx->ring_cpu_ptr) { in lan743x_rx_ring_cleanup()
2756 for (index = 0; index < rx->ring_size; index++) in lan743x_rx_ring_cleanup()
2757 lan743x_rx_release_ring_element(rx, index); in lan743x_rx_ring_cleanup()
2760 if (rx->head_cpu_ptr) { in lan743x_rx_ring_cleanup()
2761 dma_free_coherent(&rx->adapter->pdev->dev, in lan743x_rx_ring_cleanup()
2762 sizeof(*rx->head_cpu_ptr), rx->head_cpu_ptr, in lan743x_rx_ring_cleanup()
2763 rx->head_dma_ptr); in lan743x_rx_ring_cleanup()
2764 rx->head_cpu_ptr = NULL; in lan743x_rx_ring_cleanup()
2765 rx->head_dma_ptr = 0; in lan743x_rx_ring_cleanup()
2768 kfree(rx->buffer_info); in lan743x_rx_ring_cleanup()
2769 rx->buffer_info = NULL; in lan743x_rx_ring_cleanup()
2771 if (rx->ring_cpu_ptr) { in lan743x_rx_ring_cleanup()
2772 dma_free_coherent(&rx->adapter->pdev->dev, in lan743x_rx_ring_cleanup()
2773 rx->ring_allocation_size, rx->ring_cpu_ptr, in lan743x_rx_ring_cleanup()
2774 rx->ring_dma_ptr); in lan743x_rx_ring_cleanup()
2775 rx->ring_allocation_size = 0; in lan743x_rx_ring_cleanup()
2776 rx->ring_cpu_ptr = NULL; in lan743x_rx_ring_cleanup()
2777 rx->ring_dma_ptr = 0; in lan743x_rx_ring_cleanup()
2780 rx->ring_size = 0; in lan743x_rx_ring_cleanup()
2781 rx->last_head = 0; in lan743x_rx_ring_cleanup()
2784 static int lan743x_rx_ring_init(struct lan743x_rx *rx) in lan743x_rx_ring_init() argument
2789 int ret = -ENOMEM; in lan743x_rx_ring_init()
2792 rx->ring_size = LAN743X_RX_RING_SIZE; in lan743x_rx_ring_init()
2793 if (rx->ring_size <= 1) { in lan743x_rx_ring_init()
2794 ret = -EINVAL; in lan743x_rx_ring_init()
2797 if (rx->ring_size & ~RX_CFG_B_RX_RING_LEN_MASK_) { in lan743x_rx_ring_init()
2798 ret = -EINVAL; in lan743x_rx_ring_init()
2801 if (dma_set_mask_and_coherent(&rx->adapter->pdev->dev, in lan743x_rx_ring_init()
2803 dev_warn(&rx->adapter->pdev->dev, in lan743x_rx_ring_init()
2805 ret = -ENOMEM; in lan743x_rx_ring_init()
2808 ring_allocation_size = ALIGN(rx->ring_size * in lan743x_rx_ring_init()
2812 cpu_ptr = dma_alloc_coherent(&rx->adapter->pdev->dev, in lan743x_rx_ring_init()
2815 ret = -ENOMEM; in lan743x_rx_ring_init()
2818 rx->ring_allocation_size = ring_allocation_size; in lan743x_rx_ring_init()
2819 rx->ring_cpu_ptr = (struct lan743x_rx_descriptor *)cpu_ptr; in lan743x_rx_ring_init()
2820 rx->ring_dma_ptr = dma_ptr; in lan743x_rx_ring_init()
2822 cpu_ptr = kcalloc(rx->ring_size, sizeof(*rx->buffer_info), in lan743x_rx_ring_init()
2825 ret = -ENOMEM; in lan743x_rx_ring_init()
2828 rx->buffer_info = (struct lan743x_rx_buffer_info *)cpu_ptr; in lan743x_rx_ring_init()
2830 cpu_ptr = dma_alloc_coherent(&rx->adapter->pdev->dev, in lan743x_rx_ring_init()
2831 sizeof(*rx->head_cpu_ptr), &dma_ptr, in lan743x_rx_ring_init()
2834 ret = -ENOMEM; in lan743x_rx_ring_init()
2838 rx->head_cpu_ptr = cpu_ptr; in lan743x_rx_ring_init()
2839 rx->head_dma_ptr = dma_ptr; in lan743x_rx_ring_init()
2840 if (rx->head_dma_ptr & 0x3) { in lan743x_rx_ring_init()
2841 ret = -ENOMEM; in lan743x_rx_ring_init()
2845 rx->last_head = 0; in lan743x_rx_ring_init()
2846 for (index = 0; index < rx->ring_size; index++) { in lan743x_rx_ring_init()
2847 ret = lan743x_rx_init_ring_element(rx, index, GFP_KERNEL); in lan743x_rx_ring_init()
2854 netif_warn(rx->adapter, ifup, rx->adapter->netdev, in lan743x_rx_ring_init()
2857 lan743x_rx_ring_cleanup(rx); in lan743x_rx_ring_init()
2861 static void lan743x_rx_close(struct lan743x_rx *rx) in lan743x_rx_close() argument
2863 struct lan743x_adapter *adapter = rx->adapter; in lan743x_rx_close()
2866 FCT_RX_CTL_DIS_(rx->channel_number)); in lan743x_rx_close()
2868 FCT_RX_CTL_EN_(rx->channel_number), in lan743x_rx_close()
2872 DMAC_CMD_STOP_R_(rx->channel_number)); in lan743x_rx_close()
2873 lan743x_dmac_rx_wait_till_stopped(adapter, rx->channel_number); in lan743x_rx_close()
2876 DMAC_INT_BIT_RXFRM_(rx->channel_number)); in lan743x_rx_close()
2878 INT_BIT_DMA_RX_(rx->channel_number)); in lan743x_rx_close()
2879 napi_disable(&rx->napi); in lan743x_rx_close()
2881 netif_napi_del(&rx->napi); in lan743x_rx_close()
2883 lan743x_rx_ring_cleanup(rx); in lan743x_rx_close()
2886 static int lan743x_rx_open(struct lan743x_rx *rx) in lan743x_rx_open() argument
2888 struct lan743x_adapter *adapter = rx->adapter; in lan743x_rx_open()
2892 rx->frame_count = 0; in lan743x_rx_open()
2893 ret = lan743x_rx_ring_init(rx); in lan743x_rx_open()
2897 netif_napi_add(adapter->netdev, &rx->napi, lan743x_rx_napi_poll); in lan743x_rx_open()
2900 DMAC_CMD_RX_SWR_(rx->channel_number)); in lan743x_rx_open()
2902 DMAC_CMD_RX_SWR_(rx->channel_number), in lan743x_rx_open()
2907 RX_BASE_ADDRH(rx->channel_number), in lan743x_rx_open()
2908 DMA_ADDR_HIGH32(rx->ring_dma_ptr)); in lan743x_rx_open()
2910 RX_BASE_ADDRL(rx->channel_number), in lan743x_rx_open()
2911 DMA_ADDR_LOW32(rx->ring_dma_ptr)); in lan743x_rx_open()
2913 /* set rx write back address */ in lan743x_rx_open()
2915 RX_HEAD_WRITEBACK_ADDRH(rx->channel_number), in lan743x_rx_open()
2916 DMA_ADDR_HIGH32(rx->head_dma_ptr)); in lan743x_rx_open()
2918 RX_HEAD_WRITEBACK_ADDRL(rx->channel_number), in lan743x_rx_open()
2919 DMA_ADDR_LOW32(rx->head_dma_ptr)); in lan743x_rx_open()
2921 if (!(adapter->csr.flags & LAN743X_CSR_FLAG_IS_A0)) { in lan743x_rx_open()
2930 RX_CFG_A(rx->channel_number), data); in lan743x_rx_open()
2933 data = lan743x_csr_read(adapter, RX_CFG_B(rx->channel_number)); in lan743x_rx_open()
2940 data |= ((rx->ring_size) & RX_CFG_B_RX_RING_LEN_MASK_); in lan743x_rx_open()
2942 if (!(adapter->csr.flags & LAN743X_CSR_FLAG_IS_A0)) in lan743x_rx_open()
2945 lan743x_csr_write(adapter, RX_CFG_B(rx->channel_number), data); in lan743x_rx_open()
2946 rx->vector_flags = lan743x_intr_get_vector_flags(adapter, in lan743x_rx_open()
2948 (rx->channel_number)); in lan743x_rx_open()
2952 if (rx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_ENABLE_AUTO_CLEAR) in lan743x_rx_open()
2954 if (rx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_STATUS_AUTO_CLEAR) in lan743x_rx_open()
2956 if (rx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_STATUS_R2C) in lan743x_rx_open()
2958 if (rx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_ENABLE_R2C) in lan743x_rx_open()
2960 lan743x_csr_write(adapter, RX_CFG_C(rx->channel_number), data); in lan743x_rx_open()
2962 rx->last_tail = ((u32)(rx->ring_size - 1)); in lan743x_rx_open()
2963 lan743x_csr_write(adapter, RX_TAIL(rx->channel_number), in lan743x_rx_open()
2964 rx->last_tail); in lan743x_rx_open()
2965 rx->last_head = lan743x_csr_read(adapter, RX_HEAD(rx->channel_number)); in lan743x_rx_open()
2966 if (rx->last_head) { in lan743x_rx_open()
2967 ret = -EIO; in lan743x_rx_open()
2971 napi_enable(&rx->napi); in lan743x_rx_open()
2974 INT_BIT_DMA_RX_(rx->channel_number)); in lan743x_rx_open()
2976 DMAC_INT_BIT_RXFRM_(rx->channel_number)); in lan743x_rx_open()
2978 DMAC_INT_BIT_RXFRM_(rx->channel_number)); in lan743x_rx_open()
2980 DMAC_CMD_START_R_(rx->channel_number)); in lan743x_rx_open()
2984 FCT_RX_CTL_RESET_(rx->channel_number)); in lan743x_rx_open()
2986 FCT_RX_CTL_RESET_(rx->channel_number), in lan743x_rx_open()
2988 lan743x_csr_write(adapter, FCT_FLOW(rx->channel_number), in lan743x_rx_open()
2995 FCT_RX_CTL_EN_(rx->channel_number)); in lan743x_rx_open()
2999 netif_napi_del(&rx->napi); in lan743x_rx_open()
3000 lan743x_rx_ring_cleanup(rx); in lan743x_rx_open()
3011 for (index = 0; index < adapter->used_tx_channels; index++) in lan743x_netdev_close()
3012 lan743x_tx_close(&adapter->tx[index]); in lan743x_netdev_close()
3015 lan743x_rx_close(&adapter->rx[index]); in lan743x_netdev_close()
3053 ret = lan743x_rx_open(&adapter->rx[index]); in lan743x_netdev_open()
3058 for (index = 0; index < adapter->used_tx_channels; index++) { in lan743x_netdev_open()
3059 ret = lan743x_tx_open(&adapter->tx[index]); in lan743x_netdev_open()
3066 for (index = 0; index < adapter->used_tx_channels; index++) { in lan743x_netdev_open()
3067 if (adapter->tx[index].ring_cpu_ptr) in lan743x_netdev_open()
3068 lan743x_tx_close(&adapter->tx[index]); in lan743x_netdev_open()
3073 if (adapter->rx[index].ring_cpu_ptr) in lan743x_netdev_open()
3074 lan743x_rx_close(&adapter->rx[index]); in lan743x_netdev_open()
3088 netif_warn(adapter, ifup, adapter->netdev, in lan743x_netdev_open()
3099 if (adapter->is_pci11x1x) in lan743x_netdev_xmit_frame()
3100 ch = skb->queue_mapping % PCI11X1X_USED_TX_CHANNELS; in lan743x_netdev_xmit_frame()
3102 return lan743x_tx_xmit_frame(&adapter->tx[ch], skb); in lan743x_netdev_xmit_frame()
3109 return -EINVAL; in lan743x_netdev_ioctl()
3112 return phy_mii_ioctl(netdev->phydev, ifr, cmd); in lan743x_netdev_ioctl()
3129 netdev->mtu = new_mtu; in lan743x_netdev_change_mtu()
3138 stats->rx_packets = lan743x_csr_read(adapter, STAT_RX_TOTAL_FRAMES); in lan743x_netdev_get_stats64()
3139 stats->tx_packets = lan743x_csr_read(adapter, STAT_TX_TOTAL_FRAMES); in lan743x_netdev_get_stats64()
3140 stats->rx_bytes = lan743x_csr_read(adapter, in lan743x_netdev_get_stats64()
3146 stats->tx_bytes = lan743x_csr_read(adapter, in lan743x_netdev_get_stats64()
3152 stats->rx_errors = lan743x_csr_read(adapter, STAT_RX_FCS_ERRORS) + in lan743x_netdev_get_stats64()
3160 stats->tx_errors = lan743x_csr_read(adapter, STAT_TX_FCS_ERRORS) + in lan743x_netdev_get_stats64()
3164 stats->rx_dropped = lan743x_csr_read(adapter, in lan743x_netdev_get_stats64()
3166 stats->tx_dropped = lan743x_csr_read(adapter, in lan743x_netdev_get_stats64()
3168 stats->multicast = lan743x_csr_read(adapter, in lan743x_netdev_get_stats64()
3172 stats->collisions = lan743x_csr_read(adapter, in lan743x_netdev_get_stats64()
3190 eth_hw_addr_set(netdev, sock_addr->sa_data); in lan743x_netdev_set_mac_address()
3191 lan743x_mac_set_address(adapter, sock_addr->sa_data); in lan743x_netdev_set_mac_address()
3214 mdiobus_unregister(adapter->mdiobus); in lan743x_mdiobus_cleanup()
3219 unregister_netdev(adapter->netdev); in lan743x_full_cleanup()
3229 struct lan743x_tx *tx; in lan743x_hardware_init() local
3233 adapter->is_pci11x1x = is_pci11x1x_chip(adapter); in lan743x_hardware_init()
3234 if (adapter->is_pci11x1x) { in lan743x_hardware_init()
3235 adapter->max_tx_channels = PCI11X1X_MAX_TX_CHANNELS; in lan743x_hardware_init()
3236 adapter->used_tx_channels = PCI11X1X_USED_TX_CHANNELS; in lan743x_hardware_init()
3237 adapter->max_vector_count = PCI11X1X_MAX_VECTOR_COUNT; in lan743x_hardware_init()
3239 spin_lock_init(&adapter->eth_syslock_spinlock); in lan743x_hardware_init()
3240 mutex_init(&adapter->sgmii_rw_lock); in lan743x_hardware_init()
3242 adapter->max_tx_channels = LAN743X_MAX_TX_CHANNELS; in lan743x_hardware_init()
3243 adapter->used_tx_channels = LAN743X_USED_TX_CHANNELS; in lan743x_hardware_init()
3244 adapter->max_vector_count = LAN743X_MAX_VECTOR_COUNT; in lan743x_hardware_init()
3247 adapter->intr.irq = adapter->pdev->irq; in lan743x_hardware_init()
3273 adapter->rx[index].adapter = adapter; in lan743x_hardware_init()
3274 adapter->rx[index].channel_number = index; in lan743x_hardware_init()
3277 for (index = 0; index < adapter->used_tx_channels; index++) { in lan743x_hardware_init()
3278 tx = &adapter->tx[index]; in lan743x_hardware_init()
3279 tx->adapter = adapter; in lan743x_hardware_init()
3280 tx->channel_number = index; in lan743x_hardware_init()
3281 spin_lock_init(&tx->ring_lock); in lan743x_hardware_init()
3292 adapter->mdiobus = devm_mdiobus_alloc(&adapter->pdev->dev); in lan743x_mdiobus_init()
3293 if (!(adapter->mdiobus)) { in lan743x_mdiobus_init()
3294 ret = -ENOMEM; in lan743x_mdiobus_init()
3298 adapter->mdiobus->priv = (void *)adapter; in lan743x_mdiobus_init()
3299 if (adapter->is_pci11x1x) { in lan743x_mdiobus_init()
3300 if (adapter->is_sgmii_en) { in lan743x_mdiobus_init()
3305 netif_dbg(adapter, drv, adapter->netdev, in lan743x_mdiobus_init()
3307 adapter->mdiobus->read = lan743x_mdiobus_read_c22; in lan743x_mdiobus_init()
3308 adapter->mdiobus->write = lan743x_mdiobus_write_c22; in lan743x_mdiobus_init()
3309 adapter->mdiobus->read_c45 = lan743x_mdiobus_read_c45; in lan743x_mdiobus_init()
3310 adapter->mdiobus->write_c45 = lan743x_mdiobus_write_c45; in lan743x_mdiobus_init()
3311 adapter->mdiobus->name = "lan743x-mdiobus-c45"; in lan743x_mdiobus_init()
3312 netif_dbg(adapter, drv, adapter->netdev, in lan743x_mdiobus_init()
3313 "lan743x-mdiobus-c45\n"); in lan743x_mdiobus_init()
3319 netif_dbg(adapter, drv, adapter->netdev, in lan743x_mdiobus_init()
3322 adapter->mdiobus->read = lan743x_mdiobus_read_c22; in lan743x_mdiobus_init()
3323 adapter->mdiobus->write = lan743x_mdiobus_write_c22; in lan743x_mdiobus_init()
3324 adapter->mdiobus->name = "lan743x-mdiobus"; in lan743x_mdiobus_init()
3325 netif_dbg(adapter, drv, adapter->netdev, in lan743x_mdiobus_init()
3326 "lan743x-mdiobus\n"); in lan743x_mdiobus_init()
3329 adapter->mdiobus->read = lan743x_mdiobus_read_c22; in lan743x_mdiobus_init()
3330 adapter->mdiobus->write = lan743x_mdiobus_write_c22; in lan743x_mdiobus_init()
3331 adapter->mdiobus->name = "lan743x-mdiobus"; in lan743x_mdiobus_init()
3332 netif_dbg(adapter, drv, adapter->netdev, "lan743x-mdiobus\n"); in lan743x_mdiobus_init()
3335 snprintf(adapter->mdiobus->id, MII_BUS_ID_SIZE, in lan743x_mdiobus_init()
3336 "pci-%s", pci_name(adapter->pdev)); in lan743x_mdiobus_init()
3338 if ((adapter->csr.id_rev & ID_REV_ID_MASK_) == ID_REV_ID_LAN7430_) in lan743x_mdiobus_init()
3340 adapter->mdiobus->phy_mask = ~(u32)BIT(1); in lan743x_mdiobus_init()
3343 ret = mdiobus_register(adapter->mdiobus); in lan743x_mdiobus_init()
3352 /* lan743x_pcidev_probe - Device Initialization Routine
3367 int ret = -ENODEV; in lan743x_pcidev_probe()
3369 if (id->device == PCI_DEVICE_ID_SMSC_A011 || in lan743x_pcidev_probe()
3370 id->device == PCI_DEVICE_ID_SMSC_A041) { in lan743x_pcidev_probe()
3371 netdev = devm_alloc_etherdev_mqs(&pdev->dev, in lan743x_pcidev_probe()
3376 netdev = devm_alloc_etherdev_mqs(&pdev->dev, in lan743x_pcidev_probe()
3385 SET_NETDEV_DEV(netdev, &pdev->dev); in lan743x_pcidev_probe()
3388 adapter->netdev = netdev; in lan743x_pcidev_probe()
3389 adapter->msg_enable = NETIF_MSG_DRV | NETIF_MSG_PROBE | in lan743x_pcidev_probe()
3392 netdev->max_mtu = LAN743X_MAX_FRAME_SIZE; in lan743x_pcidev_probe()
3394 of_get_mac_address(pdev->dev.of_node, adapter->mac_address); in lan743x_pcidev_probe()
3412 adapter->netdev->netdev_ops = &lan743x_netdev_ops; in lan743x_pcidev_probe()
3413 adapter->netdev->ethtool_ops = &lan743x_ethtool_ops; in lan743x_pcidev_probe()
3414 adapter->netdev->features = NETIF_F_SG | NETIF_F_TSO | in lan743x_pcidev_probe()
3416 adapter->netdev->hw_features = adapter->netdev->features; in lan743x_pcidev_probe()
3421 ret = register_netdev(adapter->netdev); in lan743x_pcidev_probe()
3441 * lan743x_pcidev_remove - Device Removal Routine
3446 * Hot-Plug event, or because the driver is going to be removed from
3466 * For instance, it is true when system goes to sleep by pm-suspend in lan743x_pcidev_shutdown()
3516 if (adapter->wolopts & WAKE_PHY) { in lan743x_pm_set_wol()
3520 if (adapter->wolopts & WAKE_MAGIC) { in lan743x_pm_set_wol()
3525 if (adapter->wolopts & WAKE_UCAST) { in lan743x_pm_set_wol()
3531 if (adapter->wolopts & WAKE_BCAST) { in lan743x_pm_set_wol()
3537 if (adapter->wolopts & WAKE_MCAST) { in lan743x_pm_set_wol()
3567 if (adapter->wolopts & WAKE_ARP) { in lan743x_pm_set_wol()
3588 if (adapter->wolopts & WAKE_MAGICSECURE) { in lan743x_pm_set_wol()
3589 sopass = *(u32 *)adapter->sopass; in lan743x_pm_set_wol()
3591 sopass = *(u16 *)&adapter->sopass[4]; in lan743x_pm_set_wol()
3615 if (adapter->wolopts) in lan743x_pm_suspend()
3618 if (adapter->is_pci11x1x) { in lan743x_pm_suspend()
3621 adapter->hw_cfg = data; in lan743x_pm_suspend()
3646 if (adapter->is_pci11x1x) in lan743x_pm_resume()
3647 lan743x_csr_write(adapter, HW_CFG, adapter->hw_cfg); in lan743x_pm_resume()
3651 netif_err(adapter, probe, adapter->netdev, in lan743x_pm_resume()
3658 * For instance, it is true when system wakesup after pm-suspend in lan743x_pm_resume()
3666 netif_info(adapter, drv, adapter->netdev, in lan743x_pm_resume()