static void sclp_writedata_callback(struct sclp_req *request, void *data) { int rc; struct sclp_buffer *buffer; struct write_sccb *sccb; buffer = (struct sclp_buffer *) data; sccb = buffer->sccb; if (request->status == SCLP_REQ_FAILED) { if (buffer->callback != NULL) buffer->callback(buffer, -EIO); return; } /* check SCLP response code and choose suitable action */ switch (sccb->header.response_code) { case 0x0020 : /* Normal completion, buffer processed, message(s) sent */ rc = 0; break; case 0x0340: /* Contained SCLP equipment check */ if (++buffer->retry_count > SCLP_BUFFER_MAX_RETRY) { rc = -EIO; break; } /* remove processed buffers and requeue rest */ if (sclp_remove_processed((struct sccb_header *) sccb) > 0) { /* not all buffers were processed */ sccb->header.response_code = 0x0000; buffer->request.status = SCLP_REQ_FILLED; rc = sclp_add_request(request); if (rc == 0) return; } else rc = 0; break; case 0x0040: /* SCLP equipment check */ case 0x05f0: /* Target resource in improper state */ if (++buffer->retry_count > SCLP_BUFFER_MAX_RETRY) { rc = -EIO; break; } /* retry request */ sccb->header.response_code = 0x0000; buffer->request.status = SCLP_REQ_FILLED; rc = sclp_add_request(request); if (rc == 0) return; break; default: if (sccb->header.response_code == 0x71f0) rc = -ENOMEM; else rc = -EINVAL; break; } if (buffer->callback != NULL) buffer->callback(buffer, rc); }
static void sclp_writedata_callback(struct sclp_req *request, void *data) { int rc; struct sclp_buffer *buffer; struct write_sccb *sccb; buffer = (struct sclp_buffer *) data; sccb = buffer->sccb; if (request->status == SCLP_REQ_FAILED) { if (buffer->callback != NULL) buffer->callback(buffer, -EIO); return; } switch (sccb->header.response_code) { case 0x0020 : rc = 0; break; case 0x0340: if (++buffer->retry_count > SCLP_BUFFER_MAX_RETRY) { rc = -EIO; break; } if (sclp_remove_processed((struct sccb_header *) sccb) > 0) { sccb->header.response_code = 0x0000; buffer->request.status = SCLP_REQ_FILLED; rc = sclp_add_request(request); if (rc == 0) return; } else rc = 0; break; case 0x0040: case 0x05f0: if (++buffer->retry_count > SCLP_BUFFER_MAX_RETRY) { rc = -EIO; break; } sccb->header.response_code = 0x0000; buffer->request.status = SCLP_REQ_FILLED; rc = sclp_add_request(request); if (rc == 0) return; break; default: if (sccb->header.response_code == 0x71f0) rc = -ENOMEM; else rc = -EINVAL; break; } if (buffer->callback != NULL) buffer->callback(buffer, rc); }