Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/marcan/lsirec

LSI SAS2008/SAS2108 low-level recovery tool for Linux
https://github.com/marcan/lsirec

Last synced: about 1 month ago
JSON representation

LSI SAS2008/SAS2108 low-level recovery tool for Linux

Awesome Lists containing this project

README

        

## 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.