Merge branch 'timers/for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git...
[cascardo/linux.git] / drivers / infiniband / hw / nes / nes_utils.c
index f9db07c..fb8cbd7 100644 (file)
@@ -444,15 +444,13 @@ void nes_read_1G_phy_reg(struct nes_device *nesdev, u8 phy_reg, u8 phy_addr, u16
 /**
  * nes_write_10G_phy_reg
  */
-void nes_write_10G_phy_reg(struct nes_device *nesdev, u16 phy_reg,
-               u8 phy_addr, u16 data)
+void nes_write_10G_phy_reg(struct nes_device *nesdev, u16 phy_addr, u8 dev_addr, u16 phy_reg,
+               u16 data)
 {
-       u32 dev_addr;
        u32 port_addr;
        u32 u32temp;
        u32 counter;
 
-       dev_addr = 1;
        port_addr = phy_addr;
 
        /* set address */
@@ -492,14 +490,12 @@ void nes_write_10G_phy_reg(struct nes_device *nesdev, u16 phy_reg,
  * This routine only issues the read, the data must be read
  * separately.
  */
-void nes_read_10G_phy_reg(struct nes_device *nesdev, u16 phy_reg, u8 phy_addr)
+void nes_read_10G_phy_reg(struct nes_device *nesdev, u8 phy_addr, u8 dev_addr, u16 phy_reg)
 {
-       u32 dev_addr;
        u32 port_addr;
        u32 u32temp;
        u32 counter;
 
-       dev_addr = 1;
        port_addr = phy_addr;
 
        /* set address */
@@ -571,12 +567,36 @@ struct nes_cqp_request *nes_get_cqp_request(struct nes_device *nesdev)
        return cqp_request;
 }
 
+void nes_free_cqp_request(struct nes_device *nesdev,
+                         struct nes_cqp_request *cqp_request)
+{
+       unsigned long flags;
+
+       nes_debug(NES_DBG_CQP, "CQP request %p (opcode 0x%02X) freed.\n",
+                 cqp_request,
+                 le32_to_cpu(cqp_request->cqp_wqe.wqe_words[NES_CQP_WQE_OPCODE_IDX]) & 0x3f);
+
+       if (cqp_request->dynamic) {
+               kfree(cqp_request);
+       } else {
+               spin_lock_irqsave(&nesdev->cqp.lock, flags);
+               list_add_tail(&cqp_request->list, &nesdev->cqp_avail_reqs);
+               spin_unlock_irqrestore(&nesdev->cqp.lock, flags);
+       }
+}
+
+void nes_put_cqp_request(struct nes_device *nesdev,
+                        struct nes_cqp_request *cqp_request)
+{
+       if (atomic_dec_and_test(&cqp_request->refcount))
+               nes_free_cqp_request(nesdev, cqp_request);
+}
 
 /**
  * nes_post_cqp_request
  */
 void nes_post_cqp_request(struct nes_device *nesdev,
-               struct nes_cqp_request *cqp_request, int ring_doorbell)
+                         struct nes_cqp_request *cqp_request)
 {
        struct nes_hw_cqp_wqe *cqp_wqe;
        unsigned long flags;
@@ -604,10 +624,9 @@ void nes_post_cqp_request(struct nes_device *nesdev,
                                nesdev->cqp.sq_head, nesdev->cqp.sq_tail, nesdev->cqp.sq_size,
                                cqp_request->waiting, atomic_read(&cqp_request->refcount));
                barrier();
-               if (ring_doorbell) {
-                       /* Ring doorbell (1 WQEs) */
-                       nes_write32(nesdev->regs+NES_WQE_ALLOC, 0x01800000 | nesdev->cqp.qp_id);
-               }
+
+               /* Ring doorbell (1 WQEs) */
+               nes_write32(nesdev->regs+NES_WQE_ALLOC, 0x01800000 | nesdev->cqp.qp_id);
 
                barrier();
        } else {
@@ -660,7 +679,9 @@ int nes_arp_table(struct nes_device *nesdev, u32 ip_addr, u8 *mac_addr, u32 acti
 
        /* DELETE or RESOLVE */
        if (arp_index == nesadapter->arp_table_size) {
-               nes_debug(NES_DBG_NETDEV, "mac address not in ARP table - cannot delete or resolve\n");
+               nes_debug(NES_DBG_NETDEV, "MAC for " NIPQUAD_FMT " not in ARP table - cannot %s\n",
+                         HIPQUAD(ip_addr),
+                         action == NES_ARP_RESOLVE ? "resolve" : "delete");
                return -1;
        }