1*4e1bc9a0SAchim Leubner /******************************************************************************* 2*4e1bc9a0SAchim Leubner *Copyright (c) 2014 PMC-Sierra, Inc. All rights reserved. 3*4e1bc9a0SAchim Leubner * 4*4e1bc9a0SAchim Leubner *Redistribution and use in source and binary forms, with or without modification, are permitted provided 5*4e1bc9a0SAchim Leubner *that the following conditions are met: 6*4e1bc9a0SAchim Leubner *1. Redistributions of source code must retain the above copyright notice, this list of conditions and the 7*4e1bc9a0SAchim Leubner *following disclaimer. 8*4e1bc9a0SAchim Leubner *2. Redistributions in binary form must reproduce the above copyright notice, 9*4e1bc9a0SAchim Leubner *this list of conditions and the following disclaimer in the documentation and/or other materials provided 10*4e1bc9a0SAchim Leubner *with the distribution. 11*4e1bc9a0SAchim Leubner * 12*4e1bc9a0SAchim Leubner *THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED 13*4e1bc9a0SAchim Leubner *WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 14*4e1bc9a0SAchim Leubner *FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 15*4e1bc9a0SAchim Leubner *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 16*4e1bc9a0SAchim Leubner *NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 17*4e1bc9a0SAchim Leubner *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 18*4e1bc9a0SAchim Leubner *LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 19*4e1bc9a0SAchim Leubner *SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE 20*4e1bc9a0SAchim Leubner * 21*4e1bc9a0SAchim Leubner * 22*4e1bc9a0SAchim Leubner ********************************************************************************/ 23*4e1bc9a0SAchim Leubner 24*4e1bc9a0SAchim Leubner /*******************************************************************************/ 25*4e1bc9a0SAchim Leubner /*! \file mpidebug.h 26*4e1bc9a0SAchim Leubner * \brief The file defines the debug constants and structures 27*4e1bc9a0SAchim Leubner * 28*4e1bc9a0SAchim Leubner */ 29*4e1bc9a0SAchim Leubner /*******************************************************************************/ 30*4e1bc9a0SAchim Leubner 31*4e1bc9a0SAchim Leubner #ifndef __MPIDEBUG_H__ 32*4e1bc9a0SAchim Leubner #define __MPIDEBUG_H__ 33*4e1bc9a0SAchim Leubner 34*4e1bc9a0SAchim Leubner /*******************************************************************************/ 35*4e1bc9a0SAchim Leubner #define MPI_DEBUG_TRACE_BUFFER_MAX 1024 36*4e1bc9a0SAchim Leubner #define MPI_DEBUG_TRACE_OB_IOMB_SIZE 128 /* 64 */ 37*4e1bc9a0SAchim Leubner #define MPI_DEBUG_TRACE_IB_IOMB_SIZE 128 /* 64 */ 38*4e1bc9a0SAchim Leubner #define MPI_DEBUG_TRACE_IBQ 1 39*4e1bc9a0SAchim Leubner #define MPI_DEBUG_TRACE_OBQ 0 40*4e1bc9a0SAchim Leubner #define MPI_DEBUG_TRACE_QNUM_ERROR 100 /* Added to Qnumber to indicate error */ 41*4e1bc9a0SAchim Leubner 42*4e1bc9a0SAchim Leubner typedef struct mpiObDebugTraceEntry_s 43*4e1bc9a0SAchim Leubner { 44*4e1bc9a0SAchim Leubner bit64 Time; 45*4e1bc9a0SAchim Leubner bit32 QNum; 46*4e1bc9a0SAchim Leubner bit32 pici; 47*4e1bc9a0SAchim Leubner void * pEntry; 48*4e1bc9a0SAchim Leubner bit32 Iomb[MPI_DEBUG_TRACE_OB_IOMB_SIZE/4]; 49*4e1bc9a0SAchim Leubner } mpiDebugObTraceEntry_t; 50*4e1bc9a0SAchim Leubner 51*4e1bc9a0SAchim Leubner typedef struct mpiIbDebugTraceEntry_s 52*4e1bc9a0SAchim Leubner { 53*4e1bc9a0SAchim Leubner bit64 Time; 54*4e1bc9a0SAchim Leubner bit32 QNum; 55*4e1bc9a0SAchim Leubner bit32 pici; 56*4e1bc9a0SAchim Leubner void * pEntry; 57*4e1bc9a0SAchim Leubner bit32 Iomb[MPI_DEBUG_TRACE_IB_IOMB_SIZE/4]; 58*4e1bc9a0SAchim Leubner } mpiDebugIbTraceEntry_t; 59*4e1bc9a0SAchim Leubner 60*4e1bc9a0SAchim Leubner typedef struct mpiIbDebugTrace_s 61*4e1bc9a0SAchim Leubner { 62*4e1bc9a0SAchim Leubner bit32 Idx; 63*4e1bc9a0SAchim Leubner bit32 Pad; 64*4e1bc9a0SAchim Leubner mpiDebugIbTraceEntry_t Data[MPI_DEBUG_TRACE_BUFFER_MAX]; 65*4e1bc9a0SAchim Leubner } mpiDebugIbTrace_t; 66*4e1bc9a0SAchim Leubner 67*4e1bc9a0SAchim Leubner typedef struct mpiObDebugTrace_s 68*4e1bc9a0SAchim Leubner { 69*4e1bc9a0SAchim Leubner bit32 Idx; 70*4e1bc9a0SAchim Leubner bit32 Pad; 71*4e1bc9a0SAchim Leubner mpiDebugObTraceEntry_t Data[MPI_DEBUG_TRACE_BUFFER_MAX]; 72*4e1bc9a0SAchim Leubner } mpiDebugObTrace_t; 73*4e1bc9a0SAchim Leubner 74*4e1bc9a0SAchim Leubner void mpiTraceInit(void); 75*4e1bc9a0SAchim Leubner void mpiTraceAdd(bit32 q,bit32 pici,bit32 ib, void *iomb, bit32 numBytes); 76*4e1bc9a0SAchim Leubner 77*4e1bc9a0SAchim Leubner #endif /* __MPIDEBUG_H__ */ 78*4e1bc9a0SAchim Leubner 79*4e1bc9a0SAchim Leubner 80*4e1bc9a0SAchim Leubner 81*4e1bc9a0SAchim Leubner 82*4e1bc9a0SAchim Leubner /******************************************************************** 83*4e1bc9a0SAchim Leubner ** File that contains debug-specific APIs ( driver tracing etc ) 84*4e1bc9a0SAchim Leubner *********************************************************************/ 85*4e1bc9a0SAchim Leubner 86*4e1bc9a0SAchim Leubner #ifndef __SPCDEBUG_H__ 87*4e1bc9a0SAchim Leubner #define __SPCDEBUG_H__ 88*4e1bc9a0SAchim Leubner 89*4e1bc9a0SAchim Leubner 90*4e1bc9a0SAchim Leubner /* 91*4e1bc9a0SAchim Leubner ** console and trace levels 92*4e1bc9a0SAchim Leubner */ 93*4e1bc9a0SAchim Leubner 94*4e1bc9a0SAchim Leubner #define hpDBG_ALWAYS 0x0000ffff 95*4e1bc9a0SAchim Leubner #define hpDBG_IOMB 0x00000040 96*4e1bc9a0SAchim Leubner #define hpDBG_REGISTERS 0x00000020 97*4e1bc9a0SAchim Leubner #define hpDBG_TICK_INT 0x00000010 98*4e1bc9a0SAchim Leubner #define hpDBG_SCREAM 0x00000008 99*4e1bc9a0SAchim Leubner #define hpDBG_VERY_LOUD 0x00000004 100*4e1bc9a0SAchim Leubner #define hpDBG_LOUD 0x00000002 101*4e1bc9a0SAchim Leubner #define hpDBG_ERROR 0x00000001 102*4e1bc9a0SAchim Leubner #define hpDBG_NEVER 0x00000000 103*4e1bc9a0SAchim Leubner 104*4e1bc9a0SAchim Leubner #define smTraceDestBuffer 0x00000001 105*4e1bc9a0SAchim Leubner #define smTraceDestRegister 0x00000002 106*4e1bc9a0SAchim Leubner #define smTraceDestDebugger 0x00000004 107*4e1bc9a0SAchim Leubner 108*4e1bc9a0SAchim Leubner 109*4e1bc9a0SAchim Leubner #define siTraceDestMask (smTraceDestBuffer | \ 110*4e1bc9a0SAchim Leubner smTraceDestRegister | \ 111*4e1bc9a0SAchim Leubner smTraceDestDebugger) 112*4e1bc9a0SAchim Leubner 113*4e1bc9a0SAchim Leubner /* Trace buffer will continuously */ 114*4e1bc9a0SAchim Leubner /* trace and wrap-around on itself */ 115*4e1bc9a0SAchim Leubner /* when it reaches the end */ 116*4e1bc9a0SAchim Leubner #define hpDBG_TraceBufferWrapAround 0x80000000 117*4e1bc9a0SAchim Leubner /* This features enables logging of trace time */ 118*4e1bc9a0SAchim Leubner /* stamps. Only certain key routines use this */ 119*4e1bc9a0SAchim Leubner /* feature because it tends to clog up the trace */ 120*4e1bc9a0SAchim Leubner /* buffer. */ 121*4e1bc9a0SAchim Leubner #define hpDBG_TraceBufferUseTimeStamp 0x40000000 122*4e1bc9a0SAchim Leubner /* This features enables logging of trace sequential */ 123*4e1bc9a0SAchim Leubner /* stamps. Only certain key routines use this */ 124*4e1bc9a0SAchim Leubner /* feature because it tends to clog up the trace */ 125*4e1bc9a0SAchim Leubner /* buffer. */ 126*4e1bc9a0SAchim Leubner #define hpDBG_TraceBufferUseSequenceStamp 0x20000000 127*4e1bc9a0SAchim Leubner 128*4e1bc9a0SAchim Leubner /* Trace IDs of various state machines */ 129*4e1bc9a0SAchim Leubner #define fiTraceSmChip 'C' 130*4e1bc9a0SAchim Leubner #define fiTraceSmPort 'P' 131*4e1bc9a0SAchim Leubner #define fiTraceSmLogin 'L' 132*4e1bc9a0SAchim Leubner #define fiTraceSmXchg 'X' 133*4e1bc9a0SAchim Leubner #define fiTraceSmFabr 'F' 134*4e1bc9a0SAchim Leubner #define fiTraceDiscFab 'D' 135*4e1bc9a0SAchim Leubner #define fiTraceDiscLoop 'M' 136*4e1bc9a0SAchim Leubner #define fiTraceFc2 'A' 137*4e1bc9a0SAchim Leubner #define fiTraceTgtState 'S' 138*4e1bc9a0SAchim Leubner #define fiTraceIniState 'I' 139*4e1bc9a0SAchim Leubner 140*4e1bc9a0SAchim Leubner /* Trace IDs of various queues */ 141*4e1bc9a0SAchim Leubner #define fiSfsFreeList 'Z' 142*4e1bc9a0SAchim Leubner #define fiSestFreeList 'W' 143*4e1bc9a0SAchim Leubner #define fiOsSfsFreeList 'G' 144*4e1bc9a0SAchim Leubner #define fiLgnFreeList 'K' 145*4e1bc9a0SAchim Leubner #define fiPortalFreeList 'l' 146*4e1bc9a0SAchim Leubner #define fiBusyList 'N' 147*4e1bc9a0SAchim Leubner #define fiOsSfsAllocList 'B' 148*4e1bc9a0SAchim Leubner #define fiTimerList 'V' 149*4e1bc9a0SAchim Leubner #define fiSfsWaitForRspList 'I' 150*4e1bc9a0SAchim Leubner #define fiLgnBusyList 'J' 151*4e1bc9a0SAchim Leubner #define fiPortalBusyList 'g' 152*4e1bc9a0SAchim Leubner #define fiWait4ErqList 'o' 153*4e1bc9a0SAchim Leubner #define fiXchgAbortList 'U' 154*4e1bc9a0SAchim Leubner #define fiXchgWaitList 'b' 155*4e1bc9a0SAchim Leubner 156*4e1bc9a0SAchim Leubner /* not used right now */ 157*4e1bc9a0SAchim Leubner #define fiSfsDeferFreeList 'q' 158*4e1bc9a0SAchim Leubner #define fiDeferBusyList 'm' 159*4e1bc9a0SAchim Leubner #define fiInvalidList 'X' 160*4e1bc9a0SAchim Leubner #define fiInvalidatedList 'a' 161*4e1bc9a0SAchim Leubner #define fiTmpXchList 'n' 162*4e1bc9a0SAchim Leubner 163*4e1bc9a0SAchim Leubner #define TMP_TRACE_BUFF_SIZE 32 164*4e1bc9a0SAchim Leubner #define FC_TRACE_LINE_SIZE 70 165*4e1bc9a0SAchim Leubner /******************************************************************************/ 166*4e1bc9a0SAchim Leubner /* Macro Conventions: we are assuming that the macros will be called inside */ 167*4e1bc9a0SAchim Leubner /* a function that already has a workable saRoot variable */ 168*4e1bc9a0SAchim Leubner /******************************************************************************/ 169*4e1bc9a0SAchim Leubner 170*4e1bc9a0SAchim Leubner /******************************************************************************/ 171*4e1bc9a0SAchim Leubner /* fiTraceState : ==> _!n_ _ss: XXXXXXXX _se: XXXXXXXX */ 172*4e1bc9a0SAchim Leubner /* statemachine --^ currentstate--^ triggerevent--^ */ 173*4e1bc9a0SAchim Leubner /* NOTE: shorthand forms available as macros below. */ 174*4e1bc9a0SAchim Leubner /******************************************************************************/ 175*4e1bc9a0SAchim Leubner #ifdef SA_ENABLE_TRACE_FUNCTIONS 176*4e1bc9a0SAchim Leubner 177*4e1bc9a0SAchim Leubner 178*4e1bc9a0SAchim Leubner void siResetTraceBuffer(agsaRoot_t *agRoot); 179*4e1bc9a0SAchim Leubner void siTraceFuncEnter(agsaRoot_t *agRoot, bit32 mask, bit32 fileid, char *funcid); 180*4e1bc9a0SAchim Leubner 181*4e1bc9a0SAchim Leubner 182*4e1bc9a0SAchim Leubner GLOBAL void siTraceFuncExit( agsaRoot_t *agRoot, bit32 mask, char fileid, char * funcid, char exitId ); 183*4e1bc9a0SAchim Leubner 184*4e1bc9a0SAchim Leubner 185*4e1bc9a0SAchim Leubner void siTrace(agsaRoot_t *agRoot, bit32 mask, char *uId, bit32 value, bit32 dataSizeInBits); 186*4e1bc9a0SAchim Leubner void siTrace64(agsaRoot_t *agRoot, bit32 mask, char *uId, bit64 value, bit32 dataSizeInBits); 187*4e1bc9a0SAchim Leubner bit32 siGetCurrentTraceIndex(agsaRoot_t *agRoot); 188*4e1bc9a0SAchim Leubner void siTraceListRemove(agsaRoot_t *agRoot, bit32 mask, char listId, bitptr exchangeId); 189*4e1bc9a0SAchim Leubner void siTraceListAdd(agsaRoot_t *agRoot, bit32 mask, char listId, bitptr exchangeId); 190*4e1bc9a0SAchim Leubner void siTraceState(agsaRoot_t *agRoot, bit32 mask, bit32 statemachine, bit32 currentstate, bit32 triggerevent); 191*4e1bc9a0SAchim Leubner 192*4e1bc9a0SAchim Leubner #define smTraceState(L,S,C,T) siTraceState(agRoot,L,S,C,T) 193*4e1bc9a0SAchim Leubner #define smTraceChipState(L,C,T) siTraceState(agRoot,L,fiTraceSmChip,C,T) 194*4e1bc9a0SAchim Leubner #define smTraceFabricState(L,C,T) siTraceState(agRoot,L,fiTraceSmFabr,C,T) 195*4e1bc9a0SAchim Leubner #define smTracePortState(L,C,T) siTraceState(agRoot,L,fiTraceSmPort,C,T) 196*4e1bc9a0SAchim Leubner #define smTraceLoginState(L,C,T) siTraceState(agRoot,L,fiTraceSmLogin,C,T) 197*4e1bc9a0SAchim Leubner #define smTraceXchgState(L,C,T) siTraceState(agRoot,L,fiTraceSmXchg,C,T) 198*4e1bc9a0SAchim Leubner #define smTraceDiscFabState(L,C,T) siTraceState(agRoot,L,fiTraceDiscFab,C,T) 199*4e1bc9a0SAchim Leubner #define smTraceDiscLoopState(L,C,T) siTraceState(agRoot,L,fiTraceDiscLoop,C,T) 200*4e1bc9a0SAchim Leubner #define smTraceFc2State(L,C,T) siTraceState(agRoot,L,fiTraceFc2,C,T) 201*4e1bc9a0SAchim Leubner #define smTraceScsiTgtState(L,C,T) siTraceState(agRoot,L,fiTraceTgtState,C,T) 202*4e1bc9a0SAchim Leubner #define smTraceScsiIniState(L,C,T) siTraceState(agRoot,L,fiTraceIniState,C,T) 203*4e1bc9a0SAchim Leubner 204*4e1bc9a0SAchim Leubner #define smResetTraceBuffer(L) siResetTraceBuffer(L) 205*4e1bc9a0SAchim Leubner #define smTraceFuncEnter(L,I) siTraceFuncEnter(agRoot,L,siTraceFileID,I) 206*4e1bc9a0SAchim Leubner #define smTraceFuncExit(L,S,I) siTraceFuncExit(agRoot,L,siTraceFileID,I,S) 207*4e1bc9a0SAchim Leubner #define smGetCurrentTraceIndex(L) siGetCurrentTraceIndex(L) 208*4e1bc9a0SAchim Leubner #define smTraceListRemove(R,L,I,V) siTraceListRemove(R,L,I,V) 209*4e1bc9a0SAchim Leubner #define smTraceListAdd(R,L,I,V) siTraceListAdd(R,L,I,V) 210*4e1bc9a0SAchim Leubner 211*4e1bc9a0SAchim Leubner #define smTrace(L,I,V) \ 212*4e1bc9a0SAchim Leubner /*lint -e506 */ \ 213*4e1bc9a0SAchim Leubner /*lint -e774 */ \ 214*4e1bc9a0SAchim Leubner if (sizeof(V) == 8) {siTrace64(agRoot,L,I,(bit64)V,64);} \ 215*4e1bc9a0SAchim Leubner else {siTrace(agRoot,L,I,(bit32)V,32);} \ 216*4e1bc9a0SAchim Leubner /*lint +e506 */ \ 217*4e1bc9a0SAchim Leubner /*lint +e774 */ 218*4e1bc9a0SAchim Leubner 219*4e1bc9a0SAchim Leubner 220*4e1bc9a0SAchim Leubner #else 221*4e1bc9a0SAchim Leubner 222*4e1bc9a0SAchim Leubner #define siTraceState(agRoot,L,fiTraceSmXchg,C,T) 223*4e1bc9a0SAchim Leubner 224*4e1bc9a0SAchim Leubner #define smTraceState(L,S,C,T) 225*4e1bc9a0SAchim Leubner #define smTraceChipState(L,C,T) 226*4e1bc9a0SAchim Leubner #define smTraceFabricState(L,C,T) 227*4e1bc9a0SAchim Leubner #define smTracePortState(L,C,T) 228*4e1bc9a0SAchim Leubner #define smTraceLoginState(L,C,T) 229*4e1bc9a0SAchim Leubner #define smTraceXchgState(L,C,T) 230*4e1bc9a0SAchim Leubner #define smTraceDiscFabState(L,C,T) 231*4e1bc9a0SAchim Leubner #define smTraceDiscLoopState(L,C,T) 232*4e1bc9a0SAchim Leubner #define smTraceFc2State(L,C,T) 233*4e1bc9a0SAchim Leubner #define smTraceScsiTgtState(L,C,T) 234*4e1bc9a0SAchim Leubner #define smTraceScsiIniState(L,C,T) 235*4e1bc9a0SAchim Leubner 236*4e1bc9a0SAchim Leubner #define smResetTraceBuffer(agRoot) 237*4e1bc9a0SAchim Leubner #define smTraceFuncEnter(L,I) 238*4e1bc9a0SAchim Leubner #define smTraceFuncExit(L,S,I) 239*4e1bc9a0SAchim Leubner #define smGetCurrentTraceIndex(L) 240*4e1bc9a0SAchim Leubner #define smTraceListRemove(L,I,V) 241*4e1bc9a0SAchim Leubner #define smTraceListAdd(L,I,V) 242*4e1bc9a0SAchim Leubner 243*4e1bc9a0SAchim Leubner #define smTrace(L,I,V) 244*4e1bc9a0SAchim Leubner 245*4e1bc9a0SAchim Leubner #endif 246*4e1bc9a0SAchim Leubner 247*4e1bc9a0SAchim Leubner struct hpTraceBufferParms_s { 248*4e1bc9a0SAchim Leubner bit32 TraceCompiled; 249*4e1bc9a0SAchim Leubner bit32 BufferSize; 250*4e1bc9a0SAchim Leubner bit32 CurrentTraceIndexWrapCount; 251*4e1bc9a0SAchim Leubner bit32 CurrentIndex; 252*4e1bc9a0SAchim Leubner bit32 TraceWrap; 253*4e1bc9a0SAchim Leubner bit8 * pTrace; 254*4e1bc9a0SAchim Leubner bit32 * pCurrentTraceIndex; 255*4e1bc9a0SAchim Leubner bit32 * pTraceIndexWrapCount; 256*4e1bc9a0SAchim Leubner bit32 * pTraceMask; 257*4e1bc9a0SAchim Leubner }; 258*4e1bc9a0SAchim Leubner typedef struct hpTraceBufferParms_s 259*4e1bc9a0SAchim Leubner hpTraceBufferParms_t; 260*4e1bc9a0SAchim Leubner 261*4e1bc9a0SAchim Leubner #ifdef SA_ENABLE_TRACE_FUNCTIONS 262*4e1bc9a0SAchim Leubner 263*4e1bc9a0SAchim Leubner GLOBAL void siTraceGetInfo(agsaRoot_t *agRoot, hpTraceBufferParms_t * pBParms); 264*4e1bc9a0SAchim Leubner 265*4e1bc9a0SAchim Leubner #define smTraceGetInfo(R,P) siTraceGetInfo(R,P) 266*4e1bc9a0SAchim Leubner #else 267*4e1bc9a0SAchim Leubner #define smTraceGetInfo(R,P) 268*4e1bc9a0SAchim Leubner #endif 269*4e1bc9a0SAchim Leubner 270*4e1bc9a0SAchim Leubner 271*4e1bc9a0SAchim Leubner void siEnableTracing ( agsaRoot_t *agRoot ); 272*4e1bc9a0SAchim Leubner #ifdef SA_ENABLE_TRACE_FUNCTIONS 273*4e1bc9a0SAchim Leubner 274*4e1bc9a0SAchim Leubner GLOBAL void siTraceSetMask(agsaRoot_t *agRoot, bit32 TraceMask ); 275*4e1bc9a0SAchim Leubner 276*4e1bc9a0SAchim Leubner #define smTraceSetMask(R,P) siTraceSetMask(R,P) 277*4e1bc9a0SAchim Leubner #else 278*4e1bc9a0SAchim Leubner #define smTraceSetMask(R,P) 279*4e1bc9a0SAchim Leubner #endif /* SA_ENABLE_TRACE_FUNCTIONS */ 280*4e1bc9a0SAchim Leubner 281*4e1bc9a0SAchim Leubner #endif /* #ifndef __SPCDEBUG_H__ */ 282*4e1bc9a0SAchim Leubner 283