spapr-vscsi: Adding VSCSI capabilities
This implements capabilities exchange between vscsi host and client. As at the moment no capability is supported, put zero flags everywhere and return. Signed-off-by: Nikunj A Dadhania <nikunj@linux.vnet.ibm.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Nikunj A. Dadhania <nikunj@linux.vnet.ibm.com>
This commit is contained in:
parent
65f3e33964
commit
26573a0c1f
@ -923,6 +923,57 @@ static int vscsi_send_adapter_info(VSCSIState *s, vscsi_req *req)
|
|||||||
return vscsi_send_iu(s, req, sizeof(*sinfo), VIOSRP_MAD_FORMAT);
|
return vscsi_send_iu(s, req, sizeof(*sinfo), VIOSRP_MAD_FORMAT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int vscsi_send_capabilities(VSCSIState *s, vscsi_req *req)
|
||||||
|
{
|
||||||
|
struct viosrp_capabilities *vcap;
|
||||||
|
struct capabilities cap = { };
|
||||||
|
uint16_t len, req_len;
|
||||||
|
uint64_t buffer;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
vcap = &req->iu.mad.capabilities;
|
||||||
|
req_len = len = be16_to_cpu(vcap->common.length);
|
||||||
|
buffer = be64_to_cpu(vcap->buffer);
|
||||||
|
if (len > sizeof(cap)) {
|
||||||
|
fprintf(stderr, "vscsi_send_capabilities: capabilities size mismatch !\n");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Just read and populate the structure that is known.
|
||||||
|
* Zero rest of the structure.
|
||||||
|
*/
|
||||||
|
len = sizeof(cap);
|
||||||
|
}
|
||||||
|
rc = spapr_vio_dma_read(&s->vdev, buffer, &cap, len);
|
||||||
|
if (rc) {
|
||||||
|
fprintf(stderr, "vscsi_send_capabilities: DMA read failure !\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Current implementation does not suppport any migration or
|
||||||
|
* reservation capabilities. Construct the response telling the
|
||||||
|
* guest not to use them.
|
||||||
|
*/
|
||||||
|
cap.flags = 0;
|
||||||
|
cap.migration.ecl = 0;
|
||||||
|
cap.reserve.type = 0;
|
||||||
|
cap.migration.common.server_support = 0;
|
||||||
|
cap.reserve.common.server_support = 0;
|
||||||
|
|
||||||
|
rc = spapr_vio_dma_write(&s->vdev, buffer, &cap, len);
|
||||||
|
if (rc) {
|
||||||
|
fprintf(stderr, "vscsi_send_capabilities: DMA write failure !\n");
|
||||||
|
}
|
||||||
|
if (req_len > len) {
|
||||||
|
/*
|
||||||
|
* Being paranoid and lets not worry about the error code
|
||||||
|
* here. Actual write of the cap is done above.
|
||||||
|
*/
|
||||||
|
spapr_vio_dma_set(&s->vdev, (buffer + len), 0, (req_len - len));
|
||||||
|
}
|
||||||
|
vcap->common.status = rc ? cpu_to_be32(1) : 0;
|
||||||
|
return vscsi_send_iu(s, req, sizeof(*vcap), VIOSRP_MAD_FORMAT);
|
||||||
|
}
|
||||||
|
|
||||||
static int vscsi_handle_mad_req(VSCSIState *s, vscsi_req *req)
|
static int vscsi_handle_mad_req(VSCSIState *s, vscsi_req *req)
|
||||||
{
|
{
|
||||||
union mad_iu *mad = &req->iu.mad;
|
union mad_iu *mad = &req->iu.mad;
|
||||||
@ -943,6 +994,9 @@ static int vscsi_handle_mad_req(VSCSIState *s, vscsi_req *req)
|
|||||||
mad->host_config.common.status = cpu_to_be16(1);
|
mad->host_config.common.status = cpu_to_be16(1);
|
||||||
vscsi_send_iu(s, req, sizeof(mad->host_config), VIOSRP_MAD_FORMAT);
|
vscsi_send_iu(s, req, sizeof(mad->host_config), VIOSRP_MAD_FORMAT);
|
||||||
break;
|
break;
|
||||||
|
case VIOSRP_CAPABILITIES_TYPE:
|
||||||
|
vscsi_send_capabilities(s, req);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
fprintf(stderr, "VSCSI: Unknown MAD type %02x\n",
|
fprintf(stderr, "VSCSI: Unknown MAD type %02x\n",
|
||||||
be32_to_cpu(mad->empty_iu.common.type));
|
be32_to_cpu(mad->empty_iu.common.type));
|
||||||
|
Loading…
Reference in New Issue
Block a user