]> git.karo-electronics.de Git - linux-beck.git/blobdiff - drivers/net/ethernet/emulex/benet/be_cmds.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[linux-beck.git] / drivers / net / ethernet / emulex / benet / be_cmds.c
index 9080c2775e9fd77fec2be7e9a6d1c174a8b19896..25d3290b8cac3bfc7409529509614ba1560561dd 100644 (file)
@@ -263,6 +263,27 @@ static void be_async_grp5_evt_process(struct be_adapter *adapter,
        }
 }
 
+static void be_async_dbg_evt_process(struct be_adapter *adapter,
+               u32 trailer, struct be_mcc_compl *cmp)
+{
+       u8 event_type = 0;
+       struct be_async_event_qnq *evt = (struct be_async_event_qnq *) cmp;
+
+       event_type = (trailer >> ASYNC_TRAILER_EVENT_TYPE_SHIFT) &
+               ASYNC_TRAILER_EVENT_TYPE_MASK;
+
+       switch (event_type) {
+       case ASYNC_DEBUG_EVENT_TYPE_QNQ:
+               if (evt->valid)
+                       adapter->qnq_vid = le16_to_cpu(evt->vlan_tag);
+               adapter->flags |= BE_FLAGS_QNQ_ASYNC_EVT_RCVD;
+       break;
+       default:
+               dev_warn(&adapter->pdev->dev, "Unknown debug event\n");
+       break;
+       }
+}
+
 static inline bool is_link_state_evt(u32 trailer)
 {
        return ((trailer >> ASYNC_TRAILER_EVENT_CODE_SHIFT) &
@@ -277,6 +298,13 @@ static inline bool is_grp5_evt(u32 trailer)
                                ASYNC_EVENT_CODE_GRP_5);
 }
 
