* [PATCHv4 3/6] byteorder: add get/put endian helpers for the aligned case
@ 2008-05-29 19:56 Harvey Harrison
2008-05-30 19:05 ` Alan Stern
0 siblings, 1 reply; 3+ messages in thread
From: Harvey Harrison @ 2008-05-29 19:56 UTC (permalink / raw)
To: Andrew Morton; +Cc: linux-arch, stern
Add a set of endian helpers for the pattern:
*(__le16 *)ptr = cpu_to_le16(val);
put_le16(val, (__le16 *)ptr);
The argument order follows that of the get/put_unaligned_{endian}
helpers.
The get_ helpers are exactly equivalent to the existing {endian}_to_cpup
functions, but have been added anyway for symmetry in the apis.
Myrinet had a put_be32 helper that has been changed to myri_put_be32 to
avoid namespace collisions.
Private helpers in the usb-gadget drivers have been removed and switched
over to the common ones. Note that the put helpers here had the args in
the opposite order from the common version.
Signed-off-by: Harvey Harrison <harvey.harrison@gmail.com>
---
drivers/net/myri10ge/myri10ge.c | 16 +++---
drivers/usb/gadget/file_storage.c | 78 +++++++++---------------------
include/linux/byteorder.h | 96 ++++++++++++++++++++++++++++++++++--
include/linux/byteorder/generic.h | 72 +++++++++++++++++++++++++--
4 files changed, 188 insertions(+), 74 deletions(-)
diff --git a/drivers/net/myri10ge/myri10ge.c b/drivers/net/myri10ge/myri10ge.c
index 36be6ef..5d035d0 100644
--- a/drivers/net/myri10ge/myri10ge.c
+++ b/drivers/net/myri10ge/myri10ge.c
@@ -331,7 +331,7 @@ MODULE_PARM_DESC(myri10ge_wcfifo, "Enable WC Fifo when WC is enabled");
static void myri10ge_set_multicast_list(struct net_device *dev);
static int myri10ge_sw_tso(struct sk_buff *skb, struct net_device *dev);
-static inline void put_be32(__be32 val, __be32 __iomem * p)
+static inline void myri_put_be32(__be32 val, __be32 __iomem * p)
{
__raw_writel((__force __u32) val, (__force void __iomem *)p);
}
@@ -897,7 +897,7 @@ static int myri10ge_reset(struct myri10ge_priv *mgp)
dev_err(&mgp->pdev->dev, "failed set interrupt parameters\n");
return status;
}
- put_be32(htonl(mgp->intr_coal_delay), mgp->intr_coal_delay_ptr);
+ myri_put_be32(htonl(mgp->intr_coal_delay), mgp->intr_coal_delay_ptr);
memset(mgp->ss.rx_done.entry, 0, bytes);
@@ -930,7 +930,7 @@ myri10ge_submit_8rx(struct mcp_kreq_ether_recv __iomem * dst,
myri10ge_pio_copy(dst + 4, src + 4, 4 * sizeof(*src));
mb();
src->addr_low = low;
- put_be32(low, &dst->addr_low);
+ myri_put_be32(low, &dst->addr_low);
mb();
}
@@ -1288,7 +1288,7 @@ static int myri10ge_poll(struct napi_struct *napi, int budget)
if (work_done < budget) {
netif_rx_complete(netdev, napi);
- put_be32(htonl(3), ss->irq_claim);
+ myri_put_be32(htonl(3), ss->irq_claim);
}
return work_done;
}
@@ -1312,7 +1312,7 @@ static irqreturn_t myri10ge_intr(int irq, void *arg)
netif_rx_schedule(ss->dev, &ss->napi);
if (!mgp->msi_enabled) {
- put_be32(0, mgp->irq_deassert);
+ myri_put_be32(0, mgp->irq_deassert);
if (!myri10ge_deassert_wait)
stats->valid = 0;
mb();
@@ -1341,7 +1341,7 @@ static irqreturn_t myri10ge_intr(int irq, void *arg)
myri10ge_check_statblock(mgp);
- put_be32(htonl(3), ss->irq_claim + 1);
+ myri_put_be32(htonl(3), ss->irq_claim + 1);
return (IRQ_HANDLED);
}
@@ -1410,7 +1410,7 @@ myri10ge_set_coalesce(struct net_device *netdev, struct ethtool_coalesce *coal)
struct myri10ge_priv *mgp = netdev_priv(netdev);
mgp->intr_coal_delay = coal->rx_coalesce_usecs;
- put_be32(htonl(mgp->intr_coal_delay), mgp->intr_coal_delay_ptr);
+ myri_put_be32(htonl(mgp->intr_coal_delay), mgp->intr_coal_delay_ptr);
return 0;
}
@@ -2201,7 +2201,7 @@ myri10ge_submit_req(struct myri10ge_tx_buf *tx, struct mcp_kreq_ether_send *src,
/* re-write the last 32-bits with the valid flags */
src->flags = last_flags;
- put_be32(*((__be32 *) src + 3), (__be32 __iomem *) dst + 3);
+ myri_put_be32(*((__be32 *) src + 3), (__be32 __iomem *) dst + 3);
tx->req += cnt;
mb();
}
diff --git a/drivers/usb/gadget/file_storage.c b/drivers/usb/gadget/file_storage.c
index 47bb9f0..99dad81 100644
--- a/drivers/usb/gadget/file_storage.c
+++ b/drivers/usb/gadget/file_storage.c
@@ -241,6 +241,7 @@
#include <linux/usb/ch9.h>
#include <linux/usb/gadget.h>
+#include <asm/byteorder.h>
#include "gadget_chips.h"
@@ -763,37 +764,6 @@ static int fsg_set_halt(struct fsg_dev *fsg, struct usb_ep *ep)
return usb_ep_set_halt(ep);
}
-
-/*-------------------------------------------------------------------------*/
-
-/* Routines for unaligned data access */
-
-static u16 get_be16(u8 *buf)
-{
- return ((u16) buf[0] << 8) | ((u16) buf[1]);
-}
-
-static u32 get_be32(u8 *buf)
-{
- return ((u32) buf[0] << 24) | ((u32) buf[1] << 16) |
- ((u32) buf[2] << 8) | ((u32) buf[3]);
-}
-
-static void put_be16(u8 *buf, u16 val)
-{
- buf[0] = val >> 8;
- buf[1] = val;
-}
-
-static void put_be32(u8 *buf, u32 val)
-{
- buf[0] = val >> 24;
- buf[1] = val >> 16;
- buf[2] = val >> 8;
- buf[3] = val & 0xff;
-}
-
-
/*-------------------------------------------------------------------------*/
/*
@@ -1551,9 +1521,9 @@ static int do_read(struct fsg_dev *fsg)
/* Get the starting Logical Block Address and check that it's
* not too big */
if (fsg->cmnd[0] == SC_READ_6)
- lba = (fsg->cmnd[1] << 16) | get_be16(&fsg->cmnd[2]);
+ lba = (fsg->cmnd[1] << 16) | get_be16((__be16 *)&fsg->cmnd[2]);
else {
- lba = get_be32(&fsg->cmnd[2]);
+ lba = get_be32((__be32 *)&fsg->cmnd[2]);
/* We allow DPO (Disable Page Out = don't save data in the
* cache) and FUA (Force Unit Access = don't read from the
@@ -1684,9 +1654,9 @@ static int do_write(struct fsg_dev *fsg)
/* Get the starting Logical Block Address and check that it's
* not too big */
if (fsg->cmnd[0] == SC_WRITE_6)
- lba = (fsg->cmnd[1] << 16) | get_be16(&fsg->cmnd[2]);
+ lba = (fsg->cmnd[1] << 16) | get_be16((__be16 *)&fsg->cmnd[2]);
else {
- lba = get_be32(&fsg->cmnd[2]);
+ lba = get_be32((__be32 *)&fsg->cmnd[2]);
/* We allow DPO (Disable Page Out = don't save data in the
* cache) and FUA (Force Unit Access = write directly to the
@@ -1920,7 +1890,7 @@ static int do_verify(struct fsg_dev *fsg)
/* Get the starting Logical Block Address and check that it's
* not too big */
- lba = get_be32(&fsg->cmnd[2]);
+ lba = get_be32((__be32 *)&fsg->cmnd[2]);
if (lba >= curlun->num_sectors) {
curlun->sense_data = SS_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE;
return -EINVAL;
@@ -1933,7 +1903,7 @@ static int do_verify(struct fsg_dev *fsg)
return -EINVAL;
}
- verification_length = get_be16(&fsg->cmnd[7]);
+ verification_length = get_be16((__be16 *)&fsg->cmnd[7]);
if (unlikely(verification_length == 0))
return -EIO; // No default reply
@@ -2078,7 +2048,7 @@ static int do_request_sense(struct fsg_dev *fsg, struct fsg_buffhd *bh)
memset(buf, 0, 18);
buf[0] = valid | 0x70; // Valid, current error
buf[2] = SK(sd);
- put_be32(&buf[3], sdinfo); // Sense information
+ put_be32(sdinfo, (__be32 *)&buf[3]); // Sense information
buf[7] = 18 - 8; // Additional sense length
buf[12] = ASC(sd);
buf[13] = ASCQ(sd);
@@ -2089,7 +2059,7 @@ static int do_request_sense(struct fsg_dev *fsg, struct fsg_buffhd *bh)
static int do_read_capacity(struct fsg_dev *fsg, struct fsg_buffhd *bh)
{
struct lun *curlun = fsg->curlun;
- u32 lba = get_be32(&fsg->cmnd[2]);
+ u32 lba = get_be32((__be32 *)&fsg->cmnd[2]);
int pmi = fsg->cmnd[8];
u8 *buf = (u8 *) bh->buf;
@@ -2099,8 +2069,8 @@ static int do_read_capacity(struct fsg_dev *fsg, struct fsg_buffhd *bh)
return -EINVAL;
}
- put_be32(&buf[0], curlun->num_sectors - 1); // Max logical block
- put_be32(&buf[4], 512); // Block length
+ put_be32(curlun->num_sectors - 1, (__be32 *)&buf[0]); // Max logical block
+ put_be32(512, (__be32 *)&buf[4]); // Block length
return 8;
}
@@ -2158,10 +2128,10 @@ static int do_mode_sense(struct fsg_dev *fsg, struct fsg_buffhd *bh)
buf[2] = 0x04; // Write cache enable,
// Read cache not disabled
// No cache retention priorities
- put_be16(&buf[4], 0xffff); // Don't disable prefetch
+ put_be16(0xffff, (__be16 *)&buf[4]); // Don't disable prefetch
// Minimum prefetch = 0
- put_be16(&buf[8], 0xffff); // Maximum prefetch
- put_be16(&buf[10], 0xffff); // Maximum prefetch ceiling
+ put_be16(0xffff, (__be16 *)&buf[8]); // Maximum prefetch
+ put_be16(0xffff, (__be16 *)&buf[10]); // Maximum prefetch ceiling
}
buf += 12;
}
@@ -2178,7 +2148,7 @@ static int do_mode_sense(struct fsg_dev *fsg, struct fsg_buffhd *bh)
if (mscmnd == SC_MODE_SENSE_6)
buf0[0] = len - 1;
else
- put_be16(buf0, len - 2);
+ put_be16(len - 2, (__be16 *)buf0);
return len;
}
@@ -2266,8 +2236,8 @@ static int do_read_format_capacities(struct fsg_dev *fsg,
buf[3] = 8; // Only the Current/Maximum Capacity Descriptor
buf += 4;
- put_be32(&buf[0], curlun->num_sectors); // Number of blocks
- put_be32(&buf[4], 512); // Block length
+ put_be32(curlun->num_sectors, (__be32 *)&buf[0]); // Number of blocks
+ put_be32(512, (__be32 *)&buf[4]); // Block length
buf[4] = 0x02; // Current capacity
return 12;
}
@@ -2775,7 +2745,7 @@ static int do_scsi_command(struct fsg_dev *fsg)
break;
case SC_MODE_SELECT_10:
- fsg->data_size_from_cmnd = get_be16(&fsg->cmnd[7]);
+ fsg->data_size_from_cmnd = get_be16((__be16 *)&fsg->cmnd[7]);
if ((reply = check_command(fsg, 10, DATA_DIR_FROM_HOST,
(1<<1) | (3<<7), 0,
"MODE SELECT(10)")) == 0)
@@ -2791,7 +2761,7 @@ static int do_scsi_command(struct fsg_dev *fsg)
break;
case SC_MODE_SENSE_10:
- fsg->data_size_from_cmnd = get_be16(&fsg->cmnd[7]);
+ fsg->data_size_from_cmnd = get_be16((__be16 *)&fsg->cmnd[7]);
if ((reply = check_command(fsg, 10, DATA_DIR_TO_HOST,
(1<<1) | (1<<2) | (3<<7), 0,
"MODE SENSE(10)")) == 0)
@@ -2816,7 +2786,7 @@ static int do_scsi_command(struct fsg_dev *fsg)
break;
case SC_READ_10:
- fsg->data_size_from_cmnd = get_be16(&fsg->cmnd[7]) << 9;
+ fsg->data_size_from_cmnd = get_be16((__be16 *)&fsg->cmnd[7]) << 9;
if ((reply = check_command(fsg, 10, DATA_DIR_TO_HOST,
(1<<1) | (0xf<<2) | (3<<7), 1,
"READ(10)")) == 0)
@@ -2824,7 +2794,7 @@ static int do_scsi_command(struct fsg_dev *fsg)
break;
case SC_READ_12:
- fsg->data_size_from_cmnd = get_be32(&fsg->cmnd[6]) << 9;
+ fsg->data_size_from_cmnd = get_be32((__be32 *)&fsg->cmnd[6]) << 9;
if ((reply = check_command(fsg, 12, DATA_DIR_TO_HOST,
(1<<1) | (0xf<<2) | (0xf<<6), 1,
"READ(12)")) == 0)
@@ -2840,7 +2810,7 @@ static int do_scsi_command(struct fsg_dev *fsg)
break;
case SC_READ_FORMAT_CAPACITIES:
- fsg->data_size_from_cmnd = get_be16(&fsg->cmnd[7]);
+ fsg->data_size_from_cmnd = get_be16((__be16 *)&fsg->cmnd[7]);
if ((reply = check_command(fsg, 10, DATA_DIR_TO_HOST,
(3<<7), 1,
"READ FORMAT CAPACITIES")) == 0)
@@ -2898,7 +2868,7 @@ static int do_scsi_command(struct fsg_dev *fsg)
break;
case SC_WRITE_10:
- fsg->data_size_from_cmnd = get_be16(&fsg->cmnd[7]) << 9;
+ fsg->data_size_from_cmnd = get_be16((__be16 *)&fsg->cmnd[7]) << 9;
if ((reply = check_command(fsg, 10, DATA_DIR_FROM_HOST,
(1<<1) | (0xf<<2) | (3<<7), 1,
"WRITE(10)")) == 0)
@@ -2906,7 +2876,7 @@ static int do_scsi_command(struct fsg_dev *fsg)
break;
case SC_WRITE_12:
- fsg->data_size_from_cmnd = get_be32(&fsg->cmnd[6]) << 9;
+ fsg->data_size_from_cmnd = get_be32((__be32 *)&fsg->cmnd[6]) << 9;
if ((reply = check_command(fsg, 12, DATA_DIR_FROM_HOST,
(1<<1) | (0xf<<2) | (0xf<<6), 1,
"WRITE(12)")) == 0)
diff --git a/include/linux/byteorder.h b/include/linux/byteorder.h
index b4713ce..6453b41 100644
--- a/include/linux/byteorder.h
+++ b/include/linux/byteorder.h
@@ -278,34 +278,118 @@ static inline __be64 __cpu_to_be64p(const __u64 *p)
# define htons(x) ___htons(x)
# define ntohs(x) ___ntohs(x)
+static inline u16 get_le16(const __le16 *p)
+{
+#ifdef __LITTLE_ENDIAN
+ return (__force u16)*p;
+#else
+ return swab16p((__force u16 *)p);
+#endif
+}
+
+static inline u32 get_le32(const __le32 *p)
+{
+#ifdef __LITTLE_ENDIAN
+ return (__force u32)*p;
+#else
+ return swab32p((__force u32 *)p);
+#endif
+}
+
+static inline u64 get_le64(const __le64 *p)
+{
+#ifdef __LITTLE_ENDIAN
+ return (__force u64)*p;
+#else
+ return swab64p((__force u64 *)p);
+#endif
+}
+
+static inline u16 get_be16(const __be16 *p)
+{
+#ifdef __BIG_ENDIAN
+ return (__force u16)*p;
+#else
+ return swab16p((__force u16 *)p);
+#endif
+}
+
+static inline u32 get_be32(const __be32 *p)
+{
+#ifdef __BIG_ENDIAN
+ return (__force u32)*p;
+#else
+ return swab32p((__force u32 *)p);
+#endif
+}
+
+static inline u64 get_be64(const __be64 *p)
+{
+#ifdef __BIG_ENDIAN
+ return (__force u64)*p;
+#else
+ return swab64p((__force u64 *)p);
+#endif
+}
+
+static inline void put_le16(u16 val, __le16 *p)
+{
+ *p = cpu_to_le16(val);
+}
+
+static inline void put_le32(u32 val, __le32 *p)
+{
+ *p = cpu_to_le32(val);
+}
+
+static inline void put_le64(u64 val, __le64 *p)
+{
+ *p = cpu_to_le64(val);
+}
+
+static inline void put_be16(u16 val, __be16 *p)
+{
+ *p = cpu_to_be16(val);
+}
+
+static inline void put_be32(u32 val, __be32 *p)
+{
+ *p = cpu_to_be32(val);
+}
+
+static inline void put_be64(u64 val, __be64 *p)
+{
+ *p = cpu_to_be64(val);
+}
+
static inline void le16_add_cpu(__le16 *var, u16 val)
{
- *var = cpu_to_le16(le16_to_cpup(var) + val);
+ put_le16(get_le16(var) + val, var);
}
static inline void le32_add_cpu(__le32 *var, u32 val)
{
- *var = cpu_to_le32(le32_to_cpup(var) + val);
+ put_le32(get_le32(var) + val, var);
}
static inline void le64_add_cpu(__le64 *var, u64 val)
{
- *var = cpu_to_le64(le64_to_cpup(var) + val);
+ put_le64(get_le64(var) + val, var);
}
static inline void be16_add_cpu(__be16 *var, u16 val)
{
- *var = cpu_to_be16(be16_to_cpup(var) + val);
+ put_be16(get_be16(var) + val, var);
}
static inline void be32_add_cpu(__be32 *var, u32 val)
{
- *var = cpu_to_be32(be32_to_cpup(var) + val);
+ put_be32(get_be32(var) + val, var);
}
static inline void be64_add_cpu(__be64 *var, u64 val)
{
- *var = cpu_to_be64(be64_to_cpup(var) + val);
+ put_be64(get_be64(var) + val, var);
}
#endif /* __KERNEL__ */
diff --git a/include/linux/byteorder/generic.h b/include/linux/byteorder/generic.h
index 0846e6b..fdfe321 100644
--- a/include/linux/byteorder/generic.h
+++ b/include/linux/byteorder/generic.h
@@ -140,34 +140,94 @@
#define htons(x) ___htons(x)
#define ntohs(x) ___ntohs(x)
+static inline u16 get_le16(const __le16 *p)
+{
+ return le16_to_cpup(p);
+}
+
+static inline u32 get_le32(const __le32 *p)
+{
+ return le32_to_cpup(p);
+}
+
+static inline u64 get_le64(const __le64 *p)
+{
+ return le64_to_cpup(p);
+}
+
+static inline u16 get_be16(const __be16 *p)
+{
+ return be16_to_cpup(p);
+}
+
+static inline u32 get_be32(const __be32 *p)
+{
+ return be32_to_cpup(p);
+}
+
+static inline u64 get_be64(const __be64 *p)
+{
+ return be64_to_cpup(p);
+}
+
+static inline void put_le16(u16 val, __le16 *p)
+{
+ *p = cpu_to_le16(val);
+}
+
+static inline void put_le32(u32 val, __le32 *p)
+{
+ *p = cpu_to_le32(val);
+}
+
+static inline void put_le64(u64 val, __le64 *p)
+{
+ *p = cpu_to_le64(val);
+}
+
+static inline void put_be16(u16 val, __be16 *p)
+{
+ *p = cpu_to_be16(val);
+}
+
+static inline void put_be32(u32 val, __be32 *p)
+{
+ *p = cpu_to_be32(val);
+}
+
+static inline void put_be64(u64 val, __be64 *p)
+{
+ *p = cpu_to_be64(val);
+}
+
static inline void le16_add_cpu(__le16 *var, u16 val)
{
- *var = cpu_to_le16(le16_to_cpu(*var) + val);
+ put_le16(get_le16(var) + val, var);
}
static inline void le32_add_cpu(__le32 *var, u32 val)
{
- *var = cpu_to_le32(le32_to_cpu(*var) + val);
+ put_le32(get_le32(var) + val, var);
}
static inline void le64_add_cpu(__le64 *var, u64 val)
{
- *var = cpu_to_le64(le64_to_cpu(*var) + val);
+ put_le64(get_le64(var) + val, var);
}
static inline void be16_add_cpu(__be16 *var, u16 val)
{
- *var = cpu_to_be16(be16_to_cpu(*var) + val);
+ put_be16(get_be16(var) + val, var);
}
static inline void be32_add_cpu(__be32 *var, u32 val)
{
- *var = cpu_to_be32(be32_to_cpu(*var) + val);
+ put_be32(get_be32(var) + val, var);
}
static inline void be64_add_cpu(__be64 *var, u64 val)
{
- *var = cpu_to_be64(be64_to_cpu(*var) + val);
+ put_be64(get_be64(var) + val, var);
}
#endif /* _LINUX_BYTEORDER_GENERIC_H */
--
1.5.6.rc0.277.g804cf
^ permalink raw reply related [flat|nested] 3+ messages in thread* Re: [PATCHv4 3/6] byteorder: add get/put endian helpers for the aligned case
2008-05-29 19:56 [PATCHv4 3/6] byteorder: add get/put endian helpers for the aligned case Harvey Harrison
@ 2008-05-30 19:05 ` Alan Stern
2008-05-30 19:09 ` Harvey Harrison
0 siblings, 1 reply; 3+ messages in thread
From: Alan Stern @ 2008-05-30 19:05 UTC (permalink / raw)
To: Harvey Harrison; +Cc: Andrew Morton, linux-arch
On Thu, 29 May 2008, Harvey Harrison wrote:
> Add a set of endian helpers for the pattern:
> *(__le16 *)ptr = cpu_to_le16(val);
>
> put_le16(val, (__le16 *)ptr);
>
> The argument order follows that of the get/put_unaligned_{endian}
> helpers.
>
> The get_ helpers are exactly equivalent to the existing {endian}_to_cpup
> functions, but have been added anyway for symmetry in the apis.
>
> Myrinet had a put_be32 helper that has been changed to myri_put_be32 to
> avoid namespace collisions.
>
> Private helpers in the usb-gadget drivers have been removed and switched
> over to the common ones. Note that the put helpers here had the args in
> the opposite order from the common version.
...
> --- a/drivers/usb/gadget/file_storage.c
> +++ b/drivers/usb/gadget/file_storage.c
> @@ -1551,9 +1521,9 @@ static int do_read(struct fsg_dev *fsg)
> /* Get the starting Logical Block Address and check that it's
> * not too big */
> if (fsg->cmnd[0] == SC_READ_6)
> - lba = (fsg->cmnd[1] << 16) | get_be16(&fsg->cmnd[2]);
> + lba = (fsg->cmnd[1] << 16) | get_be16((__be16 *)&fsg->cmnd[2]);
> else {
> - lba = get_be32(&fsg->cmnd[2]);
> + lba = get_be32((__be32 *)&fsg->cmnd[2]);
You need to be more careful here. Since fsg->cmnd is aligned on a
32-bit boundary, fsg->cmnd[2] is not so aligned. So this needs to be
an unaligned transfer, although the first one above is correct.
> @@ -1684,9 +1654,9 @@ static int do_write(struct fsg_dev *fsg)
> /* Get the starting Logical Block Address and check that it's
> * not too big */
> if (fsg->cmnd[0] == SC_WRITE_6)
> - lba = (fsg->cmnd[1] << 16) | get_be16(&fsg->cmnd[2]);
> + lba = (fsg->cmnd[1] << 16) | get_be16((__be16 *)&fsg->cmnd[2]);
> else {
> - lba = get_be32(&fsg->cmnd[2]);
> + lba = get_be32((__be32 *)&fsg->cmnd[2]);
Same here.
> @@ -1920,7 +1890,7 @@ static int do_verify(struct fsg_dev *fsg)
>
> /* Get the starting Logical Block Address and check that it's
> * not too big */
> - lba = get_be32(&fsg->cmnd[2]);
> + lba = get_be32((__be32 *)&fsg->cmnd[2]);
And here.
> @@ -1933,7 +1903,7 @@ static int do_verify(struct fsg_dev *fsg)
> return -EINVAL;
> }
>
> - verification_length = get_be16(&fsg->cmnd[7]);
> + verification_length = get_be16((__be16 *)&fsg->cmnd[7]);
Likewise, fsg->cmnd[7] is at an odd address, so it isn't properly
aligned for a 16-bit access.
> @@ -2078,7 +2048,7 @@ static int do_request_sense(struct fsg_dev *fsg, struct fsg_buffhd *bh)
> memset(buf, 0, 18);
> buf[0] = valid | 0x70; // Valid, current error
> buf[2] = SK(sd);
> - put_be32(&buf[3], sdinfo); // Sense information
> + put_be32(sdinfo, (__be32 *)&buf[3]); // Sense information
Wrong again.
> @@ -2089,7 +2059,7 @@ static int do_request_sense(struct fsg_dev *fsg, struct fsg_buffhd *bh)
> static int do_read_capacity(struct fsg_dev *fsg, struct fsg_buffhd *bh)
> {
> struct lun *curlun = fsg->curlun;
> - u32 lba = get_be32(&fsg->cmnd[2]);
> + u32 lba = get_be32((__be32 *)&fsg->cmnd[2]);
And again.
> @@ -2099,8 +2069,8 @@ static int do_read_capacity(struct fsg_dev *fsg, struct fsg_buffhd *bh)
> return -EINVAL;
> }
>
> - put_be32(&buf[0], curlun->num_sectors - 1); // Max logical block
> - put_be32(&buf[4], 512); // Block length
> + put_be32(curlun->num_sectors - 1, (__be32 *)&buf[0]); // Max logical block
> + put_be32(512, (__be32 *)&buf[4]); // Block length
These are correct, since buf[0] and buf[4] are properly aligned for
32-bit accesses.
> @@ -2775,7 +2745,7 @@ static int do_scsi_command(struct fsg_dev *fsg)
> break;
>
> case SC_MODE_SELECT_10:
> - fsg->data_size_from_cmnd = get_be16(&fsg->cmnd[7]);
> + fsg->data_size_from_cmnd = get_be16((__be16 *)&fsg->cmnd[7]);
This is wrong.
> @@ -2791,7 +2761,7 @@ static int do_scsi_command(struct fsg_dev *fsg)
> break;
>
> case SC_MODE_SENSE_10:
> - fsg->data_size_from_cmnd = get_be16(&fsg->cmnd[7]);
> + fsg->data_size_from_cmnd = get_be16((__be16 *)&fsg->cmnd[7]);
So is this.
> @@ -2816,7 +2786,7 @@ static int do_scsi_command(struct fsg_dev *fsg)
> break;
>
> case SC_READ_10:
> - fsg->data_size_from_cmnd = get_be16(&fsg->cmnd[7]) << 9;
> + fsg->data_size_from_cmnd = get_be16((__be16 *)&fsg->cmnd[7]) << 9;
And this.
> @@ -2824,7 +2794,7 @@ static int do_scsi_command(struct fsg_dev *fsg)
> break;
>
> case SC_READ_12:
> - fsg->data_size_from_cmnd = get_be32(&fsg->cmnd[6]) << 9;
> + fsg->data_size_from_cmnd = get_be32((__be32 *)&fsg->cmnd[6]) << 9;
And this.
> @@ -2840,7 +2810,7 @@ static int do_scsi_command(struct fsg_dev *fsg)
> break;
>
> case SC_READ_FORMAT_CAPACITIES:
> - fsg->data_size_from_cmnd = get_be16(&fsg->cmnd[7]);
> + fsg->data_size_from_cmnd = get_be16((__be16 *)&fsg->cmnd[7]);
And this.
> @@ -2898,7 +2868,7 @@ static int do_scsi_command(struct fsg_dev *fsg)
> break;
>
> case SC_WRITE_10:
> - fsg->data_size_from_cmnd = get_be16(&fsg->cmnd[7]) << 9;
> + fsg->data_size_from_cmnd = get_be16((__be16 *)&fsg->cmnd[7]) << 9;
And this.
> @@ -2906,7 +2876,7 @@ static int do_scsi_command(struct fsg_dev *fsg)
> break;
>
> case SC_WRITE_12:
> - fsg->data_size_from_cmnd = get_be32(&fsg->cmnd[6]) << 9;
> + fsg->data_size_from_cmnd = get_be32((__be32 *)&fsg->cmnd[6]) << 9;
And this.
It does take a certain amount of concentration to check which sort of
helper is needed for each access.
Alan Stern
^ permalink raw reply [flat|nested] 3+ messages in thread* Re: [PATCHv4 3/6] byteorder: add get/put endian helpers for the aligned case
2008-05-30 19:05 ` Alan Stern
@ 2008-05-30 19:09 ` Harvey Harrison
0 siblings, 0 replies; 3+ messages in thread
From: Harvey Harrison @ 2008-05-30 19:09 UTC (permalink / raw)
To: Alan Stern; +Cc: Andrew Morton, linux-arch
On Fri, 2008-05-30 at 15:05 -0400, Alan Stern wrote:
> On Thu, 29 May 2008, Harvey Harrison wrote:
>
> > Add a set of endian helpers for the pattern:
> > *(__le16 *)ptr = cpu_to_le16(val);
> >
> > put_le16(val, (__le16 *)ptr);
> >
> > The argument order follows that of the get/put_unaligned_{endian}
> > helpers.
> >
> > The get_ helpers are exactly equivalent to the existing {endian}_to_cpup
> > functions, but have been added anyway for symmetry in the apis.
> >
> > Myrinet had a put_be32 helper that has been changed to myri_put_be32 to
> > avoid namespace collisions.
> >
> > Private helpers in the usb-gadget drivers have been removed and switched
> > over to the common ones. Note that the put helpers here had the args in
> > the opposite order from the common version.
>
Sorry about that, it completely went out of my head that the usb-helper
was ok for unaligned access...I do know better.
I'll send a patch that move the unaligned ones over to the unaligned
access api and the aligned cases to be32_to_cpup and resend shortly.
Harvey
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2008-05-30 19:09 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-05-29 19:56 [PATCHv4 3/6] byteorder: add get/put endian helpers for the aligned case Harvey Harrison
2008-05-30 19:05 ` Alan Stern
2008-05-30 19:09 ` Harvey Harrison
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox