static irqreturn_t hub_eint_handler(int irq, void *arg) { struct hubdev_info *hubdev_info; struct ia64_sal_retval ret_stuff; nasid_t nasid; ret_stuff.status = 0; ret_stuff.v0 = 0; hubdev_info = (struct hubdev_info *)arg; nasid = hubdev_info->hdi_nasid; if (is_shub1()) { SAL_CALL_NOLOCK(ret_stuff, SN_SAL_HUB_ERROR_INTERRUPT, (u64) nasid, 0, 0, 0, 0, 0, 0); if ((int)ret_stuff.v0) panic("%s: Fatal %s Error", __func__, ((nasid & 1) ? "TIO" : "HUBII")); if (!(nasid & 1)) /* Not a TIO, handle CRB errors */ (void)hubiio_crb_error_handler(hubdev_info); } else if (nasid & 1) { /* TIO errors */ SAL_CALL_NOLOCK(ret_stuff, SN_SAL_HUB_ERROR_INTERRUPT, (u64) nasid, 0, 0, 0, 0, 0, 0); if ((int)ret_stuff.v0) panic("%s: Fatal TIO Error", __func__); } else bte_error_handler((unsigned long)NODEPDA(nasid_to_cnodeid(nasid))); return IRQ_HANDLED; }
/* * First part error handler. This is called whenever any error CRB interrupt * is generated by the II. */ void bte_crb_error_handler(cnodeid_t cnode, int btenum, int crbnum, ioerror_t * ioe, int bteop) { struct bteinfo_s *bte; bte = &(NODEPDA(cnode)->bte_if[btenum]); /* * The caller has already figured out the error type, we save that * in the bte handle structure for the thread exercising the * interface to consume. */ bte->bh_error = ioe->ie_errortype + BTEFAIL_OFFSET; bte->bte_error_count++; BTE_PRINTK(("Got an error on cnode %d bte %d: HW error type 0x%x\n", bte->bte_cnode, bte->bte_num, ioe->ie_errortype)); bte_error_handler((unsigned long) NODEPDA(cnode)); }
/* * First part error handler. This is called whenever any error CRB interrupt * is generated by the II. */ void bte_crb_error_handler(vertex_hdl_t hub_v, int btenum, int crbnum, ioerror_t * ioe, int bteop) { hubinfo_t hinfo; struct bteinfo_s *bte; hubinfo_get(hub_v, &hinfo); bte = &hinfo->h_nodepda->bte_if[btenum]; /* * The caller has already figured out the error type, we save that * in the bte handle structure for the thread excercising the * interface to consume. */ bte->bh_error = ioe->ie_errortype + BTEFAIL_OFFSET; bte->bte_error_count++; BTE_PRINTK(("Got an error on cnode %d bte %d: HW error type 0x%x\n", bte->bte_cnode, bte->bte_num, ioe->ie_errortype)); bte_error_handler((unsigned long) hinfo->h_nodepda); }