Lines Matching refs:tx

216 	struct lan743x_tx *tx = context;  in lan743x_tx_isr()  local
217 struct lan743x_adapter *adapter = tx->adapter; in lan743x_tx_isr()
223 INT_BIT_DMA_TX_(tx->channel_number)); in lan743x_tx_isr()
226 if (int_sts & INT_BIT_DMA_TX_(tx->channel_number)) { in lan743x_tx_isr()
227 u32 ioc_bit = DMAC_INT_BIT_TX_IOC_(tx->channel_number); in lan743x_tx_isr()
244 napi_schedule(&tx->napi); in lan743x_tx_isr()
252 INT_BIT_DMA_TX_(tx->channel_number)); in lan743x_tx_isr()
319 lan743x_tx_isr(&adapter->tx[channel], in lan743x_intr_shared_isr()
677 &adapter->tx[index]); in lan743x_intr_open()
1730 static void lan743x_tx_release_desc(struct lan743x_tx *tx, in lan743x_tx_release_desc() argument
1738 descriptor = &tx->ring_cpu_ptr[descriptor_index]; in lan743x_tx_release_desc()
1739 buffer_info = &tx->buffer_info[descriptor_index]; in lan743x_tx_release_desc()
1754 dma_unmap_page(&tx->adapter->pdev->dev, in lan743x_tx_release_desc()
1759 dma_unmap_single(&tx->adapter->pdev->dev, in lan743x_tx_release_desc()
1776 lan743x_ptp_unrequest_tx_timestamp(tx->adapter); in lan743x_tx_release_desc()
1781 lan743x_ptp_tx_timestamp_skb(tx->adapter, in lan743x_tx_release_desc()
1796 static int lan743x_tx_next_index(struct lan743x_tx *tx, int index) in lan743x_tx_next_index() argument
1798 return ((++index) % tx->ring_size); in lan743x_tx_next_index()
1801 static void lan743x_tx_release_completed_descriptors(struct lan743x_tx *tx) in lan743x_tx_release_completed_descriptors() argument
1803 while (le32_to_cpu(*tx->head_cpu_ptr) != (tx->last_head)) { in lan743x_tx_release_completed_descriptors()
1804 lan743x_tx_release_desc(tx, tx->last_head, false); in lan743x_tx_release_completed_descriptors()
1805 tx->last_head = lan743x_tx_next_index(tx, tx->last_head); in lan743x_tx_release_completed_descriptors()
1809 static void lan743x_tx_release_all_descriptors(struct lan743x_tx *tx) in lan743x_tx_release_all_descriptors() argument
1813 original_head = tx->last_head; in lan743x_tx_release_all_descriptors()
1815 lan743x_tx_release_desc(tx, tx->last_head, true); in lan743x_tx_release_all_descriptors()
1816 tx->last_head = lan743x_tx_next_index(tx, tx->last_head); in lan743x_tx_release_all_descriptors()
1817 } while (tx->last_head != original_head); in lan743x_tx_release_all_descriptors()
1818 memset(tx->ring_cpu_ptr, 0, in lan743x_tx_release_all_descriptors()
1819 sizeof(*tx->ring_cpu_ptr) * (tx->ring_size)); in lan743x_tx_release_all_descriptors()
1820 memset(tx->buffer_info, 0, in lan743x_tx_release_all_descriptors()
1821 sizeof(*tx->buffer_info) * (tx->ring_size)); in lan743x_tx_release_all_descriptors()
1824 static int lan743x_tx_get_desc_cnt(struct lan743x_tx *tx, in lan743x_tx_get_desc_cnt() argument
1837 static int lan743x_tx_get_avail_desc(struct lan743x_tx *tx) in lan743x_tx_get_avail_desc() argument
1839 int last_head = tx->last_head; in lan743x_tx_get_avail_desc()
1840 int last_tail = tx->last_tail; in lan743x_tx_get_avail_desc()
1843 return tx->ring_size - last_tail + last_head - 1; in lan743x_tx_get_avail_desc()
1848 void lan743x_tx_set_timestamping_mode(struct lan743x_tx *tx, in lan743x_tx_set_timestamping_mode() argument
1853 tx->ts_flags |= TX_TS_FLAG_TIMESTAMPING_ENABLED; in lan743x_tx_set_timestamping_mode()
1855 tx->ts_flags &= ~TX_TS_FLAG_TIMESTAMPING_ENABLED; in lan743x_tx_set_timestamping_mode()
1857 tx->ts_flags |= TX_TS_FLAG_ONE_STEP_SYNC; in lan743x_tx_set_timestamping_mode()
1859 tx->ts_flags &= ~TX_TS_FLAG_ONE_STEP_SYNC; in lan743x_tx_set_timestamping_mode()
1862 static int lan743x_tx_frame_start(struct lan743x_tx *tx, in lan743x_tx_frame_start() argument
1874 struct lan743x_adapter *adapter = tx->adapter; in lan743x_tx_frame_start()
1878 tx->frame_flags |= TX_FRAME_FLAG_IN_PROGRESS; in lan743x_tx_frame_start()
1879 tx->frame_first = tx->last_tail; in lan743x_tx_frame_start()
1880 tx->frame_tail = tx->frame_first; in lan743x_tx_frame_start()
1882 tx_descriptor = &tx->ring_cpu_ptr[tx->frame_tail]; in lan743x_tx_frame_start()
1883 buffer_info = &tx->buffer_info[tx->frame_tail]; in lan743x_tx_frame_start()
1899 tx->frame_data0 = (first_buffer_length & in lan743x_tx_frame_start()
1905 tx->frame_data0 |= TX_DESC_DATA0_TSE_; in lan743x_tx_frame_start()
1908 tx->frame_data0 |= TX_DESC_DATA0_ICE_ | in lan743x_tx_frame_start()
1916 static void lan743x_tx_frame_add_lso(struct lan743x_tx *tx, in lan743x_tx_frame_add_lso() argument
1927 tx->frame_data0 |= TX_DESC_DATA0_EXT_; in lan743x_tx_frame_add_lso()
1929 tx->frame_data0 |= TX_DESC_DATA0_LS_; in lan743x_tx_frame_add_lso()
1930 tx->frame_data0 |= TX_DESC_DATA0_IOC_; in lan743x_tx_frame_add_lso()
1932 tx_descriptor = &tx->ring_cpu_ptr[tx->frame_tail]; in lan743x_tx_frame_add_lso()
1933 tx_descriptor->data0 = cpu_to_le32(tx->frame_data0); in lan743x_tx_frame_add_lso()
1936 tx->frame_tail = lan743x_tx_next_index(tx, tx->frame_tail); in lan743x_tx_frame_add_lso()
1937 tx_descriptor = &tx->ring_cpu_ptr[tx->frame_tail]; in lan743x_tx_frame_add_lso()
1938 buffer_info = &tx->buffer_info[tx->frame_tail]; in lan743x_tx_frame_add_lso()
1950 tx->frame_data0 = (frame_length & TX_DESC_DATA0_EXT_PAY_LENGTH_MASK_) | in lan743x_tx_frame_add_lso()
1957 static int lan743x_tx_frame_add_fragment(struct lan743x_tx *tx, in lan743x_tx_frame_add_fragment() argument
1966 struct lan743x_adapter *adapter = tx->adapter; in lan743x_tx_frame_add_fragment()
1976 tx_descriptor = &tx->ring_cpu_ptr[tx->frame_tail]; in lan743x_tx_frame_add_fragment()
1977 tx_descriptor->data0 = cpu_to_le32(tx->frame_data0); in lan743x_tx_frame_add_fragment()
1980 tx->frame_tail = lan743x_tx_next_index(tx, tx->frame_tail); in lan743x_tx_frame_add_fragment()
1981 tx_descriptor = &tx->ring_cpu_ptr[tx->frame_tail]; in lan743x_tx_frame_add_fragment()
1982 buffer_info = &tx->buffer_info[tx->frame_tail]; in lan743x_tx_frame_add_fragment()
1990 desc_index = tx->frame_first; in lan743x_tx_frame_add_fragment()
1991 while (desc_index != tx->frame_tail) { in lan743x_tx_frame_add_fragment()
1992 lan743x_tx_release_desc(tx, desc_index, true); in lan743x_tx_frame_add_fragment()
1993 desc_index = lan743x_tx_next_index(tx, desc_index); in lan743x_tx_frame_add_fragment()
1996 tx->frame_flags &= ~TX_FRAME_FLAG_IN_PROGRESS; in lan743x_tx_frame_add_fragment()
1997 tx->frame_first = 0; in lan743x_tx_frame_add_fragment()
1998 tx->frame_data0 = 0; in lan743x_tx_frame_add_fragment()
1999 tx->frame_tail = 0; in lan743x_tx_frame_add_fragment()
2014 tx->frame_data0 = (fragment_length & TX_DESC_DATA0_BUF_LENGTH_MASK_) | in lan743x_tx_frame_add_fragment()
2022 static void lan743x_tx_frame_end(struct lan743x_tx *tx, in lan743x_tx_frame_end() argument
2032 struct lan743x_adapter *adapter = tx->adapter; in lan743x_tx_frame_end()
2036 if ((tx->frame_data0 & TX_DESC_DATA0_DTYPE_MASK_) == in lan743x_tx_frame_end()
2038 tx->frame_data0 |= TX_DESC_DATA0_LS_; in lan743x_tx_frame_end()
2039 tx->frame_data0 |= TX_DESC_DATA0_IOC_; in lan743x_tx_frame_end()
2042 tx_descriptor = &tx->ring_cpu_ptr[tx->frame_tail]; in lan743x_tx_frame_end()
2043 buffer_info = &tx->buffer_info[tx->frame_tail]; in lan743x_tx_frame_end()
2050 tx_descriptor->data0 = cpu_to_le32(tx->frame_data0); in lan743x_tx_frame_end()
2051 tx->frame_tail = lan743x_tx_next_index(tx, tx->frame_tail); in lan743x_tx_frame_end()
2052 tx->last_tail = tx->frame_tail; in lan743x_tx_frame_end()
2056 if (tx->vector_flags & LAN743X_VECTOR_FLAG_VECTOR_ENABLE_AUTO_SET) in lan743x_tx_frame_end()
2058 if (tx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_ENABLE_AUTO_SET) in lan743x_tx_frame_end()
2062 lan743x_csr_write(adapter, TX_TAIL(tx->channel_number), in lan743x_tx_frame_end()
2063 tx_tail_flags | tx->frame_tail); in lan743x_tx_frame_end()
2064 tx->frame_flags &= ~TX_FRAME_FLAG_IN_PROGRESS; in lan743x_tx_frame_end()
2067 static netdev_tx_t lan743x_tx_xmit_frame(struct lan743x_tx *tx, in lan743x_tx_xmit_frame() argument
2083 required_number_of_descriptors = lan743x_tx_get_desc_cnt(tx, skb); in lan743x_tx_xmit_frame()
2085 spin_lock_irqsave(&tx->ring_lock, irq_flags); in lan743x_tx_xmit_frame()
2087 lan743x_tx_get_avail_desc(tx)) { in lan743x_tx_xmit_frame()
2088 if (required_number_of_descriptors > (tx->ring_size - 1)) { in lan743x_tx_xmit_frame()
2092 tx->rqd_descriptors = required_number_of_descriptors; in lan743x_tx_xmit_frame()
2094 txq = netdev_get_tx_queue(tx->adapter->netdev, in lan743x_tx_xmit_frame()
2095 tx->channel_number); in lan743x_tx_xmit_frame()
2103 (tx->ts_flags & TX_TS_FLAG_TIMESTAMPING_ENABLED) && in lan743x_tx_xmit_frame()
2104 (lan743x_ptp_request_tx_timestamp(tx->adapter))) { in lan743x_tx_xmit_frame()
2107 if (tx->ts_flags & TX_TS_FLAG_ONE_STEP_SYNC) in lan743x_tx_xmit_frame()
2120 if (lan743x_tx_frame_start(tx, in lan743x_tx_xmit_frame()
2128 tx->frame_count++; in lan743x_tx_xmit_frame()
2131 lan743x_tx_frame_add_lso(tx, frame_length, nr_frags); in lan743x_tx_xmit_frame()
2139 if (lan743x_tx_frame_add_fragment(tx, frag, frame_length)) { in lan743x_tx_xmit_frame()
2151 lan743x_tx_frame_end(tx, skb, do_timestamp, ignore_sync); in lan743x_tx_xmit_frame()
2154 spin_unlock_irqrestore(&tx->ring_lock, irq_flags); in lan743x_tx_xmit_frame()
2160 struct lan743x_tx *tx = container_of(napi, struct lan743x_tx, napi); in lan743x_tx_napi_poll() local
2161 struct lan743x_adapter *adapter = tx->adapter; in lan743x_tx_napi_poll()
2166 ioc_bit = DMAC_INT_BIT_TX_IOC_(tx->channel_number); in lan743x_tx_napi_poll()
2168 if (tx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_STATUS_W2C) in lan743x_tx_napi_poll()
2170 spin_lock_irqsave(&tx->ring_lock, irq_flags); in lan743x_tx_napi_poll()
2173 lan743x_tx_release_completed_descriptors(tx); in lan743x_tx_napi_poll()
2174 txq = netdev_get_tx_queue(adapter->netdev, tx->channel_number); in lan743x_tx_napi_poll()
2176 if (tx->rqd_descriptors) { in lan743x_tx_napi_poll()
2177 if (tx->rqd_descriptors <= in lan743x_tx_napi_poll()
2178 lan743x_tx_get_avail_desc(tx)) { in lan743x_tx_napi_poll()
2179 tx->rqd_descriptors = 0; in lan743x_tx_napi_poll()
2186 spin_unlock_irqrestore(&tx->ring_lock, irq_flags); in lan743x_tx_napi_poll()
2193 INT_BIT_DMA_TX_(tx->channel_number)); in lan743x_tx_napi_poll()
2200 static void lan743x_tx_ring_cleanup(struct lan743x_tx *tx) in lan743x_tx_ring_cleanup() argument
2202 if (tx->head_cpu_ptr) { in lan743x_tx_ring_cleanup()
2203 dma_free_coherent(&tx->adapter->pdev->dev, in lan743x_tx_ring_cleanup()
2204 sizeof(*tx->head_cpu_ptr), tx->head_cpu_ptr, in lan743x_tx_ring_cleanup()
2205 tx->head_dma_ptr); in lan743x_tx_ring_cleanup()
2206 tx->head_cpu_ptr = NULL; in lan743x_tx_ring_cleanup()
2207 tx->head_dma_ptr = 0; in lan743x_tx_ring_cleanup()
2209 kfree(tx->buffer_info); in lan743x_tx_ring_cleanup()
2210 tx->buffer_info = NULL; in lan743x_tx_ring_cleanup()
2212 if (tx->ring_cpu_ptr) { in lan743x_tx_ring_cleanup()
2213 dma_free_coherent(&tx->adapter->pdev->dev, in lan743x_tx_ring_cleanup()
2214 tx->ring_allocation_size, tx->ring_cpu_ptr, in lan743x_tx_ring_cleanup()
2215 tx->ring_dma_ptr); in lan743x_tx_ring_cleanup()
2216 tx->ring_allocation_size = 0; in lan743x_tx_ring_cleanup()
2217 tx->ring_cpu_ptr = NULL; in lan743x_tx_ring_cleanup()
2218 tx->ring_dma_ptr = 0; in lan743x_tx_ring_cleanup()
2220 tx->ring_size = 0; in lan743x_tx_ring_cleanup()
2223 static int lan743x_tx_ring_init(struct lan743x_tx *tx) in lan743x_tx_ring_init() argument
2230 tx->ring_size = LAN743X_TX_RING_SIZE; in lan743x_tx_ring_init()
2231 if (tx->ring_size & ~TX_CFG_B_TX_RING_LEN_MASK_) { in lan743x_tx_ring_init()
2235 if (dma_set_mask_and_coherent(&tx->adapter->pdev->dev, in lan743x_tx_ring_init()
2237 dev_warn(&tx->adapter->pdev->dev, in lan743x_tx_ring_init()
2242 ring_allocation_size = ALIGN(tx->ring_size * in lan743x_tx_ring_init()
2246 cpu_ptr = dma_alloc_coherent(&tx->adapter->pdev->dev, in lan743x_tx_ring_init()
2253 tx->ring_allocation_size = ring_allocation_size; in lan743x_tx_ring_init()
2254 tx->ring_cpu_ptr = (struct lan743x_tx_descriptor *)cpu_ptr; in lan743x_tx_ring_init()
2255 tx->ring_dma_ptr = dma_ptr; in lan743x_tx_ring_init()
2257 cpu_ptr = kcalloc(tx->ring_size, sizeof(*tx->buffer_info), GFP_KERNEL); in lan743x_tx_ring_init()
2262 tx->buffer_info = (struct lan743x_tx_buffer_info *)cpu_ptr; in lan743x_tx_ring_init()
2264 cpu_ptr = dma_alloc_coherent(&tx->adapter->pdev->dev, in lan743x_tx_ring_init()
2265 sizeof(*tx->head_cpu_ptr), &dma_ptr, in lan743x_tx_ring_init()
2272 tx->head_cpu_ptr = cpu_ptr; in lan743x_tx_ring_init()
2273 tx->head_dma_ptr = dma_ptr; in lan743x_tx_ring_init()
2274 if (tx->head_dma_ptr & 0x3) { in lan743x_tx_ring_init()
2282 lan743x_tx_ring_cleanup(tx); in lan743x_tx_ring_init()
2286 static void lan743x_tx_close(struct lan743x_tx *tx) in lan743x_tx_close() argument
2288 struct lan743x_adapter *adapter = tx->adapter; in lan743x_tx_close()
2292 DMAC_CMD_STOP_T_(tx->channel_number)); in lan743x_tx_close()
2293 lan743x_dmac_tx_wait_till_stopped(adapter, tx->channel_number); in lan743x_tx_close()
2297 DMAC_INT_BIT_TX_IOC_(tx->channel_number)); in lan743x_tx_close()
2299 INT_BIT_DMA_TX_(tx->channel_number)); in lan743x_tx_close()
2300 napi_disable(&tx->napi); in lan743x_tx_close()
2301 netif_napi_del(&tx->napi); in lan743x_tx_close()
2304 FCT_TX_CTL_DIS_(tx->channel_number)); in lan743x_tx_close()
2306 FCT_TX_CTL_EN_(tx->channel_number), in lan743x_tx_close()
2309 lan743x_tx_release_all_descriptors(tx); in lan743x_tx_close()
2311 tx->rqd_descriptors = 0; in lan743x_tx_close()
2313 lan743x_tx_ring_cleanup(tx); in lan743x_tx_close()
2316 static int lan743x_tx_open(struct lan743x_tx *tx) in lan743x_tx_open() argument
2322 adapter = tx->adapter; in lan743x_tx_open()
2323 ret = lan743x_tx_ring_init(tx); in lan743x_tx_open()
2329 FCT_TX_CTL_RESET_(tx->channel_number)); in lan743x_tx_open()
2331 FCT_TX_CTL_RESET_(tx->channel_number), in lan743x_tx_open()
2336 FCT_TX_CTL_EN_(tx->channel_number)); in lan743x_tx_open()
2340 DMAC_CMD_TX_SWR_(tx->channel_number)); in lan743x_tx_open()
2342 DMAC_CMD_TX_SWR_(tx->channel_number), in lan743x_tx_open()
2347 TX_BASE_ADDRH(tx->channel_number), in lan743x_tx_open()
2348 DMA_ADDR_HIGH32(tx->ring_dma_ptr)); in lan743x_tx_open()
2350 TX_BASE_ADDRL(tx->channel_number), in lan743x_tx_open()
2351 DMA_ADDR_LOW32(tx->ring_dma_ptr)); in lan743x_tx_open()
2354 data = lan743x_csr_read(adapter, TX_CFG_B(tx->channel_number)); in lan743x_tx_open()
2356 data |= ((tx->ring_size) & TX_CFG_B_TX_RING_LEN_MASK_); in lan743x_tx_open()
2359 lan743x_csr_write(adapter, TX_CFG_B(tx->channel_number), data); in lan743x_tx_open()
2369 lan743x_csr_write(adapter, TX_CFG_A(tx->channel_number), data); in lan743x_tx_open()
2373 TX_HEAD_WRITEBACK_ADDRH(tx->channel_number), in lan743x_tx_open()
2374 DMA_ADDR_HIGH32(tx->head_dma_ptr)); in lan743x_tx_open()
2376 TX_HEAD_WRITEBACK_ADDRL(tx->channel_number), in lan743x_tx_open()
2377 DMA_ADDR_LOW32(tx->head_dma_ptr)); in lan743x_tx_open()
2380 tx->last_head = lan743x_csr_read(adapter, TX_HEAD(tx->channel_number)); in lan743x_tx_open()
2383 tx->last_tail = 0; in lan743x_tx_open()
2384 lan743x_csr_write(adapter, TX_TAIL(tx->channel_number), in lan743x_tx_open()
2385 (u32)(tx->last_tail)); in lan743x_tx_open()
2386 tx->vector_flags = lan743x_intr_get_vector_flags(adapter, in lan743x_tx_open()
2388 (tx->channel_number)); in lan743x_tx_open()
2390 &tx->napi, lan743x_tx_napi_poll, in lan743x_tx_open()
2392 napi_enable(&tx->napi); in lan743x_tx_open()
2395 if (tx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_ENABLE_AUTO_CLEAR) in lan743x_tx_open()
2397 if (tx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_STATUS_AUTO_CLEAR) in lan743x_tx_open()
2399 if (tx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_STATUS_R2C) in lan743x_tx_open()
2401 if (tx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_ENABLE_R2C) in lan743x_tx_open()
2403 lan743x_csr_write(adapter, TX_CFG_C(tx->channel_number), data); in lan743x_tx_open()
2405 if (!(tx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_ENABLE_AUTO_SET)) in lan743x_tx_open()
2407 INT_BIT_DMA_TX_(tx->channel_number)); in lan743x_tx_open()
2409 DMAC_INT_BIT_TX_IOC_(tx->channel_number)); in lan743x_tx_open()
2413 DMAC_CMD_START_T_(tx->channel_number)); in lan743x_tx_open()
2993 lan743x_tx_close(&adapter->tx[index]); in lan743x_netdev_close()
3040 ret = lan743x_tx_open(&adapter->tx[index]); in lan743x_netdev_open()
3048 if (adapter->tx[index].ring_cpu_ptr) in lan743x_netdev_open()
3049 lan743x_tx_close(&adapter->tx[index]); in lan743x_netdev_open()
3083 return lan743x_tx_xmit_frame(&adapter->tx[ch], skb); in lan743x_netdev_xmit_frame()
3210 struct lan743x_tx *tx; in lan743x_hardware_init() local
3259 tx = &adapter->tx[index]; in lan743x_hardware_init()
3260 tx->adapter = adapter; in lan743x_hardware_init()
3261 tx->channel_number = index; in lan743x_hardware_init()
3262 spin_lock_init(&tx->ring_lock); in lan743x_hardware_init()