Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[infiniband] Add support for SRP over Infiniband
SRP is the SCSI RDMA Protocol. It allows for a method of SAN booting whereby the target is responsible for reading and writing data using Remote DMA directly to the initiator's memory. The software initiator merely sends and receives SCSI commands; it never has to touch the actual data.
- Loading branch information
Michael Brown
committed
Aug 10, 2009
1 parent
8de49af
commit 0c30dc6
Showing
9 changed files
with
1,960 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,63 @@ | ||
#include <stdint.h> | ||
#include <string.h> | ||
#include <stdlib.h> | ||
#include <stdio.h> | ||
#include <errno.h> | ||
#include <gpxe/sanboot.h> | ||
#include <int13.h> | ||
#include <gpxe/srp.h> | ||
|
||
FILE_LICENCE ( GPL2_OR_LATER ); | ||
|
||
static int ib_srpboot ( const char *root_path ) { | ||
struct scsi_device *scsi; | ||
struct int13_drive *drive; | ||
int rc; | ||
|
||
scsi = zalloc ( sizeof ( *scsi ) ); | ||
if ( ! scsi ) { | ||
rc = -ENOMEM; | ||
goto err_alloc_scsi; | ||
} | ||
drive = zalloc ( sizeof ( *drive ) ); | ||
if ( ! drive ) { | ||
rc = -ENOMEM; | ||
goto err_alloc_drive; | ||
} | ||
|
||
if ( ( rc = srp_attach ( scsi, root_path ) ) != 0 ) { | ||
printf ( "Could not attach IB_SRP device: %s\n", | ||
strerror ( rc ) ); | ||
goto err_attach; | ||
} | ||
if ( ( rc = init_scsidev ( scsi ) ) != 0 ) { | ||
printf ( "Could not initialise IB_SRP device: %s\n", | ||
strerror ( rc ) ); | ||
goto err_init; | ||
} | ||
|
||
drive->blockdev = &scsi->blockdev; | ||
|
||
register_int13_drive ( drive ); | ||
printf ( "Registered as BIOS drive %#02x\n", drive->drive ); | ||
printf ( "Booting from BIOS drive %#02x\n", drive->drive ); | ||
rc = int13_boot ( drive->drive ); | ||
printf ( "Boot failed\n" ); | ||
|
||
printf ( "Unregistering BIOS drive %#02x\n", drive->drive ); | ||
unregister_int13_drive ( drive ); | ||
|
||
err_init: | ||
srp_detach ( scsi ); | ||
err_attach: | ||
free ( drive ); | ||
err_alloc_drive: | ||
free ( scsi ); | ||
err_alloc_scsi: | ||
return rc; | ||
} | ||
|
||
struct sanboot_protocol ib_srp_sanboot_protocol __sanboot_protocol = { | ||
.prefix = "ib_srp:", | ||
.boot = ib_srpboot, | ||
}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.