Annotation of qemu/roms/ipxe/src/drivers/infiniband/linda.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (C) 2008 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 <stdint.h>
        !            22: #include <stdlib.h>
        !            23: #include <errno.h>
        !            24: #include <unistd.h>
        !            25: #include <assert.h>
        !            26: #include <ipxe/io.h>
        !            27: #include <ipxe/pci.h>
        !            28: #include <ipxe/infiniband.h>
        !            29: #include <ipxe/i2c.h>
        !            30: #include <ipxe/bitbash.h>
        !            31: #include <ipxe/malloc.h>
        !            32: #include <ipxe/iobuf.h>
        !            33: #include "linda.h"
        !            34: 
        !            35: /**
        !            36:  * @file
        !            37:  *
        !            38:  * QLogic Linda Infiniband HCA
        !            39:  *
        !            40:  */
        !            41: 
        !            42: /** A Linda send work queue */
        !            43: struct linda_send_work_queue {
        !            44:        /** Send buffer usage */
        !            45:        uint8_t *send_buf;
        !            46:        /** Producer index */
        !            47:        unsigned int prod;
        !            48:        /** Consumer index */
        !            49:        unsigned int cons;
        !            50: };
        !            51: 
        !            52: /** A Linda receive work queue */
        !            53: struct linda_recv_work_queue {
        !            54:        /** Receive header ring */
        !            55:        void *header;
        !            56:        /** Receive header producer offset (written by hardware) */
        !            57:        struct QIB_7220_scalar header_prod;
        !            58:        /** Receive header consumer offset */
        !            59:        unsigned int header_cons;
        !            60:        /** Offset within register space of the eager array */
        !            61:        unsigned long eager_array;
        !            62:        /** Number of entries in eager array */
        !            63:        unsigned int eager_entries;
        !            64:        /** Eager array producer index */
        !            65:        unsigned int eager_prod;
        !            66:        /** Eager array consumer index */
        !            67:        unsigned int eager_cons;
        !            68: };
        !            69: 
        !            70: /** A Linda HCA */
        !            71: struct linda {
        !            72:        /** Registers */
        !            73:        void *regs;
        !            74: 
        !            75:        /** In-use contexts */
        !            76:        uint8_t used_ctx[LINDA_NUM_CONTEXTS];
        !            77:        /** Send work queues */
        !            78:        struct linda_send_work_queue send_wq[LINDA_NUM_CONTEXTS];
        !            79:        /** Receive work queues */
        !            80:        struct linda_recv_work_queue recv_wq[LINDA_NUM_CONTEXTS];
        !            81: 
        !            82:        /** Offset within register space of the first send buffer */
        !            83:        unsigned long send_buffer_base;
        !            84:        /** Send buffer availability (reported by hardware) */
        !            85:        struct QIB_7220_SendBufAvail *sendbufavail;
        !            86:        /** Send buffer availability (maintained by software) */
        !            87:        uint8_t send_buf[LINDA_MAX_SEND_BUFS];
        !            88:        /** Send buffer availability producer counter */
        !            89:        unsigned int send_buf_prod;
        !            90:        /** Send buffer availability consumer counter */
        !            91:        unsigned int send_buf_cons;
        !            92:        /** Number of reserved send buffers (across all QPs) */
        !            93:        unsigned int reserved_send_bufs;
        !            94: 
        !            95:        /** I2C bit-bashing interface */
        !            96:        struct i2c_bit_basher i2c;
        !            97:        /** I2C serial EEPROM */
        !            98:        struct i2c_device eeprom;
        !            99: };
        !           100: 
        !           101: /***************************************************************************
        !           102:  *
        !           103:  * Linda register access
        !           104:  *
        !           105:  ***************************************************************************
        !           106:  *
        !           107:  * This card requires atomic 64-bit accesses.  Strange things happen
        !           108:  * if you try to use 32-bit accesses; sometimes they work, sometimes
        !           109:  * they don't, sometimes you get random data.
        !           110:  *
        !           111:  * These accessors use the "movq" MMX instruction, and so won't work
        !           112:  * on really old Pentiums (which won't have PCIe anyway, so this is
        !           113:  * something of a moot point).
        !           114:  */
        !           115: 
        !           116: /**
        !           117:  * Read Linda qword register
        !           118:  *
        !           119:  * @v linda            Linda device
        !           120:  * @v dwords           Register buffer to read into
        !           121:  * @v offset           Register offset
        !           122:  */
        !           123: static void linda_readq ( struct linda *linda, uint32_t *dwords,
        !           124:                          unsigned long offset ) {
        !           125:        void *addr = ( linda->regs + offset );
        !           126: 
        !           127:        __asm__ __volatile__ ( "movq (%1), %%mm0\n\t"
        !           128:                               "movq %%mm0, (%0)\n\t"
        !           129:                               : : "r" ( dwords ), "r" ( addr ) : "memory" );
        !           130: 
        !           131:        DBGIO ( "[%08lx] => %08x%08x\n",
        !           132:                virt_to_phys ( addr ), dwords[1], dwords[0] );
        !           133: }
        !           134: #define linda_readq( _linda, _ptr, _offset ) \
        !           135:        linda_readq ( (_linda), (_ptr)->u.dwords, (_offset) )
        !           136: #define linda_readq_array8b( _linda, _ptr, _offset, _idx ) \
        !           137:        linda_readq ( (_linda), (_ptr), ( (_offset) + ( (_idx) * 8 ) ) )
        !           138: #define linda_readq_array64k( _linda, _ptr, _offset, _idx ) \
        !           139:        linda_readq ( (_linda), (_ptr), ( (_offset) + ( (_idx) * 65536 ) ) )
        !           140: 
        !           141: /**
        !           142:  * Write Linda qword register
        !           143:  *
        !           144:  * @v linda            Linda device
        !           145:  * @v dwords           Register buffer to write
        !           146:  * @v offset           Register offset
        !           147:  */
        !           148: static void linda_writeq ( struct linda *linda, const uint32_t *dwords,
        !           149:                           unsigned long offset ) {
        !           150:        void *addr = ( linda->regs + offset );
        !           151: 
        !           152:        DBGIO ( "[%08lx] <= %08x%08x\n",
        !           153:                virt_to_phys ( addr ), dwords[1], dwords[0] );
        !           154: 
        !           155:        __asm__ __volatile__ ( "movq (%0), %%mm0\n\t"
        !           156:                               "movq %%mm0, (%1)\n\t"
        !           157:                               : : "r" ( dwords ), "r" ( addr ) : "memory" );
        !           158: }
        !           159: #define linda_writeq( _linda, _ptr, _offset ) \
        !           160:        linda_writeq ( (_linda), (_ptr)->u.dwords, (_offset) )
        !           161: #define linda_writeq_array8b( _linda, _ptr, _offset, _idx ) \
        !           162:        linda_writeq ( (_linda), (_ptr), ( (_offset) + ( (_idx) * 8 ) ) )
        !           163: #define linda_writeq_array64k( _linda, _ptr, _offset, _idx ) \
        !           164:        linda_writeq ( (_linda), (_ptr), ( (_offset) + ( (_idx) * 65536 ) ) )
        !           165: 
        !           166: /**
        !           167:  * Write Linda dword register
        !           168:  *
        !           169:  * @v linda            Linda device
        !           170:  * @v dword            Value to write
        !           171:  * @v offset           Register offset
        !           172:  */
        !           173: static void linda_writel ( struct linda *linda, uint32_t dword,
        !           174:                           unsigned long offset ) {
        !           175:        writel ( dword, ( linda->regs + offset ) );
        !           176: }
        !           177: 
        !           178: /***************************************************************************
        !           179:  *
        !           180:  * Link state management
        !           181:  *
        !           182:  ***************************************************************************
        !           183:  */
        !           184: 
        !           185: /**
        !           186:  * Textual representation of link state
        !           187:  *
        !           188:  * @v link_state       Link state
        !           189:  * @ret link_text      Link state text
        !           190:  */
        !           191: static const char * linda_link_state_text ( unsigned int link_state ) {
        !           192:        switch ( link_state ) {
        !           193:        case LINDA_LINK_STATE_DOWN:     return "DOWN";
        !           194:        case LINDA_LINK_STATE_INIT:     return "INIT";
        !           195:        case LINDA_LINK_STATE_ARM:      return "ARM";
        !           196:        case LINDA_LINK_STATE_ACTIVE:   return "ACTIVE";
        !           197:        case LINDA_LINK_STATE_ACT_DEFER:return "ACT_DEFER";
        !           198:        default:                        return "UNKNOWN";
        !           199:        }
        !           200: }
        !           201: 
        !           202: /**
        !           203:  * Handle link state change
        !           204:  *
        !           205:  * @v linda            Linda device
        !           206:  */
        !           207: static void linda_link_state_changed ( struct ib_device *ibdev ) {
        !           208:        struct linda *linda = ib_get_drvdata ( ibdev );
        !           209:        struct QIB_7220_IBCStatus ibcstatus;
        !           210:        struct QIB_7220_EXTCtrl extctrl;
        !           211:        unsigned int link_state;
        !           212:        unsigned int link_width;
        !           213:        unsigned int link_speed;
        !           214: 
        !           215:        /* Read link state */
        !           216:        linda_readq ( linda, &ibcstatus, QIB_7220_IBCStatus_offset );
        !           217:        link_state = BIT_GET ( &ibcstatus, LinkState );
        !           218:        link_width = BIT_GET ( &ibcstatus, LinkWidthActive );
        !           219:        link_speed = BIT_GET ( &ibcstatus, LinkSpeedActive );
        !           220:        DBGC ( linda, "Linda %p link state %s (%s %s)\n", linda,
        !           221:               linda_link_state_text ( link_state ),
        !           222:               ( link_speed ? "DDR" : "SDR" ), ( link_width ? "x4" : "x1" ) );
        !           223: 
        !           224:        /* Set LEDs according to link state */
        !           225:        linda_readq ( linda, &extctrl, QIB_7220_EXTCtrl_offset );
        !           226:        BIT_SET ( &extctrl, LEDPriPortGreenOn,
        !           227:                  ( ( link_state >= LINDA_LINK_STATE_INIT ) ? 1 : 0 ) );
        !           228:        BIT_SET ( &extctrl, LEDPriPortYellowOn,
        !           229:                  ( ( link_state >= LINDA_LINK_STATE_ACTIVE ) ? 1 : 0 ) );
        !           230:        linda_writeq ( linda, &extctrl, QIB_7220_EXTCtrl_offset );
        !           231: 
        !           232:        /* Notify Infiniband core of link state change */
        !           233:        ibdev->port_state = ( link_state + 1 );
        !           234:        ibdev->link_width_active =
        !           235:                ( link_width ? IB_LINK_WIDTH_4X : IB_LINK_WIDTH_1X );
        !           236:        ibdev->link_speed_active =
        !           237:                ( link_speed ? IB_LINK_SPEED_DDR : IB_LINK_SPEED_SDR );
        !           238:        ib_link_state_changed ( ibdev );
        !           239: }
        !           240: 
        !           241: /**
        !           242:  * Wait for link state change to take effect
        !           243:  *
        !           244:  * @v linda            Linda device
        !           245:  * @v new_link_state   Expected link state
        !           246:  * @ret rc             Return status code
        !           247:  */
        !           248: static int linda_link_state_check ( struct linda *linda,
        !           249:                                    unsigned int new_link_state ) {
        !           250:        struct QIB_7220_IBCStatus ibcstatus;
        !           251:        unsigned int link_state;
        !           252:        unsigned int i;
        !           253: 
        !           254:        for ( i = 0 ; i < LINDA_LINK_STATE_MAX_WAIT_US ; i++ ) {
        !           255:                linda_readq ( linda, &ibcstatus, QIB_7220_IBCStatus_offset );
        !           256:                link_state = BIT_GET ( &ibcstatus, LinkState );
        !           257:                if ( link_state == new_link_state )
        !           258:                        return 0;
        !           259:                udelay ( 1 );
        !           260:        }
        !           261: 
        !           262:        DBGC ( linda, "Linda %p timed out waiting for link state %s\n",
        !           263:               linda, linda_link_state_text ( link_state ) );
        !           264:        return -ETIMEDOUT;
        !           265: }
        !           266: 
        !           267: /**
        !           268:  * Set port information
        !           269:  *
        !           270:  * @v ibdev            Infiniband device
        !           271:  * @v mad              Set port information MAD
        !           272:  */
        !           273: static int linda_set_port_info ( struct ib_device *ibdev, union ib_mad *mad ) {
        !           274:        struct linda *linda = ib_get_drvdata ( ibdev );
        !           275:        struct ib_port_info *port_info = &mad->smp.smp_data.port_info;
        !           276:        struct QIB_7220_IBCCtrl ibcctrl;
        !           277:        unsigned int port_state;
        !           278:        unsigned int link_state;
        !           279: 
        !           280:        /* Set new link state */
        !           281:        port_state = ( port_info->link_speed_supported__port_state & 0xf );
        !           282:        if ( port_state ) {
        !           283:                link_state = ( port_state - 1 );
        !           284:                DBGC ( linda, "Linda %p set link state to %s (%x)\n", linda,
        !           285:                       linda_link_state_text ( link_state ), link_state );
        !           286:                linda_readq ( linda, &ibcctrl, QIB_7220_IBCCtrl_offset );
        !           287:                BIT_SET ( &ibcctrl, LinkCmd, link_state );
        !           288:                linda_writeq ( linda, &ibcctrl, QIB_7220_IBCCtrl_offset );
        !           289: 
        !           290:                /* Wait for link state change to take effect.  Ignore
        !           291:                 * errors; the current link state will be returned via
        !           292:                 * the GetResponse MAD.
        !           293:                 */
        !           294:                linda_link_state_check ( linda, link_state );
        !           295:        }
        !           296: 
        !           297:        /* Detect and report link state change */
        !           298:        linda_link_state_changed ( ibdev );
        !           299: 
        !           300:        return 0;
        !           301: }
        !           302: 
        !           303: /**
        !           304:  * Set partition key table
        !           305:  *
        !           306:  * @v ibdev            Infiniband device
        !           307:  * @v mad              Set partition key table MAD
        !           308:  */
        !           309: static int linda_set_pkey_table ( struct ib_device *ibdev __unused,
        !           310:                                  union ib_mad *mad __unused ) {
        !           311:        /* Nothing to do */
        !           312:        return 0;
        !           313: }
        !           314: 
        !           315: /***************************************************************************
        !           316:  *
        !           317:  * Context allocation
        !           318:  *
        !           319:  ***************************************************************************
        !           320:  */
        !           321: 
        !           322: /**
        !           323:  * Map context number to QPN
        !           324:  *
        !           325:  * @v ctx              Context index
        !           326:  * @ret qpn            Queue pair number
        !           327:  */
        !           328: static int linda_ctx_to_qpn ( unsigned int ctx ) {
        !           329:        /* This mapping is fixed by hardware */
        !           330:        return ( ctx * 2 );
        !           331: }
        !           332: 
        !           333: /**
        !           334:  * Map QPN to context number
        !           335:  *
        !           336:  * @v qpn              Queue pair number
        !           337:  * @ret ctx            Context index
        !           338:  */
        !           339: static int linda_qpn_to_ctx ( unsigned int qpn ) {
        !           340:        /* This mapping is fixed by hardware */
        !           341:        return ( qpn / 2 );
        !           342: }
        !           343: 
        !           344: /**
        !           345:  * Allocate a context
        !           346:  *
        !           347:  * @v linda            Linda device
        !           348:  * @ret ctx            Context index, or negative error
        !           349:  */
        !           350: static int linda_alloc_ctx ( struct linda *linda ) {
        !           351:        unsigned int ctx;
        !           352: 
        !           353:        for ( ctx = 0 ; ctx < LINDA_NUM_CONTEXTS ; ctx++ ) {
        !           354: 
        !           355:                if ( ! linda->used_ctx[ctx] ) {
        !           356:                        linda->used_ctx[ctx ] = 1;
        !           357:                        DBGC2 ( linda, "Linda %p CTX %d allocated\n",
        !           358:                                linda, ctx );
        !           359:                        return ctx;
        !           360:                }
        !           361:        }
        !           362: 
        !           363:        DBGC ( linda, "Linda %p out of available contexts\n", linda );
        !           364:        return -ENOENT;
        !           365: }
        !           366: 
        !           367: /**
        !           368:  * Free a context
        !           369:  *
        !           370:  * @v linda            Linda device
        !           371:  * @v ctx              Context index
        !           372:  */
        !           373: static void linda_free_ctx ( struct linda *linda, unsigned int ctx ) {
        !           374: 
        !           375:        linda->used_ctx[ctx] = 0;
        !           376:        DBGC2 ( linda, "Linda %p CTX %d freed\n", linda, ctx );
        !           377: }
        !           378: 
        !           379: /***************************************************************************
        !           380:  *
        !           381:  * Send datapath
        !           382:  *
        !           383:  ***************************************************************************
        !           384:  */
        !           385: 
        !           386: /** Send buffer toggle bit
        !           387:  *
        !           388:  * We encode send buffers as 7 bits of send buffer index plus a single
        !           389:  * bit which should match the "check" bit in the SendBufAvail array.
        !           390:  */
        !           391: #define LINDA_SEND_BUF_TOGGLE 0x80
        !           392: 
        !           393: /**
        !           394:  * Allocate a send buffer
        !           395:  *
        !           396:  * @v linda            Linda device
        !           397:  * @ret send_buf       Send buffer
        !           398:  *
        !           399:  * You must guarantee that a send buffer is available.  This is done
        !           400:  * by refusing to allocate more TX WQEs in total than the number of
        !           401:  * available send buffers.
        !           402:  */
        !           403: static unsigned int linda_alloc_send_buf ( struct linda *linda ) {
        !           404:        unsigned int send_buf;
        !           405: 
        !           406:        send_buf = linda->send_buf[linda->send_buf_cons];
        !           407:        send_buf ^= LINDA_SEND_BUF_TOGGLE;
        !           408:        linda->send_buf_cons = ( ( linda->send_buf_cons + 1 ) %
        !           409:                                 LINDA_MAX_SEND_BUFS );
        !           410:        return send_buf;
        !           411: }
        !           412: 
        !           413: /**
        !           414:  * Free a send buffer
        !           415:  *
        !           416:  * @v linda            Linda device
        !           417:  * @v send_buf         Send buffer
        !           418:  */
        !           419: static void linda_free_send_buf ( struct linda *linda,
        !           420:                                  unsigned int send_buf ) {
        !           421:        linda->send_buf[linda->send_buf_prod] = send_buf;
        !           422:        linda->send_buf_prod = ( ( linda->send_buf_prod + 1 ) %
        !           423:                                 LINDA_MAX_SEND_BUFS );
        !           424: }
        !           425: 
        !           426: /**
        !           427:  * Check to see if send buffer is in use
        !           428:  *
        !           429:  * @v linda            Linda device
        !           430:  * @v send_buf         Send buffer
        !           431:  * @ret in_use         Send buffer is in use
        !           432:  */
        !           433: static int linda_send_buf_in_use ( struct linda *linda,
        !           434:                                   unsigned int send_buf ) {
        !           435:        unsigned int send_idx;
        !           436:        unsigned int send_check;
        !           437:        unsigned int inusecheck;
        !           438:        unsigned int inuse;
        !           439:        unsigned int check;
        !           440: 
        !           441:        send_idx = ( send_buf & ~LINDA_SEND_BUF_TOGGLE );
        !           442:        send_check = ( !! ( send_buf & LINDA_SEND_BUF_TOGGLE ) );
        !           443:        inusecheck = BIT_GET ( linda->sendbufavail, InUseCheck[send_idx] );
        !           444:        inuse = ( !! ( inusecheck & 0x02 ) );
        !           445:        check = ( !! ( inusecheck & 0x01 ) );
        !           446:        return ( inuse || ( check != send_check ) );
        !           447: }
        !           448: 
        !           449: /**
        !           450:  * Calculate starting offset for send buffer
        !           451:  *
        !           452:  * @v linda            Linda device
        !           453:  * @v send_buf         Send buffer
        !           454:  * @ret offset         Starting offset
        !           455:  */
        !           456: static unsigned long linda_send_buffer_offset ( struct linda *linda,
        !           457:                                                unsigned int send_buf ) {
        !           458:        return ( linda->send_buffer_base +
        !           459:                 ( ( send_buf & ~LINDA_SEND_BUF_TOGGLE ) *
        !           460:                   LINDA_SEND_BUF_SIZE ) );
        !           461: }
        !           462: 
        !           463: /**
        !           464:  * Create send work queue
        !           465:  *
        !           466:  * @v linda            Linda device
        !           467:  * @v qp               Queue pair
        !           468:  */
        !           469: static int linda_create_send_wq ( struct linda *linda,
        !           470:                                  struct ib_queue_pair *qp ) {
        !           471:        struct ib_work_queue *wq = &qp->send;
        !           472:        struct linda_send_work_queue *linda_wq = ib_wq_get_drvdata ( wq );
        !           473:        int rc;
        !           474: 
        !           475:        /* Reserve send buffers */
        !           476:        if ( ( linda->reserved_send_bufs + qp->send.num_wqes ) >
        !           477:             LINDA_MAX_SEND_BUFS ) {
        !           478:                DBGC ( linda, "Linda %p out of send buffers (have %d, used "
        !           479:                       "%d, need %d)\n", linda, LINDA_MAX_SEND_BUFS,
        !           480:                       linda->reserved_send_bufs, qp->send.num_wqes );
        !           481:                rc = -ENOBUFS;
        !           482:                goto err_reserve_bufs;
        !           483:        }
        !           484:        linda->reserved_send_bufs += qp->send.num_wqes;
        !           485: 
        !           486:        /* Reset work queue */
        !           487:        linda_wq->prod = 0;
        !           488:        linda_wq->cons = 0;
        !           489: 
        !           490:        /* Allocate space for send buffer uasge list */
        !           491:        linda_wq->send_buf = zalloc ( qp->send.num_wqes *
        !           492:                                      sizeof ( linda_wq->send_buf[0] ) );
        !           493:        if ( ! linda_wq->send_buf ) {
        !           494:                rc = -ENOBUFS;
        !           495:                goto err_alloc_send_buf;
        !           496:        }
        !           497: 
        !           498:        return 0;
        !           499: 
        !           500:        free ( linda_wq->send_buf );
        !           501:  err_alloc_send_buf:
        !           502:        linda->reserved_send_bufs -= qp->send.num_wqes;
        !           503:  err_reserve_bufs:
        !           504:        return rc;
        !           505: }
        !           506: 
        !           507: /**
        !           508:  * Destroy send work queue
        !           509:  *
        !           510:  * @v linda            Linda device
        !           511:  * @v qp               Queue pair
        !           512:  */
        !           513: static void linda_destroy_send_wq ( struct linda *linda,
        !           514:                                    struct ib_queue_pair *qp ) {
        !           515:        struct ib_work_queue *wq = &qp->send;
        !           516:        struct linda_send_work_queue *linda_wq = ib_wq_get_drvdata ( wq );
        !           517: 
        !           518:        free ( linda_wq->send_buf );
        !           519:        linda->reserved_send_bufs -= qp->send.num_wqes;
        !           520: }
        !           521: 
        !           522: /**
        !           523:  * Initialise send datapath
        !           524:  *
        !           525:  * @v linda            Linda device
        !           526:  * @ret rc             Return status code
        !           527:  */
        !           528: static int linda_init_send ( struct linda *linda ) {
        !           529:        struct QIB_7220_SendBufBase sendbufbase;
        !           530:        struct QIB_7220_SendBufAvailAddr sendbufavailaddr;
        !           531:        struct QIB_7220_SendCtrl sendctrl;
        !           532:        unsigned int i;
        !           533:        int rc;
        !           534: 
        !           535:        /* Retrieve SendBufBase */
        !           536:        linda_readq ( linda, &sendbufbase, QIB_7220_SendBufBase_offset );
        !           537:        linda->send_buffer_base = BIT_GET ( &sendbufbase,
        !           538:                                            BaseAddr_SmallPIO );
        !           539:        DBGC ( linda, "Linda %p send buffers at %lx\n",
        !           540:               linda, linda->send_buffer_base );
        !           541: 
        !           542:        /* Initialise the send_buf[] array */
        !           543:        for ( i = 0 ; i < LINDA_MAX_SEND_BUFS ; i++ )
        !           544:                linda->send_buf[i] = i;
        !           545: 
        !           546:        /* Allocate space for the SendBufAvail array */
        !           547:        linda->sendbufavail = malloc_dma ( sizeof ( *linda->sendbufavail ),
        !           548:                                           LINDA_SENDBUFAVAIL_ALIGN );
        !           549:        if ( ! linda->sendbufavail ) {
        !           550:                rc = -ENOMEM;
        !           551:                goto err_alloc_sendbufavail;
        !           552:        }
        !           553:        memset ( linda->sendbufavail, 0, sizeof ( linda->sendbufavail ) );
        !           554: 
        !           555:        /* Program SendBufAvailAddr into the hardware */
        !           556:        memset ( &sendbufavailaddr, 0, sizeof ( sendbufavailaddr ) );
        !           557:        BIT_FILL_1 ( &sendbufavailaddr, SendBufAvailAddr,
        !           558:                     ( virt_to_bus ( linda->sendbufavail ) >> 6 ) );
        !           559:        linda_writeq ( linda, &sendbufavailaddr,
        !           560:                       QIB_7220_SendBufAvailAddr_offset );
        !           561: 
        !           562:        /* Enable sending and DMA of SendBufAvail */
        !           563:        memset ( &sendctrl, 0, sizeof ( sendctrl ) );
        !           564:        BIT_FILL_2 ( &sendctrl,
        !           565:                     SendBufAvailUpd, 1,
        !           566:                     SPioEnable, 1 );
        !           567:        linda_writeq ( linda, &sendctrl, QIB_7220_SendCtrl_offset );
        !           568: 
        !           569:        return 0;
        !           570: 
        !           571:        free_dma ( linda->sendbufavail, sizeof ( *linda->sendbufavail ) );
        !           572:  err_alloc_sendbufavail:
        !           573:        return rc;
        !           574: }
        !           575: 
        !           576: /**
        !           577:  * Shut down send datapath
        !           578:  *
        !           579:  * @v linda            Linda device
        !           580:  */
        !           581: static void linda_fini_send ( struct linda *linda ) {
        !           582:        struct QIB_7220_SendCtrl sendctrl;
        !           583: 
        !           584:        /* Disable sending and DMA of SendBufAvail */
        !           585:        memset ( &sendctrl, 0, sizeof ( sendctrl ) );
        !           586:        linda_writeq ( linda, &sendctrl, QIB_7220_SendCtrl_offset );
        !           587:        mb();
        !           588: 
        !           589:        /* Ensure hardware has seen this disable */
        !           590:        linda_readq ( linda, &sendctrl, QIB_7220_SendCtrl_offset );
        !           591: 
        !           592:        free_dma ( linda->sendbufavail, sizeof ( *linda->sendbufavail ) );
        !           593: }
        !           594: 
        !           595: /***************************************************************************
        !           596:  *
        !           597:  * Receive datapath
        !           598:  *
        !           599:  ***************************************************************************
        !           600:  */
        !           601: 
        !           602: /**
        !           603:  * Create receive work queue
        !           604:  *
        !           605:  * @v linda            Linda device
        !           606:  * @v qp               Queue pair
        !           607:  * @ret rc             Return status code
        !           608:  */
        !           609: static int linda_create_recv_wq ( struct linda *linda,
        !           610:                                  struct ib_queue_pair *qp ) {
        !           611:        struct ib_work_queue *wq = &qp->recv;
        !           612:        struct linda_recv_work_queue *linda_wq = ib_wq_get_drvdata ( wq );
        !           613:        struct QIB_7220_RcvHdrAddr0 rcvhdraddr;
        !           614:        struct QIB_7220_RcvHdrTailAddr0 rcvhdrtailaddr;
        !           615:        struct QIB_7220_RcvHdrHead0 rcvhdrhead;
        !           616:        struct QIB_7220_scalar rcvegrindexhead;
        !           617:        struct QIB_7220_RcvCtrl rcvctrl;
        !           618:        unsigned int ctx = linda_qpn_to_ctx ( qp->qpn );
        !           619:        int rc;
        !           620: 
        !           621:        /* Reset context information */
        !           622:        memset ( &linda_wq->header_prod, 0,
        !           623:                 sizeof ( linda_wq->header_prod ) );
        !           624:        linda_wq->header_cons = 0;
        !           625:        linda_wq->eager_prod = 0;
        !           626:        linda_wq->eager_cons = 0;
        !           627: 
        !           628:        /* Allocate receive header buffer */
        !           629:        linda_wq->header = malloc_dma ( LINDA_RECV_HEADERS_SIZE,
        !           630:                                        LINDA_RECV_HEADERS_ALIGN );
        !           631:        if ( ! linda_wq->header ) {
        !           632:                rc = -ENOMEM;
        !           633:                goto err_alloc_header;
        !           634:        }
        !           635: 
        !           636:        /* Enable context in hardware */
        !           637:        memset ( &rcvhdraddr, 0, sizeof ( rcvhdraddr ) );
        !           638:        BIT_FILL_1 ( &rcvhdraddr, RcvHdrAddr0,
        !           639:                     ( virt_to_bus ( linda_wq->header ) >> 2 ) );
        !           640:        linda_writeq_array8b ( linda, &rcvhdraddr,
        !           641:                               QIB_7220_RcvHdrAddr0_offset, ctx );
        !           642:        memset ( &rcvhdrtailaddr, 0, sizeof ( rcvhdrtailaddr ) );
        !           643:        BIT_FILL_1 ( &rcvhdrtailaddr, RcvHdrTailAddr0,
        !           644:                     ( virt_to_bus ( &linda_wq->header_prod ) >> 2 ) );
        !           645:        linda_writeq_array8b ( linda, &rcvhdrtailaddr,
        !           646:                               QIB_7220_RcvHdrTailAddr0_offset, ctx );
        !           647:        memset ( &rcvhdrhead, 0, sizeof ( rcvhdrhead ) );
        !           648:        BIT_FILL_1 ( &rcvhdrhead, counter, 1 );
        !           649:        linda_writeq_array64k ( linda, &rcvhdrhead,
        !           650:                                QIB_7220_RcvHdrHead0_offset, ctx );
        !           651:        memset ( &rcvegrindexhead, 0, sizeof ( rcvegrindexhead ) );
        !           652:        BIT_FILL_1 ( &rcvegrindexhead, Value, 1 );
        !           653:        linda_writeq_array64k ( linda, &rcvegrindexhead,
        !           654:                                QIB_7220_RcvEgrIndexHead0_offset, ctx );
        !           655:        linda_readq ( linda, &rcvctrl, QIB_7220_RcvCtrl_offset );
        !           656:        BIT_SET ( &rcvctrl, PortEnable[ctx], 1 );
        !           657:        BIT_SET ( &rcvctrl, IntrAvail[ctx], 1 );
        !           658:        linda_writeq ( linda, &rcvctrl, QIB_7220_RcvCtrl_offset );
        !           659: 
        !           660:        DBGC ( linda, "Linda %p QPN %ld CTX %d hdrs [%lx,%lx) prod %lx\n",
        !           661:               linda, qp->qpn, ctx, virt_to_bus ( linda_wq->header ),
        !           662:               ( virt_to_bus ( linda_wq->header ) + LINDA_RECV_HEADERS_SIZE ),
        !           663:               virt_to_bus ( &linda_wq->header_prod ) );
        !           664:        return 0;
        !           665: 
        !           666:        free_dma ( linda_wq->header, LINDA_RECV_HEADERS_SIZE );
        !           667:  err_alloc_header:
        !           668:        return rc;
        !           669: }
        !           670: 
        !           671: /**
        !           672:  * Destroy receive work queue
        !           673:  *
        !           674:  * @v linda            Linda device
        !           675:  * @v qp               Queue pair
        !           676:  */
        !           677: static void linda_destroy_recv_wq ( struct linda *linda,
        !           678:                                    struct ib_queue_pair *qp ) {
        !           679:        struct ib_work_queue *wq = &qp->recv;
        !           680:        struct linda_recv_work_queue *linda_wq = ib_wq_get_drvdata ( wq );
        !           681:        struct QIB_7220_RcvCtrl rcvctrl;
        !           682:        unsigned int ctx = linda_qpn_to_ctx ( qp->qpn );
        !           683: 
        !           684:        /* Disable context in hardware */
        !           685:        linda_readq ( linda, &rcvctrl, QIB_7220_RcvCtrl_offset );
        !           686:        BIT_SET ( &rcvctrl, PortEnable[ctx], 0 );
        !           687:        BIT_SET ( &rcvctrl, IntrAvail[ctx], 0 );
        !           688:        linda_writeq ( linda, &rcvctrl, QIB_7220_RcvCtrl_offset );
        !           689: 
        !           690:        /* Make sure the hardware has seen that the context is disabled */
        !           691:        linda_readq ( linda, &rcvctrl, QIB_7220_RcvCtrl_offset );
        !           692:        mb();
        !           693: 
        !           694:        /* Free headers ring */
        !           695:        free_dma ( linda_wq->header, LINDA_RECV_HEADERS_SIZE );
        !           696: 
        !           697:        /* Free context */
        !           698:        linda_free_ctx ( linda, ctx );
        !           699: }
        !           700: 
        !           701: /**
        !           702:  * Initialise receive datapath
        !           703:  *
        !           704:  * @v linda            Linda device
        !           705:  * @ret rc             Return status code
        !           706:  */
        !           707: static int linda_init_recv ( struct linda *linda ) {
        !           708:        struct QIB_7220_RcvCtrl rcvctrl;
        !           709:        struct QIB_7220_scalar rcvegrbase;
        !           710:        struct QIB_7220_scalar rcvhdrentsize;
        !           711:        struct QIB_7220_scalar rcvhdrcnt;
        !           712:        struct QIB_7220_RcvBTHQP rcvbthqp;
        !           713:        unsigned int portcfg;
        !           714:        unsigned long egrbase;
        !           715:        unsigned int eager_array_size_0;
        !           716:        unsigned int eager_array_size_other;
        !           717:        unsigned int ctx;
        !           718: 
        !           719:        /* Select configuration based on number of contexts */
        !           720:        switch ( LINDA_NUM_CONTEXTS ) {
        !           721:        case 5:
        !           722:                portcfg = LINDA_PORTCFG_5CTX;
        !           723:                eager_array_size_0 = LINDA_EAGER_ARRAY_SIZE_5CTX_0;
        !           724:                eager_array_size_other = LINDA_EAGER_ARRAY_SIZE_5CTX_OTHER;
        !           725:                break;
        !           726:        case 9:
        !           727:                portcfg = LINDA_PORTCFG_9CTX;
        !           728:                eager_array_size_0 = LINDA_EAGER_ARRAY_SIZE_9CTX_0;
        !           729:                eager_array_size_other = LINDA_EAGER_ARRAY_SIZE_9CTX_OTHER;
        !           730:                break;
        !           731:        case 17:
        !           732:                portcfg = LINDA_PORTCFG_17CTX;
        !           733:                eager_array_size_0 = LINDA_EAGER_ARRAY_SIZE_17CTX_0;
        !           734:                eager_array_size_other = LINDA_EAGER_ARRAY_SIZE_17CTX_OTHER;
        !           735:                break;
        !           736:        default:
        !           737:                linker_assert ( 0, invalid_LINDA_NUM_CONTEXTS );
        !           738:                return -EINVAL;
        !           739:        }
        !           740: 
        !           741:        /* Configure number of contexts */
        !           742:        memset ( &rcvctrl, 0, sizeof ( rcvctrl ) );
        !           743:        BIT_FILL_3 ( &rcvctrl,
        !           744:                     TailUpd, 1,
        !           745:                     PortCfg, portcfg,
        !           746:                     RcvQPMapEnable, 1 );
        !           747:        linda_writeq ( linda, &rcvctrl, QIB_7220_RcvCtrl_offset );
        !           748: 
        !           749:        /* Configure receive header buffer sizes */
        !           750:        memset ( &rcvhdrcnt, 0, sizeof ( rcvhdrcnt ) );
        !           751:        BIT_FILL_1 ( &rcvhdrcnt, Value, LINDA_RECV_HEADER_COUNT );
        !           752:        linda_writeq ( linda, &rcvhdrcnt, QIB_7220_RcvHdrCnt_offset );
        !           753:        memset ( &rcvhdrentsize, 0, sizeof ( rcvhdrentsize ) );
        !           754:        BIT_FILL_1 ( &rcvhdrentsize, Value, ( LINDA_RECV_HEADER_SIZE >> 2 ) );
        !           755:        linda_writeq ( linda, &rcvhdrentsize, QIB_7220_RcvHdrEntSize_offset );
        !           756: 
        !           757:        /* Calculate eager array start addresses for each context */
        !           758:        linda_readq ( linda, &rcvegrbase, QIB_7220_RcvEgrBase_offset );
        !           759:        egrbase = BIT_GET ( &rcvegrbase, Value );
        !           760:        linda->recv_wq[0].eager_array = egrbase;
        !           761:        linda->recv_wq[0].eager_entries = eager_array_size_0;
        !           762:        egrbase += ( eager_array_size_0 * sizeof ( struct QIB_7220_RcvEgr ) );
        !           763:        for ( ctx = 1 ; ctx < LINDA_NUM_CONTEXTS ; ctx++ ) {
        !           764:                linda->recv_wq[ctx].eager_array = egrbase;
        !           765:                linda->recv_wq[ctx].eager_entries = eager_array_size_other;
        !           766:                egrbase += ( eager_array_size_other *
        !           767:                             sizeof ( struct QIB_7220_RcvEgr ) );
        !           768:        }
        !           769:        for ( ctx = 0 ; ctx < LINDA_NUM_CONTEXTS ; ctx++ ) {
        !           770:                DBGC ( linda, "Linda %p CTX %d eager array at %lx (%d "
        !           771:                       "entries)\n", linda, ctx,
        !           772:                       linda->recv_wq[ctx].eager_array,
        !           773:                       linda->recv_wq[ctx].eager_entries );
        !           774:        }
        !           775: 
        !           776:        /* Set the BTH QP for Infinipath packets to an unused value */
        !           777:        memset ( &rcvbthqp, 0, sizeof ( rcvbthqp ) );
        !           778:        BIT_FILL_1 ( &rcvbthqp, RcvBTHQP, LINDA_QP_IDETH );
        !           779:        linda_writeq ( linda, &rcvbthqp, QIB_7220_RcvBTHQP_offset );
        !           780: 
        !           781:        return 0;
        !           782: }
        !           783: 
        !           784: /**
        !           785:  * Shut down receive datapath
        !           786:  *
        !           787:  * @v linda            Linda device
        !           788:  */
        !           789: static void linda_fini_recv ( struct linda *linda __unused ) {
        !           790:        /* Nothing to do; all contexts were already disabled when the
        !           791:         * queue pairs were destroyed
        !           792:         */
        !           793: }
        !           794: 
        !           795: /***************************************************************************
        !           796:  *
        !           797:  * Completion queue operations
        !           798:  *
        !           799:  ***************************************************************************
        !           800:  */
        !           801: 
        !           802: /**
        !           803:  * Create completion queue
        !           804:  *
        !           805:  * @v ibdev            Infiniband device
        !           806:  * @v cq               Completion queue
        !           807:  * @ret rc             Return status code
        !           808:  */
        !           809: static int linda_create_cq ( struct ib_device *ibdev,
        !           810:                             struct ib_completion_queue *cq ) {
        !           811:        struct linda *linda = ib_get_drvdata ( ibdev );
        !           812:        static int cqn;
        !           813: 
        !           814:        /* The hardware has no concept of completion queues.  We
        !           815:         * simply use the association between CQs and WQs (already
        !           816:         * handled by the IB core) to decide which WQs to poll.
        !           817:         *
        !           818:         * We do set a CQN, just to avoid confusing debug messages
        !           819:         * from the IB core.
        !           820:         */
        !           821:        cq->cqn = ++cqn;
        !           822:        DBGC ( linda, "Linda %p CQN %ld created\n", linda, cq->cqn );
        !           823: 
        !           824:        return 0;
        !           825: }
        !           826: 
        !           827: /**
        !           828:  * Destroy completion queue
        !           829:  *
        !           830:  * @v ibdev            Infiniband device
        !           831:  * @v cq               Completion queue
        !           832:  */
        !           833: static void linda_destroy_cq ( struct ib_device *ibdev,
        !           834:                               struct ib_completion_queue *cq ) {
        !           835:        struct linda *linda = ib_get_drvdata ( ibdev );
        !           836: 
        !           837:        /* Nothing to do */
        !           838:        DBGC ( linda, "Linda %p CQN %ld destroyed\n", linda, cq->cqn );
        !           839: }
        !           840: 
        !           841: /***************************************************************************
        !           842:  *
        !           843:  * Queue pair operations
        !           844:  *
        !           845:  ***************************************************************************
        !           846:  */
        !           847: 
        !           848: /**
        !           849:  * Create queue pair
        !           850:  *
        !           851:  * @v ibdev            Infiniband device
        !           852:  * @v qp               Queue pair
        !           853:  * @ret rc             Return status code
        !           854:  */
        !           855: static int linda_create_qp ( struct ib_device *ibdev,
        !           856:                             struct ib_queue_pair *qp ) {
        !           857:        struct linda *linda = ib_get_drvdata ( ibdev );
        !           858:        int ctx;
        !           859:        int rc;
        !           860: 
        !           861:        /* Locate an available context */
        !           862:        ctx = linda_alloc_ctx ( linda );
        !           863:        if ( ctx < 0 ) {
        !           864:                rc = ctx;
        !           865:                goto err_alloc_ctx;
        !           866:        }
        !           867: 
        !           868:        /* Set queue pair number based on context index */
        !           869:        qp->qpn = linda_ctx_to_qpn ( ctx );
        !           870: 
        !           871:        /* Set work-queue private data pointers */
        !           872:        ib_wq_set_drvdata ( &qp->send, &linda->send_wq[ctx] );
        !           873:        ib_wq_set_drvdata ( &qp->recv, &linda->recv_wq[ctx] );
        !           874: 
        !           875:        /* Create receive work queue */
        !           876:        if ( ( rc = linda_create_recv_wq ( linda, qp ) ) != 0 )
        !           877:                goto err_create_recv_wq;
        !           878: 
        !           879:        /* Create send work queue */
        !           880:        if ( ( rc = linda_create_send_wq ( linda, qp ) ) != 0 )
        !           881:                goto err_create_send_wq;
        !           882: 
        !           883:        return 0;
        !           884: 
        !           885:        linda_destroy_send_wq ( linda, qp );
        !           886:  err_create_send_wq:
        !           887:        linda_destroy_recv_wq ( linda, qp );
        !           888:  err_create_recv_wq:
        !           889:        linda_free_ctx ( linda, ctx );
        !           890:  err_alloc_ctx:
        !           891:        return rc;
        !           892: }
        !           893: 
        !           894: /**
        !           895:  * Modify queue pair
        !           896:  *
        !           897:  * @v ibdev            Infiniband device
        !           898:  * @v qp               Queue pair
        !           899:  * @ret rc             Return status code
        !           900:  */
        !           901: static int linda_modify_qp ( struct ib_device *ibdev,
        !           902:                             struct ib_queue_pair *qp ) {
        !           903:        struct linda *linda = ib_get_drvdata ( ibdev );
        !           904: 
        !           905:        /* Nothing to do; the hardware doesn't have a notion of queue
        !           906:         * keys
        !           907:         */
        !           908:        DBGC ( linda, "Linda %p QPN %ld modified\n", linda, qp->qpn );
        !           909:        return 0;
        !           910: }
        !           911: 
        !           912: /**
        !           913:  * Destroy queue pair
        !           914:  *
        !           915:  * @v ibdev            Infiniband device
        !           916:  * @v qp               Queue pair
        !           917:  */
        !           918: static void linda_destroy_qp ( struct ib_device *ibdev,
        !           919:                               struct ib_queue_pair *qp ) {
        !           920:        struct linda *linda = ib_get_drvdata ( ibdev );
        !           921: 
        !           922:        linda_destroy_send_wq ( linda, qp );
        !           923:        linda_destroy_recv_wq ( linda, qp );
        !           924: }
        !           925: 
        !           926: /***************************************************************************
        !           927:  *
        !           928:  * Work request operations
        !           929:  *
        !           930:  ***************************************************************************
        !           931:  */
        !           932: 
        !           933: /**
        !           934:  * Post send work queue entry
        !           935:  *
        !           936:  * @v ibdev            Infiniband device
        !           937:  * @v qp               Queue pair
        !           938:  * @v av               Address vector
        !           939:  * @v iobuf            I/O buffer
        !           940:  * @ret rc             Return status code
        !           941:  */
        !           942: static int linda_post_send ( struct ib_device *ibdev,
        !           943:                             struct ib_queue_pair *qp,
        !           944:                             struct ib_address_vector *av,
        !           945:                             struct io_buffer *iobuf ) {
        !           946:        struct linda *linda = ib_get_drvdata ( ibdev );
        !           947:        struct ib_work_queue *wq = &qp->send;
        !           948:        struct linda_send_work_queue *linda_wq = ib_wq_get_drvdata ( wq );
        !           949:        struct QIB_7220_SendPbc sendpbc;
        !           950:        uint8_t header_buf[IB_MAX_HEADER_SIZE];
        !           951:        struct io_buffer headers;
        !           952:        unsigned int send_buf;
        !           953:        unsigned long start_offset;
        !           954:        unsigned long offset;
        !           955:        size_t len;
        !           956:        ssize_t frag_len;
        !           957:        uint32_t *data;
        !           958: 
        !           959:        /* Allocate send buffer and calculate offset */
        !           960:        send_buf = linda_alloc_send_buf ( linda );
        !           961:        start_offset = offset = linda_send_buffer_offset ( linda, send_buf );
        !           962: 
        !           963:        /* Store I/O buffer and send buffer index */
        !           964:        assert ( wq->iobufs[linda_wq->prod] == NULL );
        !           965:        wq->iobufs[linda_wq->prod] = iobuf;
        !           966:        linda_wq->send_buf[linda_wq->prod] = send_buf;
        !           967: 
        !           968:        /* Construct headers */
        !           969:        iob_populate ( &headers, header_buf, 0, sizeof ( header_buf ) );
        !           970:        iob_reserve ( &headers, sizeof ( header_buf ) );
        !           971:        ib_push ( ibdev, &headers, qp, iob_len ( iobuf ), av );
        !           972: 
        !           973:        /* Calculate packet length */
        !           974:        len = ( ( sizeof ( sendpbc ) + iob_len ( &headers ) +
        !           975:                  iob_len ( iobuf ) + 3 ) & ~3 );
        !           976: 
        !           977:        /* Construct send per-buffer control word */
        !           978:        memset ( &sendpbc, 0, sizeof ( sendpbc ) );
        !           979:        BIT_FILL_2 ( &sendpbc,
        !           980:                     LengthP1_toibc, ( ( len >> 2 ) - 1 ),
        !           981:                     VL15, 1 );
        !           982: 
        !           983:        /* Write SendPbc */
        !           984:        DBG_DISABLE ( DBGLVL_IO );
        !           985:        linda_writeq ( linda, &sendpbc, offset );
        !           986:        offset += sizeof ( sendpbc );
        !           987: 
        !           988:        /* Write headers */
        !           989:        for ( data = headers.data, frag_len = iob_len ( &headers ) ;
        !           990:              frag_len > 0 ; data++, offset += 4, frag_len -= 4 ) {
        !           991:                linda_writel ( linda, *data, offset );
        !           992:        }
        !           993: 
        !           994:        /* Write data */
        !           995:        for ( data = iobuf->data, frag_len = iob_len ( iobuf ) ;
        !           996:              frag_len > 0 ; data++, offset += 4, frag_len -= 4 ) {
        !           997:                linda_writel ( linda, *data, offset );
        !           998:        }
        !           999:        DBG_ENABLE ( DBGLVL_IO );
        !          1000: 
        !          1001:        assert ( ( start_offset + len ) == offset );
        !          1002:        DBGC2 ( linda, "Linda %p QPN %ld TX %d(%d) posted [%lx,%lx)\n",
        !          1003:                linda, qp->qpn, send_buf, linda_wq->prod,
        !          1004:                start_offset, offset );
        !          1005: 
        !          1006:        /* Increment producer counter */
        !          1007:        linda_wq->prod = ( ( linda_wq->prod + 1 ) & ( wq->num_wqes - 1 ) );
        !          1008: 
        !          1009:        return 0;
        !          1010: }
        !          1011: 
        !          1012: /**
        !          1013:  * Complete send work queue entry
        !          1014:  *
        !          1015:  * @v ibdev            Infiniband device
        !          1016:  * @v qp               Queue pair
        !          1017:  * @v wqe_idx          Work queue entry index
        !          1018:  */
        !          1019: static void linda_complete_send ( struct ib_device *ibdev,
        !          1020:                                  struct ib_queue_pair *qp,
        !          1021:                                  unsigned int wqe_idx ) {
        !          1022:        struct linda *linda = ib_get_drvdata ( ibdev );
        !          1023:        struct ib_work_queue *wq = &qp->send;
        !          1024:        struct linda_send_work_queue *linda_wq = ib_wq_get_drvdata ( wq );
        !          1025:        struct io_buffer *iobuf;
        !          1026:        unsigned int send_buf;
        !          1027: 
        !          1028:        /* Parse completion */
        !          1029:        send_buf = linda_wq->send_buf[wqe_idx];
        !          1030:        DBGC2 ( linda, "Linda %p QPN %ld TX %d(%d) complete\n",
        !          1031:                linda, qp->qpn, send_buf, wqe_idx );
        !          1032: 
        !          1033:        /* Complete work queue entry */
        !          1034:        iobuf = wq->iobufs[wqe_idx];
        !          1035:        assert ( iobuf != NULL );
        !          1036:        ib_complete_send ( ibdev, qp, iobuf, 0 );
        !          1037:        wq->iobufs[wqe_idx] = NULL;
        !          1038: 
        !          1039:        /* Free send buffer */
        !          1040:        linda_free_send_buf ( linda, send_buf );
        !          1041: }
        !          1042: 
        !          1043: /**
        !          1044:  * Poll send work queue
        !          1045:  *
        !          1046:  * @v ibdev            Infiniband device
        !          1047:  * @v qp               Queue pair
        !          1048:  */
        !          1049: static void linda_poll_send_wq ( struct ib_device *ibdev,
        !          1050:                                 struct ib_queue_pair *qp ) {
        !          1051:        struct linda *linda = ib_get_drvdata ( ibdev );
        !          1052:        struct ib_work_queue *wq = &qp->send;
        !          1053:        struct linda_send_work_queue *linda_wq = ib_wq_get_drvdata ( wq );
        !          1054:        unsigned int send_buf;
        !          1055: 
        !          1056:        /* Look for completions */
        !          1057:        while ( wq->fill ) {
        !          1058: 
        !          1059:                /* Check to see if send buffer has completed */
        !          1060:                send_buf = linda_wq->send_buf[linda_wq->cons];
        !          1061:                if ( linda_send_buf_in_use ( linda, send_buf ) )
        !          1062:                        break;
        !          1063: 
        !          1064:                /* Complete this buffer */
        !          1065:                linda_complete_send ( ibdev, qp, linda_wq->cons );
        !          1066: 
        !          1067:                /* Increment consumer counter */
        !          1068:                linda_wq->cons = ( ( linda_wq->cons + 1 ) &
        !          1069:                                   ( wq->num_wqes - 1 ) );
        !          1070:        }
        !          1071: }
        !          1072: 
        !          1073: /**
        !          1074:  * Post receive work queue entry
        !          1075:  *
        !          1076:  * @v ibdev            Infiniband device
        !          1077:  * @v qp               Queue pair
        !          1078:  * @v iobuf            I/O buffer
        !          1079:  * @ret rc             Return status code
        !          1080:  */
        !          1081: static int linda_post_recv ( struct ib_device *ibdev,
        !          1082:                             struct ib_queue_pair *qp,
        !          1083:                             struct io_buffer *iobuf ) {
        !          1084:        struct linda *linda = ib_get_drvdata ( ibdev );
        !          1085:        struct ib_work_queue *wq = &qp->recv;
        !          1086:        struct linda_recv_work_queue *linda_wq = ib_wq_get_drvdata ( wq );
        !          1087:        struct QIB_7220_RcvEgr rcvegr;
        !          1088:        struct QIB_7220_scalar rcvegrindexhead;
        !          1089:        unsigned int ctx = linda_qpn_to_ctx ( qp->qpn );
        !          1090:        physaddr_t addr;
        !          1091:        size_t len;
        !          1092:        unsigned int wqe_idx;
        !          1093:        unsigned int bufsize;
        !          1094: 
        !          1095:        /* Sanity checks */
        !          1096:        addr = virt_to_bus ( iobuf->data );
        !          1097:        len = iob_tailroom ( iobuf );
        !          1098:        if ( addr & ( LINDA_EAGER_BUFFER_ALIGN - 1 ) ) {
        !          1099:                DBGC ( linda, "Linda %p QPN %ld misaligned RX buffer "
        !          1100:                       "(%08lx)\n", linda, qp->qpn, addr );
        !          1101:                return -EINVAL;
        !          1102:        }
        !          1103:        if ( len != LINDA_RECV_PAYLOAD_SIZE ) {
        !          1104:                DBGC ( linda, "Linda %p QPN %ld wrong RX buffer size (%zd)\n",
        !          1105:                       linda, qp->qpn, len );
        !          1106:                return -EINVAL;
        !          1107:        }
        !          1108: 
        !          1109:        /* Calculate eager producer index and WQE index */
        !          1110:        wqe_idx = ( linda_wq->eager_prod & ( wq->num_wqes - 1 ) );
        !          1111:        assert ( wq->iobufs[wqe_idx] == NULL );
        !          1112: 
        !          1113:        /* Store I/O buffer */
        !          1114:        wq->iobufs[wqe_idx] = iobuf;
        !          1115: 
        !          1116:        /* Calculate buffer size */
        !          1117:        switch ( LINDA_RECV_PAYLOAD_SIZE ) {
        !          1118:        case 2048:  bufsize = LINDA_EAGER_BUFFER_2K;  break;
        !          1119:        case 4096:  bufsize = LINDA_EAGER_BUFFER_4K;  break;
        !          1120:        case 8192:  bufsize = LINDA_EAGER_BUFFER_8K;  break;
        !          1121:        case 16384: bufsize = LINDA_EAGER_BUFFER_16K; break;
        !          1122:        case 32768: bufsize = LINDA_EAGER_BUFFER_32K; break;
        !          1123:        case 65536: bufsize = LINDA_EAGER_BUFFER_64K; break;
        !          1124:        default:    linker_assert ( 0, invalid_rx_payload_size );
        !          1125:                    bufsize = LINDA_EAGER_BUFFER_NONE;
        !          1126:        }
        !          1127: 
        !          1128:        /* Post eager buffer */
        !          1129:        memset ( &rcvegr, 0, sizeof ( rcvegr ) );
        !          1130:        BIT_FILL_2 ( &rcvegr,
        !          1131:                     Addr, ( addr >> 11 ),
        !          1132:                     BufSize, bufsize );
        !          1133:        linda_writeq_array8b ( linda, &rcvegr,
        !          1134:                               linda_wq->eager_array, linda_wq->eager_prod );
        !          1135:        DBGC2 ( linda, "Linda %p QPN %ld RX egr %d(%d) posted [%lx,%lx)\n",
        !          1136:                linda, qp->qpn, linda_wq->eager_prod, wqe_idx,
        !          1137:                addr, ( addr + len ) );
        !          1138: 
        !          1139:        /* Increment producer index */
        !          1140:        linda_wq->eager_prod = ( ( linda_wq->eager_prod + 1 ) &
        !          1141:                                 ( linda_wq->eager_entries - 1 ) );
        !          1142: 
        !          1143:        /* Update head index */
        !          1144:        memset ( &rcvegrindexhead, 0, sizeof ( rcvegrindexhead ) );
        !          1145:        BIT_FILL_1 ( &rcvegrindexhead,
        !          1146:                     Value, ( ( linda_wq->eager_prod + 1 ) &
        !          1147:                              ( linda_wq->eager_entries - 1 ) ) );
        !          1148:        linda_writeq_array64k ( linda, &rcvegrindexhead,
        !          1149:                                QIB_7220_RcvEgrIndexHead0_offset, ctx );
        !          1150: 
        !          1151:        return 0;
        !          1152: }
        !          1153: 
        !          1154: /**
        !          1155:  * Complete receive work queue entry
        !          1156:  *
        !          1157:  * @v ibdev            Infiniband device
        !          1158:  * @v qp               Queue pair
        !          1159:  * @v header_offs      Header offset
        !          1160:  */
        !          1161: static void linda_complete_recv ( struct ib_device *ibdev,
        !          1162:                                  struct ib_queue_pair *qp,
        !          1163:                                  unsigned int header_offs ) {
        !          1164:        struct linda *linda = ib_get_drvdata ( ibdev );
        !          1165:        struct ib_work_queue *wq = &qp->recv;
        !          1166:        struct linda_recv_work_queue *linda_wq = ib_wq_get_drvdata ( wq );
        !          1167:        struct QIB_7220_RcvHdrFlags *rcvhdrflags;
        !          1168:        struct QIB_7220_RcvEgr rcvegr;
        !          1169:        struct io_buffer headers;
        !          1170:        struct io_buffer *iobuf;
        !          1171:        struct ib_queue_pair *intended_qp;
        !          1172:        struct ib_address_vector av;
        !          1173:        unsigned int rcvtype;
        !          1174:        unsigned int pktlen;
        !          1175:        unsigned int egrindex;
        !          1176:        unsigned int useegrbfr;
        !          1177:        unsigned int iberr, mkerr, tiderr, khdrerr, mtuerr;
        !          1178:        unsigned int lenerr, parityerr, vcrcerr, icrcerr;
        !          1179:        unsigned int err;
        !          1180:        unsigned int hdrqoffset;
        !          1181:        unsigned int header_len;
        !          1182:        unsigned int padded_payload_len;
        !          1183:        unsigned int wqe_idx;
        !          1184:        size_t payload_len;
        !          1185:        int qp0;
        !          1186:        int rc;
        !          1187: 
        !          1188:        /* RcvHdrFlags are at the end of the header entry */
        !          1189:        rcvhdrflags = ( linda_wq->header + header_offs +
        !          1190:                        LINDA_RECV_HEADER_SIZE - sizeof ( *rcvhdrflags ) );
        !          1191:        rcvtype = BIT_GET ( rcvhdrflags, RcvType );
        !          1192:        pktlen = ( BIT_GET ( rcvhdrflags, PktLen ) << 2 );
        !          1193:        egrindex = BIT_GET ( rcvhdrflags, EgrIndex );
        !          1194:        useegrbfr = BIT_GET ( rcvhdrflags, UseEgrBfr );
        !          1195:        hdrqoffset = ( BIT_GET ( rcvhdrflags, HdrqOffset ) << 2 );
        !          1196:        iberr = BIT_GET ( rcvhdrflags, IBErr );
        !          1197:        mkerr = BIT_GET ( rcvhdrflags, MKErr );
        !          1198:        tiderr = BIT_GET ( rcvhdrflags, TIDErr );
        !          1199:        khdrerr = BIT_GET ( rcvhdrflags, KHdrErr );
        !          1200:        mtuerr = BIT_GET ( rcvhdrflags, MTUErr );
        !          1201:        lenerr = BIT_GET ( rcvhdrflags, LenErr );
        !          1202:        parityerr = BIT_GET ( rcvhdrflags, ParityErr );
        !          1203:        vcrcerr = BIT_GET ( rcvhdrflags, VCRCErr );
        !          1204:        icrcerr = BIT_GET ( rcvhdrflags, ICRCErr );
        !          1205:        header_len = ( LINDA_RECV_HEADER_SIZE - hdrqoffset -
        !          1206:                       sizeof ( *rcvhdrflags ) );
        !          1207:        padded_payload_len = ( pktlen - header_len - 4 /* ICRC */ );
        !          1208:        err = ( iberr | mkerr | tiderr | khdrerr | mtuerr |
        !          1209:                lenerr | parityerr | vcrcerr | icrcerr );
        !          1210:        /* IB header is placed immediately before RcvHdrFlags */
        !          1211:        iob_populate ( &headers, ( ( ( void * ) rcvhdrflags ) - header_len ),
        !          1212:                       header_len, header_len );
        !          1213: 
        !          1214:        /* Dump diagnostic information */
        !          1215:        if ( err || ( ! useegrbfr ) ) {
        !          1216:                DBGC ( linda, "Linda %p QPN %ld RX egr %d%s hdr %d type %d "
        !          1217:                       "len %d(%d+%d+4)%s%s%s%s%s%s%s%s%s%s%s\n", linda,
        !          1218:                       qp->qpn, egrindex, ( useegrbfr ? "" : "(unused)" ),
        !          1219:                       ( header_offs / LINDA_RECV_HEADER_SIZE ), rcvtype,
        !          1220:                       pktlen, header_len, padded_payload_len,
        !          1221:                       ( err ? " [Err" : "" ), ( iberr ? " IB" : "" ),
        !          1222:                       ( mkerr ? " MK" : "" ), ( tiderr ? " TID" : "" ),
        !          1223:                       ( khdrerr ? " KHdr" : "" ), ( mtuerr ? " MTU" : "" ),
        !          1224:                       ( lenerr ? " Len" : "" ), ( parityerr ? " Parity" : ""),
        !          1225:                       ( vcrcerr ? " VCRC" : "" ), ( icrcerr ? " ICRC" : "" ),
        !          1226:                       ( err ? "]" : "" ) );
        !          1227:        } else {
        !          1228:                DBGC2 ( linda, "Linda %p QPN %ld RX egr %d hdr %d type %d "
        !          1229:                        "len %d(%d+%d+4)\n", linda, qp->qpn, egrindex,
        !          1230:                        ( header_offs / LINDA_RECV_HEADER_SIZE ), rcvtype,
        !          1231:                        pktlen, header_len, padded_payload_len );
        !          1232:        }
        !          1233:        DBGCP_HDA ( linda, hdrqoffset, headers.data,
        !          1234:                    ( header_len + sizeof ( *rcvhdrflags ) ) );
        !          1235: 
        !          1236:        /* Parse header to generate address vector */
        !          1237:        qp0 = ( qp->qpn == 0 );
        !          1238:        intended_qp = NULL;
        !          1239:        if ( ( rc = ib_pull ( ibdev, &headers, ( qp0 ? &intended_qp : NULL ),
        !          1240:                              &payload_len, &av ) ) != 0 ) {
        !          1241:                DBGC ( linda, "Linda %p could not parse headers: %s\n",
        !          1242:                       linda, strerror ( rc ) );
        !          1243:                err = 1;
        !          1244:        }
        !          1245:        if ( ! intended_qp )
        !          1246:                intended_qp = qp;
        !          1247: 
        !          1248:        /* Complete this buffer and any skipped buffers.  Note that
        !          1249:         * when the hardware runs out of buffers, it will repeatedly
        !          1250:         * report the same buffer (the tail) as a TID error, and that
        !          1251:         * it also has a habit of sometimes skipping over several
        !          1252:         * buffers at once.
        !          1253:         */
        !          1254:        while ( 1 ) {
        !          1255: 
        !          1256:                /* If we have caught up to the producer counter, stop.
        !          1257:                 * This will happen when the hardware first runs out
        !          1258:                 * of buffers and starts reporting TID errors against
        !          1259:                 * the eager buffer it wants to use next.
        !          1260:                 */
        !          1261:                if ( linda_wq->eager_cons == linda_wq->eager_prod )
        !          1262:                        break;
        !          1263: 
        !          1264:                /* If we have caught up to where we should be after
        !          1265:                 * completing this egrindex, stop.  We phrase the test
        !          1266:                 * this way to avoid completing the entire ring when
        !          1267:                 * we receive the same egrindex twice in a row.
        !          1268:                 */
        !          1269:                if ( ( linda_wq->eager_cons ==
        !          1270:                       ( ( egrindex + 1 ) & ( linda_wq->eager_entries - 1 ) )))
        !          1271:                        break;
        !          1272: 
        !          1273:                /* Identify work queue entry and corresponding I/O
        !          1274:                 * buffer.
        !          1275:                 */
        !          1276:                wqe_idx = ( linda_wq->eager_cons & ( wq->num_wqes - 1 ) );
        !          1277:                iobuf = wq->iobufs[wqe_idx];
        !          1278:                assert ( iobuf != NULL );
        !          1279:                wq->iobufs[wqe_idx] = NULL;
        !          1280: 
        !          1281:                /* Complete the eager buffer */
        !          1282:                if ( linda_wq->eager_cons == egrindex ) {
        !          1283:                        /* Completing the eager buffer described in
        !          1284:                         * this header entry.
        !          1285:                         */
        !          1286:                        iob_put ( iobuf, payload_len );
        !          1287:                        rc = ( err ? -EIO : ( useegrbfr ? 0 : -ECANCELED ) );
        !          1288:                        /* Redirect to target QP if necessary */
        !          1289:                        if ( qp != intended_qp ) {
        !          1290:                                DBGC ( linda, "Linda %p redirecting QPN %ld "
        !          1291:                                       "=> %ld\n",
        !          1292:                                       linda, qp->qpn, intended_qp->qpn );
        !          1293:                                /* Compensate for incorrect fill levels */
        !          1294:                                qp->recv.fill--;
        !          1295:                                intended_qp->recv.fill++;
        !          1296:                        }
        !          1297:                        ib_complete_recv ( ibdev, intended_qp, &av, iobuf, rc);
        !          1298:                } else {
        !          1299:                        /* Completing on a skipped-over eager buffer */
        !          1300:                        ib_complete_recv ( ibdev, qp, &av, iobuf, -ECANCELED );
        !          1301:                }
        !          1302: 
        !          1303:                /* Clear eager buffer */
        !          1304:                memset ( &rcvegr, 0, sizeof ( rcvegr ) );
        !          1305:                linda_writeq_array8b ( linda, &rcvegr, linda_wq->eager_array,
        !          1306:                                       linda_wq->eager_cons );
        !          1307: 
        !          1308:                /* Increment consumer index */
        !          1309:                linda_wq->eager_cons = ( ( linda_wq->eager_cons + 1 ) &
        !          1310:                                         ( linda_wq->eager_entries - 1 ) );
        !          1311:        }
        !          1312: }
        !          1313: 
        !          1314: /**
        !          1315:  * Poll receive work queue
        !          1316:  *
        !          1317:  * @v ibdev            Infiniband device
        !          1318:  * @v qp               Queue pair
        !          1319:  */
        !          1320: static void linda_poll_recv_wq ( struct ib_device *ibdev,
        !          1321:                                 struct ib_queue_pair *qp ) {
        !          1322:        struct linda *linda = ib_get_drvdata ( ibdev );
        !          1323:        struct ib_work_queue *wq = &qp->recv;
        !          1324:        struct linda_recv_work_queue *linda_wq = ib_wq_get_drvdata ( wq );
        !          1325:        struct QIB_7220_RcvHdrHead0 rcvhdrhead;
        !          1326:        unsigned int ctx = linda_qpn_to_ctx ( qp->qpn );
        !          1327:        unsigned int header_prod;
        !          1328: 
        !          1329:        /* Check for received packets */
        !          1330:        header_prod = ( BIT_GET ( &linda_wq->header_prod, Value ) << 2 );
        !          1331:        if ( header_prod == linda_wq->header_cons )
        !          1332:                return;
        !          1333: 
        !          1334:        /* Process all received packets */
        !          1335:        while ( linda_wq->header_cons != header_prod ) {
        !          1336: 
        !          1337:                /* Complete the receive */
        !          1338:                linda_complete_recv ( ibdev, qp, linda_wq->header_cons );
        !          1339: 
        !          1340:                /* Increment the consumer offset */
        !          1341:                linda_wq->header_cons += LINDA_RECV_HEADER_SIZE;
        !          1342:                linda_wq->header_cons %= LINDA_RECV_HEADERS_SIZE;
        !          1343:        }
        !          1344: 
        !          1345:        /* Update consumer offset */
        !          1346:        memset ( &rcvhdrhead, 0, sizeof ( rcvhdrhead ) );
        !          1347:        BIT_FILL_2 ( &rcvhdrhead,
        !          1348:                     RcvHeadPointer, ( linda_wq->header_cons >> 2 ),
        !          1349:                     counter, 1 );
        !          1350:        linda_writeq_array64k ( linda, &rcvhdrhead,
        !          1351:                                QIB_7220_RcvHdrHead0_offset, ctx );
        !          1352: }
        !          1353: 
        !          1354: /**
        !          1355:  * Poll completion queue
        !          1356:  *
        !          1357:  * @v ibdev            Infiniband device
        !          1358:  * @v cq               Completion queue
        !          1359:  */
        !          1360: static void linda_poll_cq ( struct ib_device *ibdev,
        !          1361:                            struct ib_completion_queue *cq ) {
        !          1362:        struct ib_work_queue *wq;
        !          1363: 
        !          1364:        /* Poll associated send and receive queues */
        !          1365:        list_for_each_entry ( wq, &cq->work_queues, list ) {
        !          1366:                if ( wq->is_send ) {
        !          1367:                        linda_poll_send_wq ( ibdev, wq->qp );
        !          1368:                } else {
        !          1369:                        linda_poll_recv_wq ( ibdev, wq->qp );
        !          1370:                }
        !          1371:        }
        !          1372: }
        !          1373: 
        !          1374: /***************************************************************************
        !          1375:  *
        !          1376:  * Event queues
        !          1377:  *
        !          1378:  ***************************************************************************
        !          1379:  */
        !          1380: 
        !          1381: /**
        !          1382:  * Poll event queue
        !          1383:  *
        !          1384:  * @v ibdev            Infiniband device
        !          1385:  */
        !          1386: static void linda_poll_eq ( struct ib_device *ibdev ) {
        !          1387:        struct linda *linda = ib_get_drvdata ( ibdev );
        !          1388:        struct QIB_7220_ErrStatus errstatus;
        !          1389:        struct QIB_7220_ErrClear errclear;
        !          1390: 
        !          1391:        /* Check for link status changes */
        !          1392:        DBG_DISABLE ( DBGLVL_IO );
        !          1393:        linda_readq ( linda, &errstatus, QIB_7220_ErrStatus_offset );
        !          1394:        DBG_ENABLE ( DBGLVL_IO );
        !          1395:        if ( BIT_GET ( &errstatus, IBStatusChanged ) ) {
        !          1396:                linda_link_state_changed ( ibdev );
        !          1397:                memset ( &errclear, 0, sizeof ( errclear ) );
        !          1398:                BIT_FILL_1 ( &errclear, IBStatusChangedClear, 1 );
        !          1399:                linda_writeq ( linda, &errclear, QIB_7220_ErrClear_offset );
        !          1400:        }
        !          1401: }
        !          1402: 
        !          1403: /***************************************************************************
        !          1404:  *
        !          1405:  * Infiniband link-layer operations
        !          1406:  *
        !          1407:  ***************************************************************************
        !          1408:  */
        !          1409: 
        !          1410: /**
        !          1411:  * Initialise Infiniband link
        !          1412:  *
        !          1413:  * @v ibdev            Infiniband device
        !          1414:  * @ret rc             Return status code
        !          1415:  */
        !          1416: static int linda_open ( struct ib_device *ibdev ) {
        !          1417:        struct linda *linda = ib_get_drvdata ( ibdev );
        !          1418:        struct QIB_7220_Control control;
        !          1419: 
        !          1420:        /* Disable link */
        !          1421:        linda_readq ( linda, &control, QIB_7220_Control_offset );
        !          1422:        BIT_SET ( &control, LinkEn, 1 );
        !          1423:        linda_writeq ( linda, &control, QIB_7220_Control_offset );
        !          1424:        return 0;
        !          1425: }
        !          1426: 
        !          1427: /**
        !          1428:  * Close Infiniband link
        !          1429:  *
        !          1430:  * @v ibdev            Infiniband device
        !          1431:  */
        !          1432: static void linda_close ( struct ib_device *ibdev ) {
        !          1433:        struct linda *linda = ib_get_drvdata ( ibdev );
        !          1434:        struct QIB_7220_Control control;
        !          1435: 
        !          1436:        /* Disable link */
        !          1437:        linda_readq ( linda, &control, QIB_7220_Control_offset );
        !          1438:        BIT_SET ( &control, LinkEn, 0 );
        !          1439:        linda_writeq ( linda, &control, QIB_7220_Control_offset );
        !          1440: }
        !          1441: 
        !          1442: /***************************************************************************
        !          1443:  *
        !          1444:  * Multicast group operations
        !          1445:  *
        !          1446:  ***************************************************************************
        !          1447:  */
        !          1448: 
        !          1449: /**
        !          1450:  * Attach to multicast group
        !          1451:  *
        !          1452:  * @v ibdev            Infiniband device
        !          1453:  * @v qp               Queue pair
        !          1454:  * @v gid              Multicast GID
        !          1455:  * @ret rc             Return status code
        !          1456:  */
        !          1457: static int linda_mcast_attach ( struct ib_device *ibdev,
        !          1458:                                struct ib_queue_pair *qp,
        !          1459:                                union ib_gid *gid ) {
        !          1460:        struct linda *linda = ib_get_drvdata ( ibdev );
        !          1461: 
        !          1462:        ( void ) linda;
        !          1463:        ( void ) qp;
        !          1464:        ( void ) gid;
        !          1465:        return 0;
        !          1466: }
        !          1467: 
        !          1468: /**
        !          1469:  * Detach from multicast group
        !          1470:  *
        !          1471:  * @v ibdev            Infiniband device
        !          1472:  * @v qp               Queue pair
        !          1473:  * @v gid              Multicast GID
        !          1474:  */
        !          1475: static void linda_mcast_detach ( struct ib_device *ibdev,
        !          1476:                                 struct ib_queue_pair *qp,
        !          1477:                                 union ib_gid *gid ) {
        !          1478:        struct linda *linda = ib_get_drvdata ( ibdev );
        !          1479: 
        !          1480:        ( void ) linda;
        !          1481:        ( void ) qp;
        !          1482:        ( void ) gid;
        !          1483: }
        !          1484: 
        !          1485: /** Linda Infiniband operations */
        !          1486: static struct ib_device_operations linda_ib_operations = {
        !          1487:        .create_cq      = linda_create_cq,
        !          1488:        .destroy_cq     = linda_destroy_cq,
        !          1489:        .create_qp      = linda_create_qp,
        !          1490:        .modify_qp      = linda_modify_qp,
        !          1491:        .destroy_qp     = linda_destroy_qp,
        !          1492:        .post_send      = linda_post_send,
        !          1493:        .post_recv      = linda_post_recv,
        !          1494:        .poll_cq        = linda_poll_cq,
        !          1495:        .poll_eq        = linda_poll_eq,
        !          1496:        .open           = linda_open,
        !          1497:        .close          = linda_close,
        !          1498:        .mcast_attach   = linda_mcast_attach,
        !          1499:        .mcast_detach   = linda_mcast_detach,
        !          1500:        .set_port_info  = linda_set_port_info,
        !          1501:        .set_pkey_table = linda_set_pkey_table,
        !          1502: };
        !          1503: 
        !          1504: /***************************************************************************
        !          1505:  *
        !          1506:  * I2C bus operations
        !          1507:  *
        !          1508:  ***************************************************************************
        !          1509:  */
        !          1510: 
        !          1511: /** Linda I2C bit to GPIO mappings */
        !          1512: static unsigned int linda_i2c_bits[] = {
        !          1513:        [I2C_BIT_SCL] = ( 1 << LINDA_GPIO_SCL ),
        !          1514:        [I2C_BIT_SDA] = ( 1 << LINDA_GPIO_SDA ),
        !          1515: };
        !          1516: 
        !          1517: /**
        !          1518:  * Read Linda I2C line status
        !          1519:  *
        !          1520:  * @v basher           Bit-bashing interface
        !          1521:  * @v bit_id           Bit number
        !          1522:  * @ret zero           Input is a logic 0
        !          1523:  * @ret non-zero       Input is a logic 1
        !          1524:  */
        !          1525: static int linda_i2c_read_bit ( struct bit_basher *basher,
        !          1526:                                unsigned int bit_id ) {
        !          1527:        struct linda *linda =
        !          1528:                container_of ( basher, struct linda, i2c.basher );
        !          1529:        struct QIB_7220_EXTStatus extstatus;
        !          1530:        unsigned int status;
        !          1531: 
        !          1532:        DBG_DISABLE ( DBGLVL_IO );
        !          1533: 
        !          1534:        linda_readq ( linda, &extstatus, QIB_7220_EXTStatus_offset );
        !          1535:        status = ( BIT_GET ( &extstatus, GPIOIn ) & linda_i2c_bits[bit_id] );
        !          1536: 
        !          1537:        DBG_ENABLE ( DBGLVL_IO );
        !          1538: 
        !          1539:        return status;
        !          1540: }
        !          1541: 
        !          1542: /**
        !          1543:  * Write Linda I2C line status
        !          1544:  *
        !          1545:  * @v basher           Bit-bashing interface
        !          1546:  * @v bit_id           Bit number
        !          1547:  * @v data             Value to write
        !          1548:  */
        !          1549: static void linda_i2c_write_bit ( struct bit_basher *basher,
        !          1550:                                  unsigned int bit_id, unsigned long data ) {
        !          1551:        struct linda *linda =
        !          1552:                container_of ( basher, struct linda, i2c.basher );
        !          1553:        struct QIB_7220_EXTCtrl extctrl;
        !          1554:        struct QIB_7220_GPIO gpioout;
        !          1555:        unsigned int bit = linda_i2c_bits[bit_id];
        !          1556:        unsigned int outputs = 0;
        !          1557:        unsigned int output_enables = 0;
        !          1558: 
        !          1559:        DBG_DISABLE ( DBGLVL_IO );
        !          1560: 
        !          1561:        /* Read current GPIO mask and outputs */
        !          1562:        linda_readq ( linda, &extctrl, QIB_7220_EXTCtrl_offset );
        !          1563:        linda_readq ( linda, &gpioout, QIB_7220_GPIOOut_offset );
        !          1564: 
        !          1565:        /* Update outputs and output enables.  I2C lines are tied
        !          1566:         * high, so we always set the output to 0 and use the output
        !          1567:         * enable to control the line.
        !          1568:         */
        !          1569:        output_enables = BIT_GET ( &extctrl, GPIOOe );
        !          1570:        output_enables = ( ( output_enables & ~bit ) | ( ~data & bit ) );
        !          1571:        outputs = BIT_GET ( &gpioout, GPIO );
        !          1572:        outputs = ( outputs & ~bit );
        !          1573:        BIT_SET ( &extctrl, GPIOOe, output_enables );
        !          1574:        BIT_SET ( &gpioout, GPIO, outputs );
        !          1575: 
        !          1576:        /* Write the output enable first; that way we avoid logic
        !          1577:         * hazards.
        !          1578:         */
        !          1579:        linda_writeq ( linda, &extctrl, QIB_7220_EXTCtrl_offset );
        !          1580:        linda_writeq ( linda, &gpioout, QIB_7220_GPIOOut_offset );
        !          1581:        mb();
        !          1582: 
        !          1583:        DBG_ENABLE ( DBGLVL_IO );
        !          1584: }
        !          1585: 
        !          1586: /** Linda I2C bit-bashing interface operations */
        !          1587: static struct bit_basher_operations linda_i2c_basher_ops = {
        !          1588:        .read   = linda_i2c_read_bit,
        !          1589:        .write  = linda_i2c_write_bit,
        !          1590: };
        !          1591: 
        !          1592: /**
        !          1593:  * Initialise Linda I2C subsystem
        !          1594:  *
        !          1595:  * @v linda            Linda device
        !          1596:  * @ret rc             Return status code
        !          1597:  */
        !          1598: static int linda_init_i2c ( struct linda *linda ) {
        !          1599:        static int try_eeprom_address[] = { 0x51, 0x50 };
        !          1600:        unsigned int i;
        !          1601:        int rc;
        !          1602: 
        !          1603:        /* Initialise bus */
        !          1604:        if ( ( rc = init_i2c_bit_basher ( &linda->i2c,
        !          1605:                                          &linda_i2c_basher_ops ) ) != 0 ) {
        !          1606:                DBGC ( linda, "Linda %p could not initialise I2C bus: %s\n",
        !          1607:                       linda, strerror ( rc ) );
        !          1608:                return rc;
        !          1609:        }
        !          1610: 
        !          1611:        /* Probe for devices */
        !          1612:        for ( i = 0 ; i < ( sizeof ( try_eeprom_address ) /
        !          1613:                            sizeof ( try_eeprom_address[0] ) ) ; i++ ) {
        !          1614:                init_i2c_eeprom ( &linda->eeprom, try_eeprom_address[i] );
        !          1615:                if ( ( rc = i2c_check_presence ( &linda->i2c.i2c,
        !          1616:                                                 &linda->eeprom ) ) == 0 ) {
        !          1617:                        DBGC2 ( linda, "Linda %p found EEPROM at %02x\n",
        !          1618:                                linda, try_eeprom_address[i] );
        !          1619:                        return 0;
        !          1620:                }
        !          1621:        }
        !          1622: 
        !          1623:        DBGC ( linda, "Linda %p could not find EEPROM\n", linda );
        !          1624:        return -ENODEV;
        !          1625: }
        !          1626: 
        !          1627: /**
        !          1628:  * Read EEPROM parameters
        !          1629:  *
        !          1630:  * @v linda            Linda device
        !          1631:  * @v guid             GUID to fill in
        !          1632:  * @ret rc             Return status code
        !          1633:  */
        !          1634: static int linda_read_eeprom ( struct linda *linda, union ib_guid *guid ) {
        !          1635:        struct i2c_interface *i2c = &linda->i2c.i2c;
        !          1636:        int rc;
        !          1637: 
        !          1638:        /* Read GUID */
        !          1639:        if ( ( rc = i2c->read ( i2c, &linda->eeprom, LINDA_EEPROM_GUID_OFFSET,
        !          1640:                                guid->bytes, sizeof ( *guid ) ) ) != 0 ) {
        !          1641:                DBGC ( linda, "Linda %p could not read GUID: %s\n",
        !          1642:                       linda, strerror ( rc ) );
        !          1643:                return rc;
        !          1644:        }
        !          1645:        DBGC2 ( linda, "Linda %p has GUID " IB_GUID_FMT "\n",
        !          1646:                linda, IB_GUID_ARGS ( guid ) );
        !          1647: 
        !          1648:        /* Read serial number (debug only) */
        !          1649:        if ( DBG_LOG ) {
        !          1650:                uint8_t serial[LINDA_EEPROM_SERIAL_SIZE + 1];
        !          1651: 
        !          1652:                serial[ sizeof ( serial ) - 1 ] = '\0';
        !          1653:                if ( ( rc = i2c->read ( i2c, &linda->eeprom,
        !          1654:                                        LINDA_EEPROM_SERIAL_OFFSET, serial,
        !          1655:                                        ( sizeof ( serial ) - 1 ) ) ) != 0 ) {
        !          1656:                        DBGC ( linda, "Linda %p could not read serial: %s\n",
        !          1657:                               linda, strerror ( rc ) );
        !          1658:                        return rc;
        !          1659:                }
        !          1660:                DBGC2 ( linda, "Linda %p has serial number \"%s\"\n",
        !          1661:                        linda, serial );
        !          1662:        }
        !          1663: 
        !          1664:        return 0;
        !          1665: }
        !          1666: 
        !          1667: /***************************************************************************
        !          1668:  *
        !          1669:  * External parallel bus access
        !          1670:  *
        !          1671:  ***************************************************************************
        !          1672:  */
        !          1673: 
        !          1674: /**
        !          1675:  * Request ownership of the IB external parallel bus
        !          1676:  *
        !          1677:  * @v linda            Linda device
        !          1678:  * @ret rc             Return status code
        !          1679:  */
        !          1680: static int linda_ib_epb_request ( struct linda *linda ) {
        !          1681:        struct QIB_7220_ibsd_epb_access_ctrl access;
        !          1682:        unsigned int i;
        !          1683: 
        !          1684:        /* Request ownership */
        !          1685:        memset ( &access, 0, sizeof ( access ) );
        !          1686:        BIT_FILL_1 ( &access, sw_ib_epb_req, 1 );
        !          1687:        linda_writeq ( linda, &access, QIB_7220_ibsd_epb_access_ctrl_offset );
        !          1688: 
        !          1689:        /* Wait for ownership to be granted */
        !          1690:        for ( i = 0 ; i < LINDA_EPB_REQUEST_MAX_WAIT_US ; i++ ) {
        !          1691:                linda_readq ( linda, &access,
        !          1692:                              QIB_7220_ibsd_epb_access_ctrl_offset );
        !          1693:                if ( BIT_GET ( &access, sw_ib_epb_req_granted ) )
        !          1694:                        return 0;
        !          1695:                udelay ( 1 );
        !          1696:        }
        !          1697: 
        !          1698:        DBGC ( linda, "Linda %p timed out waiting for IB EPB request\n",
        !          1699:               linda );
        !          1700:        return -ETIMEDOUT;
        !          1701: }
        !          1702: 
        !          1703: /**
        !          1704:  * Wait for IB external parallel bus transaction to complete
        !          1705:  *
        !          1706:  * @v linda            Linda device
        !          1707:  * @v xact             Buffer to hold transaction result
        !          1708:  * @ret rc             Return status code
        !          1709:  */
        !          1710: static int linda_ib_epb_wait ( struct linda *linda,
        !          1711:                            struct QIB_7220_ibsd_epb_transaction_reg *xact ) {
        !          1712:        unsigned int i;
        !          1713: 
        !          1714:        /* Discard first read to allow for signals crossing clock domains */
        !          1715:        linda_readq ( linda, xact, QIB_7220_ibsd_epb_transaction_reg_offset );
        !          1716: 
        !          1717:        for ( i = 0 ; i < LINDA_EPB_XACT_MAX_WAIT_US ; i++ ) {
        !          1718:                linda_readq ( linda, xact,
        !          1719:                              QIB_7220_ibsd_epb_transaction_reg_offset );
        !          1720:                if ( BIT_GET ( xact, ib_epb_rdy ) ) {
        !          1721:                        if ( BIT_GET ( xact, ib_epb_req_error ) ) {
        !          1722:                                DBGC ( linda, "Linda %p EPB transaction "
        !          1723:                                       "failed\n", linda );
        !          1724:                                return -EIO;
        !          1725:                        } else {
        !          1726:                                return 0;
        !          1727:                        }
        !          1728:                }
        !          1729:                udelay ( 1 );
        !          1730:        }
        !          1731: 
        !          1732:        DBGC ( linda, "Linda %p timed out waiting for IB EPB transaction\n",
        !          1733:               linda );
        !          1734:        return -ETIMEDOUT;
        !          1735: }
        !          1736: 
        !          1737: /**
        !          1738:  * Release ownership of the IB external parallel bus
        !          1739:  *
        !          1740:  * @v linda            Linda device
        !          1741:  */
        !          1742: static void linda_ib_epb_release ( struct linda *linda ) {
        !          1743:        struct QIB_7220_ibsd_epb_access_ctrl access;
        !          1744: 
        !          1745:        memset ( &access, 0, sizeof ( access ) );
        !          1746:        BIT_FILL_1 ( &access, sw_ib_epb_req, 0 );
        !          1747:        linda_writeq ( linda, &access, QIB_7220_ibsd_epb_access_ctrl_offset );
        !          1748: }
        !          1749: 
        !          1750: /**
        !          1751:  * Read data via IB external parallel bus
        !          1752:  *
        !          1753:  * @v linda            Linda device
        !          1754:  * @v location         EPB location
        !          1755:  * @ret data           Data read, or negative error
        !          1756:  *
        !          1757:  * You must have already acquired ownership of the IB external
        !          1758:  * parallel bus.
        !          1759:  */
        !          1760: static int linda_ib_epb_read ( struct linda *linda, unsigned int location ) {
        !          1761:        struct QIB_7220_ibsd_epb_transaction_reg xact;
        !          1762:        unsigned int data;
        !          1763:        int rc;
        !          1764: 
        !          1765:        /* Ensure no transaction is currently in progress */
        !          1766:        if ( ( rc = linda_ib_epb_wait ( linda, &xact ) ) != 0 )
        !          1767:                return rc;
        !          1768: 
        !          1769:        /* Process data */
        !          1770:        memset ( &xact, 0, sizeof ( xact ) );
        !          1771:        BIT_FILL_3 ( &xact,
        !          1772:                     ib_epb_address, LINDA_EPB_LOC_ADDRESS ( location ),
        !          1773:                     ib_epb_read_write, LINDA_EPB_READ,
        !          1774:                     ib_epb_cs, LINDA_EPB_LOC_CS ( location ) );
        !          1775:        linda_writeq ( linda, &xact,
        !          1776:                       QIB_7220_ibsd_epb_transaction_reg_offset );
        !          1777: 
        !          1778:        /* Wait for transaction to complete */
        !          1779:        if ( ( rc = linda_ib_epb_wait ( linda, &xact ) ) != 0 )
        !          1780:                return rc;
        !          1781: 
        !          1782:        data = BIT_GET ( &xact, ib_epb_data );
        !          1783:        return data;
        !          1784: }
        !          1785: 
        !          1786: /**
        !          1787:  * Write data via IB external parallel bus
        !          1788:  *
        !          1789:  * @v linda            Linda device
        !          1790:  * @v location         EPB location
        !          1791:  * @v data             Data to write
        !          1792:  * @ret rc             Return status code
        !          1793:  *
        !          1794:  * You must have already acquired ownership of the IB external
        !          1795:  * parallel bus.
        !          1796:  */
        !          1797: static int linda_ib_epb_write ( struct linda *linda, unsigned int location,
        !          1798:                                unsigned int data ) {
        !          1799:        struct QIB_7220_ibsd_epb_transaction_reg xact;
        !          1800:        int rc;
        !          1801: 
        !          1802:        /* Ensure no transaction is currently in progress */
        !          1803:        if ( ( rc = linda_ib_epb_wait ( linda, &xact ) ) != 0 )
        !          1804:                return rc;
        !          1805: 
        !          1806:        /* Process data */
        !          1807:        memset ( &xact, 0, sizeof ( xact ) );
        !          1808:        BIT_FILL_4 ( &xact,
        !          1809:                     ib_epb_data, data,
        !          1810:                     ib_epb_address, LINDA_EPB_LOC_ADDRESS ( location ),
        !          1811:                     ib_epb_read_write, LINDA_EPB_WRITE,
        !          1812:                     ib_epb_cs, LINDA_EPB_LOC_CS ( location ) );
        !          1813:        linda_writeq ( linda, &xact,
        !          1814:                       QIB_7220_ibsd_epb_transaction_reg_offset );
        !          1815: 
        !          1816:        /* Wait for transaction to complete */
        !          1817:        if ( ( rc = linda_ib_epb_wait ( linda, &xact ) ) != 0 )
        !          1818:                return rc;
        !          1819: 
        !          1820:        return 0;
        !          1821: }
        !          1822: 
        !          1823: /**
        !          1824:  * Read/modify/write EPB register
        !          1825:  *
        !          1826:  * @v linda            Linda device
        !          1827:  * @v cs               Chip select
        !          1828:  * @v channel          Channel
        !          1829:  * @v element          Element
        !          1830:  * @v reg              Register
        !          1831:  * @v value            Value to set
        !          1832:  * @v mask             Mask to apply to old value
        !          1833:  * @ret rc             Return status code
        !          1834:  */
        !          1835: static int linda_ib_epb_mod_reg ( struct linda *linda, unsigned int cs,
        !          1836:                                  unsigned int channel, unsigned int element,
        !          1837:                                  unsigned int reg, unsigned int value,
        !          1838:                                  unsigned int mask ) {
        !          1839:        unsigned int location;
        !          1840:        int old_value;
        !          1841:        int rc;
        !          1842: 
        !          1843:        DBG_DISABLE ( DBGLVL_IO );
        !          1844: 
        !          1845:        /* Sanity check */
        !          1846:        assert ( ( value & mask ) == value );
        !          1847: 
        !          1848:        /* Acquire bus ownership */
        !          1849:        if ( ( rc = linda_ib_epb_request ( linda ) ) != 0 )
        !          1850:                goto out;
        !          1851: 
        !          1852:        /* Read existing value, if necessary */
        !          1853:        location = LINDA_EPB_LOC ( cs, channel, element, reg );
        !          1854:        if ( (~mask) & 0xff ) {
        !          1855:                old_value = linda_ib_epb_read ( linda, location );
        !          1856:                if ( old_value < 0 ) {
        !          1857:                        rc = old_value;
        !          1858:                        goto out_release;
        !          1859:                }
        !          1860:        } else {
        !          1861:                old_value = 0;
        !          1862:        }
        !          1863: 
        !          1864:        /* Update value */
        !          1865:        value = ( ( old_value & ~mask ) | value );
        !          1866:        DBGCP ( linda, "Linda %p CS %d EPB(%d,%d,%#02x) %#02x => %#02x\n",
        !          1867:                linda, cs, channel, element, reg, old_value, value );
        !          1868:        if ( ( rc = linda_ib_epb_write ( linda, location, value ) ) != 0 )
        !          1869:                goto out_release;
        !          1870: 
        !          1871:  out_release:
        !          1872:        /* Release bus */
        !          1873:        linda_ib_epb_release ( linda );
        !          1874:  out:
        !          1875:        DBG_ENABLE ( DBGLVL_IO );
        !          1876:        return rc;
        !          1877: }
        !          1878: 
        !          1879: /**
        !          1880:  * Transfer data to/from microcontroller RAM
        !          1881:  *
        !          1882:  * @v linda            Linda device
        !          1883:  * @v address          Starting address
        !          1884:  * @v write            Data to write, or NULL
        !          1885:  * @v read             Data to read, or NULL
        !          1886:  * @v len              Length of data
        !          1887:  * @ret rc             Return status code
        !          1888:  */
        !          1889: static int linda_ib_epb_ram_xfer ( struct linda *linda, unsigned int address,
        !          1890:                                   const void *write, void *read,
        !          1891:                                   size_t len ) {
        !          1892:        unsigned int control;
        !          1893:        unsigned int address_hi;
        !          1894:        unsigned int address_lo;
        !          1895:        int data;
        !          1896:        int rc;
        !          1897: 
        !          1898:        DBG_DISABLE ( DBGLVL_IO );
        !          1899: 
        !          1900:        assert ( ! ( write && read ) );
        !          1901:        assert ( ( address % LINDA_EPB_UC_CHUNK_SIZE ) == 0 );
        !          1902:        assert ( ( len % LINDA_EPB_UC_CHUNK_SIZE ) == 0 );
        !          1903: 
        !          1904:        /* Acquire bus ownership */
        !          1905:        if ( ( rc = linda_ib_epb_request ( linda ) ) != 0 )
        !          1906:                goto out;
        !          1907: 
        !          1908:        /* Process data */
        !          1909:        while ( len ) {
        !          1910: 
        !          1911:                /* Reset the address for each new chunk */
        !          1912:                if ( ( address % LINDA_EPB_UC_CHUNK_SIZE ) == 0 ) {
        !          1913: 
        !          1914:                        /* Write the control register */
        !          1915:                        control = ( read ? LINDA_EPB_UC_CTL_READ :
        !          1916:                                    LINDA_EPB_UC_CTL_WRITE );
        !          1917:                        if ( ( rc = linda_ib_epb_write ( linda,
        !          1918:                                                         LINDA_EPB_UC_CTL,
        !          1919:                                                         control ) ) != 0 )
        !          1920:                                break;
        !          1921: 
        !          1922:                        /* Write the address registers */
        !          1923:                        address_hi = ( address >> 8 );
        !          1924:                        if ( ( rc = linda_ib_epb_write ( linda,
        !          1925:                                                         LINDA_EPB_UC_ADDR_HI,
        !          1926:                                                         address_hi ) ) != 0 )
        !          1927:                                break;
        !          1928:                        address_lo = ( address & 0xff );
        !          1929:                        if ( ( rc = linda_ib_epb_write ( linda,
        !          1930:                                                         LINDA_EPB_UC_ADDR_LO,
        !          1931:                                                         address_lo ) ) != 0 )
        !          1932:                                break;
        !          1933:                }
        !          1934: 
        !          1935:                /* Read or write the data */
        !          1936:                if ( read ) {
        !          1937:                        data = linda_ib_epb_read ( linda, LINDA_EPB_UC_DATA );
        !          1938:                        if ( data < 0 ) {
        !          1939:                                rc = data;
        !          1940:                                break;
        !          1941:                        }
        !          1942:                        *( ( uint8_t * ) read++ ) = data;
        !          1943:                } else {
        !          1944:                        data = *( ( uint8_t * ) write++ );
        !          1945:                        if ( ( rc = linda_ib_epb_write ( linda,
        !          1946:                                                         LINDA_EPB_UC_DATA,
        !          1947:                                                         data ) ) != 0 )
        !          1948:                                break;
        !          1949:                }
        !          1950:                address++;
        !          1951:                len--;
        !          1952: 
        !          1953:                /* Reset the control byte after each chunk */
        !          1954:                if ( ( address % LINDA_EPB_UC_CHUNK_SIZE ) == 0 ) {
        !          1955:                        if ( ( rc = linda_ib_epb_write ( linda,
        !          1956:                                                         LINDA_EPB_UC_CTL,
        !          1957:                                                         0 ) ) != 0 )
        !          1958:                                break;
        !          1959:                }
        !          1960:        }
        !          1961: 
        !          1962:        /* Release bus */
        !          1963:        linda_ib_epb_release ( linda );
        !          1964: 
        !          1965:  out:
        !          1966:        DBG_ENABLE ( DBGLVL_IO );
        !          1967:        return rc;
        !          1968: }
        !          1969: 
        !          1970: /***************************************************************************
        !          1971:  *
        !          1972:  * Infiniband SerDes initialisation
        !          1973:  *
        !          1974:  ***************************************************************************
        !          1975:  */
        !          1976: 
        !          1977: /** A Linda SerDes parameter */
        !          1978: struct linda_serdes_param {
        !          1979:        /** EPB address as constructed by LINDA_EPB_ADDRESS() */
        !          1980:        uint16_t address;
        !          1981:        /** Value to set */
        !          1982:        uint8_t value;
        !          1983:        /** Mask to apply to old value */
        !          1984:        uint8_t mask;
        !          1985: } __packed;
        !          1986: 
        !          1987: /** Magic "all channels" channel number */
        !          1988: #define LINDA_EPB_ALL_CHANNELS 31
        !          1989: 
        !          1990: /** End of SerDes parameter list marker */
        !          1991: #define LINDA_SERDES_PARAM_END { 0, 0, 0 }
        !          1992: 
        !          1993: /**
        !          1994:  * Program IB SerDes register(s)
        !          1995:  *
        !          1996:  * @v linda            Linda device
        !          1997:  * @v param            SerDes parameter
        !          1998:  * @ret rc             Return status code
        !          1999:  */
        !          2000: static int linda_set_serdes_param ( struct linda *linda,
        !          2001:                                    struct linda_serdes_param *param ) {
        !          2002:        unsigned int channel;
        !          2003:        unsigned int channel_start;
        !          2004:        unsigned int channel_end;
        !          2005:        unsigned int element;
        !          2006:        unsigned int reg;
        !          2007:        int rc;
        !          2008: 
        !          2009:        /* Break down the EPB address and determine channels */
        !          2010:        channel = LINDA_EPB_ADDRESS_CHANNEL ( param->address );
        !          2011:        element = LINDA_EPB_ADDRESS_ELEMENT ( param->address );
        !          2012:        reg = LINDA_EPB_ADDRESS_REG ( param->address );
        !          2013:        if ( channel == LINDA_EPB_ALL_CHANNELS ) {
        !          2014:                channel_start = 0;
        !          2015:                channel_end = 3;
        !          2016:        } else {
        !          2017:                channel_start = channel_end = channel;
        !          2018:        }
        !          2019: 
        !          2020:        /* Modify register for each specified channel */
        !          2021:        for ( channel = channel_start ; channel <= channel_end ; channel++ ) {
        !          2022:                if ( ( rc = linda_ib_epb_mod_reg ( linda, LINDA_EPB_CS_SERDES,
        !          2023:                                                   channel, element, reg,
        !          2024:                                                   param->value,
        !          2025:                                                   param->mask ) ) != 0 )
        !          2026:                        return rc;
        !          2027:        }
        !          2028: 
        !          2029:        return 0;
        !          2030: }
        !          2031: 
        !          2032: /**
        !          2033:  * Program IB SerDes registers
        !          2034:  *
        !          2035:  * @v linda            Linda device
        !          2036:  * @v param            SerDes parameters
        !          2037:  * @v count            Number of parameters
        !          2038:  * @ret rc             Return status code
        !          2039:  */
        !          2040: static int linda_set_serdes_params ( struct linda *linda,
        !          2041:                                     struct linda_serdes_param *params ) {
        !          2042:        int rc;
        !          2043: 
        !          2044:        for ( ; params->mask != 0 ; params++ ){
        !          2045:                if ( ( rc = linda_set_serdes_param ( linda,
        !          2046:                                                         params ) ) != 0 )
        !          2047:                        return rc;
        !          2048:        }
        !          2049: 
        !          2050:        return 0;
        !          2051: }
        !          2052: 
        !          2053: #define LINDA_DDS_VAL( amp_d, main_d, ipst_d, ipre_d,                  \
        !          2054:                       amp_s, main_s, ipst_s, ipre_s )                  \
        !          2055:        { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 9, 0x00 ),        \
        !          2056:          ( ( ( amp_d & 0x1f ) << 1 ) | 1 ), 0xff },                    \
        !          2057:        { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 9, 0x01 ),        \
        !          2058:          ( ( ( amp_s & 0x1f ) << 1 ) | 1 ), 0xff },                    \
        !          2059:        { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 9, 0x09 ),        \
        !          2060:          ( ( main_d << 3 ) | 4 | ( ipre_d >> 2 ) ), 0xff },            \
        !          2061:        { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 9, 0x0a ),        \
        !          2062:          ( ( main_s << 3 ) | 4 | ( ipre_s >> 2 ) ), 0xff },            \
        !          2063:        { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 9, 0x06 ),        \
        !          2064:          ( ( ( ipst_d & 0xf ) << 1 ) |                                 \
        !          2065:            ( ( ipre_d & 3 ) << 6 ) | 0x21 ), 0xff },                   \
        !          2066:        { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 9, 0x07 ),        \
        !          2067:          ( ( ( ipst_s & 0xf ) << 1 ) |                                 \
        !          2068:            ( ( ipre_s & 3 ) << 6) | 0x21 ), 0xff }
        !          2069: 
        !          2070: /**
        !          2071:  * Linda SerDes default parameters
        !          2072:  *
        !          2073:  * These magic start-of-day values are taken from the Linux driver.
        !          2074:  */
        !          2075: static struct linda_serdes_param linda_serdes_defaults1[] = {
        !          2076:        /* RXHSCTRL0 */
        !          2077:        { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 6, 0x00 ), 0xd4, 0xff },
        !          2078:        /* VCDL_DAC2 */
        !          2079:        { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 6, 0x05 ), 0x2d, 0xff },
        !          2080:        /* VCDL_CTRL2 */
        !          2081:        { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 6, 0x08 ), 0x03, 0x0f },
        !          2082:        /* START_EQ1 */
        !          2083:        { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 7, 0x27 ), 0x10, 0xff },
        !          2084:        /* START_EQ2 */
        !          2085:        { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 7, 0x28 ), 0x30, 0xff },
        !          2086:        /* BACTRL */
        !          2087:        { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 6, 0x0e ), 0x40, 0xff },
        !          2088:        /* LDOUTCTRL1 */
        !          2089:        { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 7, 0x06 ), 0x04, 0xff },
        !          2090:        /* RXHSSTATUS */
        !          2091:        { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 6, 0x0f ), 0x04, 0xff },
        !          2092:        /* End of this block */
        !          2093:        LINDA_SERDES_PARAM_END
        !          2094: };
        !          2095: static struct linda_serdes_param linda_serdes_defaults2[] = {
        !          2096:        /* LDOUTCTRL1 */
        !          2097:        { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 7, 0x06 ), 0x00, 0xff },
        !          2098:        /* DDS values */
        !          2099:        LINDA_DDS_VAL ( 31, 19, 12, 0, 29, 22, 9, 0 ),
        !          2100:        /* Set Rcv Eq. to Preset node */
        !          2101:        { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 7, 0x27 ), 0x10, 0xff },
        !          2102:        /* DFELTHFDR */
        !          2103:        { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 7, 0x08 ), 0x00, 0xff },
        !          2104:        /* DFELTHHDR */
        !          2105:        { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 7, 0x21 ), 0x00, 0xff },
        !          2106:        /* TLTHFDR */
        !          2107:        { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 7, 0x09 ), 0x02, 0xff },
        !          2108:        /* TLTHHDR */
        !          2109:        { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 7, 0x23 ), 0x02, 0xff },
        !          2110:        /* ZFR */
        !          2111:        { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 7, 0x1b ), 0x0c, 0xff },
        !          2112:        /* ZCNT) */
        !          2113:        { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 7, 0x1c ), 0x0c, 0xff },
        !          2114:        /* GFR */
        !          2115:        { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 7, 0x1e ), 0x10, 0xff },
        !          2116:        /* GHR */
        !          2117:        { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 7, 0x1f ), 0x10, 0xff },
        !          2118:        /* VCDL_CTRL0 toggle */
        !          2119:        { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 6, 0x06 ), 0x20, 0xff },
        !          2120:        { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 6, 0x06 ), 0x00, 0xff },
        !          2121:        /* CMUCTRL5 */
        !          2122:        { LINDA_EPB_ADDRESS (                      7, 0, 0x15 ), 0x80, 0xff },
        !          2123:        /* End of this block */
        !          2124:        LINDA_SERDES_PARAM_END
        !          2125: };
        !          2126: static struct linda_serdes_param linda_serdes_defaults3[] = {
        !          2127:        /* START_EQ1 */
        !          2128:        { LINDA_EPB_ADDRESS ( LINDA_EPB_ALL_CHANNELS, 7, 0x27 ), 0x00, 0x38 },
        !          2129:        /* End of this block */
        !          2130:        LINDA_SERDES_PARAM_END
        !          2131: };
        !          2132: 
        !          2133: /**
        !          2134:  * Program the microcontroller RAM
        !          2135:  *
        !          2136:  * @v linda            Linda device
        !          2137:  * @ret rc             Return status code
        !          2138:  */
        !          2139: static int linda_program_uc_ram ( struct linda *linda ) {
        !          2140:        int rc;
        !          2141: 
        !          2142:        if ( ( rc = linda_ib_epb_ram_xfer ( linda, 0, linda_ib_fw, NULL,
        !          2143:                                            sizeof ( linda_ib_fw ) ) ) != 0 ){
        !          2144:                DBGC ( linda, "Linda %p could not load IB firmware: %s\n",
        !          2145:                       linda, strerror ( rc ) );
        !          2146:                return rc;
        !          2147:        }
        !          2148: 
        !          2149:        return 0;
        !          2150: }
        !          2151: 
        !          2152: /**
        !          2153:  * Verify the microcontroller RAM
        !          2154:  *
        !          2155:  * @v linda            Linda device
        !          2156:  * @ret rc             Return status code
        !          2157:  */
        !          2158: static int linda_verify_uc_ram ( struct linda *linda ) {
        !          2159:        uint8_t verify[LINDA_EPB_UC_CHUNK_SIZE];
        !          2160:        unsigned int offset;
        !          2161:        int rc;
        !          2162: 
        !          2163:        for ( offset = 0 ; offset < sizeof ( linda_ib_fw );
        !          2164:              offset += sizeof ( verify ) ) {
        !          2165:                if ( ( rc = linda_ib_epb_ram_xfer ( linda, offset,
        !          2166:                                                    NULL, verify,
        !          2167:                                                    sizeof (verify) )) != 0 ){
        !          2168:                        DBGC ( linda, "Linda %p could not read back IB "
        !          2169:                               "firmware: %s\n", linda, strerror ( rc ) );
        !          2170:                        return rc;
        !          2171:                }
        !          2172:                if ( memcmp ( ( linda_ib_fw + offset ), verify,
        !          2173:                              sizeof ( verify ) ) != 0 ) {
        !          2174:                        DBGC ( linda, "Linda %p firmware verification failed "
        !          2175:                               "at offset %#x\n", linda, offset );
        !          2176:                        DBGC_HDA ( linda, offset, ( linda_ib_fw + offset ),
        !          2177:                                   sizeof ( verify ) );
        !          2178:                        DBGC_HDA ( linda, offset, verify, sizeof ( verify ) );
        !          2179:                        return -EIO;
        !          2180:                }
        !          2181:        }
        !          2182: 
        !          2183:        DBGC2 ( linda, "Linda %p firmware verified ok\n", linda );
        !          2184:        return 0;
        !          2185: }
        !          2186: 
        !          2187: /**
        !          2188:  * Use the microcontroller to trim the IB link
        !          2189:  *
        !          2190:  * @v linda            Linda device
        !          2191:  * @ret rc             Return status code
        !          2192:  */
        !          2193: static int linda_trim_ib ( struct linda *linda ) {
        !          2194:        struct QIB_7220_IBSerDesCtrl ctrl;
        !          2195:        struct QIB_7220_IntStatus intstatus;
        !          2196:        unsigned int i;
        !          2197:        int rc;
        !          2198: 
        !          2199:        /* Bring the microcontroller out of reset */
        !          2200:        linda_readq ( linda, &ctrl, QIB_7220_IBSerDesCtrl_offset );
        !          2201:        BIT_SET ( &ctrl, ResetIB_uC_Core, 0 );
        !          2202:        linda_writeq ( linda, &ctrl, QIB_7220_IBSerDesCtrl_offset );
        !          2203: 
        !          2204:        /* Wait for the "trim done" signal */
        !          2205:        for ( i = 0 ; i < LINDA_TRIM_DONE_MAX_WAIT_MS ; i++ ) {
        !          2206:                linda_readq ( linda, &intstatus, QIB_7220_IntStatus_offset );
        !          2207:                if ( BIT_GET ( &intstatus, IBSerdesTrimDone ) ) {
        !          2208:                        rc = 0;
        !          2209:                        goto out_reset;
        !          2210:                }
        !          2211:                mdelay ( 1 );
        !          2212:        }
        !          2213: 
        !          2214:        DBGC ( linda, "Linda %p timed out waiting for trim done\n", linda );
        !          2215:        rc = -ETIMEDOUT;
        !          2216:  out_reset:
        !          2217:        /* Put the microcontroller back into reset */
        !          2218:        BIT_SET ( &ctrl, ResetIB_uC_Core, 1 );
        !          2219:        linda_writeq ( linda, &ctrl, QIB_7220_IBSerDesCtrl_offset );
        !          2220: 
        !          2221:        return rc;
        !          2222: }
        !          2223: 
        !          2224: /**
        !          2225:  * Initialise the IB SerDes
        !          2226:  *
        !          2227:  * @v linda            Linda device
        !          2228:  * @ret rc             Return status code
        !          2229:  */
        !          2230: static int linda_init_ib_serdes ( struct linda *linda ) {
        !          2231:        struct QIB_7220_Control control;
        !          2232:        struct QIB_7220_IBCCtrl ibcctrl;
        !          2233:        struct QIB_7220_IBCDDRCtrl ibcddrctrl;
        !          2234:        struct QIB_7220_XGXSCfg xgxscfg;
        !          2235:        int rc;
        !          2236: 
        !          2237:        /* Disable link */
        !          2238:        linda_readq ( linda, &control, QIB_7220_Control_offset );
        !          2239:        BIT_SET ( &control, LinkEn, 0 );
        !          2240:        linda_writeq ( linda, &control, QIB_7220_Control_offset );
        !          2241: 
        !          2242:        /* Configure sensible defaults for IBC */
        !          2243:        memset ( &ibcctrl, 0, sizeof ( ibcctrl ) );
        !          2244:        BIT_FILL_6 ( &ibcctrl, /* Tuning values taken from Linux driver */
        !          2245:                     FlowCtrlPeriod, 0x03,
        !          2246:                     FlowCtrlWaterMark, 0x05,
        !          2247:                     MaxPktLen, ( ( LINDA_RECV_HEADER_SIZE +
        !          2248:                                    LINDA_RECV_PAYLOAD_SIZE +
        !          2249:                                    4 /* ICRC */ ) >> 2 ),
        !          2250:                     PhyerrThreshold, 0xf,
        !          2251:                     OverrunThreshold, 0xf,
        !          2252:                     CreditScale, 0x4 );
        !          2253:        linda_writeq ( linda, &ibcctrl, QIB_7220_IBCCtrl_offset );
        !          2254: 
        !          2255:        /* Force SDR only to avoid needing all the DDR tuning,
        !          2256:         * Mellanox compatibility hacks etc.  SDR is plenty for
        !          2257:         * boot-time operation.
        !          2258:         */
        !          2259:        linda_readq ( linda, &ibcddrctrl, QIB_7220_IBCDDRCtrl_offset );
        !          2260:        BIT_SET ( &ibcddrctrl, IB_ENHANCED_MODE, 0 );
        !          2261:        BIT_SET ( &ibcddrctrl, SD_SPEED_SDR, 1 );
        !          2262:        BIT_SET ( &ibcddrctrl, SD_SPEED_DDR, 0 );
        !          2263:        BIT_SET ( &ibcddrctrl, SD_SPEED_QDR, 0 );
        !          2264:        BIT_SET ( &ibcddrctrl, HRTBT_ENB, 0 );
        !          2265:        BIT_SET ( &ibcddrctrl, HRTBT_AUTO, 0 );
        !          2266:        linda_writeq ( linda, &ibcddrctrl, QIB_7220_IBCDDRCtrl_offset );
        !          2267: 
        !          2268:        /* Set default SerDes parameters */
        !          2269:        if ( ( rc = linda_set_serdes_params ( linda,
        !          2270:                                              linda_serdes_defaults1 ) ) != 0 )
        !          2271:                return rc;
        !          2272:        udelay ( 415 ); /* Magic delay while SerDes sorts itself out */
        !          2273:        if ( ( rc = linda_set_serdes_params ( linda,
        !          2274:                                              linda_serdes_defaults2 ) ) != 0 )
        !          2275:                return rc;
        !          2276: 
        !          2277:        /* Program the microcontroller RAM */
        !          2278:        if ( ( rc = linda_program_uc_ram ( linda ) ) != 0 )
        !          2279:                return rc;
        !          2280: 
        !          2281:        /* Verify the microcontroller RAM contents */
        !          2282:        if ( DBGLVL_LOG ) {
        !          2283:                if ( ( rc = linda_verify_uc_ram ( linda ) ) != 0 )
        !          2284:                        return rc;
        !          2285:        }
        !          2286: 
        !          2287:        /* More SerDes tuning */
        !          2288:        if ( ( rc = linda_set_serdes_params ( linda,
        !          2289:                                              linda_serdes_defaults3 ) ) != 0 )
        !          2290:                return rc;
        !          2291: 
        !          2292:        /* Use the microcontroller to trim the IB link */
        !          2293:        if ( ( rc = linda_trim_ib ( linda ) ) != 0 )
        !          2294:                return rc;
        !          2295: 
        !          2296:        /* Bring XGXS out of reset */
        !          2297:        linda_readq ( linda, &xgxscfg, QIB_7220_XGXSCfg_offset );
        !          2298:        BIT_SET ( &xgxscfg, tx_rx_reset, 0 );
        !          2299:        BIT_SET ( &xgxscfg, xcv_reset, 0 );
        !          2300:        linda_writeq ( linda, &xgxscfg, QIB_7220_XGXSCfg_offset );
        !          2301: 
        !          2302:        return rc;
        !          2303: }
        !          2304: 
        !          2305: /***************************************************************************
        !          2306:  *
        !          2307:  * PCI layer interface
        !          2308:  *
        !          2309:  ***************************************************************************
        !          2310:  */
        !          2311: 
        !          2312: /**
        !          2313:  * Probe PCI device
        !          2314:  *
        !          2315:  * @v pci              PCI device
        !          2316:  * @v id               PCI ID
        !          2317:  * @ret rc             Return status code
        !          2318:  */
        !          2319: static int linda_probe ( struct pci_device *pci ) {
        !          2320:        struct ib_device *ibdev;
        !          2321:        struct linda *linda;
        !          2322:        struct QIB_7220_Revision revision;
        !          2323:        int rc;
        !          2324: 
        !          2325:        /* Allocate Infiniband device */
        !          2326:        ibdev = alloc_ibdev ( sizeof ( *linda ) );
        !          2327:        if ( ! ibdev ) {
        !          2328:                rc = -ENOMEM;
        !          2329:                goto err_alloc_ibdev;
        !          2330:        }
        !          2331:        pci_set_drvdata ( pci, ibdev );
        !          2332:        linda = ib_get_drvdata ( ibdev );
        !          2333:        ibdev->op = &linda_ib_operations;
        !          2334:        ibdev->dev = &pci->dev;
        !          2335:        ibdev->port = 1;
        !          2336: 
        !          2337:        /* Fix up PCI device */
        !          2338:        adjust_pci_device ( pci );
        !          2339: 
        !          2340:        /* Get PCI BARs */
        !          2341:        linda->regs = ioremap ( pci->membase, LINDA_BAR0_SIZE );
        !          2342:        DBGC2 ( linda, "Linda %p has BAR at %08lx\n", linda, pci->membase );
        !          2343: 
        !          2344:        /* Print some general data */
        !          2345:        linda_readq ( linda, &revision, QIB_7220_Revision_offset );
        !          2346:        DBGC2 ( linda, "Linda %p board %02lx v%ld.%ld.%ld.%ld\n", linda,
        !          2347:                BIT_GET ( &revision, BoardID ),
        !          2348:                BIT_GET ( &revision, R_SW ),
        !          2349:                BIT_GET ( &revision, R_Arch ),
        !          2350:                BIT_GET ( &revision, R_ChipRevMajor ),
        !          2351:                BIT_GET ( &revision, R_ChipRevMinor ) );
        !          2352: 
        !          2353:        /* Record link capabilities.  Note that we force SDR only to
        !          2354:         * avoid having to carry extra code for DDR tuning etc.
        !          2355:         */
        !          2356:        ibdev->link_width_enabled = ibdev->link_width_supported =
        !          2357:                ( IB_LINK_WIDTH_4X | IB_LINK_WIDTH_1X );
        !          2358:        ibdev->link_speed_enabled = ibdev->link_speed_supported =
        !          2359:                IB_LINK_SPEED_SDR;
        !          2360: 
        !          2361:        /* Initialise I2C subsystem */
        !          2362:        if ( ( rc = linda_init_i2c ( linda ) ) != 0 )
        !          2363:                goto err_init_i2c;
        !          2364: 
        !          2365:        /* Read EEPROM parameters */
        !          2366:        if ( ( rc = linda_read_eeprom ( linda, &ibdev->node_guid ) ) != 0 )
        !          2367:                goto err_read_eeprom;
        !          2368:        memcpy ( &ibdev->gid.s.guid, &ibdev->node_guid,
        !          2369:                 sizeof ( ibdev->gid.s.guid ) );
        !          2370: 
        !          2371:        /* Initialise send datapath */
        !          2372:        if ( ( rc = linda_init_send ( linda ) ) != 0 )
        !          2373:                goto err_init_send;
        !          2374: 
        !          2375:        /* Initialise receive datapath */
        !          2376:        if ( ( rc = linda_init_recv ( linda ) ) != 0 )
        !          2377:                goto err_init_recv;
        !          2378: 
        !          2379:        /* Initialise the IB SerDes */
        !          2380:        if ( ( rc = linda_init_ib_serdes ( linda ) ) != 0 )
        !          2381:                goto err_init_ib_serdes;
        !          2382: 
        !          2383:        /* Register Infiniband device */
        !          2384:        if ( ( rc = register_ibdev ( ibdev ) ) != 0 ) {
        !          2385:                DBGC ( linda, "Linda %p could not register IB "
        !          2386:                       "device: %s\n", linda, strerror ( rc ) );
        !          2387:                goto err_register_ibdev;
        !          2388:        }
        !          2389: 
        !          2390:        return 0;
        !          2391: 
        !          2392:        unregister_ibdev ( ibdev );
        !          2393:  err_register_ibdev:
        !          2394:        linda_fini_recv ( linda );
        !          2395:  err_init_recv:
        !          2396:        linda_fini_send ( linda );
        !          2397:  err_init_send:
        !          2398:  err_init_ib_serdes:
        !          2399:  err_read_eeprom:
        !          2400:  err_init_i2c:
        !          2401:        ibdev_put ( ibdev );
        !          2402:  err_alloc_ibdev:
        !          2403:        return rc;
        !          2404: }
        !          2405: 
        !          2406: /**
        !          2407:  * Remove PCI device
        !          2408:  *
        !          2409:  * @v pci              PCI device
        !          2410:  */
        !          2411: static void linda_remove ( struct pci_device *pci ) {
        !          2412:        struct ib_device *ibdev = pci_get_drvdata ( pci );
        !          2413:        struct linda *linda = ib_get_drvdata ( ibdev );
        !          2414: 
        !          2415:        unregister_ibdev ( ibdev );
        !          2416:        linda_fini_recv ( linda );
        !          2417:        linda_fini_send ( linda );
        !          2418:        ibdev_put ( ibdev );
        !          2419: }
        !          2420: 
        !          2421: static struct pci_device_id linda_nics[] = {
        !          2422:        PCI_ROM ( 0x1077, 0x7220, "iba7220", "QLE7240/7280 HCA driver", 0 ),
        !          2423: };
        !          2424: 
        !          2425: struct pci_driver linda_driver __pci_driver = {
        !          2426:        .ids = linda_nics,
        !          2427:        .id_count = ( sizeof ( linda_nics ) / sizeof ( linda_nics[0] ) ),
        !          2428:        .probe = linda_probe,
        !          2429:        .remove = linda_remove,
        !          2430: };

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.