- Added support to unmask entire set of device errors and alarms.

Signed-off-by: Sivakumar Subramani <[EMAIL PROTECTED]>
Signed-off-by: Santosh Rastapur <[EMAIL PROTECTED]>
Signed-off-by: Ramkrishna Vepa <[EMAIL PROTECTED]>
---
diff -Nurp orig/drivers/net/s2io.c patch1/drivers/net/s2io.c
--- orig/drivers/net/s2io.c     2007-08-15 08:04:06.000000000 -0700
+++ patch1/drivers/net/s2io.c   2007-08-15 08:55:53.000000000 -0700
@@ -892,8 +892,9 @@ static void free_shared_mem(struct s2io_
                                        k++;
                                }
                                kfree(mac_control->rings[i].ba[j]);
-                               nic->mac_control.stats_info->sw_stat.mem_freed  
                        += (sizeof(struct buffAdd) * 
-                               (rxd_count[nic->rxd_mode] + 1));
+                               nic->mac_control.stats_info->sw_stat.mem_freed 
+= 
+                                       (sizeof(struct buffAdd) * 
+                                       (rxd_count[nic->rxd_mode] + 1));
                        }
                        kfree(mac_control->rings[i].ba);
                        nic->mac_control.stats_info->sw_stat.mem_freed += 
@@ -1732,6 +1733,365 @@ static int s2io_link_fault_indication(st
                return MAC_RMAC_ERR_TIMER;
 }
 
