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

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
...@@ -236,6 +236,7 @@ struct i40iw_device { ...@@ -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 { ...@@ -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, ...@@ -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, ...@@ -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);
......
...@@ -68,13 +68,13 @@ static void i40iw_disconnect_worker(struct work_struct *work); ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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, ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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( ...@@ -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) ...@@ -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) ...@@ -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;
......
This diff is collapsed.
...@@ -69,6 +69,9 @@ ...@@ -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 @@ ...@@ -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 @@ ...@@ -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 { ...@@ -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
...@@ -542,6 +542,7 @@ enum i40iw_status_code i40iw_manage_qhash(struct i40iw_device *iwdev, ...@@ -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, ...@@ -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, ...@@ -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]);
......
...@@ -932,6 +932,7 @@ static enum i40iw_status_code i40iw_initialize_ilq(struct i40iw_device *iwdev) ...@@ -932,6 +932,7 @@ static enum i40iw_status_code i40iw_initialize_ilq(struct i40iw_device *iwdev)
struct i40iw_puda_rsrc_info info; struct i40iw_puda_rsrc_info info;
enum i40iw_status_code status; enum i40iw_status_code status;
memset(&info, 0, sizeof(info));
info.type = I40IW_PUDA_RSRC_TYPE_ILQ; info.type = I40IW_PUDA_RSRC_TYPE_ILQ;
info.cq_id = 1; info.cq_id = 1;
info.qp_id = 0; info.qp_id = 0;
...@@ -941,10 +942,9 @@ static enum i40iw_status_code i40iw_initialize_ilq(struct i40iw_device *iwdev) ...@@ -941,10 +942,9 @@ static enum i40iw_status_code i40iw_initialize_ilq(struct i40iw_device *iwdev)
info.rq_size = 8192; info.rq_size = 8192;
info.buf_size = 1024; info.buf_size = 1024;
info.tx_buf_cnt = 16384; info.tx_buf_cnt = 16384;
info.mss = iwdev->sc_dev.mss;
info.receive = i40iw_receive_ilq; info.receive = i40iw_receive_ilq;
info.xmit_complete = i40iw_free_sqbuf; info.xmit_complete = i40iw_free_sqbuf;
status = i40iw_puda_create_rsrc(&iwdev->sc_dev, &info); status = i40iw_puda_create_rsrc(&iwdev->vsi, &info);
if (status) if (status)
i40iw_pr_err("ilq create fail\n"); i40iw_pr_err("ilq create fail\n");
return status; return status;
...@@ -961,6 +961,7 @@ static enum i40iw_status_code i40iw_initialize_ieq(struct i40iw_device *iwdev) ...@@ -961,6 +961,7 @@ static enum i40iw_status_code i40iw_initialize_ieq(struct i40iw_device *iwdev)
struct i40iw_puda_rsrc_info info; struct i40iw_puda_rsrc_info info;
enum i40iw_status_code status; enum i40iw_status_code status;
memset(&info, 0, sizeof(info));
info.type = I40IW_PUDA_RSRC_TYPE_IEQ; info.type = I40IW_PUDA_RSRC_TYPE_IEQ;
info.cq_id = 2; info.cq_id = 2;
info.qp_id = iwdev->sc_dev.exception_lan_queue; info.qp_id = iwdev->sc_dev.exception_lan_queue;
...@@ -969,9 +970,8 @@ static enum i40iw_status_code i40iw_initialize_ieq(struct i40iw_device *iwdev) ...@@ -969,9 +970,8 @@ static enum i40iw_status_code i40iw_initialize_ieq(struct i40iw_device *iwdev)
info.sq_size = 8192; info.sq_size = 8192;
info.rq_size = 8192; info.rq_size = 8192;
info.buf_size = 2048; info.buf_size = 2048;
info.mss = iwdev->sc_dev.mss;
info.tx_buf_cnt = 16384; info.tx_buf_cnt = 16384;
status = i40iw_puda_create_rsrc(&iwdev->sc_dev, &info); status = i40iw_puda_create_rsrc(&iwdev->vsi, &info);
if (status) if (status)
i40iw_pr_err("ieq create fail\n"); i40iw_pr_err("ieq create fail\n");
return status; return status;
...@@ -1296,12 +1296,16 @@ static enum i40iw_status_code i40iw_initialize_dev(struct i40iw_device *iwdev, ...@@ -1296,12 +1296,16 @@ static enum i40iw_status_code i40iw_initialize_dev(struct i40iw_device *iwdev,
enum i40iw_status_code status; enum i40iw_status_code status;
struct i40iw_sc_dev *dev = &iwdev->sc_dev; struct i40iw_sc_dev *dev = &iwdev->sc_dev;
struct i40iw_device_init_info info; struct i40iw_device_init_info info;
struct i40iw_vsi_init_info vsi_info;
struct i40iw_dma_mem mem; struct i40iw_dma_mem mem;
struct i40iw_l2params l2params;
u32 size; u32 size;
struct i40iw_vsi_stats_info stats_info;
u16 last_qset = I40IW_NO_QSET; u16 last_qset = I40IW_NO_QSET;
u16 qset; u16 qset;
u32 i; u32 i;
memset(&l2params, 0, sizeof(l2params));
memset(&info, 0, sizeof(info)); memset(&info, 0, sizeof(info));
size = sizeof(struct i40iw_hmc_pble_rsrc) + sizeof(struct i40iw_hmc_info) + size = sizeof(struct i40iw_hmc_pble_rsrc) + sizeof(struct i40iw_hmc_info) +
(sizeof(struct i40iw_hmc_obj_info) * I40IW_HMC_IW_MAX); (sizeof(struct i40iw_hmc_obj_info) * I40IW_HMC_IW_MAX);
...@@ -1330,16 +1334,17 @@ static enum i40iw_status_code i40iw_initialize_dev(struct i40iw_device *iwdev, ...@@ -1330,16 +1334,17 @@ static enum i40iw_status_code i40iw_initialize_dev(struct i40iw_device *iwdev,
info.bar0 = ldev->hw_addr; info.bar0 = ldev->hw_addr;
info.hw = &iwdev->hw; info.hw = &iwdev->hw;
info.debug_mask = debug; info.debug_mask = debug;
info.l2params.mss = l2params.mss =
(ldev->params.mtu) ? ldev->params.mtu - I40IW_MTU_TO_MSS : I40IW_DEFAULT_MSS; (ldev->params.mtu) ? ldev->params.mtu - I40IW_MTU_TO_MSS : I40IW_DEFAULT_MSS;
for (i = 0; i < I40E_CLIENT_MAX_USER_PRIORITY; i++) { for (i = 0; i < I40E_CLIENT_MAX_USER_PRIORITY; i++) {
qset = ldev->params.qos.prio_qos[i].qs_handle; qset = ldev->params.qos.prio_qos[i].qs_handle;
info.l2params.qs_handle_list[i] = qset; l2params.qs_handle_list[i] = qset;
if (last_qset == I40IW_NO_QSET) if (last_qset == I40IW_NO_QSET)
last_qset = qset; last_qset = qset;
else if ((qset != last_qset) && (qset != I40IW_NO_QSET)) else if ((qset != last_qset) && (qset != I40IW_NO_QSET))
iwdev->dcb = true; iwdev->dcb = true;
} }
i40iw_pr_info("DCB is set/clear = %d\n", iwdev->dcb);
info.exception_lan_queue = 1; info.exception_lan_queue = 1;
info.vchnl_send = i40iw_virtchnl_send; info.vchnl_send = i40iw_virtchnl_send;
status = i40iw_device_init(&iwdev->sc_dev, &info); status = i40iw_device_init(&iwdev->sc_dev, &info);
...@@ -1348,6 +1353,20 @@ static enum i40iw_status_code i40iw_initialize_dev(struct i40iw_device *iwdev, ...@@ -1348,6 +1353,20 @@ static enum i40iw_status_code i40iw_initialize_dev(struct i40iw_device *iwdev,
kfree(iwdev->hmc_info_mem); kfree(iwdev->hmc_info_mem);
iwdev->hmc_info_mem = NULL; iwdev->hmc_info_mem = NULL;
} }
memset(&vsi_info, 0, sizeof(vsi_info));
vsi_info.dev = &iwdev->sc_dev;
vsi_info.back_vsi = (void *)iwdev;
vsi_info.params = &l2params;
i40iw_sc_vsi_init(&iwdev->vsi, &vsi_info);
if (dev->is_pf) {
memset(&stats_info, 0, sizeof(stats_info));
stats_info.fcn_id = ldev->fid;
stats_info.pestat = kzalloc(sizeof(*stats_info.pestat), GFP_KERNEL);
stats_info.stats_initialize = true;
if (stats_info.pestat)
i40iw_vsi_stats_init(&iwdev->vsi, &stats_info);
}
return status; return status;
} }
...@@ -1457,10 +1476,10 @@ static void i40iw_deinit_device(struct i40iw_device *iwdev, bool reset) ...@@ -1457,10 +1476,10 @@ static void i40iw_deinit_device(struct i40iw_device *iwdev, bool reset)
i40iw_destroy_aeq(iwdev, reset); i40iw_destroy_aeq(iwdev, reset);
/* fallthrough */ /* fallthrough */
case IEQ_CREATED: case IEQ_CREATED:
i40iw_puda_dele_resources(dev, I40IW_PUDA_RSRC_TYPE_IEQ, reset); i40iw_puda_dele_resources(&iwdev->vsi, I40IW_PUDA_RSRC_TYPE_IEQ, reset);
/* fallthrough */ /* fallthrough */
case ILQ_CREATED: case ILQ_CREATED:
i40iw_puda_dele_resources(dev, I40IW_PUDA_RSRC_TYPE_ILQ, reset); i40iw_puda_dele_resources(&iwdev->vsi, I40IW_PUDA_RSRC_TYPE_ILQ, reset);
/* fallthrough */ /* fallthrough */
case CCQ_CREATED: case CCQ_CREATED:
i40iw_destroy_ccq(iwdev, reset); i40iw_destroy_ccq(iwdev, reset);
...@@ -1476,9 +1495,10 @@ static void i40iw_deinit_device(struct i40iw_device *iwdev, bool reset) ...@@ -1476,9 +1495,10 @@ static void i40iw_deinit_device(struct i40iw_device *iwdev, bool reset)
/* fallthrough */ /* fallthrough */
case INITIAL_STATE: case INITIAL_STATE:
i40iw_cleanup_cm_core(&iwdev->cm_core); i40iw_cleanup_cm_core(&iwdev->cm_core);
if (dev->is_pf) if (iwdev->vsi.pestat) {
i40iw_hw_stats_del_timer(dev); i40iw_vsi_stats_free(&iwdev->vsi);
kfree(iwdev->vsi.pestat);
}
i40iw_del_init_mem(iwdev); i40iw_del_init_mem(iwdev);
break; break;
case INVALID_STATE: case INVALID_STATE:
...@@ -1523,7 +1543,6 @@ static enum i40iw_status_code i40iw_setup_init_state(struct i40iw_handler *hdl, ...@@ -1523,7 +1543,6 @@ static enum i40iw_status_code i40iw_setup_init_state(struct i40iw_handler *hdl,
iwdev->max_enabled_vfs = iwdev->max_rdma_vfs; iwdev->max_enabled_vfs = iwdev->max_rdma_vfs;
iwdev->netdev = ldev->netdev; iwdev->netdev = ldev->netdev;
hdl->client = client; hdl->client = client;
iwdev->mss = (!ldev->params.mtu) ? I40IW_DEFAULT_MSS : ldev->params.mtu - I40IW_MTU_TO_MSS;
if (!ldev->ftype) if (!ldev->ftype)
iwdev->db_start = pci_resource_start(ldev->pcidev, 0) + I40IW_DB_ADDR_OFFSET; iwdev->db_start = pci_resource_start(ldev->pcidev, 0) + I40IW_DB_ADDR_OFFSET;
else else
...@@ -1683,7 +1702,7 @@ static void i40iw_l2params_worker(struct work_struct *work) ...@@ -1683,7 +1702,7 @@ static void i40iw_l2params_worker(struct work_struct *work)
container_of(work, struct l2params_work, work); container_of(work, struct l2params_work, work);
struct i40iw_device *iwdev = dwork->iwdev; struct i40iw_device *iwdev = dwork->iwdev;
i40iw_change_l2params(&iwdev->sc_dev, &dwork->l2params); i40iw_change_l2params(&iwdev->vsi, &dwork->l2params);
atomic_dec(&iwdev->params_busy); atomic_dec(&iwdev->params_busy);
kfree(work); kfree(work);
} }
...@@ -1724,7 +1743,7 @@ static void i40iw_l2param_change(struct i40e_info *ldev, struct i40e_client *cli ...@@ -1724,7 +1743,7 @@ static void i40iw_l2param_change(struct i40e_info *ldev, struct i40e_client *cli
for (i = 0; i < I40E_CLIENT_MAX_USER_PRIORITY; i++) for (i = 0; i < I40E_CLIENT_MAX_USER_PRIORITY; i++)
l2params->qs_handle_list[i] = params->qos.prio_qos[i].qs_handle; l2params->qs_handle_list[i] = params->qos.prio_qos[i].qs_handle;
l2params->mss = (params->mtu) ? params->mtu - I40IW_MTU_TO_MSS : iwdev->mss; l2params->mss = (params->mtu) ? params->mtu - I40IW_MTU_TO_MSS : iwdev->vsi.mss;
INIT_WORK(&work->work, i40iw_l2params_worker); INIT_WORK(&work->work, i40iw_l2params_worker);
queue_work(iwdev->param_wq, &work->work); queue_work(iwdev->param_wq, &work->work);
...@@ -1773,21 +1792,23 @@ static void i40iw_vf_reset(struct i40e_info *ldev, struct i40e_client *client, u ...@@ -1773,21 +1792,23 @@ static void i40iw_vf_reset(struct i40e_info *ldev, struct i40e_client *client, u
struct i40iw_vfdev *tmp_vfdev; struct i40iw_vfdev *tmp_vfdev;
unsigned int i; unsigned int i;
unsigned long flags; unsigned long flags;
struct i40iw_device *iwdev;
hdl = i40iw_find_i40e_handler(ldev); hdl = i40iw_find_i40e_handler(ldev);
if (!hdl) if (!hdl)
return; return;
dev = &hdl->device.sc_dev; dev = &hdl->device.sc_dev;
iwdev = (struct i40iw_device *)dev->back_dev;
for (i = 0; i < I40IW_MAX_PE_ENABLED_VF_COUNT; i++) { for (i = 0; i < I40IW_MAX_PE_ENABLED_VF_COUNT; i++) {
if (!dev->vf_dev[i] || (dev->vf_dev[i]->vf_id != vf_id)) if (!dev->vf_dev[i] || (dev->vf_dev[i]->vf_id != vf_id))
continue; continue;
/* free all resources allocated on behalf of vf */ /* free all resources allocated on behalf of vf */
tmp_vfdev = dev->vf_dev[i]; tmp_vfdev = dev->vf_dev[i];
spin_lock_irqsave(&dev->dev_pestat.stats_lock, flags); spin_lock_irqsave(&iwdev->vsi.pestat->lock, flags);
dev->vf_dev[i] = NULL; dev->vf_dev[i] = NULL;
spin_unlock_irqrestore(&dev->dev_pestat.stats_lock, flags); spin_unlock_irqrestore(&iwdev->vsi.pestat->lock, flags);
i40iw_del_hmc_objects(dev, &tmp_vfdev->hmc_info, false, false); i40iw_del_hmc_objects(dev, &tmp_vfdev->hmc_info, false, false);
/* remove vf hmc function */ /* remove vf hmc function */
memset(&hmc_fcn_info, 0, sizeof(hmc_fcn_info)); memset(&hmc_fcn_info, 0, sizeof(hmc_fcn_info));
......
...@@ -209,9 +209,9 @@ void i40iw_terminate_del_timer(struct i40iw_sc_qp *qp); ...@@ -209,9 +209,9 @@ void i40iw_terminate_del_timer(struct i40iw_sc_qp *qp);
enum i40iw_status_code i40iw_hw_manage_vf_pble_bp(struct i40iw_device *iwdev, enum i40iw_status_code i40iw_hw_manage_vf_pble_bp(struct i40iw_device *iwdev,
struct i40iw_manage_vf_pble_info *info, struct i40iw_manage_vf_pble_info *info,
bool wait); bool wait);
struct i40iw_dev_pestat; struct i40iw_sc_vsi;
void i40iw_hw_stats_start_timer(struct i40iw_sc_dev *); void i40iw_hw_stats_start_timer(struct i40iw_sc_vsi *vsi);
void i40iw_hw_stats_del_timer(struct i40iw_sc_dev *); void i40iw_hw_stats_stop_timer(struct i40iw_sc_vsi *vsi);
#define i40iw_mmiowb() mmiowb() #define i40iw_mmiowb() mmiowb()
void i40iw_wr32(struct i40iw_hw *hw, u32 reg, u32 value); void i40iw_wr32(struct i40iw_hw *hw, u32 reg, u32 value);
u32 i40iw_rd32(struct i40iw_hw *hw, u32 reg); u32 i40iw_rd32(struct i40iw_hw *hw, u32 reg);
......
...@@ -47,8 +47,6 @@ void i40iw_debug_buf(struct i40iw_sc_dev *dev, enum i40iw_debug_flag mask, ...@@ -47,8 +47,6 @@ void i40iw_debug_buf(struct i40iw_sc_dev *dev, enum i40iw_debug_flag mask,
enum i40iw_status_code i40iw_device_init(struct i40iw_sc_dev *dev, enum i40iw_status_code i40iw_device_init(struct i40iw_sc_dev *dev,
struct i40iw_device_init_info *info); struct i40iw_device_init_info *info);
void i40iw_device_init_pestat(struct i40iw_dev_pestat *devstat);
void i40iw_sc_cqp_post_sq(struct i40iw_sc_cqp *cqp); void i40iw_sc_cqp_post_sq(struct i40iw_sc_cqp *cqp);
u64 *i40iw_sc_cqp_get_next_send_wqe(struct i40iw_sc_cqp *cqp, u64 scratch); u64 *i40iw_sc_cqp_get_next_send_wqe(struct i40iw_sc_cqp *cqp, u64 scratch);
...@@ -64,9 +62,24 @@ enum i40iw_status_code i40iw_sc_init_iw_hmc(struct i40iw_sc_dev *dev, ...@@ -64,9 +62,24 @@ enum i40iw_status_code i40iw_sc_init_iw_hmc(struct i40iw_sc_dev *dev,
enum i40iw_status_code i40iw_pf_init_vfhmc(struct i40iw_sc_dev *dev, u8 vf_hmc_fn_id, enum i40iw_status_code i40iw_pf_init_vfhmc(struct i40iw_sc_dev *dev, u8 vf_hmc_fn_id,
u32 *vf_cnt_array); u32 *vf_cnt_array);
/* cqp misc functions */ /* stats functions */
void i40iw_change_l2params(struct i40iw_sc_dev *dev, struct i40iw_l2params *l2params); void i40iw_hw_stats_refresh_all(struct i40iw_vsi_pestat *stats);
void i40iw_qp_add_qos(struct i40iw_sc_dev *dev, struct i40iw_sc_qp *qp); void i40iw_hw_stats_read_all(struct i40iw_vsi_pestat *stats, struct i40iw_dev_hw_stats *stats_values);
void i40iw_hw_stats_read_32(struct i40iw_vsi_pestat *stats,
enum i40iw_hw_stats_index_32b index,
u64 *value);
void i40iw_hw_stats_read_64(struct i40iw_vsi_pestat *stats,
enum i40iw_hw_stats_index_64b index,
u64 *value);
void i40iw_hw_stats_init(struct i40iw_vsi_pestat *stats, u8 index, bool is_pf);
/* vsi misc functions */
enum i40iw_status_code i40iw_vsi_stats_init(struct i40iw_sc_vsi *vsi, struct i40iw_vsi_stats_info *info);
void i40iw_vsi_stats_free(struct i40iw_sc_vsi *vsi);
void i40iw_sc_vsi_init(struct i40iw_sc_vsi *vsi, struct i40iw_vsi_init_info *info);
void i40iw_change_l2params(struct i40iw_sc_vsi *vsi, struct i40iw_l2params *l2params);
void i40iw_qp_add_qos(struct i40iw_sc_qp *qp);
void i40iw_terminate_send_fin(struct i40iw_sc_qp *qp); void i40iw_terminate_send_fin(struct i40iw_sc_qp *qp);
......
This diff is collapsed.
...@@ -100,6 +100,7 @@ struct i40iw_puda_rsrc_info { ...@@ -100,6 +100,7 @@ struct i40iw_puda_rsrc_info {
enum puda_resource_type type; /* ILQ or IEQ */ enum puda_resource_type type; /* ILQ or IEQ */
u32 count; u32 count;
u16 pd_id; u16 pd_id;
bool ceq_valid;
u32 cq_id; u32 cq_id;
u32 qp_id; u32 qp_id;
u32 sq_size; u32 sq_size;
...@@ -107,8 +108,8 @@ struct i40iw_puda_rsrc_info { ...@@ -107,8 +108,8 @@ struct i40iw_puda_rsrc_info {
u16 buf_size; u16 buf_size;
u16 mss; u16 mss;
u32 tx_buf_cnt; /* total bufs allocated will be rq_size + tx_buf_cnt */ u32 tx_buf_cnt; /* total bufs allocated will be rq_size + tx_buf_cnt */
void (*receive)(struct i40iw_sc_dev *, struct i40iw_puda_buf *); void (*receive)(struct i40iw_sc_vsi *, struct i40iw_puda_buf *);
void (*xmit_complete)(struct i40iw_sc_dev *, void *); void (*xmit_complete)(struct i40iw_sc_vsi *, void *);
}; };
struct i40iw_puda_rsrc { struct i40iw_puda_rsrc {
...@@ -116,6 +117,7 @@ struct i40iw_puda_rsrc { ...@@ -116,6 +117,7 @@ struct i40iw_puda_rsrc {
struct i40iw_sc_qp qp; struct i40iw_sc_qp qp;
struct i40iw_sc_pd sc_pd; struct i40iw_sc_pd sc_pd;
struct i40iw_sc_dev *dev; struct i40iw_sc_dev *dev;
struct i40iw_sc_vsi *vsi;
struct i40iw_dma_mem cqmem; struct i40iw_dma_mem cqmem;
struct i40iw_dma_mem qpmem; struct i40iw_dma_mem qpmem;
struct i40iw_virt_mem ilq_mem; struct i40iw_virt_mem ilq_mem;
...@@ -123,6 +125,7 @@ struct i40iw_puda_rsrc { ...@@ -123,6 +125,7 @@ struct i40iw_puda_rsrc {
enum puda_resource_type type; enum puda_resource_type type;
u16 buf_size; /*buffer must be max datalen + tcpip hdr + mac */ u16 buf_size; /*buffer must be max datalen + tcpip hdr + mac */
u16 mss; u16 mss;
bool ceq_valid;
u32 cq_id; u32 cq_id;
u32 qp_id; u32 qp_id;
u32 sq_size; u32 sq_size;
...@@ -142,8 +145,8 @@ struct i40iw_puda_rsrc { ...@@ -142,8 +145,8 @@ struct i40iw_puda_rsrc {
u32 avail_buf_count; /* snapshot of currently available buffers */ u32 avail_buf_count; /* snapshot of currently available buffers */
spinlock_t bufpool_lock; spinlock_t bufpool_lock;
struct i40iw_puda_buf *alloclist; struct i40iw_puda_buf *alloclist;
void (*receive)(struct i40iw_sc_dev *, struct i40iw_puda_buf *); void (*receive)(struct i40iw_sc_vsi *, struct i40iw_puda_buf *);
void (*xmit_complete)(struct i40iw_sc_dev *, void *); void (*xmit_complete)(struct i40iw_sc_vsi *, void *);
/* puda stats */ /* puda stats */
u64 stats_buf_alloc_fail; u64 stats_buf_alloc_fail;
u64 stats_pkt_rcvd; u64 stats_pkt_rcvd;
...@@ -160,14 +163,13 @@ void i40iw_puda_send_buf(struct i40iw_puda_rsrc *rsrc, ...@@ -160,14 +163,13 @@ void i40iw_puda_send_buf(struct i40iw_puda_rsrc *rsrc,
struct i40iw_puda_buf *buf); struct i40iw_puda_buf *buf);
enum i40iw_status_code i40iw_puda_send(struct i40iw_sc_qp *qp, enum i40iw_status_code i40iw_puda_send(struct i40iw_sc_qp *qp,
struct i40iw_puda_send_info *info); struct i40iw_puda_send_info *info);
enum i40iw_status_code i40iw_puda_create_rsrc(struct i40iw_sc_dev *dev, enum i40iw_status_code i40iw_puda_create_rsrc(struct i40iw_sc_vsi *vsi,
struct i40iw_puda_rsrc_info *info); struct i40iw_puda_rsrc_info *info);
void i40iw_puda_dele_resources(struct i40iw_sc_dev *dev, void i40iw_puda_dele_resources(struct i40iw_sc_vsi *vsi,
enum puda_resource_type type, enum puda_resource_type type,
bool reset); bool reset);
enum i40iw_status_code i40iw_puda_poll_completion(struct i40iw_sc_dev *dev, enum i40iw_status_code i40iw_puda_poll_completion(struct i40iw_sc_dev *dev,
struct i40iw_sc_cq *cq, u32 *compl_err); struct i40iw_sc_cq *cq, u32 *compl_err);
void i40iw_ieq_cleanup_qp(struct i40iw_sc_dev *dev, struct i40iw_sc_qp *qp);
struct i40iw_sc_qp *i40iw_ieq_get_qp(struct i40iw_sc_dev *dev, struct i40iw_sc_qp *i40iw_ieq_get_qp(struct i40iw_sc_dev *dev,
struct i40iw_puda_buf *buf); struct i40iw_puda_buf *buf);
...@@ -180,4 +182,8 @@ void i40iw_ieq_mpa_crc_ae(struct i40iw_sc_dev *dev, struct i40iw_sc_qp *qp); ...@@ -180,4 +182,8 @@ void i40iw_ieq_mpa_crc_ae(struct i40iw_sc_dev *dev, struct i40iw_sc_qp *qp);
void i40iw_free_hash_desc(struct shash_desc *desc); void i40iw_free_hash_desc(struct shash_desc *desc);
void i40iw_ieq_update_tcpip_info(struct i40iw_puda_buf *buf, u16 length, void i40iw_ieq_update_tcpip_info(struct i40iw_puda_buf *buf, u16 length,
u32 seqnum); u32 seqnum);
enum i40iw_status_code i40iw_cqp_qp_create_cmd(struct i40iw_sc_dev *dev, struct i40iw_sc_qp *qp);
enum i40iw_status_code i40iw_cqp_cq_create_cmd(struct i40iw_sc_dev *dev, struct i40iw_sc_cq *cq);
void i40iw_cqp_qp_destroy_cmd(struct i40iw_sc_dev *dev, struct i40iw_sc_qp *qp);
void i40iw_cqp_cq_destroy_cmd(struct i40iw_sc_dev *dev, struct i40iw_sc_cq *cq);
#endif #endif
...@@ -61,7 +61,7 @@ struct i40iw_cq_shadow_area { ...@@ -61,7 +61,7 @@ struct i40iw_cq_shadow_area {
struct i40iw_sc_dev; struct i40iw_sc_dev;
struct i40iw_hmc_info; struct i40iw_hmc_info;
struct i40iw_dev_pestat; struct i40iw_vsi_pestat;
struct i40iw_cqp_ops; struct i40iw_cqp_ops;
struct i40iw_ccq_ops; struct i40iw_ccq_ops;
...@@ -191,7 +191,7 @@ enum i40iw_debug_flag { ...@@ -191,7 +191,7 @@ enum i40iw_debug_flag {
I40IW_DEBUG_ALL = 0xFFFFFFFF I40IW_DEBUG_ALL = 0xFFFFFFFF
}; };
enum i40iw_hw_stat_index_32b { enum i40iw_hw_stats_index_32b {
I40IW_HW_STAT_INDEX_IP4RXDISCARD = 0, I40IW_HW_STAT_INDEX_IP4RXDISCARD = 0,
I40IW_HW_STAT_INDEX_IP4RXTRUNC, I40IW_HW_STAT_INDEX_IP4RXTRUNC,
I40IW_HW_STAT_INDEX_IP4TXNOROUTE, I40IW_HW_STAT_INDEX_IP4TXNOROUTE,
...@@ -204,7 +204,7 @@ enum i40iw_hw_stat_index_32b { ...@@ -204,7 +204,7 @@ enum i40iw_hw_stat_index_32b {
I40IW_HW_STAT_INDEX_MAX_32 I40IW_HW_STAT_INDEX_MAX_32
}; };
enum i40iw_hw_stat_index_64b { enum i40iw_hw_stats_index_64b {
I40IW_HW_STAT_INDEX_IP4RXOCTS = 0, I40IW_HW_STAT_INDEX_IP4RXOCTS = 0,
I40IW_HW_STAT_INDEX_IP4RXPKTS, I40IW_HW_STAT_INDEX_IP4RXPKTS,
I40IW_HW_STAT_INDEX_IP4RXFRAGS, I40IW_HW_STAT_INDEX_IP4RXFRAGS,
...@@ -234,32 +234,23 @@ enum i40iw_hw_stat_index_64b { ...@@ -234,32 +234,23 @@ enum i40iw_hw_stat_index_64b {
I40IW_HW_STAT_INDEX_MAX_64 I40IW_HW_STAT_INDEX_MAX_64
}; };
struct i40iw_dev_hw_stat_offsets { struct i40iw_dev_hw_stats_offsets {
u32 stat_offset_32[I40IW_HW_STAT_INDEX_MAX_32]; u32 stats_offset_32[I40IW_HW_STAT_INDEX_MAX_32];
u32 stat_offset_64[I40IW_HW_STAT_INDEX_MAX_64]; u32 stats_offset_64[I40IW_HW_STAT_INDEX_MAX_64];
}; };
struct i40iw_dev_hw_stats { struct i40iw_dev_hw_stats {
u64 stat_value_32[I40IW_HW_STAT_INDEX_MAX_32]; u64 stats_value_32[I40IW_HW_STAT_INDEX_MAX_32];
u64 stat_value_64[I40IW_HW_STAT_INDEX_MAX_64]; u64 stats_value_64[I40IW_HW_STAT_INDEX_MAX_64];
}; };
struct i40iw_device_pestat_ops { struct i40iw_vsi_pestat {
void (*iw_hw_stat_init)(struct i40iw_dev_pestat *, u8, struct i40iw_hw *, bool);
void (*iw_hw_stat_read_32)(struct i40iw_dev_pestat *, enum i40iw_hw_stat_index_32b, u64 *);
void (*iw_hw_stat_read_64)(struct i40iw_dev_pestat *, enum i40iw_hw_stat_index_64b, u64 *);
void (*iw_hw_stat_read_all)(struct i40iw_dev_pestat *, struct i40iw_dev_hw_stats *);
void (*iw_hw_stat_refresh_all)(struct i40iw_dev_pestat *);
};
struct i40iw_dev_pestat {
struct i40iw_hw *hw; struct i40iw_hw *hw;
struct i40iw_device_pestat_ops ops;
struct i40iw_dev_hw_stats hw_stats; struct i40iw_dev_hw_stats hw_stats;
struct i40iw_dev_hw_stats last_read_hw_stats; struct i40iw_dev_hw_stats last_read_hw_stats;
struct i40iw_dev_hw_stat_offsets hw_stat_offsets; struct i40iw_dev_hw_stats_offsets hw_stats_offsets;
struct timer_list stats_timer; struct timer_list stats_timer;
spinlock_t stats_lock; /* rdma stats lock */ spinlock_t lock; /* rdma stats lock */
}; };
struct i40iw_hw { struct i40iw_hw {
...@@ -355,6 +346,7 @@ struct i40iw_sc_cq { ...@@ -355,6 +346,7 @@ struct i40iw_sc_cq {
u64 cq_pa; u64 cq_pa;
u64 shadow_area_pa; u64 shadow_area_pa;
struct i40iw_sc_dev *dev; struct i40iw_sc_dev *dev;
struct i40iw_sc_vsi *vsi;
void *pbl_list; void *pbl_list;
void *back_cq; void *back_cq;
u32 ceq_id; u32 ceq_id;
...@@ -378,6 +370,7 @@ struct i40iw_sc_qp { ...@@ -378,6 +370,7 @@ struct i40iw_sc_qp {
u64 shadow_area_pa; u64 shadow_area_pa;
u64 q2_pa; u64 q2_pa;
struct i40iw_sc_dev *dev; struct i40iw_sc_dev *dev;
struct i40iw_sc_vsi *vsi;
struct i40iw_sc_pd *pd; struct i40iw_sc_pd *pd;
u64 *hw_host_ctx; u64 *hw_host_ctx;
void *llp_stream_handle; void *llp_stream_handle;
...@@ -441,7 +434,7 @@ struct i40iw_qos { ...@@ -441,7 +434,7 @@ struct i40iw_qos {
struct i40iw_vfdev { struct i40iw_vfdev {
struct i40iw_sc_dev *pf_dev; struct i40iw_sc_dev *pf_dev;
u8 *hmc_info_mem; u8 *hmc_info_mem;
struct i40iw_dev_pestat dev_pestat; struct i40iw_vsi_pestat pestat;
struct i40iw_hmc_pble_info *pble_info; struct i40iw_hmc_pble_info *pble_info;
struct i40iw_hmc_info hmc_info; struct i40iw_hmc_info hmc_info;
struct i40iw_vchnl_vf_msg_buffer vf_msg_buffer; struct i40iw_vchnl_vf_msg_buffer vf_msg_buffer;
...@@ -455,11 +448,28 @@ struct i40iw_vfdev { ...@@ -455,11 +448,28 @@ struct i40iw_vfdev {
bool stats_initialized; bool stats_initialized;
}; };
#define I40IW_INVALID_FCN_ID 0xff
struct i40iw_sc_vsi {
struct i40iw_sc_dev *dev;
void *back_vsi; /* Owned by OS */
u32 ilq_count;
struct i40iw_virt_mem ilq_mem;
struct i40iw_puda_rsrc *ilq;
u32 ieq_count;
struct i40iw_virt_mem ieq_mem;
struct i40iw_puda_rsrc *ieq;
u16 mss;
u8 fcn_id;
bool stats_fcn_id_alloc;
struct i40iw_qos qos[I40IW_MAX_USER_PRIORITY];
struct i40iw_vsi_pestat *pestat;
};
struct i40iw_sc_dev { struct i40iw_sc_dev {
struct list_head cqp_cmd_head; /* head of the CQP command list */ struct list_head cqp_cmd_head; /* head of the CQP command list */
spinlock_t cqp_lock; /* cqp list sync */ spinlock_t cqp_lock; /* cqp list sync */
struct i40iw_dev_uk dev_uk; struct i40iw_dev_uk dev_uk;
struct i40iw_dev_pestat dev_pestat; bool fcn_id_array[I40IW_MAX_STATS_COUNT];
struct i40iw_dma_mem vf_fpm_query_buf[I40IW_MAX_PE_ENABLED_VF_COUNT]; struct i40iw_dma_mem vf_fpm_query_buf[I40IW_MAX_PE_ENABLED_VF_COUNT];
u64 fpm_query_buf_pa; u64 fpm_query_buf_pa;
u64 fpm_commit_buf_pa; u64 fpm_commit_buf_pa;
...@@ -486,18 +496,9 @@ struct i40iw_sc_dev { ...@@ -486,18 +496,9 @@ struct i40iw_sc_dev {
struct i40iw_cqp_misc_ops *cqp_misc_ops; struct i40iw_cqp_misc_ops *cqp_misc_ops;
struct i40iw_hmc_ops *hmc_ops; struct i40iw_hmc_ops *hmc_ops;
struct i40iw_vchnl_if vchnl_if; struct i40iw_vchnl_if vchnl_if;
u32 ilq_count;
struct i40iw_virt_mem ilq_mem;
struct i40iw_puda_rsrc *ilq;
u32 ieq_count;
struct i40iw_virt_mem ieq_mem;
struct i40iw_puda_rsrc *ieq;
const struct i40iw_vf_cqp_ops *iw_vf_cqp_ops; const struct i40iw_vf_cqp_ops *iw_vf_cqp_ops;
struct i40iw_hmc_fpm_misc hmc_fpm_misc; struct i40iw_hmc_fpm_misc hmc_fpm_misc;
struct i40iw_qos qos[I40IW_MAX_USER_PRIORITY];
u16 mss;
u32 debug_mask; u32 debug_mask;
u16 exception_lan_queue; u16 exception_lan_queue;
u8 hmc_fn_id; u8 hmc_fn_id;
...@@ -571,6 +572,19 @@ struct i40iw_l2params { ...@@ -571,6 +572,19 @@ struct i40iw_l2params {
u16 mss; u16 mss;
}; };
struct i40iw_vsi_init_info {
struct i40iw_sc_dev *dev;
void *back_vsi;
struct i40iw_l2params *params;
};
struct i40iw_vsi_stats_info {
struct i40iw_vsi_pestat *pestat;
u8 fcn_id;
bool alloc_fcn_id;
bool stats_initialize;
};
struct i40iw_device_init_info { struct i40iw_device_init_info {
u64 fpm_query_buf_pa; u64 fpm_query_buf_pa;
u64 fpm_commit_buf_pa; u64 fpm_commit_buf_pa;
...@@ -579,7 +593,6 @@ struct i40iw_device_init_info { ...@@ -579,7 +593,6 @@ struct i40iw_device_init_info {
struct i40iw_hw *hw; struct i40iw_hw *hw;
void __iomem *bar0; void __iomem *bar0;
enum i40iw_status_code (*vchnl_send)(struct i40iw_sc_dev *, u32, u8 *, u16); enum i40iw_status_code (*vchnl_send)(struct i40iw_sc_dev *, u32, u8 *, u16);
struct i40iw_l2params l2params;
u16 exception_lan_queue; u16 exception_lan_queue;
u8 hmc_fn_id; u8 hmc_fn_id;
bool is_pf; bool is_pf;
...@@ -831,6 +844,7 @@ struct i40iw_register_shared_stag { ...@@ -831,6 +844,7 @@ struct i40iw_register_shared_stag {
struct i40iw_qp_init_info { struct i40iw_qp_init_info {
struct i40iw_qp_uk_init_info qp_uk_init_info; struct i40iw_qp_uk_init_info qp_uk_init_info;
struct i40iw_sc_pd *pd; struct i40iw_sc_pd *pd;
struct i40iw_sc_vsi *vsi;
u64 *host_ctx; u64 *host_ctx;
u8 *q2; u8 *q2;
u64 sq_pa; u64 sq_pa;
...@@ -897,6 +911,7 @@ enum i40iw_quad_hash_manage_type { ...@@ -897,6 +911,7 @@ enum i40iw_quad_hash_manage_type {
}; };
struct i40iw_qhash_table_info { struct i40iw_qhash_table_info {
struct i40iw_sc_vsi *vsi;
enum i40iw_quad_hash_manage_type manage; enum i40iw_quad_hash_manage_type manage;
enum i40iw_quad_entry_type entry_type; enum i40iw_quad_entry_type entry_type;
bool vlan_valid; bool vlan_valid;
......
...@@ -761,7 +761,7 @@ void i40iw_qp_mss_modify(struct i40iw_sc_dev *dev, struct i40iw_sc_qp *qp) ...@@ -761,7 +761,7 @@ void i40iw_qp_mss_modify(struct i40iw_sc_dev *dev, struct i40iw_sc_qp *qp)
memset(&info, 0, sizeof(info)); memset(&info, 0, sizeof(info));
info.mss_change = true; info.mss_change = true;
info.new_mss = dev->mss; info.new_mss = qp->vsi->mss;
i40iw_hw_modify_qp(iwdev, iwqp, &info, false); i40iw_hw_modify_qp(iwdev, iwqp, &info, false);
} }
...@@ -1067,6 +1067,116 @@ enum i40iw_status_code i40iw_vf_wait_vchnl_resp(struct i40iw_sc_dev *dev) ...@@ -1067,6 +1067,116 @@ enum i40iw_status_code i40iw_vf_wait_vchnl_resp(struct i40iw_sc_dev *dev)
return 0; return 0;
} }
/**
* i40iw_cqp_cq_create_cmd - create a cq for the cqp
* @dev: device pointer
* @cq: pointer to created cq
*/
enum i40iw_status_code i40iw_cqp_cq_create_cmd(struct i40iw_sc_dev *dev,
struct i40iw_sc_cq *cq)
{
struct i40iw_device *iwdev = (struct i40iw_device *)dev->back_dev;
struct i40iw_cqp *iwcqp = &iwdev->cqp;
struct i40iw_cqp_request *cqp_request;
struct cqp_commands_info *cqp_info;
enum i40iw_status_code status;
cqp_request = i40iw_get_cqp_request(iwcqp, true);
if (!cqp_request)
return I40IW_ERR_NO_MEMORY;
cqp_info = &cqp_request->info;
cqp_info->cqp_cmd = OP_CQ_CREATE;
cqp_info->post_sq = 1;
cqp_info->in.u.cq_create.cq = cq;
cqp_info->in.u.cq_create.scratch = (uintptr_t)cqp_request;
status = i40iw_handle_cqp_op(iwdev, cqp_request);
if (status)
i40iw_pr_err("CQP-OP Create QP fail");
return status;
}
/**
* i40iw_cqp_qp_create_cmd - create a qp for the cqp
* @dev: device pointer
* @qp: pointer to created qp
*/
enum i40iw_status_code i40iw_cqp_qp_create_cmd(struct i40iw_sc_dev *dev,
struct i40iw_sc_qp *qp)
{
struct i40iw_device *iwdev = (struct i40iw_device *)dev->back_dev;
struct i40iw_cqp *iwcqp = &iwdev->cqp;
struct i40iw_cqp_request *cqp_request;
struct cqp_commands_info *cqp_info;
struct i40iw_create_qp_info *qp_info;
enum i40iw_status_code status;
cqp_request = i40iw_get_cqp_request(iwcqp, true);
if (!cqp_request)
return I40IW_ERR_NO_MEMORY;
cqp_info = &cqp_request->info;
qp_info = &cqp_request->info.in.u.qp_create.info;
memset(qp_info, 0, sizeof(*qp_info));
qp_info->cq_num_valid = true;
qp_info->next_iwarp_state = I40IW_QP_STATE_RTS;
cqp_info->cqp_cmd = OP_QP_CREATE;
cqp_info->post_sq = 1;
cqp_info->in.u.qp_create.qp = qp;
cqp_info->in.u.qp_create.scratch = (uintptr_t)cqp_request;
status = i40iw_handle_cqp_op(iwdev, cqp_request);
if (status)
i40iw_pr_err("CQP-OP QP create fail");
return status;
}
/**
* i40iw_cqp_cq_destroy_cmd - destroy the cqp cq
* @dev: device pointer
* @cq: pointer to cq
*/
void i40iw_cqp_cq_destroy_cmd(struct i40iw_sc_dev *dev, struct i40iw_sc_cq *cq)
{
struct i40iw_device *iwdev = (struct i40iw_device *)dev->back_dev;
i40iw_cq_wq_destroy(iwdev, cq);
}
/**
* i40iw_cqp_qp_destroy_cmd - destroy the cqp
* @dev: device pointer
* @qp: pointer to qp
*/
void i40iw_cqp_qp_destroy_cmd(struct i40iw_sc_dev *dev, struct i40iw_sc_qp *qp)
{
struct i40iw_device *iwdev = (struct i40iw_device *)dev->back_dev;
struct i40iw_cqp *iwcqp = &iwdev->cqp;
struct i40iw_cqp_request *cqp_request;
struct cqp_commands_info *cqp_info;
enum i40iw_status_code status;
cqp_request = i40iw_get_cqp_request(iwcqp, true);
if (!cqp_request)
return;
cqp_info = &cqp_request->info;
memset(cqp_info, 0, sizeof(*cqp_info));
cqp_info->cqp_cmd = OP_QP_DESTROY;
cqp_info->post_sq = 1;
cqp_info->in.u.qp_destroy.qp = qp;
cqp_info->in.u.qp_destroy.scratch = (uintptr_t)cqp_request;
cqp_info->in.u.qp_destroy.remove_hash_idx = true;
status = i40iw_handle_cqp_op(iwdev, cqp_request);
if (status)
i40iw_pr_err("CQP QP_DESTROY fail");
}
/** /**
* i40iw_ieq_mpa_crc_ae - generate AE for crc error * i40iw_ieq_mpa_crc_ae - generate AE for crc error
* @dev: hardware control device structure * @dev: hardware control device structure
...@@ -1281,27 +1391,29 @@ enum i40iw_status_code i40iw_puda_get_tcpip_info(struct i40iw_puda_completion_in ...@@ -1281,27 +1391,29 @@ enum i40iw_status_code i40iw_puda_get_tcpip_info(struct i40iw_puda_completion_in
/** /**
* i40iw_hw_stats_timeout - Stats timer-handler which updates all HW stats * i40iw_hw_stats_timeout - Stats timer-handler which updates all HW stats
* @dev: hardware control device structure * @vsi: pointer to the vsi structure
*/ */
static void i40iw_hw_stats_timeout(unsigned long dev) static void i40iw_hw_stats_timeout(unsigned long vsi)
{ {
struct i40iw_sc_dev *pf_dev = (struct i40iw_sc_dev *)dev; struct i40iw_sc_vsi *sc_vsi = (struct i40iw_sc_vsi *)vsi;
struct i40iw_dev_pestat *pf_devstat = &pf_dev->dev_pestat; struct i40iw_sc_dev *pf_dev = sc_vsi->dev;
struct i40iw_dev_pestat *vf_devstat = NULL; struct i40iw_vsi_pestat *pf_devstat = sc_vsi->pestat;
struct i40iw_vsi_pestat *vf_devstat = NULL;
u16 iw_vf_idx; u16 iw_vf_idx;
unsigned long flags; unsigned long flags;
/*PF*/ /*PF*/
pf_devstat->ops.iw_hw_stat_read_all(pf_devstat, &pf_devstat->hw_stats); i40iw_hw_stats_read_all(pf_devstat, &pf_devstat->hw_stats);
for (iw_vf_idx = 0; iw_vf_idx < I40IW_MAX_PE_ENABLED_VF_COUNT; iw_vf_idx++) { for (iw_vf_idx = 0; iw_vf_idx < I40IW_MAX_PE_ENABLED_VF_COUNT; iw_vf_idx++) {
spin_lock_irqsave(&pf_devstat->stats_lock, flags); spin_lock_irqsave(&pf_devstat->lock, flags);
if (pf_dev->vf_dev[iw_vf_idx]) { if (pf_dev->vf_dev[iw_vf_idx]) {
if (pf_dev->vf_dev[iw_vf_idx]->stats_initialized) { if (pf_dev->vf_dev[iw_vf_idx]->stats_initialized) {
vf_devstat = &pf_dev->vf_dev[iw_vf_idx]->dev_pestat; vf_devstat = &pf_dev->vf_dev[iw_vf_idx]->pestat;
vf_devstat->ops.iw_hw_stat_read_all(vf_devstat, &vf_devstat->hw_stats); i40iw_hw_stats_read_all(vf_devstat, &vf_devstat->hw_stats);
} }
} }
spin_unlock_irqrestore(&pf_devstat->stats_lock, flags); spin_unlock_irqrestore(&pf_devstat->lock, flags);
} }
mod_timer(&pf_devstat->stats_timer, mod_timer(&pf_devstat->stats_timer,
...@@ -1310,26 +1422,26 @@ static void i40iw_hw_stats_timeout(unsigned long dev) ...@@ -1310,26 +1422,26 @@ static void i40iw_hw_stats_timeout(unsigned long dev)
/** /**
* i40iw_hw_stats_start_timer - Start periodic stats timer * i40iw_hw_stats_start_timer - Start periodic stats timer
* @dev: hardware control device structure * @vsi: pointer to the vsi structure
*/ */
void i40iw_hw_stats_start_timer(struct i40iw_sc_dev *dev) void i40iw_hw_stats_start_timer(struct i40iw_sc_vsi *vsi)
{ {
struct i40iw_dev_pestat *devstat = &dev->dev_pestat; struct i40iw_vsi_pestat *devstat = vsi->pestat;
init_timer(&devstat->stats_timer); init_timer(&devstat->stats_timer);
devstat->stats_timer.function = i40iw_hw_stats_timeout; devstat->stats_timer.function = i40iw_hw_stats_timeout;
devstat->stats_timer.data = (unsigned long)dev; devstat->stats_timer.data = (unsigned long)vsi;
mod_timer(&devstat->stats_timer, mod_timer(&devstat->stats_timer,
jiffies + msecs_to_jiffies(STATS_TIMER_DELAY)); jiffies + msecs_to_jiffies(STATS_TIMER_DELAY));
} }
/** /**
* i40iw_hw_stats_del_timer - Delete periodic stats timer * i40iw_hw_stats_stop_timer - Delete periodic stats timer
* @dev: hardware control device structure * @vsi: pointer to the vsi structure
*/ */
void i40iw_hw_stats_del_timer(struct i40iw_sc_dev *dev) void i40iw_hw_stats_stop_timer(struct i40iw_sc_vsi *vsi)
{ {
struct i40iw_dev_pestat *devstat = &dev->dev_pestat; struct i40iw_vsi_pestat *devstat = vsi->pestat;
del_timer_sync(&devstat->stats_timer); del_timer_sync(&devstat->stats_timer);
} }
...@@ -623,6 +623,7 @@ static struct ib_qp *i40iw_create_qp(struct ib_pd *ibpd, ...@@ -623,6 +623,7 @@ static struct ib_qp *i40iw_create_qp(struct ib_pd *ibpd,
sq_size = init_attr->cap.max_send_wr; sq_size = init_attr->cap.max_send_wr;
rq_size = init_attr->cap.max_recv_wr; rq_size = init_attr->cap.max_recv_wr;
init_info.vsi = &iwdev->vsi;
init_info.qp_uk_init_info.sq_size = sq_size; init_info.qp_uk_init_info.sq_size = sq_size;
init_info.qp_uk_init_info.rq_size = rq_size; init_info.qp_uk_init_info.rq_size = rq_size;
init_info.qp_uk_init_info.max_sq_frag_cnt = init_attr->cap.max_send_sge; init_info.qp_uk_init_info.max_sq_frag_cnt = init_attr->cap.max_send_sge;
...@@ -1052,11 +1053,11 @@ static void cq_free_resources(struct i40iw_device *iwdev, struct i40iw_cq *iwcq) ...@@ -1052,11 +1053,11 @@ static void cq_free_resources(struct i40iw_device *iwdev, struct i40iw_cq *iwcq)
} }
/** /**
* cq_wq_destroy - send cq destroy cqp * i40iw_cq_wq_destroy - send cq destroy cqp
* @iwdev: iwarp device * @iwdev: iwarp device
* @cq: hardware control cq * @cq: hardware control cq
*/ */
static void cq_wq_destroy(struct i40iw_device *iwdev, struct i40iw_sc_cq *cq) void i40iw_cq_wq_destroy(struct i40iw_device *iwdev, struct i40iw_sc_cq *cq)
{ {
enum i40iw_status_code status; enum i40iw_status_code status;
struct i40iw_cqp_request *cqp_request; struct i40iw_cqp_request *cqp_request;
...@@ -1095,7 +1096,7 @@ static int i40iw_destroy_cq(struct ib_cq *ib_cq) ...@@ -1095,7 +1096,7 @@ static int i40iw_destroy_cq(struct ib_cq *ib_cq)
iwcq = to_iwcq(ib_cq); iwcq = to_iwcq(ib_cq);
iwdev = to_iwdev(ib_cq->device); iwdev = to_iwdev(ib_cq->device);
cq = &iwcq->sc_cq; cq = &iwcq->sc_cq;
cq_wq_destroy(iwdev, cq); i40iw_cq_wq_destroy(iwdev, cq);
cq_free_resources(iwdev, iwcq); cq_free_resources(iwdev, iwcq);
kfree(iwcq); kfree(iwcq);
i40iw_rem_devusecount(iwdev); i40iw_rem_devusecount(iwdev);
...@@ -1253,7 +1254,7 @@ static struct ib_cq *i40iw_create_cq(struct ib_device *ibdev, ...@@ -1253,7 +1254,7 @@ static struct ib_cq *i40iw_create_cq(struct ib_device *ibdev,
return (struct ib_cq *)iwcq; return (struct ib_cq *)iwcq;
cq_destroy: cq_destroy:
cq_wq_destroy(iwdev, cq); i40iw_cq_wq_destroy(iwdev, cq);
cq_free_resources: cq_free_resources:
cq_free_resources(iwdev, iwcq); cq_free_resources(iwdev, iwcq);
error: error:
...@@ -2632,15 +2633,11 @@ static int i40iw_get_hw_stats(struct ib_device *ibdev, ...@@ -2632,15 +2633,11 @@ static int i40iw_get_hw_stats(struct ib_device *ibdev,
{ {
struct i40iw_device *iwdev = to_iwdev(ibdev); struct i40iw_device *iwdev = to_iwdev(ibdev);
struct i40iw_sc_dev *dev = &iwdev->sc_dev; struct i40iw_sc_dev *dev = &iwdev->sc_dev;
struct i40iw_dev_pestat *devstat = &dev->dev_pestat; struct i40iw_vsi_pestat *devstat = iwdev->vsi.pestat;
struct i40iw_dev_hw_stats *hw_stats = &devstat->hw_stats; struct i40iw_dev_hw_stats *hw_stats = &devstat->hw_stats;
unsigned long flags;
if (dev->is_pf) { if (dev->is_pf) {
spin_lock_irqsave(&devstat->stats_lock, flags); i40iw_hw_stats_read_all(devstat, &devstat->hw_stats);
devstat->ops.iw_hw_stat_read_all(devstat,
&devstat->hw_stats);
spin_unlock_irqrestore(&devstat->stats_lock, flags);
} else { } else {
if (i40iw_vchnl_vf_get_pe_stats(dev, &devstat->hw_stats)) if (i40iw_vchnl_vf_get_pe_stats(dev, &devstat->hw_stats))
return -ENOSYS; return -ENOSYS;
......
...@@ -402,6 +402,19 @@ static void pf_del_hmc_obj_callback(void *work_vf_dev) ...@@ -402,6 +402,19 @@ static void pf_del_hmc_obj_callback(void *work_vf_dev)
vchnl_pf_send_error_resp(vf_dev->pf_dev, vf_dev->vf_id, vchnl_msg, (u16)ret_code); vchnl_pf_send_error_resp(vf_dev->pf_dev, vf_dev->vf_id, vchnl_msg, (u16)ret_code);
} }
/**
* i40iw_vf_init_pestat - Initialize stats for VF
* @devL pointer to the VF Device
* @stats: Statistics structure pointer
* @index: Stats index
*/
static void i40iw_vf_init_pestat(struct i40iw_sc_dev *dev, struct i40iw_vsi_pestat *stats, u16 index)
{
stats->hw = dev->hw;
i40iw_hw_stats_init(stats, (u8)index, false);
spin_lock_init(&stats->lock);
}
/** /**
* i40iw_vchnl_recv_pf - Receive PF virtual channel messages * i40iw_vchnl_recv_pf - Receive PF virtual channel messages
* @dev: IWARP device pointer * @dev: IWARP device pointer
...@@ -421,9 +434,8 @@ enum i40iw_status_code i40iw_vchnl_recv_pf(struct i40iw_sc_dev *dev, ...@@ -421,9 +434,8 @@ enum i40iw_status_code i40iw_vchnl_recv_pf(struct i40iw_sc_dev *dev,
u16 first_avail_iw_vf = I40IW_MAX_PE_ENABLED_VF_COUNT; u16 first_avail_iw_vf = I40IW_MAX_PE_ENABLED_VF_COUNT;
struct i40iw_virt_mem vf_dev_mem; struct i40iw_virt_mem vf_dev_mem;
struct i40iw_virtchnl_work_info work_info; struct i40iw_virtchnl_work_info work_info;
struct i40iw_dev_pestat *devstat; struct i40iw_vsi_pestat *stats;
enum i40iw_status_code ret_code; enum i40iw_status_code ret_code;
unsigned long flags;
if (!dev || !msg || !len) if (!dev || !msg || !len)
return I40IW_ERR_PARAM; return I40IW_ERR_PARAM;
...@@ -496,10 +508,7 @@ enum i40iw_status_code i40iw_vchnl_recv_pf(struct i40iw_sc_dev *dev, ...@@ -496,10 +508,7 @@ enum i40iw_status_code i40iw_vchnl_recv_pf(struct i40iw_sc_dev *dev,
i40iw_debug(dev, I40IW_DEBUG_VIRT, i40iw_debug(dev, I40IW_DEBUG_VIRT,
"VF%u error CQP HMC Function operation.\n", "VF%u error CQP HMC Function operation.\n",
vf_id); vf_id);
i40iw_device_init_pestat(&vf_dev->dev_pestat); i40iw_vf_init_pestat(dev, &vf_dev->pestat, vf_dev->pmf_index);
vf_dev->dev_pestat.ops.iw_hw_stat_init(&vf_dev->dev_pestat,
(u8)vf_dev->pmf_index,
dev->hw, false);
vf_dev->stats_initialized = true; vf_dev->stats_initialized = true;
} else { } else {
if (vf_dev) { if (vf_dev) {
...@@ -530,12 +539,10 @@ enum i40iw_status_code i40iw_vchnl_recv_pf(struct i40iw_sc_dev *dev, ...@@ -530,12 +539,10 @@ enum i40iw_status_code i40iw_vchnl_recv_pf(struct i40iw_sc_dev *dev,
case I40IW_VCHNL_OP_GET_STATS: case I40IW_VCHNL_OP_GET_STATS:
if (!vf_dev) if (!vf_dev)
return I40IW_ERR_BAD_PTR; return I40IW_ERR_BAD_PTR;
devstat = &vf_dev->dev_pestat; stats = &vf_dev->pestat;
spin_lock_irqsave(&dev->dev_pestat.stats_lock, flags); i40iw_hw_stats_read_all(stats, &stats->hw_stats);
devstat->ops.iw_hw_stat_read_all(devstat, &devstat->hw_stats);
spin_unlock_irqrestore(&dev->dev_pestat.stats_lock, flags);
vf_dev->msg_count--; vf_dev->msg_count--;
vchnl_pf_send_get_pe_stats_resp(dev, vf_id, vchnl_msg, &devstat->hw_stats); vchnl_pf_send_get_pe_stats_resp(dev, vf_id, vchnl_msg, &stats->hw_stats);
break; break;
default: default:
i40iw_debug(dev, I40IW_DEBUG_VIRT, i40iw_debug(dev, I40IW_DEBUG_VIRT,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment