scale=0 define gcd(a,b) { auto t; while (b) { t = b; b = a % b; a = t; } return a; } /* Division by reciprocal multiplication. */ define fmul(b,n,d) { return (2^b*n+d-1)/d; } /* Adjustment factor when a ceiling value is used. Use as: (imul * n) + (fmulxx * n + fadjxx) >> xx) */ define fadj(b,n,d) { auto v; d = d/gcd(n,d); v = 2^b*(d-1)/d; return v; } /* Compute the appropriate mul/adj values as well as a shift count, which brings the mul value into the range 2^b-1 <= x < 2^b. Such a shift value will be correct in the signed integer range and off by at most one in the upper half of the unsigned range. */ define fmuls(b,n,d) { auto s, m; for (s = 0; 1; s++) { m = fmul(s,n,d); if (m >= 2^(b-1)) return s; } return 0; } define timeconst(hz) { print "/* Automatically generated by kernel/time/timeconst.bc */\n" print "/* Time conversion constants for HZ == ", hz, " */\n" print "\n" print "#ifndef KERNEL_TIMECONST_H\n" print "#define KERNEL_TIMECONST_H\n\n" print "#include \n" print "#include \n\n" print "#if HZ != ", hz, "\n" print "#error \qinclude/generated/timeconst.h has the wrong HZ value!\q\n" print "#endif\n\n" if (hz < 2) { print "#error Totally bogus HZ value!\n" } else { s=fmuls(32,1000,hz) obase=16 print "#define HZ_TO_MSEC_MUL32\tU64_C(0x", fmul(s,1000,hz), ")\n" print "#define HZ_TO_MSEC_ADJ32\tU64_C(0x", fadj(s,1000,hz), ")\n" obase=10 print "#define HZ_TO_MSEC_SHR32\t", s, "\n" s=fmuls(32,hz,1000) obase=16 print "#define MSEC_TO_HZ_MUL32\tU64_C(0x", fmul(s,hz,1000), ")\n" print "#define MSEC_TO_HZ_ADJ32\tU64_C(0x", fadj(s,hz,1000), ")\n" obase=10 print "#define MSEC_TO_HZ_SHR32\t", s, "\n" obase=10 cd=gcd(hz,1000) print "#define HZ_TO_MSEC_NUM\t\t", 1000/cd, "\n" print "#define HZ_TO_MSEC_DEN\t\t", hz/cd, "\n" print "#define MSEC_TO_HZ_NUM\t\t", hz/cd, "\n" print "#define MSEC_TO_HZ_DEN\t\t", 1000/cd, "\n" print "\n" s=fmuls(32,1000000,hz) obase=16 print "#define HZ_TO_USEC_MUL32\tU64_C(0x", fmul(s,1000000,hz), ")\n" print "#define HZ_TO_USEC_ADJ32\tU64_C(0x", fadj(s,1000000,hz), ")\n" obase=10 print "#define HZ_TO_USEC_SHR32\t", s, "\n" s=fmuls(32,hz,1000000) obase=16 print "#define USEC_TO_HZ_MUL32\tU64_C(0x", fmul(s,hz,1000000), ")\n" print "#define USEC_TO_HZ_ADJ32\tU64_C(0x", fadj(s,hz,1000000), ")\n" obase=10 print "#define USEC_TO_HZ_SHR32\t", s, "\n" obase=10 cd=gcd(hz,1000000) print "#define HZ_TO_USEC_NUM\t\t", 1000000/cd, "\n" print "#define HZ_TO_USEC_DEN\t\t", hz/cd, "\n" print "#define USEC_TO_HZ_NUM\t\t", hz/cd, "\n" print "#define USEC_TO_HZ_DEN\t\t", 1000000/cd, "\n" print "\n" print "#endif /* KERNEL_TIMECONST_H */\n" } halt } hz = read(); timeconst(hz) href='/cgit.cgi/linux/net-next.git/commit/drivers?id=030305d69fc6963c16003f50d7e8d74b02d0a143'>drivers/usb/gadget/function
diff options
context:
space:
mode:
authorBjorn Helgaas <bhelgaas@google.com>2017-01-27 15:00:45 -0600
committerBjorn Helgaas <bhelgaas@google.com>2017-01-27 15:00:45 -0600
commit030305d69fc6963c16003f50d7e8d74b02d0a143 (patch)
tree363a4e34d199178769b7e7eeb26ea2620a55847b /drivers/usb/gadget/function
parent4d191b1b63c209e37bf27938ef365244d3c41084 (diff)
PCI/ASPM: Handle PCI-to-PCIe bridges as roots of PCIe hierarchies
In a struct pcie_link_state, link->root points to the pcie_link_state of the root of the PCIe hierarchy. For the topmost link, this points to itself (link->root = link). For others, we copy the pointer from the parent (link->root = link->parent->root). Previously we recognized that Root Ports originated PCIe hierarchies, but we treated PCI/PCI-X to PCIe Bridges as being in the middle of the hierarchy, and when we tried to copy the pointer from link->parent->root, there was no parent, and we dereferenced a NULL pointer: BUG: unable to handle kernel NULL pointer dereference at 0000000000000090 IP: [<ffffffff9e424350>] pcie_aspm_init_link_state+0x170/0x820 Recognize that PCI/PCI-X to PCIe Bridges originate PCIe hierarchies just like Root Ports do, so link->root for these devices should also point to itself. Fixes: 51ebfc92b72b ("PCI: Enumerate switches below PCI-to-PCIe bridges") Link: https://bugzilla.kernel.org/show_bug.cgi?id=193411 Link: https://bugzilla.opensuse.org/show_bug.cgi?id=1022181 Tested-by: lists@ssl-mail.com Tested-by: Jayachandran C. <jnair@caviumnetworks.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> CC: stable@vger.kernel.org # v4.2+
Diffstat (limited to 'drivers/usb/gadget/function')