aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
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
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')
-rw-r--r--drivers/net/benet/be_cmds.c107
-rw-r--r--drivers/net/benet/be_cmds.h21
-rw-r--r--drivers/net/benet/be_ethtool.c21
-rw-r--r--drivers/net/benet/be_hw.h4
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 */
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{
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
384struct 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
393struct 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);
1148extern int be_cmd_get_die_temperature(struct be_adapter *adapter); 1167extern int be_cmd_get_die_temperature(struct be_adapter *adapter);
1149extern int be_cmd_get_cntl_attributes(struct be_adapter *adapter); 1168extern int be_cmd_get_cntl_attributes(struct be_adapter *adapter);
1150extern int be_cmd_check_native_mode(struct be_adapter *adapter); 1169extern int be_cmd_check_native_mode(struct be_adapter *adapter);
1170extern int be_cmd_get_reg_len(struct be_adapter *adapter, u32 *log_size);
1171extern 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
158static int 158static int
159be_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
168static void
169be_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
177static int
159be_get_coalesce(struct net_device *netdev, struct ethtool_coalesce *coalesce) 178be_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