162306a36Sopenharmony_ci.. SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci=======================================
462306a36Sopenharmony_ciQLogic QLGE 10Gb Ethernet device driver
562306a36Sopenharmony_ci=======================================
662306a36Sopenharmony_ci
762306a36Sopenharmony_ciThis driver use drgn and devlink for debugging.
862306a36Sopenharmony_ci
962306a36Sopenharmony_ciDump kernel data structures in drgn
1062306a36Sopenharmony_ci-----------------------------------
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ciTo dump kernel data structures, the following Python script can be used
1362306a36Sopenharmony_ciin drgn:
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci.. code-block:: python
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci	def align(x, a):
1862306a36Sopenharmony_ci	    """the alignment a should be a power of 2
1962306a36Sopenharmony_ci	    """
2062306a36Sopenharmony_ci	    mask = a - 1
2162306a36Sopenharmony_ci	    return (x+ mask) & ~mask
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci	def struct_size(struct_type):
2462306a36Sopenharmony_ci	    struct_str = "struct {}".format(struct_type)
2562306a36Sopenharmony_ci	    return sizeof(Object(prog, struct_str, address=0x0))
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci	def netdev_priv(netdevice):
2862306a36Sopenharmony_ci	    NETDEV_ALIGN = 32
2962306a36Sopenharmony_ci	    return netdevice.value_() + align(struct_size("net_device"), NETDEV_ALIGN)
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci	name = 'xxx'
3262306a36Sopenharmony_ci	qlge_device = None
3362306a36Sopenharmony_ci	netdevices = prog['init_net'].dev_base_head.address_of_()
3462306a36Sopenharmony_ci	for netdevice in list_for_each_entry("struct net_device", netdevices, "dev_list"):
3562306a36Sopenharmony_ci	    if netdevice.name.string_().decode('ascii') == name:
3662306a36Sopenharmony_ci	        print(netdevice.name)
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci	ql_adapter = Object(prog, "struct ql_adapter", address=netdev_priv(qlge_device))
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ciThe struct ql_adapter will be printed in drgn as follows,
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci    >>> ql_adapter
4362306a36Sopenharmony_ci    (struct ql_adapter){
4462306a36Sopenharmony_ci            .ricb = (struct ricb){
4562306a36Sopenharmony_ci                    .base_cq = (u8)0,
4662306a36Sopenharmony_ci                    .flags = (u8)120,
4762306a36Sopenharmony_ci                    .mask = (__le16)26637,
4862306a36Sopenharmony_ci                    .hash_cq_id = (u8 [1024]){ 172, 142, 255, 255 },
4962306a36Sopenharmony_ci                    .ipv6_hash_key = (__le32 [10]){},
5062306a36Sopenharmony_ci                    .ipv4_hash_key = (__le32 [4]){},
5162306a36Sopenharmony_ci            },
5262306a36Sopenharmony_ci            .flags = (unsigned long)0,
5362306a36Sopenharmony_ci            .wol = (u32)0,
5462306a36Sopenharmony_ci            .nic_stats = (struct nic_stats){
5562306a36Sopenharmony_ci                    .tx_pkts = (u64)0,
5662306a36Sopenharmony_ci                    .tx_bytes = (u64)0,
5762306a36Sopenharmony_ci                    .tx_mcast_pkts = (u64)0,
5862306a36Sopenharmony_ci                    .tx_bcast_pkts = (u64)0,
5962306a36Sopenharmony_ci                    .tx_ucast_pkts = (u64)0,
6062306a36Sopenharmony_ci                    .tx_ctl_pkts = (u64)0,
6162306a36Sopenharmony_ci                    .tx_pause_pkts = (u64)0,
6262306a36Sopenharmony_ci                    ...
6362306a36Sopenharmony_ci            },
6462306a36Sopenharmony_ci            .active_vlans = (unsigned long [64]){
6562306a36Sopenharmony_ci                    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,
6662306a36Sopenharmony_ci                    18446619461681283072, 0, 42949673024, 2147483647,
6762306a36Sopenharmony_ci            },
6862306a36Sopenharmony_ci            .rx_ring = (struct rx_ring [17]){
6962306a36Sopenharmony_ci                    {
7062306a36Sopenharmony_ci                            .cqicb = (struct cqicb){
7162306a36Sopenharmony_ci                                    .msix_vect = (u8)0,
7262306a36Sopenharmony_ci                                    .reserved1 = (u8)0,
7362306a36Sopenharmony_ci                                    .reserved2 = (u8)0,
7462306a36Sopenharmony_ci                                    .flags = (u8)0,
7562306a36Sopenharmony_ci                                    .len = (__le16)0,
7662306a36Sopenharmony_ci                                    .rid = (__le16)0,
7762306a36Sopenharmony_ci                                    ...
7862306a36Sopenharmony_ci                            },
7962306a36Sopenharmony_ci                            .cq_base = (void *)0x0,
8062306a36Sopenharmony_ci                            .cq_base_dma = (dma_addr_t)0,
8162306a36Sopenharmony_ci                    }
8262306a36Sopenharmony_ci                    ...
8362306a36Sopenharmony_ci            }
8462306a36Sopenharmony_ci    }
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_cicoredump via devlink
8762306a36Sopenharmony_ci--------------------
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ciAnd the coredump obtained via devlink in json format looks like,
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_ci.. code:: shell
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci	$ devlink health dump show DEVICE reporter coredump -p -j
9562306a36Sopenharmony_ci	{
9662306a36Sopenharmony_ci	    "Core Registers": {
9762306a36Sopenharmony_ci	        "segment": 1,
9862306a36Sopenharmony_ci	        "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 ]
9962306a36Sopenharmony_ci	    },
10062306a36Sopenharmony_ci	    "Test Logic Regs": {
10162306a36Sopenharmony_ci	        "segment": 2,
10262306a36Sopenharmony_ci	        "values": [ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ]
10362306a36Sopenharmony_ci	    },
10462306a36Sopenharmony_ci	    "RMII Registers": {
10562306a36Sopenharmony_ci	        "segment": 3,
10662306a36Sopenharmony_ci	        "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 ]
10762306a36Sopenharmony_ci	    },
10862306a36Sopenharmony_ci	    ...
10962306a36Sopenharmony_ci	    "Sem Registers": {
11062306a36Sopenharmony_ci	        "segment": 50,
11162306a36Sopenharmony_ci	        "values": [ 0,0,0,0 ]
11262306a36Sopenharmony_ci	    }
11362306a36Sopenharmony_ci	}
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ciWhen the module parameter qlge_force_coredump is set to be true, the MPI
11662306a36Sopenharmony_ciRISC reset before coredumping. So coredumping will much longer since
11762306a36Sopenharmony_cidevlink tool has to wait for 5 secs for the resetting to be
11862306a36Sopenharmony_cifinished.
119