[sanboot] Extend the "keep-san" option to non-iSCSI SAN protocols
[people/peper/gpxe.git] / src / arch / i386 / interface / pcbios / ib_srpboot.c
1 #include <stdint.h>
2 #include <string.h>
3 #include <stdlib.h>
4 #include <stdio.h>
5 #include <errno.h>
6 #include <gpxe/sanboot.h>
7 #include <int13.h>
8 #include <gpxe/srp.h>
9 #include <gpxe/sbft.h>
10
11 FILE_LICENCE ( GPL2_OR_LATER );
12
13 static int ib_srpboot ( const char *root_path ) {
14         struct scsi_device *scsi;
15         struct int13_drive *drive;
16         int rc;
17
18         scsi = zalloc ( sizeof ( *scsi ) );
19         if ( ! scsi ) {
20                 rc = -ENOMEM;
21                 goto err_alloc_scsi;
22         }
23         drive = zalloc ( sizeof ( *drive ) );
24         if ( ! drive ) {
25                 rc = -ENOMEM;
26                 goto err_alloc_drive;
27         }
28
29         if ( ( rc = srp_attach ( scsi, root_path ) ) != 0 ) {
30                 printf ( "Could not attach IB_SRP device: %s\n",
31                          strerror ( rc ) );
32                 goto err_attach;
33         }
34         if ( ( rc = init_scsidev ( scsi ) ) != 0 ) {
35                 printf ( "Could not initialise IB_SRP device: %s\n",
36                          strerror ( rc ) );
37                 goto err_init;
38         }
39
40         drive->blockdev = &scsi->blockdev;
41
42         /* FIXME: ugly, ugly hack */
43         struct srp_device *srp =
44                 container_of ( scsi->backend, struct srp_device, refcnt );
45         sbft_fill_data ( srp );
46
47         register_int13_drive ( drive );
48         printf ( "Registered as BIOS drive %#02x\n", drive->drive );
49         printf ( "Booting from BIOS drive %#02x\n", drive->drive );
50         rc = int13_boot ( drive->drive );
51         printf ( "Boot failed\n" );
52
53         /* Leave drive registered, if instructed to do so */
54         if ( keep_san() )
55                 return rc;
56
57         printf ( "Unregistering BIOS drive %#02x\n", drive->drive );
58         unregister_int13_drive ( drive );
59
60  err_init:
61         srp_detach ( scsi );
62  err_attach:
63         free ( drive );
64  err_alloc_drive:
65         free ( scsi );
66  err_alloc_scsi:
67         return rc;
68 }
69
70 struct sanboot_protocol ib_srp_sanboot_protocol __sanboot_protocol = {
71         .prefix = "ib_srp:",
72         .boot = ib_srpboot,
73 };