aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/emulex/benet/be_ethtool.c
diff options
context:
space:
mode:
authorPadmanabh Ratnakar <padmanabh.ratnakar@emulex.com>2011-11-15 21:02:43 -0500
committerDavid S. Miller <davem@davemloft.net>2011-11-16 18:07:09 -0500
commitde49bd5a447887fa630c54bb2769102d50fbe40a (patch)
treef405858c8a1f5097297e74a446376ba778532ab4 /drivers/net/ethernet/emulex/benet/be_ethtool.c
parent293c4a7d9b95d0beeb5df03c14bd35bc21f9e6f2 (diff)
be2net: add register dump feature for Lancer
Implement register dump using ethtool for Lancer. Signed-off-by: Padmanabh Ratnakar <padmanabh.ratnakar@emulex.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/emulex/benet/be_ethtool.c')
-rw-r--r--drivers/net/ethernet/emulex/benet/be_ethtool.c74
1 files changed, 70 insertions, 4 deletions
diff --git a/drivers/net/ethernet/emulex/benet/be_ethtool.c b/drivers/net/ethernet/emulex/benet/be_ethtool.c
index 1ad7a28fae6a..1e7252e4cdec 100644
--- a/drivers/net/ethernet/emulex/benet/be_ethtool.c
+++ b/drivers/net/ethernet/emulex/benet/be_ethtool.c
@@ -143,15 +143,77 @@ static void be_get_drvinfo(struct net_device *netdev,
143 drvinfo->eedump_len = 0; 143 drvinfo->eedump_len = 0;
144} 144}
145 145
146static u32
147lancer_cmd_get_file_len(struct be_adapter *adapter, u8 *file_name)
148{
149 u32 data_read = 0, eof;
150 u8 addn_status;
151 struct be_dma_mem data_len_cmd;
152 int status;
153
154 memset(&data_len_cmd, 0, sizeof(data_len_cmd));
155 /* data_offset and data_size should be 0 to get reg len */
156 status = lancer_cmd_read_object(adapter, &data_len_cmd, 0, 0,
157 file_name, &data_read, &eof, &addn_status);
158
159 return data_read;
160}
161
162static int
163lancer_cmd_read_file(struct be_adapter *adapter, u8 *file_name,
164 u32 buf_len, void *buf)
165{
166 struct be_dma_mem read_cmd;
167 u32 read_len = 0, total_read_len = 0, chunk_size;
168 u32 eof = 0;
169 u8 addn_status;
170 int status = 0;
171
172 read_cmd.size = LANCER_READ_FILE_CHUNK;
173 read_cmd.va = pci_alloc_consistent(adapter->pdev, read_cmd.size,
174 &read_cmd.dma);
175
176 if (!read_cmd.va) {
177 dev_err(&adapter->pdev->dev,
178 "Memory allocation failure while reading dump\n");
179 return -ENOMEM;
180 }
181
182 while ((total_read_len < buf_len) && !eof) {
183 chunk_size = min_t(u32, (buf_len - total_read_len),
184 LANCER_READ_FILE_CHUNK);
185 chunk_size = ALIGN(chunk_size, 4);
186 status = lancer_cmd_read_object(adapter, &read_cmd, chunk_size,
187 total_read_len, file_name, &read_len,
188 &eof, &addn_status);
189 if (!status) {
190 memcpy(buf + total_read_len, read_cmd.va, read_len);
191 total_read_len += read_len;
192 eof &= LANCER_READ_FILE_EOF_MASK;
193 } else {
194 status = -EIO;
195 break;
196 }
197 }
198 pci_free_consistent(adapter->pdev, read_cmd.size, read_cmd.va,
199 read_cmd.dma);
200
201 return status;
202}
203
146static int 204static int
147be_get_reg_len(struct net_device *netdev) 205be_get_reg_len(struct net_device *netdev)
148{ 206{
149 struct be_adapter *adapter = netdev_priv(netdev); 207 struct be_adapter *adapter = netdev_priv(netdev);
150 u32 log_size = 0; 208 u32 log_size = 0;
151 209
152 if (be_physfn(adapter)) 210 if (be_physfn(adapter)) {
153 be_cmd_get_reg_len(adapter, &log_size); 211 if (lancer_chip(adapter))
154 212 log_size = lancer_cmd_get_file_len(adapter,
213 LANCER_FW_DUMP_FILE);
214 else
215 be_cmd_get_reg_len(adapter, &log_size);
216 }
155 return log_size; 217 return log_size;
156} 218}
157 219
@@ -162,7 +224,11 @@ be_get_regs(struct net_device *netdev, struct ethtool_regs *regs, void *buf)
162 224
163 if (be_physfn(adapter)) { 225 if (be_physfn(adapter)) {
164 memset(buf, 0, regs->len); 226 memset(buf, 0, regs->len);
165 be_cmd_get_regs(adapter, regs->len, buf); 227 if (lancer_chip(adapter))
228 lancer_cmd_read_file(adapter, LANCER_FW_DUMP_FILE,
229 regs->len, buf);
230 else
231 be_cmd_get_regs(adapter, regs->len, buf);
166 } 232 }
167} 233}
168 234