igb: expose mailbox unlock method
authorGreg Edwards <gedwards@ddn.com>
Wed, 28 Jun 2017 15:22:25 +0000 (09:22 -0600)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Wed, 9 Aug 2017 00:50:46 +0000 (17:50 -0700)
Add a mailbox unlock method to e1000_mbx_operations, which will be used
to unlock the PF/VF mailbox by the PF.

Signed-off-by: Greg Edwards <gedwards@ddn.com>
Tested-by: Aaron Brown <aaron.f.brown@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/igb/e1000_hw.h
drivers/net/ethernet/intel/igb/e1000_mbx.c
drivers/net/ethernet/intel/igb/e1000_mbx.h

index fd7865a8d2e3f4e03c1e897735cd301213cf99ba..6076f258a0a5a118e17f9ccbe00c2bff7015b6ef 100644 (file)
@@ -499,6 +499,7 @@ struct e1000_mbx_operations {
        s32 (*check_for_msg)(struct e1000_hw *hw, u16 mbx_id);
        s32 (*check_for_ack)(struct e1000_hw *hw, u16 mbx_id);
        s32 (*check_for_rst)(struct e1000_hw *hw, u16 mbx_id);
+       s32 (*unlock)(struct e1000_hw *hw, u16 mbx_id);
 };
 
 struct e1000_mbx_stats {
index 00e263f0c030f9d7ef86dbdaedc8f2f30473f94d..6aa44723507bf3e42d35de6aa2bf7b5a948ba142 100644 (file)
@@ -124,6 +124,24 @@ s32 igb_check_for_rst(struct e1000_hw *hw, u16 mbx_id)
        return ret_val;
 }
 
+/**
+ *  igb_unlock_mbx - unlock the mailbox
+ *  @hw: pointer to the HW structure
+ *  @mbx_id: id of mailbox to check
+ *
+ *  returns SUCCESS if the mailbox was unlocked or else ERR_MBX
+ **/
+s32 igb_unlock_mbx(struct e1000_hw *hw, u16 mbx_id)
+{
+       struct e1000_mbx_info *mbx = &hw->mbx;
+       s32 ret_val = -E1000_ERR_MBX;
+
+       if (mbx->ops.unlock)
+               ret_val = mbx->ops.unlock(hw, mbx_id);
+
+       return ret_val;
+}
+
 /**
  *  igb_poll_for_msg - Wait for message notification
  *  @hw: pointer to the HW structure
@@ -340,6 +358,26 @@ static s32 igb_obtain_mbx_lock_pf(struct e1000_hw *hw, u16 vf_number)
        return ret_val;
 }
 
+/**
+ *  igb_release_mbx_lock_pf - release mailbox lock
+ *  @hw: pointer to the HW structure
+ *  @vf_number: the VF index
+ *
+ *  return SUCCESS if we released the mailbox lock
+ **/
+static s32 igb_release_mbx_lock_pf(struct e1000_hw *hw, u16 vf_number)
+{
+       u32 p2v_mailbox;
+
+       /* drop PF lock of mailbox, if set */
+       p2v_mailbox = rd32(E1000_P2VMAILBOX(vf_number));
+       if (p2v_mailbox & E1000_P2VMAILBOX_PFU)
+               wr32(E1000_P2VMAILBOX(vf_number),
+                    p2v_mailbox & ~E1000_P2VMAILBOX_PFU);
+
+       return 0;
+}
+
 /**
  *  igb_write_mbx_pf - Places a message in the mailbox
  *  @hw: pointer to the HW structure
@@ -437,6 +475,7 @@ s32 igb_init_mbx_params_pf(struct e1000_hw *hw)
        mbx->ops.check_for_msg = igb_check_for_msg_pf;
        mbx->ops.check_for_ack = igb_check_for_ack_pf;
        mbx->ops.check_for_rst = igb_check_for_rst_pf;
+       mbx->ops.unlock = igb_release_mbx_lock_pf;
 
        mbx->stats.msgs_tx = 0;
        mbx->stats.msgs_rx = 0;
index 73d90aeb48b2f721c21ccdf60664c6201f588ad3..a98c5dc60afd4ceb05228fb28cc0ca549a108941 100644 (file)
@@ -72,6 +72,7 @@ s32 igb_write_mbx(struct e1000_hw *hw, u32 *msg, u16 size, u16 mbx_id);
 s32 igb_check_for_msg(struct e1000_hw *hw, u16 mbx_id);
 s32 igb_check_for_ack(struct e1000_hw *hw, u16 mbx_id);
 s32 igb_check_for_rst(struct e1000_hw *hw, u16 mbx_id);
+s32 igb_unlock_mbx(struct e1000_hw *hw, u16 mbx_id);
 s32 igb_init_mbx_params_pf(struct e1000_hw *hw);
 
 #endif /* _E1000_MBX_H_ */