Loading drivers/nfc/pn533.c +33 −64 Original line number Diff line number Diff line Loading @@ -1450,65 +1450,46 @@ static int pn533_init_target_frame(struct pn533_frame *frame, #define PN533_CMD_DATAEXCH_HEAD_LEN 1 #define PN533_CMD_DATAEXCH_DATA_MAXLEN 262 static int pn533_tm_get_data_complete(struct pn533 *dev, void *arg, u8 *params, int params_len) struct sk_buff *resp) { struct sk_buff *skb_resp = arg; struct pn533_frame *in_frame = (struct pn533_frame *) skb_resp->data; u8 status; nfc_dev_dbg(&dev->interface->dev, "%s", __func__); if (params_len < 0) { nfc_dev_err(&dev->interface->dev, "Error %d when starting as a target", params_len); if (IS_ERR(resp)) return PTR_ERR(resp); return params_len; } status = resp->data[0]; skb_pull(resp, sizeof(status)); if (params_len > 0 && params[0] != 0) { if (status != 0) { nfc_tm_deactivated(dev->nfc_dev); dev->tgt_mode = 0; kfree_skb(skb_resp); dev_kfree_skb(resp); return 0; } skb_put(skb_resp, PN533_FRAME_SIZE(in_frame)); skb_pull(skb_resp, PN533_FRAME_HEADER_LEN + PN533_CMD_DATAEXCH_HEAD_LEN); skb_trim(skb_resp, skb_resp->len - PN533_FRAME_TAIL_LEN); return nfc_tm_data_received(dev->nfc_dev, skb_resp); return nfc_tm_data_received(dev->nfc_dev, resp); } static void pn533_wq_tg_get_data(struct work_struct *work) { struct pn533 *dev = container_of(work, struct pn533, tg_work); struct pn533_frame *in_frame; struct sk_buff *skb_resp; size_t skb_resp_len; nfc_dev_dbg(&dev->interface->dev, "%s", __func__); struct sk_buff *skb; int rc; skb_resp_len = PN533_FRAME_HEADER_LEN + PN533_CMD_DATAEXCH_HEAD_LEN + PN533_CMD_DATAEXCH_DATA_MAXLEN + PN533_FRAME_TAIL_LEN; nfc_dev_dbg(&dev->interface->dev, "%s", __func__); skb_resp = nfc_alloc_recv_skb(skb_resp_len, GFP_KERNEL); if (!skb_resp) skb = pn533_alloc_skb(0); if (!skb) return; in_frame = (struct pn533_frame *)skb_resp->data; pn533_tx_frame_init(dev->out_frame, PN533_CMD_TG_GET_DATA); pn533_tx_frame_finish(dev->out_frame); rc = pn533_send_data_async(dev, PN533_CMD_TG_GET_DATA, skb, pn533_tm_get_data_complete, NULL); pn533_send_cmd_frame_async(dev, dev->out_frame, in_frame, skb_resp_len, pn533_tm_get_data_complete, skb_resp); if (rc < 0) dev_kfree_skb(skb); return; } Loading Loading @@ -2280,23 +2261,20 @@ static int pn533_transceive(struct nfc_dev *nfc_dev, } static int pn533_tm_send_complete(struct pn533 *dev, void *arg, u8 *params, int params_len) struct sk_buff *resp) { struct sk_buff *skb_out = arg; u8 status; nfc_dev_dbg(&dev->interface->dev, "%s", __func__); dev_kfree_skb(skb_out); if (IS_ERR(resp)) return PTR_ERR(resp); if (params_len < 0) { nfc_dev_err(&dev->interface->dev, "Error %d when sending data", params_len); status = resp->data[0]; return params_len; } dev_kfree_skb(resp); if (params_len > 0 && params[0] != 0) { if (status != 0) { nfc_tm_deactivated(dev->nfc_dev); dev->tgt_mode = 0; Loading @@ -2312,30 +2290,21 @@ static int pn533_tm_send_complete(struct pn533 *dev, void *arg, static int pn533_tm_send(struct nfc_dev *nfc_dev, struct sk_buff *skb) { struct pn533 *dev = nfc_get_drvdata(nfc_dev); struct pn533_frame *out_frame; int rc; nfc_dev_dbg(&dev->interface->dev, "%s", __func__); rc = pn533_build_tx_frame(dev, skb, false); if (rc) goto error; out_frame = (struct pn533_frame *) skb->data; rc = pn533_send_cmd_frame_async(dev, out_frame, dev->in_frame, PN533_NORMAL_FRAME_MAX_LEN, pn533_tm_send_complete, skb); if (rc) { if (skb->len > PN533_CMD_DATAEXCH_DATA_MAXLEN) { nfc_dev_err(&dev->interface->dev, "Error %d when trying to send data", rc); goto error; "Data length greater than the max allowed: %d", PN533_CMD_DATAEXCH_DATA_MAXLEN); return -ENOSYS; } return 0; error: kfree_skb(skb); rc = pn533_send_data_async(dev, PN533_CMD_TG_SET_DATA, skb, pn533_tm_send_complete, NULL); if (rc < 0) dev_kfree_skb(skb); return rc; } Loading Loading
drivers/nfc/pn533.c +33 −64 Original line number Diff line number Diff line Loading @@ -1450,65 +1450,46 @@ static int pn533_init_target_frame(struct pn533_frame *frame, #define PN533_CMD_DATAEXCH_HEAD_LEN 1 #define PN533_CMD_DATAEXCH_DATA_MAXLEN 262 static int pn533_tm_get_data_complete(struct pn533 *dev, void *arg, u8 *params, int params_len) struct sk_buff *resp) { struct sk_buff *skb_resp = arg; struct pn533_frame *in_frame = (struct pn533_frame *) skb_resp->data; u8 status; nfc_dev_dbg(&dev->interface->dev, "%s", __func__); if (params_len < 0) { nfc_dev_err(&dev->interface->dev, "Error %d when starting as a target", params_len); if (IS_ERR(resp)) return PTR_ERR(resp); return params_len; } status = resp->data[0]; skb_pull(resp, sizeof(status)); if (params_len > 0 && params[0] != 0) { if (status != 0) { nfc_tm_deactivated(dev->nfc_dev); dev->tgt_mode = 0; kfree_skb(skb_resp); dev_kfree_skb(resp); return 0; } skb_put(skb_resp, PN533_FRAME_SIZE(in_frame)); skb_pull(skb_resp, PN533_FRAME_HEADER_LEN + PN533_CMD_DATAEXCH_HEAD_LEN); skb_trim(skb_resp, skb_resp->len - PN533_FRAME_TAIL_LEN); return nfc_tm_data_received(dev->nfc_dev, skb_resp); return nfc_tm_data_received(dev->nfc_dev, resp); } static void pn533_wq_tg_get_data(struct work_struct *work) { struct pn533 *dev = container_of(work, struct pn533, tg_work); struct pn533_frame *in_frame; struct sk_buff *skb_resp; size_t skb_resp_len; nfc_dev_dbg(&dev->interface->dev, "%s", __func__); struct sk_buff *skb; int rc; skb_resp_len = PN533_FRAME_HEADER_LEN + PN533_CMD_DATAEXCH_HEAD_LEN + PN533_CMD_DATAEXCH_DATA_MAXLEN + PN533_FRAME_TAIL_LEN; nfc_dev_dbg(&dev->interface->dev, "%s", __func__); skb_resp = nfc_alloc_recv_skb(skb_resp_len, GFP_KERNEL); if (!skb_resp) skb = pn533_alloc_skb(0); if (!skb) return; in_frame = (struct pn533_frame *)skb_resp->data; pn533_tx_frame_init(dev->out_frame, PN533_CMD_TG_GET_DATA); pn533_tx_frame_finish(dev->out_frame); rc = pn533_send_data_async(dev, PN533_CMD_TG_GET_DATA, skb, pn533_tm_get_data_complete, NULL); pn533_send_cmd_frame_async(dev, dev->out_frame, in_frame, skb_resp_len, pn533_tm_get_data_complete, skb_resp); if (rc < 0) dev_kfree_skb(skb); return; } Loading Loading @@ -2280,23 +2261,20 @@ static int pn533_transceive(struct nfc_dev *nfc_dev, } static int pn533_tm_send_complete(struct pn533 *dev, void *arg, u8 *params, int params_len) struct sk_buff *resp) { struct sk_buff *skb_out = arg; u8 status; nfc_dev_dbg(&dev->interface->dev, "%s", __func__); dev_kfree_skb(skb_out); if (IS_ERR(resp)) return PTR_ERR(resp); if (params_len < 0) { nfc_dev_err(&dev->interface->dev, "Error %d when sending data", params_len); status = resp->data[0]; return params_len; } dev_kfree_skb(resp); if (params_len > 0 && params[0] != 0) { if (status != 0) { nfc_tm_deactivated(dev->nfc_dev); dev->tgt_mode = 0; Loading @@ -2312,30 +2290,21 @@ static int pn533_tm_send_complete(struct pn533 *dev, void *arg, static int pn533_tm_send(struct nfc_dev *nfc_dev, struct sk_buff *skb) { struct pn533 *dev = nfc_get_drvdata(nfc_dev); struct pn533_frame *out_frame; int rc; nfc_dev_dbg(&dev->interface->dev, "%s", __func__); rc = pn533_build_tx_frame(dev, skb, false); if (rc) goto error; out_frame = (struct pn533_frame *) skb->data; rc = pn533_send_cmd_frame_async(dev, out_frame, dev->in_frame, PN533_NORMAL_FRAME_MAX_LEN, pn533_tm_send_complete, skb); if (rc) { if (skb->len > PN533_CMD_DATAEXCH_DATA_MAXLEN) { nfc_dev_err(&dev->interface->dev, "Error %d when trying to send data", rc); goto error; "Data length greater than the max allowed: %d", PN533_CMD_DATAEXCH_DATA_MAXLEN); return -ENOSYS; } return 0; error: kfree_skb(skb); rc = pn533_send_data_async(dev, PN533_CMD_TG_SET_DATA, skb, pn533_tm_send_complete, NULL); if (rc < 0) dev_kfree_skb(skb); return rc; } Loading