Merge branch 'qed-fixes'
authorDavid S. Miller <davem@davemloft.net>
Sun, 31 Jul 2016 03:34:13 +0000 (20:34 -0700)
committerDavid S. Miller <davem@davemloft.net>
Sun, 31 Jul 2016 03:34:13 +0000 (20:34 -0700)
Yuval Mintz says:

====================
qed*: Small fixes series

This contains several small [and straight-forward] fixes to qed*
drivers.

Please consider applying this to `net'.
====================

Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/qlogic/qed/qed_dev.c
drivers/net/ethernet/qlogic/qed/qed_l2.c
drivers/net/ethernet/qlogic/qed/qed_sriov.c
drivers/net/ethernet/qlogic/qed/qed_vf.c
drivers/net/ethernet/qlogic/qede/qede_main.c

index b26fe26..1a53c04 100644 (file)
@@ -2539,7 +2539,7 @@ int qed_configure_vport_wfq(struct qed_dev *cdev, u16 vp_id, u32 rate)
 
                rc = __qed_configure_vport_wfq(p_hwfn, p_ptt, vp_id, rate);
 
-               if (!rc) {
+               if (rc) {
                        qed_ptt_release(p_hwfn, p_ptt);
                        return rc;
                }
index a12c6ca..401e738 100644 (file)
@@ -590,7 +590,7 @@ qed_sp_eth_rx_queue_start(struct qed_hwfn *p_hwfn,
                          u16 cqe_pbl_size, void __iomem **pp_prod)
 {
        struct qed_hw_cid_data *p_rx_cid;
-       u64 init_prod_val = 0;
+       u32 init_prod_val = 0;
        u16 abs_l2_queue = 0;
        u8 abs_stats_id = 0;
        int rc;
@@ -618,7 +618,7 @@ qed_sp_eth_rx_queue_start(struct qed_hwfn *p_hwfn,
                                 MSTORM_ETH_PF_PRODS_OFFSET(abs_l2_queue);
 
        /* Init the rcq, rx bd and rx sge (if valid) producers to 0 */
-       __internal_ram_wr(p_hwfn, *pp_prod, sizeof(u64),
+       __internal_ram_wr(p_hwfn, *pp_prod, sizeof(u32),
                          (u32 *)(&init_prod_val));
 
        /* Allocate a CID for the queue */
@@ -1664,6 +1664,8 @@ static int qed_fill_eth_dev_info(struct qed_dev *cdev,
        info->num_tc = 1;
 
        if (IS_PF(cdev)) {
+               int max_vf_vlan_filters = 0;
+
                if (cdev->int_params.out.int_mode == QED_INT_MODE_MSIX) {
                        for_each_hwfn(cdev, i)
                            info->num_queues +=
@@ -1676,7 +1678,12 @@ static int qed_fill_eth_dev_info(struct qed_dev *cdev,
                        info->num_queues = cdev->num_hwfns;
                }
 
-               info->num_vlan_filters = RESC_NUM(&cdev->hwfns[0], QED_VLAN);
+               if (IS_QED_SRIOV(cdev))
+                       max_vf_vlan_filters = cdev->p_iov_info->total_vfs *
+                                             QED_ETH_VF_NUM_VLAN_FILTERS;
+               info->num_vlan_filters = RESC_NUM(&cdev->hwfns[0], QED_VLAN) -
+                                        max_vf_vlan_filters;
+
                ether_addr_copy(info->port_mac,
                                cdev->hwfns[0].hw_info.hw_mac_addr);
        } else {
index 4d161c7..15399da 100644 (file)
@@ -1404,7 +1404,7 @@ static int __qed_iov_spoofchk_set(struct qed_hwfn *p_hwfn,
        params.anti_spoofing_en = val;
 
        rc = qed_sp_vport_update(p_hwfn, &params, QED_SPQ_MODE_EBLOCK, NULL);
-       if (rc) {
+       if (!rc) {
                p_vf->spoof_chk = val;
                p_vf->req_spoofchk_val = p_vf->spoof_chk;
                DP_VERBOSE(p_hwfn, QED_MSG_IOV,
index 9819230..9b780b3 100644 (file)
@@ -388,7 +388,7 @@ int qed_vf_pf_rxq_start(struct qed_hwfn *p_hwfn,
 
        /* Learn the address of the producer from the response */
        if (pp_prod) {
-               u64 init_prod_val = 0;
+               u32 init_prod_val = 0;
 
                *pp_prod = (u8 __iomem *)p_hwfn->regview + resp->offset;
                DP_VERBOSE(p_hwfn, QED_MSG_IOV,
@@ -396,7 +396,7 @@ int qed_vf_pf_rxq_start(struct qed_hwfn *p_hwfn,
                           rx_qid, *pp_prod, resp->offset);
 
                /* Init the rcq, rx bd and rx sge (if valid) producers to 0 */
-               __internal_ram_wr(p_hwfn, *pp_prod, sizeof(u64),
+               __internal_ram_wr(p_hwfn, *pp_prod, sizeof(u32),
                                  (u32 *)&init_prod_val);
        }
 
index 91e7bb0..e4bd02e 100644 (file)
@@ -2064,10 +2064,13 @@ static int qede_vlan_rx_kill_vid(struct net_device *dev, __be16 proto, u16 vid)
        }
 
        /* Remove vlan */
-       rc = qede_set_ucast_rx_vlan(edev, QED_FILTER_XCAST_TYPE_DEL, vid);
-       if (rc) {
-               DP_ERR(edev, "Failed to remove VLAN %d\n", vid);
-               return -EINVAL;
+       if (vlan->configured) {
+               rc = qede_set_ucast_rx_vlan(edev, QED_FILTER_XCAST_TYPE_DEL,
+                                           vid);
+               if (rc) {
+                       DP_ERR(edev, "Failed to remove VLAN %d\n", vid);
+                       return -EINVAL;
+               }
        }
 
        qede_del_vlan_from_list(edev, vlan);
@@ -3268,6 +3271,7 @@ static int qede_start_queues(struct qede_dev *edev, bool clear_stats)
        start.vport_id = 0;
        start.drop_ttl0 = true;
        start.remove_inner_vlan = vlan_removal_en;
+       start.clear_stats = clear_stats;
 
        rc = edev->ops->vport_start(cdev, &start);