aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/rtlwifi/usb.c
diff options
context:
space:
mode:
authorLarry Finger <Larry.Finger@lwfinger.net>2011-11-17 13:14:44 -0500
committerJohn W. Linville <linville@tuxdriver.com>2011-11-21 16:20:46 -0500
commitabfabc9b48f6943dbb707fcfc2ef2a04c329e3e8 (patch)
tree608f73989a2fe7d5f5967cd6ab76701ed2f6d173 /drivers/net/wireless/rtlwifi/usb.c
parentff6ff96b5ba5b39f7ab3d8ea0cf9ec414452ac92 (diff)
rtlwifi: rtl8192cu: Fix endianian issues
Driver rtlwifi fails on a big-endian host. These changes have been tested on a Mac PowerBook G4, which has a PPC processor. Although this patch touches some of the code that will affect endian issues on PCI hardware through drivers rtl8192ce, rtl8192se, and rtl8192de, these have not been tested due to lack of suitable hardware. Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/rtlwifi/usb.c')
-rw-r--r--drivers/net/wireless/rtlwifi/usb.c12
1 files changed, 7 insertions, 5 deletions
diff --git a/drivers/net/wireless/rtlwifi/usb.c b/drivers/net/wireless/rtlwifi/usb.c
index a461822c05b3..79889b83287e 100644
--- a/drivers/net/wireless/rtlwifi/usb.c
+++ b/drivers/net/wireless/rtlwifi/usb.c
@@ -82,6 +82,7 @@ static int _usbctrl_vendorreq_async_write(struct usb_device *udev, u8 request,
82 dr->wValue = cpu_to_le16(value); 82 dr->wValue = cpu_to_le16(value);
83 dr->wIndex = cpu_to_le16(index); 83 dr->wIndex = cpu_to_le16(index);
84 dr->wLength = cpu_to_le16(len); 84 dr->wLength = cpu_to_le16(len);
85 /* data are already in little-endian order */
85 memcpy(buf, pdata, len); 86 memcpy(buf, pdata, len);
86 usb_fill_control_urb(urb, udev, pipe, 87 usb_fill_control_urb(urb, udev, pipe,
87 (unsigned char *)dr, buf, len, 88 (unsigned char *)dr, buf, len,
@@ -101,6 +102,7 @@ static int _usbctrl_vendorreq_sync_read(struct usb_device *udev, u8 request,
101 int status; 102 int status;
102 u8 reqtype; 103 u8 reqtype;
103 int vendorreq_times = 0; 104 int vendorreq_times = 0;
105 static int count;
104 106
105 pipe = usb_rcvctrlpipe(udev, 0); /* read_in */ 107 pipe = usb_rcvctrlpipe(udev, 0); /* read_in */
106 reqtype = REALTEK_USB_VENQT_READ; 108 reqtype = REALTEK_USB_VENQT_READ;
@@ -117,9 +119,9 @@ static int _usbctrl_vendorreq_sync_read(struct usb_device *udev, u8 request,
117 break; 119 break;
118 } 120 }
119 } 121 }
120 if (status < 0) 122 if (status < 0 && count++ < 4)
121 pr_err("reg 0x%x, usbctrl_vendorreq TimeOut! status:0x%x value=0x%x\n", 123 pr_err("reg 0x%x, usbctrl_vendorreq TimeOut! status:0x%x value=0x%x\n",
122 value, status, *(u32 *)pdata); 124 value, status, le32_to_cpu(*(u32 *)pdata));
123 return status; 125 return status;
124} 126}
125 127
@@ -139,7 +141,7 @@ static u32 _usb_read_sync(struct usb_device *udev, u32 addr, u16 len)
139 141
140 wvalue = (u16)addr; 142 wvalue = (u16)addr;
141 _usbctrl_vendorreq_sync_read(udev, request, wvalue, index, data, len); 143 _usbctrl_vendorreq_sync_read(udev, request, wvalue, index, data, len);
142 ret = *data; 144 ret = le32_to_cpu(*data);
143 kfree(data); 145 kfree(data);
144 return ret; 146 return ret;
145} 147}
@@ -171,12 +173,12 @@ static void _usb_write_async(struct usb_device *udev, u32 addr, u32 val,
171 u8 request; 173 u8 request;
172 u16 wvalue; 174 u16 wvalue;
173 u16 index; 175 u16 index;
174 u32 data; 176 __le32 data;
175 177
176 request = REALTEK_USB_VENQT_CMD_REQ; 178 request = REALTEK_USB_VENQT_CMD_REQ;
177 index = REALTEK_USB_VENQT_CMD_IDX; /* n/a */ 179 index = REALTEK_USB_VENQT_CMD_IDX; /* n/a */
178 wvalue = (u16)(addr&0x0000ffff); 180 wvalue = (u16)(addr&0x0000ffff);
179 data = val; 181 data = cpu_to_le32(val);
180 _usbctrl_vendorreq_async_write(udev, request, wvalue, index, &data, 182 _usbctrl_vendorreq_async_write(udev, request, wvalue, index, &data,
181 len); 183 len);
182} 184}