+void en_dis_err_alarms(struct s2io_nic *nic, u16 mask, int flag)
+{
+       struct XENA_dev_config __iomem *bar0 = nic->bar0;
+       register u64 val64 = 0, temp64 = 0, gen_int_mask = 0;
+
+       if (mask & TX_DMA_INTR) {
+               gen_int_mask |= TXDMA_INT_M;
+
+               if (flag == ENABLE_INTRS) {
+
+                       val64 = TXDMA_TDA_INT|TXDMA_PFC_INT|TXDMA_PCC_INT
+                               |TXDMA_TTI_INT|TXDMA_LSO_INT|TXDMA_TPA_INT
+                               |TXDMA_SM_INT;
+                       temp64 = readq(&bar0->txdma_int_mask);
+                       temp64 &= ~((u64) val64);
+                       writeq(temp64, &bar0->txdma_int_mask);
+
+                       val64 = PFC_ECC_DB_ERR|PFC_SM_ERR_ALARM|PFC_MISC_0_ERR
+                               |PFC_MISC_1_ERR|PFC_PCIX_ERR|PFC_ECC_SG_ERR;
+                       temp64 = readq(&bar0->pfc_err_mask);
+                       temp64 &= ~((u64) val64);
+                       writeq(temp64, &bar0->pfc_err_mask);
+
+                       val64 = TDA_Fn_ECC_DB_ERR|TDA_SM0_ERR_ALARM
+                               |TDA_SM1_ERR_ALARM|TDA_Fn_ECC_SG_ERR|
+                               TDA_PCIX_ERR;
+                       temp64 = readq(&bar0->tda_err_mask);
+                       temp64 &= ~((u64) val64);
+                       writeq(temp64, &bar0->tda_err_mask);
+
+                       val64 = PCC_FB_ECC_DB_ERR|PCC_TXB_ECC_DB_ERR
+                               |PCC_SM_ERR_ALARM|PCC_WR_ERR_ALARM|PCC_N_SERR
+                               |PCC_6_COF_OV_ERR|PCC_7_COF_OV_ERR
+                               |PCC_6_LSO_OV_ERR|PCC_7_LSO_OV_ERR
+                               |PCC_FB_ECC_SG_ERR|PCC_TXB_ECC_SG_ERR;
+                       temp64 = readq(&bar0->pcc_err_mask);
+                       temp64 &= ~((u64) val64);
+                       writeq(temp64, &bar0->pcc_err_mask);
+
+                       val64 = TTI_SM_ERR_ALARM|TTI_ECC_SG_ERR|TTI_ECC_DB_ERR;
+                       temp64 = readq(&bar0->tti_err_mask);
+                       temp64 &= ~((u64) val64);
+                       writeq(temp64, &bar0->tti_err_mask);
+
+
+                       val64 = LSO6_ABORT|LSO7_ABORT|LSO6_SM_ERR_ALARM
+                               |LSO7_SM_ERR_ALARM|LSO6_SEND_OFLOW
+                               |LSO7_SEND_OFLOW;
+                       temp64 = readq(&bar0->lso_err_mask);
+                       temp64 &= ~((u64) val64);
+                       writeq(temp64, &bar0->lso_err_mask);
+
+                       val64 = TPA_SM_ERR_ALARM|TPA_TX_FRM_DROP;
+                       temp64 = readq(&bar0->tpa_err_mask);
+                       temp64 &= ~((u64) val64);
+                       writeq(temp64, &bar0->tpa_err_mask);
+
+                       val64 = SM_SM_ERR_ALARM;
+                       temp64 = readq(&bar0->sm_err_mask);
+                       temp64 &= ~((u64) val64);
+                       writeq(temp64, &bar0->sm_err_mask);
+               }
+               else {
+                       val64 = TXDMA_TDA_INT|TXDMA_PFC_INT|TXDMA_PCC_INT
+                               |TXDMA_TTI_INT|TXDMA_LSO_INT|TXDMA_TPA_INT
+                               |TXDMA_SM_INT;
+                       temp64 = readq(&bar0->txdma_int_mask);
+                       temp64 |= ((u64) val64);
+                       writeq(temp64, &bar0->txdma_int_mask);
+
+                       val64 = PFC_ECC_DB_ERR|PFC_SM_ERR_ALARM|PFC_MISC_0_ERR
+                               |PFC_MISC_1_ERR|PFC_PCIX_ERR|PFC_ECC_SG_ERR;
+                       temp64 = readq(&bar0->pfc_err_mask);
+                       temp64 |= ((u64) val64);
+                       writeq(temp64, &bar0->pfc_err_mask);
+
+                       val64 = TDA_Fn_ECC_DB_ERR|TDA_SM0_ERR_ALARM
+                               |TDA_Fn_ECC_SG_ERR|TDA_SM1_ERR_ALARM
+                               |TDA_PCIX_ERR;
+                       temp64 = readq(&bar0->tda_err_mask);
+                       temp64 |= ((u64) val64);
+                       writeq(temp64, &bar0->tda_err_mask);
+
+                       val64 = PCC_FB_ECC_DB_ERR|PCC_TXB_ECC_DB_ERR
+                               |PCC_SM_ERR_ALARM |PCC_WR_ERR_ALARM|PCC_N_SERR
+                               |PCC_FB_ECC_SG_ERR|PCC_TXB_ECC_SG_ERR
+                               |PCC_6_COF_OV_ERR|PCC_7_COF_OV_ERR
+                               |PCC_6_LSO_OV_ERR|PCC_7_LSO_OV_ERR;
+                       temp64 = readq(&bar0->pcc_err_mask);
+                       temp64 |= ((u64) val64);
+                       writeq(temp64, &bar0->pcc_err_mask);
+
+                       val64 = TTI_SM_ERR_ALARM|TTI_ECC_SG_ERR|TTI_ECC_DB_ERR;
+                       temp64 = readq(&bar0->tti_err_mask);
+                       temp64 |= ((u64) val64);
+                       writeq(temp64, &bar0->tti_err_mask);
+
+                       val64 = LSO6_ABORT|LSO7_ABORT|LSO6_SM_ERR_ALARM
+                               |LSO7_SM_ERR_ALARM|LSO6_SEND_OFLOW
+                               |LSO7_SEND_OFLOW;
+                       temp64 = readq(&bar0->lso_err_mask);
+                       temp64 |= ((u64) val64);
+                       writeq(temp64, &bar0->lso_err_mask);
+
+                       val64 = TPA_SM_ERR_ALARM|TPA_TX_FRM_DROP;
+                       temp64 = readq(&bar0->tpa_err_mask);
+                       temp64 |= ((u64) val64);
+                       writeq(temp64, &bar0->tpa_err_mask);
+
+                       val64 = SM_SM_ERR_ALARM;
+                       temp64 = readq(&bar0->sm_err_mask);
+                       temp64 |= ((u64) val64);
+                       writeq(temp64, &bar0->sm_err_mask);
+               }
+       }
+
+       if (mask & TX_MAC_INTR) {
+               gen_int_mask |= TXMAC_INT_M;
+
+               if (flag == ENABLE_INTRS) {
+                       val64 = MAC_INT_STATUS_TMAC_INT;
+                       temp64 = readq(&bar0->mac_int_mask);
+                       temp64 &= ~((u64) val64);
+                       writeq(temp64, &bar0->mac_int_mask);
+
+                       val64 = TMAC_TX_BUF_OVRN|TMAC_TX_SM_ERR|TMAC_ECC_SG_ERR|
+                               TMAC_ECC_DB_ERR|TMAC_DESC_ECC_SG_ERR
+                               |TMAC_DESC_ECC_DB_ERR;
+                       temp64 = readq(&bar0->mac_tmac_err_mask);
+                       temp64 &= ~((u64) val64);
+                       writeq(temp64, &bar0->mac_tmac_err_mask);
+               }
+               else {
+                       val64 = MAC_INT_STATUS_TMAC_INT;
+                       temp64 = readq(&bar0->mac_int_mask);
+                       temp64 |= ((u64) val64);
+                       writeq(temp64, &bar0->mac_int_mask);
+
+                       val64 = TMAC_ECC_SG_ERR|TMAC_ECC_DB_ERR
+                               |TMAC_TX_BUF_OVRN|TMAC_TX_SM_ERR
+                               |TMAC_DESC_ECC_SG_ERR|TMAC_DESC_ECC_DB_ERR;
+                       temp64 = readq(&bar0->mac_tmac_err_mask);
+                       temp64 |= ((u64) val64);
+                       writeq(temp64, &bar0->mac_tmac_err_mask);
+               }
+       }
+
+       if (mask & TX_XGXS_INTR) {
+               gen_int_mask |= TXXGXS_INT_M;
+
+               if (flag == ENABLE_INTRS) {
+                       val64 = XGXS_INT_STATUS_TXGXS;
+                       temp64 = readq(&bar0->xgxs_int_mask);
+                       temp64 &= ~((u64) val64);
+                       writeq(temp64, &bar0->xgxs_int_mask);
+
+                       val64 = TXGXS_ESTORE_UFLOW|TXGXS_TX_SM_ERR|
+                               TXGXS_ECC_SG_ERR|TXGXS_ECC_DB_ERR;
+                       temp64 = readq(&bar0->xgxs_txgxs_err_mask);
+                       temp64 &= ~((u64) val64);
+                       writeq(temp64, &bar0->xgxs_txgxs_err_mask);
+               }
+               else {
+                       val64 = XGXS_INT_STATUS_TXGXS;
+                       temp64 = readq(&bar0->mac_int_mask);
+                       temp64 |= ((u64) val64);
+                       writeq(temp64, &bar0->mac_int_mask);
+
+                       val64 = TXGXS_ECC_SG_ERR|TXGXS_ECC_DB_ERR
+                               |TXGXS_ESTORE_UFLOW|TXGXS_TX_SM_ERR;
+                       temp64 = readq(&bar0->xgxs_txgxs_err_mask);
+                       temp64 |= ((u64) val64);
+                       writeq(temp64, &bar0->xgxs_txgxs_err_mask);
+               }
+       }
+
+       if (mask & RX_DMA_INTR) {
+               gen_int_mask |= RXDMA_INT_M;
+
+               if (flag == ENABLE_INTRS) {
+                       val64 = RXDMA_INT_RC_INT_M|RXDMA_INT_RPA_INT_M
+                               |RXDMA_INT_RDA_INT_M|RXDMA_INT_RTI_INT_M;
+                       temp64 = readq(&bar0->rxdma_int_mask);
+                       temp64 &= ~((u64) val64);
+                       writeq(temp64, &bar0->rxdma_int_mask);
+
+                       val64 = RC_PRCn_ECC_DB_ERR|RC_FTC_ECC_DB_ERR|
+                               RC_PRCn_SM_ERR_ALARM|RC_FTC_SM_ERR_ALARM|
+                               RC_PRCn_ECC_SG_ERR|RC_FTC_ECC_SG_ERR|
+                               RC_RDA_FAIL_WR_Rn;
+                       temp64 = readq(&bar0->rc_err_mask);
+                       temp64 &= ~((u64) val64);
+                       writeq(temp64, &bar0->rc_err_mask);
+
+                       val64 = PRC_PCI_AB_RD_Rn|PRC_PCI_AB_WR_Rn|
+                               PRC_PCI_AB_F_WR_Rn|PRC_PCI_DP_RD_Rn
+                               |PRC_PCI_DP_WR_Rn|
+                               PRC_PCI_DP_F_WR_Rn;
+                       temp64 = readq(&bar0->prc_pcix_err_mask);
+                       temp64 &= ~((u64) val64);
+                       writeq(temp64, &bar0->prc_pcix_err_mask);
+
+                       val64 = RPA_SM_ERR_ALARM|RPA_CREDIT_ERR|
+                               RPA_ECC_SG_ERR|RPA_ECC_DB_ERR;
+                       temp64 = readq(&bar0->rpa_err_mask);
+                       temp64 &= ~((u64) val64);
+                       writeq(temp64, &bar0->rpa_err_mask);
+
+                       val64 = RDA_RXDn_ECC_DB_ERR|RDA_FRM_ECC_DB_N_AERR|
+                               RDA_SM1_ERR_ALARM|RDA_SM0_ERR_ALARM|
+                               RDA_RXD_ECC_DB_SERR|RDA_RXDn_ECC_SG_ERR
+                               |RDA_FRM_ECC_SG_ERR|
+                               RDA_MISC_ERR|RDA_PCIX_ERR;
+                       temp64 = readq(&bar0->rda_err_mask);
+                       temp64 &= ~((u64) val64);
+                       writeq(temp64, &bar0->rda_err_mask);
+
+                       val64 = RTI_SM_ERR_ALARM|RTI_ECC_SG_ERR|RTI_ECC_DB_ERR;
+                       temp64 = readq(&bar0->rti_err_mask);
+                       temp64 &= ~((u64) val64);
+                       writeq(temp64, &bar0->rti_err_mask);
+               }
+               else {
+                       val64 = RXDMA_INT_RC_INT_M|RXDMA_INT_RPA_INT_M
+                               |RXDMA_INT_RDA_INT_M|RXDMA_INT_RTI_INT_M;
+                       temp64 = readq(&bar0->rxdma_int_mask);
+                       temp64 |= ((u64) val64);
+                       writeq(temp64, &bar0->rxdma_int_mask);
+
+                       val64 = RC_PRCn_ECC_SG_ERR|RC_PRCn_ECC_DB_ERR
+                               |RC_FTC_ECC_SG_ERR|RC_FTC_ECC_DB_ERR
+                               |RC_PRCn_SM_ERR_ALARM|RC_FTC_SM_ERR_ALARM
+                               |RC_RDA_FAIL_WR_Rn;
+                       temp64 = readq(&bar0->rc_err_mask);
+                       temp64 |= ((u64) val64);
+                       writeq(temp64, &bar0->rc_err_mask);
+
+                       val64 = PRC_PCI_AB_RD_Rn|PRC_PCI_DP_RD_Rn
+                               |PRC_PCI_AB_WR_Rn|PRC_PCI_DP_WR_Rn
+                               |PRC_PCI_AB_F_WR_Rn|PRC_PCI_DP_F_WR_Rn;
+                       temp64 = readq(&bar0->prc_pcix_err_mask);
+                       temp64 |= ((u64) val64);
+                       writeq(temp64, &bar0->prc_pcix_err_mask);
+
+                       val64 = RPA_ECC_SG_ERR|RPA_ECC_DB_ERR
+                               |RPA_FLUSH_REQUEST|RPA_SM_ERR_ALARM
+                               |RPA_CREDIT_ERR;
+                       temp64 = readq(&bar0->rpa_err_mask);
+                       temp64 |= ((u64) val64);
+                       writeq(temp64, &bar0->rpa_err_mask);
+
+                       val64 = RDA_RXDn_ECC_SG_ERR|RDA_RXDn_ECC_DB_ERR
+                               |RDA_FRM_ECC_SG_ERR|RDA_FRM_ECC_DB_N_AERR
+                               |RDA_SM1_ERR_ALARM|RDA_SM0_ERR_ALARM
+                               |RDA_MISC_ERR|RDA_PCIX_ERR|RDA_RXD_ECC_DB_SERR;
+                       temp64 = readq(&bar0->rda_err_mask);
+                       temp64 |= ((u64) val64);
+                       writeq(temp64, &bar0->rda_err_mask);
+
+                       val64 = RTI_ECC_SG_ERR|RTI_ECC_DB_ERR|RTI_SM_ERR_ALARM;
+                       temp64 = readq(&bar0->rti_err_mask);
+                       temp64 |= ((u64) val64);
+                       writeq(temp64, &bar0->rti_err_mask);
+               }
+       }
+
+       if (mask & RX_MAC_INTR) {
+               gen_int_mask |= RXMAC_INT_M;
+
+               if (flag == ENABLE_INTRS) {
+                       val64 = MAC_INT_STATUS_RMAC_INT;
+                       temp64 = readq(&bar0->mac_int_mask);
+                       temp64 &= ~((u64) val64);
+                       writeq(temp64, &bar0->mac_int_mask);
+
+                       val64 = RMAC_RX_BUFF_OVRN|RMAC_RX_SM_ERR|
+                               RMAC_UNUSED_INT|RMAC_SINGLE_ECC_ERR|
+                               RMAC_DOUBLE_ECC_ERR|RMAC_LINK_STATE_CHANGE_INT;
+                       temp64 = readq(&bar0->mac_rmac_err_mask);
+                       temp64 &= ~((u64) val64);
+                       writeq(temp64, &bar0->mac_rmac_err_mask);
+               }
+               else {
+                       val64 = MAC_INT_STATUS_RMAC_INT;
+                       temp64 = readq(&bar0->mac_int_mask);
+                       temp64 |= ((u64) val64);
+                       writeq(temp64, &bar0->mac_int_mask);
+
+                       val64 = RMAC_RX_BUFF_OVRN|RMAC_FRM_RCVD_INT
+                               |RMAC_UNUSED_INT|RMAC_SINGLE_ECC_ERR
+                               |RMAC_DOUBLE_ECC_ERR|RMAC_LINK_STATE_CHANGE_INT
+                               |RMAC_RX_SM_ERR;
+                       temp64 = readq(&bar0->mac_rmac_err_mask);
+                       temp64 |= ((u64) val64);
+                       writeq(temp64, &bar0->mac_rmac_err_mask);
+               }
+       }
+
+       if (mask & RX_XGXS_INTR)
+       {
+               gen_int_mask |= RXXGXS_INT_M;
+
+               if (flag == ENABLE_INTRS) {
+                       val64 = XGXS_INT_STATUS_RXGXS;
+                       temp64 = readq(&bar0->xgxs_int_mask);
+                       temp64 &= ~((u64) val64);
+                       writeq(temp64, &bar0->xgxs_int_mask);
+
+                       val64 = RXGXS_ESTORE_OFLOW|RXGXS_RX_SM_ERR;
+                       temp64 = readq(&bar0->xgxs_rxgxs_err_mask);
+                       temp64 &= ~((u64) val64);
+                       writeq(temp64, &bar0->xgxs_rxgxs_err_mask);
+               }
+               else {
+                       val64 = XGXS_INT_STATUS_RXGXS;
+                       temp64 = readq(&bar0->xgxs_int_mask);
+                       temp64 |= ((u64) val64);
+                       writeq(temp64, &bar0->xgxs_int_mask);
+
+                       val64 = RXGXS_ESTORE_OFLOW|RXGXS_RX_SM_ERR;
+                       temp64 = readq(&bar0->xgxs_rxgxs_err_mask);
+                       temp64 |= ((u64) val64);
+                       writeq(temp64, &bar0->xgxs_rxgxs_err_mask);
+               }
+       }
+
+       if (mask & MC_INTR) {
+               gen_int_mask |= MC_INT_M;
+
+               if (flag == ENABLE_INTRS) {
+                       val64 = MC_INT_MASK_MC_INT;
+                       temp64 = readq(&bar0->mc_int_mask);
+                       temp64 &= ~((u64) val64);
+                       writeq(temp64, &bar0->mc_int_mask);
+
+                       val64 = MC_ERR_REG_SM_ERR|MC_ERR_REG_ECC_ALL_SNG|
+                               MC_ERR_REG_ECC_ALL_DBL;
+                       temp64 = readq(&bar0->mc_err_mask);
+                       temp64 &= ~((u64) val64);
+                       writeq(temp64, &bar0->mc_err_mask);
+               }
+               else {
+                       val64 = MC_INT_MASK_MC_INT;
+                       temp64 = readq(&bar0->mc_int_mask);
+                       temp64 |= ((u64) val64);
+                       writeq(temp64, &bar0->mc_int_mask);
+
+                       val64 = MC_ERR_REG_ECC_ALL_SNG|MC_ERR_REG_ECC_ALL_DBL
+                               |MC_ERR_REG_SM_ERR|PLL_LOCK_N;
+                       temp64 = readq(&bar0->mc_err_mask);
+                       temp64 |= ((u64) val64);
+                       writeq(temp64, &bar0->mc_err_mask);
+               }
+       }
+       nic->general_int_mask = gen_int_mask;
+
+       /* Remove this line when alarm interrupts are enabled */
+       nic->general_int_mask = 0;
+}
 /**
  *  en_dis_able_nic_intrs - Enable or Disable the interrupts
  *  @nic: device private variable,
@@ -1746,17 +2106,16 @@ static int s2io_link_fault_indication(st
 static void en_dis_able_nic_intrs(struct s2io_nic *nic, u16 mask, int flag)
 {
        struct XENA_dev_config __iomem *bar0 = nic->bar0;
-       register u64 val64 = 0, temp64 = 0;
+       register u64 temp64 = 0, intr_mask = 0;
+
+       intr_mask = nic->general_int_mask;
 
        /*  Top level interrupt classification */
        /*  PIC Interrupts */