+static inline bool is_dbg_evt(u32 trailer)
+{
+       return (((trailer >> ASYNC_TRAILER_EVENT_CODE_SHIFT) &
+               ASYNC_TRAILER_EVENT_CODE_MASK) ==
+                               ASYNC_EVENT_CODE_QNQ);
+}
+
 static struct be_mcc_compl *be_mcc_compl_get(struct be_adapter *adapter)
 {
        struct be_queue_info *mcc_cq = &adapter->mcc_obj.cq;
@@ -325,6 +353,9 @@ int be_process_mcc(struct be_adapter *adapter)
                        else if (is_grp5_evt(compl->flags))
                                be_async_grp5_evt_process(adapter,
                                compl->flags, compl);
+                       else if (is_dbg_evt(compl->flags))
+                               be_async_dbg_evt_process(adapter,
+                               compl->flags, compl);
                } else if (compl->flags & CQE_FLAGS_COMPLETED_MASK) {
                                status = be_mcc_compl_process(adapter, compl);
                                atomic_dec(&mcc_obj->q.used);
@@ -1020,6 +1051,7 @@ int be_cmd_mccq_ext_create(struct be_adapter *adapter,
 
        /* Subscribe to Link State and Group 5 Events(bits 1 and 5 set) */
        req->async_event_bitmap[0] = cpu_to_le32(0x00000022);
+       req->async_event_bitmap[0] |= cpu_to_le32(1 << ASYNC_EVENT_CODE_QNQ);
        be_dws_cpu_to_le(ctxt, sizeof(req->context));
 
        be_cmd_page_addrs_prepare(req->pages, ARRAY_SIZE(req->pages), q_mem);
@@ -2457,6 +2489,9 @@ int be_cmd_get_cntl_attributes(struct be_adapter *adapter)
        struct mgmt_controller_attrib *attribs;
        struct be_dma_mem attribs_cmd;
 
+       if (mutex_lock_interruptible(&adapter->mbox_lock))
+               return -1;
+
        memset(&attribs_cmd, 0, sizeof(struct be_dma_mem));
        attribs_cmd.size = sizeof(struct be_cmd_resp_cntl_attribs);
        attribs_cmd.va = pci_alloc_consistent(adapter->pdev, attribs_cmd.size,
@@ -2464,12 +2499,10 @@ int be_cmd_get_cntl_attributes(struct be_adapter *adapter)
        if (!attribs_cmd.va) {
                dev_err(&adapter->pdev->dev,
                                "Memory allocation failure\n");
-               return -ENOMEM;
+               status = -ENOMEM;
+               goto err;
        }
 
-       if (mutex_lock_interruptible(&adapter->mbox_lock))
-               return -1;
-
        wrb = wrb_from_mbox(adapter);
        if (!wrb) {
                status = -EBUSY;
@@ -2489,8 +2522,9 @@ int be_cmd_get_cntl_attributes(struct be_adapter *adapter)
 
 err:
        mutex_unlock(&adapter->mbox_lock);
-       pci_free_consistent(adapter->pdev, attribs_cmd.size, attribs_cmd.va,
-                                       attribs_cmd.dma);
+       if (attribs_cmd.va)
+               pci_free_consistent(adapter->pdev, attribs_cmd.size,
+                                   attribs_cmd.va, attribs_cmd.dma);
        return status;
 }
 
@@ -2788,6 +2822,9 @@ int be_cmd_get_acpi_wol_cap(struct be_adapter *adapter)
                            CMD_SUBSYSTEM_ETH))
                return -EPERM;
 
+       if (mutex_lock_interruptible(&adapter->mbox_lock))
+               return -1;
+
        memset(&cmd, 0, sizeof(struct be_dma_mem));
        cmd.size = sizeof(struct be_cmd_resp_acpi_wol_magic_config_v1);
        cmd.va = pci_alloc_consistent(adapter->pdev, cmd.size,
@@ -2795,12 +2832,10 @@ int be_cmd_get_acpi_wol_cap(struct be_adapter *adapter)
        if (!cmd.va) {
                dev_err(&adapter->pdev->dev,
                                "Memory allocation failure\n");
-               return -ENOMEM;
+               status = -ENOMEM;
+               goto err;
        }
 
-       if (mutex_lock_interruptible(&adapter->mbox_lock))
-               return -1;
-
        wrb = wrb_from_mbox(adapter);
        if (!wrb) {
                status = -EBUSY;
@@ -2831,7 +2866,8 @@ int be_cmd_get_acpi_wol_cap(struct be_adapter *adapter)
        }
 err:
        mutex_unlock(&adapter->mbox_lock);
-       pci_free_consistent(adapter->pdev, cmd.size, cmd.va, cmd.dma);
+       if (cmd.va)
+               pci_free_consistent(adapter->pdev, cmd.size, cmd.va, cmd.dma);
        return status;
 
 }
@@ -2964,16 +3000,18 @@ int be_cmd_get_func_config(struct be_adapter *adapter)
        int status;
        struct be_dma_mem cmd;
 
+       if (mutex_lock_interruptible(&adapter->mbox_lock))
+               return -1;
+
        memset(&cmd, 0, sizeof(struct be_dma_mem));
        cmd.size = sizeof(struct be_cmd_resp_get_func_config);
        cmd.va = pci_alloc_consistent(adapter->pdev, cmd.size,
                                      &cmd.dma);
        if (!cmd.va) {
                dev_err(&adapter->pdev->dev, "Memory alloc failure\n");
-               return -ENOMEM;
+               status = -ENOMEM;
+               goto err;
        }
-       if (mutex_lock_interruptible(&adapter->mbox_lock))
-               return -1;
 
        wrb = wrb_from_mbox(adapter);
        if (!wrb) {
@@ -3016,8 +3054,8 @@ int be_cmd_get_func_config(struct be_adapter *adapter)
        }
 err:
        mutex_unlock(&adapter->mbox_lock);
-       pci_free_consistent(adapter->pdev, cmd.size,
-                           cmd.va, cmd.dma);
+       if (cmd.va)
+               pci_free_consistent(adapter->pdev, cmd.size, cmd.va, cmd.dma);
        return status;
 }