aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorShannon Nelson <shannon.nelson@intel.com>2014-07-10 03:58:20 -0400
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>2014-08-27 03:40:14 -0400
commitf905dd62be8853644357044a455f83e63e8c68ef (patch)
tree8c6f216fbeb85c6b7a66e6b513edb94f5620c7cd
parent7b592f6168e3091bc0868812b6a4a3126be5b82d (diff)
i40e/i40evf: add max buf len to aq debug print helper
There is at least one case in the Firmware API where the response to a command changes the buffer size field in the AQ descriptor to a larger number than what the request's buffer size started as. This is in addition to setting an error flag and is in order to tell the requester how much larger a buffer is required for the answer. We need to be sure not to use that number when dumping the contents of the data buffer because it can send us into the weeds and generate an invalid pointer exception. This patch adds a max buffer size parameter to the print helper to be sure the code knows when to stop. Change-ID: Ib84f7ed72140fe9d600086d8f2002fc5d8753092 Signed-off-by: Shannon Nelson <shannon.nelson@intel.com> Tested-by: Jim Young <jamesx.m.young@intel.com> Tested-by: Sibai Li <sibai.li@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
-rw-r--r--drivers/net/ethernet/intel/i40e/i40e_adminq.c8
-rw-r--r--drivers/net/ethernet/intel/i40e/i40e_common.c8
-rw-r--r--drivers/net/ethernet/intel/i40e/i40e_prototype.h6
-rw-r--r--drivers/net/ethernet/intel/i40evf/i40e_adminq.c9
-rw-r--r--drivers/net/ethernet/intel/i40evf/i40e_common.c8
-rw-r--r--drivers/net/ethernet/intel/i40evf/i40e_prototype.h6
6 files changed, 27 insertions, 18 deletions
diff --git a/drivers/net/ethernet/intel/i40e/i40e_adminq.c b/drivers/net/ethernet/intel/i40e/i40e_adminq.c
index b29c157b1f57..72f5d25a222f 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_adminq.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_adminq.c
@@ -840,7 +840,8 @@ i40e_status i40e_asq_send_command(struct i40e_hw *hw,
840 840
841 /* bump the tail */ 841 /* bump the tail */
842 i40e_debug(hw, I40E_DEBUG_AQ_MESSAGE, "AQTX: desc and buffer:\n"); 842 i40e_debug(hw, I40E_DEBUG_AQ_MESSAGE, "AQTX: desc and buffer:\n");
843 i40e_debug_aq(hw, I40E_DEBUG_AQ_COMMAND, (void *)desc_on_ring, buff); 843 i40e_debug_aq(hw, I40E_DEBUG_AQ_COMMAND, (void *)desc_on_ring,
844 buff, buff_size);
844 (hw->aq.asq.next_to_use)++; 845 (hw->aq.asq.next_to_use)++;
845 if (hw->aq.asq.next_to_use == hw->aq.asq.count) 846 if (hw->aq.asq.next_to_use == hw->aq.asq.count)
846 hw->aq.asq.next_to_use = 0; 847 hw->aq.asq.next_to_use = 0;
@@ -891,7 +892,7 @@ i40e_status i40e_asq_send_command(struct i40e_hw *hw,
891 892
892 i40e_debug(hw, I40E_DEBUG_AQ_MESSAGE, 893 i40e_debug(hw, I40E_DEBUG_AQ_MESSAGE,
893 "AQTX: desc and buffer writeback:\n"); 894 "AQTX: desc and buffer writeback:\n");
894 i40e_debug_aq(hw, I40E_DEBUG_AQ_COMMAND, (void *)desc, buff); 895 i40e_debug_aq(hw, I40E_DEBUG_AQ_COMMAND, (void *)desc, buff, buff_size);
895 896
896 /* update the error if time out occurred */ 897 /* update the error if time out occurred */
897 if ((!cmd_completed) && 898 if ((!cmd_completed) &&
@@ -987,7 +988,8 @@ i40e_status i40e_clean_arq_element(struct i40e_hw *hw,
987 e->msg_size); 988 e->msg_size);
988 989
989 i40e_debug(hw, I40E_DEBUG_AQ_MESSAGE, "AQRX: desc and buffer:\n"); 990 i40e_debug(hw, I40E_DEBUG_AQ_MESSAGE, "AQRX: desc and buffer:\n");
990 i40e_debug_aq(hw, I40E_DEBUG_AQ_COMMAND, (void *)desc, e->msg_buf); 991 i40e_debug_aq(hw, I40E_DEBUG_AQ_COMMAND, (void *)desc, e->msg_buf,
992 hw->aq.arq_buf_size);
991 993
992 /* Restore the original datalen and buffer address in the desc, 994 /* Restore the original datalen and buffer address in the desc,
993 * FW updates datalen to indicate the event message 995 * FW updates datalen to indicate the event message
diff --git a/drivers/net/ethernet/intel/i40e/i40e_common.c b/drivers/net/ethernet/intel/i40e/i40e_common.c
index df43e7c6777c..01874c0fff1d 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_common.c
+++ b/drivers/net/ethernet/intel/i40e/i40e_common.c
@@ -75,13 +75,15 @@ static i40e_status i40e_set_mac_type(struct i40e_hw *hw)
75 * @mask: debug mask 75 * @mask: debug mask
76 * @desc: pointer to admin queue descriptor 76 * @desc: pointer to admin queue descriptor
77 * @buffer: pointer to command buffer 77 * @buffer: pointer to command buffer
78 * @buf_len: max length of buffer
78 * 79 *
79 * Dumps debug log about adminq command with descriptor contents. 80 * Dumps debug log about adminq command with descriptor contents.
80 **/ 81 **/
81void i40e_debug_aq(struct i40e_hw *hw, enum i40e_debug_mask mask, void *desc, 82void i40e_debug_aq(struct i40e_hw *hw, enum i40e_debug_mask mask, void *desc,
82 void *buffer) 83 void *buffer, u16 buf_len)
83{ 84{
84 struct i40e_aq_desc *aq_desc = (struct i40e_aq_desc *)desc; 85 struct i40e_aq_desc *aq_desc = (struct i40e_aq_desc *)desc;
86 u16 len = le16_to_cpu(aq_desc->datalen);
85 u8 *aq_buffer = (u8 *)buffer; 87 u8 *aq_buffer = (u8 *)buffer;
86 u32 data[4]; 88 u32 data[4];
87 u32 i = 0; 89 u32 i = 0;
@@ -105,7 +107,9 @@ void i40e_debug_aq(struct i40e_hw *hw, enum i40e_debug_mask mask, void *desc,
105 if ((buffer != NULL) && (aq_desc->datalen != 0)) { 107 if ((buffer != NULL) && (aq_desc->datalen != 0)) {
106 memset(data, 0, sizeof(data)); 108 memset(data, 0, sizeof(data));
107 i40e_debug(hw, mask, "AQ CMD Buffer:\n"); 109 i40e_debug(hw, mask, "AQ CMD Buffer:\n");
108 for (i = 0; i < le16_to_cpu(aq_desc->datalen); i++) { 110 if (buf_len < len)
111 len = buf_len;
112 for (i = 0; i < len; i++) {
109 data[((i % 16) / 4)] |= 113 data[((i % 16) / 4)] |=
110 ((u32)aq_buffer[i]) << (8 * (i % 4)); 114 ((u32)aq_buffer[i]) << (8 * (i % 4));
111 if ((i % 16) == 15) { 115 if ((i % 16) == 15) {
diff --git a/drivers/net/ethernet/intel/i40e/i40e_prototype.h b/drivers/net/ethernet/intel/i40e/i40e_prototype.h
index 949a9a01778b..0988b5c1fe87 100644
--- a/drivers/net/ethernet/intel/i40e/i40e_prototype.h
+++ b/drivers/net/ethernet/intel/i40e/i40e_prototype.h
@@ -52,10 +52,8 @@ i40e_status i40e_asq_send_command(struct i40e_hw *hw,
52 struct i40e_asq_cmd_details *cmd_details); 52 struct i40e_asq_cmd_details *cmd_details);
53 53
54/* debug function for adminq */ 54/* debug function for adminq */
55void i40e_debug_aq(struct i40e_hw *hw, 55void i40e_debug_aq(struct i40e_hw *hw, enum i40e_debug_mask mask,
56 enum i40e_debug_mask mask, 56 void *desc, void *buffer, u16 buf_len);
57 void *desc,
58 void *buffer);
59 57
60void i40e_idle_aq(struct i40e_hw *hw); 58void i40e_idle_aq(struct i40e_hw *hw);
61bool i40e_check_asq_alive(struct i40e_hw *hw); 59bool i40e_check_asq_alive(struct i40e_hw *hw);
diff --git a/drivers/net/ethernet/intel/i40evf/i40e_adminq.c b/drivers/net/ethernet/intel/i40evf/i40e_adminq.c
index 003006033614..f206be917842 100644
--- a/drivers/net/ethernet/intel/i40evf/i40e_adminq.c
+++ b/drivers/net/ethernet/intel/i40evf/i40e_adminq.c
@@ -788,7 +788,8 @@ i40e_status i40evf_asq_send_command(struct i40e_hw *hw,
788 788
789 /* bump the tail */ 789 /* bump the tail */
790 i40e_debug(hw, I40E_DEBUG_AQ_MESSAGE, "AQTX: desc and buffer:\n"); 790 i40e_debug(hw, I40E_DEBUG_AQ_MESSAGE, "AQTX: desc and buffer:\n");
791 i40evf_debug_aq(hw, I40E_DEBUG_AQ_COMMAND, (void *)desc_on_ring, buff); 791 i40evf_debug_aq(hw, I40E_DEBUG_AQ_COMMAND, (void *)desc_on_ring,
792 buff, buff_size);
792 (hw->aq.asq.next_to_use)++; 793 (hw->aq.asq.next_to_use)++;
793 if (hw->aq.asq.next_to_use == hw->aq.asq.count) 794 if (hw->aq.asq.next_to_use == hw->aq.asq.count)
794 hw->aq.asq.next_to_use = 0; 795 hw->aq.asq.next_to_use = 0;
@@ -842,7 +843,8 @@ i40e_status i40evf_asq_send_command(struct i40e_hw *hw,
842 843
843 i40e_debug(hw, I40E_DEBUG_AQ_MESSAGE, 844 i40e_debug(hw, I40E_DEBUG_AQ_MESSAGE,
844 "AQTX: desc and buffer writeback:\n"); 845 "AQTX: desc and buffer writeback:\n");
845 i40evf_debug_aq(hw, I40E_DEBUG_AQ_COMMAND, (void *)desc, buff); 846 i40evf_debug_aq(hw, I40E_DEBUG_AQ_COMMAND, (void *)desc, buff,
847 buff_size);
846 848
847 /* update the error if time out occurred */ 849 /* update the error if time out occurred */
848 if ((!cmd_completed) && 850 if ((!cmd_completed) &&
@@ -938,7 +940,8 @@ i40e_status i40evf_clean_arq_element(struct i40e_hw *hw,
938 hw->aq.nvm_busy = false; 940 hw->aq.nvm_busy = false;
939 941
940 i40e_debug(hw, I40E_DEBUG_AQ_MESSAGE, "AQRX: desc and buffer:\n"); 942 i40e_debug(hw, I40E_DEBUG_AQ_MESSAGE, "AQRX: desc and buffer:\n");
941 i40evf_debug_aq(hw, I40E_DEBUG_AQ_COMMAND, (void *)desc, e->msg_buf); 943 i40evf_debug_aq(hw, I40E_DEBUG_AQ_COMMAND, (void *)desc, e->msg_buf,
944 hw->aq.arq_buf_size);
942 945
943 /* Restore the original datalen and buffer address in the desc, 946 /* Restore the original datalen and buffer address in the desc,
944 * FW updates datalen to indicate the event message 947 * FW updates datalen to indicate the event message
diff --git a/drivers/net/ethernet/intel/i40evf/i40e_common.c b/drivers/net/ethernet/intel/i40evf/i40e_common.c
index 4ea90bf239bb..952560551964 100644
--- a/drivers/net/ethernet/intel/i40evf/i40e_common.c
+++ b/drivers/net/ethernet/intel/i40evf/i40e_common.c
@@ -75,13 +75,15 @@ i40e_status i40e_set_mac_type(struct i40e_hw *hw)
75 * @mask: debug mask 75 * @mask: debug mask
76 * @desc: pointer to admin queue descriptor 76 * @desc: pointer to admin queue descriptor
77 * @buffer: pointer to command buffer 77 * @buffer: pointer to command buffer
78 * @buf_len: max length of buffer
78 * 79 *
79 * Dumps debug log about adminq command with descriptor contents. 80 * Dumps debug log about adminq command with descriptor contents.
80 **/ 81 **/
81void i40evf_debug_aq(struct i40e_hw *hw, enum i40e_debug_mask mask, void *desc, 82void i40evf_debug_aq(struct i40e_hw *hw, enum i40e_debug_mask mask, void *desc,
82 void *buffer) 83 void *buffer, u16 buf_len)
83{ 84{
84 struct i40e_aq_desc *aq_desc = (struct i40e_aq_desc *)desc; 85 struct i40e_aq_desc *aq_desc = (struct i40e_aq_desc *)desc;
86 u16 len = le16_to_cpu(aq_desc->datalen);
85 u8 *aq_buffer = (u8 *)buffer; 87 u8 *aq_buffer = (u8 *)buffer;
86 u32 data[4]; 88 u32 data[4];
87 u32 i = 0; 89 u32 i = 0;
@@ -105,7 +107,9 @@ void i40evf_debug_aq(struct i40e_hw *hw, enum i40e_debug_mask mask, void *desc,
105 if ((buffer != NULL) && (aq_desc->datalen != 0)) { 107 if ((buffer != NULL) && (aq_desc->datalen != 0)) {
106 memset(data, 0, sizeof(data)); 108 memset(data, 0, sizeof(data));
107 i40e_debug(hw, mask, "AQ CMD Buffer:\n"); 109 i40e_debug(hw, mask, "AQ CMD Buffer:\n");
108 for (i = 0; i < le16_to_cpu(aq_desc->datalen); i++) { 110 if (buf_len < len)
111 len = buf_len;
112 for (i = 0; i < len; i++) {
109 data[((i % 16) / 4)] |= 113 data[((i % 16) / 4)] |=
110 ((u32)aq_buffer[i]) << (8 * (i % 4)); 114 ((u32)aq_buffer[i]) << (8 * (i % 4));
111 if ((i % 16) == 15) { 115 if ((i % 16) == 15) {
diff --git a/drivers/net/ethernet/intel/i40evf/i40e_prototype.h b/drivers/net/ethernet/intel/i40evf/i40e_prototype.h
index 849edcc2e398..9173834825ac 100644
--- a/drivers/net/ethernet/intel/i40evf/i40e_prototype.h
+++ b/drivers/net/ethernet/intel/i40evf/i40e_prototype.h
@@ -53,10 +53,8 @@ i40e_status i40evf_asq_send_command(struct i40e_hw *hw,
53bool i40evf_asq_done(struct i40e_hw *hw); 53bool i40evf_asq_done(struct i40e_hw *hw);
54 54
55/* debug function for adminq */ 55/* debug function for adminq */
56void i40evf_debug_aq(struct i40e_hw *hw, 56void i40evf_debug_aq(struct i40e_hw *hw, enum i40e_debug_mask mask,
57 enum i40e_debug_mask mask, 57 void *desc, void *buffer, u16 buf_len);
58 void *desc,
59 void *buffer);
60 58
61void i40e_idle_aq(struct i40e_hw *hw); 59void i40e_idle_aq(struct i40e_hw *hw);
62void i40evf_resume_aq(struct i40e_hw *hw); 60void i40evf_resume_aq(struct i40e_hw *hw);