Lines Matching full:rx
196 struct lan743x_rx *rx = context; in lan743x_rx_isr() local
197 struct lan743x_adapter *adapter = rx->adapter; in lan743x_rx_isr()
202 INT_BIT_DMA_RX_(rx->channel_number)); in lan743x_rx_isr()
205 if (int_sts & INT_BIT_DMA_RX_(rx->channel_number)) { in lan743x_rx_isr()
206 u32 rx_frame_bit = DMAC_INT_BIT_RXFRM_(rx->channel_number); in lan743x_rx_isr()
223 napi_schedule(&rx->napi); in lan743x_rx_isr()
231 INT_BIT_DMA_RX_(rx->channel_number)); in lan743x_rx_isr()
246 lan743x_rx_isr(&adapter->rx[channel], in lan743x_intr_shared_isr()
638 /* map RX interrupt to vector */ in lan743x_intr_open()
648 /* Remove RX interrupt from shared mask */ in lan743x_intr_open()
652 &adapter->rx[index]); in lan743x_intr_open()
1934 static int lan743x_rx_next_index(struct lan743x_rx *rx, int index) in lan743x_rx_next_index() argument
1936 return ((++index) % rx->ring_size); in lan743x_rx_next_index()
1939 static void lan743x_rx_update_tail(struct lan743x_rx *rx, int index) in lan743x_rx_update_tail() argument
1943 lan743x_csr_write(rx->adapter, RX_TAIL(rx->channel_number), in lan743x_rx_update_tail()
1947 static int lan743x_rx_init_ring_element(struct lan743x_rx *rx, int index, in lan743x_rx_init_ring_element() argument
1950 struct net_device *netdev = rx->adapter->netdev; in lan743x_rx_init_ring_element()
1951 struct device *dev = &rx->adapter->pdev->dev; in lan743x_rx_init_ring_element()
1960 descriptor = &rx->ring_cpu_ptr[index]; in lan743x_rx_init_ring_element()
1961 buffer_info = &rx->buffer_info[index]; in lan743x_rx_init_ring_element()
1999 lan743x_rx_update_tail(rx, index); in lan743x_rx_init_ring_element()
2004 static void lan743x_rx_reuse_ring_element(struct lan743x_rx *rx, int index) in lan743x_rx_reuse_ring_element() argument
2009 descriptor = &rx->ring_cpu_ptr[index]; in lan743x_rx_reuse_ring_element()
2010 buffer_info = &rx->buffer_info[index]; in lan743x_rx_reuse_ring_element()
2018 lan743x_rx_update_tail(rx, index); in lan743x_rx_reuse_ring_element()
2021 static void lan743x_rx_release_ring_element(struct lan743x_rx *rx, int index) in lan743x_rx_release_ring_element() argument
2026 descriptor = &rx->ring_cpu_ptr[index]; in lan743x_rx_release_ring_element()
2027 buffer_info = &rx->buffer_info[index]; in lan743x_rx_release_ring_element()
2032 dma_unmap_single(&rx->adapter->pdev->dev, in lan743x_rx_release_ring_element()
2062 static int lan743x_rx_process_buffer(struct lan743x_rx *rx) in lan743x_rx_process_buffer() argument
2064 int current_head_index = le32_to_cpu(*rx->head_cpu_ptr); in lan743x_rx_process_buffer()
2066 struct net_device *netdev = rx->adapter->netdev; in lan743x_rx_process_buffer()
2074 if (current_head_index < 0 || current_head_index >= rx->ring_size) in lan743x_rx_process_buffer()
2077 if (rx->last_head < 0 || rx->last_head >= rx->ring_size) in lan743x_rx_process_buffer()
2080 if (rx->last_head == current_head_index) in lan743x_rx_process_buffer()
2083 descriptor = &rx->ring_cpu_ptr[rx->last_head]; in lan743x_rx_process_buffer()
2086 buffer_info = &rx->buffer_info[rx->last_head]; in lan743x_rx_process_buffer()
2093 int index = lan743x_rx_next_index(rx, rx->last_head); in lan743x_rx_process_buffer()
2098 desc_ext = &rx->ring_cpu_ptr[index]; in lan743x_rx_process_buffer()
2124 if (lan743x_rx_init_ring_element(rx, rx->last_head, in lan743x_rx_process_buffer()
2130 lan743x_rx_reuse_ring_element(rx, rx->last_head); in lan743x_rx_process_buffer()
2132 dev_kfree_skb_irq(rx->skb_head); in lan743x_rx_process_buffer()
2133 rx->skb_head = NULL; in lan743x_rx_process_buffer()
2141 if (rx->skb_head) in lan743x_rx_process_buffer()
2142 dev_kfree_skb_irq(rx->skb_head); in lan743x_rx_process_buffer()
2143 rx->skb_head = skb; in lan743x_rx_process_buffer()
2144 } else if (rx->skb_head) { in lan743x_rx_process_buffer()
2146 if (skb_shinfo(rx->skb_head)->frag_list) in lan743x_rx_process_buffer()
2147 rx->skb_tail->next = skb; in lan743x_rx_process_buffer()
2149 skb_shinfo(rx->skb_head)->frag_list = skb; in lan743x_rx_process_buffer()
2150 rx->skb_tail = skb; in lan743x_rx_process_buffer()
2151 rx->skb_head->len += skb->len; in lan743x_rx_process_buffer()
2152 rx->skb_head->data_len += skb->len; in lan743x_rx_process_buffer()
2153 rx->skb_head->truesize += skb->truesize; in lan743x_rx_process_buffer()
2170 if (rx->skb_head) in lan743x_rx_process_buffer()
2171 skb_hwtstamps(rx->skb_head)->hwtstamp = in lan743x_rx_process_buffer()
2173 lan743x_rx_reuse_ring_element(rx, extension_index); in lan743x_rx_process_buffer()
2174 rx->last_head = extension_index; in lan743x_rx_process_buffer()
2178 if (is_last && rx->skb_head) in lan743x_rx_process_buffer()
2179 rx->skb_head = lan743x_rx_trim_skb(rx->skb_head, frame_length); in lan743x_rx_process_buffer()
2181 if (is_last && rx->skb_head) { in lan743x_rx_process_buffer()
2182 rx->skb_head->protocol = eth_type_trans(rx->skb_head, in lan743x_rx_process_buffer()
2183 rx->adapter->netdev); in lan743x_rx_process_buffer()
2185 rx->skb_head->len); in lan743x_rx_process_buffer()
2186 napi_gro_receive(&rx->napi, rx->skb_head); in lan743x_rx_process_buffer()
2187 rx->skb_head = NULL; in lan743x_rx_process_buffer()
2192 rx->last_tail = rx->last_head; in lan743x_rx_process_buffer()
2193 rx->last_head = lan743x_rx_next_index(rx, rx->last_head); in lan743x_rx_process_buffer()
2201 struct lan743x_rx *rx = container_of(napi, struct lan743x_rx, napi); in lan743x_rx_napi_poll() local
2202 struct lan743x_adapter *adapter = rx->adapter; in lan743x_rx_napi_poll()
2207 if (rx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_STATUS_W2C) { in lan743x_rx_napi_poll()
2210 DMAC_INT_BIT_RXFRM_(rx->channel_number)); in lan743x_rx_napi_poll()
2213 result = lan743x_rx_process_buffer(rx); in lan743x_rx_napi_poll()
2217 rx->frame_count += count; in lan743x_rx_napi_poll()
2224 /* re-arm interrupts, must write to rx tail on some chip variants */ in lan743x_rx_napi_poll()
2225 if (rx->vector_flags & LAN743X_VECTOR_FLAG_VECTOR_ENABLE_AUTO_SET) in lan743x_rx_napi_poll()
2227 if (rx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_ENABLE_AUTO_SET) { in lan743x_rx_napi_poll()
2231 INT_BIT_DMA_RX_(rx->channel_number)); in lan743x_rx_napi_poll()
2235 lan743x_csr_write(adapter, RX_TAIL(rx->channel_number), in lan743x_rx_napi_poll()
2236 rx_tail_flags | rx->last_tail); in lan743x_rx_napi_poll()
2241 static void lan743x_rx_ring_cleanup(struct lan743x_rx *rx) in lan743x_rx_ring_cleanup() argument
2243 if (rx->buffer_info && rx->ring_cpu_ptr) { in lan743x_rx_ring_cleanup()
2246 for (index = 0; index < rx->ring_size; index++) in lan743x_rx_ring_cleanup()
2247 lan743x_rx_release_ring_element(rx, index); in lan743x_rx_ring_cleanup()
2250 if (rx->head_cpu_ptr) { in lan743x_rx_ring_cleanup()
2251 dma_free_coherent(&rx->adapter->pdev->dev, in lan743x_rx_ring_cleanup()
2252 sizeof(*rx->head_cpu_ptr), rx->head_cpu_ptr, in lan743x_rx_ring_cleanup()
2253 rx->head_dma_ptr); in lan743x_rx_ring_cleanup()
2254 rx->head_cpu_ptr = NULL; in lan743x_rx_ring_cleanup()
2255 rx->head_dma_ptr = 0; in lan743x_rx_ring_cleanup()
2258 kfree(rx->buffer_info); in lan743x_rx_ring_cleanup()
2259 rx->buffer_info = NULL; in lan743x_rx_ring_cleanup()
2261 if (rx->ring_cpu_ptr) { in lan743x_rx_ring_cleanup()
2262 dma_free_coherent(&rx->adapter->pdev->dev, in lan743x_rx_ring_cleanup()
2263 rx->ring_allocation_size, rx->ring_cpu_ptr, in lan743x_rx_ring_cleanup()
2264 rx->ring_dma_ptr); in lan743x_rx_ring_cleanup()
2265 rx->ring_allocation_size = 0; in lan743x_rx_ring_cleanup()
2266 rx->ring_cpu_ptr = NULL; in lan743x_rx_ring_cleanup()
2267 rx->ring_dma_ptr = 0; in lan743x_rx_ring_cleanup()
2270 rx->ring_size = 0; in lan743x_rx_ring_cleanup()
2271 rx->last_head = 0; in lan743x_rx_ring_cleanup()
2274 static int lan743x_rx_ring_init(struct lan743x_rx *rx) in lan743x_rx_ring_init() argument
2282 rx->ring_size = LAN743X_RX_RING_SIZE; in lan743x_rx_ring_init()
2283 if (rx->ring_size <= 1) { in lan743x_rx_ring_init()
2287 if (rx->ring_size & ~RX_CFG_B_RX_RING_LEN_MASK_) { in lan743x_rx_ring_init()
2291 if (dma_set_mask_and_coherent(&rx->adapter->pdev->dev, in lan743x_rx_ring_init()
2293 if (dma_set_mask_and_coherent(&rx->adapter->pdev->dev, in lan743x_rx_ring_init()
2295 dev_warn(&rx->adapter->pdev->dev, in lan743x_rx_ring_init()
2301 ring_allocation_size = ALIGN(rx->ring_size * in lan743x_rx_ring_init()
2305 cpu_ptr = dma_alloc_coherent(&rx->adapter->pdev->dev, in lan743x_rx_ring_init()
2311 rx->ring_allocation_size = ring_allocation_size; in lan743x_rx_ring_init()
2312 rx->ring_cpu_ptr = (struct lan743x_rx_descriptor *)cpu_ptr; in lan743x_rx_ring_init()
2313 rx->ring_dma_ptr = dma_ptr; in lan743x_rx_ring_init()
2315 cpu_ptr = kcalloc(rx->ring_size, sizeof(*rx->buffer_info), in lan743x_rx_ring_init()
2321 rx->buffer_info = (struct lan743x_rx_buffer_info *)cpu_ptr; in lan743x_rx_ring_init()
2323 cpu_ptr = dma_alloc_coherent(&rx->adapter->pdev->dev, in lan743x_rx_ring_init()
2324 sizeof(*rx->head_cpu_ptr), &dma_ptr, in lan743x_rx_ring_init()
2331 rx->head_cpu_ptr = cpu_ptr; in lan743x_rx_ring_init()
2332 rx->head_dma_ptr = dma_ptr; in lan743x_rx_ring_init()
2333 if (rx->head_dma_ptr & 0x3) { in lan743x_rx_ring_init()
2338 rx->last_head = 0; in lan743x_rx_ring_init()
2339 for (index = 0; index < rx->ring_size; index++) { in lan743x_rx_ring_init()
2340 ret = lan743x_rx_init_ring_element(rx, index, GFP_KERNEL); in lan743x_rx_ring_init()
2347 netif_warn(rx->adapter, ifup, rx->adapter->netdev, in lan743x_rx_ring_init()
2350 lan743x_rx_ring_cleanup(rx); in lan743x_rx_ring_init()
2354 static void lan743x_rx_close(struct lan743x_rx *rx) in lan743x_rx_close() argument
2356 struct lan743x_adapter *adapter = rx->adapter; in lan743x_rx_close()
2359 FCT_RX_CTL_DIS_(rx->channel_number)); in lan743x_rx_close()
2361 FCT_RX_CTL_EN_(rx->channel_number), in lan743x_rx_close()
2365 DMAC_CMD_STOP_R_(rx->channel_number)); in lan743x_rx_close()
2366 lan743x_dmac_rx_wait_till_stopped(adapter, rx->channel_number); in lan743x_rx_close()
2369 DMAC_INT_BIT_RXFRM_(rx->channel_number)); in lan743x_rx_close()
2371 INT_BIT_DMA_RX_(rx->channel_number)); in lan743x_rx_close()
2372 napi_disable(&rx->napi); in lan743x_rx_close()
2374 netif_napi_del(&rx->napi); in lan743x_rx_close()
2376 lan743x_rx_ring_cleanup(rx); in lan743x_rx_close()
2379 static int lan743x_rx_open(struct lan743x_rx *rx) in lan743x_rx_open() argument
2381 struct lan743x_adapter *adapter = rx->adapter; in lan743x_rx_open()
2385 rx->frame_count = 0; in lan743x_rx_open()
2386 ret = lan743x_rx_ring_init(rx); in lan743x_rx_open()
2391 &rx->napi, lan743x_rx_napi_poll, in lan743x_rx_open()
2395 DMAC_CMD_RX_SWR_(rx->channel_number)); in lan743x_rx_open()
2397 DMAC_CMD_RX_SWR_(rx->channel_number), in lan743x_rx_open()
2402 RX_BASE_ADDRH(rx->channel_number), in lan743x_rx_open()
2403 DMA_ADDR_HIGH32(rx->ring_dma_ptr)); in lan743x_rx_open()
2405 RX_BASE_ADDRL(rx->channel_number), in lan743x_rx_open()
2406 DMA_ADDR_LOW32(rx->ring_dma_ptr)); in lan743x_rx_open()
2408 /* set rx write back address */ in lan743x_rx_open()
2410 RX_HEAD_WRITEBACK_ADDRH(rx->channel_number), in lan743x_rx_open()
2411 DMA_ADDR_HIGH32(rx->head_dma_ptr)); in lan743x_rx_open()
2413 RX_HEAD_WRITEBACK_ADDRL(rx->channel_number), in lan743x_rx_open()
2414 DMA_ADDR_LOW32(rx->head_dma_ptr)); in lan743x_rx_open()
2425 RX_CFG_A(rx->channel_number), data); in lan743x_rx_open()
2428 data = lan743x_csr_read(adapter, RX_CFG_B(rx->channel_number)); in lan743x_rx_open()
2435 data |= ((rx->ring_size) & RX_CFG_B_RX_RING_LEN_MASK_); in lan743x_rx_open()
2440 lan743x_csr_write(adapter, RX_CFG_B(rx->channel_number), data); in lan743x_rx_open()
2441 rx->vector_flags = lan743x_intr_get_vector_flags(adapter, in lan743x_rx_open()
2443 (rx->channel_number)); in lan743x_rx_open()
2447 if (rx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_ENABLE_AUTO_CLEAR) in lan743x_rx_open()
2449 if (rx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_STATUS_AUTO_CLEAR) in lan743x_rx_open()
2451 if (rx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_STATUS_R2C) in lan743x_rx_open()
2453 if (rx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_ENABLE_R2C) in lan743x_rx_open()
2455 lan743x_csr_write(adapter, RX_CFG_C(rx->channel_number), data); in lan743x_rx_open()
2457 rx->last_tail = ((u32)(rx->ring_size - 1)); in lan743x_rx_open()
2458 lan743x_csr_write(adapter, RX_TAIL(rx->channel_number), in lan743x_rx_open()
2459 rx->last_tail); in lan743x_rx_open()
2460 rx->last_head = lan743x_csr_read(adapter, RX_HEAD(rx->channel_number)); in lan743x_rx_open()
2461 if (rx->last_head) { in lan743x_rx_open()
2466 napi_enable(&rx->napi); in lan743x_rx_open()
2469 INT_BIT_DMA_RX_(rx->channel_number)); in lan743x_rx_open()
2471 DMAC_INT_BIT_RXFRM_(rx->channel_number)); in lan743x_rx_open()
2473 DMAC_INT_BIT_RXFRM_(rx->channel_number)); in lan743x_rx_open()
2475 DMAC_CMD_START_R_(rx->channel_number)); in lan743x_rx_open()
2479 FCT_RX_CTL_RESET_(rx->channel_number)); in lan743x_rx_open()
2481 FCT_RX_CTL_RESET_(rx->channel_number), in lan743x_rx_open()
2483 lan743x_csr_write(adapter, FCT_FLOW(rx->channel_number), in lan743x_rx_open()
2490 FCT_RX_CTL_EN_(rx->channel_number)); in lan743x_rx_open()
2494 netif_napi_del(&rx->napi); in lan743x_rx_open()
2495 lan743x_rx_ring_cleanup(rx); in lan743x_rx_open()
2509 lan743x_rx_close(&adapter->rx[index]); in lan743x_netdev_close()
2547 ret = lan743x_rx_open(&adapter->rx[index]); in lan743x_netdev_open()
2560 if (adapter->rx[index].ring_cpu_ptr) in lan743x_netdev_open()
2561 lan743x_rx_close(&adapter->rx[index]); in lan743x_netdev_open()
2742 adapter->rx[index].adapter = adapter; in lan743x_hardware_init()
2743 adapter->rx[index].channel_number = index; in lan743x_hardware_init()