diff options
author | Padmanabh Ratnakar <padmanabh.ratnakar@emulex.com> | 2011-11-15 21:02:43 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2011-11-16 18:07:09 -0500 |
commit | de49bd5a447887fa630c54bb2769102d50fbe40a (patch) | |
tree | f405858c8a1f5097297e74a446376ba778532ab4 /drivers/net/ethernet/emulex/benet/be_ethtool.c | |
parent | 293c4a7d9b95d0beeb5df03c14bd35bc21f9e6f2 (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.c | 74 |
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 | ||
146 | static u32 | ||
147 | lancer_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 | |||
162 | static int | ||
163 | lancer_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 | |||
146 | static int | 204 | static int |
147 | be_get_reg_len(struct net_device *netdev) | 205 | be_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 | ||