.. | .. |
---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-or-later |
---|
1 | 2 | /* |
---|
2 | 3 | * Copyright (C) 2011 Instituto Nokia de Tecnologia |
---|
3 | 4 | * |
---|
.. | .. |
---|
10 | 11 | * |
---|
11 | 12 | * Copyright 2006-2010 Johannes Berg <johannes@sipsolutions.net> |
---|
12 | 13 | * Copyright 2013-2014 Intel Mobile Communications GmbH |
---|
13 | | - * |
---|
14 | | - * This program is free software; you can redistribute it and/or modify |
---|
15 | | - * it under the terms of the GNU General Public License as published by |
---|
16 | | - * the Free Software Foundation; either version 2 of the License, or |
---|
17 | | - * (at your option) any later version. |
---|
18 | | - * |
---|
19 | | - * This program is distributed in the hope that it will be useful, |
---|
20 | | - * but WITHOUT ANY WARRANTY; without even the implied warranty of |
---|
21 | | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
---|
22 | | - * GNU General Public License for more details. |
---|
23 | | - * |
---|
24 | | - * You should have received a copy of the GNU General Public License |
---|
25 | | - * along with this program; if not, see <http://www.gnu.org/licenses/>. |
---|
26 | 14 | */ |
---|
27 | 15 | |
---|
28 | 16 | #define pr_fmt(fmt) KBUILD_MODNAME ": %s: " fmt, __func__ |
---|
.. | .. |
---|
118 | 106 | |
---|
119 | 107 | static struct nfc_dev *__get_device_from_cb(struct netlink_callback *cb) |
---|
120 | 108 | { |
---|
121 | | - struct nlattr **attrbuf = genl_family_attrbuf(&nfc_genl_family); |
---|
| 109 | + const struct genl_dumpit_info *info = genl_dumpit_info(cb); |
---|
122 | 110 | struct nfc_dev *dev; |
---|
123 | | - int rc; |
---|
124 | 111 | u32 idx; |
---|
125 | 112 | |
---|
126 | | - rc = nlmsg_parse(cb->nlh, GENL_HDRLEN + nfc_genl_family.hdrsize, |
---|
127 | | - attrbuf, nfc_genl_family.maxattr, nfc_genl_policy, |
---|
128 | | - NULL); |
---|
129 | | - if (rc < 0) |
---|
130 | | - return ERR_PTR(rc); |
---|
131 | | - |
---|
132 | | - if (!attrbuf[NFC_ATTR_DEVICE_INDEX]) |
---|
| 113 | + if (!info->attrs[NFC_ATTR_DEVICE_INDEX]) |
---|
133 | 114 | return ERR_PTR(-EINVAL); |
---|
134 | 115 | |
---|
135 | | - idx = nla_get_u32(attrbuf[NFC_ATTR_DEVICE_INDEX]); |
---|
| 116 | + idx = nla_get_u32(info->attrs[NFC_ATTR_DEVICE_INDEX]); |
---|
136 | 117 | |
---|
137 | 118 | dev = nfc_get_device(idx); |
---|
138 | 119 | if (!dev) |
---|
.. | .. |
---|
396 | 377 | if (nla_put_u32(msg, NFC_ATTR_DEVICE_INDEX, dev->idx)) |
---|
397 | 378 | goto nla_put_failure; |
---|
398 | 379 | |
---|
399 | | - sdp_attr = nla_nest_start(msg, NFC_ATTR_LLC_SDP); |
---|
| 380 | + sdp_attr = nla_nest_start_noflag(msg, NFC_ATTR_LLC_SDP); |
---|
400 | 381 | if (sdp_attr == NULL) { |
---|
401 | 382 | rc = -ENOMEM; |
---|
402 | 383 | goto nla_put_failure; |
---|
.. | .. |
---|
406 | 387 | hlist_for_each_entry_safe(sdres, n, sdres_list, node) { |
---|
407 | 388 | pr_debug("uri: %s, sap: %d\n", sdres->uri, sdres->sap); |
---|
408 | 389 | |
---|
409 | | - uri_attr = nla_nest_start(msg, i++); |
---|
| 390 | + uri_attr = nla_nest_start_noflag(msg, i++); |
---|
410 | 391 | if (uri_attr == NULL) { |
---|
411 | 392 | rc = -ENOMEM; |
---|
412 | 393 | goto nla_put_failure; |
---|
.. | .. |
---|
1058 | 1039 | msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); |
---|
1059 | 1040 | if (!msg) { |
---|
1060 | 1041 | rc = -ENOMEM; |
---|
1061 | | - goto exit; |
---|
| 1042 | + goto put_local; |
---|
1062 | 1043 | } |
---|
1063 | 1044 | |
---|
1064 | 1045 | rc = nfc_genl_send_params(msg, local, info->snd_portid, info->snd_seq); |
---|
| 1046 | + |
---|
| 1047 | +put_local: |
---|
| 1048 | + nfc_llcp_local_put(local); |
---|
1065 | 1049 | |
---|
1066 | 1050 | exit: |
---|
1067 | 1051 | device_unlock(&dev->dev); |
---|
.. | .. |
---|
1124 | 1108 | if (info->attrs[NFC_ATTR_LLC_PARAM_LTO]) { |
---|
1125 | 1109 | if (dev->dep_link_up) { |
---|
1126 | 1110 | rc = -EINPROGRESS; |
---|
1127 | | - goto exit; |
---|
| 1111 | + goto put_local; |
---|
1128 | 1112 | } |
---|
1129 | 1113 | |
---|
1130 | 1114 | local->lto = nla_get_u8(info->attrs[NFC_ATTR_LLC_PARAM_LTO]); |
---|
.. | .. |
---|
1135 | 1119 | |
---|
1136 | 1120 | if (info->attrs[NFC_ATTR_LLC_PARAM_MIUX]) |
---|
1137 | 1121 | local->miux = cpu_to_be16(miux); |
---|
| 1122 | + |
---|
| 1123 | +put_local: |
---|
| 1124 | + nfc_llcp_local_put(local); |
---|
1138 | 1125 | |
---|
1139 | 1126 | exit: |
---|
1140 | 1127 | device_unlock(&dev->dev); |
---|
.. | .. |
---|
1185 | 1172 | tlvs_len = 0; |
---|
1186 | 1173 | |
---|
1187 | 1174 | nla_for_each_nested(attr, info->attrs[NFC_ATTR_LLC_SDP], rem) { |
---|
1188 | | - rc = nla_parse_nested(sdp_attrs, NFC_SDP_ATTR_MAX, attr, |
---|
1189 | | - nfc_sdp_genl_policy, info->extack); |
---|
| 1175 | + rc = nla_parse_nested_deprecated(sdp_attrs, NFC_SDP_ATTR_MAX, |
---|
| 1176 | + attr, nfc_sdp_genl_policy, |
---|
| 1177 | + info->extack); |
---|
1190 | 1178 | |
---|
1191 | 1179 | if (rc != 0) { |
---|
1192 | 1180 | rc = -EINVAL; |
---|
1193 | | - goto exit; |
---|
| 1181 | + goto put_local; |
---|
1194 | 1182 | } |
---|
1195 | 1183 | |
---|
1196 | 1184 | if (!sdp_attrs[NFC_SDP_ATTR_URI]) |
---|
.. | .. |
---|
1209 | 1197 | sdreq = nfc_llcp_build_sdreq_tlv(tid, uri, uri_len); |
---|
1210 | 1198 | if (sdreq == NULL) { |
---|
1211 | 1199 | rc = -ENOMEM; |
---|
1212 | | - goto exit; |
---|
| 1200 | + goto put_local; |
---|
1213 | 1201 | } |
---|
1214 | 1202 | |
---|
1215 | 1203 | tlvs_len += sdreq->tlv_len; |
---|
.. | .. |
---|
1219 | 1207 | |
---|
1220 | 1208 | if (hlist_empty(&sdreq_list)) { |
---|
1221 | 1209 | rc = -EINVAL; |
---|
1222 | | - goto exit; |
---|
| 1210 | + goto put_local; |
---|
1223 | 1211 | } |
---|
1224 | 1212 | |
---|
1225 | 1213 | rc = nfc_llcp_send_snl_sdreq(local, &sdreq_list, tlvs_len); |
---|
| 1214 | + |
---|
| 1215 | +put_local: |
---|
| 1216 | + nfc_llcp_local_put(local); |
---|
| 1217 | + |
---|
1226 | 1218 | exit: |
---|
1227 | 1219 | device_unlock(&dev->dev); |
---|
1228 | 1220 | |
---|
.. | .. |
---|
1262 | 1254 | struct sk_buff *msg; |
---|
1263 | 1255 | void *hdr; |
---|
1264 | 1256 | |
---|
1265 | | - msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_KERNEL); |
---|
| 1257 | + msg = nlmsg_new(NLMSG_DEFAULT_SIZE, GFP_ATOMIC); |
---|
1266 | 1258 | if (!msg) |
---|
1267 | 1259 | return -ENOMEM; |
---|
1268 | 1260 | |
---|
.. | .. |
---|
1278 | 1270 | |
---|
1279 | 1271 | genlmsg_end(msg, hdr); |
---|
1280 | 1272 | |
---|
1281 | | - genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_KERNEL); |
---|
| 1273 | + genlmsg_multicast(&nfc_genl_family, msg, 0, 0, GFP_ATOMIC); |
---|
1282 | 1274 | |
---|
1283 | 1275 | return 0; |
---|
1284 | 1276 | |
---|
.. | .. |
---|
1460 | 1452 | rc = dev->ops->se_io(dev, se_idx, apdu, |
---|
1461 | 1453 | apdu_length, cb, cb_context); |
---|
1462 | 1454 | |
---|
| 1455 | + device_unlock(&dev->dev); |
---|
| 1456 | + return rc; |
---|
| 1457 | + |
---|
1463 | 1458 | error: |
---|
1464 | 1459 | device_unlock(&dev->dev); |
---|
| 1460 | + kfree(cb_context); |
---|
1465 | 1461 | return rc; |
---|
1466 | 1462 | } |
---|
1467 | 1463 | |
---|
.. | .. |
---|
1515 | 1511 | u32 dev_idx, se_idx; |
---|
1516 | 1512 | u8 *apdu; |
---|
1517 | 1513 | size_t apdu_len; |
---|
| 1514 | + int rc; |
---|
1518 | 1515 | |
---|
1519 | 1516 | if (!info->attrs[NFC_ATTR_DEVICE_INDEX] || |
---|
1520 | 1517 | !info->attrs[NFC_ATTR_SE_INDEX] || |
---|
.. | .. |
---|
1528 | 1525 | if (!dev) |
---|
1529 | 1526 | return -ENODEV; |
---|
1530 | 1527 | |
---|
1531 | | - if (!dev->ops || !dev->ops->se_io) |
---|
1532 | | - return -ENOTSUPP; |
---|
| 1528 | + if (!dev->ops || !dev->ops->se_io) { |
---|
| 1529 | + rc = -EOPNOTSUPP; |
---|
| 1530 | + goto put_dev; |
---|
| 1531 | + } |
---|
1533 | 1532 | |
---|
1534 | 1533 | apdu_len = nla_len(info->attrs[NFC_ATTR_SE_APDU]); |
---|
1535 | | - if (apdu_len == 0) |
---|
1536 | | - return -EINVAL; |
---|
| 1534 | + if (apdu_len == 0) { |
---|
| 1535 | + rc = -EINVAL; |
---|
| 1536 | + goto put_dev; |
---|
| 1537 | + } |
---|
1537 | 1538 | |
---|
1538 | 1539 | apdu = nla_data(info->attrs[NFC_ATTR_SE_APDU]); |
---|
1539 | | - if (!apdu) |
---|
1540 | | - return -EINVAL; |
---|
| 1540 | + if (!apdu) { |
---|
| 1541 | + rc = -EINVAL; |
---|
| 1542 | + goto put_dev; |
---|
| 1543 | + } |
---|
1541 | 1544 | |
---|
1542 | 1545 | ctx = kzalloc(sizeof(struct se_io_ctx), GFP_KERNEL); |
---|
1543 | | - if (!ctx) |
---|
1544 | | - return -ENOMEM; |
---|
| 1546 | + if (!ctx) { |
---|
| 1547 | + rc = -ENOMEM; |
---|
| 1548 | + goto put_dev; |
---|
| 1549 | + } |
---|
1545 | 1550 | |
---|
1546 | 1551 | ctx->dev_idx = dev_idx; |
---|
1547 | 1552 | ctx->se_idx = se_idx; |
---|
1548 | 1553 | |
---|
1549 | | - return nfc_se_io(dev, se_idx, apdu, apdu_len, se_io_cb, ctx); |
---|
| 1554 | + rc = nfc_se_io(dev, se_idx, apdu, apdu_len, se_io_cb, ctx); |
---|
| 1555 | + |
---|
| 1556 | +put_dev: |
---|
| 1557 | + nfc_put_device(dev); |
---|
| 1558 | + return rc; |
---|
1550 | 1559 | } |
---|
1551 | 1560 | |
---|
1552 | 1561 | static int nfc_genl_vendor_cmd(struct sk_buff *skb, |
---|
.. | .. |
---|
1569 | 1578 | subcmd = nla_get_u32(info->attrs[NFC_ATTR_VENDOR_SUBCMD]); |
---|
1570 | 1579 | |
---|
1571 | 1580 | dev = nfc_get_device(dev_idx); |
---|
1572 | | - if (!dev || !dev->vendor_cmds || !dev->n_vendor_cmds) |
---|
| 1581 | + if (!dev) |
---|
1573 | 1582 | return -ENODEV; |
---|
| 1583 | + |
---|
| 1584 | + if (!dev->vendor_cmds || !dev->n_vendor_cmds) { |
---|
| 1585 | + err = -ENODEV; |
---|
| 1586 | + goto put_dev; |
---|
| 1587 | + } |
---|
1574 | 1588 | |
---|
1575 | 1589 | if (info->attrs[NFC_ATTR_VENDOR_DATA]) { |
---|
1576 | 1590 | data = nla_data(info->attrs[NFC_ATTR_VENDOR_DATA]); |
---|
1577 | 1591 | data_len = nla_len(info->attrs[NFC_ATTR_VENDOR_DATA]); |
---|
1578 | | - if (data_len == 0) |
---|
1579 | | - return -EINVAL; |
---|
| 1592 | + if (data_len == 0) { |
---|
| 1593 | + err = -EINVAL; |
---|
| 1594 | + goto put_dev; |
---|
| 1595 | + } |
---|
1580 | 1596 | } else { |
---|
1581 | 1597 | data = NULL; |
---|
1582 | 1598 | data_len = 0; |
---|
.. | .. |
---|
1591 | 1607 | dev->cur_cmd_info = info; |
---|
1592 | 1608 | err = cmd->doit(dev, data, data_len); |
---|
1593 | 1609 | dev->cur_cmd_info = NULL; |
---|
1594 | | - return err; |
---|
| 1610 | + goto put_dev; |
---|
1595 | 1611 | } |
---|
1596 | 1612 | |
---|
1597 | | - return -EOPNOTSUPP; |
---|
| 1613 | + err = -EOPNOTSUPP; |
---|
| 1614 | + |
---|
| 1615 | +put_dev: |
---|
| 1616 | + nfc_put_device(dev); |
---|
| 1617 | + return err; |
---|
1598 | 1618 | } |
---|
1599 | 1619 | |
---|
1600 | 1620 | /* message building helper */ |
---|
.. | .. |
---|
1677 | 1697 | static const struct genl_ops nfc_genl_ops[] = { |
---|
1678 | 1698 | { |
---|
1679 | 1699 | .cmd = NFC_CMD_GET_DEVICE, |
---|
| 1700 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
---|
1680 | 1701 | .doit = nfc_genl_get_device, |
---|
1681 | 1702 | .dumpit = nfc_genl_dump_devices, |
---|
1682 | 1703 | .done = nfc_genl_dump_devices_done, |
---|
1683 | | - .policy = nfc_genl_policy, |
---|
1684 | 1704 | }, |
---|
1685 | 1705 | { |
---|
1686 | 1706 | .cmd = NFC_CMD_DEV_UP, |
---|
| 1707 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
---|
1687 | 1708 | .doit = nfc_genl_dev_up, |
---|
1688 | | - .policy = nfc_genl_policy, |
---|
1689 | 1709 | }, |
---|
1690 | 1710 | { |
---|
1691 | 1711 | .cmd = NFC_CMD_DEV_DOWN, |
---|
| 1712 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
---|
1692 | 1713 | .doit = nfc_genl_dev_down, |
---|
1693 | | - .policy = nfc_genl_policy, |
---|
1694 | 1714 | }, |
---|
1695 | 1715 | { |
---|
1696 | 1716 | .cmd = NFC_CMD_START_POLL, |
---|
| 1717 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
---|
1697 | 1718 | .doit = nfc_genl_start_poll, |
---|
1698 | | - .policy = nfc_genl_policy, |
---|
1699 | 1719 | }, |
---|
1700 | 1720 | { |
---|
1701 | 1721 | .cmd = NFC_CMD_STOP_POLL, |
---|
| 1722 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
---|
1702 | 1723 | .doit = nfc_genl_stop_poll, |
---|
1703 | | - .policy = nfc_genl_policy, |
---|
1704 | 1724 | }, |
---|
1705 | 1725 | { |
---|
1706 | 1726 | .cmd = NFC_CMD_DEP_LINK_UP, |
---|
| 1727 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
---|
1707 | 1728 | .doit = nfc_genl_dep_link_up, |
---|
1708 | | - .policy = nfc_genl_policy, |
---|
1709 | 1729 | }, |
---|
1710 | 1730 | { |
---|
1711 | 1731 | .cmd = NFC_CMD_DEP_LINK_DOWN, |
---|
| 1732 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
---|
1712 | 1733 | .doit = nfc_genl_dep_link_down, |
---|
1713 | | - .policy = nfc_genl_policy, |
---|
1714 | 1734 | }, |
---|
1715 | 1735 | { |
---|
1716 | 1736 | .cmd = NFC_CMD_GET_TARGET, |
---|
| 1737 | + .validate = GENL_DONT_VALIDATE_STRICT | |
---|
| 1738 | + GENL_DONT_VALIDATE_DUMP_STRICT, |
---|
1717 | 1739 | .dumpit = nfc_genl_dump_targets, |
---|
1718 | 1740 | .done = nfc_genl_dump_targets_done, |
---|
1719 | | - .policy = nfc_genl_policy, |
---|
1720 | 1741 | }, |
---|
1721 | 1742 | { |
---|
1722 | 1743 | .cmd = NFC_CMD_LLC_GET_PARAMS, |
---|
| 1744 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
---|
1723 | 1745 | .doit = nfc_genl_llc_get_params, |
---|
1724 | | - .policy = nfc_genl_policy, |
---|
1725 | 1746 | }, |
---|
1726 | 1747 | { |
---|
1727 | 1748 | .cmd = NFC_CMD_LLC_SET_PARAMS, |
---|
| 1749 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
---|
1728 | 1750 | .doit = nfc_genl_llc_set_params, |
---|
1729 | | - .policy = nfc_genl_policy, |
---|
1730 | 1751 | }, |
---|
1731 | 1752 | { |
---|
1732 | 1753 | .cmd = NFC_CMD_LLC_SDREQ, |
---|
| 1754 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
---|
1733 | 1755 | .doit = nfc_genl_llc_sdreq, |
---|
1734 | | - .policy = nfc_genl_policy, |
---|
1735 | 1756 | }, |
---|
1736 | 1757 | { |
---|
1737 | 1758 | .cmd = NFC_CMD_FW_DOWNLOAD, |
---|
| 1759 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
---|
1738 | 1760 | .doit = nfc_genl_fw_download, |
---|
1739 | | - .policy = nfc_genl_policy, |
---|
1740 | 1761 | }, |
---|
1741 | 1762 | { |
---|
1742 | 1763 | .cmd = NFC_CMD_ENABLE_SE, |
---|
| 1764 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
---|
1743 | 1765 | .doit = nfc_genl_enable_se, |
---|
1744 | | - .policy = nfc_genl_policy, |
---|
1745 | 1766 | }, |
---|
1746 | 1767 | { |
---|
1747 | 1768 | .cmd = NFC_CMD_DISABLE_SE, |
---|
| 1769 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
---|
1748 | 1770 | .doit = nfc_genl_disable_se, |
---|
1749 | | - .policy = nfc_genl_policy, |
---|
1750 | 1771 | }, |
---|
1751 | 1772 | { |
---|
1752 | 1773 | .cmd = NFC_CMD_GET_SE, |
---|
| 1774 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
---|
1753 | 1775 | .dumpit = nfc_genl_dump_ses, |
---|
1754 | 1776 | .done = nfc_genl_dump_ses_done, |
---|
1755 | | - .policy = nfc_genl_policy, |
---|
1756 | 1777 | }, |
---|
1757 | 1778 | { |
---|
1758 | 1779 | .cmd = NFC_CMD_SE_IO, |
---|
| 1780 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
---|
1759 | 1781 | .doit = nfc_genl_se_io, |
---|
1760 | | - .policy = nfc_genl_policy, |
---|
1761 | 1782 | }, |
---|
1762 | 1783 | { |
---|
1763 | 1784 | .cmd = NFC_CMD_ACTIVATE_TARGET, |
---|
| 1785 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
---|
1764 | 1786 | .doit = nfc_genl_activate_target, |
---|
1765 | | - .policy = nfc_genl_policy, |
---|
1766 | 1787 | }, |
---|
1767 | 1788 | { |
---|
1768 | 1789 | .cmd = NFC_CMD_VENDOR, |
---|
| 1790 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
---|
1769 | 1791 | .doit = nfc_genl_vendor_cmd, |
---|
1770 | | - .policy = nfc_genl_policy, |
---|
1771 | 1792 | }, |
---|
1772 | 1793 | { |
---|
1773 | 1794 | .cmd = NFC_CMD_DEACTIVATE_TARGET, |
---|
| 1795 | + .validate = GENL_DONT_VALIDATE_STRICT | GENL_DONT_VALIDATE_DUMP, |
---|
1774 | 1796 | .doit = nfc_genl_deactivate_target, |
---|
1775 | | - .policy = nfc_genl_policy, |
---|
1776 | 1797 | }, |
---|
1777 | 1798 | }; |
---|
1778 | 1799 | |
---|
.. | .. |
---|
1781 | 1802 | .name = NFC_GENL_NAME, |
---|
1782 | 1803 | .version = NFC_GENL_VERSION, |
---|
1783 | 1804 | .maxattr = NFC_ATTR_MAX, |
---|
| 1805 | + .policy = nfc_genl_policy, |
---|
1784 | 1806 | .module = THIS_MODULE, |
---|
1785 | 1807 | .ops = nfc_genl_ops, |
---|
1786 | 1808 | .n_ops = ARRAY_SIZE(nfc_genl_ops), |
---|