lid = be16_to_cpu(pip->lid);
        /* Must be a valid unicast LID address. */
        if (lid == 0 || lid >= QIB_MULTICAST_LID_BASE)
-               goto err;
-       if (ppd->lid != lid || ppd->lmc != (pip->mkeyprot_resv_lmc & 7)) {
+               smp->status |= IB_SMP_INVALID_FIELD;
+       else if (ppd->lid != lid || ppd->lmc != (pip->mkeyprot_resv_lmc & 7)) {
                if (ppd->lid != lid)
                        qib_set_uevent_bits(ppd, _QIB_EVENT_LID_CHANGE_BIT);
                if (ppd->lmc != (pip->mkeyprot_resv_lmc & 7))
        msl = pip->neighbormtu_mastersmsl & 0xF;
        /* Must be a valid unicast LID address. */
        if (smlid == 0 || smlid >= QIB_MULTICAST_LID_BASE)
-               goto err;
-       if (smlid != ibp->sm_lid || msl != ibp->sm_sl) {
+               smp->status |= IB_SMP_INVALID_FIELD;
+       else if (smlid != ibp->sm_lid || msl != ibp->sm_sl) {
                spin_lock_irqsave(&ibp->lock, flags);
                if (ibp->sm_ah) {
                        if (smlid != ibp->sm_lid)
                if (lwe == 0xFF)
                        lwe = ppd->link_width_supported;
                else if (lwe >= 16 || (lwe & ~ppd->link_width_supported))
-                       goto err;
-               set_link_width_enabled(ppd, lwe);
+                       smp->status |= IB_SMP_INVALID_FIELD;
+               else if (lwe != ppd->link_width_enabled)
+                       set_link_width_enabled(ppd, lwe);
        }
 
        lse = pip->linkspeedactive_enabled & 0xF;
                if (lse == 15)
                        lse = ppd->link_speed_supported;
                else if (lse >= 8 || (lse & ~ppd->link_speed_supported))
-                       goto err;
-               set_link_speed_enabled(ppd, lse);
+                       smp->status |= IB_SMP_INVALID_FIELD;
+               else if (lse != ppd->link_speed_enabled)
+                       set_link_speed_enabled(ppd, lse);
        }
 
        /* Set link down default state. */
                                        IB_LINKINITCMD_POLL);
                break;
        default:
-               goto err;
+               smp->status |= IB_SMP_INVALID_FIELD;
        }
 
        ibp->mkeyprot = pip->mkeyprot_resv_lmc >> 6;
 
        mtu = ib_mtu_enum_to_int((pip->neighbormtu_mastersmsl >> 4) & 0xF);
        if (mtu == -1)
-               goto err;
-       qib_set_mtu(ppd, mtu);
+               smp->status |= IB_SMP_INVALID_FIELD;
+       else
+               qib_set_mtu(ppd, mtu);
 
        /* Set operational VLs */
        vls = (pip->operationalvl_pei_peo_fpi_fpo >> 4) & 0xF;
        if (vls) {
                if (vls > ppd->vls_supported)
-                       goto err;
-               (void) dd->f_set_ib_cfg(ppd, QIB_IB_CFG_OP_VLS, vls);
+                       smp->status |= IB_SMP_INVALID_FIELD;
+               else
+                       (void) dd->f_set_ib_cfg(ppd, QIB_IB_CFG_OP_VLS, vls);
        }
 
        if (pip->mkey_violations == 0)
 
        ore = pip->localphyerrors_overrunerrors;
        if (set_phyerrthreshold(ppd, (ore >> 4) & 0xF))
-               goto err;
+               smp->status |= IB_SMP_INVALID_FIELD;
 
        if (set_overrunthreshold(ppd, (ore & 0xF)))
-               goto err;
+               smp->status |= IB_SMP_INVALID_FIELD;
 
        ibp->subnet_timeout = pip->clientrereg_resv_subnetto & 0x1F;
 
        state = pip->linkspeed_portstate & 0xF;
        lstate = (pip->portphysstate_linkdown >> 4) & 0xF;
        if (lstate && !(state == IB_PORT_DOWN || state == IB_PORT_NOP))
-               goto err;
+               smp->status |= IB_SMP_INVALID_FIELD;
 
        /*
         * Only state changes of DOWN, ARM, and ACTIVE are valid
                        lstate = QIB_IB_LINKDOWN;
                else if (lstate == 3)
                        lstate = QIB_IB_LINKDOWN_DISABLE;
-               else
-                       goto err;
+               else {
+                       smp->status |= IB_SMP_INVALID_FIELD;
+                       break;
+               }
                spin_lock_irqsave(&ppd->lflags_lock, flags);
                ppd->lflags &= ~QIBL_LINKV;
                spin_unlock_irqrestore(&ppd->lflags_lock, flags);
                qib_set_linkstate(ppd, QIB_IB_LINKACTIVE);
                break;
        default:
-               /* XXX We have already partially updated our state! */
-               goto err;
+               smp->status |= IB_SMP_INVALID_FIELD;
        }
 
        ret = subn_get_portinfo(smp, ibdev, port);