Lines Matching full:tx

155 	struct lan743x_tx *tx = context;  in lan743x_tx_isr()  local
156 struct lan743x_adapter *adapter = tx->adapter; in lan743x_tx_isr()
163 INT_BIT_DMA_TX_(tx->channel_number)); in lan743x_tx_isr()
166 if (int_sts & INT_BIT_DMA_TX_(tx->channel_number)) { in lan743x_tx_isr()
167 u32 ioc_bit = DMAC_INT_BIT_TX_IOC_(tx->channel_number); in lan743x_tx_isr()
184 napi_schedule(&tx->napi); in lan743x_tx_isr()
192 INT_BIT_DMA_TX_(tx->channel_number)); in lan743x_tx_isr()
259 lan743x_tx_isr(&adapter->tx[channel], in lan743x_intr_shared_isr()
598 /* map TX interrupt to vector */ in lan743x_intr_open()
602 /* Remove TX interrupt from shared mask */ in lan743x_intr_open()
606 &adapter->tx[index]); in lan743x_intr_open()
1209 static void lan743x_tx_release_desc(struct lan743x_tx *tx, in lan743x_tx_release_desc() argument
1217 descriptor = &tx->ring_cpu_ptr[descriptor_index]; in lan743x_tx_release_desc()
1218 buffer_info = &tx->buffer_info[descriptor_index]; in lan743x_tx_release_desc()
1233 dma_unmap_page(&tx->adapter->pdev->dev, in lan743x_tx_release_desc()
1238 dma_unmap_single(&tx->adapter->pdev->dev, in lan743x_tx_release_desc()
1255 lan743x_ptp_unrequest_tx_timestamp(tx->adapter); in lan743x_tx_release_desc()
1260 lan743x_ptp_tx_timestamp_skb(tx->adapter, in lan743x_tx_release_desc()
1275 static int lan743x_tx_next_index(struct lan743x_tx *tx, int index) in lan743x_tx_next_index() argument
1277 return ((++index) % tx->ring_size); in lan743x_tx_next_index()
1280 static void lan743x_tx_release_completed_descriptors(struct lan743x_tx *tx) in lan743x_tx_release_completed_descriptors() argument
1282 while ((*tx->head_cpu_ptr) != (tx->last_head)) { in lan743x_tx_release_completed_descriptors()
1283 lan743x_tx_release_desc(tx, tx->last_head, false); in lan743x_tx_release_completed_descriptors()
1284 tx->last_head = lan743x_tx_next_index(tx, tx->last_head); in lan743x_tx_release_completed_descriptors()
1288 static void lan743x_tx_release_all_descriptors(struct lan743x_tx *tx) in lan743x_tx_release_all_descriptors() argument
1292 original_head = tx->last_head; in lan743x_tx_release_all_descriptors()
1294 lan743x_tx_release_desc(tx, tx->last_head, true); in lan743x_tx_release_all_descriptors()
1295 tx->last_head = lan743x_tx_next_index(tx, tx->last_head); in lan743x_tx_release_all_descriptors()
1296 } while (tx->last_head != original_head); in lan743x_tx_release_all_descriptors()
1297 memset(tx->ring_cpu_ptr, 0, in lan743x_tx_release_all_descriptors()
1298 sizeof(*tx->ring_cpu_ptr) * (tx->ring_size)); in lan743x_tx_release_all_descriptors()
1299 memset(tx->buffer_info, 0, in lan743x_tx_release_all_descriptors()
1300 sizeof(*tx->buffer_info) * (tx->ring_size)); in lan743x_tx_release_all_descriptors()
1303 static int lan743x_tx_get_desc_cnt(struct lan743x_tx *tx, in lan743x_tx_get_desc_cnt() argument
1316 static int lan743x_tx_get_avail_desc(struct lan743x_tx *tx) in lan743x_tx_get_avail_desc() argument
1318 int last_head = tx->last_head; in lan743x_tx_get_avail_desc()
1319 int last_tail = tx->last_tail; in lan743x_tx_get_avail_desc()
1322 return tx->ring_size - last_tail + last_head - 1; in lan743x_tx_get_avail_desc()
1327 void lan743x_tx_set_timestamping_mode(struct lan743x_tx *tx, in lan743x_tx_set_timestamping_mode() argument
1332 tx->ts_flags |= TX_TS_FLAG_TIMESTAMPING_ENABLED; in lan743x_tx_set_timestamping_mode()
1334 tx->ts_flags &= ~TX_TS_FLAG_TIMESTAMPING_ENABLED; in lan743x_tx_set_timestamping_mode()
1336 tx->ts_flags |= TX_TS_FLAG_ONE_STEP_SYNC; in lan743x_tx_set_timestamping_mode()
1338 tx->ts_flags &= ~TX_TS_FLAG_ONE_STEP_SYNC; in lan743x_tx_set_timestamping_mode()
1341 static int lan743x_tx_frame_start(struct lan743x_tx *tx, in lan743x_tx_frame_start() argument
1349 * assuming tx->ring_lock has already been acquired. in lan743x_tx_frame_start()
1353 struct lan743x_adapter *adapter = tx->adapter; in lan743x_tx_frame_start()
1357 tx->frame_flags |= TX_FRAME_FLAG_IN_PROGRESS; in lan743x_tx_frame_start()
1358 tx->frame_first = tx->last_tail; in lan743x_tx_frame_start()
1359 tx->frame_tail = tx->frame_first; in lan743x_tx_frame_start()
1361 tx_descriptor = &tx->ring_cpu_ptr[tx->frame_tail]; in lan743x_tx_frame_start()
1362 buffer_info = &tx->buffer_info[tx->frame_tail]; in lan743x_tx_frame_start()
1378 tx->frame_data0 = (first_buffer_length & in lan743x_tx_frame_start()
1384 tx->frame_data0 |= TX_DESC_DATA0_TSE_; in lan743x_tx_frame_start()
1387 tx->frame_data0 |= TX_DESC_DATA0_ICE_ | in lan743x_tx_frame_start()
1395 static void lan743x_tx_frame_add_lso(struct lan743x_tx *tx, in lan743x_tx_frame_add_lso() argument
1400 * assuming tx->ring_lock has already been acquired. in lan743x_tx_frame_add_lso()
1406 tx->frame_data0 |= TX_DESC_DATA0_EXT_; in lan743x_tx_frame_add_lso()
1408 tx->frame_data0 |= TX_DESC_DATA0_LS_; in lan743x_tx_frame_add_lso()
1409 tx->frame_data0 |= TX_DESC_DATA0_IOC_; in lan743x_tx_frame_add_lso()
1411 tx_descriptor = &tx->ring_cpu_ptr[tx->frame_tail]; in lan743x_tx_frame_add_lso()
1412 tx_descriptor->data0 = tx->frame_data0; in lan743x_tx_frame_add_lso()
1415 tx->frame_tail = lan743x_tx_next_index(tx, tx->frame_tail); in lan743x_tx_frame_add_lso()
1416 tx_descriptor = &tx->ring_cpu_ptr[tx->frame_tail]; in lan743x_tx_frame_add_lso()
1417 buffer_info = &tx->buffer_info[tx->frame_tail]; in lan743x_tx_frame_add_lso()
1429 tx->frame_data0 = (frame_length & TX_DESC_DATA0_EXT_PAY_LENGTH_MASK_) | in lan743x_tx_frame_add_lso()
1436 static int lan743x_tx_frame_add_fragment(struct lan743x_tx *tx, in lan743x_tx_frame_add_fragment() argument
1441 * assuming tx->ring_lock has already been acquired in lan743x_tx_frame_add_fragment()
1445 struct lan743x_adapter *adapter = tx->adapter; in lan743x_tx_frame_add_fragment()
1455 tx_descriptor = &tx->ring_cpu_ptr[tx->frame_tail]; in lan743x_tx_frame_add_fragment()
1456 tx_descriptor->data0 = tx->frame_data0; in lan743x_tx_frame_add_fragment()
1459 tx->frame_tail = lan743x_tx_next_index(tx, tx->frame_tail); in lan743x_tx_frame_add_fragment()
1460 tx_descriptor = &tx->ring_cpu_ptr[tx->frame_tail]; in lan743x_tx_frame_add_fragment()
1461 buffer_info = &tx->buffer_info[tx->frame_tail]; in lan743x_tx_frame_add_fragment()
1469 desc_index = tx->frame_first; in lan743x_tx_frame_add_fragment()
1470 while (desc_index != tx->frame_tail) { in lan743x_tx_frame_add_fragment()
1471 lan743x_tx_release_desc(tx, desc_index, true); in lan743x_tx_frame_add_fragment()
1472 desc_index = lan743x_tx_next_index(tx, desc_index); in lan743x_tx_frame_add_fragment()
1475 tx->frame_flags &= ~TX_FRAME_FLAG_IN_PROGRESS; in lan743x_tx_frame_add_fragment()
1476 tx->frame_first = 0; in lan743x_tx_frame_add_fragment()
1477 tx->frame_data0 = 0; in lan743x_tx_frame_add_fragment()
1478 tx->frame_tail = 0; in lan743x_tx_frame_add_fragment()
1493 tx->frame_data0 = (fragment_length & TX_DESC_DATA0_BUF_LENGTH_MASK_) | in lan743x_tx_frame_add_fragment()
1501 static void lan743x_tx_frame_end(struct lan743x_tx *tx, in lan743x_tx_frame_end() argument
1507 * assuming tx->ring_lock has already been acquired in lan743x_tx_frame_end()
1511 struct lan743x_adapter *adapter = tx->adapter; in lan743x_tx_frame_end()
1515 if ((tx->frame_data0 & TX_DESC_DATA0_DTYPE_MASK_) == in lan743x_tx_frame_end()
1517 tx->frame_data0 |= TX_DESC_DATA0_LS_; in lan743x_tx_frame_end()
1518 tx->frame_data0 |= TX_DESC_DATA0_IOC_; in lan743x_tx_frame_end()
1521 tx_descriptor = &tx->ring_cpu_ptr[tx->frame_tail]; in lan743x_tx_frame_end()
1522 buffer_info = &tx->buffer_info[tx->frame_tail]; in lan743x_tx_frame_end()
1529 tx_descriptor->data0 = tx->frame_data0; in lan743x_tx_frame_end()
1530 tx->frame_tail = lan743x_tx_next_index(tx, tx->frame_tail); in lan743x_tx_frame_end()
1531 tx->last_tail = tx->frame_tail; in lan743x_tx_frame_end()
1535 if (tx->vector_flags & LAN743X_VECTOR_FLAG_VECTOR_ENABLE_AUTO_SET) in lan743x_tx_frame_end()
1537 if (tx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_ENABLE_AUTO_SET) in lan743x_tx_frame_end()
1541 lan743x_csr_write(adapter, TX_TAIL(tx->channel_number), in lan743x_tx_frame_end()
1542 tx_tail_flags | tx->frame_tail); in lan743x_tx_frame_end()
1543 tx->frame_flags &= ~TX_FRAME_FLAG_IN_PROGRESS; in lan743x_tx_frame_end()
1546 static netdev_tx_t lan743x_tx_xmit_frame(struct lan743x_tx *tx, in lan743x_tx_xmit_frame() argument
1560 required_number_of_descriptors = lan743x_tx_get_desc_cnt(tx, skb); in lan743x_tx_xmit_frame()
1562 spin_lock_irqsave(&tx->ring_lock, irq_flags); in lan743x_tx_xmit_frame()
1564 lan743x_tx_get_avail_desc(tx)) { in lan743x_tx_xmit_frame()
1565 if (required_number_of_descriptors > (tx->ring_size - 1)) { in lan743x_tx_xmit_frame()
1569 tx->overflow_skb = skb; in lan743x_tx_xmit_frame()
1570 netif_stop_queue(tx->adapter->netdev); in lan743x_tx_xmit_frame()
1577 (tx->ts_flags & TX_TS_FLAG_TIMESTAMPING_ENABLED) && in lan743x_tx_xmit_frame()
1578 (lan743x_ptp_request_tx_timestamp(tx->adapter))) { in lan743x_tx_xmit_frame()
1581 if (tx->ts_flags & TX_TS_FLAG_ONE_STEP_SYNC) in lan743x_tx_xmit_frame()
1594 if (lan743x_tx_frame_start(tx, in lan743x_tx_xmit_frame()
1604 lan743x_tx_frame_add_lso(tx, frame_length, nr_frags); in lan743x_tx_xmit_frame()
1612 if (lan743x_tx_frame_add_fragment(tx, frag, frame_length)) { in lan743x_tx_xmit_frame()
1624 lan743x_tx_frame_end(tx, skb, do_timestamp, ignore_sync); in lan743x_tx_xmit_frame()
1627 spin_unlock_irqrestore(&tx->ring_lock, irq_flags); in lan743x_tx_xmit_frame()
1633 struct lan743x_tx *tx = container_of(napi, struct lan743x_tx, napi); in lan743x_tx_napi_poll() local
1634 struct lan743x_adapter *adapter = tx->adapter; in lan743x_tx_napi_poll()
1640 ioc_bit = DMAC_INT_BIT_TX_IOC_(tx->channel_number); in lan743x_tx_napi_poll()
1642 if (tx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_STATUS_W2C) in lan743x_tx_napi_poll()
1644 spin_lock_irqsave(&tx->ring_lock, irq_flags); in lan743x_tx_napi_poll()
1646 /* clean up tx ring */ in lan743x_tx_napi_poll()
1647 lan743x_tx_release_completed_descriptors(tx); in lan743x_tx_napi_poll()
1649 if (tx->overflow_skb) { in lan743x_tx_napi_poll()
1650 if (lan743x_tx_get_desc_cnt(tx, tx->overflow_skb) <= in lan743x_tx_napi_poll()
1651 lan743x_tx_get_avail_desc(tx)) in lan743x_tx_napi_poll()
1657 spin_unlock_irqrestore(&tx->ring_lock, irq_flags); in lan743x_tx_napi_poll()
1661 lan743x_tx_xmit_frame(tx, tx->overflow_skb); in lan743x_tx_napi_poll()
1662 tx->overflow_skb = NULL; in lan743x_tx_napi_poll()
1671 INT_BIT_DMA_TX_(tx->channel_number)); in lan743x_tx_napi_poll()
1678 static void lan743x_tx_ring_cleanup(struct lan743x_tx *tx) in lan743x_tx_ring_cleanup() argument
1680 if (tx->head_cpu_ptr) { in lan743x_tx_ring_cleanup()
1681 pci_free_consistent(tx->adapter->pdev, in lan743x_tx_ring_cleanup()
1682 sizeof(*tx->head_cpu_ptr), in lan743x_tx_ring_cleanup()
1683 (void *)(tx->head_cpu_ptr), in lan743x_tx_ring_cleanup()
1684 tx->head_dma_ptr); in lan743x_tx_ring_cleanup()
1685 tx->head_cpu_ptr = NULL; in lan743x_tx_ring_cleanup()
1686 tx->head_dma_ptr = 0; in lan743x_tx_ring_cleanup()
1688 kfree(tx->buffer_info); in lan743x_tx_ring_cleanup()
1689 tx->buffer_info = NULL; in lan743x_tx_ring_cleanup()
1691 if (tx->ring_cpu_ptr) { in lan743x_tx_ring_cleanup()
1692 pci_free_consistent(tx->adapter->pdev, in lan743x_tx_ring_cleanup()
1693 tx->ring_allocation_size, in lan743x_tx_ring_cleanup()
1694 tx->ring_cpu_ptr, in lan743x_tx_ring_cleanup()
1695 tx->ring_dma_ptr); in lan743x_tx_ring_cleanup()
1696 tx->ring_allocation_size = 0; in lan743x_tx_ring_cleanup()
1697 tx->ring_cpu_ptr = NULL; in lan743x_tx_ring_cleanup()
1698 tx->ring_dma_ptr = 0; in lan743x_tx_ring_cleanup()
1700 tx->ring_size = 0; in lan743x_tx_ring_cleanup()
1703 static int lan743x_tx_ring_init(struct lan743x_tx *tx) in lan743x_tx_ring_init() argument
1710 tx->ring_size = LAN743X_TX_RING_SIZE; in lan743x_tx_ring_init()
1711 if (tx->ring_size & ~TX_CFG_B_TX_RING_LEN_MASK_) { in lan743x_tx_ring_init()
1715 ring_allocation_size = ALIGN(tx->ring_size * in lan743x_tx_ring_init()
1719 cpu_ptr = pci_zalloc_consistent(tx->adapter->pdev, in lan743x_tx_ring_init()
1726 tx->ring_allocation_size = ring_allocation_size; in lan743x_tx_ring_init()
1727 tx->ring_cpu_ptr = (struct lan743x_tx_descriptor *)cpu_ptr; in lan743x_tx_ring_init()
1728 tx->ring_dma_ptr = dma_ptr; in lan743x_tx_ring_init()
1730 cpu_ptr = kcalloc(tx->ring_size, sizeof(*tx->buffer_info), GFP_KERNEL); in lan743x_tx_ring_init()
1735 tx->buffer_info = (struct lan743x_tx_buffer_info *)cpu_ptr; in lan743x_tx_ring_init()
1737 cpu_ptr = pci_zalloc_consistent(tx->adapter->pdev, in lan743x_tx_ring_init()
1738 sizeof(*tx->head_cpu_ptr), &dma_ptr); in lan743x_tx_ring_init()
1744 tx->head_cpu_ptr = cpu_ptr; in lan743x_tx_ring_init()
1745 tx->head_dma_ptr = dma_ptr; in lan743x_tx_ring_init()
1746 if (tx->head_dma_ptr & 0x3) { in lan743x_tx_ring_init()
1754 lan743x_tx_ring_cleanup(tx); in lan743x_tx_ring_init()
1758 static void lan743x_tx_close(struct lan743x_tx *tx) in lan743x_tx_close() argument
1760 struct lan743x_adapter *adapter = tx->adapter; in lan743x_tx_close()
1764 DMAC_CMD_STOP_T_(tx->channel_number)); in lan743x_tx_close()
1765 lan743x_dmac_tx_wait_till_stopped(adapter, tx->channel_number); in lan743x_tx_close()
1769 DMAC_INT_BIT_TX_IOC_(tx->channel_number)); in lan743x_tx_close()
1771 INT_BIT_DMA_TX_(tx->channel_number)); in lan743x_tx_close()
1772 napi_disable(&tx->napi); in lan743x_tx_close()
1773 netif_napi_del(&tx->napi); in lan743x_tx_close()
1776 FCT_TX_CTL_DIS_(tx->channel_number)); in lan743x_tx_close()
1778 FCT_TX_CTL_EN_(tx->channel_number), in lan743x_tx_close()
1781 lan743x_tx_release_all_descriptors(tx); in lan743x_tx_close()
1783 if (tx->overflow_skb) { in lan743x_tx_close()
1784 dev_kfree_skb(tx->overflow_skb); in lan743x_tx_close()
1785 tx->overflow_skb = NULL; in lan743x_tx_close()
1788 lan743x_tx_ring_cleanup(tx); in lan743x_tx_close()
1791 static int lan743x_tx_open(struct lan743x_tx *tx) in lan743x_tx_open() argument
1797 adapter = tx->adapter; in lan743x_tx_open()
1798 ret = lan743x_tx_ring_init(tx); in lan743x_tx_open()
1804 FCT_TX_CTL_RESET_(tx->channel_number)); in lan743x_tx_open()
1806 FCT_TX_CTL_RESET_(tx->channel_number), in lan743x_tx_open()
1811 FCT_TX_CTL_EN_(tx->channel_number)); in lan743x_tx_open()
1813 /* reset tx channel */ in lan743x_tx_open()
1815 DMAC_CMD_TX_SWR_(tx->channel_number)); in lan743x_tx_open()
1817 DMAC_CMD_TX_SWR_(tx->channel_number), in lan743x_tx_open()
1822 TX_BASE_ADDRH(tx->channel_number), in lan743x_tx_open()
1823 DMA_ADDR_HIGH32(tx->ring_dma_ptr)); in lan743x_tx_open()
1825 TX_BASE_ADDRL(tx->channel_number), in lan743x_tx_open()
1826 DMA_ADDR_LOW32(tx->ring_dma_ptr)); in lan743x_tx_open()
1829 data = lan743x_csr_read(adapter, TX_CFG_B(tx->channel_number)); in lan743x_tx_open()
1831 data |= ((tx->ring_size) & TX_CFG_B_TX_RING_LEN_MASK_); in lan743x_tx_open()
1834 lan743x_csr_write(adapter, TX_CFG_B(tx->channel_number), data); in lan743x_tx_open()
1844 lan743x_csr_write(adapter, TX_CFG_A(tx->channel_number), data); in lan743x_tx_open()
1848 TX_HEAD_WRITEBACK_ADDRH(tx->channel_number), in lan743x_tx_open()
1849 DMA_ADDR_HIGH32(tx->head_dma_ptr)); in lan743x_tx_open()
1851 TX_HEAD_WRITEBACK_ADDRL(tx->channel_number), in lan743x_tx_open()
1852 DMA_ADDR_LOW32(tx->head_dma_ptr)); in lan743x_tx_open()
1855 tx->last_head = lan743x_csr_read(adapter, TX_HEAD(tx->channel_number)); in lan743x_tx_open()
1858 tx->last_tail = 0; in lan743x_tx_open()
1859 lan743x_csr_write(adapter, TX_TAIL(tx->channel_number), in lan743x_tx_open()
1860 (u32)(tx->last_tail)); in lan743x_tx_open()
1861 tx->vector_flags = lan743x_intr_get_vector_flags(adapter, in lan743x_tx_open()
1863 (tx->channel_number)); in lan743x_tx_open()
1865 &tx->napi, lan743x_tx_napi_poll, in lan743x_tx_open()
1866 tx->ring_size - 1); in lan743x_tx_open()
1867 napi_enable(&tx->napi); in lan743x_tx_open()
1870 if (tx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_ENABLE_AUTO_CLEAR) in lan743x_tx_open()
1872 if (tx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_STATUS_AUTO_CLEAR) in lan743x_tx_open()
1874 if (tx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_STATUS_R2C) in lan743x_tx_open()
1876 if (tx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_ENABLE_R2C) in lan743x_tx_open()
1878 lan743x_csr_write(adapter, TX_CFG_C(tx->channel_number), data); in lan743x_tx_open()
1880 if (!(tx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_ENABLE_AUTO_SET)) in lan743x_tx_open()
1882 INT_BIT_DMA_TX_(tx->channel_number)); in lan743x_tx_open()
1884 DMAC_INT_BIT_TX_IOC_(tx->channel_number)); in lan743x_tx_open()
1888 DMAC_CMD_START_T_(tx->channel_number)); in lan743x_tx_open()
2465 lan743x_tx_close(&adapter->tx[0]); in lan743x_netdev_close()
2511 ret = lan743x_tx_open(&adapter->tx[0]); in lan743x_netdev_open()
2544 return lan743x_tx_xmit_frame(&adapter->tx[0], skb); in lan743x_netdev_xmit_frame()
2671 struct lan743x_tx *tx; in lan743x_hardware_init() local
2706 tx = &adapter->tx[0]; in lan743x_hardware_init()
2707 tx->adapter = adapter; in lan743x_hardware_init()
2708 tx->channel_number = 0; in lan743x_hardware_init()
2709 spin_lock_init(&tx->ring_lock); in lan743x_hardware_init()