]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
qed: Encapsulate interrupt counters in struct
authorMintz, Yuval <Yuval.Mintz@cavium.com>
Thu, 1 Jun 2017 12:29:06 +0000 (15:29 +0300)
committerChuck Anderson <chuck.anderson@oracle.com>
Tue, 19 Sep 2017 05:32:22 +0000 (22:32 -0700)
Orabug: 26783820

We already have an API struct that contains interrupt-related
numbers. Use it to encapsulate all information relating to the
status of SBs as (used|free).

Signed-off-by: Yuval Mintz <Yuval.Mintz@cavium.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
[ Upstream commit 726fdbe9fa7ebccda1579716f68f8bae6fa9c87a ]
Signed-off-by: Somasundaram Krishnasamy <somasundaram.krishnasamy@oracle.com>
drivers/net/ethernet/qlogic/qed/qed_dev.c
drivers/net/ethernet/qlogic/qed/qed_int.c
drivers/net/ethernet/qlogic/qed/qed_int.h
drivers/net/ethernet/qlogic/qed/qed_main.c
drivers/net/ethernet/qlogic/qed/qed_sriov.c
include/linux/qed/qed_if.h

index 32e7cde422f8aa6035ab0a1059d444b7386617e7..8315fd23919da99ef6b1837e37a268ca975ac18b 100644 (file)
@@ -2036,7 +2036,7 @@ static void qed_hw_set_feat(struct qed_hwfn *p_hwfn)
                qed_int_get_num_sbs(p_hwfn, &sb_cnt_info);
                feat_num[QED_VF_L2_QUE] = min_t(u32,
                                                RESC_NUM(p_hwfn, QED_L2_QUEUE),
-                                               sb_cnt_info.sb_iov_cnt);
+                                               sb_cnt_info.iov_cnt);
                feat_num[QED_PF_L2_QUE] = min_t(u32,
                                                RESC_NUM(p_hwfn, QED_SB) -
                                                non_l2_sbs,
@@ -2230,7 +2230,7 @@ int qed_hw_get_dflt_resc(struct qed_hwfn *p_hwfn,
        case QED_SB:
                memset(&sb_cnt_info, 0, sizeof(sb_cnt_info));
                qed_int_get_num_sbs(p_hwfn, &sb_cnt_info);
-               *p_resc_num = sb_cnt_info.sb_cnt;
+               *p_resc_num = sb_cnt_info.cnt;
                break;
        default:
                return -EINVAL;
index 1635c3b7ce765b0141ea87e5d3b5563dd9931473..6b6ed88b593fab7aef8c0fa7f01c008fa8416d06 100644 (file)
@@ -1769,7 +1769,7 @@ void qed_int_igu_init_pure_rt(struct qed_hwfn *p_hwfn,
                              bool b_set, bool b_slowpath)
 {
        u32 igu_base_sb = p_hwfn->hw_info.p_igu_info->igu_base_sb;
-       u32 igu_sb_cnt = p_hwfn->hw_info.p_igu_info->igu_sb_cnt;
+       u32 igu_sb_cnt = p_hwfn->hw_info.p_igu_info->usage.cnt;
        u32 igu_sb_id = 0, val = 0;
 
        val = qed_rd(p_hwfn, p_ptt, IGU_REG_BLOCK_CONFIGURATION);
@@ -1827,7 +1827,6 @@ int qed_int_igu_read_cam(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt)
 
        /* Initialize base sb / sb cnt for PFs and VFs */
        p_igu_info->igu_base_sb = 0xffff;
-       p_igu_info->igu_sb_cnt = 0;
        p_igu_info->igu_base_sb_iov = 0xffff;
 
        /* Distinguish between existent and non-existent default SB */
@@ -1856,7 +1855,7 @@ int qed_int_igu_read_cam(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt)
                        if (p_igu_info->igu_dsb_id != QED_SB_INVALID_IDX) {
                                if (p_igu_info->igu_base_sb == 0xffff)
                                        p_igu_info->igu_base_sb = igu_sb_id;
-                               p_igu_info->igu_sb_cnt++;
+                               p_igu_info->usage.cnt++;
                        }
                } else if (!(p_block->is_pf) &&
                           (p_block->function_id >= min_vf) &&
@@ -1867,7 +1866,7 @@ int qed_int_igu_read_cam(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt)
 
                        if (p_igu_info->igu_base_sb_iov == 0xffff)
                                p_igu_info->igu_base_sb_iov = igu_sb_id;
-                       p_igu_info->free_blks++;
+                       p_igu_info->usage.iov_cnt++;
                }
 
                /* Mark the First entry belonging to the PF or its VFs
@@ -1900,12 +1899,13 @@ int qed_int_igu_read_cam(struct qed_hwfn *p_hwfn, struct qed_ptt *p_ptt)
        }
 
        /* All non default SB are considered free at this point */
-       p_igu_info->igu_sb_cnt_iov = p_igu_info->free_blks;
+       p_igu_info->usage.free_cnt = p_igu_info->usage.cnt;
+       p_igu_info->usage.free_cnt_iov = p_igu_info->usage.iov_cnt;
 
        DP_VERBOSE(p_hwfn, NETIF_MSG_INTR,
                   "igu_dsb_id=0x%x, num Free SBs - PF: %04x VF: %04x\n",
                   p_igu_info->igu_dsb_id,
-                  p_igu_info->igu_sb_cnt, p_igu_info->igu_sb_cnt_iov);
+                  p_igu_info->usage.cnt, p_igu_info->usage.iov_cnt);
 
        return 0;
 }
