Message ID | 1471058078-5579-5-git-send-email-sre@kernel.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Sat 2016-08-13 05:14:35, Sebastian Reichel wrote: > This will be used by Nokia's H4+ protocol, which > adds padding to packets to reach word alignment. Add a sign-off. Acked-by: Pavel Machek <pavel@ucw.cz> Thanks, Pavel
Hi Sebatian, > This will be used by Nokia's H4+ protocol, which > adds padding to packets to reach word alignment. > --- > drivers/bluetooth/hci_h4.c | 10 ++++++++++ > drivers/bluetooth/hci_uart.h | 1 + > 2 files changed, 11 insertions(+) > > diff --git a/drivers/bluetooth/hci_h4.c b/drivers/bluetooth/hci_h4.c > index 635597b6e168..a934e4eb692b 100644 > --- a/drivers/bluetooth/hci_h4.c > +++ b/drivers/bluetooth/hci_h4.c > @@ -253,11 +253,21 @@ struct sk_buff *h4_recv_buf(struct hci_dev *hdev, struct sk_buff *skb, > } > > if (!dlen) { > + if ((&pkts[i])->wordaligned && !(skb->len % 2)) { > + buffer++; > + count--; > + } > + > /* No more data, complete frame */ > (&pkts[i])->recv(hdev, skb); > skb = NULL; > } > } else { > + if ((&pkts[i])->wordaligned && !(skb->len % 2)) { > + buffer++; > + count--; > + } > + > /* Complete frame */ > (&pkts[i])->recv(hdev, skb); > skb = NULL; > diff --git a/drivers/bluetooth/hci_uart.h b/drivers/bluetooth/hci_uart.h > index 839bad1d8152..a7d67aec3632 100644 > --- a/drivers/bluetooth/hci_uart.h > +++ b/drivers/bluetooth/hci_uart.h > @@ -121,6 +121,7 @@ struct h4_recv_pkt { > u8 loff; /* Data length offset in header */ > u8 lsize; /* Data length field size */ > u16 maxlen; /* Max overall packet length */ > + bool wordaligned; /* packets are word aligned */ I wonder if not a u8 align would be a way better choice here. We set it to 1 for all existing packet types. And the Nokia driver can use 2 here. > int (*recv)(struct hci_dev *hdev, struct sk_buff *skb); Regards Marcel -- To unsubscribe from this list: send the line "unsubscribe linux-omap" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Hi Marcel, On Tue, Aug 16, 2016 at 09:05:19AM +0200, Marcel Holtmann wrote: > Hi Sebatian, > > > This will be used by Nokia's H4+ protocol, which > > adds padding to packets to reach word alignment. > > --- > > drivers/bluetooth/hci_h4.c | 10 ++++++++++ > > drivers/bluetooth/hci_uart.h | 1 + > > 2 files changed, 11 insertions(+) > > > > diff --git a/drivers/bluetooth/hci_h4.c b/drivers/bluetooth/hci_h4.c > > index 635597b6e168..a934e4eb692b 100644 > > --- a/drivers/bluetooth/hci_h4.c > > +++ b/drivers/bluetooth/hci_h4.c > > @@ -253,11 +253,21 @@ struct sk_buff *h4_recv_buf(struct hci_dev *hdev, struct sk_buff *skb, > > } > > > > if (!dlen) { > > + if ((&pkts[i])->wordaligned && !(skb->len % 2)) { > > + buffer++; > > + count--; > > + } > > + > > /* No more data, complete frame */ > > (&pkts[i])->recv(hdev, skb); > > skb = NULL; > > } > > } else { > > + if ((&pkts[i])->wordaligned && !(skb->len % 2)) { > > + buffer++; > > + count--; > > + } > > + > > /* Complete frame */ > > (&pkts[i])->recv(hdev, skb); > > skb = NULL; > > diff --git a/drivers/bluetooth/hci_uart.h b/drivers/bluetooth/hci_uart.h > > index 839bad1d8152..a7d67aec3632 100644 > > --- a/drivers/bluetooth/hci_uart.h > > +++ b/drivers/bluetooth/hci_uart.h > > @@ -121,6 +121,7 @@ struct h4_recv_pkt { > > u8 loff; /* Data length offset in header */ > > u8 lsize; /* Data length field size */ > > u16 maxlen; /* Max overall packet length */ > > + bool wordaligned; /* packets are word aligned */ > > I wonder if not a u8 align would be a way better choice here. We > set it to 1 for all existing packet types. And the Nokia driver > can use 2 here. Sounds less hacky than my approach. Also it made me notice, that my code is not safe, since the buffer size is not checked. I will use u8 align and fix the buffer size check. -- Sebastian
diff --git a/drivers/bluetooth/hci_h4.c b/drivers/bluetooth/hci_h4.c index 635597b6e168..a934e4eb692b 100644 --- a/drivers/bluetooth/hci_h4.c +++ b/drivers/bluetooth/hci_h4.c @@ -253,11 +253,21 @@ struct sk_buff *h4_recv_buf(struct hci_dev *hdev, struct sk_buff *skb, } if (!dlen) { + if ((&pkts[i])->wordaligned && !(skb->len % 2)) { + buffer++; + count--; + } + /* No more data, complete frame */ (&pkts[i])->recv(hdev, skb); skb = NULL; } } else { + if ((&pkts[i])->wordaligned && !(skb->len % 2)) { + buffer++; + count--; + } + /* Complete frame */ (&pkts[i])->recv(hdev, skb); skb = NULL; diff --git a/drivers/bluetooth/hci_uart.h b/drivers/bluetooth/hci_uart.h index 839bad1d8152..a7d67aec3632 100644 --- a/drivers/bluetooth/hci_uart.h +++ b/drivers/bluetooth/hci_uart.h @@ -121,6 +121,7 @@ struct h4_recv_pkt { u8 loff; /* Data length offset in header */ u8 lsize; /* Data length field size */ u16 maxlen; /* Max overall packet length */ + bool wordaligned; /* packets are word aligned */ int (*recv)(struct hci_dev *hdev, struct sk_buff *skb); };