mei: bus: split RX and async notification callbacks
Split callbacks for RX and async notification events on mei bus to eliminate synchronization problems and to open way for RX optimizations. Signed-off-by: Alexander Usyskin <alexander.usyskin@intel.com> Signed-off-by: Tomas Winkler <tomas.winkler@intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Esse commit está contido em:

commit de
Greg Kroah-Hartman

pai
c110cdb171
commit
7c7a6077f5
@@ -297,9 +297,11 @@ static int mei_nfc_recv(struct nfc_mei_phy *phy, u8 *buf, size_t length)
|
||||
}
|
||||
|
||||
|
||||
static void nfc_mei_event_cb(struct mei_cl_device *cldev, u32 events)
|
||||
static void nfc_mei_rx_cb(struct mei_cl_device *cldev)
|
||||
{
|
||||
struct nfc_mei_phy *phy = mei_cldev_get_drvdata(cldev);
|
||||
struct sk_buff *skb;
|
||||
int reply_size;
|
||||
|
||||
if (!phy)
|
||||
return;
|
||||
@@ -307,27 +309,22 @@ static void nfc_mei_event_cb(struct mei_cl_device *cldev, u32 events)
|
||||
if (phy->hard_fault != 0)
|
||||
return;
|
||||
|
||||
if (events & BIT(MEI_CL_EVENT_RX)) {
|
||||
struct sk_buff *skb;
|
||||
int reply_size;
|
||||
skb = alloc_skb(MEI_NFC_MAX_READ, GFP_KERNEL);
|
||||
if (!skb)
|
||||
return;
|
||||
|
||||
skb = alloc_skb(MEI_NFC_MAX_READ, GFP_KERNEL);
|
||||
if (!skb)
|
||||
return;
|
||||
|
||||
reply_size = mei_nfc_recv(phy, skb->data, MEI_NFC_MAX_READ);
|
||||
if (reply_size < MEI_NFC_HEADER_SIZE) {
|
||||
kfree_skb(skb);
|
||||
return;
|
||||
}
|
||||
|
||||
skb_put(skb, reply_size);
|
||||
skb_pull(skb, MEI_NFC_HEADER_SIZE);
|
||||
|
||||
MEI_DUMP_SKB_IN("mei frame read", skb);
|
||||
|
||||
nfc_hci_recv_frame(phy->hdev, skb);
|
||||
reply_size = mei_nfc_recv(phy, skb->data, MEI_NFC_MAX_READ);
|
||||
if (reply_size < MEI_NFC_HEADER_SIZE) {
|
||||
kfree_skb(skb);
|
||||
return;
|
||||
}
|
||||
|
||||
skb_put(skb, reply_size);
|
||||
skb_pull(skb, MEI_NFC_HEADER_SIZE);
|
||||
|
||||
MEI_DUMP_SKB_IN("mei frame read", skb);
|
||||
|
||||
nfc_hci_recv_frame(phy->hdev, skb);
|
||||
}
|
||||
|
||||
static int nfc_mei_phy_enable(void *phy_id)
|
||||
@@ -358,8 +355,7 @@ static int nfc_mei_phy_enable(void *phy_id)
|
||||
goto err;
|
||||
}
|
||||
|
||||
r = mei_cldev_register_event_cb(phy->cldev, BIT(MEI_CL_EVENT_RX),
|
||||
nfc_mei_event_cb);
|
||||
r = mei_cldev_register_rx_cb(phy->cldev, nfc_mei_rx_cb);
|
||||
if (r) {
|
||||
pr_err("Event cb registration failed %d\n", r);
|
||||
goto err;
|
||||
|
Referência em uma nova issue
Block a user