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

1 /* SPDX-License-Identifier: GPL-2.0+ */
41 netif_err(adapter, drv, adapter->netdev, in pci11x1x_strap_get_status()
54 adapter->is_sgmii_en = true; in pci11x1x_strap_get_status()
56 adapter->is_sgmii_en = false; in pci11x1x_strap_get_status()
61 adapter->is_sgmii_en = true; in pci11x1x_strap_get_status()
63 adapter->is_sgmii_en = false; in pci11x1x_strap_get_status()
65 adapter->is_sgmii_en = false; in pci11x1x_strap_get_status()
68 netif_dbg(adapter, drv, adapter->netdev, in pci11x1x_strap_get_status()
69 "SGMII I/F %sable\n", adapter->is_sgmii_en ? "En" : "Dis"); in pci11x1x_strap_get_status()
74 struct lan743x_csr *csr = &adapter->csr; in is_pci11x1x_chip()
75 u32 id_rev = csr->id_rev; in is_pci11x1x_chip()
86 pci_release_selected_regions(adapter->pdev, in lan743x_pci_cleanup()
87 pci_select_bars(adapter->pdev, in lan743x_pci_cleanup()
89 pci_disable_device(adapter->pdev); in lan743x_pci_cleanup()
98 adapter->pdev = pdev; in lan743x_pci_init()
103 netif_info(adapter, probe, adapter->netdev, in lan743x_pci_init()
105 pdev->vendor, pdev->device); in lan743x_pci_init()
118 pci_disable_device(adapter->pdev); in lan743x_pci_init()
126 return ioread32(&adapter->csr.csr_address[offset]); in lan743x_csr_read()
132 iowrite32(data, &adapter->csr.csr_address[offset]); in lan743x_csr_write()
175 struct lan743x_csr *csr = &adapter->csr; in lan743x_csr_init()
178 bar_start = pci_resource_start(adapter->pdev, 0); in lan743x_csr_init()
179 bar_length = pci_resource_len(adapter->pdev, 0); in lan743x_csr_init()
180 csr->csr_address = devm_ioremap(&adapter->pdev->dev, in lan743x_csr_init()
182 if (!csr->csr_address) in lan743x_csr_init()
183 return -ENOMEM; in lan743x_csr_init()
185 csr->id_rev = lan743x_csr_read(adapter, ID_REV); in lan743x_csr_init()
186 csr->fpga_rev = lan743x_csr_read(adapter, FPGA_REV); in lan743x_csr_init()
187 netif_info(adapter, probe, adapter->netdev, in lan743x_csr_init()
189 csr->id_rev, FPGA_REV_GET_MAJOR_(csr->fpga_rev), in lan743x_csr_init()
190 FPGA_REV_GET_MINOR_(csr->fpga_rev)); in lan743x_csr_init()
191 if (!ID_REV_IS_VALID_CHIP_ID_(csr->id_rev)) in lan743x_csr_init()
192 return -ENODEV; in lan743x_csr_init()
194 csr->flags = LAN743X_CSR_FLAG_SUPPORTS_INTR_AUTO_SET_CLR; in lan743x_csr_init()
195 switch (csr->id_rev & ID_REV_CHIP_REV_MASK_) { in lan743x_csr_init()
197 csr->flags |= LAN743X_CSR_FLAG_IS_A0; in lan743x_csr_init()
198 csr->flags &= ~LAN743X_CSR_FLAG_SUPPORTS_INTR_AUTO_SET_CLR; in lan743x_csr_init()
201 csr->flags |= LAN743X_CSR_FLAG_IS_B0; in lan743x_csr_init()
210 struct lan743x_intr *intr = &adapter->intr; in lan743x_intr_software_isr()
212 /* disable the interrupt to prevent repeated re-triggering */ in lan743x_intr_software_isr()
214 intr->software_isr_flag = true; in lan743x_intr_software_isr()
215 wake_up(&intr->software_isr_wq); in lan743x_intr_software_isr()
220 struct lan743x_tx *tx = context; in lan743x_tx_isr() local
221 struct lan743x_adapter *adapter = tx->adapter; in lan743x_tx_isr()
227 INT_BIT_DMA_TX_(tx->channel_number)); in lan743x_tx_isr()
230 if (int_sts & INT_BIT_DMA_TX_(tx->channel_number)) { in lan743x_tx_isr()
231 u32 ioc_bit = DMAC_INT_BIT_TX_IOC_(tx->channel_number); in lan743x_tx_isr()
248 napi_schedule(&tx->napi); in lan743x_tx_isr()
256 INT_BIT_DMA_TX_(tx->channel_number)); in lan743x_tx_isr()
261 struct lan743x_rx *rx = context; in lan743x_rx_isr() local
262 struct lan743x_adapter *adapter = rx->adapter; in lan743x_rx_isr()
267 INT_BIT_DMA_RX_(rx->channel_number)); in lan743x_rx_isr()
270 if (int_sts & INT_BIT_DMA_RX_(rx->channel_number)) { in lan743x_rx_isr()
271 u32 rx_frame_bit = DMAC_INT_BIT_RXFRM_(rx->channel_number); in lan743x_rx_isr()
288 napi_schedule(&rx->napi); in lan743x_rx_isr()
296 INT_BIT_DMA_RX_(rx->channel_number)); in lan743x_rx_isr()
311 lan743x_rx_isr(&adapter->rx[channel], in lan743x_intr_shared_isr()
318 for (channel = 0; channel < adapter->used_tx_channels; in lan743x_intr_shared_isr()
323 lan743x_tx_isr(&adapter->tx[channel], in lan743x_intr_shared_isr()
346 struct lan743x_adapter *adapter = vector->adapter; in lan743x_intr_entry_isr()
351 if (vector->flags & LAN743X_VECTOR_FLAG_SOURCE_STATUS_READ) { in lan743x_intr_entry_isr()
353 } else if (vector->flags & in lan743x_intr_entry_isr()
359 int_sts = vector->int_mask | INT_BIT_MAS_; in lan743x_intr_entry_isr()
365 if (vector->flags & LAN743X_VECTOR_FLAG_VECTOR_ENABLE_ISR_CLEAR) in lan743x_intr_entry_isr()
369 INT_VEC_EN_(vector->vector_index)); in lan743x_intr_entry_isr()
371 if (vector->flags & LAN743X_VECTOR_FLAG_MASTER_ENABLE_CLEAR) in lan743x_intr_entry_isr()
375 if (vector->flags & LAN743X_VECTOR_FLAG_SOURCE_ENABLE_CHECK) { in lan743x_intr_entry_isr()
379 int_enables = vector->int_mask; in lan743x_intr_entry_isr()
383 int_sts &= vector->int_mask; in lan743x_intr_entry_isr()
385 if (vector->handler) { in lan743x_intr_entry_isr()
386 vector->handler(vector->context, in lan743x_intr_entry_isr()
387 int_sts, vector->flags); in lan743x_intr_entry_isr()
391 vector->int_mask); in lan743x_intr_entry_isr()
396 if (vector->flags & LAN743X_VECTOR_FLAG_MASTER_ENABLE_SET) in lan743x_intr_entry_isr()
400 if (vector->flags & LAN743X_VECTOR_FLAG_VECTOR_ENABLE_ISR_SET) in lan743x_intr_entry_isr()
404 INT_VEC_EN_(vector->vector_index)); in lan743x_intr_entry_isr()
411 struct lan743x_intr *intr = &adapter->intr; in lan743x_intr_test_isr()
414 intr->software_isr_flag = false; in lan743x_intr_test_isr()
420 ret = wait_event_timeout(intr->software_isr_wq, in lan743x_intr_test_isr()
421 intr->software_isr_flag, in lan743x_intr_test_isr()
427 return ret > 0 ? 0 : -ENODEV; in lan743x_intr_test_isr()
436 struct lan743x_vector *vector = &adapter->intr.vector_list in lan743x_intr_register_isr()
440 vector->adapter = adapter; in lan743x_intr_register_isr()
441 vector->flags = flags; in lan743x_intr_register_isr()
442 vector->vector_index = vector_index; in lan743x_intr_register_isr()
443 vector->int_mask = int_mask; in lan743x_intr_register_isr()
444 vector->handler = handler; in lan743x_intr_register_isr()
445 vector->context = context; in lan743x_intr_register_isr()
447 ret = request_irq(vector->irq, in lan743x_intr_register_isr()
452 vector->handler = NULL; in lan743x_intr_register_isr()
453 vector->context = NULL; in lan743x_intr_register_isr()
454 vector->int_mask = 0; in lan743x_intr_register_isr()
455 vector->flags = 0; in lan743x_intr_register_isr()
463 struct lan743x_vector *vector = &adapter->intr.vector_list in lan743x_intr_unregister_isr()
466 free_irq(vector->irq, vector); in lan743x_intr_unregister_isr()
467 vector->handler = NULL; in lan743x_intr_unregister_isr()
468 vector->context = NULL; in lan743x_intr_unregister_isr()
469 vector->int_mask = 0; in lan743x_intr_unregister_isr()
470 vector->flags = 0; in lan743x_intr_unregister_isr()
478 for (index = 0; index < adapter->max_vector_count; index++) { in lan743x_intr_get_vector_flags()
479 if (adapter->intr.vector_list[index].int_mask & int_mask) in lan743x_intr_get_vector_flags()
480 return adapter->intr.vector_list[index].flags; in lan743x_intr_get_vector_flags()
487 struct lan743x_intr *intr = &adapter->intr; in lan743x_intr_close()
491 if (adapter->is_pci11x1x) in lan743x_intr_close()
496 for (index = 0; index < intr->number_of_vectors; index++) { in lan743x_intr_close()
497 if (intr->flags & INTR_FLAG_IRQ_REQUESTED(index)) { in lan743x_intr_close()
499 intr->flags &= ~INTR_FLAG_IRQ_REQUESTED(index); in lan743x_intr_close()
503 if (intr->flags & INTR_FLAG_MSI_ENABLED) { in lan743x_intr_close()
504 pci_disable_msi(adapter->pdev); in lan743x_intr_close()
505 intr->flags &= ~INTR_FLAG_MSI_ENABLED; in lan743x_intr_close()
508 if (intr->flags & INTR_FLAG_MSIX_ENABLED) { in lan743x_intr_close()
509 pci_disable_msix(adapter->pdev); in lan743x_intr_close()
510 intr->flags &= ~INTR_FLAG_MSIX_ENABLED; in lan743x_intr_close()
517 struct lan743x_intr *intr = &adapter->intr; in lan743x_intr_open()
523 int ret = -ENODEV; in lan743x_intr_open()
527 intr->number_of_vectors = 0; in lan743x_intr_open()
530 max_vector_count = adapter->max_vector_count; in lan743x_intr_open()
535 used_tx_channels = adapter->used_tx_channels; in lan743x_intr_open()
536 ret = pci_enable_msix_range(adapter->pdev, in lan743x_intr_open()
542 intr->flags |= INTR_FLAG_MSIX_ENABLED; in lan743x_intr_open()
543 intr->number_of_vectors = ret; in lan743x_intr_open()
544 intr->using_vectors = true; in lan743x_intr_open()
545 for (index = 0; index < intr->number_of_vectors; index++) in lan743x_intr_open()
546 intr->vector_list[index].irq = msix_entries in lan743x_intr_open()
548 netif_info(adapter, ifup, adapter->netdev, in lan743x_intr_open()
550 intr->number_of_vectors); in lan743x_intr_open()
554 if (!intr->number_of_vectors) { in lan743x_intr_open()
555 if (!(adapter->csr.flags & LAN743X_CSR_FLAG_IS_A0)) { in lan743x_intr_open()
556 if (!pci_enable_msi(adapter->pdev)) { in lan743x_intr_open()
557 intr->flags |= INTR_FLAG_MSI_ENABLED; in lan743x_intr_open()
558 intr->number_of_vectors = 1; in lan743x_intr_open()
559 intr->using_vectors = true; in lan743x_intr_open()
560 intr->vector_list[0].irq = in lan743x_intr_open()
561 adapter->pdev->irq; in lan743x_intr_open()
562 netif_info(adapter, ifup, adapter->netdev, in lan743x_intr_open()
564 intr->number_of_vectors); in lan743x_intr_open()
570 if (!intr->number_of_vectors) { in lan743x_intr_open()
571 intr->number_of_vectors = 1; in lan743x_intr_open()
572 intr->using_vectors = false; in lan743x_intr_open()
573 intr->vector_list[0].irq = intr->irq; in lan743x_intr_open()
574 netif_info(adapter, ifup, adapter->netdev, in lan743x_intr_open()
590 if (intr->using_vectors) { in lan743x_intr_open()
599 if (adapter->csr.flags & LAN743X_CSR_FLAG_SUPPORTS_INTR_AUTO_SET_CLR) { in lan743x_intr_open()
608 init_waitqueue_head(&intr->software_isr_wq); in lan743x_intr_open()
616 intr->flags |= INTR_FLAG_IRQ_REQUESTED(0); in lan743x_intr_open()
618 if (intr->using_vectors) in lan743x_intr_open()
622 if (!(adapter->csr.flags & LAN743X_CSR_FLAG_IS_A0)) { in lan743x_intr_open()
631 if (adapter->is_pci11x1x) { in lan743x_intr_open()
649 if (intr->number_of_vectors > 1) { in lan743x_intr_open()
650 int number_of_tx_vectors = intr->number_of_vectors - 1; in lan743x_intr_open()
661 if (adapter->csr.flags & in lan743x_intr_open()
673 /* map TX interrupt to vector */ in lan743x_intr_open()
677 /* Remove TX interrupt from shared mask */ in lan743x_intr_open()
678 intr->vector_list[0].int_mask &= ~int_bit; in lan743x_intr_open()
681 &adapter->tx[index]); in lan743x_intr_open()
684 intr->flags |= INTR_FLAG_IRQ_REQUESTED(vector); in lan743x_intr_open()
691 if ((intr->number_of_vectors - used_tx_channels) > 1) { in lan743x_intr_open()
692 int number_of_rx_vectors = intr->number_of_vectors - in lan743x_intr_open()
693 used_tx_channels - 1; in lan743x_intr_open()
705 if (adapter->csr.flags & in lan743x_intr_open()
717 /* map RX interrupt to vector */ in lan743x_intr_open()
727 /* Remove RX interrupt from shared mask */ in lan743x_intr_open()
728 intr->vector_list[0].int_mask &= ~int_bit; in lan743x_intr_open()
731 &adapter->rx[index]); in lan743x_intr_open()
734 intr->flags |= INTR_FLAG_IRQ_REQUESTED(vector); in lan743x_intr_open()
755 return -EIO; in lan743x_dp_write()
768 return -EIO; in lan743x_dp_write()
802 struct lan743x_adapter *adapter = bus->priv; in lan743x_mdiobus_read_c22()
825 struct lan743x_adapter *adapter = bus->priv; in lan743x_mdiobus_write_c22()
867 struct lan743x_adapter *adapter = bus->priv; in lan743x_mdiobus_read_c45()
900 struct lan743x_adapter *adapter = bus->priv; in lan743x_mdiobus_write_c45()
935 netif_err(adapter, drv, adapter->netdev, in lan743x_sgmii_wait_till_not_busy()
948 netif_err(adapter, probe, adapter->netdev, in lan743x_sgmii_read()
950 return -EINVAL; in lan743x_sgmii_read()
953 mutex_lock(&adapter->sgmii_rw_lock); in lan743x_sgmii_read()
966 mutex_unlock(&adapter->sgmii_rw_lock); in lan743x_sgmii_read()
978 netif_err(adapter, probe, adapter->netdev, in lan743x_sgmii_write()
980 return -EINVAL; in lan743x_sgmii_write()
982 mutex_lock(&adapter->sgmii_rw_lock); in lan743x_sgmii_write()
990 mutex_unlock(&adapter->sgmii_rw_lock); in lan743x_sgmii_write()
1065 enum lan743x_sgmii_lsd lsd = adapter->sgmii_lsd; in lan743x_sgmii_aneg_update()
1099 /* In order for Auto-Negotiation to operate properly at in lan743x_sgmii_aneg_update()
1145 return -ETIMEDOUT; in lan743x_pcs_seq_state()
1152 struct net_device *netdev = adapter->netdev; in lan743x_sgmii_config()
1153 struct phy_device *phydev = netdev->phydev; in lan743x_sgmii_config()
1159 switch (phydev->speed) { in lan743x_sgmii_config()
1161 if (phydev->master_slave_state == MASTER_SLAVE_STATE_MASTER) in lan743x_sgmii_config()
1167 if (phydev->master_slave_state == MASTER_SLAVE_STATE_MASTER) in lan743x_sgmii_config()
1173 if (phydev->duplex) in lan743x_sgmii_config()
1179 if (phydev->duplex) in lan743x_sgmii_config()
1185 netif_err(adapter, drv, adapter->netdev, in lan743x_sgmii_config()
1186 "Invalid speed %d\n", phydev->speed); in lan743x_sgmii_config()
1187 return -EINVAL; in lan743x_sgmii_config()
1190 adapter->sgmii_lsd = lsd; in lan743x_sgmii_config()
1193 netif_err(adapter, drv, adapter->netdev, in lan743x_sgmii_config()
1200 netif_err(adapter, drv, adapter->netdev, in lan743x_sgmii_config()
1206 netif_dbg(adapter, drv, adapter->netdev, in lan743x_sgmii_config()
1209 netif_dbg(adapter, drv, adapter->netdev, in lan743x_sgmii_config()
1212 /* SGMII/1000/2500BASE-X PCS power down */ in lan743x_sgmii_config()
1226 /* SGMII/1000/2500BASE-X PCS power up */ in lan743x_sgmii_config()
1253 ether_addr_copy(adapter->mac_address, addr); in lan743x_mac_set_address()
1254 netif_info(adapter, drv, adapter->netdev, in lan743x_mac_set_address()
1266 netdev = adapter->netdev; in lan743x_mac_init()
1274 if (!is_valid_ether_addr(adapter->mac_address)) { in lan743x_mac_init()
1277 adapter->mac_address[0] = mac_addr_lo & 0xFF; in lan743x_mac_init()
1278 adapter->mac_address[1] = (mac_addr_lo >> 8) & 0xFF; in lan743x_mac_init()
1279 adapter->mac_address[2] = (mac_addr_lo >> 16) & 0xFF; in lan743x_mac_init()
1280 adapter->mac_address[3] = (mac_addr_lo >> 24) & 0xFF; in lan743x_mac_init()
1281 adapter->mac_address[4] = mac_addr_hi & 0xFF; in lan743x_mac_init()
1282 adapter->mac_address[5] = (mac_addr_hi >> 8) & 0xFF; in lan743x_mac_init()
1287 } else if (!is_valid_ether_addr(adapter->mac_address)) { in lan743x_mac_init()
1292 eth_random_addr(adapter->mac_address); in lan743x_mac_init()
1294 lan743x_mac_set_address(adapter, adapter->mac_address); in lan743x_mac_init()
1295 eth_hw_addr_set(netdev, adapter->mac_address); in lan743x_mac_init()
1395 struct lan743x_phy *phy = &adapter->phy; in lan743x_phy_update_flowcontrol()
1398 if (phy->fc_autoneg) in lan743x_phy_update_flowcontrol()
1401 cap = phy->fc_request_control; in lan743x_phy_update_flowcontrol()
1416 struct phy_device *phydev = netdev->phydev; in lan743x_phy_link_status_change()
1420 if (phydev->state == PHY_RUNNING) { in lan743x_phy_link_status_change()
1427 if (phydev->duplex) in lan743x_phy_link_status_change()
1433 switch (phydev->speed) { in lan743x_phy_link_status_change()
1454 linkmode_adv_to_mii_adv_t(phydev->advertising); in lan743x_phy_link_status_change()
1456 linkmode_adv_to_mii_adv_t(phydev->lp_advertising); in lan743x_phy_link_status_change()
1460 lan743x_ptp_update_latency(adapter, phydev->speed); in lan743x_phy_link_status_change()
1461 if (phydev->interface == PHY_INTERFACE_MODE_SGMII || in lan743x_phy_link_status_change()
1462 phydev->interface == PHY_INTERFACE_MODE_1000BASEX || in lan743x_phy_link_status_change()
1463 phydev->interface == PHY_INTERFACE_MODE_2500BASEX) in lan743x_phy_link_status_change()
1470 struct net_device *netdev = adapter->netdev; in lan743x_phy_close()
1472 phy_stop(netdev->phydev); in lan743x_phy_close()
1473 phy_disconnect(netdev->phydev); in lan743x_phy_close()
1482 id_rev = adapter->csr.id_rev & ID_REV_ID_MASK_; in lan743x_phy_interface_select()
1484 if (adapter->is_pci11x1x && adapter->is_sgmii_en) in lan743x_phy_interface_select()
1485 adapter->phy_interface = PHY_INTERFACE_MODE_SGMII; in lan743x_phy_interface_select()
1487 adapter->phy_interface = PHY_INTERFACE_MODE_GMII; in lan743x_phy_interface_select()
1489 adapter->phy_interface = PHY_INTERFACE_MODE_MII; in lan743x_phy_interface_select()
1491 adapter->phy_interface = PHY_INTERFACE_MODE_RGMII; in lan743x_phy_interface_select()
1496 struct net_device *netdev = adapter->netdev; in lan743x_phy_open()
1497 struct lan743x_phy *phy = &adapter->phy; in lan743x_phy_open()
1504 int ret = -EIO; in lan743x_phy_open()
1507 phydev = of_phy_get_and_connect(netdev, adapter->pdev->dev.of_node, in lan743x_phy_open()
1512 phydev = phy_find_first(adapter->mdiobus); in lan743x_phy_open()
1514 if ((adapter->csr.id_rev & ID_REV_ID_MASK_) == in lan743x_phy_open()
1531 adapter->phy_interface); in lan743x_phy_open()
1541 phy->fc_request_control = (FLOW_CTRL_RX | FLOW_CTRL_TX); in lan743x_phy_open()
1542 phy->fc_autoneg = phydev->autoneg; in lan743x_phy_open()
1578 mac_addr = adapter->mac_address; in lan743x_rfe_update_mac_address()
1593 struct net_device *netdev = adapter->netdev; in lan743x_rfe_set_multicast()
1602 if (netdev->flags & IFF_PROMISC) { in lan743x_rfe_set_multicast()
1605 if (netdev->flags & IFF_ALLMULTI) in lan743x_rfe_set_multicast()
1609 if (netdev->features & NETIF_F_RXCSUM) in lan743x_rfe_set_multicast()
1624 data = ha->addr[3]; in lan743x_rfe_set_multicast()
1625 data = ha->addr[2] | (data << 8); in lan743x_rfe_set_multicast()
1626 data = ha->addr[1] | (data << 8); in lan743x_rfe_set_multicast()
1627 data = ha->addr[0] | (data << 8); in lan743x_rfe_set_multicast()
1630 data = ha->addr[5]; in lan743x_rfe_set_multicast()
1631 data = ha->addr[4] | (data << 8); in lan743x_rfe_set_multicast()
1636 u32 bitnum = (ether_crc(ETH_ALEN, ha->addr) >> in lan743x_rfe_set_multicast()
1672 return -EPERM; in lan743x_dmac_init()
1674 if (!(adapter->csr.flags & LAN743X_CSR_FLAG_IS_A0)) in lan743x_dmac_init()
1715 timeout--; in lan743x_dmac_tx_wait_till_stopped()
1718 result = -ENODEV; in lan743x_dmac_tx_wait_till_stopped()
1744 timeout--; in lan743x_dmac_rx_wait_till_stopped()
1747 result = -ENODEV; in lan743x_dmac_rx_wait_till_stopped()
1751 static void lan743x_tx_release_desc(struct lan743x_tx *tx, in lan743x_tx_release_desc() argument
1759 descriptor = &tx->ring_cpu_ptr[descriptor_index]; in lan743x_tx_release_desc()
1760 buffer_info = &tx->buffer_info[descriptor_index]; in lan743x_tx_release_desc()
1761 if (!(buffer_info->flags & TX_BUFFER_INFO_FLAG_ACTIVE)) in lan743x_tx_release_desc()
1764 descriptor_type = le32_to_cpu(descriptor->data0) & in lan743x_tx_release_desc()
1772 if (buffer_info->dma_ptr) { in lan743x_tx_release_desc()
1773 if (buffer_info->flags & in lan743x_tx_release_desc()
1775 dma_unmap_page(&tx->adapter->pdev->dev, in lan743x_tx_release_desc()
1776 buffer_info->dma_ptr, in lan743x_tx_release_desc()
1777 buffer_info->buffer_length, in lan743x_tx_release_desc()
1780 dma_unmap_single(&tx->adapter->pdev->dev, in lan743x_tx_release_desc()
1781 buffer_info->dma_ptr, in lan743x_tx_release_desc()
1782 buffer_info->buffer_length, in lan743x_tx_release_desc()
1785 buffer_info->dma_ptr = 0; in lan743x_tx_release_desc()
1786 buffer_info->buffer_length = 0; in lan743x_tx_release_desc()
1788 if (!buffer_info->skb) in lan743x_tx_release_desc()
1791 if (!(buffer_info->flags & TX_BUFFER_INFO_FLAG_TIMESTAMP_REQUESTED)) { in lan743x_tx_release_desc()
1792 dev_kfree_skb_any(buffer_info->skb); in lan743x_tx_release_desc()
1797 lan743x_ptp_unrequest_tx_timestamp(tx->adapter); in lan743x_tx_release_desc()
1798 dev_kfree_skb_any(buffer_info->skb); in lan743x_tx_release_desc()
1800 ignore_sync = (buffer_info->flags & in lan743x_tx_release_desc()
1802 lan743x_ptp_tx_timestamp_skb(tx->adapter, in lan743x_tx_release_desc()
1803 buffer_info->skb, ignore_sync); in lan743x_tx_release_desc()
1807 buffer_info->skb = NULL; in lan743x_tx_release_desc()
1810 buffer_info->flags &= ~TX_BUFFER_INFO_FLAG_ACTIVE; in lan743x_tx_release_desc()
1817 static int lan743x_tx_next_index(struct lan743x_tx *tx, int index) in lan743x_tx_next_index() argument
1819 return ((++index) % tx->ring_size); in lan743x_tx_next_index()
1822 static void lan743x_tx_release_completed_descriptors(struct lan743x_tx *tx) in lan743x_tx_release_completed_descriptors() argument
1824 while (le32_to_cpu(*tx->head_cpu_ptr) != (tx->last_head)) { in lan743x_tx_release_completed_descriptors()
1825 lan743x_tx_release_desc(tx, tx->last_head, false); in lan743x_tx_release_completed_descriptors()
1826 tx->last_head = lan743x_tx_next_index(tx, tx->last_head); in lan743x_tx_release_completed_descriptors()
1830 static void lan743x_tx_release_all_descriptors(struct lan743x_tx *tx) in lan743x_tx_release_all_descriptors() argument
1834 original_head = tx->last_head; in lan743x_tx_release_all_descriptors()
1836 lan743x_tx_release_desc(tx, tx->last_head, true); in lan743x_tx_release_all_descriptors()
1837 tx->last_head = lan743x_tx_next_index(tx, tx->last_head); in lan743x_tx_release_all_descriptors()
1838 } while (tx->last_head != original_head); in lan743x_tx_release_all_descriptors()
1839 memset(tx->ring_cpu_ptr, 0, in lan743x_tx_release_all_descriptors()
1840 sizeof(*tx->ring_cpu_ptr) * (tx->ring_size)); in lan743x_tx_release_all_descriptors()
1841 memset(tx->buffer_info, 0, in lan743x_tx_release_all_descriptors()
1842 sizeof(*tx->buffer_info) * (tx->ring_size)); in lan743x_tx_release_all_descriptors()
1845 static int lan743x_tx_get_desc_cnt(struct lan743x_tx *tx, in lan743x_tx_get_desc_cnt() argument
1853 nr_frags = skb_shinfo(skb)->nr_frags; in lan743x_tx_get_desc_cnt()
1858 static int lan743x_tx_get_avail_desc(struct lan743x_tx *tx) in lan743x_tx_get_avail_desc() argument
1860 int last_head = tx->last_head; in lan743x_tx_get_avail_desc()
1861 int last_tail = tx->last_tail; in lan743x_tx_get_avail_desc()
1864 return tx->ring_size - last_tail + last_head - 1; in lan743x_tx_get_avail_desc()
1866 return last_head - last_tail - 1; in lan743x_tx_get_avail_desc()
1869 void lan743x_tx_set_timestamping_mode(struct lan743x_tx *tx, in lan743x_tx_set_timestamping_mode() argument
1874 tx->ts_flags |= TX_TS_FLAG_TIMESTAMPING_ENABLED; in lan743x_tx_set_timestamping_mode()
1876 tx->ts_flags &= ~TX_TS_FLAG_TIMESTAMPING_ENABLED; in lan743x_tx_set_timestamping_mode()
1878 tx->ts_flags |= TX_TS_FLAG_ONE_STEP_SYNC; in lan743x_tx_set_timestamping_mode()
1880 tx->ts_flags &= ~TX_TS_FLAG_ONE_STEP_SYNC; in lan743x_tx_set_timestamping_mode()
1883 static int lan743x_tx_frame_start(struct lan743x_tx *tx, in lan743x_tx_frame_start() argument
1891 * assuming tx->ring_lock has already been acquired. in lan743x_tx_frame_start()
1895 struct lan743x_adapter *adapter = tx->adapter; in lan743x_tx_frame_start()
1896 struct device *dev = &adapter->pdev->dev; in lan743x_tx_frame_start()
1899 tx->frame_flags |= TX_FRAME_FLAG_IN_PROGRESS; in lan743x_tx_frame_start()
1900 tx->frame_first = tx->last_tail; in lan743x_tx_frame_start()
1901 tx->frame_tail = tx->frame_first; in lan743x_tx_frame_start()
1903 tx_descriptor = &tx->ring_cpu_ptr[tx->frame_tail]; in lan743x_tx_frame_start()
1904 buffer_info = &tx->buffer_info[tx->frame_tail]; in lan743x_tx_frame_start()
1908 return -ENOMEM; in lan743x_tx_frame_start()
1910 tx_descriptor->data1 = cpu_to_le32(DMA_ADDR_LOW32(dma_ptr)); in lan743x_tx_frame_start()
1911 tx_descriptor->data2 = cpu_to_le32(DMA_ADDR_HIGH32(dma_ptr)); in lan743x_tx_frame_start()
1912 tx_descriptor->data3 = cpu_to_le32((frame_length << 16) & in lan743x_tx_frame_start()
1915 buffer_info->skb = NULL; in lan743x_tx_frame_start()
1916 buffer_info->dma_ptr = dma_ptr; in lan743x_tx_frame_start()
1917 buffer_info->buffer_length = first_buffer_length; in lan743x_tx_frame_start()
1918 buffer_info->flags |= TX_BUFFER_INFO_FLAG_ACTIVE; in lan743x_tx_frame_start()
1920 tx->frame_data0 = (first_buffer_length & in lan743x_tx_frame_start()
1926 tx->frame_data0 |= TX_DESC_DATA0_TSE_; in lan743x_tx_frame_start()
1929 tx->frame_data0 |= TX_DESC_DATA0_ICE_ | in lan743x_tx_frame_start()
1937 static void lan743x_tx_frame_add_lso(struct lan743x_tx *tx, in lan743x_tx_frame_add_lso() argument
1942 * assuming tx->ring_lock has already been acquired. in lan743x_tx_frame_add_lso()
1948 tx->frame_data0 |= TX_DESC_DATA0_EXT_; in lan743x_tx_frame_add_lso()
1950 tx->frame_data0 |= TX_DESC_DATA0_LS_; in lan743x_tx_frame_add_lso()
1951 tx->frame_data0 |= TX_DESC_DATA0_IOC_; in lan743x_tx_frame_add_lso()
1952 tx->frame_last = tx->frame_first; in lan743x_tx_frame_add_lso()
1954 tx_descriptor = &tx->ring_cpu_ptr[tx->frame_tail]; in lan743x_tx_frame_add_lso()
1955 tx_descriptor->data0 = cpu_to_le32(tx->frame_data0); in lan743x_tx_frame_add_lso()
1958 tx->frame_tail = lan743x_tx_next_index(tx, tx->frame_tail); in lan743x_tx_frame_add_lso()
1959 tx_descriptor = &tx->ring_cpu_ptr[tx->frame_tail]; in lan743x_tx_frame_add_lso()
1960 buffer_info = &tx->buffer_info[tx->frame_tail]; in lan743x_tx_frame_add_lso()
1963 tx_descriptor->data1 = 0; in lan743x_tx_frame_add_lso()
1964 tx_descriptor->data2 = 0; in lan743x_tx_frame_add_lso()
1965 tx_descriptor->data3 = 0; in lan743x_tx_frame_add_lso()
1967 buffer_info->skb = NULL; in lan743x_tx_frame_add_lso()
1968 buffer_info->dma_ptr = 0; in lan743x_tx_frame_add_lso()
1969 buffer_info->buffer_length = 0; in lan743x_tx_frame_add_lso()
1970 buffer_info->flags |= TX_BUFFER_INFO_FLAG_ACTIVE; in lan743x_tx_frame_add_lso()
1972 tx->frame_data0 = (frame_length & TX_DESC_DATA0_EXT_PAY_LENGTH_MASK_) | in lan743x_tx_frame_add_lso()
1979 static int lan743x_tx_frame_add_fragment(struct lan743x_tx *tx, in lan743x_tx_frame_add_fragment() argument
1984 * assuming tx->ring_lock has already been acquired in lan743x_tx_frame_add_fragment()
1988 struct lan743x_adapter *adapter = tx->adapter; in lan743x_tx_frame_add_fragment()
1989 struct device *dev = &adapter->pdev->dev; in lan743x_tx_frame_add_fragment()
1998 tx_descriptor = &tx->ring_cpu_ptr[tx->frame_tail]; in lan743x_tx_frame_add_fragment()
1999 tx_descriptor->data0 = cpu_to_le32(tx->frame_data0); in lan743x_tx_frame_add_fragment()
2002 tx->frame_tail = lan743x_tx_next_index(tx, tx->frame_tail); in lan743x_tx_frame_add_fragment()
2003 tx_descriptor = &tx->ring_cpu_ptr[tx->frame_tail]; in lan743x_tx_frame_add_fragment()
2004 buffer_info = &tx->buffer_info[tx->frame_tail]; in lan743x_tx_frame_add_fragment()
2012 desc_index = tx->frame_first; in lan743x_tx_frame_add_fragment()
2013 while (desc_index != tx->frame_tail) { in lan743x_tx_frame_add_fragment()
2014 lan743x_tx_release_desc(tx, desc_index, true); in lan743x_tx_frame_add_fragment()
2015 desc_index = lan743x_tx_next_index(tx, desc_index); in lan743x_tx_frame_add_fragment()
2018 tx->frame_flags &= ~TX_FRAME_FLAG_IN_PROGRESS; in lan743x_tx_frame_add_fragment()
2019 tx->frame_first = 0; in lan743x_tx_frame_add_fragment()
2020 tx->frame_data0 = 0; in lan743x_tx_frame_add_fragment()
2021 tx->frame_tail = 0; in lan743x_tx_frame_add_fragment()
2022 tx->frame_last = 0; in lan743x_tx_frame_add_fragment()
2023 return -ENOMEM; in lan743x_tx_frame_add_fragment()
2026 tx_descriptor->data1 = cpu_to_le32(DMA_ADDR_LOW32(dma_ptr)); in lan743x_tx_frame_add_fragment()
2027 tx_descriptor->data2 = cpu_to_le32(DMA_ADDR_HIGH32(dma_ptr)); in lan743x_tx_frame_add_fragment()
2028 tx_descriptor->data3 = cpu_to_le32((frame_length << 16) & in lan743x_tx_frame_add_fragment()
2031 buffer_info->skb = NULL; in lan743x_tx_frame_add_fragment()
2032 buffer_info->dma_ptr = dma_ptr; in lan743x_tx_frame_add_fragment()
2033 buffer_info->buffer_length = fragment_length; in lan743x_tx_frame_add_fragment()
2034 buffer_info->flags |= TX_BUFFER_INFO_FLAG_ACTIVE; in lan743x_tx_frame_add_fragment()
2035 buffer_info->flags |= TX_BUFFER_INFO_FLAG_SKB_FRAGMENT; in lan743x_tx_frame_add_fragment()
2037 tx->frame_data0 = (fragment_length & TX_DESC_DATA0_BUF_LENGTH_MASK_) | in lan743x_tx_frame_add_fragment()
2045 static void lan743x_tx_frame_end(struct lan743x_tx *tx, in lan743x_tx_frame_end() argument
2051 * assuming tx->ring_lock has already been acquired in lan743x_tx_frame_end()
2055 struct lan743x_adapter *adapter = tx->adapter; in lan743x_tx_frame_end()
2059 if ((tx->frame_data0 & TX_DESC_DATA0_DTYPE_MASK_) == in lan743x_tx_frame_end()
2061 tx->frame_data0 |= TX_DESC_DATA0_LS_; in lan743x_tx_frame_end()
2062 tx->frame_data0 |= TX_DESC_DATA0_IOC_; in lan743x_tx_frame_end()
2063 tx->frame_last = tx->frame_tail; in lan743x_tx_frame_end()
2066 tx_descriptor = &tx->ring_cpu_ptr[tx->frame_last]; in lan743x_tx_frame_end()
2067 buffer_info = &tx->buffer_info[tx->frame_last]; in lan743x_tx_frame_end()
2068 buffer_info->skb = skb; in lan743x_tx_frame_end()
2070 buffer_info->flags |= TX_BUFFER_INFO_FLAG_TIMESTAMP_REQUESTED; in lan743x_tx_frame_end()
2072 buffer_info->flags |= TX_BUFFER_INFO_FLAG_IGNORE_SYNC; in lan743x_tx_frame_end()
2074 tx_descriptor = &tx->ring_cpu_ptr[tx->frame_tail]; in lan743x_tx_frame_end()
2075 tx_descriptor->data0 = cpu_to_le32(tx->frame_data0); in lan743x_tx_frame_end()
2076 tx->frame_tail = lan743x_tx_next_index(tx, tx->frame_tail); in lan743x_tx_frame_end()
2077 tx->last_tail = tx->frame_tail; in lan743x_tx_frame_end()
2081 if (tx->vector_flags & LAN743X_VECTOR_FLAG_VECTOR_ENABLE_AUTO_SET) in lan743x_tx_frame_end()
2083 if (tx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_ENABLE_AUTO_SET) in lan743x_tx_frame_end()
2087 lan743x_csr_write(adapter, TX_TAIL(tx->channel_number), in lan743x_tx_frame_end()
2088 tx_tail_flags | tx->frame_tail); in lan743x_tx_frame_end()
2089 tx->frame_flags &= ~TX_FRAME_FLAG_IN_PROGRESS; in lan743x_tx_frame_end()
2092 static netdev_tx_t lan743x_tx_xmit_frame(struct lan743x_tx *tx, in lan743x_tx_xmit_frame() argument
2108 required_number_of_descriptors = lan743x_tx_get_desc_cnt(tx, skb); in lan743x_tx_xmit_frame()
2110 spin_lock_irqsave(&tx->ring_lock, irq_flags); in lan743x_tx_xmit_frame()
2112 lan743x_tx_get_avail_desc(tx)) { in lan743x_tx_xmit_frame()
2113 if (required_number_of_descriptors > (tx->ring_size - 1)) { in lan743x_tx_xmit_frame()
2117 tx->rqd_descriptors = required_number_of_descriptors; in lan743x_tx_xmit_frame()
2119 txq = netdev_get_tx_queue(tx->adapter->netdev, in lan743x_tx_xmit_frame()
2120 tx->channel_number); in lan743x_tx_xmit_frame()
2127 if ((skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP) && in lan743x_tx_xmit_frame()
2128 (tx->ts_flags & TX_TS_FLAG_TIMESTAMPING_ENABLED) && in lan743x_tx_xmit_frame()
2129 (lan743x_ptp_request_tx_timestamp(tx->adapter))) { in lan743x_tx_xmit_frame()
2130 skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS; in lan743x_tx_xmit_frame()
2132 if (tx->ts_flags & TX_TS_FLAG_ONE_STEP_SYNC) in lan743x_tx_xmit_frame()
2137 nr_frags = skb_shinfo(skb)->nr_frags; in lan743x_tx_xmit_frame()
2141 start_frame_length = max(skb_shinfo(skb)->gso_size, in lan743x_tx_xmit_frame()
2145 if (lan743x_tx_frame_start(tx, in lan743x_tx_xmit_frame()
2146 skb->data, head_length, in lan743x_tx_xmit_frame()
2149 skb->ip_summed == CHECKSUM_PARTIAL)) { in lan743x_tx_xmit_frame()
2153 tx->frame_count++; in lan743x_tx_xmit_frame()
2156 lan743x_tx_frame_add_lso(tx, frame_length, nr_frags); in lan743x_tx_xmit_frame()
2162 const skb_frag_t *frag = &(skb_shinfo(skb)->frags[j]); in lan743x_tx_xmit_frame()
2164 if (lan743x_tx_frame_add_fragment(tx, frag, frame_length)) { in lan743x_tx_xmit_frame()
2176 lan743x_tx_frame_end(tx, skb, do_timestamp, ignore_sync); in lan743x_tx_xmit_frame()
2179 spin_unlock_irqrestore(&tx->ring_lock, irq_flags); in lan743x_tx_xmit_frame()
2185 struct lan743x_tx *tx = container_of(napi, struct lan743x_tx, napi); in lan743x_tx_napi_poll() local
2186 struct lan743x_adapter *adapter = tx->adapter; in lan743x_tx_napi_poll()
2191 ioc_bit = DMAC_INT_BIT_TX_IOC_(tx->channel_number); in lan743x_tx_napi_poll()
2193 if (tx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_STATUS_W2C) in lan743x_tx_napi_poll()
2195 spin_lock_irqsave(&tx->ring_lock, irq_flags); in lan743x_tx_napi_poll()
2197 /* clean up tx ring */ in lan743x_tx_napi_poll()
2198 lan743x_tx_release_completed_descriptors(tx); in lan743x_tx_napi_poll()
2199 txq = netdev_get_tx_queue(adapter->netdev, tx->channel_number); in lan743x_tx_napi_poll()
2201 if (tx->rqd_descriptors) { in lan743x_tx_napi_poll()
2202 if (tx->rqd_descriptors <= in lan743x_tx_napi_poll()
2203 lan743x_tx_get_avail_desc(tx)) { in lan743x_tx_napi_poll()
2204 tx->rqd_descriptors = 0; in lan743x_tx_napi_poll()
2211 spin_unlock_irqrestore(&tx->ring_lock, irq_flags); in lan743x_tx_napi_poll()
2218 INT_BIT_DMA_TX_(tx->channel_number)); in lan743x_tx_napi_poll()
2225 static void lan743x_tx_ring_cleanup(struct lan743x_tx *tx) in lan743x_tx_ring_cleanup() argument
2227 if (tx->head_cpu_ptr) { in lan743x_tx_ring_cleanup()
2228 dma_free_coherent(&tx->adapter->pdev->dev, in lan743x_tx_ring_cleanup()
2229 sizeof(*tx->head_cpu_ptr), tx->head_cpu_ptr, in lan743x_tx_ring_cleanup()
2230 tx->head_dma_ptr); in lan743x_tx_ring_cleanup()
2231 tx->head_cpu_ptr = NULL; in lan743x_tx_ring_cleanup()
2232 tx->head_dma_ptr = 0; in lan743x_tx_ring_cleanup()
2234 kfree(tx->buffer_info); in lan743x_tx_ring_cleanup()
2235 tx->buffer_info = NULL; in lan743x_tx_ring_cleanup()
2237 if (tx->ring_cpu_ptr) { in lan743x_tx_ring_cleanup()
2238 dma_free_coherent(&tx->adapter->pdev->dev, in lan743x_tx_ring_cleanup()
2239 tx->ring_allocation_size, tx->ring_cpu_ptr, in lan743x_tx_ring_cleanup()
2240 tx->ring_dma_ptr); in lan743x_tx_ring_cleanup()
2241 tx->ring_allocation_size = 0; in lan743x_tx_ring_cleanup()
2242 tx->ring_cpu_ptr = NULL; in lan743x_tx_ring_cleanup()
2243 tx->ring_dma_ptr = 0; in lan743x_tx_ring_cleanup()
2245 tx->ring_size = 0; in lan743x_tx_ring_cleanup()
2248 static int lan743x_tx_ring_init(struct lan743x_tx *tx) in lan743x_tx_ring_init() argument
2253 int ret = -ENOMEM; in lan743x_tx_ring_init()
2255 tx->ring_size = LAN743X_TX_RING_SIZE; in lan743x_tx_ring_init()
2256 if (tx->ring_size & ~TX_CFG_B_TX_RING_LEN_MASK_) { in lan743x_tx_ring_init()
2257 ret = -EINVAL; in lan743x_tx_ring_init()
2260 if (dma_set_mask_and_coherent(&tx->adapter->pdev->dev, in lan743x_tx_ring_init()
2262 dev_warn(&tx->adapter->pdev->dev, in lan743x_tx_ring_init()
2264 ret = -ENOMEM; in lan743x_tx_ring_init()
2267 ring_allocation_size = ALIGN(tx->ring_size * in lan743x_tx_ring_init()
2271 cpu_ptr = dma_alloc_coherent(&tx->adapter->pdev->dev, in lan743x_tx_ring_init()
2274 ret = -ENOMEM; in lan743x_tx_ring_init()
2278 tx->ring_allocation_size = ring_allocation_size; in lan743x_tx_ring_init()
2279 tx->ring_cpu_ptr = (struct lan743x_tx_descriptor *)cpu_ptr; in lan743x_tx_ring_init()
2280 tx->ring_dma_ptr = dma_ptr; in lan743x_tx_ring_init()
2282 cpu_ptr = kcalloc(tx->ring_size, sizeof(*tx->buffer_info), GFP_KERNEL); in lan743x_tx_ring_init()
2284 ret = -ENOMEM; in lan743x_tx_ring_init()
2287 tx->buffer_info = (struct lan743x_tx_buffer_info *)cpu_ptr; in lan743x_tx_ring_init()
2289 cpu_ptr = dma_alloc_coherent(&tx->adapter->pdev->dev, in lan743x_tx_ring_init()
2290 sizeof(*tx->head_cpu_ptr), &dma_ptr, in lan743x_tx_ring_init()
2293 ret = -ENOMEM; in lan743x_tx_ring_init()
2297 tx->head_cpu_ptr = cpu_ptr; in lan743x_tx_ring_init()
2298 tx->head_dma_ptr = dma_ptr; in lan743x_tx_ring_init()
2299 if (tx->head_dma_ptr & 0x3) { in lan743x_tx_ring_init()
2300 ret = -ENOMEM; in lan743x_tx_ring_init()
2307 lan743x_tx_ring_cleanup(tx); in lan743x_tx_ring_init()
2311 static void lan743x_tx_close(struct lan743x_tx *tx) in lan743x_tx_close() argument
2313 struct lan743x_adapter *adapter = tx->adapter; in lan743x_tx_close()
2317 DMAC_CMD_STOP_T_(tx->channel_number)); in lan743x_tx_close()
2318 lan743x_dmac_tx_wait_till_stopped(adapter, tx->channel_number); in lan743x_tx_close()
2322 DMAC_INT_BIT_TX_IOC_(tx->channel_number)); in lan743x_tx_close()
2324 INT_BIT_DMA_TX_(tx->channel_number)); in lan743x_tx_close()
2325 napi_disable(&tx->napi); in lan743x_tx_close()
2326 netif_napi_del(&tx->napi); in lan743x_tx_close()
2329 FCT_TX_CTL_DIS_(tx->channel_number)); in lan743x_tx_close()
2331 FCT_TX_CTL_EN_(tx->channel_number), in lan743x_tx_close()
2334 lan743x_tx_release_all_descriptors(tx); in lan743x_tx_close()
2336 tx->rqd_descriptors = 0; in lan743x_tx_close()
2338 lan743x_tx_ring_cleanup(tx); in lan743x_tx_close()
2341 static int lan743x_tx_open(struct lan743x_tx *tx) in lan743x_tx_open() argument
2347 adapter = tx->adapter; in lan743x_tx_open()
2348 ret = lan743x_tx_ring_init(tx); in lan743x_tx_open()
2354 FCT_TX_CTL_RESET_(tx->channel_number)); in lan743x_tx_open()
2356 FCT_TX_CTL_RESET_(tx->channel_number), in lan743x_tx_open()
2361 FCT_TX_CTL_EN_(tx->channel_number)); in lan743x_tx_open()
2363 /* reset tx channel */ in lan743x_tx_open()
2365 DMAC_CMD_TX_SWR_(tx->channel_number)); in lan743x_tx_open()
2367 DMAC_CMD_TX_SWR_(tx->channel_number), in lan743x_tx_open()
2372 TX_BASE_ADDRH(tx->channel_number), in lan743x_tx_open()
2373 DMA_ADDR_HIGH32(tx->ring_dma_ptr)); in lan743x_tx_open()
2375 TX_BASE_ADDRL(tx->channel_number), in lan743x_tx_open()
2376 DMA_ADDR_LOW32(tx->ring_dma_ptr)); in lan743x_tx_open()
2379 data = lan743x_csr_read(adapter, TX_CFG_B(tx->channel_number)); in lan743x_tx_open()
2381 data |= ((tx->ring_size) & TX_CFG_B_TX_RING_LEN_MASK_); in lan743x_tx_open()
2382 if (!(adapter->csr.flags & LAN743X_CSR_FLAG_IS_A0)) in lan743x_tx_open()
2384 lan743x_csr_write(adapter, TX_CFG_B(tx->channel_number), data); in lan743x_tx_open()
2388 if (!(adapter->csr.flags & LAN743X_CSR_FLAG_IS_A0)) { in lan743x_tx_open()
2394 lan743x_csr_write(adapter, TX_CFG_A(tx->channel_number), data); in lan743x_tx_open()
2398 TX_HEAD_WRITEBACK_ADDRH(tx->channel_number), in lan743x_tx_open()
2399 DMA_ADDR_HIGH32(tx->head_dma_ptr)); in lan743x_tx_open()
2401 TX_HEAD_WRITEBACK_ADDRL(tx->channel_number), in lan743x_tx_open()
2402 DMA_ADDR_LOW32(tx->head_dma_ptr)); in lan743x_tx_open()
2405 tx->last_head = lan743x_csr_read(adapter, TX_HEAD(tx->channel_number)); in lan743x_tx_open()
2408 tx->last_tail = 0; in lan743x_tx_open()
2409 lan743x_csr_write(adapter, TX_TAIL(tx->channel_number), in lan743x_tx_open()
2410 (u32)(tx->last_tail)); in lan743x_tx_open()
2411 tx->vector_flags = lan743x_intr_get_vector_flags(adapter, in lan743x_tx_open()
2413 (tx->channel_number)); in lan743x_tx_open()
2414 netif_napi_add_tx_weight(adapter->netdev, in lan743x_tx_open()
2415 &tx->napi, lan743x_tx_napi_poll, in lan743x_tx_open()
2417 napi_enable(&tx->napi); in lan743x_tx_open()
2420 if (tx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_ENABLE_AUTO_CLEAR) in lan743x_tx_open()
2422 if (tx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_STATUS_AUTO_CLEAR) in lan743x_tx_open()
2424 if (tx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_STATUS_R2C) in lan743x_tx_open()
2426 if (tx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_ENABLE_R2C) in lan743x_tx_open()
2428 lan743x_csr_write(adapter, TX_CFG_C(tx->channel_number), data); in lan743x_tx_open()
2430 if (!(tx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_ENABLE_AUTO_SET)) in lan743x_tx_open()
2432 INT_BIT_DMA_TX_(tx->channel_number)); in lan743x_tx_open()
2434 DMAC_INT_BIT_TX_IOC_(tx->channel_number)); in lan743x_tx_open()
2438 DMAC_CMD_START_T_(tx->channel_number)); in lan743x_tx_open()
2442 static int lan743x_rx_next_index(struct lan743x_rx *rx, int index) in lan743x_rx_next_index() argument
2444 return ((++index) % rx->ring_size); in lan743x_rx_next_index()
2447 static void lan743x_rx_update_tail(struct lan743x_rx *rx, int index) in lan743x_rx_update_tail() argument
2451 lan743x_csr_write(rx->adapter, RX_TAIL(rx->channel_number), in lan743x_rx_update_tail()
2455 static int lan743x_rx_init_ring_element(struct lan743x_rx *rx, int index, in lan743x_rx_init_ring_element() argument
2458 struct net_device *netdev = rx->adapter->netdev; in lan743x_rx_init_ring_element()
2459 struct device *dev = &rx->adapter->pdev->dev; in lan743x_rx_init_ring_element()
2466 buffer_length = netdev->mtu + ETH_HLEN + ETH_FCS_LEN + RX_HEAD_PADDING; in lan743x_rx_init_ring_element()
2468 descriptor = &rx->ring_cpu_ptr[index]; in lan743x_rx_init_ring_element()
2469 buffer_info = &rx->buffer_info[index]; in lan743x_rx_init_ring_element()
2472 return -ENOMEM; in lan743x_rx_init_ring_element()
2473 dma_ptr = dma_map_single(dev, skb->data, buffer_length, DMA_FROM_DEVICE); in lan743x_rx_init_ring_element()
2476 return -ENOMEM; in lan743x_rx_init_ring_element()
2478 if (buffer_info->dma_ptr) { in lan743x_rx_init_ring_element()
2480 if (le32_to_cpu(descriptor->data0) & RX_DESC_DATA0_LS_) in lan743x_rx_init_ring_element()
2486 (le32_to_cpu(descriptor->data0)), in lan743x_rx_init_ring_element()
2487 buffer_info->buffer_length); in lan743x_rx_init_ring_element()
2489 used_length = buffer_info->buffer_length; in lan743x_rx_init_ring_element()
2490 dma_sync_single_for_cpu(dev, buffer_info->dma_ptr, in lan743x_rx_init_ring_element()
2493 dma_unmap_single_attrs(dev, buffer_info->dma_ptr, in lan743x_rx_init_ring_element()
2494 buffer_info->buffer_length, in lan743x_rx_init_ring_element()
2499 buffer_info->skb = skb; in lan743x_rx_init_ring_element()
2500 buffer_info->dma_ptr = dma_ptr; in lan743x_rx_init_ring_element()
2501 buffer_info->buffer_length = buffer_length; in lan743x_rx_init_ring_element()
2502 descriptor->data1 = cpu_to_le32(DMA_ADDR_LOW32(buffer_info->dma_ptr)); in lan743x_rx_init_ring_element()
2503 descriptor->data2 = cpu_to_le32(DMA_ADDR_HIGH32(buffer_info->dma_ptr)); in lan743x_rx_init_ring_element()
2504 descriptor->data3 = 0; in lan743x_rx_init_ring_element()
2505 descriptor->data0 = cpu_to_le32((RX_DESC_DATA0_OWN_ | in lan743x_rx_init_ring_element()
2507 lan743x_rx_update_tail(rx, index); in lan743x_rx_init_ring_element()
2512 static void lan743x_rx_reuse_ring_element(struct lan743x_rx *rx, int index) in lan743x_rx_reuse_ring_element() argument
2517 descriptor = &rx->ring_cpu_ptr[index]; in lan743x_rx_reuse_ring_element()
2518 buffer_info = &rx->buffer_info[index]; in lan743x_rx_reuse_ring_element()
2520 descriptor->data1 = cpu_to_le32(DMA_ADDR_LOW32(buffer_info->dma_ptr)); in lan743x_rx_reuse_ring_element()
2521 descriptor->data2 = cpu_to_le32(DMA_ADDR_HIGH32(buffer_info->dma_ptr)); in lan743x_rx_reuse_ring_element()
2522 descriptor->data3 = 0; in lan743x_rx_reuse_ring_element()
2523 descriptor->data0 = cpu_to_le32((RX_DESC_DATA0_OWN_ | in lan743x_rx_reuse_ring_element()
2524 ((buffer_info->buffer_length) & in lan743x_rx_reuse_ring_element()
2526 lan743x_rx_update_tail(rx, index); in lan743x_rx_reuse_ring_element()
2529 static void lan743x_rx_release_ring_element(struct lan743x_rx *rx, int index) in lan743x_rx_release_ring_element() argument
2534 descriptor = &rx->ring_cpu_ptr[index]; in lan743x_rx_release_ring_element()
2535 buffer_info = &rx->buffer_info[index]; in lan743x_rx_release_ring_element()
2539 if (buffer_info->dma_ptr) { in lan743x_rx_release_ring_element()
2540 dma_unmap_single(&rx->adapter->pdev->dev, in lan743x_rx_release_ring_element()
2541 buffer_info->dma_ptr, in lan743x_rx_release_ring_element()
2542 buffer_info->buffer_length, in lan743x_rx_release_ring_element()
2544 buffer_info->dma_ptr = 0; in lan743x_rx_release_ring_element()
2547 if (buffer_info->skb) { in lan743x_rx_release_ring_element()
2548 dev_kfree_skb(buffer_info->skb); in lan743x_rx_release_ring_element()
2549 buffer_info->skb = NULL; in lan743x_rx_release_ring_element()
2562 frame_length = max_t(int, 0, frame_length - ETH_FCS_LEN); in lan743x_rx_trim_skb()
2563 if (skb->len > frame_length) { in lan743x_rx_trim_skb()
2564 skb->tail -= skb->len - frame_length; in lan743x_rx_trim_skb()
2565 skb->len = frame_length; in lan743x_rx_trim_skb()
2570 static int lan743x_rx_process_buffer(struct lan743x_rx *rx) in lan743x_rx_process_buffer() argument
2572 int current_head_index = le32_to_cpu(*rx->head_cpu_ptr); in lan743x_rx_process_buffer()
2574 struct net_device *netdev = rx->adapter->netdev; in lan743x_rx_process_buffer()
2579 int extension_index = -1; in lan743x_rx_process_buffer()
2583 if (current_head_index < 0 || current_head_index >= rx->ring_size) in lan743x_rx_process_buffer()
2586 if (rx->last_head < 0 || rx->last_head >= rx->ring_size) in lan743x_rx_process_buffer()
2589 if (rx->last_head == current_head_index) in lan743x_rx_process_buffer()
2592 descriptor = &rx->ring_cpu_ptr[rx->last_head]; in lan743x_rx_process_buffer()
2593 if (le32_to_cpu(descriptor->data0) & RX_DESC_DATA0_OWN_) in lan743x_rx_process_buffer()
2595 buffer_info = &rx->buffer_info[rx->last_head]; in lan743x_rx_process_buffer()
2597 is_last = le32_to_cpu(descriptor->data0) & RX_DESC_DATA0_LS_; in lan743x_rx_process_buffer()
2598 is_first = le32_to_cpu(descriptor->data0) & RX_DESC_DATA0_FS_; in lan743x_rx_process_buffer()
2600 if (is_last && le32_to_cpu(descriptor->data0) & RX_DESC_DATA0_EXT_) { in lan743x_rx_process_buffer()
2602 int index = lan743x_rx_next_index(rx, rx->last_head); in lan743x_rx_process_buffer()
2607 desc_ext = &rx->ring_cpu_ptr[index]; in lan743x_rx_process_buffer()
2608 if (le32_to_cpu(desc_ext->data0) & RX_DESC_DATA0_OWN_) in lan743x_rx_process_buffer()
2611 if (!(le32_to_cpu(desc_ext->data0) & RX_DESC_DATA0_EXT_)) in lan743x_rx_process_buffer()
2616 /* Only the last buffer in a multi-buffer frame contains the total frame in lan743x_rx_process_buffer()
2623 RX_DESC_DATA0_FRAME_LENGTH_GET_(le32_to_cpu(descriptor->data0)); in lan743x_rx_process_buffer()
2624 buffer_length = buffer_info->buffer_length; in lan743x_rx_process_buffer()
2625 is_ice = le32_to_cpu(descriptor->data1) & RX_DESC_DATA1_STATUS_ICE_; in lan743x_rx_process_buffer()
2626 is_tce = le32_to_cpu(descriptor->data1) & RX_DESC_DATA1_STATUS_TCE_; in lan743x_rx_process_buffer()
2627 is_icsm = le32_to_cpu(descriptor->data1) & RX_DESC_DATA1_STATUS_ICSM_; in lan743x_rx_process_buffer()
2635 skb = buffer_info->skb; in lan743x_rx_process_buffer()
2636 if (lan743x_rx_init_ring_element(rx, rx->last_head, in lan743x_rx_process_buffer()
2642 lan743x_rx_reuse_ring_element(rx, rx->last_head); in lan743x_rx_process_buffer()
2644 dev_kfree_skb_irq(rx->skb_head); in lan743x_rx_process_buffer()
2645 rx->skb_head = NULL; in lan743x_rx_process_buffer()
2649 /* add buffers to skb via skb->frag_list */ in lan743x_rx_process_buffer()
2652 skb_put(skb, buffer_length - RX_HEAD_PADDING); in lan743x_rx_process_buffer()
2653 if (rx->skb_head) in lan743x_rx_process_buffer()
2654 dev_kfree_skb_irq(rx->skb_head); in lan743x_rx_process_buffer()
2655 rx->skb_head = skb; in lan743x_rx_process_buffer()
2656 } else if (rx->skb_head) { in lan743x_rx_process_buffer()
2658 if (skb_shinfo(rx->skb_head)->frag_list) in lan743x_rx_process_buffer()
2659 rx->skb_tail->next = skb; in lan743x_rx_process_buffer()
2661 skb_shinfo(rx->skb_head)->frag_list = skb; in lan743x_rx_process_buffer()
2662 rx->skb_tail = skb; in lan743x_rx_process_buffer()
2663 rx->skb_head->len += skb->len; in lan743x_rx_process_buffer()
2664 rx->skb_head->data_len += skb->len; in lan743x_rx_process_buffer()
2665 rx->skb_head->truesize += skb->truesize; in lan743x_rx_process_buffer()
2679 ts_sec = le32_to_cpu(desc_ext->data1); in lan743x_rx_process_buffer()
2680 ts_nsec = (le32_to_cpu(desc_ext->data2) & in lan743x_rx_process_buffer()
2682 if (rx->skb_head) in lan743x_rx_process_buffer()
2683 skb_hwtstamps(rx->skb_head)->hwtstamp = in lan743x_rx_process_buffer()
2685 lan743x_rx_reuse_ring_element(rx, extension_index); in lan743x_rx_process_buffer()
2686 rx->last_head = extension_index; in lan743x_rx_process_buffer()
2690 if (is_last && rx->skb_head) in lan743x_rx_process_buffer()
2691 rx->skb_head = lan743x_rx_trim_skb(rx->skb_head, frame_length); in lan743x_rx_process_buffer()
2693 if (is_last && rx->skb_head) { in lan743x_rx_process_buffer()
2694 rx->skb_head->protocol = eth_type_trans(rx->skb_head, in lan743x_rx_process_buffer()
2695 rx->adapter->netdev); in lan743x_rx_process_buffer()
2696 if (rx->adapter->netdev->features & NETIF_F_RXCSUM) { in lan743x_rx_process_buffer()
2698 skb->ip_summed = CHECKSUM_UNNECESSARY; in lan743x_rx_process_buffer()
2701 rx->skb_head->len); in lan743x_rx_process_buffer()
2702 napi_gro_receive(&rx->napi, rx->skb_head); in lan743x_rx_process_buffer()
2703 rx->skb_head = NULL; in lan743x_rx_process_buffer()
2708 rx->last_tail = rx->last_head; in lan743x_rx_process_buffer()
2709 rx->last_head = lan743x_rx_next_index(rx, rx->last_head); in lan743x_rx_process_buffer()
2717 struct lan743x_rx *rx = container_of(napi, struct lan743x_rx, napi); in lan743x_rx_napi_poll() local
2718 struct lan743x_adapter *adapter = rx->adapter; in lan743x_rx_napi_poll()
2723 if (rx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_STATUS_W2C) { in lan743x_rx_napi_poll()
2726 DMAC_INT_BIT_RXFRM_(rx->channel_number)); in lan743x_rx_napi_poll()
2729 result = lan743x_rx_process_buffer(rx); in lan743x_rx_napi_poll()
2733 rx->frame_count += count; in lan743x_rx_napi_poll()
2740 /* re-arm interrupts, must write to rx tail on some chip variants */ in lan743x_rx_napi_poll()
2741 if (rx->vector_flags & LAN743X_VECTOR_FLAG_VECTOR_ENABLE_AUTO_SET) in lan743x_rx_napi_poll()
2743 if (rx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_ENABLE_AUTO_SET) { in lan743x_rx_napi_poll()
2747 INT_BIT_DMA_RX_(rx->channel_number)); in lan743x_rx_napi_poll()
2751 lan743x_csr_write(adapter, RX_TAIL(rx->channel_number), in lan743x_rx_napi_poll()
2752 rx_tail_flags | rx->last_tail); in lan743x_rx_napi_poll()
2757 static void lan743x_rx_ring_cleanup(struct lan743x_rx *rx) in lan743x_rx_ring_cleanup() argument
2759 if (rx->buffer_info && rx->ring_cpu_ptr) { in lan743x_rx_ring_cleanup()
2762 for (index = 0; index < rx->ring_size; index++) in lan743x_rx_ring_cleanup()
2763 lan743x_rx_release_ring_element(rx, index); in lan743x_rx_ring_cleanup()
2766 if (rx->head_cpu_ptr) { in lan743x_rx_ring_cleanup()
2767 dma_free_coherent(&rx->adapter->pdev->dev, in lan743x_rx_ring_cleanup()
2768 sizeof(*rx->head_cpu_ptr), rx->head_cpu_ptr, in lan743x_rx_ring_cleanup()
2769 rx->head_dma_ptr); in lan743x_rx_ring_cleanup()
2770 rx->head_cpu_ptr = NULL; in lan743x_rx_ring_cleanup()
2771 rx->head_dma_ptr = 0; in lan743x_rx_ring_cleanup()
2774 kfree(rx->buffer_info); in lan743x_rx_ring_cleanup()
2775 rx->buffer_info = NULL; in lan743x_rx_ring_cleanup()
2777 if (rx->ring_cpu_ptr) { in lan743x_rx_ring_cleanup()
2778 dma_free_coherent(&rx->adapter->pdev->dev, in lan743x_rx_ring_cleanup()
2779 rx->ring_allocation_size, rx->ring_cpu_ptr, in lan743x_rx_ring_cleanup()
2780 rx->ring_dma_ptr); in lan743x_rx_ring_cleanup()
2781 rx->ring_allocation_size = 0; in lan743x_rx_ring_cleanup()
2782 rx->ring_cpu_ptr = NULL; in lan743x_rx_ring_cleanup()
2783 rx->ring_dma_ptr = 0; in lan743x_rx_ring_cleanup()
2786 rx->ring_size = 0; in lan743x_rx_ring_cleanup()
2787 rx->last_head = 0; in lan743x_rx_ring_cleanup()
2790 static int lan743x_rx_ring_init(struct lan743x_rx *rx) in lan743x_rx_ring_init() argument
2795 int ret = -ENOMEM; in lan743x_rx_ring_init()
2798 rx->ring_size = LAN743X_RX_RING_SIZE; in lan743x_rx_ring_init()
2799 if (rx->ring_size <= 1) { in lan743x_rx_ring_init()
2800 ret = -EINVAL; in lan743x_rx_ring_init()
2803 if (rx->ring_size & ~RX_CFG_B_RX_RING_LEN_MASK_) { in lan743x_rx_ring_init()
2804 ret = -EINVAL; in lan743x_rx_ring_init()
2807 if (dma_set_mask_and_coherent(&rx->adapter->pdev->dev, in lan743x_rx_ring_init()
2809 dev_warn(&rx->adapter->pdev->dev, in lan743x_rx_ring_init()
2811 ret = -ENOMEM; in lan743x_rx_ring_init()
2814 ring_allocation_size = ALIGN(rx->ring_size * in lan743x_rx_ring_init()
2818 cpu_ptr = dma_alloc_coherent(&rx->adapter->pdev->dev, in lan743x_rx_ring_init()
2821 ret = -ENOMEM; in lan743x_rx_ring_init()
2824 rx->ring_allocation_size = ring_allocation_size; in lan743x_rx_ring_init()
2825 rx->ring_cpu_ptr = (struct lan743x_rx_descriptor *)cpu_ptr; in lan743x_rx_ring_init()
2826 rx->ring_dma_ptr = dma_ptr; in lan743x_rx_ring_init()
2828 cpu_ptr = kcalloc(rx->ring_size, sizeof(*rx->buffer_info), in lan743x_rx_ring_init()
2831 ret = -ENOMEM; in lan743x_rx_ring_init()
2834 rx->buffer_info = (struct lan743x_rx_buffer_info *)cpu_ptr; in lan743x_rx_ring_init()
2836 cpu_ptr = dma_alloc_coherent(&rx->adapter->pdev->dev, in lan743x_rx_ring_init()
2837 sizeof(*rx->head_cpu_ptr), &dma_ptr, in lan743x_rx_ring_init()
2840 ret = -ENOMEM; in lan743x_rx_ring_init()
2844 rx->head_cpu_ptr = cpu_ptr; in lan743x_rx_ring_init()
2845 rx->head_dma_ptr = dma_ptr; in lan743x_rx_ring_init()
2846 if (rx->head_dma_ptr & 0x3) { in lan743x_rx_ring_init()
2847 ret = -ENOMEM; in lan743x_rx_ring_init()
2851 rx->last_head = 0; in lan743x_rx_ring_init()
2852 for (index = 0; index < rx->ring_size; index++) { in lan743x_rx_ring_init()
2853 ret = lan743x_rx_init_ring_element(rx, index, GFP_KERNEL); in lan743x_rx_ring_init()
2860 netif_warn(rx->adapter, ifup, rx->adapter->netdev, in lan743x_rx_ring_init()
2863 lan743x_rx_ring_cleanup(rx); in lan743x_rx_ring_init()
2867 static void lan743x_rx_close(struct lan743x_rx *rx) in lan743x_rx_close() argument
2869 struct lan743x_adapter *adapter = rx->adapter; in lan743x_rx_close()
2872 FCT_RX_CTL_DIS_(rx->channel_number)); in lan743x_rx_close()
2874 FCT_RX_CTL_EN_(rx->channel_number), in lan743x_rx_close()
2878 DMAC_CMD_STOP_R_(rx->channel_number)); in lan743x_rx_close()
2879 lan743x_dmac_rx_wait_till_stopped(adapter, rx->channel_number); in lan743x_rx_close()
2882 DMAC_INT_BIT_RXFRM_(rx->channel_number)); in lan743x_rx_close()
2884 INT_BIT_DMA_RX_(rx->channel_number)); in lan743x_rx_close()
2885 napi_disable(&rx->napi); in lan743x_rx_close()
2887 netif_napi_del(&rx->napi); in lan743x_rx_close()
2889 lan743x_rx_ring_cleanup(rx); in lan743x_rx_close()
2892 static int lan743x_rx_open(struct lan743x_rx *rx) in lan743x_rx_open() argument
2894 struct lan743x_adapter *adapter = rx->adapter; in lan743x_rx_open()
2898 rx->frame_count = 0; in lan743x_rx_open()
2899 ret = lan743x_rx_ring_init(rx); in lan743x_rx_open()
2903 netif_napi_add(adapter->netdev, &rx->napi, lan743x_rx_napi_poll); in lan743x_rx_open()
2906 DMAC_CMD_RX_SWR_(rx->channel_number)); in lan743x_rx_open()
2908 DMAC_CMD_RX_SWR_(rx->channel_number), in lan743x_rx_open()
2913 RX_BASE_ADDRH(rx->channel_number), in lan743x_rx_open()
2914 DMA_ADDR_HIGH32(rx->ring_dma_ptr)); in lan743x_rx_open()
2916 RX_BASE_ADDRL(rx->channel_number), in lan743x_rx_open()
2917 DMA_ADDR_LOW32(rx->ring_dma_ptr)); in lan743x_rx_open()
2919 /* set rx write back address */ in lan743x_rx_open()
2921 RX_HEAD_WRITEBACK_ADDRH(rx->channel_number), in lan743x_rx_open()
2922 DMA_ADDR_HIGH32(rx->head_dma_ptr)); in lan743x_rx_open()
2924 RX_HEAD_WRITEBACK_ADDRL(rx->channel_number), in lan743x_rx_open()
2925 DMA_ADDR_LOW32(rx->head_dma_ptr)); in lan743x_rx_open()
2927 if (!(adapter->csr.flags & LAN743X_CSR_FLAG_IS_A0)) { in lan743x_rx_open()
2936 RX_CFG_A(rx->channel_number), data); in lan743x_rx_open()
2939 data = lan743x_csr_read(adapter, RX_CFG_B(rx->channel_number)); in lan743x_rx_open()
2946 data |= ((rx->ring_size) & RX_CFG_B_RX_RING_LEN_MASK_); in lan743x_rx_open()
2948 if (!(adapter->csr.flags & LAN743X_CSR_FLAG_IS_A0)) in lan743x_rx_open()
2951 lan743x_csr_write(adapter, RX_CFG_B(rx->channel_number), data); in lan743x_rx_open()
2952 rx->vector_flags = lan743x_intr_get_vector_flags(adapter, in lan743x_rx_open()
2954 (rx->channel_number)); in lan743x_rx_open()
2958 if (rx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_ENABLE_AUTO_CLEAR) in lan743x_rx_open()
2960 if (rx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_STATUS_AUTO_CLEAR) in lan743x_rx_open()
2962 if (rx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_STATUS_R2C) in lan743x_rx_open()
2964 if (rx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_ENABLE_R2C) in lan743x_rx_open()
2966 lan743x_csr_write(adapter, RX_CFG_C(rx->channel_number), data); in lan743x_rx_open()
2968 rx->last_tail = ((u32)(rx->ring_size - 1)); in lan743x_rx_open()
2969 lan743x_csr_write(adapter, RX_TAIL(rx->channel_number), in lan743x_rx_open()
2970 rx->last_tail); in lan743x_rx_open()
2971 rx->last_head = lan743x_csr_read(adapter, RX_HEAD(rx->channel_number)); in lan743x_rx_open()
2972 if (rx->last_head) { in lan743x_rx_open()
2973 ret = -EIO; in lan743x_rx_open()
2977 napi_enable(&rx->napi); in lan743x_rx_open()
2980 INT_BIT_DMA_RX_(rx->channel_number)); in lan743x_rx_open()
2982 DMAC_INT_BIT_RXFRM_(rx->channel_number)); in lan743x_rx_open()
2984 DMAC_INT_BIT_RXFRM_(rx->channel_number)); in lan743x_rx_open()
2986 DMAC_CMD_START_R_(rx->channel_number)); in lan743x_rx_open()
2990 FCT_RX_CTL_RESET_(rx->channel_number)); in lan743x_rx_open()
2992 FCT_RX_CTL_RESET_(rx->channel_number), in lan743x_rx_open()
2994 lan743x_csr_write(adapter, FCT_FLOW(rx->channel_number), in lan743x_rx_open()
3001 FCT_RX_CTL_EN_(rx->channel_number)); in lan743x_rx_open()
3005 netif_napi_del(&rx->napi); in lan743x_rx_open()
3006 lan743x_rx_ring_cleanup(rx); in lan743x_rx_open()
3017 for (index = 0; index < adapter->used_tx_channels; index++) in lan743x_netdev_close()
3018 lan743x_tx_close(&adapter->tx[index]); in lan743x_netdev_close()
3021 lan743x_rx_close(&adapter->rx[index]); in lan743x_netdev_close()
3059 ret = lan743x_rx_open(&adapter->rx[index]); in lan743x_netdev_open()
3064 for (index = 0; index < adapter->used_tx_channels; index++) { in lan743x_netdev_open()
3065 ret = lan743x_tx_open(&adapter->tx[index]); in lan743x_netdev_open()
3071 if (adapter->netdev->phydev) { in lan743x_netdev_open()
3074 phy_ethtool_get_wol(netdev->phydev, &wol); in lan743x_netdev_open()
3075 adapter->phy_wol_supported = wol.supported; in lan743x_netdev_open()
3076 adapter->phy_wolopts = wol.wolopts; in lan743x_netdev_open()
3083 for (index = 0; index < adapter->used_tx_channels; index++) { in lan743x_netdev_open()
3084 if (adapter->tx[index].ring_cpu_ptr) in lan743x_netdev_open()
3085 lan743x_tx_close(&adapter->tx[index]); in lan743x_netdev_open()
3090 if (adapter->rx[index].ring_cpu_ptr) in lan743x_netdev_open()
3091 lan743x_rx_close(&adapter->rx[index]); in lan743x_netdev_open()
3105 netif_warn(adapter, ifup, adapter->netdev, in lan743x_netdev_open()
3116 if (adapter->is_pci11x1x) in lan743x_netdev_xmit_frame()
3117 ch = skb->queue_mapping % PCI11X1X_USED_TX_CHANNELS; in lan743x_netdev_xmit_frame()
3119 return lan743x_tx_xmit_frame(&adapter->tx[ch], skb); in lan743x_netdev_xmit_frame()
3126 return -EINVAL; in lan743x_netdev_ioctl()
3129 return phy_mii_ioctl(netdev->phydev, ifr, cmd); in lan743x_netdev_ioctl()
3146 netdev->mtu = new_mtu; in lan743x_netdev_change_mtu()
3155 stats->rx_packets = lan743x_csr_read(adapter, STAT_RX_TOTAL_FRAMES); in lan743x_netdev_get_stats64()
3156 stats->tx_packets = lan743x_csr_read(adapter, STAT_TX_TOTAL_FRAMES); in lan743x_netdev_get_stats64()
3157 stats->rx_bytes = lan743x_csr_read(adapter, in lan743x_netdev_get_stats64()
3163 stats->tx_bytes = lan743x_csr_read(adapter, in lan743x_netdev_get_stats64()
3169 stats->rx_errors = lan743x_csr_read(adapter, STAT_RX_FCS_ERRORS) + in lan743x_netdev_get_stats64()
3177 stats->tx_errors = lan743x_csr_read(adapter, STAT_TX_FCS_ERRORS) + in lan743x_netdev_get_stats64()
3181 stats->rx_dropped = lan743x_csr_read(adapter, in lan743x_netdev_get_stats64()
3183 stats->tx_dropped = lan743x_csr_read(adapter, in lan743x_netdev_get_stats64()
3185 stats->multicast = lan743x_csr_read(adapter, in lan743x_netdev_get_stats64()
3189 stats->collisions = lan743x_csr_read(adapter, in lan743x_netdev_get_stats64()
3207 eth_hw_addr_set(netdev, sock_addr->sa_data); in lan743x_netdev_set_mac_address()
3208 lan743x_mac_set_address(adapter, sock_addr->sa_data); in lan743x_netdev_set_mac_address()
3231 mdiobus_unregister(adapter->mdiobus); in lan743x_mdiobus_cleanup()
3236 unregister_netdev(adapter->netdev); in lan743x_full_cleanup()
3245 u16 rev = adapter->csr.id_rev & ID_REV_CHIP_REV_MASK_; in pci11x1x_set_rfe_rd_fifo_threshold()
3261 struct lan743x_tx *tx; in lan743x_hardware_init() local
3266 adapter->is_pci11x1x = is_pci11x1x_chip(adapter); in lan743x_hardware_init()
3267 if (adapter->is_pci11x1x) { in lan743x_hardware_init()
3268 adapter->max_tx_channels = PCI11X1X_MAX_TX_CHANNELS; in lan743x_hardware_init()
3269 adapter->used_tx_channels = PCI11X1X_USED_TX_CHANNELS; in lan743x_hardware_init()
3270 adapter->max_vector_count = PCI11X1X_MAX_VECTOR_COUNT; in lan743x_hardware_init()
3272 spin_lock_init(&adapter->eth_syslock_spinlock); in lan743x_hardware_init()
3273 mutex_init(&adapter->sgmii_rw_lock); in lan743x_hardware_init()
3276 if (adapter->is_sgmii_en) { in lan743x_hardware_init()
3285 adapter->max_tx_channels = LAN743X_MAX_TX_CHANNELS; in lan743x_hardware_init()
3286 adapter->used_tx_channels = LAN743X_USED_TX_CHANNELS; in lan743x_hardware_init()
3287 adapter->max_vector_count = LAN743X_MAX_VECTOR_COUNT; in lan743x_hardware_init()
3290 adapter->intr.irq = adapter->pdev->irq; in lan743x_hardware_init()
3316 adapter->rx[index].adapter = adapter; in lan743x_hardware_init()
3317 adapter->rx[index].channel_number = index; in lan743x_hardware_init()
3320 for (index = 0; index < adapter->used_tx_channels; index++) { in lan743x_hardware_init()
3321 tx = &adapter->tx[index]; in lan743x_hardware_init()
3322 tx->adapter = adapter; in lan743x_hardware_init()
3323 tx->channel_number = index; in lan743x_hardware_init()
3324 spin_lock_init(&tx->ring_lock); in lan743x_hardware_init()
3334 adapter->mdiobus = devm_mdiobus_alloc(&adapter->pdev->dev); in lan743x_mdiobus_init()
3335 if (!(adapter->mdiobus)) { in lan743x_mdiobus_init()
3336 ret = -ENOMEM; in lan743x_mdiobus_init()
3340 adapter->mdiobus->priv = (void *)adapter; in lan743x_mdiobus_init()
3341 if (adapter->is_pci11x1x) { in lan743x_mdiobus_init()
3342 if (adapter->is_sgmii_en) { in lan743x_mdiobus_init()
3343 netif_dbg(adapter, drv, adapter->netdev, in lan743x_mdiobus_init()
3345 adapter->mdiobus->read = lan743x_mdiobus_read_c22; in lan743x_mdiobus_init()
3346 adapter->mdiobus->write = lan743x_mdiobus_write_c22; in lan743x_mdiobus_init()
3347 adapter->mdiobus->read_c45 = lan743x_mdiobus_read_c45; in lan743x_mdiobus_init()
3348 adapter->mdiobus->write_c45 = lan743x_mdiobus_write_c45; in lan743x_mdiobus_init()
3349 adapter->mdiobus->name = "lan743x-mdiobus-c45"; in lan743x_mdiobus_init()
3350 netif_dbg(adapter, drv, adapter->netdev, in lan743x_mdiobus_init()
3351 "lan743x-mdiobus-c45\n"); in lan743x_mdiobus_init()
3353 netif_dbg(adapter, drv, adapter->netdev, in lan743x_mdiobus_init()
3356 adapter->mdiobus->read = lan743x_mdiobus_read_c22; in lan743x_mdiobus_init()
3357 adapter->mdiobus->write = lan743x_mdiobus_write_c22; in lan743x_mdiobus_init()
3358 adapter->mdiobus->name = "lan743x-mdiobus"; in lan743x_mdiobus_init()
3359 netif_dbg(adapter, drv, adapter->netdev, in lan743x_mdiobus_init()
3360 "lan743x-mdiobus\n"); in lan743x_mdiobus_init()
3363 adapter->mdiobus->read = lan743x_mdiobus_read_c22; in lan743x_mdiobus_init()
3364 adapter->mdiobus->write = lan743x_mdiobus_write_c22; in lan743x_mdiobus_init()
3365 adapter->mdiobus->name = "lan743x-mdiobus"; in lan743x_mdiobus_init()
3366 netif_dbg(adapter, drv, adapter->netdev, "lan743x-mdiobus\n"); in lan743x_mdiobus_init()
3369 snprintf(adapter->mdiobus->id, MII_BUS_ID_SIZE, in lan743x_mdiobus_init()
3370 "pci-%s", pci_name(adapter->pdev)); in lan743x_mdiobus_init()
3372 if ((adapter->csr.id_rev & ID_REV_ID_MASK_) == ID_REV_ID_LAN7430_) in lan743x_mdiobus_init()
3374 adapter->mdiobus->phy_mask = ~(u32)BIT(1); in lan743x_mdiobus_init()
3377 ret = mdiobus_register(adapter->mdiobus); in lan743x_mdiobus_init()
3386 /* lan743x_pcidev_probe - Device Initialization Routine
3401 int ret = -ENODEV; in lan743x_pcidev_probe()
3403 if (id->device == PCI_DEVICE_ID_SMSC_A011 || in lan743x_pcidev_probe()
3404 id->device == PCI_DEVICE_ID_SMSC_A041) { in lan743x_pcidev_probe()
3405 netdev = devm_alloc_etherdev_mqs(&pdev->dev, in lan743x_pcidev_probe()
3410 netdev = devm_alloc_etherdev_mqs(&pdev->dev, in lan743x_pcidev_probe()
3419 SET_NETDEV_DEV(netdev, &pdev->dev); in lan743x_pcidev_probe()
3422 adapter->netdev = netdev; in lan743x_pcidev_probe()
3423 adapter->msg_enable = NETIF_MSG_DRV | NETIF_MSG_PROBE | in lan743x_pcidev_probe()
3426 netdev->max_mtu = LAN743X_MAX_FRAME_SIZE; in lan743x_pcidev_probe()
3428 of_get_mac_address(pdev->dev.of_node, adapter->mac_address); in lan743x_pcidev_probe()
3446 adapter->netdev->netdev_ops = &lan743x_netdev_ops; in lan743x_pcidev_probe()
3447 adapter->netdev->ethtool_ops = &lan743x_ethtool_ops; in lan743x_pcidev_probe()
3448 adapter->netdev->features = NETIF_F_SG | NETIF_F_TSO | in lan743x_pcidev_probe()
3450 adapter->netdev->hw_features = adapter->netdev->features; in lan743x_pcidev_probe()
3455 ret = register_netdev(adapter->netdev); in lan743x_pcidev_probe()
3475 * lan743x_pcidev_remove - Device Removal Routine
3480 * Hot-Plug event, or because the driver is going to be removed from
3500 * For instance, it is true when system goes to sleep by pm-suspend in lan743x_pcidev_shutdown()
3550 if (adapter->phy_wolopts) in lan743x_pm_set_wol()
3553 if (adapter->wolopts & WAKE_MAGIC) { in lan743x_pm_set_wol()
3558 if (adapter->wolopts & WAKE_UCAST) { in lan743x_pm_set_wol()
3564 if (adapter->wolopts & WAKE_BCAST) { in lan743x_pm_set_wol()
3570 if (adapter->wolopts & WAKE_MCAST) { in lan743x_pm_set_wol()
3600 if (adapter->wolopts & WAKE_ARP) { in lan743x_pm_set_wol()
3621 if (adapter->wolopts & WAKE_MAGICSECURE) { in lan743x_pm_set_wol()
3622 sopass = *(u32 *)adapter->sopass; in lan743x_pm_set_wol()
3624 sopass = *(u16 *)&adapter->sopass[4]; in lan743x_pm_set_wol()
3648 if (adapter->wolopts || adapter->phy_wolopts) in lan743x_pm_suspend()
3651 if (adapter->is_pci11x1x) { in lan743x_pm_suspend()
3654 adapter->hw_cfg = data; in lan743x_pm_suspend()
3680 if (adapter->is_pci11x1x) in lan743x_pm_resume()
3681 lan743x_csr_write(adapter, HW_CFG, adapter->hw_cfg); in lan743x_pm_resume()
3685 netif_err(adapter, probe, adapter->netdev, in lan743x_pm_resume()
3692 netif_dbg(adapter, drv, adapter->netdev, in lan743x_pm_resume()
3716 * For instance, it is true when system wakesup after pm-suspend in lan743x_pm_resume()