176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* 276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Copyright (C) 2009 Michael Brown <mbrown@fensystems.co.uk>. 376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This program is free software; you can redistribute it and/or 576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * modify it under the terms of the GNU General Public License as 676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * published by the Free Software Foundation; either version 2 of the 776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * License, or any later version. 876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * This program is distributed in the hope that it will be useful, but 1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * WITHOUT ANY WARRANTY; without even the implied warranty of 1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * General Public License for more details. 1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * You should have received a copy of the GNU General Public License 1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * along with this program; if not, write to the Free Software 1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1976d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanFILE_LICENCE ( GPL2_OR_LATER ); 2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdint.h> 2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdlib.h> 2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <string.h> 2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <errno.h> 2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdio.h> 2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <unistd.h> 2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <byteswap.h> 2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <gpxe/settings.h> 2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <gpxe/infiniband.h> 3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <gpxe/iobuf.h> 3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <gpxe/ib_mi.h> 3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <gpxe/ib_sma.h> 3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @file 3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Infiniband Subnet Management Agent 3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Node information 4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v ibdev Infiniband device 4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v mi Management interface 4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v mad Received MAD 4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v av Source address vector 4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic void ib_sma_node_info ( struct ib_device *ibdev, 5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct ib_mad_interface *mi, 5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman union ib_mad *mad, 5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct ib_address_vector *av ) { 5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct ib_node_info *node_info = &mad->smp.smp_data.node_info; 5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int rc; 5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Fill in information */ 5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman memset ( node_info, 0, sizeof ( *node_info ) ); 5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman node_info->base_version = IB_MGMT_BASE_VERSION; 5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman node_info->class_version = IB_SMP_CLASS_VERSION; 6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman node_info->node_type = IB_NODE_TYPE_HCA; 6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman node_info->num_ports = ib_get_hca_info ( ibdev, &node_info->sys_guid ); 6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman memcpy ( &node_info->node_guid, &node_info->sys_guid, 6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sizeof ( node_info->node_guid ) ); 6476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman memcpy ( &node_info->port_guid, &ibdev->gid.u.half[1], 6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sizeof ( node_info->port_guid ) ); 6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman node_info->partition_cap = htons ( 1 ); 6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman node_info->local_port_num = ibdev->port; 6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Send GetResponse */ 7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mad->hdr.method = IB_MGMT_METHOD_GET_RESP; 7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ( ( rc = ib_mi_send ( ibdev, mi, mad, av ) ) != 0 ) { 7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman DBGC ( mi, "SMA %p could not send NodeInfo GetResponse: %s\n", 7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mi, strerror ( rc ) ); 7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return; 7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 7676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Node description 8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v ibdev Infiniband device 8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v mi Management interface 8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v mad Received MAD 8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v av Source address vector 8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic void ib_sma_node_desc ( struct ib_device *ibdev, 8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct ib_mad_interface *mi, 8876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman union ib_mad *mad, 8976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct ib_address_vector *av ) { 9076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct ib_node_desc *node_desc = &mad->smp.smp_data.node_desc; 9176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct ib_gid_half guid; 9276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman char hostname[ sizeof ( node_desc->node_string ) ]; 9376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int hostname_len; 9476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int rc; 9576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 9676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Fill in information */ 9776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman memset ( node_desc, 0, sizeof ( *node_desc ) ); 9876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ib_get_hca_info ( ibdev, &guid ); 9976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hostname_len = fetch_string_setting ( NULL, &hostname_setting, 10076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hostname, sizeof ( hostname ) ); 10176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman snprintf ( node_desc->node_string, sizeof ( node_desc->node_string ), 10276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "gPXE %s%s%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x (%s)", 10376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman hostname, ( ( hostname_len >= 0 ) ? " " : "" ), 10476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman guid.u.bytes[0], guid.u.bytes[1], guid.u.bytes[2], 10576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman guid.u.bytes[3], guid.u.bytes[4], guid.u.bytes[5], 10676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman guid.u.bytes[6], guid.u.bytes[7], ibdev->dev->name ); 10776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 10876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Send GetResponse */ 10976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mad->hdr.method = IB_MGMT_METHOD_GET_RESP; 11076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ( ( rc = ib_mi_send ( ibdev, mi, mad, av ) ) != 0 ) { 11176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman DBGC ( mi, "SMA %p could not send NodeDesc GetResponse: %s\n", 11276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mi, strerror ( rc ) ); 11376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return; 11476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 11576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 11676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 11776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 11876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * GUID information 11976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 12076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v ibdev Infiniband device 12176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v mi Management interface 12276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v mad Received MAD 12376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v av Source address vector 12476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 12576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic void ib_sma_guid_info ( struct ib_device *ibdev, 12676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct ib_mad_interface *mi, 12776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman union ib_mad *mad, 12876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct ib_address_vector *av ) { 12976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct ib_guid_info *guid_info = &mad->smp.smp_data.guid_info; 13076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int rc; 13176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 13276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Fill in information */ 13376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman memset ( guid_info, 0, sizeof ( *guid_info ) ); 13476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman memcpy ( guid_info->guid[0], &ibdev->gid.u.half[1], 13576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sizeof ( guid_info->guid[0] ) ); 13676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 13776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Send GetResponse */ 13876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mad->hdr.method = IB_MGMT_METHOD_GET_RESP; 13976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ( ( rc = ib_mi_send ( ibdev, mi, mad, av ) ) != 0 ) { 14076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman DBGC ( mi, "SMA %p could not send GuidInfo GetResponse: %s\n", 14176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mi, strerror ( rc ) ); 14276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return; 14376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 14476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 14576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 14676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 14776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Set port information 14876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 14976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v ibdev Infiniband device 15076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v mi Management interface 15176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v mad Received MAD 15276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @ret rc Return status code 15376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 15476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic int ib_sma_set_port_info ( struct ib_device *ibdev, 15576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct ib_mad_interface *mi, 15676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman union ib_mad *mad ) { 15776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman const struct ib_port_info *port_info = &mad->smp.smp_data.port_info; 15876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman unsigned int link_width_enabled; 15976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman unsigned int link_speed_enabled; 16076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int rc; 16176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 16276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Set parameters */ 16376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman memcpy ( &ibdev->gid.u.half[0], port_info->gid_prefix, 16476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sizeof ( ibdev->gid.u.half[0] ) ); 16576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ibdev->lid = ntohs ( port_info->lid ); 16676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ibdev->sm_lid = ntohs ( port_info->mastersm_lid ); 16776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ( ( link_width_enabled = port_info->link_width_enabled ) ) 16876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ibdev->link_width_enabled = link_width_enabled; 16976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ( ( link_speed_enabled = 17076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ( port_info->link_speed_active__link_speed_enabled & 0xf ) ) ) 17176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ibdev->link_speed_enabled = link_speed_enabled; 17276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ibdev->sm_sl = ( port_info->neighbour_mtu__mastersm_sl & 0xf ); 17376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman DBGC ( mi, "SMA %p set LID %04x SMLID %04x link width %02x speed " 17476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "%02x\n", mi, ibdev->lid, ibdev->sm_lid, 17576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ibdev->link_width_enabled, ibdev->link_speed_enabled ); 17676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 17776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Update parameters on device */ 17876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ( ( rc = ib_set_port_info ( ibdev, mad ) ) != 0 ) { 17976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman DBGC ( mi, "SMA %p could not set port information: %s\n", 18076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mi, strerror ( rc ) ); 18176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return rc; 18276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 18376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 18476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 0; 18576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 18676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 18776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 18876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Port information 18976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 19076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v ibdev Infiniband device 19176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v mi Management interface 19276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v mad Received MAD 19376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v av Source address vector 19476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 19576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic void ib_sma_port_info ( struct ib_device *ibdev, 19676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct ib_mad_interface *mi, 19776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman union ib_mad *mad, 19876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct ib_address_vector *av ) { 19976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct ib_port_info *port_info = &mad->smp.smp_data.port_info; 20076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int rc; 20176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 20276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Set parameters if applicable */ 20376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ( mad->hdr.method == IB_MGMT_METHOD_SET ) { 20476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ( ( rc = ib_sma_set_port_info ( ibdev, mi, mad ) ) != 0 ) { 20576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mad->hdr.status = 20676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman htons ( IB_MGMT_STATUS_UNSUPPORTED_METHOD_ATTR ); 20776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Fall through to generate GetResponse */ 20876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 20976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 21076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 21176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Fill in information */ 21276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman memset ( port_info, 0, sizeof ( *port_info ) ); 21376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman memcpy ( port_info->gid_prefix, &ibdev->gid.u.half[0], 21476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman sizeof ( port_info->gid_prefix ) ); 21576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman port_info->lid = ntohs ( ibdev->lid ); 21676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman port_info->mastersm_lid = ntohs ( ibdev->sm_lid ); 21776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman port_info->local_port_num = ibdev->port; 21876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman port_info->link_width_enabled = ibdev->link_width_enabled; 21976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman port_info->link_width_supported = ibdev->link_width_supported; 22076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman port_info->link_width_active = ibdev->link_width_active; 22176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman port_info->link_speed_supported__port_state = 22276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ( ( ibdev->link_speed_supported << 4 ) | ibdev->port_state ); 22376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman port_info->port_phys_state__link_down_def_state = 22476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ( ( IB_PORT_PHYS_STATE_POLLING << 4 ) | 22576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman IB_PORT_PHYS_STATE_POLLING ); 22676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman port_info->link_speed_active__link_speed_enabled = 22776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ( ( ibdev->link_speed_active << 4 ) | 22876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ibdev->link_speed_enabled ); 22976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman port_info->neighbour_mtu__mastersm_sl = 23076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ( ( IB_MTU_2048 << 4 ) | ibdev->sm_sl ); 23176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman port_info->vl_cap__init_type = ( IB_VL_0 << 4 ); 23276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman port_info->init_type_reply__mtu_cap = IB_MTU_2048; 23376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman port_info->operational_vls__enforcement = ( IB_VL_0 << 4 ); 23476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman port_info->guid_cap = 1; 23576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 23676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Send GetResponse */ 23776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mad->hdr.method = IB_MGMT_METHOD_GET_RESP; 23876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ( ( rc = ib_mi_send ( ibdev, mi, mad, av ) ) != 0 ) { 23976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman DBGC ( mi, "SMA %p could not send PortInfo GetResponse: %s\n", 24076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mi, strerror ( rc ) ); 24176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return; 24276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 24376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 24476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 24576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 24676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Set partition key table 24776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 24876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v ibdev Infiniband device 24976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v mi Management interface 25076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v mad Received MAD 25176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @ret rc Return status code 25276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 25376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic int ib_sma_set_pkey_table ( struct ib_device *ibdev, 25476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct ib_mad_interface *mi, 25576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman union ib_mad *mad ) { 25676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct ib_pkey_table *pkey_table = &mad->smp.smp_data.pkey_table; 25776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int rc; 25876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 25976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Set parameters */ 26076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman ibdev->pkey = ntohs ( pkey_table->pkey[0] ); 26176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman DBGC ( mi, "SMA %p set pkey %04x\n", mi, ibdev->pkey ); 26276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 26376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Update parameters on device */ 26476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ( ( rc = ib_set_pkey_table ( ibdev, mad ) ) != 0 ) { 26576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman DBGC ( mi, "SMA %p could not set pkey table: %s\n", 26676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mi, strerror ( rc ) ); 26776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return rc; 26876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 26976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 27076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 0; 27176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 27276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 27376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 27476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Partition key table 27576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 27676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v ibdev Infiniband device 27776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v mi Management interface 27876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v mad Received MAD 27976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v av Source address vector 28076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 28176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic void ib_sma_pkey_table ( struct ib_device *ibdev, 28276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct ib_mad_interface *mi, 28376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman union ib_mad *mad, 28476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct ib_address_vector *av ) { 28576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct ib_pkey_table *pkey_table = &mad->smp.smp_data.pkey_table; 28676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman int rc; 28776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 28876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Set parameters, if applicable */ 28976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ( mad->hdr.method == IB_MGMT_METHOD_SET ) { 29076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ( ( rc = ib_sma_set_pkey_table ( ibdev, mi, mad ) ) != 0 ) { 29176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mad->hdr.status = 29276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman htons ( IB_MGMT_STATUS_UNSUPPORTED_METHOD_ATTR ); 29376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Fall through to generate GetResponse */ 29476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 29576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 29676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 29776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Fill in information */ 29876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mad->hdr.method = IB_MGMT_METHOD_GET_RESP; 29976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman memset ( pkey_table, 0, sizeof ( *pkey_table ) ); 30076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman pkey_table->pkey[0] = htons ( ibdev->pkey ); 30176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 30276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Send GetResponse */ 30376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mad->hdr.method = IB_MGMT_METHOD_GET_RESP; 30476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman if ( ( rc = ib_mi_send ( ibdev, mi, mad, av ) ) != 0 ) { 30576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman DBGC ( mi, "SMA %p could not send PKeyTable GetResponse: %s\n", 30676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman mi, strerror ( rc ) ); 30776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return; 30876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman } 30976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 31076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 31176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** Subnet management agent */ 31276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstruct ib_mad_agent ib_sma_agent[] __ib_mad_agent = { 31376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 31476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman .mgmt_class = IB_MGMT_CLASS_SUBN_LID_ROUTED, 31576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman .class_version = IB_SMP_CLASS_VERSION, 31676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman .attr_id = htons ( IB_SMP_ATTR_NODE_INFO ), 31776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman .handle = ib_sma_node_info, 31876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman }, 31976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 32076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman .mgmt_class = IB_MGMT_CLASS_SUBN_LID_ROUTED, 32176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman .class_version = IB_SMP_CLASS_VERSION, 32276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman .attr_id = htons ( IB_SMP_ATTR_NODE_DESC ), 32376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman .handle = ib_sma_node_desc, 32476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman }, 32576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 32676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman .mgmt_class = IB_MGMT_CLASS_SUBN_LID_ROUTED, 32776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman .class_version = IB_SMP_CLASS_VERSION, 32876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman .attr_id = htons ( IB_SMP_ATTR_GUID_INFO ), 32976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman .handle = ib_sma_guid_info, 33076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman }, 33176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 33276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman .mgmt_class = IB_MGMT_CLASS_SUBN_LID_ROUTED, 33376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman .class_version = IB_SMP_CLASS_VERSION, 33476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman .attr_id = htons ( IB_SMP_ATTR_PORT_INFO ), 33576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman .handle = ib_sma_port_info, 33676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman }, 33776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman { 33876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman .mgmt_class = IB_MGMT_CLASS_SUBN_LID_ROUTED, 33976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman .class_version = IB_SMP_CLASS_VERSION, 34076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman .attr_id = htons ( IB_SMP_ATTR_PKEY_TABLE ), 34176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman .handle = ib_sma_pkey_table, 34276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman }, 34376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman}; 34476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 34576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 34676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Create subnet management agent and interface 34776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 34876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v ibdev Infiniband device 34976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v mi Management interface 35076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @ret rc Return status code 35176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 35276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanint ib_create_sma ( struct ib_device *ibdev, struct ib_mad_interface *mi ) { 35376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 35476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Nothing to do */ 35576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman DBGC ( ibdev, "IBDEV %p SMA using SMI %p\n", ibdev, mi ); 35676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 35776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return 0; 35876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 35976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 36076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/** 36176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Destroy subnet management agent and interface 36276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * 36376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v ibdev Infiniband device 36476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * @v mi Management interface 36576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */ 36676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanvoid ib_destroy_sma ( struct ib_device *ibdev __unused, 36776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman struct ib_mad_interface *mi __unused ) { 36876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman /* Nothing to do */ 36976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 370