diff options
author | Taku Izumi <izumi.taku@jp.fujitsu.com> | 2010-04-27 10:39:53 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-04-27 20:46:57 -0400 |
commit | dcd79aebe736e88d62aeb4a7712ac0ba7cc2aa96 (patch) | |
tree | d6b78e437c089fa0c543c032c11585a179c7ee48 /drivers/net/ixgbe/ixgbe_main.c | |
parent | c97ec42a7a35d214e0c715f77e2ccdfe8ac5bf7c (diff) |
ixgbe: add registers etc. printout code just before resetting adapters
This patch adds registers (,tx/rx rings' status and so on) printout
code just before resetting adapters. This will be helpful for detecting
the root cause of adapters reset.
Signed-off-by: Taku Izumi <izumi.taku@jp.fujitsu.com>
Signed-off-by: Koki Sanagi <sanagi.koki@jp.fujitsu.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ixgbe/ixgbe_main.c')
-rw-r--r-- | drivers/net/ixgbe/ixgbe_main.c | 341 |
1 files changed, 341 insertions, 0 deletions
diff --git a/drivers/net/ixgbe/ixgbe_main.c b/drivers/net/ixgbe/ixgbe_main.c index 7724fb2e8919..2ae5a5159ce4 100644 --- a/drivers/net/ixgbe/ixgbe_main.c +++ b/drivers/net/ixgbe/ixgbe_main.c | |||
@@ -175,6 +175,345 @@ static inline void ixgbe_disable_sriov(struct ixgbe_adapter *adapter) | |||
175 | adapter->flags &= ~IXGBE_FLAG_SRIOV_ENABLED; | 175 | adapter->flags &= ~IXGBE_FLAG_SRIOV_ENABLED; |
176 | } | 176 | } |
177 | 177 | ||
178 | struct ixgbe_reg_info { | ||
179 | u32 ofs; | ||
180 | char *name; | ||
181 | }; | ||
182 | |||
183 | static const struct ixgbe_reg_info ixgbe_reg_info_tbl[] = { | ||
184 | |||
185 | /* General Registers */ | ||
186 | {IXGBE_CTRL, "CTRL"}, | ||
187 | {IXGBE_STATUS, "STATUS"}, | ||
188 | {IXGBE_CTRL_EXT, "CTRL_EXT"}, | ||
189 | |||
190 | /* Interrupt Registers */ | ||
191 | {IXGBE_EICR, "EICR"}, | ||
192 | |||
193 | /* RX Registers */ | ||
194 | {IXGBE_SRRCTL(0), "SRRCTL"}, | ||
195 | {IXGBE_DCA_RXCTRL(0), "DRXCTL"}, | ||
196 | {IXGBE_RDLEN(0), "RDLEN"}, | ||
197 | {IXGBE_RDH(0), "RDH"}, | ||
198 | {IXGBE_RDT(0), "RDT"}, | ||
199 | {IXGBE_RXDCTL(0), "RXDCTL"}, | ||
200 | {IXGBE_RDBAL(0), "RDBAL"}, | ||
201 | {IXGBE_RDBAH(0), "RDBAH"}, | ||
202 | |||
203 | /* TX Registers */ | ||
204 | {IXGBE_TDBAL(0), "TDBAL"}, | ||
205 | {IXGBE_TDBAH(0), "TDBAH"}, | ||
206 | {IXGBE_TDLEN(0), "TDLEN"}, | ||
207 | {IXGBE_TDH(0), "TDH"}, | ||
208 | {IXGBE_TDT(0), "TDT"}, | ||
209 | {IXGBE_TXDCTL(0), "TXDCTL"}, | ||
210 | |||
211 | /* List Terminator */ | ||
212 | {} | ||
213 | }; | ||
214 | |||
215 | |||
216 | /* | ||
217 | * ixgbe_regdump - register printout routine | ||
218 | */ | ||
219 | static void ixgbe_regdump(struct ixgbe_hw *hw, struct ixgbe_reg_info *reginfo) | ||
220 | { | ||
221 | int i = 0, j = 0; | ||
222 | char rname[16]; | ||
223 | u32 regs[64]; | ||
224 | |||
225 | switch (reginfo->ofs) { | ||
226 | case IXGBE_SRRCTL(0): | ||
227 | for (i = 0; i < 64; i++) | ||
228 | regs[i] = IXGBE_READ_REG(hw, IXGBE_SRRCTL(i)); | ||
229 | break; | ||
230 | case IXGBE_DCA_RXCTRL(0): | ||
231 | for (i = 0; i < 64; i++) | ||
232 | regs[i] = IXGBE_READ_REG(hw, IXGBE_DCA_RXCTRL(i)); | ||
233 | break; | ||
234 | case IXGBE_RDLEN(0): | ||
235 | for (i = 0; i < 64; i++) | ||
236 | regs[i] = IXGBE_READ_REG(hw, IXGBE_RDLEN(i)); | ||
237 | break; | ||
238 | case IXGBE_RDH(0): | ||
239 | for (i = 0; i < 64; i++) | ||
240 | regs[i] = IXGBE_READ_REG(hw, IXGBE_RDH(i)); | ||
241 | break; | ||
242 | case IXGBE_RDT(0): | ||
243 | for (i = 0; i < 64; i++) | ||
244 | regs[i] = IXGBE_READ_REG(hw, IXGBE_RDT(i)); | ||
245 | break; | ||
246 | case IXGBE_RXDCTL(0): | ||
247 | for (i = 0; i < 64; i++) | ||
248 | regs[i] = IXGBE_READ_REG(hw, IXGBE_RXDCTL(i)); | ||
249 | break; | ||
250 | case IXGBE_RDBAL(0): | ||
251 | for (i = 0; i < 64; i++) | ||
252 | regs[i] = IXGBE_READ_REG(hw, IXGBE_RDBAL(i)); | ||
253 | break; | ||
254 | case IXGBE_RDBAH(0): | ||
255 | for (i = 0; i < 64; i++) | ||
256 | regs[i] = IXGBE_READ_REG(hw, IXGBE_RDBAH(i)); | ||
257 | break; | ||
258 | case IXGBE_TDBAL(0): | ||
259 | for (i = 0; i < 64; i++) | ||
260 | regs[i] = IXGBE_READ_REG(hw, IXGBE_TDBAL(i)); | ||
261 | break; | ||
262 | case IXGBE_TDBAH(0): | ||
263 | for (i = 0; i < 64; i++) | ||
264 | regs[i] = IXGBE_READ_REG(hw, IXGBE_TDBAH(i)); | ||
265 | break; | ||
266 | case IXGBE_TDLEN(0): | ||
267 | for (i = 0; i < 64; i++) | ||
268 | regs[i] = IXGBE_READ_REG(hw, IXGBE_TDLEN(i)); | ||
269 | break; | ||
270 | case IXGBE_TDH(0): | ||
271 | for (i = 0; i < 64; i++) | ||
272 | regs[i] = IXGBE_READ_REG(hw, IXGBE_TDH(i)); | ||
273 | break; | ||
274 | case IXGBE_TDT(0): | ||
275 | for (i = 0; i < 64; i++) | ||
276 | regs[i] = IXGBE_READ_REG(hw, IXGBE_TDT(i)); | ||
277 | break; | ||
278 | case IXGBE_TXDCTL(0): | ||
279 | for (i = 0; i < 64; i++) | ||
280 | regs[i] = IXGBE_READ_REG(hw, IXGBE_TXDCTL(i)); | ||
281 | break; | ||
282 | default: | ||
283 | printk(KERN_INFO "%-15s %08x\n", reginfo->name, | ||
284 | IXGBE_READ_REG(hw, reginfo->ofs)); | ||
285 | return; | ||
286 | } | ||
287 | |||
288 | for (i = 0; i < 8; i++) { | ||
289 | snprintf(rname, 16, "%s[%d-%d]", reginfo->name, i*8, i*8+7); | ||
290 | printk(KERN_ERR "%-15s ", rname); | ||
291 | for (j = 0; j < 8; j++) | ||
292 | printk(KERN_CONT "%08x ", regs[i*8+j]); | ||
293 | printk(KERN_CONT "\n"); | ||
294 | } | ||
295 | |||
296 | } | ||
297 | |||
298 | /* | ||
299 | * ixgbe_dump - Print registers, tx-rings and rx-rings | ||
300 | */ | ||
301 | static void ixgbe_dump(struct ixgbe_adapter *adapter) | ||
302 | { | ||
303 | struct net_device *netdev = adapter->netdev; | ||
304 | struct ixgbe_hw *hw = &adapter->hw; | ||
305 | struct ixgbe_reg_info *reginfo; | ||
306 | int n = 0; | ||
307 | struct ixgbe_ring *tx_ring; | ||
308 | struct ixgbe_tx_buffer *tx_buffer_info; | ||
309 | union ixgbe_adv_tx_desc *tx_desc; | ||
310 | struct my_u0 { u64 a; u64 b; } *u0; | ||
311 | struct ixgbe_ring *rx_ring; | ||
312 | union ixgbe_adv_rx_desc *rx_desc; | ||
313 | struct ixgbe_rx_buffer *rx_buffer_info; | ||
314 | u32 staterr; | ||
315 | int i = 0; | ||
316 | |||
317 | if (!netif_msg_hw(adapter)) | ||
318 | return; | ||
319 | |||
320 | /* Print netdevice Info */ | ||
321 | if (netdev) { | ||
322 | dev_info(&adapter->pdev->dev, "Net device Info\n"); | ||
323 | printk(KERN_INFO "Device Name state " | ||
324 | "trans_start last_rx\n"); | ||
325 | printk(KERN_INFO "%-15s %016lX %016lX %016lX\n", | ||
326 | netdev->name, | ||
327 | netdev->state, | ||
328 | netdev->trans_start, | ||
329 | netdev->last_rx); | ||
330 | } | ||
331 | |||
332 | /* Print Registers */ | ||
333 | dev_info(&adapter->pdev->dev, "Register Dump\n"); | ||
334 | printk(KERN_INFO " Register Name Value\n"); | ||
335 | for (reginfo = (struct ixgbe_reg_info *)ixgbe_reg_info_tbl; | ||
336 | reginfo->name; reginfo++) { | ||
337 | ixgbe_regdump(hw, reginfo); | ||
338 | } | ||
339 | |||
340 | /* Print TX Ring Summary */ | ||
341 | if (!netdev || !netif_running(netdev)) | ||
342 | goto exit; | ||
343 | |||
344 | dev_info(&adapter->pdev->dev, "TX Rings Summary\n"); | ||
345 | printk(KERN_INFO "Queue [NTU] [NTC] [bi(ntc)->dma ] " | ||
346 | "leng ntw timestamp\n"); | ||
347 | for (n = 0; n < adapter->num_tx_queues; n++) { | ||
348 | tx_ring = adapter->tx_ring[n]; | ||
349 | tx_buffer_info = | ||
350 | &tx_ring->tx_buffer_info[tx_ring->next_to_clean]; | ||
351 | printk(KERN_INFO " %5d %5X %5X %016llX %04X %3X %016llX\n", | ||
352 | n, tx_ring->next_to_use, tx_ring->next_to_clean, | ||
353 | (u64)tx_buffer_info->dma, | ||
354 | tx_buffer_info->length, | ||
355 | tx_buffer_info->next_to_watch, | ||
356 | (u64)tx_buffer_info->time_stamp); | ||
357 | } | ||
358 | |||
359 | /* Print TX Rings */ | ||
360 | if (!netif_msg_tx_done(adapter)) | ||
361 | goto rx_ring_summary; | ||
362 | |||
363 | dev_info(&adapter->pdev->dev, "TX Rings Dump\n"); | ||
364 | |||
365 | /* Transmit Descriptor Formats | ||
366 | * | ||
367 | * Advanced Transmit Descriptor | ||
368 | * +--------------------------------------------------------------+ | ||
369 | * 0 | Buffer Address [63:0] | | ||
370 | * +--------------------------------------------------------------+ | ||
371 | * 8 | PAYLEN | PORTS | IDX | STA | DCMD |DTYP | RSV | DTALEN | | ||
372 | * +--------------------------------------------------------------+ | ||
373 | * 63 46 45 40 39 36 35 32 31 24 23 20 19 0 | ||
374 | */ | ||
375 | |||
376 | for (n = 0; n < adapter->num_tx_queues; n++) { | ||
377 | tx_ring = adapter->tx_ring[n]; | ||
378 | printk(KERN_INFO "------------------------------------\n"); | ||
379 | printk(KERN_INFO "TX QUEUE INDEX = %d\n", tx_ring->queue_index); | ||
380 | printk(KERN_INFO "------------------------------------\n"); | ||
381 | printk(KERN_INFO "T [desc] [address 63:0 ] " | ||
382 | "[PlPOIdStDDt Ln] [bi->dma ] " | ||
383 | "leng ntw timestamp bi->skb\n"); | ||
384 | |||
385 | for (i = 0; tx_ring->desc && (i < tx_ring->count); i++) { | ||
386 | tx_desc = IXGBE_TX_DESC_ADV(*tx_ring, i); | ||
387 | tx_buffer_info = &tx_ring->tx_buffer_info[i]; | ||
388 | u0 = (struct my_u0 *)tx_desc; | ||
389 | printk(KERN_INFO "T [0x%03X] %016llX %016llX %016llX" | ||
390 | " %04X %3X %016llX %p", i, | ||
391 | le64_to_cpu(u0->a), | ||
392 | le64_to_cpu(u0->b), | ||
393 | (u64)tx_buffer_info->dma, | ||
394 | tx_buffer_info->length, | ||
395 | tx_buffer_info->next_to_watch, | ||
396 | (u64)tx_buffer_info->time_stamp, | ||
397 | tx_buffer_info->skb); | ||
398 | if (i == tx_ring->next_to_use && | ||
399 | i == tx_ring->next_to_clean) | ||
400 | printk(KERN_CONT " NTC/U\n"); | ||
401 | else if (i == tx_ring->next_to_use) | ||
402 | printk(KERN_CONT " NTU\n"); | ||
403 | else if (i == tx_ring->next_to_clean) | ||
404 | printk(KERN_CONT " NTC\n"); | ||
405 | else | ||
406 | printk(KERN_CONT "\n"); | ||
407 | |||
408 | if (netif_msg_pktdata(adapter) && | ||
409 | tx_buffer_info->dma != 0) | ||
410 | print_hex_dump(KERN_INFO, "", | ||
411 | DUMP_PREFIX_ADDRESS, 16, 1, | ||
412 | phys_to_virt(tx_buffer_info->dma), | ||
413 | tx_buffer_info->length, true); | ||
414 | } | ||
415 | } | ||
416 | |||
417 | /* Print RX Rings Summary */ | ||
418 | rx_ring_summary: | ||
419 | dev_info(&adapter->pdev->dev, "RX Rings Summary\n"); | ||
420 | printk(KERN_INFO "Queue [NTU] [NTC]\n"); | ||
421 | for (n = 0; n < adapter->num_rx_queues; n++) { | ||
422 | rx_ring = adapter->rx_ring[n]; | ||
423 | printk(KERN_INFO "%5d %5X %5X\n", n, | ||
424 | rx_ring->next_to_use, rx_ring->next_to_clean); | ||
425 | } | ||
426 | |||
427 | /* Print RX Rings */ | ||
428 | if (!netif_msg_rx_status(adapter)) | ||
429 | goto exit; | ||
430 | |||
431 | dev_info(&adapter->pdev->dev, "RX Rings Dump\n"); | ||
432 | |||
433 | /* Advanced Receive Descriptor (Read) Format | ||
434 | * 63 1 0 | ||
435 | * +-----------------------------------------------------+ | ||
436 | * 0 | Packet Buffer Address [63:1] |A0/NSE| | ||
437 | * +----------------------------------------------+------+ | ||
438 | * 8 | Header Buffer Address [63:1] | DD | | ||
439 | * +-----------------------------------------------------+ | ||
440 | * | ||
441 | * | ||
442 | * Advanced Receive Descriptor (Write-Back) Format | ||
443 | * | ||
444 | * 63 48 47 32 31 30 21 20 16 15 4 3 0 | ||
445 | * +------------------------------------------------------+ | ||
446 | * 0 | Packet IP |SPH| HDR_LEN | RSV|Packet| RSS | | ||
447 | * | Checksum Ident | | | | Type | Type | | ||
448 | * +------------------------------------------------------+ | ||
449 | * 8 | VLAN Tag | Length | Extended Error | Extended Status | | ||
450 | * +------------------------------------------------------+ | ||
451 | * 63 48 47 32 31 20 19 0 | ||
452 | */ | ||
453 | for (n = 0; n < adapter->num_rx_queues; n++) { | ||
454 | rx_ring = adapter->rx_ring[n]; | ||
455 | printk(KERN_INFO "------------------------------------\n"); | ||
456 | printk(KERN_INFO "RX QUEUE INDEX = %d\n", rx_ring->queue_index); | ||
457 | printk(KERN_INFO "------------------------------------\n"); | ||
458 | printk(KERN_INFO "R [desc] [ PktBuf A0] " | ||
459 | "[ HeadBuf DD] [bi->dma ] [bi->skb] " | ||
460 | "<-- Adv Rx Read format\n"); | ||
461 | printk(KERN_INFO "RWB[desc] [PcsmIpSHl PtRs] " | ||
462 | "[vl er S cks ln] ---------------- [bi->skb] " | ||
463 | "<-- Adv Rx Write-Back format\n"); | ||
464 | |||
465 | for (i = 0; i < rx_ring->count; i++) { | ||
466 | rx_buffer_info = &rx_ring->rx_buffer_info[i]; | ||
467 | rx_desc = IXGBE_RX_DESC_ADV(*rx_ring, i); | ||
468 | u0 = (struct my_u0 *)rx_desc; | ||
469 | staterr = le32_to_cpu(rx_desc->wb.upper.status_error); | ||
470 | if (staterr & IXGBE_RXD_STAT_DD) { | ||
471 | /* Descriptor Done */ | ||
472 | printk(KERN_INFO "RWB[0x%03X] %016llX " | ||
473 | "%016llX ---------------- %p", i, | ||
474 | le64_to_cpu(u0->a), | ||
475 | le64_to_cpu(u0->b), | ||
476 | rx_buffer_info->skb); | ||
477 | } else { | ||
478 | printk(KERN_INFO "R [0x%03X] %016llX " | ||
479 | "%016llX %016llX %p", i, | ||
480 | le64_to_cpu(u0->a), | ||
481 | le64_to_cpu(u0->b), | ||
482 | (u64)rx_buffer_info->dma, | ||
483 | rx_buffer_info->skb); | ||
484 | |||
485 | if (netif_msg_pktdata(adapter)) { | ||
486 | print_hex_dump(KERN_INFO, "", | ||
487 | DUMP_PREFIX_ADDRESS, 16, 1, | ||
488 | phys_to_virt(rx_buffer_info->dma), | ||
489 | rx_ring->rx_buf_len, true); | ||
490 | |||
491 | if (rx_ring->rx_buf_len | ||
492 | < IXGBE_RXBUFFER_2048) | ||
493 | print_hex_dump(KERN_INFO, "", | ||
494 | DUMP_PREFIX_ADDRESS, 16, 1, | ||
495 | phys_to_virt( | ||
496 | rx_buffer_info->page_dma + | ||
497 | rx_buffer_info->page_offset | ||
498 | ), | ||
499 | PAGE_SIZE/2, true); | ||
500 | } | ||
501 | } | ||
502 | |||
503 | if (i == rx_ring->next_to_use) | ||
504 | printk(KERN_CONT " NTU\n"); | ||
505 | else if (i == rx_ring->next_to_clean) | ||
506 | printk(KERN_CONT " NTC\n"); | ||
507 | else | ||
508 | printk(KERN_CONT "\n"); | ||
509 | |||
510 | } | ||
511 | } | ||
512 | |||
513 | exit: | ||
514 | return; | ||
515 | } | ||
516 | |||
178 | static void ixgbe_release_hw_control(struct ixgbe_adapter *adapter) | 517 | static void ixgbe_release_hw_control(struct ixgbe_adapter *adapter) |
179 | { | 518 | { |
180 | u32 ctrl_ext; | 519 | u32 ctrl_ext; |
@@ -3404,6 +3743,8 @@ static void ixgbe_reset_task(struct work_struct *work) | |||
3404 | 3743 | ||
3405 | adapter->tx_timeout_count++; | 3744 | adapter->tx_timeout_count++; |
3406 | 3745 | ||
3746 | ixgbe_dump(adapter); | ||
3747 | netdev_err(adapter->netdev, "Reset adapter\n"); | ||
3407 | ixgbe_reinit_locked(adapter); | 3748 | ixgbe_reinit_locked(adapter); |
3408 | } | 3749 | } |
3409 | 3750 | ||