smsc95xx: align buffers to cache line size
authorIlya Yanok <ilya.yanok@cogentembedded.com>
Sun, 15 Jul 2012 04:43:53 +0000 (04:43 +0000)
committerMarek Vasut <marex@denx.de>
Wed, 18 Jul 2012 12:43:42 +0000 (14:43 +0200)
Align buffers passed to the USB code to cache line size so
they can be DMAed safely.

Signed-off-by: Ilya Yanok <ilya.yanok@cogentembedded.com>
drivers/usb/eth/smsc95xx.c

index c7aebea4e39f3feb9e9d0591c086b6e6c6fbdb8b..c62a8c112eb85d77cd0e0b043905fd6dc9f21c63 100644 (file)
@@ -153,13 +153,15 @@ static int curr_eth_dev; /* index for name of next device detected */
 static int smsc95xx_write_reg(struct ueth_data *dev, u32 index, u32 data)
 {
        int len;
+       ALLOC_CACHE_ALIGN_BUFFER(u32, tmpbuf, 1);
 
        cpu_to_le32s(&data);
+       tmpbuf[0] = data;
 
        len = usb_control_msg(dev->pusb_dev, usb_sndctrlpipe(dev->pusb_dev, 0),
                USB_VENDOR_REQUEST_WRITE_REGISTER,
                USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
-               00, index, &data, sizeof(data), USB_CTRL_SET_TIMEOUT);
+               00, index, tmpbuf, sizeof(data), USB_CTRL_SET_TIMEOUT);
        if (len != sizeof(data)) {
                debug("smsc95xx_write_reg failed: index=%d, data=%d, len=%d",
                      index, data, len);
@@ -171,11 +173,13 @@ static int smsc95xx_write_reg(struct ueth_data *dev, u32 index, u32 data)
 static int smsc95xx_read_reg(struct ueth_data *dev, u32 index, u32 *data)
 {
        int len;
+       ALLOC_CACHE_ALIGN_BUFFER(u32, tmpbuf, 1);
 
        len = usb_control_msg(dev->pusb_dev, usb_rcvctrlpipe(dev->pusb_dev, 0),
                USB_VENDOR_REQUEST_READ_REGISTER,
                USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE,
-               00, index, data, sizeof(data), USB_CTRL_GET_TIMEOUT);
+               00, index, tmpbuf, sizeof(data), USB_CTRL_GET_TIMEOUT);
+       *data = tmpbuf[0];
        if (len != sizeof(data)) {
                debug("smsc95xx_read_reg failed: index=%d, len=%d",
                      index, len);
@@ -664,7 +668,8 @@ static int smsc95xx_send(struct eth_device *eth, void* packet, int length)
        int actual_len;
        u32 tx_cmd_a;
        u32 tx_cmd_b;
-       unsigned char msg[PKTSIZE + sizeof(tx_cmd_a) + sizeof(tx_cmd_b)];
+       ALLOC_CACHE_ALIGN_BUFFER(unsigned char, msg,
+                                PKTSIZE + sizeof(tx_cmd_a) + sizeof(tx_cmd_b));
 
        debug("** %s(), len %d, buf %#x\n", __func__, length, (int)msg);
        if (length > PKTSIZE)
@@ -695,7 +700,7 @@ static int smsc95xx_send(struct eth_device *eth, void* packet, int length)
 static int smsc95xx_recv(struct eth_device *eth)
 {
        struct ueth_data *dev = (struct ueth_data *)eth->priv;
-       static unsigned char  recv_buf[AX_RX_URB_SIZE];
+       DEFINE_CACHE_ALIGN_BUFFER(unsigned char, recv_buf, AX_RX_URB_SIZE);
        unsigned char *buf_ptr;
        int err;
        int actual_len;