-       if ((mask & (TX_PIC_INTR | RX_PIC_INTR))) {
+       if (mask & TX_PIC_INTR) {
                /*  Enable PIC Intrs in the general intr mask register */
-               val64 = TXPIC_INT_M;
+               intr_mask |= TXPIC_INT_M;
                if (flag == ENABLE_INTRS) {
-                       temp64 = readq(&bar0->general_int_mask);
-                       temp64 &= ~((u64) val64);
-                       writeq(temp64, &bar0->general_int_mask);
                        /*
                         * If Hercules adapter enable GPIO otherwise
                         * disable all PCIX, Flash, MDIO, IIC and GPIO
@@ -1771,58 +2130,21 @@ static void en_dis_able_nic_intrs(struct
                                temp64 = readq(&bar0->gpio_int_mask);
                                temp64 &= ~((u64) GPIO_INT_MASK_LINK_UP);
                                writeq(temp64, &bar0->gpio_int_mask);
-                       } else {
+                       } else 
                                writeq(DISABLE_ALL_INTRS, &bar0->pic_int_mask);
-                       }
-                       /*
-                        * No MSI Support is available presently, so TTI and
-                        * RTI interrupts are also disabled.
-                        */
                } else if (flag == DISABLE_INTRS) {
                        /*
                         * Disable PIC Intrs in the general
                         * intr mask register
                         */
                        writeq(DISABLE_ALL_INTRS, &bar0->pic_int_mask);
-                       temp64 = readq(&bar0->general_int_mask);
-                       val64 |= temp64;
-                       writeq(val64, &bar0->general_int_mask);
-               }
-       }
-
-       /*  MAC Interrupts */
-       /*  Enabling/Disabling MAC interrupts */
-       if (mask & (TX_MAC_INTR | RX_MAC_INTR)) {
-               val64 = TXMAC_INT_M | RXMAC_INT_M;
-               if (flag == ENABLE_INTRS) {
-                       temp64 = readq(&bar0->general_int_mask);
-                       temp64 &= ~((u64) val64);
-                       writeq(temp64, &bar0->general_int_mask);
-                       /*
-                        * All MAC block error interrupts are disabled for now
-                        * TODO
-                        */
-               } else if (flag == DISABLE_INTRS) {
-                       /*
-                        * Disable MAC Intrs in the general intr mask register
-                        */
-                       writeq(DISABLE_ALL_INTRS, &bar0->mac_int_mask);
-                       writeq(DISABLE_ALL_INTRS,
-                              &bar0->mac_rmac_err_mask);
-
-                       temp64 = readq(&bar0->general_int_mask);
-                       val64 |= temp64;
-                       writeq(val64, &bar0->general_int_mask);
                }
        }
 
        /*  Tx traffic interrupts */
        if (mask & TX_TRAFFIC_INTR) {
-               val64 = TXTRAFFIC_INT_M;
+               intr_mask |= TXTRAFFIC_INT_M;
                if (flag == ENABLE_INTRS) {
-                       temp64 = readq(&bar0->general_int_mask);
-                       temp64 &= ~((u64) val64);
-                       writeq(temp64, &bar0->general_int_mask);
                        /*
                         * Enable all the Tx side interrupts
                         * writing 0 Enables all 64 TX interrupt levels
@@ -1834,19 +2156,13 @@ static void en_dis_able_nic_intrs(struct
                         * register.
                         */
                        writeq(DISABLE_ALL_INTRS, &bar0->tx_traffic_mask);
-                       temp64 = readq(&bar0->general_int_mask);
-                       val64 |= temp64;
-                       writeq(val64, &bar0->general_int_mask);
                }
        }
 
        /*  Rx traffic interrupts */
        if (mask & RX_TRAFFIC_INTR) {
-               val64 = RXTRAFFIC_INT_M;
+               intr_mask |= RXTRAFFIC_INT_M;
                if (flag == ENABLE_INTRS) {
-                       temp64 = readq(&bar0->general_int_mask);
-                       temp64 &= ~((u64) val64);
-                       writeq(temp64, &bar0->general_int_mask);
                        /* writing 0 Enables all 8 RX interrupt levels */
                        writeq(0x0, &bar0->rx_traffic_mask);
                } else if (flag == DISABLE_INTRS) {
@@ -1855,11 +2171,17 @@ static void en_dis_able_nic_intrs(struct
                         * register.
                         */
                        writeq(DISABLE_ALL_INTRS, &bar0->rx_traffic_mask);
-                       temp64 = readq(&bar0->general_int_mask);
-                       val64 |= temp64;
-                       writeq(val64, &bar0->general_int_mask);
                }
        }
+
+       temp64 = readq(&bar0->general_int_mask);
+       if (flag == ENABLE_INTRS)
+               temp64 &= ~((u64) intr_mask);
+       else
+               temp64 = DISABLE_ALL_INTRS;
+       writeq(temp64, &bar0->general_int_mask);
+
+       nic->general_int_mask = readq(&bar0->general_int_mask);
 }
 
 /**
@@ -2063,14 +2385,6 @@ static int start_nic(struct s2io_nic *ni
        writeq(val64, &bar0->adapter_control);
 
        /*
-        * Clearing any possible Link state change interrupts that
-        * could have popped up just before Enabling the card.
-        */
-       val64 = readq(&bar0->mac_rmac_err_reg);
-       if (val64)
-               writeq(val64, &bar0->mac_rmac_err_reg);
-
-       /*
         * Verify if the device is ready to be enabled, if so enable
         * it.
         */
@@ -2223,9 +2537,9 @@ static void stop_nic(struct s2io_nic *ni
        config = &nic->config;
 
        /*  Disable all interrupts */
+       en_dis_err_alarms(nic, ENA_ALL_INTRS, DISABLE_INTRS);
        interruptible = TX_TRAFFIC_INTR | RX_TRAFFIC_INTR;
-       interruptible |= TX_PIC_INTR | RX_PIC_INTR;
-       interruptible |= TX_MAC_INTR | RX_MAC_INTR;
+       interruptible |= TX_PIC_INTR;
        en_dis_able_nic_intrs(nic, interruptible, DISABLE_INTRS);
 
        /* Clearing Adapter_En bit of ADAPTER_CONTROL Register */
@@ -6670,12 +6984,12 @@ static int s2io_card_up(struct s2io_nic 
        tasklet_init(&sp->task, s2io_tasklet, (unsigned long) dev);
 
        /*  Enable select interrupts */
+       en_dis_err_alarms(sp, ENA_ALL_INTRS, ENABLE_INTRS);
        if (sp->intr_type != INTA)
                en_dis_able_nic_intrs(sp, ENA_ALL_INTRS, DISABLE_INTRS);
        else {
                interruptible = TX_TRAFFIC_INTR | RX_TRAFFIC_INTR;
-               interruptible |= TX_PIC_INTR | RX_PIC_INTR;
-               interruptible |= TX_MAC_INTR | RX_MAC_INTR;
+               interruptible |= TX_PIC_INTR;
                en_dis_able_nic_intrs(sp, interruptible, ENABLE_INTRS);
        }
 
diff -Nurp orig/drivers/net/s2io.h patch1/drivers/net/s2io.h
--- orig/drivers/net/s2io.h     2007-08-15 08:04:06.000000000 -0700
+++ patch1/drivers/net/s2io.h   2007-08-15 08:06:06.000000000 -0700
@@ -892,6 +892,7 @@ struct s2io_nic {
 
        spinlock_t      rx_lock;
        atomic_t        isr_cnt;
+       u64             general_int_mask;
        u64 *ufo_in_band_v;
 #define VPD_STRING_LEN 80
        u8  product_name[VPD_STRING_LEN];
diff -Nurp orig/drivers/net/s2io-regs.h patch1/drivers/net/s2io-regs.h
--- orig/drivers/net/s2io-regs.h        2007-08-15 08:04:06.000000000 -0700
+++ patch1/drivers/net/s2io-regs.h      2007-08-15 08:06:06.000000000 -0700
@@ -325,33 +325,66 @@ struct XENA_dev_config {
 #define TXDMA_TPA_INT                  BIT(5)
 #define TXDMA_SM_INT                   BIT(6)
        u64 pfc_err_reg;
+#define PFC_ECC_SG_ERR                 BIT(7)
+#define PFC_ECC_DB_ERR                 BIT(15)
+#define PFC_SM_ERR_ALARM               BIT(23)
+#define PFC_MISC_0_ERR                 BIT(31)
+#define PFC_MISC_1_ERR                 BIT(32)
+#define PFC_PCIX_ERR                   BIT(39)
        u64 pfc_err_mask;
        u64 pfc_err_alarm;
 
        u64 tda_err_reg;
+#define TDA_Fn_ECC_SG_ERR              vBIT(0xff,0,8)
+#define TDA_Fn_ECC_DB_ERR              vBIT(0xff,8,8)
+#define TDA_SM0_ERR_ALARM              BIT(22)
+#define TDA_SM1_ERR_ALARM              BIT(23)
+#define TDA_PCIX_ERR                   BIT(39)
        u64 tda_err_mask;
        u64 tda_err_alarm;
 
        u64 pcc_err_reg;
-#define PCC_FB_ECC_DB_ERR              vBIT(0xFF, 16, 8)
+#define PCC_FB_ECC_SG_ERR              vBIT(0xFF,0,8)
+#define PCC_TXB_ECC_SG_ERR             vBIT(0xFF,8,8)
+#define PCC_FB_ECC_DB_ERR              vBIT(0xFF,16, 8)
+#define PCC_TXB_ECC_DB_ERR             vBIT(0xff,24,8)
+#define PCC_SM_ERR_ALARM               vBIT(0xff,32,8)
+#define PCC_WR_ERR_ALARM               vBIT(0xff,40,8)
+#define PCC_N_SERR                     vBIT(0xff,48,8)
+#define PCC_6_COF_OV_ERR               BIT(56)
+#define PCC_7_COF_OV_ERR               BIT(57)
+#define PCC_6_LSO_OV_ERR               BIT(58)
+#define PCC_7_LSO_OV_ERR               BIT(59)
 #define PCC_ENABLE_FOUR                        vBIT(0x0F,0,8)
-
        u64 pcc_err_mask;
        u64 pcc_err_alarm;
 
        u64 tti_err_reg;
+#define TTI_ECC_SG_ERR                 BIT(7)
+#define TTI_ECC_DB_ERR                 BIT(15)
+#define TTI_SM_ERR_ALARM               BIT(23)
        u64 tti_err_mask;
        u64 tti_err_alarm;
 
        u64 lso_err_reg;
+#define LSO6_SEND_OFLOW                        BIT(12)
+#define LSO7_SEND_OFLOW                        BIT(13)
+#define LSO6_ABORT                     BIT(14)
+#define LSO7_ABORT                     BIT(15)
+#define LSO6_SM_ERR_ALARM              BIT(22)
+#define LSO7_SM_ERR_ALARM              BIT(23)
        u64 lso_err_mask;
        u64 lso_err_alarm;
 
        u64 tpa_err_reg;
+#define TPA_TX_FRM_DROP                        BIT(7)
+#define TPA_SM_ERR_ALARM               BIT(23)
+
        u64 tpa_err_mask;
        u64 tpa_err_alarm;
 
        u64 sm_err_reg;
+#define SM_SM_ERR_ALARM                        BIT(15)
        u64 sm_err_mask;
        u64 sm_err_alarm;
 
@@ -450,22 +483,52 @@ struct XENA_dev_config {
 #define RXDMA_INT_RTI_INT_M            BIT(3)
 
        u64 rda_err_reg;
+#define RDA_RXDn_ECC_SG_ERR            vBIT(0xFF,0,8)
+#define RDA_RXDn_ECC_DB_ERR            vBIT(0xFF,8,8)
+#define RDA_FRM_ECC_SG_ERR             BIT(23)
+#define RDA_FRM_ECC_DB_N_AERR          BIT(31)
+#define RDA_SM1_ERR_ALARM              BIT(38)
+#define RDA_SM0_ERR_ALARM              BIT(39)
+#define RDA_MISC_ERR                   BIT(47)
+#define RDA_PCIX_ERR                   BIT(55)
+#define RDA_RXD_ECC_DB_SERR            BIT(63)
        u64 rda_err_mask;
        u64 rda_err_alarm;
 
        u64 rc_err_reg;
+#define RC_PRCn_ECC_SG_ERR             vBIT(0xFF,0,8)
+#define RC_PRCn_ECC_DB_ERR             vBIT(0xFF,8,8)
+#define RC_FTC_ECC_SG_ERR              BIT(23)
+#define RC_FTC_ECC_DB_ERR              BIT(31)
+#define RC_PRCn_SM_ERR_ALARM           vBIT(0xFF,32,8)
+#define RC_FTC_SM_ERR_ALARM            BIT(47)
+#define RC_RDA_FAIL_WR_Rn              vBIT(0xFF,48,8)
        u64 rc_err_mask;
        u64 rc_err_alarm;
 
        u64 prc_pcix_err_reg;
+#define PRC_PCI_AB_RD_Rn               vBIT(0xFF,0,8)
+#define PRC_PCI_DP_RD_Rn               vBIT(0xFF,8,8)
+#define PRC_PCI_AB_WR_Rn               vBIT(0xFF,16,8)
+#define PRC_PCI_DP_WR_Rn               vBIT(0xFF,24,8)
+#define PRC_PCI_AB_F_WR_Rn             vBIT(0xFF,32,8)
+#define PRC_PCI_DP_F_WR_Rn             vBIT(0xFF,40,8)
        u64 prc_pcix_err_mask;
        u64 prc_pcix_err_alarm;
 
        u64 rpa_err_reg;
+#define RPA_ECC_SG_ERR                 BIT(7)
+#define RPA_ECC_DB_ERR                 BIT(15)
+#define RPA_FLUSH_REQUEST              BIT(22)
+#define RPA_SM_ERR_ALARM               BIT(23)
+#define RPA_CREDIT_ERR                 BIT(31)
        u64 rpa_err_mask;
        u64 rpa_err_alarm;
 
        u64 rti_err_reg;
+#define RTI_ECC_SG_ERR                 BIT(7)
+#define RTI_ECC_DB_ERR                 BIT(15)
+#define RTI_SM_ERR_ALARM               BIT(23)
        u64 rti_err_mask;
        u64 rti_err_alarm;
 
@@ -582,17 +645,43 @@ struct XENA_dev_config {
 #define MAC_INT_STATUS_RMAC_INT            BIT(1)
 
        u64 mac_tmac_err_reg;
-#define TMAC_ERR_REG_TMAC_ECC_DB_ERR       BIT(15)
-#define TMAC_ERR_REG_TMAC_TX_BUF_OVRN      BIT(23)
-#define TMAC_ERR_REG_TMAC_TX_CRI_ERR       BIT(31)
+#define TMAC_ECC_SG_ERR                                BIT(7)
+#define TMAC_ECC_DB_ERR                                BIT(15)
+#define TMAC_TX_BUF_OVRN                       BIT(23)
+#define TMAC_TX_CRI_ERR                                BIT(31)
+#define TMAC_TX_SM_ERR                         BIT(39)
+#define TMAC_DESC_ECC_SG_ERR                   BIT(47)
+#define TMAC_DESC_ECC_DB_ERR                   BIT(55)
+
        u64 mac_tmac_err_mask;
        u64 mac_tmac_err_alarm;
 
        u64 mac_rmac_err_reg;
-#define RMAC_ERR_REG_RX_BUFF_OVRN          BIT(0)
-#define RMAC_ERR_REG_RTS_ECC_DB_ERR        BIT(14)
-#define RMAC_ERR_REG_ECC_DB_ERR            BIT(15)
-#define RMAC_LINK_STATE_CHANGE_INT         BIT(31)
+#define RMAC_RX_BUFF_OVRN                      BIT(0)
+#define RMAC_FRM_RCVD_INT                      BIT(1)
+#define RMAC_UNUSED_INT                                BIT(2)
+#define RMAC_RTS_PNUM_ECC_SG_ERR               BIT(5)
+#define RMAC_RTS_DS_ECC_SG_ERR                 BIT(6)
+#define RMAC_RD_BUF_ECC_SG_ERR                 BIT(7)
+#define RMAC_RTH_MAP_ECC_SG_ERR                        BIT(8)
+#define RMAC_RTH_SPDM_ECC_SG_ERR               BIT(9)
+#define RMAC_RTS_VID_ECC_SG_ERR                        BIT(10)
+#define RMAC_DA_SHADOW_ECC_SG_ERR              BIT(11)
+#define RMAC_RTS_PNUM_ECC_DB_ERR               BIT(13)
+#define RMAC_RTS_DS_ECC_DB_ERR                 BIT(14)
+#define RMAC_RD_BUF_ECC_DB_ERR                 BIT(15)
+#define RMAC_RTH_MAP_ECC_DB_ERR                        BIT(16)
+#define RMAC_RTH_SPDM_ECC_DB_ERR               BIT(17)
+#define RMAC_RTS_VID_ECC_DB_ERR                        BIT(18)
+#define RMAC_DA_SHADOW_ECC_DB_ERR              BIT(19)
+#define RMAC_LINK_STATE_CHANGE_INT             BIT(31)
+#define RMAC_RX_SM_ERR                         BIT(39)
+#define RMAC_SINGLE_ECC_ERR                    (BIT(5) | BIT(6) | BIT(7) |\
+                                               BIT(8)  | BIT(9) | BIT(10)|\
+                                               BIT(11))
+#define RMAC_DOUBLE_ECC_ERR                    (BIT(13) | BIT(14) | BIT(15) |\
+                                               BIT(16)  | BIT(17) | BIT(18)|\
+                                               BIT(19))
        u64 mac_rmac_err_mask;
        u64 mac_rmac_err_alarm;
 
@@ -750,6 +839,7 @@ struct XENA_dev_config {
                                        BIT(17) | BIT(19))
 #define MC_ERR_REG_ECC_ALL_DBL            (BIT(10) | BIT(11) | BIT(12) |\
                                        BIT(13) | BIT(18) | BIT(20))
+#define PLL_LOCK_N                     BIT(39)
        u64 mc_err_mask;
        u64 mc_err_alarm;
 
@@ -823,11 +913,17 @@ struct XENA_dev_config {
 #define XGXS_INT_MASK_RXGXS                BIT(1)
 
        u64 xgxs_txgxs_err_reg;
-#define TXGXS_ECC_DB_ERR                   BIT(15)
+#define TXGXS_ECC_SG_ERR               BIT(7)
+#define TXGXS_ECC_DB_ERR               BIT(15)
+#define TXGXS_ESTORE_UFLOW             BIT(31)
+#define TXGXS_TX_SM_ERR                        BIT(39)
+
        u64 xgxs_txgxs_err_mask;
        u64 xgxs_txgxs_err_alarm;
 
        u64 xgxs_rxgxs_err_reg;
+#define RXGXS_ESTORE_OFLOW             BIT(7)
+#define RXGXS_RX_SM_ERR                        BIT(39)
        u64 xgxs_rxgxs_err_mask;
        u64 xgxs_rxgxs_err_alarm;
 



-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to