Lines Matching +full:d +full:- +full:phy
1 // SPDX-License-Identifier: GPL-2.0
74 16, 1, (skb)->data, (skb)->len, false); \
81 16, 1, (skb)->data, (skb)->len, false); \
87 pr_debug("cmd=%02d status=%d req_id=%d rsvd=%d size=%d\n", \
88 (_hdr)->cmd, (_hdr)->status, (_hdr)->req_id, \
89 (_hdr)->reserved, (_hdr)->data_size); \
92 static int mei_nfc_if_version(struct nfc_mei_phy *phy) in mei_nfc_if_version() argument
109 r = mei_cldev_send(phy->cldev, (u8 *)&cmd, sizeof(struct mei_nfc_cmd)); in mei_nfc_if_version()
121 return -ENOMEM; in mei_nfc_if_version()
123 bytes_recv = mei_cldev_recv(phy->cldev, (u8 *)reply, if_version_length); in mei_nfc_if_version()
126 r = -EIO; in mei_nfc_if_version()
130 version = (struct mei_nfc_if_version *)reply->data; in mei_nfc_if_version()
132 phy->fw_ivn = version->fw_ivn; in mei_nfc_if_version()
133 phy->vendor_id = version->vendor_id; in mei_nfc_if_version()
134 phy->radio_type = version->radio_type; in mei_nfc_if_version()
141 static int mei_nfc_connect(struct nfc_mei_phy *phy) in mei_nfc_connect() argument
159 return -ENOMEM; in mei_nfc_connect()
160 connect = (struct mei_nfc_connect *)cmd->data; in mei_nfc_connect()
165 return -ENOMEM; in mei_nfc_connect()
168 connect_resp = (struct mei_nfc_connect_resp *)reply->data; in mei_nfc_connect()
170 cmd->hdr.cmd = MEI_NFC_CMD_MAINTENANCE; in mei_nfc_connect()
171 cmd->hdr.data_size = 3; in mei_nfc_connect()
172 cmd->sub_command = MEI_NFC_SUBCMD_CONNECT; in mei_nfc_connect()
173 connect->fw_ivn = phy->fw_ivn; in mei_nfc_connect()
174 connect->vendor_id = phy->vendor_id; in mei_nfc_connect()
176 MEI_DUMP_NFC_HDR("connect request", &cmd->hdr); in mei_nfc_connect()
177 r = mei_cldev_send(phy->cldev, (u8 *)cmd, connect_length); in mei_nfc_connect()
179 pr_err("Could not send connect cmd %d\n", r); in mei_nfc_connect()
183 bytes_recv = mei_cldev_recv(phy->cldev, (u8 *)reply, in mei_nfc_connect()
187 pr_err("Could not read connect response %d\n", r); in mei_nfc_connect()
191 MEI_DUMP_NFC_HDR("connect reply", &reply->hdr); in mei_nfc_connect()
194 connect_resp->fw_ivn, connect_resp->vendor_id); in mei_nfc_connect()
196 pr_info("ME FW %d.%d.%d.%d\n", in mei_nfc_connect()
197 connect_resp->me_major, connect_resp->me_minor, in mei_nfc_connect()
198 connect_resp->me_hotfix, connect_resp->me_build); in mei_nfc_connect()
209 static int mei_nfc_send(struct nfc_mei_phy *phy, u8 *buf, size_t length) in mei_nfc_send() argument
215 err = -ENOMEM; in mei_nfc_send()
221 hdr->cmd = MEI_NFC_CMD_HCI_SEND; in mei_nfc_send()
222 hdr->status = 0; in mei_nfc_send()
223 hdr->req_id = phy->req_id; in mei_nfc_send()
224 hdr->reserved = 0; in mei_nfc_send()
225 hdr->data_size = length; in mei_nfc_send()
230 err = mei_cldev_send(phy->cldev, mei_buf, length + MEI_NFC_HEADER_SIZE); in mei_nfc_send()
234 if (!wait_event_interruptible_timeout(phy->send_wq, in mei_nfc_send()
235 phy->recv_req_id == phy->req_id, HZ)) { in mei_nfc_send()
237 err = -ETIME; in mei_nfc_send()
239 phy->req_id++; in mei_nfc_send()
253 struct nfc_mei_phy *phy = phy_id; in nfc_mei_phy_write() local
258 r = mei_nfc_send(phy, skb->data, skb->len); in nfc_mei_phy_write()
265 static int mei_nfc_recv(struct nfc_mei_phy *phy, u8 *buf, size_t length) in mei_nfc_recv() argument
270 received_length = mei_cldev_recv(phy->cldev, buf, length); in mei_nfc_recv()
277 if (hdr->cmd == MEI_NFC_CMD_HCI_SEND) { in mei_nfc_recv()
278 phy->recv_req_id = hdr->req_id; in mei_nfc_recv()
279 wake_up(&phy->send_wq); in mei_nfc_recv()
290 struct nfc_mei_phy *phy = mei_cldev_get_drvdata(cldev); in nfc_mei_rx_cb() local
294 if (!phy) in nfc_mei_rx_cb()
297 if (phy->hard_fault != 0) in nfc_mei_rx_cb()
304 reply_size = mei_nfc_recv(phy, skb->data, MEI_NFC_MAX_READ); in nfc_mei_rx_cb()
315 nfc_hci_recv_frame(phy->hdev, skb); in nfc_mei_rx_cb()
321 struct nfc_mei_phy *phy = phy_id; in nfc_mei_phy_enable() local
325 if (phy->powered == 1) in nfc_mei_phy_enable()
328 r = mei_cldev_enable(phy->cldev); in nfc_mei_phy_enable()
330 pr_err("Could not enable device %d\n", r); in nfc_mei_phy_enable()
334 r = mei_nfc_if_version(phy); in nfc_mei_phy_enable()
336 pr_err("Could not enable device %d\n", r); in nfc_mei_phy_enable()
340 r = mei_nfc_connect(phy); in nfc_mei_phy_enable()
342 pr_err("Could not connect to device %d\n", r); in nfc_mei_phy_enable()
346 r = mei_cldev_register_rx_cb(phy->cldev, nfc_mei_rx_cb); in nfc_mei_phy_enable()
348 pr_err("Event cb registration failed %d\n", r); in nfc_mei_phy_enable()
352 phy->powered = 1; in nfc_mei_phy_enable()
357 phy->powered = 0; in nfc_mei_phy_enable()
358 mei_cldev_disable(phy->cldev); in nfc_mei_phy_enable()
364 struct nfc_mei_phy *phy = phy_id; in nfc_mei_phy_disable() local
368 mei_cldev_disable(phy->cldev); in nfc_mei_phy_disable()
370 phy->powered = 0; in nfc_mei_phy_disable()
382 struct nfc_mei_phy *phy; in nfc_mei_phy_alloc() local
384 phy = kzalloc(sizeof(struct nfc_mei_phy), GFP_KERNEL); in nfc_mei_phy_alloc()
385 if (!phy) in nfc_mei_phy_alloc()
388 phy->cldev = cldev; in nfc_mei_phy_alloc()
389 init_waitqueue_head(&phy->send_wq); in nfc_mei_phy_alloc()
390 mei_cldev_set_drvdata(cldev, phy); in nfc_mei_phy_alloc()
392 return phy; in nfc_mei_phy_alloc()
396 void nfc_mei_phy_free(struct nfc_mei_phy *phy) in nfc_mei_phy_free() argument
398 mei_cldev_disable(phy->cldev); in nfc_mei_phy_free()
399 kfree(phy); in nfc_mei_phy_free()