diff options
author | Jussi Kivilinna <jussi.kivilinna@mbnet.fi> | 2011-01-31 13:49:14 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2011-02-04 16:29:50 -0500 |
commit | 9bca0c3b540188e2beea9c2583fa16c46d209888 (patch) | |
tree | d52f0d39dd70d65d9606edfac0d3145dca412007 /drivers/net/wireless/zd1211rw/zd_usb.c | |
parent | 51272292926bc4fff61ba812d5816922b980655b (diff) |
zd1211rw: use stack and preallocated memory for small cmd-buffers
Use stack for allocing small < 64 byte arrays in zd_chip.c and preallocated
buffer in zd_usb.c. This might lower CPU usage for beacon setup.
v2:
- Do not use stack buffers in zd_usb.c as they would be used for urb
transfer_buffer.
Signed-off-by: Jussi Kivilinna <jussi.kivilinna@mbnet.fi>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/zd1211rw/zd_usb.c')
-rw-r--r-- | drivers/net/wireless/zd1211rw/zd_usb.c | 41 |
1 files changed, 27 insertions, 14 deletions
diff --git a/drivers/net/wireless/zd1211rw/zd_usb.c b/drivers/net/wireless/zd1211rw/zd_usb.c index 9493ab86a41e..bf1de04dc9f2 100644 --- a/drivers/net/wireless/zd1211rw/zd_usb.c +++ b/drivers/net/wireless/zd1211rw/zd_usb.c | |||
@@ -1361,15 +1361,20 @@ int zd_usb_ioread16v(struct zd_usb *usb, u16 *values, | |||
1361 | return -EWOULDBLOCK; | 1361 | return -EWOULDBLOCK; |
1362 | } | 1362 | } |
1363 | if (!usb_int_enabled(usb)) { | 1363 | if (!usb_int_enabled(usb)) { |
1364 | dev_dbg_f(zd_usb_dev(usb), | 1364 | dev_dbg_f(zd_usb_dev(usb), |
1365 | "error: usb interrupt not enabled\n"); | 1365 | "error: usb interrupt not enabled\n"); |
1366 | return -EWOULDBLOCK; | 1366 | return -EWOULDBLOCK; |
1367 | } | 1367 | } |
1368 | 1368 | ||
1369 | ZD_ASSERT(mutex_is_locked(&zd_usb_to_chip(usb)->mutex)); | ||
1370 | BUILD_BUG_ON(sizeof(struct usb_req_read_regs) + USB_MAX_IOREAD16_COUNT * | ||
1371 | sizeof(__le16) > sizeof(usb->req_buf)); | ||
1372 | BUG_ON(sizeof(struct usb_req_read_regs) + count * sizeof(__le16) > | ||
1373 | sizeof(usb->req_buf)); | ||
1374 | |||
1369 | req_len = sizeof(struct usb_req_read_regs) + count * sizeof(__le16); | 1375 | req_len = sizeof(struct usb_req_read_regs) + count * sizeof(__le16); |
1370 | req = kmalloc(req_len, GFP_KERNEL); | 1376 | req = (void *)usb->req_buf; |
1371 | if (!req) | 1377 | |
1372 | return -ENOMEM; | ||
1373 | req->id = cpu_to_le16(USB_REQ_READ_REGS); | 1378 | req->id = cpu_to_le16(USB_REQ_READ_REGS); |
1374 | for (i = 0; i < count; i++) | 1379 | for (i = 0; i < count; i++) |
1375 | req->addr[i] = cpu_to_le16((u16)addresses[i]); | 1380 | req->addr[i] = cpu_to_le16((u16)addresses[i]); |
@@ -1402,7 +1407,6 @@ int zd_usb_ioread16v(struct zd_usb *usb, u16 *values, | |||
1402 | 1407 | ||
1403 | r = get_results(usb, values, req, count); | 1408 | r = get_results(usb, values, req, count); |
1404 | error: | 1409 | error: |
1405 | kfree(req); | ||
1406 | return r; | 1410 | return r; |
1407 | } | 1411 | } |
1408 | 1412 | ||
@@ -1428,11 +1432,17 @@ int zd_usb_iowrite16v(struct zd_usb *usb, const struct zd_ioreq16 *ioreqs, | |||
1428 | return -EWOULDBLOCK; | 1432 | return -EWOULDBLOCK; |
1429 | } | 1433 | } |
1430 | 1434 | ||
1435 | ZD_ASSERT(mutex_is_locked(&zd_usb_to_chip(usb)->mutex)); | ||
1436 | BUILD_BUG_ON(sizeof(struct usb_req_write_regs) + | ||
1437 | USB_MAX_IOWRITE16_COUNT * sizeof(struct reg_data) > | ||
1438 | sizeof(usb->req_buf)); | ||
1439 | BUG_ON(sizeof(struct usb_req_write_regs) + | ||
1440 | count * sizeof(struct reg_data) > | ||
1441 | sizeof(usb->req_buf)); | ||
1442 | |||
1431 | req_len = sizeof(struct usb_req_write_regs) + | 1443 | req_len = sizeof(struct usb_req_write_regs) + |
1432 | count * sizeof(struct reg_data); | 1444 | count * sizeof(struct reg_data); |
1433 | req = kmalloc(req_len, GFP_KERNEL); | 1445 | req = (void *)usb->req_buf; |
1434 | if (!req) | ||
1435 | return -ENOMEM; | ||
1436 | 1446 | ||
1437 | req->id = cpu_to_le16(USB_REQ_WRITE_REGS); | 1447 | req->id = cpu_to_le16(USB_REQ_WRITE_REGS); |
1438 | for (i = 0; i < count; i++) { | 1448 | for (i = 0; i < count; i++) { |
@@ -1460,7 +1470,6 @@ int zd_usb_iowrite16v(struct zd_usb *usb, const struct zd_ioreq16 *ioreqs, | |||
1460 | 1470 | ||
1461 | /* FALL-THROUGH with r == 0 */ | 1471 | /* FALL-THROUGH with r == 0 */ |
1462 | error: | 1472 | error: |
1463 | kfree(req); | ||
1464 | return r; | 1473 | return r; |
1465 | } | 1474 | } |
1466 | 1475 | ||
@@ -1505,14 +1514,19 @@ int zd_usb_rfwrite(struct zd_usb *usb, u32 value, u8 bits) | |||
1505 | if (r) { | 1514 | if (r) { |
1506 | dev_dbg_f(zd_usb_dev(usb), | 1515 | dev_dbg_f(zd_usb_dev(usb), |
1507 | "error %d: Couldn't read CR203\n", r); | 1516 | "error %d: Couldn't read CR203\n", r); |
1508 | goto out; | 1517 | return r; |
1509 | } | 1518 | } |
1510 | bit_value_template &= ~(RF_IF_LE|RF_CLK|RF_DATA); | 1519 | bit_value_template &= ~(RF_IF_LE|RF_CLK|RF_DATA); |
1511 | 1520 | ||
1521 | ZD_ASSERT(mutex_is_locked(&zd_usb_to_chip(usb)->mutex)); | ||
1522 | BUILD_BUG_ON(sizeof(struct usb_req_rfwrite) + | ||
1523 | USB_MAX_RFWRITE_BIT_COUNT * sizeof(__le16) > | ||
1524 | sizeof(usb->req_buf)); | ||
1525 | BUG_ON(sizeof(struct usb_req_rfwrite) + bits * sizeof(__le16) > | ||
1526 | sizeof(usb->req_buf)); | ||
1527 | |||
1512 | req_len = sizeof(struct usb_req_rfwrite) + bits * sizeof(__le16); | 1528 | req_len = sizeof(struct usb_req_rfwrite) + bits * sizeof(__le16); |
1513 | req = kmalloc(req_len, GFP_KERNEL); | 1529 | req = (void *)usb->req_buf; |
1514 | if (!req) | ||
1515 | return -ENOMEM; | ||
1516 | 1530 | ||
1517 | req->id = cpu_to_le16(USB_REQ_WRITE_RF); | 1531 | req->id = cpu_to_le16(USB_REQ_WRITE_RF); |
1518 | /* 1: 3683a, but not used in ZYDAS driver */ | 1532 | /* 1: 3683a, but not used in ZYDAS driver */ |
@@ -1544,6 +1558,5 @@ int zd_usb_rfwrite(struct zd_usb *usb, u32 value, u8 bits) | |||
1544 | 1558 | ||
1545 | /* FALL-THROUGH with r == 0 */ | 1559 | /* FALL-THROUGH with r == 0 */ |
1546 | out: | 1560 | out: |
1547 | kfree(req); | ||
1548 | return r; | 1561 | return r; |
1549 | } | 1562 | } |