Skip to content

Commit

Permalink
nfc: hci: pass callback data param as pointer in nci_request()
Browse files Browse the repository at this point in the history
The nci_request() receives a callback function and unsigned long data
argument "opt" which is passed to the callback.  Almost all of the
nci_request() callers pass pointer to a stack variable as data argument.
Only few pass scalar value (e.g. u8).

All such callbacks do not modify passed data argument and in previous
commit they were made as const.  However passing pointers via unsigned
long removes the const annotation.  The callback could simply cast
unsigned long to a pointer to writeable memory.

Use "const void *" as type of this "opt" argument to solve this and
prevent modifying the pointed contents.  This is also consistent with
generic pattern of passing data arguments - via "void *".  In few places
which pass scalar values, use casts via "unsigned long" to suppress any
warnings.

Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@canonical.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Krzysztof Kozlowski authored and David S. Miller committed Aug 2, 2021
1 parent 1e0dd56 commit 35d7a6f
Show file tree
Hide file tree
Showing 3 changed files with 67 additions and 72 deletions.
4 changes: 2 additions & 2 deletions include/net/nfc/nci_core.h
Original file line number Diff line number Diff line change
Expand Up @@ -276,8 +276,8 @@ int nci_register_device(struct nci_dev *ndev);
void nci_unregister_device(struct nci_dev *ndev);
int nci_request(struct nci_dev *ndev,
void (*req)(struct nci_dev *ndev,
unsigned long opt),
unsigned long opt, __u32 timeout);
const void *opt),
const void *opt, __u32 timeout);
int nci_prop_cmd(struct nci_dev *ndev, __u8 oid, size_t len,
const __u8 *payload);
int nci_core_cmd(struct nci_dev *ndev, __u16 opcode, size_t len,
Expand Down
119 changes: 58 additions & 61 deletions net/nfc/nci/core.c
Original file line number Diff line number Diff line change
Expand Up @@ -95,8 +95,8 @@ static void nci_req_cancel(struct nci_dev *ndev, int err)

/* Execute request and wait for completion. */
static int __nci_request(struct nci_dev *ndev,
void (*req)(struct nci_dev *ndev, unsigned long opt),
unsigned long opt, __u32 timeout)
void (*req)(struct nci_dev *ndev, const void *opt),
const void *opt, __u32 timeout)
{
int rc = 0;
long completion_rc;
Expand Down Expand Up @@ -139,8 +139,8 @@ static int __nci_request(struct nci_dev *ndev,

inline int nci_request(struct nci_dev *ndev,
void (*req)(struct nci_dev *ndev,
unsigned long opt),
unsigned long opt, __u32 timeout)
const void *opt),
const void *opt, __u32 timeout)
{
int rc;

Expand All @@ -155,25 +155,25 @@ inline int nci_request(struct nci_dev *ndev,
return rc;
}

static void nci_reset_req(struct nci_dev *ndev, unsigned long opt)
static void nci_reset_req(struct nci_dev *ndev, const void *opt)
{
struct nci_core_reset_cmd cmd;

cmd.reset_type = NCI_RESET_TYPE_RESET_CONFIG;
nci_send_cmd(ndev, NCI_OP_CORE_RESET_CMD, 1, &cmd);
}

static void nci_init_req(struct nci_dev *ndev, unsigned long opt)
static void nci_init_req(struct nci_dev *ndev, const void *opt)
{
u8 plen = 0;

if (opt)
plen = sizeof(struct nci_core_init_v2_cmd);

nci_send_cmd(ndev, NCI_OP_CORE_INIT_CMD, plen, (void *)opt);
nci_send_cmd(ndev, NCI_OP_CORE_INIT_CMD, plen, opt);
}

static void nci_init_complete_req(struct nci_dev *ndev, unsigned long opt)
static void nci_init_complete_req(struct nci_dev *ndev, const void *opt)
{
struct nci_rf_disc_map_cmd cmd;
struct disc_map_config *cfg = cmd.mapping_configs;
Expand Down Expand Up @@ -215,10 +215,9 @@ struct nci_set_config_param {
const __u8 *val;
};

static void nci_set_config_req(struct nci_dev *ndev, unsigned long opt)
static void nci_set_config_req(struct nci_dev *ndev, const void *opt)
{
const struct nci_set_config_param *param =
(struct nci_set_config_param *)opt;
const struct nci_set_config_param *param = opt;
struct nci_core_set_config_cmd cmd;

BUG_ON(param->len > NCI_MAX_PARAM_LEN);
Expand All @@ -236,10 +235,9 @@ struct nci_rf_discover_param {
__u32 tm_protocols;
};

static void nci_rf_discover_req(struct nci_dev *ndev, unsigned long opt)
static void nci_rf_discover_req(struct nci_dev *ndev, const void *opt)
{
const struct nci_rf_discover_param *param =
(struct nci_rf_discover_param *)opt;
const struct nci_rf_discover_param *param = opt;
struct nci_rf_disc_cmd cmd;

cmd.num_disc_configs = 0;
Expand Down Expand Up @@ -302,10 +300,9 @@ struct nci_rf_discover_select_param {
__u8 rf_protocol;
};

static void nci_rf_discover_select_req(struct nci_dev *ndev, unsigned long opt)
static void nci_rf_discover_select_req(struct nci_dev *ndev, const void *opt)
{
const struct nci_rf_discover_select_param *param =
(struct nci_rf_discover_select_param *)opt;
const struct nci_rf_discover_select_param *param = opt;
struct nci_rf_discover_select_cmd cmd;

cmd.rf_discovery_id = param->rf_discovery_id;
Expand All @@ -329,11 +326,11 @@ static void nci_rf_discover_select_req(struct nci_dev *ndev, unsigned long opt)
sizeof(struct nci_rf_discover_select_cmd), &cmd);
}

static void nci_rf_deactivate_req(struct nci_dev *ndev, unsigned long opt)
static void nci_rf_deactivate_req(struct nci_dev *ndev, const void *opt)
{
struct nci_rf_deactivate_cmd cmd;

cmd.type = opt;
cmd.type = (unsigned long)opt;

nci_send_cmd(ndev, NCI_OP_RF_DEACTIVATE_CMD,
sizeof(struct nci_rf_deactivate_cmd), &cmd);
Expand All @@ -345,10 +342,9 @@ struct nci_cmd_param {
const __u8 *payload;
};

static void nci_generic_req(struct nci_dev *ndev, unsigned long opt)
static void nci_generic_req(struct nci_dev *ndev, const void *opt)
{
const struct nci_cmd_param *param =
(struct nci_cmd_param *)opt;
const struct nci_cmd_param *param = opt;

nci_send_cmd(ndev, param->opcode, param->len, param->payload);
}
Expand All @@ -361,7 +357,7 @@ int nci_prop_cmd(struct nci_dev *ndev, __u8 oid, size_t len, const __u8 *payload
param.len = len;
param.payload = payload;

return __nci_request(ndev, nci_generic_req, (unsigned long)&param,
return __nci_request(ndev, nci_generic_req, &param,
msecs_to_jiffies(NCI_CMD_TIMEOUT));
}
EXPORT_SYMBOL(nci_prop_cmd);
Expand All @@ -375,21 +371,21 @@ int nci_core_cmd(struct nci_dev *ndev, __u16 opcode, size_t len,
param.len = len;
param.payload = payload;

return __nci_request(ndev, nci_generic_req, (unsigned long)&param,
return __nci_request(ndev, nci_generic_req, &param,
msecs_to_jiffies(NCI_CMD_TIMEOUT));
}
EXPORT_SYMBOL(nci_core_cmd);

int nci_core_reset(struct nci_dev *ndev)
{
return __nci_request(ndev, nci_reset_req, 0,
return __nci_request(ndev, nci_reset_req, (void *)0,
msecs_to_jiffies(NCI_RESET_TIMEOUT));
}
EXPORT_SYMBOL(nci_core_reset);

int nci_core_init(struct nci_dev *ndev)
{
return __nci_request(ndev, nci_init_req, 0,
return __nci_request(ndev, nci_init_req, (void *)0,
msecs_to_jiffies(NCI_INIT_TIMEOUT));
}
EXPORT_SYMBOL(nci_core_init);
Expand All @@ -399,9 +395,9 @@ struct nci_loopback_data {
struct sk_buff *data;
};

static void nci_send_data_req(struct nci_dev *ndev, unsigned long opt)
static void nci_send_data_req(struct nci_dev *ndev, const void *opt)
{
const struct nci_loopback_data *data = (struct nci_loopback_data *)opt;
const struct nci_loopback_data *data = opt;

nci_send_data(ndev, data->conn_id, data->data);
}
Expand Down Expand Up @@ -462,7 +458,7 @@ int nci_nfcc_loopback(struct nci_dev *ndev, const void *data, size_t data_len,
loopback_data.data = skb;

ndev->cur_conn_id = conn_id;
r = nci_request(ndev, nci_send_data_req, (unsigned long)&loopback_data,
r = nci_request(ndev, nci_send_data_req, &loopback_data,
msecs_to_jiffies(NCI_DATA_TIMEOUT));
if (r == NCI_STATUS_OK && resp)
*resp = conn_info->rx_skb;
Expand Down Expand Up @@ -495,7 +491,7 @@ static int nci_open_device(struct nci_dev *ndev)
rc = ndev->ops->init(ndev);

if (!rc) {
rc = __nci_request(ndev, nci_reset_req, 0,
rc = __nci_request(ndev, nci_reset_req, (void *)0,
msecs_to_jiffies(NCI_RESET_TIMEOUT));
}

Expand All @@ -508,10 +504,10 @@ static int nci_open_device(struct nci_dev *ndev)
.feature1 = NCI_FEATURE_DISABLE,
.feature2 = NCI_FEATURE_DISABLE
};
unsigned long opt = 0;
const void *opt = NULL;

if (ndev->nci_ver & NCI_VER_2_MASK)
opt = (unsigned long)&nci_init_v2_cmd;
opt = &nci_init_v2_cmd;

rc = __nci_request(ndev, nci_init_req, opt,
msecs_to_jiffies(NCI_INIT_TIMEOUT));
Expand All @@ -521,7 +517,7 @@ static int nci_open_device(struct nci_dev *ndev)
rc = ndev->ops->post_setup(ndev);

if (!rc) {
rc = __nci_request(ndev, nci_init_complete_req, 0,
rc = __nci_request(ndev, nci_init_complete_req, (void *)0,
msecs_to_jiffies(NCI_INIT_TIMEOUT));
}

Expand Down Expand Up @@ -571,7 +567,7 @@ static int nci_close_device(struct nci_dev *ndev)
atomic_set(&ndev->cmd_cnt, 1);

set_bit(NCI_INIT, &ndev->flags);
__nci_request(ndev, nci_reset_req, 0,
__nci_request(ndev, nci_reset_req, (void *)0,
msecs_to_jiffies(NCI_RESET_TIMEOUT));

/* After this point our queues are empty
Expand Down Expand Up @@ -637,15 +633,15 @@ int nci_set_config(struct nci_dev *ndev, __u8 id, size_t len, const __u8 *val)
param.len = len;
param.val = val;

return __nci_request(ndev, nci_set_config_req, (unsigned long)&param,
return __nci_request(ndev, nci_set_config_req, &param,
msecs_to_jiffies(NCI_SET_CONFIG_TIMEOUT));
}
EXPORT_SYMBOL(nci_set_config);

static void nci_nfcee_discover_req(struct nci_dev *ndev, unsigned long opt)
static void nci_nfcee_discover_req(struct nci_dev *ndev, const void *opt)
{
struct nci_nfcee_discover_cmd cmd;
__u8 action = opt;
__u8 action = (unsigned long)opt;

cmd.discovery_action = action;

Expand All @@ -654,15 +650,16 @@ static void nci_nfcee_discover_req(struct nci_dev *ndev, unsigned long opt)

int nci_nfcee_discover(struct nci_dev *ndev, u8 action)
{
return __nci_request(ndev, nci_nfcee_discover_req, action,
unsigned long opt = action;

return __nci_request(ndev, nci_nfcee_discover_req, (void *)opt,
msecs_to_jiffies(NCI_CMD_TIMEOUT));
}
EXPORT_SYMBOL(nci_nfcee_discover);

static void nci_nfcee_mode_set_req(struct nci_dev *ndev, unsigned long opt)
static void nci_nfcee_mode_set_req(struct nci_dev *ndev, const void *opt)
{
const struct nci_nfcee_mode_set_cmd *cmd =
(struct nci_nfcee_mode_set_cmd *)opt;
const struct nci_nfcee_mode_set_cmd *cmd = opt;

nci_send_cmd(ndev, NCI_OP_NFCEE_MODE_SET_CMD,
sizeof(struct nci_nfcee_mode_set_cmd), cmd);
Expand All @@ -675,16 +672,14 @@ int nci_nfcee_mode_set(struct nci_dev *ndev, u8 nfcee_id, u8 nfcee_mode)
cmd.nfcee_id = nfcee_id;
cmd.nfcee_mode = nfcee_mode;

return __nci_request(ndev, nci_nfcee_mode_set_req,
(unsigned long)&cmd,
return __nci_request(ndev, nci_nfcee_mode_set_req, &cmd,
msecs_to_jiffies(NCI_CMD_TIMEOUT));
}
EXPORT_SYMBOL(nci_nfcee_mode_set);

static void nci_core_conn_create_req(struct nci_dev *ndev, unsigned long opt)
static void nci_core_conn_create_req(struct nci_dev *ndev, const void *opt)
{
const struct core_conn_create_data *data =
(struct core_conn_create_data *)opt;
const struct core_conn_create_data *data = opt;

nci_send_cmd(ndev, NCI_OP_CORE_CONN_CREATE_CMD, data->length, data->cmd);
}
Expand Down Expand Up @@ -721,24 +716,26 @@ int nci_core_conn_create(struct nci_dev *ndev, u8 destination_type,
}
ndev->cur_dest_type = destination_type;

r = __nci_request(ndev, nci_core_conn_create_req, (unsigned long)&data,
r = __nci_request(ndev, nci_core_conn_create_req, &data,
msecs_to_jiffies(NCI_CMD_TIMEOUT));
kfree(cmd);
return r;
}
EXPORT_SYMBOL(nci_core_conn_create);

static void nci_core_conn_close_req(struct nci_dev *ndev, unsigned long opt)
static void nci_core_conn_close_req(struct nci_dev *ndev, const void *opt)
{
__u8 conn_id = opt;
__u8 conn_id = (unsigned long)opt;

nci_send_cmd(ndev, NCI_OP_CORE_CONN_CLOSE_CMD, 1, &conn_id);
}

int nci_core_conn_close(struct nci_dev *ndev, u8 conn_id)
{
unsigned long opt = conn_id;

ndev->cur_conn_id = conn_id;
return __nci_request(ndev, nci_core_conn_close_req, conn_id,
return __nci_request(ndev, nci_core_conn_close_req, (void *)opt,
msecs_to_jiffies(NCI_CMD_TIMEOUT));
}
EXPORT_SYMBOL(nci_core_conn_close);
Expand All @@ -758,14 +755,14 @@ static int nci_set_local_general_bytes(struct nfc_dev *nfc_dev)

param.id = NCI_PN_ATR_REQ_GEN_BYTES;

rc = nci_request(ndev, nci_set_config_req, (unsigned long)&param,
rc = nci_request(ndev, nci_set_config_req, &param,
msecs_to_jiffies(NCI_SET_CONFIG_TIMEOUT));
if (rc)
return rc;

param.id = NCI_LN_ATR_RES_GEN_BYTES;

return nci_request(ndev, nci_set_config_req, (unsigned long)&param,
return nci_request(ndev, nci_set_config_req, &param,
msecs_to_jiffies(NCI_SET_CONFIG_TIMEOUT));
}

Expand Down Expand Up @@ -815,7 +812,7 @@ static int nci_start_poll(struct nfc_dev *nfc_dev,
pr_debug("target active or w4 select, implicitly deactivate\n");

rc = nci_request(ndev, nci_rf_deactivate_req,
NCI_DEACTIVATE_TYPE_IDLE_MODE,
(void *)NCI_DEACTIVATE_TYPE_IDLE_MODE,
msecs_to_jiffies(NCI_RF_DEACTIVATE_TIMEOUT));
if (rc)
return -EBUSY;
Expand All @@ -837,7 +834,7 @@ static int nci_start_poll(struct nfc_dev *nfc_dev,

param.im_protocols = im_protocols;
param.tm_protocols = tm_protocols;
rc = nci_request(ndev, nci_rf_discover_req, (unsigned long)&param,
rc = nci_request(ndev, nci_rf_discover_req, &param,
msecs_to_jiffies(NCI_RF_DISC_TIMEOUT));

if (!rc)
Expand All @@ -856,7 +853,8 @@ static void nci_stop_poll(struct nfc_dev *nfc_dev)
return;
}

nci_request(ndev, nci_rf_deactivate_req, NCI_DEACTIVATE_TYPE_IDLE_MODE,
nci_request(ndev, nci_rf_deactivate_req,
(void *)NCI_DEACTIVATE_TYPE_IDLE_MODE,
msecs_to_jiffies(NCI_RF_DEACTIVATE_TIMEOUT));
}

Expand Down Expand Up @@ -915,8 +913,7 @@ static int nci_activate_target(struct nfc_dev *nfc_dev,
else
param.rf_protocol = NCI_RF_PROTOCOL_NFC_DEP;

rc = nci_request(ndev, nci_rf_discover_select_req,
(unsigned long)&param,
rc = nci_request(ndev, nci_rf_discover_select_req, &param,
msecs_to_jiffies(NCI_RF_DISC_SELECT_TIMEOUT));
}

Expand All @@ -931,7 +928,7 @@ static void nci_deactivate_target(struct nfc_dev *nfc_dev,
__u8 mode)
{
struct nci_dev *ndev = nfc_get_drvdata(nfc_dev);
u8 nci_mode = NCI_DEACTIVATE_TYPE_IDLE_MODE;
unsigned long nci_mode = NCI_DEACTIVATE_TYPE_IDLE_MODE;

pr_debug("entry\n");

Expand All @@ -949,7 +946,7 @@ static void nci_deactivate_target(struct nfc_dev *nfc_dev,
}

if (atomic_read(&ndev->state) == NCI_POLL_ACTIVE) {
nci_request(ndev, nci_rf_deactivate_req, nci_mode,
nci_request(ndev, nci_rf_deactivate_req, (void *)nci_mode,
msecs_to_jiffies(NCI_RF_DEACTIVATE_TIMEOUT));
}
}
Expand Down Expand Up @@ -987,8 +984,8 @@ static int nci_dep_link_down(struct nfc_dev *nfc_dev)
} else {
if (atomic_read(&ndev->state) == NCI_LISTEN_ACTIVE ||
atomic_read(&ndev->state) == NCI_DISCOVERY) {
nci_request(ndev, nci_rf_deactivate_req, 0,
msecs_to_jiffies(NCI_RF_DEACTIVATE_TIMEOUT));
nci_request(ndev, nci_rf_deactivate_req, (void *)0,
msecs_to_jiffies(NCI_RF_DEACTIVATE_TIMEOUT));
}

rc = nfc_tm_deactivated(nfc_dev);
Expand Down
Loading

0 comments on commit 35d7a6f

Please sign in to comment.