static void zfcp_qdio_int_resp(struct ccw_device *cdev, unsigned int qdio_err, int queue_no, int first, int count, unsigned long parm) { struct zfcp_qdio *qdio = (struct zfcp_qdio *) parm; int sbal_idx, sbal_no; if (unlikely(qdio_err)) { zfcp_dbf_hba_qdio(qdio->adapter->dbf, qdio_err, first, count); zfcp_qdio_handler_error(qdio, "qdires1", qdio_err); return; } /* * go through all SBALs from input queue currently * returned by QDIO layer */ for (sbal_no = 0; sbal_no < count; sbal_no++) { sbal_idx = (first + sbal_no) % QDIO_MAX_BUFFERS_PER_Q; /* go through all SBALEs of SBAL */ zfcp_fsf_reqid_check(qdio, sbal_idx); } /* * put range of SBALs back to response queue * (including SBALs which have already been free before) */ zfcp_qdio_resp_put_back(qdio, count); }
static void zfcp_qdio_int_resp(struct ccw_device *cdev, unsigned int qdio_err, int queue_no, int idx, int count, unsigned long parm) { struct zfcp_qdio *qdio = (struct zfcp_qdio *) parm; int sbal_idx, sbal_no; if (unlikely(qdio_err)) { zfcp_qdio_handler_error(qdio, "qdires1", qdio_err); return; } /* * go through all SBALs from input queue currently * returned by QDIO layer */ for (sbal_no = 0; sbal_no < count; sbal_no++) { sbal_idx = (idx + sbal_no) % QDIO_MAX_BUFFERS_PER_Q; /* go through all SBALEs of SBAL */ zfcp_fsf_reqid_check(qdio, sbal_idx); } /* * put SBALs back to response queue */ if (do_QDIO(cdev, QDIO_FLAG_SYNC_INPUT, 0, idx, count)) zfcp_erp_adapter_reopen(qdio->adapter, 0, "qdires2"); }
static void zfcp_qdio_int_resp(struct ccw_device *cdev, unsigned int qdio_err, int queue_no, int idx, int count, unsigned long parm) { struct zfcp_qdio *qdio = (struct zfcp_qdio *) parm; struct zfcp_adapter *adapter = qdio->adapter; int sbal_no, sbal_idx; if (unlikely(qdio_err)) { if (zfcp_adapter_multi_buffer_active(adapter)) { void *pl[ZFCP_QDIO_MAX_SBALS_PER_REQ + 1]; struct qdio_buffer_element *sbale; u64 req_id; u8 scount; memset(pl, 0, ZFCP_QDIO_MAX_SBALS_PER_REQ * sizeof(void *)); sbale = qdio->res_q[idx]->element; req_id = (u64) sbale->addr; scount = min(sbale->scount + 1, ZFCP_QDIO_MAX_SBALS_PER_REQ + 1); /* incl. signaling SBAL */ for (sbal_no = 0; sbal_no < scount; sbal_no++) { sbal_idx = (idx + sbal_no) % QDIO_MAX_BUFFERS_PER_Q; pl[sbal_no] = qdio->res_q[sbal_idx]; } zfcp_dbf_hba_def_err(adapter, req_id, scount, pl); } zfcp_qdio_handler_error(qdio, "qdires1", qdio_err); return; } /* * go through all SBALs from input queue currently * returned by QDIO layer */ for (sbal_no = 0; sbal_no < count; sbal_no++) { sbal_idx = (idx + sbal_no) % QDIO_MAX_BUFFERS_PER_Q; /* go through all SBALEs of SBAL */ zfcp_fsf_reqid_check(qdio, sbal_idx); } /* * put SBALs back to response queue */ if (do_QDIO(cdev, QDIO_FLAG_SYNC_INPUT, 0, idx, count)) zfcp_erp_adapter_reopen(qdio->adapter, 0, "qdires2"); }