]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - drivers/net/ethernet/qlogic/qede/qede_main.c
qed*: L2 interface to use the SB structures directly
[mirror_ubuntu-artful-kernel.git] / drivers / net / ethernet / qlogic / qede / qede_main.c
index 38b77bbfe4eeac8cb67cbbef40d8d9eec59168ec..ad1e24962bdb9604c74e6e0f0bbe7e3372cb05ef 100644 (file)
@@ -259,7 +259,7 @@ static int qede_netdev_event(struct notifier_block *this, unsigned long event,
                /* Notify qed of the name change */
                if (!edev->ops || !edev->ops->common)
                        goto done;
-               edev->ops->common->set_id(edev->cdev, edev->ndev->name, "qede");
+               edev->ops->common->set_name(edev->cdev, edev->ndev->name);
                break;
        case NETDEV_CHANGEADDR:
                edev = netdev_priv(ndev);
@@ -618,6 +618,12 @@ static struct qede_dev *qede_alloc_etherdev(struct qed_dev *cdev,
        memset(&edev->stats, 0, sizeof(edev->stats));
        memcpy(&edev->dev_info, info, sizeof(*info));
 
+       /* As ethtool doesn't have the ability to show WoL behavior as
+        * 'default', if device supports it declare it's enabled.
+        */
+       if (edev->dev_info.common.wol_support)
+               edev->wol_enabled = true;
+
        INIT_LIST_HEAD(&edev->vlan_list);
 
        return edev;
@@ -846,6 +852,43 @@ static void qede_update_pf_params(struct qed_dev *cdev)
        qed_ops->common->update_pf_params(cdev, &pf_params);
 }
 
+#define QEDE_FW_VER_STR_SIZE   80
+
+static void qede_log_probe(struct qede_dev *edev)
+{
+       struct qed_dev_info *p_dev_info = &edev->dev_info.common;
+       u8 buf[QEDE_FW_VER_STR_SIZE];
+       size_t left_size;
+
+       snprintf(buf, QEDE_FW_VER_STR_SIZE,
+                "Storm FW %d.%d.%d.%d, Management FW %d.%d.%d.%d",
+                p_dev_info->fw_major, p_dev_info->fw_minor, p_dev_info->fw_rev,
+                p_dev_info->fw_eng,
+                (p_dev_info->mfw_rev & QED_MFW_VERSION_3_MASK) >>
+                QED_MFW_VERSION_3_OFFSET,
+                (p_dev_info->mfw_rev & QED_MFW_VERSION_2_MASK) >>
+                QED_MFW_VERSION_2_OFFSET,
+                (p_dev_info->mfw_rev & QED_MFW_VERSION_1_MASK) >>
+                QED_MFW_VERSION_1_OFFSET,
+                (p_dev_info->mfw_rev & QED_MFW_VERSION_0_MASK) >>
+                QED_MFW_VERSION_0_OFFSET);
+
+       left_size = QEDE_FW_VER_STR_SIZE - strlen(buf);
+       if (p_dev_info->mbi_version && left_size)
+               snprintf(buf + strlen(buf), left_size,
+                        " [MBI %d.%d.%d]",
+                        (p_dev_info->mbi_version & QED_MBI_VERSION_2_MASK) >>
+                        QED_MBI_VERSION_2_OFFSET,
+                        (p_dev_info->mbi_version & QED_MBI_VERSION_1_MASK) >>
+                        QED_MBI_VERSION_1_OFFSET,
+                        (p_dev_info->mbi_version & QED_MBI_VERSION_0_MASK) >>
+                        QED_MBI_VERSION_0_OFFSET);
+
+       pr_info("qede %02x:%02x.%02x: %s [%s]\n", edev->pdev->bus->number,
+               PCI_SLOT(edev->pdev->devfn), PCI_FUNC(edev->pdev->devfn),
+               buf, edev->ndev->name);
+}
+
 enum qede_probe_mode {
        QEDE_PROBE_NORMAL,
 };
@@ -924,7 +967,7 @@ static int __qede_probe(struct pci_dev *pdev, u32 dp_module, u8 dp_level,
                goto err4;
        }
 
-       edev->ops->common->set_id(cdev, edev->ndev->name, DRV_MODULE_VERSION);
+       edev->ops->common->set_name(cdev, edev->ndev->name);
 
        /* PTP not supported on VFs */
        if (!is_vf)
@@ -939,8 +982,7 @@ static int __qede_probe(struct pci_dev *pdev, u32 dp_module, u8 dp_level,
 
        edev->rx_copybreak = QEDE_RX_HDR_SIZE;
 
-       DP_INFO(edev, "Ending successfully qede probe\n");
-
+       qede_log_probe(edev);
        return 0;
 
 err4:
@@ -1066,12 +1108,15 @@ static int qede_set_num_queues(struct qede_dev *edev)
        return rc;
 }
 
-static void qede_free_mem_sb(struct qede_dev *edev,
-                            struct qed_sb_info *sb_info)
+static void qede_free_mem_sb(struct qede_dev *edev, struct qed_sb_info *sb_info,
+                            u16 sb_id)
 {
-       if (sb_info->sb_virt)
+       if (sb_info->sb_virt) {
+               edev->ops->common->sb_release(edev->cdev, sb_info, sb_id);
                dma_free_coherent(&edev->pdev->dev, sizeof(*sb_info->sb_virt),
                                  (void *)sb_info->sb_virt, sb_info->sb_phys);
+               memset(sb_info, 0, sizeof(*sb_info));
+       }
 }
 
 /* This function allocates fast-path status block memory */
@@ -1298,12 +1343,12 @@ static int qede_alloc_mem_txq(struct qede_dev *edev, struct qede_tx_queue *txq)
 
        /* Allocate the parallel driver ring for Tx buffers */
        if (txq->is_xdp) {
-               size = sizeof(*txq->sw_tx_ring.xdp) * TX_RING_SIZE;
+               size = sizeof(*txq->sw_tx_ring.xdp) * txq->num_tx_buffers;
                txq->sw_tx_ring.xdp = kzalloc(size, GFP_KERNEL);
                if (!txq->sw_tx_ring.xdp)
                        goto err;
        } else {
-               size = sizeof(*txq->sw_tx_ring.skbs) * TX_RING_SIZE;
+               size = sizeof(*txq->sw_tx_ring.skbs) * txq->num_tx_buffers;
                txq->sw_tx_ring.skbs = kzalloc(size, GFP_KERNEL);
                if (!txq->sw_tx_ring.skbs)
                        goto err;
@@ -1313,7 +1358,7 @@ static int qede_alloc_mem_txq(struct qede_dev *edev, struct qede_tx_queue *txq)
                                            QED_CHAIN_USE_TO_CONSUME_PRODUCE,
                                            QED_CHAIN_MODE_PBL,
                                            QED_CHAIN_CNT_TYPE_U16,
-                                           TX_RING_SIZE,
+                                           txq->num_tx_buffers,
                                            sizeof(*p_virt), &txq->tx_pbl);
        if (rc)
                goto err;
@@ -1328,7 +1373,7 @@ err:
 /* This function frees all memory of a single fp */
 static void qede_free_mem_fp(struct qede_dev *edev, struct qede_fastpath *fp)
 {
-       qede_free_mem_sb(edev, fp->sb_info);
+       qede_free_mem_sb(edev, fp->sb_info, fp->id);
 
        if (fp->type & QEDE_FASTPATH_RX)
                qede_free_mem_rxq(edev, fp->rxq);
@@ -1725,7 +1770,7 @@ static int qede_start_txq(struct qede_dev *edev,
        else
                params.queue_id = txq->index;
 
-       params.sb = fp->sb_info->igu_sb_id;
+       params.p_sb = fp->sb_info;
        params.sb_idx = sb_idx;
 
        rc = edev->ops->q_tx_start(edev->cdev, rss_id, &params, phys_table,
@@ -1804,7 +1849,7 @@ static int qede_start_queues(struct qede_dev *edev, bool clear_stats)
                        memset(&q_params, 0, sizeof(q_params));
                        q_params.queue_id = rxq->rxq_id;
                        q_params.vport_id = 0;
-                       q_params.sb = fp->sb_info->igu_sb_id;
+                       q_params.p_sb = fp->sb_info;
                        q_params.sb_idx = RX_PI;
 
                        p_phys_table =
@@ -1890,9 +1935,10 @@ static void qede_unload(struct qede_dev *edev, enum qede_unload_mode mode,
        if (!is_locked)
                __qede_lock(edev);
 
-       qede_roce_dev_event_close(edev);
        edev->state = QEDE_STATE_CLOSED;
 
+       qede_roce_dev_event_close(edev);
+
        /* Close OS Tx */
        netif_tx_disable(edev->ndev);
        netif_carrier_off(edev->ndev);
@@ -1988,9 +2034,6 @@ static int qede_load(struct qede_dev *edev, enum qede_load_mode mode,
                goto err4;
        DP_INFO(edev, "Start VPORT, RXQ and TXQ succeeded\n");
 
-       /* Add primary mac and set Rx filters */
-       ether_addr_copy(edev->primary_mac, edev->ndev->dev_addr);
-
        /* Program un-configured VLANs */
        qede_configure_vlan_filters(edev);