• Home
  • Raw
  • Download

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()
1955 static int lan743x_rx_next_index(struct lan743x_rx *rx, int index) in lan743x_rx_next_index() argument
1957 return ((++index) % rx->ring_size); in lan743x_rx_next_index()
1960 static struct sk_buff *lan743x_rx_allocate_skb(struct lan743x_rx *rx, gfp_t gfp) in lan743x_rx_allocate_skb() argument
1965 return __netdev_alloc_skb(rx->adapter->netdev, in lan743x_rx_allocate_skb()
1969 static void lan743x_rx_update_tail(struct lan743x_rx *rx, int index) in lan743x_rx_update_tail() argument
1973 lan743x_csr_write(rx->adapter, RX_TAIL(rx->channel_number), in lan743x_rx_update_tail()
1977 static int lan743x_rx_init_ring_element(struct lan743x_rx *rx, int index, in lan743x_rx_init_ring_element() argument
1985 descriptor = &rx->ring_cpu_ptr[index]; in lan743x_rx_init_ring_element()
1986 buffer_info = &rx->buffer_info[index]; in lan743x_rx_init_ring_element()
1990 buffer_info->dma_ptr = dma_map_single(&rx->adapter->pdev->dev, in lan743x_rx_init_ring_element()
1994 if (dma_mapping_error(&rx->adapter->pdev->dev, in lan743x_rx_init_ring_element()
2007 lan743x_rx_update_tail(rx, index); in lan743x_rx_init_ring_element()
2012 static void lan743x_rx_reuse_ring_element(struct lan743x_rx *rx, int index) in lan743x_rx_reuse_ring_element() argument
2017 descriptor = &rx->ring_cpu_ptr[index]; in lan743x_rx_reuse_ring_element()
2018 buffer_info = &rx->buffer_info[index]; in lan743x_rx_reuse_ring_element()
2026 lan743x_rx_update_tail(rx, index); in lan743x_rx_reuse_ring_element()
2029 static void lan743x_rx_release_ring_element(struct lan743x_rx *rx, int index) in lan743x_rx_release_ring_element() argument
2034 descriptor = &rx->ring_cpu_ptr[index]; in lan743x_rx_release_ring_element()
2035 buffer_info = &rx->buffer_info[index]; in lan743x_rx_release_ring_element()
2040 dma_unmap_single(&rx->adapter->pdev->dev, in lan743x_rx_release_ring_element()
2055 static int lan743x_rx_process_packet(struct lan743x_rx *rx) in lan743x_rx_process_packet() argument
2059 int current_head_index = le32_to_cpu(*rx->head_cpu_ptr); in lan743x_rx_process_packet()
2066 if (current_head_index < 0 || current_head_index >= rx->ring_size) in lan743x_rx_process_packet()
2069 if (rx->last_head < 0 || rx->last_head >= rx->ring_size) in lan743x_rx_process_packet()
2072 if (rx->last_head != current_head_index) { in lan743x_rx_process_packet()
2073 descriptor = &rx->ring_cpu_ptr[rx->last_head]; in lan743x_rx_process_packet()
2080 first_index = rx->last_head; in lan743x_rx_process_packet()
2082 last_index = rx->last_head; in lan743x_rx_process_packet()
2086 index = lan743x_rx_next_index(rx, first_index); in lan743x_rx_process_packet()
2088 descriptor = &rx->ring_cpu_ptr[index]; in lan743x_rx_process_packet()
2096 index = lan743x_rx_next_index(rx, index); in lan743x_rx_process_packet()
2100 descriptor = &rx->ring_cpu_ptr[last_index]; in lan743x_rx_process_packet()
2103 int index = lan743x_rx_next_index(rx, in lan743x_rx_process_packet()
2106 descriptor = &rx->ring_cpu_ptr[index]; in lan743x_rx_process_packet()
2138 new_skb = lan743x_rx_allocate_skb(rx, in lan743x_rx_process_packet()
2145 lan743x_rx_reuse_ring_element(rx, first_index); in lan743x_rx_process_packet()
2149 buffer_info = &rx->buffer_info[first_index]; in lan743x_rx_process_packet()
2151 descriptor = &rx->ring_cpu_ptr[first_index]; in lan743x_rx_process_packet()
2155 dma_unmap_single(&rx->adapter->pdev->dev, in lan743x_rx_process_packet()
2167 rx->adapter->netdev); in lan743x_rx_process_packet()
2168 lan743x_rx_init_ring_element(rx, first_index, new_skb); in lan743x_rx_process_packet()
2181 lan743x_rx_reuse_ring_element(rx, in lan743x_rx_process_packet()
2183 index = lan743x_rx_next_index(rx, in lan743x_rx_process_packet()
2189 lan743x_rx_reuse_ring_element(rx, in lan743x_rx_process_packet()
2191 index = lan743x_rx_next_index(rx, in lan743x_rx_process_packet()
2199 descriptor = &rx->ring_cpu_ptr[extension_index]; in lan743x_rx_process_packet()
2200 buffer_info = &rx->buffer_info[extension_index]; in lan743x_rx_process_packet()
2205 lan743x_rx_reuse_ring_element(rx, extension_index); in lan743x_rx_process_packet()
2222 napi_gro_receive(&rx->napi, skb); in lan743x_rx_process_packet()
2227 rx->last_tail = real_last_index; in lan743x_rx_process_packet()
2228 rx->last_head = lan743x_rx_next_index(rx, real_last_index); in lan743x_rx_process_packet()
2236 struct lan743x_rx *rx = container_of(napi, struct lan743x_rx, napi); in lan743x_rx_napi_poll() local
2237 struct lan743x_adapter *adapter = rx->adapter; in lan743x_rx_napi_poll()
2242 if (rx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_STATUS_W2C) { in lan743x_rx_napi_poll()
2245 DMAC_INT_BIT_RXFRM_(rx->channel_number)); in lan743x_rx_napi_poll()
2248 result = lan743x_rx_process_packet(rx); in lan743x_rx_napi_poll()
2252 rx->frame_count += count; in lan743x_rx_napi_poll()
2259 /* re-arm interrupts, must write to rx tail on some chip variants */ in lan743x_rx_napi_poll()
2260 if (rx->vector_flags & LAN743X_VECTOR_FLAG_VECTOR_ENABLE_AUTO_SET) in lan743x_rx_napi_poll()
2262 if (rx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_ENABLE_AUTO_SET) { in lan743x_rx_napi_poll()
2266 INT_BIT_DMA_RX_(rx->channel_number)); in lan743x_rx_napi_poll()
2270 lan743x_csr_write(adapter, RX_TAIL(rx->channel_number), in lan743x_rx_napi_poll()
2271 rx_tail_flags | rx->last_tail); in lan743x_rx_napi_poll()
2276 static void lan743x_rx_ring_cleanup(struct lan743x_rx *rx) in lan743x_rx_ring_cleanup() argument
2278 if (rx->buffer_info && rx->ring_cpu_ptr) { in lan743x_rx_ring_cleanup()
2281 for (index = 0; index < rx->ring_size; index++) in lan743x_rx_ring_cleanup()
2282 lan743x_rx_release_ring_element(rx, index); in lan743x_rx_ring_cleanup()
2285 if (rx->head_cpu_ptr) { in lan743x_rx_ring_cleanup()
2286 dma_free_coherent(&rx->adapter->pdev->dev, in lan743x_rx_ring_cleanup()
2287 sizeof(*rx->head_cpu_ptr), rx->head_cpu_ptr, in lan743x_rx_ring_cleanup()
2288 rx->head_dma_ptr); in lan743x_rx_ring_cleanup()
2289 rx->head_cpu_ptr = NULL; in lan743x_rx_ring_cleanup()
2290 rx->head_dma_ptr = 0; in lan743x_rx_ring_cleanup()
2293 kfree(rx->buffer_info); in lan743x_rx_ring_cleanup()
2294 rx->buffer_info = NULL; in lan743x_rx_ring_cleanup()
2296 if (rx->ring_cpu_ptr) { in lan743x_rx_ring_cleanup()
2297 dma_free_coherent(&rx->adapter->pdev->dev, in lan743x_rx_ring_cleanup()
2298 rx->ring_allocation_size, rx->ring_cpu_ptr, in lan743x_rx_ring_cleanup()
2299 rx->ring_dma_ptr); in lan743x_rx_ring_cleanup()
2300 rx->ring_allocation_size = 0; in lan743x_rx_ring_cleanup()
2301 rx->ring_cpu_ptr = NULL; in lan743x_rx_ring_cleanup()
2302 rx->ring_dma_ptr = 0; in lan743x_rx_ring_cleanup()
2305 rx->ring_size = 0; in lan743x_rx_ring_cleanup()
2306 rx->last_head = 0; in lan743x_rx_ring_cleanup()
2309 static int lan743x_rx_ring_init(struct lan743x_rx *rx) in lan743x_rx_ring_init() argument
2317 rx->ring_size = LAN743X_RX_RING_SIZE; in lan743x_rx_ring_init()
2318 if (rx->ring_size <= 1) { in lan743x_rx_ring_init()
2322 if (rx->ring_size & ~RX_CFG_B_RX_RING_LEN_MASK_) { in lan743x_rx_ring_init()
2326 if (dma_set_mask_and_coherent(&rx->adapter->pdev->dev, in lan743x_rx_ring_init()
2328 if (dma_set_mask_and_coherent(&rx->adapter->pdev->dev, in lan743x_rx_ring_init()
2330 dev_warn(&rx->adapter->pdev->dev, in lan743x_rx_ring_init()
2336 ring_allocation_size = ALIGN(rx->ring_size * in lan743x_rx_ring_init()
2340 cpu_ptr = dma_alloc_coherent(&rx->adapter->pdev->dev, in lan743x_rx_ring_init()
2346 rx->ring_allocation_size = ring_allocation_size; in lan743x_rx_ring_init()
2347 rx->ring_cpu_ptr = (struct lan743x_rx_descriptor *)cpu_ptr; in lan743x_rx_ring_init()
2348 rx->ring_dma_ptr = dma_ptr; in lan743x_rx_ring_init()
2350 cpu_ptr = kcalloc(rx->ring_size, sizeof(*rx->buffer_info), in lan743x_rx_ring_init()
2356 rx->buffer_info = (struct lan743x_rx_buffer_info *)cpu_ptr; in lan743x_rx_ring_init()
2358 cpu_ptr = dma_alloc_coherent(&rx->adapter->pdev->dev, in lan743x_rx_ring_init()
2359 sizeof(*rx->head_cpu_ptr), &dma_ptr, in lan743x_rx_ring_init()
2366 rx->head_cpu_ptr = cpu_ptr; in lan743x_rx_ring_init()
2367 rx->head_dma_ptr = dma_ptr; in lan743x_rx_ring_init()
2368 if (rx->head_dma_ptr & 0x3) { in lan743x_rx_ring_init()
2373 rx->last_head = 0; in lan743x_rx_ring_init()
2374 for (index = 0; index < rx->ring_size; index++) { in lan743x_rx_ring_init()
2375 struct sk_buff *new_skb = lan743x_rx_allocate_skb(rx, in lan743x_rx_ring_init()
2378 ret = lan743x_rx_init_ring_element(rx, index, new_skb); in lan743x_rx_ring_init()
2385 lan743x_rx_ring_cleanup(rx); in lan743x_rx_ring_init()
2389 static void lan743x_rx_close(struct lan743x_rx *rx) in lan743x_rx_close() argument
2391 struct lan743x_adapter *adapter = rx->adapter; in lan743x_rx_close()
2394 FCT_RX_CTL_DIS_(rx->channel_number)); in lan743x_rx_close()
2396 FCT_RX_CTL_EN_(rx->channel_number), in lan743x_rx_close()
2400 DMAC_CMD_STOP_R_(rx->channel_number)); in lan743x_rx_close()
2401 lan743x_dmac_rx_wait_till_stopped(adapter, rx->channel_number); in lan743x_rx_close()
2404 DMAC_INT_BIT_RXFRM_(rx->channel_number)); in lan743x_rx_close()
2406 INT_BIT_DMA_RX_(rx->channel_number)); in lan743x_rx_close()
2407 napi_disable(&rx->napi); in lan743x_rx_close()
2409 netif_napi_del(&rx->napi); in lan743x_rx_close()
2411 lan743x_rx_ring_cleanup(rx); in lan743x_rx_close()
2414 static int lan743x_rx_open(struct lan743x_rx *rx) in lan743x_rx_open() argument
2416 struct lan743x_adapter *adapter = rx->adapter; in lan743x_rx_open()
2420 rx->frame_count = 0; in lan743x_rx_open()
2421 ret = lan743x_rx_ring_init(rx); in lan743x_rx_open()
2426 &rx->napi, lan743x_rx_napi_poll, in lan743x_rx_open()
2430 DMAC_CMD_RX_SWR_(rx->channel_number)); in lan743x_rx_open()
2432 DMAC_CMD_RX_SWR_(rx->channel_number), in lan743x_rx_open()
2437 RX_BASE_ADDRH(rx->channel_number), in lan743x_rx_open()
2438 DMA_ADDR_HIGH32(rx->ring_dma_ptr)); in lan743x_rx_open()
2440 RX_BASE_ADDRL(rx->channel_number), in lan743x_rx_open()
2441 DMA_ADDR_LOW32(rx->ring_dma_ptr)); in lan743x_rx_open()
2443 /* set rx write back address */ in lan743x_rx_open()
2445 RX_HEAD_WRITEBACK_ADDRH(rx->channel_number), in lan743x_rx_open()
2446 DMA_ADDR_HIGH32(rx->head_dma_ptr)); in lan743x_rx_open()
2448 RX_HEAD_WRITEBACK_ADDRL(rx->channel_number), in lan743x_rx_open()
2449 DMA_ADDR_LOW32(rx->head_dma_ptr)); in lan743x_rx_open()
2460 RX_CFG_A(rx->channel_number), data); in lan743x_rx_open()
2463 data = lan743x_csr_read(adapter, RX_CFG_B(rx->channel_number)); in lan743x_rx_open()
2470 data |= ((rx->ring_size) & RX_CFG_B_RX_RING_LEN_MASK_); in lan743x_rx_open()
2475 lan743x_csr_write(adapter, RX_CFG_B(rx->channel_number), data); in lan743x_rx_open()
2476 rx->vector_flags = lan743x_intr_get_vector_flags(adapter, in lan743x_rx_open()
2478 (rx->channel_number)); in lan743x_rx_open()
2482 if (rx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_ENABLE_AUTO_CLEAR) in lan743x_rx_open()
2484 if (rx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_STATUS_AUTO_CLEAR) in lan743x_rx_open()
2486 if (rx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_STATUS_R2C) in lan743x_rx_open()
2488 if (rx->vector_flags & LAN743X_VECTOR_FLAG_SOURCE_ENABLE_R2C) in lan743x_rx_open()
2490 lan743x_csr_write(adapter, RX_CFG_C(rx->channel_number), data); in lan743x_rx_open()
2492 rx->last_tail = ((u32)(rx->ring_size - 1)); in lan743x_rx_open()
2493 lan743x_csr_write(adapter, RX_TAIL(rx->channel_number), in lan743x_rx_open()
2494 rx->last_tail); in lan743x_rx_open()
2495 rx->last_head = lan743x_csr_read(adapter, RX_HEAD(rx->channel_number)); in lan743x_rx_open()
2496 if (rx->last_head) { in lan743x_rx_open()
2501 napi_enable(&rx->napi); in lan743x_rx_open()
2504 INT_BIT_DMA_RX_(rx->channel_number)); in lan743x_rx_open()
2506 DMAC_INT_BIT_RXFRM_(rx->channel_number)); in lan743x_rx_open()
2508 DMAC_INT_BIT_RXFRM_(rx->channel_number)); in lan743x_rx_open()
2510 DMAC_CMD_START_R_(rx->channel_number)); in lan743x_rx_open()
2514 FCT_RX_CTL_RESET_(rx->channel_number)); in lan743x_rx_open()
2516 FCT_RX_CTL_RESET_(rx->channel_number), in lan743x_rx_open()
2518 lan743x_csr_write(adapter, FCT_FLOW(rx->channel_number), in lan743x_rx_open()
2525 FCT_RX_CTL_EN_(rx->channel_number)); in lan743x_rx_open()
2529 netif_napi_del(&rx->napi); in lan743x_rx_open()
2530 lan743x_rx_ring_cleanup(rx); in lan743x_rx_open()
2544 lan743x_rx_close(&adapter->rx[index]); in lan743x_netdev_close()
2582 ret = lan743x_rx_open(&adapter->rx[index]); in lan743x_netdev_open()
2595 if (adapter->rx[index].ring_cpu_ptr) in lan743x_netdev_open()
2596 lan743x_rx_close(&adapter->rx[index]); in lan743x_netdev_open()
2777 adapter->rx[index].adapter = adapter; in lan743x_hardware_init()
2778 adapter->rx[index].channel_number = index; in lan743x_hardware_init()