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 | |
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')
-rw-r--r-- | drivers/net/benet/be_cmds.c | 107 | ||||
-rw-r--r-- | drivers/net/benet/be_cmds.h | 21 | ||||
-rw-r--r-- | drivers/net/benet/be_ethtool.c | 21 | ||||
-rw-r--r-- | drivers/net/benet/be_hw.h | 4 |
4 files changed, 153 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 | { |
diff --git a/drivers/net/benet/be_cmds.h b/drivers/net/benet/be_cmds.h index 4f254cfaabe2..3fb6e0a3ad7a 100644 --- a/drivers/net/benet/be_cmds.h +++ b/drivers/net/benet/be_cmds.h | |||
@@ -186,6 +186,7 @@ struct be_mcc_mailbox { | |||
186 | #define OPCODE_COMMON_NTWK_PMAC_ADD 59 | 186 | #define OPCODE_COMMON_NTWK_PMAC_ADD 59 |
187 | #define OPCODE_COMMON_NTWK_PMAC_DEL 60 | 187 | #define OPCODE_COMMON_NTWK_PMAC_DEL 60 |
188 | #define OPCODE_COMMON_FUNCTION_RESET 61 | 188 | #define OPCODE_COMMON_FUNCTION_RESET 61 |
189 | #define OPCODE_COMMON_MANAGE_FAT 68 | ||
189 | #define OPCODE_COMMON_ENABLE_DISABLE_BEACON 69 | 190 | #define OPCODE_COMMON_ENABLE_DISABLE_BEACON 69 |
190 | #define OPCODE_COMMON_GET_BEACON_STATE 70 | 191 | #define OPCODE_COMMON_GET_BEACON_STATE 70 |
191 | #define OPCODE_COMMON_READ_TRANSRECV_DATA 73 | 192 | #define OPCODE_COMMON_READ_TRANSRECV_DATA 73 |
@@ -380,6 +381,24 @@ struct be_cmd_resp_cq_create { | |||
380 | u16 rsvd0; | 381 | u16 rsvd0; |
381 | } __packed; | 382 | } __packed; |
382 | 383 | ||
384 | struct be_cmd_req_get_fat { | ||
385 | struct be_cmd_req_hdr hdr; | ||
386 | u32 fat_operation; | ||
387 | u32 read_log_offset; | ||
388 | u32 read_log_length; | ||
389 | u32 data_buffer_size; | ||
390 | u32 data_buffer[1]; | ||
391 | } __packed; | ||
392 | |||
393 | struct be_cmd_resp_get_fat { | ||
394 | struct be_cmd_resp_hdr hdr; | ||
395 | u32 log_size; | ||
396 | u32 read_log_length; | ||
397 | u32 rsvd[2]; | ||
398 | u32 data_buffer[1]; | ||
399 | } __packed; | ||
400 | |||
401 | |||
383 | /******************** Create MCCQ ***************************/ | 402 | /******************** Create MCCQ ***************************/ |
384 | /* Pseudo amap definition in which each bit of the actual structure is defined | 403 | /* Pseudo amap definition in which each bit of the actual structure is defined |
385 | * as a byte: used to calculate offset/shift/mask of each field */ | 404 | * as a byte: used to calculate offset/shift/mask of each field */ |
@@ -1148,4 +1167,6 @@ extern void be_detect_dump_ue(struct be_adapter *adapter); | |||
1148 | extern int be_cmd_get_die_temperature(struct be_adapter *adapter); | 1167 | extern int be_cmd_get_die_temperature(struct be_adapter *adapter); |
1149 | extern int be_cmd_get_cntl_attributes(struct be_adapter *adapter); | 1168 | extern int be_cmd_get_cntl_attributes(struct be_adapter *adapter); |
1150 | extern int be_cmd_check_native_mode(struct be_adapter *adapter); | 1169 | extern int be_cmd_check_native_mode(struct be_adapter *adapter); |
1170 | extern int be_cmd_get_reg_len(struct be_adapter *adapter, u32 *log_size); | ||
1171 | extern void be_cmd_get_regs(struct be_adapter *adapter, u32 buf_len, void *buf); | ||
1151 | 1172 | ||
diff --git a/drivers/net/benet/be_ethtool.c b/drivers/net/benet/be_ethtool.c index aac248fbd18b..575ac659ceb4 100644 --- a/drivers/net/benet/be_ethtool.c +++ b/drivers/net/benet/be_ethtool.c | |||
@@ -156,6 +156,25 @@ be_get_drvinfo(struct net_device *netdev, struct ethtool_drvinfo *drvinfo) | |||
156 | } | 156 | } |
157 | 157 | ||
158 | static int | 158 | static int |
159 | be_get_reg_len(struct net_device *netdev) | ||
160 | { | ||
161 | struct be_adapter *adapter = netdev_priv(netdev); | ||
162 | u32 log_size = 0; | ||
163 | |||
164 | be_cmd_get_reg_len(adapter, &log_size); | ||
165 | return log_size; | ||
166 | } | ||
167 | |||
168 | static void | ||
169 | be_get_regs(struct net_device *netdev, struct ethtool_regs *regs, void *buf) | ||
170 | { | ||
171 | struct be_adapter *adapter = netdev_priv(netdev); | ||
172 | |||
173 | memset(buf, 0, regs->len); | ||
174 | be_cmd_get_regs(adapter, regs->len, buf); | ||
175 | } | ||
176 | |||
177 | static int | ||
159 | be_get_coalesce(struct net_device *netdev, struct ethtool_coalesce *coalesce) | 178 | be_get_coalesce(struct net_device *netdev, struct ethtool_coalesce *coalesce) |
160 | { | 179 | { |
161 | struct be_adapter *adapter = netdev_priv(netdev); | 180 | struct be_adapter *adapter = netdev_priv(netdev); |
@@ -737,6 +756,8 @@ const struct ethtool_ops be_ethtool_ops = { | |||
737 | .phys_id = be_phys_id, | 756 | .phys_id = be_phys_id, |
738 | .get_sset_count = be_get_sset_count, | 757 | .get_sset_count = be_get_sset_count, |
739 | .get_ethtool_stats = be_get_ethtool_stats, | 758 | .get_ethtool_stats = be_get_ethtool_stats, |
759 | .get_regs_len = be_get_reg_len, | ||
760 | .get_regs = be_get_regs, | ||
740 | .flash_device = be_do_flash, | 761 | .flash_device = be_do_flash, |
741 | .self_test = be_self_test, | 762 | .self_test = be_self_test, |
742 | }; | 763 | }; |
diff --git a/drivers/net/benet/be_hw.h b/drivers/net/benet/be_hw.h index d4344a06090b..53d658afea2a 100644 --- a/drivers/net/benet/be_hw.h +++ b/drivers/net/benet/be_hw.h | |||
@@ -155,6 +155,10 @@ | |||
155 | /********** SRIOV VF PCICFG OFFSET ********/ | 155 | /********** SRIOV VF PCICFG OFFSET ********/ |
156 | #define SRIOV_VF_PCICFG_OFFSET (4096) | 156 | #define SRIOV_VF_PCICFG_OFFSET (4096) |
157 | 157 | ||
158 | /********** FAT TABLE ********/ | ||
159 | #define RETRIEVE_FAT 0 | ||
160 | #define QUERY_FAT 1 | ||
161 | |||
158 | /* Flashrom related descriptors */ | 162 | /* Flashrom related descriptors */ |
159 | #define IMAGE_TYPE_FIRMWARE 160 | 163 | #define IMAGE_TYPE_FIRMWARE 160 |
160 | #define IMAGE_TYPE_BOOTCODE 224 | 164 | #define IMAGE_TYPE_BOOTCODE 224 |