hw/block/nvme: open code for volatile write cache
Volatile Write Cache(VWC) feature is set in nvme_ns_setup() in the initial time. This feature is related to block device backed, but this feature is controlled in controller level via Set/Get Features command. This patch removed dependency between nvme and nvme-ns to manage the VWC flag value. Also, it open coded the Get Features for VWC to check all namespaces attached to the controller, and if false detected, return directly false. Signed-off-by: Minwoo Im <minwoo.im.dev@gmail.com> [k.jensen: report write cache preset if present on ANY namespace] Signed-off-by: Klaus Jensen <k.jensen@samsung.com>
This commit is contained in:
parent
1490be5a8a
commit
aa5e55e3b0
@ -90,10 +90,6 @@ static int nvme_ns_init_blk(NvmeCtrl *n, NvmeNamespace *ns, Error **errp)
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (blk_enable_write_cache(ns->blkconf.blk)) {
|
||||
n->features.vwc = 0x1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -3097,6 +3097,7 @@ static uint16_t nvme_get_feature(NvmeCtrl *n, NvmeRequest *req)
|
||||
NvmeGetFeatureSelect sel = NVME_GETFEAT_SELECT(dw10);
|
||||
uint16_t iv;
|
||||
NvmeNamespace *ns;
|
||||
int i;
|
||||
|
||||
static const uint32_t nvme_feature_default[NVME_FID_MAX] = {
|
||||
[NVME_ARBITRATION] = NVME_ARB_AB_NOLIMIT,
|
||||
@ -3172,7 +3173,17 @@ static uint16_t nvme_get_feature(NvmeCtrl *n, NvmeRequest *req)
|
||||
result = ns->features.err_rec;
|
||||
goto out;
|
||||
case NVME_VOLATILE_WRITE_CACHE:
|
||||
result = n->features.vwc;
|
||||
for (i = 1; i <= n->num_namespaces; i++) {
|
||||
ns = nvme_ns(n, i);
|
||||
if (!ns) {
|
||||
continue;
|
||||
}
|
||||
|
||||
result = blk_enable_write_cache(ns->blkconf.blk);
|
||||
if (result) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
trace_pci_nvme_getfeat_vwcache(result ? "enabled" : "disabled");
|
||||
goto out;
|
||||
case NVME_ASYNCHRONOUS_EVENT_CONF:
|
||||
@ -3335,8 +3346,6 @@ static uint16_t nvme_set_feature(NvmeCtrl *n, NvmeRequest *req)
|
||||
ns->features.err_rec = dw11;
|
||||
break;
|
||||
case NVME_VOLATILE_WRITE_CACHE:
|
||||
n->features.vwc = dw11 & 0x1;
|
||||
|
||||
for (i = 1; i <= n->num_namespaces; i++) {
|
||||
ns = nvme_ns(n, i);
|
||||
if (!ns) {
|
||||
|
@ -121,7 +121,6 @@ typedef struct NvmeFeatureVal {
|
||||
uint16_t temp_thresh_low;
|
||||
};
|
||||
uint32_t async_config;
|
||||
uint32_t vwc;
|
||||
} NvmeFeatureVal;
|
||||
|
||||
typedef struct NvmeCtrl {
|
||||
|
Loading…
Reference in New Issue
Block a user