block: sed-opal: unify retrieval of table columns

Instead of having multiple places defining the same argument list to get
a specific column of a sed-opal table, provide a generic version and
call it from those functions.

Co-authored-by: David Kozub <zub@linux.fjfi.cvut.cz>
Signed-off-by: Jonas Rabenstein <jonas.rabenstein@studium.uni-erlangen.de>
Signed-off-by: David Kozub <zub@linux.fjfi.cvut.cz>
Reviewed-by: Scott Bauer <sbauer@plzdonthack.me>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Jon Derrick <jonathan.derrick@intel.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
David Kozub 2019-02-14 01:16:04 +01:00 committed by Jens Axboe
parent a4ddbd1b7b
commit 3fff234b85
1 changed files with 47 additions and 83 deletions

View File

@ -1075,6 +1075,37 @@ static int finalize_and_send(struct opal_dev *dev, cont_fn cont)
return opal_send_recv(dev, cont);
}
/*
* request @column from table @table on device @dev. On success, the column
* data will be available in dev->resp->tok[4]
*/
static int generic_get_column(struct opal_dev *dev, const u8 *table,
u64 column)
{
int err;
err = cmd_start(dev, table, opalmethod[OPAL_GET]);
add_token_u8(&err, dev, OPAL_STARTLIST);
add_token_u8(&err, dev, OPAL_STARTNAME);
add_token_u8(&err, dev, OPAL_STARTCOLUMN);
add_token_u64(&err, dev, column);
add_token_u8(&err, dev, OPAL_ENDNAME);
add_token_u8(&err, dev, OPAL_STARTNAME);
add_token_u8(&err, dev, OPAL_ENDCOLUMN);
add_token_u64(&err, dev, column);
add_token_u8(&err, dev, OPAL_ENDNAME);
add_token_u8(&err, dev, OPAL_ENDLIST);
if (err)
return err;
return finalize_and_send(dev, parse_and_check_status);
}
static int gen_key(struct opal_dev *dev, void *data)
{
u8 uid[OPAL_UID_LENGTH];
@ -1129,23 +1160,11 @@ static int get_active_key(struct opal_dev *dev, void *data)
if (err)
return err;
err = cmd_start(dev, uid, opalmethod[OPAL_GET]);
add_token_u8(&err, dev, OPAL_STARTLIST);
add_token_u8(&err, dev, OPAL_STARTNAME);
add_token_u8(&err, dev, 3); /* startCloumn */
add_token_u8(&err, dev, 10); /* ActiveKey */
add_token_u8(&err, dev, OPAL_ENDNAME);
add_token_u8(&err, dev, OPAL_STARTNAME);
add_token_u8(&err, dev, 4); /* endColumn */
add_token_u8(&err, dev, 10); /* ActiveKey */
add_token_u8(&err, dev, OPAL_ENDNAME);
add_token_u8(&err, dev, OPAL_ENDLIST);
if (err) {
pr_debug("Error building get active key command\n");
err = generic_get_column(dev, uid, OPAL_ACTIVEKEY);
if (err)
return err;
}
return finalize_and_send(dev, get_active_key_cont);
return get_active_key_cont(dev);
}
static int generic_lr_enable_disable(struct opal_dev *dev,
@ -1754,14 +1773,16 @@ static int activate_lsp(struct opal_dev *dev, void *data)
return finalize_and_send(dev, parse_and_check_status);
}
static int get_lsp_lifecycle_cont(struct opal_dev *dev)
/* Determine if we're in the Manufactured Inactive or Active state */
static int get_lsp_lifecycle(struct opal_dev *dev, void *data)
{
u8 lc_status;
int error = 0;
int err;
error = parse_and_check_status(dev);
if (error)
return error;
err = generic_get_column(dev, opaluid[OPAL_LOCKINGSP_UID],
OPAL_LIFECYCLE);
if (err)
return err;
lc_status = response_get_u64(&dev->parsed, 4);
/* 0x08 is Manufactured Inactive */
@ -1774,49 +1795,19 @@ static int get_lsp_lifecycle_cont(struct opal_dev *dev)
return 0;
}
/* Determine if we're in the Manufactured Inactive or Active state */
static int get_lsp_lifecycle(struct opal_dev *dev, void *data)
{
int err;
err = cmd_start(dev, opaluid[OPAL_LOCKINGSP_UID],
opalmethod[OPAL_GET]);
add_token_u8(&err, dev, OPAL_STARTLIST);
add_token_u8(&err, dev, OPAL_STARTNAME);
add_token_u8(&err, dev, 3); /* Start Column */
add_token_u8(&err, dev, OPAL_LIFECYCLE);
add_token_u8(&err, dev, OPAL_ENDNAME);
add_token_u8(&err, dev, OPAL_STARTNAME);
add_token_u8(&err, dev, 4); /* End Column */
add_token_u8(&err, dev, OPAL_LIFECYCLE);
add_token_u8(&err, dev, OPAL_ENDNAME);
add_token_u8(&err, dev, OPAL_ENDLIST);
if (err) {
pr_debug("Error Building GET Lifecycle Status command\n");
return err;
}
return finalize_and_send(dev, get_lsp_lifecycle_cont);
}
static int get_msid_cpin_pin_cont(struct opal_dev *dev)
static int get_msid_cpin_pin(struct opal_dev *dev, void *data)
{
const char *msid_pin;
size_t strlen;
int error = 0;
int err;
error = parse_and_check_status(dev);
if (error)
return error;
err = generic_get_column(dev, opaluid[OPAL_C_PIN_MSID], OPAL_PIN);
if (err)
return err;
strlen = response_get_string(&dev->parsed, 4, &msid_pin);
if (!msid_pin) {
pr_debug("%s: Couldn't extract PIN from response\n", __func__);
pr_debug("Couldn't extract MSID_CPIN from response\n");
return OPAL_INVAL_PARAM;
}
@ -1829,33 +1820,6 @@ static int get_msid_cpin_pin_cont(struct opal_dev *dev)
return 0;
}
static int get_msid_cpin_pin(struct opal_dev *dev, void *data)
{
int err;
err = cmd_start(dev, opaluid[OPAL_C_PIN_MSID],
opalmethod[OPAL_GET]);
add_token_u8(&err, dev, OPAL_STARTLIST);
add_token_u8(&err, dev, OPAL_STARTNAME);
add_token_u8(&err, dev, 3); /* Start Column */
add_token_u8(&err, dev, 3); /* PIN */
add_token_u8(&err, dev, OPAL_ENDNAME);
add_token_u8(&err, dev, OPAL_STARTNAME);
add_token_u8(&err, dev, 4); /* End Column */
add_token_u8(&err, dev, 3); /* Lifecycle Column */
add_token_u8(&err, dev, OPAL_ENDNAME);
add_token_u8(&err, dev, OPAL_ENDLIST);
if (err) {
pr_debug("Error building Get MSID CPIN PIN command.\n");
return err;
}
return finalize_and_send(dev, get_msid_cpin_pin_cont);
}
static int end_opal_session(struct opal_dev *dev, void *data)
{
int err = 0;