Lines Matching full:rx
200 struct lan743x_rx *rx = context; in lan743x_rx_isr() local
201 struct lan743x_adapter *adapter = rx->adapter; in lan743x_rx_isr()
206 INT_BIT_DMA_RX_(rx->channel_number)); in lan743x_rx_isr()
209 if (int_sts & INT_BIT_DMA_RX_(rx->channel_number)) { in lan743x_rx_isr()
210 u32 rx_frame_bit = DMAC_INT_BIT_RXFRM_(rx->channel_number); in lan743x_rx_isr()
227 napi_schedule(&rx->napi); in lan743x_rx_isr()
235 INT_BIT_DMA_RX_(rx->channel_number)); in lan743x_rx_isr()
250 lan743x_rx_isr(&adapter->rx[channel], in lan743x_intr_shared_isr()
645 /* map RX interrupt to vector */ in lan743x_intr_open()
655 /* Remove RX interrupt from shared mask */ in lan743x_intr_open()
659 &adapter->rx[index]); in lan743x_intr_open()
1951 static int lan743x_rx_next_index(struct lan743x_rx *rx, int index) in lan743x_rx_next_index() argument
1953 return ((++index) % rx->ring_size); in lan743x_rx_next_index()
1956 static struct sk_buff *lan743x_rx_allocate_skb(struct lan743x_rx *rx) in lan743x_rx_allocate_skb() argument
1961 return __netdev_alloc_skb(rx->adapter->netdev, in lan743x_rx_allocate_skb()
1965 static int lan743x_rx_init_ring_element(struct lan743x_rx *rx, int index, in lan743x_rx_init_ring_element() argument
1973 descriptor = &rx->ring_cpu_ptr[index]; in lan743x_rx_init_ring_element()
1974 buffer_info = &rx->buffer_info[index]; in lan743x_rx_init_ring_element()
1978 buffer_info->dma_ptr = dma_map_single(&rx->adapter->pdev->dev, in lan743x_rx_init_ring_element()
1982 if (dma_mapping_error(&rx->adapter->pdev->dev, in lan743x_rx_init_ring_element()
1999 static void lan743x_rx_reuse_ring_element(struct lan743x_rx *rx, int index) in lan743x_rx_reuse_ring_element() argument
2004 descriptor = &rx->ring_cpu_ptr[index]; in lan743x_rx_reuse_ring_element()
2005 buffer_info = &rx->buffer_info[index]; in lan743x_rx_reuse_ring_element()
2015 static void lan743x_rx_release_ring_element(struct lan743x_rx *rx, int index) in lan743x_rx_release_ring_element() argument
2020 descriptor = &rx->ring_cpu_ptr[index]; in lan743x_rx_release_ring_element()
2021 buffer_info = &rx->buffer_info[index]; in lan743x_rx_release_ring_element()
2026 dma_unmap_single(&rx->adapter->pdev->dev, in lan743x_rx_release_ring_element()
2041 static int lan743x_rx_process_packet(struct lan743x_rx *rx) in lan743x_rx_process_packet() argument
2045 int current_head_index = *rx->head_cpu_ptr; in lan743x_rx_process_packet()
2052 if (current_head_index < 0 || current_head_index >= rx->ring_size) in lan743x_rx_process_packet()
2055 if (rx->last_head < 0 || rx->last_head >= rx->ring_size) in lan743x_rx_process_packet()
2058 if (rx->last_head != current_head_index) { in lan743x_rx_process_packet()
2059 descriptor = &rx->ring_cpu_ptr[rx->last_head]; in lan743x_rx_process_packet()
2066 first_index = rx->last_head; in lan743x_rx_process_packet()
2068 last_index = rx->last_head; in lan743x_rx_process_packet()
2072 index = lan743x_rx_next_index(rx, first_index); in lan743x_rx_process_packet()
2074 descriptor = &rx->ring_cpu_ptr[index]; in lan743x_rx_process_packet()
2082 index = lan743x_rx_next_index(rx, index); in lan743x_rx_process_packet()
2086 descriptor = &rx->ring_cpu_ptr[last_index]; in lan743x_rx_process_packet()
2089 int index = lan743x_rx_next_index(rx, in lan743x_rx_process_packet()
2092 descriptor = &rx->ring_cpu_ptr[index]; in lan743x_rx_process_packet()
2124 new_skb = lan743x_rx_allocate_skb(rx); in lan743x_rx_process_packet()
2130 lan743x_rx_reuse_ring_element(rx, first_index); in lan743x_rx_process_packet()
2134 buffer_info = &rx->buffer_info[first_index]; in lan743x_rx_process_packet()
2136 descriptor = &rx->ring_cpu_ptr[first_index]; in lan743x_rx_process_packet()
2140 dma_unmap_single(&rx->adapter->pdev->dev, in lan743x_rx_process_packet()
2152 rx->adapter->netdev); in lan743x_rx_process_packet()
2153 lan743x_rx_init_ring_element(rx, first_index, new_skb); in lan743x_rx_process_packet()
2166 lan743x_rx_reuse_ring_element(rx, in lan743x_rx_process_packet()
2168 index = lan743x_rx_next_index(rx, in lan743x_rx_process_packet()
2174 lan743x_rx_reuse_ring_element(rx, in lan743x_rx_process_packet()
2176 index = lan743x_rx_next_index(rx, in lan743x_rx_process_packet()
2184 descriptor = &rx->ring_cpu_ptr[extension_index]; in lan743x_rx_process_packet()
2185 buffer_info = &rx->buffer_info[extension_index]; in lan743x_rx_process_packet()
2190 lan743x_rx_reuse_ring_element(rx, extension_index); in lan743x_rx_process_packet()
2207 napi_gro_receive(&rx->napi, skb); in lan743x_rx_process_packet()
2212 rx->last_tail = real_last_index; in lan743x_rx_process_packet()
2213 rx->last_head = lan743x_rx_next_index(rx, real_last_index); in lan743x_rx_process_packet()
2221 struct lan743x_rx *rx = container_of(napi, struct lan743x_rx, napi); in lan743x_rx_napi_poll() local
2222 struct lan743x_adapter *adapter = rx->adapter; in lan743x_rx_napi_poll()
2226 if (rx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_STATUS_W2C) { in lan743x_rx_napi_poll()
2229 DMAC_INT_BIT_RXFRM_(rx->channel_number)); in lan743x_rx_napi_poll()
2233 int rx_process_result = lan743x_rx_process_packet(rx); in lan743x_rx_napi_poll()
2245 rx->frame_count += count; in lan743x_rx_napi_poll()
2252 if (rx->vector_flags & LAN743X_VECTOR_FLAG_VECTOR_ENABLE_AUTO_SET) in lan743x_rx_napi_poll()
2254 if (rx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_ENABLE_AUTO_SET) { in lan743x_rx_napi_poll()
2258 INT_BIT_DMA_RX_(rx->channel_number)); in lan743x_rx_napi_poll()
2262 lan743x_csr_write(adapter, RX_TAIL(rx->channel_number), in lan743x_rx_napi_poll()
2263 rx_tail_flags | rx->last_tail); in lan743x_rx_napi_poll()
2268 static void lan743x_rx_ring_cleanup(struct lan743x_rx *rx) in lan743x_rx_ring_cleanup() argument
2270 if (rx->buffer_info && rx->ring_cpu_ptr) { in lan743x_rx_ring_cleanup()
2273 for (index = 0; index < rx->ring_size; index++) in lan743x_rx_ring_cleanup()
2274 lan743x_rx_release_ring_element(rx, index); in lan743x_rx_ring_cleanup()
2277 if (rx->head_cpu_ptr) { in lan743x_rx_ring_cleanup()
2278 dma_free_coherent(&rx->adapter->pdev->dev, in lan743x_rx_ring_cleanup()
2279 sizeof(*rx->head_cpu_ptr), rx->head_cpu_ptr, in lan743x_rx_ring_cleanup()
2280 rx->head_dma_ptr); in lan743x_rx_ring_cleanup()
2281 rx->head_cpu_ptr = NULL; in lan743x_rx_ring_cleanup()
2282 rx->head_dma_ptr = 0; in lan743x_rx_ring_cleanup()
2285 kfree(rx->buffer_info); in lan743x_rx_ring_cleanup()
2286 rx->buffer_info = NULL; in lan743x_rx_ring_cleanup()
2288 if (rx->ring_cpu_ptr) { in lan743x_rx_ring_cleanup()
2289 dma_free_coherent(&rx->adapter->pdev->dev, in lan743x_rx_ring_cleanup()
2290 rx->ring_allocation_size, rx->ring_cpu_ptr, in lan743x_rx_ring_cleanup()
2291 rx->ring_dma_ptr); in lan743x_rx_ring_cleanup()
2292 rx->ring_allocation_size = 0; in lan743x_rx_ring_cleanup()
2293 rx->ring_cpu_ptr = NULL; in lan743x_rx_ring_cleanup()
2294 rx->ring_dma_ptr = 0; in lan743x_rx_ring_cleanup()
2297 rx->ring_size = 0; in lan743x_rx_ring_cleanup()
2298 rx->last_head = 0; in lan743x_rx_ring_cleanup()
2301 static int lan743x_rx_ring_init(struct lan743x_rx *rx) in lan743x_rx_ring_init() argument
2309 rx->ring_size = LAN743X_RX_RING_SIZE; in lan743x_rx_ring_init()
2310 if (rx->ring_size <= 1) { in lan743x_rx_ring_init()
2314 if (rx->ring_size & ~RX_CFG_B_RX_RING_LEN_MASK_) { in lan743x_rx_ring_init()
2318 ring_allocation_size = ALIGN(rx->ring_size * in lan743x_rx_ring_init()
2322 cpu_ptr = dma_alloc_coherent(&rx->adapter->pdev->dev, in lan743x_rx_ring_init()
2328 rx->ring_allocation_size = ring_allocation_size; in lan743x_rx_ring_init()
2329 rx->ring_cpu_ptr = (struct lan743x_rx_descriptor *)cpu_ptr; in lan743x_rx_ring_init()
2330 rx->ring_dma_ptr = dma_ptr; in lan743x_rx_ring_init()
2332 cpu_ptr = kcalloc(rx->ring_size, sizeof(*rx->buffer_info), in lan743x_rx_ring_init()
2338 rx->buffer_info = (struct lan743x_rx_buffer_info *)cpu_ptr; in lan743x_rx_ring_init()
2340 cpu_ptr = dma_alloc_coherent(&rx->adapter->pdev->dev, in lan743x_rx_ring_init()
2341 sizeof(*rx->head_cpu_ptr), &dma_ptr, in lan743x_rx_ring_init()
2348 rx->head_cpu_ptr = cpu_ptr; in lan743x_rx_ring_init()
2349 rx->head_dma_ptr = dma_ptr; in lan743x_rx_ring_init()
2350 if (rx->head_dma_ptr & 0x3) { in lan743x_rx_ring_init()
2355 rx->last_head = 0; in lan743x_rx_ring_init()
2356 for (index = 0; index < rx->ring_size; index++) { in lan743x_rx_ring_init()
2357 struct sk_buff *new_skb = lan743x_rx_allocate_skb(rx); in lan743x_rx_ring_init()
2359 ret = lan743x_rx_init_ring_element(rx, index, new_skb); in lan743x_rx_ring_init()
2366 lan743x_rx_ring_cleanup(rx); in lan743x_rx_ring_init()
2370 static void lan743x_rx_close(struct lan743x_rx *rx) in lan743x_rx_close() argument
2372 struct lan743x_adapter *adapter = rx->adapter; in lan743x_rx_close()
2375 FCT_RX_CTL_DIS_(rx->channel_number)); in lan743x_rx_close()
2377 FCT_RX_CTL_EN_(rx->channel_number), in lan743x_rx_close()
2381 DMAC_CMD_STOP_R_(rx->channel_number)); in lan743x_rx_close()
2382 lan743x_dmac_rx_wait_till_stopped(adapter, rx->channel_number); in lan743x_rx_close()
2385 DMAC_INT_BIT_RXFRM_(rx->channel_number)); in lan743x_rx_close()
2387 INT_BIT_DMA_RX_(rx->channel_number)); in lan743x_rx_close()
2388 napi_disable(&rx->napi); in lan743x_rx_close()
2390 netif_napi_del(&rx->napi); in lan743x_rx_close()
2392 lan743x_rx_ring_cleanup(rx); in lan743x_rx_close()
2395 static int lan743x_rx_open(struct lan743x_rx *rx) in lan743x_rx_open() argument
2397 struct lan743x_adapter *adapter = rx->adapter; in lan743x_rx_open()
2401 rx->frame_count = 0; in lan743x_rx_open()
2402 ret = lan743x_rx_ring_init(rx); in lan743x_rx_open()
2407 &rx->napi, lan743x_rx_napi_poll, in lan743x_rx_open()
2408 rx->ring_size - 1); in lan743x_rx_open()
2411 DMAC_CMD_RX_SWR_(rx->channel_number)); in lan743x_rx_open()
2413 DMAC_CMD_RX_SWR_(rx->channel_number), in lan743x_rx_open()
2418 RX_BASE_ADDRH(rx->channel_number), in lan743x_rx_open()
2419 DMA_ADDR_HIGH32(rx->ring_dma_ptr)); in lan743x_rx_open()
2421 RX_BASE_ADDRL(rx->channel_number), in lan743x_rx_open()
2422 DMA_ADDR_LOW32(rx->ring_dma_ptr)); in lan743x_rx_open()
2424 /* set rx write back address */ in lan743x_rx_open()
2426 RX_HEAD_WRITEBACK_ADDRH(rx->channel_number), in lan743x_rx_open()
2427 DMA_ADDR_HIGH32(rx->head_dma_ptr)); in lan743x_rx_open()
2429 RX_HEAD_WRITEBACK_ADDRL(rx->channel_number), in lan743x_rx_open()
2430 DMA_ADDR_LOW32(rx->head_dma_ptr)); in lan743x_rx_open()
2441 RX_CFG_A(rx->channel_number), data); in lan743x_rx_open()
2444 data = lan743x_csr_read(adapter, RX_CFG_B(rx->channel_number)); in lan743x_rx_open()
2451 data |= ((rx->ring_size) & RX_CFG_B_RX_RING_LEN_MASK_); in lan743x_rx_open()
2456 lan743x_csr_write(adapter, RX_CFG_B(rx->channel_number), data); in lan743x_rx_open()
2457 rx->vector_flags = lan743x_intr_get_vector_flags(adapter, in lan743x_rx_open()
2459 (rx->channel_number)); in lan743x_rx_open()
2463 if (rx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_ENABLE_AUTO_CLEAR) in lan743x_rx_open()
2465 if (rx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_STATUS_AUTO_CLEAR) in lan743x_rx_open()
2467 if (rx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_STATUS_R2C) in lan743x_rx_open()
2469 if (rx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_ENABLE_R2C) in lan743x_rx_open()
2471 lan743x_csr_write(adapter, RX_CFG_C(rx->channel_number), data); in lan743x_rx_open()
2473 rx->last_tail = ((u32)(rx->ring_size - 1)); in lan743x_rx_open()
2474 lan743x_csr_write(adapter, RX_TAIL(rx->channel_number), in lan743x_rx_open()
2475 rx->last_tail); in lan743x_rx_open()
2476 rx->last_head = lan743x_csr_read(adapter, RX_HEAD(rx->channel_number)); in lan743x_rx_open()
2477 if (rx->last_head) { in lan743x_rx_open()
2482 napi_enable(&rx->napi); in lan743x_rx_open()
2485 INT_BIT_DMA_RX_(rx->channel_number)); in lan743x_rx_open()
2487 DMAC_INT_BIT_RXFRM_(rx->channel_number)); in lan743x_rx_open()
2489 DMAC_INT_BIT_RXFRM_(rx->channel_number)); in lan743x_rx_open()
2491 DMAC_CMD_START_R_(rx->channel_number)); in lan743x_rx_open()
2495 FCT_RX_CTL_RESET_(rx->channel_number)); in lan743x_rx_open()
2497 FCT_RX_CTL_RESET_(rx->channel_number), in lan743x_rx_open()
2499 lan743x_csr_write(adapter, FCT_FLOW(rx->channel_number), in lan743x_rx_open()
2506 FCT_RX_CTL_EN_(rx->channel_number)); in lan743x_rx_open()
2510 netif_napi_del(&rx->napi); in lan743x_rx_open()
2511 lan743x_rx_ring_cleanup(rx); in lan743x_rx_open()
2525 lan743x_rx_close(&adapter->rx[index]); in lan743x_netdev_close()
2563 ret = lan743x_rx_open(&adapter->rx[index]); in lan743x_netdev_open()
2576 if (adapter->rx[index].ring_cpu_ptr) in lan743x_netdev_open()
2577 lan743x_rx_close(&adapter->rx[index]); in lan743x_netdev_open()
2758 adapter->rx[index].adapter = adapter; in lan743x_hardware_init()
2759 adapter->rx[index].channel_number = index; in lan743x_hardware_init()