Skip to content

Commit 1ac4329

Browse files
Denis Bolotindavem330
authored andcommitted
qed: Add configuration information to register dump and debug data
Configuration information is added to the debug data collection, in addition to register dump. Added qed_dbg_nvm_image() that receives an image type, allocates a buffer and reads the image. The images are saved in the buffers and the dump size is updated. Signed-off-by: Denis Bolotin <denis.bolotin@cavium.com> Signed-off-by: Ariel Elior <ariel.elior@cavium.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent b60bfdf commit 1ac4329

File tree

4 files changed

+139
-5
lines changed

4 files changed

+139
-5
lines changed

drivers/net/ethernet/qlogic/qed/qed_debug.c

Lines changed: 112 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7778,6 +7778,57 @@ int qed_dbg_igu_fifo_size(struct qed_dev *cdev)
77787778
return qed_dbg_feature_size(cdev, DBG_FEATURE_IGU_FIFO);
77797779
}
77807780

7781+
int qed_dbg_nvm_image_length(struct qed_hwfn *p_hwfn,
7782+
enum qed_nvm_images image_id, u32 *length)
7783+
{
7784+
struct qed_nvm_image_att image_att;
7785+
int rc;
7786+
7787+
*length = 0;
7788+
rc = qed_mcp_get_nvm_image_att(p_hwfn, image_id, &image_att);
7789+
if (rc)
7790+
return rc;
7791+
7792+
*length = image_att.length;
7793+
7794+
return rc;
7795+
}
7796+
7797+
int qed_dbg_nvm_image(struct qed_dev *cdev, void *buffer,
7798+
u32 *num_dumped_bytes, enum qed_nvm_images image_id)
7799+
{
7800+
struct qed_hwfn *p_hwfn =
7801+
&cdev->hwfns[cdev->dbg_params.engine_for_debug];
7802+
u32 len_rounded, i;
7803+
__be32 val;
7804+
int rc;
7805+
7806+
*num_dumped_bytes = 0;
7807+
rc = qed_dbg_nvm_image_length(p_hwfn, image_id, &len_rounded);
7808+
if (rc)
7809+
return rc;
7810+
7811+
DP_NOTICE(p_hwfn->cdev,
7812+
"Collecting a debug feature [\"nvram image %d\"]\n",
7813+
image_id);
7814+
7815+
len_rounded = roundup(len_rounded, sizeof(u32));
7816+
rc = qed_mcp_get_nvm_image(p_hwfn, image_id, buffer, len_rounded);
7817+
if (rc)
7818+
return rc;
7819+
7820+
/* QED_NVM_IMAGE_NVM_META image is not swapped like other images */
7821+
if (image_id != QED_NVM_IMAGE_NVM_META)
7822+
for (i = 0; i < len_rounded; i += 4) {
7823+
val = cpu_to_be32(*(u32 *)(buffer + i));
7824+
*(u32 *)(buffer + i) = val;
7825+
}
7826+
7827+
*num_dumped_bytes = len_rounded;
7828+
7829+
return rc;
7830+
}
7831+
77817832
int qed_dbg_protection_override(struct qed_dev *cdev, void *buffer,
77827833
u32 *num_dumped_bytes)
77837834
{
@@ -7831,6 +7882,9 @@ enum debug_print_features {
78317882
IGU_FIFO = 6,
78327883
PHY = 7,
78337884
FW_ASSERTS = 8,
7885+
NVM_CFG1 = 9,
7886+
DEFAULT_CFG = 10,
7887+
NVM_META = 11,
78347888
};
78357889

78367890
static u32 qed_calc_regdump_header(enum debug_print_features feature,
@@ -7965,13 +8019,61 @@ int qed_dbg_all_data(struct qed_dev *cdev, void *buffer)
79658019
DP_ERR(cdev, "qed_dbg_mcp_trace failed. rc = %d\n", rc);
79668020
}
79678021

8022+
/* nvm cfg1 */
8023+
rc = qed_dbg_nvm_image(cdev,
8024+
(u8 *)buffer + offset + REGDUMP_HEADER_SIZE,
8025+
&feature_size, QED_NVM_IMAGE_NVM_CFG1);
8026+
if (!rc) {
8027+
*(u32 *)((u8 *)buffer + offset) =
8028+
qed_calc_regdump_header(NVM_CFG1, cur_engine,
8029+
feature_size, omit_engine);
8030+
offset += (feature_size + REGDUMP_HEADER_SIZE);
8031+
} else if (rc != -ENOENT) {
8032+
DP_ERR(cdev,
8033+
"qed_dbg_nvm_image failed for image %d (%s), rc = %d\n",
8034+
QED_NVM_IMAGE_NVM_CFG1, "QED_NVM_IMAGE_NVM_CFG1", rc);
8035+
}
8036+
8037+
/* nvm default */
8038+
rc = qed_dbg_nvm_image(cdev,
8039+
(u8 *)buffer + offset + REGDUMP_HEADER_SIZE,
8040+
&feature_size, QED_NVM_IMAGE_DEFAULT_CFG);
8041+
if (!rc) {
8042+
*(u32 *)((u8 *)buffer + offset) =
8043+
qed_calc_regdump_header(DEFAULT_CFG, cur_engine,
8044+
feature_size, omit_engine);
8045+
offset += (feature_size + REGDUMP_HEADER_SIZE);
8046+
} else if (rc != -ENOENT) {
8047+
DP_ERR(cdev,
8048+
"qed_dbg_nvm_image failed for image %d (%s), rc = %d\n",
8049+
QED_NVM_IMAGE_DEFAULT_CFG, "QED_NVM_IMAGE_DEFAULT_CFG",
8050+
rc);
8051+
}
8052+
8053+
/* nvm meta */
8054+
rc = qed_dbg_nvm_image(cdev,
8055+
(u8 *)buffer + offset + REGDUMP_HEADER_SIZE,
8056+
&feature_size, QED_NVM_IMAGE_NVM_META);
8057+
if (!rc) {
8058+
*(u32 *)((u8 *)buffer + offset) =
8059+
qed_calc_regdump_header(NVM_META, cur_engine,
8060+
feature_size, omit_engine);
8061+
offset += (feature_size + REGDUMP_HEADER_SIZE);
8062+
} else if (rc != -ENOENT) {
8063+
DP_ERR(cdev,
8064+
"qed_dbg_nvm_image failed for image %d (%s), rc = %d\n",
8065+
QED_NVM_IMAGE_NVM_META, "QED_NVM_IMAGE_NVM_META", rc);
8066+
}
8067+
79688068
return 0;
79698069
}
79708070

