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