bluetooth: hci_bcsp.c small cleanups/api users
authorHarvey Harrison <harvey.harrison@gmail.com>
Tue, 10 Jun 2008 19:48:45 +0000 (12:48 -0700)
committerDavid S. Miller <davem@davemloft.net>
Tue, 10 Jun 2008 19:48:45 +0000 (12:48 -0700)
Use bitrev16 from lib/bitrev.c.

Use the get_unaligned_be16 to get the crc from the packet, create a
small helper function for this.

Fix a shadowed variable sparse warning:
drivers/bluetooth/hci_bcsp.c:218:26: warning: symbol 'hdr' shadows an earlier one
drivers/bluetooth/hci_bcsp.c:187:5: originally declared here

[akpm@linux-foundation.org: select CONFIG_BITREVERSE, noted by akinobu.mita@gmail.com]
Signed-off-by: Harvey Harrison <harvey.harrison@gmail.com>
Acked-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/bluetooth/Kconfig
drivers/bluetooth/hci_bcsp.c

index 075598e1c50240d743edb8c4e566fa6c509d4160..71a58a4e17952e6bbb4e818c30da8e68a6b9a713 100644 (file)
@@ -71,6 +71,7 @@ config BT_HCIUART_H4
 config BT_HCIUART_BCSP
        bool "BCSP protocol support"
        depends on BT_HCIUART
 config BT_HCIUART_BCSP
        bool "BCSP protocol support"
        depends on BT_HCIUART
+       select CONFIG_BITREVERSE
        help
          BCSP (BlueCore Serial Protocol) is serial protocol for communication 
          between Bluetooth device and host. This protocol is required for non
        help
          BCSP (BlueCore Serial Protocol) is serial protocol for communication 
          between Bluetooth device and host. This protocol is required for non
index 696f7528f022d44ef18bb0c84134a997288916a7..4d37bb312ee3bdd02ed60f90f4d7b7650c9dc993 100644 (file)
@@ -39,6 +39,8 @@
 #include <linux/signal.h>
 #include <linux/ioctl.h>
 #include <linux/skbuff.h>
 #include <linux/signal.h>
 #include <linux/ioctl.h>
 #include <linux/skbuff.h>
+#include <linux/bitrev.h>
+#include <asm/unaligned.h>
 
 #include <net/bluetooth/bluetooth.h>
 #include <net/bluetooth/hci_core.h>
 
 #include <net/bluetooth/bluetooth.h>
 #include <net/bluetooth/hci_core.h>
@@ -124,27 +126,6 @@ static void bcsp_crc_update(u16 *crc, u8 d)
        *crc = reg;
 }
 
        *crc = reg;
 }
 
-/*
-   Get reverse of generated crc
-
-   Implementation note
-        The crc generator (bcsp_crc_init() and bcsp_crc_update())
-        creates a reversed crc, so it needs to be swapped back before
-        being passed on.
-*/
-static u16 bcsp_crc_reverse(u16 crc)
-{
-       u16 b, rev;
-
-       for (b = 0, rev = 0; b < 16; b++) {
-               rev = rev << 1;
-               rev |= (crc & 1);
-               crc = crc >> 1;
-       }
-
-       return (rev);
-}
-
 /* ---- BCSP core ---- */
 
 static void bcsp_slip_msgdelim(struct sk_buff *skb)
 /* ---- BCSP core ---- */
 
 static void bcsp_slip_msgdelim(struct sk_buff *skb)
@@ -235,10 +216,10 @@ static struct sk_buff *bcsp_prepare_pkt(struct bcsp_struct *bcsp, u8 *data,
        }
 
        if (hciextn && chan == 5) {
        }
 
        if (hciextn && chan == 5) {
-               struct hci_command_hdr *hdr = (struct hci_command_hdr *) data;
+               __le16 opcode = ((struct hci_command_hdr *)data)->opcode;
 
                /* Vendor specific commands */
 
                /* Vendor specific commands */
-               if (hci_opcode_ogf(__le16_to_cpu(hdr->opcode)) == 0x3f) {
+               if (hci_opcode_ogf(__le16_to_cpu(opcode)) == 0x3f) {
                        u8 desc = *(data + HCI_COMMAND_HDR_SIZE);
                        if ((desc & 0xf0) == 0xc0) {
                                data += HCI_COMMAND_HDR_SIZE + 1;
                        u8 desc = *(data + HCI_COMMAND_HDR_SIZE);
                        if ((desc & 0xf0) == 0xc0) {
                                data += HCI_COMMAND_HDR_SIZE + 1;
@@ -296,7 +277,7 @@ static struct sk_buff *bcsp_prepare_pkt(struct bcsp_struct *bcsp, u8 *data,
 
        /* Put CRC */
        if (bcsp->use_crc) {
 
        /* Put CRC */
        if (bcsp->use_crc) {
-               bcsp_txmsg_crc = bcsp_crc_reverse(bcsp_txmsg_crc);
+               bcsp_txmsg_crc = bitrev16(bcsp_txmsg_crc);
                bcsp_slip_one_byte(nskb, (u8) ((bcsp_txmsg_crc >> 8) & 0x00ff));
                bcsp_slip_one_byte(nskb, (u8) (bcsp_txmsg_crc & 0x00ff));
        }
                bcsp_slip_one_byte(nskb, (u8) ((bcsp_txmsg_crc >> 8) & 0x00ff));
                bcsp_slip_one_byte(nskb, (u8) (bcsp_txmsg_crc & 0x00ff));
        }
@@ -566,6 +547,11 @@ static void bcsp_complete_rx_pkt(struct hci_uart *hu)
        bcsp->rx_skb = NULL;
 }
 
        bcsp->rx_skb = NULL;
 }
 
+static u16 bscp_get_crc(struct bcsp_struct *bcsp)
+{
+       return get_unaligned_be16(&bcsp->rx_skb->data[bcsp->rx_skb->len - 2]);
+}
+
 /* Recv data */
 static int bcsp_recv(struct hci_uart *hu, void *data, int count)
 {
 /* Recv data */
 static int bcsp_recv(struct hci_uart *hu, void *data, int count)
 {
@@ -624,14 +610,10 @@ static int bcsp_recv(struct hci_uart *hu, void *data, int count)
                        continue;
 
                case BCSP_W4_CRC:
                        continue;
 
                case BCSP_W4_CRC:
-                       if (bcsp_crc_reverse(bcsp->message_crc) !=
-                                       (bcsp->rx_skb->data[bcsp->rx_skb->len - 2] << 8) +
-                                       bcsp->rx_skb->data[bcsp->rx_skb->len - 1]) {
-
+                       if (bitrev16(bcsp->message_crc) != bscp_get_crc(bcsp)) {
                                BT_ERR ("Checksum failed: computed %04x received %04x",
                                BT_ERR ("Checksum failed: computed %04x received %04x",
-                                       bcsp_crc_reverse(bcsp->message_crc),
-                                       (bcsp->rx_skb-> data[bcsp->rx_skb->len - 2] << 8) +
-                                       bcsp->rx_skb->data[bcsp->rx_skb->len - 1]);
+                                       bitrev16(bcsp->message_crc),
+                                       bscp_get_crc(bcsp));
 
                                kfree_skb(bcsp->rx_skb);
                                bcsp->rx_state = BCSP_W4_PKT_DELIMITER;
 
                                kfree_skb(bcsp->rx_skb);
                                bcsp->rx_state = BCSP_W4_PKT_DELIMITER;