xref: /openbmc/linux/Documentation/networking/device_drivers/qlogic/qlge.rst (revision d0034a7a4ac7fae708146ac0059b9c47a1543f0d)
1*02bd88b4SCoiby Xu.. SPDX-License-Identifier: GPL-2.0
2*02bd88b4SCoiby Xu
3*02bd88b4SCoiby Xu=======================================
4*02bd88b4SCoiby XuQLogic QLGE 10Gb Ethernet device driver
5*02bd88b4SCoiby Xu=======================================
6*02bd88b4SCoiby Xu
7*02bd88b4SCoiby XuThis driver use drgn and devlink for debugging.
8*02bd88b4SCoiby Xu
9*02bd88b4SCoiby XuDump kernel data structures in drgn
10*02bd88b4SCoiby Xu-----------------------------------
11*02bd88b4SCoiby Xu
12*02bd88b4SCoiby XuTo dump kernel data structures, the following Python script can be used
13*02bd88b4SCoiby Xuin drgn:
14*02bd88b4SCoiby Xu
15*02bd88b4SCoiby Xu.. code-block:: python
16*02bd88b4SCoiby Xu
17*02bd88b4SCoiby Xu	def align(x, a):
18*02bd88b4SCoiby Xu	    """the alignment a should be a power of 2
19*02bd88b4SCoiby Xu	    """
20*02bd88b4SCoiby Xu	    mask = a - 1
21*02bd88b4SCoiby Xu	    return (x+ mask) & ~mask
22*02bd88b4SCoiby Xu
23*02bd88b4SCoiby Xu	def struct_size(struct_type):
24*02bd88b4SCoiby Xu	    struct_str = "struct {}".format(struct_type)
25*02bd88b4SCoiby Xu	    return sizeof(Object(prog, struct_str, address=0x0))
26*02bd88b4SCoiby Xu
27*02bd88b4SCoiby Xu	def netdev_priv(netdevice):
28*02bd88b4SCoiby Xu	    NETDEV_ALIGN = 32
29*02bd88b4SCoiby Xu	    return netdevice.value_() + align(struct_size("net_device"), NETDEV_ALIGN)
30*02bd88b4SCoiby Xu
31*02bd88b4SCoiby Xu	name = 'xxx'
32*02bd88b4SCoiby Xu	qlge_device = None
33*02bd88b4SCoiby Xu	netdevices = prog['init_net'].dev_base_head.address_of_()
34*02bd88b4SCoiby Xu	for netdevice in list_for_each_entry("struct net_device", netdevices, "dev_list"):
35*02bd88b4SCoiby Xu	    if netdevice.name.string_().decode('ascii') == name:
36*02bd88b4SCoiby Xu	        print(netdevice.name)
37*02bd88b4SCoiby Xu
38*02bd88b4SCoiby Xu	ql_adapter = Object(prog, "struct ql_adapter", address=netdev_priv(qlge_device))
39*02bd88b4SCoiby Xu
40*02bd88b4SCoiby XuThe struct ql_adapter will be printed in drgn as follows,
41*02bd88b4SCoiby Xu
42*02bd88b4SCoiby Xu    >>> ql_adapter
43*02bd88b4SCoiby Xu    (struct ql_adapter){
44*02bd88b4SCoiby Xu            .ricb = (struct ricb){
45*02bd88b4SCoiby Xu                    .base_cq = (u8)0,
46*02bd88b4SCoiby Xu                    .flags = (u8)120,
47*02bd88b4SCoiby Xu                    .mask = (__le16)26637,
48*02bd88b4SCoiby Xu                    .hash_cq_id = (u8 [1024]){ 172, 142, 255, 255 },
49*02bd88b4SCoiby Xu                    .ipv6_hash_key = (__le32 [10]){},
50*02bd88b4SCoiby Xu                    .ipv4_hash_key = (__le32 [4]){},
51*02bd88b4SCoiby Xu            },
52*02bd88b4SCoiby Xu            .flags = (unsigned long)0,
53*02bd88b4SCoiby Xu            .wol = (u32)0,
54*02bd88b4SCoiby Xu            .nic_stats = (struct nic_stats){
55*02bd88b4SCoiby Xu                    .tx_pkts = (u64)0,
56*02bd88b4SCoiby Xu                    .tx_bytes = (u64)0,
57*02bd88b4SCoiby Xu                    .tx_mcast_pkts = (u64)0,
58*02bd88b4SCoiby Xu                    .tx_bcast_pkts = (u64)0,
59*02bd88b4SCoiby Xu                    .tx_ucast_pkts = (u64)0,
60*02bd88b4SCoiby Xu                    .tx_ctl_pkts = (u64)0,
61*02bd88b4SCoiby Xu                    .tx_pause_pkts = (u64)0,
62*02bd88b4SCoiby Xu                    ...
63*02bd88b4SCoiby Xu            },
64*02bd88b4SCoiby Xu            .active_vlans = (unsigned long [64]){
65*02bd88b4SCoiby Xu                    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52780853100545, 18446744073709551615,
66*02bd88b4SCoiby Xu                    18446619461681283072, 0, 42949673024, 2147483647,
67*02bd88b4SCoiby Xu            },
68*02bd88b4SCoiby Xu            .rx_ring = (struct rx_ring [17]){
69*02bd88b4SCoiby Xu                    {
70*02bd88b4SCoiby Xu                            .cqicb = (struct cqicb){
71*02bd88b4SCoiby Xu                                    .msix_vect = (u8)0,
72*02bd88b4SCoiby Xu                                    .reserved1 = (u8)0,
73*02bd88b4SCoiby Xu                                    .reserved2 = (u8)0,
74*02bd88b4SCoiby Xu                                    .flags = (u8)0,
75*02bd88b4SCoiby Xu                                    .len = (__le16)0,
76*02bd88b4SCoiby Xu                                    .rid = (__le16)0,
77*02bd88b4SCoiby Xu                                    ...
78*02bd88b4SCoiby Xu                            },
79*02bd88b4SCoiby Xu                            .cq_base = (void *)0x0,
80*02bd88b4SCoiby Xu                            .cq_base_dma = (dma_addr_t)0,
81*02bd88b4SCoiby Xu                    }
82*02bd88b4SCoiby Xu                    ...
83*02bd88b4SCoiby Xu            }
84*02bd88b4SCoiby Xu    }
85*02bd88b4SCoiby Xu
86*02bd88b4SCoiby Xucoredump via devlink
87*02bd88b4SCoiby Xu--------------------
88*02bd88b4SCoiby Xu
89*02bd88b4SCoiby Xu
90*02bd88b4SCoiby XuAnd the coredump obtained via devlink in json format looks like,
91*02bd88b4SCoiby Xu
92*02bd88b4SCoiby Xu.. code:: shell
93*02bd88b4SCoiby Xu
94*02bd88b4SCoiby Xu	$ devlink health dump show DEVICE reporter coredump -p -j
95*02bd88b4SCoiby Xu	{
96*02bd88b4SCoiby Xu	    "Core Registers": {
97*02bd88b4SCoiby Xu	        "segment": 1,
98*02bd88b4SCoiby Xu	        "values": [ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ]
99*02bd88b4SCoiby Xu	    },
100*02bd88b4SCoiby Xu	    "Test Logic Regs": {
101*02bd88b4SCoiby Xu	        "segment": 2,
102*02bd88b4SCoiby Xu	        "values": [ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ]
103*02bd88b4SCoiby Xu	    },
104*02bd88b4SCoiby Xu	    "RMII Registers": {
105*02bd88b4SCoiby Xu	        "segment": 3,
106*02bd88b4SCoiby Xu	        "values": [ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ]
107*02bd88b4SCoiby Xu	    },
108*02bd88b4SCoiby Xu	    ...
109*02bd88b4SCoiby Xu	    "Sem Registers": {
110*02bd88b4SCoiby Xu	        "segment": 50,
111*02bd88b4SCoiby Xu	        "values": [ 0,0,0,0 ]
112*02bd88b4SCoiby Xu	    }
113*02bd88b4SCoiby Xu	}
114*02bd88b4SCoiby Xu
115*02bd88b4SCoiby XuWhen the module parameter qlge_force_coredump is set to be true, the MPI
116*02bd88b4SCoiby XuRISC reset before coredumping. So coredumping will much longer since
117*02bd88b4SCoiby Xudevlink tool has to wait for 5 secs for the resetting to be
118*02bd88b4SCoiby Xufinished.
119