79 lines · c
1/*2 * Copyright (c) 2014 Intel Corporation. All rights reserved.3 *4 * This software is available to you under a choice of one of two5 * licenses. You may choose to be licensed under the terms of the GNU6 * General Public License (GPL) Version 2, available from the file7 * COPYING in the main directory of this source tree, or the8 * OpenIB.org BSD license below:9 *10 * Redistribution and use in source and binary forms, with or11 * without modification, are permitted provided that the following12 * conditions are met:13 *14 * - Redistributions of source code must retain the above15 * copyright notice, this list of conditions and the following16 * disclaimer.17 *18 * - Redistributions in binary form must reproduce the above19 * copyright notice, this list of conditions and the following20 * disclaimer in the documentation and/or other materials21 * provided with the distribution.22 *23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,24 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND26 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS27 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN28 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE30 * SOFTWARE.31 *32 */33 34#ifndef __OPA_SMI_H_35#define __OPA_SMI_H_36 37#include <rdma/ib_smi.h>38#include <rdma/opa_smi.h>39 40#include "smi.h"41 42enum smi_action opa_smi_handle_dr_smp_recv(struct opa_smp *smp, bool is_switch,43 u32 port_num, int phys_port_cnt);44int opa_smi_get_fwd_port(struct opa_smp *smp);45extern enum smi_forward_action opa_smi_check_forward_dr_smp(struct opa_smp *smp);46extern enum smi_action opa_smi_handle_dr_smp_send(struct opa_smp *smp,47 bool is_switch, u32 port_num);48 49/*50 * Return IB_SMI_HANDLE if the SMP should be handled by the local SMA/SM51 * via process_mad52 */53static inline enum smi_action opa_smi_check_local_smp(struct opa_smp *smp,54 struct ib_device *device)55{56 /* C14-9:3 -- We're at the end of the DR segment of path */57 /* C14-9:4 -- Hop Pointer = Hop Count + 1 -> give to SMA/SM */58 return (device->ops.process_mad &&59 !opa_get_smp_direction(smp) &&60 (smp->hop_ptr == smp->hop_cnt + 1)) ?61 IB_SMI_HANDLE : IB_SMI_DISCARD;62}63 64/*65 * Return IB_SMI_HANDLE if the SMP should be handled by the local SMA/SM66 * via process_mad67 */68static inline enum smi_action opa_smi_check_local_returning_smp(struct opa_smp *smp,69 struct ib_device *device)70{71 /* C14-13:3 -- We're at the end of the DR segment of path */72 /* C14-13:4 -- Hop Pointer == 0 -> give to SM */73 return (device->ops.process_mad &&74 opa_get_smp_direction(smp) &&75 !smp->hop_ptr) ? IB_SMI_HANDLE : IB_SMI_DISCARD;76}77 78#endif /* __OPA_SMI_H_ */79