|
|
1.1 ! root 1: /* ! 2: * Copyright (C) 2010 Michael Brown <[email protected]>. ! 3: * ! 4: * This program is free software; you can redistribute it and/or ! 5: * modify it under the terms of the GNU General Public License as ! 6: * published by the Free Software Foundation; either version 2 of the ! 7: * License, or any later version. ! 8: * ! 9: * This program is distributed in the hope that it will be useful, but ! 10: * WITHOUT ANY WARRANTY; without even the implied warranty of ! 11: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ! 12: * General Public License for more details. ! 13: * ! 14: * You should have received a copy of the GNU General Public License ! 15: * along with this program; if not, write to the Free Software ! 16: * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. ! 17: */ ! 18: ! 19: FILE_LICENCE ( GPL2_OR_LATER ); ! 20: ! 21: #include <string.h> ! 22: #include <stdio.h> ! 23: #include <errno.h> ! 24: #include <ipxe/fc.h> ! 25: #include <ipxe/fcels.h> ! 26: #include <ipxe/monojob.h> ! 27: #include <usr/fcmgmt.h> ! 28: ! 29: /** @file ! 30: * ! 31: * Fibre Channel management ! 32: * ! 33: */ ! 34: ! 35: /** ! 36: * Print status of Fibre Channel port ! 37: * ! 38: * @v port Fibre Channel port ! 39: */ ! 40: void fcportstat ( struct fc_port *port ) { ! 41: printf ( "%s: %s id %s", port->name, fc_ntoa ( &port->port_wwn ), ! 42: fc_id_ntoa ( &port->port_id ) ); ! 43: printf ( " node %s\n [Link:", fc_ntoa ( &port->node_wwn ) ); ! 44: if ( fc_link_ok ( &port->link ) ) { ! 45: printf ( " up, %s", fc_ntoa ( &port->link_port_wwn ) ); ! 46: if ( ( port->flags & FC_PORT_HAS_FABRIC ) ) { ! 47: printf ( " fabric" ); ! 48: } else { ! 49: printf ( " id %s", ! 50: fc_id_ntoa ( &port->ptp_link_port_id ) ); ! 51: } ! 52: printf ( " node %s]\n", fc_ntoa ( &port->link_node_wwn ) ); ! 53: } else { ! 54: printf ( " down: %s]\n", strerror ( port->link.rc ) ); ! 55: } ! 56: } ! 57: ! 58: /** ! 59: * Print status of Fibre Channel peer ! 60: * ! 61: * @v peer Fibre Channel peer ! 62: */ ! 63: void fcpeerstat ( struct fc_peer *peer ) { ! 64: struct fc_ulp *ulp; ! 65: uint8_t *param; ! 66: unsigned int i; ! 67: ! 68: printf ( "%s:\n [Link:", fc_ntoa ( &peer->port_wwn ) ); ! 69: if ( fc_link_ok ( &peer->link ) ) { ! 70: printf ( " up, port %s id %s]\n", peer->port->name, ! 71: fc_id_ntoa ( &peer->port_id ) ); ! 72: } else { ! 73: printf ( " down: %s]\n", strerror ( peer->link.rc ) ); ! 74: } ! 75: ! 76: list_for_each_entry ( ulp, &peer->ulps, list ) { ! 77: printf ( " [Type %02x usage %d link:", ! 78: ulp->type, ulp->usage ); ! 79: if ( fc_link_ok ( &ulp->link ) ) { ! 80: printf ( " up, params" ); ! 81: param = ulp->param; ! 82: for ( i = 0 ; i < ulp->param_len ; i++ ) { ! 83: printf ( "%c%02x", ( ( i == 0 ) ? ' ' : ':' ), ! 84: param[i] ); ! 85: } ! 86: } else { ! 87: printf ( " down: %s", strerror ( ulp->link.rc ) ); ! 88: } ! 89: printf ( "]\n" ); ! 90: } ! 91: } ! 92: ! 93: /** ! 94: * Issue Fibre Channel ELS ! 95: * ! 96: * @v port Fibre Channel port ! 97: * @v peer_port_id Peer port ID ! 98: * @v handler ELS handler ! 99: * @ret rc Return status code ! 100: */ ! 101: int fcels ( struct fc_port *port, struct fc_port_id *peer_port_id, ! 102: struct fc_els_handler *handler ) { ! 103: int rc; ! 104: ! 105: /* Initiate ELS */ ! 106: printf ( "%s %s to %s...", ! 107: port->name, handler->name, fc_id_ntoa ( peer_port_id ) ); ! 108: if ( ( rc = fc_els_request ( &monojob, port, peer_port_id, ! 109: handler ) ) != 0 ) { ! 110: printf ( "%s\n", strerror ( rc ) ); ! 111: return rc; ! 112: } ! 113: ! 114: /* Wait for ELS to complete */ ! 115: return monojob_wait ( "" ); ! 116: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.