@@ -2003,9 +2003,7 @@ void qed_int_get_num_sbs(struct qed_hwfn  *p_hwfn,
        if (!info || !p_sb_cnt_info)
                return;
 
-       p_sb_cnt_info->sb_cnt           = info->igu_sb_cnt;
-       p_sb_cnt_info->sb_iov_cnt       = info->igu_sb_cnt_iov;
-       p_sb_cnt_info->sb_free_blk      = info->free_blks;
+       memcpy(p_sb_cnt_info, &info->usage, sizeof(*p_sb_cnt_info));
 }
 
 u16 qed_int_queue_id_from_sb_id(struct qed_hwfn *p_hwfn, u16 sb_id)
@@ -2014,10 +2012,10 @@ u16 qed_int_queue_id_from_sb_id(struct qed_hwfn *p_hwfn, u16 sb_id)
 
        /* Determine origin of SB id */
        if ((sb_id >= p_info->igu_base_sb) &&
-           (sb_id < p_info->igu_base_sb + p_info->igu_sb_cnt)) {
+           (sb_id < p_info->igu_base_sb + p_info->usage.cnt)) {
                return sb_id - p_info->igu_base_sb;
        } else if ((sb_id >= p_info->igu_base_sb_iov) &&
-                  (sb_id < p_info->igu_base_sb_iov + p_info->igu_sb_cnt_iov)) {
+                  (sb_id < p_info->igu_base_sb_iov + p_info->usage.iov_cnt)) {
                /* We want the first VF queue to be adjacent to the
                 * last PF queue. Since L2 queues can be partial to
                 * SBs, we'll use the feature instead.
index 60aaf9f9bb788e3c02e19d4cde355a33e598d4da..5a0e8f02c969eec44a1f7c12b9846e849884cd0c 100644 (file)
@@ -216,11 +216,11 @@ struct qed_igu_block {
 struct qed_igu_info {
        struct qed_igu_block entry[MAX_TOT_SB_PER_PATH];
        u16 igu_dsb_id;
-       u16                     igu_base_sb;
-       u16                     igu_base_sb_iov;
-       u16                     igu_sb_cnt;
-       u16                     igu_sb_cnt_iov;
-       u16                     free_blks;
+
+       u16 igu_base_sb;
+       u16 igu_base_sb_iov;
+       struct qed_sb_cnt_info usage;
+
 };
 
 /* TODO Names of function may change... */
index cba02a76bbc75e882fded0c24f6c8696a9018aab..4a5e954d7b3785283791adfb63be242009bf70b6 100644 (file)
@@ -762,7 +762,7 @@ static int qed_slowpath_setup_int(struct qed_dev *cdev,
        for_each_hwfn(cdev, i) {
                memset(&sb_cnt_info, 0, sizeof(sb_cnt_info));
                qed_int_get_num_sbs(&cdev->hwfns[i], &sb_cnt_info);
-               cdev->int_params.in.num_vectors += sb_cnt_info.sb_cnt;
+               cdev->int_params.in.num_vectors += sb_cnt_info.cnt;
                cdev->int_params.in.num_vectors++; /* slowpath */
        }
 
index cdc091c67cdd16f5e084356a0282e3298b2e62c6..578c08099c7423e3cdd214bc911b61fe1aeed0e2 100644 (file)
@@ -873,9 +873,9 @@ static u8 qed_iov_alloc_vf_igu_sbs(struct qed_hwfn *p_hwfn,
 
        igu_blocks = p_hwfn->hw_info.p_igu_info->entry;
 
-       if (num_rx_queues > p_hwfn->hw_info.p_igu_info->free_blks)
-               num_rx_queues = p_hwfn->hw_info.p_igu_info->free_blks;
-       p_hwfn->hw_info.p_igu_info->free_blks -= num_rx_queues;
+       if (num_rx_queues > p_hwfn->hw_info.p_igu_info->usage.free_cnt_iov)
+               num_rx_queues = p_hwfn->hw_info.p_igu_info->usage.free_cnt_iov;
+       p_hwfn->hw_info.p_igu_info->usage.free_cnt_iov -= num_rx_queues;
 
        SET_FIELD(val, IGU_MAPPING_LINE_FUNCTION_NUMBER, vf->abs_vf_id);
        SET_FIELD(val, IGU_MAPPING_LINE_VALID, 1);
@@ -931,8 +931,7 @@ static void qed_iov_free_vf_igu_sbs(struct qed_hwfn *p_hwfn,
                qed_wr(p_hwfn, p_ptt, addr, val);
 
                p_info->entry[igu_id].status |= QED_IGU_STATUS_FREE;
-
-               p_hwfn->hw_info.p_igu_info->free_blks++;
+               p_hwfn->hw_info.p_igu_info->usage.free_cnt_iov++;
        }
 
        vf->num_sbs = 0;
index 1aa75a7c27c89e827ef0d3b98f56b89f6a52a461..ed7947f63af6535f11c552f7b06c93a7d8281164 100644 (file)
@@ -887,9 +887,15 @@ struct qed_eth_stats {
 #define TX_PI(tc)       (RX_PI + 1 + tc)
 
 struct qed_sb_cnt_info {
-       int     sb_cnt;
-       int     sb_iov_cnt;
-       int     sb_free_blk;
+       /* Original, current, and free SBs for PF */
+       int orig;
+       int cnt;
+       int free_cnt;
+
+       /* Original, current and free SBS for child VFs */
+       int iov_orig;
+       int iov_cnt;
+       int free_cnt_iov;
 };
 
 static inline u16 qed_sb_update_sb_idx(struct qed_sb_info *sb_info)