In addition to what Delan suggested, in general you should certainly try different values for the
reboot= boot parameter; I'd suggest
reboot=b in particular, since that's the most common one for machines to need. Here's the comment from linux/arch/x86/kernel/reboot.c with the possible values:
/* reboot=b[ios] | s[mp] | t[riple] | k[bd] | e[fi] [, [w]arm | [c]old] | p[ci]
warm Don't set the cold reboot flag
cold Set the cold reboot flag
bios Reboot by jumping through the BIOS (only for X86_32)
smp Reboot by executing reset on BSP or other CPU (only for X86_32)
triple Force a triple fault (init)
kbd Use the keyboard controller. cold reset (default)
acpi Use the RESET_REG in the FADT
efi Use efi reset_system runtime service
pci Use the so-called "PCI reset register", CF9
force Avoid anything that could hang.
The kernel has a number of so-called "quirks" for particular machines that require the BIOS reboot method, but like any hardware quirks database the chances are that it's missing a few. Your computer may be one of the ones that's missing. If you find that
reboot=b consistently fixes this for you, then please run 'ubuntu-bug linux' to report a kernel bug asking for this to be made the default for your machine.
You can make this change either on the GRUB command line (hit 'e' on the relevant boot entry and go to the end of the
linux line), or, to make it permanent, edit
/etc/default/grub and change the
GRUB_CMDLINE_LINUX line, being careful to put
reboot=b (or whatever) inside the quote marks.