Re: [PATCH net-next v6 0/5] Coalesce mac ocp write/modify calls to reduce spinlock contention

From: Mirsad Todorovac
Date: Mon Nov 06 2023 - 14:26:50 EST




On 11/5/23 21:36, Andrew Lunn wrote:
The command used for generating the assembly was taken from .o.cmd file and
added -save-temps as the only change:

make drivers/net/ethernet/realtek/r8169_main.lst

is simpler. You get the C and the generated assembler listed together.

Andrew

Here, Sir:

----------------------------------------------------------------------------------------------
0000000000001950 <r8168_mac_ocp_write>:
{
1950: e8 00 00 00 00 call 1955 <r8168_mac_ocp_write+0x5>
1951: R_X86_64_PLT32 __fentry__-0x4
1955: 55 push %rbp
1956: 48 89 e5 mov %rsp,%rbp
1959: 41 57 push %r15
raw_spin_lock_irqsave(&tp->mac_ocp_lock, flags);
195b: 4c 8d bf 24 1a 00 00 lea 0x1a24(%rdi),%r15
{
1962: 41 56 push %r14
1964: 41 89 d6 mov %edx,%r14d
1967: 41 55 push %r13
1969: 41 54 push %r12
196b: 49 89 fc mov %rdi,%r12
raw_spin_lock_irqsave(&tp->mac_ocp_lock, flags);
196e: 4c 89 ff mov %r15,%rdi
{
1971: 53 push %rbx
1972: 89 f3 mov %esi,%ebx
raw_spin_lock_irqsave(&tp->mac_ocp_lock, flags);
1974: e8 00 00 00 00 call 1979 <r8168_mac_ocp_write+0x29>
1975: R_X86_64_PLT32 _raw_spin_lock_irqsave-0x4
if (rtl_ocp_reg_failure(reg))
1979: 89 df mov %ebx,%edi
raw_spin_lock_irqsave(&tp->mac_ocp_lock, flags);
197b: 49 89 c5 mov %rax,%r13
if (rtl_ocp_reg_failure(reg))
197e: e8 1d f2 ff ff call ba0 <rtl_ocp_reg_failure>
1983: 84 c0 test %al,%al
1985: 75 16 jne 199d <r8168_mac_ocp_write+0x4d>
RTL_W32(tp, OCPDR, OCPAR_FLAG | (reg << 15) | data);
1987: c1 e3 0f shl $0xf,%ebx
198a: 49 8b 04 24 mov (%r12),%rax
198e: 44 09 f3 or %r14d,%ebx
1991: 81 cb 00 00 00 80 or $0x80000000,%ebx
build_mmio_write(writel, "l", unsigned int, "r", :"memory")
1997: 89 98 b0 00 00 00 mov %ebx,0xb0(%rax)
raw_spin_unlock_irqrestore(&tp->mac_ocp_lock, flags);
199d: 4c 89 ee mov %r13,%rsi
19a0: 4c 89 ff mov %r15,%rdi
19a3: e8 00 00 00 00 call 19a8 <r8168_mac_ocp_write+0x58>
19a4: R_X86_64_PLT32 _raw_spin_unlock_irqrestore-0x4
----------------------------------------------------------------------------------------------

Actually, this time rtl_hw_start_8411_2() has r8169_mac_ocp_write mostly() inlined
without an explicit "inline".

I cannot explain why the r8169_main.s looked different with the same .config.

----------------------------------------------------------------------------------------------
0000000000008370 <rtl_hw_start_8411_2>:
{
8370: e8 00 00 00 00 call 8375 <rtl_hw_start_8411_2+0x5>
8371: R_X86_64_PLT32 __fentry__-0x4
8375: 55 push %rbp
8376: 48 89 e5 mov %rsp,%rbp
8379: 41 56 push %r14
837b: 41 55 push %r13
837d: 49 89 fd mov %rdi,%r13
8380: 41 54 push %r12
raw_spin_lock_irqsave(&tp->mac_ocp_lock, flags);
8382: 4d 8d a5 24 1a 00 00 lea 0x1a24(%r13),%r12
rtl_hw_start_8168g(tp);
8389: e8 02 c7 ff ff call 4a90 <rtl_hw_start_8168g>
rtl_ephy_init(tp, e_info_8411_2);
838e: ba 0a 00 00 00 mov $0xa,%edx
8393: 48 c7 c6 00 00 00 00 mov $0x0,%rsi
8396: R_X86_64_32S .rodata+0x440
839a: 4c 89 ef mov %r13,%rdi
839d: e8 be 9d ff ff call 2160 <__rtl_ephy_init>
raw_spin_lock_irqsave(&tp->mac_ocp_lock, flags);
83a2: 4c 89 e7 mov %r12,%rdi
83a5: e8 00 00 00 00 call 83aa <rtl_hw_start_8411_2+0x3a>
83a6: R_X86_64_PLT32 _raw_spin_lock_irqsave-0x4
83aa: ba 00 00 14 fe mov $0xfe140000,%edx
83af: 48 89 c6 mov %rax,%rsi
RTL_W32(tp, OCPDR, OCPAR_FLAG | (reg << 15) | data);
83b2: 49 8b 45 00 mov 0x0(%r13),%rax
83b6: 89 90 b0 00 00 00 mov %edx,0xb0(%rax)
raw_spin_unlock_irqrestore(&tp->mac_ocp_lock, flags);
83bc: 4c 89 e7 mov %r12,%rdi
83bf: e8 00 00 00 00 call 83c4 <rtl_hw_start_8411_2+0x54>
83c0: R_X86_64_PLT32 _raw_spin_unlock_irqrestore-0x4
raw_spin_lock_irqsave(&tp->mac_ocp_lock, flags);
83c4: 4c 89 e7 mov %r12,%rdi
83c7: e8 00 00 00 00 call 83cc <rtl_hw_start_8411_2+0x5c>
83c8: R_X86_64_PLT32 _raw_spin_lock_irqsave-0x4
83cc: ba 00 00 15 fe mov $0xfe150000,%edx
83d1: 48 89 c6 mov %rax,%rsi
RTL_W32(tp, OCPDR, OCPAR_FLAG | (reg << 15) | data);
83d4: 49 8b 45 00 mov 0x0(%r13),%rax
83d8: 89 90 b0 00 00 00 mov %edx,0xb0(%rax)
raw_spin_unlock_irqrestore(&tp->mac_ocp_lock, flags);
83de: 4c 89 e7 mov %r12,%rdi
83e1: e8 00 00 00 00 call 83e6 <rtl_hw_start_8411_2+0x76>
83e2: R_X86_64_PLT32 _raw_spin_unlock_irqrestore-0x4
r8168_mac_ocp_write(tp, 0xFC2C, 0x0000);
83e6: 31 d2 xor %edx,%edx
83e8: be 2c fc 00 00 mov $0xfc2c,%esi
83ed: 4c 89 ef mov %r13,%rdi
83f0: e8 5b 95 ff ff call 1950 <r8168_mac_ocp_write>
raw_spin_lock_irqsave(&tp->mac_ocp_lock, flags);
83f5: 4c 89 e7 mov %r12,%rdi
83f8: e8 00 00 00 00 call 83fd <rtl_hw_start_8411_2+0x8d>
83f9: R_X86_64_PLT32 _raw_spin_lock_irqsave-0x4
83fd: ba 00 00 17 fe mov $0xfe170000,%edx
8402: 48 89 c6 mov %rax,%rsi
RTL_W32(tp, OCPDR, OCPAR_FLAG | (reg << 15) | data);
8405: 49 8b 45 00 mov 0x0(%r13),%rax
8409: 89 90 b0 00 00 00 mov %edx,0xb0(%rax)
raw_spin_unlock_irqrestore(&tp->mac_ocp_lock, flags);
840f: 4c 89 e7 mov %r12,%rdi
8412: e8 00 00 00 00 call 8417 <rtl_hw_start_8411_2+0xa7>
8413: R_X86_64_PLT32 _raw_spin_unlock_irqrestore-0x4
raw_spin_lock_irqsave(&tp->mac_ocp_lock, flags);
8417: 4c 89 e7 mov %r12,%rdi
841a: e8 00 00 00 00 call 841f <rtl_hw_start_8411_2+0xaf>
841b: R_X86_64_PLT32 _raw_spin_lock_irqsave-0x4
841f: ba 00 00 18 fe mov $0xfe180000,%edx
8424: 48 89 c6 mov %rax,%rsi
RTL_W32(tp, OCPDR, OCPAR_FLAG | (reg << 15) | data);
8427: 49 8b 45 00 mov 0x0(%r13),%rax
842b: 89 90 b0 00 00 00 mov %edx,0xb0(%rax)
raw_spin_unlock_irqrestore(&tp->mac_ocp_lock, flags);
8431: 4c 89 e7 mov %r12,%rdi
8434: e8 00 00 00 00 call 8439 <rtl_hw_start_8411_2+0xc9>
8435: R_X86_64_PLT32 _raw_spin_unlock_irqrestore-0x4
raw_spin_lock_irqsave(&tp->mac_ocp_lock, flags);
8439: 4c 89 e7 mov %r12,%rdi
843c: e8 00 00 00 00 call 8441 <rtl_hw_start_8411_2+0xd1>
843d: R_X86_64_PLT32 _raw_spin_lock_irqsave-0x4
8441: ba 00 00 19 fe mov $0xfe190000,%edx
8446: 48 89 c6 mov %rax,%rsi
RTL_W32(tp, OCPDR, OCPAR_FLAG | (reg << 15) | data);
8449: 49 8b 45 00 mov 0x0(%r13),%rax
844d: 89 90 b0 00 00 00 mov %edx,0xb0(%rax)
raw_spin_unlock_irqrestore(&tp->mac_ocp_lock, flags);
8453: 4c 89 e7 mov %r12,%rdi
8456: e8 00 00 00 00 call 845b <rtl_hw_start_8411_2+0xeb>
8457: R_X86_64_PLT32 _raw_spin_unlock_irqrestore-0x4
raw_spin_lock_irqsave(&tp->mac_ocp_lock, flags);
845b: 4c 89 e7 mov %r12,%rdi
845e: e8 00 00 00 00 call 8463 <rtl_hw_start_8411_2+0xf3>
845f: R_X86_64_PLT32 _raw_spin_lock_irqsave-0x4
8463: ba 00 00 1a fe mov $0xfe1a0000,%edx
8468: 48 89 c6 mov %rax,%rsi
RTL_W32(tp, OCPDR, OCPAR_FLAG | (reg << 15) | data);
846b: 49 8b 45 00 mov 0x0(%r13),%rax
846f: 89 90 b0 00 00 00 mov %edx,0xb0(%rax)
raw_spin_unlock_irqrestore(&tp->mac_ocp_lock, flags);
8475: 4c 89 e7 mov %r12,%rdi
8478: e8 00 00 00 00 call 847d <rtl_hw_start_8411_2+0x10d>
8479: R_X86_64_PLT32 _raw_spin_unlock_irqrestore-0x4
r8168_mac_ocp_write(tp, 0xFC36, 0x0000);
847d: 31 d2 xor %edx,%edx
847f: be 36 fc 00 00 mov $0xfc36,%esi
8484: 4c 89 ef mov %r13,%rdi
8487: e8 c4 94 ff ff call 1950 <r8168_mac_ocp_write>
mdelay(3);
----------------------------------------------------------------------------------------------


With the patch applied, and an explicit "inline" on:

static inline bool rtl_ocp_reg_failure(u32 reg);
static inline void __r8168_mac_ocp_write_seqlen(struct rtl8169_private *tp, ...);
static inline void r8168_mac_ocp_write_seqlen(struct rtl8169_private *tp, ...);

the code looks like:

----------------------------------------------------------------------------------------------
0000000000004d60 <rtl_hw_start_8411_2>:
{
4d60: e8 00 00 00 00 call 4d65 <rtl_hw_start_8411_2+0x5>
4d61: R_X86_64_PLT32 __fentry__-0x4
4d65: 55 push %rbp
4d66: 48 89 e5 mov %rsp,%rbp
4d69: 41 57 push %r15
4d6b: 41 56 push %r14
for (p = array; len--; p++)
4d6d: 49 c7 c6 00 00 00 00 mov $0x0,%r14
4d70: R_X86_64_32S .rodata+0x820
{
4d74: 41 55 push %r13
4d76: 41 54 push %r12
raw_spin_lock_irqsave(&tp->mac_ocp_lock, flags);
4d78: 41 bc 28 fc 00 00 mov $0xfc28,%r12d
{
4d7e: 53 push %rbx
4d7f: 48 89 fb mov %rdi,%rbx
raw_spin_lock_irqsave(&tp->mac_ocp_lock, flags);
4d82: 4c 8d ab 24 1a 00 00 lea 0x1a24(%rbx),%r13
{
4d89: 48 83 ec 08 sub $0x8,%rsp
rtl_hw_start_8168g(tp);
4d8d: e8 3e fe ff ff call 4bd0 <rtl_hw_start_8168g>
rtl_ephy_init(tp, e_info_8411_2);
4d92: ba 0a 00 00 00 mov $0xa,%edx
4d97: 48 c7 c6 00 00 00 00 mov $0x0,%rsi
4d9a: R_X86_64_32S .rodata+0x860
4d9e: 48 89 df mov %rbx,%rdi
4da1: e8 fa d4 ff ff call 22a0 <__rtl_ephy_init>
raw_spin_lock_irqsave(&tp->mac_ocp_lock, flags);
4da6: 4c 89 ef mov %r13,%rdi
4da9: e8 00 00 00 00 call 4dae <rtl_hw_start_8411_2+0x4e>
4daa: R_X86_64_PLT32 _raw_spin_lock_irqsave-0x4
4dae: 31 c9 xor %ecx,%ecx
4db0: 49 89 c7 mov %rax,%r15
for (p = array; len--; p++)
4db3: eb 07 jmp 4dbc <rtl_hw_start_8411_2+0x5c>
__r8168_mac_ocp_write(tp, p->reg, p->data);
4db5: 41 8b 4e 04 mov 0x4(%r14),%ecx
4db9: 45 8b 26 mov (%r14),%r12d
return WARN_ONCE(reg & 0xffff0001, "Invalid ocp reg %x!\n", reg);
4dbc: 41 f7 c4 01 00 ff ff test $0xffff0001,%r12d
4dc3: 0f 85 9b 01 00 00 jne 4f64 <rtl_hw_start_8411_2+0x204>
RTL_W32(tp, OCPDR, OCPAR_FLAG | (reg << 15) | data);
4dc9: 41 c1 e4 0f shl $0xf,%r12d
4dcd: 48 8b 03 mov (%rbx),%rax
4dd0: 41 09 cc or %ecx,%r12d
4dd3: 41 81 cc 00 00 00 80 or $0x80000000,%r12d
build_mmio_write(writel, "l", unsigned int, "r", :"memory")
4dda: 44 89 a0 b0 00 00 00 mov %r12d,0xb0(%rax)
for (p = array; len--; p++)
4de1: 49 83 c6 08 add $0x8,%r14
4de5: 49 81 fe 00 00 00 00 cmp $0x0,%r14
4de8: R_X86_64_32S .rodata+0x860
4dec: 75 c7 jne 4db5 <rtl_hw_start_8411_2+0x55>
raw_spin_unlock_irqrestore(&tp->mac_ocp_lock, flags);
4dee: 4c 89 fe mov %r15,%rsi
4df1: 4c 89 ef mov %r13,%rdi
raw_spin_lock_irqsave(&tp->mac_ocp_lock, flags);
4df4: 41 bc 00 f8 00 00 mov $0xf800,%r12d
for (p = array; len--; p++)
4dfa: 49 c7 c6 00 00 00 00 mov $0x0,%r14
4dfd: R_X86_64_32S .rodata+0x4a0
raw_spin_unlock_irqrestore(&tp->mac_ocp_lock, flags);
4e01: e8 00 00 00 00 call 4e06 <rtl_hw_start_8411_2+0xa6>
4e02: R_X86_64_PLT32 _raw_spin_unlock_irqrestore-0x4
mdelay(3);
4e06: bf 08 9c c4 00 mov $0xc49c08,%edi
4e0b: e8 00 00 00 00 call 4e10 <rtl_hw_start_8411_2+0xb0>
4e0c: R_X86_64_PLT32 __const_udelay-0x4
r8168_mac_ocp_write(tp, 0xFC26, 0x0000);
4e10: 31 d2 xor %edx,%edx
4e12: be 26 fc 00 00 mov $0xfc26,%esi
4e17: 48 89 df mov %rbx,%rdi
4e1a: e8 71 d0 ff ff call 1e90 <r8168_mac_ocp_write>
raw_spin_lock_irqsave(&tp->mac_ocp_lock, flags);
4e1f: 4c 89 ef mov %r13,%rdi
4e22: e8 00 00 00 00 call 4e27 <rtl_hw_start_8411_2+0xc7>
4e23: R_X86_64_PLT32 _raw_spin_lock_irqsave-0x4
4e27: b9 08 e0 00 00 mov $0xe008,%ecx
4e2c: 49 89 c7 mov %rax,%r15
for (p = array; len--; p++)
4e2f: eb 07 jmp 4e38 <rtl_hw_start_8411_2+0xd8>
__r8168_mac_ocp_write(tp, p->reg, p->data);
4e31: 41 8b 4e 04 mov 0x4(%r14),%ecx
4e35: 45 8b 26 mov (%r14),%r12d
return WARN_ONCE(reg & 0xffff0001, "Invalid ocp reg %x!\n", reg);
4e38: 41 f7 c4 01 00 ff ff test $0xffff0001,%r12d
4e3f: 0f 85 eb 00 00 00 jne 4f30 <rtl_hw_start_8411_2+0x1d0>
RTL_W32(tp, OCPDR, OCPAR_FLAG | (reg << 15) | data);
4e45: 41 c1 e4 0f shl $0xf,%r12d
4e49: 48 8b 03 mov (%rbx),%rax
4e4c: 41 09 cc or %ecx,%r12d
4e4f: 41 81 cc 00 00 00 80 or $0x80000000,%r12d
4e56: 44 89 a0 b0 00 00 00 mov %r12d,0xb0(%rax)
for (p = array; len--; p++)
4e5d: 49 83 c6 08 add $0x8,%r14
4e61: 49 81 fe 00 00 00 00 cmp $0x0,%r14
4e64: R_X86_64_32S .rodata+0x818
4e68: 75 c7 jne 4e31 <rtl_hw_start_8411_2+0xd1>
raw_spin_unlock_irqrestore(&tp->mac_ocp_lock, flags);
4e6a: 4c 89 fe mov %r15,%rsi
4e6d: 4c 89 ef mov %r13,%rdi
raw_spin_lock_irqsave(&tp->mac_ocp_lock, flags);
4e70: 41 bc 2a fc 00 00 mov $0xfc2a,%r12d
for (p = array; len--; p++)
4e76: 49 c7 c6 00 00 00 00 mov $0x0,%r14
4e79: R_X86_64_32S .rodata+0x460
raw_spin_unlock_irqrestore(&tp->mac_ocp_lock, flags);
4e7d: e8 00 00 00 00 call 4e82 <rtl_hw_start_8411_2+0x122>
4e7e: R_X86_64_PLT32 _raw_spin_unlock_irqrestore-0x4
r8168_mac_ocp_write(tp, 0xFC26, 0x8000);
4e82: ba 00 80 00 00 mov $0x8000,%edx
4e87: be 26 fc 00 00 mov $0xfc26,%esi
4e8c: 48 89 df mov %rbx,%rdi
4e8f: e8 fc cf ff ff call 1e90 <r8168_mac_ocp_write>
raw_spin_lock_irqsave(&tp->mac_ocp_lock, flags);
4e94: 4c 89 ef mov %r13,%rdi
4e97: e8 00 00 00 00 call 4e9c <rtl_hw_start_8411_2+0x13c>
4e98: R_X86_64_PLT32 _raw_spin_lock_irqsave-0x4
4e9c: b9 43 07 00 00 mov $0x743,%ecx
4ea1: 49 89 c7 mov %rax,%r15
for (p = array; len--; p++)
4ea4: eb 07 jmp 4ead <rtl_hw_start_8411_2+0x14d>
__r8168_mac_ocp_write(tp, p->reg, p->data);
4ea6: 41 8b 4e 04 mov 0x4(%r14),%ecx
4eaa: 45 8b 26 mov (%r14),%r12d
return WARN_ONCE(reg & 0xffff0001, "Invalid ocp reg %x!\n", reg);
4ead: 41 f7 c4 01 00 ff ff test $0xffff0001,%r12d
4eb4: 75 4d jne 4f03 <rtl_hw_start_8411_2+0x1a3>
RTL_W32(tp, OCPDR, OCPAR_FLAG | (reg << 15) | data);
4eb6: 41 c1 e4 0f shl $0xf,%r12d
4eba: 48 8b 03 mov (%rbx),%rax
4ebd: 41 09 cc or %ecx,%r12d
4ec0: 41 81 cc 00 00 00 80 or $0x80000000,%r12d
4ec7: 44 89 a0 b0 00 00 00 mov %r12d,0xb0(%rax)
for (p = array; len--; p++)
4ece: 49 83 c6 08 add $0x8,%r14
4ed2: 49 81 fe 00 00 00 00 cmp $0x0,%r14
4ed5: R_X86_64_32S .rodata+0x498
4ed9: 75 cb jne 4ea6 <rtl_hw_start_8411_2+0x146>
raw_spin_unlock_irqrestore(&tp->mac_ocp_lock, flags);
4edb: 4c 89 fe mov %r15,%rsi
4ede: 4c 89 ef mov %r13,%rdi
4ee1: e8 00 00 00 00 call 4ee6 <rtl_hw_start_8411_2+0x186>
4ee2: R_X86_64_PLT32 _raw_spin_unlock_irqrestore-0x4
}
4ee6: 48 83 c4 08 add $0x8,%rsp
4eea: 5b pop %rbx
4eeb: 41 5c pop %r12
4eed: 41 5d pop %r13
4eef: 41 5e pop %r14
4ef1: 41 5f pop %r15
4ef3: 5d pop %rbp
4ef4: 31 c0 xor %eax,%eax
4ef6: 31 d2 xor %edx,%edx
4ef8: 31 c9 xor %ecx,%ecx
4efa: 31 f6 xor %esi,%esi
4efc: 31 ff xor %edi,%edi
4efe: e9 00 00 00 00 jmp 4f03 <rtl_hw_start_8411_2+0x1a3>
4eff: R_X86_64_PLT32 __x86_return_thunk-0x4
return WARN_ONCE(reg & 0xffff0001, "Invalid ocp reg %x!\n", reg);
4f03: 0f b6 05 00 00 00 00 movzbl 0x0(%rip),%eax # 4f0a <rtl_hw_start_8411_2+0x1aa>
4f06: R_X86_64_PC32 .data.once-0x2
4f0a: 3c 01 cmp $0x1,%al
4f0c: 0f 87 00 00 00 00 ja 4f12 <rtl_hw_start_8411_2+0x1b2>
4f0e: R_X86_64_PC32 .text.unlikely+0xd0
4f12: a8 01 test $0x1,%al
4f14: 75 b8 jne 4ece <rtl_hw_start_8411_2+0x16e>
4f16: 44 89 e6 mov %r12d,%esi
4f19: 48 c7 c7 00 00 00 00 mov $0x0,%rdi
4f1c: R_X86_64_32S .rodata.str1.1+0x53
4f20: c6 05 00 00 00 00 01 movb $0x1,0x0(%rip) # 4f27 <rtl_hw_start_8411_2+0x1c7>
4f22: R_X86_64_PC32 .data.once-0x3
4f27: e8 00 00 00 00 call 4f2c <rtl_hw_start_8411_2+0x1cc>
4f28: R_X86_64_PLT32 __warn_printk-0x4
4f2c: 0f 0b ud2
4f2e: eb 9e jmp 4ece <rtl_hw_start_8411_2+0x16e>
4f30: 0f b6 05 00 00 00 00 movzbl 0x0(%rip),%eax # 4f37 <rtl_hw_start_8411_2+0x1d7>
4f33: R_X86_64_PC32 .data.once-0x2
4f37: 3c 01 cmp $0x1,%al
4f39: 0f 87 00 00 00 00 ja 4f3f <rtl_hw_start_8411_2+0x1df>
4f3b: R_X86_64_PC32 .text.unlikely+0x106
4f3f: a8 01 test $0x1,%al
4f41: 0f 85 16 ff ff ff jne 4e5d <rtl_hw_start_8411_2+0xfd>
4f47: 44 89 e6 mov %r12d,%esi
4f4a: 48 c7 c7 00 00 00 00 mov $0x0,%rdi
4f4d: R_X86_64_32S .rodata.str1.1+0x53
4f51: c6 05 00 00 00 00 01 movb $0x1,0x0(%rip) # 4f58 <rtl_hw_start_8411_2+0x1f8>
4f53: R_X86_64_PC32 .data.once-0x3
4f58: e8 00 00 00 00 call 4f5d <rtl_hw_start_8411_2+0x1fd>
4f59: R_X86_64_PLT32 __warn_printk-0x4
4f5d: 0f 0b ud2
4f5f: e9 f9 fe ff ff jmp 4e5d <rtl_hw_start_8411_2+0xfd>
4f64: 0f b6 05 00 00 00 00 movzbl 0x0(%rip),%eax # 4f6b <rtl_hw_start_8411_2+0x20b>
4f67: R_X86_64_PC32 .data.once-0x2
4f6b: 3c 01 cmp $0x1,%al
4f6d: 0f 87 00 00 00 00 ja 4f73 <rtl_hw_start_8411_2+0x213>
4f6f: R_X86_64_PC32 .text.unlikely+0xeb
4f73: a8 01 test $0x1,%al
4f75: 0f 85 66 fe ff ff jne 4de1 <rtl_hw_start_8411_2+0x81>
4f7b: 44 89 e6 mov %r12d,%esi
4f7e: 48 c7 c7 00 00 00 00 mov $0x0,%rdi
4f81: R_X86_64_32S .rodata.str1.1+0x53
4f85: c6 05 00 00 00 00 01 movb $0x1,0x0(%rip) # 4f8c <rtl_hw_start_8411_2+0x22c>
4f87: R_X86_64_PC32 .data.once-0x3
4f8c: e8 00 00 00 00 call 4f91 <rtl_hw_start_8411_2+0x231>
4f8d: R_X86_64_PLT32 __warn_printk-0x4
4f91: 0f 0b ud2
4f93: e9 49 fe ff ff jmp 4de1 <rtl_hw_start_8411_2+0x81>
4f98: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1)
4f9f: 00
4fa0: 90 nop
4fa1: 90 nop
4fa2: 90 nop
4fa3: 90 nop
4fa4: 90 nop
4fa5: 90 nop
4fa6: 90 nop
4fa7: 90 nop
4fa8: 90 nop
4fa9: 90 nop
4faa: 90 nop
4fab: 90 nop
4fac: 90 nop
4fad: 90 nop
4fae: 90 nop
4faf: 90 nop
----------------------------------------------------------------------------------------------

Best regards,
Mirsad Todorovac