uwb: wlp: refactor wlp_get_<attribute>() macros

Refactor the wlp_get_<attribute>() macros to call a common function.
This save over 4k of space and remove a spurious uninitialized variable
warning with some versions of gcc.

Signed-off-by: David Vrabel <david.vrabel@csr.com>

+61 -45
+61 -45
drivers/uwb/wlp/messages.c
··· 259 259 } 260 260 261 261 262 + static ssize_t wlp_get_attribute(struct wlp *wlp, u16 type_code, 263 + struct wlp_attr_hdr *attr_hdr, void *value, ssize_t value_len, 264 + ssize_t buflen) 265 + { 266 + struct device *dev = &wlp->rc->uwb_dev.dev; 267 + ssize_t attr_len = sizeof(*attr_hdr) + value_len; 268 + if (buflen < 0) 269 + return -EINVAL; 270 + if (buflen < attr_len) { 271 + dev_err(dev, "WLP: Not enough space in buffer to parse" 272 + " attribute field. Need %d, received %zu\n", 273 + (int)attr_len, buflen); 274 + return -EIO; 275 + } 276 + if (wlp_check_attr_hdr(wlp, attr_hdr, type_code, value_len) < 0) { 277 + dev_err(dev, "WLP: Header verification failed. \n"); 278 + return -EINVAL; 279 + } 280 + memcpy(value, (void *)attr_hdr + sizeof(*attr_hdr), value_len); 281 + return attr_len; 282 + } 283 + 284 + static ssize_t wlp_vget_attribute(struct wlp *wlp, u16 type_code, 285 + struct wlp_attr_hdr *attr_hdr, void *value, ssize_t max_value_len, 286 + ssize_t buflen) 287 + { 288 + struct device *dev = &wlp->rc->uwb_dev.dev; 289 + size_t len; 290 + if (buflen < 0) 291 + return -EINVAL; 292 + if (buflen < sizeof(*attr_hdr)) { 293 + dev_err(dev, "WLP: Not enough space in buffer to parse" 294 + " header.\n"); 295 + return -EIO; 296 + } 297 + if (le16_to_cpu(attr_hdr->type) != type_code) { 298 + dev_err(dev, "WLP: Unexpected attribute type. Got %u, " 299 + "expected %u.\n", le16_to_cpu(attr_hdr->type), 300 + type_code); 301 + return -EINVAL; 302 + } 303 + len = le16_to_cpu(attr_hdr->length); 304 + if (len > max_value_len) { 305 + dev_err(dev, "WLP: Attribute larger than maximum " 306 + "allowed. Received %zu, max is %d.\n", len, 307 + (int)max_value_len); 308 + return -EFBIG; 309 + } 310 + if (buflen < sizeof(*attr_hdr) + len) { 311 + dev_err(dev, "WLP: Not enough space in buffer to parse " 312 + "variable data.\n"); 313 + return -EIO; 314 + } 315 + memcpy(value, (void *)attr_hdr + sizeof(*attr_hdr), len); 316 + return sizeof(*attr_hdr) + len; 317 + } 318 + 262 319 /** 263 320 * Get value of attribute from fixed size attribute field. 264 321 * ··· 331 274 ssize_t wlp_get_##name(struct wlp *wlp, struct wlp_attr_##name *attr, \ 332 275 type *value, ssize_t buflen) \ 333 276 { \ 334 - struct device *dev = &wlp->rc->uwb_dev.dev; \ 335 - if (buflen < 0) \ 336 - return -EINVAL; \ 337 - if (buflen < sizeof(*attr)) { \ 338 - dev_err(dev, "WLP: Not enough space in buffer to parse" \ 339 - " attribute field. Need %d, received %zu\n", \ 340 - (int)sizeof(*attr), buflen); \ 341 - return -EIO; \ 342 - } \ 343 - if (wlp_check_attr_hdr(wlp, &attr->hdr, type_code, \ 344 - sizeof(attr->name)) < 0) { \ 345 - dev_err(dev, "WLP: Header verification failed. \n"); \ 346 - return -EINVAL; \ 347 - } \ 348 - *value = attr->name; \ 349 - return sizeof(*attr); \ 277 + return wlp_get_attribute(wlp, (type_code), &attr->hdr, \ 278 + value, sizeof(*value), buflen); \ 350 279 } 351 280 352 281 #define wlp_get_sparse(type, type_code, name) \ ··· 356 313 struct wlp_attr_##name *attr, \ 357 314 type_val *value, ssize_t buflen) \ 358 315 { \ 359 - struct device *dev = &wlp->rc->uwb_dev.dev; \ 360 - size_t len; \ 361 - if (buflen < 0) \ 362 - return -EINVAL; \ 363 - if (buflen < sizeof(*attr)) { \ 364 - dev_err(dev, "WLP: Not enough space in buffer to parse" \ 365 - " header.\n"); \ 366 - return -EIO; \ 367 - } \ 368 - if (le16_to_cpu(attr->hdr.type) != type_code) { \ 369 - dev_err(dev, "WLP: Unexpected attribute type. Got %u, " \ 370 - "expected %u.\n", le16_to_cpu(attr->hdr.type), \ 371 - type_code); \ 372 - return -EINVAL; \ 373 - } \ 374 - len = le16_to_cpu(attr->hdr.length); \ 375 - if (len > max) { \ 376 - dev_err(dev, "WLP: Attribute larger than maximum " \ 377 - "allowed. Received %zu, max is %d.\n", len, \ 378 - (int)max); \ 379 - return -EFBIG; \ 380 - } \ 381 - if (buflen < sizeof(*attr) + len) { \ 382 - dev_err(dev, "WLP: Not enough space in buffer to parse "\ 383 - "variable data.\n"); \ 384 - return -EIO; \ 385 - } \ 386 - memcpy(value, (void *) attr + sizeof(*attr), len); \ 387 - return sizeof(*attr) + len; \ 316 + return wlp_vget_attribute(wlp, (type_code), &attr->hdr, \ 317 + value, (max), buflen); \ 388 318 } 389 319 390 320 wlp_get(u8, WLP_ATTR_WLP_VER, version)