diff options
author | Somnath Kotur <somnath.kotur@emulex.com> | 2011-03-16 17:22:43 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-03-31 00:39:19 -0400 |
commit | 311fddc7569d7a3340d61de262cff11685060f74 (patch) | |
tree | a380ce07fdf7632fc8874e5bb8bb9f755fd6af5a /drivers/net/benet/be_cmds.c | |
parent | 01dc7fec4025f6bb72b6b98ec88b375346b6dbbb (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.c | 107 |
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 */ | ||
1190 | int 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 | } | ||
1218 | err: | ||
1219 | spin_unlock_bh(&adapter->mcc_lock); | ||
1220 | return status; | ||
1221 | } | ||
1222 | |||
1223 | void 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 | } | ||
1292 | err: | ||
1293 | spin_unlock_bh(&adapter->mcc_lock); | ||
1294 | } | ||
1295 | |||
1189 | /* Uses Mbox */ | 1296 | /* Uses Mbox */ |
1190 | int be_cmd_get_fw_ver(struct be_adapter *adapter, char *fw_ver) | 1297 | int be_cmd_get_fw_ver(struct be_adapter *adapter, char *fw_ver) |
1191 | { | 1298 | { |