mirror of
https://github.com/torvalds/linux.git
synced 2024-11-22 04:38:03 +00:00
5545b7b9f2
Replace the work queue based RX flow with a NAPI implementation Remove rx_thread and dpmaif_rxq_work. Enable GRO on RX path. Introduce dummy network device. its responsibility is - Binds one NAPI object for each DL HW queue and acts as the agent of all those network devices. - Use NAPI object to poll DL packets. - Helps to dispatch each packet to the network interface. Signed-off-by: Haijun Liu <haijun.liu@mediatek.com> Co-developed-by: Sreehari Kancharla <sreehari.kancharla@linux.intel.com> Signed-off-by: Sreehari Kancharla <sreehari.kancharla@linux.intel.com> Signed-off-by: Chandrashekar Devegowda <chandrashekar.devegowda@intel.com> Acked-by: Ricardo Martinez <ricardo.martinez@linux.intel.com> Acked-by: M Chetan Kumar <m.chetan.kumar@linux.intel.com> Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com> Signed-off-by: David S. Miller <davem@davemloft.net>
203 lines
4.7 KiB
C
203 lines
4.7 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only
|
|
*
|
|
* Copyright (c) 2021, MediaTek Inc.
|
|
* Copyright (c) 2021-2022, Intel Corporation.
|
|
*
|
|
* Authors:
|
|
* Amir Hanania <amir.hanania@intel.com>
|
|
* Haijun Liu <haijun.liu@mediatek.com>
|
|
* Moises Veleta <moises.veleta@intel.com>
|
|
* Ricardo Martinez <ricardo.martinez@linux.intel.com>
|
|
*
|
|
* Contributors:
|
|
* Chiranjeevi Rapolu <chiranjeevi.rapolu@intel.com>
|
|
* Eliot Lee <eliot.lee@intel.com>
|
|
* Sreehari Kancharla <sreehari.kancharla@intel.com>
|
|
*/
|
|
|
|
#ifndef __T7XX_HIF_DPMAIF_H__
|
|
#define __T7XX_HIF_DPMAIF_H__
|
|
|
|
#include <linux/bitmap.h>
|
|
#include <linux/mm_types.h>
|
|
#include <linux/netdevice.h>
|
|
#include <linux/sched.h>
|
|
#include <linux/skbuff.h>
|
|
#include <linux/spinlock.h>
|
|
#include <linux/types.h>
|
|
#include <linux/wait.h>
|
|
#include <linux/workqueue.h>
|
|
|
|
#include "t7xx_dpmaif.h"
|
|
#include "t7xx_pci.h"
|
|
#include "t7xx_state_monitor.h"
|
|
|
|
/* SKB control buffer */
|
|
struct t7xx_skb_cb {
|
|
u8 netif_idx;
|
|
u8 txq_number;
|
|
u8 rx_pkt_type;
|
|
};
|
|
|
|
#define T7XX_SKB_CB(__skb) ((struct t7xx_skb_cb *)(__skb)->cb)
|
|
|
|
enum dpmaif_rdwr {
|
|
DPMAIF_READ,
|
|
DPMAIF_WRITE,
|
|
};
|
|
|
|
/* Structure of DL BAT */
|
|
struct dpmaif_cur_rx_skb_info {
|
|
bool msg_pit_received;
|
|
struct sk_buff *cur_skb;
|
|
unsigned int cur_chn_idx;
|
|
unsigned int check_sum;
|
|
unsigned int pit_dp;
|
|
unsigned int pkt_type;
|
|
int err_payload;
|
|
};
|
|
|
|
struct dpmaif_bat {
|
|
unsigned int p_buffer_addr;
|
|
unsigned int buffer_addr_ext;
|
|
};
|
|
|
|
struct dpmaif_bat_skb {
|
|
struct sk_buff *skb;
|
|
dma_addr_t data_bus_addr;
|
|
unsigned int data_len;
|
|
};
|
|
|
|
struct dpmaif_bat_page {
|
|
struct page *page;
|
|
dma_addr_t data_bus_addr;
|
|
unsigned int offset;
|
|
unsigned int data_len;
|
|
};
|
|
|
|
enum bat_type {
|
|
BAT_TYPE_NORMAL,
|
|
BAT_TYPE_FRAG,
|
|
};
|
|
|
|
struct dpmaif_bat_request {
|
|
void *bat_base;
|
|
dma_addr_t bat_bus_addr;
|
|
unsigned int bat_size_cnt;
|
|
unsigned int bat_wr_idx;
|
|
unsigned int bat_release_rd_idx;
|
|
void *bat_skb;
|
|
unsigned int pkt_buf_sz;
|
|
unsigned long *bat_bitmap;
|
|
atomic_t refcnt;
|
|
spinlock_t mask_lock; /* Protects BAT mask */
|
|
enum bat_type type;
|
|
};
|
|
|
|
struct dpmaif_rx_queue {
|
|
unsigned int index;
|
|
bool que_started;
|
|
unsigned int budget;
|
|
|
|
void *pit_base;
|
|
dma_addr_t pit_bus_addr;
|
|
unsigned int pit_size_cnt;
|
|
|
|
unsigned int pit_rd_idx;
|
|
unsigned int pit_wr_idx;
|
|
unsigned int pit_release_rd_idx;
|
|
|
|
struct dpmaif_bat_request *bat_req;
|
|
struct dpmaif_bat_request *bat_frag;
|
|
|
|
atomic_t rx_processing;
|
|
|
|
struct dpmaif_ctrl *dpmaif_ctrl;
|
|
unsigned int expect_pit_seq;
|
|
unsigned int pit_remain_release_cnt;
|
|
struct dpmaif_cur_rx_skb_info rx_data_info;
|
|
struct napi_struct napi;
|
|
bool sleep_lock_pending;
|
|
};
|
|
|
|
struct dpmaif_tx_queue {
|
|
unsigned int index;
|
|
bool que_started;
|
|
atomic_t tx_budget;
|
|
void *drb_base;
|
|
dma_addr_t drb_bus_addr;
|
|
unsigned int drb_size_cnt;
|
|
unsigned int drb_wr_idx;
|
|
unsigned int drb_rd_idx;
|
|
unsigned int drb_release_rd_idx;
|
|
void *drb_skb_base;
|
|
wait_queue_head_t req_wq;
|
|
struct workqueue_struct *worker;
|
|
struct work_struct dpmaif_tx_work;
|
|
spinlock_t tx_lock; /* Protects txq DRB */
|
|
atomic_t tx_processing;
|
|
|
|
struct dpmaif_ctrl *dpmaif_ctrl;
|
|
struct sk_buff_head tx_skb_head;
|
|
};
|
|
|
|
struct dpmaif_isr_para {
|
|
struct dpmaif_ctrl *dpmaif_ctrl;
|
|
unsigned char pcie_int;
|
|
unsigned char dlq_id;
|
|
};
|
|
|
|
enum dpmaif_state {
|
|
DPMAIF_STATE_MIN,
|
|
DPMAIF_STATE_PWROFF,
|
|
DPMAIF_STATE_PWRON,
|
|
DPMAIF_STATE_EXCEPTION,
|
|
DPMAIF_STATE_MAX
|
|
};
|
|
|
|
enum dpmaif_txq_state {
|
|
DMPAIF_TXQ_STATE_IRQ,
|
|
DMPAIF_TXQ_STATE_FULL,
|
|
};
|
|
|
|
struct dpmaif_callbacks {
|
|
void (*state_notify)(struct t7xx_pci_dev *t7xx_dev,
|
|
enum dpmaif_txq_state state, int txq_number);
|
|
void (*recv_skb)(struct t7xx_ccmni_ctrl *ccmni_ctlb, struct sk_buff *skb,
|
|
struct napi_struct *napi);
|
|
};
|
|
|
|
struct dpmaif_ctrl {
|
|
struct device *dev;
|
|
struct t7xx_pci_dev *t7xx_dev;
|
|
struct md_pm_entity dpmaif_pm_entity;
|
|
enum dpmaif_state state;
|
|
bool dpmaif_sw_init_done;
|
|
struct dpmaif_hw_info hw_info;
|
|
struct dpmaif_tx_queue txq[DPMAIF_TXQ_NUM];
|
|
struct dpmaif_rx_queue rxq[DPMAIF_RXQ_NUM];
|
|
|
|
unsigned char rxq_int_mapping[DPMAIF_RXQ_NUM];
|
|
struct dpmaif_isr_para isr_para[DPMAIF_RXQ_NUM];
|
|
|
|
struct dpmaif_bat_request bat_req;
|
|
struct dpmaif_bat_request bat_frag;
|
|
struct workqueue_struct *bat_release_wq;
|
|
struct work_struct bat_release_work;
|
|
|
|
wait_queue_head_t tx_wq;
|
|
struct task_struct *tx_thread;
|
|
|
|
struct dpmaif_callbacks *callbacks;
|
|
};
|
|
|
|
struct dpmaif_ctrl *t7xx_dpmaif_hif_init(struct t7xx_pci_dev *t7xx_dev,
|
|
struct dpmaif_callbacks *callbacks);
|
|
void t7xx_dpmaif_hif_exit(struct dpmaif_ctrl *dpmaif_ctrl);
|
|
int t7xx_dpmaif_md_state_callback(struct dpmaif_ctrl *dpmaif_ctrl, enum md_state state);
|
|
unsigned int t7xx_ring_buf_get_next_wr_idx(unsigned int buf_len, unsigned int buf_idx);
|
|
unsigned int t7xx_ring_buf_rd_wr_count(unsigned int total_cnt, unsigned int rd_idx,
|
|
unsigned int wr_idx, enum dpmaif_rdwr);
|
|
|
|
#endif /* __T7XX_HIF_DPMAIF_H__ */
|