net/ncsi: Avoid unused-value build warning from ia64-linux-gcc
[cascardo/linux.git] / net / ncsi / ncsi-aen.c
index d463468..b41a661 100644 (file)
@@ -53,7 +53,9 @@ static int ncsi_aen_handler_lsc(struct ncsi_dev_priv *ndp,
        struct ncsi_aen_lsc_pkt *lsc;
        struct ncsi_channel *nc;
        struct ncsi_channel_mode *ncm;
-       unsigned long old_data;
+       bool chained;
+       int state;
+       unsigned long old_data, data;
        unsigned long flags;
 
        /* Find the NCSI channel */
@@ -62,20 +64,27 @@ static int ncsi_aen_handler_lsc(struct ncsi_dev_priv *ndp,
                return -ENODEV;
 
        /* Update the link status */
-       ncm = &nc->modes[NCSI_MODE_LINK];
        lsc = (struct ncsi_aen_lsc_pkt *)h;
+
+       spin_lock_irqsave(&nc->lock, flags);
+       ncm = &nc->modes[NCSI_MODE_LINK];
        old_data = ncm->data[2];
-       ncm->data[2] = ntohl(lsc->status);
+       data = ntohl(lsc->status);
+       ncm->data[2] = data;
        ncm->data[4] = ntohl(lsc->oem_status);
-       if (!((old_data ^ ncm->data[2]) & 0x1) ||
-           !list_empty(&nc->link))
+
+       chained = !list_empty(&nc->link);
+       state = nc->state;
+       spin_unlock_irqrestore(&nc->lock, flags);
+
+       if (!((old_data ^ data) & 0x1) || chained)
                return 0;
-       if (!(nc->state == NCSI_CHANNEL_INACTIVE && (ncm->data[2] & 0x1)) &&
-           !(nc->state == NCSI_CHANNEL_ACTIVE && !(ncm->data[2] & 0x1)))
+       if (!(state == NCSI_CHANNEL_INACTIVE && (data & 0x1)) &&
+           !(state == NCSI_CHANNEL_ACTIVE && !(data & 0x1)))
                return 0;
 
        if (!(ndp->flags & NCSI_DEV_HWA) &&
-           nc->state == NCSI_CHANNEL_ACTIVE)
+           state == NCSI_CHANNEL_ACTIVE)
                ndp->flags |= NCSI_DEV_RESHUFFLE;
 
        ncsi_stop_channel_monitor(nc);
@@ -97,13 +106,21 @@ static int ncsi_aen_handler_cr(struct ncsi_dev_priv *ndp,
        if (!nc)
                return -ENODEV;
 
+       spin_lock_irqsave(&nc->lock, flags);
        if (!list_empty(&nc->link) ||
-           nc->state != NCSI_CHANNEL_ACTIVE)
+           nc->state != NCSI_CHANNEL_ACTIVE) {
+               spin_unlock_irqrestore(&nc->lock, flags);
                return 0;
+       }
+       spin_unlock_irqrestore(&nc->lock, flags);
 
        ncsi_stop_channel_monitor(nc);
+       spin_lock_irqsave(&nc->lock, flags);
+       nc->state = NCSI_CHANNEL_INVISIBLE;
+       spin_unlock_irqrestore(&nc->lock, flags);
+
        spin_lock_irqsave(&ndp->lock, flags);
-       xchg(&nc->state, NCSI_CHANNEL_INACTIVE);
+       nc->state = NCSI_CHANNEL_INACTIVE;
        list_add_tail_rcu(&nc->link, &ndp->channel_queue);
        spin_unlock_irqrestore(&ndp->lock, flags);