mirror of https://github.com/marcan/lsirec
218 lines
7.1 KiB
Markdown
218 lines
7.1 KiB
Markdown
## lsirec - LSI SAS2008/2108 HBA low-level recovery tool for Linux
|
|
|
|
Currently supports reading and writing the SBR and booting the card in host
|
|
boot mode.
|
|
|
|
Use [lsiutil](https://github.com/exactassembly/meta-xa-stm/blob/master/recipes-support/lsiutil/files/)
|
|
to crossflash between IT/IR firmwares from Linux, without vendor/product ID
|
|
restrictions.
|
|
|
|
## Quick guide to cleanly crossflash between IT/IR firmwares
|
|
|
|
`# lsiutil -e`
|
|
|
|
Select your adapter.
|
|
|
|
`46. Upload FLASH section` → `5. Complete (all sections)`
|
|
|
|
Make a complete Flash backup to be safe.
|
|
|
|
`67. Dump all port state`
|
|
|
|
`68. Show port state summary`
|
|
|
|
Copy and paste these somewhere safe. Take special note of the SAS WWID.
|
|
|
|
`33. Erase non-volatile adapter storage` → `3. FLASH`, then also
|
|
`8. Persistent manufacturing config pages`
|
|
|
|
Wipe the whole Flash. This will take a while. Option number 3 excludes the
|
|
manufacturing config pages, so you need both.
|
|
|
|
`2. Download firmware (update the FLASH)`
|
|
|
|
Flash the new firmware. Optionally, use
|
|
`4. Download/erase BIOS and/or FCode (update the FLASH)` to flash the BIOS/EFI
|
|
module (not necessary if you're not booting from the adapter).
|
|
|
|
Exit lsiutil.
|
|
|
|
`# ./lsirec 0000:01:00.0 readsbr sbr_backup.bin`
|
|
|
|
Where 0000:01:00.0 is your PCI device ID.
|
|
|
|
`# python3 sbrtool.py parse sbr_backup.bin sbr.cfg`
|
|
|
|
Edit sbr.cfg with your favorite text editor. You may want to add
|
|
`SASAddr = 0xYOUR_SAS_WWID` to make the SAS WWID persist in the SBR (I'm not
|
|
sure which firmwares use this, but I've seen it in some SBRs). You may want to
|
|
change the Subsystem VID/PID, or use another SBR as a template.
|
|
|
|
`# python3 sbrtool.py build sbr.cfg sbr_new.bin`
|
|
|
|
`# ./lsirec 0000:01:00.0 writesbr sbr_new.bin`
|
|
|
|
Reboot and cross your fingers.
|
|
|
|
When the system comes back up, if all went well, launch `lsiutil -e` again and
|
|
use `18. Change SAS WWID` to update the WWID if necessary, then reboot again
|
|
(this writes it to the config section in Flash, not to the SBR).
|
|
|
|
*NEW*: instead of rebooting, you can use:
|
|
|
|
`# ./lsirec 0000:01:00.0 reset`
|
|
|
|
`# ./lsirec 0000:01:00.0 rescan`
|
|
|
|
Make sure your disks are not in use if you do this. `reset` might fail if you
|
|
have just flashed a new firmware. This is normal, as the adapter takes a while
|
|
to copy the firmware to the backup area on first boot. Wait a few seconds and
|
|
use `# ./lsirec 0000:01:00.0 info` until it returns `IOC is READY`.
|
|
|
|
## UNTESTED procedure to convert from MegaRAID to IT/IR firmware or recover a bricked card
|
|
|
|
WARNING: this is completely untested. Host boot support has only been tested
|
|
so far on a card that was already IT/IR. Please report back if you try this.
|
|
This process initially boots the IT/IR firwmare without touching Flash, and I'm
|
|
not sure if it might balk at whatever MegaRAID stuff was left there before we
|
|
have a chance to wipe it.
|
|
|
|
This procedure (obviously) resets the adapter, so make sure your disks are not
|
|
in use and any dm/md/lvm mappings have been removed!
|
|
|
|
This mode requires HugeTLB support enabled in your kernel:
|
|
|
|
`# echo 16 > /proc/sys/vm/nr_hugepages`
|
|
|
|
This process is also incompatible with IOMMUs. If you have one, make sure it
|
|
is not active (e.g. check that `/sys/kernel/iommu_groups` is an empty
|
|
directory).
|
|
|
|
Make note of your SAS WWID (e.g. using MegaCLI or the kernel interfaces).
|
|
|
|
`# ./lsirec 0000:01:00.0 unbind`
|
|
|
|
Where 0000:01:00.0 is your PCI device ID. Unbind the kernel driver (if any).
|
|
|
|
`# ./lsirec 0000:01:00.0 halt`
|
|
|
|
Halt the IOP, so that the firmware will not interfere with subsequent
|
|
operations.
|
|
|
|
`# ./lsirec 0000:01:00.0 readsbr sbr_backup.bin`
|
|
|
|
Back up your MegaRAID SBR.
|
|
|
|
`# python3 sbrtool.py parse sbr_backup.bin sbr.cfg`
|
|
|
|
Edit sbr.cfg with your favorite text editor. You'll probably want to use an IT
|
|
SBR as a template, such as
|
|
[sbr_sas9211-8i_itir.cfg](sample_sbr/sbr_sas9211-8i_itir.cfg). At the very
|
|
least you need to set `PCIPID` properly (`0x0072` for SAS2008-based cards) and
|
|
set `Interface` to `0x00` for IT/IR mode. You may want to add
|
|
`SASAddr = 0xYOUR_SAS_WWID` to make the SAS WWID persist in the SBR (I'm not
|
|
sure which firmwares use this, but I've seen it in some SBRs).
|
|
|
|
`# python3 sbrtool.py build sbr.cfg sbr_new.bin`
|
|
|
|
`# ./lsirec 0000:01:00.0 writesbr sbr_new.bin`
|
|
|
|
Write the new IT/IR mode SBR. This does not immediately take effect.
|
|
|
|
`# ./lsirec 0000:01:00.0 hostboot 2118it.bin`
|
|
|
|
Where 2118it.bin is your desired firmware. If all went well, you should see
|
|
something like this:
|
|
|
|
```
|
|
# ./lsirec 0000:01:00.0 hostboot 2118it.bin
|
|
Device in MPT mode
|
|
Resetting adapter in HCB mode...
|
|
Trying unlock in MPT mode...
|
|
Device in MPT mode
|
|
IOC is RESET
|
|
Setting up HCB...
|
|
HCDW virtual: 0x7fca79e00000
|
|
HCDW physical: 0x439a00000
|
|
Loading firmware...
|
|
Loaded 722708 bytes
|
|
Booting IOC...
|
|
IOC is READY
|
|
IOC Host Boot successful.
|
|
```
|
|
|
|
At this point the PCI VID/PID should've changed, but the kernel will not have
|
|
noticed. Check with lspci:
|
|
|
|
`# lspci -vns 0000:01:00.0 -A linux-sysfs | head -n 2`
|
|
|
|
`# lspci -vns 0000:01:00.0 -A intel-conf1 | head -n 2`
|
|
|
|
The first command should still show the old VID/PID, but the second one should
|
|
show the new (MPT mode) ones. To make the kernel notice:
|
|
|
|
`# ./lsirec 0000:01:00.0 rescan`
|
|
|
|
This removes the PCI device from the kernel and requests a rescan. At this point
|
|
the mpt3sas kernel driver should load. Check `dmesg` for any errors.
|
|
|
|
If all went well, you can use lsiutil to wipe Flash and flash your new firmware:
|
|
|
|
`# lsiutil -e`
|
|
|
|
Select your adapter.
|
|
|
|
`46. Upload FLASH section` → `5. Complete (all sections)`
|
|
|
|
Make a complete Flash backup to be safe.
|
|
|
|
`33. Erase non-volatile adapter storage` → `3. FLASH`, then also
|
|
`8. Persistent manufacturing config pages`
|
|
|
|
Wipe the whole Flash. This will take a while. Option number 3 excludes the
|
|
manufacturing config pages, so you need both.
|
|
|
|
`2. Download firmware (update the FLASH)`
|
|
|
|
Flash the new firmware. Optionally, use
|
|
`4. Download/erase BIOS and/or FCode (update the FLASH)` to flash the BIOS/EFI
|
|
module (not necessary if you're not booting from the adapter).
|
|
|
|
Exit lsiutil.
|
|
|
|
Finally, if all went well, reset into normal mode:
|
|
|
|
`# ./lsirec 0000:01:00.0 reset`
|
|
|
|
This might complain about IOC not becoming ready, but this is normal, as the
|
|
first boot takes longer. Use `./lsirec 0000:01:00.0 info` after a few seconds
|
|
and check for `IOC is READY`.
|
|
|
|
`# ./lsirec 0000:01:00.0 rescan`
|
|
|
|
If all went well, `dmesg` should show the driver loading again successfully.
|
|
Launch `lsiutil -e` again and use `18. Change SAS WWID` to update the WWID
|
|
if necessary, then `reset` and `rescan` again to make sure the kernel sees the
|
|
new WWID.
|
|
|
|
Enjoy your shiny new IT/IR-mode HBA.
|
|
|
|
## Disclaimer
|
|
|
|
This has barely been tested a couple of cards. Don't blame me if this bricks or
|
|
smokes your HBA.
|
|
|
|
DO NOT attempt to use this tool on non-SAS2x08 chipsets. It probably won't work
|
|
and may do horrible things. This tool deliberately does not check the VID/PID
|
|
so it can be used on cards with wacky SBRs, but that means it will happily
|
|
try to write the SBR into any random PCI device too.
|
|
|
|
I have tested this on an LSI SAS2108-based MegaRAID card (Fujitsu D2616) with
|
|
MegaRAID firmware and it successfully backed up the SBR, but the action
|
|
triggered a PCI error in syslog (though the controller kept working). Your
|
|
mileage may vary. I have not yet tried crossflashing it live to IT/IR mode.
|
|
|
|
## License
|
|
|
|
2-clause BSD. See the LICENSE file.
|