aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/benet/be_cmds.c
diff options
context:
space:
mode:
authorSomnath Kotur <somnath.kotur@emulex.com>2011-03-16 17:22:43 -0400
committerDavid S. Miller <davem@davemloft.net>2011-03-31 00:39:19 -0400
commit311fddc7569d7a3340d61de262cff11685060f74 (patch)
treea380ce07fdf7632fc8874e5bb8bb9f755fd6af5a /drivers/net/benet/be_cmds.c
parent01dc7fec4025f6bb72b6b98ec88b375346b6dbbb (diff)
be2net: Support for FAT dump retrieval using ethtool --register-dump option
Signed-off-by: Somnath Kotur <somnath.kotur@emulex.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/benet/be_cmds.c')
-rw-r--r--drivers/net/benet/be_cmds.c107
1 files changed, 107 insertions, 0 deletions
diff --git a/drivers/net/benet/be_cmds.c b/drivers/net/benet/be_cmds.c
index 5a4a87e7c5ea..2aadf88eaa0a 100644
--- a/drivers/net/benet/be_cmds.c
+++ b/drivers/net/benet/be_cmds.c
@@ -1186,6 +1186,113 @@ err:
1186 return status; 1186 return status;
1187} 1187}
1188 1188
1189/* Uses synchronous mcc */
1190int be_cmd_get_reg_len(struct be_adapter *adapter, u32 *log_size)
1191{
1192 struct be_mcc_wrb *wrb;
1193 struct be_cmd_req_get_fat *req;
1194 int status;
1195
1196 spin_lock_bh(&adapter->mcc_lock);
1197
1198 wrb = wrb_from_mccq(adapter);
1199 if (!wrb) {
1200 status = -EBUSY;
1201 goto err;
1202 }
1203 req = embedded_payload(wrb);
1204
1205 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0,
1206 OPCODE_COMMON_MANAGE_FAT);
1207
1208 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1209 OPCODE_COMMON_MANAGE_FAT, sizeof(*req));
1210 req->fat_operation = cpu_to_le32(QUERY_FAT);
1211 status = be_mcc_notify_wait(adapter);
1212 if (!status) {
1213 struct be_cmd_resp_get_fat *resp = embedded_payload(wrb);
1214 if (log_size && resp->log_size)
1215 *log_size = le32_to_cpu(resp->log_size -
1216 sizeof(u32));
1217 }
1218err:
1219 spin_unlock_bh(&adapter->mcc_lock);
1220 return status;
1221}
1222
1223void be_cmd_get_regs(struct be_adapter *adapter, u32 buf_len, void *buf)
1224{
1225 struct be_dma_mem get_fat_cmd;
1226 struct be_mcc_wrb *wrb;
1227 struct be_cmd_req_get_fat *req;
1228 struct be_sge *sge;
1229 u32 offset = 0, total_size, buf_size, log_offset = sizeof(u32);
1230 int status;
1231
1232 if (buf_len == 0)
1233 return;
1234
1235 total_size = buf_len;
1236
1237 spin_lock_bh(&adapter->mcc_lock);
1238
1239 wrb = wrb_from_mccq(adapter);
1240 if (!wrb) {
1241 status = -EBUSY;
1242 goto err;
1243 }
1244 while (total_size) {
1245 buf_size = min(total_size, (u32)60*1024);
1246 total_size -= buf_size;
1247
1248 get_fat_cmd.size = sizeof(struct be_cmd_req_get_fat) + buf_size;
1249 get_fat_cmd.va = pci_alloc_consistent(adapter->pdev,
1250 get_fat_cmd.size,
1251 &get_fat_cmd.dma);
1252 if (!get_fat_cmd.va) {
1253 status = -ENOMEM;
1254 dev_err(&adapter->pdev->dev,
1255 "Memory allocation failure while retrieving FAT data\n");
1256 goto err;
1257 }
1258 req = get_fat_cmd.va;
1259 sge = nonembedded_sgl(wrb);
1260
1261 be_wrb_hdr_prepare(wrb, get_fat_cmd.size, false, 1,
1262 OPCODE_COMMON_MANAGE_FAT);
1263
1264 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1265 OPCODE_COMMON_MANAGE_FAT, get_fat_cmd.size);
1266
1267 sge->pa_hi = cpu_to_le32(upper_32_bits(get_fat_cmd.size));
1268 sge->pa_lo = cpu_to_le32(get_fat_cmd.dma & 0xFFFFFFFF);
1269 sge->len = cpu_to_le32(get_fat_cmd.size);
1270
1271 req->fat_operation = cpu_to_le32(RETRIEVE_FAT);
1272 req->read_log_offset = cpu_to_le32(log_offset);
1273 req->read_log_length = cpu_to_le32(buf_size);
1274 req->data_buffer_size = cpu_to_le32(buf_size);
1275
1276 status = be_mcc_notify_wait(adapter);
1277 if (!status) {
1278 struct be_cmd_resp_get_fat *resp = get_fat_cmd.va;
1279 memcpy(buf + offset,
1280 resp->data_buffer,
1281 resp->read_log_length);
1282 }
1283 pci_free_consistent(adapter->pdev, get_fat_cmd.size,
1284 get_fat_cmd.va,
1285 get_fat_cmd.dma);
1286 if (status)
1287 dev_err(&adapter->pdev->dev, "FAT Table Retrieve error\n");
1288
1289 offset += buf_size;
1290 log_offset += buf_size;
1291 }
1292err:
1293 spin_unlock_bh(&adapter->mcc_lock);
1294}
1295
1189/* Uses Mbox */ 1296/* Uses Mbox */
1190int be_cmd_get_fw_ver(struct be_adapter *adapter, char *fw_ver) 1297int be_cmd_get_fw_ver(struct be_adapter *adapter, char *fw_ver)
1191{ 1298{