18c2ecf20Sopenharmony_ci/* 28c2ecf20Sopenharmony_ci * Copyright (c) 2012 Intel Corporation. All rights reserved. 38c2ecf20Sopenharmony_ci * Copyright (c) 2006 - 2012 QLogic Corporation. All rights reserved. 48c2ecf20Sopenharmony_ci * Copyright (c) 2005, 2006 PathScale, Inc. All rights reserved. 58c2ecf20Sopenharmony_ci * 68c2ecf20Sopenharmony_ci * This software is available to you under a choice of one of two 78c2ecf20Sopenharmony_ci * licenses. You may choose to be licensed under the terms of the GNU 88c2ecf20Sopenharmony_ci * General Public License (GPL) Version 2, available from the file 98c2ecf20Sopenharmony_ci * COPYING in the main directory of this source tree, or the 108c2ecf20Sopenharmony_ci * OpenIB.org BSD license below: 118c2ecf20Sopenharmony_ci * 128c2ecf20Sopenharmony_ci * Redistribution and use in source and binary forms, with or 138c2ecf20Sopenharmony_ci * without modification, are permitted provided that the following 148c2ecf20Sopenharmony_ci * conditions are met: 158c2ecf20Sopenharmony_ci * 168c2ecf20Sopenharmony_ci * - Redistributions of source code must retain the above 178c2ecf20Sopenharmony_ci * copyright notice, this list of conditions and the following 188c2ecf20Sopenharmony_ci * disclaimer. 198c2ecf20Sopenharmony_ci * 208c2ecf20Sopenharmony_ci * - Redistributions in binary form must reproduce the above 218c2ecf20Sopenharmony_ci * copyright notice, this list of conditions and the following 228c2ecf20Sopenharmony_ci * disclaimer in the documentation and/or other materials 238c2ecf20Sopenharmony_ci * provided with the distribution. 248c2ecf20Sopenharmony_ci * 258c2ecf20Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 268c2ecf20Sopenharmony_ci * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 278c2ecf20Sopenharmony_ci * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 288c2ecf20Sopenharmony_ci * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 298c2ecf20Sopenharmony_ci * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 308c2ecf20Sopenharmony_ci * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 318c2ecf20Sopenharmony_ci * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 328c2ecf20Sopenharmony_ci * SOFTWARE. 338c2ecf20Sopenharmony_ci */ 348c2ecf20Sopenharmony_ci#ifndef _QIB_MAD_H 358c2ecf20Sopenharmony_ci#define _QIB_MAD_H 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_ci#include <rdma/ib_pma.h> 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ci#define IB_SMP_UNSUP_VERSION \ 408c2ecf20Sopenharmony_cicpu_to_be16(IB_MGMT_MAD_STATUS_BAD_VERSION) 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci#define IB_SMP_UNSUP_METHOD \ 438c2ecf20Sopenharmony_cicpu_to_be16(IB_MGMT_MAD_STATUS_UNSUPPORTED_METHOD) 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_ci#define IB_SMP_UNSUP_METH_ATTR \ 468c2ecf20Sopenharmony_cicpu_to_be16(IB_MGMT_MAD_STATUS_UNSUPPORTED_METHOD_ATTRIB) 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_ci#define IB_SMP_INVALID_FIELD \ 498c2ecf20Sopenharmony_cicpu_to_be16(IB_MGMT_MAD_STATUS_INVALID_ATTRIB_VALUE) 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_ci#define IB_VLARB_LOWPRI_0_31 1 528c2ecf20Sopenharmony_ci#define IB_VLARB_LOWPRI_32_63 2 538c2ecf20Sopenharmony_ci#define IB_VLARB_HIGHPRI_0_31 3 548c2ecf20Sopenharmony_ci#define IB_VLARB_HIGHPRI_32_63 4 558c2ecf20Sopenharmony_ci 568c2ecf20Sopenharmony_ci#define IB_PMA_PORT_COUNTERS_CONG cpu_to_be16(0xFF00) 578c2ecf20Sopenharmony_ci 588c2ecf20Sopenharmony_cistruct ib_pma_portcounters_cong { 598c2ecf20Sopenharmony_ci u8 reserved; 608c2ecf20Sopenharmony_ci u8 reserved1; 618c2ecf20Sopenharmony_ci __be16 port_check_rate; 628c2ecf20Sopenharmony_ci __be16 symbol_error_counter; 638c2ecf20Sopenharmony_ci u8 link_error_recovery_counter; 648c2ecf20Sopenharmony_ci u8 link_downed_counter; 658c2ecf20Sopenharmony_ci __be16 port_rcv_errors; 668c2ecf20Sopenharmony_ci __be16 port_rcv_remphys_errors; 678c2ecf20Sopenharmony_ci __be16 port_rcv_switch_relay_errors; 688c2ecf20Sopenharmony_ci __be16 port_xmit_discards; 698c2ecf20Sopenharmony_ci u8 port_xmit_constraint_errors; 708c2ecf20Sopenharmony_ci u8 port_rcv_constraint_errors; 718c2ecf20Sopenharmony_ci u8 reserved2; 728c2ecf20Sopenharmony_ci u8 link_overrun_errors; /* LocalLink: 7:4, BufferOverrun: 3:0 */ 738c2ecf20Sopenharmony_ci __be16 reserved3; 748c2ecf20Sopenharmony_ci __be16 vl15_dropped; 758c2ecf20Sopenharmony_ci __be64 port_xmit_data; 768c2ecf20Sopenharmony_ci __be64 port_rcv_data; 778c2ecf20Sopenharmony_ci __be64 port_xmit_packets; 788c2ecf20Sopenharmony_ci __be64 port_rcv_packets; 798c2ecf20Sopenharmony_ci __be64 port_xmit_wait; 808c2ecf20Sopenharmony_ci __be64 port_adr_events; 818c2ecf20Sopenharmony_ci} __packed; 828c2ecf20Sopenharmony_ci 838c2ecf20Sopenharmony_ci#define IB_PMA_CONG_HW_CONTROL_TIMER 0x00 848c2ecf20Sopenharmony_ci#define IB_PMA_CONG_HW_CONTROL_SAMPLE 0x01 858c2ecf20Sopenharmony_ci 868c2ecf20Sopenharmony_ci#define QIB_XMIT_RATE_UNSUPPORTED 0x0 878c2ecf20Sopenharmony_ci#define QIB_XMIT_RATE_PICO 0x7 888c2ecf20Sopenharmony_ci/* number of 4nsec cycles equaling 2secs */ 898c2ecf20Sopenharmony_ci#define QIB_CONG_TIMER_PSINTERVAL 0x1DCD64EC 908c2ecf20Sopenharmony_ci 918c2ecf20Sopenharmony_ci#define IB_PMA_SEL_CONG_ALL 0x01 928c2ecf20Sopenharmony_ci#define IB_PMA_SEL_CONG_PORT_DATA 0x02 938c2ecf20Sopenharmony_ci#define IB_PMA_SEL_CONG_XMIT 0x04 948c2ecf20Sopenharmony_ci#define IB_PMA_SEL_CONG_ROUTING 0x08 958c2ecf20Sopenharmony_ci 968c2ecf20Sopenharmony_ci/* 978c2ecf20Sopenharmony_ci * Congestion control class attributes 988c2ecf20Sopenharmony_ci */ 998c2ecf20Sopenharmony_ci#define IB_CC_ATTR_CLASSPORTINFO cpu_to_be16(0x0001) 1008c2ecf20Sopenharmony_ci#define IB_CC_ATTR_NOTICE cpu_to_be16(0x0002) 1018c2ecf20Sopenharmony_ci#define IB_CC_ATTR_CONGESTION_INFO cpu_to_be16(0x0011) 1028c2ecf20Sopenharmony_ci#define IB_CC_ATTR_CONGESTION_KEY_INFO cpu_to_be16(0x0012) 1038c2ecf20Sopenharmony_ci#define IB_CC_ATTR_CONGESTION_LOG cpu_to_be16(0x0013) 1048c2ecf20Sopenharmony_ci#define IB_CC_ATTR_SWITCH_CONGESTION_SETTING cpu_to_be16(0x0014) 1058c2ecf20Sopenharmony_ci#define IB_CC_ATTR_SWITCH_PORT_CONGESTION_SETTING cpu_to_be16(0x0015) 1068c2ecf20Sopenharmony_ci#define IB_CC_ATTR_CA_CONGESTION_SETTING cpu_to_be16(0x0016) 1078c2ecf20Sopenharmony_ci#define IB_CC_ATTR_CONGESTION_CONTROL_TABLE cpu_to_be16(0x0017) 1088c2ecf20Sopenharmony_ci#define IB_CC_ATTR_TIME_STAMP cpu_to_be16(0x0018) 1098c2ecf20Sopenharmony_ci 1108c2ecf20Sopenharmony_ci/* generalizations for threshold values */ 1118c2ecf20Sopenharmony_ci#define IB_CC_THRESHOLD_NONE 0x0 1128c2ecf20Sopenharmony_ci#define IB_CC_THRESHOLD_MIN 0x1 1138c2ecf20Sopenharmony_ci#define IB_CC_THRESHOLD_MAX 0xf 1148c2ecf20Sopenharmony_ci 1158c2ecf20Sopenharmony_ci/* CCA MAD header constants */ 1168c2ecf20Sopenharmony_ci#define IB_CC_MAD_LOGDATA_LEN 32 1178c2ecf20Sopenharmony_ci#define IB_CC_MAD_MGMTDATA_LEN 192 1188c2ecf20Sopenharmony_ci 1198c2ecf20Sopenharmony_cistruct ib_cc_mad { 1208c2ecf20Sopenharmony_ci u8 base_version; 1218c2ecf20Sopenharmony_ci u8 mgmt_class; 1228c2ecf20Sopenharmony_ci u8 class_version; 1238c2ecf20Sopenharmony_ci u8 method; 1248c2ecf20Sopenharmony_ci __be16 status; 1258c2ecf20Sopenharmony_ci __be16 class_specific; 1268c2ecf20Sopenharmony_ci __be64 tid; 1278c2ecf20Sopenharmony_ci __be16 attr_id; 1288c2ecf20Sopenharmony_ci __be16 resv; 1298c2ecf20Sopenharmony_ci __be32 attr_mod; 1308c2ecf20Sopenharmony_ci __be64 cckey; 1318c2ecf20Sopenharmony_ci 1328c2ecf20Sopenharmony_ci /* For CongestionLog attribute only */ 1338c2ecf20Sopenharmony_ci u8 log_data[IB_CC_MAD_LOGDATA_LEN]; 1348c2ecf20Sopenharmony_ci 1358c2ecf20Sopenharmony_ci u8 mgmt_data[IB_CC_MAD_MGMTDATA_LEN]; 1368c2ecf20Sopenharmony_ci} __packed; 1378c2ecf20Sopenharmony_ci 1388c2ecf20Sopenharmony_ci/* 1398c2ecf20Sopenharmony_ci * Congestion Control class portinfo capability mask bits 1408c2ecf20Sopenharmony_ci */ 1418c2ecf20Sopenharmony_ci#define IB_CC_CPI_CM_TRAP_GEN cpu_to_be16(1 << 0) 1428c2ecf20Sopenharmony_ci#define IB_CC_CPI_CM_GET_SET_NOTICE cpu_to_be16(1 << 1) 1438c2ecf20Sopenharmony_ci#define IB_CC_CPI_CM_CAP2 cpu_to_be16(1 << 2) 1448c2ecf20Sopenharmony_ci#define IB_CC_CPI_CM_ENHANCEDPORT0_CC cpu_to_be16(1 << 8) 1458c2ecf20Sopenharmony_ci 1468c2ecf20Sopenharmony_cistruct ib_cc_classportinfo_attr { 1478c2ecf20Sopenharmony_ci u8 base_version; 1488c2ecf20Sopenharmony_ci u8 class_version; 1498c2ecf20Sopenharmony_ci __be16 cap_mask; 1508c2ecf20Sopenharmony_ci u8 reserved[3]; 1518c2ecf20Sopenharmony_ci u8 resp_time_value; /* only lower 5 bits */ 1528c2ecf20Sopenharmony_ci union ib_gid redirect_gid; 1538c2ecf20Sopenharmony_ci __be32 redirect_tc_sl_fl; /* 8, 4, 20 bits respectively */ 1548c2ecf20Sopenharmony_ci __be16 redirect_lid; 1558c2ecf20Sopenharmony_ci __be16 redirect_pkey; 1568c2ecf20Sopenharmony_ci __be32 redirect_qp; /* only lower 24 bits */ 1578c2ecf20Sopenharmony_ci __be32 redirect_qkey; 1588c2ecf20Sopenharmony_ci union ib_gid trap_gid; 1598c2ecf20Sopenharmony_ci __be32 trap_tc_sl_fl; /* 8, 4, 20 bits respectively */ 1608c2ecf20Sopenharmony_ci __be16 trap_lid; 1618c2ecf20Sopenharmony_ci __be16 trap_pkey; 1628c2ecf20Sopenharmony_ci __be32 trap_hl_qp; /* 8, 24 bits respectively */ 1638c2ecf20Sopenharmony_ci __be32 trap_qkey; 1648c2ecf20Sopenharmony_ci} __packed; 1658c2ecf20Sopenharmony_ci 1668c2ecf20Sopenharmony_ci/* Congestion control traps */ 1678c2ecf20Sopenharmony_ci#define IB_CC_TRAP_KEY_VIOLATION 0x0000 1688c2ecf20Sopenharmony_ci 1698c2ecf20Sopenharmony_cistruct ib_cc_trap_key_violation_attr { 1708c2ecf20Sopenharmony_ci __be16 source_lid; 1718c2ecf20Sopenharmony_ci u8 method; 1728c2ecf20Sopenharmony_ci u8 reserved1; 1738c2ecf20Sopenharmony_ci __be16 attrib_id; 1748c2ecf20Sopenharmony_ci __be32 attrib_mod; 1758c2ecf20Sopenharmony_ci __be32 qp; 1768c2ecf20Sopenharmony_ci __be64 cckey; 1778c2ecf20Sopenharmony_ci u8 sgid[16]; 1788c2ecf20Sopenharmony_ci u8 padding[24]; 1798c2ecf20Sopenharmony_ci} __packed; 1808c2ecf20Sopenharmony_ci 1818c2ecf20Sopenharmony_ci/* Congestion info flags */ 1828c2ecf20Sopenharmony_ci#define IB_CC_CI_FLAGS_CREDIT_STARVATION 0x1 1838c2ecf20Sopenharmony_ci#define IB_CC_TABLE_CAP_DEFAULT 31 1848c2ecf20Sopenharmony_ci 1858c2ecf20Sopenharmony_cistruct ib_cc_info_attr { 1868c2ecf20Sopenharmony_ci __be16 congestion_info; 1878c2ecf20Sopenharmony_ci u8 control_table_cap; /* Multiple of 64 entry unit CCTs */ 1888c2ecf20Sopenharmony_ci} __packed; 1898c2ecf20Sopenharmony_ci 1908c2ecf20Sopenharmony_cistruct ib_cc_key_info_attr { 1918c2ecf20Sopenharmony_ci __be64 cckey; 1928c2ecf20Sopenharmony_ci u8 protect; 1938c2ecf20Sopenharmony_ci __be16 lease_period; 1948c2ecf20Sopenharmony_ci __be16 violations; 1958c2ecf20Sopenharmony_ci} __packed; 1968c2ecf20Sopenharmony_ci 1978c2ecf20Sopenharmony_ci#define IB_CC_CL_CA_LOGEVENTS_LEN 208 1988c2ecf20Sopenharmony_ci 1998c2ecf20Sopenharmony_cistruct ib_cc_log_attr { 2008c2ecf20Sopenharmony_ci u8 log_type; 2018c2ecf20Sopenharmony_ci u8 congestion_flags; 2028c2ecf20Sopenharmony_ci __be16 threshold_event_counter; 2038c2ecf20Sopenharmony_ci __be16 threshold_congestion_event_map; 2048c2ecf20Sopenharmony_ci __be16 current_time_stamp; 2058c2ecf20Sopenharmony_ci u8 log_events[IB_CC_CL_CA_LOGEVENTS_LEN]; 2068c2ecf20Sopenharmony_ci} __packed; 2078c2ecf20Sopenharmony_ci 2088c2ecf20Sopenharmony_ci#define IB_CC_CLEC_SERVICETYPE_RC 0x0 2098c2ecf20Sopenharmony_ci#define IB_CC_CLEC_SERVICETYPE_UC 0x1 2108c2ecf20Sopenharmony_ci#define IB_CC_CLEC_SERVICETYPE_RD 0x2 2118c2ecf20Sopenharmony_ci#define IB_CC_CLEC_SERVICETYPE_UD 0x3 2128c2ecf20Sopenharmony_ci 2138c2ecf20Sopenharmony_cistruct ib_cc_log_event { 2148c2ecf20Sopenharmony_ci u8 local_qp_cn_entry; 2158c2ecf20Sopenharmony_ci u8 remote_qp_number_cn_entry[3]; 2168c2ecf20Sopenharmony_ci u8 sl_cn_entry:4; 2178c2ecf20Sopenharmony_ci u8 service_type_cn_entry:4; 2188c2ecf20Sopenharmony_ci __be32 remote_lid_cn_entry; 2198c2ecf20Sopenharmony_ci __be32 timestamp_cn_entry; 2208c2ecf20Sopenharmony_ci} __packed; 2218c2ecf20Sopenharmony_ci 2228c2ecf20Sopenharmony_ci/* Sixteen congestion entries */ 2238c2ecf20Sopenharmony_ci#define IB_CC_CCS_ENTRIES 16 2248c2ecf20Sopenharmony_ci 2258c2ecf20Sopenharmony_ci/* Port control flags */ 2268c2ecf20Sopenharmony_ci#define IB_CC_CCS_PC_SL_BASED 0x01 2278c2ecf20Sopenharmony_ci 2288c2ecf20Sopenharmony_cistruct ib_cc_congestion_entry { 2298c2ecf20Sopenharmony_ci u8 ccti_increase; 2308c2ecf20Sopenharmony_ci __be16 ccti_timer; 2318c2ecf20Sopenharmony_ci u8 trigger_threshold; 2328c2ecf20Sopenharmony_ci u8 ccti_min; /* min CCTI for cc table */ 2338c2ecf20Sopenharmony_ci} __packed; 2348c2ecf20Sopenharmony_ci 2358c2ecf20Sopenharmony_cistruct ib_cc_congestion_entry_shadow { 2368c2ecf20Sopenharmony_ci u8 ccti_increase; 2378c2ecf20Sopenharmony_ci u16 ccti_timer; 2388c2ecf20Sopenharmony_ci u8 trigger_threshold; 2398c2ecf20Sopenharmony_ci u8 ccti_min; /* min CCTI for cc table */ 2408c2ecf20Sopenharmony_ci} __packed; 2418c2ecf20Sopenharmony_ci 2428c2ecf20Sopenharmony_cistruct ib_cc_congestion_setting_attr { 2438c2ecf20Sopenharmony_ci __be16 port_control; 2448c2ecf20Sopenharmony_ci __be16 control_map; 2458c2ecf20Sopenharmony_ci struct ib_cc_congestion_entry entries[IB_CC_CCS_ENTRIES]; 2468c2ecf20Sopenharmony_ci} __packed; 2478c2ecf20Sopenharmony_ci 2488c2ecf20Sopenharmony_cistruct ib_cc_congestion_setting_attr_shadow { 2498c2ecf20Sopenharmony_ci u16 port_control; 2508c2ecf20Sopenharmony_ci u16 control_map; 2518c2ecf20Sopenharmony_ci struct ib_cc_congestion_entry_shadow entries[IB_CC_CCS_ENTRIES]; 2528c2ecf20Sopenharmony_ci} __packed; 2538c2ecf20Sopenharmony_ci 2548c2ecf20Sopenharmony_ci#define IB_CC_TABLE_ENTRY_INCREASE_DEFAULT 1 2558c2ecf20Sopenharmony_ci#define IB_CC_TABLE_ENTRY_TIMER_DEFAULT 1 2568c2ecf20Sopenharmony_ci 2578c2ecf20Sopenharmony_ci/* 64 Congestion Control table entries in a single MAD */ 2588c2ecf20Sopenharmony_ci#define IB_CCT_ENTRIES 64 2598c2ecf20Sopenharmony_ci#define IB_CCT_MIN_ENTRIES (IB_CCT_ENTRIES * 2) 2608c2ecf20Sopenharmony_ci 2618c2ecf20Sopenharmony_cistruct ib_cc_table_entry { 2628c2ecf20Sopenharmony_ci __be16 entry; /* shift:2, multiplier:14 */ 2638c2ecf20Sopenharmony_ci}; 2648c2ecf20Sopenharmony_ci 2658c2ecf20Sopenharmony_cistruct ib_cc_table_entry_shadow { 2668c2ecf20Sopenharmony_ci u16 entry; /* shift:2, multiplier:14 */ 2678c2ecf20Sopenharmony_ci}; 2688c2ecf20Sopenharmony_ci 2698c2ecf20Sopenharmony_cistruct ib_cc_table_attr { 2708c2ecf20Sopenharmony_ci __be16 ccti_limit; /* max CCTI for cc table */ 2718c2ecf20Sopenharmony_ci struct ib_cc_table_entry ccti_entries[IB_CCT_ENTRIES]; 2728c2ecf20Sopenharmony_ci} __packed; 2738c2ecf20Sopenharmony_ci 2748c2ecf20Sopenharmony_cistruct ib_cc_table_attr_shadow { 2758c2ecf20Sopenharmony_ci u16 ccti_limit; /* max CCTI for cc table */ 2768c2ecf20Sopenharmony_ci struct ib_cc_table_entry_shadow ccti_entries[IB_CCT_ENTRIES]; 2778c2ecf20Sopenharmony_ci} __packed; 2788c2ecf20Sopenharmony_ci 2798c2ecf20Sopenharmony_ci#define CC_TABLE_SHADOW_MAX \ 2808c2ecf20Sopenharmony_ci (IB_CC_TABLE_CAP_DEFAULT * IB_CCT_ENTRIES) 2818c2ecf20Sopenharmony_ci 2828c2ecf20Sopenharmony_cistruct cc_table_shadow { 2838c2ecf20Sopenharmony_ci u16 ccti_last_entry; 2848c2ecf20Sopenharmony_ci struct ib_cc_table_entry_shadow entries[CC_TABLE_SHADOW_MAX]; 2858c2ecf20Sopenharmony_ci} __packed; 2868c2ecf20Sopenharmony_ci 2878c2ecf20Sopenharmony_ci/* 2888c2ecf20Sopenharmony_ci * The PortSamplesControl.CounterMasks field is an array of 3 bit fields 2898c2ecf20Sopenharmony_ci * which specify the N'th counter's capabilities. See ch. 16.1.3.2. 2908c2ecf20Sopenharmony_ci * We support 5 counters which only count the mandatory quantities. 2918c2ecf20Sopenharmony_ci */ 2928c2ecf20Sopenharmony_ci#define COUNTER_MASK(q, n) (q << ((9 - n) * 3)) 2938c2ecf20Sopenharmony_ci#define COUNTER_MASK0_9 \ 2948c2ecf20Sopenharmony_ci cpu_to_be32(COUNTER_MASK(1, 0) | \ 2958c2ecf20Sopenharmony_ci COUNTER_MASK(1, 1) | \ 2968c2ecf20Sopenharmony_ci COUNTER_MASK(1, 2) | \ 2978c2ecf20Sopenharmony_ci COUNTER_MASK(1, 3) | \ 2988c2ecf20Sopenharmony_ci COUNTER_MASK(1, 4)) 2998c2ecf20Sopenharmony_ci 3008c2ecf20Sopenharmony_ci#endif /* _QIB_MAD_H */ 301