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