aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJon Derrick <jonathan.derrick@intel.com>2017-02-22 09:55:13 -0500
committerJens Axboe <axboe@fb.com>2017-02-22 13:54:49 -0500
commiteed64951f15d63beac75e0f848ac03c14f8a4a6c (patch)
treecb8aebbcc90dad11273ec6242f102176c9759717
parent48efbfbf6353af15d97ef37216146e550403c773 (diff)
block/sed: Embed function data into the function sequence
By embedding the function data with the function sequence, we can eliminate the external function data and state variable code. It also made obvious some other small cleanups. Signed-off-by: Jon Derrick <jonathan.derrick@intel.com> Reviewed-by: Scott Bauer <scott.bauer@intel.com> Signed-off-by: Jens Axboe <axboe@fb.com>
-rw-r--r--block/sed-opal.c418
1 files changed, 163 insertions, 255 deletions
diff --git a/block/sed-opal.c b/block/sed-opal.c
index 4fc4d7b441d5..893557554cc5 100644
--- a/block/sed-opal.c
+++ b/block/sed-opal.c
@@ -34,7 +34,11 @@
34#define IO_BUFFER_LENGTH 2048 34#define IO_BUFFER_LENGTH 2048
35#define MAX_TOKS 64 35#define MAX_TOKS 64
36 36
37typedef int (*opal_step)(struct opal_dev *dev); 37struct opal_step {
38 int (*fn)(struct opal_dev *dev, void *data);
39 void *data;
40};
41typedef int (cont_fn)(struct opal_dev *dev);
38 42
39enum opal_atom_width { 43enum opal_atom_width {
40 OPAL_WIDTH_TINY, 44 OPAL_WIDTH_TINY,
@@ -80,9 +84,7 @@ struct opal_dev {
80 void *data; 84 void *data;
81 sec_send_recv *send_recv; 85 sec_send_recv *send_recv;
82 86
83 const opal_step *funcs; 87 const struct opal_step *steps;
84 void **func_data;
85 int state;
86 struct mutex dev_lock; 88 struct mutex dev_lock;
87 u16 comid; 89 u16 comid;
88 u32 hsn; 90 u32 hsn;
@@ -213,8 +215,6 @@ static const u8 opalmethod[][OPAL_UID_LENGTH] = {
213 { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x08, 0x03 }, 215 { 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x08, 0x03 },
214}; 216};
215 217
216typedef int (cont_fn)(struct opal_dev *dev);
217
218static int end_opal_session_error(struct opal_dev *dev); 218static int end_opal_session_error(struct opal_dev *dev);
219 219
220struct opal_suspend_data { 220struct opal_suspend_data {
@@ -375,18 +375,18 @@ static void check_geometry(struct opal_dev *dev, const void *data)
375 375
376static int next(struct opal_dev *dev) 376static int next(struct opal_dev *dev)
377{ 377{
378 opal_step func; 378 const struct opal_step *step;
379 int error = 0; 379 int state = 0, error = 0;
380 380
381 do { 381 do {
382 func = dev->funcs[dev->state]; 382 step = &dev->steps[state];
383 if (!func) 383 if (!step->fn)
384 break; 384 break;
385 385
386 error = func(dev); 386 error = step->fn(dev, step->data);
387 if (error) { 387 if (error) {
388 pr_err("Error on step function: %d with error %d: %s\n", 388 pr_err("Error on step function: %d with error %d: %s\n",
389 dev->state, error, 389 state, error,
390 opal_error_to_human(error)); 390 opal_error_to_human(error));
391 391
392 /* For each OPAL command we do a discovery0 then we 392 /* For each OPAL command we do a discovery0 then we
@@ -396,10 +396,10 @@ static int next(struct opal_dev *dev)
396 * session. Therefore we shouldn't attempt to terminate 396 * session. Therefore we shouldn't attempt to terminate
397 * a session, as one has not yet been created. 397 * a session, as one has not yet been created.
398 */ 398 */
399 if (dev->state > 1) 399 if (state > 1)
400 return end_opal_session_error(dev); 400 return end_opal_session_error(dev);
401 } 401 }
402 dev->state++; 402 state++;
403 } while (!error); 403 } while (!error);
404 404
405 return error; 405 return error;
@@ -483,7 +483,7 @@ static int opal_discovery0_end(struct opal_dev *dev)
483 return 0; 483 return 0;
484} 484}
485 485
486static int opal_discovery0(struct opal_dev *dev) 486static int opal_discovery0(struct opal_dev *dev, void *data)
487{ 487{
488 int ret; 488 int ret;
489 489
@@ -1018,7 +1018,7 @@ static int finalize_and_send(struct opal_dev *dev, cont_fn cont)
1018 return opal_send_recv(dev, cont); 1018 return opal_send_recv(dev, cont);
1019} 1019}
1020 1020
1021static int gen_key(struct opal_dev *dev) 1021static int gen_key(struct opal_dev *dev, void *data)
1022{ 1022{
1023 const u8 *method; 1023 const u8 *method;
1024 u8 uid[OPAL_UID_LENGTH]; 1024 u8 uid[OPAL_UID_LENGTH];
@@ -1072,15 +1072,14 @@ static int get_active_key_cont(struct opal_dev *dev)
1072 return 0; 1072 return 0;
1073} 1073}
1074 1074
1075static int get_active_key(struct opal_dev *dev) 1075static int get_active_key(struct opal_dev *dev, void *data)
1076{ 1076{
1077 u8 uid[OPAL_UID_LENGTH]; 1077 u8 uid[OPAL_UID_LENGTH];
1078 int err = 0; 1078 int err = 0;
1079 u8 *lr; 1079 u8 *lr = data;
1080 1080
1081 clear_opal_cmd(dev); 1081 clear_opal_cmd(dev);
1082 set_comid(dev, dev->comid); 1082 set_comid(dev, dev->comid);
1083 lr = dev->func_data[dev->state];
1084 1083
1085 err = build_locking_range(uid, sizeof(uid), *lr); 1084 err = build_locking_range(uid, sizeof(uid), *lr);
1086 if (err) 1085 if (err)
@@ -1163,17 +1162,16 @@ static inline int enable_global_lr(struct opal_dev *dev, u8 *uid,
1163 return err; 1162 return err;
1164} 1163}
1165 1164
1166static int setup_locking_range(struct opal_dev *dev) 1165static int setup_locking_range(struct opal_dev *dev, void *data)
1167{ 1166{
1168 u8 uid[OPAL_UID_LENGTH]; 1167 u8 uid[OPAL_UID_LENGTH];
1169 struct opal_user_lr_setup *setup; 1168 struct opal_user_lr_setup *setup = data;
1170 u8 lr; 1169 u8 lr;
1171 int err = 0; 1170 int err = 0;
1172 1171
1173 clear_opal_cmd(dev); 1172 clear_opal_cmd(dev);
1174 set_comid(dev, dev->comid); 1173 set_comid(dev, dev->comid);
1175 1174
1176 setup = dev->func_data[dev->state];
1177 lr = setup->session.opal_key.lr; 1175 lr = setup->session.opal_key.lr;
1178 err = build_locking_range(uid, sizeof(uid), lr); 1176 err = build_locking_range(uid, sizeof(uid), lr);
1179 if (err) 1177 if (err)
@@ -1286,20 +1284,19 @@ static int start_generic_opal_session(struct opal_dev *dev,
1286 return finalize_and_send(dev, start_opal_session_cont); 1284 return finalize_and_send(dev, start_opal_session_cont);
1287} 1285}
1288 1286
1289static int start_anybodyASP_opal_session(struct opal_dev *dev) 1287static int start_anybodyASP_opal_session(struct opal_dev *dev, void *data)
1290{ 1288{
1291 return start_generic_opal_session(dev, OPAL_ANYBODY_UID, 1289 return start_generic_opal_session(dev, OPAL_ANYBODY_UID,
1292 OPAL_ADMINSP_UID, NULL, 0); 1290 OPAL_ADMINSP_UID, NULL, 0);
1293} 1291}
1294 1292
1295static int start_SIDASP_opal_session(struct opal_dev *dev) 1293static int start_SIDASP_opal_session(struct opal_dev *dev, void *data)
1296{ 1294{
1297 int ret; 1295 int ret;
1298 const u8 *key = dev->prev_data; 1296 const u8 *key = dev->prev_data;
1299 struct opal_key *okey;
1300 1297
1301 if (!key) { 1298 if (!key) {
1302 okey = dev->func_data[dev->state]; 1299 const struct opal_key *okey = data;
1303 ret = start_generic_opal_session(dev, OPAL_SID_UID, 1300 ret = start_generic_opal_session(dev, OPAL_SID_UID,
1304 OPAL_ADMINSP_UID, 1301 OPAL_ADMINSP_UID,
1305 okey->key, 1302 okey->key,
@@ -1314,22 +1311,21 @@ static int start_SIDASP_opal_session(struct opal_dev *dev)
1314 return ret; 1311 return ret;
1315} 1312}
1316 1313
1317static inline int start_admin1LSP_opal_session(struct opal_dev *dev) 1314static int start_admin1LSP_opal_session(struct opal_dev *dev, void *data)
1318{ 1315{
1319 struct opal_key *key = dev->func_data[dev->state]; 1316 struct opal_key *key = data;
1320
1321 return start_generic_opal_session(dev, OPAL_ADMIN1_UID, 1317 return start_generic_opal_session(dev, OPAL_ADMIN1_UID,
1322 OPAL_LOCKINGSP_UID, 1318 OPAL_LOCKINGSP_UID,
1323 key->key, key->key_len); 1319 key->key, key->key_len);
1324} 1320}
1325 1321
1326static int start_auth_opal_session(struct opal_dev *dev) 1322static int start_auth_opal_session(struct opal_dev *dev, void *data)
1327{ 1323{
1324 struct opal_session_info *session = data;
1328 u8 lk_ul_user[OPAL_UID_LENGTH]; 1325 u8 lk_ul_user[OPAL_UID_LENGTH];
1326 size_t keylen = session->opal_key.key_len;
1329 int err = 0; 1327 int err = 0;
1330 1328
1331 struct opal_session_info *session = dev->func_data[dev->state];
1332 size_t keylen = session->opal_key.key_len;
1333 u8 *key = session->opal_key.key; 1329 u8 *key = session->opal_key.key;
1334 u32 hsn = GENERIC_HOST_SESSION_NUM; 1330 u32 hsn = GENERIC_HOST_SESSION_NUM;
1335 1331
@@ -1379,7 +1375,7 @@ static int start_auth_opal_session(struct opal_dev *dev)
1379 return finalize_and_send(dev, start_opal_session_cont); 1375 return finalize_and_send(dev, start_opal_session_cont);
1380} 1376}
1381 1377
1382static int revert_tper(struct opal_dev *dev) 1378static int revert_tper(struct opal_dev *dev, void *data)
1383{ 1379{
1384 int err = 0; 1380 int err = 0;
1385 1381
@@ -1401,9 +1397,9 @@ static int revert_tper(struct opal_dev *dev)
1401 return finalize_and_send(dev, parse_and_check_status); 1397 return finalize_and_send(dev, parse_and_check_status);
1402} 1398}
1403 1399
1404static int internal_activate_user(struct opal_dev *dev) 1400static int internal_activate_user(struct opal_dev *dev, void *data)
1405{ 1401{
1406 struct opal_session_info *session = dev->func_data[dev->state]; 1402 struct opal_session_info *session = data;
1407 u8 uid[OPAL_UID_LENGTH]; 1403 u8 uid[OPAL_UID_LENGTH];
1408 int err = 0; 1404 int err = 0;
1409 1405
@@ -1436,15 +1432,14 @@ static int internal_activate_user(struct opal_dev *dev)
1436 return finalize_and_send(dev, parse_and_check_status); 1432 return finalize_and_send(dev, parse_and_check_status);
1437} 1433}
1438 1434
1439static int erase_locking_range(struct opal_dev *dev) 1435static int erase_locking_range(struct opal_dev *dev, void *data)
1440{ 1436{
1441 struct opal_session_info *session; 1437 struct opal_session_info *session = data;
1442 u8 uid[OPAL_UID_LENGTH]; 1438 u8 uid[OPAL_UID_LENGTH];
1443 int err = 0; 1439 int err = 0;
1444 1440
1445 clear_opal_cmd(dev); 1441 clear_opal_cmd(dev);
1446 set_comid(dev, dev->comid); 1442 set_comid(dev, dev->comid);
1447 session = dev->func_data[dev->state];
1448 1443
1449 if (build_locking_range(uid, sizeof(uid), session->opal_key.lr) < 0) 1444 if (build_locking_range(uid, sizeof(uid), session->opal_key.lr) < 0)
1450 return -ERANGE; 1445 return -ERANGE;
@@ -1463,9 +1458,9 @@ static int erase_locking_range(struct opal_dev *dev)
1463 return finalize_and_send(dev, parse_and_check_status); 1458 return finalize_and_send(dev, parse_and_check_status);
1464} 1459}
1465 1460
1466static int set_mbr_done(struct opal_dev *dev) 1461static int set_mbr_done(struct opal_dev *dev, void *data)
1467{ 1462{
1468 u8 mbr_done_tf = *(u8 *)dev->func_data[dev->state]; 1463 u8 *mbr_done_tf = data;
1469 int err = 0; 1464 int err = 0;
1470 1465
1471 clear_opal_cmd(dev); 1466 clear_opal_cmd(dev);
@@ -1481,7 +1476,7 @@ static int set_mbr_done(struct opal_dev *dev)
1481 add_token_u8(&err, dev, OPAL_STARTLIST); 1476 add_token_u8(&err, dev, OPAL_STARTLIST);
1482 add_token_u8(&err, dev, OPAL_STARTNAME); 1477 add_token_u8(&err, dev, OPAL_STARTNAME);
1483 add_token_u8(&err, dev, 2); /* Done */ 1478 add_token_u8(&err, dev, 2); /* Done */
1484 add_token_u8(&err, dev, mbr_done_tf); /* Done T or F */ 1479 add_token_u8(&err, dev, *mbr_done_tf); /* Done T or F */
1485 add_token_u8(&err, dev, OPAL_ENDNAME); 1480 add_token_u8(&err, dev, OPAL_ENDNAME);
1486 add_token_u8(&err, dev, OPAL_ENDLIST); 1481 add_token_u8(&err, dev, OPAL_ENDLIST);
1487 add_token_u8(&err, dev, OPAL_ENDNAME); 1482 add_token_u8(&err, dev, OPAL_ENDNAME);
@@ -1495,9 +1490,9 @@ static int set_mbr_done(struct opal_dev *dev)
1495 return finalize_and_send(dev, parse_and_check_status); 1490 return finalize_and_send(dev, parse_and_check_status);
1496} 1491}
1497 1492
1498static int set_mbr_enable_disable(struct opal_dev *dev) 1493static int set_mbr_enable_disable(struct opal_dev *dev, void *data)
1499{ 1494{
1500 u8 mbr_en_dis = *(u8 *)dev->func_data[dev->state]; 1495 u8 *mbr_en_dis = data;
1501 int err = 0; 1496 int err = 0;
1502 1497
1503 clear_opal_cmd(dev); 1498 clear_opal_cmd(dev);
@@ -1513,7 +1508,7 @@ static int set_mbr_enable_disable(struct opal_dev *dev)
1513 add_token_u8(&err, dev, OPAL_STARTLIST); 1508 add_token_u8(&err, dev, OPAL_STARTLIST);
1514 add_token_u8(&err, dev, OPAL_STARTNAME); 1509 add_token_u8(&err, dev, OPAL_STARTNAME);
1515 add_token_u8(&err, dev, 1); 1510 add_token_u8(&err, dev, 1);
1516 add_token_u8(&err, dev, mbr_en_dis); 1511 add_token_u8(&err, dev, *mbr_en_dis);
1517 add_token_u8(&err, dev, OPAL_ENDNAME); 1512 add_token_u8(&err, dev, OPAL_ENDNAME);
1518 add_token_u8(&err, dev, OPAL_ENDLIST); 1513 add_token_u8(&err, dev, OPAL_ENDLIST);
1519 add_token_u8(&err, dev, OPAL_ENDNAME); 1514 add_token_u8(&err, dev, OPAL_ENDNAME);
@@ -1554,11 +1549,10 @@ static int generic_pw_cmd(u8 *key, size_t key_len, u8 *cpin_uid,
1554 return err; 1549 return err;
1555} 1550}
1556 1551
1557static int set_new_pw(struct opal_dev *dev) 1552static int set_new_pw(struct opal_dev *dev, void *data)
1558{ 1553{
1559 u8 cpin_uid[OPAL_UID_LENGTH]; 1554 u8 cpin_uid[OPAL_UID_LENGTH];
1560 struct opal_session_info *usr = dev->func_data[dev->state]; 1555 struct opal_session_info *usr = data;
1561
1562 1556
1563 memcpy(cpin_uid, opaluid[OPAL_C_PIN_ADMIN1], OPAL_UID_LENGTH); 1557 memcpy(cpin_uid, opaluid[OPAL_C_PIN_ADMIN1], OPAL_UID_LENGTH);
1564 1558
@@ -1579,10 +1573,10 @@ static int set_new_pw(struct opal_dev *dev)
1579 return finalize_and_send(dev, parse_and_check_status); 1573 return finalize_and_send(dev, parse_and_check_status);
1580} 1574}
1581 1575
1582static int set_sid_cpin_pin(struct opal_dev *dev) 1576static int set_sid_cpin_pin(struct opal_dev *dev, void *data)
1583{ 1577{
1584 u8 cpin_uid[OPAL_UID_LENGTH]; 1578 u8 cpin_uid[OPAL_UID_LENGTH];
1585 struct opal_key *key = dev->func_data[dev->state]; 1579 struct opal_key *key = data;
1586 1580
1587 memcpy(cpin_uid, opaluid[OPAL_C_PIN_SID], OPAL_UID_LENGTH); 1581 memcpy(cpin_uid, opaluid[OPAL_C_PIN_SID], OPAL_UID_LENGTH);
1588 1582
@@ -1593,18 +1587,16 @@ static int set_sid_cpin_pin(struct opal_dev *dev)
1593 return finalize_and_send(dev, parse_and_check_status); 1587 return finalize_and_send(dev, parse_and_check_status);
1594} 1588}
1595 1589
1596static int add_user_to_lr(struct opal_dev *dev) 1590static int add_user_to_lr(struct opal_dev *dev, void *data)
1597{ 1591{
1598 u8 lr_buffer[OPAL_UID_LENGTH]; 1592 u8 lr_buffer[OPAL_UID_LENGTH];
1599 u8 user_uid[OPAL_UID_LENGTH]; 1593 u8 user_uid[OPAL_UID_LENGTH];
1600 struct opal_lock_unlock *lkul; 1594 struct opal_lock_unlock *lkul = data;
1601 int err = 0; 1595 int err = 0;
1602 1596
1603 clear_opal_cmd(dev); 1597 clear_opal_cmd(dev);
1604 set_comid(dev, dev->comid); 1598 set_comid(dev, dev->comid);
1605 1599
1606 lkul = dev->func_data[dev->state];
1607
1608 memcpy(lr_buffer, opaluid[OPAL_LOCKINGRANGE_ACE_RDLOCKED], 1600 memcpy(lr_buffer, opaluid[OPAL_LOCKINGRANGE_ACE_RDLOCKED],
1609 OPAL_UID_LENGTH); 1601 OPAL_UID_LENGTH);
1610 1602
@@ -1671,11 +1663,11 @@ static int add_user_to_lr(struct opal_dev *dev)
1671 return finalize_and_send(dev, parse_and_check_status); 1663 return finalize_and_send(dev, parse_and_check_status);
1672} 1664}
1673 1665
1674static int lock_unlock_locking_range(struct opal_dev *dev) 1666static int lock_unlock_locking_range(struct opal_dev *dev, void *data)
1675{ 1667{
1676 u8 lr_buffer[OPAL_UID_LENGTH]; 1668 u8 lr_buffer[OPAL_UID_LENGTH];
1677 const u8 *method; 1669 const u8 *method;
1678 struct opal_lock_unlock *lkul; 1670 struct opal_lock_unlock *lkul = data;
1679 u8 read_locked = 1, write_locked = 1; 1671 u8 read_locked = 1, write_locked = 1;
1680 int err = 0; 1672 int err = 0;
1681 1673
@@ -1683,7 +1675,6 @@ static int lock_unlock_locking_range(struct opal_dev *dev)
1683 set_comid(dev, dev->comid); 1675 set_comid(dev, dev->comid);
1684 1676
1685 method = opalmethod[OPAL_SET]; 1677 method = opalmethod[OPAL_SET];
1686 lkul = dev->func_data[dev->state];
1687 if (build_locking_range(lr_buffer, sizeof(lr_buffer), 1678 if (build_locking_range(lr_buffer, sizeof(lr_buffer),
1688 lkul->session.opal_key.lr) < 0) 1679 lkul->session.opal_key.lr) < 0)
1689 return -ERANGE; 1680 return -ERANGE;
@@ -1735,19 +1726,18 @@ static int lock_unlock_locking_range(struct opal_dev *dev)
1735} 1726}
1736 1727
1737 1728
1738static int lock_unlock_locking_range_sum(struct opal_dev *dev) 1729static int lock_unlock_locking_range_sum(struct opal_dev *dev, void *data)
1739{ 1730{
1740 u8 lr_buffer[OPAL_UID_LENGTH]; 1731 u8 lr_buffer[OPAL_UID_LENGTH];
1741 u8 read_locked = 1, write_locked = 1; 1732 u8 read_locked = 1, write_locked = 1;
1742 const u8 *method; 1733 const u8 *method;
1743 struct opal_lock_unlock *lkul; 1734 struct opal_lock_unlock *lkul = data;
1744 int ret; 1735 int ret;
1745 1736
1746 clear_opal_cmd(dev); 1737 clear_opal_cmd(dev);
1747 set_comid(dev, dev->comid); 1738 set_comid(dev, dev->comid);
1748 1739
1749 method = opalmethod[OPAL_SET]; 1740 method = opalmethod[OPAL_SET];
1750 lkul = dev->func_data[dev->state];
1751 if (build_locking_range(lr_buffer, sizeof(lr_buffer), 1741 if (build_locking_range(lr_buffer, sizeof(lr_buffer),
1752 lkul->session.opal_key.lr) < 0) 1742 lkul->session.opal_key.lr) < 0)
1753 return -ERANGE; 1743 return -ERANGE;
@@ -1778,9 +1768,9 @@ static int lock_unlock_locking_range_sum(struct opal_dev *dev)
1778 return finalize_and_send(dev, parse_and_check_status); 1768 return finalize_and_send(dev, parse_and_check_status);
1779} 1769}
1780 1770
1781static int activate_lsp(struct opal_dev *dev) 1771static int activate_lsp(struct opal_dev *dev, void *data)
1782{ 1772{
1783 struct opal_lr_act *opal_act; 1773 struct opal_lr_act *opal_act = data;
1784 u8 user_lr[OPAL_UID_LENGTH]; 1774 u8 user_lr[OPAL_UID_LENGTH];
1785 u8 uint_3 = 0x83; 1775 u8 uint_3 = 0x83;
1786 int err = 0, i; 1776 int err = 0, i;
@@ -1788,8 +1778,6 @@ static int activate_lsp(struct opal_dev *dev)
1788 clear_opal_cmd(dev); 1778 clear_opal_cmd(dev);
1789 set_comid(dev, dev->comid); 1779 set_comid(dev, dev->comid);
1790 1780
1791 opal_act = dev->func_data[dev->state];
1792
1793 add_token_u8(&err, dev, OPAL_CALL); 1781 add_token_u8(&err, dev, OPAL_CALL);
1794 add_token_bytestring(&err, dev, opaluid[OPAL_LOCKINGSP_UID], 1782 add_token_bytestring(&err, dev, opaluid[OPAL_LOCKINGSP_UID],
1795 OPAL_UID_LENGTH); 1783 OPAL_UID_LENGTH);
@@ -1854,7 +1842,7 @@ static int get_lsp_lifecycle_cont(struct opal_dev *dev)
1854} 1842}
1855 1843
1856/* Determine if we're in the Manufactured Inactive or Active state */ 1844/* Determine if we're in the Manufactured Inactive or Active state */
1857static int get_lsp_lifecycle(struct opal_dev *dev) 1845static int get_lsp_lifecycle(struct opal_dev *dev, void *data)
1858{ 1846{
1859 int err = 0; 1847 int err = 0;
1860 1848
@@ -1915,14 +1903,13 @@ static int get_msid_cpin_pin_cont(struct opal_dev *dev)
1915 return 0; 1903 return 0;
1916} 1904}
1917 1905
1918static int get_msid_cpin_pin(struct opal_dev *dev) 1906static int get_msid_cpin_pin(struct opal_dev *dev, void *data)
1919{ 1907{
1920 int err = 0; 1908 int err = 0;
1921 1909
1922 clear_opal_cmd(dev); 1910 clear_opal_cmd(dev);
1923 set_comid(dev, dev->comid); 1911 set_comid(dev, dev->comid);
1924 1912
1925
1926 add_token_u8(&err, dev, OPAL_CALL); 1913 add_token_u8(&err, dev, OPAL_CALL);
1927 add_token_bytestring(&err, dev, opaluid[OPAL_C_PIN_MSID], 1914 add_token_bytestring(&err, dev, opaluid[OPAL_C_PIN_MSID],
1928 OPAL_UID_LENGTH); 1915 OPAL_UID_LENGTH);
@@ -1952,58 +1939,48 @@ static int get_msid_cpin_pin(struct opal_dev *dev)
1952 return finalize_and_send(dev, get_msid_cpin_pin_cont); 1939 return finalize_and_send(dev, get_msid_cpin_pin_cont);
1953} 1940}
1954 1941
1955static int build_end_opal_session(struct opal_dev *dev) 1942static int end_opal_session(struct opal_dev *dev, void *data)
1956{ 1943{
1957 int err = 0; 1944 int err = 0;
1958 1945
1959 clear_opal_cmd(dev); 1946 clear_opal_cmd(dev);
1960
1961 set_comid(dev, dev->comid); 1947 set_comid(dev, dev->comid);
1962 add_token_u8(&err, dev, OPAL_ENDOFSESSION); 1948 add_token_u8(&err, dev, OPAL_ENDOFSESSION);
1963 return err;
1964}
1965
1966static int end_opal_session(struct opal_dev *dev)
1967{
1968 int ret = build_end_opal_session(dev);
1969 1949
1970 if (ret < 0) 1950 if (err < 0)
1971 return ret; 1951 return err;
1972 return finalize_and_send(dev, end_session_cont); 1952 return finalize_and_send(dev, end_session_cont);
1973} 1953}
1974 1954
1975static int end_opal_session_error(struct opal_dev *dev) 1955static int end_opal_session_error(struct opal_dev *dev)
1976{ 1956{
1977 const opal_step error_end_session[] = { 1957 const struct opal_step error_end_session[] = {
1978 end_opal_session, 1958 { end_opal_session, },
1979 NULL, 1959 { NULL, }
1980 }; 1960 };
1981 dev->funcs = error_end_session; 1961 dev->steps = error_end_session;
1982 dev->state = 0;
1983 return next(dev); 1962 return next(dev);
1984} 1963}
1985 1964
1986static inline void setup_opal_dev(struct opal_dev *dev, 1965static inline void setup_opal_dev(struct opal_dev *dev,
1987 const opal_step *funcs) 1966 const struct opal_step *steps)
1988{ 1967{
1989 dev->state = 0; 1968 dev->steps = steps;
1990 dev->funcs = funcs;
1991 dev->tsn = 0; 1969 dev->tsn = 0;
1992 dev->hsn = 0; 1970 dev->hsn = 0;
1993 dev->func_data = NULL;
1994 dev->prev_data = NULL; 1971 dev->prev_data = NULL;
1995} 1972}
1996 1973
1997static int check_opal_support(struct opal_dev *dev) 1974static int check_opal_support(struct opal_dev *dev)
1998{ 1975{
1999 static const opal_step funcs[] = { 1976 const struct opal_step steps[] = {
2000 opal_discovery0, 1977 { opal_discovery0, },
2001 NULL 1978 { NULL, }
2002 }; 1979 };
2003 int ret; 1980 int ret;
2004 1981
2005 mutex_lock(&dev->dev_lock); 1982 mutex_lock(&dev->dev_lock);
2006 setup_opal_dev(dev, funcs); 1983 setup_opal_dev(dev, steps);
2007 ret = next(dev); 1984 ret = next(dev);
2008 dev->supported = !ret; 1985 dev->supported = !ret;
2009 mutex_unlock(&dev->dev_lock); 1986 mutex_unlock(&dev->dev_lock);
@@ -2034,24 +2011,18 @@ EXPORT_SYMBOL(init_opal_dev);
2034static int opal_secure_erase_locking_range(struct opal_dev *dev, 2011static int opal_secure_erase_locking_range(struct opal_dev *dev,
2035 struct opal_session_info *opal_session) 2012 struct opal_session_info *opal_session)
2036{ 2013{
2037 void *data[3] = { NULL }; 2014 const struct opal_step erase_steps[] = {
2038 static const opal_step erase_funcs[] = { 2015 { opal_discovery0, },
2039 opal_discovery0, 2016 { start_auth_opal_session, opal_session },
2040 start_auth_opal_session, 2017 { get_active_key, &opal_session->opal_key.lr },
2041 get_active_key, 2018 { gen_key, },
2042 gen_key, 2019 { end_opal_session, },
2043 end_opal_session, 2020 { NULL, }
2044 NULL,
2045 }; 2021 };
2046 int ret; 2022 int ret;
2047 2023
2048 mutex_lock(&dev->dev_lock); 2024 mutex_lock(&dev->dev_lock);
2049 setup_opal_dev(dev, erase_funcs); 2025 setup_opal_dev(dev, erase_steps);
2050
2051 dev->func_data = data;
2052 dev->func_data[1] = opal_session;
2053 dev->func_data[2] = &opal_session->opal_key.lr;
2054
2055 ret = next(dev); 2026 ret = next(dev);
2056 mutex_unlock(&dev->dev_lock); 2027 mutex_unlock(&dev->dev_lock);
2057 return ret; 2028 return ret;
@@ -2060,23 +2031,17 @@ static int opal_secure_erase_locking_range(struct opal_dev *dev,
2060static int opal_erase_locking_range(struct opal_dev *dev, 2031static int opal_erase_locking_range(struct opal_dev *dev,
2061 struct opal_session_info *opal_session) 2032 struct opal_session_info *opal_session)
2062{ 2033{
2063 void *data[3] = { NULL }; 2034 const struct opal_step erase_steps[] = {
2064 static const opal_step erase_funcs[] = { 2035 { opal_discovery0, },
2065 opal_discovery0, 2036 { start_auth_opal_session, opal_session },
2066 start_auth_opal_session, 2037 { erase_locking_range, opal_session },
2067 erase_locking_range, 2038 { end_opal_session, },
2068 end_opal_session, 2039 { NULL, }
2069 NULL,
2070 }; 2040 };
2071 int ret; 2041 int ret;
2072 2042
2073 mutex_lock(&dev->dev_lock); 2043 mutex_lock(&dev->dev_lock);
2074 setup_opal_dev(dev, erase_funcs); 2044 setup_opal_dev(dev, erase_steps);
2075
2076 dev->func_data = data;
2077 dev->func_data[1] = opal_session;
2078 dev->func_data[2] = opal_session;
2079
2080 ret = next(dev); 2045 ret = next(dev);
2081 mutex_unlock(&dev->dev_lock); 2046 mutex_unlock(&dev->dev_lock);
2082 return ret; 2047 return ret;
@@ -2085,16 +2050,15 @@ static int opal_erase_locking_range(struct opal_dev *dev,
2085static int opal_enable_disable_shadow_mbr(struct opal_dev *dev, 2050static int opal_enable_disable_shadow_mbr(struct opal_dev *dev,
2086 struct opal_mbr_data *opal_mbr) 2051 struct opal_mbr_data *opal_mbr)
2087{ 2052{
2088 void *func_data[6] = { NULL }; 2053 const struct opal_step mbr_steps[] = {
2089 static const opal_step mbr_funcs[] = { 2054 { opal_discovery0, },
2090 opal_discovery0, 2055 { start_admin1LSP_opal_session, &opal_mbr->key },
2091 start_admin1LSP_opal_session, 2056 { set_mbr_done, &opal_mbr->enable_disable },
2092 set_mbr_done, 2057 { end_opal_session, },
2093 end_opal_session, 2058 { start_admin1LSP_opal_session, &opal_mbr->key },
2094 start_admin1LSP_opal_session, 2059 { set_mbr_enable_disable, &opal_mbr->enable_disable },
2095 set_mbr_enable_disable, 2060 { end_opal_session, },
2096 end_opal_session, 2061 { NULL, }
2097 NULL,
2098 }; 2062 };
2099 int ret; 2063 int ret;
2100 2064
@@ -2103,12 +2067,7 @@ static int opal_enable_disable_shadow_mbr(struct opal_dev *dev,
2103 return -EINVAL; 2067 return -EINVAL;
2104 2068
2105 mutex_lock(&dev->dev_lock); 2069 mutex_lock(&dev->dev_lock);
2106 setup_opal_dev(dev, mbr_funcs); 2070 setup_opal_dev(dev, mbr_steps);
2107 dev->func_data = func_data;
2108 dev->func_data[1] = &opal_mbr->key;
2109 dev->func_data[2] = &opal_mbr->enable_disable;
2110 dev->func_data[4] = &opal_mbr->key;
2111 dev->func_data[5] = &opal_mbr->enable_disable;
2112 ret = next(dev); 2071 ret = next(dev);
2113 mutex_unlock(&dev->dev_lock); 2072 mutex_unlock(&dev->dev_lock);
2114 return ret; 2073 return ret;
@@ -2135,13 +2094,12 @@ static int opal_save(struct opal_dev *dev, struct opal_lock_unlock *lk_unlk)
2135static int opal_add_user_to_lr(struct opal_dev *dev, 2094static int opal_add_user_to_lr(struct opal_dev *dev,
2136 struct opal_lock_unlock *lk_unlk) 2095 struct opal_lock_unlock *lk_unlk)
2137{ 2096{
2138 void *func_data[3] = { NULL }; 2097 const struct opal_step steps[] = {
2139 static const opal_step funcs[] = { 2098 { opal_discovery0, },
2140 opal_discovery0, 2099 { start_admin1LSP_opal_session, &lk_unlk->session.opal_key },
2141 start_admin1LSP_opal_session, 2100 { add_user_to_lr, lk_unlk },
2142 add_user_to_lr, 2101 { end_opal_session, },
2143 end_opal_session, 2102 { NULL, }
2144 NULL
2145 }; 2103 };
2146 int ret; 2104 int ret;
2147 2105
@@ -2163,10 +2121,7 @@ static int opal_add_user_to_lr(struct opal_dev *dev,
2163 } 2121 }
2164 2122
2165 mutex_lock(&dev->dev_lock); 2123 mutex_lock(&dev->dev_lock);
2166 setup_opal_dev(dev, funcs); 2124 setup_opal_dev(dev, steps);
2167 dev->func_data = func_data;
2168 dev->func_data[1] = &lk_unlk->session.opal_key;
2169 dev->func_data[2] = lk_unlk;
2170 ret = next(dev); 2125 ret = next(dev);
2171 mutex_unlock(&dev->dev_lock); 2126 mutex_unlock(&dev->dev_lock);
2172 return ret; 2127 return ret;
@@ -2174,55 +2129,46 @@ static int opal_add_user_to_lr(struct opal_dev *dev,
2174 2129
2175static int opal_reverttper(struct opal_dev *dev, struct opal_key *opal) 2130static int opal_reverttper(struct opal_dev *dev, struct opal_key *opal)
2176{ 2131{
2177 void *data[2] = { NULL }; 2132 const struct opal_step revert_steps[] = {
2178 static const opal_step revert_funcs[] = { 2133 { opal_discovery0, },
2179 opal_discovery0, 2134 { start_SIDASP_opal_session, opal },
2180 start_SIDASP_opal_session, 2135 { revert_tper, }, /* controller will terminate session */
2181 revert_tper, /* controller will terminate session */ 2136 { NULL, }
2182 NULL,
2183 }; 2137 };
2184 int ret; 2138 int ret;
2185 2139
2186 mutex_lock(&dev->dev_lock); 2140 mutex_lock(&dev->dev_lock);
2187 setup_opal_dev(dev, revert_funcs); 2141 setup_opal_dev(dev, revert_steps);
2188 dev->func_data = data;
2189 dev->func_data[1] = opal;
2190 ret = next(dev); 2142 ret = next(dev);
2191 mutex_unlock(&dev->dev_lock); 2143 mutex_unlock(&dev->dev_lock);
2192 return ret; 2144 return ret;
2193} 2145}
2194 2146
2195static int __opal_lock_unlock_sum(struct opal_dev *dev) 2147static int __opal_lock_unlock(struct opal_dev *dev,
2148 struct opal_lock_unlock *lk_unlk)
2196{ 2149{
2197 static const opal_step ulk_funcs_sum[] = { 2150 const struct opal_step unlock_steps[] = {
2198 opal_discovery0, 2151 { opal_discovery0, },
2199 start_auth_opal_session, 2152 { start_auth_opal_session, &lk_unlk->session },
2200 lock_unlock_locking_range_sum, 2153 { lock_unlock_locking_range, lk_unlk },
2201 end_opal_session, 2154 { end_opal_session, },
2202 NULL 2155 { NULL, }
2203 }; 2156 };
2204 2157 const struct opal_step unlock_sum_steps[] = {
2205 dev->funcs = ulk_funcs_sum; 2158 { opal_discovery0, },
2206 return next(dev); 2159 { start_auth_opal_session, &lk_unlk->session },
2207} 2160 { lock_unlock_locking_range_sum, lk_unlk },
2208 2161 { end_opal_session, },
2209static int __opal_lock_unlock(struct opal_dev *dev) 2162 { NULL, }
2210{
2211 static const opal_step _unlock_funcs[] = {
2212 opal_discovery0,
2213 start_auth_opal_session,
2214 lock_unlock_locking_range,
2215 end_opal_session,
2216 NULL
2217 }; 2163 };
2218 2164
2219 dev->funcs = _unlock_funcs; 2165 dev->steps = lk_unlk->session.sum ? unlock_sum_steps : unlock_steps;
2220 return next(dev); 2166 return next(dev);
2221} 2167}
2222 2168
2223static int opal_lock_unlock(struct opal_dev *dev, struct opal_lock_unlock *lk_unlk) 2169static int opal_lock_unlock(struct opal_dev *dev,
2170 struct opal_lock_unlock *lk_unlk)
2224{ 2171{
2225 void *func_data[3] = { NULL };
2226 int ret; 2172 int ret;
2227 2173
2228 if (lk_unlk->session.who < OPAL_ADMIN1 || 2174 if (lk_unlk->session.who < OPAL_ADMIN1 ||
@@ -2230,43 +2176,30 @@ static int opal_lock_unlock(struct opal_dev *dev, struct opal_lock_unlock *lk_un
2230 return -EINVAL; 2176 return -EINVAL;
2231 2177
2232 mutex_lock(&dev->dev_lock); 2178 mutex_lock(&dev->dev_lock);
2233 setup_opal_dev(dev, NULL); 2179 ret = __opal_lock_unlock(dev, lk_unlk);
2234 dev->func_data = func_data;
2235 dev->func_data[1] = &lk_unlk->session;
2236 dev->func_data[2] = lk_unlk;
2237
2238 if (lk_unlk->session.sum)
2239 ret = __opal_lock_unlock_sum(dev);
2240 else
2241 ret = __opal_lock_unlock(dev);
2242
2243 mutex_unlock(&dev->dev_lock); 2180 mutex_unlock(&dev->dev_lock);
2244 return ret; 2181 return ret;
2245} 2182}
2246 2183
2247static int opal_take_ownership(struct opal_dev *dev, struct opal_key *opal) 2184static int opal_take_ownership(struct opal_dev *dev, struct opal_key *opal)
2248{ 2185{
2249 static const opal_step owner_funcs[] = { 2186 const struct opal_step owner_steps[] = {
2250 opal_discovery0, 2187 { opal_discovery0, },
2251 start_anybodyASP_opal_session, 2188 { start_anybodyASP_opal_session, },
2252 get_msid_cpin_pin, 2189 { get_msid_cpin_pin, },
2253 end_opal_session, 2190 { end_opal_session, },
2254 start_SIDASP_opal_session, 2191 { start_SIDASP_opal_session, opal },
2255 set_sid_cpin_pin, 2192 { set_sid_cpin_pin, opal },
2256 end_opal_session, 2193 { end_opal_session, },
2257 NULL 2194 { NULL, }
2258 }; 2195 };
2259 void *data[6] = { NULL };
2260 int ret; 2196 int ret;
2261 2197
2262 if (!dev) 2198 if (!dev)
2263 return -ENODEV; 2199 return -ENODEV;
2264 2200
2265 mutex_lock(&dev->dev_lock); 2201 mutex_lock(&dev->dev_lock);
2266 setup_opal_dev(dev, owner_funcs); 2202 setup_opal_dev(dev, owner_steps);
2267 dev->func_data = data;
2268 dev->func_data[4] = opal;
2269 dev->func_data[5] = opal;
2270 ret = next(dev); 2203 ret = next(dev);
2271 mutex_unlock(&dev->dev_lock); 2204 mutex_unlock(&dev->dev_lock);
2272 return ret; 2205 return ret;
@@ -2274,14 +2207,13 @@ static int opal_take_ownership(struct opal_dev *dev, struct opal_key *opal)
2274 2207
2275static int opal_activate_lsp(struct opal_dev *dev, struct opal_lr_act *opal_lr_act) 2208static int opal_activate_lsp(struct opal_dev *dev, struct opal_lr_act *opal_lr_act)
2276{ 2209{
2277 void *data[4] = { NULL }; 2210 const struct opal_step active_steps[] = {
2278 static const opal_step active_funcs[] = { 2211 { opal_discovery0, },
2279 opal_discovery0, 2212 { start_SIDASP_opal_session, &opal_lr_act->key },
2280 start_SIDASP_opal_session, /* Open session as SID auth */ 2213 { get_lsp_lifecycle, },
2281 get_lsp_lifecycle, 2214 { activate_lsp, opal_lr_act },
2282 activate_lsp, 2215 { end_opal_session, },
2283 end_opal_session, 2216 { NULL, }
2284 NULL
2285 }; 2217 };
2286 int ret; 2218 int ret;
2287 2219
@@ -2289,10 +2221,7 @@ static int opal_activate_lsp(struct opal_dev *dev, struct opal_lr_act *opal_lr_a
2289 return -EINVAL; 2221 return -EINVAL;
2290 2222
2291 mutex_lock(&dev->dev_lock); 2223 mutex_lock(&dev->dev_lock);
2292 setup_opal_dev(dev, active_funcs); 2224 setup_opal_dev(dev, active_steps);
2293 dev->func_data = data;
2294 dev->func_data[1] = &opal_lr_act->key;
2295 dev->func_data[3] = opal_lr_act;
2296 ret = next(dev); 2225 ret = next(dev);
2297 mutex_unlock(&dev->dev_lock); 2226 mutex_unlock(&dev->dev_lock);
2298 return ret; 2227 return ret;
@@ -2301,21 +2230,17 @@ static int opal_activate_lsp(struct opal_dev *dev, struct opal_lr_act *opal_lr_a
2301static int opal_setup_locking_range(struct opal_dev *dev, 2230static int opal_setup_locking_range(struct opal_dev *dev,
2302 struct opal_user_lr_setup *opal_lrs) 2231 struct opal_user_lr_setup *opal_lrs)
2303{ 2232{
2304 void *data[3] = { NULL }; 2233 const struct opal_step lr_steps[] = {
2305 static const opal_step lr_funcs[] = { 2234 { opal_discovery0, },
2306 opal_discovery0, 2235 { start_auth_opal_session, &opal_lrs->session },
2307 start_auth_opal_session, 2236 { setup_locking_range, opal_lrs },
2308 setup_locking_range, 2237 { end_opal_session, },
2309 end_opal_session, 2238 { NULL, }
2310 NULL,
2311 }; 2239 };
2312 int ret; 2240 int ret;
2313 2241
2314 mutex_lock(&dev->dev_lock); 2242 mutex_lock(&dev->dev_lock);
2315 setup_opal_dev(dev, lr_funcs); 2243 setup_opal_dev(dev, lr_steps);
2316 dev->func_data = data;
2317 dev->func_data[1] = &opal_lrs->session;
2318 dev->func_data[2] = opal_lrs;
2319 ret = next(dev); 2244 ret = next(dev);
2320 mutex_unlock(&dev->dev_lock); 2245 mutex_unlock(&dev->dev_lock);
2321 return ret; 2246 return ret;
@@ -2323,14 +2248,13 @@ static int opal_setup_locking_range(struct opal_dev *dev,
2323 2248
2324static int opal_set_new_pw(struct opal_dev *dev, struct opal_new_pw *opal_pw) 2249static int opal_set_new_pw(struct opal_dev *dev, struct opal_new_pw *opal_pw)
2325{ 2250{
2326 static const opal_step pw_funcs[] = { 2251 const struct opal_step pw_steps[] = {
2327 opal_discovery0, 2252 { opal_discovery0, },
2328 start_auth_opal_session, 2253 { start_auth_opal_session, &opal_pw->session },
2329 set_new_pw, 2254 { set_new_pw, &opal_pw->new_user_pw },
2330 end_opal_session, 2255 { end_opal_session, },
2331 NULL 2256 { NULL }
2332 }; 2257 };
2333 void *data[3] = { NULL };
2334 int ret; 2258 int ret;
2335 2259
2336 if (opal_pw->session.who < OPAL_ADMIN1 || 2260 if (opal_pw->session.who < OPAL_ADMIN1 ||
@@ -2340,11 +2264,7 @@ static int opal_set_new_pw(struct opal_dev *dev, struct opal_new_pw *opal_pw)
2340 return -EINVAL; 2264 return -EINVAL;
2341 2265
2342 mutex_lock(&dev->dev_lock); 2266 mutex_lock(&dev->dev_lock);
2343 setup_opal_dev(dev, pw_funcs); 2267 setup_opal_dev(dev, pw_steps);
2344 dev->func_data = data;
2345 dev->func_data[1] = (void *) &opal_pw->session;
2346 dev->func_data[2] = (void *) &opal_pw->new_user_pw;
2347
2348 ret = next(dev); 2268 ret = next(dev);
2349 mutex_unlock(&dev->dev_lock); 2269 mutex_unlock(&dev->dev_lock);
2350 return ret; 2270 return ret;
@@ -2353,14 +2273,13 @@ static int opal_set_new_pw(struct opal_dev *dev, struct opal_new_pw *opal_pw)
2353static int opal_activate_user(struct opal_dev *dev, 2273static int opal_activate_user(struct opal_dev *dev,
2354 struct opal_session_info *opal_session) 2274 struct opal_session_info *opal_session)
2355{ 2275{
2356 static const opal_step act_funcs[] = { 2276 const struct opal_step act_steps[] = {
2357 opal_discovery0, 2277 { opal_discovery0, },
2358 start_admin1LSP_opal_session, 2278 { start_admin1LSP_opal_session, &opal_session->opal_key },
2359 internal_activate_user, 2279 { internal_activate_user, opal_session },
2360 end_opal_session, 2280 { end_opal_session, },
2361 NULL 2281 { NULL, }
2362 }; 2282 };
2363 void *data[3] = { NULL };
2364 int ret; 2283 int ret;
2365 2284
2366 /* We can't activate Admin1 it's active as manufactured */ 2285 /* We can't activate Admin1 it's active as manufactured */
@@ -2371,10 +2290,7 @@ static int opal_activate_user(struct opal_dev *dev,
2371 } 2290 }
2372 2291
2373 mutex_lock(&dev->dev_lock); 2292 mutex_lock(&dev->dev_lock);
2374 setup_opal_dev(dev, act_funcs); 2293 setup_opal_dev(dev, act_steps);
2375 dev->func_data = data;
2376 dev->func_data[1] = &opal_session->opal_key;
2377 dev->func_data[2] = opal_session;
2378 ret = next(dev); 2294 ret = next(dev);
2379 mutex_unlock(&dev->dev_lock); 2295 mutex_unlock(&dev->dev_lock);
2380 return ret; 2296 return ret;
@@ -2383,7 +2299,6 @@ static int opal_activate_user(struct opal_dev *dev,
2383bool opal_unlock_from_suspend(struct opal_dev *dev) 2299bool opal_unlock_from_suspend(struct opal_dev *dev)
2384{ 2300{
2385 struct opal_suspend_data *suspend; 2301 struct opal_suspend_data *suspend;
2386 void *func_data[3] = { NULL };
2387 bool was_failure = false; 2302 bool was_failure = false;
2388 int ret = 0; 2303 int ret = 0;
2389 2304
@@ -2394,19 +2309,12 @@ bool opal_unlock_from_suspend(struct opal_dev *dev)
2394 2309
2395 mutex_lock(&dev->dev_lock); 2310 mutex_lock(&dev->dev_lock);
2396 setup_opal_dev(dev, NULL); 2311 setup_opal_dev(dev, NULL);
2397 dev->func_data = func_data;
2398 2312
2399 list_for_each_entry(suspend, &dev->unlk_lst, node) { 2313 list_for_each_entry(suspend, &dev->unlk_lst, node) {
2400 dev->state = 0;
2401 dev->func_data[1] = &suspend->unlk.session;
2402 dev->func_data[2] = &suspend->unlk;
2403 dev->tsn = 0; 2314 dev->tsn = 0;
2404 dev->hsn = 0; 2315 dev->hsn = 0;
2405 2316
2406 if (suspend->unlk.session.sum) 2317 ret = __opal_lock_unlock(dev, &suspend->unlk);
2407 ret = __opal_lock_unlock_sum(dev);
2408 else
2409 ret = __opal_lock_unlock(dev);
2410 if (ret) { 2318 if (ret) {
2411 pr_warn("Failed to unlock LR %hhu with sum %d\n", 2319 pr_warn("Failed to unlock LR %hhu with sum %d\n",
2412 suspend->unlk.session.opal_key.lr, 2320 suspend->unlk.session.opal_key.lr,
@@ -2433,7 +2341,7 @@ int sed_ioctl(struct opal_dev *dev, unsigned int cmd, void __user *arg)
2433 return -ENOTSUPP; 2341 return -ENOTSUPP;
2434 } 2342 }
2435 2343
2436 p = memdup_user(arg, _IOC_SIZE(cmd)); 2344 p = memdup_user(arg, _IOC_SIZE(cmd));
2437 if (IS_ERR(p)) 2345 if (IS_ERR(p))
2438 return PTR_ERR(p); 2346 return PTR_ERR(p);
2439 2347