Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d6f7bbcc authored by Henry Orosco's avatar Henry Orosco Committed by Doug Ledford
Browse files

i40iw: Reorganize structures to align with HW capabilities



Some resources are incorrectly organized and at odds with
HW capabilities. Specifically, ILQ, IEQ, QPs, MSS, QOS
and statistics belong in a VSI.

Signed-off-by: default avatarFaisal Latif <faisal.latif@intel.com>
Signed-off-by: default avatarMustafa Ismail <mustafa.ismail@intel.com>
Signed-off-by: default avatarHenry Orosco <henry.orosco@intel.com>
Signed-off-by: default avatarDoug Ledford <dledford@redhat.com>
parent 0cc0d851
Loading
Loading
Loading
Loading
+4 −3
Original line number Original line Diff line number Diff line
@@ -236,6 +236,7 @@ struct i40iw_device {
	struct net_device *netdev;
	struct net_device *netdev;
	wait_queue_head_t vchnl_waitq;
	wait_queue_head_t vchnl_waitq;
	struct i40iw_sc_dev sc_dev;
	struct i40iw_sc_dev sc_dev;
	struct i40iw_sc_vsi vsi;
	struct i40iw_handler *hdl;
	struct i40iw_handler *hdl;
	struct i40e_info *ldev;
	struct i40e_info *ldev;
	struct i40e_client *client;
	struct i40e_client *client;
@@ -289,7 +290,6 @@ struct i40iw_device {
	u32 sd_type;
	u32 sd_type;
	struct workqueue_struct *param_wq;
	struct workqueue_struct *param_wq;
	atomic_t params_busy;
	atomic_t params_busy;
	u32 mss;
	enum init_completion_state init_state;
	enum init_completion_state init_state;
	u16 mac_ip_table_idx;
	u16 mac_ip_table_idx;
	atomic_t vchnl_msgs;
	atomic_t vchnl_msgs;
@@ -525,6 +525,7 @@ enum i40iw_status_code i40iw_handle_cqp_op(struct i40iw_device *iwdev,
enum i40iw_status_code i40iw_add_mac_addr(struct i40iw_device *iwdev,
enum i40iw_status_code i40iw_add_mac_addr(struct i40iw_device *iwdev,
					  u8 *mac_addr, u8 *mac_index);
					  u8 *mac_addr, u8 *mac_index);
int i40iw_modify_qp(struct ib_qp *, struct ib_qp_attr *, int, struct ib_udata *);
int i40iw_modify_qp(struct ib_qp *, struct ib_qp_attr *, int, struct ib_udata *);
void i40iw_cq_wq_destroy(struct i40iw_device *iwdev, struct i40iw_sc_cq *cq);


void i40iw_rem_pdusecount(struct i40iw_pd *iwpd, struct i40iw_device *iwdev);
void i40iw_rem_pdusecount(struct i40iw_pd *iwpd, struct i40iw_device *iwdev);
void i40iw_add_pdusecount(struct i40iw_pd *iwpd);
void i40iw_add_pdusecount(struct i40iw_pd *iwpd);
@@ -542,8 +543,8 @@ enum i40iw_status_code i40iw_manage_qhash(struct i40iw_device *iwdev,
					  enum i40iw_quad_hash_manage_type mtype,
					  enum i40iw_quad_hash_manage_type mtype,
					  void *cmnode,
					  void *cmnode,
					  bool wait);
					  bool wait);
void i40iw_receive_ilq(struct i40iw_sc_dev *dev, struct i40iw_puda_buf *rbuf);
void i40iw_receive_ilq(struct i40iw_sc_vsi *vsi, struct i40iw_puda_buf *rbuf);
void i40iw_free_sqbuf(struct i40iw_sc_dev *dev, void *bufp);
void i40iw_free_sqbuf(struct i40iw_sc_vsi *vsi, void *bufp);
void i40iw_free_qp_resources(struct i40iw_device *iwdev,
void i40iw_free_qp_resources(struct i40iw_device *iwdev,
			     struct i40iw_qp *iwqp,
			     struct i40iw_qp *iwqp,
			     u32 qp_num);
			     u32 qp_num);
+20 −16
Original line number Original line Diff line number Diff line
@@ -68,13 +68,13 @@ static void i40iw_disconnect_worker(struct work_struct *work);


/**
/**
 * i40iw_free_sqbuf - put back puda buffer if refcount = 0
 * i40iw_free_sqbuf - put back puda buffer if refcount = 0
 * @dev: FPK device
 * @vsi: pointer to vsi structure
 * @buf: puda buffer to free
 * @buf: puda buffer to free
 */
 */
void i40iw_free_sqbuf(struct i40iw_sc_dev *dev, void *bufp)
void i40iw_free_sqbuf(struct i40iw_sc_vsi *vsi, void *bufp)
{
{
	struct i40iw_puda_buf *buf = (struct i40iw_puda_buf *)bufp;
	struct i40iw_puda_buf *buf = (struct i40iw_puda_buf *)bufp;
	struct i40iw_puda_rsrc *ilq = dev->ilq;
	struct i40iw_puda_rsrc *ilq = vsi->ilq;


	if (!atomic_dec_return(&buf->refcount))
	if (!atomic_dec_return(&buf->refcount))
		i40iw_puda_ret_bufpool(ilq, buf);
		i40iw_puda_ret_bufpool(ilq, buf);
@@ -337,13 +337,13 @@ static struct i40iw_cm_event *i40iw_create_event(struct i40iw_cm_node *cm_node,
 */
 */
static void i40iw_free_retrans_entry(struct i40iw_cm_node *cm_node)
static void i40iw_free_retrans_entry(struct i40iw_cm_node *cm_node)
{
{
	struct i40iw_sc_dev *dev = cm_node->dev;
	struct i40iw_device *iwdev = cm_node->iwdev;
	struct i40iw_timer_entry *send_entry;
	struct i40iw_timer_entry *send_entry;


	send_entry = cm_node->send_entry;
	send_entry = cm_node->send_entry;
	if (send_entry) {
	if (send_entry) {
		cm_node->send_entry = NULL;
		cm_node->send_entry = NULL;
		i40iw_free_sqbuf(dev, (void *)send_entry->sqbuf);
		i40iw_free_sqbuf(&iwdev->vsi, (void *)send_entry->sqbuf);
		kfree(send_entry);
		kfree(send_entry);
		atomic_dec(&cm_node->ref_count);
		atomic_dec(&cm_node->ref_count);
	}
	}
@@ -377,7 +377,7 @@ static struct i40iw_puda_buf *i40iw_form_cm_frame(struct i40iw_cm_node *cm_node,
						  u8 flags)
						  u8 flags)
{
{
	struct i40iw_puda_buf *sqbuf;
	struct i40iw_puda_buf *sqbuf;
	struct i40iw_sc_dev *dev = cm_node->dev;
	struct i40iw_sc_vsi *vsi = &cm_node->iwdev->vsi;
	u8 *buf;
	u8 *buf;


	struct tcphdr *tcph;
	struct tcphdr *tcph;
@@ -391,7 +391,7 @@ static struct i40iw_puda_buf *i40iw_form_cm_frame(struct i40iw_cm_node *cm_node,
	u32 hdr_len = 0;
	u32 hdr_len = 0;
	u16 vtag;
	u16 vtag;


	sqbuf = i40iw_puda_get_bufpool(dev->ilq);
	sqbuf = i40iw_puda_get_bufpool(vsi->ilq);
	if (!sqbuf)
	if (!sqbuf)
		return NULL;
		return NULL;
	buf = sqbuf->mem.va;
	buf = sqbuf->mem.va;
@@ -1059,7 +1059,7 @@ int i40iw_schedule_cm_timer(struct i40iw_cm_node *cm_node,
			    int send_retrans,
			    int send_retrans,
			    int close_when_complete)
			    int close_when_complete)
{
{
	struct i40iw_sc_dev *dev = cm_node->dev;
	struct i40iw_sc_vsi *vsi = &cm_node->iwdev->vsi;
	struct i40iw_cm_core *cm_core = cm_node->cm_core;
	struct i40iw_cm_core *cm_core = cm_node->cm_core;
	struct i40iw_timer_entry *new_send;
	struct i40iw_timer_entry *new_send;
	int ret = 0;
	int ret = 0;
@@ -1068,7 +1068,7 @@ int i40iw_schedule_cm_timer(struct i40iw_cm_node *cm_node,


	new_send = kzalloc(sizeof(*new_send), GFP_ATOMIC);
	new_send = kzalloc(sizeof(*new_send), GFP_ATOMIC);
	if (!new_send) {
	if (!new_send) {
		i40iw_free_sqbuf(cm_node->dev, (void *)sqbuf);
		i40iw_free_sqbuf(vsi, (void *)sqbuf);
		return -ENOMEM;
		return -ENOMEM;
	}
	}
	new_send->retrycount = I40IW_DEFAULT_RETRYS;
	new_send->retrycount = I40IW_DEFAULT_RETRYS;
@@ -1083,7 +1083,7 @@ int i40iw_schedule_cm_timer(struct i40iw_cm_node *cm_node,
		new_send->timetosend += (HZ / 10);
		new_send->timetosend += (HZ / 10);
		if (cm_node->close_entry) {
		if (cm_node->close_entry) {
			kfree(new_send);
			kfree(new_send);
			i40iw_free_sqbuf(cm_node->dev, (void *)sqbuf);
			i40iw_free_sqbuf(vsi, (void *)sqbuf);
			i40iw_pr_err("already close entry\n");
			i40iw_pr_err("already close entry\n");
			return -EINVAL;
			return -EINVAL;
		}
		}
@@ -1098,7 +1098,7 @@ int i40iw_schedule_cm_timer(struct i40iw_cm_node *cm_node,
		new_send->timetosend = jiffies + I40IW_RETRY_TIMEOUT;
		new_send->timetosend = jiffies + I40IW_RETRY_TIMEOUT;


		atomic_inc(&sqbuf->refcount);
		atomic_inc(&sqbuf->refcount);
		i40iw_puda_send_buf(dev->ilq, sqbuf);
		i40iw_puda_send_buf(vsi->ilq, sqbuf);
		if (!send_retrans) {
		if (!send_retrans) {
			i40iw_cleanup_retrans_entry(cm_node);
			i40iw_cleanup_retrans_entry(cm_node);
			if (close_when_complete)
			if (close_when_complete)
@@ -1195,6 +1195,7 @@ static void i40iw_cm_timer_tick(unsigned long pass)
	struct i40iw_cm_node *cm_node;
	struct i40iw_cm_node *cm_node;
	struct i40iw_timer_entry *send_entry, *close_entry;
	struct i40iw_timer_entry *send_entry, *close_entry;
	struct list_head *list_core_temp;
	struct list_head *list_core_temp;
	struct i40iw_sc_vsi *vsi;
	struct list_head *list_node;
	struct list_head *list_node;
	struct i40iw_cm_core *cm_core = (struct i40iw_cm_core *)pass;
	struct i40iw_cm_core *cm_core = (struct i40iw_cm_core *)pass;
	u32 settimer = 0;
	u32 settimer = 0;
@@ -1270,9 +1271,10 @@ static void i40iw_cm_timer_tick(unsigned long pass)
		cm_node->cm_core->stats_pkt_retrans++;
		cm_node->cm_core->stats_pkt_retrans++;
		spin_unlock_irqrestore(&cm_node->retrans_list_lock, flags);
		spin_unlock_irqrestore(&cm_node->retrans_list_lock, flags);


		vsi = &cm_node->iwdev->vsi;
		dev = cm_node->dev;
		dev = cm_node->dev;
		atomic_inc(&send_entry->sqbuf->refcount);
		atomic_inc(&send_entry->sqbuf->refcount);
		i40iw_puda_send_buf(dev->ilq, send_entry->sqbuf);
		i40iw_puda_send_buf(vsi->ilq, send_entry->sqbuf);
		spin_lock_irqsave(&cm_node->retrans_list_lock, flags);
		spin_lock_irqsave(&cm_node->retrans_list_lock, flags);
		if (send_entry->send_retrans) {
		if (send_entry->send_retrans) {
			send_entry->retranscount--;
			send_entry->retranscount--;
@@ -1373,10 +1375,11 @@ int i40iw_send_syn(struct i40iw_cm_node *cm_node, u32 sendack)
static void i40iw_send_ack(struct i40iw_cm_node *cm_node)
static void i40iw_send_ack(struct i40iw_cm_node *cm_node)
{
{
	struct i40iw_puda_buf *sqbuf;
	struct i40iw_puda_buf *sqbuf;
	struct i40iw_sc_vsi *vsi = &cm_node->iwdev->vsi;


	sqbuf = i40iw_form_cm_frame(cm_node, NULL, NULL, NULL, SET_ACK);
	sqbuf = i40iw_form_cm_frame(cm_node, NULL, NULL, NULL, SET_ACK);
	if (sqbuf)
	if (sqbuf)
		i40iw_puda_send_buf(cm_node->dev->ilq, sqbuf);
		i40iw_puda_send_buf(vsi->ilq, sqbuf);
	else
	else
		i40iw_pr_err("no sqbuf\n");
		i40iw_pr_err("no sqbuf\n");
}
}
@@ -2179,7 +2182,7 @@ static struct i40iw_cm_node *i40iw_make_cm_node(
			I40IW_CM_DEFAULT_RCV_WND_SCALED >> I40IW_CM_DEFAULT_RCV_WND_SCALE;
			I40IW_CM_DEFAULT_RCV_WND_SCALED >> I40IW_CM_DEFAULT_RCV_WND_SCALE;
	ts = current_kernel_time();
	ts = current_kernel_time();
	cm_node->tcp_cntxt.loc_seq_num = ts.tv_nsec;
	cm_node->tcp_cntxt.loc_seq_num = ts.tv_nsec;
	cm_node->tcp_cntxt.mss = iwdev->mss;
	cm_node->tcp_cntxt.mss = iwdev->vsi.mss;


	cm_node->iwdev = iwdev;
	cm_node->iwdev = iwdev;
	cm_node->dev = &iwdev->sc_dev;
	cm_node->dev = &iwdev->sc_dev;
@@ -3059,10 +3062,10 @@ static int i40iw_cm_close(struct i40iw_cm_node *cm_node)
/**
/**
 * i40iw_receive_ilq - recv an ETHERNET packet, and process it
 * i40iw_receive_ilq - recv an ETHERNET packet, and process it
 * through CM
 * through CM
 * @dev: FPK dev struct
 * @vsi: pointer to the vsi structure
 * @rbuf: receive buffer
 * @rbuf: receive buffer
 */
 */
void i40iw_receive_ilq(struct i40iw_sc_dev *dev, struct i40iw_puda_buf *rbuf)
void i40iw_receive_ilq(struct i40iw_sc_vsi *vsi, struct i40iw_puda_buf *rbuf)
{
{
	struct i40iw_cm_node *cm_node;
	struct i40iw_cm_node *cm_node;
	struct i40iw_cm_listener *listener;
	struct i40iw_cm_listener *listener;
@@ -3070,6 +3073,7 @@ void i40iw_receive_ilq(struct i40iw_sc_dev *dev, struct i40iw_puda_buf *rbuf)
	struct ipv6hdr *ip6h;
	struct ipv6hdr *ip6h;
	struct tcphdr *tcph;
	struct tcphdr *tcph;
	struct i40iw_cm_info cm_info;
	struct i40iw_cm_info cm_info;
	struct i40iw_sc_dev *dev = vsi->dev;
	struct i40iw_device *iwdev = (struct i40iw_device *)dev->back_dev;
	struct i40iw_device *iwdev = (struct i40iw_device *)dev->back_dev;
	struct i40iw_cm_core *cm_core = &iwdev->cm_core;
	struct i40iw_cm_core *cm_core = &iwdev->cm_core;
	struct vlan_ethhdr *ethh;
	struct vlan_ethhdr *ethh;
+301 −226

File changed.

Preview size limit exceeded, changes collapsed.

+13 −8
Original line number Original line Diff line number Diff line
@@ -69,6 +69,9 @@
#define I40IW_STAG_TYPE_NONSHARED 1
#define I40IW_STAG_TYPE_NONSHARED 1


#define I40IW_MAX_USER_PRIORITY 8
#define I40IW_MAX_USER_PRIORITY 8
#define I40IW_MAX_STATS_COUNT 16
#define I40IW_FIRST_NON_PF_STAT	4



#define LS_64_1(val, bits)      ((u64)(uintptr_t)val << bits)
#define LS_64_1(val, bits)      ((u64)(uintptr_t)val << bits)
#define RS_64_1(val, bits)      ((u64)(uintptr_t)val >> bits)
#define RS_64_1(val, bits)      ((u64)(uintptr_t)val >> bits)
@@ -1203,8 +1206,11 @@
#define I40IWQPC_RXCQNUM_SHIFT 32
#define I40IWQPC_RXCQNUM_SHIFT 32
#define I40IWQPC_RXCQNUM_MASK (0x1ffffULL << I40IWQPC_RXCQNUM_SHIFT)
#define I40IWQPC_RXCQNUM_MASK (0x1ffffULL << I40IWQPC_RXCQNUM_SHIFT)


#define I40IWQPC_Q2ADDR_SHIFT I40IW_CQPHC_QPCTX_SHIFT
#define I40IWQPC_STAT_INDEX_SHIFT 0
#define I40IWQPC_Q2ADDR_MASK I40IW_CQPHC_QPCTX_MASK
#define I40IWQPC_STAT_INDEX_MASK (0x1fULL << I40IWQPC_STAT_INDEX_SHIFT)

#define I40IWQPC_Q2ADDR_SHIFT 0
#define I40IWQPC_Q2ADDR_MASK (0xffffffffffffff00ULL << I40IWQPC_Q2ADDR_SHIFT)


#define I40IWQPC_LASTBYTESENT_SHIFT 0
#define I40IWQPC_LASTBYTESENT_SHIFT 0
#define I40IWQPC_LASTBYTESENT_MASK (0xffUL << I40IWQPC_LASTBYTESENT_SHIFT)
#define I40IWQPC_LASTBYTESENT_MASK (0xffUL << I40IWQPC_LASTBYTESENT_SHIFT)
@@ -1236,11 +1242,8 @@
#define I40IWQPC_PRIVEN_SHIFT 25
#define I40IWQPC_PRIVEN_SHIFT 25
#define I40IWQPC_PRIVEN_MASK (1UL << I40IWQPC_PRIVEN_SHIFT)
#define I40IWQPC_PRIVEN_MASK (1UL << I40IWQPC_PRIVEN_SHIFT)


#define I40IWQPC_LSMMPRESENT_SHIFT 26
#define I40IWQPC_USESTATSINSTANCE_SHIFT 26
#define I40IWQPC_LSMMPRESENT_MASK (1UL << I40IWQPC_LSMMPRESENT_SHIFT)
#define I40IWQPC_USESTATSINSTANCE_MASK (1UL << I40IWQPC_USESTATSINSTANCE_SHIFT)

#define I40IWQPC_ADJUSTFORLSMM_SHIFT 27
#define I40IWQPC_ADJUSTFORLSMM_MASK (1UL << I40IWQPC_ADJUSTFORLSMM_SHIFT)


#define I40IWQPC_IWARPMODE_SHIFT 28
#define I40IWQPC_IWARPMODE_SHIFT 28
#define I40IWQPC_IWARPMODE_MASK (1UL << I40IWQPC_IWARPMODE_SHIFT)
#define I40IWQPC_IWARPMODE_MASK (1UL << I40IWQPC_IWARPMODE_SHIFT)
@@ -1717,6 +1720,8 @@ enum i40iw_alignment {
#define OP_MANAGE_VF_PBLE_BP                    28
#define OP_MANAGE_VF_PBLE_BP                    28
#define OP_QUERY_FPM_VALUES                     29
#define OP_QUERY_FPM_VALUES                     29
#define OP_COMMIT_FPM_VALUES                    30
#define OP_COMMIT_FPM_VALUES                    30
#define OP_SIZE_CQP_STAT_ARRAY                  31
#define OP_REQUESTED_COMMANDS                   31
#define OP_COMPLETED_COMMANDS                   32
#define OP_SIZE_CQP_STAT_ARRAY                  33


#endif
#endif
+3 −1
Original line number Original line Diff line number Diff line
@@ -542,6 +542,7 @@ enum i40iw_status_code i40iw_manage_qhash(struct i40iw_device *iwdev,
{
{
	struct i40iw_qhash_table_info *info;
	struct i40iw_qhash_table_info *info;
	struct i40iw_sc_dev *dev = &iwdev->sc_dev;
	struct i40iw_sc_dev *dev = &iwdev->sc_dev;
	struct i40iw_sc_vsi *vsi = &iwdev->vsi;
	enum i40iw_status_code status;
	enum i40iw_status_code status;
	struct i40iw_cqp *iwcqp = &iwdev->cqp;
	struct i40iw_cqp *iwcqp = &iwdev->cqp;
	struct i40iw_cqp_request *cqp_request;
	struct i40iw_cqp_request *cqp_request;
@@ -554,6 +555,7 @@ enum i40iw_status_code i40iw_manage_qhash(struct i40iw_device *iwdev,
	info = &cqp_info->in.u.manage_qhash_table_entry.info;
	info = &cqp_info->in.u.manage_qhash_table_entry.info;
	memset(info, 0, sizeof(*info));
	memset(info, 0, sizeof(*info));


	info->vsi = &iwdev->vsi;
	info->manage = mtype;
	info->manage = mtype;
	info->entry_type = etype;
	info->entry_type = etype;
	if (cminfo->vlan_id != 0xFFFF) {
	if (cminfo->vlan_id != 0xFFFF) {
@@ -566,7 +568,7 @@ enum i40iw_status_code i40iw_manage_qhash(struct i40iw_device *iwdev,
	info->ipv4_valid = cminfo->ipv4;
	info->ipv4_valid = cminfo->ipv4;
	info->user_pri = cminfo->user_pri;
	info->user_pri = cminfo->user_pri;
	ether_addr_copy(info->mac_addr, iwdev->netdev->dev_addr);
	ether_addr_copy(info->mac_addr, iwdev->netdev->dev_addr);
	info->qp_num = cpu_to_le32(dev->ilq->qp_id);
	info->qp_num = cpu_to_le32(vsi->ilq->qp_id);
	info->dest_port = cpu_to_le16(cminfo->loc_port);
	info->dest_port = cpu_to_le16(cminfo->loc_port);
	info->dest_ip[0] = cpu_to_le32(cminfo->loc_addr[0]);
	info->dest_ip[0] = cpu_to_le32(cminfo->loc_addr[0]);
	info->dest_ip[1] = cpu_to_le32(cminfo->loc_addr[1]);
	info->dest_ip[1] = cpu_to_le32(cminfo->loc_addr[1]);
Loading