79718071
int qed_dbg_all_data_size(struct qed_dev *cdev)
79728072
{
8073+
struct qed_hwfn *p_hwfn =
8074+
&cdev->hwfns[cdev->dbg_params.engine_for_debug];
8075+
u32 regs_len = 0, image_len = 0;
79738076
u8 cur_engine, org_engine;
7974-
u32 regs_len = 0;
79758077

79768078
org_engine = qed_get_debug_engine(cdev);
79778079
for (cur_engine = 0; cur_engine < cdev->num_hwfns; cur_engine++) {
@@ -7993,6 +8095,15 @@ int qed_dbg_all_data_size(struct qed_dev *cdev)
79938095

79948096
/* Engine common */
79958097
regs_len += REGDUMP_HEADER_SIZE + qed_dbg_mcp_trace_size(cdev);
8098+
qed_dbg_nvm_image_length(p_hwfn, QED_NVM_IMAGE_NVM_CFG1, &image_len);
8099+
if (image_len)
8100+
regs_len += REGDUMP_HEADER_SIZE + image_len;
8101+
qed_dbg_nvm_image_length(p_hwfn, QED_NVM_IMAGE_DEFAULT_CFG, &image_len);
8102+
if (image_len)
8103+
regs_len += REGDUMP_HEADER_SIZE + image_len;
8104+
qed_dbg_nvm_image_length(p_hwfn, QED_NVM_IMAGE_NVM_META, &image_len);
8105+
if (image_len)
8106+
regs_len += REGDUMP_HEADER_SIZE + image_len;
79968107

79978108
return regs_len;
79988109
}

drivers/net/ethernet/qlogic/qed/qed_mcp.c

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2529,7 +2529,7 @@ int qed_mcp_nvm_info_populate(struct qed_hwfn *p_hwfn)
25292529
return rc;
25302530
}
25312531

2532-
static int
2532+
int
25332533
qed_mcp_get_nvm_image_att(struct qed_hwfn *p_hwfn,
25342534
enum qed_nvm_images image_id,
25352535
struct qed_nvm_image_att *p_image_att)
@@ -2545,6 +2545,15 @@ qed_mcp_get_nvm_image_att(struct qed_hwfn *p_hwfn,
25452545
case QED_NVM_IMAGE_FCOE_CFG:
25462546
type = NVM_TYPE_FCOE_CFG;
25472547
break;
2548+
case QED_NVM_IMAGE_NVM_CFG1:
2549+
type = NVM_TYPE_NVM_CFG1;
2550+
break;
2551+
case QED_NVM_IMAGE_DEFAULT_CFG:
2552+
type = NVM_TYPE_DEFAULT_CFG;
2553+
break;
2554+
case QED_NVM_IMAGE_NVM_META:
2555+
type = NVM_TYPE_META;
2556+
break;
25482557
default:
25492558
DP_NOTICE(p_hwfn, "Unknown request of image_id %08x\n",
25502559
image_id);
@@ -2588,9 +2597,6 @@ int qed_mcp_get_nvm_image(struct qed_hwfn *p_hwfn,
25882597
return -EINVAL;
25892598
}
25902599

2591-
/* Each NVM image is suffixed by CRC; Upper-layer has no need for it */
2592-
image_att.length -= 4;
2593-
25942600
if (image_att.length > buffer_len) {
25952601
DP_VERBOSE(p_hwfn,
25962602
QED_MSG_STORAGE,

drivers/net/ethernet/qlogic/qed/qed_mcp.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -482,6 +482,20 @@ struct qed_nvm_image_att {
482482
u32 length;
483483
};
484484

485+
/**
486+
* @brief Allows reading a whole nvram image
487+
*
488+
* @param p_hwfn
489+
* @param image_id - image to get attributes for
490+
* @param p_image_att - image attributes structure into which to fill data
491+
*
492+
* @return int - 0 - operation was successful.
493+
*/
494+
int
495+
qed_mcp_get_nvm_image_att(struct qed_hwfn *p_hwfn,
496+
enum qed_nvm_images image_id,
497+
struct qed_nvm_image_att *p_image_att);
498+
485499
/**
486500
* @brief Allows reading a whole nvram image
487501
*

include/linux/qed/qed_if.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,9 @@ struct qed_dcbx_get {
159159
enum qed_nvm_images {
160160
QED_NVM_IMAGE_ISCSI_CFG,
161161
QED_NVM_IMAGE_FCOE_CFG,
162+
QED_NVM_IMAGE_NVM_CFG1,
163+
QED_NVM_IMAGE_DEFAULT_CFG,
164+
QED_NVM_IMAGE_NVM_META,
162165
};
163166

164167
struct qed_link_eee_params {

0 commit comments

Comments
 (0)