Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

rtlwifi: rtl818x: Deinline indexed IO functions, save 21568 bytes

rtl818x_ioread8_idx: 151 bytes, 29 calls
rtl818x_ioread16_idx: 151 bytes, 11 calls
rtl818x_ioread32_idx: 151 bytes, 5 calls
rtl818x_iowrite8_idx: 157 bytes, 117 calls
rtl818x_iowrite16_idx: 158 bytes, 74 calls
rtl818x_iowrite32_idx: 157 bytes, 22 calls

Each of these functions has a pair of mutex lock/unlock ops,
both of these ops perform atomic updates of memory (on x86, it boils down to
"lock cmpxchg %reg,mem" insn), which are 4-8 times more expensive than call+return.

text data bss dec hex filename
95894242 20860288 35991552 152746082 91ab862 vmlinux_before
95872674 20860320 35991552 152724546 91a6442 vmlinux

Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
CC: Larry Finger <Larry.Finger@lwfinger.net>
CC: Chaoming Li <chaoming_li@realsil.com.cn>
CC: linux-wireless@vger.kernel.org
CC: linux-kernel@vger.kernel.org
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>

authored by

Denys Vlasenko and committed by
Kalle Valo
aae555d3 ede00a5c

+105 -87
+12 -87
drivers/net/wireless/realtek/rtl818x/rtl8187/rtl8187.h
··· 160 160 161 161 void rtl8187_write_phy(struct ieee80211_hw *dev, u8 addr, u32 data); 162 162 163 - static inline u8 rtl818x_ioread8_idx(struct rtl8187_priv *priv, 164 - u8 *addr, u8 idx) 165 - { 166 - u8 val; 167 - 168 - mutex_lock(&priv->io_mutex); 169 - usb_control_msg(priv->udev, usb_rcvctrlpipe(priv->udev, 0), 170 - RTL8187_REQ_GET_REG, RTL8187_REQT_READ, 171 - (unsigned long)addr, idx & 0x03, 172 - &priv->io_dmabuf->bits8, sizeof(val), HZ / 2); 173 - 174 - val = priv->io_dmabuf->bits8; 175 - mutex_unlock(&priv->io_mutex); 176 - 177 - return val; 178 - } 163 + u8 rtl818x_ioread8_idx(struct rtl8187_priv *priv, 164 + u8 *addr, u8 idx); 179 165 180 166 static inline u8 rtl818x_ioread8(struct rtl8187_priv *priv, u8 *addr) 181 167 { 182 168 return rtl818x_ioread8_idx(priv, addr, 0); 183 169 } 184 170 185 - static inline u16 rtl818x_ioread16_idx(struct rtl8187_priv *priv, 186 - __le16 *addr, u8 idx) 187 - { 188 - __le16 val; 189 - 190 - mutex_lock(&priv->io_mutex); 191 - usb_control_msg(priv->udev, usb_rcvctrlpipe(priv->udev, 0), 192 - RTL8187_REQ_GET_REG, RTL8187_REQT_READ, 193 - (unsigned long)addr, idx & 0x03, 194 - &priv->io_dmabuf->bits16, sizeof(val), HZ / 2); 195 - 196 - val = priv->io_dmabuf->bits16; 197 - mutex_unlock(&priv->io_mutex); 198 - 199 - return le16_to_cpu(val); 200 - } 171 + u16 rtl818x_ioread16_idx(struct rtl8187_priv *priv, 172 + __le16 *addr, u8 idx); 201 173 202 174 static inline u16 rtl818x_ioread16(struct rtl8187_priv *priv, __le16 *addr) 203 175 { 204 176 return rtl818x_ioread16_idx(priv, addr, 0); 205 177 } 206 178 207 - static inline u32 rtl818x_ioread32_idx(struct rtl8187_priv *priv, 208 - __le32 *addr, u8 idx) 209 - { 210 - __le32 val; 211 - 212 - mutex_lock(&priv->io_mutex); 213 - usb_control_msg(priv->udev, usb_rcvctrlpipe(priv->udev, 0), 214 - RTL8187_REQ_GET_REG, RTL8187_REQT_READ, 215 - (unsigned long)addr, idx & 0x03, 216 - &priv->io_dmabuf->bits32, sizeof(val), HZ / 2); 217 - 218 - val = priv->io_dmabuf->bits32; 219 - mutex_unlock(&priv->io_mutex); 220 - 221 - return le32_to_cpu(val); 222 - } 179 + u32 rtl818x_ioread32_idx(struct rtl8187_priv *priv, 180 + __le32 *addr, u8 idx); 223 181 224 182 static inline u32 rtl818x_ioread32(struct rtl8187_priv *priv, __le32 *addr) 225 183 { 226 184 return rtl818x_ioread32_idx(priv, addr, 0); 227 185 } 228 186 229 - static inline void rtl818x_iowrite8_idx(struct rtl8187_priv *priv, 230 - u8 *addr, u8 val, u8 idx) 231 - { 232 - mutex_lock(&priv->io_mutex); 233 - 234 - priv->io_dmabuf->bits8 = val; 235 - usb_control_msg(priv->udev, usb_sndctrlpipe(priv->udev, 0), 236 - RTL8187_REQ_SET_REG, RTL8187_REQT_WRITE, 237 - (unsigned long)addr, idx & 0x03, 238 - &priv->io_dmabuf->bits8, sizeof(val), HZ / 2); 239 - 240 - mutex_unlock(&priv->io_mutex); 241 - } 187 + void rtl818x_iowrite8_idx(struct rtl8187_priv *priv, 188 + u8 *addr, u8 val, u8 idx); 242 189 243 190 static inline void rtl818x_iowrite8(struct rtl8187_priv *priv, u8 *addr, u8 val) 244 191 { 245 192 rtl818x_iowrite8_idx(priv, addr, val, 0); 246 193 } 247 194 248 - static inline void rtl818x_iowrite16_idx(struct rtl8187_priv *priv, 249 - __le16 *addr, u16 val, u8 idx) 250 - { 251 - mutex_lock(&priv->io_mutex); 252 - 253 - priv->io_dmabuf->bits16 = cpu_to_le16(val); 254 - usb_control_msg(priv->udev, usb_sndctrlpipe(priv->udev, 0), 255 - RTL8187_REQ_SET_REG, RTL8187_REQT_WRITE, 256 - (unsigned long)addr, idx & 0x03, 257 - &priv->io_dmabuf->bits16, sizeof(val), HZ / 2); 258 - 259 - mutex_unlock(&priv->io_mutex); 260 - } 195 + void rtl818x_iowrite16_idx(struct rtl8187_priv *priv, 196 + __le16 *addr, u16 val, u8 idx); 261 197 262 198 static inline void rtl818x_iowrite16(struct rtl8187_priv *priv, __le16 *addr, 263 199 u16 val) ··· 201 265 rtl818x_iowrite16_idx(priv, addr, val, 0); 202 266 } 203 267 204 - static inline void rtl818x_iowrite32_idx(struct rtl8187_priv *priv, 205 - __le32 *addr, u32 val, u8 idx) 206 - { 207 - mutex_lock(&priv->io_mutex); 208 - 209 - priv->io_dmabuf->bits32 = cpu_to_le32(val); 210 - usb_control_msg(priv->udev, usb_sndctrlpipe(priv->udev, 0), 211 - RTL8187_REQ_SET_REG, RTL8187_REQT_WRITE, 212 - (unsigned long)addr, idx & 0x03, 213 - &priv->io_dmabuf->bits32, sizeof(val), HZ / 2); 214 - 215 - mutex_unlock(&priv->io_mutex); 216 - } 268 + void rtl818x_iowrite32_idx(struct rtl8187_priv *priv, 269 + __le32 *addr, u32 val, u8 idx); 217 270 218 271 static inline void rtl818x_iowrite32(struct rtl8187_priv *priv, __le32 *addr, 219 272 u32 val)
+93
drivers/net/wireless/realtek/rtl818x/rtl8187/rtl8225.c
··· 22 22 #include "rtl8187.h" 23 23 #include "rtl8225.h" 24 24 25 + u8 rtl818x_ioread8_idx(struct rtl8187_priv *priv, 26 + u8 *addr, u8 idx) 27 + { 28 + u8 val; 29 + 30 + mutex_lock(&priv->io_mutex); 31 + usb_control_msg(priv->udev, usb_rcvctrlpipe(priv->udev, 0), 32 + RTL8187_REQ_GET_REG, RTL8187_REQT_READ, 33 + (unsigned long)addr, idx & 0x03, 34 + &priv->io_dmabuf->bits8, sizeof(val), HZ / 2); 35 + 36 + val = priv->io_dmabuf->bits8; 37 + mutex_unlock(&priv->io_mutex); 38 + 39 + return val; 40 + } 41 + 42 + u16 rtl818x_ioread16_idx(struct rtl8187_priv *priv, 43 + __le16 *addr, u8 idx) 44 + { 45 + __le16 val; 46 + 47 + mutex_lock(&priv->io_mutex); 48 + usb_control_msg(priv->udev, usb_rcvctrlpipe(priv->udev, 0), 49 + RTL8187_REQ_GET_REG, RTL8187_REQT_READ, 50 + (unsigned long)addr, idx & 0x03, 51 + &priv->io_dmabuf->bits16, sizeof(val), HZ / 2); 52 + 53 + val = priv->io_dmabuf->bits16; 54 + mutex_unlock(&priv->io_mutex); 55 + 56 + return le16_to_cpu(val); 57 + } 58 + 59 + u32 rtl818x_ioread32_idx(struct rtl8187_priv *priv, 60 + __le32 *addr, u8 idx) 61 + { 62 + __le32 val; 63 + 64 + mutex_lock(&priv->io_mutex); 65 + usb_control_msg(priv->udev, usb_rcvctrlpipe(priv->udev, 0), 66 + RTL8187_REQ_GET_REG, RTL8187_REQT_READ, 67 + (unsigned long)addr, idx & 0x03, 68 + &priv->io_dmabuf->bits32, sizeof(val), HZ / 2); 69 + 70 + val = priv->io_dmabuf->bits32; 71 + mutex_unlock(&priv->io_mutex); 72 + 73 + return le32_to_cpu(val); 74 + } 75 + 76 + void rtl818x_iowrite8_idx(struct rtl8187_priv *priv, 77 + u8 *addr, u8 val, u8 idx) 78 + { 79 + mutex_lock(&priv->io_mutex); 80 + 81 + priv->io_dmabuf->bits8 = val; 82 + usb_control_msg(priv->udev, usb_sndctrlpipe(priv->udev, 0), 83 + RTL8187_REQ_SET_REG, RTL8187_REQT_WRITE, 84 + (unsigned long)addr, idx & 0x03, 85 + &priv->io_dmabuf->bits8, sizeof(val), HZ / 2); 86 + 87 + mutex_unlock(&priv->io_mutex); 88 + } 89 + 90 + void rtl818x_iowrite16_idx(struct rtl8187_priv *priv, 91 + __le16 *addr, u16 val, u8 idx) 92 + { 93 + mutex_lock(&priv->io_mutex); 94 + 95 + priv->io_dmabuf->bits16 = cpu_to_le16(val); 96 + usb_control_msg(priv->udev, usb_sndctrlpipe(priv->udev, 0), 97 + RTL8187_REQ_SET_REG, RTL8187_REQT_WRITE, 98 + (unsigned long)addr, idx & 0x03, 99 + &priv->io_dmabuf->bits16, sizeof(val), HZ / 2); 100 + 101 + mutex_unlock(&priv->io_mutex); 102 + } 103 + 104 + void rtl818x_iowrite32_idx(struct rtl8187_priv *priv, 105 + __le32 *addr, u32 val, u8 idx) 106 + { 107 + mutex_lock(&priv->io_mutex); 108 + 109 + priv->io_dmabuf->bits32 = cpu_to_le32(val); 110 + usb_control_msg(priv->udev, usb_sndctrlpipe(priv->udev, 0), 111 + RTL8187_REQ_SET_REG, RTL8187_REQT_WRITE, 112 + (unsigned long)addr, idx & 0x03, 113 + &priv->io_dmabuf->bits32, sizeof(val), HZ / 2); 114 + 115 + mutex_unlock(&priv->io_mutex); 116 + } 117 + 25 118 static void rtl8225_write_bitbang(struct ieee80211_hw *dev, u8 addr, u16 data) 26 119 { 27 120 struct rtl8187_priv *priv = dev->priv;